ZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmEuY3BwIGIvY2FtZXJhL0NhbWVyYS5jcHAKaW5kZXggODVmNDRmMC4uM2E5ZmI0YyAxMDA2NDQKLS0tIGEvY2FtZXJhL0NhbWVyYS5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYS5jcHAKQEAgLTU1LDcgKzU1LDcgQEAKICAgICBpZiAoY2FtZXJhLT5jb25uZWN0KGMpID09IE5PX0VSUk9SKSB7CiAgICAgICAgIGMtPm1TdGF0dXMgPSBOT19FUlJPUjsKICAgICAgICAgYy0+bUNhbWVyYSA9IGNhbWVyYTsKLSAgICAgICAgY2FtZXJhLT5hc0JpbmRlcigpLT5saW5rVG9EZWF0aChjKTsKKyAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIoY2FtZXJhKS0+bGlua1RvRGVhdGgoYyk7CiAgICAgICAgIHJldHVybiBjOwogICAgIH0KICAgICByZXR1cm4gMDsKQEAgLTkzLDcgKzkzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRVaWQsIC8qb3V0Ki9jLT5tQ2FtZXJhKTsKICAgICB9CiAgICAgaWYgKHN0YXR1cyA9PSBPSyAmJiBjLT5tQ2FtZXJhICE9IDApIHsKLSAgICAgICAgYy0+bUNhbWVyYS0+YXNCaW5kZXIoKS0+bGlua1RvRGVhdGgoYyk7CisgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKGMtPm1DYW1lcmEpLT5saW5rVG9EZWF0aChjKTsKICAgICAgICAgYy0+bVN0YXR1cyA9IE5PX0VSUk9SOwogICAgICAgICBjYW1lcmEgPSBjOwogICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9jYW1lcmEvQ2FtZXJhQmFzZS5jcHAgYi9jYW1lcmEvQ2FtZXJhQmFzZS5jcHAKaW5kZXggMDQ2OTRjZC4uNjVhMWE0NyAxMDA2NDQKLS0tIGEvY2FtZXJhL0NhbWVyYUJhc2UuY3BwCisrKyBiL2NhbWVyYS9DYW1lcmFCYXNlLmNwcApAQCAtMTA3LDcgKzEwNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovIGMtPm1DYW1lcmEpOwogICAgIH0KICAgICBpZiAoc3RhdHVzID09IE9LICYmIGMtPm1DYW1lcmEgIT0gMCkgewotICAgICAgICBjLT5tQ2FtZXJhLT5hc0JpbmRlcigpLT5saW5rVG9EZWF0aChjKTsKKyAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIoYy0+bUNhbWVyYSktPmxpbmtUb0RlYXRoKGMpOwogICAgICAgICBjLT5tU3RhdHVzID0gTk9fRVJST1I7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1coIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGNvbm5lY3RpbmcgdG8gY2FtZXJhOiAlZCIsIGNhbWVyYUlkKTsKQEAgLTEyMiw3ICsxMjIsNyBAQAogICAgIEFMT0dWKCIlczogZGlzY29ubmVjdCIsIF9fRlVOQ1RJT05fXyk7CiAgICAgaWYgKG1DYW1lcmEgIT0gMCkgewogICAgICAgICBtQ2FtZXJhLT5kaXNjb25uZWN0KCk7Ci0gICAgICAgIG1DYW1lcmEtPmFzQmluZGVyKCktPnVubGlua1RvRGVhdGgodGhpcyk7CisgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKG1DYW1lcmEpLT51bmxpbmtUb0RlYXRoKHRoaXMpOwogICAgICAgICBtQ2FtZXJhID0gMDsKICAgICB9CiAgICAgQUxPR1YoIiVzOiBkaXNjb25uZWN0IChkb25lKSIsIF9fRlVOQ1RJT05fXyk7CmRpZmYgLS1naXQgYS9jYW1lcmEvSUNhbWVyYS5jcHAgYi9jYW1lcmEvSUNhbWVyYS5jcHAKaW5kZXggOGM2ZTFmNy4uOTk0M2JlNiAxMDA2NDQKLS0tIGEvY2FtZXJhL0lDYW1lcmEuY3BwCisrKyBiL2NhbWVyYS9JQ2FtZXJhLmNwcApAQCAtNzUsNyArNzUsNyBAQAogICAgICAgICBBTE9HVigic2V0UHJldmlld1RhcmdldCIpOwogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBzcDxJQmluZGVyPiBiKGJ1ZmZlclByb2R1Y2VyLT5hc0JpbmRlcigpKTsKKyAgICAgICAgc3A8SUJpbmRlcj4gYihJSW50ZXJmYWNlOjphc0JpbmRlcihidWZmZXJQcm9kdWNlcikpOwogICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGIpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1BSRVZJRVdfVEFSR0VULCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CkBAIC05OCw3ICs5OCw3IEBACiAgICAgICAgIEFMT0dWKCJzZXRQcmV2aWV3Q2FsbGJhY2tUYXJnZXQiKTsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgc3A8SUJpbmRlcj4gYihjYWxsYmFja1Byb2R1Y2VyLT5hc0JpbmRlcigpKTsKKyAgICAgICAgc3A8SUJpbmRlcj4gYihJSW50ZXJmYWNlOjphc0JpbmRlcihjYWxsYmFja1Byb2R1Y2VyKSk7CiAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoYik7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfUFJFVklFV19DQUxMQkFDS19UQVJHRVQsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKQEAgLTE0Nyw3ICsxNDcsNyBAQAogICAgICAgICBBTE9HVigicmVsZWFzZVJlY29yZGluZ0ZyYW1lIik7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmE6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIobWVtLT5hc0JpbmRlcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihtZW0pKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFJFTEVBU0VfUkVDT1JESU5HX0ZSQU1FLCBkYXRhLCAmcmVwbHkpOwogICAgIH0KIApAQCAtMjUwLDcgKzI1MCw3IEBACiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGNhbWVyYUNsaWVudC0+YXNCaW5kZXIoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoY2FtZXJhQ2xpZW50KSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChDT05ORUNULCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL0lDYW1lcmFDbGllbnQuY3BwIGIvY2FtZXJhL0lDYW1lcmFDbGllbnQuY3BwCmluZGV4IDIwNWM4YmEuLjE3OWEzNDEgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9JQ2FtZXJhQ2xpZW50LmNwcAorKysgYi9jYW1lcmEvSUNhbWVyYUNsaWVudC5jcHAKQEAgLTU4LDcgKzU4LDcgQEAKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYUNsaWVudDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKG1zZ1R5cGUpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGltYWdlRGF0YS0+YXNCaW5kZXIoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoaW1hZ2VEYXRhKSk7CiAgICAgICAgIGlmIChtZXRhZGF0YSkgewogICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKG1ldGFkYXRhLT5udW1iZXJfb2ZfZmFjZXMpOwogICAgICAgICAgICAgZGF0YS53cml0ZShtZXRhZGF0YS0+ZmFjZXMsIHNpemVvZihjYW1lcmFfZmFjZV90KSAqIG1ldGFkYXRhLT5udW1iZXJfb2ZfZmFjZXMpOwpAQCAtNzQsNyArNzQsNyBAQAogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYUNsaWVudDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDY0KHRpbWVzdGFtcCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihtc2dUeXBlKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihpbWFnZURhdGEtPmFzQmluZGVyKCkpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGltYWdlRGF0YSkpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoREFUQV9DQUxMQkFDS19USU1FU1RBTVAsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwogICAgIH0KIH07CmRpZmYgLS1naXQgYS9jYW1lcmEvSUNhbWVyYVJlY29yZGluZ1Byb3h5LmNwcCBiL2NhbWVyYS9JQ2FtZXJhUmVjb3JkaW5nUHJveHkuY3BwCmluZGV4IDcyMjNiNmQuLjNkYzBmZmIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9JQ2FtZXJhUmVjb3JkaW5nUHJveHkuY3BwCisrKyBiL2NhbWVyYS9JQ2FtZXJhUmVjb3JkaW5nUHJveHkuY3BwCkBAIC00NSw3ICs0NSw3IEBACiAgICAgICAgIEFMT0dWKCJzdGFydFJlY29yZGluZyIpOwogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhUmVjb3JkaW5nUHJveHk6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIobGlzdGVuZXItPmFzQmluZGVyKCkpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGxpc3RlbmVyKSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTVEFSVF9SRUNPUkRJTkcsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CkBAIC02Myw3ICs2Myw3IEBACiAgICAgICAgIEFMT0dWKCJyZWxlYXNlUmVjb3JkaW5nRnJhbWUiKTsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYVJlY29yZGluZ1Byb3h5OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKG1lbS0+YXNCaW5kZXIoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIobWVtKSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRUxFQVNFX1JFQ09SRElOR19GUkFNRSwgZGF0YSwgJnJlcGx5KTsKICAgICB9CiB9OwpkaWZmIC0tZ2l0IGEvY2FtZXJhL0lDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyLmNwcCBiL2NhbWVyYS9JQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lci5jcHAKaW5kZXggY2IxN2YxOS4uY2Y4NDhmYyAxMDA2NDQKLS0tIGEvY2FtZXJhL0lDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyLmNwcAorKysgYi9jYW1lcmEvSUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXIuY3BwCkBAIC00Miw3ICs0Miw3IEBACiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDY0KHRpbWVzdGFtcCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihtc2dUeXBlKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihpbWFnZURhdGEtPmFzQmluZGVyKCkpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGltYWdlRGF0YSkpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoREFUQV9DQUxMQkFDS19USU1FU1RBTVAsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwogICAgIH0KIH07CmRpZmYgLS1naXQgYS9jYW1lcmEvSUNhbWVyYVNlcnZpY2UuY3BwIGIvY2FtZXJhL0lDYW1lcmFTZXJ2aWNlLmNwcAppbmRleCA1NDg1MjA1Li5mYzNlNDM3IDEwMDY0NAotLS0gYS9jYW1lcmEvSUNhbWVyYVNlcnZpY2UuY3BwCisrKyBiL2NhbWVyYS9JQ2FtZXJhU2VydmljZS5jcHAKQEAgLTE3Miw3ICsxNzIsNyBAQAogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoY2FtZXJhQ2xpZW50LT5hc0JpbmRlcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihjYW1lcmFDbGllbnQpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGNhbWVyYUlkKTsKICAgICAgICAgZGF0YS53cml0ZVN0cmluZzE2KGNsaWVudFBhY2thZ2VOYW1lKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGNsaWVudFVpZCk7CkBAIC0xOTQsNyArMTk0LDcgQEAKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmFTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGNhbWVyYUNsaWVudC0+YXNCaW5kZXIoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoY2FtZXJhQ2xpZW50KSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihjYW1lcmFJZCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihoYWxWZXJzaW9uKTsKICAgICAgICAgZGF0YS53cml0ZVN0cmluZzE2KGNsaWVudFBhY2thZ2VOYW1lKTsKQEAgLTIxNyw3ICsyMTcsNyBAQAogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoY2FtZXJhQ2ItPmFzQmluZGVyKCkpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGNhbWVyYUNiKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihjYW1lcmFJZCk7CiAgICAgICAgIGRhdGEud3JpdGVTdHJpbmcxNihjbGllbnRQYWNrYWdlTmFtZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihjbGllbnRVaWQpOwpAQCAtMjQyLDcgKzI0Miw3IEBACiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihjYW1lcmFDYi0+YXNCaW5kZXIoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoY2FtZXJhQ2IpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGNhbWVyYUlkKTsKICAgICAgICAgZGF0YS53cml0ZVN0cmluZzE2KGNsaWVudFBhY2thZ2VOYW1lKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGNsaWVudFVpZCk7CkBAIC0yNjAsNyArMjYwLDcgQEAKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmFTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGxpc3RlbmVyLT5hc0JpbmRlcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihsaXN0ZW5lcikpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQm5DYW1lcmFTZXJ2aWNlOjpBRERfTElTVEVORVIsIGRhdGEsICZyZXBseSk7CiAKICAgICAgICAgaWYgKHJlYWRFeGNlcHRpb25Db2RlKHJlcGx5KSkgcmV0dXJuIC1FUFJPVE87CkBAIC0yNzEsNyArMjcxLDcgQEAKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmFTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGxpc3RlbmVyLT5hc0JpbmRlcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihsaXN0ZW5lcikpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQm5DYW1lcmFTZXJ2aWNlOjpSRU1PVkVfTElTVEVORVIsIGRhdGEsICZyZXBseSk7CiAKICAgICAgICAgaWYgKHJlYWRFeGNlcHRpb25Db2RlKHJlcGx5KSkgcmV0dXJuIC1FUFJPVE87CkBAIC0zODQsNyArMzg0LDcgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICBpZiAoY2FtZXJhICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigxKTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoY2FtZXJhLT5hc0JpbmRlcigpKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoY2FtZXJhKSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDApOwogICAgICAgICAgICAgfQpAQCAtNDA0LDcgKzQwNCw3IEBACiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogICAgICAgICAgICAgaWYgKGNhbWVyYSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMSk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKGNhbWVyYS0+YXNCaW5kZXIoKSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGNhbWVyYSkpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigwKTsKICAgICAgICAgICAgIH0KQEAgLTQyNCw3ICs0MjQsNyBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKICAgICAgICAgICAgIGlmIChjYW1lcmEgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDEpOwotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihjYW1lcmEtPmFzQmluZGVyKCkpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihjYW1lcmEpKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMCk7CiAgICAgICAgICAgICB9CkBAIC00ODQsNyArNDg0LDcgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICBpZiAoY2FtZXJhICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigxKTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoY2FtZXJhLT5hc0JpbmRlcigpKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoY2FtZXJhKSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDApOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL0lQcm9DYW1lcmFVc2VyLmNwcCBiL2NhbWVyYS9JUHJvQ2FtZXJhVXNlci5jcHAKaW5kZXggOGYyMjEyNC4uOWJkNzU5NyAxMDA2NDQKLS0tIGEvY2FtZXJhL0lQcm9DYW1lcmFVc2VyLmNwcAorKysgYi9jYW1lcmEvSVByb0NhbWVyYVVzZXIuY3BwCkBAIC02NSw3ICs2NSw3IEBACiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUHJvQ2FtZXJhVXNlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihjYW1lcmFDbGllbnQtPmFzQmluZGVyKCkpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGNhbWVyYUNsaWVudCkpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ09OTkVDVCwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KQEAgLTE1MCw3ICsxNTAsNyBAQAogICAgICAgICBkYXRhLndyaXRlSW50MzIoaGVpZ2h0KTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGZvcm1hdCk7CiAKLSAgICAgICAgc3A8SUJpbmRlcj4gYihidWZmZXJQcm9kdWNlci0+YXNCaW5kZXIoKSk7CisgICAgICAgIHNwPElCaW5kZXI+IGIoSUludGVyZmFjZTo6YXNCaW5kZXIoYnVmZmVyUHJvZHVjZXIpKTsKICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihiKTsKIAogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ1JFQVRFX1NUUkVBTSwgZGF0YSwgJnJlcGx5KTsKZGlmZiAtLWdpdCBhL2NhbWVyYS9jYW1lcmEyL0NhcHR1cmVSZXF1ZXN0LmNwcCBiL2NhbWVyYS9jYW1lcmEyL0NhcHR1cmVSZXF1ZXN0LmNwcAppbmRleCBmYjc0YzhkLi42NmQ2OTEzIDEwMDY0NAotLS0gYS9jYW1lcmEvY2FtZXJhMi9DYXB0dXJlUmVxdWVzdC5jcHAKKysrIGIvY2FtZXJhL2NhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuY3BwCkBAIC0xMDYsNyArMTA2LDcgQEAKIAogICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXI7CiAgICAgICAgIGlmIChzdXJmYWNlICE9IDApIHsKLSAgICAgICAgICAgIGJpbmRlciA9IHN1cmZhY2UtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKS0+YXNCaW5kZXIoKTsKKyAgICAgICAgICAgIGJpbmRlciA9IElJbnRlcmZhY2U6OmFzQmluZGVyKHN1cmZhY2UtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBub3Qgc3VyZSBpZiByZWFkUGFyY2VsYWJsZUFycmF5IGRvZXMgdGhpcywgaGFyZCB0byB0ZWxsIGZyb20gc291cmNlCmRpZmYgLS1naXQgYS9jYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5jcHAgYi9jYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5jcHAKaW5kZXggZmY0YTBjMi4uMjc3YjVkYiAxMDA2NDQKLS0tIGEvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuY3BwCisrKyBiL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmNwcApAQCAtMTA3LDcgKzEwNyw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotCWlmICgocmVzICE9IE5PX0VSUk9SKSB8fCAocmVzRnJhbWVOdW1iZXIgIT0gTk9fRVJST1IpKSB7CisJaWYgKChyZXMgPCBOT19FUlJPUikgfHwgKHJlc0ZyYW1lTnVtYmVyICE9IE5PX0VSUk9SKSkgewogICAgICAgICAgICAgcmVzID0gRkFJTEVEX1RSQU5TQUNUSU9OOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXM7CkBAIC0xNDcsNyArMTQ3LDcgQEAKICAgICAgICAgICAgICAgICByZXNGcmFtZU51bWJlciA9IHJlcGx5LnJlYWRJbnQ2NChsYXN0RnJhbWVOdW1iZXIpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmICgocmVzICE9IE5PX0VSUk9SKSB8fCAocmVzRnJhbWVOdW1iZXIgIT0gTk9fRVJST1IpKSB7CisgICAgICAgIGlmICgocmVzIDwgTk9fRVJST1IpIHx8IChyZXNGcmFtZU51bWJlciAhPSBOT19FUlJPUikpIHsKICAgICAgICAgICAgIHJlcyA9IEZBSUxFRF9UUkFOU0FDVElPTjsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmVzOwpAQCAtMTY3LDcgKzE2Nyw3IEBACiAgICAgICAgIHN0YXR1c190IHJlc0ZyYW1lTnVtYmVyID0gQkFEX1ZBTFVFOwogICAgICAgICBpZiAocmVwbHkucmVhZEludDMyKCkgIT0gMCkgewogICAgICAgICAgICAgaWYgKGxhc3RGcmFtZU51bWJlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmVzID0gcmVwbHkucmVhZEludDY0KGxhc3RGcmFtZU51bWJlcik7CisgICAgICAgICAgICAgICAgcmVzRnJhbWVOdW1iZXIgPSByZXBseS5yZWFkSW50NjQobGFzdEZyYW1lTnVtYmVyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoKHJlcyAhPSBOT19FUlJPUikgfHwgKHJlc0ZyYW1lTnVtYmVyICE9IE5PX0VSUk9SKSkgewpAQCAtMjE5LDcgKzIxOSw3IEBACiAKICAgICAgICAgZGF0YS53cml0ZUludDMyKDEpOyAvLyBtYXJrZXIgdGhhdCBidWZmZXJQcm9kdWNlciBpcyBub3QgbnVsbAogICAgICAgICBkYXRhLndyaXRlU3RyaW5nMTYoU3RyaW5nMTYoInVua25vd25fbmFtZSIpKTsgLy8gbmFtZSBvZiBzdXJmYWNlCi0gICAgICAgIHNwPElCaW5kZXI+IGIoYnVmZmVyUHJvZHVjZXItPmFzQmluZGVyKCkpOworICAgICAgICBzcDxJQmluZGVyPiBiKElJbnRlcmZhY2U6OmFzQmluZGVyKGJ1ZmZlclByb2R1Y2VyKSk7CiAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoYik7CiAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KENSRUFURV9TVFJFQU0sIGRhdGEsICZyZXBseSk7CkBAIC0yOTYsNyArMjk2LDcgQEAKICAgICAgICAgc3RhdHVzX3QgcmVzRnJhbWVOdW1iZXIgPSBCQURfVkFMVUU7CiAgICAgICAgIGlmIChyZXBseS5yZWFkSW50MzIoKSAhPSAwKSB7CiAgICAgICAgICAgICBpZiAobGFzdEZyYW1lTnVtYmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXMgPSByZXBseS5yZWFkSW50NjQobGFzdEZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgICAgICByZXNGcmFtZU51bWJlciA9IHJlcGx5LnJlYWRJbnQ2NChsYXN0RnJhbWVOdW1iZXIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmICgocmVzICE9IE5PX0VSUk9SKSB8fCAocmVzRnJhbWVOdW1iZXIgIT0gTk9fRVJST1IpKSB7CmRpZmYgLS1naXQgYS9jYW1lcmEvdGVzdHMvQW5kcm9pZC5tayBiL2NhbWVyYS90ZXN0cy9BbmRyb2lkLm1rCmluZGV4IDYxMzg1ZTUuLjJkYjRjMTQgMTAwNjQ0Ci0tLSBhL2NhbWVyYS90ZXN0cy9BbmRyb2lkLm1rCisrKyBiL2NhbWVyYS90ZXN0cy9BbmRyb2lkLm1rCkBAIC0xNCwxNiArMTQsMTUgQEAKIAogTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9ICQoTE9DQUxfUEFUSCkvQW5kcm9pZC5tawogCiBMT0NBTF9TUkNfRklMRVM6PSBcCi0JbWFpbi5jcHAgXAogCVByb0NhbWVyYVRlc3RzLmNwcCBcCiAJVmVuZG9yVGFnRGVzY3JpcHRvclRlc3RzLmNwcAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKIAlsaWJ1dGlscyBcCiAJbGliY3V0aWxzIFwKLQlsaWJzdGxwb3J0IFwKIAlsaWJjYW1lcmFfbWV0YWRhdGEgXAogCWxpYmNhbWVyYV9jbGllbnQgXAogCWxpYmd1aSBcCkBAIC0zMiwxNCArMzEsNyBAQAogCWxpYmRsIFwKIAlsaWJiaW5kZXIKIAotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCi0JbGliZ3Rlc3QKLQogTE9DQUxfQ19JTkNMVURFUyArPSBcCi0JYmlvbmljIFwKLQliaW9uaWMvbGlic3RkYysrL2luY2x1ZGUgXAotCWV4dGVybmFsL2d0ZXN0L2luY2x1ZGUgXAotCWV4dGVybmFsL3N0bHBvcnQvc3RscG9ydCBcCiAJc3lzdGVtL21lZGlhL2NhbWVyYS9pbmNsdWRlIFwKIAlzeXN0ZW0vbWVkaWEvcHJpdmF0ZS9jYW1lcmEvaW5jbHVkZSBcCiAJc3lzdGVtL21lZGlhL2NhbWVyYS90ZXN0cyBcCmRpZmYgLS1naXQgYS9jYW1lcmEvdGVzdHMvbWFpbi5jcHAgYi9jYW1lcmEvdGVzdHMvbWFpbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjOGM1MTUuLjAwMDAwMDAKLS0tIGEvY2FtZXJhL3Rlc3RzL21haW4uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewotCi0gICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7Ci0KLSAgICBpbnQgcmV0ID0gUlVOX0FMTF9URVNUUygpOwotCi0gICAgcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL2NtZHMvc2NyZWVucmVjb3JkL1RleHRSZW5kZXJlci5jcHAgYi9jbWRzL3NjcmVlbnJlY29yZC9UZXh0UmVuZGVyZXIuY3BwCmluZGV4IDZhOTE3NmIuLjAxZjczZTAgMTAwNjQ0Ci0tLSBhL2NtZHMvc2NyZWVucmVjb3JkL1RleHRSZW5kZXJlci5jcHAKKysrIGIvY21kcy9zY3JlZW5yZWNvcmQvVGV4dFJlbmRlcmVyLmNwcApAQCAtMjEsNiArMjEsOCBAQAogI2luY2x1ZGUgIlRleHRSZW5kZXJlci5oIgogCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKICNpbmNsdWRlICJGb250Qml0bWFwLmgiCmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L1NpbXBsZVBsYXllci5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L1NpbXBsZVBsYXllci5jcHAKaW5kZXggMWIyZjc5Mi4uNGIyZjk4MCAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9TaW1wbGVQbGF5ZXIuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvU2ltcGxlUGxheWVyLmNwcApAQCAtMzMyLDcgKzMzMiw3IEBACiAKICAgICAgICAgc2l6ZV90IGogPSAwOwogICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXI7Ci0gICAgICAgIHdoaWxlIChmb3JtYXQtPmZpbmRCdWZmZXIoU3RyaW5nUHJpbnRmKCJjc2QtJWQiLCBqKS5jX3N0cigpLCAmYnVmZmVyKSkgeworICAgICAgICB3aGlsZSAoZm9ybWF0LT5maW5kQnVmZmVyKEFTdHJpbmdQcmludGYoImNzZC0lZCIsIGopLmNfc3RyKCksICZidWZmZXIpKSB7CiAgICAgICAgICAgICBzdGF0ZS0+bUNTRC5wdXNoX2JhY2soYnVmZmVyKTsKIAogICAgICAgICAgICAgKytqOwpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9TaW5lU291cmNlLmggYi9jbWRzL3N0YWdlZnJpZ2h0L1NpbmVTb3VyY2UuaAppbmRleCA3NmFiNjY5Li5iZTA1NjYxIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L1NpbmVTb3VyY2UuaAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L1NpbmVTb3VyY2UuaApAQCAtMywxMCArMywxMSBAQAogI2RlZmluZSBTSU5FX1NPVVJDRV9IXwogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9Db21wYXQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgTWVkaWFCdWZmZXJHcm91cDsKK2NsYXNzIE1lZGlhQnVmZmVyR3JvdXA7CiAKIHN0cnVjdCBTaW5lU291cmNlIDogcHVibGljIE1lZGlhU291cmNlIHsKICAgICBTaW5lU291cmNlKGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBudW1DaGFubmVscyk7CkBAIC0yNCw3ICsyNSw3IEBACiAKIHByaXZhdGU6CiAgICAgZW51bSB7IGtCdWZmZXJTaXplID0gODE5MiB9OwotICAgIHN0YXRpYyBjb25zdCBkb3VibGUga0ZyZXF1ZW5jeSA9IDUwMC4wOworICAgIHN0YXRpYyBjb25zdCBDT05TVEVYUFIgZG91YmxlIGtGcmVxdWVuY3kgPSA1MDAuMDsKIAogICAgIGJvb2wgbVN0YXJ0ZWQ7CiAgICAgaW50MzJfdCBtU2FtcGxlUmF0ZTsKZGlmZiAtLWdpdCBhL2RybS9jb21tb24vSURybU1hbmFnZXJTZXJ2aWNlLmNwcCBiL2RybS9jb21tb24vSURybU1hbmFnZXJTZXJ2aWNlLmNwcAppbmRleCBjMjM1MjAxLi41N2U1ZmM1IDEwMDY0NAotLS0gYS9kcm0vY29tbW9uL0lEcm1NYW5hZ2VyU2VydmljZS5jcHAKKysrIGIvZHJtL2NvbW1vbi9JRHJtTWFuYWdlclNlcnZpY2UuY3BwCkBAIC0xNDgsNyArMTQ4LDcgQEAKIAogICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKLSAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGRybVNlcnZpY2VMaXN0ZW5lci0+YXNCaW5kZXIoKSk7CisgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihkcm1TZXJ2aWNlTGlzdGVuZXIpKTsKICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0RSTV9TRVJWSUNFX0xJU1RFTkVSLCBkYXRhLCAmcmVwbHkpOwogICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKIH0KZGlmZiAtLWdpdCBhL2RybS9kcm1zZXJ2ZXIvQW5kcm9pZC5tayBiL2RybS9kcm1zZXJ2ZXIvQW5kcm9pZC5tawppbmRleCBhYTBhYjliLi40OGVhMzg1IDEwMDY0NAotLS0gYS9kcm0vZHJtc2VydmVyL0FuZHJvaWQubWsKKysrIGIvZHJtL2RybXNlcnZlci9BbmRyb2lkLm1rCkBAIC0yNiw3ICsyNiw4IEBACiAgICAgbGlidXRpbHMgXAogICAgIGxpYmxvZyBcCiAgICAgbGliYmluZGVyIFwKLSAgICBsaWJkbAorICAgIGxpYmRsIFwKKyAgICBsaWJzZWxpbnV4CiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliZHJtZnJhbWV3b3JrY29tbW9uCiAKZGlmZiAtLWdpdCBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuY3BwIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyU2VydmljZS5jcHAKaW5kZXggNjMzNDFlMC4uODU3ZDczZSAxMDA2NDQKLS0tIGEvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyU2VydmljZS5jcHAKKysrIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyU2VydmljZS5jcHAKQEAgLTI5LDIwICsyOSw2OCBAQAogI2luY2x1ZGUgIkRybU1hbmFnZXJTZXJ2aWNlLmgiCiAjaW5jbHVkZSAiRHJtTWFuYWdlci5oIgogCisjaW5jbHVkZSA8c2VsaW51eC9hbmRyb2lkLmg+CisKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCitzdGF0aWMgaW50IHNlbGludXhfZW5hYmxlZDsKK3N0YXRpYyBjaGFyICpkcm1zZXJ2ZXJfY29udGV4dDsKIHN0YXRpYyBWZWN0b3I8dWlkX3Q+IHRydXN0ZWRVaWRzOwogCi1zdGF0aWMgYm9vbCBpc1Byb3RlY3RlZENhbGxBbGxvd2VkKCkgeworY29uc3QgY2hhciAqY29uc3QgRHJtTWFuYWdlclNlcnZpY2U6OmRybV9wZXJtX2xhYmVsc1tdID0geworICAgICJjb25zdW1lUmlnaHRzIiwKKyAgICAic2V0UGxheWJhY2tTdGF0dXMiLAorICAgICJvcGVuRGVjcnlwdFNlc3Npb24iLAorICAgICJjbG9zZURlY3J5cHRTZXNzaW9uIiwKKyAgICAiaW5pdGlhbGl6ZURlY3J5cHRVbml0IiwKKyAgICAiZGVjcnlwdCIsCisgICAgImZpbmFsaXplRGVjcnlwdFVuaXQiLAorICAgICJwcmVhZCIKK307CisKK2NvbnN0IGNoYXIgKkRybU1hbmFnZXJTZXJ2aWNlOjpnZXRfcGVybV9sYWJlbChkcm1fcGVybV90IHBlcm0pIHsKKyAgICB1bnNpZ25lZCBpbnQgaW5kZXggPSBwZXJtOworCisgICAgaWYgKGluZGV4IDwgMCB8fAorICAgICAgICAgICAgaW5kZXggPj0gKHNpemVvZihkcm1fcGVybV9sYWJlbHMpIC8gc2l6ZW9mKGRybV9wZXJtX2xhYmVsc1swXSkpKSB7CisgICAgICAgIEFMT0dFKCJTRUxpbnV4OiBGYWlsZWQgdG8gcmV0cmlldmUgcGVybWlzc2lvbiBsYWJlbChwZXJtPSVkKS5cbiIsIHBlcm0pOworICAgICAgICBhYm9ydCgpOworICAgIH0KKyAgICByZXR1cm4gZHJtX3Blcm1fbGFiZWxzW2luZGV4XTsKK30KKworYm9vbCBEcm1NYW5hZ2VyU2VydmljZTo6c2VsaW51eElzUHJvdGVjdGVkQ2FsbEFsbG93ZWQocGlkX3Qgc3BpZCwgZHJtX3Blcm1fdCBwZXJtKSB7CisgICAgaWYgKHNlbGludXhfZW5hYmxlZCA8PSAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGNoYXIgKnNjdHg7CisgICAgY29uc3QgY2hhciAqc2VsaW51eF9jbGFzcyA9ICJkcm1zZXJ2aWNlIjsKKyAgICBjb25zdCBjaGFyICpzdHJfcGVybSA9IGdldF9wZXJtX2xhYmVsKHBlcm0pOworCisgICAgaWYgKGdldHBpZGNvbihzcGlkLCAmc2N0eCkgIT0gMCkgeworICAgICAgICBBTE9HRSgiU0VMaW51eDogZ2V0cGlkY29uKHBpZD0lZCkgZmFpbGVkLlxuIiwgc3BpZCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIGFsbG93ZWQgPSAoc2VsaW51eF9jaGVja19hY2Nlc3Moc2N0eCwgZHJtc2VydmVyX2NvbnRleHQsIHNlbGludXhfY2xhc3MsCisgICAgICAgICAgICBzdHJfcGVybSwgTlVMTCkgPT0gMCk7CisgICAgZnJlZWNvbihzY3R4KTsKKworICAgIHJldHVybiBhbGxvd2VkOworfQorCitib29sIERybU1hbmFnZXJTZXJ2aWNlOjppc1Byb3RlY3RlZENhbGxBbGxvd2VkKGRybV9wZXJtX3QgcGVybSkgewogICAgIC8vIFRPRE8KICAgICAvLyBGb2xsb3dpbmcgaW1wbGVtZW50YXRpb24gaXMganVzdCBmb3IgcmVmZXJlbmNlLgogICAgIC8vIEVhY2ggT0VNIG1hbnVmYWN0dXJlciBzaG91bGQgaW1wbGVtZW50L3JlcGxhY2Ugd2l0aCB0aGVpciBvd24gc29sdXRpb25zLgogICAgIElQQ1RocmVhZFN0YXRlKiBpcGNTdGF0ZSA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7CiAgICAgdWlkX3QgdWlkID0gaXBjU3RhdGUtPmdldENhbGxpbmdVaWQoKTsKKyAgICBwaWRfdCBzcGlkID0gaXBjU3RhdGUtPmdldENhbGxpbmdQaWQoKTsKIAogICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgdHJ1c3RlZFVpZHMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgaWYgKHRydXN0ZWRVaWRzW2ldID09IHVpZCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gc2VsaW51eElzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoc3BpZCwgcGVybSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNjAsNiArMTA4LDE2IEBACiAgICAgICAgIC8vIEFkZCB0cnVzdGVkIHVpZHMgaGVyZQogICAgICAgICB0cnVzdGVkVWlkcy5wdXNoKEFJRF9NRURJQSk7CiAgICAgfQorCisgICAgc2VsaW51eF9lbmFibGVkID0gaXNfc2VsaW51eF9lbmFibGVkKCk7CisgICAgaWYgKHNlbGludXhfZW5hYmxlZCA+IDAgJiYgZ2V0Y29uKCZkcm1zZXJ2ZXJfY29udGV4dCkgIT0gMCkgeworICAgICAgICBBTE9HRSgiU0VMaW51eDogRHJtTWFuYWdlclNlcnZpY2UgZmFpbGVkIHRvIGdldCBjb250ZXh0IGZvciBEcm1NYW5hZ2VyU2VydmljZS4gQWJvcnRpbmcuXG4iKTsKKyAgICAgICAgYWJvcnQoKTsKKyAgICB9CisKKyAgICB1bmlvbiBzZWxpbnV4X2NhbGxiYWNrIGNiOworICAgIGNiLmZ1bmNfbG9nID0gc2VsaW51eF9sb2dfY2FsbGJhY2s7CisgICAgc2VsaW51eF9zZXRfY2FsbGJhY2soU0VMSU5VWF9DQl9MT0csIGNiKTsKIH0KIAogRHJtTWFuYWdlclNlcnZpY2U6OkRybU1hbmFnZXJTZXJ2aWNlKCkgOgpAQCAtMTUxLDcgKzIwOSw3IEBACiBzdGF0dXNfdCBEcm1NYW5hZ2VyU2VydmljZTo6Y29uc3VtZVJpZ2h0cygKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIGNvbnN1bWVSaWdodHMiKTsKLSAgICBpZiAoIWlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoKSkgeworICAgIGlmICghaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChDT05TVU1FX1JJR0hUUykpIHsKICAgICAgICAgcmV0dXJuIERSTV9FUlJPUl9OT19QRVJNSVNTSU9OOwogICAgIH0KICAgICByZXR1cm4gbURybU1hbmFnZXItPmNvbnN1bWVSaWdodHModW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGFjdGlvbiwgcmVzZXJ2ZSk7CkBAIC0xNjAsNyArMjE4LDcgQEAKIHN0YXR1c190IERybU1hbmFnZXJTZXJ2aWNlOjpzZXRQbGF5YmFja1N0YXR1cygKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIHNldFBsYXliYWNrU3RhdHVzIik7Ci0gICAgaWYgKCFpc1Byb3RlY3RlZENhbGxBbGxvd2VkKCkpIHsKKyAgICBpZiAoIWlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoU0VUX1BMQVlCQUNLX1NUQVRVUykpIHsKICAgICAgICAgcmV0dXJuIERSTV9FUlJPUl9OT19QRVJNSVNTSU9OOwogICAgIH0KICAgICByZXR1cm4gbURybU1hbmFnZXItPnNldFBsYXliYWNrU3RhdHVzKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBwbGF5YmFja1N0YXR1cywgcG9zaXRpb24pOwpAQCAtMjA4LDcgKzI2Niw3IEBACiBEZWNyeXB0SGFuZGxlKiBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCwgY29uc3QgY2hhciogbWltZSkgewogICAgIEFMT0dWKCJFbnRlcmluZyBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uIik7Ci0gICAgaWYgKGlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoKSkgeworICAgIGlmIChpc1Byb3RlY3RlZENhbGxBbGxvd2VkKE9QRU5fREVDUllQVF9TRVNTSU9OKSkgewogICAgICAgICByZXR1cm4gbURybU1hbmFnZXItPm9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgZmQsIG9mZnNldCwgbGVuZ3RoLCBtaW1lKTsKICAgICB9CiAKQEAgLTIxOCw3ICsyNzYsNyBAQAogRGVjcnlwdEhhbmRsZSogRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgY2hhciogdXJpLCBjb25zdCBjaGFyKiBtaW1lKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24gd2l0aCB1cmkiKTsKLSAgICBpZiAoaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZCgpKSB7CisgICAgaWYgKGlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoT1BFTl9ERUNSWVBUX1NFU1NJT04pKSB7CiAgICAgICAgIHJldHVybiBtRHJtTWFuYWdlci0+b3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCB1cmksIG1pbWUpOwogICAgIH0KIApAQCAtMjI4LDcgKzI4Niw3IEBACiBEZWNyeXB0SGFuZGxlKiBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1CdWZmZXImIGJ1ZiwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpIHsKICAgICBBTE9HVigiRW50ZXJpbmcgRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbiBmb3Igc3RyZWFtaW5nIik7Ci0gICAgaWYgKGlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoKSkgeworICAgIGlmIChpc1Byb3RlY3RlZENhbGxBbGxvd2VkKE9QRU5fREVDUllQVF9TRVNTSU9OKSkgewogICAgICAgICByZXR1cm4gbURybU1hbmFnZXItPm9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgYnVmLCBtaW1lVHlwZSk7CiAgICAgfQogCkBAIC0yMzcsNyArMjk1LDcgQEAKIAogc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6OmNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIGNsb3NlRGVjcnlwdFNlc3Npb24iKTsKLSAgICBpZiAoIWlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoKSkgeworICAgIGlmICghaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChDTE9TRV9ERUNSWVBUX1NFU1NJT04pKSB7CiAgICAgICAgIHJldHVybiBEUk1fRVJST1JfTk9fUEVSTUlTU0lPTjsKICAgICB9CiAgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5jbG9zZURlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlKTsKQEAgLTI0Niw3ICszMDQsNyBAQAogc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6OmluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIGluaXRpYWxpemVEZWNyeXB0VW5pdCIpOwotICAgIGlmICghaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZCgpKSB7CisgICAgaWYgKCFpc1Byb3RlY3RlZENhbGxBbGxvd2VkKElOSVRJQUxJWkVfREVDUllQVF9VTklUKSkgewogICAgICAgICByZXR1cm4gRFJNX0VSUk9SX05PX1BFUk1JU1NJT047CiAgICAgfQogICAgIHJldHVybiBtRHJtTWFuYWdlci0+aW5pdGlhbGl6ZURlY3J5cHRVbml0KHVuaXF1ZUlkLGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQsIGhlYWRlckluZm8pOwpAQCAtMjU2LDcgKzMxNCw3IEBACiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVikgewogICAgIEFMT0dWKCJFbnRlcmluZyBkZWNyeXB0Iik7Ci0gICAgaWYgKCFpc1Byb3RlY3RlZENhbGxBbGxvd2VkKCkpIHsKKyAgICBpZiAoIWlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoREVDUllQVCkpIHsKICAgICAgICAgcmV0dXJuIERSTV9FUlJPUl9OT19QRVJNSVNTSU9OOwogICAgIH0KICAgICByZXR1cm4gbURybU1hbmFnZXItPmRlY3J5cHQodW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQsIGVuY0J1ZmZlciwgZGVjQnVmZmVyLCBJVik7CkBAIC0yNjUsNyArMzIzLDcgQEAKIHN0YXR1c190IERybU1hbmFnZXJTZXJ2aWNlOjpmaW5hbGl6ZURlY3J5cHRVbml0KAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgewogICAgIEFMT0dWKCJFbnRlcmluZyBmaW5hbGl6ZURlY3J5cHRVbml0Iik7Ci0gICAgaWYgKCFpc1Byb3RlY3RlZENhbGxBbGxvd2VkKCkpIHsKKyAgICBpZiAoIWlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoRklOQUxJWkVfREVDUllQVF9VTklUKSkgewogICAgICAgICByZXR1cm4gRFJNX0VSUk9SX05PX1BFUk1JU1NJT047CiAgICAgfQogICAgIHJldHVybiBtRHJtTWFuYWdlci0+ZmluYWxpemVEZWNyeXB0VW5pdCh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCk7CkBAIC0yNzQsNyArMzMyLDcgQEAKIHNzaXplX3QgRHJtTWFuYWdlclNlcnZpY2U6OnByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpIHsKICAgICBBTE9HVigiRW50ZXJpbmcgcHJlYWQiKTsKLSAgICBpZiAoIWlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoKSkgeworICAgIGlmICghaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChQUkVBRCkpIHsKICAgICAgICAgcmV0dXJuIERSTV9FUlJPUl9OT19QRVJNSVNTSU9OOwogICAgIH0KICAgICByZXR1cm4gbURybU1hbmFnZXItPnByZWFkKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBidWZmZXIsIG51bUJ5dGVzLCBvZmZzZXQpOwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9Ecm1NYW5hZ2VyQ2xpZW50SW1wbC5jcHAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL0RybU1hbmFnZXJDbGllbnRJbXBsLmNwcAppbmRleCAyZDJjOTBlLi45NDU3YmI2IDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL0RybU1hbmFnZXJDbGllbnRJbXBsLmNwcAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL0RybU1hbmFnZXJDbGllbnRJbXBsLmNwcApAQCAtMzQ2LDcgKzM0Niw3IEBACiBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6RGVhdGhOb3RpZmllcjo6fkRlYXRoTm90aWZpZXIoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soc011dGV4KTsKICAgICBpZiAoTlVMTCAhPSBzRHJtTWFuYWdlclNlcnZpY2UuZ2V0KCkpIHsKLSAgICAgICAgc0RybU1hbmFnZXJTZXJ2aWNlLT5hc0JpbmRlcigpLT51bmxpbmtUb0RlYXRoKHRoaXMpOworICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihzRHJtTWFuYWdlclNlcnZpY2UpLT51bmxpbmtUb0RlYXRoKHRoaXMpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0RybU1hbmFnZXJTZXJ2aWNlLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvRHJtTWFuYWdlclNlcnZpY2UuaAppbmRleCA4YmM1OWI0Li40NWNlZTJlIDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvRHJtTWFuYWdlclNlcnZpY2UuaAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvRHJtTWFuYWdlclNlcnZpY2UuaApAQCAtNDIsOSArNDIsMjggQEAKICAgICBzdGF0aWMgdm9pZCBpbnN0YW50aWF0ZSgpOwogCiBwcml2YXRlOgorICAgIGVudW0gZHJtX3Blcm1fdCB7CisgICAgICAgIENPTlNVTUVfUklHSFRTICAgICAgICAgID0gMCwKKyAgICAgICAgU0VUX1BMQVlCQUNLX1NUQVRVUyAgICAgPSAxLAorICAgICAgICBPUEVOX0RFQ1JZUFRfU0VTU0lPTiAgICA9IDIsCisgICAgICAgIENMT1NFX0RFQ1JZUFRfU0VTU0lPTiAgID0gMywKKyAgICAgICAgSU5JVElBTElaRV9ERUNSWVBUX1VOSVQgPSA0LAorICAgICAgICBERUNSWVBUICAgICAgICAgICAgICAgICA9IDUsCisgICAgICAgIEZJTkFMSVpFX0RFQ1JZUFRfVU5JVCAgID0gNiwKKyAgICAgICAgUFJFQUQgICAgICAgICAgICAgICAgICAgPSA3LAorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZHJtX3Blcm1fbGFiZWxzW107CisKICAgICBEcm1NYW5hZ2VyU2VydmljZSgpOwogICAgIHZpcnR1YWwgfkRybU1hbmFnZXJTZXJ2aWNlKCk7CiAKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0X3Blcm1fbGFiZWwoZHJtX3Blcm1fdCBwZXJtKTsKKworICAgIHN0YXRpYyBib29sIHNlbGludXhJc1Byb3RlY3RlZENhbGxBbGxvd2VkKHBpZF90IHNwaWQsIGRybV9wZXJtX3QgcGVybSk7CisKKyAgICBzdGF0aWMgYm9vbCBpc1Byb3RlY3RlZENhbGxBbGxvd2VkKGRybV9wZXJtX3QgcGVybSk7CisKIHB1YmxpYzoKICAgICBpbnQgYWRkVW5pcXVlSWQoYm9vbCBpc05hdGl2ZSk7CiAKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9QbHVnSW5NYW5hZ2VyLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvUGx1Z0luTWFuYWdlci5oCmluZGV4IGMxZDAxOWEuLjQ2Njg0NGQgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9QbHVnSW5NYW5hZ2VyLmgKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL1BsdWdJbk1hbmFnZXIuaApAQCAtMjM0LDE0ICsyMzQsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhlIGlucHV0IGVudHJ5IGlzICIuIiBvciAiLi4iCi0gICAgICovCi0gICAgYm9vbCBpc0RvdE9yRERvdChjb25zdCBzdHJ1Y3QgZGlyZW50KiBwRW50cnkpIGNvbnN0IHsKLSAgICAgICAgU3RyaW5nOCBzTmFtZShwRW50cnktPmRfbmFtZSk7Ci0gICAgICAgIHJldHVybiAiLiIgPT0gc05hbWUgfHwgIi4uIiA9PSBzTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBUcnVlIGlmIGlucHV0IGVudHJ5IGlzIGRpcmVjdG9yeQogICAgICAqLwogICAgIGJvb2wgaXNEaXJlY3RvcnkoY29uc3Qgc3RydWN0IGRpcmVudCogcEVudHJ5KSBjb25zdCB7CmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvQW5kcm9pZC5tayBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9BbmRyb2lkLm1rCmluZGV4IDQ4YjBhZmUuLjkzMzQ2NGYgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9BbmRyb2lkLm1rCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9BbmRyb2lkLm1rCkBAIC01OCw4ICs1OCw3IEBACiAgICAgJChiYXNlKS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb21tb24gXAogICAgICQoYmFzZSkvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29udmVydGVyIFwKICAgICAkKGJhc2UpL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RlY29kZXIgXAotICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZSBcCi0gICAgZXh0ZXJuYWwvb3BlbnNzbC9pbmNsdWRlCisgICAgJChMT0NBTF9QQVRIKS9pbmNsdWRlCiAKIExPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IGRybQogCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb21tb24vQW5kcm9pZC5tayBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbW1vbi9BbmRyb2lkLm1rCmluZGV4IDZjNWQzY2YuLjNiNGM4YjQgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbW1vbi9BbmRyb2lkLm1rCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbW1vbi9BbmRyb2lkLm1rCkBAIC0yMCw5ICsyMCw2IEBACiBMT0NBTF9TUkNfRklMRVMgOj0gXAogICAgIEZ3ZExvY2tHbHVlLmMKIAotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgZXh0ZXJuYWwvb3BlbnNzbC9pbmNsdWRlCi0KIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3J5cHRvCiAKIExPQ0FMX01PRFVMRSA6PSBsaWJmd2Rsb2NrLWNvbW1vbgpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29udmVydGVyL0FuZHJvaWQubWsgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb252ZXJ0ZXIvQW5kcm9pZC5tawppbmRleCA4ZjA4Yzg4Li4yZjUxZjBjIDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb252ZXJ0ZXIvQW5kcm9pZC5taworKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb252ZXJ0ZXIvQW5kcm9pZC5tawpAQCAtMjEsOCArMjEsNyBAQAogICAgIEZ3ZExvY2tDb252LmMKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb21tb24gXAotICAgIGV4dGVybmFsL29wZW5zc2wvaW5jbHVkZQorICAgIGZyYW1ld29ya3MvYXYvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29tbW9uCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3J5cHRvCiAKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RlY29kZXIvQW5kcm9pZC5tayBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RlY29kZXIvQW5kcm9pZC5tawppbmRleCA3YjQ5M2MzLi4zMzk5YWU1IDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kZWNvZGVyL0FuZHJvaWQubWsKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZGVjb2Rlci9BbmRyb2lkLm1rCkBAIC0yMSw4ICsyMSw3IEBACiAgICAgRndkTG9ja0ZpbGUuYwogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICBmcmFtZXdvcmtzL2F2L2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbW1vbiBcCi0gICAgZXh0ZXJuYWwvb3BlbnNzbC9pbmNsdWRlCisgICAgZnJhbWV3b3Jrcy9hdi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb21tb24KIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjcnlwdG8KIApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQW5kcm9pZC5tayBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0FuZHJvaWQubWsKaW5kZXggMjJhODViNC4uMmVmZGNmNSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQW5kcm9pZC5taworKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9BbmRyb2lkLm1rCkBAIC0zMSw5ICszMSw3IEBACiAgICAgVXRpbHMuY3BwIFwKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgYmlvbmljIFwKICAgICBleHRlcm5hbC9qc21uIFwKLSAgICBleHRlcm5hbC9vcGVuc3NsL2luY2x1ZGUgXAogICAgIGZyYW1ld29ya3MvYXYvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkgXAogICAgIGZyYW1ld29ya3MvYXYvaW5jbHVkZSBcCiAgICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZSBcCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLm1rIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQW5kcm9pZC5tawppbmRleCBhYzViYjIxLi4zOTJmMjE4IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLm1rCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0FuZHJvaWQubWsKQEAgLTI4LDI1ICsyOCwxNiBAQAogICAgIEpzb25XZWJLZXlVbml0dGVzdC5jcHAgXAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICBiaW9uaWMgXAotICAgIGV4dGVybmFsL2d0ZXN0L2luY2x1ZGUgXAogICAgIGV4dGVybmFsL2pzbW4gXAotICAgIGV4dGVybmFsL29wZW5zc2wvaW5jbHVkZSBcCi0gICAgZXh0ZXJuYWwvc3RscG9ydC9zdGxwb3J0IFwKICAgICBmcmFtZXdvcmtzL2F2L2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5IFwKICAgICBmcmFtZXdvcmtzL2F2L2luY2x1ZGUgXAogICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUgXAogCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJndGVzdCBcCi0gICAgbGliZ3Rlc3RfbWFpbiBcCi0KIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgIGxpYmNyeXB0byBcCiAgICAgbGliZHJtY2xlYXJrZXlwbHVnaW4gXAogICAgIGxpYmxvZyBcCiAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCi0gICAgbGlic3RscG9ydCBcCiAgICAgbGlidXRpbHMgXAogCiBpbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaCBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oCmluZGV4IGQ3ZTU4NGEuLjY3YjU5OWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oCkBAIC01MSwxNyArNTEsNiBAQAogICAgIHZpcnR1YWwgc3A8SU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI+IGNyZWF0ZU1ldGFkYXRhUmV0cmlldmVyKCkgPSAwOwogICAgIHZpcnR1YWwgc3A8SU1lZGlhUGxheWVyPiBjcmVhdGUoY29uc3Qgc3A8SU1lZGlhUGxheWVyQ2xpZW50PiYgY2xpZW50LCBpbnQgYXVkaW9TZXNzaW9uSWQgPSAwKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgZGVjb2RlKAotICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybCwKLSAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgIGludCogcE51bUNoYW5uZWxzLAotICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCi0gICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsIHNpemVfdCAqcFNpemUpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICBkZWNvZGUoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgsIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogcE51bUNoYW5uZWxzLCBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwgc2l6ZV90ICpwU2l6ZSkgPSAwOwogICAgIHZpcnR1YWwgc3A8SU9NWD4gICAgICAgICAgICBnZXRPTVgoKSA9IDA7CiAgICAgdmlydHVhbCBzcDxJQ3J5cHRvPiAgICAgICAgIG1ha2VDcnlwdG8oKSA9IDA7CiAgICAgdmlydHVhbCBzcDxJRHJtPiAgICAgICAgICAgIG1ha2VEcm0oKSA9IDA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0pldFBsYXllci5oIGIvaW5jbHVkZS9tZWRpYS9KZXRQbGF5ZXIuaAppbmRleCAzODhmNzY3Li42M2QxOTgwIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0pldFBsYXllci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvSmV0UGxheWVyLmgKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaWJzb25pdm94L2pldC5oPgogI2luY2x1ZGUgPGxpYnNvbml2b3gvZWFzX3R5cGVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgorI2luY2x1ZGUgPG1lZGlhL01pZGlJb1dyYXBwZXIuaD4KIAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC04NiwxNSArODcsMTMgQEAKIAogICAgIGludCAgICAgICAgICAgICAgICAgbU1heFRyYWNrczsgLy8gbWF4IG51bWJlciBvZiBNSURJIHRyYWNrcywgdXN1YWxseSAzMgogICAgIEVBU19EQVRBX0hBTkRMRSAgICAgbUVhc0RhdGE7Ci0gICAgRUFTX0ZJTEVfTE9DQVRPUiAgICBtRWFzSmV0RmlsZUxvYzsKKyAgICBzcDxNaWRpSW9XcmFwcGVyPiAgIG1Jb1dyYXBwZXI7CiAgICAgRUFTX1BDTSogICAgICAgICAgICBtQXVkaW9CdWZmZXI7Ly8gRUFTIHJlbmRlcnMgdGhlIE1JREkgZGF0YSBpbnRvIHRoaXMgYnVmZmVyLAogICAgIHNwPEF1ZGlvVHJhY2s+ICAgICAgbUF1ZGlvVHJhY2s7IC8vIGFuZCB3ZSBwbGF5IGl0IGluIHRoaXMgYXVkaW8gdHJhY2sKICAgICBpbnQgICAgICAgICAgICAgICAgIG1UcmFja0J1ZmZlclNpemU7CiAgICAgU19KRVRfU1RBVFVTICAgICAgICBtSmV0U3RhdHVzOwogICAgIFNfSkVUX1NUQVRVUyAgICAgICAgbVByZXZpb3VzSmV0U3RhdHVzOwogCi0gICAgY2hhciAgICAgICAgICAgICAgICBtSmV0RmlsZVBhdGhbUEFUSF9NQVhdOwotCiAgICAgY2xhc3MgSmV0UGxheWVyVGhyZWFkIDogcHVibGljIFRocmVhZCB7CiAgICAgcHVibGljOgogICAgICAgICBKZXRQbGF5ZXJUaHJlYWQoSmV0UGxheWVyICpwbGF5ZXIpIDogbVBsYXllcihwbGF5ZXIpIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaAppbmRleCBjNDEyMjk5Li40YTZiZjI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oCkBAIC00Myw4ICs0Myw2IEBACiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBTb3J0ZWRWZWN0b3I7CiAKIGVudW0gcGxheWVyX3R5cGUgewotICAgIFBWX1BMQVlFUiA9IDEsCi0gICAgU09OSVZPWF9QTEFZRVIgPSAyLAogICAgIFNUQUdFRlJJR0hUX1BMQVlFUiA9IDMsCiAgICAgTlVfUExBWUVSID0gNCwKICAgICAvLyBUZXN0IHBsYXllcnMgYXJlIGF2YWlsYWJsZSBvbmx5IGluIHRoZSAndGVzdCcgYW5kICdlbmcnIGJ1aWxkcy4KQEAgLTkwLDcgKzg4LDYgQEAKIAogICAgICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5BdWRpb1NpbmsoKSB7fQogICAgICAgICB2aXJ0dWFsIGJvb2wgICAgICAgIHJlYWR5KCkgY29uc3QgPSAwOyAvLyBhdWRpbyBvdXRwdXQgaXMgb3BlbiBhbmQgcmVhZHkKLSAgICAgICAgdmlydHVhbCBib29sICAgICAgICByZWFsdGltZSgpIGNvbnN0ID0gMDsgLy8gYXVkaW8gb3V0cHV0IGlzIHJlYWwtdGltZSBvdXRwdXQKICAgICAgICAgdmlydHVhbCBzc2l6ZV90ICAgICBidWZmZXJTaXplKCkgY29uc3QgPSAwOwogICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgIGZyYW1lQ291bnQoKSBjb25zdCA9IDA7CiAgICAgICAgIHZpcnR1YWwgc3NpemVfdCAgICAgY2hhbm5lbENvdW50KCkgY29uc3QgPSAwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NaWRpSW9XcmFwcGVyLmggYi9pbmNsdWRlL21lZGlhL01pZGlJb1dyYXBwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmY4Y2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9NaWRpSW9XcmFwcGVyLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUlESV9JT19XUkFQUEVSX0hfCisjZGVmaW5lIE1JRElfSU9fV1JBUFBFUl9IXworCisjaW5jbHVkZSA8bGlic29uaXZveC9lYXNfdHlwZXMuaD4KKworI2luY2x1ZGUgIm1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNaWRpSW9XcmFwcGVyIDogcHVibGljIFJlZkJhc2UgeworcHVibGljOgorICAgIE1pZGlJb1dyYXBwZXIoY29uc3QgY2hhciAqcGF0aCk7CisgICAgTWlkaUlvV3JhcHBlcihpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBpbnQ2NF90IHNpemUpOworICAgIE1pZGlJb1dyYXBwZXIoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSk7CisKKyAgICB+TWlkaUlvV3JhcHBlcigpOworCisgICAgaW50IHJlYWRBdCh2b2lkICpidWZmZXIsIGludCBvZmZzZXQsIGludCBzaXplKTsKKyAgICBpbnQgc2l6ZSgpOworCisgICAgRUFTX0ZJTEVfTE9DQVRPUiBnZXRMb2NhdG9yKCk7CisKK3ByaXZhdGU6CisgICAgaW50IG1GZDsKKyAgICBvZmY2NF90IG1CYXNlOworICAgIGludDY0X3QgIG1MZW5ndGg7CisgICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7CisgICAgRUFTX0ZJTEUgbUVhc0ZpbGU7Cit9OworCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBNSURJX0lPX1dSQVBQRVJfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvU291bmRQb29sLmggYi9pbmNsdWRlL21lZGlhL1NvdW5kUG9vbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODMwNDc1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvU291bmRQb29sLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgU09VTkRQT09MX0hfCi0jZGVmaW5lIFNPVU5EUE9PTF9IXwotCi0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KLSNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5QmFzZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXRpYyBjb25zdCBpbnQgSURMRV9QUklPUklUWSA9IC0xOwotCi0vLyBmb3J3YXJkIGRlY2xhcmF0aW9ucwotY2xhc3MgU291bmRFdmVudDsKLWNsYXNzIFNvdW5kUG9vbFRocmVhZDsKLWNsYXNzIFNvdW5kUG9vbDsKLQotLy8gZm9yIHF1ZXVlZCBldmVudHMKLWNsYXNzIFNvdW5kUG9vbEV2ZW50IHsKLXB1YmxpYzoKLSAgICBTb3VuZFBvb2xFdmVudChpbnQgbXNnLCBpbnQgYXJnMT0wLCBpbnQgYXJnMj0wKSA6Ci0gICAgICAgIG1Nc2cobXNnKSwgbUFyZzEoYXJnMSksIG1BcmcyKGFyZzIpIHt9Ci0gICAgaW50ICAgICAgICAgbU1zZzsKLSAgICBpbnQgICAgICAgICBtQXJnMTsKLSAgICBpbnQgICAgICAgICBtQXJnMjsKLSAgICBlbnVtIE1lc3NhZ2VUeXBlIHsgSU5WQUxJRCwgU0FNUExFX0xPQURFRCB9OwotfTsKLQotLy8gY2FsbGJhY2sgZnVuY3Rpb24gcHJvdG90eXBlCi10eXBlZGVmIHZvaWQgU291bmRQb29sQ2FsbGJhY2soU291bmRQb29sRXZlbnQgZXZlbnQsIFNvdW5kUG9vbCogc291bmRQb29sLCB2b2lkKiB1c2VyKTsKLQotLy8gdHJhY2tzIHNhbXBsZXMgdXNlZCBieSBhcHBsaWNhdGlvbgotY2xhc3MgU2FtcGxlICA6IHB1YmxpYyBSZWZCYXNlIHsKLXB1YmxpYzoKLSAgICBlbnVtIHNhbXBsZV9zdGF0ZSB7IFVOTE9BREVELCBMT0FESU5HLCBSRUFEWSwgVU5MT0FESU5HIH07Ci0gICAgU2FtcGxlKGludCBzYW1wbGVJRCwgY29uc3QgY2hhciogdXJsKTsKLSAgICBTYW1wbGUoaW50IHNhbXBsZUlELCBpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7Ci0gICAgflNhbXBsZSgpOwotICAgIGludCBzYW1wbGVJRCgpIHsgcmV0dXJuIG1TYW1wbGVJRDsgfQotICAgIGludCBudW1DaGFubmVscygpIHsgcmV0dXJuIG1OdW1DaGFubmVsczsgfQotICAgIGludCBzYW1wbGVSYXRlKCkgeyByZXR1cm4gbVNhbXBsZVJhdGU7IH0KLSAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQoKSB7IHJldHVybiBtRm9ybWF0OyB9Ci0gICAgc2l6ZV90IHNpemUoKSB7IHJldHVybiBtU2l6ZTsgfQotICAgIGludCBzdGF0ZSgpIHsgcmV0dXJuIG1TdGF0ZTsgfQotICAgIHVpbnQ4X3QqIGRhdGEoKSB7IHJldHVybiBzdGF0aWNfY2FzdDx1aW50OF90Kj4obURhdGEtPnBvaW50ZXIoKSk7IH0KLSAgICBzdGF0dXNfdCBkb0xvYWQoKTsKLSAgICB2b2lkIHN0YXJ0TG9hZCgpIHsgbVN0YXRlID0gTE9BRElORzsgfQotICAgIHNwPElNZW1vcnk+IGdldElNZW1vcnkoKSB7IHJldHVybiBtRGF0YTsgfQotCi0gICAgLy8gaGFjawotICAgIHZvaWQgaW5pdChpbnQgbnVtQ2hhbm5lbHMsIGludCBzYW1wbGVSYXRlLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgc3A8SU1lbW9yeT4gZGF0YSApIHsKLSAgICAgICAgbU51bUNoYW5uZWxzID0gbnVtQ2hhbm5lbHM7IG1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsgbUZvcm1hdCA9IGZvcm1hdDsgbVNpemUgPSBzaXplOwotICAgICAgICAgICAgbURhdGEgPSBkYXRhOyB9Ci0KLXByaXZhdGU6Ci0gICAgdm9pZCBpbml0KCk7Ci0KLSAgICBzaXplX3QgICAgICAgICAgICAgIG1TaXplOwotICAgIHZvbGF0aWxlIGludDMyX3QgICAgbVJlZkNvdW50OwotICAgIHVpbnQxNl90ICAgICAgICAgICAgbVNhbXBsZUlEOwotICAgIHVpbnQxNl90ICAgICAgICAgICAgbVNhbXBsZVJhdGU7Ci0gICAgdWludDhfdCAgICAgICAgICAgICBtU3RhdGUgOiAzOwotICAgIHVpbnQ4X3QgICAgICAgICAgICAgbU51bUNoYW5uZWxzIDogMjsKLSAgICBhdWRpb19mb3JtYXRfdCAgICAgIG1Gb3JtYXQ7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBtRmQ7Ci0gICAgaW50NjRfdCAgICAgICAgICAgICBtT2Zmc2V0OwotICAgIGludDY0X3QgICAgICAgICAgICAgbUxlbmd0aDsKLSAgICBjaGFyKiAgICAgICAgICAgICAgIG1Vcmw7Ci0gICAgc3A8SU1lbW9yeT4gICAgICAgICBtRGF0YTsKLSAgICBzcDxNZW1vcnlIZWFwQmFzZT4gIG1IZWFwOwotfTsKLQotLy8gc3RvcmVzIHBlbmRpbmcgZXZlbnRzIGZvciBzdG9sZW4gY2hhbm5lbHMKLWNsYXNzIFNvdW5kRXZlbnQKLXsKLXB1YmxpYzoKLSAgICBTb3VuZEV2ZW50KCkgOiBtQ2hhbm5lbElEKDApLCBtTGVmdFZvbHVtZSgwKSwgbVJpZ2h0Vm9sdW1lKDApLAotICAgICAgICAgICAgbVByaW9yaXR5KElETEVfUFJJT1JJVFkpLCBtTG9vcCgwKSwgbVJhdGUoMCkge30KLSAgICB2b2lkIHNldChjb25zdCBzcDxTYW1wbGU+JiBzYW1wbGUsIGludCBjaGFubmVsSUQsIGZsb2F0IGxlZnRWb2x1bWUsCi0gICAgICAgICAgICBmbG9hdCByaWdodFZvbHVtZSwgaW50IHByaW9yaXR5LCBpbnQgbG9vcCwgZmxvYXQgcmF0ZSk7Ci0gICAgc3A8U2FtcGxlPiAgICAgIHNhbXBsZSgpIHsgcmV0dXJuIG1TYW1wbGU7IH0KLSAgICBpbnQgICAgICAgICAgICAgY2hhbm5lbElEKCkgeyByZXR1cm4gbUNoYW5uZWxJRDsgfQotICAgIGZsb2F0ICAgICAgICAgICBsZWZ0Vm9sdW1lKCkgeyByZXR1cm4gbUxlZnRWb2x1bWU7IH0KLSAgICBmbG9hdCAgICAgICAgICAgcmlnaHRWb2x1bWUoKSB7IHJldHVybiBtUmlnaHRWb2x1bWU7IH0KLSAgICBpbnQgICAgICAgICAgICAgcHJpb3JpdHkoKSB7IHJldHVybiBtUHJpb3JpdHk7IH0KLSAgICBpbnQgICAgICAgICAgICAgbG9vcCgpIHsgcmV0dXJuIG1Mb29wOyB9Ci0gICAgZmxvYXQgICAgICAgICAgIHJhdGUoKSB7IHJldHVybiBtUmF0ZTsgfQotICAgIHZvaWQgICAgICAgICAgICBjbGVhcigpIHsgbUNoYW5uZWxJRCA9IDA7IG1TYW1wbGUuY2xlYXIoKTsgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgc3A8U2FtcGxlPiAgICAgIG1TYW1wbGU7Ci0gICAgaW50ICAgICAgICAgICAgIG1DaGFubmVsSUQ7Ci0gICAgZmxvYXQgICAgICAgICAgIG1MZWZ0Vm9sdW1lOwotICAgIGZsb2F0ICAgICAgICAgICBtUmlnaHRWb2x1bWU7Ci0gICAgaW50ICAgICAgICAgICAgIG1Qcmlvcml0eTsKLSAgICBpbnQgICAgICAgICAgICAgbUxvb3A7Ci0gICAgZmxvYXQgICAgICAgICAgIG1SYXRlOwotfTsKLQotLy8gZm9yIGNoYW5uZWxzIGFrYSBBdWRpb1RyYWNrcwotY2xhc3MgU291bmRDaGFubmVsIDogcHVibGljIFNvdW5kRXZlbnQgewotcHVibGljOgotICAgIGVudW0gc3RhdGUgeyBJRExFLCBSRVNVTUlORywgU1RPUFBJTkcsIFBBVVNFRCwgUExBWUlORyB9OwotICAgIFNvdW5kQ2hhbm5lbCgpIDogbVN0YXRlKElETEUpLCBtTnVtQ2hhbm5lbHMoMSksCi0gICAgICAgICAgICBtUG9zKDApLCBtVG9nZ2xlKDApLCBtQXV0b1BhdXNlZChmYWxzZSkge30KLSAgICB+U291bmRDaGFubmVsKCk7Ci0gICAgdm9pZCBpbml0KFNvdW5kUG9vbCogc291bmRQb29sKTsKLSAgICB2b2lkIHBsYXkoY29uc3Qgc3A8U2FtcGxlPiYgc2FtcGxlLCBpbnQgY2hhbm5lbElELCBmbG9hdCBsZWZ0Vm9sdW1lLCBmbG9hdCByaWdodFZvbHVtZSwKLSAgICAgICAgICAgIGludCBwcmlvcml0eSwgaW50IGxvb3AsIGZsb2F0IHJhdGUpOwotICAgIHZvaWQgc2V0Vm9sdW1lX2woZmxvYXQgbGVmdFZvbHVtZSwgZmxvYXQgcmlnaHRWb2x1bWUpOwotICAgIHZvaWQgc2V0Vm9sdW1lKGZsb2F0IGxlZnRWb2x1bWUsIGZsb2F0IHJpZ2h0Vm9sdW1lKTsKLSAgICB2b2lkIHN0b3BfbCgpOwotICAgIHZvaWQgc3RvcCgpOwotICAgIHZvaWQgcGF1c2UoKTsKLSAgICB2b2lkIGF1dG9QYXVzZSgpOwotICAgIHZvaWQgcmVzdW1lKCk7Ci0gICAgdm9pZCBhdXRvUmVzdW1lKCk7Ci0gICAgdm9pZCBzZXRSYXRlKGZsb2F0IHJhdGUpOwotICAgIGludCBzdGF0ZSgpIHsgcmV0dXJuIG1TdGF0ZTsgfQotICAgIHZvaWQgc2V0UHJpb3JpdHkoaW50IHByaW9yaXR5KSB7IG1Qcmlvcml0eSA9IHByaW9yaXR5OyB9Ci0gICAgdm9pZCBzZXRMb29wKGludCBsb29wKTsKLSAgICBpbnQgbnVtQ2hhbm5lbHMoKSB7IHJldHVybiBtTnVtQ2hhbm5lbHM7IH0KLSAgICB2b2lkIGNsZWFyTmV4dEV2ZW50KCkgeyBtTmV4dEV2ZW50LmNsZWFyKCk7IH0KLSAgICB2b2lkIG5leHRFdmVudCgpOwotICAgIGludCBuZXh0Q2hhbm5lbElEKCkgeyByZXR1cm4gbU5leHRFdmVudC5jaGFubmVsSUQoKTsgfQotICAgIHZvaWQgZHVtcCgpOwotCi1wcml2YXRlOgotICAgIHN0YXRpYyB2b2lkIGNhbGxiYWNrKGludCBldmVudCwgdm9pZCogdXNlciwgdm9pZCAqaW5mbyk7Ci0gICAgdm9pZCBwcm9jZXNzKGludCBldmVudCwgdm9pZCAqaW5mbywgdW5zaWduZWQgbG9uZyB0b2dnbGUpOwotICAgIGJvb2wgZG9TdG9wX2woKTsKLQotICAgIFNvdW5kUG9vbCogICAgICAgICAgbVNvdW5kUG9vbDsKLSAgICBzcDxBdWRpb1RyYWNrPiAgICAgIG1BdWRpb1RyYWNrOwotICAgIFNvdW5kRXZlbnQgICAgICAgICAgbU5leHRFdmVudDsKLSAgICBNdXRleCAgICAgICAgICAgICAgIG1Mb2NrOwotICAgIGludCAgICAgICAgICAgICAgICAgbVN0YXRlOwotICAgIGludCAgICAgICAgICAgICAgICAgbU51bUNoYW5uZWxzOwotICAgIGludCAgICAgICAgICAgICAgICAgbVBvczsKLSAgICBpbnQgICAgICAgICAgICAgICAgIG1BdWRpb0J1ZmZlclNpemU7Ci0gICAgdW5zaWduZWQgbG9uZyAgICAgICBtVG9nZ2xlOwotICAgIGJvb2wgICAgICAgICAgICAgICAgbUF1dG9QYXVzZWQ7Ci19OwotCi0vLyBhcHBsaWNhdGlvbiBvYmplY3QgZm9yIG1hbmFnaW5nIGEgcG9vbCBvZiBzb3VuZHMKLWNsYXNzIFNvdW5kUG9vbCB7Ci0gICAgZnJpZW5kIGNsYXNzIFNvdW5kUG9vbFRocmVhZDsKLSAgICBmcmllbmQgY2xhc3MgU291bmRDaGFubmVsOwotcHVibGljOgotICAgIFNvdW5kUG9vbChpbnQgbWF4Q2hhbm5lbHMsIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMpOwotICAgIH5Tb3VuZFBvb2woKTsKLSAgICBpbnQgbG9hZChjb25zdCBjaGFyKiB1cmwsIGludCBwcmlvcml0eSk7Ci0gICAgaW50IGxvYWQoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgsIGludCBwcmlvcml0eSk7Ci0gICAgYm9vbCB1bmxvYWQoaW50IHNhbXBsZUlEKTsKLSAgICBpbnQgcGxheShpbnQgc2FtcGxlSUQsIGZsb2F0IGxlZnRWb2x1bWUsIGZsb2F0IHJpZ2h0Vm9sdW1lLCBpbnQgcHJpb3JpdHksCi0gICAgICAgICAgICBpbnQgbG9vcCwgZmxvYXQgcmF0ZSk7Ci0gICAgdm9pZCBwYXVzZShpbnQgY2hhbm5lbElEKTsKLSAgICB2b2lkIGF1dG9QYXVzZSgpOwotICAgIHZvaWQgcmVzdW1lKGludCBjaGFubmVsSUQpOwotICAgIHZvaWQgYXV0b1Jlc3VtZSgpOwotICAgIHZvaWQgc3RvcChpbnQgY2hhbm5lbElEKTsKLSAgICB2b2lkIHNldFZvbHVtZShpbnQgY2hhbm5lbElELCBmbG9hdCBsZWZ0Vm9sdW1lLCBmbG9hdCByaWdodFZvbHVtZSk7Ci0gICAgdm9pZCBzZXRQcmlvcml0eShpbnQgY2hhbm5lbElELCBpbnQgcHJpb3JpdHkpOwotICAgIHZvaWQgc2V0TG9vcChpbnQgY2hhbm5lbElELCBpbnQgbG9vcCk7Ci0gICAgdm9pZCBzZXRSYXRlKGludCBjaGFubmVsSUQsIGZsb2F0IHJhdGUpOwotICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogYXR0cmlidXRlcygpIHsgcmV0dXJuICZtQXR0cmlidXRlczsgfQotCi0gICAgLy8gY2FsbGVkIGZyb20gU291bmRQb29sVGhyZWFkCi0gICAgdm9pZCBzYW1wbGVMb2FkZWQoaW50IHNhbXBsZUlEKTsKLQotICAgIC8vIGNhbGxlZCBmcm9tIEF1ZGlvVHJhY2sgdGhyZWFkCi0gICAgdm9pZCBkb25lX2woU291bmRDaGFubmVsKiBjaGFubmVsKTsKLQotICAgIC8vIGNhbGxiYWNrIGZ1bmN0aW9uCi0gICAgdm9pZCBzZXRDYWxsYmFjayhTb3VuZFBvb2xDYWxsYmFjayogY2FsbGJhY2ssIHZvaWQqIHVzZXIpOwotICAgIHZvaWQqIGdldFVzZXJEYXRhKCkgeyByZXR1cm4gbVVzZXJEYXRhOyB9Ci0KLXByaXZhdGU6Ci0gICAgU291bmRQb29sKCkge30gLy8gbm8gZGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgIGJvb2wgc3RhcnRUaHJlYWRzKCk7Ci0gICAgdm9pZCBkb0xvYWQoc3A8U2FtcGxlPiYgc2FtcGxlKTsKLSAgICBzcDxTYW1wbGU+IGZpbmRTYW1wbGUoaW50IHNhbXBsZUlEKSB7IHJldHVybiBtU2FtcGxlcy52YWx1ZUZvcihzYW1wbGVJRCk7IH0KLSAgICBTb3VuZENoYW5uZWwqIGZpbmRDaGFubmVsIChpbnQgY2hhbm5lbElEKTsKLSAgICBTb3VuZENoYW5uZWwqIGZpbmROZXh0Q2hhbm5lbCAoaW50IGNoYW5uZWxJRCk7Ci0gICAgU291bmRDaGFubmVsKiBhbGxvY2F0ZUNoYW5uZWxfbChpbnQgcHJpb3JpdHkpOwotICAgIHZvaWQgbW92ZVRvRnJvbnRfbChTb3VuZENoYW5uZWwqIGNoYW5uZWwpOwotICAgIHZvaWQgbm90aWZ5KFNvdW5kUG9vbEV2ZW50IGV2ZW50KTsKLSAgICB2b2lkIGR1bXAoKTsKLQotICAgIC8vIHJlc3RhcnQgdGhyZWFkCi0gICAgdm9pZCBhZGRUb1Jlc3RhcnRMaXN0KFNvdW5kQ2hhbm5lbCogY2hhbm5lbCk7Ci0gICAgdm9pZCBhZGRUb1N0b3BMaXN0KFNvdW5kQ2hhbm5lbCogY2hhbm5lbCk7Ci0gICAgc3RhdGljIGludCBiZWdpblRocmVhZCh2b2lkKiBhcmcpOwotICAgIGludCBydW4oKTsKLSAgICB2b2lkIHF1aXQoKTsKLQotICAgIE11dGV4ICAgICAgICAgICAgICAgICAgIG1Mb2NrOwotICAgIE11dGV4ICAgICAgICAgICAgICAgICAgIG1SZXN0YXJ0TG9jazsKLSAgICBDb25kaXRpb24gICAgICAgICAgICAgICBtQ29uZGl0aW9uOwotICAgIFNvdW5kUG9vbFRocmVhZCogICAgICAgIG1EZWNvZGVUaHJlYWQ7Ci0gICAgU291bmRDaGFubmVsKiAgICAgICAgICAgbUNoYW5uZWxQb29sOwotICAgIExpc3Q8U291bmRDaGFubmVsKj4gICAgIG1DaGFubmVsczsKLSAgICBMaXN0PFNvdW5kQ2hhbm5lbCo+ICAgICBtUmVzdGFydDsKLSAgICBMaXN0PFNvdW5kQ2hhbm5lbCo+ICAgICBtU3RvcDsKLSAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IGludCwgc3A8U2FtcGxlPiA+ICAgbVNhbXBsZXM7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgbU1heENoYW5uZWxzOwotICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAgICAgIG1BdHRyaWJ1dGVzOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1BbGxvY2F0ZWQ7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgbU5leHRTYW1wbGVJRDsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtTmV4dENoYW5uZWxJRDsKLSAgICBib29sICAgICAgICAgICAgICAgICAgICBtUXVpdDsKLQotICAgIC8vIGNhbGxiYWNrCi0gICAgTXV0ZXggICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrTG9jazsKLSAgICBTb3VuZFBvb2xDYWxsYmFjayogICAgICBtQ2FsbGJhY2s7Ci0gICAgdm9pZCogICAgICAgICAgICAgICAgICAgbVVzZXJEYXRhOwotfTsKLQotfSAvLyBlbmQgbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8qU09VTkRQT09MX0hfKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvVG9uZUdlbmVyYXRvci5oIGIvaW5jbHVkZS9tZWRpYS9Ub25lR2VuZXJhdG9yLmgKaW5kZXggOThjNDMzMi4uODQwNmVkNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9Ub25lR2VuZXJhdG9yLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9Ub25lR2VuZXJhdG9yLmgKQEAgLTE3LDExICsxNywxMiBAQAogI2lmbmRlZiBBTkRST0lEX1RPTkVHRU5FUkFUT1JfSF8KICNkZWZpbmUgQU5EUk9JRF9UT05FR0VORVJBVE9SX0hfCiAKLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+CisjaW5jbHVkZSA8dXRpbHMvQ29tcGF0Lmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTIwNyw3ICsyMDgsNyBAQAogICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgVE9ORUdFTl9NQVhfV0FWRVMgPSAzOyAgICAgLy8gTWF4aW11biBudW1iZXIgb2Ygc2luZSB3YXZlcyBpbiBhIHRvbmUgc2VnbWVudAogICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgVE9ORUdFTl9NQVhfU0VHTUVOVFMgPSAxMjsgIC8vIE1heGltdW4gbnVtYmVyIG9mIHNlZ21lbnRzIGluIGEgdG9uZSBkZXNjcmlwdG9yCiAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBUT05FR0VOX0lORiA9IDB4RkZGRkZGRkY7ICAvLyBSZXByZXNlbnRzIGluZmluaXRlIHRpbWUgZHVyYXRpb24KLSAgICBzdGF0aWMgY29uc3QgZmxvYXQgVE9ORUdFTl9HQUlOID0gMC45OyAgLy8gRGVmYXVsdCBnYWluIHBhc3NlZCB0byAgV2F2ZUdlbmVyYXRvcigpLgorICAgIHN0YXRpYyBjb25zdCBDT05TVEVYUFIgZmxvYXQgVE9ORUdFTl9HQUlOID0gMC45OyAgLy8gRGVmYXVsdCBnYWluIHBhc3NlZCB0byAgV2F2ZUdlbmVyYXRvcigpLgogCiAgICAgLy8gVG9uZURlc2NyaXB0b3IgY2xhc3MgY29udGFpbnMgYWxsIHBhcmFtZXRlcnMgbmVlZGVkIHRvIGdlbmVyYXRlIGEgdG9uZToKICAgICAvLyAgICAtIFRoZSBhcnJheSB3YXZlRnJlcVtdOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oIGIvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oCmluZGV4IDljYzIwOGUuLjU4MzA5MzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyLmgKQEAgLTIzMiwxNyArMjMyLDYgQEAKICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICBpc0xvb3BpbmcoKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRWb2x1bWUoZmxvYXQgbGVmdFZvbHVtZSwgZmxvYXQgcmlnaHRWb2x1bWUpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIG5vdGlmeShpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqb2JqID0gTlVMTCk7Ci0gICAgc3RhdGljICBzdGF0dXNfdCAgICAgICAgZGVjb2RlKAotICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybCwKLSAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgIGludCogcE51bUNoYW5uZWxzLAotICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCi0gICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsCi0gICAgICAgICAgICBzaXplX3QgKnBTaXplKTsKLSAgICBzdGF0aWMgIHN0YXR1c190ICAgICAgICBkZWNvZGUoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgsIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBwTnVtQ2hhbm5lbHMsIGF1ZGlvX2Zvcm1hdF90KiBwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsIHNpemVfdCAqcFNpemUpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGludm9rZShjb25zdCBQYXJjZWwmIHJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldE1ldGFkYXRhRmlsdGVyKGNvbnN0IFBhcmNlbCYgZmlsdGVyKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXRNZXRhZGF0YShib29sIHVwZGF0ZV9vbmx5LCBib29sIGFwcGx5X2ZpbHRlciwgUGFyY2VsICptZXRhZGF0YSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FBQ1dyaXRlci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQUNXcml0ZXIuaAppbmRleCBkZjFiMDUzLi5kMjI3MDdhIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FBQ1dyaXRlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmgKQEAgLTE3LDYgKzE3LDcgQEAKICNpZm5kZWYgQUFDX1dSSVRFUl9IXwogI2RlZmluZSBBQUNfV1JJVEVSX0hfCiAKKyNpbmNsdWRlICJmb3VuZGF0aW9uL0FCYXNlLmgiCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFXcml0ZXIuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oCmluZGV4IDI5YzkwMDIuLjc4MjU1MDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaApAQCAtMjkxLDcgKzI5MSw3IEBACiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0FVRElPX0NPRElOR1RZUEUgZGVzaXJlZEZvcm1hdCk7CiAKICAgICBzdGF0dXNfdCBzZXR1cEFNUkNvZGVjKGJvb2wgZW5jb2RlciwgYm9vbCBpc1dBTVIsIGludDMyX3QgYml0UmF0ZSk7Ci0gICAgc3RhdHVzX3Qgc2V0dXBHNzExQ29kZWMoYm9vbCBlbmNvZGVyLCBpbnQzMl90IG51bUNoYW5uZWxzKTsKKyAgICBzdGF0dXNfdCBzZXR1cEc3MTFDb2RlYyhib29sIGVuY29kZXIsIGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBudW1DaGFubmVscyk7CiAKICAgICBzdGF0dXNfdCBzZXR1cEZsYWNDb2RlYygKICAgICAgICAgICAgIGJvb2wgZW5jb2RlciwgaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IGNvbXByZXNzaW9uTGV2ZWwpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DbG9ja0VzdGltYXRvci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DbG9ja0VzdGltYXRvci5oCmluZGV4IDJmZDZlNzUuLjE0NTViN2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2xvY2tFc3RpbWF0b3IuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0Nsb2NrRXN0aW1hdG9yLmgKQEAgLTE5LDcgKzE5LDcgQEAKIAogI2RlZmluZSBDTE9DS19FU1RJTUFUT1JfSF8KIAotCisjaW5jbHVkZSAiZm91bmRhdGlvbi9BQmFzZS5oIgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmgKaW5kZXggMTM2OTVkNS4uYTAwMzZlMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oCkBAIC0zNiw2ICszNiw3IEBACiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRzsgICAgICAgICAgIC8vIGxheWVyIElJSQogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01QRUdfTEFZRVJfSTsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0lJOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01JREk7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1FDRUxQOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmgKaW5kZXggYmJlNDMwMy4uOWRhOThkOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmgKQEAgLTIyLDYgKzIyLDggQEAKICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKKyNpbmNsdWRlICJmb3VuZGF0aW9uL0FCYXNlLmgiCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFCdWZmZXI7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmgKaW5kZXggZTM0MTE2MC4uODRiMWIxYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaApAQCAtMjUwLDcgKzI1MCw3IEBACiAKICAgICBzdGF0dXNfdCBzZXRBQzNGb3JtYXQoaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlKTsKIAotICAgIHZvaWQgc2V0RzcxMUZvcm1hdChpbnQzMl90IG51bUNoYW5uZWxzKTsKKyAgICB2b2lkIHNldEc3MTFGb3JtYXQoaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IG51bUNoYW5uZWxzKTsKIAogICAgIHN0YXR1c190IHNldFZpZGVvUG9ydEZvcm1hdFR5cGUoCiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5oCmluZGV4IGQxNWEyMjYuLjIxNzdjMDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuaApAQCAtMjUsNiArMjUsOCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KIAorI2luY2x1ZGUgImZvdW5kYXRpb24vQUJhc2UuaCIKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0yMzMsNyArMjM1LDcgQEAKICAgICBDb25kaXRpb24gbU1lZGlhQnVmZmVyc0F2YWlsYWJsZUNvbmRpdGlvbjsKIAogICAgIC8vIEF2b2lkIGNvcHlpbmcgYW5kIGVxdWF0aW5nIGFuZCBkZWZhdWx0IGNvbnN0cnVjdG9yCi0gICAgRElTQUxMT1dfSU1QTElDSVRfQ09OU1RSVUNUT1JTKFN1cmZhY2VNZWRpYVNvdXJjZSk7CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU3VyZmFjZU1lZGlhU291cmNlKTsKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmgKaW5kZXggYjAwOGI1NC4uNDFhZGU3NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmgKQEAgLTE5LDYgKzE5LDcgQEAKICNkZWZpbmUgQV9IQU5ETEVSX0hfCiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMjcsNyArMjgsOCBAQAogCiBzdHJ1Y3QgQUhhbmRsZXIgOiBwdWJsaWMgUmVmQmFzZSB7CiAgICAgQUhhbmRsZXIoKQotICAgICAgICA6IG1JRCgwKSB7CisgICAgICAgIDogbUlEKDApLAorICAgICAgICAgIG1NZXNzYWdlQ291bnRlcigwKSB7CiAgICAgfQogCiAgICAgQUxvb3Blcjo6aGFuZGxlcl9pZCBpZCgpIGNvbnN0IHsKQEAgLTQ4LDYgKzUwLDkgQEAKICAgICAgICAgbUlEID0gaWQ7CiAgICAgfQogCisgICAgdWludDMyX3QgbU1lc3NhZ2VDb3VudGVyOworICAgIEtleWVkVmVjdG9yPHVpbnQzMl90LCB1aW50MzJfdD4gbU1lc3NhZ2VzOworCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQUhhbmRsZXIpOwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmgKaW5kZXggNGQ3NmI2NC4uYTBiZThlYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5oCkBAIC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDIsNiArNDMsOCBAQAogCiAgICAgc3A8QUxvb3Blcj4gZmluZExvb3BlcihBTG9vcGVyOjpoYW5kbGVyX2lkIGhhbmRsZXJJRCk7CiAKKyAgICB2b2lkIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKwogcHJpdmF0ZToKICAgICBzdHJ1Y3QgSGFuZGxlckluZm8gewogICAgICAgICB3cDxBTG9vcGVyPiBtTG9vcGVyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmgKaW5kZXggN2M5ODY5OS4uODIyZGJiMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oCkBAIC0yMyw3ICsyMyw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IFN0cmluZzg7CitjbGFzcyBTdHJpbmc4Owogc3RydWN0IFBhcmNlbDsKIAogc3RydWN0IEFTdHJpbmcgewpAQCAtMTAyLDcgKzEwMiw3IEBACiAgICAgdm9pZCBtYWtlTXV0YWJsZSgpOwogfTsKIAotQVN0cmluZyBTdHJpbmdQcmludGYoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworQVN0cmluZyBBU3RyaW5nUHJpbnRmKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZGsvTmRrTWVkaWFEcm0uaCBiL2luY2x1ZGUvbmRrL05ka01lZGlhRHJtLmgKaW5kZXggMTBhZmRkOS4uM2MzMTJhOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZGsvTmRrTWVkaWFEcm0uaAorKysgYi9pbmNsdWRlL25kay9OZGtNZWRpYURybS5oCkBAIC0zMjcsMjQgKzMyNywyNCBAQAogLyoqCiAgKiBTdHJpbmcgcHJvcGVydHkgbmFtZTogaWRlbnRpZmllcyB0aGUgbWFrZXIgb2YgdGhlIERSTSBlbmdpbmUgcGx1Z2luCiAgKi8KLWNvbnN0IGNoYXIgKlBST1BFUlRZX1ZFTkRPUiA9ICJ2ZW5kb3IiOworI2RlZmluZSBQUk9QRVJUWV9WRU5ET1IgInZlbmRvciIKIAogLyoqCiAgKiBTdHJpbmcgcHJvcGVydHkgbmFtZTogaWRlbnRpZmllcyB0aGUgdmVyc2lvbiBvZiB0aGUgRFJNIGVuZ2luZSBwbHVnaW4KICAqLwotY29uc3QgY2hhciAqUFJPUEVSVFlfVkVSU0lPTiA9ICJ2ZXJzaW9uIjsKKyNkZWZpbmUgUFJPUEVSVFlfVkVSU0lPTiAidmVyc2lvbiIKIAogLyoqCiAgKiBTdHJpbmcgcHJvcGVydHkgbmFtZTogZGVzY3JpYmVzIHRoZSBEUk0gZW5naW5lIHBsdWdpbgogICovCi1jb25zdCBjaGFyICpQUk9QRVJUWV9ERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7CisjZGVmaW5lIFBST1BFUlRZX0RFU0NSSVBUSU9OICJkZXNjcmlwdGlvbiIKIAogLyoqCiAgKiBTdHJpbmcgcHJvcGVydHkgbmFtZTogYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBjaXBoZXIgYW5kIG1hYyBhbGdvcml0aG1zCiAgKiBzdXBwb3J0ZWQgYnkgQ3J5cHRvU2Vzc2lvbi4gIFRoZSBsaXN0IG1heSBiZSBlbXB0eSBpZiB0aGUgRFJNIGVuZ2luZQogICogcGx1Z2luIGRvZXMgbm90IHN1cHBvcnQgQ3J5cHRvU2Vzc2lvbiBvcGVyYXRpb25zLgogICovCi1jb25zdCBjaGFyICpQUk9QRVJUWV9BTEdPUklUSE1TID0gImFsZ29yaXRobXMiOworI2RlZmluZSBQUk9QRVJUWV9BTEdPUklUSE1TICJhbGdvcml0aG1zIgogCiAvKioKICAqIFJlYWQgYSBEUk0gZW5naW5lIHBsdWdpbiBTdHJpbmcgcHJvcGVydHkgdmFsdWUsIGdpdmVuIHRoZSBwcm9wZXJ0eSBuYW1lIHN0cmluZy4KQEAgLTM2MSw3ICszNjEsNyBAQAogICogQnl0ZSBhcnJheSBwcm9wZXJ0eSBuYW1lOiB0aGUgZGV2aWNlIHVuaXF1ZSBpZGVudGlmaWVyIGlzIGVzdGFibGlzaGVkIGR1cmluZwogICogZGV2aWNlIHByb3Zpc2lvbmluZyBhbmQgcHJvdmlkZXMgYSBtZWFucyBvZiB1bmlxdWVseSBpZGVudGlmeWluZyBlYWNoIGRldmljZS4KICAqLwotY29uc3QgY2hhciAqUFJPUEVSVFlfREVWSUNFX1VOSVFVRV9JRCA9ICJkZXZpY2VVbmlxdWVJZCI7CisjZGVmaW5lIFBST1BFUlRZX0RFVklDRV9VTklRVUVfSUQgImRldmljZVVuaXF1ZUlkIgogCiAvKioKICAqIFJlYWQgYSBEUk0gZW5naW5lIHBsdWdpbiBieXRlIGFycmF5IHByb3BlcnR5IHZhbHVlLCBnaXZlbiB0aGUgcHJvcGVydHkgbmFtZSBzdHJpbmcuCmRpZmYgLS1naXQgYS9tZWRpYS9jb21tb25fdGltZS9JQ29tbW9uQ2xvY2suY3BwIGIvbWVkaWEvY29tbW9uX3RpbWUvSUNvbW1vbkNsb2NrLmNwcAppbmRleCAyNWFlNjllLi4xOWI3ZDZlIDEwMDY0NAotLS0gYS9tZWRpYS9jb21tb25fdGltZS9JQ29tbW9uQ2xvY2suY3BwCisrKyBiL21lZGlhL2NvbW1vbl90aW1lL0lDb21tb25DbG9jay5jcHAKQEAgLTIwNiw3ICsyMDYsNyBAQAogICAgICAgICAgICAgY29uc3Qgc3A8SUNvbW1vbkNsb2NrTGlzdGVuZXI+JiBsaXN0ZW5lcikgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ29tbW9uQ2xvY2s6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIobGlzdGVuZXItPmFzQmluZGVyKCkpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGxpc3RlbmVyKSk7CiAKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFJFR0lTVEVSX0xJU1RFTkVSLCBkYXRhLCAmcmVwbHkpOwogCkBAIC0yMjEsNyArMjIxLDcgQEAKICAgICAgICAgICAgIGNvbnN0IHNwPElDb21tb25DbG9ja0xpc3RlbmVyPiYgbGlzdGVuZXIpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNvbW1vbkNsb2NrOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGxpc3RlbmVyLT5hc0JpbmRlcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihsaXN0ZW5lcikpOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoVU5SRUdJU1RFUl9MSVNURU5FUiwgZGF0YSwgJnJlcGx5KTsKIAogICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvVGlmZkVudHJ5SW1wbC5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RpZmZFbnRyeUltcGwuaAppbmRleCBmNWNjYjVlLi5jNzNlMjMxIDEwMDY0NAotLS0gYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvVGlmZkVudHJ5SW1wbC5oCisrKyBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9UaWZmRW50cnlJbXBsLmgKQEAgLTE0Nyw3ICsxNDcsNyBAQAogfQogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotc3RhdHVzX3QgVGlmZkVudHJ5SW1wbDxUPjo6d3JpdGVEYXRhKHVpbnQzMl90IG9mZnNldCwgRW5kaWFuT3V0cHV0KiBvdXQpIGNvbnN0IHsKK3N0YXR1c190IFRpZmZFbnRyeUltcGw8VD46OndyaXRlRGF0YSh1aW50MzJfdCAvKm9mZnNldCovLCBFbmRpYW5PdXRwdXQqIG91dCkgY29uc3QgewogICAgIHN0YXR1c190IHJldCA9IE9LOwogCiAgICAgLy8gU29tZSB0YWdzIGhhdmUgZml4ZWQtZW5kaWFuIHZhbHVlIG91dHB1dApkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL3NyYy9GaWxlSW5wdXQuY3BwIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9GaWxlSW5wdXQuY3BwCmluZGV4IDQ5OGU3MTUuLjRjODVhNTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2ltZ191dGlscy9zcmMvRmlsZUlucHV0LmNwcAorKysgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL0ZpbGVJbnB1dC5jcHAKQEAgLTc4LDcgKzc4LDcgQEAKICAgICAgICAgcmV0ID0gQkFEX1ZBTFVFOwogICAgIH0KICAgICBtT3BlbiA9IGZhbHNlOwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gcmV0OwogfQogCiB9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvc3JjL0ZpbGVPdXRwdXQuY3BwIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9GaWxlT3V0cHV0LmNwcAppbmRleCBjZTc2M2ZmLi4wMzQ2NzYyIDEwMDY0NAotLS0gYS9tZWRpYS9pbWdfdXRpbHMvc3JjL0ZpbGVPdXRwdXQuY3BwCisrKyBiL21lZGlhL2ltZ191dGlscy9zcmMvRmlsZU91dHB1dC5jcHAKQEAgLTcyLDcgKzcyLDcgQEAKICAgICAgICAgcmV0ID0gQkFEX1ZBTFVFOwogICAgIH0KICAgICBtT3BlbiA9IGZhbHNlOwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gcmV0OwogfQogCiB9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvc3JjL1RpZmZXcml0ZXIuY3BwIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9UaWZmV3JpdGVyLmNwcAppbmRleCBhYzQxNzM0Li5hNmY5MjE4IDEwMDY0NAotLS0gYS9tZWRpYS9pbWdfdXRpbHMvc3JjL1RpZmZXcml0ZXIuY3BwCisrKyBiL21lZGlhL2ltZ191dGlscy9zcmMvVGlmZldyaXRlci5jcHAKQEAgLTEwNiw3ICsxMDYsNiBAQAogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvZmZWZWNTaXplOyArK2kpIHsKICAgICAgICAgdWludDMyX3QgaWZkS2V5ID0gb2Zmc2V0VmVjdG9yLmtleUF0KGkpOwotICAgICAgICB1aW50MzJfdCBuZXh0T2Zmc2V0ID0gb2Zmc2V0VmVjdG9yW2ldOwogICAgICAgICB1aW50MzJfdCBzaXplVG9Xcml0ZSA9IG1OYW1lZElmZHNbaWZkS2V5XS0+Z2V0U3RyaXBTaXplKCk7CiAgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzb3VyY2VzQ291bnQ7ICsraikgewpAQCAtMTI0LDcgKzEyMyw3IEBACiAgICAgICAgICAgICBBTE9HRSgiJXM6IE5vIHN0cmVhbSBmb3IgYnl0ZSBzdHJpcHMgZm9yIElGRCAldSIsIF9fRlVOQ1RJT05fXywgaWZkS2V5KTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KLSAgICAgICAgYXNzZXJ0KG5leHRPZmZzZXQgPT0gZW5kT3V0LmdldEN1cnJlbnRPZmZzZXQoKSk7CisgICAgICAgIGFzc2VydChvZmZzZXRWZWN0b3JbaV0gPT0gZW5kT3V0LmdldEN1cnJlbnRPZmZzZXQoKSk7CiAgICAgfQogCiAgICAgcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmNwcCBiL21lZGlhL2xpYmNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmNwcAppbmRleCBjZmRjYjUxLi5iNDNiMzZjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJjcHVzdGF0cy9UaHJlYWRDcHVVc2FnZS5jcHAKKysrIGIvbWVkaWEvbGliY3B1c3RhdHMvVGhyZWFkQ3B1VXNhZ2UuY3BwCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHRpbWUuaD4KIAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgpAQCAtNzQsNyArNzUsNiBAQAogCiBib29sIFRocmVhZENwdVVzYWdlOjpzYW1wbGVBbmRFbmFibGUoZG91YmxlJiBucykKIHsKLSAgICBib29sIHJldDsKICAgICBib29sIHdhc0V2ZXJFbmFibGVkID0gbVdhc0V2ZXJFbmFibGVkOwogICAgIGlmIChlbmFibGUoKSkgewogICAgICAgICAvLyBhbHJlYWR5IGVuYWJsZWQsIHNvIGFkZCBhIG5ldyBzYW1wbGUgcmVsYXRpdmUgdG8gcHJldmlvdXMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbG91ZG5lc3MvQW5kcm9pZC5tayBiL21lZGlhL2xpYmVmZmVjdHMvbG91ZG5lc3MvQW5kcm9pZC5tawppbmRleCBlZGY5NjRlLi41NWQwNjExIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2xvdWRuZXNzL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sb3VkbmVzcy9BbmRyb2lkLm1rCkBAIC0xMiwxNiArMTIsMTEgQEAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogCWxpYmN1dGlscyBcCiAJbGlibG9nIFwKLQlsaWJzdGxwb3J0CiAKIExPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IHNvdW5kZngKIExPQ0FMX01PRFVMRTo9IGxpYmxkbmhuY3IKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpIFwKLQliaW9uaWMgXAotCWJpb25pYy9saWJzdGRjKysvaW5jbHVkZSBcCi0JZXh0ZXJuYWwvc3RscG9ydC9zdGxwb3J0Ci0KIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9wcm94eS9BbmRyb2lkLm1rIGIvbWVkaWEvbGliZWZmZWN0cy9wcm94eS9BbmRyb2lkLm1rCmluZGV4IGI0Mzg3OTYuLjJiYTQ1MmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvcHJveHkvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJlZmZlY3RzL3Byb3h5L0FuZHJvaWQubWsKQEAgLTI4LDcgKzI4LDYgQEAKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAgICAgICAgIHN5c3RlbS9tZWRpYS9hdWRpb19lZmZlY3RzL2luY2x1ZGUgXAotICAgICAgICBiaW9uaWMvbGliYy9pbmNsdWRlIFwKICAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BbmRyb2lkLm1rXyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQW5kcm9pZC5ta18KaW5kZXggNjcyZWJiYS4uMTRjMzczZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BbmRyb2lkLm1rXworKysgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0FuZHJvaWQubWtfCkBAIC0zLDI0ICszLDE4IEBACiAjIFRlc3QgUmV2ZXJiIGxpYnJhcnkKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCi1MT0NBTF9TUkNfRklMRVM6PSBcCitMT0NBTF9TUkNfRklMRVMgOj0gXAogCUVmZmVjdFJldmVyYi5jLmFybSBcCiAJRWZmZWN0c01hdGguYy5hcm0KLUxPQ0FMX0NGTEFHUys9IC1PMgorCitMT0NBTF9DRkxBR1MgOj0gLU8yCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYmN1dGlscworCWxpYmN1dGlscyBcCisJbGliZGwKIAogTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gc291bmRmeAotTE9DQUxfTU9EVUxFOj0gbGlicmV2ZXJidGVzdAotCi1pZmVxICgkKFRBUkdFVF9PUyktJChUQVJHRVRfU0lNVUxBVE9SKSxsaW51eC10cnVlKQotTE9DQUxfTERMSUJTICs9IC1sZGwKLWVuZGlmCi0KLWlmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmRsCi1lbmRpZgorTE9DQUxfTU9EVUxFIDo9IGxpYnJldmVyYnRlc3QKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpIFwKQEAgLTMzLDcgKzI3LDcgQEAKICMgVGVzdCBFcXVhbGl6ZXIgbGlicmFyeQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKLUxPQ0FMX1NSQ19GSUxFUzo9IFwKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCiAJRWZmZWN0c01hdGguYy5hcm0gXAogCUVmZmVjdEVxdWFsaXplci5jcHAgXAogCUF1ZGlvQmlxdWFkRmlsdGVyLmNwcC5hcm0gXApAQCAtNDIsMjEgKzM2LDE0IEBACiAJQXVkaW9TaGVsdmluZ0ZpbHRlci5jcHAuYXJtIFwKIAlBdWRpb0VxdWFsaXplci5jcHAuYXJtCiAKLUxPQ0FMX0NGTEFHUys9IC1PMgorTE9DQUxfQ0ZMQUdTIDo9IC1PMgogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJjdXRpbHMKKwlsaWJjdXRpbHMgXAorCWxpYmRsCiAKIExPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IHNvdW5kZngKLUxPQ0FMX01PRFVMRTo9IGxpYmVxdWFsaXplcnRlc3QKLQotaWZlcSAoJChUQVJHRVRfT1MpLSQoVEFSR0VUX1NJTVVMQVRPUiksbGludXgtdHJ1ZSkKLUxPQ0FMX0xETElCUyArPSAtbGRsCi1lbmRpZgotCi1pZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkbAotZW5kaWYKK0xPQ0FMX01PRFVMRSA6PSBsaWJlcXVhbGl6ZXJ0ZXN0CiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBncmFwaGljcyBjb3JlY2cpIFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQubWsgYi9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLm1rCmluZGV4IGEyZTA5MDkuLjZjNTg1ZmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5tawpAQCAtNDIsNiArNDIsNyBAQAogICAgIG1lZGlhcmVjb3JkZXIuY3BwIFwKICAgICBJTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHAgXAogICAgIG1lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuY3BwIFwKKyAgICBNaWRpSW9XcmFwcGVyLmNwcCBcCiAgICAgVG9uZUdlbmVyYXRvci5jcHAgXAogICAgIEpldFBsYXllci5jcHAgXAogICAgIElPTVguY3BwIFwKQEAgLTU3LDggKzU4LDYgQEAKICAgICBBdWRpb0VmZmVjdC5jcHAgXAogICAgIFZpc3VhbGl6ZXIuY3BwIFwKICAgICBNZW1vcnlMZWFrVHJhY2tVdGlsLmNwcCBcCi0gICAgU291bmRQb29sLmNwcCBcCi0gICAgU291bmRQb29sVGhyZWFkLmNwcCBcCiAgICAgU3RyaW5nQXJyYXkuY3BwIFwKICAgICBBdWRpb1BvbGljeS5jcHAKIApAQCAtNzUsMTIgKzc0LDEyIEBACiAKIExPQ0FMX01PRFVMRTo9IGxpYm1lZGlhCiAKK0xPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9ICQoTE9DQUxfUEFUSCkvQW5kcm9pZC5taworCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9pbmNsdWRlL21lZGlhLyBcCiAgICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAotICAgICQoVE9QKS9leHRlcm5hbC9pY3UvaWN1NGMvc291cmNlL2NvbW1vbiBcCi0gICAgJChUT1ApL2V4dGVybmFsL2ljdS9pY3U0Yy9zb3VyY2UvaTE4biBcCiAgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpIFwKICAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpCiAKQEAgLTg4LDggKzg3LDYgQEAKIAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKLSMgZm9yIDxjdXRpbHMvYXRvbWljLWlubGluZS5oPgotTE9DQUxfQ0ZMQUdTICs9IC1EQU5EUk9JRF9TTVA9JChpZiAkKGZpbmRzdHJpbmcgdHJ1ZSwkKFRBUkdFVF9DUFVfU01QKSksMSwwKQogTE9DQUxfU1JDX0ZJTEVTICs9IFNpbmdsZVN0YXRlUXVldWUuY3BwCiBMT0NBTF9DRkxBR1MgKz0gLURTSU5HTEVfU1RBVEVfUVVFVUVfSU5TVEFOVElBVElPTlM9JyJTaW5nbGVTdGF0ZVF1ZXVlSW5zdGFudGlhdGlvbnMuY3BwIicKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQXVkaW9FZmZlY3QuY3BwIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9FZmZlY3QuY3BwCmluZGV4IDBkNWQ3ZTQuLmFmMTAzYzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvRWZmZWN0LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9BdWRpb0VmZmVjdC5jcHAKQEAgLTE1MCw3ICsxNTAsNyBAQAogICAgIGludCBidWZPZmZzZXQgPSAoKHNpemVvZihlZmZlY3RfcGFyYW1fY2Jsa190KSAtIDEpIC8gc2l6ZW9mKGludCkgKyAxKSAqIHNpemVvZihpbnQpOwogICAgIG1DYmxrLT5idWZmZXIgPSAodWludDhfdCAqKW1DYmxrICsgYnVmT2Zmc2V0OwogCi0gICAgaUVmZmVjdC0+YXNCaW5kZXIoKS0+bGlua1RvRGVhdGgobUlFZmZlY3RDbGllbnQpOworICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKGlFZmZlY3QpLT5saW5rVG9EZWF0aChtSUVmZmVjdENsaWVudCk7CiAgICAgbUNsaWVudFBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKICAgICBBTE9HVigic2V0KCkgJXAgT0sgZWZmZWN0OiAlcyBpZDogJWQgc3RhdHVzICVkIGVuYWJsZWQgJWQgcGlkICVkIiwgdGhpcywgbURlc2NyaXB0b3IubmFtZSwgbUlkLAogICAgICAgICAgICAgbVN0YXR1cywgbUVuYWJsZWQsIG1DbGllbnRQaWQpOwpAQCAtMTczLDcgKzE3Myw3IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKG1JRWZmZWN0ICE9IE5VTEwpIHsKICAgICAgICAgICAgIG1JRWZmZWN0LT5kaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICBtSUVmZmVjdC0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aChtSUVmZmVjdENsaWVudCk7CisgICAgICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtSUVmZmVjdCktPnVubGlua1RvRGVhdGgobUlFZmZlY3RDbGllbnQpOwogICAgICAgICB9CiAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BdWRpb1JlY29yZC5jcHAgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1JlY29yZC5jcHAKaW5kZXggY2EzODMyZC4uMDdjYTE0ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQXVkaW9SZWNvcmQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvUmVjb3JkLmNwcApAQCAtMTA3LDcgKzEwNyw3IEBACiAgICAgICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQtPnJlcXVlc3RFeGl0QW5kV2FpdCgpOwogICAgICAgICAgICAgbUF1ZGlvUmVjb3JkVGhyZWFkLmNsZWFyKCk7CiAgICAgICAgIH0KLSAgICAgICAgbUF1ZGlvUmVjb3JkLT5hc0JpbmRlcigpLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCB0aGlzKTsKKyAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUF1ZGlvUmVjb3JkKS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgdGhpcyk7CiAgICAgICAgIG1BdWRpb1JlY29yZC5jbGVhcigpOwogICAgICAgICBtQ2Jsa01lbW9yeS5jbGVhcigpOwogICAgICAgICBtQnVmZmVyTWVtb3J5LmNsZWFyKCk7CkBAIC01MjUsNyArNTI1LDcgQEAKIAogICAgIC8vIGludmFyaWFudCB0aGF0IG1BdWRpb1JlY29yZCAhPSAwIGlzIHRydWUgb25seSBhZnRlciBzZXQoKSByZXR1cm5zIHN1Y2Nlc3NmdWxseQogICAgIGlmIChtQXVkaW9SZWNvcmQgIT0gMCkgewotICAgICAgICBtQXVkaW9SZWNvcmQtPmFzQmluZGVyKCktPnVubGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIHRoaXMpOworICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtQXVkaW9SZWNvcmQpLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCB0aGlzKTsKICAgICAgICAgbURlYXRoTm90aWZpZXIuY2xlYXIoKTsKICAgICB9CiAgICAgbUF1ZGlvUmVjb3JkID0gcmVjb3JkOwpAQCAtNTc1LDcgKzU3NSw3IEBACiAgICAgbVByb3h5LT5zZXRNaW5pbXVtKG1Ob3RpZmljYXRpb25GcmFtZXNBY3QpOwogCiAgICAgbURlYXRoTm90aWZpZXIgPSBuZXcgRGVhdGhOb3RpZmllcih0aGlzKTsKLSAgICBtQXVkaW9SZWNvcmQtPmFzQmluZGVyKCktPmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCB0aGlzKTsKKyAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtQXVkaW9SZWNvcmQpLT5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgdGhpcyk7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQXVkaW9UcmFjay5jcHAgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1RyYWNrLmNwcAppbmRleCAzODlhYWNjLi43MzVkYjVjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BdWRpb1RyYWNrLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1RyYWNrLmNwcApAQCAtMTk0LDcgKzE5NCw3IEBACiAgICAgICAgICAgICBtQXVkaW9UcmFja1RocmVhZC0+cmVxdWVzdEV4aXRBbmRXYWl0KCk7CiAgICAgICAgICAgICBtQXVkaW9UcmFja1RocmVhZC5jbGVhcigpOwogICAgICAgICB9Ci0gICAgICAgIG1BdWRpb1RyYWNrLT5hc0JpbmRlcigpLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCB0aGlzKTsKKyAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUF1ZGlvVHJhY2spLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCB0aGlzKTsKICAgICAgICAgbUF1ZGlvVHJhY2suY2xlYXIoKTsKICAgICAgICAgbUNibGtNZW1vcnkuY2xlYXIoKTsKICAgICAgICAgbVNoYXJlZEJ1ZmZlci5jbGVhcigpOwpAQCAtMTEzOCw3ICsxMTM4LDcgQEAKICAgICB9CiAgICAgLy8gaW52YXJpYW50IHRoYXQgbUF1ZGlvVHJhY2sgIT0gMCBpcyB0cnVlIG9ubHkgYWZ0ZXIgc2V0KCkgcmV0dXJucyBzdWNjZXNzZnVsbHkKICAgICBpZiAobUF1ZGlvVHJhY2sgIT0gMCkgewotICAgICAgICBtQXVkaW9UcmFjay0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgdGhpcyk7CisgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKG1BdWRpb1RyYWNrKS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgdGhpcyk7CiAgICAgICAgIG1EZWF0aE5vdGlmaWVyLmNsZWFyKCk7CiAgICAgfQogICAgIG1BdWRpb1RyYWNrID0gdHJhY2s7CkBAIC0xMjQ1LDcgKzEyNDUsNyBAQAogICAgIG1Qcm94eS0+c2V0TWluaW11bShtTm90aWZpY2F0aW9uRnJhbWVzQWN0KTsKIAogICAgIG1EZWF0aE5vdGlmaWVyID0gbmV3IERlYXRoTm90aWZpZXIodGhpcyk7Ci0gICAgbUF1ZGlvVHJhY2stPmFzQmluZGVyKCktPmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCB0aGlzKTsKKyAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtQXVkaW9UcmFjayktPmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCB0aGlzKTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9GbGluZ2VyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXIuY3BwCmluZGV4IGFjMmQxYzkuLmE5NGY5Y2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXIuY3BwCkBAIC0xMjEsNyArMTIxLDcgQEAKICAgICAgICAgLy8gaGF2ZVNoYXJlZEJ1ZmZlcgogICAgICAgICBpZiAoc2hhcmVkQnVmZmVyICE9IDApIHsKICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMih0cnVlKTsKLSAgICAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoc2hhcmVkQnVmZmVyLT5hc0JpbmRlcigpKTsKKyAgICAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoc2hhcmVkQnVmZmVyKSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoZmFsc2UpOwogICAgICAgICB9CkBAIC00MjEsNyArNDIxLDcgQEAKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoY2xpZW50LT5hc0JpbmRlcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihjbGllbnQpKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFJFR0lTVEVSX0NMSUVOVCwgZGF0YSwgJnJlcGx5KTsKICAgICB9CiAKQEAgLTcxOCw3ICs3MTgsNyBAQAogCiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlKHBEZXNjLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGNsaWVudC0+YXNCaW5kZXIoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoY2xpZW50KSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihwcmlvcml0eSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgb3V0cHV0KTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHNlc3Npb25JZCk7CkBAIC05NDEsNyArOTQxLDcgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGZsYWdzKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNlc3Npb25JZCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKHRyYWNrLT5hc0JpbmRlcigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcih0cmFjaykpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIE9QRU5fUkVDT1JEOiB7CkBAIC05NjgsOSArOTY4LDkgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNlc3Npb25JZCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQ2NChub3RpZmljYXRpb25GcmFtZXMpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihyZWNvcmQtPmFzQmluZGVyKCkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKGNibGstPmFzQmluZGVyKCkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKGJ1ZmZlcnMtPmFzQmluZGVyKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKHJlY29yZCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGNibGspKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihidWZmZXJzKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgU0FNUExFX1JBVEU6IHsKQEAgLTEyNjIsNyArMTI2Miw3IEBACiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaWQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZW5hYmxlZCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoZWZmZWN0LT5hc0JpbmRlcigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihlZmZlY3QpKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZSgmZGVzYywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKaW5kZXggNTZjOGYzZC4uMWI4Y2EyZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKQEAgLTYzMCw3ICs2MzAsNyBAQAogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihjbGllbnQtPmFzQmluZGVyKCkpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGNsaWVudCkpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVHSVNURVJfQ0xJRU5ULCBkYXRhLCAmcmVwbHkpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvVHJhY2suY3BwIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvVHJhY2suY3BwCmluZGV4IDI2NWJiMWIuLmRmMjA5ZmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb1RyYWNrLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JQXVkaW9UcmFjay5jcHAKQEAgLTEzNyw3ICsxMzcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHB0cykgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9UcmFjazo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihidWZmZXItPmFzQmluZGVyKCkpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGJ1ZmZlcikpOwogICAgICAgICBkYXRhLndyaXRlSW50NjQocHRzKTsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFFVRVVFX1RJTUVEX0JVRkZFUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsICZyZXBseSk7CkBAIC0yMDcsNyArMjA3LDcgQEAKICAgICBzd2l0Y2ggKGNvZGUpIHsKICAgICAgICAgY2FzZSBHRVRfQ0JMSzogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1RyYWNrLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoZ2V0Q2JsaygpLT5hc0JpbmRlcigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihnZXRDYmxrKCkpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTVEFSVDogewpAQCAtMjQxLDcgKzI0MSw3IEBACiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhbGxvY2F0ZVRpbWVkQnVmZmVyKGRhdGEucmVhZEludDY0KCksICZidWZmZXIpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoYnVmZmVyLT5hc0JpbmRlcigpKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoYnVmZmVyKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JRHJtLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lEcm0uY3BwCmluZGV4IDdlNzRkZTkuLmIwOGZhODIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lEcm0uY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lEcm0uY3BwCkBAIC00NTAsNyArNDUwLDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldExpc3RlbmVyKGNvbnN0IHNwPElEcm1DbGllbnQ+JiBsaXN0ZW5lcikgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGxpc3RlbmVyLT5hc0JpbmRlcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihsaXN0ZW5lcikpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0xJU1RFTkVSLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSUVmZmVjdC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JRWZmZWN0LmNwcAppbmRleCA4Y2QxNThkLi4yZjZhOTFlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JRWZmZWN0LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JRWZmZWN0LmNwcApAQCAtMjAzLDcgKzIwMyw3IEBACiAKICAgICAgICAgY2FzZSBHRVRfQ0JMSzogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElFZmZlY3QsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihnZXRDYmxrKCktPmFzQmluZGVyKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGdldENibGsoKSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JSERDUC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JSERDUC5jcHAKaW5kZXggOWQ5MzMyMC4uNzk5NDRlZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSUhEQ1AuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lIRENQLmNwcApAQCAtNjUsNyArNjUsNyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T2JzZXJ2ZXIoY29uc3Qgc3A8SUhEQ1BPYnNlcnZlcj4gJm9ic2VydmVyKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElIRENQOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKG9ic2VydmVyLT5hc0JpbmRlcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihvYnNlcnZlcikpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoSERDUF9TRVRfT0JTRVJWRVIsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFEZWF0aE5vdGlmaWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYURlYXRoTm90aWZpZXIuY3BwCmluZGV4IDEwYjQ5MzQuLjM4ZTljYTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYURlYXRoTm90aWZpZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYURlYXRoTm90aWZpZXIuY3BwCkBAIC0xMDQsNyArMTA0LDcgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2woc1NlcnZpY2VMb2NrKTsKICAgICBzT2JpdFJlY2lwaWVudHMuY2xlYXIoKTsKICAgICBpZiAoc01lZGlhUGxheWVyU2VydmljZSAhPSAwKSB7Ci0gICAgICAgIHNNZWRpYVBsYXllclNlcnZpY2UtPmFzQmluZGVyKCktPnVubGlua1RvRGVhdGgodGhpcyk7CisgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKHNNZWRpYVBsYXllclNlcnZpY2UpLT51bmxpbmtUb0RlYXRoKHRoaXMpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhTG9nU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFMb2dTZXJ2aWNlLmNwcAppbmRleCA4YTY2YzdjLi5hNGFmN2I3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFMb2dTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFMb2dTZXJ2aWNlLmNwcApAQCAtNDIsNyArNDIsNyBAQAogICAgIHZpcnR1YWwgdm9pZCAgICByZWdpc3RlcldyaXRlcihjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqbmFtZSkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFMb2dTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKHNoYXJlZC0+YXNCaW5kZXIoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoc2hhcmVkKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQ2NCgoaW50NjRfdCkgc2l6ZSk7CiAgICAgICAgIGRhdGEud3JpdGVDU3RyaW5nKG5hbWUpOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUkVHSVNURVJfV1JJVEVSLCBkYXRhLCAmcmVwbHkpOwpAQCAtNTIsNyArNTIsNyBAQAogICAgIHZpcnR1YWwgdm9pZCAgICB1bnJlZ2lzdGVyV3JpdGVyKGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWQpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhTG9nU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihzaGFyZWQtPmFzQmluZGVyKCkpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKHNoYXJlZCkpOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoVU5SRUdJU1RFUl9XUklURVIsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIC8vIEZJWE1FIGlnbm9yZXMgc3RhdHVzCiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuY3BwCmluZGV4IDM4ZjcxN2MuLmFhMjY2NWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHAKQEAgLTk1LDcgKzk1LDcgQEAKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYU1ldGFkYXRhUmV0cmlldmVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoaHR0cFNlcnZpY2UgIT0gTlVMTCk7CiAgICAgICAgIGlmIChodHRwU2VydmljZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGh0dHBTZXJ2aWNlLT5hc0JpbmRlcigpKTsKKyAgICAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoaHR0cFNlcnZpY2UpKTsKICAgICAgICAgfQogICAgICAgICBkYXRhLndyaXRlQ1N0cmluZyhzcmNVcmwpOwogCkBAIC0yNDYsNyArMjQ2LDcgQEAKICAgICAgICAgICAgIHNwPElNZW1vcnk+IGJpdG1hcCA9IGdldEZyYW1lQXRUaW1lKHRpbWVVcywgb3B0aW9uKTsKICAgICAgICAgICAgIGlmIChiaXRtYXAgIT0gMCkgeyAgLy8gRG9uJ3Qgc2VuZCBOVUxMIGFjcm9zcyB0aGUgYmluZGVyIGludGVyZmFjZQogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKE5PX0VSUk9SKTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoYml0bWFwLT5hc0JpbmRlcigpKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoYml0bWFwKSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKFVOS05PV05fRVJST1IpOwogICAgICAgICAgICAgfQpAQCAtMjYzLDcgKzI2Myw3IEBACiAgICAgICAgICAgICBzcDxJTWVtb3J5PiBhbGJ1bUFydCA9IGV4dHJhY3RBbGJ1bUFydCgpOwogICAgICAgICAgICAgaWYgKGFsYnVtQXJ0ICE9IDApIHsgIC8vIERvbid0IHNlbmQgTlVMTCBhY3Jvc3MgdGhlIGJpbmRlciBpbnRlcmZhY2UKICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihOT19FUlJPUik7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKGFsYnVtQXJ0LT5hc0JpbmRlcigpKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoYWxidW1BcnQpKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoVU5LTk9XTl9FUlJPUik7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcAppbmRleCBhMjlhN2RlLi5jMWI5MDI1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAKQEAgLTg1LDcgKzg1LDcgQEAKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGh0dHBTZXJ2aWNlICE9IE5VTEwpOwogICAgICAgICBpZiAoaHR0cFNlcnZpY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihodHRwU2VydmljZS0+YXNCaW5kZXIoKSk7CisgICAgICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGh0dHBTZXJ2aWNlKSk7CiAgICAgICAgIH0KICAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcodXJsKTsKICAgICAgICAgaWYgKGhlYWRlcnMgPT0gTlVMTCkgewpAQCAtMTE1LDcgKzExNSw3IEBACiAgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxJU3RyZWFtU291cmNlPiAmc291cmNlKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihzb3VyY2UtPmFzQmluZGVyKCkpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKHNvdXJjZSkpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0RBVEFfU09VUkNFX1NUUkVBTSwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KQEAgLTEyNSw3ICsxMjUsNyBAQAogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBzcDxJQmluZGVyPiBiKGJ1ZmZlclByb2R1Y2VyLT5hc0JpbmRlcigpKTsKKyAgICAgICAgc3A8SUJpbmRlcj4gYihJSW50ZXJmYWNlOjphc0JpbmRlcihidWZmZXJQcm9kdWNlcikpOwogICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGIpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1ZJREVPX1NVUkZBQ0VURVhUVVJFLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CkBAIC0zMjMsNyArMzIzLDcgQEAKICAgICBzdGF0dXNfdCBzZXROZXh0UGxheWVyKGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIHBsYXllcikgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFQbGF5ZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHNwPElCaW5kZXI+IGIocGxheWVyLT5hc0JpbmRlcigpKTsKKyAgICAgICAgc3A8SUJpbmRlcj4gYihJSW50ZXJmYWNlOjphc0JpbmRlcihwbGF5ZXIpKTsKICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihiKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9ORVhUX1BMQVlFUiwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAppbmRleCAyZTAyZDE3Li5mZWVhMjY3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcApAQCAtMzksOCArMzksNiBAQAogCiBlbnVtIHsKICAgICBDUkVBVEUgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAotICAgIERFQ09ERV9VUkwsCi0gICAgREVDT0RFX0ZELAogICAgIENSRUFURV9NRURJQV9SRUNPUkRFUiwKICAgICBDUkVBVEVfTUVUQURBVEFfUkVUUklFVkVSLAogICAgIEdFVF9PTVgsCkBAIC03Myw3ICs3MSw3IEBACiAgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFQbGF5ZXJDbGllbnQ+JiBjbGllbnQsIGludCBhdWRpb1Nlc3Npb25JZCkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFQbGF5ZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGNsaWVudC0+YXNCaW5kZXIoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoY2xpZW50KSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihhdWRpb1Nlc3Npb25JZCk7CiAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KENSRUFURSwgZGF0YSwgJnJlcGx5KTsKQEAgLTg4LDU5ICs4Niw2IEBACiAgICAgICAgIHJldHVybiBpbnRlcmZhY2VfY2FzdDxJTWVkaWFSZWNvcmRlcj4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGRlY29kZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCi0gICAgICAgICAgICBjb25zdCBjaGFyKiB1cmwsCi0gICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsZVJhdGUsCi0gICAgICAgICAgICBpbnQqIHBOdW1DaGFubmVscywKLSAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90KiBwRm9ybWF0LAotICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwLAotICAgICAgICAgICAgc2l6ZV90ICpwU2l6ZSkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihodHRwU2VydmljZSAhPSBOVUxMKTsKLSAgICAgICAgaWYgKGh0dHBTZXJ2aWNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoaHR0cFNlcnZpY2UtPmFzQmluZGVyKCkpOwotICAgICAgICB9Ci0gICAgICAgIGRhdGEud3JpdGVDU3RyaW5nKHVybCk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoaGVhcC0+YXNCaW5kZXIoKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChERUNPREVfVVJMLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgKnBTYW1wbGVSYXRlID0gdWludDMyX3QocmVwbHkucmVhZEludDMyKCkpOwotICAgICAgICAgICAgICAgICpwTnVtQ2hhbm5lbHMgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgICAgICAqcEZvcm1hdCA9IChhdWRpb19mb3JtYXRfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgICAgICAqcFNpemUgPSAoc2l6ZV90KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkZWNvZGUoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgsIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHBOdW1DaGFubmVscywgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwLCBzaXplX3QgKnBTaXplKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUZpbGVEZXNjcmlwdG9yKGZkKTsKLSAgICAgICAgZGF0YS53cml0ZUludDY0KG9mZnNldCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQ2NChsZW5ndGgpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGhlYXAtPmFzQmluZGVyKCkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoREVDT0RFX0ZELCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgKnBTYW1wbGVSYXRlID0gdWludDMyX3QocmVwbHkucmVhZEludDMyKCkpOwotICAgICAgICAgICAgICAgICpwTnVtQ2hhbm5lbHMgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgICAgICAqcEZvcm1hdCA9IChhdWRpb19mb3JtYXRfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgICAgICAqcFNpemUgPSAoc2l6ZV90KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCiAgICAgdmlydHVhbCBzcDxJT01YPiBnZXRPTVgoKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC0xODgsNyArMTMzLDcgQEAKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoY2xpZW50LT5hc0JpbmRlcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihjbGllbnQpKTsKICAgICAgICAgZGF0YS53cml0ZVN0cmluZzgoaWZhY2UpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoTElTVEVOX0ZPUl9SRU1PVEVfRElTUExBWSwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIGludGVyZmFjZV9jYXN0PElSZW1vdGVEaXNwbGF5PihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwpAQCAtMjE2LDk1ICsxNjEsNDQgQEAKICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJTWVkaWFQbGF5ZXJDbGllbnQ+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb25JZCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBzcDxJTWVkaWFQbGF5ZXI+IHBsYXllciA9IGNyZWF0ZShjbGllbnQsIGF1ZGlvU2Vzc2lvbklkKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihwbGF5ZXItPmFzQmluZGVyKCkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIERFQ09ERV9VUkw6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzcDxJTWVkaWFIVFRQU2VydmljZT4gaHR0cFNlcnZpY2U7Ci0gICAgICAgICAgICBpZiAoZGF0YS5yZWFkSW50MzIoKSkgewotICAgICAgICAgICAgICAgIGh0dHBTZXJ2aWNlID0KLSAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhSFRUUFNlcnZpY2U+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybCA9IGRhdGEucmVhZENTdHJpbmcoKTsKLSAgICAgICAgICAgIHNwPElNZW1vcnlIZWFwPiBoZWFwID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeUhlYXA+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGU7Ci0gICAgICAgICAgICBpbnQgbnVtQ2hhbm5lbHM7Ci0gICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQ7Ci0gICAgICAgICAgICBzaXplX3Qgc2l6ZTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9Ci0gICAgICAgICAgICAgICAgZGVjb2RlKGh0dHBTZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICB1cmwsCi0gICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAmbnVtQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICZmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICZzaXplKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2FtcGxlUmF0ZSk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobnVtQ2hhbm5lbHMpOwotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KWZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3Qpc2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgREVDT0RFX0ZEOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyU2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgaW50IGZkID0gZHVwKGRhdGEucmVhZEZpbGVEZXNjcmlwdG9yKCkpOwotICAgICAgICAgICAgaW50NjRfdCBvZmZzZXQgPSBkYXRhLnJlYWRJbnQ2NCgpOwotICAgICAgICAgICAgaW50NjRfdCBsZW5ndGggPSBkYXRhLnJlYWRJbnQ2NCgpOwotICAgICAgICAgICAgc3A8SU1lbW9yeUhlYXA+IGhlYXAgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5SGVhcD4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZTsKLSAgICAgICAgICAgIGludCBudW1DaGFubmVsczsKLSAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdDsKLSAgICAgICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVjb2RlKGZkLCBvZmZzZXQsIGxlbmd0aCwgJnNhbXBsZVJhdGUsICZudW1DaGFubmVscywgJmZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFwLCAmc2l6ZSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNhbXBsZVJhdGUpOwotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG51bUNoYW5uZWxzKTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigoaW50MzJfdClmb3JtYXQpOwotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KXNpemUpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKHBsYXllcikpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIENSRUFURV9NRURJQV9SRUNPUkRFUjogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVBsYXllclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHNwPElNZWRpYVJlY29yZGVyPiByZWNvcmRlciA9IGNyZWF0ZU1lZGlhUmVjb3JkZXIoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihyZWNvcmRlci0+YXNCaW5kZXIoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIocmVjb3JkZXIpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBDUkVBVEVfTUVUQURBVEFfUkVUUklFVkVSOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyU2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgc3A8SU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI+IHJldHJpZXZlciA9IGNyZWF0ZU1ldGFkYXRhUmV0cmlldmVyKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIocmV0cmlldmVyLT5hc0JpbmRlcigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihyZXRyaWV2ZXIpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBHRVRfT01YOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyU2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgc3A8SU9NWD4gb214ID0gZ2V0T01YKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIob214LT5hc0JpbmRlcigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihvbXgpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBNQUtFX0NSWVBUTzogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVBsYXllclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHNwPElDcnlwdG8+IGNyeXB0byA9IG1ha2VDcnlwdG8oKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihjcnlwdG8tPmFzQmluZGVyKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGNyeXB0bykpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIE1BS0VfRFJNOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyU2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgc3A8SURybT4gZHJtID0gbWFrZURybSgpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKGRybS0+YXNCaW5kZXIoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoZHJtKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgTUFLRV9IRENQOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyU2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgYm9vbCBjcmVhdGVFbmNyeXB0aW9uTW9kdWxlID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHNwPElIRENQPiBoZGNwID0gbWFrZUhEQ1AoY3JlYXRlRW5jcnlwdGlvbk1vZHVsZSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoaGRjcC0+YXNCaW5kZXIoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoaGRjcCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIEFERF9CQVRURVJZX0RBVEE6IHsKQEAgLTMyNCwxMyArMjE4LDEzIEBACiAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElSZW1vdGVEaXNwbGF5Q2xpZW50PihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSkpOwogICAgICAgICAgICAgU3RyaW5nOCBpZmFjZShkYXRhLnJlYWRTdHJpbmc4KCkpOwogICAgICAgICAgICAgc3A8SVJlbW90ZURpc3BsYXk+IGRpc3BsYXkobGlzdGVuRm9yUmVtb3RlRGlzcGxheShjbGllbnQsIGlmYWNlKSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoZGlzcGxheS0+YXNCaW5kZXIoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoZGlzcGxheSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIEdFVF9DT0RFQ19MSVNUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyU2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgc3A8SU1lZGlhQ29kZWNMaXN0PiBtY2wgPSBnZXRDb2RlY0xpc3QoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihtY2wtPmFzQmluZGVyKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKG1jbCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwCmluZGV4IDk1YWYwMDYuLmE3MzNiNjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAKQEAgLTcwLDggKzcwLDggQEAKICAgICAgICAgQUxPR1YoInNldENhbWVyYSglcCwlcCkiLCBjYW1lcmEuZ2V0KCksIHByb3h5LmdldCgpKTsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUmVjb3JkZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoY2FtZXJhLT5hc0JpbmRlcigpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihwcm94eS0+YXNCaW5kZXIoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoY2FtZXJhKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIocHJveHkpKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9DQU1FUkEsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CkBAIC05NCw3ICs5NCw3IEBACiAgICAgICAgIEFMT0dWKCJzZXRQcmV2aWV3U3VyZmFjZSglcCkiLCBzdXJmYWNlLmdldCgpKTsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUmVjb3JkZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoc3VyZmFjZS0+YXNCaW5kZXIoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoc3VyZmFjZSkpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1BSRVZJRVdfU1VSRkFDRSwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KQEAgLTIxNSw3ICsyMTUsNyBAQAogICAgICAgICBBTE9HVigic2V0TGlzdGVuZXIoJXApIiwgbGlzdGVuZXIuZ2V0KCkpOwogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFSZWNvcmRlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihsaXN0ZW5lci0+YXNCaW5kZXIoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIobGlzdGVuZXIpKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9MSVNURU5FUiwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KQEAgLTQ2OCw3ICs0NjgsNyBAQAogICAgICAgICAgICAgaW50IHJldHVybmVkTnVsbD0gKHN1cmZhY2VNZWRpYVNvdXJjZSA9PSBOVUxMKSA/IDEgOiAwIDsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJldHVybmVkTnVsbCk7CiAgICAgICAgICAgICBpZiAoIXJldHVybmVkTnVsbCkgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihzdXJmYWNlTWVkaWFTb3VyY2UtPmFzQmluZGVyKCkpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihzdXJmYWNlTWVkaWFTb3VyY2UpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lPTVguY3BwIGIvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAKaW5kZXggMGZmNDdkZS4uZjIzOWJjNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAKQEAgLTEwMCw3ICsxMDAsNyBAQAogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlQ1N0cmluZyhuYW1lKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihvYnNlcnZlci0+YXNCaW5kZXIoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIob2JzZXJ2ZXIpKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEFMTE9DQVRFX05PREUsIGRhdGEsICZyZXBseSk7CiAKICAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVwbHkucmVhZEludDMyKCk7CkBAIC0yNDgsNyArMjQ4LDcgQEAKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnRfaW5kZXgpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKHBhcmFtcy0+YXNCaW5kZXIoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIocGFyYW1zKSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChVU0VfQlVGRkVSLCBkYXRhLCAmcmVwbHkpOwogCiAgICAgICAgIHN0YXR1c190IGVyciA9IHJlcGx5LnJlYWRJbnQzMigpOwpAQCAtNDE4LDcgKzQxOCw3IEBACiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpbm9kZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihwb3J0X2luZGV4KTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihwYXJhbXMtPmFzQmluZGVyKCkpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKHBhcmFtcykpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQUxMT0NfQlVGRkVSX1dJVEhfQkFDS1VQLCBkYXRhLCAmcmVwbHkpOwogCiAgICAgICAgIHN0YXR1c190IGVyciA9IHJlcGx5LnJlYWRJbnQzMigpOwpAQCAtNzc1LDcgKzc3NSw3IEBACiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlcnIpOwogCiAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKGJ1ZmZlclByb2R1Y2VyLT5hc0JpbmRlcigpKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoYnVmZmVyUHJvZHVjZXIpKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSVJlbW90ZURpc3BsYXlDbGllbnQuY3BwIGIvbWVkaWEvbGlibWVkaWEvSVJlbW90ZURpc3BsYXlDbGllbnQuY3BwCmluZGV4IDcxOTA4NzkuLjlkNjNiYzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lSZW1vdGVEaXNwbGF5Q2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JUmVtb3RlRGlzcGxheUNsaWVudC5jcHAKQEAgLTQyLDcgKzQyLDcgQEAKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSZW1vdGVEaXNwbGF5Q2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGJ1ZmZlclByb2R1Y2VyLT5hc0JpbmRlcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihidWZmZXJQcm9kdWNlcikpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIod2lkdGgpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoaGVpZ2h0KTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGZsYWdzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lTdHJlYW1Tb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvSVN0cmVhbVNvdXJjZS5jcHAKaW5kZXggZmUyY2M2MS4uZDQ4MGFlZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSVN0cmVhbVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSVN0cmVhbVNvdXJjZS5jcHAKQEAgLTU1LDcgKzU1LDcgQEAKICAgICB2aXJ0dWFsIHZvaWQgc2V0TGlzdGVuZXIoY29uc3Qgc3A8SVN0cmVhbUxpc3RlbmVyPiAmbGlzdGVuZXIpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVN0cmVhbVNvdXJjZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihsaXN0ZW5lci0+YXNCaW5kZXIoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIobGlzdGVuZXIpKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9MSVNURU5FUiwgZGF0YSwgJnJlcGx5KTsKICAgICB9CiAKQEAgLTY0LDcgKzY0LDcgQEAKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTdHJlYW1Tb3VyY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQ2NChzdGF0aWNfY2FzdDxpbnQ2NF90PihidWZmZXJzLnNpemUoKSkpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJ1ZmZlcnMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoYnVmZmVycy5pdGVtQXQoaSktPmFzQmluZGVyKCkpOworICAgICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihidWZmZXJzLml0ZW1BdChpKSkpOwogICAgICAgICB9CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfQlVGRkVSUywgZGF0YSwgJnJlcGx5KTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9KZXRQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSmV0UGxheWVyLmNwcAppbmRleCBmMGYxODMyLi43MjFkOGQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9KZXRQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0pldFBsYXllci5jcHAKQEAgLTM2LDcgKzM2LDYgQEAKICAgICAgICAgbVBhdXNlZChmYWxzZSksCiAgICAgICAgIG1NYXhUcmFja3MobWF4VHJhY2tzKSwKICAgICAgICAgbUVhc0RhdGEoTlVMTCksCi0gICAgICAgIG1FYXNKZXRGaWxlTG9jKE5VTEwpLAogICAgICAgICBtVHJhY2tCdWZmZXJTaXplKHRyYWNrQnVmZmVyU2l6ZSkKIHsKICAgICBBTE9HVigiSmV0UGxheWVyIGNvbnN0cnVjdG9yIik7CkBAIC0xMzMsMTAgKzEzMiw3IEBACiAgICAgICAgIEpFVF9TaHV0ZG93bihtRWFzRGF0YSk7CiAgICAgICAgIEVBU19TaHV0ZG93bihtRWFzRGF0YSk7CiAgICAgfQotICAgIGlmIChtRWFzSmV0RmlsZUxvYykgewotICAgICAgICBmcmVlKG1FYXNKZXRGaWxlTG9jKTsKLSAgICAgICAgbUVhc0pldEZpbGVMb2MgPSBOVUxMOwotICAgIH0KKyAgICBtSW9XcmFwcGVyLmNsZWFyKCk7CiAgICAgaWYgKG1BdWRpb1RyYWNrICE9IDApIHsKICAgICAgICAgbUF1ZGlvVHJhY2stPnN0b3AoKTsKICAgICAgICAgbUF1ZGlvVHJhY2stPmZsdXNoKCk7CkBAIC0zMjcsMTYgKzMyMyw5IEBACiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwogCi0gICAgbUVhc0pldEZpbGVMb2MgPSAoRUFTX0ZJTEVfTE9DQVRPUikgbWFsbG9jKHNpemVvZihFQVNfRklMRSkpOwotICAgIHN0cm5jcHkobUpldEZpbGVQYXRoLCBwYXRoLCBzaXplb2YobUpldEZpbGVQYXRoKSk7Ci0gICAgbUpldEZpbGVQYXRoW3NpemVvZihtSmV0RmlsZVBhdGgpIC0gMV0gPSAnXDAnOwotICAgIG1FYXNKZXRGaWxlTG9jLT5wYXRoID0gbUpldEZpbGVQYXRoOworICAgIG1Jb1dyYXBwZXIgPSBuZXcgTWlkaUlvV3JhcHBlcihwYXRoKTsKIAotICAgIG1FYXNKZXRGaWxlTG9jLT5mZCA9IDA7Ci0gICAgbUVhc0pldEZpbGVMb2MtPmxlbmd0aCA9IDA7Ci0gICAgbUVhc0pldEZpbGVMb2MtPm9mZnNldCA9IDA7Ci0KLSAgICBFQVNfUkVTVUxUIHJlc3VsdCA9IEpFVF9PcGVuRmlsZShtRWFzRGF0YSwgbUVhc0pldEZpbGVMb2MpOworICAgIEVBU19SRVNVTFQgcmVzdWx0ID0gSkVUX09wZW5GaWxlKG1FYXNEYXRhLCBtSW9XcmFwcGVyLT5nZXRMb2NhdG9yKCkpOwogICAgIGlmIChyZXN1bHQgIT0gRUFTX1NVQ0NFU1MpCiAgICAgICAgIG1TdGF0ZSA9IEVBU19TVEFURV9FUlJPUjsKICAgICBlbHNlCkBAIC0zNTIsMTMgKzM0MSw5IEBACiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwogCi0gICAgbUVhc0pldEZpbGVMb2MgPSAoRUFTX0ZJTEVfTE9DQVRPUikgbWFsbG9jKHNpemVvZihFQVNfRklMRSkpOwotICAgIG1FYXNKZXRGaWxlTG9jLT5mZCA9IGZkOwotICAgIG1FYXNKZXRGaWxlTG9jLT5vZmZzZXQgPSBvZmZzZXQ7Ci0gICAgbUVhc0pldEZpbGVMb2MtPmxlbmd0aCA9IGxlbmd0aDsKLSAgICBtRWFzSmV0RmlsZUxvYy0+cGF0aCA9IE5VTEw7CisgICAgbUlvV3JhcHBlciA9IG5ldyBNaWRpSW9XcmFwcGVyKGZkLCBvZmZzZXQsIGxlbmd0aCk7CiAKLSAgICBFQVNfUkVTVUxUIHJlc3VsdCA9IEpFVF9PcGVuRmlsZShtRWFzRGF0YSwgbUVhc0pldEZpbGVMb2MpOworICAgIEVBU19SRVNVTFQgcmVzdWx0ID0gSkVUX09wZW5GaWxlKG1FYXNEYXRhLCBtSW9XcmFwcGVyLT5nZXRMb2NhdG9yKCkpOwogICAgIGlmIChyZXN1bHQgIT0gRUFTX1NVQ0NFU1MpCiAgICAgICAgIG1TdGF0ZSA9IEVBU19TVEFURV9FUlJPUjsKICAgICBlbHNlCkBAIC00NTksNyArNDQ0LDYgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogdm9pZCBKZXRQbGF5ZXI6OmR1bXAoKQogewotICAgIEFMT0dFKCJKZXRQbGF5ZXIgZHVtcDogSkVUIGZpbGU9JXMiLCBtRWFzSmV0RmlsZUxvYy0+cGF0aCk7CiB9CiAKIHZvaWQgSmV0UGxheWVyOjpkdW1wSmV0U3RhdHVzKFNfSkVUX1NUQVRVUyogcEpldFN0YXR1cykKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01lbW9yeUxlYWtUcmFja1V0aWwuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWVtb3J5TGVha1RyYWNrVXRpbC5jcHAKaW5kZXggNjZmNzE2MS4uZDMxZjcyMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVtb3J5TGVha1RyYWNrVXRpbC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVtb3J5TGVha1RyYWNrVXRpbC5jcHAKQEAgLTE4LDYgKzE4LDcgQEAKIAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01pZGlJb1dyYXBwZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWlkaUlvV3JhcHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE5N2NlMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL01pZGlJb1dyYXBwZXIuY3BwCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1pZGlJb1dyYXBwZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSAibWVkaWEvTWlkaUlvV3JhcHBlci5oIgorCitzdGF0aWMgaW50IHJlYWRBdCh2b2lkICpoYW5kbGUsIHZvaWQgKmJ1ZmZlciwgaW50IHBvcywgaW50IHNpemUpIHsKKyAgICByZXR1cm4gKChhbmRyb2lkOjpNaWRpSW9XcmFwcGVyKiloYW5kbGUpLT5yZWFkQXQoYnVmZmVyLCBwb3MsIHNpemUpOworfQorc3RhdGljIGludCBzaXplKHZvaWQgKmhhbmRsZSkgeworICAgIHJldHVybiAoKGFuZHJvaWQ6Ok1pZGlJb1dyYXBwZXIqKWhhbmRsZSktPnNpemUoKTsKK30KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNaWRpSW9XcmFwcGVyOjpNaWRpSW9XcmFwcGVyKGNvbnN0IGNoYXIgKnBhdGgpIHsKKyAgICBBTE9HVigiTWlkaUlvV3JhcHBlciglcykiLCBwYXRoKTsKKyAgICBtRmQgPSBvcGVuKHBhdGgsIE9fUkRPTkxZIHwgT19MQVJHRUZJTEUpOworICAgIG1CYXNlID0gMDsKKyAgICBtTGVuZ3RoID0gbHNlZWsobUZkLCAwLCBTRUVLX0VORCk7Cit9CisKK01pZGlJb1dyYXBwZXI6Ok1pZGlJb1dyYXBwZXIoaW50IGZkLCBvZmY2NF90IG9mZnNldCwgaW50NjRfdCBzaXplKSB7CisgICAgQUxPR1YoIk1pZGlJb1dyYXBwZXIoZmQ9JWQpIiwgZmQpOworICAgIG1GZCA9IGR1cChmZCk7CisgICAgbUJhc2UgPSBvZmZzZXQ7CisgICAgbUxlbmd0aCA9IHNpemU7Cit9CisKK01pZGlJb1dyYXBwZXI6Ok1pZGlJb1dyYXBwZXIoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkgeworICAgIEFMT0dWKCJNaWRpSW9XcmFwcGVyKERhdGFTb3VyY2UpIik7CisgICAgbUZkID0gLTE7CisgICAgbURhdGFTb3VyY2UgPSBzb3VyY2U7CisgICAgb2ZmNjRfdCBsOworICAgIGlmIChtRGF0YVNvdXJjZS0+Z2V0U2l6ZSgmbCkgPT0gT0spIHsKKyAgICAgICAgbUxlbmd0aCA9IGw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUxlbmd0aCA9IDA7CisgICAgfQorfQorCitNaWRpSW9XcmFwcGVyOjp+TWlkaUlvV3JhcHBlcigpIHsKKyAgICBBTE9HVigifk1pZGlJb1dyYXBwZXIiKTsKKyAgICBjbG9zZShtRmQpOworfQorCitpbnQgTWlkaUlvV3JhcHBlcjo6cmVhZEF0KHZvaWQgKmJ1ZmZlciwgaW50IG9mZnNldCwgaW50IHNpemUpIHsKKyAgICBBTE9HVigicmVhZEF0KCVwLCAlZCwgJWQpIiwgYnVmZmVyLCBvZmZzZXQsIHNpemUpOworCisgICAgaWYgKG1EYXRhU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBidWZmZXIsIHNpemUpOworICAgIH0KKyAgICBsc2VlayhtRmQsIG1CYXNlICsgb2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgaWYgKG9mZnNldCArIHNpemUgPiBtTGVuZ3RoKSB7CisgICAgICAgIHNpemUgPSBtTGVuZ3RoIC0gb2Zmc2V0OworICAgIH0KKyAgICByZXR1cm4gcmVhZChtRmQsIGJ1ZmZlciwgc2l6ZSk7Cit9CisKK2ludCBNaWRpSW9XcmFwcGVyOjpzaXplKCkgeworICAgIEFMT0dWKCJzaXplKCkgPSAlZCIsIGludChtTGVuZ3RoKSk7CisgICAgcmV0dXJuIG1MZW5ndGg7Cit9CisKK0VBU19GSUxFX0xPQ0FUT1IgTWlkaUlvV3JhcHBlcjo6Z2V0TG9jYXRvcigpIHsKKyAgICBtRWFzRmlsZS5oYW5kbGUgPSB0aGlzOworICAgIG1FYXNGaWxlLnJlYWRBdCA9IDo6cmVhZEF0OworICAgIG1FYXNGaWxlLnNpemUgPSA6OnNpemU7CisgICAgcmV0dXJuICZtRWFzRmlsZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL1NpbmdsZVN0YXRlUXVldWUuY3BwIGIvbWVkaWEvbGlibWVkaWEvU2luZ2xlU3RhdGVRdWV1ZS5jcHAKaW5kZXggMzUwM2JhYS4uYzI0MTE4NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvU2luZ2xlU3RhdGVRdWV1ZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvU2luZ2xlU3RhdGVRdWV1ZS5jcHAKQEAgLTE2LDcgKzE2LDYgQEAKIAogI2luY2x1ZGUgPG5ldz4KICNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy1pbmxpbmUuaD4gLy8gZm9yIGFuZHJvaWRfbWVtb3J5X2JhcnJpZXIoKQogI2luY2x1ZGUgPG1lZGlhL1NpbmdsZVN0YXRlUXVldWUuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvU291bmRQb29sLmNwcCBiL21lZGlhL2xpYm1lZGlhL1NvdW5kUG9vbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZTM4MWIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWEvU291bmRQb29sLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDkyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJTb3VuZFBvb2wiCi0KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNkZWZpbmUgVVNFX1NIQVJFRF9NRU1fQlVGRkVSCi0KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllci5oPgotI2luY2x1ZGUgPG1lZGlhL1NvdW5kUG9vbC5oPgotI2luY2x1ZGUgIlNvdW5kUG9vbFRocmVhZC5oIgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkCi17Ci0KLWludCBrRGVmYXVsdEJ1ZmZlckNvdW50ID0gNDsKLXVpbnQzMl90IGtNYXhTYW1wbGVSYXRlID0gNDgwMDA7Ci11aW50MzJfdCBrRGVmYXVsdFNhbXBsZVJhdGUgPSA0NDEwMDsKLXVpbnQzMl90IGtEZWZhdWx0RnJhbWVDb3VudCA9IDEyMDA7Ci1zaXplX3Qga0RlZmF1bHRIZWFwU2l6ZSA9IDEwMjQgKiAxMDI0OyAvLyAxTUIKLQotCi1Tb3VuZFBvb2w6OlNvdW5kUG9vbChpbnQgbWF4Q2hhbm5lbHMsIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMpCi17Ci0gICAgQUxPR1YoIlNvdW5kUG9vbCBjb25zdHJ1Y3RvcjogbWF4Q2hhbm5lbHM9JWQsIGF0dHIudXNhZ2U9JWQsIGF0dHIuZmxhZ3M9MHgleCwgYXR0ci50YWdzPSVzIiwKLSAgICAgICAgICAgIG1heENoYW5uZWxzLCBwQXR0cmlidXRlcy0+dXNhZ2UsIHBBdHRyaWJ1dGVzLT5mbGFncywgcEF0dHJpYnV0ZXMtPnRhZ3MpOwotCi0gICAgLy8gY2hlY2sgbGltaXRzCi0gICAgbU1heENoYW5uZWxzID0gbWF4Q2hhbm5lbHM7Ci0gICAgaWYgKG1NYXhDaGFubmVscyA8IDEpIHsKLSAgICAgICAgbU1heENoYW5uZWxzID0gMTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobU1heENoYW5uZWxzID4gMzIpIHsKLSAgICAgICAgbU1heENoYW5uZWxzID0gMzI7Ci0gICAgfQotICAgIEFMT0dXX0lGKG1heENoYW5uZWxzICE9IG1NYXhDaGFubmVscywgIkFwcCByZXF1ZXN0ZWQgJWQgY2hhbm5lbHMiLCBtYXhDaGFubmVscyk7Ci0KLSAgICBtUXVpdCA9IGZhbHNlOwotICAgIG1EZWNvZGVUaHJlYWQgPSAwOwotICAgIG1lbWNweSgmbUF0dHJpYnV0ZXMsIHBBdHRyaWJ1dGVzLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7Ci0gICAgbUFsbG9jYXRlZCA9IDA7Ci0gICAgbU5leHRTYW1wbGVJRCA9IDA7Ci0gICAgbU5leHRDaGFubmVsSUQgPSAwOwotCi0gICAgbUNhbGxiYWNrID0gMDsKLSAgICBtVXNlckRhdGEgPSAwOwotCi0gICAgbUNoYW5uZWxQb29sID0gbmV3IFNvdW5kQ2hhbm5lbFttTWF4Q2hhbm5lbHNdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU1heENoYW5uZWxzOyArK2kpIHsKLSAgICAgICAgbUNoYW5uZWxQb29sW2ldLmluaXQodGhpcyk7Ci0gICAgICAgIG1DaGFubmVscy5wdXNoX2JhY2soJm1DaGFubmVsUG9vbFtpXSk7Ci0gICAgfQotCi0gICAgLy8gc3RhcnQgZGVjb2RlIHRocmVhZAotICAgIHN0YXJ0VGhyZWFkcygpOwotfQotCi1Tb3VuZFBvb2w6On5Tb3VuZFBvb2woKQotewotICAgIEFMT0dWKCJTb3VuZFBvb2wgZGVzdHJ1Y3RvciIpOwotICAgIG1EZWNvZGVUaHJlYWQtPnF1aXQoKTsKLSAgICBxdWl0KCk7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jaygmbUxvY2spOwotCi0gICAgbUNoYW5uZWxzLmNsZWFyKCk7Ci0gICAgaWYgKG1DaGFubmVsUG9vbCkKLSAgICAgICAgZGVsZXRlIFtdIG1DaGFubmVsUG9vbDsKLSAgICAvLyBjbGVhbiB1cCBzYW1wbGVzCi0gICAgQUxPR1YoImNsZWFyIHNhbXBsZXMiKTsKLSAgICBtU2FtcGxlcy5jbGVhcigpOwotCi0gICAgaWYgKG1EZWNvZGVUaHJlYWQpCi0gICAgICAgIGRlbGV0ZSBtRGVjb2RlVGhyZWFkOwotfQotCi12b2lkIFNvdW5kUG9vbDo6YWRkVG9SZXN0YXJ0TGlzdChTb3VuZENoYW5uZWwqIGNoYW5uZWwpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soJm1SZXN0YXJ0TG9jayk7Ci0gICAgaWYgKCFtUXVpdCkgewotICAgICAgICBtUmVzdGFydC5wdXNoX2JhY2soY2hhbm5lbCk7Ci0gICAgICAgIG1Db25kaXRpb24uc2lnbmFsKCk7Ci0gICAgfQotfQotCi12b2lkIFNvdW5kUG9vbDo6YWRkVG9TdG9wTGlzdChTb3VuZENoYW5uZWwqIGNoYW5uZWwpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soJm1SZXN0YXJ0TG9jayk7Ci0gICAgaWYgKCFtUXVpdCkgewotICAgICAgICBtU3RvcC5wdXNoX2JhY2soY2hhbm5lbCk7Ci0gICAgICAgIG1Db25kaXRpb24uc2lnbmFsKCk7Ci0gICAgfQotfQotCi1pbnQgU291bmRQb29sOjpiZWdpblRocmVhZCh2b2lkKiBhcmcpCi17Ci0gICAgU291bmRQb29sKiBwID0gKFNvdW5kUG9vbCopYXJnOwotICAgIHJldHVybiBwLT5ydW4oKTsKLX0KLQotaW50IFNvdW5kUG9vbDo6cnVuKCkKLXsKLSAgICBtUmVzdGFydExvY2subG9jaygpOwotICAgIHdoaWxlICghbVF1aXQpIHsKLSAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1SZXN0YXJ0TG9jayk7Ci0gICAgICAgIEFMT0dWKCJhd2FrZSIpOwotICAgICAgICBpZiAobVF1aXQpIGJyZWFrOwotCi0gICAgICAgIHdoaWxlICghbVN0b3AuZW1wdHkoKSkgewotICAgICAgICAgICAgU291bmRDaGFubmVsKiBjaGFubmVsOwotICAgICAgICAgICAgQUxPR1YoIkdldHRpbmcgY2hhbm5lbCBmcm9tIHN0b3AgbGlzdCIpOwotICAgICAgICAgICAgTGlzdDxTb3VuZENoYW5uZWwqID46Oml0ZXJhdG9yIGl0ZXIgPSBtU3RvcC5iZWdpbigpOwotICAgICAgICAgICAgY2hhbm5lbCA9ICppdGVyOwotICAgICAgICAgICAgbVN0b3AuZXJhc2UoaXRlcik7Ci0gICAgICAgICAgICBtUmVzdGFydExvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICBpZiAoY2hhbm5lbCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soJm1Mb2NrKTsKLSAgICAgICAgICAgICAgICBjaGFubmVsLT5zdG9wKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUmVzdGFydExvY2subG9jaygpOwotICAgICAgICAgICAgaWYgKG1RdWl0KSBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlICghbVJlc3RhcnQuZW1wdHkoKSkgewotICAgICAgICAgICAgU291bmRDaGFubmVsKiBjaGFubmVsOwotICAgICAgICAgICAgQUxPR1YoIkdldHRpbmcgY2hhbm5lbCBmcm9tIGxpc3QiKTsKLSAgICAgICAgICAgIExpc3Q8U291bmRDaGFubmVsKj46Oml0ZXJhdG9yIGl0ZXIgPSBtUmVzdGFydC5iZWdpbigpOwotICAgICAgICAgICAgY2hhbm5lbCA9ICppdGVyOwotICAgICAgICAgICAgbVJlc3RhcnQuZXJhc2UoaXRlcik7Ci0gICAgICAgICAgICBtUmVzdGFydExvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICBpZiAoY2hhbm5lbCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soJm1Mb2NrKTsKLSAgICAgICAgICAgICAgICBjaGFubmVsLT5uZXh0RXZlbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1SZXN0YXJ0TG9jay5sb2NrKCk7Ci0gICAgICAgICAgICBpZiAobVF1aXQpIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbVN0b3AuY2xlYXIoKTsKLSAgICBtUmVzdGFydC5jbGVhcigpOwotICAgIG1Db25kaXRpb24uc2lnbmFsKCk7Ci0gICAgbVJlc3RhcnRMb2NrLnVubG9jaygpOwotICAgIEFMT0dWKCJnb29kYnllIik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgU291bmRQb29sOjpxdWl0KCkKLXsKLSAgICBtUmVzdGFydExvY2subG9jaygpOwotICAgIG1RdWl0ID0gdHJ1ZTsKLSAgICBtQ29uZGl0aW9uLnNpZ25hbCgpOwotICAgIG1Db25kaXRpb24ud2FpdChtUmVzdGFydExvY2spOwotICAgIEFMT0dWKCJyZXR1cm4gZnJvbSBxdWl0Iik7Ci0gICAgbVJlc3RhcnRMb2NrLnVubG9jaygpOwotfQotCi1ib29sIFNvdW5kUG9vbDo6c3RhcnRUaHJlYWRzKCkKLXsKLSAgICBjcmVhdGVUaHJlYWRFdGMoYmVnaW5UaHJlYWQsIHRoaXMsICJTb3VuZFBvb2wiKTsKLSAgICBpZiAobURlY29kZVRocmVhZCA9PSBOVUxMKQotICAgICAgICBtRGVjb2RlVGhyZWFkID0gbmV3IFNvdW5kUG9vbFRocmVhZCh0aGlzKTsKLSAgICByZXR1cm4gbURlY29kZVRocmVhZCAhPSBOVUxMOwotfQotCi1Tb3VuZENoYW5uZWwqIFNvdW5kUG9vbDo6ZmluZENoYW5uZWwoaW50IGNoYW5uZWxJRCkKLXsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1NYXhDaGFubmVsczsgKytpKSB7Ci0gICAgICAgIGlmIChtQ2hhbm5lbFBvb2xbaV0uY2hhbm5lbElEKCkgPT0gY2hhbm5lbElEKSB7Ci0gICAgICAgICAgICByZXR1cm4gJm1DaGFubmVsUG9vbFtpXTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotU291bmRDaGFubmVsKiBTb3VuZFBvb2w6OmZpbmROZXh0Q2hhbm5lbChpbnQgY2hhbm5lbElEKQotewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU1heENoYW5uZWxzOyArK2kpIHsKLSAgICAgICAgaWYgKG1DaGFubmVsUG9vbFtpXS5uZXh0Q2hhbm5lbElEKCkgPT0gY2hhbm5lbElEKSB7Ci0gICAgICAgICAgICByZXR1cm4gJm1DaGFubmVsUG9vbFtpXTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotaW50IFNvdW5kUG9vbDo6bG9hZChjb25zdCBjaGFyKiBwYXRoLCBpbnQgcHJpb3JpdHkgX191bnVzZWQpCi17Ci0gICAgQUxPR1YoImxvYWQ6IHBhdGg9JXMsIHByaW9yaXR5PSVkIiwgcGF0aCwgcHJpb3JpdHkpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKCZtTG9jayk7Ci0gICAgc3A8U2FtcGxlPiBzYW1wbGUgPSBuZXcgU2FtcGxlKCsrbU5leHRTYW1wbGVJRCwgcGF0aCk7Ci0gICAgbVNhbXBsZXMuYWRkKHNhbXBsZS0+c2FtcGxlSUQoKSwgc2FtcGxlKTsKLSAgICBkb0xvYWQoc2FtcGxlKTsKLSAgICByZXR1cm4gc2FtcGxlLT5zYW1wbGVJRCgpOwotfQotCi1pbnQgU291bmRQb29sOjpsb2FkKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoLCBpbnQgcHJpb3JpdHkgX191bnVzZWQpCi17Ci0gICAgQUxPR1YoImxvYWQ6IGZkPSVkLCBvZmZzZXQ9JSIgUFJJZDY0ICIsIGxlbmd0aD0lIiBQUklkNjQgIiwgcHJpb3JpdHk9JWQiLAotICAgICAgICAgICAgZmQsIG9mZnNldCwgbGVuZ3RoLCBwcmlvcml0eSk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soJm1Mb2NrKTsKLSAgICBzcDxTYW1wbGU+IHNhbXBsZSA9IG5ldyBTYW1wbGUoKyttTmV4dFNhbXBsZUlELCBmZCwgb2Zmc2V0LCBsZW5ndGgpOwotICAgIG1TYW1wbGVzLmFkZChzYW1wbGUtPnNhbXBsZUlEKCksIHNhbXBsZSk7Ci0gICAgZG9Mb2FkKHNhbXBsZSk7Ci0gICAgcmV0dXJuIHNhbXBsZS0+c2FtcGxlSUQoKTsKLX0KLQotdm9pZCBTb3VuZFBvb2w6OmRvTG9hZChzcDxTYW1wbGU+JiBzYW1wbGUpCi17Ci0gICAgQUxPR1YoImRvTG9hZDogbG9hZGluZyBzYW1wbGUgc2FtcGxlSUQ9JWQiLCBzYW1wbGUtPnNhbXBsZUlEKCkpOwotICAgIHNhbXBsZS0+c3RhcnRMb2FkKCk7Ci0gICAgbURlY29kZVRocmVhZC0+bG9hZFNhbXBsZShzYW1wbGUtPnNhbXBsZUlEKCkpOwotfQotCi1ib29sIFNvdW5kUG9vbDo6dW5sb2FkKGludCBzYW1wbGVJRCkKLXsKLSAgICBBTE9HVigidW5sb2FkOiBzYW1wbGVJRD0lZCIsIHNhbXBsZUlEKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jaygmbUxvY2spOwotICAgIHJldHVybiBtU2FtcGxlcy5yZW1vdmVJdGVtKHNhbXBsZUlEKTsKLX0KLQotaW50IFNvdW5kUG9vbDo6cGxheShpbnQgc2FtcGxlSUQsIGZsb2F0IGxlZnRWb2x1bWUsIGZsb2F0IHJpZ2h0Vm9sdW1lLAotICAgICAgICBpbnQgcHJpb3JpdHksIGludCBsb29wLCBmbG9hdCByYXRlKQotewotICAgIEFMT0dWKCJwbGF5IHNhbXBsZUlEPSVkLCBsZWZ0Vm9sdW1lPSVmLCByaWdodFZvbHVtZT0lZiwgcHJpb3JpdHk9JWQsIGxvb3A9JWQsIHJhdGU9JWYiLAotICAgICAgICAgICAgc2FtcGxlSUQsIGxlZnRWb2x1bWUsIHJpZ2h0Vm9sdW1lLCBwcmlvcml0eSwgbG9vcCwgcmF0ZSk7Ci0gICAgc3A8U2FtcGxlPiBzYW1wbGU7Ci0gICAgU291bmRDaGFubmVsKiBjaGFubmVsOwotICAgIGludCBjaGFubmVsSUQ7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jaygmbUxvY2spOwotCi0gICAgaWYgKG1RdWl0KSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAvLyBpcyBzYW1wbGUgcmVhZHk/Ci0gICAgc2FtcGxlID0gZmluZFNhbXBsZShzYW1wbGVJRCk7Ci0gICAgaWYgKChzYW1wbGUgPT0gMCkgfHwgKHNhbXBsZS0+c3RhdGUoKSAhPSBTYW1wbGU6OlJFQURZKSkgewotICAgICAgICBBTE9HVygiICBzYW1wbGUgJWQgbm90IFJFQURZIiwgc2FtcGxlSUQpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBkdW1wKCk7Ci0KLSAgICAvLyBhbGxvY2F0ZSBhIGNoYW5uZWwKLSAgICBjaGFubmVsID0gYWxsb2NhdGVDaGFubmVsX2wocHJpb3JpdHkpOwotCi0gICAgLy8gbm8gY2hhbm5lbCBhbGxvY2F0ZWQgLSByZXR1cm4gMAotICAgIGlmICghY2hhbm5lbCkgewotICAgICAgICBBTE9HVigiTm8gY2hhbm5lbCBhbGxvY2F0ZWQiKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgY2hhbm5lbElEID0gKyttTmV4dENoYW5uZWxJRDsKLQotICAgIEFMT0dWKCJwbGF5IGNoYW5uZWwgJXAgc3RhdGUgPSAlZCIsIGNoYW5uZWwsIGNoYW5uZWwtPnN0YXRlKCkpOwotICAgIGNoYW5uZWwtPnBsYXkoc2FtcGxlLCBjaGFubmVsSUQsIGxlZnRWb2x1bWUsIHJpZ2h0Vm9sdW1lLCBwcmlvcml0eSwgbG9vcCwgcmF0ZSk7Ci0gICAgcmV0dXJuIGNoYW5uZWxJRDsKLX0KLQotU291bmRDaGFubmVsKiBTb3VuZFBvb2w6OmFsbG9jYXRlQ2hhbm5lbF9sKGludCBwcmlvcml0eSkKLXsKLSAgICBMaXN0PFNvdW5kQ2hhbm5lbCo+OjppdGVyYXRvciBpdGVyOwotICAgIFNvdW5kQ2hhbm5lbCogY2hhbm5lbCA9IE5VTEw7Ci0KLSAgICAvLyBhbGxvY2F0ZSBhIGNoYW5uZWwKLSAgICBpZiAoIW1DaGFubmVscy5lbXB0eSgpKSB7Ci0gICAgICAgIGl0ZXIgPSBtQ2hhbm5lbHMuYmVnaW4oKTsKLSAgICAgICAgaWYgKHByaW9yaXR5ID49ICgqaXRlciktPnByaW9yaXR5KCkpIHsKLSAgICAgICAgICAgIGNoYW5uZWwgPSAqaXRlcjsKLSAgICAgICAgICAgIG1DaGFubmVscy5lcmFzZShpdGVyKTsKLSAgICAgICAgICAgIEFMT0dWKCJBbGxvY2F0ZWQgYWN0aXZlIGNoYW5uZWwiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIHVwZGF0ZSBwcmlvcml0eSBhbmQgcHV0IGl0IGJhY2sgaW4gdGhlIGxpc3QKLSAgICBpZiAoY2hhbm5lbCkgewotICAgICAgICBjaGFubmVsLT5zZXRQcmlvcml0eShwcmlvcml0eSk7Ci0gICAgICAgIGZvciAoaXRlciA9IG1DaGFubmVscy5iZWdpbigpOyBpdGVyICE9IG1DaGFubmVscy5lbmQoKTsgKytpdGVyKSB7Ci0gICAgICAgICAgICBpZiAocHJpb3JpdHkgPCAoKml0ZXIpLT5wcmlvcml0eSgpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbUNoYW5uZWxzLmluc2VydChpdGVyLCBjaGFubmVsKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNoYW5uZWw7Ci19Ci0KLS8vIG1vdmUgYSBjaGFubmVsIGZyb20gaXRzIGN1cnJlbnQgcG9zaXRpb24gdG8gdGhlIGZyb250IG9mIHRoZSBsaXN0Ci12b2lkIFNvdW5kUG9vbDo6bW92ZVRvRnJvbnRfbChTb3VuZENoYW5uZWwqIGNoYW5uZWwpCi17Ci0gICAgZm9yIChMaXN0PFNvdW5kQ2hhbm5lbCo+OjppdGVyYXRvciBpdGVyID0gbUNoYW5uZWxzLmJlZ2luKCk7IGl0ZXIgIT0gbUNoYW5uZWxzLmVuZCgpOyArK2l0ZXIpIHsKLSAgICAgICAgaWYgKCppdGVyID09IGNoYW5uZWwpIHsKLSAgICAgICAgICAgIG1DaGFubmVscy5lcmFzZShpdGVyKTsKLSAgICAgICAgICAgIG1DaGFubmVscy5wdXNoX2Zyb250KGNoYW5uZWwpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgU291bmRQb29sOjpwYXVzZShpbnQgY2hhbm5lbElEKQotewotICAgIEFMT0dWKCJwYXVzZSglZCkiLCBjaGFubmVsSUQpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKCZtTG9jayk7Ci0gICAgU291bmRDaGFubmVsKiBjaGFubmVsID0gZmluZENoYW5uZWwoY2hhbm5lbElEKTsKLSAgICBpZiAoY2hhbm5lbCkgewotICAgICAgICBjaGFubmVsLT5wYXVzZSgpOwotICAgIH0KLX0KLQotdm9pZCBTb3VuZFBvb2w6OmF1dG9QYXVzZSgpCi17Ci0gICAgQUxPR1YoImF1dG9QYXVzZSgpIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soJm1Mb2NrKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1NYXhDaGFubmVsczsgKytpKSB7Ci0gICAgICAgIFNvdW5kQ2hhbm5lbCogY2hhbm5lbCA9ICZtQ2hhbm5lbFBvb2xbaV07Ci0gICAgICAgIGNoYW5uZWwtPmF1dG9QYXVzZSgpOwotICAgIH0KLX0KLQotdm9pZCBTb3VuZFBvb2w6OnJlc3VtZShpbnQgY2hhbm5lbElEKQotewotICAgIEFMT0dWKCJyZXN1bWUoJWQpIiwgY2hhbm5lbElEKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jaygmbUxvY2spOwotICAgIFNvdW5kQ2hhbm5lbCogY2hhbm5lbCA9IGZpbmRDaGFubmVsKGNoYW5uZWxJRCk7Ci0gICAgaWYgKGNoYW5uZWwpIHsKLSAgICAgICAgY2hhbm5lbC0+cmVzdW1lKCk7Ci0gICAgfQotfQotCi12b2lkIFNvdW5kUG9vbDo6YXV0b1Jlc3VtZSgpCi17Ci0gICAgQUxPR1YoImF1dG9SZXN1bWUoKSIpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKCZtTG9jayk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTWF4Q2hhbm5lbHM7ICsraSkgewotICAgICAgICBTb3VuZENoYW5uZWwqIGNoYW5uZWwgPSAmbUNoYW5uZWxQb29sW2ldOwotICAgICAgICBjaGFubmVsLT5hdXRvUmVzdW1lKCk7Ci0gICAgfQotfQotCi12b2lkIFNvdW5kUG9vbDo6c3RvcChpbnQgY2hhbm5lbElEKQotewotICAgIEFMT0dWKCJzdG9wKCVkKSIsIGNoYW5uZWxJRCk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soJm1Mb2NrKTsKLSAgICBTb3VuZENoYW5uZWwqIGNoYW5uZWwgPSBmaW5kQ2hhbm5lbChjaGFubmVsSUQpOwotICAgIGlmIChjaGFubmVsKSB7Ci0gICAgICAgIGNoYW5uZWwtPnN0b3AoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBjaGFubmVsID0gZmluZE5leHRDaGFubmVsKGNoYW5uZWxJRCk7Ci0gICAgICAgIGlmIChjaGFubmVsKQotICAgICAgICAgICAgY2hhbm5lbC0+Y2xlYXJOZXh0RXZlbnQoKTsKLSAgICB9Ci19Ci0KLXZvaWQgU291bmRQb29sOjpzZXRWb2x1bWUoaW50IGNoYW5uZWxJRCwgZmxvYXQgbGVmdFZvbHVtZSwgZmxvYXQgcmlnaHRWb2x1bWUpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soJm1Mb2NrKTsKLSAgICBTb3VuZENoYW5uZWwqIGNoYW5uZWwgPSBmaW5kQ2hhbm5lbChjaGFubmVsSUQpOwotICAgIGlmIChjaGFubmVsKSB7Ci0gICAgICAgIGNoYW5uZWwtPnNldFZvbHVtZShsZWZ0Vm9sdW1lLCByaWdodFZvbHVtZSk7Ci0gICAgfQotfQotCi12b2lkIFNvdW5kUG9vbDo6c2V0UHJpb3JpdHkoaW50IGNoYW5uZWxJRCwgaW50IHByaW9yaXR5KQotewotICAgIEFMT0dWKCJzZXRQcmlvcml0eSglZCwgJWQpIiwgY2hhbm5lbElELCBwcmlvcml0eSk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soJm1Mb2NrKTsKLSAgICBTb3VuZENoYW5uZWwqIGNoYW5uZWwgPSBmaW5kQ2hhbm5lbChjaGFubmVsSUQpOwotICAgIGlmIChjaGFubmVsKSB7Ci0gICAgICAgIGNoYW5uZWwtPnNldFByaW9yaXR5KHByaW9yaXR5KTsKLSAgICB9Ci19Ci0KLXZvaWQgU291bmRQb29sOjpzZXRMb29wKGludCBjaGFubmVsSUQsIGludCBsb29wKQotewotICAgIEFMT0dWKCJzZXRMb29wKCVkLCAlZCkiLCBjaGFubmVsSUQsIGxvb3ApOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKCZtTG9jayk7Ci0gICAgU291bmRDaGFubmVsKiBjaGFubmVsID0gZmluZENoYW5uZWwoY2hhbm5lbElEKTsKLSAgICBpZiAoY2hhbm5lbCkgewotICAgICAgICBjaGFubmVsLT5zZXRMb29wKGxvb3ApOwotICAgIH0KLX0KLQotdm9pZCBTb3VuZFBvb2w6OnNldFJhdGUoaW50IGNoYW5uZWxJRCwgZmxvYXQgcmF0ZSkKLXsKLSAgICBBTE9HVigic2V0UmF0ZSglZCwgJWYpIiwgY2hhbm5lbElELCByYXRlKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jaygmbUxvY2spOwotICAgIFNvdW5kQ2hhbm5lbCogY2hhbm5lbCA9IGZpbmRDaGFubmVsKGNoYW5uZWxJRCk7Ci0gICAgaWYgKGNoYW5uZWwpIHsKLSAgICAgICAgY2hhbm5lbC0+c2V0UmF0ZShyYXRlKTsKLSAgICB9Ci19Ci0KLS8vIGNhbGwgd2l0aCBsb2NrIGhlbGQKLXZvaWQgU291bmRQb29sOjpkb25lX2woU291bmRDaGFubmVsKiBjaGFubmVsKQotewotICAgIEFMT0dWKCJkb25lX2woJWQpIiwgY2hhbm5lbC0+Y2hhbm5lbElEKCkpOwotICAgIC8vIGlmICJzdG9sZW4iLCBwbGF5IG5leHQgZXZlbnQKLSAgICBpZiAoY2hhbm5lbC0+bmV4dENoYW5uZWxJRCgpICE9IDApIHsKLSAgICAgICAgQUxPR1YoImFkZCB0byByZXN0YXJ0IGxpc3QiKTsKLSAgICAgICAgYWRkVG9SZXN0YXJ0TGlzdChjaGFubmVsKTsKLSAgICB9Ci0KLSAgICAvLyByZXR1cm4gdG8gaWRsZSBzdGF0ZQotICAgIGVsc2UgewotICAgICAgICBBTE9HVigibW92ZSB0byBmcm9udCIpOwotICAgICAgICBtb3ZlVG9Gcm9udF9sKGNoYW5uZWwpOwotICAgIH0KLX0KLQotdm9pZCBTb3VuZFBvb2w6OnNldENhbGxiYWNrKFNvdW5kUG9vbENhbGxiYWNrKiBjYWxsYmFjaywgdm9pZCogdXNlcikKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jaygmbUNhbGxiYWNrTG9jayk7Ci0gICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgbVVzZXJEYXRhID0gdXNlcjsKLX0KLQotdm9pZCBTb3VuZFBvb2w6Om5vdGlmeShTb3VuZFBvb2xFdmVudCBldmVudCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jaygmbUNhbGxiYWNrTG9jayk7Ci0gICAgaWYgKG1DYWxsYmFjayAhPSBOVUxMKSB7Ci0gICAgICAgIG1DYWxsYmFjayhldmVudCwgdGhpcywgbVVzZXJEYXRhKTsKLSAgICB9Ci19Ci0KLXZvaWQgU291bmRQb29sOjpkdW1wKCkKLXsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1NYXhDaGFubmVsczsgKytpKSB7Ci0gICAgICAgIG1DaGFubmVsUG9vbFtpXS5kdW1wKCk7Ci0gICAgfQotfQotCi0KLVNhbXBsZTo6U2FtcGxlKGludCBzYW1wbGVJRCwgY29uc3QgY2hhciogdXJsKQotewotICAgIGluaXQoKTsKLSAgICBtU2FtcGxlSUQgPSBzYW1wbGVJRDsKLSAgICBtVXJsID0gc3RyZHVwKHVybCk7Ci0gICAgQUxPR1YoImNyZWF0ZSBzYW1wbGVJRD0lZCwgdXJsPSVzIiwgbVNhbXBsZUlELCBtVXJsKTsKLX0KLQotU2FtcGxlOjpTYW1wbGUoaW50IHNhbXBsZUlELCBpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkKLXsKLSAgICBpbml0KCk7Ci0gICAgbVNhbXBsZUlEID0gc2FtcGxlSUQ7Ci0gICAgbUZkID0gZHVwKGZkKTsKLSAgICBtT2Zmc2V0ID0gb2Zmc2V0OwotICAgIG1MZW5ndGggPSBsZW5ndGg7Ci0gICAgQUxPR1YoImNyZWF0ZSBzYW1wbGVJRD0lZCwgZmQ9JWQsIG9mZnNldD0lIiBQUklkNjQgIiBsZW5ndGg9JSIgUFJJZDY0LAotICAgICAgICBtU2FtcGxlSUQsIG1GZCwgbUxlbmd0aCwgbU9mZnNldCk7Ci19Ci0KLXZvaWQgU2FtcGxlOjppbml0KCkKLXsKLSAgICBtU2l6ZSA9IDA7Ci0gICAgbVJlZkNvdW50ID0gMDsKLSAgICBtU2FtcGxlSUQgPSAwOwotICAgIG1TdGF0ZSA9IFVOTE9BREVEOwotICAgIG1GZCA9IC0xOwotICAgIG1PZmZzZXQgPSAwOwotICAgIG1MZW5ndGggPSAwOwotICAgIG1VcmwgPSAwOwotfQotCi1TYW1wbGU6On5TYW1wbGUoKQotewotICAgIEFMT0dWKCJTYW1wbGU6OmRlc3RydWN0b3Igc2FtcGxlSUQ9JWQsIGZkPSVkIiwgbVNhbXBsZUlELCBtRmQpOwotICAgIGlmIChtRmQgPiAwKSB7Ci0gICAgICAgIEFMT0dWKCJjbG9zZSglZCkiLCBtRmQpOwotICAgICAgICA6OmNsb3NlKG1GZCk7Ci0gICAgfQotICAgIGZyZWUobVVybCk7Ci19Ci0KLXN0YXR1c190IFNhbXBsZTo6ZG9Mb2FkKCkKLXsKLSAgICB1aW50MzJfdCBzYW1wbGVSYXRlOwotICAgIGludCBudW1DaGFubmVsczsKLSAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQ7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIG1IZWFwID0gbmV3IE1lbW9yeUhlYXBCYXNlKGtEZWZhdWx0SGVhcFNpemUpOwotCi0gICAgQUxPR1YoIlN0YXJ0IGRlY29kZSIpOwotICAgIGlmIChtVXJsKSB7Ci0gICAgICAgIHN0YXR1cyA9IE1lZGlhUGxheWVyOjpkZWNvZGUoCi0gICAgICAgICAgICAgICAgTlVMTCAvKiBodHRwU2VydmljZSAqLywKLSAgICAgICAgICAgICAgICBtVXJsLAotICAgICAgICAgICAgICAgICZzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICZudW1DaGFubmVscywKLSAgICAgICAgICAgICAgICAmZm9ybWF0LAotICAgICAgICAgICAgICAgIG1IZWFwLAotICAgICAgICAgICAgICAgICZtU2l6ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3RhdHVzID0gTWVkaWFQbGF5ZXI6OmRlY29kZShtRmQsIG1PZmZzZXQsIG1MZW5ndGgsICZzYW1wbGVSYXRlLCAmbnVtQ2hhbm5lbHMsICZmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYXAsICZtU2l6ZSk7Ci0gICAgICAgIEFMT0dWKCJjbG9zZSglZCkiLCBtRmQpOwotICAgICAgICA6OmNsb3NlKG1GZCk7Ci0gICAgICAgIG1GZCA9IC0xOwotICAgIH0KLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJVbmFibGUgdG8gbG9hZCBzYW1wbGU6ICVzIiwgbVVybCk7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotICAgIEFMT0dWKCJwb2ludGVyID0gJXAsIHNpemUgPSAlenUsIHNhbXBsZVJhdGUgPSAldSwgbnVtQ2hhbm5lbHMgPSAlZCIsCi0gICAgICAgICAgbUhlYXAtPmdldEJhc2UoKSwgbVNpemUsIHNhbXBsZVJhdGUsIG51bUNoYW5uZWxzKTsKLQotICAgIGlmIChzYW1wbGVSYXRlID4ga01heFNhbXBsZVJhdGUpIHsKLSAgICAgICBBTE9HRSgiU2FtcGxlIHJhdGUgKCV1KSBvdXQgb2YgcmFuZ2UiLCBzYW1wbGVSYXRlKTsKLSAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICBpZiAoKG51bUNoYW5uZWxzIDwgMSkgfHwgKG51bUNoYW5uZWxzID4gMikpIHsKLSAgICAgICAgQUxPR0UoIlNhbXBsZSBjaGFubmVsIGNvdW50ICglZCkgb3V0IG9mIHJhbmdlIiwgbnVtQ2hhbm5lbHMpOwotICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgbURhdGEgPSBuZXcgTWVtb3J5QmFzZShtSGVhcCwgMCwgbVNpemUpOwotICAgIG1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKLSAgICBtTnVtQ2hhbm5lbHMgPSBudW1DaGFubmVsczsKLSAgICBtRm9ybWF0ID0gZm9ybWF0OwotICAgIG1TdGF0ZSA9IFJFQURZOwotICAgIHJldHVybiBOT19FUlJPUjsKLQotZXJyb3I6Ci0gICAgbUhlYXAuY2xlYXIoKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi0KLXZvaWQgU291bmRDaGFubmVsOjppbml0KFNvdW5kUG9vbCogc291bmRQb29sKQotewotICAgIG1Tb3VuZFBvb2wgPSBzb3VuZFBvb2w7Ci19Ci0KLS8vIGNhbGwgd2l0aCBzb3VuZCBwb29sIGxvY2sgaGVsZAotdm9pZCBTb3VuZENoYW5uZWw6OnBsYXkoY29uc3Qgc3A8U2FtcGxlPiYgc2FtcGxlLCBpbnQgbmV4dENoYW5uZWxJRCwgZmxvYXQgbGVmdFZvbHVtZSwKLSAgICAgICAgZmxvYXQgcmlnaHRWb2x1bWUsIGludCBwcmlvcml0eSwgaW50IGxvb3AsIGZsb2F0IHJhdGUpCi17Ci0gICAgc3A8QXVkaW9UcmFjaz4gb2xkVHJhY2s7Ci0gICAgc3A8QXVkaW9UcmFjaz4gbmV3VHJhY2s7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzOwotCi0gICAgeyAvLyBzY29wZSBmb3IgdGhlIGxvY2sKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soJm1Mb2NrKTsKLQotICAgICAgICBBTE9HVigiU291bmRDaGFubmVsOjpwbGF5ICVwOiBzYW1wbGVJRD0lZCwgY2hhbm5lbElEPSVkLCBsZWZ0Vm9sdW1lPSVmLCByaWdodFZvbHVtZT0lZiwiCi0gICAgICAgICAgICAgICAgIiBwcmlvcml0eT0lZCwgbG9vcD0lZCwgcmF0ZT0lZiIsCi0gICAgICAgICAgICAgICAgdGhpcywgc2FtcGxlLT5zYW1wbGVJRCgpLCBuZXh0Q2hhbm5lbElELCBsZWZ0Vm9sdW1lLCByaWdodFZvbHVtZSwKLSAgICAgICAgICAgICAgICBwcmlvcml0eSwgbG9vcCwgcmF0ZSk7Ci0KLSAgICAgICAgLy8gaWYgbm90IGlkbGUsIHRoaXMgdm9pY2UgaXMgYmVpbmcgc3RvbGVuCi0gICAgICAgIGlmIChtU3RhdGUgIT0gSURMRSkgewotICAgICAgICAgICAgQUxPR1YoImNoYW5uZWwgJWQgc3RvbGVuIC0gZXZlbnQgcXVldWVkIGZvciBjaGFubmVsICVkIiwgY2hhbm5lbElEKCksIG5leHRDaGFubmVsSUQpOwotICAgICAgICAgICAgbU5leHRFdmVudC5zZXQoc2FtcGxlLCBuZXh0Q2hhbm5lbElELCBsZWZ0Vm9sdW1lLCByaWdodFZvbHVtZSwgcHJpb3JpdHksIGxvb3AsIHJhdGUpOwotICAgICAgICAgICAgc3RvcF9sKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpbml0aWFsaXplIHRyYWNrCi0gICAgICAgIHNpemVfdCBhZkZyYW1lQ291bnQ7Ci0gICAgICAgIHVpbnQzMl90IGFmU2FtcGxlUmF0ZTsKLSAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlID0gYXVkaW9fYXR0cmlidXRlc190b19zdHJlYW1fdHlwZShtU291bmRQb29sLT5hdHRyaWJ1dGVzKCkpOwotICAgICAgICBpZiAoQXVkaW9TeXN0ZW06OmdldE91dHB1dEZyYW1lQ291bnQoJmFmRnJhbWVDb3VudCwgc3RyZWFtVHlwZSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGFmRnJhbWVDb3VudCA9IGtEZWZhdWx0RnJhbWVDb3VudDsKLSAgICAgICAgfQotICAgICAgICBpZiAoQXVkaW9TeXN0ZW06OmdldE91dHB1dFNhbXBsaW5nUmF0ZSgmYWZTYW1wbGVSYXRlLCBzdHJlYW1UeXBlKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgYWZTYW1wbGVSYXRlID0ga0RlZmF1bHRTYW1wbGVSYXRlOwotICAgICAgICB9Ci0gICAgICAgIGludCBudW1DaGFubmVscyA9IHNhbXBsZS0+bnVtQ2hhbm5lbHMoKTsKLSAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IHVpbnQzMl90KGZsb2F0KHNhbXBsZS0+c2FtcGxlUmF0ZSgpKSAqIHJhdGUgKyAwLjUpOwotICAgICAgICB1aW50MzJfdCB0b3RhbEZyYW1lcyA9IChrRGVmYXVsdEJ1ZmZlckNvdW50ICogYWZGcmFtZUNvdW50ICogc2FtcGxlUmF0ZSkgLyBhZlNhbXBsZVJhdGU7Ci0gICAgICAgIHVpbnQzMl90IGJ1ZmZlckZyYW1lcyA9ICh0b3RhbEZyYW1lcyArIChrRGVmYXVsdEJ1ZmZlckNvdW50IC0gMSkpIC8ga0RlZmF1bHRCdWZmZXJDb3VudDsKLSAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSAwOwotCi0gICAgICAgIGlmIChsb29wKSB7Ci0gICAgICAgICAgICBmcmFtZUNvdW50ID0gc2FtcGxlLT5zaXplKCkvbnVtQ2hhbm5lbHMvCi0gICAgICAgICAgICAgICAgKChzYW1wbGUtPmZvcm1hdCgpID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSA/IHNpemVvZihpbnQxNl90KSA6IHNpemVvZih1aW50OF90KSk7Ci0gICAgICAgIH0KLQotI2lmbmRlZiBVU0VfU0hBUkVEX01FTV9CVUZGRVIKLSAgICAgICAgLy8gRW5zdXJlIG1pbmltdW0gYXVkaW8gYnVmZmVyIHNpemUgaW4gY2FzZSBvZiBzaG9ydCBsb29wZWQgc2FtcGxlCi0gICAgICAgIGlmKGZyYW1lQ291bnQgPCB0b3RhbEZyYW1lcykgewotICAgICAgICAgICAgZnJhbWVDb3VudCA9IHRvdGFsRnJhbWVzOwotICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgICAvLyBtVG9nZ2xlIHRvZ2dsZXMgZWFjaCB0aW1lIGEgdHJhY2sgaXMgc3RhcnRlZCBvbiBhIGdpdmVuIGNoYW5uZWwuCi0gICAgICAgIC8vIFRoZSB0b2dnbGUgaXMgY29uY2F0ZW5hdGVkIHdpdGggdGhlIFNvdW5kQ2hhbm5lbCBhZGRyZXNzIGFuZCBwYXNzZWQgdG8gQXVkaW9UcmFjawotICAgICAgICAvLyBhcyBjYWxsYmFjayB1c2VyIGRhdGEuIFRoaXMgZW5hYmxlcyB0aGUgZGV0ZWN0aW9uIG9mIGNhbGxiYWNrcyByZWNlaXZlZCBmcm9tIHRoZSBvbGQKLSAgICAgICAgLy8gYXVkaW8gdHJhY2sgd2hpbGUgdGhlIG5ldyBvbmUgaXMgYmVpbmcgc3RhcnRlZCBhbmQgYXZvaWRzIHByb2Nlc3NpbmcgdGhlbSB3aXRoCi0gICAgICAgIC8vIHdyb25nIGF1ZGlvIGF1ZGlvIGJ1ZmZlciBzaXplICAobUF1ZGlvQnVmZmVyU2l6ZSkKLSAgICAgICAgdW5zaWduZWQgbG9uZyB0b2dnbGUgPSBtVG9nZ2xlIF4gMTsKLSAgICAgICAgdm9pZCAqdXNlckRhdGEgPSAodm9pZCAqKSgodW5zaWduZWQgbG9uZyl0aGlzIHwgdG9nZ2xlKTsKLSAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQobnVtQ2hhbm5lbHMpOwotCi0gICAgICAgIC8vIGRvIG5vdCBjcmVhdGUgYSBuZXcgYXVkaW8gdHJhY2sgaWYgY3VycmVudCB0cmFjayBpcyBjb21wYXRpYmxlIHdpdGggc2FtcGxlIHBhcmFtZXRlcnMKLSNpZmRlZiBVU0VfU0hBUkVEX01FTV9CVUZGRVIKLSAgICAgICAgbmV3VHJhY2sgPSBuZXcgQXVkaW9UcmFjayhzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBzYW1wbGUtPmZvcm1hdCgpLAotICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBzYW1wbGUtPmdldElNZW1vcnkoKSwgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCwgY2FsbGJhY2ssIHVzZXJEYXRhKTsKLSNlbHNlCi0gICAgICAgIG5ld1RyYWNrID0gbmV3IEF1ZGlvVHJhY2soc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgc2FtcGxlLT5mb3JtYXQoKSwKLSAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCwgY2FsbGJhY2ssIHVzZXJEYXRhLAotICAgICAgICAgICAgICAgIGJ1ZmZlckZyYW1lcyk7Ci0jZW5kaWYKLSAgICAgICAgb2xkVHJhY2sgPSBtQXVkaW9UcmFjazsKLSAgICAgICAgc3RhdHVzID0gbmV3VHJhY2stPmluaXRDaGVjaygpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRXJyb3IgY3JlYXRpbmcgQXVkaW9UcmFjayIpOwotICAgICAgICAgICAgZ290byBleGl0OwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJzZXRWb2x1bWUgJXAiLCBuZXdUcmFjay5nZXQoKSk7Ci0gICAgICAgIG5ld1RyYWNrLT5zZXRWb2x1bWUobGVmdFZvbHVtZSwgcmlnaHRWb2x1bWUpOwotICAgICAgICBuZXdUcmFjay0+c2V0TG9vcCgwLCBmcmFtZUNvdW50LCBsb29wKTsKLQotICAgICAgICAvLyBGcm9tIG5vdyBvbiwgQXVkaW9UcmFjayBjYWxsYmFja3MgcmVjZWl2ZWQgd2l0aCBwcmV2aW91cyB0b2dnbGUgdmFsdWUgd2lsbCBiZSBpZ25vcmVkLgotICAgICAgICBtVG9nZ2xlID0gdG9nZ2xlOwotICAgICAgICBtQXVkaW9UcmFjayA9IG5ld1RyYWNrOwotICAgICAgICBtUG9zID0gMDsKLSAgICAgICAgbVNhbXBsZSA9IHNhbXBsZTsKLSAgICAgICAgbUNoYW5uZWxJRCA9IG5leHRDaGFubmVsSUQ7Ci0gICAgICAgIG1Qcmlvcml0eSA9IHByaW9yaXR5OwotICAgICAgICBtTG9vcCA9IGxvb3A7Ci0gICAgICAgIG1MZWZ0Vm9sdW1lID0gbGVmdFZvbHVtZTsKLSAgICAgICAgbVJpZ2h0Vm9sdW1lID0gcmlnaHRWb2x1bWU7Ci0gICAgICAgIG1OdW1DaGFubmVscyA9IG51bUNoYW5uZWxzOwotICAgICAgICBtUmF0ZSA9IHJhdGU7Ci0gICAgICAgIGNsZWFyTmV4dEV2ZW50KCk7Ci0gICAgICAgIG1TdGF0ZSA9IFBMQVlJTkc7Ci0gICAgICAgIG1BdWRpb1RyYWNrLT5zdGFydCgpOwotICAgICAgICBtQXVkaW9CdWZmZXJTaXplID0gbmV3VHJhY2stPmZyYW1lQ291bnQoKSpuZXdUcmFjay0+ZnJhbWVTaXplKCk7Ci0gICAgfQotCi1leGl0OgotICAgIEFMT0dWKCJkZWxldGUgb2xkVHJhY2sgJXAiLCBvbGRUcmFjay5nZXQoKSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBtQXVkaW9UcmFjay5jbGVhcigpOwotICAgIH0KLX0KLQotdm9pZCBTb3VuZENoYW5uZWw6Om5leHRFdmVudCgpCi17Ci0gICAgc3A8U2FtcGxlPiBzYW1wbGU7Ci0gICAgaW50IG5leHRDaGFubmVsSUQ7Ci0gICAgZmxvYXQgbGVmdFZvbHVtZTsKLSAgICBmbG9hdCByaWdodFZvbHVtZTsKLSAgICBpbnQgcHJpb3JpdHk7Ci0gICAgaW50IGxvb3A7Ci0gICAgZmxvYXQgcmF0ZTsKLQotICAgIC8vIGNoZWNrIGZvciB2YWxpZCBldmVudAotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soJm1Mb2NrKTsKLSAgICAgICAgbmV4dENoYW5uZWxJRCA9IG1OZXh0RXZlbnQuY2hhbm5lbElEKCk7Ci0gICAgICAgIGlmIChuZXh0Q2hhbm5lbElEICA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HVigic3RvbGVuIGNoYW5uZWwgaGFzIG5vIGV2ZW50Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBzYW1wbGUgPSBtTmV4dEV2ZW50LnNhbXBsZSgpOwotICAgICAgICBsZWZ0Vm9sdW1lID0gbU5leHRFdmVudC5sZWZ0Vm9sdW1lKCk7Ci0gICAgICAgIHJpZ2h0Vm9sdW1lID0gbU5leHRFdmVudC5yaWdodFZvbHVtZSgpOwotICAgICAgICBwcmlvcml0eSA9IG1OZXh0RXZlbnQucHJpb3JpdHkoKTsKLSAgICAgICAgbG9vcCA9IG1OZXh0RXZlbnQubG9vcCgpOwotICAgICAgICByYXRlID0gbU5leHRFdmVudC5yYXRlKCk7Ci0gICAgfQotCi0gICAgQUxPR1YoIlN0YXJ0aW5nIHN0b2xlbiBjaGFubmVsICVkIC0+ICVkIiwgY2hhbm5lbElEKCksIG5leHRDaGFubmVsSUQpOwotICAgIHBsYXkoc2FtcGxlLCBuZXh0Q2hhbm5lbElELCBsZWZ0Vm9sdW1lLCByaWdodFZvbHVtZSwgcHJpb3JpdHksIGxvb3AsIHJhdGUpOwotfQotCi12b2lkIFNvdW5kQ2hhbm5lbDo6Y2FsbGJhY2soaW50IGV2ZW50LCB2b2lkKiB1c2VyLCB2b2lkICppbmZvKQotewotICAgIFNvdW5kQ2hhbm5lbCogY2hhbm5lbCA9IHN0YXRpY19jYXN0PFNvdW5kQ2hhbm5lbCo+KCh2b2lkICopKCh1bnNpZ25lZCBsb25nKXVzZXIgJiB+MSkpOwotCi0gICAgY2hhbm5lbC0+cHJvY2VzcyhldmVudCwgaW5mbywgKHVuc2lnbmVkIGxvbmcpdXNlciAmIDEpOwotfQotCi12b2lkIFNvdW5kQ2hhbm5lbDo6cHJvY2VzcyhpbnQgZXZlbnQsIHZvaWQgKmluZm8sIHVuc2lnbmVkIGxvbmcgdG9nZ2xlKQotewotICAgIC8vQUxPR1YoInByb2Nlc3MoJWQpIiwgbUNoYW5uZWxJRCk7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jaygmbUxvY2spOwotCi0gICAgQXVkaW9UcmFjazo6QnVmZmVyKiBiID0gTlVMTDsKLSAgICBpZiAoZXZlbnQgPT0gQXVkaW9UcmFjazo6RVZFTlRfTU9SRV9EQVRBKSB7Ci0gICAgICAgYiA9IHN0YXRpY19jYXN0PEF1ZGlvVHJhY2s6OkJ1ZmZlciAqPihpbmZvKTsKLSAgICB9Ci0KLSAgICBpZiAobVRvZ2dsZSAhPSB0b2dnbGUpIHsKLSAgICAgICAgQUxPR1YoInByb2Nlc3Mgd3JvbmcgdG9nZ2xlICVwIGNoYW5uZWwgJWQiLCB0aGlzLCBtQ2hhbm5lbElEKTsKLSAgICAgICAgaWYgKGIgIT0gTlVMTCkgewotICAgICAgICAgICAgYi0+c2l6ZSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHNwPFNhbXBsZT4gc2FtcGxlID0gbVNhbXBsZTsKLQotLy8gICAgQUxPR1YoIlNvdW5kQ2hhbm5lbDo6cHJvY2VzcyBldmVudCAlZCIsIGV2ZW50KTsKLQotICAgIGlmIChldmVudCA9PSBBdWRpb1RyYWNrOjpFVkVOVF9NT1JFX0RBVEEpIHsKLQotICAgICAgICAvLyBjaGVjayBmb3Igc3RvcCBzdGF0ZQotICAgICAgICBpZiAoYi0+c2l6ZSA9PSAwKSByZXR1cm47Ci0KLSAgICAgICAgaWYgKG1TdGF0ZSA9PSBJRExFKSB7Ci0gICAgICAgICAgICBiLT5zaXplID0gMDsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzYW1wbGUgIT0gMCkgewotICAgICAgICAgICAgLy8gZmlsbCBidWZmZXIKLSAgICAgICAgICAgIHVpbnQ4X3QqIHEgPSAodWludDhfdCopIGItPmk4OwotICAgICAgICAgICAgc2l6ZV90IGNvdW50ID0gMDsKLQotICAgICAgICAgICAgaWYgKG1Qb3MgPCAoaW50KXNhbXBsZS0+c2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgdWludDhfdCogcCA9IHNhbXBsZS0+ZGF0YSgpICsgbVBvczsKLSAgICAgICAgICAgICAgICBjb3VudCA9IHNhbXBsZS0+c2l6ZSgpIC0gbVBvczsKLSAgICAgICAgICAgICAgICBpZiAoY291bnQgPiBiLT5zaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50ID0gYi0+c2l6ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVtY3B5KHEsIHAsIGNvdW50KTsKLS8vICAgICAgICAgICAgICBBTE9HVigiZmlsbDogcT0lcCwgcD0lcCwgbVBvcz0ldSwgYi0+c2l6ZT0ldSwgY291bnQ9JWQiLCBxLCBwLCBtUG9zLCBiLT5zaXplLAotLy8gICAgICAgICAgICAgICAgICAgICAgY291bnQpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtUG9zIDwgbUF1ZGlvQnVmZmVyU2l6ZSkgewotICAgICAgICAgICAgICAgIGNvdW50ID0gbUF1ZGlvQnVmZmVyU2l6ZSAtIG1Qb3M7Ci0gICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gYi0+c2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBjb3VudCA9IGItPnNpemU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1lbXNldChxLCAwLCBjb3VudCk7Ci0vLyAgICAgICAgICAgICAgQUxPR1YoImZpbGwgZXh0cmE6IHE9JXAsIG1Qb3M9JXUsIGItPnNpemU9JXUsIGNvdW50PSVkIiwgcSwgbVBvcywgYi0+c2l6ZSwgY291bnQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtUG9zICs9IGNvdW50OwotICAgICAgICAgICAgYi0+c2l6ZSA9IGNvdW50OwotICAgICAgICAgICAgLy9BTE9HVigiYnVmZmVyPSVwLCBbMF09JWQiLCBiLT5pMTYsIGItPmkxNlswXSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGV2ZW50ID09IEF1ZGlvVHJhY2s6OkVWRU5UX1VOREVSUlVOIHx8IGV2ZW50ID09IEF1ZGlvVHJhY2s6OkVWRU5UX0JVRkZFUl9FTkQgfHwKLSAgICAgICAgICAgIGV2ZW50ID09IEF1ZGlvVHJhY2s6OkVWRU5UX05FV19JQVVESU9UUkFDSykgewotICAgICAgICBBTE9HVigicHJvY2VzcyAlcCBjaGFubmVsICVkIGV2ZW50ICVzIiwKLSAgICAgICAgICAgICAgdGhpcywgbUNoYW5uZWxJRCwgKGV2ZW50ID09IEF1ZGlvVHJhY2s6OkVWRU5UX1VOREVSUlVOKSA/ICJVTkRFUlJVTiIgOgotICAgICAgICAgICAgICAgICAgICAgIChldmVudCA9PSBBdWRpb1RyYWNrOjpFVkVOVF9CVUZGRVJfRU5EKSA/ICJCVUZGRVJfRU5EIiA6ICJORVdfSUFVRElPVFJBQ0siKTsKLSAgICAgICAgbVNvdW5kUG9vbC0+YWRkVG9TdG9wTGlzdCh0aGlzKTsKLSAgICB9IGVsc2UgaWYgKGV2ZW50ID09IEF1ZGlvVHJhY2s6OkVWRU5UX0xPT1BfRU5EKSB7Ci0gICAgICAgIEFMT0dWKCJFbmQgbG9vcCAlcCBjaGFubmVsICVkIiwgdGhpcywgbUNoYW5uZWxJRCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1coIlNvdW5kQ2hhbm5lbDo6cHJvY2VzcyB1bmV4cGVjdGVkIGV2ZW50ICVkIiwgZXZlbnQpOwotICAgIH0KLX0KLQotCi0vLyBjYWxsIHdpdGggbG9jayBoZWxkCi1ib29sIFNvdW5kQ2hhbm5lbDo6ZG9TdG9wX2woKQotewotICAgIGlmIChtU3RhdGUgIT0gSURMRSkgewotICAgICAgICBzZXRWb2x1bWVfbCgwLCAwKTsKLSAgICAgICAgQUxPR1YoInN0b3AiKTsKLSAgICAgICAgbUF1ZGlvVHJhY2stPnN0b3AoKTsKLSAgICAgICAgbVNhbXBsZS5jbGVhcigpOwotICAgICAgICBtU3RhdGUgPSBJRExFOwotICAgICAgICBtUHJpb3JpdHkgPSBJRExFX1BSSU9SSVRZOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vLyBjYWxsIHdpdGggbG9jayBoZWxkIGFuZCBzb3VuZCBwb29sIGxvY2sgaGVsZAotdm9pZCBTb3VuZENoYW5uZWw6OnN0b3BfbCgpCi17Ci0gICAgaWYgKGRvU3RvcF9sKCkpIHsKLSAgICAgICAgbVNvdW5kUG9vbC0+ZG9uZV9sKHRoaXMpOwotICAgIH0KLX0KLQotLy8gY2FsbCB3aXRoIHNvdW5kIHBvb2wgbG9jayBoZWxkCi12b2lkIFNvdW5kQ2hhbm5lbDo6c3RvcCgpCi17Ci0gICAgYm9vbCBzdG9wcGVkOwotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soJm1Mb2NrKTsKLSAgICAgICAgc3RvcHBlZCA9IGRvU3RvcF9sKCk7Ci0gICAgfQotCi0gICAgaWYgKHN0b3BwZWQpIHsKLSAgICAgICAgbVNvdW5kUG9vbC0+ZG9uZV9sKHRoaXMpOwotICAgIH0KLX0KLQotLy9GSVhNRTogUGF1c2UgaXMgYSBsaXR0bGUgYnJva2VuIHJpZ2h0IG5vdwotdm9pZCBTb3VuZENoYW5uZWw6OnBhdXNlKCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jaygmbUxvY2spOwotICAgIGlmIChtU3RhdGUgPT0gUExBWUlORykgewotICAgICAgICBBTE9HVigicGF1c2UgdHJhY2siKTsKLSAgICAgICAgbVN0YXRlID0gUEFVU0VEOwotICAgICAgICBtQXVkaW9UcmFjay0+cGF1c2UoKTsKLSAgICB9Ci19Ci0KLXZvaWQgU291bmRDaGFubmVsOjphdXRvUGF1c2UoKQotewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKCZtTG9jayk7Ci0gICAgaWYgKG1TdGF0ZSA9PSBQTEFZSU5HKSB7Ci0gICAgICAgIEFMT0dWKCJwYXVzZSB0cmFjayIpOwotICAgICAgICBtU3RhdGUgPSBQQVVTRUQ7Ci0gICAgICAgIG1BdXRvUGF1c2VkID0gdHJ1ZTsKLSAgICAgICAgbUF1ZGlvVHJhY2stPnBhdXNlKCk7Ci0gICAgfQotfQotCi12b2lkIFNvdW5kQ2hhbm5lbDo6cmVzdW1lKCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jaygmbUxvY2spOwotICAgIGlmIChtU3RhdGUgPT0gUEFVU0VEKSB7Ci0gICAgICAgIEFMT0dWKCJyZXN1bWUgdHJhY2siKTsKLSAgICAgICAgbVN0YXRlID0gUExBWUlORzsKLSAgICAgICAgbUF1dG9QYXVzZWQgPSBmYWxzZTsKLSAgICAgICAgbUF1ZGlvVHJhY2stPnN0YXJ0KCk7Ci0gICAgfQotfQotCi12b2lkIFNvdW5kQ2hhbm5lbDo6YXV0b1Jlc3VtZSgpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soJm1Mb2NrKTsKLSAgICBpZiAobUF1dG9QYXVzZWQgJiYgKG1TdGF0ZSA9PSBQQVVTRUQpKSB7Ci0gICAgICAgIEFMT0dWKCJyZXN1bWUgdHJhY2siKTsKLSAgICAgICAgbVN0YXRlID0gUExBWUlORzsKLSAgICAgICAgbUF1dG9QYXVzZWQgPSBmYWxzZTsKLSAgICAgICAgbUF1ZGlvVHJhY2stPnN0YXJ0KCk7Ci0gICAgfQotfQotCi12b2lkIFNvdW5kQ2hhbm5lbDo6c2V0UmF0ZShmbG9hdCByYXRlKQotewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKCZtTG9jayk7Ci0gICAgaWYgKG1BdWRpb1RyYWNrICE9IE5VTEwgJiYgbVNhbXBsZSAhPSAwKSB7Ci0gICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSB1aW50MzJfdChmbG9hdChtU2FtcGxlLT5zYW1wbGVSYXRlKCkpICogcmF0ZSArIDAuNSk7Ci0gICAgICAgIG1BdWRpb1RyYWNrLT5zZXRTYW1wbGVSYXRlKHNhbXBsZVJhdGUpOwotICAgICAgICBtUmF0ZSA9IHJhdGU7Ci0gICAgfQotfQotCi0vLyBjYWxsIHdpdGggbG9jayBoZWxkCi12b2lkIFNvdW5kQ2hhbm5lbDo6c2V0Vm9sdW1lX2woZmxvYXQgbGVmdFZvbHVtZSwgZmxvYXQgcmlnaHRWb2x1bWUpCi17Ci0gICAgbUxlZnRWb2x1bWUgPSBsZWZ0Vm9sdW1lOwotICAgIG1SaWdodFZvbHVtZSA9IHJpZ2h0Vm9sdW1lOwotICAgIGlmIChtQXVkaW9UcmFjayAhPSBOVUxMKQotICAgICAgICBtQXVkaW9UcmFjay0+c2V0Vm9sdW1lKGxlZnRWb2x1bWUsIHJpZ2h0Vm9sdW1lKTsKLX0KLQotdm9pZCBTb3VuZENoYW5uZWw6OnNldFZvbHVtZShmbG9hdCBsZWZ0Vm9sdW1lLCBmbG9hdCByaWdodFZvbHVtZSkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jaygmbUxvY2spOwotICAgIHNldFZvbHVtZV9sKGxlZnRWb2x1bWUsIHJpZ2h0Vm9sdW1lKTsKLX0KLQotdm9pZCBTb3VuZENoYW5uZWw6OnNldExvb3AoaW50IGxvb3ApCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soJm1Mb2NrKTsKLSAgICBpZiAobUF1ZGlvVHJhY2sgIT0gTlVMTCAmJiBtU2FtcGxlICE9IDApIHsKLSAgICAgICAgdWludDMyX3QgbG9vcEVuZCA9IG1TYW1wbGUtPnNpemUoKS9tTnVtQ2hhbm5lbHMvCi0gICAgICAgICAgICAoKG1TYW1wbGUtPmZvcm1hdCgpID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSA/IHNpemVvZihpbnQxNl90KSA6IHNpemVvZih1aW50OF90KSk7Ci0gICAgICAgIG1BdWRpb1RyYWNrLT5zZXRMb29wKDAsIGxvb3BFbmQsIGxvb3ApOwotICAgICAgICBtTG9vcCA9IGxvb3A7Ci0gICAgfQotfQotCi1Tb3VuZENoYW5uZWw6On5Tb3VuZENoYW5uZWwoKQotewotICAgIEFMT0dWKCJTb3VuZENoYW5uZWwgZGVzdHJ1Y3RvciAlcCIsIHRoaXMpOwotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soJm1Mb2NrKTsKLSAgICAgICAgY2xlYXJOZXh0RXZlbnQoKTsKLSAgICAgICAgZG9TdG9wX2woKTsKLSAgICB9Ci0gICAgLy8gZG8gbm90IGNhbGwgQXVkaW9UcmFjayBkZXN0cnVjdG9yIHdpdGggbUxvY2sgaGVsZCBhcyBpdCB3aWxsIHdhaXQgZm9yIHRoZSBBdWRpb1RyYWNrCi0gICAgLy8gY2FsbGJhY2sgdGhyZWFkIHRvIGV4aXQgd2hpY2ggbWF5IG5lZWQgdG8gZXhlY3V0ZSBwcm9jZXNzKCkgYW5kIGFjcXVpcmUgdGhlIG1Mb2NrLgotICAgIG1BdWRpb1RyYWNrLmNsZWFyKCk7Ci19Ci0KLXZvaWQgU291bmRDaGFubmVsOjpkdW1wKCkKLXsKLSAgICBBTE9HVigibVN0YXRlID0gJWQgbUNoYW5uZWxJRD0lZCwgbU51bUNoYW5uZWxzPSVkLCBtUG9zID0gJWQsIG1Qcmlvcml0eT0lZCwgbUxvb3A9JWQiLAotICAgICAgICAgICAgbVN0YXRlLCBtQ2hhbm5lbElELCBtTnVtQ2hhbm5lbHMsIG1Qb3MsIG1Qcmlvcml0eSwgbUxvb3ApOwotfQotCi12b2lkIFNvdW5kRXZlbnQ6OnNldChjb25zdCBzcDxTYW1wbGU+JiBzYW1wbGUsIGludCBjaGFubmVsSUQsIGZsb2F0IGxlZnRWb2x1bWUsCi0gICAgICAgICAgICBmbG9hdCByaWdodFZvbHVtZSwgaW50IHByaW9yaXR5LCBpbnQgbG9vcCwgZmxvYXQgcmF0ZSkKLXsKLSAgICBtU2FtcGxlID0gc2FtcGxlOwotICAgIG1DaGFubmVsSUQgPSBjaGFubmVsSUQ7Ci0gICAgbUxlZnRWb2x1bWUgPSBsZWZ0Vm9sdW1lOwotICAgIG1SaWdodFZvbHVtZSA9IHJpZ2h0Vm9sdW1lOwotICAgIG1Qcmlvcml0eSA9IHByaW9yaXR5OwotICAgIG1Mb29wID0gbG9vcDsKLSAgICBtUmF0ZSA9cmF0ZTsKLX0KLQotfSAvLyBlbmQgbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL1NvdW5kUG9vbFRocmVhZC5jcHAgYi9tZWRpYS9saWJtZWRpYS9Tb3VuZFBvb2xUaHJlYWQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTNiNDgyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhL1NvdW5kUG9vbFRocmVhZC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiU291bmRQb29sVGhyZWFkIgotI2luY2x1ZGUgInV0aWxzL0xvZy5oIgotCi0jaW5jbHVkZSAiU291bmRQb29sVGhyZWFkLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdm9pZCBTb3VuZFBvb2xUaHJlYWQ6OndyaXRlKFNvdW5kUG9vbE1zZyBtc2cpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jaygmbUxvY2spOwotICAgIHdoaWxlIChtTXNnUXVldWUuc2l6ZSgpID49IG1heE1lc3NhZ2VzKSB7Ci0gICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7Ci0gICAgfQotCi0gICAgLy8gaWYgdGhyZWFkIGlzIHF1aXR0aW5nLCBkb24ndCBhZGQgdG8gcXVldWUKLSAgICBpZiAobVJ1bm5pbmcpIHsKLSAgICAgICAgbU1zZ1F1ZXVlLnB1c2gobXNnKTsKLSAgICAgICAgbUNvbmRpdGlvbi5zaWduYWwoKTsKLSAgICB9Ci19Ci0KLWNvbnN0IFNvdW5kUG9vbE1zZyBTb3VuZFBvb2xUaHJlYWQ6OnJlYWQoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soJm1Mb2NrKTsKLSAgICB3aGlsZSAobU1zZ1F1ZXVlLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7Ci0gICAgfQotICAgIFNvdW5kUG9vbE1zZyBtc2cgPSBtTXNnUXVldWVbMF07Ci0gICAgbU1zZ1F1ZXVlLnJlbW92ZUF0KDApOwotICAgIG1Db25kaXRpb24uc2lnbmFsKCk7Ci0gICAgcmV0dXJuIG1zZzsKLX0KLQotdm9pZCBTb3VuZFBvb2xUaHJlYWQ6OnF1aXQoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soJm1Mb2NrKTsKLSAgICBpZiAobVJ1bm5pbmcpIHsKLSAgICAgICAgbVJ1bm5pbmcgPSBmYWxzZTsKLSAgICAgICAgbU1zZ1F1ZXVlLmNsZWFyKCk7Ci0gICAgICAgIG1Nc2dRdWV1ZS5wdXNoKFNvdW5kUG9vbE1zZyhTb3VuZFBvb2xNc2c6OktJTEwsIDApKTsKLSAgICAgICAgbUNvbmRpdGlvbi5zaWduYWwoKTsKLSAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKLSAgICB9Ci0gICAgQUxPR1YoInJldHVybiBmcm9tIHF1aXQiKTsKLX0KLQotU291bmRQb29sVGhyZWFkOjpTb3VuZFBvb2xUaHJlYWQoU291bmRQb29sKiBzb3VuZFBvb2wpIDoKLSAgICBtU291bmRQb29sKHNvdW5kUG9vbCkKLXsKLSAgICBtTXNnUXVldWUuc2V0Q2FwYWNpdHkobWF4TWVzc2FnZXMpOwotICAgIGlmIChjcmVhdGVUaHJlYWRFdGMoYmVnaW5UaHJlYWQsIHRoaXMsICJTb3VuZFBvb2xUaHJlYWQiKSkgewotICAgICAgICBtUnVubmluZyA9IHRydWU7Ci0gICAgfQotfQotCi1Tb3VuZFBvb2xUaHJlYWQ6On5Tb3VuZFBvb2xUaHJlYWQoKQotewotICAgIHF1aXQoKTsKLX0KLQotaW50IFNvdW5kUG9vbFRocmVhZDo6YmVnaW5UaHJlYWQodm9pZCogYXJnKSB7Ci0gICAgQUxPR1YoImJlZ2luVGhyZWFkIik7Ci0gICAgU291bmRQb29sVGhyZWFkKiBzb3VuZFBvb2xUaHJlYWQgPSAoU291bmRQb29sVGhyZWFkKilhcmc7Ci0gICAgcmV0dXJuIHNvdW5kUG9vbFRocmVhZC0+cnVuKCk7Ci19Ci0KLWludCBTb3VuZFBvb2xUaHJlYWQ6OnJ1bigpIHsKLSAgICBBTE9HVigicnVuIik7Ci0gICAgZm9yICg7OykgewotICAgICAgICBTb3VuZFBvb2xNc2cgbXNnID0gcmVhZCgpOwotICAgICAgICBBTE9HVigiR290IG1lc3NhZ2UgbT0lZCwgbURhdGE9JWQiLCBtc2cubU1lc3NhZ2VUeXBlLCBtc2cubURhdGEpOwotICAgICAgICBzd2l0Y2ggKG1zZy5tTWVzc2FnZVR5cGUpIHsKLSAgICAgICAgY2FzZSBTb3VuZFBvb2xNc2c6OktJTEw6Ci0gICAgICAgICAgICBBTE9HVigiZ29vZGJ5ZSIpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICBjYXNlIFNvdW5kUG9vbE1zZzo6TE9BRF9TQU1QTEU6Ci0gICAgICAgICAgICBkb0xvYWRTYW1wbGUobXNnLm1EYXRhKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1coInJ1bjogVW5yZWNvZ25pemVkIG1lc3NhZ2UgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgIG1zZy5tTWVzc2FnZVR5cGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgU291bmRQb29sVGhyZWFkOjpsb2FkU2FtcGxlKGludCBzYW1wbGVJRCkgewotICAgIHdyaXRlKFNvdW5kUG9vbE1zZyhTb3VuZFBvb2xNc2c6OkxPQURfU0FNUExFLCBzYW1wbGVJRCkpOwotfQotCi12b2lkIFNvdW5kUG9vbFRocmVhZDo6ZG9Mb2FkU2FtcGxlKGludCBzYW1wbGVJRCkgewotICAgIHNwIDxTYW1wbGU+IHNhbXBsZSA9IG1Tb3VuZFBvb2wtPmZpbmRTYW1wbGUoc2FtcGxlSUQpOwotICAgIHN0YXR1c190IHN0YXR1cyA9IC0xOwotICAgIGlmIChzYW1wbGUgIT0gMCkgewotICAgICAgICBzdGF0dXMgPSBzYW1wbGUtPmRvTG9hZCgpOwotICAgIH0KLSAgICBtU291bmRQb29sLT5ub3RpZnkoU291bmRQb29sRXZlbnQoU291bmRQb29sRXZlbnQ6OlNBTVBMRV9MT0FERUQsIHNhbXBsZUlELCBzdGF0dXMpKTsKLX0KLQotfSAvLyBlbmQgbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL1NvdW5kUG9vbFRocmVhZC5oIGIvbWVkaWEvbGlibWVkaWEvU291bmRQb29sVGhyZWFkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlOTY5MDAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWEvU291bmRQb29sVGhyZWFkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBTT1VORFBPT0xUSFJFQURfSF8KLSNkZWZpbmUgU09VTkRQT09MVEhSRUFEX0hfCi0KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgotCi0jaW5jbHVkZSA8bWVkaWEvU291bmRQb29sLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgU291bmRQb29sTXNnIHsKLXB1YmxpYzoKLSAgICBlbnVtIE1lc3NhZ2VUeXBlIHsgSU5WQUxJRCwgS0lMTCwgTE9BRF9TQU1QTEUgfTsKLSAgICBTb3VuZFBvb2xNc2coKSA6IG1NZXNzYWdlVHlwZShJTlZBTElEKSwgbURhdGEoMCkge30KLSAgICBTb3VuZFBvb2xNc2coTWVzc2FnZVR5cGUgTWVzc2FnZVR5cGUsIGludCBkYXRhKSA6Ci0gICAgICAgIG1NZXNzYWdlVHlwZShNZXNzYWdlVHlwZSksIG1EYXRhKGRhdGEpIHt9Ci0gICAgdWludDE2X3QgICAgICAgICBtTWVzc2FnZVR5cGU7Ci0gICAgdWludDE2X3QgICAgICAgICBtRGF0YTsKLX07Ci0KLS8qCi0gKiBUaGlzIGNsYXNzIGhhbmRsZXMgYmFja2dyb3VuZCByZXF1ZXN0cyBmcm9tIHRoZSBTb3VuZFBvb2wKLSAqLwotY2xhc3MgU291bmRQb29sVGhyZWFkIHsKLXB1YmxpYzoKLSAgICBTb3VuZFBvb2xUaHJlYWQoU291bmRQb29sKiBTb3VuZFBvb2wpOwotICAgIH5Tb3VuZFBvb2xUaHJlYWQoKTsKLSAgICB2b2lkIGxvYWRTYW1wbGUoaW50IHNhbXBsZUlEKTsKLSAgICB2b2lkIHF1aXQoKTsKLSAgICB2b2lkIHdyaXRlKFNvdW5kUG9vbE1zZyBtc2cpOwotCi1wcml2YXRlOgotICAgIHN0YXRpYyBjb25zdCBzaXplX3QgbWF4TWVzc2FnZXMgPSA1OwotCi0gICAgc3RhdGljIGludCBiZWdpblRocmVhZCh2b2lkKiBhcmcpOwotICAgIGludCBydW4oKTsKLSAgICB2b2lkIGRvTG9hZFNhbXBsZShpbnQgc2FtcGxlSUQpOwotICAgIGNvbnN0IFNvdW5kUG9vbE1zZyByZWFkKCk7Ci0KLSAgICBNdXRleCAgICAgICAgICAgICAgICAgICBtTG9jazsKLSAgICBDb25kaXRpb24gICAgICAgICAgICAgICBtQ29uZGl0aW9uOwotICAgIFZlY3RvcjxTb3VuZFBvb2xNc2c+ICAgIG1Nc2dRdWV1ZTsKLSAgICBTb3VuZFBvb2wqICAgICAgICAgICAgICBtU291bmRQb29sOwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1SdW5uaW5nOwotfTsKLQotfSAvLyBlbmQgbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8qU09VTkRQT09MVEhSRUFEX0hfKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL1RvbmVHZW5lcmF0b3IuY3BwIGIvbWVkaWEvbGlibWVkaWEvVG9uZUdlbmVyYXRvci5jcHAKaW5kZXggNjFiNmQzNi4uMmNjNDY4NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvVG9uZUdlbmVyYXRvci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvVG9uZUdlbmVyYXRvci5jcHAKQEAgLTI4LDcxOCArMjgsNzE4IEBACiAKIC8vIERlc2NyaXB0b3JzIGZvciBhbGwgYXZhaWxhYmxlIHRvbmVzIChTZWUgVG9uZUdlbmVyYXRvcjo6VG9uZURlc2NyaXB0b3IgY2xhc3MgZGVjbGFyYXRpb24gZm9yIGRldGFpbHMpCiBjb25zdCBUb25lR2VuZXJhdG9yOjpUb25lRGVzY3JpcHRvciBUb25lR2VuZXJhdG9yOjpzVG9uZURlc2NyaXB0b3JzW10gPSB7Ci0gICAgICAgIHsgc2VnbWVudHM6IHt7IGR1cmF0aW9uOiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwgd2F2ZUZyZXE6IHsgMTMzNiwgOTQxLCAwIH0sIDAsIDB9LAotICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfRFRNRl8wCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsIHdhdmVGcmVxOiB7IDEyMDksIDY5NywgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfRFRNRl8xCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsIHdhdmVGcmVxOiB7IDEzMzYsIDY5NywgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfRFRNRl8yCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsIHdhdmVGcmVxOiB7IDE0NzcsIDY5NywgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfRFRNRl8zCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsIHdhdmVGcmVxOiB7IDEyMDksIDc3MCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfRFRNRl80Ci0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsIHdhdmVGcmVxOiB7IDEzMzYsIDc3MCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfRFRNRl81Ci0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsIHdhdmVGcmVxOiB7IDE0NzcsIDc3MCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfRFRNRl82Ci0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsIHdhdmVGcmVxOiB7IDEyMDksIDg1MiwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfRFRNRl83Ci0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsIHdhdmVGcmVxOiB7IDEzMzYsIDg1MiwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfRFRNRl84Ci0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsIHdhdmVGcmVxOiB7IDE0NzcsIDg1MiwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfRFRNRl85Ci0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsIHdhdmVGcmVxOiB7IDEyMDksIDk0MSwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfRFRNRl9TCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsIHdhdmVGcmVxOiB7IDE0NzcsIDk0MSwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfRFRNRl9QCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsIHdhdmVGcmVxOiB7IDE2MzMsIDY5NywgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfRFRNRl9BCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsIHdhdmVGcmVxOiB7IDE2MzMsIDc3MCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9EVE1GX0IKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwgd2F2ZUZyZXE6IHsgMTYzMywgODUyLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9EVE1GX0MKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwgd2F2ZUZyZXE6IHsgMTYzMywgOTQxLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9EVE1GX0QKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwgd2F2ZUZyZXE6IHsgNDI1LCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfRElBTAotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDUwMCAsIHdhdmVGcmVxOiB7IDQyNSwgMCB9LCAwLCAwfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA1MDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfU1VQX0JVU1kKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAyMDAsIHdhdmVGcmVxOiB7IDQyNSwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfQ09OR0VTVElPTgotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDIwMCwgd2F2ZUZyZXE6IHsgNDI1LCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiAwLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX1NVUF9SQURJT19BQ0sKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAyMDAsIHdhdmVGcmVxOiB7IDQyNSwgMCB9LCAwLCAwfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH19LAotICAgICAgICAgIHJlcGVhdENudDogMiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfUkFESU9fTk9UQVZBSUwKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAzMzAsIHdhdmVGcmVxOiB7IDk1MCwgMTQwMCwgMTgwMCwgMCB9LCAwLCAwfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAxMDAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAgLCB3YXZlRnJlcTogeyAwIH0sIDAsIDB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX1NVUF9FUlJPUgotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDIwMCwgd2F2ZUZyZXE6IHsgNDI1LCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA2MDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDIwMCwgd2F2ZUZyZXE6IHsgNDI1LCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAzMDAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfQ0FMTF9XQUlUSU5HCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMTAwMCwgd2F2ZUZyZXE6IHsgNDI1LCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA0MDAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfUklOR1RPTkUKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiA0MCwgd2F2ZUZyZXE6IHsgNDAwLCAxMjAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiAwLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX1BST1BfQkVFUAotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDEwMCwgd2F2ZUZyZXE6IHsgMTIwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMTAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH19LAotICAgICAgICAgIHJlcGVhdENudDogMSwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9QUk9QX0FDSwotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDQwMCwgd2F2ZUZyZXE6IHsgMzAwLCA0MDAsIDUwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH19LAotICAgICAgICAgIHJlcGVhdENudDogMCwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9QUk9QX05BQ0sKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAyMDAsIHdhdmVGcmVxOiB7IDQwMCwgMTIwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH19LAotICAgICAgICAgIHJlcGVhdENudDogMCwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9QUk9QX1BST01QVAotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDQwLCB3YXZlRnJlcTogeyA0MDAsIDEyMDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDIwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNDAsIHdhdmVGcmVxOiB7IDQwMCwgMTIwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH19LAotICAgICAgICAgIHJlcGVhdENudDogMCwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX1BST1BfQkVFUDIKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAyNTAsIHdhdmVGcmVxOiB7IDQ0MCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUwLCB3YXZlRnJlcTogeyA2MjAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAgLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfSU5URVJDRVBUCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMjUwLCB3YXZlRnJlcTogeyA0NDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1MCwgd2F2ZUZyZXE6IHsgNjIwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiA3LAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfU1VQX0lOVEVSQ0VQVF9BQkJSRVYKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAyNTAsIHdhdmVGcmVxOiB7IDQ4MCwgNjIwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNTAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAgLCB3YXZlRnJlcTogeyAwIH0sIDAsIDB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IDcsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfQ09OR0VTVElPTl9BQkJSRVYKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAxMDAsIHdhdmVGcmVxOiB7IDM1MCwgNDQwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAxMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAgLCB3YXZlRnJlcTogeyAwIH0sIDAsIDB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IDIsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfQ09ORklSTQotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDEwMCwgd2F2ZUZyZXE6IHsgNDgwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAxMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAgLCB3YXZlRnJlcTogeyAwIH0sIDAsIDB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IDMsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfU1VQX1BJUAotICAgICAgICB7IHNlZ21lbnRzOiB7eyBkdXJhdGlvbjogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsIHdhdmVGcmVxOiB7IDQyNSwgMCB9LCAwLCAwfSwKLSAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAgLCB3YXZlRnJlcTogeyAwIH0sIDAsIDB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfRElBTF9UT05FX0xJVEUKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAyMDAwLCB3YXZlRnJlcTogeyA0NDAsIDQ4MCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNDAwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9ORVRXT1JLX1VTQV9SSU5HQkFDSwotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDI1MCwgd2F2ZUZyZXE6IHsgNDQwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNTAsIHdhdmVGcmVxOiB7IDYyMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH19LAotICAgICAgICAgIHJlcGVhdENudDogIFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9JTlRFUkNFUFQKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAyNTAsIHdhdmVGcmVxOiB7IDQ0MCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUwLCB3YXZlRnJlcTogeyA2MjAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAgLCB3YXZlRnJlcTogeyAwIH0sIDAsIDB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6ICAwLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9BQkJSX0lOVEVSQ0VQVAotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDI1MCwgd2F2ZUZyZXE6IHsgNDgwLCA2MjAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1MCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9SRU9SREVSCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMjUwLCB3YXZlRnJlcTogeyA0ODAsIDYyMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiA3LAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfQUJCUl9SRU9SREVSCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogNTAwLCB3YXZlRnJlcTogeyA0ODAsIDYyMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNTAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX05FVFdPUktfQlVTWQotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDEwMCwgd2F2ZUZyZXE6IHsgMzUwLCA0NDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDEwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH19LAotICAgICAgICAgIHJlcGVhdENudDogMiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0NPTkZJUk0KLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiA1MDAsIHdhdmVGcmVxOiB7IDY2MCwgMTAwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH19LAotICAgICAgICAgIHJlcGVhdENudDogMCwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0FOU1dFUgotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDMwMCwgd2F2ZUZyZXE6IHsgNDQwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiAwLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfTkVUV09SS19DQUxMV0FJVElORwotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDEwMCwgd2F2ZUZyZXE6IHsgNDgwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAxMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAgLCB3YXZlRnJlcTogeyAwIH0sIDAsIDB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IDMsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9QSVAKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsIC53YXZlRnJlcSA9IHsgMTMzNiwgOTQxLCAwIH0sIDAsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9EVE1GXzAKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsIC53YXZlRnJlcSA9IHsgMTIwOSwgNjk3LCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfRFRNRl8xCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLCAud2F2ZUZyZXEgPSB7IDEzMzYsIDY5NywgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0RUTUZfMgorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwgLndhdmVGcmVxID0geyAxNDc3LCA2OTcsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9EVE1GXzMKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsIC53YXZlRnJlcSA9IHsgMTIwOSwgNzcwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfRFRNRl80CisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLCAud2F2ZUZyZXEgPSB7IDEzMzYsIDc3MCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0RUTUZfNQorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwgLndhdmVGcmVxID0geyAxNDc3LCA3NzAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9EVE1GXzYKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsIC53YXZlRnJlcSA9IHsgMTIwOSwgODUyLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfRFRNRl83CisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLCAud2F2ZUZyZXEgPSB7IDEzMzYsIDg1MiwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0RUTUZfOAorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwgLndhdmVGcmVxID0geyAxNDc3LCA4NTIsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9EVE1GXzkKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsIC53YXZlRnJlcSA9IHsgMTIwOSwgOTQxLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfRFRNRl9TCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLCAud2F2ZUZyZXEgPSB7IDE0NzcsIDk0MSwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0RUTUZfUAorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwgLndhdmVGcmVxID0geyAxNjMzLCA2OTcsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9EVE1GX0EKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsIC53YXZlRnJlcSA9IHsgMTYzMywgNzcwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9EVE1GX0IKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsIC53YXZlRnJlcSA9IHsgMTYzMywgODUyLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfRFRNRl9DCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLCAud2F2ZUZyZXEgPSB7IDE2MzMsIDk0MSwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0RUTUZfRAorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwgLndhdmVGcmVxID0geyA0MjUsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfRElBTAorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSA1MDAgLCAud2F2ZUZyZXEgPSB7IDQyNSwgMCB9LCAwLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNTAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX1NVUF9CVVNZCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyA0MjUsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX1NVUF9DT05HRVNUSU9OCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyA0MjUsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gMCwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX1NVUF9SQURJT19BQ0sKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMjAwLCAud2F2ZUZyZXEgPSB7IDQyNSwgMCB9LCAwLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSAyLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfU1VQX1JBRElPX05PVEFWQUlMCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDMzMCwgLndhdmVGcmVxID0geyA5NTAsIDE0MDAsIDE4MDAsIDAgfSwgMCwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDEwMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfU1VQX0VSUk9SCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyA0MjUsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA2MDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyA0MjUsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAzMDAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfQ0FMTF9XQUlUSU5HCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDEwMDAsIC53YXZlRnJlcSA9IHsgNDI1LCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNDAwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfU1VQX1JJTkdUT05FCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDQwLCAud2F2ZUZyZXEgPSB7IDQwMCwgMTIwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSAwLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfUFJPUF9CRUVQCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDEwMCwgLndhdmVGcmVxID0geyAxMjAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMTAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IDEsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9QUk9QX0FDSworICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSA0MDAsIC53YXZlRnJlcSA9IHsgMzAwLCA0MDAsIDUwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSAwLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfUFJPUF9OQUNLCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyA0MDAsIDEyMDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gMCwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX1BST1BfUFJPTVBUCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDQwLCAud2F2ZUZyZXEgPSB7IDQwMCwgMTIwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNDAsIC53YXZlRnJlcSA9IHsgNDAwLCAxMjAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IDAsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX1BST1BfQkVFUDIKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMjUwLCAud2F2ZUZyZXEgPSB7IDQ0MCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1MCwgLndhdmVGcmVxID0geyA2MjAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfU1VQX0lOVEVSQ0VQVAorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAyNTAsIC53YXZlRnJlcSA9IHsgNDQwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUwLCAud2F2ZUZyZXEgPSB7IDYyMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSA3LAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfSU5URVJDRVBUX0FCQlJFVgorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAyNTAsIC53YXZlRnJlcSA9IHsgNDgwLCA2MjAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNTAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSA3LAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfQ09OR0VTVElPTl9BQkJSRVYKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMTAwLCAud2F2ZUZyZXEgPSB7IDM1MCwgNDQwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMTAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gMiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfU1VQX0NPTkZJUk0KKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMTAwLCAud2F2ZUZyZXEgPSB7IDQ4MCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDEwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IDMsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfUElQCisgICAgICAgIHsgLnNlZ21lbnRzID0ge3sgLmR1cmF0aW9uID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsIC53YXZlRnJlcSA9IHsgNDI1LCAwIH0sIDAsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfRElBTF9UT05FX0xJVEUKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMjAwMCwgLndhdmVGcmVxID0geyA0NDAsIDQ4MCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDQwMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfTkVUV09SS19VU0FfUklOR0JBQ0sKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMjUwLCAud2F2ZUZyZXEgPSB7IDQ0MCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1MCwgLndhdmVGcmVxID0geyA2MjAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gIFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0lOVEVSQ0VQVAorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAyNTAsIC53YXZlRnJlcSA9IHsgNDQwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUwLCAud2F2ZUZyZXEgPSB7IDYyMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSAgMCwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9BQkJSX0lOVEVSQ0VQVAorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAyNTAsIC53YXZlRnJlcSA9IHsgNDgwLCA2MjAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNTAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfUkVPUkRFUgorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAyNTAsIC53YXZlRnJlcSA9IHsgNDgwLCA2MjAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNTAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSA3LAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9BQkJSX1JFT1JERVIKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gNTAwLCAud2F2ZUZyZXEgPSB7IDQ4MCwgNjIwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNTAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX05FVFdPUktfQlVTWQorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAxMDAsIC53YXZlRnJlcSA9IHsgMzUwLCA0NDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAxMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSAyLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9DT05GSVJNCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDUwMCwgLndhdmVGcmVxID0geyA2NjAsIDEwMDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gMCwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfQU5TV0VSCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDMwMCwgLndhdmVGcmVxID0geyA0NDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gMCwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfTkVUV09SS19DQUxMV0FJVElORworICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAxMDAsIC53YXZlRnJlcSA9IHsgNDgwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMTAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gMywKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfUElQCiAKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAzMiwgd2F2ZUZyZXE6IHsgMjA5MSwgMH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA2NCwgd2F2ZUZyZXE6IHsgMjU1NiwgMH0sIDE5LCAwfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAzMiwgd2F2ZUZyZXE6IHsgMjA5MSwgMH0sIDAsIDB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDQ4LCB3YXZlRnJlcTogeyAyNTU2LCAwfSwgMCwgMH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNDAwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwLCAgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiAwLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9DQUxMX1NJR05BTF9JU0ROX05PUk1BTAotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDMyLCB3YXZlRnJlcTogeyAyMDkxLCAwfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDY0LCB3YXZlRnJlcTogeyAyNTU2LCAwfSwgNywgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDMyLCB3YXZlRnJlcTogeyAyMDkxLCAwfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDQwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMzIsICB3YXZlRnJlcTogeyAyMDkxLCAwfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDY0LCAgd2F2ZUZyZXE6IHsgMjU1NiwgMH0sIDcsIDQgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAzMiwgIHdhdmVGcmVxOiB7IDIwOTEsIDB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNDAwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgICAgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0gfSwKLSAgICAgICAgICByZXBlYXRDbnQ6IDAsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9DQUxMX1NJR05BTF9JU0ROX0lOVEVSR1JPVVAKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAzMiwgd2F2ZUZyZXE6IHsgMjA5MSwgMH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA2NCwgd2F2ZUZyZXE6IHsgMjU1NiwgMH0sIDMsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAxNiwgd2F2ZUZyZXE6IHsgMjA5MSwgMH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyMDAsIHdhdmVGcmVxOiB7IDAgfSwgICAgIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAzMiwgd2F2ZUZyZXE6IHsgMjA5MSwgMH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA2NCwgd2F2ZUZyZXE6IHsgMjU1NiwgMH0sIDMsIDQgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAxNiwgd2F2ZUZyZXE6IHsgMjA5MSwgMH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyMDAsIHdhdmVGcmVxOiB7IDAgfSwgICAgIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwLCAgIHdhdmVGcmVxOiB7IDAgfSwgICAgIDAsIDAgfSB9LAotICAgICAgICAgIHJlcGVhdENudDogMCwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9DQUxMX1NJR05BTF9JU0ROX1NQX1BSSQotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDAsICB3YXZlRnJlcTogeyAwIH0sIDAsIDB9IH0sCi0gICAgICAgICAgcmVwZWF0Q250OiAwLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0NBTExfU0lHTkFMX0lTRE5fUEFUMwotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDMyLCB3YXZlRnJlcTogeyAyMDkxLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA2NCwgd2F2ZUZyZXE6IHsgMjU1NiwgMCB9LCA0LCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjAsIHdhdmVGcmVxOiB7IDIwOTEsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAsICB3YXZlRnJlcTogeyAwIH0gICAgICAsIDAsIDAgfSB9LAotICAgICAgICAgIHJlcGVhdENudDogMCwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfQ0FMTF9TSUdOQUxfSVNETl9QSU5HX1JJTkcKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAwLCAgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfSB9LAotICAgICAgICAgIHJlcGVhdENudDogMCwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfQ0FMTF9TSUdOQUxfSVNETl9QQVQ1Ci0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMCwgIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH0gfSwKLSAgICAgICAgICByZXBlYXRDbnQ6IDAsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0NBTExfU0lHTkFMX0lTRE5fUEFUNgotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDAsICB3YXZlRnJlcTogeyAwIH0sIDAsIDB9IH0sCi0gICAgICAgICAgcmVwZWF0Q250OiAwLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9DQUxMX1NJR05BTF9JU0ROX1BBVDcKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMzIsIC53YXZlRnJlcSA9IHsgMjA5MSwgMH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNjQsIC53YXZlRnJlcSA9IHsgMjU1NiwgMH0sIDE5LCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMzIsIC53YXZlRnJlcSA9IHsgMjA5MSwgMH0sIDAsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA0OCwgLndhdmVGcmVxID0geyAyNTU2LCAwfSwgMCwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDQwMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCwgIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IDAsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfQ0FMTF9TSUdOQUxfSVNETl9OT1JNQUwKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMzIsIC53YXZlRnJlcSA9IHsgMjA5MSwgMH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNjQsIC53YXZlRnJlcSA9IHsgMjU1NiwgMH0sIDcsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMzIsIC53YXZlRnJlcSA9IHsgMjA5MSwgMH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNDAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAzMiwgIC53YXZlRnJlcSA9IHsgMjA5MSwgMH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNjQsICAud2F2ZUZyZXEgPSB7IDI1NTYsIDB9LCA3LCA0IH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDMyLCAgLndhdmVGcmVxID0geyAyMDkxLCAwfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA0MDAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwLCAgICAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9IH0sCisgICAgICAgICAgLnJlcGVhdENudCA9IDAsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0NBTExfU0lHTkFMX0lTRE5fSU5URVJHUk9VUAorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAzMiwgLndhdmVGcmVxID0geyAyMDkxLCAwfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA2NCwgLndhdmVGcmVxID0geyAyNTU2LCAwfSwgMywgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAxNiwgLndhdmVGcmVxID0geyAyMDkxLCAwfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAgICAgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAzMiwgLndhdmVGcmVxID0geyAyMDkxLCAwfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA2NCwgLndhdmVGcmVxID0geyAyNTU2LCAwfSwgMywgNCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAxNiwgLndhdmVGcmVxID0geyAyMDkxLCAwfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAgICAgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwLCAgIC53YXZlRnJlcSA9IHsgMCB9LCAgICAgMCwgMCB9IH0sCisgICAgICAgICAgLnJlcGVhdENudCA9IDAsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9DQUxMX1NJR05BTF9JU0ROX1NQX1BSSQorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAwLCAgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9IH0sCisgICAgICAgICAgLnJlcGVhdENudCA9IDAsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9DQUxMX1NJR05BTF9JU0ROX1BBVDMKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMzIsIC53YXZlRnJlcSA9IHsgMjA5MSwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDY0LCAud2F2ZUZyZXEgPSB7IDI1NTYsIDAgfSwgNCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMCwgLndhdmVGcmVxID0geyAyMDkxLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCwgIC53YXZlRnJlcSA9IHsgMCB9ICAgICAgLCAwLCAwIH0gfSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gMCwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9DQUxMX1NJR05BTF9JU0ROX1BJTkdfUklORworICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAwLCAgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9IH0sCisgICAgICAgICAgLnJlcGVhdENudCA9IDAsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfQ0FMTF9TSUdOQUxfSVNETl9QQVQ1CisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDAsICAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH0gfSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gMCwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9DQUxMX1NJR05BTF9JU0ROX1BBVDYKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMCwgIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfSB9LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSAwLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0NBTExfU0lHTkFMX0lTRE5fUEFUNwogCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDM3MDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyA0MDAwLCAwIH0sIDM5LCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNDAwMCwgd2F2ZUZyZXE6IHsgMCB9LCAgICAgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAsICAgIHdhdmVGcmVxOiB7IDAgfSwgICAgIDAsIDAgfSB9LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9ISUdIX0wKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMjYwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDI5MDAsIDAgfSwgMzksIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA0MDAwLCB3YXZlRnJlcTogeyAwIH0sICAgICAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgICAgd2F2ZUZyZXE6IHsgMCB9LCAgICAgMCwgMCB9IH0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX01FRF9MCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDEzMDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAxNDUwLCAwIH0sIDM5LCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNDAwMCwgd2F2ZUZyZXE6IHsgMCB9LCAgICAgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAsICAgIHdhdmVGcmVxOiB7IDAgfSwgICAgIDAsIDAgfSB9LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9MT1dfTAotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAzNzAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgNDAwMCwgMCB9LCAxNSwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDQwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0gfSwKLSAgICAgICAgICByZXBlYXRDbnQ6IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfSElHSF9TUwotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAyNjAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMjkwMCwgMCB9LCAxNSwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDQwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9NRURfU1MKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMTMwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDE0NTAsIDAgfSwgMTUsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA0MDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfTE9XX1NTCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDM3MDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyA0MDAwLCAwIH0sIDcsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAzNzAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgNDAwMCwgMCB9LCA3LCAzIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMzcwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDQwMDAsIDAgfSwgMTUsIDYgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA0MDAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0hJR0hfU1NMCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDI2MDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAyOTAwLCAwIH0sIDcsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAyNjAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMjkwMCwgMCB9LCA3LCAzIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMjYwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDI5MDAsIDAgfSwgMTUsIDYgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA0MDAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX01FRF9TU0wKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMTMwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDE0NTAsIDAgfSwgNywgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDIwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDEzMDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAxNDUwLCAwIH0sIDcsIDMgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAxMzAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMTQ1MCwgMCB9LCAxNSwgNiB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDQwMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfTE9XX1NTTAotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAzNzAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgNDAwMCwgMCB9LCAxOSwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDEwMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAzNzAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgNDAwMCwgMCB9LCAxOSwgMyB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDMwMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfSElHSF9TU18yCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDI2MDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAyOTAwLCAwIH0sIDE5LCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMTAwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDI2MDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAyOTAwLCAwIH0sIDE5LCAzIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMzAwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9NRURfU1NfMgotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAxMzAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMTQ1MCwgMCB9LCAxOSwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDEwMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAxMzAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMTQ1MCwgMCB9LCAxOSwgMyB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDMwMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfTE9XX1NTXzIKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMzcwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDQwMDAsIDAgfSwgOSwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDUwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDM3MDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyA0MDAwLCAwIH0sIDE5LCAzIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNTAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMzcwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDQwMDAsIDAgfSwgOSwgNiB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDMwMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfSElHSF9TTFMKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMjYwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDI5MDAsIDAgfSwgOSwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDUwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDI2MDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAyOTAwLCAwIH0sIDE5LCAzIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNTAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMjYwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDI5MDAsIDAgfSwgOSwgNiB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDMwMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfTUVEX1NMUwotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAxMzAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMTQ1MCwgMCB9LCA5LCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNTAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMTMwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDE0NTAsIDAgfSwgMTksIDMgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA1MDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAxMzAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMTQ1MCwgMCB9LCA5LCA2IH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMzAwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9MT1dfU0xTCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDM3MDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyA0MDAwLCAwIH0sIDksIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA1MDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAzNzAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgNDAwMCwgMCB9LCA5LCAzIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNTAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMzcwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDQwMDAsIDAgfSwgOSwgNiB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDUwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDM3MDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyA0MDAwLCAwIH0sIDksIDkgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNTAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0hJR0hfU19YNAotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAyNjAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMjkwMCwgMCB9LCA5LCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNTAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMjYwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDI5MDAsIDAgfSwgOSwgMyB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDUwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDI2MDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAyOTAwLCAwIH0sIDksIDYgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA1MDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAyNjAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMjkwMCwgMCB9LCA5LCA5IH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9NRURfU19YNAotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAxMzAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMTQ1MCwgMCB9LCA5LCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNTAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMTMwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDE0NTAsIDAgfSwgOSwgMyB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDUwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDEzMDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAxNDUwLCAwIH0sIDksIDYgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA1MDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAxMzAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMTQ1MCwgMCB9LCA5LCA5IH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9MT1dfU19YNAotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAzNzAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgNDAwMCwgMCB9LCAxOSwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDIwMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfSElHSF9QQlhfTAotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAyNjAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMjkwMCwgMCB9LCAxOSwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDIwMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfTUVEX1BCWF9MCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDEzMDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAxNDUwLCAwIH0sIDE5LCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjAwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9MT1dfUEJYX0wKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMzcwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDQwMDAsIDAgfSwgNywgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDIwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDM3MDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyA0MDAwLCAwIH0sIDcsIDMgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyMDAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0hJR0hfUEJYX1NTCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDI2MDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAyOTAwLCAwIH0sIDcsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAyNjAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMjkwMCwgMCB9LCA3LCAzIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjAwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9NRURfUEJYX1NTCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDEzMDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAxNDUwLCAwIH0sIDcsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAxMzAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMTQ1MCwgMCB9LCA3LCAzIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjAwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9MT1dfUEJYX1NTCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDM3MDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyA0MDAwLCAwIH0sIDcsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAzNzAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgNDAwMCwgMCB9LCA3LCAzIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMzcwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDQwMDAsIDAgfSwgMTUsIDYgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAxMDAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0hJR0hfUEJYX1NTTAotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAyNjAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMjkwMCwgMCB9LCA3LCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMjYwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDI5MDAsIDAgfSwgNywgMyB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDIwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDI2MDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAyOTAwLCAwIH0sIDE1LCA2IH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMTAwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9NRURfUEJYX1NTTAotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAxMzAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMTQ1MCwgMCB9LCA3LCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMTMwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDE0NTAsIDAgfSwgNywgMyB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDIwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDEzMDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAxNDUwLCAwIH0sIDE1LCA2IH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMTAwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9MT1dfUEJYX1NTTAotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAzNzAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgNDAwMCwgMCB9LCA3LCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMzcwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDQwMDAsIDAgfSwgMTUsIDMgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAzNzAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgNDAwMCwgMCB9LCA3LCA2IH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMTAwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9ISUdIX1BCWF9TTFMKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMjYwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDI5MDAsIDAgfSwgNywgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDIwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDI2MDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAyOTAwLCAwIH0sIDE1LCAzIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMjYwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDI5MDAsIDAgfSwgNywgNiB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDEwMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfTUVEX1BCWF9TTFMKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMTMwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDE0NTAsIDAgfSwgNywgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDIwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDEzMDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAxNDUwLCAwIH0sIDE1LCAzIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMTMwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDE0NTAsIDAgfSwgNywgNiB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDEwMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfTE9XX1BCWF9TTFMKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMzcwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDQwMDAsIDAgfSwgNywgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDIwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDM3MDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyA0MDAwLCAwIH0sIDcsIDMgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAzNzAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgNDAwMCwgMCB9LCA3LCA2IH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMzcwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDQwMDAsIDAgfSwgNywgOSB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDgwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9ISUdIX1BCWF9TX1g0Ci0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDI2MDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAyOTAwLCAwIH0sIDcsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAyNjAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMjkwMCwgMCB9LCA3LCAzIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMjYwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDI5MDAsIDAgfSwgNywgNiB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDIwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDI2MDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAyOTAwLCAwIH0sIDcsIDkgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA4MDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfTUVEX1BCWF9TX1g0Ci0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDEzMDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAxNDUwLCAwIH0sIDcsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAxMzAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMTQ1MCwgMCB9LCA3LCAzIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMTMwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDE0NTAsIDAgfSwgNywgNiB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDIwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDEzMDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAxNDUwLCAwIH0sIDcsIDkgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA4MDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfTE9XX1BCWF9TX1g0CisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDM3MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyA0MDAwLCAwIH0sIDM5LCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDQwMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAgICAgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwLCAgICAud2F2ZUZyZXEgPSB7IDAgfSwgICAgIDAsIDAgfSB9LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfSElHSF9MCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDI2MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAyOTAwLCAwIH0sIDM5LCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDQwMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAgICAgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwLCAgICAud2F2ZUZyZXEgPSB7IDAgfSwgICAgIDAsIDAgfSB9LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfTUVEX0wKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTMwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDE0NTAsIDAgfSwgMzksIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNDAwMCwgLndhdmVGcmVxID0geyAwIH0sICAgICAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAsICAgIC53YXZlRnJlcSA9IHsgMCB9LCAgICAgMCwgMCB9IH0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9MT1dfTAorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAzNzAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgNDAwMCwgMCB9LCAxNSwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA0MDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0gfSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0hJR0hfU1MKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMjYwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDI5MDAsIDAgfSwgMTUsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNDAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX01FRF9TUworICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAxMzAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTQ1MCwgMCB9LCAxNSwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA0MDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfTE9XX1NTCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDM3MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyA0MDAwLCAwIH0sIDcsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAzNzAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgNDAwMCwgMCB9LCA3LCAzIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMzcwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDQwMDAsIDAgfSwgMTUsIDYgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNDAwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9ISUdIX1NTTAorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAyNjAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMjkwMCwgMCB9LCA3LCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMjYwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDI5MDAsIDAgfSwgNywgMyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDI2MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAyOTAwLCAwIH0sIDE1LCA2IH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDQwMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfTUVEX1NTTAorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAxMzAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTQ1MCwgMCB9LCA3LCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTMwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDE0NTAsIDAgfSwgNywgMyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDEzMDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAxNDUwLCAwIH0sIDE1LCA2IH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDQwMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfTE9XX1NTTAorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAzNzAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyA0MDAwLCAwIH0sIDE5LCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDEwMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDM3MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyA0MDAwLCAwIH0sIDE5LCAzIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDMwMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfSElHSF9TU18yCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDI2MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAyOTAwLCAwIH0sIDE5LCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDEwMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDI2MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAyOTAwLCAwIH0sIDE5LCAzIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDMwMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfTUVEX1NTXzIKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTMwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDE0NTAsIDAgfSwgMTksIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMTAwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTMwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDE0NTAsIDAgfSwgMTksIDMgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMzAwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9MT1dfU1NfMgorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAzNzAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgNDAwMCwgMCB9LCA5LCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDUwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMzcwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDQwMDAsIDAgfSwgMTksIDMgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNTAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAzNzAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgNDAwMCwgMCB9LCA5LCA2IH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDMwMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfSElHSF9TTFMKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMjYwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDI5MDAsIDAgfSwgOSwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA1MDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDI2MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAyOTAwLCAwIH0sIDE5LCAzIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDUwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMjYwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDI5MDAsIDAgfSwgOSwgNiB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAzMDAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX01FRF9TTFMKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTMwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDE0NTAsIDAgfSwgOSwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA1MDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDEzMDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAxNDUwLCAwIH0sIDE5LCAzIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDUwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTMwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDE0NTAsIDAgfSwgOSwgNiB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAzMDAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0xPV19TTFMKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMzcwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDQwMDAsIDAgfSwgOSwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA1MDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDM3MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyA0MDAwLCAwIH0sIDksIDMgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNTAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAzNzAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgNDAwMCwgMCB9LCA5LCA2IH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDUwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMzcwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDQwMDAsIDAgfSwgOSwgOSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNTAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0hJR0hfU19YNAorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAyNjAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMjkwMCwgMCB9LCA5LCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDUwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMjYwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDI5MDAsIDAgfSwgOSwgMyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA1MDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDI2MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAyOTAwLCAwIH0sIDksIDYgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNTAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAyNjAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMjkwMCwgMCB9LCA5LCA5IH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1MDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfTUVEX1NfWDQKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTMwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDE0NTAsIDAgfSwgOSwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA1MDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDEzMDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAxNDUwLCAwIH0sIDksIDMgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNTAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAxMzAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTQ1MCwgMCB9LCA5LCA2IH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDUwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTMwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDE0NTAsIDAgfSwgOSwgOSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNTAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0xPV19TX1g0CisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDM3MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyA0MDAwLCAwIH0sIDE5LCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfSElHSF9QQlhfTAorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAyNjAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMjkwMCwgMCB9LCAxOSwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMDAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX01FRF9QQlhfTAorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAxMzAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTQ1MCwgMCB9LCAxOSwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMDAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0xPV19QQlhfTAorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAzNzAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgNDAwMCwgMCB9LCA3LCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMzcwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDQwMDAsIDAgfSwgNywgMyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMDAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0hJR0hfUEJYX1NTCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDI2MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAyOTAwLCAwIH0sIDcsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAyNjAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMjkwMCwgMCB9LCA3LCAzIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfTUVEX1BCWF9TUworICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAxMzAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTQ1MCwgMCB9LCA3LCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTMwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDE0NTAsIDAgfSwgNywgMyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMDAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0xPV19QQlhfU1MKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMzcwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDQwMDAsIDAgfSwgNywgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDM3MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyA0MDAwLCAwIH0sIDcsIDMgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAzNzAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgNDAwMCwgMCB9LCAxNSwgNiB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAxMDAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0hJR0hfUEJYX1NTTAorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAyNjAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMjkwMCwgMCB9LCA3LCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMjYwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDI5MDAsIDAgfSwgNywgMyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDI2MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAyOTAwLCAwIH0sIDE1LCA2IH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDEwMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfTUVEX1BCWF9TU0wKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTMwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDE0NTAsIDAgfSwgNywgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDEzMDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAxNDUwLCAwIH0sIDcsIDMgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAxMzAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTQ1MCwgMCB9LCAxNSwgNiB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAxMDAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0xPV19QQlhfU1NMCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDM3MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyA0MDAwLCAwIH0sIDcsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAzNzAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgNDAwMCwgMCB9LCAxNSwgMyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDM3MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyA0MDAwLCAwIH0sIDcsIDYgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMTAwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9ISUdIX1BCWF9TTFMKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMjYwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDI5MDAsIDAgfSwgNywgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDI2MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAyOTAwLCAwIH0sIDE1LCAzIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMjYwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDI5MDAsIDAgfSwgNywgNiB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAxMDAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX01FRF9QQlhfU0xTCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDEzMDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAxNDUwLCAwIH0sIDcsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAxMzAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTQ1MCwgMCB9LCAxNSwgMyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDEzMDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAxNDUwLCAwIH0sIDcsIDYgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMTAwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfX0sCisgICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfTE9XX1BCWF9TTFMKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMzcwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDQwMDAsIDAgfSwgNywgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDM3MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyA0MDAwLCAwIH0sIDcsIDMgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAzNzAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgNDAwMCwgMCB9LCA3LCA2IH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMzcwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDQwMDAsIDAgfSwgNywgOSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA4MDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfSElHSF9QQlhfU19YNAorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAyNjAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMjkwMCwgMCB9LCA3LCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMjYwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDI5MDAsIDAgfSwgNywgMyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDI2MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAyOTAwLCAwIH0sIDcsIDYgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAyNjAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMjkwMCwgMCB9LCA3LCA5IH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDgwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9NRURfUEJYX1NfWDQKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTMwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDE0NTAsIDAgfSwgNywgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDEzMDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAxNDUwLCAwIH0sIDcsIDMgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAxMzAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTQ1MCwgMCB9LCA3LCA2IH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTMwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDE0NTAsIDAgfSwgNywgOSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA4MDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfTE9XX1BCWF9TX1g0CiAKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiA2Miwgd2F2ZUZyZXE6IHsgMTEwOSwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNjIsIHdhdmVGcmVxOiB7IDc4NCwgMCB9LCAgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDYyLCB3YXZlRnJlcTogeyA3NDAsIDAgfSwgIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA2Miwgd2F2ZUZyZXE6IHsgNjIyLCAwIH0sICAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNjIsIHdhdmVGcmVxOiB7IDExMDksIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAsICB3YXZlRnJlcTogeyAwIH0sICAgICAgIDAsIDAgfSB9LAotICAgICAgICAgIHJlcGVhdENudDogMCwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9BTEVSVF9ORVRXT1JLX0xJVEUKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiA2Miwgd2F2ZUZyZXE6IHsgMTI0NSwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNjIsIHdhdmVGcmVxOiB7IDY1OSwgMCB9LCAgMiwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDYyLCB3YXZlRnJlcTogeyAxMjQ1LCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwLCAgd2F2ZUZyZXE6IHsgMCB9LCAgICAgICAwLCAwIH0gfSwKLSAgICAgICAgICByZXBlYXRDbnQ6IDAsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfQUxFUlRfQVVUT1JFRElBTF9MSVRFCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogNDAwLCB3YXZlRnJlcTogeyAxMTUwLCA3NzAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAsICAgd2F2ZUZyZXE6IHsgMCB9LCAgICAgICAgICAgIDAsIDAgfSB9LAotICAgICAgICAgIHJlcGVhdENudDogMCwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9PTkVfTUlOX0JFRVAKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAxMjAsIHdhdmVGcmVxOiB7IDk0MSwgMTQ3NywgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgICB3YXZlRnJlcTogeyAwIH0sICAgICAgICAgICAgMCwgMCB9IH0sCi0gICAgICAgICAgcmVwZWF0Q250OiAwLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0tFWVBBRF9WT0xVTUVfS0VZX0xJVEUKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAzNzUsIHdhdmVGcmVxOiB7IDU4NywgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMTI1LCB3YXZlRnJlcTogeyAxMTc1LCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwLCAgIHdhdmVGcmVxOiB7IDAgfSwgICAgICAgMCwgMCB9IH0sCi0gICAgICAgICAgcmVwZWF0Q250OiAwLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX1BSRVNTSE9MREtFWV9MSVRFCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogNjIsIHdhdmVGcmVxOiB7IDU4NywgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNjIsIHdhdmVGcmVxOiB7IDc4NCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNjIsIHdhdmVGcmVxOiB7IDgzMSwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNjIsIHdhdmVGcmVxOiB7IDc4NCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNjIsIHdhdmVGcmVxOiB7IDExMDksIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDYyLCB3YXZlRnJlcTogeyA3ODQsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDYyLCB3YXZlRnJlcTogeyA4MzEsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDYyLCB3YXZlRnJlcTogeyA3ODQsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAsICB3YXZlRnJlcTogeyAwIH0sICAgICAgMCwgMCB9IH0sCi0gICAgICAgICAgcmVwZWF0Q250OiAwLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9BTEVSVF9JTkNBTExfTElURQotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDEyNSwgd2F2ZUZyZXE6IHsgOTQxLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAxMCwgIHdhdmVGcmVxOiB7IDAgfSwgICAgICAyLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNDk5MCwgd2F2ZUZyZXE6IHsgMCB9LCAgICAgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAsICAgIHdhdmVGcmVxOiB7IDAgfSwgICAgIDAsIDAgfSB9LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfRU1FUkdFTkNZX1JJTkdCQUNLCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMTI1LCB3YXZlRnJlcTogeyAxMzE5LCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAxMjUsIHdhdmVGcmVxOiB7IDAgfSwgICAgICAgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAsICAgd2F2ZUZyZXE6IHsgMCB9LCAgICAgICAwLCAwIH0gfSwKLSAgICAgICAgICByZXBlYXRDbnQ6IDIsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfQUxFUlRfQ0FMTF9HVUFSRAotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDEyNSwgd2F2ZUZyZXE6IHsgMTA0NywgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMTI1LCB3YXZlRnJlcTogeyAzNzAsICAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwLCAgIHdhdmVGcmVxOiB7IDAgfSwgICAgICAgMCwgMCB9IH0sCi0gICAgICAgICAgcmVwZWF0Q250OiAwLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX1NPRlRfRVJST1JfTElURQotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDEyNSwgd2F2ZUZyZXE6IHsgMTQ4MCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMTI1LCB3YXZlRnJlcTogeyAxMzk3LCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAxMjUsIHdhdmVGcmVxOiB7IDc4NCwgMCB9LCAgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAsICAgd2F2ZUZyZXE6IHsgMCB9LCAgICAgICAwLCAwIH0gfSwKLSAgICAgICAgICByZXBlYXRDbnQ6IDAsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfQ0FMTERST1BfTElURQorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSA2MiwgLndhdmVGcmVxID0geyAxMTA5LCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNjIsIC53YXZlRnJlcSA9IHsgNzg0LCAwIH0sICAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDYyLCAud2F2ZUZyZXEgPSB7IDc0MCwgMCB9LCAgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA2MiwgLndhdmVGcmVxID0geyA2MjIsIDAgfSwgIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNjIsIC53YXZlRnJlcSA9IHsgMTEwOSwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAsICAud2F2ZUZyZXEgPSB7IDAgfSwgICAgICAgMCwgMCB9IH0sCisgICAgICAgICAgLnJlcGVhdENudCA9IDAsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9BTEVSVF9ORVRXT1JLX0xJVEUKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gNjIsIC53YXZlRnJlcSA9IHsgMTI0NSwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDYyLCAud2F2ZUZyZXEgPSB7IDY1OSwgMCB9LCAgMiwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA2MiwgLndhdmVGcmVxID0geyAxMjQ1LCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCwgIC53YXZlRnJlcSA9IHsgMCB9LCAgICAgICAwLCAwIH0gfSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gMCwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0FMRVJUX0FVVE9SRURJQUxfTElURQorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSA0MDAsIC53YXZlRnJlcSA9IHsgMTE1MCwgNzcwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCwgICAud2F2ZUZyZXEgPSB7IDAgfSwgICAgICAgICAgICAwLCAwIH0gfSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gMCwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX09ORV9NSU5fQkVFUAorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAxMjAsIC53YXZlRnJlcSA9IHsgOTQxLCAxNDc3LCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCwgICAud2F2ZUZyZXEgPSB7IDAgfSwgICAgICAgICAgICAwLCAwIH0gfSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gMCwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0tFWVBBRF9WT0xVTUVfS0VZX0xJVEUKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMzc1LCAud2F2ZUZyZXEgPSB7IDU4NywgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDEyNSwgLndhdmVGcmVxID0geyAxMTc1LCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCwgICAud2F2ZUZyZXEgPSB7IDAgfSwgICAgICAgMCwgMCB9IH0sCisgICAgICAgICAgLnJlcGVhdENudCA9IDAsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9QUkVTU0hPTERLRVlfTElURQorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSA2MiwgLndhdmVGcmVxID0geyA1ODcsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA2MiwgLndhdmVGcmVxID0geyA3ODQsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA2MiwgLndhdmVGcmVxID0geyA4MzEsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA2MiwgLndhdmVGcmVxID0geyA3ODQsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA2MiwgLndhdmVGcmVxID0geyAxMTA5LCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNjIsIC53YXZlRnJlcSA9IHsgNzg0LCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNjIsIC53YXZlRnJlcSA9IHsgODMxLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNjIsIC53YXZlRnJlcSA9IHsgNzg0LCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCwgIC53YXZlRnJlcSA9IHsgMCB9LCAgICAgIDAsIDAgfSB9LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSAwLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0FMRVJUX0lOQ0FMTF9MSVRFCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDEyNSwgLndhdmVGcmVxID0geyA5NDEsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAxMCwgIC53YXZlRnJlcSA9IHsgMCB9LCAgICAgIDIsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNDk5MCwgLndhdmVGcmVxID0geyAwIH0sICAgICAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAsICAgIC53YXZlRnJlcSA9IHsgMCB9LCAgICAgMCwgMCB9IH0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfRU1FUkdFTkNZX1JJTkdCQUNLCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDEyNSwgLndhdmVGcmVxID0geyAxMzE5LCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMTI1LCAud2F2ZUZyZXEgPSB7IDAgfSwgICAgICAgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwLCAgIC53YXZlRnJlcSA9IHsgMCB9LCAgICAgICAwLCAwIH0gfSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gMiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0FMRVJUX0NBTExfR1VBUkQKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMTI1LCAud2F2ZUZyZXEgPSB7IDEwNDcsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAxMjUsIC53YXZlRnJlcSA9IHsgMzcwLCAgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAsICAgLndhdmVGcmVxID0geyAwIH0sICAgICAgIDAsIDAgfSB9LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSAwLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfU09GVF9FUlJPUl9MSVRFCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDEyNSwgLndhdmVGcmVxID0geyAxNDgwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMTI1LCAud2F2ZUZyZXEgPSB7IDEzOTcsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAxMjUsIC53YXZlRnJlcSA9IHsgNzg0LCAwIH0sICAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAsICAgLndhdmVGcmVxID0geyAwIH0sICAgICAgIDAsIDAgfSB9LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSAwLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfQ0FMTERST1BfTElURQogCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogNTAwLCB3YXZlRnJlcTogeyA0MjUsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDUwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH19LAotICAgICAgICAgIHJlcGVhdENudDogMCwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX05FVFdPUktfQlVTWV9PTkVfU0hPVAotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDQwMCwgd2F2ZUZyZXE6IHsgMTE1MCwgNzcwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiAwLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfQUJCUl9BTEVSVAotICAgICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH19LAotICAgICAgICAgIHJlcGVhdENudDogMCwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9TSUdOQUxfT0ZGCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDUwMCwgLndhdmVGcmVxID0geyA0MjUsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA1MDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSAwLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9ORVRXT1JLX0JVU1lfT05FX1NIT1QKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gNDAwLCAud2F2ZUZyZXEgPSB7IDExNTAsIDc3MCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSAwLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9BQkJSX0FMRVJUCisgICAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IDAsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9TSUdOQUxfT0ZGCiAKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwgd2F2ZUZyZXE6IHsgMzUwLCA0NDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAgLCB3YXZlRnJlcTogeyAwIH0sIDAsIDB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0FOU0lfRElBTAotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDUwMCwgd2F2ZUZyZXE6IHsgNDgwLCA2MjAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDUwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQU5TSV9CVVNZCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMjUwLCB3YXZlRnJlcTogeyA0ODAsIDYyMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9BTlNJX0NPTkdFU1RJT04KLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAzMDAsIHdhdmVGcmVxOiB7IDQ0MCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogOTcwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMTAwLCB3YXZlRnJlcTogeyA0NDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDEwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMTAwLCB3YXZlRnJlcTogeyA0NDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAgLCB3YXZlRnJlcTogeyAwIH0sIDAsIDB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDEgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0FOU0lfQ0FMTF9XQUlUSU5HCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMjAwMCwgd2F2ZUZyZXE6IHsgNDQwLCA0ODAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDQwMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAgLCB3YXZlRnJlcTogeyAwIH0sIDAsIDB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0FOU0lfUklOR1RPTkUKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwgd2F2ZUZyZXE6IHsgNDAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9KQVBBTl9ESUFMCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogNTAwLCB3YXZlRnJlcTogeyA0MDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDUwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfSkFQQU5fQlVTWQotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDEwMDAsIHdhdmVGcmVxOiB7IDQwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjAwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfSkFQQU5fUkFESU9fQUNLCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLCAud2F2ZUZyZXEgPSB7IDM1MCwgNDQwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQU5TSV9ESUFMCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDUwMCwgLndhdmVGcmVxID0geyA0ODAsIDYyMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDUwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQU5TSV9CVVNZCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDI1MCwgLndhdmVGcmVxID0geyA0ODAsIDYyMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1MCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQU5TSV9DT05HRVNUSU9OCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDMwMCwgLndhdmVGcmVxID0geyA0NDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA5NzAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAxMDAsIC53YXZlRnJlcSA9IHsgNDQwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMTAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAxMDAsIC53YXZlRnJlcSA9IHsgNDQwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMSB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQU5TSV9DQUxMX1dBSVRJTkcKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMjAwMCwgLndhdmVGcmVxID0geyA0NDAsIDQ4MCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDQwMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0FOU0lfUklOR1RPTkUKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsIC53YXZlRnJlcSA9IHsgNDAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfSkFQQU5fRElBTAorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSA1MDAsIC53YXZlRnJlcSA9IHsgNDAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNTAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9KQVBBTl9CVVNZCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDEwMDAsIC53YXZlRnJlcSA9IHsgNDAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjAwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfSkFQQU5fUkFESU9fQUNLCiAKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuY3BwCmluZGV4IDM5YTIzOWQuLjhlOGExZWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuY3BwCkBAIC0xNzIsNyArMTcyLDcgQEAKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhzU2VydmljZUxvY2spOwogICAgIGlmIChzU2VydmljZSAhPSAwKSB7Ci0gICAgICAgIHNTZXJ2aWNlLT5hc0JpbmRlcigpLT51bmxpbmtUb0RlYXRoKHRoaXMpOworICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihzU2VydmljZSktPnVubGlua1RvRGVhdGgodGhpcyk7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAKaW5kZXggOTYxMWFjNy4uMDVjODllZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcApAQCAtODM1LDUzICs4MzUsMTIgQEAKICAgICB9CiB9CiAKLS8qc3RhdGljKi8gc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OmRlY29kZSgKLSAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKLSAgICAgICAgY29uc3QgY2hhciogdXJsLAotICAgICAgICB1aW50MzJfdCAqcFNhbXBsZVJhdGUsCi0gICAgICAgIGludCogcE51bUNoYW5uZWxzLAotICAgICAgICBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKLSAgICAgICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwLAotICAgICAgICBzaXplX3QgKnBTaXplKQotewotICAgIEFMT0dWKCJkZWNvZGUoJXMpIiwgdXJsKTsKLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgY29uc3Qgc3A8SU1lZGlhUGxheWVyU2VydmljZT4mIHNlcnZpY2UgPSBnZXRNZWRpYVBsYXllclNlcnZpY2UoKTsKLSAgICBpZiAoc2VydmljZSAhPSAwKSB7Ci0gICAgICAgIHN0YXR1cyA9IHNlcnZpY2UtPmRlY29kZShodHRwU2VydmljZSwgdXJsLCBwU2FtcGxlUmF0ZSwgcE51bUNoYW5uZWxzLCBwRm9ybWF0LCBoZWFwLCBwU2l6ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBsb2NhdGUgbWVkaWEgc2VydmljZSIpOwotICAgICAgICBzdGF0dXMgPSBERUFEX09CSkVDVDsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLQotfQotCiB2b2lkIE1lZGlhUGxheWVyOjpkaWVkKCkKIHsKICAgICBBTE9HVigiZGllZCIpOwogICAgIG5vdGlmeShNRURJQV9FUlJPUiwgTUVESUFfRVJST1JfU0VSVkVSX0RJRUQsIDApOwogfQogCi0vKnN0YXRpYyovIHN0YXR1c190IE1lZGlhUGxheWVyOjpkZWNvZGUoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGVSYXRlLCBpbnQqIHBOdW1DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsIHNpemVfdCAqcFNpemUpCi17Ci0gICAgQUxPR1YoImRlY29kZSglZCwgJSIgUFJJZDY0ICIsICUiIFBSSWQ2NCAiKSIsIGZkLCBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGNvbnN0IHNwPElNZWRpYVBsYXllclNlcnZpY2U+JiBzZXJ2aWNlID0gZ2V0TWVkaWFQbGF5ZXJTZXJ2aWNlKCk7Ci0gICAgaWYgKHNlcnZpY2UgIT0gMCkgewotICAgICAgICBzdGF0dXMgPSBzZXJ2aWNlLT5kZWNvZGUoZmQsIG9mZnNldCwgbGVuZ3RoLCBwU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOdW1DaGFubmVscywgcEZvcm1hdCwgaGVhcCwgcFNpemUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJVbmFibGUgdG8gbG9jYXRlIG1lZGlhIHNlcnZpY2UiKTsKLSAgICAgICAgc3RhdHVzID0gREVBRF9PQkpFQ1Q7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci0KLX0KLQogc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OnNldE5leHRNZWRpYVBsYXllcihjb25zdCBzcDxNZWRpYVBsYXllcj4mIG5leHQpIHsKICAgICBpZiAobVBsYXllciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQubWsgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5tawppbmRleCAyY2Y1NzEwLi45ZDhmZTYyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5tawpAQCAtMTUsOCArMTUsNiBAQAogICAgIE1lZGlhUGxheWVyU2VydmljZS5jcHAgICAgICBcCiAgICAgTWVkaWFSZWNvcmRlckNsaWVudC5jcHAgICAgIFwKICAgICBNZXRhZGF0YVJldHJpZXZlckNsaWVudC5jcHAgXAotICAgIE1pZGlGaWxlLmNwcCAgICAgICAgICAgICAgICBcCi0gICAgTWlkaU1ldGFkYXRhUmV0cmlldmVyLmNwcCAgIFwKICAgICBSZW1vdGVEaXNwbGF5LmNwcCAgICAgICAgICAgXAogICAgIFNoYXJlZExpYnJhcnkuY3BwICAgICAgICAgICBcCiAgICAgU3RhZ2VmcmlnaHRQbGF5ZXIuY3BwICAgICAgIFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9Ecm0uY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RybS5jcHAKaW5kZXggYWM5NDhhNi4uOWQ1YmExNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RybS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RybS5jcHAKQEAgLTg1LDEwICs4NSwxMCBAQAogewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1FdmVudExvY2spOwogICAgIGlmIChtTGlzdGVuZXIgIT0gTlVMTCl7Ci0gICAgICAgIG1MaXN0ZW5lci0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUxpc3RlbmVyKS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKICAgICB9CiAgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKLSAgICAgICAgbGlzdGVuZXItPmFzQmluZGVyKCktPmxpbmtUb0RlYXRoKHRoaXMpOworICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihsaXN0ZW5lciktPmxpbmtUb0RlYXRoKHRoaXMpOwogICAgIH0KICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKICAgICByZXR1cm4gTk9fRVJST1I7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllckZhY3RvcnkuY3BwCmluZGV4IGFlZWZiNGMuLjQ4ODg0YjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllckZhY3RvcnkuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllckZhY3RvcnkuY3BwCkBAIC0xNSw2ICsxNSw3IEBACiAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCiAKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiTWVkaWFQbGF5ZXJGYWN0b3J5IgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCkBAIC0yOSw3ICszMCw2IEBACiAKICNpbmNsdWRlICJNZWRpYVBsYXllckZhY3RvcnkuaCIKIAotI2luY2x1ZGUgIk1pZGlGaWxlLmgiCiAjaW5jbHVkZSAiVGVzdFBsYXllclN0dWIuaCIKICNpbmNsdWRlICJTdGFnZWZyaWdodFBsYXllci5oIgogI2luY2x1ZGUgIm51cGxheWVyL051UGxheWVyRHJpdmVyLmgiCkBAIC0yNzksNzUgKzI3OSw2IEBACiAgICAgfQogfTsKIAotY2xhc3MgU29uaXZveFBsYXllckZhY3RvcnkgOiBwdWJsaWMgTWVkaWFQbGF5ZXJGYWN0b3J5OjpJRmFjdG9yeSB7Ci0gIHB1YmxpYzoKLSAgICB2aXJ0dWFsIGZsb2F0IHNjb3JlRmFjdG9yeShjb25zdCBzcDxJTWVkaWFQbGF5ZXI+JiAvKmNsaWVudCovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjdXJTY29yZSkgewotICAgICAgICBzdGF0aWMgY29uc3QgZmxvYXQga091clNjb3JlID0gMC40OwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciogY29uc3QgRklMRV9FWFRTW10gPSB7ICIubWlkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLm1pZGkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuc21mIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLnhtZiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5teG1mIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLmlteSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5ydHR0bCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5ydHgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIub3RhIiB9OwotICAgICAgICBpZiAoa091clNjb3JlIDw9IGN1clNjb3JlKQotICAgICAgICAgICAgcmV0dXJuIDAuMDsKLQotICAgICAgICAvLyB1c2UgTWlkaUZpbGUgZm9yIE1JREkgZXh0ZW5zaW9ucwotICAgICAgICBpbnQgbGVuVVJMID0gc3RybGVuKHVybCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkVMRU0oRklMRV9FWFRTKTsgKytpKSB7Ci0gICAgICAgICAgICBpbnQgbGVuID0gc3RybGVuKEZJTEVfRVhUU1tpXSk7Ci0gICAgICAgICAgICBpbnQgc3RhcnQgPSBsZW5VUkwgLSBsZW47Ci0gICAgICAgICAgICBpZiAoc3RhcnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCh1cmwgKyBzdGFydCwgRklMRV9FWFRTW2ldLCBsZW4pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBrT3VyU2NvcmU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIDAuMDsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGZsb2F0IHNjb3JlRmFjdG9yeShjb25zdCBzcDxJTWVkaWFQbGF5ZXI+JiAvKmNsaWVudCovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjdXJTY29yZSkgewotICAgICAgICBzdGF0aWMgY29uc3QgZmxvYXQga091clNjb3JlID0gMC44OwotCi0gICAgICAgIGlmIChrT3VyU2NvcmUgPD0gY3VyU2NvcmUpCi0gICAgICAgICAgICByZXR1cm4gMC4wOwotCi0gICAgICAgIC8vIFNvbWUga2luZCBvZiBNSURJPwotICAgICAgICBFQVNfREFUQV9IQU5ETEUgZWFzZGF0YTsKLSAgICAgICAgaWYgKEVBU19Jbml0KCZlYXNkYXRhKSA9PSBFQVNfU1VDQ0VTUykgewotICAgICAgICAgICAgRUFTX0ZJTEUgbG9jYXRvcjsKLSAgICAgICAgICAgIGxvY2F0b3IucGF0aCA9IE5VTEw7Ci0gICAgICAgICAgICBsb2NhdG9yLmZkID0gZmQ7Ci0gICAgICAgICAgICBsb2NhdG9yLm9mZnNldCA9IG9mZnNldDsKLSAgICAgICAgICAgIGxvY2F0b3IubGVuZ3RoID0gbGVuZ3RoOwotICAgICAgICAgICAgRUFTX0hBTkRMRSAgZWFzaGFuZGxlOwotICAgICAgICAgICAgaWYgKEVBU19PcGVuRmlsZShlYXNkYXRhLCAmbG9jYXRvciwgJmVhc2hhbmRsZSkgPT0gRUFTX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICBFQVNfQ2xvc2VGaWxlKGVhc2RhdGEsIGVhc2hhbmRsZSk7Ci0gICAgICAgICAgICAgICAgRUFTX1NodXRkb3duKGVhc2RhdGEpOwotICAgICAgICAgICAgICAgIHJldHVybiBrT3VyU2NvcmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBFQVNfU2h1dGRvd24oZWFzZGF0YSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gMC4wOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3A8TWVkaWFQbGF5ZXJCYXNlPiBjcmVhdGVQbGF5ZXIoKSB7Ci0gICAgICAgIEFMT0dWKCIgY3JlYXRlIE1pZGlGaWxlIik7Ci0gICAgICAgIHJldHVybiBuZXcgTWlkaUZpbGUoKTsKLSAgICB9Ci19OwotCiBjbGFzcyBUZXN0UGxheWVyRmFjdG9yeSA6IHB1YmxpYyBNZWRpYVBsYXllckZhY3Rvcnk6OklGYWN0b3J5IHsKICAgcHVibGljOgogICAgIHZpcnR1YWwgZmxvYXQgc2NvcmVGYWN0b3J5KGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIC8qY2xpZW50Ki8sCkBAIC0zNzQsNyArMzA1LDYgQEAKIAogICAgIHJlZ2lzdGVyRmFjdG9yeV9sKG5ldyBTdGFnZWZyaWdodFBsYXllckZhY3RvcnkoKSwgU1RBR0VGUklHSFRfUExBWUVSKTsKICAgICByZWdpc3RlckZhY3RvcnlfbChuZXcgTnVQbGF5ZXJGYWN0b3J5KCksIE5VX1BMQVlFUik7Ci0gICAgcmVnaXN0ZXJGYWN0b3J5X2wobmV3IFNvbml2b3hQbGF5ZXJGYWN0b3J5KCksIFNPTklWT1hfUExBWUVSKTsKICAgICByZWdpc3RlckZhY3RvcnlfbChuZXcgVGVzdFBsYXllckZhY3RvcnkoKSwgVEVTVF9QTEFZRVIpOwogCiAgICAgc0luaXRDb21wbGV0ZSA9IHRydWU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCmluZGV4IGQ0NjFhZjMuLjY5NGYxYTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCkBAIC01OSw2ICs1OSw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BdWRpb1BsYXllci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmg+CiAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIApAQCAtNzAsNyArNzEsNiBAQAogI2luY2x1ZGUgIk1ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmgiCiAjaW5jbHVkZSAiTWVkaWFQbGF5ZXJGYWN0b3J5LmgiCiAKLSNpbmNsdWRlICJNaWRpRmlsZS5oIgogI2luY2x1ZGUgIlRlc3RQbGF5ZXJTdHViLmgiCiAjaW5jbHVkZSAiU3RhZ2VmcmlnaHRQbGF5ZXIuaCIKICNpbmNsdWRlICJudXBsYXllci9OdVBsYXllckRyaXZlci5oIgpAQCAtMjQ4LDYgKzI0OCw5IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorZXh0ZXJuIEFMb29wZXJSb3N0ZXIgZ0xvb3BlclJvc3RlcjsKKworCiBzdGF0aWMgYm9vbCBjaGVja1Blcm1pc3Npb24oY29uc3QgY2hhciogcGVybWlzc2lvblN0cmluZykgewogI2lmbmRlZiBIQVZFX0FORFJPSURfT1MKICAgICByZXR1cm4gdHJ1ZTsKQEAgLTM4NSwyOCArMzg4LDYgQEAKICAgICByZXR1cm4gbmV3IFJlbW90ZURpc3BsYXkoY2xpZW50LCBpZmFjZS5zdHJpbmcoKSk7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9DYWNoZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIC8qYXJncyovKSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgcmVzdWx0LmFwcGVuZCgiIEF1ZGlvQ2FjaGVcbiIpOwotICAgIGlmIChtSGVhcCAhPSAwKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAiICBoZWFwIGJhc2UoJXApLCBzaXplKCV6dSksIGZsYWdzKCVkKVxuIiwKLSAgICAgICAgICAgICAgICBtSGVhcC0+Z2V0QmFzZSgpLCBtSGVhcC0+Z2V0U2l6ZSgpLCBtSGVhcC0+Z2V0RmxhZ3MoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB9Ci0gICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIG1zZWMgcGVyIGZyYW1lKCVmKSwgY2hhbm5lbCBjb3VudCglZCksIGZvcm1hdCglZCksIGZyYW1lIGNvdW50KCV6ZClcbiIsCi0gICAgICAgICAgICBtTXNlY3NQZXJGcmFtZSwgbUNoYW5uZWxDb3VudCwgbUZvcm1hdCwgbUZyYW1lQ291bnQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgc2FtcGxlIHJhdGUoJWQpLCBzaXplKCVkKSwgZXJyb3IoJWQpLCBjb21tYW5kIGNvbXBsZXRlKCVzKVxuIiwKLSAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtU2l6ZSwgbUVycm9yLCBtQ29tbWFuZENvbXBsZXRlPyJ0cnVlIjoiZmFsc2UiKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgOjp3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KIHN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdAogewogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwpAQCAtNDUxLDYgKzQzMiwxMCBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAorLyoqCisgKiBUaGUgb25seSBhcmd1bWVudHMgdGhpcyB1bmRlcnN0YW5kcyByaWdodCBub3cgYXJlIC1jLCAtdm9uIGFuZCAtdm9mZiwKKyAqIHdoaWNoIGFyZSBwYXJzZWQgYnkgQUxvb3BlclJvc3Rlcjo6ZHVtcCgpCisgKi8KIHN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CkBAIC00ODQsNyArNDY5LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiBGaWxlcyBvcGVuZWQgYW5kL29yIG1hcHBlZDpcbiIpOwotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIvcHJvYy8lZC9tYXBzIiwgZ2V0dGlkKCkpOworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIvcHJvYy8lZC9tYXBzIiwgZ2V0cGlkKCkpOwogICAgICAgICBGSUxFICpmID0gZm9wZW4oYnVmZmVyLCAiciIpOwogICAgICAgICBpZiAoZikgewogICAgICAgICAgICAgd2hpbGUgKCFmZW9mKGYpKSB7CkBAIC01MDQsMTMgKzQ4OSwxMyBAQAogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKICAgICAgICAgfQogCi0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi9wcm9jLyVkL2ZkIiwgZ2V0dGlkKCkpOworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIvcHJvYy8lZC9mZCIsIGdldHBpZCgpKTsKICAgICAgICAgRElSICpkID0gb3BlbmRpcihidWZmZXIpOwogICAgICAgICBpZiAoZCkgewogICAgICAgICAgICAgc3RydWN0IGRpcmVudCAqZW50OwogICAgICAgICAgICAgd2hpbGUoKGVudCA9IHJlYWRkaXIoZCkpICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBpZiAoc3RyY21wKGVudC0+ZF9uYW1lLCIuIikgJiYgc3RyY21wKGVudC0+ZF9uYW1lLCIuLiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi9wcm9jLyVkL2ZkLyVzIiwgZ2V0dGlkKCksIGVudC0+ZF9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiL3Byb2MvJWQvZmQvJXMiLCBnZXRwaWQoKSwgZW50LT5kX25hbWUpOwogICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3RhdCBzOwogICAgICAgICAgICAgICAgICAgICBpZiAobHN0YXQoYnVmZmVyLCAmcykgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzLnN0X21vZGUgJiBTX0lGTVQpID09IFNfSUZMTkspIHsKQEAgLTU1MSw2ICs1MzYsOCBAQAogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKICAgICAgICAgfQogCisgICAgICAgIGdMb29wZXJSb3N0ZXIuZHVtcChmZCwgYXJncyk7CisKICAgICAgICAgYm9vbCBkdW1wTWVtID0gZmFsc2U7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJncy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgaWYgKGFyZ3NbaV0gPT0gU3RyaW5nMTYoIi1tIikpIHsKQEAgLTgxNyw4ICs4MDQsNyBAQAogICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gcCA9IGdldFBsYXllcigpOwogICAgIGlmIChwID09IDApIHJldHVybiBVTktOT1dOX0VSUk9SOwogCi0gICAgc3A8SUJpbmRlcj4gYmluZGVyKGJ1ZmZlclByb2R1Y2VyID09IE5VTEwgPyBOVUxMIDoKLSAgICAgICAgICAgIGJ1ZmZlclByb2R1Y2VyLT5hc0JpbmRlcigpKTsKKyAgICBzcDxJQmluZGVyPiBiaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoYnVmZmVyUHJvZHVjZXIpKTsKICAgICBpZiAobUNvbm5lY3RlZFdpbmRvd0JpbmRlciA9PSBiaW5kZXIpIHsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KQEAgLTEyODEsMTI5ICsxMjY3LDYgQEAKIH0KICNlbmRpZgogCi1zdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OmRlY29kZSgKLSAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKLSAgICAgICAgY29uc3QgY2hhciogdXJsLAotICAgICAgICB1aW50MzJfdCAqcFNhbXBsZVJhdGUsCi0gICAgICAgIGludCogcE51bUNoYW5uZWxzLAotICAgICAgICBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKLSAgICAgICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwLAotICAgICAgICBzaXplX3QgKnBTaXplKQotewotICAgIEFMT0dWKCJkZWNvZGUoJXMpIiwgdXJsKTsKLSAgICBzcDxNZWRpYVBsYXllckJhc2U+IHBsYXllcjsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBCQURfVkFMVUU7Ci0KLSAgICAvLyBQcm90ZWN0IG91ciBwcmVjaW91cywgcHJlY2lvdXMgRFJNZCByaW5ndG9uZXMgYnkgb25seSBhbGxvd2luZwotICAgIC8vIGRlY29kaW5nIG9mIGh0dHAsIGJ1dCBub3QgZmlsZXN5c3RlbSBwYXRocyBvciBjb250ZW50IFVyaXMuCi0gICAgLy8gSWYgdGhlIGFwcGxpY2F0aW9uIHdhbnRzIHRvIGRlY29kZSB0aG9zZSwgaXQgc2hvdWxkIG9wZW4gYQotICAgIC8vIGZpbGVkZXNjcmlwdG9yIGZvciB0aGVtIGFuZCB1c2UgdGhhdC4KLSAgICBpZiAodXJsICE9IE5VTEwgJiYgc3RybmNtcCh1cmwsICJodHRwOi8vIiwgNykgIT0gMCkgewotICAgICAgICBBTE9HRCgiQ2FuJ3QgZGVjb2RlICVzIGJ5IHBhdGgsIHVzZSBmaWxlZGVzY3JpcHRvciBpbnN0ZWFkIiwgdXJsKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBwbGF5ZXJfdHlwZSBwbGF5ZXJUeXBlID0KLSAgICAgICAgTWVkaWFQbGF5ZXJGYWN0b3J5OjpnZXRQbGF5ZXJUeXBlKE5VTEwgLyogY2xpZW50ICovLCB1cmwpOwotICAgIEFMT0dWKCJwbGF5ZXIgdHlwZSA9ICVkIiwgcGxheWVyVHlwZSk7Ci0KLSAgICAvLyBjcmVhdGUgdGhlIHJpZ2h0IHR5cGUgb2YgcGxheWVyCi0gICAgc3A8QXVkaW9DYWNoZT4gY2FjaGUgPSBuZXcgQXVkaW9DYWNoZShoZWFwKTsKLSAgICBwbGF5ZXIgPSBNZWRpYVBsYXllckZhY3Rvcnk6OmNyZWF0ZVBsYXllcihwbGF5ZXJUeXBlLCBjYWNoZS5nZXQoKSwgY2FjaGUtPm5vdGlmeSk7Ci0gICAgaWYgKHBsYXllciA9PSBOVUxMKSBnb3RvIEV4aXQ7Ci0gICAgaWYgKHBsYXllci0+aGFyZHdhcmVPdXRwdXQoKSkgZ290byBFeGl0OwotCi0gICAgc3RhdGljX2Nhc3Q8TWVkaWFQbGF5ZXJJbnRlcmZhY2UqPihwbGF5ZXIuZ2V0KCkpLT5zZXRBdWRpb1NpbmsoY2FjaGUpOwotCi0gICAgLy8gc2V0IGRhdGEgc291cmNlCi0gICAgaWYgKHBsYXllci0+c2V0RGF0YVNvdXJjZShodHRwU2VydmljZSwgdXJsKSAhPSBOT19FUlJPUikgZ290byBFeGl0OwotCi0gICAgQUxPR1YoInByZXBhcmUiKTsKLSAgICBwbGF5ZXItPnByZXBhcmVBc3luYygpOwotCi0gICAgQUxPR1YoIndhaXQgZm9yIHByZXBhcmUiKTsKLSAgICBpZiAoY2FjaGUtPndhaXQoKSAhPSBOT19FUlJPUikgZ290byBFeGl0OwotCi0gICAgQUxPR1YoInN0YXJ0Iik7Ci0gICAgcGxheWVyLT5zdGFydCgpOwotCi0gICAgQUxPR1YoIndhaXQgZm9yIHBsYXliYWNrIGNvbXBsZXRlIik7Ci0gICAgY2FjaGUtPndhaXQoKTsKLSAgICAvLyBpbiBjYXNlIG9mIGVycm9yLCByZXR1cm4gd2hhdCB3YXMgc3VjY2Vzc2Z1bGx5IGRlY29kZWQuCi0gICAgaWYgKGNhY2hlLT5zaXplKCkgPT0gMCkgewotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgKnBTaXplID0gY2FjaGUtPnNpemUoKTsKLSAgICAqcFNhbXBsZVJhdGUgPSBjYWNoZS0+c2FtcGxlUmF0ZSgpOwotICAgICpwTnVtQ2hhbm5lbHMgPSBjYWNoZS0+Y2hhbm5lbENvdW50KCk7Ci0gICAgKnBGb3JtYXQgPSBjYWNoZS0+Zm9ybWF0KCk7Ci0gICAgQUxPR1YoInJldHVybiBzaXplICVkIHNhbXBsZVJhdGU9JXUsIGNoYW5uZWxDb3VudCA9ICVkLCBmb3JtYXQgPSAlZCIsCi0gICAgICAgICAgKnBTaXplLCAqcFNhbXBsZVJhdGUsICpwTnVtQ2hhbm5lbHMsICpwRm9ybWF0KTsKLSAgICBzdGF0dXMgPSBOT19FUlJPUjsKLQotRXhpdDoKLSAgICBpZiAocGxheWVyICE9IDApIHBsYXllci0+cmVzZXQoKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OmRlY29kZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwgaW50KiBwTnVtQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwgc2l6ZV90ICpwU2l6ZSkKLXsKLSAgICBBTE9HVigiZGVjb2RlKCVkLCAlbGxkLCAlbGxkKSIsIGZkLCBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiBwbGF5ZXI7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gQkFEX1ZBTFVFOwotCi0gICAgcGxheWVyX3R5cGUgcGxheWVyVHlwZSA9IE1lZGlhUGxheWVyRmFjdG9yeTo6Z2V0UGxheWVyVHlwZShOVUxMIC8qIGNsaWVudCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKTsKLSAgICBBTE9HVigicGxheWVyIHR5cGUgPSAlZCIsIHBsYXllclR5cGUpOwotCi0gICAgLy8gY3JlYXRlIHRoZSByaWdodCB0eXBlIG9mIHBsYXllcgotICAgIHNwPEF1ZGlvQ2FjaGU+IGNhY2hlID0gbmV3IEF1ZGlvQ2FjaGUoaGVhcCk7Ci0gICAgcGxheWVyID0gTWVkaWFQbGF5ZXJGYWN0b3J5OjpjcmVhdGVQbGF5ZXIocGxheWVyVHlwZSwgY2FjaGUuZ2V0KCksIGNhY2hlLT5ub3RpZnkpOwotICAgIGlmIChwbGF5ZXIgPT0gTlVMTCkgZ290byBFeGl0OwotICAgIGlmIChwbGF5ZXItPmhhcmR3YXJlT3V0cHV0KCkpIGdvdG8gRXhpdDsKLQotICAgIHN0YXRpY19jYXN0PE1lZGlhUGxheWVySW50ZXJmYWNlKj4ocGxheWVyLmdldCgpKS0+c2V0QXVkaW9TaW5rKGNhY2hlKTsKLQotICAgIC8vIHNldCBkYXRhIHNvdXJjZQotICAgIGlmIChwbGF5ZXItPnNldERhdGFTb3VyY2UoZmQsIG9mZnNldCwgbGVuZ3RoKSAhPSBOT19FUlJPUikgZ290byBFeGl0OwotCi0gICAgQUxPR1YoInByZXBhcmUiKTsKLSAgICBwbGF5ZXItPnByZXBhcmVBc3luYygpOwotCi0gICAgQUxPR1YoIndhaXQgZm9yIHByZXBhcmUiKTsKLSAgICBpZiAoY2FjaGUtPndhaXQoKSAhPSBOT19FUlJPUikgZ290byBFeGl0OwotCi0gICAgQUxPR1YoInN0YXJ0Iik7Ci0gICAgcGxheWVyLT5zdGFydCgpOwotCi0gICAgQUxPR1YoIndhaXQgZm9yIHBsYXliYWNrIGNvbXBsZXRlIik7Ci0gICAgY2FjaGUtPndhaXQoKTsKLSAgICAvLyBpbiBjYXNlIG9mIGVycm9yLCByZXR1cm4gd2hhdCB3YXMgc3VjY2Vzc2Z1bGx5IGRlY29kZWQuCi0gICAgaWYgKGNhY2hlLT5zaXplKCkgPT0gMCkgewotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgKnBTaXplID0gY2FjaGUtPnNpemUoKTsKLSAgICAqcFNhbXBsZVJhdGUgPSBjYWNoZS0+c2FtcGxlUmF0ZSgpOwotICAgICpwTnVtQ2hhbm5lbHMgPSBjYWNoZS0+Y2hhbm5lbENvdW50KCk7Ci0gICAgKnBGb3JtYXQgPSBjYWNoZS0+Zm9ybWF0KCk7Ci0gICAgQUxPR1YoInJldHVybiBzaXplICVkLCBzYW1wbGVSYXRlPSV1LCBjaGFubmVsQ291bnQgPSAlZCwgZm9ybWF0ID0gJWQiLAotICAgICAgICAgICpwU2l6ZSwgKnBTYW1wbGVSYXRlLCAqcE51bUNoYW5uZWxzLCAqcEZvcm1hdCk7Ci0gICAgc3RhdHVzID0gTk9fRVJST1I7Ci0KLUV4aXQ6Ci0gICAgaWYgKHBsYXllciAhPSAwKSBwbGF5ZXItPnJlc2V0KCk7Ci0gICAgOjpjbG9zZShmZCk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotCiAjdW5kZWYgTE9HX1RBRwogI2RlZmluZSBMT0dfVEFHICJBdWRpb1NpbmsiCiBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpBdWRpb091dHB1dChpbnQgc2Vzc2lvbklkLCBpbnQgdWlkLCBpbnQgcGlkLApAQCAtMTk1Myw0NyArMTgxNiw2IEBACiAgICAgcmV0dXJuIG1UcmFjay0+Z2V0U2FtcGxlUmF0ZSgpOwogfQogCi0jdW5kZWYgTE9HX1RBRwotI2RlZmluZSBMT0dfVEFHICJBdWRpb0NhY2hlIgotTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb0NhY2hlOjpBdWRpb0NhY2hlKGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCkgOgotICAgIG1IZWFwKGhlYXApLCBtQ2hhbm5lbENvdW50KDApLCBtRnJhbWVDb3VudCgxMDI0KSwgbVNhbXBsZVJhdGUoMCksIG1TaXplKDApLAotICAgIG1GcmFtZVNpemUoMSksIG1FcnJvcihOT19FUlJPUiksICBtQ29tbWFuZENvbXBsZXRlKGZhbHNlKQotewotfQotCi11aW50MzJfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvQ2FjaGU6OmxhdGVuY3kgKCkgY29uc3QKLXsKLSAgICByZXR1cm4gMDsKLX0KLQotZmxvYXQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb0NhY2hlOjptc2Vjc1BlckZyYW1lKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbU1zZWNzUGVyRnJhbWU7Ci19Ci0KLXN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9DYWNoZTo6Z2V0UG9zaXRpb24odWludDMyX3QgKnBvc2l0aW9uKSBjb25zdAotewotICAgIGlmIChwb3NpdGlvbiA9PSAwKSByZXR1cm4gQkFEX1ZBTFVFOwotICAgICpwb3NpdGlvbiA9IG1TaXplIC8gbUZyYW1lU2l6ZTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9DYWNoZTo6Z2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wICZ0cykgY29uc3QKLXsKLSAgICB0cy5tUG9zaXRpb24gPSBtU2l6ZSAvIG1GcmFtZVNpemU7Ci0gICAgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgdHMubVRpbWUudHZfc2VjID0gbm93IC8gMTAwMDAwMDAwMExMOwotICAgIHRzLm1UaW1lLnR2X25zZWMgPSBub3cgLSAoMTAwMDAwMDAwMExMICogdHMubVRpbWUudHZfc2VjKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9DYWNoZTo6Z2V0RnJhbWVzV3JpdHRlbih1aW50MzJfdCAqd3JpdHRlbikgY29uc3QKLXsKLSAgICBpZiAod3JpdHRlbiA9PSAwKSByZXR1cm4gQkFEX1ZBTFVFOwotICAgICp3cml0dGVuID0gbVNpemUgLyBtRnJhbWVTaXplOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogc3RydWN0IENhbGxiYWNrVGhyZWFkIDogcHVibGljIFRocmVhZCB7CkBAIC0yMDYxLDEzOSArMTg4Myw2IEBACiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLXN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9DYWNoZTo6b3BlbigKLSAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50IGNoYW5uZWxDb3VudCwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IGJ1ZmZlckNvdW50LAotICAgICAgICBBdWRpb0NhbGxiYWNrIGNiLCB2b2lkICpjb29raWUsIGF1ZGlvX291dHB1dF9mbGFnc190IC8qZmxhZ3MqLywKLSAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QqIC8qb2ZmbG9hZEluZm8qLykKLXsKLSAgICBBTE9HVigib3BlbigldSwgJWQsIDB4JXgsICVkLCAlZCkiLCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQsIGNoYW5uZWxNYXNrLCBmb3JtYXQsIGJ1ZmZlckNvdW50KTsKLSAgICBpZiAobUhlYXAtPmdldEhlYXBJRCgpIDwgMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0KLSAgICBtU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7Ci0gICAgbUNoYW5uZWxDb3VudCA9ICh1aW50MTZfdCljaGFubmVsQ291bnQ7Ci0gICAgbUZvcm1hdCA9IGZvcm1hdDsKLSAgICBtTXNlY3NQZXJGcmFtZSA9IDEuZTMgLyAoZmxvYXQpIHNhbXBsZVJhdGU7Ci0gICAgbUZyYW1lU2l6ZSA9ICBhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpCi0gICAgICAgICAgICA/IG1DaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKG1Gb3JtYXQpIDogMTsKLSAgICBtRnJhbWVDb3VudCA9IG1IZWFwLT5nZXRTaXplKCkgLyBtRnJhbWVTaXplOwotCi0gICAgaWYgKGNiICE9IE5VTEwpIHsKLSAgICAgICAgbUNhbGxiYWNrVGhyZWFkID0gbmV3IENhbGxiYWNrVGhyZWFkKHRoaXMsIGNiLCBjb29raWUpOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9DYWNoZTo6c3RhcnQoKSB7Ci0gICAgaWYgKG1DYWxsYmFja1RocmVhZCAhPSBOVUxMKSB7Ci0gICAgICAgIG1DYWxsYmFja1RocmVhZC0+cnVuKCJBdWRpb0NhY2hlIGNhbGxiYWNrIik7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvQ2FjaGU6OnN0b3AoKSB7Ci0gICAgaWYgKG1DYWxsYmFja1RocmVhZCAhPSBOVUxMKSB7Ci0gICAgICAgIG1DYWxsYmFja1RocmVhZC0+cmVxdWVzdEV4aXRBbmRXYWl0KCk7Ci0gICAgfQotfQotCi1zc2l6ZV90IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9DYWNoZTo6d3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKLXsKLSAgICBBTE9HVigid3JpdGUoJXAsICV1KSIsIGJ1ZmZlciwgc2l6ZSk7Ci0gICAgaWYgKChidWZmZXIgPT0gMCkgfHwgKHNpemUgPT0gMCkpIHJldHVybiBzaXplOwotCi0gICAgdWludDhfdCogcCA9IHN0YXRpY19jYXN0PHVpbnQ4X3QqPihtSGVhcC0+Z2V0QmFzZSgpKTsKLSAgICBpZiAocCA9PSBOVUxMKSByZXR1cm4gTk9fSU5JVDsKLSAgICBwICs9IG1TaXplOwotICAgIEFMT0dWKCJtZW1jcHkoJXAsICVwLCAldSkiLCBwLCBidWZmZXIsIHNpemUpOwotCi0gICAgYm9vbCBvdmVyZmxvdyA9IG1TaXplICsgc2l6ZSA+IG1IZWFwLT5nZXRTaXplKCk7Ci0gICAgaWYgKG92ZXJmbG93KSB7Ci0gICAgICAgIEFMT0dFKCJIZWFwIHNpemUgb3ZlcmZsb3chIHJlcSBzaXplOiAlZCwgbWF4IHNpemU6ICVkIiwgKG1TaXplICsgc2l6ZSksIG1IZWFwLT5nZXRTaXplKCkpOwotICAgICAgICBzaXplID0gbUhlYXAtPmdldFNpemUoKSAtIG1TaXplOwotICAgIH0KLSAgICBzaXplIC09IHNpemUgJSBtRnJhbWVTaXplOyAvLyBjb25zdW1lIG9ubHkgaW50ZWdyYWwgYW1vdW50cyBvZiBmcmFtZSBzaXplCi0gICAgbWVtY3B5KHAsIGJ1ZmZlciwgc2l6ZSk7Ci0gICAgbVNpemUgKz0gc2l6ZTsKLQotICAgIGlmIChvdmVyZmxvdykgewotICAgICAgICAvLyBTaWduYWwgaGVhcCBmaWxsZWQgaGVyZSAobGFzdCBmcmFtZSBtYXkgYmUgdHJ1bmNhdGVkKS4KLSAgICAgICAgLy8gQWZ0ZXIgdGhpcyBwb2ludCwgbm8gbW9yZSBkYXRhIHNob3VsZCBiZSB3cml0dGVuIGFzIHRoZQotICAgICAgICAvLyBoZWFwIGlzIGZpbGxlZCBhbmQgdGhlIEF1ZGlvQ2FjaGUgc2hvdWxkIGJlIGVmZmVjdGl2ZWx5Ci0gICAgICAgIC8vIGltbXV0YWJsZSB3aXRoIHJlc3BlY3QgdG8gZnV0dXJlIHdyaXRlcy4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gSXQgaXMgdGh1cyBzYWZlIGZvciBhbm90aGVyIHRocmVhZCB0byByZWFkIHRoZSBBdWRpb0NhY2hlLgotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgICAgIG1Db21tYW5kQ29tcGxldGUgPSB0cnVlOwotICAgICAgICBtU2lnbmFsLnNpZ25hbCgpOwotICAgIH0KLSAgICByZXR1cm4gc2l6ZTsKLX0KLQotLy8gY2FsbCB3aXRoIGxvY2sgaGVsZAotc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb0NhY2hlOjp3YWl0KCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgd2hpbGUgKCFtQ29tbWFuZENvbXBsZXRlKSB7Ci0gICAgICAgIG1TaWduYWwud2FpdChtTG9jayk7Ci0gICAgfQotICAgIG1Db21tYW5kQ29tcGxldGUgPSBmYWxzZTsKLQotICAgIGlmIChtRXJyb3IgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR1YoIndhaXQgLSBzdWNjZXNzIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIndhaXQgLSBlcnJvciIpOwotICAgIH0KLSAgICByZXR1cm4gbUVycm9yOwotfQotCi12b2lkIE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9DYWNoZTo6bm90aWZ5KAotICAgICAgICB2b2lkKiBjb29raWUsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsKiAvKm9iaiovKQotewotICAgIEFMT0dWKCJub3RpZnkoJXAsICVkLCAlZCwgJWQpIiwgY29va2llLCBtc2csIGV4dDEsIGV4dDIpOwotICAgIEF1ZGlvQ2FjaGUqIHAgPSBzdGF0aWNfY2FzdDxBdWRpb0NhY2hlKj4oY29va2llKTsKLQotICAgIC8vIGlnbm9yZSBidWZmZXJpbmcgbWVzc2FnZXMKLSAgICBzd2l0Y2ggKG1zZykKLSAgICB7Ci0gICAgY2FzZSBNRURJQV9FUlJPUjoKLSAgICAgICAgQUxPR0UoIkVycm9yICVkLCAlZCBvY2N1cnJlZCIsIGV4dDEsIGV4dDIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE1FRElBX1BSRVBBUkVEOgotICAgICAgICBBTE9HVigicHJlcGFyZWQiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNRURJQV9QTEFZQkFDS19DT01QTEVURToKLSAgICAgICAgQUxPR1YoInBsYXliYWNrIGNvbXBsZXRlIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dWKCJpZ25vcmVkIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyB3YWtlIHVwIHRocmVhZAotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKHAtPm1Mb2NrKTsKLSAgICBpZiAobXNnID09IE1FRElBX0VSUk9SKSB7Ci0gICAgICAgIHAtPm1FcnJvciA9IGV4dDE7Ci0gICAgfQotICAgIHAtPm1Db21tYW5kQ29tcGxldGUgPSB0cnVlOwotICAgIHAtPm1TaWduYWwuc2lnbmFsKCk7Ci19Ci0KLWludCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvQ2FjaGU6OmdldFNlc3Npb25JZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9DYWNoZTo6Z2V0U2FtcGxlUmF0ZSgpIGNvbnN0Ci17Ci0gICAgaWYgKG1Nc2Vjc1BlckZyYW1lID09IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAodWludDMyX3QpKDEuZTMgLyBtTXNlY3NQZXJGcmFtZSk7Ci19Ci0KIHZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjphZGRCYXR0ZXJ5RGF0YSh1aW50MzJfdCBwYXJhbXMpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwpAQCAtMjIzNyw3ICsxOTI2LDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIC8vIGFuIHN1ZGlvIHN0cmVhbSBpcyBzdGFydGVkCisgICAgLy8gYW4gYXVkaW8gc3RyZWFtIGlzIHN0YXJ0ZWQKICAgICBpZiAocGFyYW1zICYga0JhdHRlcnlEYXRhQXVkaW9GbGluZ2VyU3RhcnQpIHsKICAgICAgICAgLy8gcmVjb3JkIHRoZSBzdGFydCB0aW1lIG9ubHkgaWYgY3VycmVudGx5IG5vIG90aGVyIGF1ZGlvCiAgICAgICAgIC8vIGlzIGJlaW5nIHBsYXllZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oCmluZGV4IDNiOTZlODguLmZhZDM0NDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKQEAgLTc3LDcgKzc3LDYgQEAKICAgICAgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgfkF1ZGlvT3V0cHV0KCk7CiAKICAgICAgICAgdmlydHVhbCBib29sICAgICAgICAgICAgcmVhZHkoKSBjb25zdCB7IHJldHVybiBtVHJhY2sgIT0gMDsgfQotICAgICAgICB2aXJ0dWFsIGJvb2wgICAgICAgICAgICByZWFsdGltZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgdmlydHVhbCBzc2l6ZV90ICAgICAgICAgYnVmZmVyU2l6ZSgpIGNvbnN0OwogICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgICAgICBmcmFtZUNvdW50KCkgY29uc3Q7CiAgICAgICAgIHZpcnR1YWwgc3NpemVfdCAgICAgICAgIGNoYW5uZWxDb3VudCgpIGNvbnN0OwpAQCAtMTg0LDc1ICsxODMsNiBAQAogICAgIH07IC8vIEF1ZGlvT3V0cHV0CiAKIAotICAgIGNsYXNzIEF1ZGlvQ2FjaGUgOiBwdWJsaWMgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1NpbmsKLSAgICB7Ci0gICAgcHVibGljOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0NhY2hlKGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCk7Ci0gICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5BdWRpb0NhY2hlKCkge30KLQotICAgICAgICB2aXJ0dWFsIGJvb2wgICAgICAgICAgICByZWFkeSgpIGNvbnN0IHsgcmV0dXJuIChtQ2hhbm5lbENvdW50ID4gMCkgJiYgKG1IZWFwLT5nZXRIZWFwSUQoKSA+IDApOyB9Ci0gICAgICAgIHZpcnR1YWwgYm9vbCAgICAgICAgICAgIHJlYWx0aW1lKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICAgICAgdmlydHVhbCBzc2l6ZV90ICAgICAgICAgYnVmZmVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGZyYW1lU2l6ZSgpICogbUZyYW1lQ291bnQ7IH0KLSAgICAgICAgdmlydHVhbCBzc2l6ZV90ICAgICAgICAgZnJhbWVDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1GcmFtZUNvdW50OyB9Ci0gICAgICAgIHZpcnR1YWwgc3NpemVfdCAgICAgICAgIGNoYW5uZWxDb3VudCgpIGNvbnN0IHsgcmV0dXJuIChzc2l6ZV90KW1DaGFubmVsQ291bnQ7IH0KLSAgICAgICAgdmlydHVhbCBzc2l6ZV90ICAgICAgICAgZnJhbWVTaXplKCkgY29uc3QgeyByZXR1cm4gKHNzaXplX3QpbUZyYW1lU2l6ZTsgfQotICAgICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgICAgICBsYXRlbmN5KCkgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgZmxvYXQgICAgICAgICAgIG1zZWNzUGVyRnJhbWUoKSBjb25zdDsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0UG9zaXRpb24odWludDMyX3QgKnBvc2l0aW9uKSBjb25zdDsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wICZ0cykgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldEZyYW1lc1dyaXR0ZW4odWludDMyX3QgKmZyYW1lc3dyaXR0ZW4pIGNvbnN0OwotICAgICAgICB2aXJ0dWFsIGludCAgICAgICAgICAgICBnZXRTZXNzaW9uSWQoKSBjb25zdDsKLSAgICAgICAgdmlydHVhbCB1aW50MzJfdCAgICAgICAgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0OwotCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIG9wZW4oCi0gICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50IGNoYW5uZWxDb3VudCwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQgYnVmZmVyQ291bnQgPSAxLAotICAgICAgICAgICAgICAgIEF1ZGlvQ2FsbGJhY2sgY2IgPSBOVUxMLCB2b2lkICpjb29raWUgPSBOVUxMLAotICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKLSAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMKTsKLQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzdGFydCgpOwotICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgICAgICB3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgc3RvcCgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBmbHVzaCgpIHt9Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHBhdXNlKCkge30KLSAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgY2xvc2UoKSB7fQotICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBzZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlIF9fdW51c2VkKSB7fQotICAgICAgICAgICAgICAgIC8vIHN0cmVhbSB0eXBlIGlzIG5vdCB1c2VkIGZvciBBdWRpb0NhY2hlCi0gICAgICAgIHZpcnR1YWwgYXVkaW9fc3RyZWFtX3R5cGVfdCBnZXRBdWRpb1N0cmVhbVR5cGUoKSBjb25zdCB7IHJldHVybiBBVURJT19TVFJFQU1fREVGQVVMVDsgfQotCi0gICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIHNldFZvbHVtZShmbG9hdCBsZWZ0IF9fdW51c2VkLCBmbG9hdCByaWdodCBfX3VudXNlZCkge30KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0UGxheWJhY2tSYXRlUGVybWlsbGUoaW50MzJfdCByYXRlUGVybWlsbGUgX191bnVzZWQpIHsgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOyB9Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgIHNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtU2FtcGxlUmF0ZTsgfQotICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICBmb3JtYXQoKSBjb25zdCB7IHJldHVybiBtRm9ybWF0OyB9Ci0gICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgIHNpemUoKSBjb25zdCB7IHJldHVybiBtU2l6ZTsgfQotICAgICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICB3YWl0KCk7Ci0KLSAgICAgICAgICAgICAgICBzcDxJTWVtb3J5SGVhcD4gZ2V0SGVhcCgpIGNvbnN0IHsgcmV0dXJuIG1IZWFwOyB9Ci0KLSAgICAgICAgc3RhdGljICB2b2lkICAgICAgICAgICAgbm90aWZ5KHZvaWQqIGNvb2tpZSwgaW50IG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICpvYmopOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Q7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0NhY2hlKCk7Ci0KLSAgICAgICAgTXV0ZXggICAgICAgICAgICAgICBtTG9jazsKLSAgICAgICAgQ29uZGl0aW9uICAgICAgICAgICBtU2lnbmFsOwotICAgICAgICBzcDxJTWVtb3J5SGVhcD4gICAgIG1IZWFwOwotICAgICAgICBmbG9hdCAgICAgICAgICAgICAgIG1Nc2Vjc1BlckZyYW1lOwotICAgICAgICB1aW50MTZfdCAgICAgICAgICAgIG1DaGFubmVsQ291bnQ7Ci0gICAgICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgbUZvcm1hdDsKLSAgICAgICAgc3NpemVfdCAgICAgICAgICAgICBtRnJhbWVDb3VudDsKLSAgICAgICAgdWludDMyX3QgICAgICAgICAgICBtU2FtcGxlUmF0ZTsKLSAgICAgICAgdWludDMyX3QgICAgICAgICAgICBtU2l6ZTsKLSAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICBtRnJhbWVTaXplOwotICAgICAgICBpbnQgICAgICAgICAgICAgICAgIG1FcnJvcjsKLSAgICAgICAgYm9vbCAgICAgICAgICAgICAgICBtQ29tbWFuZENvbXBsZXRlOwotCi0gICAgICAgIHNwPFRocmVhZD4gICAgICAgICAgbUNhbGxiYWNrVGhyZWFkOwotICAgIH07IC8vIEF1ZGlvQ2FjaGUKLQogcHVibGljOgogICAgIHN0YXRpYyAgdm9pZCAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZSgpOwogCkBAIC0yNjMsMTkgKzE5Myw2IEBACiAKICAgICB2aXJ0dWFsIHNwPElNZWRpYVBsYXllcj4gICAgY3JlYXRlKGNvbnN0IHNwPElNZWRpYVBsYXllckNsaWVudD4mIGNsaWVudCwgaW50IGF1ZGlvU2Vzc2lvbklkKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICBkZWNvZGUoCi0gICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAotICAgICAgICAgICAgY29uc3QgY2hhciogdXJsLAotICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGVSYXRlLAotICAgICAgICAgICAgaW50KiBwTnVtQ2hhbm5lbHMsCi0gICAgICAgICAgICBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKLSAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwKLSAgICAgICAgICAgIHNpemVfdCAqcFNpemUpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgIGRlY29kZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwgaW50KiBwTnVtQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwgc2l6ZV90ICpwU2l6ZSk7CiAgICAgdmlydHVhbCBzcDxJTWVkaWFDb2RlY0xpc3Q+IGdldENvZGVjTGlzdCgpIGNvbnN0OwogICAgIHZpcnR1YWwgc3A8SU9NWD4gICAgICAgICAgICBnZXRPTVgoKTsKICAgICB2aXJ0dWFsIHNwPElDcnlwdG8+ICAgICAgICAgbWFrZUNyeXB0bygpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5jcHAKaW5kZXggZmEyODQ1MS4uNzE1Y2MwYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuY3BwCkBAIC0zNSw3ICszNSw2IEBACiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFNZXRhZGF0YVJldHJpZXZlckludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9WaWRlb0ZyYW1lLmg+Ci0jaW5jbHVkZSAiTWlkaU1ldGFkYXRhUmV0cmlldmVyLmgiCiAjaW5jbHVkZSAiTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuaCIKICNpbmNsdWRlICJTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmgiCiAjaW5jbHVkZSAiTWVkaWFQbGF5ZXJGYWN0b3J5LmgiCkBAIC05MCwxMCArODksNiBAQAogICAgICAgICAgICAgcCA9IG5ldyBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgY2FzZSBTT05JVk9YX1BMQVlFUjoKLSAgICAgICAgICAgIEFMT0dWKCJjcmVhdGUgbWlkaSBtZXRhZGF0YSByZXRyaWV2ZXIiKTsKLSAgICAgICAgICAgIHAgPSBuZXcgTWlkaU1ldGFkYXRhUmV0cmlldmVyKCk7Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIC8vIFRPRE86CiAgICAgICAgICAgICAvLyBzdXBwb3J0IGZvciBURVNUX1BMQVlFUgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpRmlsZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwY2JkM2MuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU2MCArMCwwIEBACi0vKiBNaWRpRmlsZS5jcHAKLSoqCi0qKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJNaWRpRmlsZSIKLSNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzY2hlZC5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDxsaWJzb25pdm94L2Vhc19yZXZlcmIuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0KLSNpbmNsdWRlICJNaWRpRmlsZS5oIgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBUaGUgbWlkaSBlbmdpbmUgYnVmZmVycyBhcmUgYSBiaXQgc21hbGwgKDEyOCBmcmFtZXMpLCBzbyB3ZSBiYXRjaCB0aGVtIHVwCi1zdGF0aWMgY29uc3QgaW50IE5VTV9CVUZGRVJTID0gNDsKLQotLy8gVE9ETzogRGV0ZXJtaW5lIGFwcHJvcHJpYXRlIHJldHVybiBjb2Rlcwotc3RhdGljIHN0YXR1c190IEVSUk9SX05PVF9PUEVOID0gLTE7Ci1zdGF0aWMgc3RhdHVzX3QgRVJST1JfT1BFTl9GQUlMRUQgPSAtMjsKLXN0YXRpYyBzdGF0dXNfdCBFUlJPUl9FQVNfRkFJTFVSRSA9IC0zOwotc3RhdGljIHN0YXR1c190IEVSUk9SX0FMTE9DQVRFX0ZBSUxFRCA9IC00OwotCi1zdGF0aWMgY29uc3QgU19FQVNfTElCX0NPTkZJRyogcExpYkNvbmZpZyA9IE5VTEw7Ci0KLU1pZGlGaWxlOjpNaWRpRmlsZSgpIDoKLSAgICBtRWFzRGF0YShOVUxMKSwgbUVhc0hhbmRsZShOVUxMKSwgbUF1ZGlvQnVmZmVyKE5VTEwpLAotICAgIG1QbGF5VGltZSgtMSksIG1EdXJhdGlvbigtMSksIG1TdGF0ZShFQVNfU1RBVEVfRVJST1IpLAotICAgIG1TdHJlYW1UeXBlKEFVRElPX1NUUkVBTV9NVVNJQyksIG1Mb29wKGZhbHNlKSwgbUV4aXQoZmFsc2UpLAotICAgIG1QYXVzZWQoZmFsc2UpLCBtUmVuZGVyKGZhbHNlKSwgbVRpZCgtMSkKLXsKLSAgICBBTE9HVigiY29uc3RydWN0b3IiKTsKLQotICAgIG1GaWxlTG9jYXRvci5wYXRoID0gTlVMTDsKLSAgICBtRmlsZUxvY2F0b3IuZmQgPSAtMTsKLSAgICBtRmlsZUxvY2F0b3Iub2Zmc2V0ID0gMDsKLSAgICBtRmlsZUxvY2F0b3IubGVuZ3RoID0gMDsKLQotICAgIC8vIGdldCB0aGUgbGlicmFyeSBjb25maWd1cmF0aW9uIGFuZCBkbyBzYW5pdHkgY2hlY2sKLSAgICBpZiAocExpYkNvbmZpZyA9PSBOVUxMKQotICAgICAgICBwTGliQ29uZmlnID0gRUFTX0NvbmZpZygpOwotICAgIGlmICgocExpYkNvbmZpZyA9PSBOVUxMKSB8fCAoTElCX1ZFUlNJT04gIT0gcExpYkNvbmZpZy0+bGliVmVyc2lvbikpIHsKLSAgICAgICAgQUxPR0UoIkVBUyBsaWJyYXJ5L2hlYWRlciBtaXNtYXRjaCIpOwotICAgICAgICBnb3RvIEZhaWxlZDsKLSAgICB9Ci0KLSAgICAvLyBpbml0aWFsaXplIEVBUyBsaWJyYXJ5Ci0gICAgaWYgKEVBU19Jbml0KCZtRWFzRGF0YSkgIT0gRUFTX1NVQ0NFU1MpIHsKLSAgICAgICAgQUxPR0UoIkVBU19Jbml0IGZhaWxlZCIpOwotICAgICAgICBnb3RvIEZhaWxlZDsKLSAgICB9Ci0KLSAgICAvLyBzZWxlY3QgcmV2ZXJiIHByZXNldCBhbmQgZW5hYmxlCi0gICAgRUFTX1NldFBhcmFtZXRlcihtRWFzRGF0YSwgRUFTX01PRFVMRV9SRVZFUkIsIEVBU19QQVJBTV9SRVZFUkJfUFJFU0VULCBFQVNfUEFSQU1fUkVWRVJCX0NIQU1CRVIpOwotICAgIEVBU19TZXRQYXJhbWV0ZXIobUVhc0RhdGEsIEVBU19NT0RVTEVfUkVWRVJCLCBFQVNfUEFSQU1fUkVWRVJCX0JZUEFTUywgRUFTX0ZBTFNFKTsKLQotICAgIC8vIGNyZWF0ZSBwbGF5YmFjayB0aHJlYWQKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7Ci0gICAgICAgIG1UaHJlYWQgPSBuZXcgTWlkaUZpbGVUaHJlYWQodGhpcyk7Ci0gICAgICAgIG1UaHJlYWQtPnJ1bigibWlkaXRocmVhZCIsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOwotICAgICAgICBtQ29uZGl0aW9uLndhaXQobU11dGV4KTsKLSAgICAgICAgQUxPR1YoInRocmVhZCBzdGFydGVkIik7Ci0gICAgfQotCi0gICAgLy8gaW5kaWNhdGUgc3VjY2VzcwotICAgIGlmIChtVGlkID4gMCkgewotICAgICAgICBBTE9HVigiIHJlbmRlciB0aHJlYWQoJWQpIHN0YXJ0ZWQiLCBtVGlkKTsKLSAgICAgICAgbVN0YXRlID0gRUFTX1NUQVRFX1JFQURZOwotICAgIH0KLQotRmFpbGVkOgotICAgIHJldHVybjsKLX0KLQotc3RhdHVzX3QgTWlkaUZpbGU6OmluaXRDaGVjaygpCi17Ci0gICAgaWYgKG1TdGF0ZSA9PSBFQVNfU1RBVEVfRVJST1IpIHJldHVybiBFUlJPUl9FQVNfRkFJTFVSRTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLU1pZGlGaWxlOjp+TWlkaUZpbGUoKSB7Ci0gICAgQUxPR1YoIk1pZGlGaWxlIGRlc3RydWN0b3IiKTsKLSAgICByZWxlYXNlKCk7Ci19Ci0KLXN0YXR1c190IE1pZGlGaWxlOjpzZXREYXRhU291cmNlKAotICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJiAvKmh0dHBTZXJ2aWNlKi8sCi0gICAgICAgIGNvbnN0IGNoYXIqIHBhdGgsCi0gICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICopIHsKLSAgICBBTE9HVigiTWlkaUZpbGU6OnNldERhdGFTb3VyY2UgdXJsPSVzIiwgcGF0aCk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLQotICAgIC8vIGZpbGUgc3RpbGwgb3Blbj8KLSAgICBpZiAobUVhc0hhbmRsZSkgewotICAgICAgICByZXNldF9ub3N5bmMoKTsKLSAgICB9Ci0KLSAgICAvLyBvcGVuIGZpbGUgYW5kIHNldCBwYXVzZWQgc3RhdGUKLSAgICBtRmlsZUxvY2F0b3IucGF0aCA9IHN0cmR1cChwYXRoKTsKLSAgICBtRmlsZUxvY2F0b3IuZmQgPSAtMTsKLSAgICBtRmlsZUxvY2F0b3Iub2Zmc2V0ID0gMDsKLSAgICBtRmlsZUxvY2F0b3IubGVuZ3RoID0gMDsKLSAgICBFQVNfUkVTVUxUIHJlc3VsdCA9IEVBU19PcGVuRmlsZShtRWFzRGF0YSwgJm1GaWxlTG9jYXRvciwgJm1FYXNIYW5kbGUpOwotICAgIGlmIChyZXN1bHQgPT0gRUFTX1NVQ0NFU1MpIHsKLSAgICAgICAgdXBkYXRlU3RhdGUoKTsKLSAgICB9Ci0KLSAgICBpZiAocmVzdWx0ICE9IEVBU19TVUNDRVNTKSB7Ci0gICAgICAgIEFMT0dFKCJFQVNfT3BlbkZpbGUgZmFpbGVkOiBbJWRdIiwgKGludClyZXN1bHQpOwotICAgICAgICBtU3RhdGUgPSBFQVNfU1RBVEVfRVJST1I7Ci0gICAgICAgIHJldHVybiBFUlJPUl9PUEVOX0ZBSUxFRDsKLSAgICB9Ci0KLSAgICBtU3RhdGUgPSBFQVNfU1RBVEVfT1BFTjsKLSAgICBtUGxheVRpbWUgPSAwOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgTWlkaUZpbGU6OnNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpCi17Ci0gICAgQUxPR1YoIk1pZGlGaWxlOjpzZXREYXRhU291cmNlIGZkPSVkIiwgZmQpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0KLSAgICAvLyBmaWxlIHN0aWxsIG9wZW4/Ci0gICAgaWYgKG1FYXNIYW5kbGUpIHsKLSAgICAgICAgcmVzZXRfbm9zeW5jKCk7Ci0gICAgfQotCi0gICAgLy8gb3BlbiBmaWxlIGFuZCBzZXQgcGF1c2VkIHN0YXRlCi0gICAgbUZpbGVMb2NhdG9yLmZkID0gZHVwKGZkKTsKLSAgICBtRmlsZUxvY2F0b3Iub2Zmc2V0ID0gb2Zmc2V0OwotICAgIG1GaWxlTG9jYXRvci5sZW5ndGggPSBsZW5ndGg7Ci0gICAgRUFTX1JFU1VMVCByZXN1bHQgPSBFQVNfT3BlbkZpbGUobUVhc0RhdGEsICZtRmlsZUxvY2F0b3IsICZtRWFzSGFuZGxlKTsKLSAgICB1cGRhdGVTdGF0ZSgpOwotCi0gICAgaWYgKHJlc3VsdCAhPSBFQVNfU1VDQ0VTUykgewotICAgICAgICBBTE9HRSgiRUFTX09wZW5GaWxlIGZhaWxlZDogWyVkXSIsIChpbnQpcmVzdWx0KTsKLSAgICAgICAgbVN0YXRlID0gRUFTX1NUQVRFX0VSUk9SOwotICAgICAgICByZXR1cm4gRVJST1JfT1BFTl9GQUlMRUQ7Ci0gICAgfQotCi0gICAgbVN0YXRlID0gRUFTX1NUQVRFX09QRU47Ci0gICAgbVBsYXlUaW1lID0gMDsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IE1pZGlGaWxlOjpwcmVwYXJlKCkKLXsKLSAgICBBTE9HVigiTWlkaUZpbGU6OnByZXBhcmUiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgIGlmICghbUVhc0hhbmRsZSkgewotICAgICAgICByZXR1cm4gRVJST1JfTk9UX09QRU47Ci0gICAgfQotICAgIEVBU19SRVNVTFQgcmVzdWx0OwotICAgIGlmICgocmVzdWx0ID0gRUFTX1ByZXBhcmUobUVhc0RhdGEsIG1FYXNIYW5kbGUpKSAhPSBFQVNfU1VDQ0VTUykgewotICAgICAgICBBTE9HRSgiRUFTX1ByZXBhcmUgZmFpbGVkOiBbJWxkXSIsIHJlc3VsdCk7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FQVNfRkFJTFVSRTsKLSAgICB9Ci0gICAgdXBkYXRlU3RhdGUoKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IE1pZGlGaWxlOjpwcmVwYXJlQXN5bmMoKQotewotICAgIEFMT0dWKCJNaWRpRmlsZTo6cHJlcGFyZUFzeW5jIik7Ci0gICAgc3RhdHVzX3QgcmV0ID0gcHJlcGFyZSgpOwotCi0gICAgLy8gZG9uJ3QgaG9sZCBsb2NrIGR1cmluZyBjYWxsYmFjawotICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgc2VuZEV2ZW50KE1FRElBX1BSRVBBUkVEKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzZW5kRXZlbnQoTUVESUFfRVJST1IsIE1FRElBX0VSUk9SX1VOS05PV04sIHJldCk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXR1c190IE1pZGlGaWxlOjpzdGFydCgpCi17Ci0gICAgQUxPR1YoIk1pZGlGaWxlOjpzdGFydCIpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgaWYgKCFtRWFzSGFuZGxlKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9OT1RfT1BFTjsKLSAgICB9Ci0KLSAgICAvLyByZXN1bWluZyBhZnRlciBwYXVzZT8KLSAgICBpZiAobVBhdXNlZCkgewotICAgICAgICBpZiAoRUFTX1Jlc3VtZShtRWFzRGF0YSwgbUVhc0hhbmRsZSkgIT0gRUFTX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9FQVNfRkFJTFVSRTsKLSAgICAgICAgfQotICAgICAgICBtUGF1c2VkID0gZmFsc2U7Ci0gICAgICAgIHVwZGF0ZVN0YXRlKCk7Ci0gICAgfQotCi0gICAgbVJlbmRlciA9IHRydWU7Ci0gICAgaWYgKG1TdGF0ZSA9PSBFQVNfU1RBVEVfUExBWSkgewotICAgICAgICBzZW5kRXZlbnQoTUVESUFfU1RBUlRFRCk7Ci0gICAgfQotCi0gICAgLy8gd2FrZSB1cCByZW5kZXIgdGhyZWFkCi0gICAgQUxPR1YoIiAgd2FrZXVwIHJlbmRlciB0aHJlYWQiKTsKLSAgICBtQ29uZGl0aW9uLnNpZ25hbCgpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgTWlkaUZpbGU6OnN0b3AoKQotewotICAgIEFMT0dWKCJNaWRpRmlsZTo6c3RvcCIpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgaWYgKCFtRWFzSGFuZGxlKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9OT1RfT1BFTjsKLSAgICB9Ci0gICAgaWYgKCFtUGF1c2VkICYmIChtU3RhdGUgIT0gRUFTX1NUQVRFX1NUT1BQRUQpKSB7Ci0gICAgICAgIEVBU19SRVNVTFQgcmVzdWx0ID0gRUFTX1BhdXNlKG1FYXNEYXRhLCBtRWFzSGFuZGxlKTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBFQVNfU1VDQ0VTUykgewotICAgICAgICAgICAgQUxPR0UoIkVBU19QYXVzZSByZXR1cm5lZCBlcnJvciAlbGQiLCByZXN1bHQpOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VBU19GQUlMVVJFOwotICAgICAgICB9Ci0gICAgfQotICAgIG1QYXVzZWQgPSBmYWxzZTsKLSAgICBzZW5kRXZlbnQoTUVESUFfU1RPUFBFRCk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBNaWRpRmlsZTo6c2Vla1RvKGludCBwb3NpdGlvbikKLXsKLSAgICBBTE9HVigiTWlkaUZpbGU6OnNlZWtUbyAlZCIsIHBvc2l0aW9uKTsKLSAgICAvLyBob2xkIGxvY2sgZHVyaW5nIEVBUyBjYWxscwotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICAgICAgaWYgKCFtRWFzSGFuZGxlKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTk9UX09QRU47Ci0gICAgICAgIH0KLSAgICAgICAgRUFTX1JFU1VMVCByZXN1bHQ7Ci0gICAgICAgIGlmICgocmVzdWx0ID0gRUFTX0xvY2F0ZShtRWFzRGF0YSwgbUVhc0hhbmRsZSwgcG9zaXRpb24sIGZhbHNlKSkKLSAgICAgICAgICAgICAgICAhPSBFQVNfU1VDQ0VTUykKLSAgICAgICAgewotICAgICAgICAgICAgQUxPR0UoIkVBU19Mb2NhdGUgcmV0dXJuZWQgJWxkIiwgcmVzdWx0KTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9FQVNfRkFJTFVSRTsKLSAgICAgICAgfQotICAgICAgICBFQVNfR2V0TG9jYXRpb24obUVhc0RhdGEsIG1FYXNIYW5kbGUsICZtUGxheVRpbWUpOwotICAgIH0KLSAgICBzZW5kRXZlbnQoTUVESUFfU0VFS19DT01QTEVURSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBNaWRpRmlsZTo6cGF1c2UoKQotewotICAgIEFMT0dWKCJNaWRpRmlsZTo6cGF1c2UiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgIGlmICghbUVhc0hhbmRsZSkgewotICAgICAgICByZXR1cm4gRVJST1JfTk9UX09QRU47Ci0gICAgfQotICAgIGlmICgobVN0YXRlID09IEVBU19TVEFURV9QQVVTSU5HKSB8fCAobVN0YXRlID09IEVBU19TVEFURV9QQVVTRUQpKSByZXR1cm4gTk9fRVJST1I7Ci0gICAgaWYgKEVBU19QYXVzZShtRWFzRGF0YSwgbUVhc0hhbmRsZSkgIT0gRUFTX1NVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0VBU19GQUlMVVJFOwotICAgIH0KLSAgICBtUGF1c2VkID0gdHJ1ZTsKLSAgICBzZW5kRXZlbnQoTUVESUFfUEFVU0VEKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLWJvb2wgTWlkaUZpbGU6OmlzUGxheWluZygpCi17Ci0gICAgQUxPR1YoIk1pZGlGaWxlOjppc1BsYXlpbmcsIG1TdGF0ZT0lZCIsIGludChtU3RhdGUpKTsKLSAgICBpZiAoIW1FYXNIYW5kbGUgfHwgbVBhdXNlZCkgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiAobVN0YXRlID09IEVBU19TVEFURV9QTEFZIHx8IChtU3RhdGUgPT0gRUFTX1NUQVRFX1JFQURZICYmIG1SZW5kZXIpKTsKLX0KLQotc3RhdHVzX3QgTWlkaUZpbGU6OmdldEN1cnJlbnRQb3NpdGlvbihpbnQqIHBvc2l0aW9uKQotewotICAgIEFMT0dWKCJNaWRpRmlsZTo6Z2V0Q3VycmVudFBvc2l0aW9uIik7Ci0gICAgaWYgKCFtRWFzSGFuZGxlKSB7Ci0gICAgICAgIEFMT0dFKCJnZXRDdXJyZW50UG9zaXRpb24oKTogZmlsZSBub3Qgb3BlbiIpOwotICAgICAgICByZXR1cm4gRVJST1JfTk9UX09QRU47Ci0gICAgfQotICAgIGlmIChtUGxheVRpbWUgPCAwKSB7Ci0gICAgICAgIEFMT0dFKCJnZXRDdXJyZW50UG9zaXRpb24oKTogbVBsYXlUaW1lID0gJWxkIiwgbVBsYXlUaW1lKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0VBU19GQUlMVVJFOwotICAgIH0KLSAgICAqcG9zaXRpb24gPSBtUGxheVRpbWU7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBNaWRpRmlsZTo6Z2V0RHVyYXRpb24oaW50KiBkdXJhdGlvbikKLXsKLQotICAgIEFMT0dWKCJNaWRpRmlsZTo6Z2V0RHVyYXRpb24iKTsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgICAgIGlmICghbUVhc0hhbmRsZSkgcmV0dXJuIEVSUk9SX05PVF9PUEVOOwotICAgICAgICAqZHVyYXRpb24gPSBtRHVyYXRpb247Ci0gICAgfQotCi0gICAgLy8gaWYgbm8gZHVyYXRpb24gY2FjaGVkLCBnZXQgdGhlIGR1cmF0aW9uCi0gICAgLy8gZG9uJ3QgbmVlZCBhIGxvY2sgaGVyZSBiZWNhdXNlIHdlIHNwaW4gdXAgYSBuZXcgZW5naW5lCi0gICAgaWYgKCpkdXJhdGlvbiA8IDApIHsKLSAgICAgICAgRUFTX0kzMiB0ZW1wOwotICAgICAgICBFQVNfREFUQV9IQU5ETEUgZWFzRGF0YSA9IE5VTEw7Ci0gICAgICAgIEVBU19IQU5ETEUgZWFzSGFuZGxlID0gTlVMTDsKLSAgICAgICAgRUFTX1JFU1VMVCByZXN1bHQgPSBFQVNfSW5pdCgmZWFzRGF0YSk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gRUFTX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IEVBU19PcGVuRmlsZShlYXNEYXRhLCAmbUZpbGVMb2NhdG9yLCAmZWFzSGFuZGxlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVzdWx0ID09IEVBU19TVUNDRVNTKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBFQVNfUHJlcGFyZShlYXNEYXRhLCBlYXNIYW5kbGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gRUFTX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IEVBU19QYXJzZU1ldGFEYXRhKGVhc0RhdGEsIGVhc0hhbmRsZSwgJnRlbXApOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlYXNIYW5kbGUpIHsKLSAgICAgICAgICAgIEVBU19DbG9zZUZpbGUoZWFzRGF0YSwgZWFzSGFuZGxlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZWFzRGF0YSkgewotICAgICAgICAgICAgRUFTX1NodXRkb3duKGVhc0RhdGEpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlc3VsdCAhPSBFQVNfU1VDQ0VTUykgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VBU19GQUlMVVJFOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2FjaGUgc3VjY2Vzc2Z1bCByZXN1bHQKLSAgICAgICAgbUR1cmF0aW9uID0gKmR1cmF0aW9uID0gaW50KHRlbXApOwotICAgIH0KLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgTWlkaUZpbGU6OnJlbGVhc2UoKQotewotICAgIEFMT0dWKCJNaWRpRmlsZTo6cmVsZWFzZSIpOwotICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7Ci0gICAgcmVzZXRfbm9zeW5jKCk7Ci0KLSAgICAvLyB3YWl0IGZvciByZW5kZXIgdGhyZWFkIHRvIGV4aXQKLSAgICBtRXhpdCA9IHRydWU7Ci0gICAgbUNvbmRpdGlvbi5zaWduYWwoKTsKLQotICAgIC8vIHdhaXQgZm9yIHRocmVhZCB0byBleGl0Ci0gICAgaWYgKG1BdWRpb0J1ZmZlcikgewotICAgICAgICBtQ29uZGl0aW9uLndhaXQobU11dGV4KTsKLSAgICB9Ci0KLSAgICAvLyByZWxlYXNlIHJlc291cmNlcwotICAgIGlmIChtRWFzRGF0YSkgewotICAgICAgICBFQVNfU2h1dGRvd24obUVhc0RhdGEpOwotICAgICAgICBtRWFzRGF0YSA9IE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgTWlkaUZpbGU6OnJlc2V0KCkKLXsKLSAgICBBTE9HVigiTWlkaUZpbGU6OnJlc2V0Iik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICByZXR1cm4gcmVzZXRfbm9zeW5jKCk7Ci19Ci0KLS8vIGNhbGwgb25seSB3aXRoIG11dGV4IGhlbGQKLXN0YXR1c190IE1pZGlGaWxlOjpyZXNldF9ub3N5bmMoKQotewotICAgIEFMT0dWKCJNaWRpRmlsZTo6cmVzZXRfbm9zeW5jIik7Ci0gICAgc2VuZEV2ZW50KE1FRElBX1NUT1BQRUQpOwotICAgIC8vIGNsb3NlIGZpbGUKLSAgICBpZiAobUVhc0hhbmRsZSkgewotICAgICAgICBFQVNfQ2xvc2VGaWxlKG1FYXNEYXRhLCBtRWFzSGFuZGxlKTsKLSAgICAgICAgbUVhc0hhbmRsZSA9IE5VTEw7Ci0gICAgfQotICAgIGlmIChtRmlsZUxvY2F0b3IucGF0aCkgewotICAgICAgICBmcmVlKCh2b2lkKiltRmlsZUxvY2F0b3IucGF0aCk7Ci0gICAgICAgIG1GaWxlTG9jYXRvci5wYXRoID0gTlVMTDsKLSAgICB9Ci0gICAgaWYgKG1GaWxlTG9jYXRvci5mZCA+PSAwKSB7Ci0gICAgICAgIGNsb3NlKG1GaWxlTG9jYXRvci5mZCk7Ci0gICAgfQotICAgIG1GaWxlTG9jYXRvci5mZCA9IC0xOwotICAgIG1GaWxlTG9jYXRvci5vZmZzZXQgPSAwOwotICAgIG1GaWxlTG9jYXRvci5sZW5ndGggPSAwOwotCi0gICAgbVBsYXlUaW1lID0gLTE7Ci0gICAgbUR1cmF0aW9uID0gLTE7Ci0gICAgbUxvb3AgPSBmYWxzZTsKLSAgICBtUGF1c2VkID0gZmFsc2U7Ci0gICAgbVJlbmRlciA9IGZhbHNlOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgTWlkaUZpbGU6OnNldExvb3BpbmcoaW50IGxvb3ApCi17Ci0gICAgQUxPR1YoIk1pZGlGaWxlOjpzZXRMb29waW5nIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICBpZiAoIW1FYXNIYW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX05PVF9PUEVOOwotICAgIH0KLSAgICBsb29wID0gbG9vcCA/IC0xIDogMDsKLSAgICBpZiAoRUFTX1NldFJlcGVhdChtRWFzRGF0YSwgbUVhc0hhbmRsZSwgbG9vcCkgIT0gRUFTX1NVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0VBU19GQUlMVVJFOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IE1pZGlGaWxlOjpjcmVhdGVPdXRwdXRUcmFjaygpIHsKLSAgICBpZiAobUF1ZGlvU2luay0+b3BlbihwTGliQ29uZmlnLT5zYW1wbGVSYXRlLCBwTGliQ29uZmlnLT5udW1DaGFubmVscywKLSAgICAgICAgICAgIENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUiwgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsIDIgLypidWZmZXJDb3VudCovKSAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgibUF1ZGlvU2luayBvcGVuIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gRVJST1JfT1BFTl9GQUlMRUQ7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotaW50IE1pZGlGaWxlOjpyZW5kZXIoKSB7Ci0gICAgRUFTX1JFU1VMVCByZXN1bHQgPSBFQVNfRkFJTFVSRTsKLSAgICBFQVNfSTMyIGNvdW50OwotICAgIGludCB0ZW1wOwotICAgIGJvb2wgYXVkaW9TdGFydGVkID0gZmFsc2U7Ci0KLSAgICBBTE9HVigiTWlkaUZpbGU6OnJlbmRlciIpOwotCi0gICAgLy8gYWxsb2NhdGUgcmVuZGVyIGJ1ZmZlcgotICAgIG1BdWRpb0J1ZmZlciA9IG5ldyBFQVNfUENNW3BMaWJDb25maWctPm1peEJ1ZmZlclNpemUgKiBwTGliQ29uZmlnLT5udW1DaGFubmVscyAqIE5VTV9CVUZGRVJTXTsKLSAgICBpZiAoIW1BdWRpb0J1ZmZlcikgewotICAgICAgICBBTE9HRSgibUF1ZGlvQnVmZmVyIGFsbG9jYXRlIGZhaWxlZCIpOwotICAgICAgICBnb3RvIHRocmVhZEV4aXQ7Ci0gICAgfQotCi0gICAgLy8gc2lnbmFsIG1haW4gdGhyZWFkIHRoYXQgd2Ugc3RhcnRlZAotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKLSAgICAgICAgbVRpZCA9IGdldHRpZCgpOwotICAgICAgICBBTE9HVigicmVuZGVyIHRocmVhZCglZCkgc2lnbmFsIiwgbVRpZCk7Ci0gICAgICAgIG1Db25kaXRpb24uc2lnbmFsKCk7Ci0gICAgfQotCi0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgbU11dGV4LmxvY2soKTsKLQotICAgICAgICAvLyBub3RoaW5nIHRvIHJlbmRlciwgd2FpdCBmb3IgY2xpZW50IHRocmVhZCB0byB3YWtlIHVzIHVwCi0gICAgICAgIHdoaWxlICghbVJlbmRlciAmJiAhbUV4aXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFMT0dWKCJNaWRpRmlsZTo6cmVuZGVyIC0gc2lnbmFsIHdhaXQiKTsKLSAgICAgICAgICAgIG1Db25kaXRpb24ud2FpdChtTXV0ZXgpOwotICAgICAgICAgICAgQUxPR1YoIk1pZGlGaWxlOjpyZW5kZXIgLSBzaWduYWwgcngnZCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtRXhpdCkgewotICAgICAgICAgICAgbU11dGV4LnVubG9jaygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZW5kZXIgbWlkaSBkYXRhIGludG8gdGhlIGlucHV0IGJ1ZmZlcgotICAgICAgICAvL0FMT0dWKCJNaWRpRmlsZTo6cmVuZGVyIC0gcmVuZGVyaW5nIGF1ZGlvIik7Ci0gICAgICAgIGludCBudW1fb3V0cHV0ID0gMDsKLSAgICAgICAgRUFTX1BDTSogcCA9IG1BdWRpb0J1ZmZlcjsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fQlVGRkVSUzsgaSsrKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBFQVNfUmVuZGVyKG1FYXNEYXRhLCBwLCBwTGliQ29uZmlnLT5taXhCdWZmZXJTaXplLCAmY291bnQpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBFQVNfU1VDQ0VTUykgewotICAgICAgICAgICAgICAgIEFMT0dFKCJFQVNfUmVuZGVyIHJldHVybmVkICVsZCIsIHJlc3VsdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwICs9IGNvdW50ICogcExpYkNvbmZpZy0+bnVtQ2hhbm5lbHM7Ci0gICAgICAgICAgICBudW1fb3V0cHV0ICs9IGNvdW50ICogcExpYkNvbmZpZy0+bnVtQ2hhbm5lbHMgKiBzaXplb2YoRUFTX1BDTSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB1cGRhdGUgcGxheWJhY2sgc3RhdGUgYW5kIHBvc2l0aW9uCi0gICAgICAgIC8vIEFMT0dWKCJNaWRpRmlsZTo6cmVuZGVyIC0gdXBkYXRpbmcgc3RhdGUiKTsKLSAgICAgICAgRUFTX0dldExvY2F0aW9uKG1FYXNEYXRhLCBtRWFzSGFuZGxlLCAmbVBsYXlUaW1lKTsKLSAgICAgICAgRUFTX1N0YXRlKG1FYXNEYXRhLCBtRWFzSGFuZGxlLCAmbVN0YXRlKTsKLSAgICAgICAgbU11dGV4LnVubG9jaygpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBhdWRpbyBvdXRwdXQgdHJhY2sgaWYgbmVjZXNzYXJ5Ci0gICAgICAgIGlmICghbUF1ZGlvU2luay0+cmVhZHkoKSkgewotICAgICAgICAgICAgQUxPR1YoIk1pZGlGaWxlOjpyZW5kZXIgLSBjcmVhdGUgb3V0cHV0IHRyYWNrIik7Ci0gICAgICAgICAgICBpZiAoY3JlYXRlT3V0cHV0VHJhY2soKSAhPSBOT19FUlJPUikKLSAgICAgICAgICAgICAgICBnb3RvIHRocmVhZEV4aXQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXcml0ZSBkYXRhIHRvIHRoZSBhdWRpbyBoYXJkd2FyZQotICAgICAgICAvLyBBTE9HVigiTWlkaUZpbGU6OnJlbmRlciAtIHdyaXRpbmcgdG8gYXVkaW8gb3V0cHV0Iik7Ci0gICAgICAgIGlmICgodGVtcCA9IG1BdWRpb1NpbmstPndyaXRlKG1BdWRpb0J1ZmZlciwgbnVtX291dHB1dCkpIDwgMCkgewotICAgICAgICAgICAgQUxPR0UoIkVycm9yIGluIHdyaXRpbmc6JWQiLHRlbXApOwotICAgICAgICAgICAgcmV0dXJuIHRlbXA7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzdGFydCBhdWRpbyBvdXRwdXQgaWYgbmVjZXNzYXJ5Ci0gICAgICAgIGlmICghYXVkaW9TdGFydGVkKSB7Ci0gICAgICAgICAgICAvL0FMT0dWKCJNaWRpRmlsZTo6cmVuZGVyIC0gc3RhcnRpbmcgYXVkaW8iKTsKLSAgICAgICAgICAgIG1BdWRpb1NpbmstPnN0YXJ0KCk7Ci0gICAgICAgICAgICBhdWRpb1N0YXJ0ZWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc3RpbGwgcGxheWluZz8KLSAgICAgICAgaWYgKChtU3RhdGUgPT0gRUFTX1NUQVRFX1NUT1BQRUQpIHx8IChtU3RhdGUgPT0gRUFTX1NUQVRFX0VSUk9SKSB8fAotICAgICAgICAgICAgICAgIChtU3RhdGUgPT0gRUFTX1NUQVRFX1BBVVNFRCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaChtU3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgRUFTX1NUQVRFX1NUT1BQRUQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIk1pZGlGaWxlOjpyZW5kZXIgLSBzdG9wcGVkIik7Ci0gICAgICAgICAgICAgICAgc2VuZEV2ZW50KE1FRElBX1BMQVlCQUNLX0NPTVBMRVRFKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRUFTX1NUQVRFX0VSUk9SOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFMT0dFKCJNaWRpRmlsZTo6cmVuZGVyIC0gZXJyb3IiKTsKLSAgICAgICAgICAgICAgICBzZW5kRXZlbnQoTUVESUFfRVJST1IsIE1FRElBX0VSUk9SX1VOS05PV04pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBFQVNfU1RBVEVfUEFVU0VEOgotICAgICAgICAgICAgICAgIEFMT0dWKCJNaWRpRmlsZTo6cmVuZGVyIC0gcGF1c2VkIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUF1ZGlvU2luay0+c3RvcCgpOwotICAgICAgICAgICAgYXVkaW9TdGFydGVkID0gZmFsc2U7Ci0gICAgICAgICAgICBtUmVuZGVyID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLXRocmVhZEV4aXQ6Ci0gICAgbUF1ZGlvU2luay5jbGVhcigpOwotICAgIGlmIChtQXVkaW9CdWZmZXIpIHsKLSAgICAgICAgZGVsZXRlIFtdIG1BdWRpb0J1ZmZlcjsKLSAgICAgICAgbUF1ZGlvQnVmZmVyID0gTlVMTDsKLSAgICB9Ci0gICAgbU11dGV4LmxvY2soKTsKLSAgICBtVGlkID0gLTE7Ci0gICAgbUNvbmRpdGlvbi5zaWduYWwoKTsKLSAgICBtTXV0ZXgudW5sb2NrKCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotfSAvLyBlbmQgbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpRmlsZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZTRlODguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoKLSoqCi0qKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2lmbmRlZiBBTkRST0lEX01JRElGSUxFX0gKLSNkZWZpbmUgQU5EUk9JRF9NSURJRklMRV9ICi0KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oPgotI2luY2x1ZGUgPGxpYnNvbml2b3gvZWFzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gTm90ZSB0aGF0IHRoZSBuYW1lIE1pZGlGaWxlIGlzIG1pc2xlYWRpbmc7IHRoaXMgYWN0dWFsbHkgcmVwcmVzZW50cyBhIE1JREkgZmlsZSBwbGF5ZXIKLWNsYXNzIE1pZGlGaWxlIDogcHVibGljIE1lZGlhUGxheWVySW50ZXJmYWNlIHsKLXB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgICAgIE1pZGlGaWxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB+TWlkaUZpbGUoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgaW5pdENoZWNrKCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldERhdGFTb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAotICAgICAgICAgICAgY29uc3QgY2hhciogcGF0aCwKLSAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgLypidWZmZXJQcm9kdWNlciovKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIFVOS05PV05fRVJST1I7IH0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHByZXBhcmUoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHByZXBhcmVBc3luYygpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHN0b3AoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNlZWtUbyhpbnQgbXNlYyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBwYXVzZSgpOwotICAgIHZpcnR1YWwgYm9vbCAgICAgICAgaXNQbGF5aW5nKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRDdXJyZW50UG9zaXRpb24oaW50KiBtc2VjKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldER1cmF0aW9uKGludCogbXNlYyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICByZWxlYXNlKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICByZXNldCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0TG9vcGluZyhpbnQgbG9vcCk7Ci0gICAgdmlydHVhbCBwbGF5ZXJfdHlwZSBwbGF5ZXJUeXBlKCkgeyByZXR1cm4gU09OSVZPWF9QTEFZRVI7IH0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGludm9rZShjb25zdCBQYXJjZWwmIC8qcmVxdWVzdCovLCBQYXJjZWwqIC8qcmVwbHkqLykgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0UGFyYW1ldGVyKGludCAvKmtleSovLCBjb25zdCBQYXJjZWwgJi8qcmVxdWVzdCovKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRQYXJhbWV0ZXIoaW50IC8qa2V5Ki8sIFBhcmNlbCogLypyZXBseSovKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLQotcHJpdmF0ZToKLSAgICAgICAgICAgIHN0YXR1c190ICAgIGNyZWF0ZU91dHB1dFRyYWNrKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICByZXNldF9ub3N5bmMoKTsKLSAgICAgICAgICAgIGludCAgICAgICAgIHJlbmRlcigpOwotICAgICAgICAgICAgdm9pZCAgICAgICAgdXBkYXRlU3RhdGUoKXsgRUFTX1N0YXRlKG1FYXNEYXRhLCBtRWFzSGFuZGxlLCAmbVN0YXRlKTsgfQotCi0gICAgTXV0ZXggICAgICAgICAgICAgICBtTXV0ZXg7Ci0gICAgQ29uZGl0aW9uICAgICAgICAgICBtQ29uZGl0aW9uOwotICAgIEVBU19EQVRBX0hBTkRMRSAgICAgbUVhc0RhdGE7Ci0gICAgRUFTX0hBTkRMRSAgICAgICAgICBtRWFzSGFuZGxlOwotICAgIEVBU19QQ00qICAgICAgICAgICAgbUF1ZGlvQnVmZmVyOwotICAgIEVBU19JMzIgICAgICAgICAgICAgbVBsYXlUaW1lOwotICAgIEVBU19JMzIgICAgICAgICAgICAgbUR1cmF0aW9uOwotICAgIEVBU19TVEFURSAgICAgICAgICAgbVN0YXRlOwotICAgIEVBU19GSUxFICAgICAgICAgICAgbUZpbGVMb2NhdG9yOwotICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbVN0cmVhbVR5cGU7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICBtTG9vcDsKLSAgICB2b2xhdGlsZSBib29sICAgICAgIG1FeGl0OwotICAgIGJvb2wgICAgICAgICAgICAgICAgbVBhdXNlZDsKLSAgICB2b2xhdGlsZSBib29sICAgICAgIG1SZW5kZXI7Ci0gICAgcGlkX3QgICAgICAgICAgICAgICBtVGlkOwotCi0gICAgY2xhc3MgTWlkaUZpbGVUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIE1pZGlGaWxlVGhyZWFkKE1pZGlGaWxlICptaWRpUGxheWVyKSA6IG1NaWRpRmlsZShtaWRpUGxheWVyKSB7Ci0gICAgICAgIH0KLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgdmlydHVhbCB+TWlkaUZpbGVUaHJlYWQoKSB7fQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgTWlkaUZpbGUgKm1NaWRpRmlsZTsKLQotICAgICAgICBib29sIHRocmVhZExvb3AoKSB7Ci0gICAgICAgICAgICBpbnQgcmVzdWx0OwotICAgICAgICAgICAgcmVzdWx0ID0gbU1pZGlGaWxlLT5yZW5kZXIoKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIE1pZGlGaWxlVGhyZWFkKGNvbnN0IE1pZGlGaWxlVGhyZWFkICYpOwotICAgICAgICBNaWRpRmlsZVRocmVhZCAmb3BlcmF0b3I9KGNvbnN0IE1pZGlGaWxlVGhyZWFkICYpOwotICAgIH07Ci0KLSAgICBzcDxNaWRpRmlsZVRocmVhZD4gbVRocmVhZDsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX01JRElGSUxFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpTWV0YWRhdGFSZXRyaWV2ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlNZXRhZGF0YVJldHJpZXZlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzY2Y2ZWYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlNZXRhZGF0YVJldHJpZXZlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKgotKioKLSoqIENvcHlyaWdodCAyMDA5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIk1pZGlNZXRhZGF0YVJldHJpZXZlciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIk1pZGlNZXRhZGF0YVJldHJpZXZlci5oIgotI2luY2x1ZGUgPG1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaD4KLQotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdGljIHN0YXR1c190IEVSUk9SX05PVF9PUEVOID0gLTE7Ci1zdGF0aWMgc3RhdHVzX3QgRVJST1JfT1BFTl9GQUlMRUQgPSAtMjsKLXN0YXRpYyBzdGF0dXNfdCBFUlJPUl9FQVNfRkFJTFVSRSA9IC0zOwotc3RhdGljIHN0YXR1c190IEVSUk9SX0FMTE9DQVRFX0ZBSUxFRCA9IC00OwotCi12b2lkIE1pZGlNZXRhZGF0YVJldHJpZXZlcjo6Y2xlYXJNZXRhZGF0YVZhbHVlcygpCi17Ci0gICAgQUxPR1YoImNsZWFyTWV0YWRhdGFWYWx1ZXMiKTsKLSAgICBtTWV0YWRhdGFWYWx1ZXNbMF1bMF0gPSAnXDAnOwotfQotCi1zdGF0dXNfdCBNaWRpTWV0YWRhdGFSZXRyaWV2ZXI6OnNldERhdGFTb3VyY2UoCi0gICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCi0gICAgICAgIGNvbnN0IGNoYXIgKnVybCwKLSAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpCi17Ci0gICAgQUxPR1YoInNldERhdGFTb3VyY2U6ICVzIiwgdXJsPyB1cmw6ICJOVUxMIHBvaW50ZXIiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgY2xlYXJNZXRhZGF0YVZhbHVlcygpOwotICAgIGlmIChtTWlkaVBsYXllciA9PSAwKSB7Ci0gICAgICAgIG1NaWRpUGxheWVyID0gbmV3IE1pZGlGaWxlKCk7Ci0gICAgfQotICAgIHJldHVybiBtTWlkaVBsYXllci0+c2V0RGF0YVNvdXJjZShodHRwU2VydmljZSwgdXJsLCBoZWFkZXJzKTsKLX0KLQotc3RhdHVzX3QgTWlkaU1ldGFkYXRhUmV0cmlldmVyOjpzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKQotewotICAgIEFMT0dWKCJzZXREYXRhU291cmNlOiBmZCglZCksIG9mZnNldCglbGxkKSwgYW5kIGxlbmd0aCglbGxkKSIsIGZkLCBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGNsZWFyTWV0YWRhdGFWYWx1ZXMoKTsKLSAgICBpZiAobU1pZGlQbGF5ZXIgPT0gMCkgewotICAgICAgICBtTWlkaVBsYXllciA9IG5ldyBNaWRpRmlsZSgpOwotICAgIH0KLSAgICByZXR1cm4gbU1pZGlQbGF5ZXItPnNldERhdGFTb3VyY2UoZmQsIG9mZnNldCwgbGVuZ3RoKTs7Ci19Ci0KLWNvbnN0IGNoYXIqIE1pZGlNZXRhZGF0YVJldHJpZXZlcjo6ZXh0cmFjdE1ldGFkYXRhKGludCBrZXlDb2RlKQotewotICAgIEFMT0dWKCJleHRyYWN0TWV0ZGF0YToga2V5KCVkKSIsIGtleUNvZGUpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobU1pZGlQbGF5ZXIgPT0gMCB8fCBtTWlkaVBsYXllci0+aW5pdENoZWNrKCkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIk1pZGkgcGxheWVyIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHN3aXRjaCAoa2V5Q29kZSkgewotICAgIGNhc2UgTUVUQURBVEFfS0VZX0RVUkFUSU9OOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobU1ldGFkYXRhVmFsdWVzWzBdWzBdID09ICdcMCcpIHsKLSAgICAgICAgICAgICAgICBpbnQgZHVyYXRpb24gPSAtMTsKLSAgICAgICAgICAgICAgICBpZiAobU1pZGlQbGF5ZXItPmdldER1cmF0aW9uKCZkdXJhdGlvbikgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBnZXQgZHVyYXRpb24iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNucHJpbnRmKG1NZXRhZGF0YVZhbHVlc1swXSwgTUFYX01FVEFEQVRBX1NUUklOR19MRU5HVEgsICIlZCIsIGR1cmF0aW9uKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQUxPR1YoImR1cmF0aW9uOiAlcyBtcyIsIG1NZXRhZGF0YVZhbHVlc1swXSk7Ci0gICAgICAgICAgICByZXR1cm4gbU1ldGFkYXRhVmFsdWVzWzBdOwotICAgICAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIGtleSBjb2RlICglZCkiLCBrZXlDb2RlKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi19OwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaU1ldGFkYXRhUmV0cmlldmVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaU1ldGFkYXRhUmV0cmlldmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MjE0ZWUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlNZXRhZGF0YVJldHJpZXZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSoqCi0qKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2lmbmRlZiBBTkRST0lEX01JRElNRVRBREFUQVJFVFJJRVZFUl9ICi0jZGVmaW5lIEFORFJPSURfTUlESU1FVEFEQVRBUkVUUklFVkVSX0gKLQotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmg+Ci0KLSNpbmNsdWRlICJNaWRpRmlsZS5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIE1pZGlNZXRhZGF0YVJldHJpZXZlciA6IHB1YmxpYyBNZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlIHsKLXB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWlkaU1ldGFkYXRhUmV0cmlldmVyKCkge30KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfk1pZGlNZXRhZGF0YVJldHJpZXZlcigpIHt9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgICAgIHNldERhdGFTb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAotICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAotICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgICAgICBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqICAgICAgICAgICAgIGV4dHJhY3RNZXRhZGF0YShpbnQga2V5Q29kZSk7Ci0KLXByaXZhdGU6Ci0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE1BWF9NRVRBREFUQV9TVFJJTkdfTEVOR1RIID0gMTI4OwotICAgIHZvaWQgY2xlYXJNZXRhZGF0YVZhbHVlcygpOwotCi0gICAgTXV0ZXggICAgICAgICAgICAgICBtTG9jazsKLSAgICBzcDxNaWRpRmlsZT4gICAgICAgIG1NaWRpUGxheWVyOwotICAgIGNoYXIgICAgICAgICAgICAgICAgbU1ldGFkYXRhVmFsdWVzWzFdW01BWF9NRVRBREFUQV9TVFJJTkdfTEVOR1RIXTsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX01JRElNRVRBREFUQVJFVFJJRVZFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKaW5kZXggM2QwOTNmYS4uODY2MzljYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcApAQCAtMjYwLDYgKzI2MCw5IEBACiAgICAgICAgIHJldHVybiAtRUJBREY7CiAgICAgfQogCisgICAgLy8gc3RhcnQgd2l0aCBhIGNsZWFuLCBlbXB0eSBmaWxlCisgICAgZnRydW5jYXRlKGZkLCAwKTsKKwogICAgIGlmIChtT3V0cHV0RmQgPj0gMCkgewogICAgICAgICA6OmNsb3NlKG1PdXRwdXRGZCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1Rlc3RQbGF5ZXJTdHViLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9UZXN0UGxheWVyU3R1Yi5jcHAKaW5kZXggNTc5NTc3My4uYzhiZjZjNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1Rlc3RQbGF5ZXJTdHViLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVGVzdFBsYXllclN0dWIuY3BwCkBAIC00NSw3ICs0NSw3IEBACiB7CiAgICAgY2hhciBwcm9wW1BST1BFUlRZX1ZBTFVFX01BWF0gPSB7ICdcMCcsIH07CiAKLSAgICBwcm9wZXJ0eV9nZXQoa0J1aWxkVHlwZVByb3BOYW1lLCBwcm9wLCAnXDAnKTsKKyAgICBwcm9wZXJ0eV9nZXQoa0J1aWxkVHlwZVByb3BOYW1lLCBwcm9wLCAiXDAiKTsKICAgICByZXR1cm4gc3RyY21wKHByb3AsIGtFbmdCdWlsZCkgPT0gMCB8fCBzdHJjbXAocHJvcCwga1Rlc3RCdWlsZCkgPT0gMDsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuaAppbmRleCBlOTllNTk4Li4zMGVkZTFhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuaApAQCAtMjYsNyArMjYsNyBAQAogCiBzdHJ1Y3QgQUJ1ZmZlcjsKIHN0cnVjdCBBTWVzc2FnZTsKLXN0cnVjdCBNZXRhRGF0YTsKK2NsYXNzIE1ldGFEYXRhOwogc3RydWN0IE51UGxheWVyRHJpdmVyOwogCiBzdHJ1Y3QgTnVQbGF5ZXIgOiBwdWJsaWMgQUhhbmRsZXIgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAKaW5kZXggZTdlMTc1OS4uYmM3OWZkYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwCkBAIC02NTQsOCArNjU0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1BdXRvTG9vcCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtTG9vcGluZyB8fCAobUF1dG9Mb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAobUF1ZGlvU2luayA9PSBOVUxMIHx8IG1BdWRpb1NpbmstPnJlYWx0aW1lKCkpKSkgeworICAgICAgICAgICAgICAgIGlmIChtTG9vcGluZyB8fCBtQXV0b0xvb3ApIHsKICAgICAgICAgICAgICAgICAgICAgbVBsYXllci0+c2Vla1RvQXN5bmMoMCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSByZW5kZXJlciBoYXMgc3RvcHBlZCB0aGUgc2luayBhdCB0aGUgZW5kIGluIG9yZGVyIHRvIHBsYXkgb3V0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclNvdXJjZS5oCmluZGV4IDZkYWFkMWIuLmQ5ZjE0YTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclNvdXJjZS5oCkBAIC0yOCw3ICsyOCw2IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBQnVmZmVyOwotc3RydWN0IE1ldGFEYXRhOwogc3RydWN0IE1lZGlhQnVmZmVyOwogCiBzdHJ1Y3QgTnVQbGF5ZXI6OlNvdXJjZSA6IHB1YmxpYyBBSGFuZGxlciB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQUNXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmNwcAppbmRleCA3Y2M5NDMwLi4yZTQxZDgwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQUNXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FBQ1dyaXRlci5jcHAKQEAgLTgwLDEwICs4MCw2IEBACiAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CiB9CiAKLXN0YXRpYyBpbnQgd3JpdGVJbnQ4KGludCBmZCwgdWludDhfdCB4KSB7Ci0gICAgcmV0dXJuIDo6d3JpdGUoZmQsICZ4LCAxKTsKLX0KLQogCiBzdGF0dXNfdCBBQUNXcml0ZXI6OmFkZFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcAppbmRleCA4NWU5OGYxLi5kNDk1OTRmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKQEAgLTk0MCw3ICs5NDAsNiBAQAogCiBBQ29kZWM6OkJ1ZmZlckluZm8gKkFDb2RlYzo6ZGVxdWV1ZUJ1ZmZlckZyb21OYXRpdmVXaW5kb3coKSB7CiAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciAqYnVmOwotICAgIGludCBmZW5jZUZkID0gLTE7CiAgICAgQ0hFQ0sobU5hdGl2ZVdpbmRvdy5nZXQoKSAhPSBOVUxMKTsKIAogICAgIGlmIChtVHVubmVsZWQpIHsKQEAgLTE1OTcsNyArMTU5NiwxMSBAQAogICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJjaGFubmVsLWNvdW50IiwgJm51bUNoYW5uZWxzKSkgewogICAgICAgICAgICAgZXJyID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlcnIgPSBzZXR1cEc3MTFDb2RlYyhlbmNvZGVyLCBudW1DaGFubmVscyk7CisgICAgICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGU7CisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJzYW1wbGUtcmF0ZSIsICZzYW1wbGVSYXRlKSkgeworICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUgPSA4MDAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXJyID0gc2V0dXBHNzExQ29kZWMoZW5jb2Rlciwgc2FtcGxlUmF0ZSwgbnVtQ2hhbm5lbHMpOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDKSkgewogICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzLCBzYW1wbGVSYXRlLCBjb21wcmVzc2lvbkxldmVsID0gLTE7CkBAIC0yMDUxLDExICsyMDU0LDExIEBACiAgICAgICAgICAgICAxIC8qIG51bUNoYW5uZWxzICovKTsKIH0KIAotc3RhdHVzX3QgQUNvZGVjOjpzZXR1cEc3MTFDb2RlYyhib29sIGVuY29kZXIsIGludDMyX3QgbnVtQ2hhbm5lbHMpIHsKK3N0YXR1c190IEFDb2RlYzo6c2V0dXBHNzExQ29kZWMoYm9vbCBlbmNvZGVyLCBpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgbnVtQ2hhbm5lbHMpIHsKICAgICBDSEVDSyghZW5jb2Rlcik7ICAvLyBYWFggVE9ETwogCiAgICAgcmV0dXJuIHNldHVwUmF3QXVkaW9Gb3JtYXQoCi0gICAgICAgICAgICBrUG9ydEluZGV4SW5wdXQsIDgwMDAgLyogc2FtcGxlUmF0ZSAqLywgbnVtQ2hhbm5lbHMpOworICAgICAgICAgICAga1BvcnRJbmRleElucHV0LCBzYW1wbGVSYXRlLCBudW1DaGFubmVscyk7CiB9CiAKIHN0YXR1c190IEFDb2RlYzo6c2V0dXBGbGFjQ29kZWMoCkBAIC0zMjY1LDcgKzMyNjgsNiBAQAogfQogCiB2b2lkIEFDb2RlYzo6ZGVmZXJNZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgYm9vbCB3YXNFbXB0eUJlZm9yZSA9IG1EZWZlcnJlZFF1ZXVlLmVtcHR5KCk7CiAgICAgbURlZmVycmVkUXVldWUucHVzaF9iYWNrKG1zZyk7CiB9CiAKQEAgLTM5NzYsNyArMzk3OCw2IEBACiAgICAgLy8gb24gdGhlIHNjcmVlbiBhbmQgdGhlbiBiZWVuIHJlcGxhY2VkLCBzbyBhbiBwcmV2aW91cyB2aWRlbyBmcmFtZXMgYXJlCiAgICAgLy8gZ3VhcmFudGVlZCBOT1QgdG8gYmUgY3VycmVudGx5IGRpc3BsYXllZC4KICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJ1ZnMgKyAxOyBpKyspIHsKLSAgICAgICAgaW50IGZlbmNlRmQgPSAtMTsKICAgICAgICAgZXJyID0gbmF0aXZlX3dpbmRvd19kZXF1ZXVlX2J1ZmZlcl9hbmRfd2FpdChtTmF0aXZlV2luZG93LmdldCgpLCAmYW5iKTsKICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgQUxPR0UoImVycm9yIHB1c2hpbmcgYmxhbmsgZnJhbWVzOiBkZXF1ZXVlQnVmZmVyIGZhaWxlZDogJXMgKCVkKSIsCkBAIC00NzU1LDcgKzQ3NTYsNyBAQAogICAgIEFMT0dWKCJOb3cgdW5pbml0aWFsaXplZCIpOwogCiAgICAgaWYgKG1EZWF0aE5vdGlmaWVyICE9IE5VTEwpIHsKLSAgICAgICAgbUNvZGVjLT5tT01YLT5hc0JpbmRlcigpLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyKTsKKyAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUNvZGVjLT5tT01YKS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllcik7CiAgICAgICAgIG1EZWF0aE5vdGlmaWVyLmNsZWFyKCk7CiAgICAgfQogCkBAIC00ODQ4LDcgKzQ4NDksNyBAQAogICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPTVhEaWVkLCBtQ29kZWMtPmlkKCkpOwogCiAgICAgbURlYXRoTm90aWZpZXIgPSBuZXcgRGVhdGhOb3RpZmllcihub3RpZnkpOwotICAgIGlmIChvbXgtPmFzQmluZGVyKCktPmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyKSAhPSBPSykgeworICAgIGlmIChJSW50ZXJmYWNlOjphc0JpbmRlcihvbXgpLT5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllcikgIT0gT0spIHsKICAgICAgICAgLy8gVGhpcyB3YXMgYSBsb2NhbCBiaW5kZXIsIGlmIGl0IGRpZXMgc28gZG8gd2UsIHdlIHdvbid0IGNhcmUKICAgICAgICAgLy8gYWJvdXQgYW55IG5vdGlmaWNhdGlvbnMgaW4gdGhlIGFmdGVybGlmZS4KICAgICAgICAgbURlYXRoTm90aWZpZXIuY2xlYXIoKTsKQEAgLTQ4OTMsNyArNDg5NCw3IEBACiAgICAgICAgIGNvbXBvbmVudE5hbWUgPSBtYXRjaGluZ0NvZGVjcy5pdGVtQXQobWF0Y2hJbmRleCkubU5hbWUuc3RyaW5nKCk7CiAgICAgICAgIHF1aXJrcyA9IG1hdGNoaW5nQ29kZWNzLml0ZW1BdChtYXRjaEluZGV4KS5tUXVpcmtzOwogCi0gICAgICAgIHBpZF90IHRpZCA9IGFuZHJvaWRHZXRUaWQoKTsKKyAgICAgICAgcGlkX3QgdGlkID0gZ2V0dGlkKCk7CiAgICAgICAgIGludCBwcmV2UHJpb3JpdHkgPSBhbmRyb2lkR2V0VGhyZWFkUHJpb3JpdHkodGlkKTsKICAgICAgICAgYW5kcm9pZFNldFRocmVhZFByaW9yaXR5KHRpZCwgQU5EUk9JRF9QUklPUklUWV9GT1JFR1JPVU5EKTsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gb214LT5hbGxvY2F0ZU5vZGUoY29tcG9uZW50TmFtZS5jX3N0cigpLCBvYnNlcnZlciwgJm5vZGUpOwpAQCAtNTY4MCw2ICs1NjgxLDcgQEAKICAgICAgICAgY2FzZSBrV2hhdEZsdXNoOgogICAgICAgICBjYXNlIGtXaGF0U2h1dGRvd246CiAgICAgICAgIGNhc2Uga1doYXRSZXN1bWU6CisgICAgICAgIGNhc2Uga1doYXRTZXRQYXJhbWV0ZXJzOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAobXNnLT53aGF0KCkgPT0ga1doYXRSZXN1bWUpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBEZWZlcnJpbmcgcmVzdW1lIiwgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rCmluZGV4IDE5M2Y4YTcuLjI2MjlhZmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5tawpAQCAtMzYsNiArMzYsNyBAQAogICAgICAgICBNZWRpYUNvZGVjU291cmNlLmNwcCAgICAgICAgICAgICAgXAogICAgICAgICBNZWRpYURlZnMuY3BwICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBNZWRpYUV4dHJhY3Rvci5jcHAgICAgICAgICAgICAgICAgXAorICAgICAgICBNaWRpRXh0cmFjdG9yLmNwcCAgICAgICAgICAgICAgICAgXAogICAgICAgICBodHRwL01lZGlhSFRUUC5jcHAgICAgICAgICAgICAgICAgXAogICAgICAgICBNZWRpYU11eGVyLmNwcCAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBNZWRpYVNvdXJjZS5jcHAgICAgICAgICAgICAgICAgICAgXApAQCAtNjgsMTEgKzY5LDggQEAKICAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCiAgICAgICAgICQoVE9QKS9leHRlcm5hbC9mbGFjL2luY2x1ZGUgXAogICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvdHJlbW9sbyBcCi0gICAgICAgICQoVE9QKS9leHRlcm5hbC9vcGVuc3NsL2luY2x1ZGUgXAogICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvbGlidnB4L2xpYndlYm0gXAogICAgICAgICAkKFRPUCkvc3lzdGVtL25ldGQvaW5jbHVkZSBcCi0gICAgICAgICQoVE9QKS9leHRlcm5hbC9pY3UvaWN1NGMvc291cmNlL2NvbW1vbiBcCi0gICAgICAgICQoVE9QKS9leHRlcm5hbC9pY3UvaWN1NGMvc291cmNlL2kxOG4gXAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGliYmluZGVyIFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAKaW5kZXggM2FkZmVhMC4uODgyMTlhZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAKQEAgLTg4OSwxMCArODg5LDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoKG1GbGFncyAmIExPT1BJTkcpCi0gICAgICAgICAgICB8fCAoKG1GbGFncyAmIEFVVE9fTE9PUElORykKLSAgICAgICAgICAgICAgICAmJiAobUF1ZGlvU2luayA9PSBOVUxMIHx8IG1BdWRpb1NpbmstPnJlYWx0aW1lKCkpKSkgewotICAgICAgICAvLyBEb24ndCBBVVRPX0xPT1AgaWYgd2UncmUgYmVpbmcgcmVjb3JkZWQsIHNpbmNlIHRoYXQgY2Fubm90IGJlCi0gICAgICAgIC8vIHR1cm5lZCBvZmYgYW5kIHJlY29yZGluZyB3b3VsZCBnbyBvbiBpbmRlZmluaXRlbHkuCisgICAgICAgICAgICB8fCAobUZsYWdzICYgQVVUT19MT09QSU5HKSkgewogCiAgICAgICAgIHNlZWtUb19sKDApOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcAppbmRleCBjM2E5NDBhLi5hZDEyYmRkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAKQEAgLTIxOSw3ICsyMTksNyBAQAogICAgICAgICBtQ2FtZXJhRmxhZ3MgfD0gRkxBR1NfSE9UX0NBTUVSQTsKICAgICAgICAgbURlYXRoTm90aWZpZXIgPSBuZXcgRGVhdGhOb3RpZmllcigpOwogICAgICAgICAvLyBpc0JpbmRlckFsaXZlIG5lZWRzIGxpbmtUb0RlYXRoIHRvIHdvcmsuCi0gICAgICAgIG1DYW1lcmFSZWNvcmRpbmdQcm94eS0+YXNCaW5kZXIoKS0+bGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIpOworICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtQ2FtZXJhUmVjb3JkaW5nUHJveHkpLT5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllcik7CiAgICAgfQogCiAgICAgbUNhbWVyYS0+bG9jaygpOwpAQCAtNzAyLDcgKzcwMiw3IEBACiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgICAgICBpZiAobUNhbWVyYVJlY29yZGluZ1Byb3h5ICE9IDApIHsKLSAgICAgICAgICAgIG1DYW1lcmFSZWNvcmRpbmdQcm94eS0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllcik7CisgICAgICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtQ2FtZXJhUmVjb3JkaW5nUHJveHkpLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyKTsKICAgICAgICAgICAgIG1DYW1lcmFSZWNvcmRpbmdQcm94eS5jbGVhcigpOwogICAgICAgICB9CiAgICAgICAgIG1DYW1lcmFGbGFncyA9IDA7CkBAIC04MjUsNyArODI1LDcgQEAKICAgICAgICAgICAgICAgICBtRnJhbWVBdmFpbGFibGVDb25kaXRpb24ud2FpdFJlbGF0aXZlKG1Mb2NrLAogICAgICAgICAgICAgICAgICAgICBtVGltZUJldHdlZW5GcmFtZUNhcHR1cmVVcyAqIDEwMDBMTCArIENBTUVSQV9TT1VSQ0VfVElNRU9VVF9OUykpIHsKICAgICAgICAgICAgICAgICBpZiAobUNhbWVyYVJlY29yZGluZ1Byb3h5ICE9IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgIW1DYW1lcmFSZWNvcmRpbmdQcm94eS0+YXNCaW5kZXIoKS0+aXNCaW5kZXJBbGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICFJSW50ZXJmYWNlOjphc0JpbmRlcihtQ2FtZXJhUmVjb3JkaW5nUHJveHkpLT5pc0JpbmRlckFsaXZlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNhbWVyYSByZWNvcmRpbmcgcHJveHkgaXMgZ29uZSIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuY3BwCmluZGV4IDY1YWQwZjEuLmRjM2IzOTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuY3BwCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSAiaW5jbHVkZS9EUk1FeHRyYWN0b3IuaCIKICNpbmNsdWRlICJpbmNsdWRlL0ZMQUNFeHRyYWN0b3IuaCIKICNpbmNsdWRlICJpbmNsdWRlL0hUVFBCYXNlLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9NaWRpRXh0cmFjdG9yLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9NUDNFeHRyYWN0b3IuaCIKICNpbmNsdWRlICJpbmNsdWRlL01QRUcyUFNFeHRyYWN0b3IuaCIKICNpbmNsdWRlICJpbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaCIKQEAgLTE3Miw2ICsxNzMsNyBAQAogICAgIFJlZ2lzdGVyU25pZmZlcl9sKFNuaWZmQUFDKTsKICAgICBSZWdpc3RlclNuaWZmZXJfbChTbmlmZk1QRUcyUFMpOwogICAgIFJlZ2lzdGVyU25pZmZlcl9sKFNuaWZmV1ZNKTsKKyAgICBSZWdpc3RlclNuaWZmZXJfbChTbmlmZk1pZGkpOwogCiAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwogICAgIGlmIChwcm9wZXJ0eV9nZXQoImRybS5zZXJ2aWNlLmVuYWJsZWQiLCB2YWx1ZSwgTlVMTCkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0RXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0RXh0cmFjdG9yLmNwcAppbmRleCAyNTUwMjUzLi4yYzQ3MmRjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNEV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRFeHRyYWN0b3IuY3BwCkBAIC0yNjksNiArMjY5LDggQEAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAorc3RhdGljIGNvbnN0IGJvb2wga1VzZUhleER1bXAgPSBmYWxzZTsKKwogc3RhdGljIHZvaWQgaGV4ZHVtcChjb25zdCB2b2lkICpfZGF0YSwgc2l6ZV90IHNpemUpIHsKICAgICBjb25zdCB1aW50OF90ICpkYXRhID0gKGNvbnN0IHVpbnQ4X3QgKilfZGF0YTsKICAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKQEAgLTYxMSw3ICs2MTMsNiBAQAogICAgIGlmIChzaXplIDwgMCkgewogICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgfQotICAgIGludDMyX3QgY2xhc3NTaXplID0gc2l6ZTsKICAgICBkYXRhX29mZnNldCArPSBudW1PZkJ5dGVzOwogCiAgICAgd2hpbGUoc2l6ZSA+PSAxMSApIHsKQEAgLTY3Miw3ICs2NzMsNiBAQAogICAgIGlmIChzaXplIDwgMCkgewogICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgfQotICAgIGNsYXNzU2l6ZSA9IHNpemU7CiAgICAgZGF0YV9vZmZzZXQgKz0gbnVtT2ZCeXRlczsKIAogICAgIHdoaWxlIChzaXplID4gMCkgewpAQCAtNzcwLDcgKzc3MCw3IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICB9CiAgICAgdWludDY0X3QgY2h1bmtfc2l6ZSA9IG50b2hsKGhkclswXSk7Ci0gICAgdWludDMyX3QgY2h1bmtfdHlwZSA9IG50b2hsKGhkclsxXSk7CisgICAgaW50MzJfdCBjaHVua190eXBlID0gbnRvaGwoaGRyWzFdKTsKICAgICBvZmY2NF90IGRhdGFfb2Zmc2V0ID0gKm9mZnNldCArIDg7CiAKICAgICBpZiAoY2h1bmtfc2l6ZSA9PSAxKSB7CkBAIC04MTAsMjMgKzgxMCwyMyBAQAogICAgIE1ha2VGb3VyQ0NTdHJpbmcoY2h1bmtfdHlwZSwgY2h1bmspOwogICAgIEFMT0dWKCJjaHVuazogJXMgQCAlbGxkLCAlZCIsIGNodW5rLCAqb2Zmc2V0LCBkZXB0aCk7CiAKLSNpZiAwCi0gICAgc3RhdGljIGNvbnN0IGNoYXIga1doaXRlc3BhY2VbXSA9ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsKLSAgICBjb25zdCBjaGFyICppbmRlbnQgPSAma1doaXRlc3BhY2Vbc2l6ZW9mKGtXaGl0ZXNwYWNlKSAtIDEgLSAyICogZGVwdGhdOwotICAgIHByaW50ZigiJXNmb3VuZCBjaHVuayAnJXMnIG9mIHNpemUgJSIgUFJJdTY0ICJcbiIsIGluZGVudCwgY2h1bmssIGNodW5rX3NpemUpOworICAgIGlmIChrVXNlSGV4RHVtcCkgeworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBrV2hpdGVzcGFjZVtdID0gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOworICAgICAgICBjb25zdCBjaGFyICppbmRlbnQgPSAma1doaXRlc3BhY2Vbc2l6ZW9mKGtXaGl0ZXNwYWNlKSAtIDEgLSAyICogZGVwdGhdOworICAgICAgICBwcmludGYoIiVzZm91bmQgY2h1bmsgJyVzJyBvZiBzaXplICUiIFBSSXU2NCAiXG4iLCBpbmRlbnQsIGNodW5rLCBjaHVua19zaXplKTsKIAotICAgIGNoYXIgYnVmZmVyWzI1Nl07Ci0gICAgc2l6ZV90IG4gPSBjaHVua19zaXplOwotICAgIGlmIChuID4gc2l6ZW9mKGJ1ZmZlcikpIHsKLSAgICAgICAgbiA9IHNpemVvZihidWZmZXIpOwotICAgIH0KLSAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgqb2Zmc2V0LCBidWZmZXIsIG4pCi0gICAgICAgICAgICA8IChzc2l6ZV90KW4pIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgIH0KKyAgICAgICAgY2hhciBidWZmZXJbMjU2XTsKKyAgICAgICAgc2l6ZV90IG4gPSBjaHVua19zaXplOworICAgICAgICBpZiAobiA+IHNpemVvZihidWZmZXIpKSB7CisgICAgICAgICAgICBuID0gc2l6ZW9mKGJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCwgYnVmZmVyLCBuKQorICAgICAgICAgICAgICAgIDwgKHNzaXplX3QpbikgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICB9CiAKLSAgICBoZXhkdW1wKGJ1ZmZlciwgbik7Ci0jZW5kaWYKKyAgICAgICAgaGV4ZHVtcChidWZmZXIsIG4pOworICAgIH0KIAogICAgIFBhdGhBZGRlciBhdXRvQWRkZXIoJm1QYXRoLCBjaHVua190eXBlKTsKIApAQCAtMTE3Niw2ICsxMTc2LDExIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAoIXRpbWVzY2FsZSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJ0aW1lc2NhbGUgc2hvdWxkIG5vdCBiZSBaRVJPLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIG1MYXN0VHJhY2stPnRpbWVzY2FsZSA9IG50b2hsKHRpbWVzY2FsZSk7CiAKICAgICAgICAgICAgIC8vIDE0NDk2LTEyIHNheXMgYWxsIG9uZXMgbWVhbnMgaW5kZXRlcm1pbmF0ZSwgYnV0IHNvbWUgZmlsZXMgc2VlbSB0byB1c2UKQEAgLTEzMDUsNyArMTMxMCw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICB1aW50MTZfdCBkYXRhX3JlZl9pbmRleCA9IFUxNl9BVCgmYnVmZmVyWzZdKTsKKyAgICAgICAgICAgIHVpbnQxNl90IGRhdGFfcmVmX2luZGV4IF9fdW51c2VkID0gVTE2X0FUKCZidWZmZXJbNl0pOwogICAgICAgICAgICAgdWludDMyX3QgbnVtX2NoYW5uZWxzID0gVTE2X0FUKCZidWZmZXJbMTZdKTsKIAogICAgICAgICAgICAgdWludDE2X3Qgc2FtcGxlX3NpemUgPSBVMTZfQVQoJmJ1ZmZlclsxOF0pOwpAQCAtMTM1OCw3ICsxMzYzLDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHVpbnQxNl90IGRhdGFfcmVmX2luZGV4ID0gVTE2X0FUKCZidWZmZXJbNl0pOworICAgICAgICAgICAgdWludDE2X3QgZGF0YV9yZWZfaW5kZXggX191bnVzZWQgPSBVMTZfQVQoJmJ1ZmZlcls2XSk7CiAgICAgICAgICAgICB1aW50MTZfdCB3aWR0aCA9IFUxNl9BVCgmYnVmZmVyWzYgKyAxOF0pOwogICAgICAgICAgICAgdWludDE2X3QgaGVpZ2h0ID0gVTE2X0FUKCZidWZmZXJbNiArIDIwXSk7CiAKQEAgLTE1NTIsMTMgKzE1NTcsMTMgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gQHh5egotICAgICAgICBjYXNlIEZPVVJDQygnXHhBOScsICd4JywgJ3knLCAneicpOgorICAgICAgICAvLyCpeHl6CisgICAgICAgIGNhc2UgRk9VUkNDKDB4QTksICd4JywgJ3knLCAneicpOgogICAgICAgICB7CiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAKLSAgICAgICAgICAgIC8vIEJlc3QgY2FzZSB0aGUgdG90YWwgZGF0YSBsZW5ndGggaW5zaWRlICJAeHl6IiBib3gKLSAgICAgICAgICAgIC8vIHdvdWxkIGJlIDgsIGZvciBpbnN0YW5jZSAiQHh5eiIgKyAiXHgwMFx4MDRceDE1XHhjNyIgKyAiMCswLyIsCisgICAgICAgICAgICAvLyBCZXN0IGNhc2UgdGhlIHRvdGFsIGRhdGEgbGVuZ3RoIGluc2lkZSAiqXh5eiIgYm94CisgICAgICAgICAgICAvLyB3b3VsZCBiZSA4LCBmb3IgaW5zdGFuY2UgIql4eXoiICsgIlx4MDBceDA0XHgxNVx4YzciICsgIjArMC8iLAogICAgICAgICAgICAgLy8gd2hlcmUgIlx4MDBceDA0IiBpcyB0aGUgdGV4dCBzdHJpbmcgbGVuZ3RoIHdpdGggdmFsdWUgPSA0LAogICAgICAgICAgICAgLy8gIlwweDE1XHhjNyIgaXMgdGhlIGxhbmd1YWdlIGNvZGUgPSBlbiwgYW5kICIwKzAiIGlzIGEKICAgICAgICAgICAgIC8vIGxvY2F0aW9uIChzdHJpbmcpIHZhbHVlIHdpdGggbG9uZ2l0dWRlID0gMCBhbmQgbGF0aXR1ZGUgPSAwLgpAQCAtMTg4OCw3ICsxODkzLDYgQEAKICAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCAyNCkgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVpbnQzMl90IGR1cmF0aW9uOwogICAgICAgICAgICAgVHJleCB0cmV4OwogICAgICAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKGRhdGFfb2Zmc2V0ICsgNCwgJnRyZXgudHJhY2tfSUQpIHx8CiAgICAgICAgICAgICAgICAgIW1EYXRhU291cmNlLT5nZXRVSW50MzIoZGF0YV9vZmZzZXQgKyA4LCAmdHJleC5kZWZhdWx0X3NhbXBsZV9kZXNjcmlwdGlvbl9pbmRleCkgfHwKQEAgLTIxNzIsNyArMjE3Niw3IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICB9CiAKLSAgICB1aW50NjRfdCBjdGltZSwgbXRpbWUsIGR1cmF0aW9uOworICAgIHVpbnQ2NF90IGN0aW1lIF9fdW51c2VkLCBtdGltZSBfX3VudXNlZCwgZHVyYXRpb24gX191bnVzZWQ7CiAgICAgaW50MzJfdCBpZDsKIAogICAgIGlmICh2ZXJzaW9uID09IDEpIHsKQEAgLTIxOTQsMTIgKzIxOTgsMTMgQEAKICAgICBzaXplX3QgbWF0cml4T2Zmc2V0ID0gZHluU2l6ZSArIDE2OwogICAgIGludDMyX3QgYTAwID0gVTMyX0FUKCZidWZmZXJbbWF0cml4T2Zmc2V0XSk7CiAgICAgaW50MzJfdCBhMDEgPSBVMzJfQVQoJmJ1ZmZlclttYXRyaXhPZmZzZXQgKyA0XSk7Ci0gICAgaW50MzJfdCBkeCA9IFUzMl9BVCgmYnVmZmVyW21hdHJpeE9mZnNldCArIDhdKTsKICAgICBpbnQzMl90IGExMCA9IFUzMl9BVCgmYnVmZmVyW21hdHJpeE9mZnNldCArIDEyXSk7CiAgICAgaW50MzJfdCBhMTEgPSBVMzJfQVQoJmJ1ZmZlclttYXRyaXhPZmZzZXQgKyAxNl0pOwotICAgIGludDMyX3QgZHkgPSBVMzJfQVQoJmJ1ZmZlclttYXRyaXhPZmZzZXQgKyAyMF0pOwogCiAjaWYgMAorICAgIGludDMyX3QgZHggPSBVMzJfQVQoJmJ1ZmZlclttYXRyaXhPZmZzZXQgKyA4XSk7CisgICAgaW50MzJfdCBkeSA9IFUzMl9BVCgmYnVmZmVyW21hdHJpeE9mZnNldCArIDIwXSk7CisKICAgICBBTE9HSSgieCcgPSAlLjJmICogeCArICUuMmYgKiB5ICsgJS4yZiIsCiAgICAgICAgICBhMDAgLyA2NTUzNi4wZiwgYTAxIC8gNjU1MzYuMGYsIGR4IC8gNjU1MzYuMGYpOwogICAgIEFMT0dJKCJ5JyA9ICUuMmYgKiB4ICsgJS4yZiAqIHkgKyAlLjJmIiwKQEAgLTIyNjAsNyArMjI2NSw3IEBACiAgICAgY2hhciBjaHVua1s1XTsKICAgICBNYWtlRm91ckNDU3RyaW5nKG1QYXRoWzRdLCBjaHVuayk7CiAgICAgQUxPR1YoIm1ldGE6ICVzIEAgJWxsZCIsIGNodW5rLCBvZmZzZXQpOwotICAgIHN3aXRjaCAobVBhdGhbNF0pIHsKKyAgICBzd2l0Y2ggKChpbnQzMl90KW1QYXRoWzRdKSB7CiAgICAgICAgIGNhc2UgRk9VUkNDKDB4YTksICdhJywgJ2wnLCAnYicpOgogICAgICAgICB7CiAgICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlBbGJ1bTsKQEAgLTI2NzcsNiArMjY4MiwxMSBAQAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAorICAgIGlmICh0cmFjay0+dGltZXNjYWxlID09IDApIHsKKyAgICAgICAgQUxPR0UoInRpbWVzY2FsZSBpbnZhbGlkLiIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMjc2MiwxMCArMjc3MiwxMCBAQAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAotI2lmIDAKLSAgICBwcmludGYoIkVTRCBvZiBzaXplICVkXG4iLCBjc2Rfc2l6ZSk7Ci0gICAgaGV4ZHVtcChjc2QsIGNzZF9zaXplKTsKLSNlbmRpZgorICAgIGlmIChrVXNlSGV4RHVtcCkgeworICAgICAgICBwcmludGYoIkVTRCBvZiBzaXplICVkXG4iLCBjc2Rfc2l6ZSk7CisgICAgICAgIGhleGR1bXAoY3NkLCBjc2Rfc2l6ZSk7CisgICAgfQogCiAgICAgaWYgKGNzZF9zaXplID09IDApIHsKICAgICAgICAgLy8gVGhlcmUncyBubyBmdXJ0aGVyIGluZm9ybWF0aW9uLCBpLmUuIG5vIGNvZGVjIHNwZWNpZmljIGRhdGEKQEAgLTI4MTYsNyArMjgyNiw3IEBACiAKICAgICBpZiAob2JqZWN0VHlwZSA9PSBBT1RfU0JSIHx8IG9iamVjdFR5cGUgPT0gQU9UX1BTKSB7Ly9TQlIgc3BlY2lmaWMgY29uZmlnIHBlciAxNDQ5Ni0zIHRhYmxlIDEuMTMKICAgICAgICAgdWludDMyX3QgZXh0RnJlcUluZGV4ID0gYnIuZ2V0Qml0cyg0KTsKLSAgICAgICAgaW50MzJfdCBleHRTYW1wbGVSYXRlOworICAgICAgICBpbnQzMl90IGV4dFNhbXBsZVJhdGUgX191bnVzZWQ7CiAgICAgICAgIGlmIChleHRGcmVxSW5kZXggPT0gMTUpIHsKICAgICAgICAgICAgIGlmIChjc2Rfc2l6ZSA8IDgpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwpAQCAtMjg2NiwxMiArMjg3NiwxMiBAQAogICAgICAgICBpZiAob2JqZWN0VHlwZSA9PSBBT1RfQUFDX0xDIHx8IG9iamVjdFR5cGUgPT0gQU9UX0VSX0FBQ19MQyB8fAogICAgICAgICAgICAgICAgIG9iamVjdFR5cGUgPT0gQU9UX0VSX0FBQ19MRCB8fCBvYmplY3RUeXBlID09IEFPVF9FUl9BQUNfU0NBTCB8fAogICAgICAgICAgICAgICAgIG9iamVjdFR5cGUgPT0gQU9UX0VSX0JTQUMpIHsKLSAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZnJhbWVMZW5ndGhGbGFnID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZnJhbWVMZW5ndGhGbGFnIF9fdW51c2VkID0gYnIuZ2V0Qml0cygxKTsKIAogICAgICAgICAgICAgY29uc3QgaW50MzJfdCBkZXBlbmRzT25Db3JlQ29kZXIgPSBici5nZXRCaXRzKDEpOwogCiAgICAgICAgICAgICBpZiAoZGVwZW5kc09uQ29yZUNvZGVyICkgewotICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgY29yZUNvZGVyRGVsYXkgPSBici5nZXRCaXRzKDE0KTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGNvcmVDb2RlckRlbGF5IF9fdW51c2VkID0gYnIuZ2V0Qml0cygxNCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGludDMyX3QgZXh0ZW5zaW9uRmxhZyA9IC0xOwpAQCAtMjkwMCw1NCArMjkxMCw1NCBAQAogICAgICAgICAgICAgaWYgKG51bUNoYW5uZWxzID09IDApIHsKICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxzRWZmZWN0aXZlTnVtID0gMDsKICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxzTnVtID0gMDsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IEVsZW1lbnRJbnN0YW5jZVRhZyA9IGJyLmdldEJpdHMoNCk7Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBQcm9maWxlID0gYnIuZ2V0Qml0cygyKTsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFNhbXBsaW5nRnJlcXVlbmN5SW5kZXggPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgRWxlbWVudEluc3RhbmNlVGFnIF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFByb2ZpbGUgX191bnVzZWQgPSBici5nZXRCaXRzKDIpOworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgU2FtcGxpbmdGcmVxdWVuY3lJbmRleCBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7CiAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1Gcm9udENoYW5uZWxFbGVtZW50cyA9IGJyLmdldEJpdHMoNCk7CiAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1TaWRlQ2hhbm5lbEVsZW1lbnRzID0gYnIuZ2V0Qml0cyg0KTsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE51bUJhY2tDaGFubmVsRWxlbWVudHMgPSBici5nZXRCaXRzKDQpOwogICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTnVtTGZlQ2hhbm5lbEVsZW1lbnRzID0gYnIuZ2V0Qml0cygyKTsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE51bUFzc29jRGF0YUVsZW1lbnRzID0gYnIuZ2V0Qml0cygzKTsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE51bVZhbGlkQ2NFbGVtZW50cyA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1Bc3NvY0RhdGFFbGVtZW50cyBfX3VudXNlZCA9IGJyLmdldEJpdHMoMyk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1WYWxpZENjRWxlbWVudHMgX191bnVzZWQgPSBici5nZXRCaXRzKDQpOwogCiAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBNb25vTWl4ZG93blByZXNlbnQgPSBici5nZXRCaXRzKDEpOwogICAgICAgICAgICAgICAgIGlmIChNb25vTWl4ZG93blByZXNlbnQgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE1vbm9NaXhkb3duRWxlbWVudE51bWJlciA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTW9ub01peGRvd25FbGVtZW50TnVtYmVyIF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFN0ZXJlb01peGRvd25QcmVzZW50ID0gYnIuZ2V0Qml0cygxKTsKICAgICAgICAgICAgICAgICBpZiAoU3RlcmVvTWl4ZG93blByZXNlbnQgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFN0ZXJlb01peGRvd25FbGVtZW50TnVtYmVyID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBTdGVyZW9NaXhkb3duRWxlbWVudE51bWJlciBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBNYXRyaXhNaXhkb3duSW5kZXhQcmVzZW50ID0gYnIuZ2V0Qml0cygxKTsKICAgICAgICAgICAgICAgICBpZiAoTWF0cml4TWl4ZG93bkluZGV4UHJlc2VudCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTWF0cml4TWl4ZG93bkluZGV4ID0gYnIuZ2V0Qml0cygyKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBQc2V1ZG9TdXJyb3VuZEVuYWJsZSA9IGJyLmdldEJpdHMoMSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTWF0cml4TWl4ZG93bkluZGV4IF9fdW51c2VkID0gYnIuZ2V0Qml0cygyKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBQc2V1ZG9TdXJyb3VuZEVuYWJsZSBfX3VudXNlZCA9IGJyLmdldEJpdHMoMSk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaW50IGk7CiAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBOdW1Gcm9udENoYW5uZWxFbGVtZW50czsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgRnJvbnRFbGVtZW50SXNDcGUgPSBici5nZXRCaXRzKDEpOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IEZyb250RWxlbWVudFRhZ1NlbGVjdCA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgRnJvbnRFbGVtZW50VGFnU2VsZWN0IF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNOdW0gKz0gRnJvbnRFbGVtZW50SXNDcGUgPyAyIDogMTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IE51bVNpZGVDaGFubmVsRWxlbWVudHM7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFNpZGVFbGVtZW50SXNDcGUgPSBici5nZXRCaXRzKDEpOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFNpZGVFbGVtZW50VGFnU2VsZWN0ID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBTaWRlRWxlbWVudFRhZ1NlbGVjdCBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7CiAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzTnVtICs9IFNpZGVFbGVtZW50SXNDcGUgPyAyIDogMTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IE51bUJhY2tDaGFubmVsRWxlbWVudHM7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IEJhY2tFbGVtZW50SXNDcGUgPSBici5nZXRCaXRzKDEpOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IEJhY2tFbGVtZW50VGFnU2VsZWN0ID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBCYWNrRWxlbWVudFRhZ1NlbGVjdCBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7CiAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzTnVtICs9IEJhY2tFbGVtZW50SXNDcGUgPyAyIDogMTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2hhbm5lbHNFZmZlY3RpdmVOdW0gPSBjaGFubmVsc051bTsKIAogICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgTnVtTGZlQ2hhbm5lbEVsZW1lbnRzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBMZmVFbGVtZW50VGFnU2VsZWN0ID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBMZmVFbGVtZW50VGFnU2VsZWN0IF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNOdW0gKz0gMTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQUxPR1YoIm1wZWc0IGF1ZGlvIGNoYW5uZWxzTnVtID0gJWQiLCBjaGFubmVsc051bSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAKaW5kZXggOWYyMGIxZC4uODQ0YTAxOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcApAQCAtODIzLDYgKzgyMyw4IEBACiAgICAgbUZkID0gLTE7CiAgICAgbUluaXRDaGVjayA9IE5PX0lOSVQ7CiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICBmcmVlKG1Nb292Qm94QnVmZmVyKTsKKyAgICBtTW9vdkJveEJ1ZmZlciA9IE5VTEw7CiB9CiAKIHN0YXR1c190IE1QRUc0V3JpdGVyOjpyZXNldCgpIHsKQEAgLTI4MDAsOCArMjgwMiwxMCBAQAogCiAgICAgbU93bmVyLT53cml0ZUludDE2KDB4MDMpOyAgLy8gWFhYCiAgICAgbU93bmVyLT53cml0ZUludDgoMHgwMCk7ICAgLy8gYnVmZmVyIHNpemUgMjQtYml0Ci0gICAgbU93bmVyLT53cml0ZUludDMyKDk2MDAwKTsgLy8gbWF4IGJpdCByYXRlCi0gICAgbU93bmVyLT53cml0ZUludDMyKDk2MDAwKTsgLy8gYXZnIGJpdCByYXRlCisgICAgaW50MzJfdCBiaXRSYXRlOworICAgIGJvb2wgc3VjY2VzcyA9IG1NZXRhLT5maW5kSW50MzIoa0tleUJpdFJhdGUsICZiaXRSYXRlKTsKKyAgICBtT3duZXItPndyaXRlSW50MzIoc3VjY2VzcyA/IGJpdFJhdGUgOiA5NjAwMCk7IC8vIG1heCBiaXQgcmF0ZQorICAgIG1Pd25lci0+d3JpdGVJbnQzMihzdWNjZXNzID8gYml0UmF0ZSA6IDk2MDAwKTsgLy8gYXZnIGJpdCByYXRlCiAKICAgICBtT3duZXItPndyaXRlSW50OCgweDA1KTsgICAvLyBEZWNvZGVyU3BlY2lmaWNJbmZvVGFnCiAgICAgbU93bmVyLT53cml0ZUludDgobUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCmluZGV4IGE5YzNhMDQuLjZjYTEyM2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCkBAIC0xNzExLDcgKzE3MTEsNyBAQAogICAgIHNpemVfdCBpID0gMDsKICAgICBmb3IgKDs7KSB7CiAgICAgICAgIHNwPEFCdWZmZXI+IGNzZDsKLSAgICAgICAgaWYgKCFmb3JtYXQtPmZpbmRCdWZmZXIoU3RyaW5nUHJpbnRmKCJjc2QtJXUiLCBpKS5jX3N0cigpLCAmY3NkKSkgeworICAgICAgICBpZiAoIWZvcm1hdC0+ZmluZEJ1ZmZlcihBU3RyaW5nUHJpbnRmKCJjc2QtJXUiLCBpKS5jX3N0cigpLCAmY3NkKSkgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMjIzNCw3ICsyMjM0LDcgQEAKICAgICAgICAgICAgIG1lbWNweShjc2QtPmRhdGEoKSArIDQsIG5hbFN0YXJ0LCBuYWxTaXplKTsKIAogICAgICAgICAgICAgbU91dHB1dEZvcm1hdC0+c2V0QnVmZmVyKAotICAgICAgICAgICAgICAgICAgICBTdHJpbmdQcmludGYoImNzZC0ldSIsIGNzZEluZGV4KS5jX3N0cigpLCBjc2QpOworICAgICAgICAgICAgICAgICAgICBBU3RyaW5nUHJpbnRmKCJjc2QtJXUiLCBjc2RJbmRleCkuY19zdHIoKSwgY3NkKTsKIAogICAgICAgICAgICAgKytjc2RJbmRleDsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRGVmcy5jcHAKaW5kZXggYzVhNjkzOS4uYzQ4YTVhZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYURlZnMuY3BwCkBAIC0zNCw2ICszNCw3IEBACiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHID0gImF1ZGlvL21wZWciOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR19MQVlFUl9JID0gImF1ZGlvL21wZWctTDEiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR19MQVlFUl9JSSA9ICJhdWRpby9tcGVnLUwyIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01JREkgPSAiYXVkaW8vbWlkaSI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUMgPSAiYXVkaW8vbXA0YS1sYXRtIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1FDRUxQID0gImF1ZGlvL3FjZWxwIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUyA9ICJhdWRpby92b3JiaXMiOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuY3BwCmluZGV4IDlhYjY2MTEuLmUyMWZlNmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5jcHAKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlICJpbmNsdWRlL1dWTUV4dHJhY3Rvci5oIgogI2luY2x1ZGUgImluY2x1ZGUvRkxBQ0V4dHJhY3Rvci5oIgogI2luY2x1ZGUgImluY2x1ZGUvQUFDRXh0cmFjdG9yLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9NaWRpRXh0cmFjdG9yLmgiCiAKICNpbmNsdWRlICJtYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5oIgogCkBAIC0xMTYsNiArMTE3LDggQEAKICAgICAgICAgcmV0ID0gbmV3IEFBQ0V4dHJhY3Rvcihzb3VyY2UsIG1ldGEpOwogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUcyUFMpKSB7CiAgICAgICAgIHJldCA9IG5ldyBNUEVHMlBTRXh0cmFjdG9yKHNvdXJjZSk7CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19NSURJKSkgeworICAgICAgICByZXQgPSBuZXcgTWlkaUV4dHJhY3Rvcihzb3VyY2UpOwogICAgIH0KIAogICAgIGlmIChyZXQgIT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWlkaUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NaWRpRXh0cmFjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmZhYjc3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWlkaUV4dHJhY3Rvci5jcHAKQEAgLTAsMCArMSwzMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1pZGlFeHRyYWN0b3IiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJpbmNsdWRlL01pZGlFeHRyYWN0b3IuaCIKKworI2luY2x1ZGUgPG1lZGlhL01pZGlJb1dyYXBwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bGlic29uaXZveC9lYXNfcmV2ZXJiLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gaG93IG1hbnkgU29uaXZveCBvdXRwdXQgYnVmZmVycyB0byBhZ2dyZWdhdGUgaW50byBvbmUgTWVkaWFCdWZmZXIKK3N0YXRpYyBjb25zdCBpbnQgTlVNX0NPTUJJTkVfQlVGRkVSUyA9IDQ7CisKK2NsYXNzIE1pZGlTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgeworCitwdWJsaWM6CisgICAgTWlkaVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPE1pZGlFbmdpbmU+ICZlbmdpbmUsCisgICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJnRyYWNrTWV0YWRhdGEpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+TWlkaVNvdXJjZSgpOworCitwcml2YXRlOgorICAgIHNwPE1pZGlFbmdpbmU+IG1FbmdpbmU7CisgICAgc3A8TWV0YURhdGE+IG1UcmFja01ldGFkYXRhOworICAgIGJvb2wgbUluaXRDaGVjazsKKyAgICBib29sIG1TdGFydGVkOworCisgICAgc3RhdHVzX3QgaW5pdCgpOworCisgICAgLy8gbm8gY29weSBjb25zdHJ1Y3RvciBvciBhc3NpZ25tZW50CisgICAgTWlkaVNvdXJjZShjb25zdCBNaWRpU291cmNlICYpOworICAgIE1pZGlTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBNaWRpU291cmNlICYpOworCit9OworCisKKy8vIE1pZGlzb3VyY2UKKworTWlkaVNvdXJjZTo6TWlkaVNvdXJjZSgKKyAgICAgICAgY29uc3Qgc3A8TWlkaUVuZ2luZT4gJmVuZ2luZSwKKyAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZ0cmFja01ldGFkYXRhKQorICAgIDogbUVuZ2luZShlbmdpbmUpLAorICAgICAgbVRyYWNrTWV0YWRhdGEodHJhY2tNZXRhZGF0YSksCisgICAgICBtSW5pdENoZWNrKGZhbHNlKSwKKyAgICAgIG1TdGFydGVkKGZhbHNlKQoreworICAgIEFMT0dWKCJNaWRpU291cmNlIGN0b3IiKTsKKyAgICBtSW5pdENoZWNrID0gaW5pdCgpOworfQorCitNaWRpU291cmNlOjp+TWlkaVNvdXJjZSgpCit7CisgICAgQUxPR1YoIk1pZGlTb3VyY2UgZHRvciIpOworICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICBzdG9wKCk7CisgICAgfQorfQorCitzdGF0dXNfdCBNaWRpU291cmNlOjpzdGFydChNZXRhRGF0YSAqIC8qIHBhcmFtcyAqLykKK3sKKyAgICBBTE9HVigiTWlkaVNvdXJjZTo6c3RhcnQiKTsKKworICAgIENIRUNLKCFtU3RhcnRlZCk7CisgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgIG1FbmdpbmUtPmFsbG9jYXRlQnVmZmVycygpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTWlkaVNvdXJjZTo6c3RvcCgpCit7CisgICAgQUxPR1YoIk1pZGlTb3VyY2U6OnN0b3AiKTsKKworICAgIENIRUNLKG1TdGFydGVkKTsKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgIG1FbmdpbmUtPnJlbGVhc2VCdWZmZXJzKCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3NwPE1ldGFEYXRhPiBNaWRpU291cmNlOjpnZXRGb3JtYXQoKQoreworICAgIHJldHVybiBtVHJhY2tNZXRhZGF0YTsKK30KKworc3RhdHVzX3QgTWlkaVNvdXJjZTo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXIgKipvdXRCdWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKQoreworICAgIEFMT0dWKCJNaWRpU291cmNlOjpyZWFkIik7CisgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKKyAgICAvLyBwcm9jZXNzIGFuIG9wdGlvbmFsIHNlZWsgcmVxdWVzdAorICAgIGludDY0X3Qgc2Vla1RpbWVVczsKKyAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKKyAgICBpZiAoKE5VTEwgIT0gb3B0aW9ucykgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKKyAgICAgICAgaWYgKHNlZWtUaW1lVXMgPD0gMExMKSB7CisgICAgICAgICAgICBzZWVrVGltZVVzID0gMExMOworICAgICAgICB9CisgICAgICAgIG1FbmdpbmUtPnNlZWtUbyhzZWVrVGltZVVzKTsKKyAgICB9CisgICAgYnVmZmVyID0gbUVuZ2luZS0+cmVhZEJ1ZmZlcigpOworICAgICpvdXRCdWZmZXIgPSBidWZmZXI7CisgICAgQUxPR1YoIk1pZGlTb3VyY2U6OnJlYWQgJXAgZG9uZSIsIHRoaXMpOworICAgIHJldHVybiBidWZmZXIgIT0gTlVMTCA/IChzdGF0dXNfdCkgT0sgOiAoc3RhdHVzX3QpIEVSUk9SX0VORF9PRl9TVFJFQU07Cit9CisKK3N0YXR1c190IE1pZGlTb3VyY2U6OmluaXQoKQoreworICAgIEFMT0dWKCJNaWRpU291cmNlOjppbml0Iik7CisgICAgcmV0dXJuIE9LOworfQorCisvLyBNaWRpRW5naW5lCisKK01pZGlFbmdpbmU6Ok1pZGlFbmdpbmUoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFTb3VyY2UsCisgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmZmlsZU1ldGFkYXRhLAorICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJnRyYWNrTWV0YWRhdGEpIDoKKyAgICAgICAgICAgIG1Hcm91cChOVUxMKSwKKyAgICAgICAgICAgIG1FYXNEYXRhKE5VTEwpLAorICAgICAgICAgICAgbUVhc0hhbmRsZShOVUxMKSwKKyAgICAgICAgICAgIG1FYXNDb25maWcoTlVMTCksCisgICAgICAgICAgICBtSXNJbml0aWFsaXplZChmYWxzZSkgeworICAgIG1Jb1dyYXBwZXIgPSBuZXcgTWlkaUlvV3JhcHBlcihkYXRhU291cmNlKTsKKyAgICAvLyBzcGluIHVwIGEgbmV3IEVBUyBlbmdpbmUKKyAgICBFQVNfSTMyIHRlbXA7CisgICAgRUFTX1JFU1VMVCByZXN1bHQgPSBFQVNfSW5pdCgmbUVhc0RhdGEpOworCisgICAgaWYgKHJlc3VsdCA9PSBFQVNfU1VDQ0VTUykgeworICAgICAgICByZXN1bHQgPSBFQVNfT3BlbkZpbGUobUVhc0RhdGEsIG1Jb1dyYXBwZXItPmdldExvY2F0b3IoKSwgJm1FYXNIYW5kbGUpOworICAgIH0KKyAgICBpZiAocmVzdWx0ID09IEVBU19TVUNDRVNTKSB7CisgICAgICAgIHJlc3VsdCA9IEVBU19QcmVwYXJlKG1FYXNEYXRhLCBtRWFzSGFuZGxlKTsKKyAgICB9CisgICAgaWYgKHJlc3VsdCA9PSBFQVNfU1VDQ0VTUykgeworICAgICAgICByZXN1bHQgPSBFQVNfUGFyc2VNZXRhRGF0YShtRWFzRGF0YSwgbUVhc0hhbmRsZSwgJnRlbXApOworICAgIH0KKworICAgIGlmIChyZXN1bHQgIT0gRUFTX1NVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChmaWxlTWV0YWRhdGEgIT0gTlVMTCkgeworICAgICAgICBmaWxlTWV0YWRhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19NSURJKTsKKyAgICB9CisKKyAgICBpZiAodHJhY2tNZXRhZGF0YSAhPSBOVUxMKSB7CisgICAgICAgIHRyYWNrTWV0YWRhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpOworICAgICAgICB0cmFja01ldGFkYXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIDEwMDBsbCAqIHRlbXApOyAvLyBtaWxsaS0+bWljcm8KKyAgICAgICAgbUVhc0NvbmZpZyA9IEVBU19Db25maWcoKTsKKyAgICAgICAgdHJhY2tNZXRhZGF0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIG1FYXNDb25maWctPnNhbXBsZVJhdGUpOworICAgICAgICB0cmFja01ldGFkYXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBtRWFzQ29uZmlnLT5udW1DaGFubmVscyk7CisgICAgfQorICAgIG1Jc0luaXRpYWxpemVkID0gdHJ1ZTsKK30KKworTWlkaUVuZ2luZTo6fk1pZGlFbmdpbmUoKSB7CisgICAgaWYgKG1FYXNIYW5kbGUpIHsKKyAgICAgICAgRUFTX0Nsb3NlRmlsZShtRWFzRGF0YSwgbUVhc0hhbmRsZSk7CisgICAgfQorICAgIGlmIChtRWFzRGF0YSkgeworICAgICAgICBFQVNfU2h1dGRvd24obUVhc0RhdGEpOworICAgIH0KKyAgICBkZWxldGUgbUdyb3VwOworCit9CisKK3N0YXR1c190IE1pZGlFbmdpbmU6OmluaXRDaGVjaygpIHsKKyAgICByZXR1cm4gbUlzSW5pdGlhbGl6ZWQgPyBPSyA6IFVOS05PV05fRVJST1I7Cit9CisKK3N0YXR1c190IE1pZGlFbmdpbmU6OmFsbG9jYXRlQnVmZmVycygpIHsKKyAgICAvLyBzZWxlY3QgcmV2ZXJiIHByZXNldCBhbmQgZW5hYmxlCisgICAgRUFTX1NldFBhcmFtZXRlcihtRWFzRGF0YSwgRUFTX01PRFVMRV9SRVZFUkIsIEVBU19QQVJBTV9SRVZFUkJfUFJFU0VULCBFQVNfUEFSQU1fUkVWRVJCX0NIQU1CRVIpOworICAgIEVBU19TZXRQYXJhbWV0ZXIobUVhc0RhdGEsIEVBU19NT0RVTEVfUkVWRVJCLCBFQVNfUEFSQU1fUkVWRVJCX0JZUEFTUywgRUFTX0ZBTFNFKTsKKworICAgIG1Hcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwOworICAgIGludCBidWZzaXplID0gc2l6ZW9mKEVBU19QQ00pCisgICAgICAgICAgICAqIG1FYXNDb25maWctPm1peEJ1ZmZlclNpemUgKiBtRWFzQ29uZmlnLT5udW1DaGFubmVscyAqIE5VTV9DT01CSU5FX0JVRkZFUlM7CisgICAgQUxPR1YoInVzaW5nICVkIGJ5dGUgYnVmZmVyIiwgYnVmc2l6ZSk7CisgICAgbUdyb3VwLT5hZGRfYnVmZmVyKG5ldyBNZWRpYUJ1ZmZlcihidWZzaXplKSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNaWRpRW5naW5lOjpyZWxlYXNlQnVmZmVycygpIHsKKyAgICBkZWxldGUgbUdyb3VwOworICAgIG1Hcm91cCA9IE5VTEw7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNaWRpRW5naW5lOjpzZWVrVG8oaW50NjRfdCBwb3NpdGlvblVzKSB7CisgICAgQUxPR1YoInNlZWtUbyAlbGxkIiwgcG9zaXRpb25Vcyk7CisgICAgRUFTX1JFU1VMVCByZXN1bHQgPSBFQVNfTG9jYXRlKG1FYXNEYXRhLCBtRWFzSGFuZGxlLCBwb3NpdGlvblVzIC8gMTAwMCwgZmFsc2UpOworICAgIHJldHVybiByZXN1bHQgPT0gRUFTX1NVQ0NFU1MgPyBPSyA6IFVOS05PV05fRVJST1I7Cit9CisKK01lZGlhQnVmZmVyKiBNaWRpRW5naW5lOjpyZWFkQnVmZmVyKCkgeworICAgIEVBU19TVEFURSBzdGF0ZTsKKyAgICBFQVNfU3RhdGUobUVhc0RhdGEsIG1FYXNIYW5kbGUsICZzdGF0ZSk7CisgICAgaWYgKChzdGF0ZSA9PSBFQVNfU1RBVEVfU1RPUFBFRCkgfHwgKHN0YXRlID09IEVBU19TVEFURV9FUlJPUikpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIE1lZGlhQnVmZmVyICpidWZmZXI7CisgICAgc3RhdHVzX3QgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJyZWFkQnVmZmVyOiBubyBidWZmZXIiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIEVBU19JMzIgdGltZU1zOworICAgIEVBU19HZXRMb2NhdGlvbihtRWFzRGF0YSwgbUVhc0hhbmRsZSwgJnRpbWVNcyk7CisgICAgaW50NjRfdCB0aW1lVXMgPSAxMDAwbGwgKiB0aW1lTXM7CisgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CisKKyAgICBFQVNfUENNKiBwID0gKEVBU19QQ00qKSBidWZmZXItPmRhdGEoKTsKKyAgICBpbnQgbnVtQnl0ZXNPdXRwdXQgPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX0NPTUJJTkVfQlVGRkVSUzsgaSsrKSB7CisgICAgICAgIEVBU19JMzIgbnVtUmVuZGVyZWQ7CisgICAgICAgIEVBU19SRVNVTFQgcmVzdWx0ID0gRUFTX1JlbmRlcihtRWFzRGF0YSwgcCwgbUVhc0NvbmZpZy0+bWl4QnVmZmVyU2l6ZSwgJm51bVJlbmRlcmVkKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBFQVNfU1VDQ0VTUykgeworICAgICAgICAgICAgQUxPR0UoIkVBU19SZW5kZXIgcmV0dXJuZWQgJWxkIiwgcmVzdWx0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHAgKz0gbnVtUmVuZGVyZWQgKiBtRWFzQ29uZmlnLT5udW1DaGFubmVsczsKKyAgICAgICAgbnVtQnl0ZXNPdXRwdXQgKz0gbnVtUmVuZGVyZWQgKiBtRWFzQ29uZmlnLT5udW1DaGFubmVscyAqIHNpemVvZihFQVNfUENNKTsKKyAgICB9CisgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgbnVtQnl0ZXNPdXRwdXQpOworICAgIEFMT0dWKCJyZWFkQnVmZmVyOiByZXR1cm5pbmcgJXpkIGluIGJ1ZmZlciAlcCIsIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCksIGJ1ZmZlcik7CisgICAgcmV0dXJuIGJ1ZmZlcjsKK30KKworCisvLyBNaWRpRXh0cmFjdG9yCisKK01pZGlFeHRyYWN0b3I6Ok1pZGlFeHRyYWN0b3IoCisgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZkYXRhU291cmNlKQorICAgIDogbURhdGFTb3VyY2UoZGF0YVNvdXJjZSksCisgICAgICBtSW5pdENoZWNrKGZhbHNlKQoreworICAgIEFMT0dWKCJNaWRpRXh0cmFjdG9yIGN0b3IiKTsKKyAgICBtRmlsZU1ldGFkYXRhID0gbmV3IE1ldGFEYXRhOworICAgIG1UcmFja01ldGFkYXRhID0gbmV3IE1ldGFEYXRhOworICAgIG1FbmdpbmUgPSBuZXcgTWlkaUVuZ2luZShtRGF0YVNvdXJjZSwgbUZpbGVNZXRhZGF0YSwgbVRyYWNrTWV0YWRhdGEpOworICAgIG1Jbml0Q2hlY2sgPSBtRW5naW5lLT5pbml0Q2hlY2soKTsKK30KKworTWlkaUV4dHJhY3Rvcjo6fk1pZGlFeHRyYWN0b3IoKQoreworICAgIEFMT0dWKCJNaWRpRXh0cmFjdG9yIGR0b3IiKTsKK30KKworc2l6ZV90IE1pZGlFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkKK3sKKyAgICByZXR1cm4gbUluaXRDaGVjayA9PSBPSyA/IDEgOiAwOworfQorCitzcDxNZWRpYVNvdXJjZT4gTWlkaUV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KQoreworICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ID4gMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBNaWRpU291cmNlKG1FbmdpbmUsIG1UcmFja01ldGFkYXRhKTsKK30KKworc3A8TWV0YURhdGE+IE1pZGlFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKKyAgICBBTE9HVigiTWlkaUV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSIpOworICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ID4gMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIG1UcmFja01ldGFkYXRhOworfQorCitzcDxNZXRhRGF0YT4gTWlkaUV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoKQoreworICAgIEFMT0dWKCJNaWRpRXh0cmFjdG9yOjpnZXRNZXRhRGF0YSIpOworICAgIHJldHVybiBtRmlsZU1ldGFkYXRhOworfQorCisvLyBTbmlmZmVyCisKK2Jvb2wgU25pZmZNaWRpKAorICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsCisgICAgICAgIHNwPEFNZXNzYWdlPiAqKQoreworICAgIHNwPE1pZGlFbmdpbmU+IHAgPSBuZXcgTWlkaUVuZ2luZShzb3VyY2UsIE5VTEwsIE5VTEwpOworICAgIGlmIChwLT5pbml0Q2hlY2soKSA9PSBPSykgeworICAgICAgICAqbWltZVR5cGUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19NSURJOworICAgICAgICAqY29uZmlkZW5jZSA9IDAuODsKKyAgICAgICAgQUxPR1YoIlNuaWZmTWlkaTogeWVzIik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBBTE9HVigiU25pZmZNaWRpOiBubyIpOworICAgIHJldHVybiBmYWxzZTsKKworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ2xpZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENsaWVudC5jcHAKaW5kZXggY2EwMzFhYS4uMjMwYzFmNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDbGllbnQuY3BwCkBAIC0zNyw3ICszNyw3IEBACiAgICAgTXV4T01YKGNvbnN0IHNwPElPTVg+ICZyZW1vdGVPTVgpOwogICAgIHZpcnR1YWwgfk11eE9NWCgpOwogCi0gICAgdmlydHVhbCBJQmluZGVyICpvbkFzQmluZGVyKCkgeyByZXR1cm4gbVJlbW90ZU9NWC0+YXNCaW5kZXIoKS5nZXQoKTsgfQorICAgIHZpcnR1YWwgSUJpbmRlciAqb25Bc0JpbmRlcigpIHsgcmV0dXJuIElJbnRlcmZhY2U6OmFzQmluZGVyKG1SZW1vdGVPTVgpLmdldCgpOyB9CiAKICAgICB2aXJ0dWFsIGJvb2wgbGl2ZXNMb2NhbGx5KG5vZGVfaWQgbm9kZSwgcGlkX3QgcGlkKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwCmluZGV4IDZjYjA3NzUuLmY0MWJiYzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENvZGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAKQEAgLTEwMSwxMCArMTAxLDEwIEBACiAjdW5kZWYgRkFDVE9SWV9DUkVBVEVfRU5DT0RFUgogI3VuZGVmIEZBQ1RPUllfUkVGCiAKLSNkZWZpbmUgQ09ERUNfTE9HSSh4LCAuLi4pIEFMT0dJKCJbJXNdICJ4LCBtQ29tcG9uZW50TmFtZSwgIyNfX1ZBX0FSR1NfXykKLSNkZWZpbmUgQ09ERUNfTE9HVih4LCAuLi4pIEFMT0dWKCJbJXNdICJ4LCBtQ29tcG9uZW50TmFtZSwgIyNfX1ZBX0FSR1NfXykKLSNkZWZpbmUgQ09ERUNfTE9HVyh4LCAuLi4pIEFMT0dXKCJbJXNdICJ4LCBtQ29tcG9uZW50TmFtZSwgIyNfX1ZBX0FSR1NfXykKLSNkZWZpbmUgQ09ERUNfTE9HRSh4LCAuLi4pIEFMT0dFKCJbJXNdICJ4LCBtQ29tcG9uZW50TmFtZSwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgQ09ERUNfTE9HSSh4LCAuLi4pIEFMT0dJKCJbJXNdICIgeCwgbUNvbXBvbmVudE5hbWUsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIENPREVDX0xPR1YoeCwgLi4uKSBBTE9HVigiWyVzXSAiIHgsIG1Db21wb25lbnROYW1lLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBDT0RFQ19MT0dXKHgsIC4uLikgQUxPR1coIlslc10gIiB4LCBtQ29tcG9uZW50TmFtZSwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgQ09ERUNfTE9HRSh4LCAuLi4pIEFMT0dFKCJbJXNdICIgeCwgbUNvbXBvbmVudE5hbWUsICMjX19WQV9BUkdTX18pCiAKIHN0cnVjdCBPTVhDb2RlY09ic2VydmVyIDogcHVibGljIEJuT01YT2JzZXJ2ZXIgewogICAgIE9NWENvZGVjT2JzZXJ2ZXIoKSB7CkBAIC00NTEsNyArNDUxLDcgQEAKICAgICAvLyBhc3NlcnRpb24sIGxldCdzIGJlIGxlbmllbnQgZm9yIG5vdy4uLgogICAgIC8vIENIRUNLKChwdHJbNF0gPj4gMikgPT0gMHgzZik7ICAvLyByZXNlcnZlZAogCi0gICAgc2l6ZV90IGxlbmd0aFNpemUgPSAxICsgKHB0cls0XSAmIDMpOworICAgIHNpemVfdCBsZW5ndGhTaXplIF9fdW51c2VkID0gMSArIChwdHJbNF0gJiAzKTsKIAogICAgIC8vIGNvbW1lbnRlZCBvdXQgY2hlY2sgYmVsb3cgYXMgSDI2NF9RVkdBXzUwMF9OT19BVURJTy4zZ3AKICAgICAvLyB2aW9sYXRlcyBpdC4uLgpAQCAtNjI5LDEwICs2MjksMTQgQEAKICAgICAgICAgLy8gVGhlc2UgYXJlIFBDTS1saWtlIGZvcm1hdHMgd2l0aCBhIGZpeGVkIHNhbXBsZSByYXRlIGJ1dAogICAgICAgICAvLyBhIHZhcmlhYmxlIG51bWJlciBvZiBjaGFubmVscy4KIAorICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGU7CiAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHM7CiAgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmbnVtQ2hhbm5lbHMpKTsKKyAgICAgICAgaWYgKCFtZXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVSYXRlKSkgeworICAgICAgICAgICAgc2FtcGxlUmF0ZSA9IDgwMDA7CisgICAgICAgIH0KIAotICAgICAgICBzZXRHNzExRm9ybWF0KG51bUNoYW5uZWxzKTsKKyAgICAgICAgc2V0RzcxMUZvcm1hdChzYW1wbGVSYXRlLCBudW1DaGFubmVscyk7CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19SQVcsIG1NSU1FKSkgewogICAgICAgICBDSEVDSyghbUlzRW5jb2Rlcik7CiAKQEAgLTIwMDksNyArMjAxMyw2IEBACiBPTVhDb2RlYzo6QnVmZmVySW5mbyogT01YQ29kZWM6OmRlcXVldWVCdWZmZXJGcm9tTmF0aXZlV2luZG93KCkgewogICAgIC8vIERlcXVldWUgdGhlIG5leHQgYnVmZmVyIGZyb20gdGhlIG5hdGl2ZSB3aW5kb3cuCiAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmOwotICAgIGludCBmZW5jZUZkID0gLTE7CiAgICAgaW50IGVyciA9IG5hdGl2ZV93aW5kb3dfZGVxdWV1ZV9idWZmZXJfYW5kX3dhaXQobU5hdGl2ZVdpbmRvdy5nZXQoKSwgJmJ1Zik7CiAgICAgaWYgKGVyciAhPSAwKSB7CiAgICAgICBDT0RFQ19MT0dFKCJkZXF1ZXVlQnVmZmVyIGZhaWxlZCB3LyBlcnJvciAweCUwOHgiLCBlcnIpOwpAQCAtMjExNCw3ICsyMTE3LDYgQEAKICAgICAvLyBvbiB0aGUgc2NyZWVuIGFuZCB0aGVuIGJlZW4gcmVwbGFjZWQsIHNvIGFuIHByZXZpb3VzIHZpZGVvIGZyYW1lcyBhcmUKICAgICAvLyBndWFyYW50ZWVkIE5PVCB0byBiZSBjdXJyZW50bHkgZGlzcGxheWVkLgogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQnVmcyArIDE7IGkrKykgewotICAgICAgICBpbnQgZmVuY2VGZCA9IC0xOwogICAgICAgICBlcnIgPSBuYXRpdmVfd2luZG93X2RlcXVldWVfYnVmZmVyX2FuZF93YWl0KG1OYXRpdmVXaW5kb3cuZ2V0KCksICZhbmIpOwogICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IGRlcXVldWVCdWZmZXIgZmFpbGVkOiAlcyAoJWQpIiwKQEAgLTM2MjEsOSArMzYyMyw5IEBACiAgICAgICAgICAgICBzaXplb2YoZGVmKSk7CiB9CiAKLXZvaWQgT01YQ29kZWM6OnNldEc3MTFGb3JtYXQoaW50MzJfdCBudW1DaGFubmVscykgewordm9pZCBPTVhDb2RlYzo6c2V0RzcxMUZvcm1hdChpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgbnVtQ2hhbm5lbHMpIHsKICAgICBDSEVDSyghbUlzRW5jb2Rlcik7Ci0gICAgc2V0UmF3QXVkaW9Gb3JtYXQoa1BvcnRJbmRleElucHV0LCA4MDAwLCBudW1DaGFubmVscyk7CisgICAgc2V0UmF3QXVkaW9Gb3JtYXQoa1BvcnRJbmRleElucHV0LCBzYW1wbGVSYXRlLCBudW1DaGFubmVscyk7CiB9CiAKIHZvaWQgT01YQ29kZWM6OnNldEltYWdlT3V0cHV0Rm9ybWF0KApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09nZ0V4dHJhY3Rvci5jcHAKaW5kZXggMGE3MjBhYy4uYmNhMjZiOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PZ2dFeHRyYWN0b3IuY3BwCkBAIC04NTEsNiArODUxLDcgQEAKICAgICAgICAgeyAiVFJBQ0tOVU1CRVIiLCBrS2V5Q0RUcmFja051bWJlciB9LAogICAgICAgICB7ICJESVNDTlVNQkVSIiwga0tleURpc2NOdW1iZXIgfSwKICAgICAgICAgeyAiREFURSIsIGtLZXlEYXRlIH0sCisgICAgICAgIHsgIllFQVIiLCBrS2V5WWVhciB9LAogICAgICAgICB7ICJMWVJJQ0lTVCIsIGtLZXlXcml0ZXIgfSwKICAgICAgICAgeyAiTUVUQURBVEFfQkxPQ0tfUElDVFVSRSIsIGtLZXlBbGJ1bUFydCB9LAogICAgICAgICB7ICJBTkRST0lEX0xPT1AiLCBrS2V5QXV0b0xvb3AgfSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcAppbmRleCA0NDQ5ZDU3Li5kYjMzZTgzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwCkBAIC0yOCw5ICsyOCw2IEBACiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5oPgogI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvVmlkZW9GcmFtZS5oPgogCi0vLyBTb25pdm94IGluY2x1ZGVzCi0jaW5jbHVkZSA8bGlic29uaXZveC9lYXMuaD4KLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBTdGFnZWZyaWdodE1lZGlhU2Nhbm5lcjo6U3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIoKSB7fQpAQCAtNTcsNTQgKzU0LDYgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyBNZWRpYVNjYW5SZXN1bHQgSGFuZGxlTUlESSgKLSAgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsIE1lZGlhU2Nhbm5lckNsaWVudCAqY2xpZW50KSB7Ci0gICAgLy8gZ2V0IHRoZSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24gYW5kIGRvIHNhbml0eSBjaGVjawotICAgIGNvbnN0IFNfRUFTX0xJQl9DT05GSUcqIHBMaWJDb25maWcgPSBFQVNfQ29uZmlnKCk7Ci0gICAgaWYgKChwTGliQ29uZmlnID09IE5VTEwpIHx8IChMSUJfVkVSU0lPTiAhPSBwTGliQ29uZmlnLT5saWJWZXJzaW9uKSkgewotICAgICAgICBBTE9HRSgiRUFTIGxpYnJhcnkvaGVhZGVyIG1pc21hdGNoXG4iKTsKLSAgICAgICAgcmV0dXJuIE1FRElBX1NDQU5fUkVTVUxUX0VSUk9SOwotICAgIH0KLSAgICBFQVNfSTMyIHRlbXA7Ci0KLSAgICAvLyBzcGluIHVwIGEgbmV3IEVBUyBlbmdpbmUKLSAgICBFQVNfREFUQV9IQU5ETEUgZWFzRGF0YSA9IE5VTEw7Ci0gICAgRUFTX0hBTkRMRSBlYXNIYW5kbGUgPSBOVUxMOwotICAgIEVBU19SRVNVTFQgcmVzdWx0ID0gRUFTX0luaXQoJmVhc0RhdGEpOwotICAgIGlmIChyZXN1bHQgPT0gRUFTX1NVQ0NFU1MpIHsKLSAgICAgICAgRUFTX0ZJTEUgZmlsZTsKLSAgICAgICAgZmlsZS5wYXRoID0gZmlsZW5hbWU7Ci0gICAgICAgIGZpbGUuZmQgPSAwOwotICAgICAgICBmaWxlLm9mZnNldCA9IDA7Ci0gICAgICAgIGZpbGUubGVuZ3RoID0gMDsKLSAgICAgICAgcmVzdWx0ID0gRUFTX09wZW5GaWxlKGVhc0RhdGEsICZmaWxlLCAmZWFzSGFuZGxlKTsKLSAgICB9Ci0gICAgaWYgKHJlc3VsdCA9PSBFQVNfU1VDQ0VTUykgewotICAgICAgICByZXN1bHQgPSBFQVNfUHJlcGFyZShlYXNEYXRhLCBlYXNIYW5kbGUpOwotICAgIH0KLSAgICBpZiAocmVzdWx0ID09IEVBU19TVUNDRVNTKSB7Ci0gICAgICAgIHJlc3VsdCA9IEVBU19QYXJzZU1ldGFEYXRhKGVhc0RhdGEsIGVhc0hhbmRsZSwgJnRlbXApOwotICAgIH0KLSAgICBpZiAoZWFzSGFuZGxlKSB7Ci0gICAgICAgIEVBU19DbG9zZUZpbGUoZWFzRGF0YSwgZWFzSGFuZGxlKTsKLSAgICB9Ci0gICAgaWYgKGVhc0RhdGEpIHsKLSAgICAgICAgRUFTX1NodXRkb3duKGVhc0RhdGEpOwotICAgIH0KLQotICAgIGlmIChyZXN1bHQgIT0gRUFTX1NVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIE1FRElBX1NDQU5fUkVTVUxUX1NLSVBQRUQ7Ci0gICAgfQotCi0gICAgY2hhciBidWZmZXJbMjBdOwotICAgIHNwcmludGYoYnVmZmVyLCAiJWxkIiwgdGVtcCk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gY2xpZW50LT5hZGRTdHJpbmdUYWcoImR1cmF0aW9uIiwgYnVmZmVyKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBNRURJQV9TQ0FOX1JFU1VMVF9FUlJPUjsKLSAgICB9Ci0gICAgcmV0dXJuIE1FRElBX1NDQU5fUkVTVUxUX09LOwotfQotCiBNZWRpYVNjYW5SZXN1bHQgU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXI6OnByb2Nlc3NGaWxlKAogICAgICAgICBjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICptaW1lVHlwZSwKICAgICAgICAgTWVkaWFTY2FubmVyQ2xpZW50ICZjbGllbnQpIHsKQEAgLTEzMCwxOCArNzksNiBAQAogICAgICAgICByZXR1cm4gTUVESUFfU0NBTl9SRVNVTFRfU0tJUFBFRDsKICAgICB9CiAKLSAgICBpZiAoIXN0cmNhc2VjbXAoZXh0ZW5zaW9uLCAiLm1pZCIpCi0gICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChleHRlbnNpb24sICIuc21mIikKLSAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKGV4dGVuc2lvbiwgIi5pbXkiKQotICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAoZXh0ZW5zaW9uLCAiLm1pZGkiKQotICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAoZXh0ZW5zaW9uLCAiLnhtZiIpCi0gICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChleHRlbnNpb24sICIucnR0dGwiKQotICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAoZXh0ZW5zaW9uLCAiLnJ0eCIpCi0gICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChleHRlbnNpb24sICIub3RhIikKLSAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKGV4dGVuc2lvbiwgIi5teG1mIikpIHsKLSAgICAgICAgcmV0dXJuIEhhbmRsZU1JREkocGF0aCwgJmNsaWVudCk7Ci0gICAgfQotCiAgICAgc3A8TWVkaWFNZXRhZGF0YVJldHJpZXZlcj4gbVJldHJpZXZlcihuZXcgTWVkaWFNZXRhZGF0YVJldHJpZXZlcik7CiAKICAgICBpbnQgZmQgPSBvcGVuKHBhdGgsIE9fUkRPTkxZIHwgT19MQVJHRUZJTEUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5jcHAKaW5kZXggNTMwMzgzYi4uZThhYmY0OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuY3BwCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvTWV0YWRhdGFCdWZmZXJUeXBlLmg+CiAKICNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+CisjaW5jbHVkZSA8Z3VpL0J1ZmZlckl0ZW0uaD4KICNpbmNsdWRlIDxndWkvSVN1cmZhY2VDb21wb3Nlci5oPgogI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlckFsbG9jLmg+CiAjaW5jbHVkZSA8T01YX0NvbXBvbmVudC5oPgpAQCAtMjkwLDcgKzI5MSw3IEBACiAgICAgLy8gVE9ETzogbUN1cnJlbnRTbG90IGNhbiBiZSBtYWRlIGEgYnVmZmVyc3RhdGUgc2luY2UgdGhlcmUKICAgICAvLyBjYW4gYmUgbW9yZSB0aGFuIG9uZSAiY3VycmVudCIgc2xvdHMuCiAKLSAgICBCdWZmZXJRdWV1ZTo6QnVmZmVySXRlbSBpdGVtOworICAgIEJ1ZmZlckl0ZW0gaXRlbTsKICAgICAvLyBJZiB0aGUgcmVjb3JkaW5nIGhhcyBzdGFydGVkIGFuZCB0aGUgcXVldWUgaXMgZW1wdHksIHRoZW4ganVzdAogICAgIC8vIHdhaXQgaGVyZSB0aWxsIHRoZSBmcmFtZXMgY29tZSBpbiBmcm9tIHRoZSBjbGllbnQgc2lkZQogICAgIHdoaWxlIChtU3RhcnRlZCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVGltZWRFdmVudFF1ZXVlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1RpbWVkRXZlbnRRdWV1ZS5jcHAKaW5kZXggMWZkYjI0NC4uN2QxNTIyMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVGltZWRFdmVudFF1ZXVlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9UaW1lZEV2ZW50UXVldWUuY3BwCkBAIC01Miw3ICs1Miw3IEBACiBUaW1lZEV2ZW50UXVldWU6On5UaW1lZEV2ZW50UXVldWUoKSB7CiAgICAgc3RvcCgpOwogICAgIGlmIChtUG93ZXJNYW5hZ2VyICE9IDApIHsKLSAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gbVBvd2VyTWFuYWdlci0+YXNCaW5kZXIoKTsKKyAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gSUludGVyZmFjZTo6YXNCaW5kZXIobVBvd2VyTWFuYWdlcik7CiAgICAgICAgIGJpbmRlci0+dW5saW5rVG9EZWF0aChtRGVhdGhSZWNpcGllbnQpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcAppbmRleCAyMTRlMmZjLi45ODdmMTJkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwCkBAIC0yMDAsMTQgKzIwMCwxNCBAQAogICAgICAgICAgICAgQUxPR0UoImIvMjM2ODA3ODAiKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KLSAgICAgICAgdWludDhfdCBwcm9maWxlID0gcHRyWzFdOwotICAgICAgICB1aW50OF90IGxldmVsID0gcHRyWzNdOworICAgICAgICB1aW50OF90IHByb2ZpbGUgX191bnVzZWQgPSBwdHJbMV07CisgICAgICAgIHVpbnQ4X3QgbGV2ZWwgX191bnVzZWQgPSBwdHJbM107CiAKICAgICAgICAgLy8gVGhlcmUgaXMgZGVjb2RhYmxlIGNvbnRlbnQgb3V0IHRoZXJlIHRoYXQgZmFpbHMgdGhlIGZvbGxvd2luZwogICAgICAgICAvLyBhc3NlcnRpb24sIGxldCdzIGJlIGxlbmllbnQgZm9yIG5vdy4uLgogICAgICAgICAvLyBDSEVDSygocHRyWzRdID4+IDIpID09IDB4M2YpOyAgLy8gcmVzZXJ2ZWQKIAotICAgICAgICBzaXplX3QgbGVuZ3RoU2l6ZSA9IDEgKyAocHRyWzRdICYgMyk7CisgICAgICAgIHNpemVfdCBsZW5ndGhTaXplIF9fdW51c2VkID0gMSArIChwdHJbNF0gJiAzKTsKIAogICAgICAgICAvLyBjb21tZW50ZWQgb3V0IGNoZWNrIGJlbG93IGFzIEgyNjRfUVZHQV81MDBfTk9fQVVESU8uM2dwCiAgICAgICAgIC8vIHZpb2xhdGVzIGl0Li4uCkBAIC0yOTcsOCArMjk3LDggQEAKICAgICAgICAgICAgIEFMT0dFKCJiLzIzNjgwNzgwIik7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIHVpbnQ4X3QgcHJvZmlsZSA9IHB0clsxXSAmIDMxOwotICAgICAgICB1aW50OF90IGxldmVsID0gcHRyWzEyXTsKKyAgICAgICAgdWludDhfdCBwcm9maWxlIF9fdW51c2VkID0gcHRyWzFdICYgMzE7CisgICAgICAgIHVpbnQ4X3QgbGV2ZWwgX191bnVzZWQgPSBwdHJbMTJdOwogICAgICAgICBwdHIgKz0gMjI7CiAgICAgICAgIHNpemUgLT0gMjI7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2F2Y191dGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9hdmNfdXRpbHMuY3BwCmluZGV4IGNiZGI4MTYuLjVlYzM0MzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2F2Y191dGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYXZjX3V0aWxzLmNwcApAQCAtNTA1LDggKzUwNSw4IEBACiAgICAgQ0hFQ0tfTkUodmlkZW9fb2JqZWN0X3R5cGVfaW5kaWNhdGlvbiwKICAgICAgICAgICAgICAweDIxdSAvKiBGaW5lIEdyYW51bGFyaXR5IFNjYWxhYmxlICovKTsKIAotICAgIHVuc2lnbmVkIHZpZGVvX29iamVjdF9sYXllcl92ZXJpZDsKLSAgICB1bnNpZ25lZCB2aWRlb19vYmplY3RfbGF5ZXJfcHJpb3JpdHk7CisgICAgdW5zaWduZWQgdmlkZW9fb2JqZWN0X2xheWVyX3ZlcmlkIF9fdW51c2VkOworICAgIHVuc2lnbmVkIHZpZGVvX29iamVjdF9sYXllcl9wcmlvcml0eSBfX3VudXNlZDsKICAgICBpZiAoYnIuZ2V0Qml0cygxKSkgewogICAgICAgICB2aWRlb19vYmplY3RfbGF5ZXJfdmVyaWQgPSBici5nZXRCaXRzKDQpOwogICAgICAgICB2aWRlb19vYmplY3RfbGF5ZXJfcHJpb3JpdHkgPSBici5nZXRCaXRzKDMpOwpAQCAtNTY4LDcgKzU2OCw3IEBACiAgICAgdW5zaWduZWQgdmlkZW9fb2JqZWN0X2xheWVyX2hlaWdodCA9IGJyLmdldEJpdHMoMTMpOwogICAgIENIRUNLKGJyLmdldEJpdHMoMSkpOyAgLy8gbWFya2VyX2JpdAogCi0gICAgdW5zaWduZWQgaW50ZXJsYWNlZCA9IGJyLmdldEJpdHMoMSk7CisgICAgdW5zaWduZWQgaW50ZXJsYWNlZCBfX3VudXNlZCA9IGJyLmdldEJpdHMoMSk7CiAKICAgICAqd2lkdGggPSB2aWRlb19vYmplY3RfbGF5ZXJfd2lkdGg7CiAgICAgKmhlaWdodCA9IHZpZGVvX29iamVjdF9sYXllcl9oZWlnaHQ7CkBAIC02MTQsNyArNjE0LDcgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHVuc2lnbmVkIHByb3RlY3Rpb24gPSAoaGVhZGVyID4+IDE2KSAmIDE7CisgICAgdW5zaWduZWQgcHJvdGVjdGlvbiBfX3VudXNlZCA9IChoZWFkZXIgPj4gMTYpICYgMTsKIAogICAgIHVuc2lnbmVkIGJpdHJhdGVfaW5kZXggPSAoaGVhZGVyID4+IDEyKSAmIDB4MGY7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5jcHAKaW5kZXggMzUxYmExZS4uNDk1YmFkMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5jcHAKQEAgLTg3Niw3ICs4NzYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKm5leHRUaW1lU3RhbXAgKz0gbVN0cmVhbUluZm8tPmFhY1NhbXBsZXNQZXJGcmFtZSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDBsbCAvIG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlOwogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImFkanVzdGVkIG5leHRUaW1lU3RhbXAvc2l6ZSB0byAlbGxkLyVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5leHRUaW1lU3RhbXAsICpjdXJyZW50QnVmTGVmdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpICpuZXh0VGltZVN0YW1wLCAqY3VycmVudEJ1ZkxlZnQpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW92ZSB0byBuZXh0IHRpbWVzdGFtcCBpbiBsaXN0CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUJ1ZmZlclRpbWVzdGFtcHMuc2l6ZSgpID4gMCkgewpAQCAtODg1LDcgKzg4NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlclNpemVzLnJlbW92ZUF0KDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCdWZMZWZ0ID0gJm1CdWZmZXJTaXplcy5lZGl0SXRlbUF0KDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJtb3ZlZCB0byBuZXh0IHRpbWUvc2l6ZTogJWxsZC8lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmV4dFRpbWVTdGFtcCwgKmN1cnJlbnRCdWZMZWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpICpuZXh0VGltZVN0YW1wLCAqY3VycmVudEJ1ZkxlZnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGxpbWl0IG91dHB1dCBidWZmZXIgc2l6ZSB0byBtYXRjaCBpbnB1dCBidWZmZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoZS5nIHdoZW4gYW4gaW5wdXQgYnVmZmVyIGNvbnRhaW5lZCA0ICJzdWIiIGZyYW1lcywgb3V0cHV0CkBAIC05OTMsOCArOTkzLDYgQEAKIH0KIAogdm9pZCBTb2Z0QUFDMjo6ZHJhaW5EZWNvZGVyKCkgewotICAgIGludDMyX3Qgb3V0cHV0RGVsYXkgPSBtU3RyZWFtSW5mby0+b3V0cHV0RGVsYXkgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7Ci0KICAgICAvLyBmbHVzaCBkZWNvZGVyIHVudGlsIG91dHB1dERlbGF5IGlzIGNvbXBlbnNhdGVkCiAgICAgd2hpbGUgKG1PdXRwdXREZWxheUNvbXBlbnNhdGVkID4gMCkgewogICAgICAgICAvLyBhIGJ1ZmZlciBiaWcgZW5vdWdoIGZvciBNQVhfQ0hBTk5FTF9DT1VOVCBjaGFubmVscyBvZiBkZWNvZGVkIEhFLUFBQwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BQUNFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQUFDRW5jb2Rlci5jcHAKaW5kZXggOGI1MDA3ZS4uYmViYjlkYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BQUNFbmNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FBQ0VuY29kZXIuY3BwCkBAIC0yMTQsOCArMjE0LDYgQEAKIAogc3RhdHVzX3QgQUFDRW5jb2Rlcjo6cmVhZCgKICAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7Ci0gICAgc3RhdHVzX3QgZXJyOwotCiAgICAgKm91dCA9IE5VTEw7CiAKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL2Jhc2ljX29wLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL2Jhc2ljX29wLmgKaW5kZXggNWNkN2U1Zi4uYmJjNzUzYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9iYXNpY19vcC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3AvYmFzaWNfb3AuaApAQCAtNTE4LDggKzUxOCw2IEBACiAgICAgICAgIHJldHVybiAgQVNNX0xfc2hyKCBMX3ZhcjEsIC12YXIyKTsKICAgICB9CiAjZWxzZQotICAgIFdvcmQzMiBMX3Zhcl9vdXQgPSAwTDsKLQogICAgIGlmICh2YXIyIDw9IDApCiAgICAgewogICAgICAgICBMX3ZhcjEgPSBMX3NocihMX3ZhcjEsIChXb3JkMTYpLXZhcjIpOwpAQCAtNTQwLDcgKzUzOCw2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgTF92YXIxIDw8PSAxOwotICAgICAgICAgICAgTF92YXJfb3V0ID0gTF92YXIxOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiAoTF92YXIxKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3Avb3Blcl8zMmIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3Avb3Blcl8zMmIuYwppbmRleCAxZDAyOWZjLi40ZmQxNmExIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL29wZXJfMzJiLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9vcGVyXzMyYi5jCkBAIC0yNDUsMTAgKzI0NSw5IEBACiBXb3JkMzIgcnNxcnQoV29yZDMyIHZhbHVlLCAgICAgLyohPCBPcGVyYW5kIHRvIHNxdWFyZSByb290ICgwLjAgLi4uIDEpICovCiAgICAgICAgICAgICAgV29yZDMyIGFjY3VyYWN5KSAgLyohPCBOdW1iZXIgb2YgdmFsaWQgYml0cyB0aGF0IHdpbGwgYmUgY2FsY3VsYXRlZCAqLwogewotICAgIFVOVVNFRChhY2N1cmFjeSk7Ci0KICAgICBXb3JkMzIgcm9vdCA9IDA7CiAJV29yZDMyIHNjYWxlOworICAgIFVOVVNFRChhY2N1cmFjeSk7CiAKIAlpZih2YWx1ZSA8IDApCiAJCXJldHVybiAwOwpAQCAtMzUxLDEyICszNTAsMTEgQEAKICAgVVdvcmQzMiBpUGFydDsKICAgVVdvcmQzMiBmUGFydDsKICAgV29yZDMyIHJlczsKLSAgV29yZDMyIHRtcCwgdG1wMjsKLSAgV29yZDMyIHNoaWZ0LCBzaGlmdDI7CisgIFdvcmQzMiB0bXA7CiAKLSAgdG1wMiA9IC14OwotICBpUGFydCA9IHRtcDIgLyB5OwotICBmUGFydCA9IHRtcDIgLSBpUGFydCp5OworICB0bXAgPSAteDsKKyAgaVBhcnQgPSB0bXAgLyB5OworICBmUGFydCA9IHRtcCAtIGlQYXJ0Knk7CiAgIGlQYXJ0ID0gbWluKGlQYXJ0LElOVF9CSVRTLTEpOwogCiAgIHJlcyA9IHBvdzJUYWJsZVsoUE9XMl9UQUJMRV9TSVpFKmZQYXJ0KS95XSA+PiBpUGFydDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FhY2VuYy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWFjZW5jLmMKaW5kZXggNDBkYjkyYy4uZGYxNzc4NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWFjZW5jLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWFjZW5jLmMKQEAgLTM5LDE4ICszOSwyMCBAQAogVk9fVTMyIFZPX0FQSSB2b0FBQ0VuY0luaXQoVk9fSEFORExFICogcGhDb2RlYyxWT19BVURJT19DT0RJTkdUWVBFIHZUeXBlLCBWT19DT0RFQ19JTklUX1VTRVJEQVRBICpwVXNlckRhdGEpCiB7CiAJQUFDX0VOQ09ERVIqaEFhY0VuYzsKLQlBQUNFTkNfQ09ORklHIGNvbmZpZzsKIAlpbnQgZXJyb3I7CiAKICNpZmRlZiBVU0VfREVBVUxUX01FTQogCVZPX01FTV9PUEVSQVRPUiB2b01lbW9wcmF0b3I7CiAjZW5kaWYKIAlWT19NRU1fT1BFUkFUT1IgKnBNZW1PUDsKKworI2lmZGVmIFVTRV9ERUFVTFRfTUVNCiAJaW50IGludGVyTWVtOworICAgICAgICBpbnRlck1lbSA9IDA7CisjZW5kaWYKIAogICAgICAgICBVTlVTRUQodlR5cGUpOwogCi0JaW50ZXJNZW0gPSAwOwogCWVycm9yID0gMDsKIAogCS8qIGluaXQgdGhlIG1lbW9yeSBvcGVyYXRvciAqLwpAQCAtMjE0LDcgKzIxNiw3IEBACiAJQUFDX0VOQ09ERVIqIGhBYWNFbmMgPSAoQUFDX0VOQ09ERVIqKWhDb2RlYzsKIAlXb3JkMTYgbnVtQW5jRGF0YUJ5dGVzPTA7CiAJV29yZDMyICBpbmJ1ZmxlbjsKLQlpbnQgcmV0LCBsZW5ndGg7CisJaW50IGxlbmd0aDsKIAlpZihOVUxMID09IGhBYWNFbmMpCiAJCXJldHVybiBWT19FUlJfSU5WQUxJRF9BUkc7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FhY2VuY19jb3JlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hYWNlbmNfY29yZS5jCmluZGV4IGNlY2JjOGYuLmRlNDUyZDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FhY2VuY19jb3JlLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWFjZW5jX2NvcmUuYwpAQCAtNTgsNyArNTgsNiBAQAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgIEFBQ0VOQ19DT05GSUcgICAgIGNvbmZpZyAgIC8qIHByZS1pbml0aWFsaXplZCBjb25maWcgc3RydWN0ICovCiAgICAgICAgICAgICAgICAgICAgICApCiB7Ci0gIFdvcmQzMiBpOwogICBXb3JkMzIgZXJyb3IgPSAwOwogICBXb3JkMTYgcHJvZmlsZSA9IDE7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2Fkal90aHIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2Fkal90aHIuYwppbmRleCA0NzE2MzFjLi44YjhiZTBlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hZGpfdGhyLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWRqX3Roci5jCkBAIC05Niw3ICs5Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBNSU5TTlJfQURBUFRfUEFSQU0gKm1zYVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICBuQ2hhbm5lbHMpCiB7Ci0gIFdvcmQxNiBjaCwgc2ZiLCBzZmJPZmZzLCBzaGlmdDsKKyAgV29yZDE2IGNoLCBzZmIsIHNmYk9mZnM7CiAgIFdvcmQzMiBuU2ZiLCBhdmdFbjsKICAgV29yZDE2IGxvZ19hdmdFbiA9IDA7CiAgIFdvcmQzMiBzdGFydFJhdGlvX3hfYXZnRW4gPSAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYml0YnVmZmVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iaXRidWZmZXIuYwppbmRleCAwY2U5M2QzLi4xNWVlYmQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iaXRidWZmZXIuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iaXRidWZmZXIuYwpAQCAtMjQsMjkgKzI0LDYgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCi0qIGZ1bmN0aW9uIG5hbWU6IHVwZGF0ZUJpdEJ1ZldvcmRQdHIKLSogZGVzY3JpcHRpb246ICB1cGRhdGUgQml0IEJ1ZmZlciBwb2ludGVyCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHVwZGF0ZUJpdEJ1ZldvcmRQdHIoSEFORExFX0JJVF9CVUYgaEJpdEJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVdvcmQ4ICoqcEJpdEJ1ZldvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgIGNudCkKLXsKLSAgKnBCaXRCdWZXb3JkICs9IGNudDsKLQotCi0gIGlmKCpwQml0QnVmV29yZCA+IGhCaXRCdWYtPnBCaXRCdWZFbmQpIHsKLSAgICAqcEJpdEJ1ZldvcmQgLT0gKGhCaXRCdWYtPnBCaXRCdWZFbmQgLSBoQml0QnVmLT5wQml0QnVmQmFzZSArIDEpOwotICB9Ci0KLSAgaWYoKnBCaXRCdWZXb3JkIDwgaEJpdEJ1Zi0+cEJpdEJ1ZkJhc2UpIHsKLSAgICAqcEJpdEJ1ZldvcmQgKz0gKGhCaXRCdWYtPnBCaXRCdWZFbmQgLSBoQml0QnVmLT5wQml0QnVmQmFzZSArIDEpOwotICB9Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCiAqIGZ1bmN0aW9uIG5hbWU6IENyZWF0ZUJpdEJ1ZmZlcgogKiBkZXNjcmlwdGlvbjogIGNyZWF0ZSBhbmQgaW5pdCBCaXQgQnVmZmVyIE1hbmFnZW1lbnQKICoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JpdGVuYy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYml0ZW5jLmMKaW5kZXggZDFmZDY0Ny4uOWM4MTIwNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYml0ZW5jLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYml0ZW5jLmMKQEAgLTU0Nyw3ICs1NDcsNyBAQAogICAgIHRvdEZpbGxCaXRzID0gdG90RmlsbEJpdHMgLSAoMys0KTsKIAogCi0gICAgaWYgKChjbnQgPT0gKDE8PDQpLTEpKSB7CisgICAgaWYgKGNudCA9PSAoMTw8NCktMSkgewogCiAgICAgICBlc2NfY291bnQgPSBtaW4oICgodG90RmlsbEJpdHMgPj4gMykgLSAoKDE8PDQpLTEpKSwgKDE8PDgpLTEpOwogICAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sZXNjX2NvdW50LDgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYmxvY2tfc3dpdGNoLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9ibG9ja19zd2l0Y2guYwppbmRleCBjODA1MzhmLi4xMWJjN2U3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9ibG9ja19zd2l0Y2guYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9ibG9ja19zd2l0Y2guYwpAQCAtMzAsOSArMzAsNiBAQAogI2RlZmluZSBFTkVSR1lfU0hJRlQgKDggLSAxKQogCiAvKioqKioqKioqKioqKioqKiBpbnRlcm5hbCBmdW5jdGlvbiBwcm90b3R5cGVzICoqKioqKioqKioqLwotc3RhdGljIFdvcmQxNgotSUlSRmlsdGVyKGNvbnN0IFdvcmQxNiBpbiwgY29uc3QgV29yZDMyIGNvZWZmW10sIFdvcmQzMiBzdGF0ZXNbXSk7Ci0KIHN0YXRpYyBXb3JkMzIKIFNyY2hNYXhXaXRoSW5kZXgoY29uc3QgV29yZDMyICppbiwgV29yZDE2ICppbmRleCwgV29yZDE2IG4pOwogCkBAIC0yODAsNyArMjc3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBjaEluY3JlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiB3aW5kb3dMZW4pCiB7Ci0gIFdvcmQzMiB3LCBpLCB3T2Zmc2V0LCB0aWR4LCBjaDsKKyAgV29yZDMyIHcsIGksIHRpZHg7CiAgIFdvcmQzMiBhY2N1VUUsIGFjY3VGRTsKICAgV29yZDMyIHRlbXBVbmZpbHRlcmVkOwogICBXb3JkMzIgdGVtcEZpbHRlcmVkOwpAQCAtMzI5LDMwICszMjYsNiBAQAogfQogI2VuZGlmCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBJSVJGaWx0ZXIKLSogZGVzY3JpcHRpb246ICBjYWxjdWxhdGUgdGhlIGlpci1maWx0ZXIgZm9yIGFuIGFycmF5Ci0qIHJldHVybnM6ICAgICAgdGhlIHJlc3VsdCBhZnRlciBpaXItZmlsdGVyCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFdvcmQxNiBJSVJGaWx0ZXIoY29uc3QgV29yZDE2IGluLCBjb25zdCBXb3JkMzIgY29lZmZbXSwgV29yZDMyIHN0YXRlc1tdKQotewotICBXb3JkMzIgYWNjdTEsIGFjY3UyLCBhY2N1MzsKLSAgV29yZDMyIG91dDsKLQotICBhY2N1MSA9IExfbXB5X2xzKGNvZWZmWzFdLCBpbik7Ci0gIGFjY3UzID0gYWNjdTEgLSBzdGF0ZXNbMF07Ci0gIGFjY3UyID0gZml4bXVsKCBjb2VmZlswXSwgc3RhdGVzWzFdICk7Ci0gIG91dCA9IGFjY3UzIC0gYWNjdTI7Ci0KLSAgc3RhdGVzWzBdID0gYWNjdTE7Ci0gIHN0YXRlc1sxXSA9IG91dDsKLQotICByZXR1cm4gcm91bmQxNihvdXQpOwotfQotCi0KIHN0YXRpYyBXb3JkMTYgc3luY2hyb25pemVkQmxvY2tUeXBlVGFibGVbNF1bNF0gPSB7CiAgIC8qICAgICAgICAgICAgICAgICBMT05HX1dJTkRPVyAgIFNUQVJUX1dJTkRPVyAgU0hPUlRfV0lORE9XICBTVE9QX1dJTkRPVyAqLwogICAvKiBMT05HX1dJTkRPVyAgKi97TE9OR19XSU5ET1csICBTVEFSVF9XSU5ET1csIFNIT1JUX1dJTkRPVywgU1RPUF9XSU5ET1d9LApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvbXNfc3RlcmVvLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9tc19zdGVyZW8uYwppbmRleCAyZTM0ZjE0Li4xZTRiMjI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9tc19zdGVyZW8uYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9tc19zdGVyZW8uYwpAQCAtNTAsNyArNTAsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICBzZmJQZXJHcm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgbWF4U2ZiUGVyR3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgKnNmYk9mZnNldCkgewotICBXb3JkMzIgdGVtcDsKICAgV29yZDMyIHNmYixzZmJvZmZzLCBqOwogICBXb3JkMzIgbXNNYXNrVHJ1ZVNvbWV3aGVyZSA9IDA7CiAgIFdvcmQzMiBtc01hc2tGYWxzZVNvbWV3aGVyZSA9IDA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9zZl9lc3RpbS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvc2ZfZXN0aW0uYwppbmRleCBiYzMyMGVjLi43ODk0N2UxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9zZl9lc3RpbS5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3NmX2VzdGltLmMKQEAgLTk5LDcgKzk5LDcgQEAKIHsKIAlXb3JkMzIgc2Zidywgc2ZidzE7CiAJV29yZDMyIGksIGo7Ci0JV29yZDMyIHNmYk9mZnMsIHNmYiwgc2hpZnQ7CisJV29yZDMyIHNmYk9mZnMsIHNmYjsKIAogCXNmYncgPSBzZmJ3MSA9IDA7CiAJZm9yIChzZmJPZmZzPTA7IHNmYk9mZnM8cHN5T3V0Q2hhbi0+c2ZiQ250OyBzZmJPZmZzKz1wc3lPdXRDaGFuLT5zZmJQZXJHcm91cCl7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy90bnMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3Rucy5jCmluZGV4IDUxNzI2MTIuLjI3YzM5NzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3Rucy5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3Rucy5jCkBAIC0xNDAsNyArMTQwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGFjdGl2ZSkgICAgICAgICAgICAgIC8qITwgdG5zIGFjdGl2ZSBmbGFnICovCiB7CiAKLSAgV29yZDMyIGJpdHJhdGVQZXJDaGFubmVsOworICBXb3JkMzIgYml0cmF0ZVBlckNoYW5uZWwgX191bnVzZWQ7CiAgIHRDLT5tYXhPcmRlciAgICAgPSBUTlNfTUFYX09SREVSOwogICB0Qy0+dG5zU3RhcnRGcmVxID0gMTI3NTsKICAgdEMtPmNvZWZSZXMgICAgICA9IDQ7CkBAIC0yMDYsNyArMjA2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9DT05GSUdVUkFUSU9OX1NIT1JUICpwQywgLyohPCBwc3kgY29uZmlnIHN0cnVjdCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGFjdGl2ZSkgICAgICAgICAgICAgICAvKiE8IHRucyBhY3RpdmUgZmxhZyAqLwogewotICBXb3JkMzIgYml0cmF0ZVBlckNoYW5uZWw7CisgIFdvcmQzMiBiaXRyYXRlUGVyQ2hhbm5lbCBfX3VudXNlZDsKICAgdEMtPm1heE9yZGVyICAgICA9IFROU19NQVhfT1JERVJfU0hPUlQ7CiAgIHRDLT50bnNTdGFydEZyZXEgPSAyNzUwOwogICB0Qy0+Y29lZlJlcyAgICAgID0gMzsKQEAgLTQ5NywzNiArNDk3LDYgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCi0qIGZ1bmN0aW9uIG5hbWU6IG1fcG93Ml9jb3JkaWMKLSogZGVzY3JpcHRpb246IEl0ZXJhdGl2ZSBwb3dlciBmdW5jdGlvbgotKgotKglDYWxjdWxhdGVzIHBvdygyLjAseC0xLjAqKHNjYWxlKzEpKSB3aXRoIElOVF9CSVRTIGJpdCBwcmVjaXNpb24KLSoJdXNpbmcgbW9kaWZpZWQgY29yZGljIGFsZ29yaXRobQotKiByZXR1cm5zOiAgICAgdGhlIHJlc3VsdCBvZiBwb3cyCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBXb3JkMzIgbV9wb3cyX2NvcmRpYyhXb3JkMzIgeCwgV29yZDE2IHNjYWxlKQotewotICBXb3JkMzIgazsKLQotICBXb3JkMzIgYWNjdV95ID0gMHg0MDAwMDAwMDsKLSAgYWNjdV95ID0gTF9zaHIoYWNjdV95LHNjYWxlKTsKLQotICBmb3Ioaz0xOyBrPElOVF9CSVRTOyBrKyspIHsKLSAgICBjb25zdCBXb3JkMzIgeiA9IG1fbG9nMl90YWJsZVtrXTsKLQotICAgIHdoaWxlKExfc3ViKHgseikgPj0gMCkgewotCi0gICAgICB4ID0gTF9zdWIoeCwgeik7Ci0gICAgICBhY2N1X3kgPSBMX2FkZChhY2N1X3ksIChhY2N1X3kgPj4gaykpOwotICAgIH0KLSAgfQotICByZXR1cm4oYWNjdV95KTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKICogZnVuY3Rpb24gbmFtZTogQ2FsY1dlaWdodGVkU3BlY3RydW0KICogZGVzY3JpcHRpb246IENhbGN1bGF0ZSB3ZWlnaHRlZCBzcGVjdHJ1bSBmb3IgTFBDIGNhbGN1bGF0aW9uCiAqCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy90cmFuc2Zvcm0uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3RyYW5zZm9ybS5jCmluZGV4IGEwMjMzNmYuLjAwODA4MTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3RyYW5zZm9ybS5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3RyYW5zZm9ybS5jCkBAIC00NzUsNyArNDc1LDYgQEAKIAlXb3JkMzIgKndpblB0cjsKIAogCVdvcmQzMiBkZWxheUJ1ZmZlclNmLHRpbWVTaWduYWxTZixtaW5TZjsKLQlXb3JkMzIgaGVhZFJvb209MDsKIAogCXN3aXRjaChibG9ja1R5cGUpewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL0FuZHJvaWQubWsKaW5kZXggYTJiM2M4Zi4uNWU2MzJhNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vQW5kcm9pZC5tawpAQCAtNjcsNyArNjcsNyBAQAogICAgICAgICAkKExPQ0FMX1BBVEgpL2luY2x1ZGUKIAogTE9DQUxfQ0ZMQUdTIDo9IFwKLSAgICAgICAgLURPU0NMX1VOVVNFRF9BUkc9IC1ET1NDTF9JTVBPUlRfUkVGPSAtRE9TQ0xfRVhQT1JUX1JFRj0KKyAgICAgICAgLUQiT1NDTF9VTlVTRURfQVJHKHgpPSh2b2lkKSh4KSIgLURPU0NMX0lNUE9SVF9SRUY9IC1ET1NDTF9FWFBPUlRfUkVGPQogCiBMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYmFzaWNfb3BfY19lcXVpdmFsZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYmFzaWNfb3BfY19lcXVpdmFsZW50LmgKaW5kZXggMzU2MzhlMy4uYzRlNGQ0ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Jhc2ljX29wX2NfZXF1aXZhbGVudC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9iYXNpY19vcF9jX2VxdWl2YWxlbnQuaApAQCAtMTE1LDcgKzExNSw3IEBACiAgICAgIFJldHVybnM6CiAgICAgICAgIExfc3VtID0gMzItYml0IHN1bSBvZiBMX3ZhcjEgYW5kIExfdmFyMiAoV29yZDMyKQogICAgICovCi0gICAgc3RhdGljIGlubGluZSBXb3JkMzIgTF9hZGQocmVnaXN0ZXIgV29yZDMyIExfdmFyMSwgcmVnaXN0ZXIgV29yZDMyIExfdmFyMiwgRmxhZyAqcE92ZXJmbG93KQorICAgIHN0YXRpYyBpbmxpbmUgV29yZDMyIExfYWRkKFdvcmQzMiBMX3ZhcjEsIFdvcmQzMiBMX3ZhcjIsIEZsYWcgKnBPdmVyZmxvdykKICAgICB7CiAgICAgICAgIFdvcmQzMiBMX3N1bTsKIApAQCAtMTU0LDggKzE1NCw4IEBACiAgICAgIFJldHVybnM6CiAgICAgICAgIExfZGlmZiA9IDMyLWJpdCBkaWZmZXJlbmNlIG9mIExfdmFyMSBhbmQgTF92YXIyIChXb3JkMzIpCiAgICAgKi8KLSAgICBzdGF0aWMgaW5saW5lIFdvcmQzMiBMX3N1YihyZWdpc3RlciBXb3JkMzIgTF92YXIxLCByZWdpc3RlciBXb3JkMzIgTF92YXIyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIEZsYWcgKnBPdmVyZmxvdykKKyAgICBzdGF0aWMgaW5saW5lIFdvcmQzMiBMX3N1YihXb3JkMzIgTF92YXIxLCBXb3JkMzIgTF92YXIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWcgKnBPdmVyZmxvdykKICAgICB7CiAgICAgICAgIFdvcmQzMiBMX2RpZmY7CiAKQEAgLTI0Niw3ICsyNDYsNyBAQAogICAgICovCiAgICAgc3RhdGljIGlubGluZSBXb3JkMzIgTF9tdWx0KFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMiwgRmxhZyAqcE92ZXJmbG93KQogICAgIHsKLSAgICAgICAgcmVnaXN0ZXIgV29yZDMyIExfcHJvZHVjdDsKKyAgICAgICAgV29yZDMyIExfcHJvZHVjdDsKIAogICAgICAgICBMX3Byb2R1Y3QgPSAoV29yZDMyKSB2YXIxICogdmFyMjsKIApAQCAtNDUyLDcgKzQ1Miw3IEBACiAgICAgKi8KICAgICBzdGF0aWMgaW5saW5lIFdvcmQxNiBtdWx0KFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMiwgRmxhZyAqcE92ZXJmbG93KQogICAgIHsKLSAgICAgICAgcmVnaXN0ZXIgV29yZDMyIHByb2R1Y3Q7CisgICAgICAgIFdvcmQzMiBwcm9kdWN0OwogCiAgICAgICAgIHByb2R1Y3QgPSAoKFdvcmQzMikgdmFyMSAqIHZhcjIpID4+IDE1OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9hel9sc3AuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvYXpfbHNwLmNwcAppbmRleCA0MTM1ZjMwLi45NzZiMWE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9hel9sc3AuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2F6X2xzcC5jcHAKQEAgLTU2NCwxMCArNTY0LDEwIEBACiAgICAgRmxhZyAgICpwT3ZlcmZsb3cgICAvKiAoaS9vKTogb3ZlcmZsb3cgZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiApCiB7Ci0gICAgcmVnaXN0ZXIgV29yZDE2IGk7Ci0gICAgcmVnaXN0ZXIgV29yZDE2IGo7Ci0gICAgcmVnaXN0ZXIgV29yZDE2IG5mOwotICAgIHJlZ2lzdGVyIFdvcmQxNiBpcDsKKyAgICBXb3JkMTYgaTsKKyAgICBXb3JkMTYgajsKKyAgICBXb3JkMTYgbmY7CisgICAgV29yZDE2IGlwOwogICAgIFdvcmQxNiB4bG93OwogICAgIFdvcmQxNiB5bG93OwogICAgIFdvcmQxNiB4aGlnaDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2Rpdl9zLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2Rpdl9zLmNwcAppbmRleCBmM2JlZDdlLi4xNGQzMGM1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9kaXZfcy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZGl2X3MuY3BwCkBAIC0yMDcsMTMgKzIwNywxMyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiA7IEZVTkNUSU9OIENPREUKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotV29yZDE2IGRpdl9zKHJlZ2lzdGVyIFdvcmQxNiB2YXIxLCByZWdpc3RlciBXb3JkMTYgdmFyMikKK1dvcmQxNiBkaXZfcyhXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCiB7CiAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcwogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgIFdvcmQxNiB2YXJfb3V0ID0gMDsKLSAgICByZWdpc3RlciBXb3JkMTYgaXRlcmF0aW9uOworICAgIFdvcmQxNiBpdGVyYXRpb247CiAgICAgV29yZDMyIExfbnVtOwogICAgIFdvcmQzMiBMX2Rlbm9tOwogICAgIFdvcmQzMiBMX2Rlbm9tX2J5XzI7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9nY19wcmVkLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2djX3ByZWQuY3BwCmluZGV4IDM2NTBmM2MuLjFjOGE3MDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2djX3ByZWQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2djX3ByZWQuY3BwCkBAIC00NzcsOSArNDc3LDkgQEAKICAgICBGbGFnICAgKnBPdmVyZmxvdwogKQogewotICAgIHJlZ2lzdGVyIFdvcmQxNiBpOwotICAgIHJlZ2lzdGVyIFdvcmQzMiBMX3RlbXAxLCBMX3RlbXAyOwotICAgIHJlZ2lzdGVyIFdvcmQzMiBMX3RtcDsKKyAgICBXb3JkMTYgaTsKKyAgICBXb3JkMzIgTF90ZW1wMSwgTF90ZW1wMjsKKyAgICBXb3JkMzIgTF90bXA7CiAgICAgV29yZDMyIGVuZXJfY29kZTsKICAgICBXb3JkMzIgZW5lcjsKICAgICBXb3JkMTYgZXhwLCBmcmFjOwpAQCAtOTkzLDcgKzk5Myw3IEBACiApCiB7CiAgICAgV29yZDE2IGF2X3ByZWRfZW47Ci0gICAgcmVnaXN0ZXIgV29yZDE2IGk7CisgICAgV29yZDE2IGk7CiAKICAgICAvKiBkbyBhdmVyYWdlIGluIE1SMTIyIG1vZGUgKGxvZzIoKSBkb21haW4pICovCiAgICAgYXZfcHJlZF9lbiA9IDA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9nbWVkX24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZ21lZF9uLmNwcAppbmRleCBiZTc2MjQxLi4yZDNiOWU0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9nbWVkX24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2dtZWRfbi5jcHAKQEAgLTE4NSw5ICsxODUsOSBAQAogICAgIFdvcmQxNiBuICAgICAgICAvKiBpIDogbnVtYmVyIG9mIGlucHV0cyAgICAqLwogKQogewotICAgIHJlZ2lzdGVyIFdvcmQxNiBpLCBqLCBpeCA9IDA7Ci0gICAgcmVnaXN0ZXIgV29yZDE2IG1heDsKLSAgICByZWdpc3RlciBXb3JkMTYgbWVkaWFuSW5kZXg7CisgICAgV29yZDE2IGksIGosIGl4ID0gMDsKKyAgICBXb3JkMTYgbWF4OworICAgIFdvcmQxNiBtZWRpYW5JbmRleDsKICAgICBXb3JkMTYgIHRtcFtOTUFYXTsKICAgICBXb3JkMTYgIHRtcDJbTk1BWF07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xzcF9hei5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sc3BfYXouY3BwCmluZGV4IDZiN2I0NzEuLjQ5NTM1OWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xzcF9hei5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbHNwX2F6LmNwcApAQCAtMjU0LDggKzI1NCw4IEBACiAgICAgV29yZDMyICpmLAogICAgIEZsYWcgICAqcE92ZXJmbG93KQogewotICAgIHJlZ2lzdGVyIFdvcmQxNiBpOwotICAgIHJlZ2lzdGVyIFdvcmQxNiBqOworICAgIFdvcmQxNiBpOworICAgIFdvcmQxNiBqOwogCiAgICAgV29yZDE2IGhpOwogICAgIFdvcmQxNiBsbzsKQEAgLTUxMSw4ICs1MTEsOCBAQAogICAgIEZsYWcgICpwT3ZlcmZsb3cgICAgIC8qIChvKSAgOiBvdmVyZmxvdyBmbGFnICAgICAgICAgICAgICAgICAgICAgICAgKi8KICkKIHsKLSAgICByZWdpc3RlciBXb3JkMTYgaTsKLSAgICByZWdpc3RlciBXb3JkMTYgajsKKyAgICBXb3JkMTYgaTsKKyAgICBXb3JkMTYgajsKIAogICAgIFdvcmQzMiBmMVs2XTsKICAgICBXb3JkMzIgZjJbNl07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9tdWx0X3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbXVsdF9yLmNwcAppbmRleCAwNzc3ZTY4Li43MTEyYjNkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9tdWx0X3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL211bHRfci5jcHAKQEAgLTE5MCw3ICsxOTAsNyBAQAogV29yZDE2IG11bHRfcihXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIsIEZsYWcgKnBPdmVyZmxvdykKIHsKIAotICAgIHJlZ2lzdGVyIFdvcmQzMiBMX3Byb2R1Y3RfYXJyOworICAgIFdvcmQzMiBMX3Byb2R1Y3RfYXJyOwogCiAgICAgTF9wcm9kdWN0X2FyciA9ICgoV29yZDMyKSB2YXIxKSAqIHZhcjI7ICAgICAgICAgICAgICAvKiBwcm9kdWN0ICovCiAgICAgTF9wcm9kdWN0X2FyciArPSAoV29yZDMyKSAweDAwMDA0MDAwTDsgICAgICAgICAgICAgICAvKiByb3VuZCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbm9ybV9sLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL25vcm1fbC5jcHAKaW5kZXggMTMyZmVkNi4uZDhkMTI1OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbm9ybV9sLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9ub3JtX2wuY3BwCkBAIC0xOTcsMTIgKzE5NywxMiBAQAogOyBGVU5DVElPTiBDT0RFCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNpZiAhKCBkZWZpbmVkKFBWX0FSTV9WNSkgfHwgZGVmaW5lZChQVl9BUk1fR0NDX1Y1KSApCi1Xb3JkMTYgbm9ybV9sKHJlZ2lzdGVyIFdvcmQzMiBMX3ZhcjEpCitXb3JkMTYgbm9ybV9sKFdvcmQzMiBMX3ZhcjEpCiB7CiAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcwogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHJlZ2lzdGVyIFdvcmQxNiB2YXJfb3V0ID0gMDsKKyAgICBXb3JkMTYgdmFyX291dCA9IDA7CiAKICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICA7IEZ1bmN0aW9uIGJvZHkgaGVyZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbm9ybV9zLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL25vcm1fcy5jcHAKaW5kZXggOGNkY2RiOC4uNjQ2OGI2NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbm9ybV9zLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9ub3JtX3MuY3BwCkBAIC0xOTQsMTMgKzE5NCwxMyBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjaWYgISggZGVmaW5lZChQVl9BUk1fVjUpIHx8IGRlZmluZWQoUFZfQVJNX0dDQ19WNSkgKQogCi1Xb3JkMTYgbm9ybV9zKHJlZ2lzdGVyIFdvcmQxNiB2YXIxKQorV29yZDE2IG5vcm1fcyhXb3JkMTYgdmFyMSkKIHsKICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICA7IERlZmluZSBhbGwgbG9jYWwgdmFyaWFibGVzCiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLSAgICByZWdpc3RlciBXb3JkMTYgdmFyX291dCA9IDA7CisgICAgV29yZDE2IHZhcl9vdXQgPSAwOwogCiAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgOyBGdW5jdGlvbiBib2R5IGhlcmUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3ByZWRfbHQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcHJlZF9sdC5jcHAKaW5kZXggOTE2MzYyMy4uOGExYWE5ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcHJlZF9sdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcHJlZF9sdC5jcHAKQEAgLTI2MCw5ICsyNjAsOSBAQAogICAgIEZsYWcgICpwT3ZlcmZsb3cgIC8qIG91dHB1dDogaWYgc2V0LCBvdmVyZmxvdyBvY2N1cnJlZCBpbiB0aGlzIGZ1bmN0aW9uICovCiApCiB7Ci0gICAgcmVnaXN0ZXIgV29yZDE2IGk7Ci0gICAgcmVnaXN0ZXIgV29yZDE2IGo7Ci0gICAgcmVnaXN0ZXIgV29yZDE2IGs7CisgICAgV29yZDE2IGk7CisgICAgV29yZDE2IGo7CisgICAgV29yZDE2IGs7CiAKICAgICBXb3JkMTYgKnBYMDsKICAgICBXb3JkMTYgKnBYMjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3FfcGxzZl8zLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3FfcGxzZl8zLmNwcAppbmRleCAyYjMwYmY0Li5jNzA4NDdlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9xX3Bsc2ZfMy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcV9wbHNmXzMuY3BwCkBAIC0yODEsNyArMjgxLDcgQEAKICAgICBGbGFnICAqcE92ZXJmbG93ICAgICAgLyogbyA6IEZsYWcgc2V0IHdoZW4gb3ZlcmZsb3cgb2NjdXJzICAgICAqLwogKQogewotICAgIHJlZ2lzdGVyIFdvcmQxNiBpOworICAgIFdvcmQxNiBpOwogICAgIFdvcmQxNiB0ZW1wOwogICAgIGNvbnN0IFdvcmQxNiAqcF9kaWNvOwogICAgIFdvcmQxNiBpbmRleCA9IDA7CkBAIC02MDcsNyArNjA3LDcgQEAKICAgICBGbGFnIHVzZV9oYWxmLCAgICAgICAgLyogaTogdXNlIGV2ZXJ5IHNlY29uZCBlbnRyeSBpbiBjb2RlYm9vayAqLwogICAgIEZsYWcgICpwT3ZlcmZsb3cpICAgICAvKiBvIDogRmxhZyBzZXQgd2hlbiBvdmVyZmxvdyBvY2N1cnMgICAgICovCiB7Ci0gICAgcmVnaXN0ZXIgV29yZDE2IGk7CisgICAgV29yZDE2IGk7CiAgICAgV29yZDE2IHRlbXA7CiAKICAgICBjb25zdCBXb3JkMTYgKnBfZGljbzsKQEAgLTEwMTMsNyArMTAxMyw3IEBACiAgICAgRmxhZyAgKnBPdmVyZmxvdyAgICAvKiBvIDogRmxhZyBzZXQgd2hlbiBvdmVyZmxvdyBvY2N1cnMgICAgICAgICAgICAgKi8KICkKIHsKLSAgICByZWdpc3RlciBXb3JkMTYgaSwgajsKKyAgICBXb3JkMTYgaSwgajsKICAgICBXb3JkMTYgbHNmMVtNXTsKICAgICBXb3JkMTYgd2YxW01dOwogICAgIFdvcmQxNiBsc2ZfcFtNXTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3Jlc2lkdS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9yZXNpZHUuY3BwCmluZGV4IGIyNWQzYmUuLjJhZDEzMmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3Jlc2lkdS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcmVzaWR1LmNwcApAQCAtMjAyLDcgKzIwMiw3IEBACiB7CiAKIAotICAgIHJlZ2lzdGVyIFdvcmQxNiBpLCBqOworICAgIFdvcmQxNiBpLCBqOwogICAgIFdvcmQzMiBzMTsKICAgICBXb3JkMzIgczI7CiAgICAgV29yZDMyIHMzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvc2hyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3Noci5jcHAKaW5kZXggNzc1ZGM2OS4uMTAxOGQ5YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvc2hyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9zaHIuY3BwCkBAIC0yMDIsMTAgKzIwMiwxMCBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiA7IEZVTkNUSU9OIENPREUKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotV29yZDE2IHNocihyZWdpc3RlciBXb3JkMTYgdmFyMSwgcmVnaXN0ZXIgV29yZDE2IHZhcjIsIEZsYWcgKnBPdmVyZmxvdykKK1dvcmQxNiBzaHIoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyLCBGbGFnICpwT3ZlcmZsb3cpCiB7Ci0gICAgcmVnaXN0ZXIgV29yZDE2IHJlc3VsdDsKLSAgICByZWdpc3RlciBXb3JkMzIgdGVtcF9yZXM7CisgICAgV29yZDE2IHJlc3VsdDsKKyAgICBXb3JkMzIgdGVtcF9yZXM7CiAKICAgICBpZiAodmFyMiAhPSAwKQogICAgIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3dlaWdodF9hLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3dlaWdodF9hLmNwcAppbmRleCAyZTJlZmM0Li5lZTgyMWVmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy93ZWlnaHRfYS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvd2VpZ2h0X2EuY3BwCkBAIC0xNzgsNyArMTc4LDcgQEAKICAgICBXb3JkMTYgYV9leHBbXSAgICAgIC8qIChvKSAgIDogU3BlY3RyYWwgZXhwYW5kZWQgTFBDIGNvZWZmaWNpZW50cyAgICovCiApCiB7Ci0gICAgcmVnaXN0ZXIgV29yZDE2IGk7CisgICAgV29yZDE2IGk7CiAKICAgICAqKGFfZXhwKSA9ICooYSk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5tawppbmRleCBiMDY3NDU2Li43NmE3ZjQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLm1rCkBAIC00NSw3ICs0NSw3IEBACiAgICAgICAgICQoTE9DQUxfUEFUSCkvLi4vY29tbW9uL2luY2x1ZGUKIAogTE9DQUxfQ0ZMQUdTIDo9IFwKLSAgICAgICAgLURPU0NMX1VOVVNFRF9BUkc9IC1ET1NDTF9JTVBPUlRfUkVGPQorICAgICAgICAtRCJPU0NMX1VOVVNFRF9BUkcoeCk9KHZvaWQpKHgpIiAtRE9TQ0xfSU1QT1JUX1JFRj0KIAogTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKIApAQCAtODMsMyArODMsMjQgQEAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICAgICAgdGVzdC9hbXJuYmRlY190ZXN0LmNwcAorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9zcmMgXAorICAgICAgICAkKExPQ0FMX1BBVEgpLy4uL2NvbW1vbi9pbmNsdWRlIFwKKyAgICAgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKQorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfYW1ybmJkZWMgbGlic25kZmlsZQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIGxpYmF1ZGlvdXRpbHMgbGlibG9nCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9hbXJuYmRlY190ZXN0CitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2QxMDM1cGYuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDEwMzVwZi5jcHAKaW5kZXggODk5ZGFiYS4uODYxYjNlNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDEwMzVwZi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDEwMzVwZi5jcHAKQEAgLTIwOSw3ICsyMDksNyBAQAogICAgIFdvcmQxNiBjb2RbXSAgICAgICAvKiAobykgICAgIDogYWxnZWJyYWljIChmaXhlZCkgY29kZWJvb2sgZXhjaXRhdGlvbiAgICAqLwogKQogewotICAgIHJlZ2lzdGVyIFdvcmQxNiBpLCBqLCBwb3MxLCBwb3MyOworICAgIFdvcmQxNiBpLCBqLCBwb3MxLCBwb3MyOwogICAgIFdvcmQxNiBzaWduLCB0bXA7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgTF9DT0RFOyBpKyspCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kX3Bsc2ZfNS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kX3Bsc2ZfNS5jcHAKaW5kZXggMDhiNjkwZC4uNzA2OGMwYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZF9wbHNmXzUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RfcGxzZl81LmNwcApAQCAtMzA4LDcgKzMwOCw3IEBACiAgICAgRmxhZyAgKnBPdmVyZmxvdyAgICAvKiBvIDogRmxhZyBzZXQgd2hlbiBvdmVyZmxvdyBvY2N1cnMgICAgICAgICAgICAgICAgKi8KICkKIHsKLSAgICByZWdpc3RlciBXb3JkMTYgaTsKKyAgICBXb3JkMTYgaTsKICAgICBXb3JkMTYgdGVtcDsKICAgICBXb3JkMTYgc2lnbjsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvaW50X2xzZi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9pbnRfbHNmLmNwcAppbmRleCBjNWFlZmU0Li4yY2EzMGRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9pbnRfbHNmLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9pbnRfbHNmLmNwcApAQCAtMjE4LDkgKzIxOCw5IEBACiAgICAgRmxhZyAgKnBPdmVyZmxvdyAgLyogbyA6IGZsYWcgc2V0IGlmIG92ZXJmbG93IG9jY3VycyAgICAgICAgICAgICAgICAgICAgKi8KICkKIHsKLSAgICByZWdpc3RlciBXb3JkMTYgaTsKLSAgICByZWdpc3RlciBXb3JkMTYgdGVtcDE7Ci0gICAgcmVnaXN0ZXIgV29yZDE2IHRlbXAyOworICAgIFdvcmQxNiBpOworICAgIFdvcmQxNiB0ZW1wMTsKKyAgICBXb3JkMTYgdGVtcDI7CiAKICAgICBpZiAoaV9zdWJmciA9PSAwKQogICAgIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL3BoX2Rpc3AuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcGhfZGlzcC5jcHAKaW5kZXggZGE1NDQ1Yi4uMjg1NDY1ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcGhfZGlzcC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcGhfZGlzcC5jcHAKQEAgLTIwNyw3ICsyMDcsNyBAQAogCiBXb3JkMTYgcGhfZGlzcF9yZXNldChwaF9kaXNwU3RhdGUgKnN0YXRlKQogewotICAgIHJlZ2lzdGVyIFdvcmQxNiBpOworICAgIFdvcmQxNiBpOwogCiAgICAgaWYgKHN0YXRlID09IChwaF9kaXNwU3RhdGUgKikgTlVMTCkKICAgICB7CkBAIC02NjcsMTUgKzY2NywxNSBAQAogICAgIEZsYWcgICAqcE92ZXJmbG93ICAgICAgIC8qIGkvbyAgICAgOiBvdmVmbG93IGluZGljYXRvciAgICAgICAgICAgICAgICAgICovCiApCiB7Ci0gICAgcmVnaXN0ZXIgV29yZDE2IGksIGkxOwotICAgIHJlZ2lzdGVyIFdvcmQxNiB0bXAxOworICAgIFdvcmQxNiBpLCBpMTsKKyAgICBXb3JkMTYgdG1wMTsKICAgICBXb3JkMzIgTF90ZW1wOwogICAgIFdvcmQzMiBMX3RlbXAyOwogICAgIFdvcmQxNiBpbXBOcjsgICAgICAgICAgIC8qIGluZGljYXRvciBmb3IgYW1vdW50IG9mIGRpc3AuL2ZpbHRlciB1c2VkICovCiAKICAgICBXb3JkMTYgaW5ub19zYXZbTF9TVUJGUl07CiAgICAgV29yZDE2IHBzX3Bvc3NbTF9TVUJGUl07Ci0gICAgcmVnaXN0ZXIgV29yZDE2IG56ZSwgblB1bHNlOworICAgIFdvcmQxNiBuemUsIG5QdWxzZTsKICAgICBXb3JkMTYgcHBvczsKICAgICBjb25zdCBXb3JkMTYgKnBoX2ltcDsgICAvKiBQb2ludGVyIHRvIHBoYXNlIGRpc3BlcnNpb24gZmlsdGVyICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL3BzdGZpbHQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcHN0ZmlsdC5jcHAKaW5kZXggMDMzNjk5MC4uMzllMDFhMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcHN0ZmlsdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcHN0ZmlsdC5jcHAKQEAgLTQ0NSwxMyArNDQ1LDEzIEBACiApCiB7CiAgICAgV29yZDE2IEFwM1tNUDFdOwotICAgIFdvcmQxNiBBcDRbTVAxXTsgICAgICAgICAgICAvKiBiYW5kd2lkdGggZXhwYW5kZWQgTFAgcGFyYW1ldGVycyAqLwotICAgIFdvcmQxNiAqQXo7ICAgICAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIEF6XzQ6ICAgICAgICAgICAgICAgICAqLworICAgIFdvcmQxNiBBcDRbTVAxXTsgICAgICAvKiBiYW5kd2lkdGggZXhwYW5kZWQgTFAgcGFyYW1ldGVycyAqLworICAgIFdvcmQxNiAqQXo7ICAgICAgICAgICAvKiBwb2ludGVyIHRvIEF6XzQ6ICAgICAgICAgICAgICAgICAqLwogICAgIC8qICBMUEMgcGFyYW1ldGVycyBpbiBlYWNoIHN1YmZyYW1lICovCi0gICAgcmVnaXN0ZXIgV29yZDE2IGlfc3ViZnI7ICAgIC8qIGluZGV4IGZvciBiZWdpbm5pbmcgb2Ygc3ViZnJhbWUgICovCisgICAgV29yZDE2IGlfc3ViZnI7ICAgICAgIC8qIGluZGV4IGZvciBiZWdpbm5pbmcgb2Ygc3ViZnJhbWUgICovCiAgICAgV29yZDE2IGhbTF9IXTsKIAotICAgIHJlZ2lzdGVyIFdvcmQxNiBpOworICAgIFdvcmQxNiBpOwogICAgIFdvcmQxNiB0ZW1wMTsKICAgICBXb3JkMTYgdGVtcDI7CiAgICAgV29yZDMyIExfdG1wOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L2Ftcm5iZGVjX3Rlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L2Ftcm5iZGVjX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYTllOTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvYW1ybmJkZWNfdGVzdC5jcHAKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAqIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUworICogT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VECisgKiBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlICJnc21hbXJfZGVjLmgiCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvc25kZmlsZS5oPgorCisvLyBDb25zdGFudHMgZm9yIEFNUi1OQgorZW51bSB7CisgICAga0lucHV0QnVmZmVyU2l6ZSA9IDY0LAorICAgIGtTYW1wbGVzUGVyRnJhbWUgPSAxNjAsCisgICAga0JpdHNQZXJTYW1wbGUgPSAxNiwKKyAgICBrT3V0cHV0QnVmZmVyU2l6ZSA9IGtTYW1wbGVzUGVyRnJhbWUgKiBrQml0c1BlclNhbXBsZS84LAorICAgIGtTYW1wbGVSYXRlID0gODAwMCwKKyAgICBrQ2hhbm5lbHMgPSAxLAorICAgIGtGaWxlSGVhZGVyU2l6ZSA9IDYKK307Citjb25zdCB1aW50MzJfdCBrRnJhbWVTaXplc1tdID0gezEyLCAxMywgMTUsIDE3LCAxOSwgMjAsIDI2LCAzMX07CisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgeworCisgICAgaWYoYXJnYyAhPSAzKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2UgJXMgPGlucHV0IGZpbGU+IDxvdXRwdXQgZmlsZT5cbiIsIGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvLyBPcGVuIHRoZSBpbnB1dCBmaWxlCisgICAgRklMRSogZnBJbnB1dCA9IGZvcGVuKGFyZ3ZbMV0sICJyYiIpOworICAgIGlmICghZnBJbnB1dCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBvcGVuICVzXG4iLCBhcmd2WzFdKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLy8gVmFsaWRhdGUgdGhlIGlucHV0IEFNUiBmaWxlCisgICAgY2hhciBoZWFkZXJba0ZpbGVIZWFkZXJTaXplXTsKKyAgICBpbnQgYnl0ZXNSZWFkID0gZnJlYWQoaGVhZGVyLCAxLCBrRmlsZUhlYWRlclNpemUsIGZwSW5wdXQpOworICAgIGlmIChieXRlc1JlYWQgIT0ga0ZpbGVIZWFkZXJTaXplIHx8IG1lbWNtcChoZWFkZXIsICIjIUFNUlxuIiwga0ZpbGVIZWFkZXJTaXplKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgQU1SLU5CIGZpbGVcbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvLyBPcGVuIHRoZSBvdXRwdXQgZmlsZQorICAgIFNGX0lORk8gc2ZJbmZvOworICAgIG1lbXNldCgmc2ZJbmZvLCAwLCBzaXplb2YoU0ZfSU5GTykpOworICAgIHNmSW5mby5jaGFubmVscyA9IGtDaGFubmVsczsKKyAgICBzZkluZm8uZm9ybWF0ID0gU0ZfRk9STUFUX1dBViB8IFNGX0ZPUk1BVF9QQ01fMTY7CisgICAgc2ZJbmZvLnNhbXBsZXJhdGUgPSBrU2FtcGxlUmF0ZTsKKyAgICBTTkRGSUxFICpoYW5kbGUgPSBzZl9vcGVuKGFyZ3ZbMl0sIFNGTV9XUklURSwgJnNmSW5mbyk7CisgICAgaWYoIWhhbmRsZSl7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGNyZWF0ZSAlc1xuIiwgYXJndlsyXSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8vIENyZWF0ZSBBTVItTkIgZGVjb2RlciBpbnN0YW5jZQorICAgIHZvaWQqIGFtckhhbmRsZTsKKyAgICBpbnQgZXJyID0gR1NNSW5pdERlY29kZSgmYW1ySGFuZGxlLCAoV29yZDgqKSJBTVJOQkRlY29kZXIiKTsKKyAgICBpZihlcnIgIT0gMCl7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgY3JlYXRpbmcgQU1SLU5CIGRlY29kZXIgaW5zdGFuY2VcbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvL0FsbG9jYXRlIGlucHV0IGJ1ZmZlcgorICAgIHZvaWQgKmlucHV0QnVmID0gbWFsbG9jKGtJbnB1dEJ1ZmZlclNpemUpOworICAgIGFzc2VydChpbnB1dEJ1ZiAhPSBOVUxMKTsKKworICAgIC8vQWxsb2NhdGUgb3V0cHV0IGJ1ZmZlcgorICAgIHZvaWQgKm91dHB1dEJ1ZiA9IG1hbGxvYyhrT3V0cHV0QnVmZmVyU2l6ZSk7CisgICAgYXNzZXJ0KG91dHB1dEJ1ZiAhPSBOVUxMKTsKKworCisgICAgLy8gRGVjb2RlIGxvb3AKKyAgICB1aW50MzJfdCByZXRWYWwgPSAwOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIC8vIFJlYWQgbW9kZQorICAgICAgICB1aW50OF90IG1vZGU7CisgICAgICAgIGJ5dGVzUmVhZCA9IGZyZWFkKCZtb2RlLCAxLCAxLCBmcElucHV0KTsKKyAgICAgICAgaWYgKGJ5dGVzUmVhZCAhPSAxKSBicmVhazsKKworICAgICAgICAvLyBGaW5kIGZyYW1lIHR5cGUKKyAgICAgICAgRnJhbWVfVHlwZV8zR1BQIGZyYW1lVHlwZSA9IChGcmFtZV9UeXBlXzNHUFApKChtb2RlID4+IDMpICYgMHgwZik7CisgICAgICAgIGlmIChmcmFtZVR5cGUgPj0gQU1SX1NJRCl7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZyYW1lIHR5cGUgJWQgbm90IHN1cHBvcnRlZFxuIixmcmFtZVR5cGUpOworICAgICAgICAgICAgcmV0VmFsID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gRmluZCBmcmFtZSB0eXBlCisgICAgICAgIGludDMyX3QgZnJhbWVTaXplID0ga0ZyYW1lU2l6ZXNbZnJhbWVUeXBlXTsKKyAgICAgICAgYnl0ZXNSZWFkID0gZnJlYWQoaW5wdXRCdWYsIDEsIGZyYW1lU2l6ZSwgZnBJbnB1dCk7CisgICAgICAgIGlmIChieXRlc1JlYWQgIT0gZnJhbWVTaXplKSBicmVhazsKKworICAgICAgICAvL0RlY29kZSBmcmFtZQorICAgICAgICBpbnQzMl90IGRlY29kZVN0YXR1czsKKyAgICAgICAgZGVjb2RlU3RhdHVzID0gQU1SRGVjb2RlKGFtckhhbmRsZSwgZnJhbWVUeXBlLCAodWludDhfdCopaW5wdXRCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCopb3V0cHV0QnVmLCBNSU1FX0lFVEYpOworICAgICAgICBpZihkZWNvZGVTdGF0dXMgPT0gLTEpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRGVjb2RlciBlbmNvdW50ZXJlZCBlcnJvclxuIik7CisgICAgICAgICAgICByZXRWYWwgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvL1dyaXRlIG91dHB1dCB0byB3YXYKKyAgICAgICAgc2Zfd3JpdGVmX3Nob3J0KGhhbmRsZSwgKGludDE2X3QqKW91dHB1dEJ1Ziwga1NhbXBsZXNQZXJGcmFtZSk7CisKKyAgICB9CisKKyAgICAvLyBDbG9zZSBpbnB1dCBhbmQgb3V0cHV0IGZpbGUKKyAgICBmY2xvc2UoZnBJbnB1dCk7CisgICAgc2ZfY2xvc2UoaGFuZGxlKTsKKworICAgIC8vRnJlZSBhbGxvY2F0ZWQgbWVtb3J5CisgICAgZnJlZShpbnB1dEJ1Zik7CisgICAgZnJlZShvdXRwdXRCdWYpOworCisgICAgLy8gQ2xvc2UgZGVjb2RlciBpbnN0YW5jZQorICAgIEdTTURlY29kZUZyYW1lRXhpdCgmYW1ySGFuZGxlKTsKKworICAgIHJldHVybiByZXRWYWw7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL0FuZHJvaWQubWsKaW5kZXggYWZjMGI4OS4uYmRiYThhOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5tawpAQCAtNjcsNyArNjcsNyBAQAogICAgICAgICAkKExPQ0FMX1BBVEgpLy4uL2NvbW1vbi9pbmNsdWRlCiAKIExPQ0FMX0NGTEFHUyA6PSBcCi0gICAgICAgIC1ET1NDTF9VTlVTRURfQVJHPQorICAgICAgICAtRCJPU0NMX1VOVVNFRF9BUkcoeCk9KHZvaWQpKHgpIgogCiBMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9hdXRvY29yci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9hdXRvY29yci5jcHAKaW5kZXggMGQzYWNhYy4uYzcxODExZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYXV0b2NvcnIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2F1dG9jb3JyLmNwcApAQCAtMzA2LDkgKzMwNiw5IEBACiAgICAgRmxhZyAgKnBPdmVyZmxvdyAgICAgICAvKiAobykgICAgOiBpbmRpY2F0ZXMgb3ZlcmZsb3cgICAgICAgICAgICAgICAgICovCiApCiB7Ci0gICAgcmVnaXN0ZXIgV29yZDE2IGk7Ci0gICAgcmVnaXN0ZXIgV29yZDE2IGo7Ci0gICAgcmVnaXN0ZXIgV29yZDE2IG5vcm07CisgICAgV29yZDE2IGk7CisgICAgV29yZDE2IGo7CisgICAgV29yZDE2IG5vcm07CiAKICAgICBXb3JkMTYgeVtMX1dJTkRPV107CiAgICAgV29yZDMyIHN1bTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MyXzlwZi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jMl85cGYuY3BwCmluZGV4IGEzM2NkZjc0Li5iMjExMDMyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jMl85cGYuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MyXzlwZi5jcHAKQEAgLTMxOCw3ICszMTgsNyBAQAogICAgICAgICBXb3JkMTYgZG5fc2lnbltMX0NPREVdOwogICAgICAgICBXb3JkMTYgcnJbTF9DT0RFXVtMX0NPREVdOwogCi0gICAgICAgIHJlZ2lzdGVyIFdvcmQxNiBpOworICAgICAgICBXb3JkMTYgaTsKIAogICAgICAgICBXb3JkMTYgaW5kZXg7CiAgICAgICAgIFdvcmQxNiBzaGFycDsKQEAgLTU5MiwxMCArNTkyLDEwIEBACiAgICAgICAgIEZsYWcgICAqIHBPdmVyZmxvdyAgIC8qIG8gOiBGbGFnIHNldCB3aGVuIG92ZXJmbG93IG9jY3VycyAgICAgICovCiAgICAgKQogICAgIHsKLSAgICAgICAgcmVnaXN0ZXIgV29yZDE2IGkwOwotICAgICAgICByZWdpc3RlciBXb3JkMTYgaTE7CisgICAgICAgIFdvcmQxNiBpMDsKKyAgICAgICAgV29yZDE2IGkxOwogICAgICAgICBXb3JkMTYgaXggPSAwOyAvKiBpbml0aWFsaXphdGlvbiBvbmx5IG5lZWRlZCB0byBrZWVwIGdjYyBzaWxlbnQgKi8KLSAgICAgICAgcmVnaXN0ZXIgV29yZDE2ICB0cmFjazE7CisgICAgICAgIFdvcmQxNiB0cmFjazE7CiAgICAgICAgIFdvcmQxNiBpcG9zW05CX1BVTFNFXTsKICAgICAgICAgV29yZDE2IHBzazsKICAgICAgICAgV29yZDE2IHBzMDsKQEAgLTYwOCw3ICs2MDgsNyBAQAogICAgICAgICBXb3JkMzIgczsKICAgICAgICAgV29yZDMyIGFscDA7CiAgICAgICAgIFdvcmQzMiBhbHAxOwotICAgICAgICByZWdpc3RlciBXb3JkMTYgaTsKKyAgICAgICAgV29yZDE2IGk7CiAgICAgICAgIFdvcmQzMiBMX3RlbXA7CiAgICAgICAgIFdvcmQxNiAqcF9jb2R2ZWMgPSAmY29kdmVjWzBdOwogCkBAIC05OTMsMTMgKzk5MywxMyBAQAogICAgICAgICBGbGFnICAqcE92ZXJmbG93ICAvKiBvIDogRmxhZyBzZXQgd2hlbiBvdmVyZmxvdyBvY2N1cnMgICAgICAgICAgICAgICovCiAgICAgKQogICAgIHsKLSAgICAgICAgcmVnaXN0ZXIgV29yZDE2IGk7Ci0gICAgICAgIHJlZ2lzdGVyIFdvcmQxNiBqOwotICAgICAgICByZWdpc3RlciBXb3JkMTYgazsKLSAgICAgICAgcmVnaXN0ZXIgV29yZDE2IHRyYWNrOwotICAgICAgICByZWdpc3RlciBXb3JkMTYgZmlyc3Q7Ci0gICAgICAgIHJlZ2lzdGVyIFdvcmQxNiBpbmRleDsKLSAgICAgICAgcmVnaXN0ZXIgV29yZDE2IHJzaWduOworICAgICAgICBXb3JkMTYgaTsKKyAgICAgICAgV29yZDE2IGo7CisgICAgICAgIFdvcmQxNiBrOworICAgICAgICBXb3JkMTYgdHJhY2s7CisgICAgICAgIFdvcmQxNiBmaXJzdDsKKyAgICAgICAgV29yZDE2IGluZGV4OworICAgICAgICBXb3JkMTYgcnNpZ247CiAgICAgICAgIFdvcmQxNiBpbmR4OwogICAgICAgICBXb3JkMTYgX3NpZ25bTkJfUFVMU0VdOwogICAgICAgICBXb3JkMTYgKnAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY2xfbHRwLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NsX2x0cC5jcHAKaW5kZXggNGEwNTMyNy4uNTI1ZTU3ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY2xfbHRwLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jbF9sdHAuY3BwCkBAIC02MzgsNyArNjM4LDcgQEAKICAgICBGbGFnICAgKnBPdmVyZmxvdyAgICAvKiBvICAgOiBvdmVyZmxvdyBpbmRpY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAqLwogKQogewotICAgIHJlZ2lzdGVyIFdvcmQxNiBpOworICAgIFdvcmQxNiBpOwogICAgIFdvcmQxNiBpbmRleDsKICAgICBXb3JkMzIgTF90ZW1wOyAgICAgLyogdGVtcG9yYXJpbHkgdmFyaWFibGUgKi8KICAgICBXb3JkMTYgcmVzdTM7ICAgICAgLyogZmxhZyBmb3IgdXBzYW1wbGUgcmVzb2x1dGlvbiAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29udm9sdmUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29udm9sdmUuY3BwCmluZGV4IGU5Y2U3YmEuLjUwMTVhNGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NvbnZvbHZlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb252b2x2ZS5jcHAKQEAgLTIxMiw3ICsyMTIsNyBAQAogICAgIFdvcmQxNiBMICAgICAgICAgICAvKiAoaSkgICAgIDogdmVjdG9yIHNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICkKIHsKLSAgICByZWdpc3RlciBXb3JkMTYgaSwgbjsKKyAgICBXb3JkMTYgaSwgbjsKICAgICBXb3JkMzIgczEsIHMyOwogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nvcl9oLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nvcl9oLmNwcAppbmRleCBlNDZkOTlmLi4yMDU4M2M0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb3JfaC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29yX2guY3BwCkBAIC0yNzIsOCArMjcyLDggQEAKICAgICBGbGFnICAqcE92ZXJmbG93CiApCiB7Ci0gICAgcmVnaXN0ZXIgV29yZDE2IGk7Ci0gICAgcmVnaXN0ZXIgV29yZDE2IGRlYzsKKyAgICBXb3JkMTYgaTsKKyAgICBXb3JkMTYgZGVjOwogCiAgICAgV29yZDE2IGgyW0xfQ09ERV07CiAgICAgV29yZDMyIHM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb3JfaF94LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nvcl9oX3guY3BwCmluZGV4IGJlYjJhZWMuLmMyNWMwMjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nvcl9oX3guY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nvcl9oX3guY3BwCkBAIC0yNDksOSArMjQ5LDkgQEAKICAgICBGbGFnICAgKnBPdmVyZmxvdyAvKiAobyk6IHBvaW50ZXIgdG8gb3ZlcmZsb3cgZmxhZyAgICAgICAgICAgICAgICAgICAgICAqLwogKQogewotICAgIHJlZ2lzdGVyIFdvcmQxNiBpOwotICAgIHJlZ2lzdGVyIFdvcmQxNiBqOwotICAgIHJlZ2lzdGVyIFdvcmQxNiBrOworICAgIFdvcmQxNiBpOworICAgIFdvcmQxNiBqOworICAgIFdvcmQxNiBrOwogCiAgICAgV29yZDMyIHM7CiAgICAgV29yZDMyIHkzMltMX0NPREVdOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29yX2hfeDIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29yX2hfeDIuY3BwCmluZGV4IGRhNjA2NDAuLmI0ZmQ4NjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nvcl9oX3gyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb3JfaF94Mi5jcHAKQEAgLTIzNiw5ICsyMzYsOSBAQAogICAgIEZsYWcgKnBPdmVyZmxvdwogKQogewotICAgIHJlZ2lzdGVyIFdvcmQxNiBpOwotICAgIHJlZ2lzdGVyIFdvcmQxNiBqOwotICAgIHJlZ2lzdGVyIFdvcmQxNiBrOworICAgIFdvcmQxNiBpOworICAgIFdvcmQxNiBqOworICAgIFdvcmQxNiBrOwogICAgIFdvcmQzMiBzOwogICAgIFdvcmQzMiB5MzJbTF9DT0RFXTsKICAgICBXb3JkMzIgbWF4OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZHR4X2VuYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9kdHhfZW5jLmNwcAppbmRleCAyNzZlNTkwLi4yY2NiNzc3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9kdHhfZW5jLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9kdHhfZW5jLmNwcApAQCAtMTMwLDcgKzEzMCw3IEBACiA7IE1BQ1JPUwogOyBEZWZpbmUgbW9kdWxlIHNwZWNpZmljIG1hY3JvcyBoZXJlCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWV4dGVybiBXb3JkMzIgTF9hZGQocmVnaXN0ZXIgV29yZDMyIExfdmFyMSwgcmVnaXN0ZXIgV29yZDMyIExfdmFyMiwgRmxhZyAqcE92ZXJmbG93KTsKK2V4dGVybiBXb3JkMzIgTF9hZGQoV29yZDMyIExfdmFyMSwgV29yZDMyIExfdmFyMiwgRmxhZyAqcE92ZXJmbG93KTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiA7IERFRklORVMKQEAgLTY3MSw3ICs2NzEsNyBAQAogICAgICAgICAgICAgIEZsYWcgICAqcE92ZXJmbG93ICAgICAgICAvKiBpL28gOiBvdmVyZmxvdyBpbmRpY2F0b3IgICAgICAgICAgICAqLwogICAgICAgICAgICAgKQogewotICAgIHJlZ2lzdGVyIFdvcmQxNiBpLCBqOworICAgIFdvcmQxNiBpLCBqOwogICAgIFdvcmQxNiB0ZW1wOwogICAgIFdvcmQxNiBsb2dfZW47CiAgICAgV29yZDE2IGxzZltNXTsKQEAgLTk0Myw3ICs5NDMsNyBAQAogICAgICAgICAgICAgICAgKQogewogCi0gICAgcmVnaXN0ZXIgV29yZDE2IGk7CisgICAgV29yZDE2IGk7CiAgICAgV29yZDMyIExfZnJhbWVfZW47CiAgICAgV29yZDMyIExfdGVtcDsKICAgICBXb3JkMTYgbG9nX2VuX2U7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9sZXZpbnNvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9sZXZpbnNvbi5jcHAKaW5kZXggMDAxODk3Yi4uMjljZGFjNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbGV2aW5zb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xldmluc29uLmNwcApAQCAtNjM4LDggKzYzOCw4IEBACiAgICAgRmxhZyAgICpwT3ZlcmZsb3cKICkKIHsKLSAgICByZWdpc3RlciBXb3JkMTYgaTsKLSAgICByZWdpc3RlciBXb3JkMTYgajsKKyAgICBXb3JkMTYgaTsKKyAgICBXb3JkMTYgajsKICAgICBXb3JkMTYgaGk7CiAgICAgV29yZDE2IGxvOwogICAgIFdvcmQxNiBLaDsgICAgICAgICAgICAgICAgICAgIC8qIHJlZmxleGlvbiBjb2VmZmljaWVudDsgaGkgYW5kIGxvICAgKi8KQEAgLTY1MSw5ICs2NTEsOSBAQAogICAgIFdvcmQxNiBBbFtNICsgMV07CiAgICAgV29yZDE2IEFuaFtNICsgMV07ICAgICAgICAgICAgLyogTFBDIGNvZWYuZm9yIG5leHQgaXRlcmF0aW9uIGluICAgICAqLwogICAgIFdvcmQxNiBBbmxbTSArIDFdOyAgICAgICAgICAgIC8qIGRvdWJsZSBwcmVjLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICByZWdpc3RlciBXb3JkMzIgdDA7ICAgICAgICAgICAvKiB0ZW1wb3JhcnkgdmFyaWFibGUgICAgICAgICAgICAgICAgICovCi0gICAgcmVnaXN0ZXIgV29yZDMyIHQxOyAgICAgICAgICAgLyogdGVtcG9yYXJ5IHZhcmlhYmxlICAgICAgICAgICAgICAgICAqLwotICAgIHJlZ2lzdGVyIFdvcmQzMiB0MjsgICAgICAgICAgIC8qIHRlbXBvcmFyeSB2YXJpYWJsZSAgICAgICAgICAgICAgICAgKi8KKyAgICBXb3JkMzIgdDA7ICAgICAgICAgICAgICAgICAgICAvKiB0ZW1wb3JhcnkgdmFyaWFibGUgICAgICAgICAgICAgICAgICovCisgICAgV29yZDMyIHQxOyAgICAgICAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IHZhcmlhYmxlICAgICAgICAgICAgICAgICAqLworICAgIFdvcmQzMiB0MjsgICAgICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB2YXJpYWJsZSAgICAgICAgICAgICAgICAgKi8KIAogICAgIFdvcmQxNiAqcF9SaDsKICAgICBXb3JkMTYgKnBfUmw7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9waXRjaF9vbC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9waXRjaF9vbC5jcHAKaW5kZXggZDNhMmVjMC4uYzAzOWJiMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcGl0Y2hfb2wuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3BpdGNoX29sLmNwcApAQCAtMzIwLDcgKzMyMCw3IEBACiApCiAjZW5kaWYKIHsKLSAgICByZWdpc3RlciBXb3JkMTYgaTsKKyAgICBXb3JkMTYgaTsKICAgICBXb3JkMTYgKnA7CiAgICAgV29yZDMyIG1heDsKICAgICBXb3JkMzIgdDA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9wcmVfcHJvYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9wcmVfcHJvYy5jcHAKaW5kZXggZmRjMjQ0MC4uMDQyOTIwZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcHJlX3Byb2MuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3ByZV9wcm9jLmNwcApAQCAtNTQyLDcgKzU0Miw3IEBACiAgICAgV29yZDE2IHNpZ25hbFtdLCAvKiBpbnB1dC9vdXRwdXQgc2lnbmFsICovCiAgICAgV29yZDE2IGxnKSAgICAgICAvKiBsZW5ndGggb2Ygc2lnbmFsICAgICovCiB7Ci0gICAgcmVnaXN0ZXIgV29yZDE2IGk7CisgICAgV29yZDE2IGk7CiAgICAgV29yZDE2IHhfbl8yOwogICAgIFdvcmQxNiB4X25fMTsKICAgICBXb3JkMzIgTF90bXA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zZXRfc2lnbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zZXRfc2lnbi5jcHAKaW5kZXggZDYyNmRlMy4uZmE0M2Y3OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc2V0X3NpZ24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3NldF9zaWduLmNwcApAQCAtMjQ4LDcgKzI0OCw3IEBACiAgICAgICAgICAgICAgIFdvcmQxNiBuICAgICAgIC8qIGkgICA6ICMgb2YgbWF4aW11bSBjb3JyZWxhdGlvbnMgaW4gZG4yW10gICAgKi8KICAgICAgICAgICAgICApCiB7Ci0gICAgcmVnaXN0ZXIgV29yZDE2IGksIGosIGs7CisgICAgV29yZDE2IGksIGosIGs7CiAgICAgV29yZDE2IHZhbCwgbWluOwogICAgIFdvcmQxNiBwb3MgPSAwOyAvKiBpbml0aWFsaXphdGlvbiBvbmx5IG5lZWRlZCB0byBrZWVwIGdjYyBzaWxlbnQgKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvQW5kcm9pZC5tawppbmRleCBlZmRmOTg4Li42ODZmN2EzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvQW5kcm9pZC5tawpAQCAtNDgsNyArNDgsNyBAQAogICAgICAgICAkKExPQ0FMX1BBVEgpL2luY2x1ZGUKIAogTE9DQUxfQ0ZMQUdTIDo9IFwKLSAgICAgICAgLURPU0NMX1VOVVNFRF9BUkc9IC1ET1NDTF9JTVBPUlRfUkVGPQorICAgICAgICAtRCJPU0NMX1VOVVNFRF9BUkcoeCk9KHZvaWQpKHgpIiAtRE9TQ0xfSU1QT1JUX1JFRj0KIAogTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9wdmFtcndiX21hdGhfb3AuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9wdmFtcndiX21hdGhfb3AuY3BwCmluZGV4IGQxZWM3OTAuLjU4NzI1MTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHZhbXJ3Yl9tYXRoX29wLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3B2YW1yd2JfbWF0aF9vcC5jcHAKQEAgLTIwNSw3ICsyMDUsNyBAQAogewogCiAgICAgaW50MTYgdmFyX291dCA9IDA7Ci0gICAgcmVnaXN0ZXIgaW50MTYgaXRlcmF0aW9uOworICAgIGludDE2IGl0ZXJhdGlvbjsKICAgICBpbnQzMiBMX251bTsKICAgICBpbnQzMiBMX2Rlbm9tOwogICAgIGludDMyIExfZGVub21fYnlfMjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL0FuZHJvaWQubWsKaW5kZXggNjRmZThkMS4uMDI0YTI5MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL0FuZHJvaWQubWsKQEAgLTg2LDYgKzg2LDkgQEAKIAogZW5kaWYKIAorIyBBUk1WNUUvRmlsdF82a183a19vcHQucyBkb2VzIG5vdCBjb21waWxlIHdpdGggQ2xhbmcuCitMT0NBTF9DTEFOR19BU0ZMQUdTX2FybSArPSAtbm8taW50ZWdyYXRlZC1hcworCiBMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfYW1yd2JlbmMKIAogTE9DQUxfQVJNX01PREUgOj0gYXJtCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3FfcHVsc2UuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcV9wdWxzZS5jCmluZGV4IDgwYTBiNzMuLmQ2NTg2MDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcV9wdWxzZS5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcV9wdWxzZS5jCkBAIC0xODgsNyArMTg4LDcgQEAKIAkJV29yZDE2IHBvc1tdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlIDEuLjQgICovCiAJCVdvcmQxNiBOKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIG51bWJlciBvZiBiaXRzIGZvciBwb3NpdGlvbiAqLwogewotCVdvcmQxNiBuYl9wb3MsIG1hc2ssIG5fMSwgdG1wOworCVdvcmQxNiBuYl9wb3MsIG1hc2sgX191bnVzZWQsIG5fMSwgdG1wOwogCVdvcmQxNiBwb3NBWzRdLCBwb3NCWzRdOwogCVdvcmQzMiBpLCBqLCBrLCBpbmRleDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy93Yl92YWQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvd2JfdmFkLmMKaW5kZXggMTNkZDJhYS4uMmJlYWVmZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy93Yl92YWQuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3diX3ZhZC5jCkBAIC00MDQsNyArNDA0LDcgQEAKIAkJYWxwaGFfZG93biA9IEFMUEhBX0RPV04xOwogCX0gZWxzZQogCXsKLQkJaWYgKChzdC0+c3RhdF9jb3VudCA9PSAwKSkKKwkJaWYgKHN0LT5zdGF0X2NvdW50ID09IDApCiAJCXsKIAkJCWFscGhhX3VwID0gQUxQSEFfVVAyOwogCQkJYWxwaGFfZG93biA9IEFMUEhBX0RPV04yOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9jb21tb24vc3JjL2RlYmxvY2suY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9jb21tb24vc3JjL2RlYmxvY2suY3BwCmluZGV4IGRlMmQyYjYuLjVmOGI2OTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvY29tbW9uL3NyYy9kZWJsb2NrLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2NvbW1vbi9zcmMvZGVibG9jay5jcHAKQEAgLTEyNzksNyArMTI3OSw3IEBACiAgICAgaW50ICBDMCwgYzAsIGRpZiwgQWJzRGVsdGEsIFN0cm5nLCB0bXAsIHRtcDE7CiAgICAgaW50ICBMMiA9IDAsIEwxLCBMMCwgUjAsIFIxLCBSMiA9IDA7CiAgICAgdWludDggKnB0ciwgKnB0cjE7Ci0gICAgcmVnaXN0ZXIgdWludCBSX2luLCBMX2luOworICAgIHVpbnQgUl9pbiwgTF9pbjsKICAgICB1aW50IFJfb3V0LCBMX291dDsKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvQW5kcm9pZC5tawppbmRleCA1MzdiYTQyLi4yY2VlYmM4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL0FuZHJvaWQubWsKQEAgLTI4LDcgKzI4LDcgQEAKICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKIExPQ0FMX0NGTEFHUyA6PSBcCi0gICAgLURPU0NMX0lNUE9SVF9SRUY9IC1ET1NDTF9VTlVTRURfQVJHPSAtRE9TQ0xfRVhQT1JUX1JFRj0KKyAgICAtRE9TQ0xfSU1QT1JUX1JFRj0gLUQiT1NDTF9VTlVTRURfQVJHKHgpPSh2b2lkKSh4KSIgLURPU0NMX0VYUE9SVF9SRUY9CiAKIExPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCiAKQEAgLTUxLDcgKzUxLDcgQEAKICAgICAgICAgJChMT0NBTF9QQVRIKS8uLi9jb21tb24KIAogTE9DQUxfQ0ZMQUdTIDo9IFwKLSAgICAtRE9TQ0xfSU1QT1JUX1JFRj0gLURPU0NMX1VOVVNFRF9BUkc9IC1ET1NDTF9FWFBPUlRfUkVGPQorICAgIC1ET1NDTF9JTVBPUlRfUkVGPSAtRCJPU0NMX1VOVVNFRF9BUkcoeCk9KHZvaWQpKHgpIiAtRE9TQ0xfRVhQT1JUX1JFRj0KIAogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL1NvZnRBVkNFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL1NvZnRBVkNFbmNvZGVyLmNwcAppbmRleCA2YTdiMjIyLi5mYTZlYzQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9Tb2Z0QVZDRW5jb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvU29mdEFWQ0VuY29kZXIuY3BwCkBAIC01NjksMTMgKzU2OSw2IEBACiAgICAgICAgICAgICAgICAgdmlkZW9JbnB1dC5jb2RpbmdfdGltZXN0YW1wID0gKGluSGVhZGVyLT5uVGltZVN0YW1wICsgNTAwKSAvIDEwMDA7ICAvLyBpbiBtcwogICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmlucHV0RGF0YSA9IE5VTEw7CiAgICAgICAgICAgICAgICAgaWYgKG1JbnB1dERhdGFJc01ldGEpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuICE9IDgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJNZXRhRGF0YSBidWZmZXIgaXMgd3Jvbmcgc2l6ZSEgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKGdvdCAldSBieXRlcywgZXhwZWN0ZWQgOCkiLCBpbkhlYWRlci0+bkZpbGxlZExlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlucHV0RGF0YSA9CiAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0R3JhcGhpY0J1ZmZlcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0RnJhbWVEYXRhLCAobVdpZHRoICogbUhlaWdodCAqIDMpID4+IDEsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9Tb2Z0QVZDRW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvU29mdEFWQ0VuY29kZXIuaAppbmRleCBmMzFjMWY0Li44MWRlMTA5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9Tb2Z0QVZDRW5jb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL1NvZnRBVkNFbmNvZGVyLmgKQEAgLTI2LDggKzI2LDYgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgTWVkaWFCdWZmZXI7Ci0KIHN0cnVjdCBTb2Z0QVZDRW5jb2RlciA6IHB1YmxpYyBNZWRpYUJ1ZmZlck9ic2VydmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQgewogICAgIFNvZnRBVkNFbmNvZGVyKApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2ZpbmRoYWxmcGVsLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9maW5kaGFsZnBlbC5jcHAKaW5kZXggMzhhMmExNS4uMGI4ZDllMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2ZpbmRoYWxmcGVsLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvZmluZGhhbGZwZWwuY3BwCkBAIC0xNTEsOCArMTUxLDcgQEAKICAgICB1aW50OCB0bXA4OwogICAgIGludDMyIHRtcDMyOwogICAgIGludDE2IHRtcF9ob3J6WzE4KjIyXSwgKmRzdF8xNiwgKnNyY18xNjsKLSAgICByZWdpc3RlciBpbnQgYSA9IDAsIGIgPSAwLCBjID0gMCwgZCA9IDAsIGUgPSAwLCBmID0gMDsgLy8gdGVtcCByZWdpc3RlcgotICAgIGludCBtc2s7CisgICAgaW50IGEgPSAwLCBiID0gMCwgYyA9IDAsIGQgPSAwLCBlID0gMCwgZiA9IDA7IC8vIHRlbXAKICAgICBpbnQgaSwgajsKIAogICAgIC8qIGZpcnN0IGNvcHkgZnVsbC1wZWwgdG8gdGhlIGZpcnN0IGFycmF5ICovCkBAIC0zNzksNyArMzc4LDYgQEAKICAgICAvLyBvbmUgY2FuIGp1c3QgdXNlIHRoZSBhYm92ZSBjb2RlIGFuZCBjaGFuZ2UgdGhlIGZvcihpPTIgdG8gZm9yKGk9MTgKICAgICBmb3IgKGkgPSAxNjsgaSA+IDA7IGkgLT0gNCkKICAgICB7Ci0gICAgICAgIG1zayA9IDA7CiAgICAgICAgIGZvciAoaiA9IDE3OyBqID4gMDsgai0tKQogICAgICAgICB7CiAgICAgICAgICAgICBhID0gKigodWludDMyKilyZWYpOyAvKiBsb2FkIDQgYnl0ZXMgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9pbml0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9pbml0LmNwcAppbmRleCBjMjU4YjU3Li42ZTE0MTNhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvaW5pdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2luaXQuY3BwCkBAIC0xNzcsMTAgKzE3Nyw2IEBACiAgICAgICAgICAgICBzZXFQYXJhbS0+b2Zmc2V0X2Zvcl9ub25fcmVmX3BpYyA9IGV4dFMtPm9mZnNldF9mb3Jfbm9uX3JlZl9waWM7CiAgICAgICAgICAgICBzZXFQYXJhbS0+b2Zmc2V0X2Zvcl90b3BfdG9fYm90dG9tX2ZpZWxkID0gZXh0Uy0+b2Zmc2V0X2Zvcl90b3BfdG9fYm90dG9tX2ZpZWxkOwogICAgICAgICAgICAgc2VxUGFyYW0tPm51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUgPSBleHRTLT5udW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlOwotICAgICAgICAgICAgaWYgKGV4dFMtPm9mZnNldF9mb3JfcmVmX2ZyYW1lID09IE5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19FTkNQQVJBTV9NRU1fRkFJTDsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IChpbnQpIGV4dFMtPm51bV9yZWZfZnJhbWVzOyBpaSsrKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHNlcVBhcmFtLT5vZmZzZXRfZm9yX3JlZl9mcmFtZVtpaV0gPSBleHRTLT5vZmZzZXRfZm9yX3JlZl9mcmFtZVtpaV07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvcmF0ZV9jb250cm9sLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9yYXRlX2NvbnRyb2wuY3BwCmluZGV4IGFhMTM4NzMuLjA5ZGNjMjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9yYXRlX2NvbnRyb2wuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9yYXRlX2NvbnRyb2wuY3BwCkBAIC0xNzEsNyArMTcxLDcgQEAKICAgICBBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwgPSBlbmN2aWQtPnJhdGVDdHJsOwogICAgIGRvdWJsZSBMMSwgTDIsIEwzLCBicHA7CiAgICAgaW50IHFwOwotICAgIGludCBpLCBqOworICAgIGludCBpOwogCiAgICAgcmF0ZUN0cmwtPmJhc2ljVW5pdCA9IHZpZGVvLT5QaWNTaXplSW5NYnM7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDJhYjU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjcgQEAKKyNpZmVxICgkKGlmICQod2lsZGNhcmQgZXh0ZXJuYWwvbGliaDI2NCksMSwwKSwxKQorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFICAgICAgICAgICAgOj0gbGlic3RhZ2VmcmlnaHRfc29mdF9hdmNkZWMKK0xPQ0FMX01PRFVMRV9UQUdTICAgICAgIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgIDo9IGxpYmF2Y2RlYworTE9DQUxfU1JDX0ZJTEVTICAgICAgICAgOj0gU29mdEFWQ0RlYy5jcHAKKworTE9DQUxfQ19JTkNMVURFUyA6PSAkKFRPUCkvZXh0ZXJuYWwvbGliYXZjL2RlY29kZXIKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChUT1ApL2V4dGVybmFsL2xpYmF2Yy9jb21tb24KK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZQorTE9DQUxfQ19JTkNMVURFUyArPSAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgIDo9IGxpYnN0YWdlZnJpZ2h0CitMT0NBTF9TSEFSRURfTElCUkFSSUVTICArPSBsaWJzdGFnZWZyaWdodF9vbXgKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgICs9IGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24KK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgICs9IGxpYnV0aWxzCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICArPSBsaWJsb2cKKworTE9DQUxfTERGTEFHUyA6PSAtV2wsLUJzeW1ib2xpYworCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9Tb2Z0QVZDRGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM4ODQ3MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5jcHAKQEAgLTAsMCArMSw4MDggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU29mdEFWQ0RlYyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgImloMjY0X3R5cGVkZWZzLmgiCisjaW5jbHVkZSAiaXYuaCIKKyNpbmNsdWRlICJpdmQuaCIKKyNpbmNsdWRlICJpdGhyZWFkLmgiCisjaW5jbHVkZSAiaWgyNjRkLmgiCisjaW5jbHVkZSAiU29mdEFWQ0RlYy5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxPTVhfVmlkZW9FeHQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjZGVmaW5lIFBSSU5UX1RJTUUgIEFMT0dWCisKKyNkZWZpbmUgY29tcG9uZW50TmFtZSAgICAgICAgICAgICAgICAgICAidmlkZW9fZGVjb2Rlci5hdmMiCisjZGVmaW5lIGNvZGluZ1R5cGUgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0NvZGluZ0FWQworI2RlZmluZSBDT0RFQ19NSU1FX1RZUEUgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQworCisvKiogRnVuY3Rpb24gYW5kIHN0cnVjdHVyZSBkZWZpbml0aW9ucyB0byBrZWVwIGNvZGUgc2ltaWxhciBmb3IgZWFjaCBjb2RlYyAqLworI2RlZmluZSBpdmRlY19hcGlfZnVuY3Rpb24gICAgICAgICAgICAgIGloMjY0ZF9hcGlfZnVuY3Rpb24KKyNkZWZpbmUgaXZkZXh0X2luaXRfaXBfdCAgICAgICAgICAgICAgICBpaDI2NGRfaW5pdF9pcF90CisjZGVmaW5lIGl2ZGV4dF9pbml0X29wX3QgICAgICAgICAgICAgICAgaWgyNjRkX2luaXRfb3BfdAorI2RlZmluZSBpdmRleHRfZmlsbF9tZW1fcmVjX2lwX3QgICAgICAgIGloMjY0ZF9maWxsX21lbV9yZWNfaXBfdAorI2RlZmluZSBpdmRleHRfZmlsbF9tZW1fcmVjX29wX3QgICAgICAgIGloMjY0ZF9maWxsX21lbV9yZWNfb3BfdAorI2RlZmluZSBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCAgIGloMjY0ZF9jdGxfc2V0X251bV9jb3Jlc19pcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90ICAgaWgyNjRkX2N0bF9zZXRfbnVtX2NvcmVzX29wX3QKKworI2RlZmluZSBJVkRFWFRfQ01EX0NUTF9TRVRfTlVNX0NPUkVTICAgIFwKKyAgICAgICAgKElWRF9DT05UUk9MX0FQSV9DT01NQU5EX1RZUEVfVClJSDI2NERfQ01EX0NUTF9TRVRfTlVNX0NPUkVTCisKK3N0YXRpYyBjb25zdCBDb2RlY1Byb2ZpbGVMZXZlbCBrUHJvZmlsZUxldmVsc1tdID0geworICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMSAgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDFiIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwxMSB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMTIgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDEzIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwyICB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMjEgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDIyIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwzICB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMzEgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDMyIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWw0ICB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsNDEgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDQyIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWw1ICB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsNTEgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDUyIH0sCisKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgICAgIE9NWF9WSURFT19BVkNMZXZlbDEgIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sICAgICBPTVhfVklERU9fQVZDTGV2ZWwxYiB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCAgICAgT01YX1ZJREVPX0FWQ0xldmVsMTEgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgICAgIE9NWF9WSURFT19BVkNMZXZlbDEyIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sICAgICBPTVhfVklERU9fQVZDTGV2ZWwxMyB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCAgICAgT01YX1ZJREVPX0FWQ0xldmVsMiAgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgICAgIE9NWF9WSURFT19BVkNMZXZlbDIxIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sICAgICBPTVhfVklERU9fQVZDTGV2ZWwyMiB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCAgICAgT01YX1ZJREVPX0FWQ0xldmVsMyAgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgICAgIE9NWF9WSURFT19BVkNMZXZlbDMxIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sICAgICBPTVhfVklERU9fQVZDTGV2ZWwzMiB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCAgICAgT01YX1ZJREVPX0FWQ0xldmVsNCAgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgICAgIE9NWF9WSURFT19BVkNMZXZlbDQxIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sICAgICBPTVhfVklERU9fQVZDTGV2ZWw0MiB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCAgICAgT01YX1ZJREVPX0FWQ0xldmVsNSAgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgICAgIE9NWF9WSURFT19BVkNMZXZlbDUxIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sICAgICBPTVhfVklERU9fQVZDTGV2ZWw1MiB9LAorCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gsICAgICBPTVhfVklERU9fQVZDTGV2ZWwxICB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoLCAgICAgT01YX1ZJREVPX0FWQ0xldmVsMWIgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlSGlnaCwgICAgIE9NWF9WSURFT19BVkNMZXZlbDExIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gsICAgICBPTVhfVklERU9fQVZDTGV2ZWwxMiB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoLCAgICAgT01YX1ZJREVPX0FWQ0xldmVsMTMgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlSGlnaCwgICAgIE9NWF9WSURFT19BVkNMZXZlbDIgIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gsICAgICBPTVhfVklERU9fQVZDTGV2ZWwyMSB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoLCAgICAgT01YX1ZJREVPX0FWQ0xldmVsMjIgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlSGlnaCwgICAgIE9NWF9WSURFT19BVkNMZXZlbDMgIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gsICAgICBPTVhfVklERU9fQVZDTGV2ZWwzMSB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoLCAgICAgT01YX1ZJREVPX0FWQ0xldmVsMzIgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlSGlnaCwgICAgIE9NWF9WSURFT19BVkNMZXZlbDQgIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gsICAgICBPTVhfVklERU9fQVZDTGV2ZWw0MSB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoLCAgICAgT01YX1ZJREVPX0FWQ0xldmVsNDIgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlSGlnaCwgICAgIE9NWF9WSURFT19BVkNMZXZlbDUgIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gsICAgICBPTVhfVklERU9fQVZDTGV2ZWw1MSB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoLCAgICAgT01YX1ZJREVPX0FWQ0xldmVsNTIgfSwKK307CisKK1NvZnRBVkM6OlNvZnRBVkMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgT01YX1BUUiBhcHBEYXRhLAorICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkKKyAgICA6IFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQoCisgICAgICAgICAgICBuYW1lLCBjb21wb25lbnROYW1lLCBjb2RpbmdUeXBlLAorICAgICAgICAgICAga1Byb2ZpbGVMZXZlbHMsIEFSUkFZX1NJWkUoa1Byb2ZpbGVMZXZlbHMpLAorICAgICAgICAgICAgMzIwIC8qIHdpZHRoICovLCAyNDAgLyogaGVpZ2h0ICovLCBjYWxsYmFja3MsCisgICAgICAgICAgICBhcHBEYXRhLCBjb21wb25lbnQpLAorICAgICAgbU1lbVJlY29yZHMoTlVMTCksCisgICAgICBtRmx1c2hPdXRCdWZmZXIoTlVMTCksCisgICAgICBtT214Q29sb3JGb3JtYXQoT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hciksCisgICAgICBtSXZDb2xvckZvcm1hdChJVl9ZVVZfNDIwUCksCisgICAgICBtTmV3V2lkdGgobVdpZHRoKSwKKyAgICAgIG1OZXdIZWlnaHQobUhlaWdodCksCisgICAgICBtQ2hhbmdpbmdSZXNvbHV0aW9uKGZhbHNlKSB7CisgICAgaW5pdFBvcnRzKAorICAgICAgICAgICAga051bUJ1ZmZlcnMsIElOUFVUX0JVRl9TSVpFLCBrTnVtQnVmZmVycywgQ09ERUNfTUlNRV9UWVBFKTsKKworICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIE5VTEwpOworCisgICAgLy8gSWYgaW5wdXQgZHVtcCBpcyBlbmFibGVkLCB0aGVuIG9wZW4gY3JlYXRlIGFuIGVtcHR5IGZpbGUKKyAgICBHRU5FUkFURV9GSUxFX05BTUVTKCk7CisgICAgQ1JFQVRFX0RVTVBfRklMRShtSW5GaWxlKTsKKworICAgIENIRUNLX0VRKGluaXREZWNvZGVyKCksIChzdGF0dXNfdClPSyk7Cit9CisKK1NvZnRBVkM6On5Tb2Z0QVZDKCkgeworICAgIENIRUNLX0VRKGRlSW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKK30KKworc3RhdGljIHNpemVfdCBHZXRDUFVDb3JlQ291bnQoKSB7CisgICAgbG9uZyBjcHVDb3JlQ291bnQgPSAxOworI2lmIGRlZmluZWQoX1NDX05QUk9DRVNTT1JTX09OTE4pCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisjZWxzZQorICAgIC8vIF9TQ19OUFJPQ19PTkxOIG11c3QgYmUgZGVmaW5lZC4uLgorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DX09OTE4pOworI2VuZGlmCisgICAgQ0hFQ0soY3B1Q29yZUNvdW50ID49IDEpOworICAgIEFMT0dEKCJOdW1iZXIgb2YgQ1BVIGNvcmVzOiAlbGQiLCBjcHVDb3JlQ291bnQpOworICAgIHJldHVybiAoc2l6ZV90KWNwdUNvcmVDb3VudDsKK30KKwordm9pZCBTb2Z0QVZDOjpsb2dWZXJzaW9uKCkgeworICAgIGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9faXBfdCBzX2N0bF9pcDsKKyAgICBpdmRfY3RsX2dldHZlcnNpb25pbmZvX29wX3Qgc19jdGxfb3A7CisgICAgVVdPUkQ4IGF1MV9idWZbNTEyXTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXM7CisKKyAgICBzX2N0bF9pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfY3RsX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX0dFVFZFUlNJT047CisgICAgc19jdGxfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2dldHZlcnNpb25pbmZvX2lwX3QpOworICAgIHNfY3RsX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19vcF90KTsKKyAgICBzX2N0bF9pcC5wdl92ZXJzaW9uX2J1ZmZlciA9IGF1MV9idWY7CisgICAgc19jdGxfaXAudTRfdmVyc2lvbl9idWZmZXJfc2l6ZSA9IHNpemVvZihhdTFfYnVmKTsKKworICAgIHN0YXR1cyA9CisgICAgICAgIGl2ZGVjX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICh2b2lkICopJnNfY3RsX2lwLCAodm9pZCAqKSZzX2N0bF9vcCk7CisKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGluIGdldHRpbmcgdmVyc2lvbiBudW1iZXI6IDB4JXgiLAorICAgICAgICAgICAgICAgIHNfY3RsX29wLnU0X2Vycm9yX2NvZGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJJdHRpYW0gZGVjb2RlciB2ZXJzaW9uIG51bWJlcjogJXMiLAorICAgICAgICAgICAgICAgIChjaGFyICopc19jdGxfaXAucHZfdmVyc2lvbl9idWZmZXIpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3N0YXR1c190IFNvZnRBVkM6OnNldFBhcmFtcyhzaXplX3Qgc3RyaWRlKSB7CisgICAgaXZkX2N0bF9zZXRfY29uZmlnX2lwX3Qgc19jdGxfaXA7CisgICAgaXZkX2N0bF9zZXRfY29uZmlnX29wX3Qgc19jdGxfb3A7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzOworICAgIHNfY3RsX2lwLnU0X2Rpc3Bfd2QgPSAoVVdPUkQzMilzdHJpZGU7CisgICAgc19jdGxfaXAuZV9mcm1fc2tpcF9tb2RlID0gSVZEX1NLSVBfTk9ORTsKKworICAgIHNfY3RsX2lwLmVfZnJtX291dF9tb2RlID0gSVZEX0RJU1BMQVlfRlJBTUVfT1VUOworICAgIHNfY3RsX2lwLmVfdmlkX2RlY19tb2RlID0gSVZEX0RFQ09ERV9GUkFNRTsKKyAgICBzX2N0bF9pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfY3RsX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX1NFVFBBUkFNUzsKKyAgICBzX2N0bF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19pcF90KTsKKyAgICBzX2N0bF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19vcF90KTsKKworICAgIEFMT0dWKCJTZXQgdGhlIHJ1bi10aW1lIChkeW5hbWljKSBwYXJhbWV0ZXJzIHN0cmlkZSA9ICV1Iiwgc3RyaWRlKTsKKyAgICBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSZzX2N0bF9pcCwgKHZvaWQgKikmc19jdGxfb3ApOworCisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBpbiBzZXR0aW5nIHRoZSBydW4tdGltZSBwYXJhbWV0ZXJzOiAweCV4IiwKKyAgICAgICAgICAgICAgICBzX2N0bF9vcC51NF9lcnJvcl9jb2RlKTsKKworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTb2Z0QVZDOjpyZXNldFBsdWdpbigpIHsKKyAgICBtSXNJbkZsdXNoID0gZmFsc2U7CisgICAgbVJlY2VpdmVkRU9TID0gZmFsc2U7CisgICAgbWVtc2V0KG1UaW1lU3RhbXBzLCAwLCBzaXplb2YobVRpbWVTdGFtcHMpKTsKKyAgICBtZW1zZXQobVRpbWVTdGFtcHNWYWxpZCwgMCwgc2l6ZW9mKG1UaW1lU3RhbXBzVmFsaWQpKTsKKworICAgIC8qIEluaXRpYWxpemUgYm90aCBzdGFydCBhbmQgZW5kIHRpbWVzICovCisgICAgZ2V0dGltZW9mZGF5KCZtVGltZVN0YXJ0LCBOVUxMKTsKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lRW5kLCBOVUxMKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU29mdEFWQzo6cmVzZXREZWNvZGVyKCkgeworICAgIGl2ZF9jdGxfcmVzZXRfaXBfdCBzX2N0bF9pcDsKKyAgICBpdmRfY3RsX3Jlc2V0X29wX3Qgc19jdGxfb3A7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc19jdGxfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2N0bF9pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9SRVNFVDsKKyAgICBzX2N0bF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfcmVzZXRfaXBfdCk7CisgICAgc19jdGxfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3Jlc2V0X29wX3QpOworCisgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19jdGxfaXAsICh2b2lkICopJnNfY3RsX29wKTsKKyAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGluIHJlc2V0OiAweCV4Iiwgc19jdGxfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIC8qIFNldCB0aGUgcnVuLXRpbWUgKGR5bmFtaWMpIHBhcmFtZXRlcnMgKi8KKyAgICBzZXRQYXJhbXMob3V0cHV0QnVmZmVyV2lkdGgoKSk7CisKKyAgICAvKiBTZXQgbnVtYmVyIG9mIGNvcmVzL3RocmVhZHMgdG8gYmUgdXNlZCBieSB0aGUgY29kZWMgKi8KKyAgICBzZXROdW1Db3JlcygpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTb2Z0QVZDOjpzZXROdW1Db3JlcygpIHsKKyAgICBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCBzX3NldF9jb3Jlc19pcDsKKyAgICBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCBzX3NldF9jb3Jlc19vcDsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXM7CisgICAgc19zZXRfY29yZXNfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3NldF9jb3Jlc19pcC5lX3N1Yl9jbWQgPSBJVkRFWFRfQ01EX0NUTF9TRVRfTlVNX0NPUkVTOworICAgIHNfc2V0X2NvcmVzX2lwLnU0X251bV9jb3JlcyA9IE1JTihtTnVtQ29yZXMsIENPREVDX01BWF9OVU1fQ09SRVMpOworICAgIHNfc2V0X2NvcmVzX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QpOworICAgIHNfc2V0X2NvcmVzX29wLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX29wX3QpOworICAgIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbigKKyAgICAgICAgICAgIG1Db2RlY0N0eCwgKHZvaWQgKikmc19zZXRfY29yZXNfaXAsICh2b2lkICopJnNfc2V0X2NvcmVzX29wKTsKKyAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGluIHNldHRpbmcgbnVtYmVyIG9mIGNvcmVzOiAweCV4IiwKKyAgICAgICAgICAgICAgICBzX3NldF9jb3Jlc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU29mdEFWQzo6c2V0Rmx1c2hNb2RlKCkgeworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1czsKKyAgICBpdmRfY3RsX2ZsdXNoX2lwX3Qgc192aWRlb19mbHVzaF9pcDsKKyAgICBpdmRfY3RsX2ZsdXNoX29wX3Qgc192aWRlb19mbHVzaF9vcDsKKworICAgIHNfdmlkZW9fZmx1c2hfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3ZpZGVvX2ZsdXNoX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX0ZMVVNIOworICAgIHNfdmlkZW9fZmx1c2hfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2ZsdXNoX2lwX3QpOworICAgIHNfdmlkZW9fZmx1c2hfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2ZsdXNoX29wX3QpOworCisgICAgLyogU2V0IHRoZSBkZWNvZGVyIGluIEZsdXNoIG1vZGUsIHN1YnNlcXVlbnQgZGVjb2RlKCkgY2FsbHMgd2lsbCBmbHVzaCAqLworICAgIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbigKKyAgICAgICAgICAgIG1Db2RlY0N0eCwgKHZvaWQgKikmc192aWRlb19mbHVzaF9pcCwgKHZvaWQgKikmc192aWRlb19mbHVzaF9vcCk7CisKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGluIHNldHRpbmcgdGhlIGRlY29kZXIgaW4gZmx1c2ggbW9kZTogKCVkKSAweCV4Iiwgc3RhdHVzLAorICAgICAgICAgICAgICAgIHNfdmlkZW9fZmx1c2hfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIG1Jc0luRmx1c2ggPSB0cnVlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU29mdEFWQzo6aW5pdERlY29kZXIoKSB7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgVVdPUkQzMiB1NF9udW1fcmVvcmRlcl9mcmFtZXM7CisgICAgVVdPUkQzMiB1NF9udW1fcmVmX2ZyYW1lczsKKyAgICBVV09SRDMyIHU0X3NoYXJlX2Rpc3BfYnVmOworICAgIFdPUkQzMiBpNF9sZXZlbDsKKworICAgIG1OdW1Db3JlcyA9IEdldENQVUNvcmVDb3VudCgpOworCisgICAgLyogSW5pdGlhbGl6ZSBudW1iZXIgb2YgcmVmIGFuZCByZW9yZGVyIG1vZGVzIChmb3IgSDI2NCkgKi8KKyAgICB1NF9udW1fcmVvcmRlcl9mcmFtZXMgPSAxNjsKKyAgICB1NF9udW1fcmVmX2ZyYW1lcyA9IDE2OworICAgIHU0X3NoYXJlX2Rpc3BfYnVmID0gMDsKKworICAgIHVpbnQzMl90IGRpc3BsYXlTdHJpZGUgPSBvdXRwdXRCdWZmZXJXaWR0aCgpOworICAgIHVpbnQzMl90IGRpc3BsYXlIZWlnaHQgPSBvdXRwdXRCdWZmZXJIZWlnaHQoKTsKKyAgICB1aW50MzJfdCBkaXNwbGF5U2l6ZVkgPSBkaXNwbGF5U3RyaWRlICogZGlzcGxheUhlaWdodDsKKworICAgIGlmIChkaXNwbGF5U2l6ZVkgPiAoMTkyMCAqIDEwODgpKSB7CisgICAgICAgIGk0X2xldmVsID0gNTA7CisgICAgfSBlbHNlIGlmIChkaXNwbGF5U2l6ZVkgPiAoMTI4MCAqIDcyMCkpIHsKKyAgICAgICAgaTRfbGV2ZWwgPSA0MDsKKyAgICB9IGVsc2UgaWYgKGRpc3BsYXlTaXplWSA+ICg3MjAgKiA1NzYpKSB7CisgICAgICAgIGk0X2xldmVsID0gMzE7CisgICAgfSBlbHNlIGlmIChkaXNwbGF5U2l6ZVkgPiAoNjI0ICogMzIwKSkgeworICAgICAgICBpNF9sZXZlbCA9IDMwOworICAgIH0gZWxzZSBpZiAoZGlzcGxheVNpemVZID4gKDM1MiAqIDI4OCkpIHsKKyAgICAgICAgaTRfbGV2ZWwgPSAyMTsKKyAgICB9IGVsc2UgeworICAgICAgICBpNF9sZXZlbCA9IDIwOworICAgIH0KKworICAgIHsKKyAgICAgICAgaXZfbnVtX21lbV9yZWNfaXBfdCBzX251bV9tZW1fcmVjX2lwOworICAgICAgICBpdl9udW1fbWVtX3JlY19vcF90IHNfbnVtX21lbV9yZWNfb3A7CisKKyAgICAgICAgc19udW1fbWVtX3JlY19pcC51NF9zaXplID0gc2l6ZW9mKHNfbnVtX21lbV9yZWNfaXApOworICAgICAgICBzX251bV9tZW1fcmVjX29wLnU0X3NpemUgPSBzaXplb2Yoc19udW1fbWVtX3JlY19vcCk7CisgICAgICAgIHNfbnVtX21lbV9yZWNfaXAuZV9jbWQgPSBJVl9DTURfR0VUX05VTV9NRU1fUkVDOworCisgICAgICAgIEFMT0dWKCJHZXQgbnVtYmVyIG9mIG1lbSByZWNvcmRzIik7CisgICAgICAgIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbigKKyAgICAgICAgICAgICAgICBtQ29kZWNDdHgsICh2b2lkICopJnNfbnVtX21lbV9yZWNfaXAsICh2b2lkICopJnNfbnVtX21lbV9yZWNfb3ApOworICAgICAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFcnJvciBpbiBnZXR0aW5nIG1lbSByZWNvcmRzOiAweCV4IiwKKyAgICAgICAgICAgICAgICAgICAgc19udW1fbWVtX3JlY19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgbU51bU1lbVJlY29yZHMgPSBzX251bV9tZW1fcmVjX29wLnU0X251bV9tZW1fcmVjOworICAgIH0KKworICAgIG1NZW1SZWNvcmRzID0gKGl2X21lbV9yZWNfdCAqKWl2ZF9hbGlnbmVkX21hbGxvYygKKyAgICAgICAgICAgIDEyOCwgbU51bU1lbVJlY29yZHMgKiBzaXplb2YoaXZfbWVtX3JlY190KSk7CisgICAgaWYgKG1NZW1SZWNvcmRzID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkFsbG9jYXRpb24gZmFpbHVyZSIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIG1lbXNldChtTWVtUmVjb3JkcywgMCwgbU51bU1lbVJlY29yZHMgKiBzaXplb2YoaXZfbWVtX3JlY190KSk7CisKKyAgICB7CisgICAgICAgIHNpemVfdCBpOworICAgICAgICBpdmRleHRfZmlsbF9tZW1fcmVjX2lwX3Qgc19maWxsX21lbV9pcDsKKyAgICAgICAgaXZkZXh0X2ZpbGxfbWVtX3JlY19vcF90IHNfZmlsbF9tZW1fb3A7CisgICAgICAgIGl2X21lbV9yZWNfdCAqcHNfbWVtX3JlYzsKKworICAgICAgICBzX2ZpbGxfbWVtX2lwLnNfaXZkX2ZpbGxfbWVtX3JlY19pcF90LnU0X3NpemUgPQorICAgICAgICAgICAgc2l6ZW9mKGl2ZGV4dF9maWxsX21lbV9yZWNfaXBfdCk7CisgICAgICAgIHNfZmlsbF9tZW1faXAuaTRfbGV2ZWwgPSBpNF9sZXZlbDsKKyAgICAgICAgc19maWxsX21lbV9pcC51NF9udW1fcmVvcmRlcl9mcmFtZXMgPSB1NF9udW1fcmVvcmRlcl9mcmFtZXM7CisgICAgICAgIHNfZmlsbF9tZW1faXAudTRfbnVtX3JlZl9mcmFtZXMgPSB1NF9udW1fcmVmX2ZyYW1lczsKKyAgICAgICAgc19maWxsX21lbV9pcC51NF9zaGFyZV9kaXNwX2J1ZiA9IHU0X3NoYXJlX2Rpc3BfYnVmOworICAgICAgICBzX2ZpbGxfbWVtX2lwLnU0X251bV9leHRyYV9kaXNwX2J1ZiA9IDA7CisgICAgICAgIHNfZmlsbF9tZW1faXAuZV9vdXRwdXRfZm9ybWF0ID0gbUl2Q29sb3JGb3JtYXQ7CisKKyAgICAgICAgc19maWxsX21lbV9pcC5zX2l2ZF9maWxsX21lbV9yZWNfaXBfdC5lX2NtZCA9IElWX0NNRF9GSUxMX05VTV9NRU1fUkVDOworICAgICAgICBzX2ZpbGxfbWVtX2lwLnNfaXZkX2ZpbGxfbWVtX3JlY19pcF90LnB2X21lbV9yZWNfbG9jYXRpb24gPSBtTWVtUmVjb3JkczsKKyAgICAgICAgc19maWxsX21lbV9pcC5zX2l2ZF9maWxsX21lbV9yZWNfaXBfdC51NF9tYXhfZnJtX3dkID0gZGlzcGxheVN0cmlkZTsKKyAgICAgICAgc19maWxsX21lbV9pcC5zX2l2ZF9maWxsX21lbV9yZWNfaXBfdC51NF9tYXhfZnJtX2h0ID0gZGlzcGxheUhlaWdodDsKKyAgICAgICAgc19maWxsX21lbV9vcC5zX2l2ZF9maWxsX21lbV9yZWNfb3BfdC51NF9zaXplID0KKyAgICAgICAgICAgIHNpemVvZihpdmRleHRfZmlsbF9tZW1fcmVjX29wX3QpOworCisgICAgICAgIHBzX21lbV9yZWMgPSBtTWVtUmVjb3JkczsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG1OdW1NZW1SZWNvcmRzOyBpKyspIHsKKyAgICAgICAgICAgIHBzX21lbV9yZWNbaV0udTRfc2l6ZSA9IHNpemVvZihpdl9tZW1fcmVjX3QpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKAorICAgICAgICAgICAgICAgIG1Db2RlY0N0eCwgKHZvaWQgKikmc19maWxsX21lbV9pcCwgKHZvaWQgKikmc19maWxsX21lbV9vcCk7CisKKyAgICAgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisgICAgICAgICAgICBBTE9HRSgiRXJyb3IgaW4gZmlsbGluZyBtZW0gcmVjb3JkczogMHgleCIsCisgICAgICAgICAgICAgICAgICAgIHNfZmlsbF9tZW1fb3Auc19pdmRfZmlsbF9tZW1fcmVjX29wX3QudTRfZXJyb3JfY29kZSk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBtTnVtTWVtUmVjb3JkcyA9CisgICAgICAgICAgICBzX2ZpbGxfbWVtX29wLnNfaXZkX2ZpbGxfbWVtX3JlY19vcF90LnU0X251bV9tZW1fcmVjX2ZpbGxlZDsKKworICAgICAgICBwc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG1OdW1NZW1SZWNvcmRzOyBpKyspIHsKKyAgICAgICAgICAgIHBzX21lbV9yZWMtPnB2X2Jhc2UgPSBpdmRfYWxpZ25lZF9tYWxsb2MoCisgICAgICAgICAgICAgICAgICAgIHBzX21lbV9yZWMtPnU0X21lbV9hbGlnbm1lbnQsIHBzX21lbV9yZWMtPnU0X21lbV9zaXplKTsKKyAgICAgICAgICAgIGlmIChwc19tZW1fcmVjLT5wdl9iYXNlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQWxsb2NhdGlvbiBmYWlsdXJlIGZvciBtZW1vcnkgcmVjb3JkICMlenUgb2Ygc2l6ZSAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICBpLCBwc19tZW1fcmVjLT51NF9tZW1fc2l6ZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gSVZfRkFJTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwc19tZW1fcmVjKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBkZWNvZGVyICovCisgICAgeworICAgICAgICBpdmRleHRfaW5pdF9pcF90IHNfaW5pdF9pcDsKKyAgICAgICAgaXZkZXh0X2luaXRfb3BfdCBzX2luaXRfb3A7CisKKyAgICAgICAgdm9pZCAqZGVjX2Z4bnMgPSAodm9pZCAqKWl2ZGVjX2FwaV9mdW5jdGlvbjsKKworICAgICAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2luaXRfaXBfdCk7CisgICAgICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QuZV9jbWQgPSAoSVZEX0FQSV9DT01NQU5EX1RZUEVfVClJVl9DTURfSU5JVDsKKyAgICAgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC5wdl9tZW1fcmVjX2xvY2F0aW9uID0gbU1lbVJlY29yZHM7CisgICAgICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QudTRfZnJtX21heF93ZCA9IGRpc3BsYXlTdHJpZGU7CisgICAgICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QudTRfZnJtX21heF9odCA9IGRpc3BsYXlIZWlnaHQ7CisKKyAgICAgICAgc19pbml0X2lwLmk0X2xldmVsID0gaTRfbGV2ZWw7CisgICAgICAgIHNfaW5pdF9pcC51NF9udW1fcmVvcmRlcl9mcmFtZXMgPSB1NF9udW1fcmVvcmRlcl9mcmFtZXM7CisgICAgICAgIHNfaW5pdF9pcC51NF9udW1fcmVmX2ZyYW1lcyA9IHU0X251bV9yZWZfZnJhbWVzOworICAgICAgICBzX2luaXRfaXAudTRfc2hhcmVfZGlzcF9idWYgPSB1NF9zaGFyZV9kaXNwX2J1ZjsKKyAgICAgICAgc19pbml0X2lwLnU0X251bV9leHRyYV9kaXNwX2J1ZiA9IDA7CisKKyAgICAgICAgc19pbml0X29wLnNfaXZkX2luaXRfb3BfdC51NF9zaXplID0gc2l6ZW9mKHNfaW5pdF9vcCk7CisKKyAgICAgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC51NF9udW1fbWVtX3JlYyA9IG1OdW1NZW1SZWNvcmRzOworICAgICAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LmVfb3V0cHV0X2Zvcm1hdCA9IG1JdkNvbG9yRm9ybWF0OworCisgICAgICAgIG1Db2RlY0N0eCA9IChpdl9vYmpfdCAqKW1NZW1SZWNvcmRzWzBdLnB2X2Jhc2U7CisgICAgICAgIG1Db2RlY0N0eC0+cHZfZnhucyA9IGRlY19meG5zOworICAgICAgICBtQ29kZWNDdHgtPnU0X3NpemUgPSBzaXplb2YoaXZfb2JqX3QpOworCisgICAgICAgIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICh2b2lkICopJnNfaW5pdF9pcCwgKHZvaWQgKikmc19pbml0X29wKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgICAgICBBTE9HRSgiRXJyb3IgaW4gaW5pdDogMHgleCIsCisgICAgICAgICAgICAgICAgICAgIHNfaW5pdF9vcC5zX2l2ZF9pbml0X29wX3QudTRfZXJyb3JfY29kZSk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFJlc2V0IHRoZSBwbHVnaW4gc3RhdGUgKi8KKyAgICByZXNldFBsdWdpbigpOworCisgICAgLyogU2V0IHRoZSBydW4gdGltZSAoZHluYW1pYykgcGFyYW1ldGVycyAqLworICAgIHNldFBhcmFtcyhkaXNwbGF5U3RyaWRlKTsKKworICAgIC8qIFNldCBudW1iZXIgb2YgY29yZXMvdGhyZWFkcyB0byBiZSB1c2VkIGJ5IHRoZSBjb2RlYyAqLworICAgIHNldE51bUNvcmVzKCk7CisKKyAgICAvKiBHZXQgY29kZWMgdmVyc2lvbiAqLworICAgIGxvZ1ZlcnNpb24oKTsKKworICAgIC8qIEFsbG9jYXRlIGludGVybmFsIHBpY3R1cmUgYnVmZmVyICovCisgICAgdWludDMyX3QgYnVmZmVyU2l6ZSA9IGRpc3BsYXlTaXplWSAqIDMgLyAyOworICAgIG1GbHVzaE91dEJ1ZmZlciA9ICh1aW50OF90ICopaXZkX2FsaWduZWRfbWFsbG9jKDEyOCwgYnVmZmVyU2l6ZSk7CisgICAgaWYgKE5VTEwgPT0gbUZsdXNoT3V0QnVmZmVyKSB7CisgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgYWxsb2NhdGUgZmx1c2hPdXRwdXRCdWZmZXIgb2Ygc2l6ZSAlenUiLCBidWZmZXJTaXplKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICBtSW5pdE5lZWRlZCA9IGZhbHNlOworICAgIG1GbHVzaE5lZWRlZCA9IGZhbHNlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU29mdEFWQzo6ZGVJbml0RGVjb2RlcigpIHsKKyAgICBzaXplX3QgaTsKKworICAgIGlmIChtTWVtUmVjb3JkcykgeworICAgICAgICBpdl9tZW1fcmVjX3QgKnBzX21lbV9yZWM7CisKKyAgICAgICAgcHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbU51bU1lbVJlY29yZHM7IGkrKykgeworICAgICAgICAgICAgaWYgKHBzX21lbV9yZWMtPnB2X2Jhc2UpIHsKKyAgICAgICAgICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKHBzX21lbV9yZWMtPnB2X2Jhc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHNfbWVtX3JlYysrOworICAgICAgICB9CisgICAgICAgIGl2ZF9hbGlnbmVkX2ZyZWUobU1lbVJlY29yZHMpOworICAgICAgICBtTWVtUmVjb3JkcyA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKG1GbHVzaE91dEJ1ZmZlcikgeworICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKG1GbHVzaE91dEJ1ZmZlcik7CisgICAgICAgIG1GbHVzaE91dEJ1ZmZlciA9IE5VTEw7CisgICAgfQorCisgICAgbUluaXROZWVkZWQgPSB0cnVlOworICAgIG1DaGFuZ2luZ1Jlc29sdXRpb24gPSBmYWxzZTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU29mdEFWQzo6cmVJbml0RGVjb2RlcigpIHsKKyAgICBzdGF0dXNfdCByZXQ7CisKKyAgICBkZUluaXREZWNvZGVyKCk7CisKKyAgICByZXQgPSBpbml0RGVjb2RlcigpOworICAgIGlmIChPSyAhPSByZXQpIHsKKyAgICAgICAgQUxPR0UoIkNyZWF0ZSBmYWlsdXJlIik7CisgICAgICAgIGRlSW5pdERlY29kZXIoKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIFNvZnRBVkM6Om9uUmVzZXQoKSB7CisgICAgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6b25SZXNldCgpOworCisgICAgcmVzZXREZWNvZGVyKCk7CisgICAgcmVzZXRQbHVnaW4oKTsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0QVZDOjppbnRlcm5hbFNldFBhcmFtZXRlcihPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcykgeworICAgIGNvbnN0IHVpbnQzMl90IG9sZFdpZHRoID0gbVdpZHRoOworICAgIGNvbnN0IHVpbnQzMl90IG9sZEhlaWdodCA9IG1IZWlnaHQ7CisgICAgT01YX0VSUk9SVFlQRSByZXQgPSBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjppbnRlcm5hbFNldFBhcmFtZXRlcihpbmRleCwgcGFyYW1zKTsKKyAgICBpZiAobVdpZHRoICE9IG9sZFdpZHRoIHx8IG1IZWlnaHQgIT0gb2xkSGVpZ2h0KSB7CisgICAgICAgIHJlSW5pdERlY29kZXIoKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBTb2Z0QVZDOjpzZXREZWNvZGVBcmdzKAorICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3QgKnBzX2RlY19pcCwKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90ICpwc19kZWNfb3AsCisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciwKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciwKKyAgICAgICAgc2l6ZV90IHRpbWVTdGFtcEl4KSB7CisgICAgc2l6ZV90IHNpemVZID0gb3V0cHV0QnVmZmVyV2lkdGgoKSAqIG91dHB1dEJ1ZmZlckhlaWdodCgpOworICAgIHNpemVfdCBzaXplVVY7CisgICAgdWludDhfdCAqcEJ1ZjsKKworICAgIHBzX2RlY19pcC0+dTRfc2l6ZSA9IHNpemVvZihpdmRfdmlkZW9fZGVjb2RlX2lwX3QpOworICAgIHBzX2RlY19vcC0+dTRfc2l6ZSA9IHNpemVvZihpdmRfdmlkZW9fZGVjb2RlX29wX3QpOworCisgICAgcHNfZGVjX2lwLT5lX2NtZCA9IElWRF9DTURfVklERU9fREVDT0RFOworCisgICAgLyogV2hlbiBpbiBmbHVzaCBhbmQgYWZ0ZXIgRU9TIHdpdGggemVybyBieXRlIGlucHV0LAorICAgICAqIGluSGVhZGVyIGlzIHNldCB0byB6ZXJvLiBIZW5jZSBjaGVjayBmb3Igbm9uLW51bGwgKi8KKyAgICBpZiAoaW5IZWFkZXIpIHsKKyAgICAgICAgcHNfZGVjX2lwLT51NF90cyA9IHRpbWVTdGFtcEl4OworICAgICAgICBwc19kZWNfaXAtPnB2X3N0cmVhbV9idWZmZXIgPQorICAgICAgICAgICAgaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKKyAgICAgICAgcHNfZGVjX2lwLT51NF9udW1fQnl0ZXMgPSBpbkhlYWRlci0+bkZpbGxlZExlbjsKKyAgICB9IGVsc2UgeworICAgICAgICBwc19kZWNfaXAtPnU0X3RzID0gMDsKKyAgICAgICAgcHNfZGVjX2lwLT5wdl9zdHJlYW1fYnVmZmVyID0gTlVMTDsKKyAgICAgICAgcHNfZGVjX2lwLT51NF9udW1fQnl0ZXMgPSAwOworICAgIH0KKworICAgIGlmIChvdXRIZWFkZXIpIHsKKyAgICAgICAgcEJ1ZiA9IG91dEhlYWRlci0+cEJ1ZmZlcjsKKyAgICB9IGVsc2UgeworICAgICAgICBwQnVmID0gbUZsdXNoT3V0QnVmZmVyOworICAgIH0KKworICAgIHNpemVVViA9IHNpemVZIC8gNDsKKyAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzBdID0gc2l6ZVk7CisgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVsxXSA9IHNpemVVVjsKKyAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzJdID0gc2l6ZVVWOworCisgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMF0gPSBwQnVmOworICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzFdID0gcEJ1ZiArIHNpemVZOworICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzJdID0gcEJ1ZiArIHNpemVZICsgc2l6ZVVWOworICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnU0X251bV9idWZzID0gMzsKKyAgICByZXR1cm47Cit9Cit2b2lkIFNvZnRBVkM6Om9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7CisgICAgLyogT25jZSB0aGUgb3V0cHV0IGJ1ZmZlcnMgYXJlIGZsdXNoZWQsIGlnbm9yZSBhbnkgYnVmZmVycyB0aGF0IGFyZSBoZWxkIGluIGRlY29kZXIgKi8KKyAgICBpZiAoa091dHB1dFBvcnRJbmRleCA9PSBwb3J0SW5kZXgpIHsKKyAgICAgICAgc2V0Rmx1c2hNb2RlKCk7CisKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY19pcDsKKyAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY19vcDsKKyAgICAgICAgICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1czsKKyAgICAgICAgICAgIHNpemVfdCBzaXplWSwgc2l6ZVVWOworCisgICAgICAgICAgICBzZXREZWNvZGVBcmdzKCZzX2RlY19pcCwgJnNfZGVjX29wLCBOVUxMLCBOVUxMLCAwKTsKKworICAgICAgICAgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19kZWNfaXAsICh2b2lkICopJnNfZGVjX29wKTsKKyAgICAgICAgICAgIGlmICgwID09IHNfZGVjX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICAgICAgcmVzZXRQbHVnaW4oKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBTb2Z0QVZDOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7CisgICAgVU5VU0VEKHBvcnRJbmRleCk7CisKKyAgICBpZiAobU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSAhPSBOT05FKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJmluUXVldWUgPSBnZXRQb3J0UXVldWUoa0lucHV0UG9ydEluZGV4KTsKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKGtPdXRwdXRQb3J0SW5kZXgpOworCisgICAgLyogSWYgaW5wdXQgRU9TIGlzIHNlZW4gYW5kIGRlY29kZXIgaXMgbm90IGluIGZsdXNoIG1vZGUsCisgICAgICogc2V0IHRoZSBkZWNvZGVyIGluIGZsdXNoIG1vZGUuCisgICAgICogVGhlcmUgY2FuIGJlIGEgY2FzZSB3aGVyZSBFT1MgaXMgc2VudCBhbG9uZyB3aXRoIGxhc3QgcGljdHVyZSBkYXRhCisgICAgICogSW4gdGhhdCBjYXNlLCBvbmx5IGFmdGVyIGRlY29kaW5nIHRoYXQgaW5wdXQgZGF0YSwgZGVjb2RlciBoYXMgdG8gYmUKKyAgICAgKiBwdXQgaW4gZmx1c2guIFRoaXMgY2FzZSBpcyBoYW5kbGVkIGhlcmUgICovCisKKyAgICBpZiAobVJlY2VpdmVkRU9TICYmICFtSXNJbkZsdXNoKSB7CisgICAgICAgIHNldEZsdXNoTW9kZSgpOworICAgIH0KKworICAgIHdoaWxlICghb3V0UXVldWUuZW1wdHkoKSkgeworICAgICAgICBCdWZmZXJJbmZvICppbkluZm87CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlcjsKKworICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvOworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyOworICAgICAgICBzaXplX3QgdGltZVN0YW1wSXg7CisKKyAgICAgICAgaW5JbmZvID0gTlVMTDsKKyAgICAgICAgaW5IZWFkZXIgPSBOVUxMOworCisgICAgICAgIGlmICghbUlzSW5GbHVzaCkgeworICAgICAgICAgICAgaWYgKCFpblF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOworICAgICAgICAgICAgICAgIGluSGVhZGVyID0gaW5JbmZvLT5tSGVhZGVyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG91dEluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKKyAgICAgICAgb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKKyAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSAwOworICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPSAwOworICAgICAgICBvdXRIZWFkZXItPm5PZmZzZXQgPSAwOworCisgICAgICAgIGlmIChpbkhlYWRlciAhPSBOVUxMICYmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSkgeworICAgICAgICAgICAgbVJlY2VpdmVkRU9TID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisgICAgICAgICAgICAgICAgaW5IZWFkZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIHNldEZsdXNoTW9kZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gV2hlbiB0aGVyZSBpcyBhbiBpbml0IHJlcXVpcmVkIGFuZCB0aGUgZGVjb2RlciBpcyBub3QgaW4gZmx1c2ggbW9kZSwKKyAgICAgICAgLy8gdXBkYXRlIG91dHB1dCBwb3J0J3MgZGVmaW5pdGlvbiBhbmQgcmVpbml0aWFsaXplIGRlY29kZXIuCisgICAgICAgIGlmIChtSW5pdE5lZWRlZCAmJiAhbUlzSW5GbHVzaCkgeworICAgICAgICAgICAgYm9vbCBwb3J0V2lsbFJlc2V0ID0gZmFsc2U7CisgICAgICAgICAgICBoYW5kbGVQb3J0U2V0dGluZ3NDaGFuZ2UoJnBvcnRXaWxsUmVzZXQsIG1OZXdXaWR0aCwgbU5ld0hlaWdodCk7CisKKyAgICAgICAgICAgIENIRUNLX0VRKHJlSW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEdldCBhIGZyZWUgc2xvdCBpbiB0aW1lc3RhbXAgYXJyYXkgdG8gaG9sZCBpbnB1dCB0aW1lc3RhbXAgKi8KKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZV90IGk7CisgICAgICAgICAgICB0aW1lU3RhbXBJeCA9IDA7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1RJTUVfU1RBTVBTOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1UaW1lU3RhbXBzVmFsaWRbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgdGltZVN0YW1wSXggPSBpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5IZWFkZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1UaW1lU3RhbXBzVmFsaWRbdGltZVN0YW1wSXhdID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtVGltZVN0YW1wc1t0aW1lU3RhbXBJeF0gPSBpbkhlYWRlci0+blRpbWVTdGFtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY19pcDsKKyAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY19vcDsKKyAgICAgICAgICAgIFdPUkQzMiB0aW1lRGVsYXksIHRpbWVUYWtlbjsKKyAgICAgICAgICAgIHNpemVfdCBzaXplWSwgc2l6ZVVWOworCisgICAgICAgICAgICBzZXREZWNvZGVBcmdzKCZzX2RlY19pcCwgJnNfZGVjX29wLCBpbkhlYWRlciwgb3V0SGVhZGVyLCB0aW1lU3RhbXBJeCk7CisgICAgICAgICAgICAvLyBJZiBpbnB1dCBkdW1wIGlzIGVuYWJsZWQsIHRoZW4gd3JpdGUgdG8gZmlsZQorICAgICAgICAgICAgRFVNUF9UT19GSUxFKG1JbkZpbGUsIHNfZGVjX2lwLnB2X3N0cmVhbV9idWZmZXIsIHNfZGVjX2lwLnU0X251bV9CeXRlcyk7CisKKyAgICAgICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIE5VTEwpOworICAgICAgICAgICAgLyogQ29tcHV0ZSB0aW1lIGVsYXBzZWQgYmV0d2VlbiBlbmQgb2YgcHJldmlvdXMgZGVjb2RlKCkKKyAgICAgICAgICAgICAqIHRvIHN0YXJ0IG9mIGN1cnJlbnQgZGVjb2RlKCkgKi8KKyAgICAgICAgICAgIFRJTUVfRElGRihtVGltZUVuZCwgbVRpbWVTdGFydCwgdGltZURlbGF5KTsKKworICAgICAgICAgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzOworICAgICAgICAgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19kZWNfaXAsICh2b2lkICopJnNfZGVjX29wKTsKKworICAgICAgICAgICAgYm9vbCB1bnN1cHBvcnRlZERpbWVuc2lvbnMgPQorICAgICAgICAgICAgICAgIChJVkRfU1RSRUFNX1dJRFRIX0hFSUdIVF9OT1RfU1VQUE9SVEVEID09IChzX2RlY19vcC51NF9lcnJvcl9jb2RlICYgMHhGRikpOworICAgICAgICAgICAgYm9vbCByZXNDaGFuZ2VkID0gKElWRF9SRVNfQ0hBTkdFRCA9PSAoc19kZWNfb3AudTRfZXJyb3JfY29kZSAmIDB4RkYpKTsKKworICAgICAgICAgICAgR0VUVElNRSgmbVRpbWVFbmQsIE5VTEwpOworICAgICAgICAgICAgLyogQ29tcHV0ZSB0aW1lIHRha2VuIGZvciBkZWNvZGUoKSAqLworICAgICAgICAgICAgVElNRV9ESUZGKG1UaW1lU3RhcnQsIG1UaW1lRW5kLCB0aW1lVGFrZW4pOworCisgICAgICAgICAgICBQUklOVF9USU1FKCJ0aW1lVGFrZW49JTZkIGRlbGF5PSU2ZCBudW1CeXRlcz0lNmQiLCB0aW1lVGFrZW4sIHRpbWVEZWxheSwKKyAgICAgICAgICAgICAgICAgICBzX2RlY19vcC51NF9udW1fYnl0ZXNfY29uc3VtZWQpOworICAgICAgICAgICAgaWYgKHNfZGVjX29wLnU0X2ZyYW1lX2RlY29kZWRfZmxhZyAmJiAhbUZsdXNoTmVlZGVkKSB7CisgICAgICAgICAgICAgICAgbUZsdXNoTmVlZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChpbkhlYWRlciAhPSBOVUxMKSAmJiAoMSAhPSBzX2RlY19vcC51NF9mcmFtZV9kZWNvZGVkX2ZsYWcpKSB7CisgICAgICAgICAgICAgICAgLyogSWYgdGhlIGlucHV0IGRpZCBub3QgY29udGFpbiBwaWN0dXJlIGRhdGEsIHRoZW4gaWdub3JlCisgICAgICAgICAgICAgICAgICogdGhlIGFzc29jaWF0ZWQgdGltZXN0YW1wICovCisgICAgICAgICAgICAgICAgbVRpbWVTdGFtcHNWYWxpZFt0aW1lU3RhbXBJeF0gPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gaGFuZGxlIENUUyBEZWNvZGVyVGVzdCB0ZXN0Q29kZWNSZXNldHNIMjY0V2l0aG91dFN1cmZhY2UsCisgICAgICAgICAgICAvLyB3aGljaCBpcyBub3Qgc2VuZGluZyBTUFMvUFBTIGFmdGVyIHBvcnQgcmVjb25maWd1cmF0aW9uIGFuZCBmbHVzaCB0byB0aGUgY29kZWMuCisgICAgICAgICAgICBpZiAodW5zdXBwb3J0ZWREaW1lbnNpb25zICYmICFtRmx1c2hOZWVkZWQpIHsKKyAgICAgICAgICAgICAgICBib29sIHBvcnRXaWxsUmVzZXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBoYW5kbGVQb3J0U2V0dGluZ3NDaGFuZ2UoJnBvcnRXaWxsUmVzZXQsIHNfZGVjX29wLnU0X3BpY193ZCwgc19kZWNfb3AudTRfcGljX2h0KTsKKworICAgICAgICAgICAgICAgIENIRUNLX0VRKHJlSW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKKworICAgICAgICAgICAgICAgIHNldERlY29kZUFyZ3MoJnNfZGVjX2lwLCAmc19kZWNfb3AsIGluSGVhZGVyLCBvdXRIZWFkZXIsIHRpbWVTdGFtcEl4KTsKKworICAgICAgICAgICAgICAgIGl2ZGVjX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICh2b2lkICopJnNfZGVjX2lwLCAodm9pZCAqKSZzX2RlY19vcCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiB0aGUgZGVjb2RlciBpcyBpbiB0aGUgY2hhbmdpbmcgcmVzb2x1dGlvbiBtb2RlIGFuZCB0aGVyZSBpcyBubyBvdXRwdXQgcHJlc2VudCwKKyAgICAgICAgICAgIC8vIHRoYXQgbWVhbnMgdGhlIHN3aXRjaGluZyBpcyBkb25lIGFuZCBpdCdzIHJlYWR5IHRvIHJlc2V0IHRoZSBkZWNvZGVyIGFuZCB0aGUgcGx1Z2luLgorICAgICAgICAgICAgaWYgKG1DaGFuZ2luZ1Jlc29sdXRpb24gJiYgIXNfZGVjX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICAgICAgbUNoYW5naW5nUmVzb2x1dGlvbiA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJlc2V0RGVjb2RlcigpOworICAgICAgICAgICAgICAgIHJlc2V0UGx1Z2luKCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh1bnN1cHBvcnRlZERpbWVuc2lvbnMgfHwgcmVzQ2hhbmdlZCkgeworICAgICAgICAgICAgICAgIG1DaGFuZ2luZ1Jlc29sdXRpb24gPSB0cnVlOworICAgICAgICAgICAgICAgIGlmIChtRmx1c2hOZWVkZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0Rmx1c2hNb2RlKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHVuc3VwcG9ydGVkRGltZW5zaW9ucykgeworICAgICAgICAgICAgICAgICAgICBtTmV3V2lkdGggPSBzX2RlY19vcC51NF9waWNfd2Q7CisgICAgICAgICAgICAgICAgICAgIG1OZXdIZWlnaHQgPSBzX2RlY19vcC51NF9waWNfaHQ7CisgICAgICAgICAgICAgICAgICAgIG1Jbml0TmVlZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoMCA8IHNfZGVjX29wLnU0X3BpY193ZCkgJiYgKDAgPCBzX2RlY19vcC51NF9waWNfaHQpKSB7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgd2lkdGggPSBzX2RlY19vcC51NF9waWNfd2Q7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0ID0gc19kZWNfb3AudTRfcGljX2h0OworICAgICAgICAgICAgICAgIGJvb2wgcG9ydFdpbGxSZXNldCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZSgmcG9ydFdpbGxSZXNldCwgd2lkdGgsIGhlaWdodCk7CisKKyAgICAgICAgICAgICAgICBpZiAocG9ydFdpbGxSZXNldCkgeworICAgICAgICAgICAgICAgICAgICByZXNldERlY29kZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNfZGVjX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gKG1XaWR0aCAqIG1IZWlnaHQgKiAzKSAvIDI7CisKKyAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPSBtVGltZVN0YW1wc1tzX2RlY19vcC51NF90c107CisgICAgICAgICAgICAgICAgbVRpbWVTdGFtcHNWYWxpZFtzX2RlY19vcC51NF90c10gPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICBvdXRJbmZvID0gTlVMTDsKKyAgICAgICAgICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOworICAgICAgICAgICAgICAgIG91dEhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIElmIGluIGZsdXNoIG1vZGUgYW5kIG5vIG91dHB1dCBpcyByZXR1cm5lZCBieSB0aGUgY29kZWMsCisgICAgICAgICAgICAgICAgICogdGhlbiBjb21lIG91dCBvZiBmbHVzaCBtb2RlICovCisgICAgICAgICAgICAgICAgbUlzSW5GbHVzaCA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgLyogSWYgRU9TIHdhcyByZWNpZXZlZCBvbiBpbnB1dCBwb3J0IGFuZCB0aGVyZSBpcyBubyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgKiBmcm9tIHRoZSBjb2RlYywgdGhlbiBzaWduYWwgRU9TIG9uIG91dHB1dCBwb3J0ICovCisgICAgICAgICAgICAgICAgaWYgKG1SZWNlaXZlZEVPUykgeworICAgICAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAwOworICAgICAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5GbGFncyB8PSBPTVhfQlVGRkVSRkxBR19FT1M7CisKKyAgICAgICAgICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0SW5mbyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisgICAgICAgICAgICAgICAgICAgIG91dEhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIHJlc2V0UGx1Z2luKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGluSGVhZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgaW5JbmZvID0gTlVMTDsKKyAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisgICAgICAgICAgICBpbkhlYWRlciA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2FuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywgT01YX1BUUiBhcHBEYXRhLAorICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgeworICAgIHJldHVybiBuZXcgYW5kcm9pZDo6U29mdEFWQyhuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL1NvZnRBVkNEZWMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MWE3MWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL1NvZnRBVkNEZWMuaApAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTT0ZUX0gyNjRfREVDX0hfCisKKyNkZWZpbmUgU09GVF9IMjY0X0RFQ19IXworCisjaW5jbHVkZSAiU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2RlZmluZSBpdmRfYWxpZ25lZF9tYWxsb2MoYWxpZ25tZW50LCBzaXplKSBtZW1hbGlnbihhbGlnbm1lbnQsIHNpemUpCisjZGVmaW5lIGl2ZF9hbGlnbmVkX2ZyZWUoYnVmKSBmcmVlKGJ1ZikKKworLyoqIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSB0aW1lLXN0YW1wIGFycmF5ICovCisjZGVmaW5lIE1BWF9USU1FX1NUQU1QUyA2NAorCisvKiogTWF4aW11bSBudW1iZXIgb2YgY29yZXMgc3VwcG9ydGVkIGJ5IHRoZSBjb2RlYyAqLworI2RlZmluZSBDT0RFQ19NQVhfTlVNX0NPUkVTIDQKKworI2RlZmluZSBDT0RFQ19NQVhfV0lEVEggICAgIDE5MjAKKworI2RlZmluZSBDT0RFQ19NQVhfSEVJR0hUICAgIDEwODgKKworLyoqIElucHV0IGJ1ZmZlciBzaXplICovCisjZGVmaW5lIElOUFVUX0JVRl9TSVpFICgxMDI0ICogMTAyNCkKKworI2RlZmluZSBNSU4oYSwgYikgKChhKSA8IChiKSkgPyAoYSkgOiAoYikKKworLyoqIFVzZWQgdG8gcmVtb3ZlIHdhcm5pbmdzIGFib3V0IHVudXNlZCBwYXJhbWV0ZXJzICovCisjZGVmaW5lIFVOVVNFRCh4KSAoKHZvaWQpKHgpKQorCisvKiogR2V0IHRpbWUgKi8KKyNkZWZpbmUgR0VUVElNRShhLCBiKSBnZXR0aW1lb2ZkYXkoYSwgYik7CisKKy8qKiBDb21wdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiBzdGFydCBhbmQgZW5kICovCisjZGVmaW5lIFRJTUVfRElGRihzdGFydCwgZW5kLCBkaWZmKSBcCisgICAgZGlmZiA9ICgoZW5kLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgKiAxMDAwMDAwKSArIFwKKyAgICAgICAgICAgIChlbmQudHZfdXNlYyAtIHN0YXJ0LnR2X3VzZWMpOworCitzdHJ1Y3QgU29mdEFWQyA6IHB1YmxpYyBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50IHsKKyAgICBTb2Z0QVZDKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+U29mdEFWQygpOworCisgICAgdmlydHVhbCB2b2lkIG9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpOworICAgIHZpcnR1YWwgdm9pZCBvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCk7CisgICAgdmlydHVhbCB2b2lkIG9uUmVzZXQoKTsKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRQYXJhbWV0ZXIoT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpOworcHJpdmF0ZToKKyAgICAvLyBOdW1iZXIgb2YgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzCisgICAgZW51bSB7CisgICAgICAgIGtOdW1CdWZmZXJzID0gOAorICAgIH07CisKKyAgICBpdl9vYmpfdCAqbUNvZGVjQ3R4OyAgICAgICAgIC8vIENvZGVjIGNvbnRleHQKKyAgICBpdl9tZW1fcmVjX3QgKm1NZW1SZWNvcmRzOyAgIC8vIE1lbW9yeSByZWNvcmRzIHJlcXVlc3RlZCBieSB0aGUgY29kZWMKKyAgICBzaXplX3QgbU51bU1lbVJlY29yZHM7ICAgICAgIC8vIE51bWJlciBvZiBtZW1vcnkgcmVjb3JkcyByZXF1ZXN0ZWQgYnkgdGhlIGNvZGVjCisKKyAgICBzaXplX3QgbU51bUNvcmVzOyAgICAgICAgICAgIC8vIE51bWJlciBvZiBjb3JlcyB0byBiZSB1ZXNkIGJ5IHRoZSBjb2RlYworCisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVTdGFydDsgICAvLyBUaW1lIGF0IHRoZSBzdGFydCBvZiBkZWNvZGUoKQorICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lRW5kOyAgICAgLy8gVGltZSBhdCB0aGUgZW5kIG9mIGRlY29kZSgpCisKKyAgICAvLyBJbnRlcm5hbCBidWZmZXIgdG8gYmUgdXNlZCB0byBmbHVzaCBvdXQgdGhlIGJ1ZmZlcnMgZnJvbSBkZWNvZGVyCisgICAgdWludDhfdCAqbUZsdXNoT3V0QnVmZmVyOworCisgICAgLy8gU3RhdHVzIG9mIGVudHJpZXMgaW4gdGhlIHRpbWVzdGFtcCBhcnJheQorICAgIGJvb2wgbVRpbWVTdGFtcHNWYWxpZFtNQVhfVElNRV9TVEFNUFNdOworCisgICAgLy8gVGltZXN0YW1wIGFycmF5IC0gU2luY2UgY29kZWMgZG9lcyBub3QgdGFrZSA2NCBiaXQgdGltZXN0YW1wcywKKyAgICAvLyB0aGV5IGFyZSBtYWludGFpbmVkIGluIHRoZSBwbHVnaW4KKyAgICBPTVhfUzY0IG1UaW1lU3RhbXBzW01BWF9USU1FX1NUQU1QU107CisKKyNpZmRlZiBGSUxFX0RVTVBfRU5BQkxFCisgICAgY2hhciBtSW5GaWxlWzIwMF07CisjZW5kaWYgLyogRklMRV9EVU1QX0VOQUJMRSAqLworCisgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgbU9teENvbG9yRm9ybWF0OyAgICAvLyBPTVggQ29sb3IgZm9ybWF0CisgICAgSVZfQ09MT1JfRk9STUFUX1QgbUl2Q29sb3JGb3JtYXQ7ICAgICAgICAvLyBJdHRpYW0gQ29sb3IgZm9ybWF0CisKKyAgICBib29sIG1Jc0luRmx1c2g7ICAgICAgICAvLyBjb2RlYyBpcyBmbHVzaCBtb2RlCisgICAgYm9vbCBtUmVjZWl2ZWRFT1M7ICAgICAgLy8gRU9TIGlzIHJlY2VpZXZlZCBvbiBpbnB1dCBwb3J0CisgICAgYm9vbCBtSW5pdE5lZWRlZDsKKyAgICB1aW50MzJfdCBtTmV3V2lkdGg7CisgICAgdWludDMyX3QgbU5ld0hlaWdodDsKKyAgICAvLyBUaGUgaW5wdXQgc3RyZWFtIGhhcyBjaGFuZ2VkIHRvIGEgZGlmZmVyZW50IHJlc29sdXRpb24sIHdoaWNoIGlzIHN0aWxsIHN1cHBvcnRlZCBieSB0aGUKKyAgICAvLyBjb2RlYy4gU28gdGhlIGNvZGVjIGlzIHN3aXRjaGluZyB0byBkZWNvZGUgdGhlIG5ldyByZXNvbHV0aW9uLgorICAgIGJvb2wgbUNoYW5naW5nUmVzb2x1dGlvbjsKKyAgICBib29sIG1GbHVzaE5lZWRlZDsKKworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgc3RhdHVzX3QgZGVJbml0RGVjb2RlcigpOworICAgIHN0YXR1c190IHNldEZsdXNoTW9kZSgpOworICAgIHN0YXR1c190IHNldFBhcmFtcyhzaXplX3Qgc3RyaWRlKTsKKyAgICB2b2lkIGxvZ1ZlcnNpb24oKTsKKyAgICBzdGF0dXNfdCBzZXROdW1Db3JlcygpOworICAgIHN0YXR1c190IHJlc2V0RGVjb2RlcigpOworICAgIHN0YXR1c190IHJlc2V0UGx1Z2luKCk7CisgICAgc3RhdHVzX3QgcmVJbml0RGVjb2RlcigpOworCisgICAgdm9pZCBzZXREZWNvZGVBcmdzKAorICAgICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNfaXAsCisgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3QgKnBzX2RlY19vcCwKKyAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciwKKyAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIsCisgICAgICAgICAgICBzaXplX3QgdGltZVN0YW1wSXgpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdEFWQyk7Cit9OworCisjaWZkZWYgRklMRV9EVU1QX0VOQUJMRQorCisjZGVmaW5lIElOUFVUX0RVTVBfUEFUSCAgICAgIi9zZGNhcmQvbWVkaWEvYXZjZF9pbnB1dCIKKyNkZWZpbmUgSU5QVVRfRFVNUF9FWFQgICAgICAiaDI2NCIKKworI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdHJjcHkobUluRmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNwcmludGYobUluRmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBJTlBVVF9EVU1QX1BBVEgsICBcCisgICAgICAgICAgICBtVGltZVN0YXJ0LnR2X3NlYywgbVRpbWVTdGFydC50dl91c2VjLCAgICAgIFwKKyAgICAgICAgICAgIElOUFVUX0RVTVBfRVhUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICBGSUxFICpmcCA9IGZvcGVuKG1fZmlsZW5hbWUsICJ3YiIpOyAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmcCAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBTE9HRCgiQ291bGQgbm90IG9wZW4gZmlsZSAlcyIsIG1fZmlsZW5hbWUpOyAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNkZWZpbmUgRFVNUF9UT19GSUxFKG1fZmlsZW5hbWUsIG1fYnVmLCBtX3NpemUpICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRklMRSAqZnAgPSBmb3BlbihtX2ZpbGVuYW1lLCAiYWIiKTsgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZnAgIT0gTlVMTCAmJiBtX2J1ZiAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGkgPSBmd3JpdGUobV9idWYsIDEsIG1fc2l6ZSwgZnApOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoImZ3cml0ZSByZXQgJWQgdG8gd3JpdGUgJWQiLCBpLCBtX3NpemUpOyAgXAorICAgICAgICBpZiAoaSAhPSAoaW50KSBtX3NpemUpIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiRXJyb3IgaW4gZndyaXRlLCByZXR1cm5lZCAlZCIsIGkpOyAgIFwKKyAgICAgICAgICAgIHBlcnJvcigiRXJyb3IgaW4gd3JpdGUgdG8gZmlsZSIpOyAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBTE9HRCgiQ291bGQgbm90IHdyaXRlIHRvIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTtcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNlbHNlIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKyNkZWZpbmUgSU5QVVRfRFVNUF9QQVRICisjZGVmaW5lIElOUFVUX0RVTVBfRVhUCisjZGVmaW5lIE9VVFBVVF9EVU1QX1BBVEgKKyNkZWZpbmUgT1VUUFVUX0RVTVBfRVhUCisjZGVmaW5lIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKQorI2RlZmluZSBDUkVBVEVfRFVNUF9GSUxFKG1fZmlsZW5hbWUpCisjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplKQorI2VuZGlmIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFNPRlRfSDI2NF9ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGE0ZGI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzAgQEAKKyNpZmVxICgkKGlmICQod2lsZGNhcmQgZXh0ZXJuYWwvbGliaDI2NCksMSwwKSwxKQorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFICAgICAgICAgICAgOj0gbGlic3RhZ2VmcmlnaHRfc29mdF9hdmNlbmMKK0xPQ0FMX01PRFVMRV9UQUdTICAgICAgIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgIDo9IGxpYmF2Y2VuYworTE9DQUxfU1JDX0ZJTEVTICAgICAgICAgOj0gU29mdEFWQ0VuYy5jcHAKKworTE9DQUxfQ19JTkNMVURFUyA6PSAkKFRPUCkvZXh0ZXJuYWwvbGliYXZjL2VuY29kZXIKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChUT1ApL2V4dGVybmFsL2xpYmF2Yy9jb21tb24KK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZQorTE9DQUxfQ19JTkNMVURFUyArPSAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CitMT0NBTF9DX0lOQ0xVREVTICs9ICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvaGFyZHdhcmUKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICA6PSBsaWJzdGFnZWZyaWdodAorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyAgKz0gbGlic3RhZ2VmcmlnaHRfb214CitMT0NBTF9TSEFSRURfTElCUkFSSUVTICArPSBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICArPSBsaWJ1dGlscworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyAgKz0gbGlibG9nCisKK0xPQ0FMX0xERkxBR1MgOj0gLVdsLC1Cc3ltYm9saWMKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNWUzNTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuY3BwCkBAIC0wLDAgKzEsMTMzNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTb2Z0QVZDRW5jIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KKworI2luY2x1ZGUgIk9NWF9WaWRlby5oIgorCisjaW5jbHVkZSA8SGFyZHdhcmVBUEkuaD4KKyNpbmNsdWRlIDxNZXRhZGF0YUJ1ZmZlclR5cGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPHVpL1JlY3QuaD4KKworI2luY2x1ZGUgImloMjY0X3R5cGVkZWZzLmgiCisjaW5jbHVkZSAiaXYyLmgiCisjaW5jbHVkZSAiaXZlMi5oIgorI2luY2x1ZGUgImloMjY0ZS5oIgorI2luY2x1ZGUgIlNvZnRBVkNFbmMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisgICAgI2RlZmluZSBpdmVfYXBpX2Z1bmN0aW9uIGloMjY0ZV9hcGlfZnVuY3Rpb24KKwordGVtcGxhdGU8Y2xhc3MgVD4KK3N0YXRpYyB2b2lkIEluaXRPTVhQYXJhbXMoVCAqcGFyYW1zKSB7CisgICAgcGFyYW1zLT5uU2l6ZSA9IHNpemVvZihUKTsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublZlcnNpb25NYWpvciA9IDE7CisgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5WZXJzaW9uTWlub3IgPSAwOworICAgIHBhcmFtcy0+blZlcnNpb24ucy5uUmV2aXNpb24gPSAwOworICAgIHBhcmFtcy0+blZlcnNpb24ucy5uU3RlcCA9IDA7Cit9CisKK3R5cGVkZWYgc3RydWN0IExldmVsQ29udmVyc2lvbiB7CisgICAgT01YX1ZJREVPX0FWQ0xFVkVMVFlQRSBvbXhMZXZlbDsKKyAgICBXT1JEMzIgYXZjTGV2ZWw7Cit9IExldmVsQ29uY2Vyc2lvbjsKKworc3RhdGljIExldmVsQ29udmVyc2lvbiBDb252ZXJzaW9uVGFibGVbXSA9IHsKKyAgICB7IE9NWF9WSURFT19BVkNMZXZlbDEsICAxMCB9LAorICAgIHsgT01YX1ZJREVPX0FWQ0xldmVsMWIsIDkgIH0sCisgICAgeyBPTVhfVklERU9fQVZDTGV2ZWwxMSwgMTEgfSwKKyAgICB7IE9NWF9WSURFT19BVkNMZXZlbDEyLCAxMiB9LAorICAgIHsgT01YX1ZJREVPX0FWQ0xldmVsMTMsIDEzIH0sCisgICAgeyBPTVhfVklERU9fQVZDTGV2ZWwyLCAgMjAgfSwKKyAgICB7IE9NWF9WSURFT19BVkNMZXZlbDIxLCAyMSB9LAorICAgIHsgT01YX1ZJREVPX0FWQ0xldmVsMjIsIDIyIH0sCisgICAgeyBPTVhfVklERU9fQVZDTGV2ZWwzLCAgMzAgfSwKKyAgICB7IE9NWF9WSURFT19BVkNMZXZlbDMxLCAzMSB9LAorICAgIHsgT01YX1ZJREVPX0FWQ0xldmVsMzIsIDMyIH0sCisgICAgeyBPTVhfVklERU9fQVZDTGV2ZWw0LCAgNDAgfSwKKyAgICB7IE9NWF9WSURFT19BVkNMZXZlbDQxLCA0MSB9LAorICAgIHsgT01YX1ZJREVPX0FWQ0xldmVsNDIsIDQyIH0sCisgICAgeyBPTVhfVklERU9fQVZDTGV2ZWw1LCAgNTAgfSwKKyAgICB7IE9NWF9WSURFT19BVkNMZXZlbDUxLCA1MSB9LAorfTsKKworc3RhdGljIGNvbnN0IENvZGVjUHJvZmlsZUxldmVsIGtQcm9maWxlTGV2ZWxzW10gPSB7CisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwxICB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMWIgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDExIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwxMiB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMTMgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDIgIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwyMSB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMjIgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDMgIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwzMSB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMzIgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDQgIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWw0MSB9LAorfTsKKworCitzdGF0aWMgc2l6ZV90IEdldENQVUNvcmVDb3VudCgpIHsKKyAgICBsb25nIGNwdUNvcmVDb3VudCA9IDE7CisjaWYgZGVmaW5lZChfU0NfTlBST0NFU1NPUlNfT05MTikKKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKTsKKyNlbHNlCisgICAgLy8gX1NDX05QUk9DX09OTE4gbXVzdCBiZSBkZWZpbmVkLi4uCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NfT05MTik7CisjZW5kaWYKKyAgICBDSEVDSyhjcHVDb3JlQ291bnQgPj0gMSk7CisgICAgQUxPR0QoIk51bWJlciBvZiBDUFUgY29yZXM6ICVsZCIsIGNwdUNvcmVDb3VudCk7CisgICAgcmV0dXJuIChzaXplX3QpY3B1Q29yZUNvdW50OworfQorCitzdGF0aWMgc3RhdHVzX3QgQ29udmVydE9teEF2Y0xldmVsVG9BdmNTcGVjTGV2ZWwoCisgICAgICAgIE9NWF9WSURFT19BVkNMRVZFTFRZUEUgb214TGV2ZWwsIFdPUkQzMiAqYXZjTGV2ZWwpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE5FTEVNKENvbnZlcnNpb25UYWJsZSk7ICsraSkgeworICAgICAgICBpZiAob214TGV2ZWwgPT0gQ29udmVyc2lvblRhYmxlW2ldLm9teExldmVsKSB7CisgICAgICAgICAgICAqYXZjTGV2ZWwgPSBDb252ZXJzaW9uVGFibGVbaV0uYXZjTGV2ZWw7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HRSgiQ29udmVydE9teEF2Y0xldmVsVG9BdmNTcGVjTGV2ZWw6ICVkIGxldmVsIG5vdCBzdXBwb3J0ZWQiLAorICAgICAgICAgICAgKGludDMyX3Qpb214TGV2ZWwpOworCisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworc3RhdGljIHN0YXR1c190IENvbnZlcnRBdmNTcGVjTGV2ZWxUb09teEF2Y0xldmVsKAorICAgICAgICBXT1JEMzIgYXZjTGV2ZWwsIE9NWF9WSURFT19BVkNMRVZFTFRZUEUgKm9teExldmVsKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBORUxFTShDb252ZXJzaW9uVGFibGUpOyArK2kpIHsKKyAgICAgICAgaWYgKGF2Y0xldmVsID09IENvbnZlcnNpb25UYWJsZVtpXS5hdmNMZXZlbCkgeworICAgICAgICAgICAgKm9teExldmVsID0gQ29udmVyc2lvblRhYmxlW2ldLm9teExldmVsOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR0UoIkNvbnZlcnRBdmNTcGVjTGV2ZWxUb09teEF2Y0xldmVsOiAlZCBsZXZlbCBub3Qgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgIChpbnQzMl90KWF2Y0xldmVsKTsKKworICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKKworU29mdEFWQzo6U29mdEFWQygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICBPTVhfUFRSIGFwcERhdGEsCisgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KQorICAgIDogU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudCgKKyAgICAgICAgICAgIG5hbWUsICJ2aWRlb19lbmNvZGVyLmF2YyIsIE9NWF9WSURFT19Db2RpbmdBVkMsCisgICAgICAgICAgICBrUHJvZmlsZUxldmVscywgTkVMRU0oa1Byb2ZpbGVMZXZlbHMpLAorICAgICAgICAgICAgMTc2IC8qIHdpZHRoICovLCAxNDQgLyogaGVpZ2h0ICovLAorICAgICAgICAgICAgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpLAorICAgICAgbUl2VmlkZW9Db2xvckZvcm1hdChJVl9ZVVZfNDIwUCksCisgICAgICBtSURSRnJhbWVSZWZyZXNoSW50ZXJ2YWxJblNlYygxKSwKKyAgICAgIG1BVkNFbmNQcm9maWxlKElWX1BST0ZJTEVfQkFTRSksCisgICAgICBtQVZDRW5jTGV2ZWwoMzEpLAorICAgICAgbVByZXZUaW1lc3RhbXBVcygtMSksCisgICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgICBtU2F3SW5wdXRFT1MoZmFsc2UpLAorICAgICAgbVNpZ25hbGxlZEVycm9yKGZhbHNlKSwKKyAgICAgIG1Db252ZXJzaW9uQnVmZmVyKE5VTEwpLAorICAgICAgbUNvZGVjQ3R4KE5VTEwpIHsKKworICAgIGluaXRQb3J0cyhrTnVtQnVmZmVycywga051bUJ1ZmZlcnMsICgobVdpZHRoICogbUhlaWdodCAqIDMpID4+IDEpLAorICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAyKTsKKworICAgIC8vIElmIGR1bXAgaXMgZW5hYmxlZCwgdGhlbiBvcGVuIGNyZWF0ZSBhbiBlbXB0eSBmaWxlCisgICAgR0VORVJBVEVfRklMRV9OQU1FUygpOworICAgIENSRUFURV9EVU1QX0ZJTEUobUluRmlsZSk7CisgICAgQ1JFQVRFX0RVTVBfRklMRShtT3V0RmlsZSk7CisKK30KKworU29mdEFWQzo6flNvZnRBVkMoKSB7CisgICAgcmVsZWFzZUVuY29kZXIoKTsKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDEpOworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmaW5RdWV1ZSA9IGdldFBvcnRRdWV1ZSgwKTsKKyAgICBDSEVDSyhvdXRRdWV1ZS5lbXB0eSgpKTsKKyAgICBDSEVDSyhpblF1ZXVlLmVtcHR5KCkpOworfQorCitPTVhfRVJST1JUWVBFIFNvZnRBVkM6OmluaXRFbmNQYXJhbXMoKSB7CisgICAgbUNvZGVjQ3R4ID0gTlVMTDsKKyAgICBtTWVtUmVjb3JkcyA9IE5VTEw7CisgICAgbU51bU1lbVJlY29yZHMgPSBERUZBVUxUX01FTV9SRUNfQ05UOworICAgIG1IZWFkZXJHZW5lcmF0ZWQgPSAwOworICAgIG1OdW1Db3JlcyA9IEdldENQVUNvcmVDb3VudCgpOworICAgIG1BcmNoID0gREVGQVVMVF9BUkNIOworICAgIG1TbGljZU1vZGUgPSBERUZBVUxUX1NMSUNFX01PREU7CisgICAgbVNsaWNlUGFyYW0gPSBERUZBVUxUX1NMSUNFX1BBUkFNOworICAgIG1IYWxmUGVsRW5hYmxlID0gREVGQVVMVF9IUEVMOworICAgIG1JSW50ZXJ2YWwgPSBERUZBVUxUX0lfSU5URVJWQUw7CisgICAgbUlEUkludGVydmFsID0gREVGQVVMVF9JRFJfSU5URVJWQUw7CisgICAgbURpc2FibGVEZWJsa0xldmVsID0gREVGQVVMVF9ESVNBQkxFX0RFQkxLX0xFVkVMOworICAgIG1GcmFtZVJhdGUgPSBERUZBVUxUX1NSQ19GUkFNRV9SQVRFOworICAgIG1FbmFibGVGYXN0U2FkID0gREVGQVVMVF9FTkFCTEVfRkFTVF9TQUQ7CisgICAgbUVuYWJsZUFsdFJlZiA9IERFRkFVTFRfRU5BQkxFX0FMVF9SRUY7CisgICAgbUVuY1NwZWVkID0gREVGQVVMVF9FTkNfU1BFRUQ7CisgICAgbUludHJhNHg0ID0gREVGQVVMVF9JTlRSQTR4NDsKKyAgICBtQUlSTW9kZSA9IERFRkFVTFRfQUlSOworICAgIG1BSVJSZWZyZXNoUGVyaW9kID0gREVGQVVMVF9BSVJfUkVGUkVTSF9QRVJJT0Q7CisgICAgbVBTTlJFbmFibGUgPSBERUZBVUxUX1BTTlJfRU5BQkxFOworICAgIG1SZWNvbkVuYWJsZSA9IERFRkFVTFRfUkVDT05fRU5BQkxFOworCisgICAgZ2V0dGltZW9mZGF5KCZtVGltZVN0YXJ0LCBOVUxMKTsKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lRW5kLCBOVUxMKTsKKworICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworfQorCisKK09NWF9FUlJPUlRZUEUgU29mdEFWQzo6c2V0RGltZW5zaW9ucygpIHsKKyAgICBpdmVfY3RsX3NldF9kaW1lbnNpb25zX2lwX3Qgc19kaW1lbnNpb25zX2lwOworICAgIGl2ZV9jdGxfc2V0X2RpbWVuc2lvbnNfb3BfdCBzX2RpbWVuc2lvbnNfb3A7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc19kaW1lbnNpb25zX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19kaW1lbnNpb25zX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9ESU1FTlNJT05TOworICAgIHNfZGltZW5zaW9uc19pcC51NF9odCA9IG1IZWlnaHQ7CisgICAgc19kaW1lbnNpb25zX2lwLnU0X3dkID0gbVdpZHRoOworICAgIHNfZGltZW5zaW9uc19pcC51NF9zdHJkID0gbVN0cmlkZTsKKworICAgIHNfZGltZW5zaW9uc19pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfZGltZW5zaW9uc19pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX2RpbWVuc2lvbnNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9kaW1lbnNpb25zX2lwX3QpOworICAgIHNfZGltZW5zaW9uc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2RpbWVuc2lvbnNfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZGltZW5zaW9uc19pcCwgJnNfZGltZW5zaW9uc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IGZyYW1lIGRpbWVuc2lvbnMgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgIHNfZGltZW5zaW9uc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICB9CisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdEFWQzo6c2V0TnVtQ29yZXMoKSB7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworICAgIGl2ZV9jdGxfc2V0X251bV9jb3Jlc19pcF90IHNfbnVtX2NvcmVzX2lwOworICAgIGl2ZV9jdGxfc2V0X251bV9jb3Jlc19vcF90IHNfbnVtX2NvcmVzX29wOworICAgIHNfbnVtX2NvcmVzX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19udW1fY29yZXNfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX05VTV9DT1JFUzsKKyAgICBzX251bV9jb3Jlc19pcC51NF9udW1fY29yZXMgPSBNSU4obU51bUNvcmVzLCBDT0RFQ19NQVhfQ09SRVMpOworICAgIHNfbnVtX2NvcmVzX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19udW1fY29yZXNfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworICAgIHNfbnVtX2NvcmVzX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QpOworCisgICAgc19udW1fY29yZXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9udW1fY29yZXNfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKAorICAgICAgICAgICAgbUNvZGVjQ3R4LCAodm9pZCAqKSAmc19udW1fY29yZXNfaXAsICh2b2lkICopICZzX251bV9jb3Jlc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IHByb2Nlc3NvciBwYXJhbXMgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgIHNfbnVtX2NvcmVzX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgIH0KKyAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0QVZDOjpzZXRGcmFtZVJhdGUoKSB7CisgICAgaXZlX2N0bF9zZXRfZnJhbWVfcmF0ZV9pcF90IHNfZnJhbWVfcmF0ZV9pcDsKKyAgICBpdmVfY3RsX3NldF9mcmFtZV9yYXRlX29wX3Qgc19mcmFtZV9yYXRlX29wOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKworICAgIHNfZnJhbWVfcmF0ZV9pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfZnJhbWVfcmF0ZV9pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfRlJBTUVSQVRFOworCisgICAgc19mcmFtZV9yYXRlX2lwLnU0X3NyY19mcmFtZV9yYXRlID0gbUZyYW1lUmF0ZTsKKyAgICBzX2ZyYW1lX3JhdGVfaXAudTRfdGd0X2ZyYW1lX3JhdGUgPSBtRnJhbWVSYXRlOworCisgICAgc19mcmFtZV9yYXRlX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19mcmFtZV9yYXRlX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfZnJhbWVfcmF0ZV9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2ZyYW1lX3JhdGVfaXBfdCk7CisgICAgc19mcmFtZV9yYXRlX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZnJhbWVfcmF0ZV9vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19mcmFtZV9yYXRlX2lwLCAmc19mcmFtZV9yYXRlX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgZnJhbWUgcmF0ZSA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19mcmFtZV9yYXRlX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgIH0KKyAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0QVZDOjpzZXRJcGVQYXJhbXMoKSB7CisgICAgaXZlX2N0bF9zZXRfaXBlX3BhcmFtc19pcF90IHNfaXBlX3BhcmFtc19pcDsKKyAgICBpdmVfY3RsX3NldF9pcGVfcGFyYW1zX29wX3Qgc19pcGVfcGFyYW1zX29wOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKworICAgIHNfaXBlX3BhcmFtc19pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfaXBlX3BhcmFtc19pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfSVBFX1BBUkFNUzsKKworICAgIHNfaXBlX3BhcmFtc19pcC51NF9lbmFibGVfaW50cmFfNHg0ID0gbUludHJhNHg0OworICAgIHNfaXBlX3BhcmFtc19pcC51NF9lbmNfc3BlZWRfcHJlc2V0ID0gbUVuY1NwZWVkOworCisgICAgc19pcGVfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19pcGVfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfaXBlX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2lwZV9wYXJhbXNfaXBfdCk7CisgICAgc19pcGVfcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfaXBlX3BhcmFtc19vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19pcGVfcGFyYW1zX2lwLCAmc19pcGVfcGFyYW1zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgaXBlIHBhcmFtcyA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19pcGVfcGFyYW1zX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgIH0KKyAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0QVZDOjpzZXRCaXRSYXRlKCkgeworICAgIGl2ZV9jdGxfc2V0X2JpdHJhdGVfaXBfdCBzX2JpdHJhdGVfaXA7CisgICAgaXZlX2N0bF9zZXRfYml0cmF0ZV9vcF90IHNfYml0cmF0ZV9vcDsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisKKyAgICBzX2JpdHJhdGVfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2JpdHJhdGVfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0JJVFJBVEU7CisKKyAgICBzX2JpdHJhdGVfaXAudTRfdGFyZ2V0X2JpdHJhdGUgPSBtQml0cmF0ZTsKKworICAgIHNfYml0cmF0ZV9pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfYml0cmF0ZV9pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX2JpdHJhdGVfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9iaXRyYXRlX2lwX3QpOworICAgIHNfYml0cmF0ZV9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2JpdHJhdGVfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfYml0cmF0ZV9pcCwgJnNfYml0cmF0ZV9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IGJpdCByYXRlID0gMHgleFxuIiwgc19iaXRyYXRlX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgIH0KKyAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0QVZDOjpzZXRGcmFtZVR5cGUoSVZfUElDVFVSRV9DT0RJTkdfVFlQRV9UIGVfZnJhbWVfdHlwZSkgeworICAgIGl2ZV9jdGxfc2V0X2ZyYW1lX3R5cGVfaXBfdCBzX2ZyYW1lX3R5cGVfaXA7CisgICAgaXZlX2N0bF9zZXRfZnJhbWVfdHlwZV9vcF90IHNfZnJhbWVfdHlwZV9vcDsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisKKyAgICBzX2ZyYW1lX3R5cGVfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2ZyYW1lX3R5cGVfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0ZSQU1FVFlQRTsKKworICAgIHNfZnJhbWVfdHlwZV9pcC5lX2ZyYW1lX3R5cGUgPSBlX2ZyYW1lX3R5cGU7CisKKyAgICBzX2ZyYW1lX3R5cGVfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2ZyYW1lX3R5cGVfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19mcmFtZV90eXBlX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZnJhbWVfdHlwZV9pcF90KTsKKyAgICBzX2ZyYW1lX3R5cGVfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9mcmFtZV90eXBlX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2ZyYW1lX3R5cGVfaXAsICZzX2ZyYW1lX3R5cGVfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBmcmFtZSB0eXBlID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX2ZyYW1lX3R5cGVfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgfQorICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworfQorCitPTVhfRVJST1JUWVBFIFNvZnRBVkM6OnNldFFwKCkgeworICAgIGl2ZV9jdGxfc2V0X3FwX2lwX3Qgc19xcF9pcDsKKyAgICBpdmVfY3RsX3NldF9xcF9vcF90IHNfcXBfb3A7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc19xcF9pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfcXBfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX1FQOworCisgICAgc19xcF9pcC51NF9pX3FwID0gREVGQVVMVF9JX1FQOworICAgIHNfcXBfaXAudTRfaV9xcF9tYXggPSBERUZBVUxUX1FQX01BWDsKKyAgICBzX3FwX2lwLnU0X2lfcXBfbWluID0gREVGQVVMVF9RUF9NSU47CisKKyAgICBzX3FwX2lwLnU0X3BfcXAgPSBERUZBVUxUX1BfUVA7CisgICAgc19xcF9pcC51NF9wX3FwX21heCA9IERFRkFVTFRfUVBfTUFYOworICAgIHNfcXBfaXAudTRfcF9xcF9taW4gPSBERUZBVUxUX1FQX01JTjsKKworICAgIHNfcXBfaXAudTRfYl9xcCA9IERFRkFVTFRfUF9RUDsKKyAgICBzX3FwX2lwLnU0X2JfcXBfbWF4ID0gREVGQVVMVF9RUF9NQVg7CisgICAgc19xcF9pcC51NF9iX3FwX21pbiA9IERFRkFVTFRfUVBfTUlOOworCisgICAgc19xcF9pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfcXBfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19xcF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X3FwX2lwX3QpOworICAgIHNfcXBfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9xcF9vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19xcF9pcCwgJnNfcXBfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBxcCAweCV4XG4iLCBzX3FwX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgIH0KKyAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0QVZDOjpzZXRFbmNNb2RlKElWRV9FTkNfTU9ERV9UIGVfZW5jX21vZGUpIHsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisgICAgaXZlX2N0bF9zZXRfZW5jX21vZGVfaXBfdCBzX2VuY19tb2RlX2lwOworICAgIGl2ZV9jdGxfc2V0X2VuY19tb2RlX29wX3Qgc19lbmNfbW9kZV9vcDsKKworICAgIHNfZW5jX21vZGVfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2VuY19tb2RlX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9FTkNfTU9ERTsKKworICAgIHNfZW5jX21vZGVfaXAuZV9lbmNfbW9kZSA9IGVfZW5jX21vZGU7CisKKyAgICBzX2VuY19tb2RlX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19lbmNfbW9kZV9pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX2VuY19tb2RlX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZW5jX21vZGVfaXBfdCk7CisgICAgc19lbmNfbW9kZV9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2VuY19tb2RlX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2VuY19tb2RlX2lwLCAmc19lbmNfbW9kZV9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IGluIGhlYWRlciBlbmNvZGUgbW9kZSA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19lbmNfbW9kZV9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICB9CisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdEFWQzo6c2V0VmJ2UGFyYW1zKCkgeworICAgIGl2ZV9jdGxfc2V0X3Zidl9wYXJhbXNfaXBfdCBzX3Zidl9pcDsKKyAgICBpdmVfY3RsX3NldF92YnZfcGFyYW1zX29wX3Qgc192YnZfb3A7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc192YnZfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3Zidl9pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfVkJWX1BBUkFNUzsKKworICAgIHNfdmJ2X2lwLnU0X3Zidl9idWZfc2l6ZSA9IDA7CisgICAgc192YnZfaXAudTRfdmJ2X2J1ZmZlcl9kZWxheSA9IDEwMDA7CisKKyAgICBzX3Zidl9pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfdmJ2X2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfdmJ2X2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfdmJ2X3BhcmFtc19pcF90KTsKKyAgICBzX3Zidl9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X3Zidl9wYXJhbXNfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfdmJ2X2lwLCAmc192YnZfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBWQkMgcGFyYW1zID0gMHgleFxuIiwgc192YnZfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgfQorICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworfQorCitPTVhfRVJST1JUWVBFIFNvZnRBVkM6OnNldEFpclBhcmFtcygpIHsKKyAgICBpdmVfY3RsX3NldF9haXJfcGFyYW1zX2lwX3Qgc19haXJfaXA7CisgICAgaXZlX2N0bF9zZXRfYWlyX3BhcmFtc19vcF90IHNfYWlyX29wOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKworICAgIHNfYWlyX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19haXJfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0FJUl9QQVJBTVM7CisKKyAgICBzX2Fpcl9pcC5lX2Fpcl9tb2RlID0gbUFJUk1vZGU7CisgICAgc19haXJfaXAudTRfYWlyX3JlZnJlc2hfcGVyaW9kID0gbUFJUlJlZnJlc2hQZXJpb2Q7CisKKyAgICBzX2Fpcl9pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfYWlyX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfYWlyX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfYWlyX3BhcmFtc19pcF90KTsKKyAgICBzX2Fpcl9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2Fpcl9wYXJhbXNfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfYWlyX2lwLCAmc19haXJfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBhaXIgcGFyYW1zID0gMHgleFxuIiwgc19haXJfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgfQorICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworfQorCitPTVhfRVJST1JUWVBFIFNvZnRBVkM6OnNldE1lUGFyYW1zKCkgeworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBpdmVfY3RsX3NldF9tZV9wYXJhbXNfaXBfdCBzX21lX3BhcmFtc19pcDsKKyAgICBpdmVfY3RsX3NldF9tZV9wYXJhbXNfb3BfdCBzX21lX3BhcmFtc19vcDsKKworICAgIHNfbWVfcGFyYW1zX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19tZV9wYXJhbXNfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX01FX1BBUkFNUzsKKworICAgIHNfbWVfcGFyYW1zX2lwLnU0X2VuYWJsZV9mYXN0X3NhZCA9IG1FbmFibGVGYXN0U2FkOworICAgIHNfbWVfcGFyYW1zX2lwLnU0X2VuYWJsZV9hbHRfcmVmID0gbUVuYWJsZUFsdFJlZjsKKworICAgIHNfbWVfcGFyYW1zX2lwLnU0X2VuYWJsZV9ocGVsID0gbUhhbGZQZWxFbmFibGU7CisgICAgc19tZV9wYXJhbXNfaXAudTRfZW5hYmxlX3FwZWwgPSBERUZBVUxUX1FQRUw7CisgICAgc19tZV9wYXJhbXNfaXAudTRfbWVfc3BlZWRfcHJlc2V0ID0gREVGQVVMVF9NRV9TUEVFRDsKKyAgICBzX21lX3BhcmFtc19pcC51NF9zcmNoX3JuZ194ID0gREVGQVVMVF9TUkNIX1JOR19YOworICAgIHNfbWVfcGFyYW1zX2lwLnU0X3NyY2hfcm5nX3kgPSBERUZBVUxUX1NSQ0hfUk5HX1k7CisKKyAgICBzX21lX3BhcmFtc19pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfbWVfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfbWVfcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfbWVfcGFyYW1zX2lwX3QpOworICAgIHNfbWVfcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfbWVfcGFyYW1zX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX21lX3BhcmFtc19pcCwgJnNfbWVfcGFyYW1zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgbWUgcGFyYW1zID0gMHgleFxuIiwgc19tZV9wYXJhbXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgfQorICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworfQorCitPTVhfRVJST1JUWVBFIFNvZnRBVkM6OnNldEdvcFBhcmFtcygpIHsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisgICAgaXZlX2N0bF9zZXRfZ29wX3BhcmFtc19pcF90IHNfZ29wX3BhcmFtc19pcDsKKyAgICBpdmVfY3RsX3NldF9nb3BfcGFyYW1zX29wX3Qgc19nb3BfcGFyYW1zX29wOworCisgICAgc19nb3BfcGFyYW1zX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19nb3BfcGFyYW1zX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9HT1BfUEFSQU1TOworCisgICAgc19nb3BfcGFyYW1zX2lwLnU0X2lfZnJtX2ludGVydmFsID0gbUlJbnRlcnZhbDsKKyAgICBzX2dvcF9wYXJhbXNfaXAudTRfaWRyX2ZybV9pbnRlcnZhbCA9IG1JRFJJbnRlcnZhbDsKKyAgICBzX2dvcF9wYXJhbXNfaXAudTRfbnVtX2JfZnJhbWVzID0gREVGQVVMVF9CX0ZSQU1FUzsKKworICAgIHNfZ29wX3BhcmFtc19pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfZ29wX3BhcmFtc19pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX2dvcF9wYXJhbXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9nb3BfcGFyYW1zX2lwX3QpOworICAgIHNfZ29wX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2dvcF9wYXJhbXNfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZ29wX3BhcmFtc19pcCwgJnNfZ29wX3BhcmFtc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IE1FIHBhcmFtcyA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19nb3BfcGFyYW1zX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgIH0KKyAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0QVZDOjpzZXRQcm9maWxlUGFyYW1zKCkgeworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBpdmVfY3RsX3NldF9wcm9maWxlX3BhcmFtc19pcF90IHNfcHJvZmlsZV9wYXJhbXNfaXA7CisgICAgaXZlX2N0bF9zZXRfcHJvZmlsZV9wYXJhbXNfb3BfdCBzX3Byb2ZpbGVfcGFyYW1zX29wOworCisgICAgc19wcm9maWxlX3BhcmFtc19pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfcHJvZmlsZV9wYXJhbXNfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX1BST0ZJTEVfUEFSQU1TOworCisgICAgc19wcm9maWxlX3BhcmFtc19pcC5lX3Byb2ZpbGUgPSBERUZBVUxUX0VQUk9GSUxFOworCisgICAgc19wcm9maWxlX3BhcmFtc19pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfcHJvZmlsZV9wYXJhbXNfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19wcm9maWxlX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X3Byb2ZpbGVfcGFyYW1zX2lwX3QpOworICAgIHNfcHJvZmlsZV9wYXJhbXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9wcm9maWxlX3BhcmFtc19vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19wcm9maWxlX3BhcmFtc19pcCwgJnNfcHJvZmlsZV9wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBwcm9maWxlIHBhcmFtcyA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19wcm9maWxlX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICB9CisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdEFWQzo6c2V0RGVibG9ja1BhcmFtcygpIHsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisgICAgaXZlX2N0bF9zZXRfZGVibG9ja19wYXJhbXNfaXBfdCBzX2RlYmxvY2tfcGFyYW1zX2lwOworICAgIGl2ZV9jdGxfc2V0X2RlYmxvY2tfcGFyYW1zX29wX3Qgc19kZWJsb2NrX3BhcmFtc19vcDsKKworICAgIHNfZGVibG9ja19wYXJhbXNfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2RlYmxvY2tfcGFyYW1zX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9ERUJMT0NLX1BBUkFNUzsKKworICAgIHNfZGVibG9ja19wYXJhbXNfaXAudTRfZGlzYWJsZV9kZWJsb2NrX2xldmVsID0gbURpc2FibGVEZWJsa0xldmVsOworCisgICAgc19kZWJsb2NrX3BhcmFtc19pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfZGVibG9ja19wYXJhbXNfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19kZWJsb2NrX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2RlYmxvY2tfcGFyYW1zX2lwX3QpOworICAgIHNfZGVibG9ja19wYXJhbXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9kZWJsb2NrX3BhcmFtc19vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19kZWJsb2NrX3BhcmFtc19pcCwgJnNfZGVibG9ja19wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGVuYWJsZS9kaXNhYmxlIGRlYmxvY2sgcGFyYW1zID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX2RlYmxvY2tfcGFyYW1zX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgIH0KKyAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKK30KKwordm9pZCBTb2Z0QVZDOjpsb2dWZXJzaW9uKCkgeworICAgIGl2ZV9jdGxfZ2V0dmVyc2lvbmluZm9faXBfdCBzX2N0bF9pcDsKKyAgICBpdmVfY3RsX2dldHZlcnNpb25pbmZvX29wX3Qgc19jdGxfb3A7CisgICAgVVdPUkQ4IGF1MV9idWZbNTEyXTsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisKKyAgICBzX2N0bF9pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfY3RsX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX0dFVFZFUlNJT047CisgICAgc19jdGxfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX2dldHZlcnNpb25pbmZvX2lwX3QpOworICAgIHNfY3RsX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9nZXR2ZXJzaW9uaW5mb19vcF90KTsKKyAgICBzX2N0bF9pcC5wdTFfdmVyc2lvbiA9IGF1MV9idWY7CisgICAgc19jdGxfaXAudTRfdmVyc2lvbl9idWZzaXplID0gc2l6ZW9mKGF1MV9idWYpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICh2b2lkICopICZzX2N0bF9pcCwgKHZvaWQgKikgJnNfY3RsX29wKTsKKworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiRXJyb3IgaW4gZ2V0dGluZyB2ZXJzaW9uOiAweCV4Iiwgc19jdGxfb3AudTRfZXJyb3JfY29kZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIkl0dGlhbSBlbmNvZGVyIHZlcnNpb246ICVzIiwgKGNoYXIgKilzX2N0bF9pcC5wdTFfdmVyc2lvbik7CisgICAgfQorICAgIHJldHVybjsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0QVZDOjppbml0RW5jb2RlcigpIHsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisgICAgc2l6ZV90IGk7CisgICAgV09SRDMyIGxldmVsOworICAgIHVpbnQzMl90IGRpc3BsYXlTaXplWTsKKyAgICBDSEVDSyghbVN0YXJ0ZWQpOworCisgICAgT01YX0VSUk9SVFlQRSBlcnJUeXBlID0gT01YX0Vycm9yTm9uZTsKKworICAgIGRpc3BsYXlTaXplWSA9IG1XaWR0aCAqIG1IZWlnaHQ7CisgICAgaWYgKGRpc3BsYXlTaXplWSA+ICgxOTIwICogMTA4OCkpIHsKKyAgICAgICAgbGV2ZWwgPSA1MDsKKyAgICB9IGVsc2UgaWYgKGRpc3BsYXlTaXplWSA+ICgxMjgwICogNzIwKSkgeworICAgICAgICBsZXZlbCA9IDQwOworICAgIH0gZWxzZSBpZiAoZGlzcGxheVNpemVZID4gKDcyMCAqIDU3NikpIHsKKyAgICAgICAgbGV2ZWwgPSAzMTsKKyAgICB9IGVsc2UgaWYgKGRpc3BsYXlTaXplWSA+ICg2MjQgKiAzMjApKSB7CisgICAgICAgIGxldmVsID0gMzA7CisgICAgfSBlbHNlIGlmIChkaXNwbGF5U2l6ZVkgPiAoMzUyICogMjg4KSkgeworICAgICAgICBsZXZlbCA9IDIxOworICAgIH0gZWxzZSB7CisgICAgICAgIGxldmVsID0gMjA7CisgICAgfQorICAgIG1BVkNFbmNMZXZlbCA9IE1BWChsZXZlbCwgbUFWQ0VuY0xldmVsKTsKKworICAgIGlmIChPTVhfRXJyb3JOb25lICE9IChlcnJUeXBlID0gaW5pdEVuY1BhcmFtcygpKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgZW5jb2RlciBwYXJhbXMiKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIDApOworICAgICAgICByZXR1cm4gZXJyVHlwZTsKKyAgICB9CisKKyAgICBtU3RyaWRlID0gQUxJR04xNihtV2lkdGgpOworCisgICAgaWYgKG1JbnB1dERhdGFJc01ldGEpIHsKKyAgICAgICAgaWYgKG1Db252ZXJzaW9uQnVmZmVyKSB7CisgICAgICAgICAgICBmcmVlKG1Db252ZXJzaW9uQnVmZmVyKTsKKyAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtQ29udmVyc2lvbkJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlciA9ICh1aW50OF90ICopbWFsbG9jKG1TdHJpZGUgKiBtSGVpZ2h0ICogMyAvIDIpOworICAgICAgICAgICAgaWYgKG1Db252ZXJzaW9uQnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQWxsb2NhdGluZyBjb252ZXJzaW9uIGJ1ZmZlciBmYWlsZWQuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHN3aXRjaCAobUNvbG9yRm9ybWF0KSB7CisgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CisgICAgICAgICAgICBtSXZWaWRlb0NvbG9yRm9ybWF0ID0gSVZfWVVWXzQyMFNQX1VWOworICAgICAgICAgICAgQUxPR1YoImNvbG9yRm9ybWF0IFlVVl80MjBTUCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKKyAgICAgICAgICAgIG1JdlZpZGVvQ29sb3JGb3JtYXQgPSBJVl9ZVVZfNDIwUDsKKyAgICAgICAgICAgIEFMT0dWKCJjb2xvckZvcm1hdCBZVVZfNDIwUCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgQUxPR1YoIlBhcmFtcyB3aWR0aCAlZCBoZWlnaHQgJWQgbGV2ZWwgJWQgY29sb3JGb3JtYXQgJWQiLCBtV2lkdGgsCisgICAgICAgICAgICBtSGVpZ2h0LCBtQVZDRW5jTGV2ZWwsIG1JdlZpZGVvQ29sb3JGb3JtYXQpOworCisgICAgLyogR2V0dGluZyBOdW1iZXIgb2YgTWVtUmVjb3JkcyAqLworICAgIHsKKyAgICAgICAgaXZfbnVtX21lbV9yZWNfaXBfdCBzX251bV9tZW1fcmVjX2lwOworICAgICAgICBpdl9udW1fbWVtX3JlY19vcF90IHNfbnVtX21lbV9yZWNfb3A7CisKKyAgICAgICAgc19udW1fbWVtX3JlY19pcC51NF9zaXplID0gc2l6ZW9mKGl2X251bV9tZW1fcmVjX2lwX3QpOworICAgICAgICBzX251bV9tZW1fcmVjX29wLnU0X3NpemUgPSBzaXplb2YoaXZfbnVtX21lbV9yZWNfb3BfdCk7CisKKyAgICAgICAgc19udW1fbWVtX3JlY19pcC5lX2NtZCA9IElWX0NNRF9HRVRfTlVNX01FTV9SRUM7CisKKyAgICAgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbigwLCAmc19udW1fbWVtX3JlY19pcCwgJnNfbnVtX21lbV9yZWNfb3ApOworCisgICAgICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICAgICAgQUxPR0UoIkdldCBudW1iZXIgb2YgbWVtb3J5IHJlY29yZHMgZmFpbGVkID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgc19udW1fbWVtX3JlY19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgIH0KKworICAgICAgICBtTnVtTWVtUmVjb3JkcyA9IHNfbnVtX21lbV9yZWNfb3AudTRfbnVtX21lbV9yZWM7CisgICAgfQorCisgICAgLyogQWxsb2NhdGUgYXJyYXkgdG8gaG9sZCBtZW1vcnkgcmVjb3JkcyAqLworICAgIG1NZW1SZWNvcmRzID0gKGl2X21lbV9yZWNfdCAqKW1hbGxvYyhtTnVtTWVtUmVjb3JkcyAqIHNpemVvZihpdl9tZW1fcmVjX3QpKTsKKyAgICBpZiAoTlVMTCA9PSBtTWVtUmVjb3JkcykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgaG9sZCBtZW1vcnkgcmVjb3JkczogU2l6ZSAlZCIsCisgICAgICAgICAgICAgICAgbU51bU1lbVJlY29yZHMgKiBzaXplb2YoaXZfbWVtX3JlY190KSk7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCAwKTsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIGl2X21lbV9yZWNfdCAqcHNfbWVtX3JlYzsKKyAgICAgICAgcHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbU51bU1lbVJlY29yZHM7IGkrKykgeworICAgICAgICAgICAgcHNfbWVtX3JlYy0+dTRfc2l6ZSA9IHNpemVvZihpdl9tZW1fcmVjX3QpOworICAgICAgICAgICAgcHNfbWVtX3JlYy0+cHZfYmFzZSA9IE5VTEw7CisgICAgICAgICAgICBwc19tZW1fcmVjLT51NF9tZW1fc2l6ZSA9IDA7CisgICAgICAgICAgICBwc19tZW1fcmVjLT51NF9tZW1fYWxpZ25tZW50ID0gMDsKKyAgICAgICAgICAgIHBzX21lbV9yZWMtPmVfbWVtX3R5cGUgPSBJVl9OQV9NRU1fVFlQRTsKKworICAgICAgICAgICAgcHNfbWVtX3JlYysrOworICAgICAgICB9CisgICAgfQorCisgICAgLyogR2V0dGluZyBNZW1SZWNvcmRzIEF0dHJpYnV0ZXMgKi8KKyAgICB7CisgICAgICAgIGl2X2ZpbGxfbWVtX3JlY19pcF90IHNfZmlsbF9tZW1fcmVjX2lwOworICAgICAgICBpdl9maWxsX21lbV9yZWNfb3BfdCBzX2ZpbGxfbWVtX3JlY19vcDsKKworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9zaXplID0gc2l6ZW9mKGl2X2ZpbGxfbWVtX3JlY19pcF90KTsKKyAgICAgICAgc19maWxsX21lbV9yZWNfb3AudTRfc2l6ZSA9IHNpemVvZihpdl9maWxsX21lbV9yZWNfb3BfdCk7CisKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAuZV9jbWQgPSBJVl9DTURfRklMTF9OVU1fTUVNX1JFQzsKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAucHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9udW1fbWVtX3JlYyA9IG1OdW1NZW1SZWNvcmRzOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9tYXhfd2QgPSBtV2lkdGg7CisgICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnU0X21heF9odCA9IG1IZWlnaHQ7CisgICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnU0X21heF9sZXZlbCA9IG1BVkNFbmNMZXZlbDsKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAuZV9jb2xvcl9mb3JtYXQgPSBERUZBVUxUX0lOUF9DT0xPUl9GT1JNQVQ7CisgICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnU0X21heF9yZWZfY250ID0gREVGQVVMVF9NQVhfUkVGX0ZSTTsKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAudTRfbWF4X3Jlb3JkZXJfY250ID0gREVGQVVMVF9NQVhfUkVPUkRFUl9GUk07CisgICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnU0X21heF9zcmNoX3JuZ194ID0gREVGQVVMVF9NQVhfU1JDSF9SQU5HRV9YOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9tYXhfc3JjaF9ybmdfeSA9IERFRkFVTFRfTUFYX1NSQ0hfUkFOR0VfWTsKKworICAgICAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKDAsICZzX2ZpbGxfbWVtX3JlY19pcCwgJnNfZmlsbF9tZW1fcmVjX29wKTsKKworICAgICAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGaWxsIG1lbW9yeSByZWNvcmRzIGZhaWxlZCA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgIHNfZmlsbF9tZW1fcmVjX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCAwKTsKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBBbGxvY2F0aW5nIE1lbW9yeSBmb3IgTWVtIFJlY29yZHMgKi8KKyAgICB7CisgICAgICAgIFdPUkQzMiB0b3RhbF9zaXplOworICAgICAgICBpdl9tZW1fcmVjX3QgKnBzX21lbV9yZWM7CisgICAgICAgIHRvdGFsX3NpemUgPSAwOworCisgICAgICAgIHBzX21lbV9yZWMgPSBtTWVtUmVjb3JkczsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG1OdW1NZW1SZWNvcmRzOyBpKyspIHsKKyAgICAgICAgICAgIHBzX21lbV9yZWMtPnB2X2Jhc2UgPSBpdmVfYWxpZ25lZF9tYWxsb2MoCisgICAgICAgICAgICAgICAgICAgIHBzX21lbV9yZWMtPnU0X21lbV9hbGlnbm1lbnQsIHBzX21lbV9yZWMtPnU0X21lbV9zaXplKTsKKyAgICAgICAgICAgIGlmIChwc19tZW1fcmVjLT5wdl9iYXNlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQWxsb2NhdGlvbiBmYWlsdXJlIGZvciBtZW0gcmVjb3JkIGlkICVkIHNpemUgJWRcbiIsIGksCisgICAgICAgICAgICAgICAgICAgICAgICBwc19tZW1fcmVjLT51NF9tZW1fc2l6ZSk7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG90YWxfc2l6ZSArPSBwc19tZW1fcmVjLT51NF9tZW1fc2l6ZTsKKworICAgICAgICAgICAgcHNfbWVtX3JlYysrOworICAgICAgICB9CisgICAgICAgIHByaW50ZigiXG5Ub3RhbCBtZW1vcnkgZm9yIGNvZGVjICVkXG4iLCB0b3RhbF9zaXplKTsKKyAgICB9CisKKyAgICAvKiBDb2RlYyBJbnN0YW5jZSBDcmVhdGlvbiAqLworICAgIHsKKyAgICAgICAgaXZlX2luaXRfaXBfdCBzX2luaXRfaXA7CisgICAgICAgIGl2ZV9pbml0X29wX3Qgc19pbml0X29wOworCisgICAgICAgIG1Db2RlY0N0eCA9IChpdl9vYmpfdCAqKW1NZW1SZWNvcmRzWzBdLnB2X2Jhc2U7CisgICAgICAgIG1Db2RlY0N0eC0+dTRfc2l6ZSA9IHNpemVvZihpdl9vYmpfdCk7CisgICAgICAgIG1Db2RlY0N0eC0+cHZfZnhucyA9ICh2b2lkICopaXZlX2FwaV9mdW5jdGlvbjsKKworICAgICAgICBzX2luaXRfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfaW5pdF9pcF90KTsKKyAgICAgICAgc19pbml0X29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2luaXRfb3BfdCk7CisKKyAgICAgICAgc19pbml0X2lwLmVfY21kID0gSVZfQ01EX0lOSVQ7CisgICAgICAgIHNfaW5pdF9pcC51NF9udW1fbWVtX3JlYyA9IG1OdW1NZW1SZWNvcmRzOworICAgICAgICBzX2luaXRfaXAucHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOworICAgICAgICBzX2luaXRfaXAudTRfbWF4X3dkID0gbVdpZHRoOworICAgICAgICBzX2luaXRfaXAudTRfbWF4X2h0ID0gbUhlaWdodDsKKyAgICAgICAgc19pbml0X2lwLnU0X21heF9yZWZfY250ID0gREVGQVVMVF9NQVhfUkVGX0ZSTTsKKyAgICAgICAgc19pbml0X2lwLnU0X21heF9yZW9yZGVyX2NudCA9IERFRkFVTFRfTUFYX1JFT1JERVJfRlJNOworICAgICAgICBzX2luaXRfaXAudTRfbWF4X2xldmVsID0gbUFWQ0VuY0xldmVsOworICAgICAgICBzX2luaXRfaXAuZV9pbnBfY29sb3JfZm10ID0gbUl2VmlkZW9Db2xvckZvcm1hdDsKKworICAgICAgICBpZiAobVJlY29uRW5hYmxlIHx8IG1QU05SRW5hYmxlKSB7CisgICAgICAgICAgICBzX2luaXRfaXAudTRfZW5hYmxlX3JlY29uID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNfaW5pdF9pcC51NF9lbmFibGVfcmVjb24gPSAwOworICAgICAgICB9CisgICAgICAgIHNfaW5pdF9pcC5lX3JlY29uX2NvbG9yX2ZtdCA9IERFRkFVTFRfUkVDT05fQ09MT1JfRk9STUFUOworICAgICAgICBzX2luaXRfaXAuZV9yY19tb2RlID0gREVGQVVMVF9SQ19NT0RFOworICAgICAgICBzX2luaXRfaXAudTRfbWF4X2ZyYW1lcmF0ZSA9IERFRkFVTFRfTUFYX0ZSQU1FUkFURTsKKyAgICAgICAgc19pbml0X2lwLnU0X21heF9iaXRyYXRlID0gREVGQVVMVF9NQVhfQklUUkFURTsKKyAgICAgICAgc19pbml0X2lwLnU0X21heF9udW1fYmZyYW1lcyA9IERFRkFVTFRfQl9GUkFNRVM7CisgICAgICAgIHNfaW5pdF9pcC5lX2NvbnRlbnRfdHlwZSA9IElWX1BST0dSRVNTSVZFOworICAgICAgICBzX2luaXRfaXAudTRfbWF4X3NyY2hfcm5nX3ggPSBERUZBVUxUX01BWF9TUkNIX1JBTkdFX1g7CisgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfc3JjaF9ybmdfeSA9IERFRkFVTFRfTUFYX1NSQ0hfUkFOR0VfWTsKKyAgICAgICAgc19pbml0X2lwLmVfc2xpY2VfbW9kZSA9IG1TbGljZU1vZGU7CisgICAgICAgIHNfaW5pdF9pcC51NF9zbGljZV9wYXJhbSA9IG1TbGljZVBhcmFtOworICAgICAgICBzX2luaXRfaXAuZV9hcmNoID0gbUFyY2g7CisgICAgICAgIHNfaW5pdF9pcC5lX3NvYyA9IERFRkFVTFRfU09DOworCisgICAgICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19pbml0X2lwLCAmc19pbml0X29wKTsKKworICAgICAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbml0IG1lbW9yeSByZWNvcmRzIGZhaWxlZCA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgIHNfaW5pdF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCAvKiBhcmcyICovLCBOVUxMIC8qIGRhdGEgKi8pOworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEdldCBDb2RlYyBWZXJzaW9uICovCisgICAgbG9nVmVyc2lvbigpOworCisgICAgLyogc2V0IHByb2Nlc3NvciBkZXRhaWxzICovCisgICAgc2V0TnVtQ29yZXMoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IEZyYW1lIGRpbWVuc2lvbnMgKi8KKyAgICBzZXREaW1lbnNpb25zKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBGcmFtZSByYXRlcyAqLworICAgIHNldEZyYW1lUmF0ZSgpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgSVBFIFBhcmFtcyAqLworICAgIHNldElwZVBhcmFtcygpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgQml0cmF0ZSAqLworICAgIHNldEJpdFJhdGUoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IFFQICovCisgICAgc2V0UXAoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IEFJUiBwYXJhbXMgKi8KKyAgICBzZXRBaXJQYXJhbXMoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IFZCViBwYXJhbXMgKi8KKyAgICBzZXRWYnZQYXJhbXMoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IE1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtcyAqLworICAgIHNldE1lUGFyYW1zKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBHT1AgcGFyYW1zICovCisgICAgc2V0R29wUGFyYW1zKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBEZWJsb2NrIHBhcmFtcyAqLworICAgIHNldERlYmxvY2tQYXJhbXMoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IFByb2ZpbGUgcGFyYW1zICovCisgICAgc2V0UHJvZmlsZVBhcmFtcygpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgaW4gRW5jb2RlIGhlYWRlciBtb2RlICovCisgICAgc2V0RW5jTW9kZShJVkVfRU5DX01PREVfSEVBREVSKTsKKworICAgIEFMT0dWKCJpbml0X2NvZGVjIHN1Y2Nlc3NmdWxsIik7CisKKyAgICBtU3BzUHBzSGVhZGVyUmVjZWl2ZWQgPSBmYWxzZTsKKyAgICBtU3RhcnRlZCA9IHRydWU7CisKKyAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0QVZDOjpyZWxlYXNlRW5jb2RlcigpIHsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXMgPSBJVl9TVUNDRVNTOworICAgIGl2X3JldHJpZXZlX21lbV9yZWNfaXBfdCBzX3JldHJpZXZlX21lbV9pcDsKKyAgICBpdl9yZXRyaWV2ZV9tZW1fcmVjX29wX3Qgc19yZXRyaWV2ZV9tZW1fb3A7CisgICAgaXZfbWVtX3JlY190ICpwc19tZW1fcmVjOworICAgIFVXT1JEMzIgaTsKKworICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgfQorCisgICAgc19yZXRyaWV2ZV9tZW1faXAudTRfc2l6ZSA9IHNpemVvZihpdl9yZXRyaWV2ZV9tZW1fcmVjX2lwX3QpOworICAgIHNfcmV0cmlldmVfbWVtX29wLnU0X3NpemUgPSBzaXplb2YoaXZfcmV0cmlldmVfbWVtX3JlY19vcF90KTsKKyAgICBzX3JldHJpZXZlX21lbV9pcC5lX2NtZCA9IElWX0NNRF9SRVRSSUVWRV9NRU1SRUM7CisgICAgc19yZXRyaWV2ZV9tZW1faXAucHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX3JldHJpZXZlX21lbV9pcCwgJnNfcmV0cmlldmVfbWVtX29wKTsKKworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHJldHJpZXZlIG1lbW9yeSByZWNvcmRzID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX3JldHJpZXZlX21lbV9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICB9CisKKyAgICAvKiBGcmVlIG1lbW9yeSByZWNvcmRzICovCisgICAgcHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOworICAgIGZvciAoaSA9IDA7IGkgPCBzX3JldHJpZXZlX21lbV9vcC51NF9udW1fbWVtX3JlY19maWxsZWQ7IGkrKykgeworICAgICAgICBpdmVfYWxpZ25lZF9mcmVlKHBzX21lbV9yZWMtPnB2X2Jhc2UpOworICAgICAgICBwc19tZW1fcmVjKys7CisgICAgfQorCisgICAgZnJlZShtTWVtUmVjb3Jkcyk7CisKKyAgICBpZiAobUNvbnZlcnNpb25CdWZmZXIgIT0gTlVMTCkgeworICAgICAgICBmcmVlKG1Db252ZXJzaW9uQnVmZmVyKTsKKyAgICAgICAgbUNvbnZlcnNpb25CdWZmZXIgPSBOVUxMOworICAgIH0KKworICAgIG1TdGFydGVkID0gZmFsc2U7CisKKyAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0QVZDOjppbnRlcm5hbEdldFBhcmFtZXRlcihPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcykgeworICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvQml0cmF0ZToKKyAgICAgICAgeworICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX0JJVFJBVEVUWVBFICpiaXRSYXRlID0KKyAgICAgICAgICAgICAgICAoT01YX1ZJREVPX1BBUkFNX0JJVFJBVEVUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoYml0UmF0ZS0+blBvcnRJbmRleCAhPSAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYml0UmF0ZS0+ZUNvbnRyb2xSYXRlID0gT01YX1ZpZGVvX0NvbnRyb2xSYXRlVmFyaWFibGU7CisgICAgICAgICAgICBiaXRSYXRlLT5uVGFyZ2V0Qml0cmF0ZSA9IG1CaXRyYXRlOworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9BdmM6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9WSURFT19QQVJBTV9BVkNUWVBFICphdmNQYXJhbXMgPSAoT01YX1ZJREVPX1BBUkFNX0FWQ1RZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmIChhdmNQYXJhbXMtPm5Qb3J0SW5kZXggIT0gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF2Y1BhcmFtcy0+ZVByb2ZpbGUgPSBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lOworICAgICAgICAgICAgT01YX1ZJREVPX0FWQ0xFVkVMVFlQRSBvbXhMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDMxOworICAgICAgICAgICAgaWYgKE9NWF9FcnJvck5vbmUKKyAgICAgICAgICAgICAgICAgICAgIT0gQ29udmVydEF2Y1NwZWNMZXZlbFRvT214QXZjTGV2ZWwobUFWQ0VuY0xldmVsLCAmb214TGV2ZWwpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXZjUGFyYW1zLT5lTGV2ZWwgPSBvbXhMZXZlbDsKKyAgICAgICAgICAgIGF2Y1BhcmFtcy0+blJlZkZyYW1lcyA9IDE7CisgICAgICAgICAgICBhdmNQYXJhbXMtPm5CRnJhbWVzID0gMDsKKyAgICAgICAgICAgIGF2Y1BhcmFtcy0+YlVzZUhhZGFtYXJkID0gT01YX1RSVUU7CisgICAgICAgICAgICBhdmNQYXJhbXMtPm5BbGxvd2VkUGljdHVyZVR5cGVzID0gKE9NWF9WSURFT19QaWN0dXJlVHlwZUkKKyAgICAgICAgICAgICAgICAgICAgfCBPTVhfVklERU9fUGljdHVyZVR5cGVQKTsKKyAgICAgICAgICAgIGF2Y1BhcmFtcy0+blJlZklkeDEwQWN0aXZlTWludXMxID0gMDsKKyAgICAgICAgICAgIGF2Y1BhcmFtcy0+blJlZklkeDExQWN0aXZlTWludXMxID0gMDsKKyAgICAgICAgICAgIGF2Y1BhcmFtcy0+YldlaWdodGVkUFByZWRpY3Rpb24gPSBPTVhfRkFMU0U7CisgICAgICAgICAgICBhdmNQYXJhbXMtPmJFbnRyb3B5Q29kaW5nQ0FCQUMgPSBPTVhfRkFMU0U7CisgICAgICAgICAgICBhdmNQYXJhbXMtPmJjb25zdElwcmVkID0gT01YX0ZBTFNFOworICAgICAgICAgICAgYXZjUGFyYW1zLT5iRGlyZWN0OHg4SW5mZXJlbmNlID0gT01YX0ZBTFNFOworICAgICAgICAgICAgYXZjUGFyYW1zLT5iRGlyZWN0U3BhdGlhbFRlbXBvcmFsID0gT01YX0ZBTFNFOworICAgICAgICAgICAgYXZjUGFyYW1zLT5uQ2FiYWNJbml0SWRjID0gMDsKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50OjppbnRlcm5hbEdldFBhcmFtZXRlcihpbmRleCwgcGFyYW1zKTsKKyAgICB9Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdEFWQzo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpIHsKKyAgICBpbnQzMl90IGluZGV4RnVsbCA9IGluZGV4OworCisgICAgc3dpdGNoIChpbmRleEZ1bGwpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvQml0cmF0ZToKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGludGVybmFsU2V0Qml0cmF0ZVBhcmFtcygKKyAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9WSURFT19QQVJBTV9CSVRSQVRFVFlQRSAqKXBhcmFtcyk7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9BdmM6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9WSURFT19QQVJBTV9BVkNUWVBFICphdmNUeXBlID0gKE9NWF9WSURFT19QQVJBTV9BVkNUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoYXZjVHlwZS0+blBvcnRJbmRleCAhPSAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGF2Y1R5cGUtPmVQcm9maWxlICE9IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUKKyAgICAgICAgICAgICAgICAgICAgfHwgYXZjVHlwZS0+blJlZkZyYW1lcyAhPSAxIHx8IGF2Y1R5cGUtPm5CRnJhbWVzICE9IDAKKyAgICAgICAgICAgICAgICAgICAgfHwgYXZjVHlwZS0+YlVzZUhhZGFtYXJkICE9IE9NWF9UUlVFCisgICAgICAgICAgICAgICAgICAgIHx8IChhdmNUeXBlLT5uQWxsb3dlZFBpY3R1cmVUeXBlcyAmIE9NWF9WSURFT19QaWN0dXJlVHlwZUIpICE9IDAKKyAgICAgICAgICAgICAgICAgICAgfHwgYXZjVHlwZS0+blJlZklkeDEwQWN0aXZlTWludXMxICE9IDAKKyAgICAgICAgICAgICAgICAgICAgfHwgYXZjVHlwZS0+blJlZklkeDExQWN0aXZlTWludXMxICE9IDAKKyAgICAgICAgICAgICAgICAgICAgfHwgYXZjVHlwZS0+YldlaWdodGVkUFByZWRpY3Rpb24gIT0gT01YX0ZBTFNFCisgICAgICAgICAgICAgICAgICAgIHx8IGF2Y1R5cGUtPmJFbnRyb3B5Q29kaW5nQ0FCQUMgIT0gT01YX0ZBTFNFCisgICAgICAgICAgICAgICAgICAgIHx8IGF2Y1R5cGUtPmJjb25zdElwcmVkICE9IE9NWF9GQUxTRQorICAgICAgICAgICAgICAgICAgICB8fCBhdmNUeXBlLT5iRGlyZWN0OHg4SW5mZXJlbmNlICE9IE9NWF9GQUxTRQorICAgICAgICAgICAgICAgICAgICB8fCBhdmNUeXBlLT5iRGlyZWN0U3BhdGlhbFRlbXBvcmFsICE9IE9NWF9GQUxTRQorICAgICAgICAgICAgICAgICAgICB8fCBhdmNUeXBlLT5uQ2FiYWNJbml0SWRjICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoT0sgIT0gQ29udmVydE9teEF2Y0xldmVsVG9BdmNTcGVjTGV2ZWwoYXZjVHlwZS0+ZUxldmVsLCAmbUFWQ0VuY0xldmVsKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50OjppbnRlcm5hbFNldFBhcmFtZXRlcihpbmRleCwgcGFyYW1zKTsKKyAgICB9Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdEFWQzo6c2V0Q29uZmlnKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIF9wYXJhbXMpIHsKKyAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnVmlkZW9JbnRyYVZPUFJlZnJlc2g6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9DT05GSUdfSU5UUkFSRUZSRVNIVk9QVFlQRSAqcGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX0NPTkZJR19JTlRSQVJFRlJFU0hWT1BUWVBFICopX3BhcmFtczsKKworICAgICAgICAgICAgaWYgKHBhcmFtcy0+blBvcnRJbmRleCAhPSBrT3V0cHV0UG9ydEluZGV4KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUtleUZyYW1lUmVxdWVzdGVkID0gcGFyYW1zLT5JbnRyYVJlZnJlc2hWT1A7CisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnVmlkZW9CaXRyYXRlOgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfVklERU9fQ09ORklHX0JJVFJBVEVUWVBFICpwYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfVklERU9fQ09ORklHX0JJVFJBVEVUWVBFICopX3BhcmFtczsKKworICAgICAgICAgICAgaWYgKHBhcmFtcy0+blBvcnRJbmRleCAhPSBrT3V0cHV0UG9ydEluZGV4KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1CaXRyYXRlICE9IHBhcmFtcy0+bkVuY29kZUJpdHJhdGUpIHsKKyAgICAgICAgICAgICAgICBtQml0cmF0ZSA9IHBhcmFtcy0+bkVuY29kZUJpdHJhdGU7CisgICAgICAgICAgICAgICAgbUJpdHJhdGVVcGRhdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpzZXRDb25maWcoaW5kZXgsIF9wYXJhbXMpOworICAgIH0KK30KKworT01YX0VSUk9SVFlQRSBTb2Z0QVZDOjppbnRlcm5hbFNldEJpdHJhdGVQYXJhbXMoCisgICAgICAgIGNvbnN0IE9NWF9WSURFT19QQVJBTV9CSVRSQVRFVFlQRSAqYml0cmF0ZSkgeworICAgIGlmIChiaXRyYXRlLT5uUG9ydEluZGV4ICE9IGtPdXRwdXRQb3J0SW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7CisgICAgfQorCisgICAgbUJpdHJhdGUgPSBiaXRyYXRlLT5uVGFyZ2V0Qml0cmF0ZTsKKyAgICBtQml0cmF0ZVVwZGF0ZWQgPSB0cnVlOworCisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdEFWQzo6c2V0RW5jb2RlQXJncygKKyAgICAgICAgaXZlX3ZpZGVvX2VuY29kZV9pcF90ICpwc19lbmNvZGVfaXAsCisgICAgICAgIGl2ZV92aWRlb19lbmNvZGVfb3BfdCAqcHNfZW5jb2RlX29wLAorICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5wdXRCdWZmZXJIZWFkZXIsCisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRwdXRCdWZmZXJIZWFkZXIpIHsKKyAgICBpdl9yYXdfYnVmX3QgKnBzX2lucF9yYXdfYnVmOworICAgIGNvbnN0IHVpbnQ4X3QgKnNvdXJjZTsKKyAgICBVV09SRDggKnB1MV9idWY7CisKKyAgICBwc19pbnBfcmF3X2J1ZiA9ICZwc19lbmNvZGVfaXAtPnNfaW5wX2J1ZjsKKyAgICBwc19lbmNvZGVfaXAtPnNfb3V0X2J1Zi5wdl9idWYgPSBvdXRwdXRCdWZmZXJIZWFkZXItPnBCdWZmZXI7CisgICAgcHNfZW5jb2RlX2lwLT5zX291dF9idWYudTRfYnl0ZXMgPSAwOworICAgIHBzX2VuY29kZV9pcC0+c19vdXRfYnVmLnU0X2J1ZnNpemUgPSBvdXRwdXRCdWZmZXJIZWFkZXItPm5BbGxvY0xlbjsKKyAgICBwc19lbmNvZGVfaXAtPnU0X3NpemUgPSBzaXplb2YoaXZlX3ZpZGVvX2VuY29kZV9pcF90KTsKKyAgICBwc19lbmNvZGVfb3AtPnU0X3NpemUgPSBzaXplb2YoaXZlX3ZpZGVvX2VuY29kZV9vcF90KTsKKworICAgIHBzX2VuY29kZV9pcC0+ZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0VOQ09ERTsKKyAgICBwc19lbmNvZGVfaXAtPnB2X2J1ZnMgPSBOVUxMOworICAgIHBzX2VuY29kZV9pcC0+cHZfbWJfaW5mbyA9IE5VTEw7CisgICAgcHNfZW5jb2RlX2lwLT5wdl9waWNfaW5mbyA9IE5VTEw7CisgICAgcHNfZW5jb2RlX2lwLT51NF9tYl9pbmZvX3R5cGUgPSAwOworICAgIHBzX2VuY29kZV9pcC0+dTRfcGljX2luZm9fdHlwZSA9IDA7CisgICAgcHNfZW5jb2RlX29wLT5zX291dF9idWYucHZfYnVmID0gTlVMTDsKKworICAgIC8qIEluaXRpYWxpemUgY29sb3IgZm9ybWF0cyAqLworICAgIHBzX2lucF9yYXdfYnVmLT5lX2NvbG9yX2ZtdCA9IG1JdlZpZGVvQ29sb3JGb3JtYXQ7CisKKyAgICBzb3VyY2UgPSBOVUxMOworICAgIGlmIChpbnB1dEJ1ZmZlckhlYWRlcikgeworICAgICAgICBzb3VyY2UgPSBpbnB1dEJ1ZmZlckhlYWRlci0+cEJ1ZmZlciArIGlucHV0QnVmZmVySGVhZGVyLT5uT2Zmc2V0OworCisgICAgICAgIGlmIChtSW5wdXREYXRhSXNNZXRhKSB7CisgICAgICAgICAgICBzb3VyY2UgPSBleHRyYWN0R3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXIsIChtV2lkdGggKiBtSGVpZ2h0ICogMyAvIDIpLCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgIGlucHV0QnVmZmVySGVhZGVyLT5uRmlsbGVkTGVuLCBtV2lkdGgsIG1IZWlnaHQpOworCisgICAgICAgICAgICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRXJyb3IgaW4gZXh0cmFjdEdyYXBoaWNCdWZmZXIiKTsKKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1MV9idWYgPSAoVVdPUkQ4ICopc291cmNlOworICAgIHN3aXRjaCAobUl2VmlkZW9Db2xvckZvcm1hdCkgeworICAgICAgICBjYXNlIElWX1lVVl80MjBQOgorICAgICAgICB7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXB2X2J1ZnNbMF0gPSBwdTFfYnVmOworICAgICAgICAgICAgcHUxX2J1ZiArPSAobVN0cmlkZSkgKiBtSGVpZ2h0OworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmFwdl9idWZzWzFdID0gcHUxX2J1ZjsKKyAgICAgICAgICAgIHB1MV9idWYgKz0gKG1TdHJpZGUgLyAyKSAqIG1IZWlnaHQgLyAyOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmFwdl9idWZzWzJdID0gcHUxX2J1ZjsKKworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF93ZFswXSA9IG1XaWR0aDsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfd2RbMV0gPSBtV2lkdGggLyAyOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF93ZFsyXSA9IG1XaWR0aCAvIDI7CisKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfaHRbMF0gPSBtSGVpZ2h0OworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9odFsxXSA9IG1IZWlnaHQgLyAyOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9odFsyXSA9IG1IZWlnaHQgLyAyOworCisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X3N0cmRbMF0gPSBtU3RyaWRlOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9zdHJkWzFdID0gKG1TdHJpZGUgLyAyKTsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfc3RyZFsyXSA9IChtU3RyaWRlIC8gMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgSVZfWVVWXzQyMklMRToKKyAgICAgICAgeworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmFwdl9idWZzWzBdID0gcHUxX2J1ZjsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfd2RbMF0gPSBtV2lkdGggKiAyOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9odFswXSA9IG1IZWlnaHQ7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X3N0cmRbMF0gPSBtU3RyaWRlICogMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBJVl9ZVVZfNDIwU1BfVVY6CisgICAgICAgIGNhc2UgSVZfWVVWXzQyMFNQX1ZVOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXB2X2J1ZnNbMF0gPSBwdTFfYnVmOworICAgICAgICAgICAgcHUxX2J1ZiArPSAobVN0cmlkZSkgKiBtSGVpZ2h0OworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmFwdl9idWZzWzFdID0gcHUxX2J1ZjsKKworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF93ZFswXSA9IG1XaWR0aDsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfd2RbMV0gPSBtV2lkdGg7CisKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfaHRbMF0gPSBtSGVpZ2h0OworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9odFsxXSA9IG1IZWlnaHQgLyAyOworCisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X3N0cmRbMF0gPSBtU3RyaWRlOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9zdHJkWzFdID0gbVN0cmlkZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcHNfZW5jb2RlX2lwLT51NF9pc19sYXN0ID0gMDsKKworICAgIGlmIChpbnB1dEJ1ZmZlckhlYWRlcikgeworICAgICAgICBwc19lbmNvZGVfaXAtPnU0X3RpbWVzdGFtcF9oaWdoID0gKGlucHV0QnVmZmVySGVhZGVyLT5uVGltZVN0YW1wKSA+PiAzMjsKKyAgICAgICAgcHNfZW5jb2RlX2lwLT51NF90aW1lc3RhbXBfbG93ID0gKGlucHV0QnVmZmVySGVhZGVyLT5uVGltZVN0YW1wKSAmIDB4RkZGRkZGRkY7CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKK3ZvaWQgU29mdEFWQzo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgeworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBXT1JEMzIgdGltZURlbGF5LCB0aW1lVGFrZW47CisKKyAgICBVTlVTRUQocG9ydEluZGV4KTsKKworICAgIC8vIEluaXRpYWxpemUgZW5jb2RlciBpZiBub3QgYWxyZWFkeSBpbml0aWFsaXplZAorICAgIGlmIChtQ29kZWNDdHggPT0gTlVMTCkgeworICAgICAgICBpZiAoT01YX0Vycm9yTm9uZSAhPSBpbml0RW5jb2RlcigpKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgZW5jb2RlciIpOworICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAgLyogYXJnMiAqLywgTlVMTCAvKiBkYXRhICovKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TYXdJbnB1dEVPUykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDApOworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoMSk7CisKKyAgICB3aGlsZSAoIW1TYXdJbnB1dEVPUyAmJiAhaW5RdWV1ZS5lbXB0eSgpICYmICFvdXRRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgIE9NWF9FUlJPUlRZUEUgZXJyb3I7CisgICAgICAgIGl2ZV92aWRlb19lbmNvZGVfaXBfdCBzX2VuY29kZV9pcDsKKyAgICAgICAgaXZlX3ZpZGVvX2VuY29kZV9vcF90IHNfZW5jb2RlX29wOworCisgICAgICAgIEJ1ZmZlckluZm8gKmlucHV0QnVmZmVySW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbnB1dEJ1ZmZlckhlYWRlciA9IGlucHV0QnVmZmVySW5mby0+bUhlYWRlcjsKKworICAgICAgICBCdWZmZXJJbmZvICpvdXRwdXRCdWZmZXJJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRwdXRCdWZmZXJIZWFkZXIgPSBvdXRwdXRCdWZmZXJJbmZvLT5tSGVhZGVyOworCisgICAgICAgIGlmIChpbnB1dEJ1ZmZlckhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7CisgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICBpbnB1dEJ1ZmZlckluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbnB1dEJ1ZmZlckhlYWRlcik7CisKKyAgICAgICAgICAgIG91dHB1dEJ1ZmZlckhlYWRlci0+bkZpbGxlZExlbiA9IDA7CisgICAgICAgICAgICBvdXRwdXRCdWZmZXJIZWFkZXItPm5GbGFncyA9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKworICAgICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICBvdXRwdXRCdWZmZXJJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRwdXRCdWZmZXJIZWFkZXIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgb3V0cHV0QnVmZmVySGVhZGVyLT5uVGltZVN0YW1wID0gMDsKKyAgICAgICAgb3V0cHV0QnVmZmVySGVhZGVyLT5uRmxhZ3MgPSAwOworICAgICAgICBvdXRwdXRCdWZmZXJIZWFkZXItPm5PZmZzZXQgPSAwOworICAgICAgICBvdXRwdXRCdWZmZXJIZWFkZXItPm5GaWxsZWRMZW4gPSAwOworICAgICAgICBvdXRwdXRCdWZmZXJIZWFkZXItPm5PZmZzZXQgPSAwOworCisgICAgICAgIHVpbnQ4X3QgKm91dFB0ciA9ICh1aW50OF90ICopb3V0cHV0QnVmZmVySGVhZGVyLT5wQnVmZmVyOworCisgICAgICAgIGlmICghbVNwc1Bwc0hlYWRlclJlY2VpdmVkKSB7CisgICAgICAgICAgICBlcnJvciA9IHNldEVuY29kZUFyZ3MoJnNfZW5jb2RlX2lwLCAmc19lbmNvZGVfb3AsIE5VTEwsIG91dHB1dEJ1ZmZlckhlYWRlcik7CisgICAgICAgICAgICBpZiAoZXJyb3IgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIDApOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19lbmNvZGVfaXAsICZzX2VuY29kZV9vcCk7CisKKyAgICAgICAgICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJFbmNvZGUgRnJhbWUgZmFpbGVkID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNfZW5jb2RlX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiQnl0ZXMgR2VuZXJhdGVkIGluIGhlYWRlciAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNfZW5jb2RlX29wLnNfb3V0X2J1Zi51NF9ieXRlcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1TcHNQcHNIZWFkZXJSZWNlaXZlZCA9IHRydWU7CisKKyAgICAgICAgICAgIG91dHB1dEJ1ZmZlckhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUc7CisgICAgICAgICAgICBvdXRwdXRCdWZmZXJIZWFkZXItPm5GaWxsZWRMZW4gPSBzX2VuY29kZV9vcC5zX291dF9idWYudTRfYnl0ZXM7CisgICAgICAgICAgICBvdXRwdXRCdWZmZXJIZWFkZXItPm5UaW1lU3RhbXAgPSBpbnB1dEJ1ZmZlckhlYWRlci0+blRpbWVTdGFtcDsKKworICAgICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICBvdXRwdXRCdWZmZXJJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICBEVU1QX1RPX0ZJTEUoCisgICAgICAgICAgICAgICAgICAgIG1PdXRGaWxlLCBvdXRwdXRCdWZmZXJIZWFkZXItPnBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlckhlYWRlci0+bkZpbGxlZExlbik7CisgICAgICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRwdXRCdWZmZXJIZWFkZXIpOworCisgICAgICAgICAgICBzZXRFbmNNb2RlKElWRV9FTkNfTU9ERV9QSUNUVVJFKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtQml0cmF0ZVVwZGF0ZWQpIHsKKyAgICAgICAgICAgIHNldEJpdFJhdGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtS2V5RnJhbWVSZXF1ZXN0ZWQpIHsKKyAgICAgICAgICAgIHNldEZyYW1lVHlwZShJVl9JRFJfRlJBTUUpOworICAgICAgICB9CisKKyAgICAgICAgbVByZXZUaW1lc3RhbXBVcyA9IGlucHV0QnVmZmVySGVhZGVyLT5uVGltZVN0YW1wOworCisgICAgICAgIGlmIChpbnB1dEJ1ZmZlckhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7CisgICAgICAgICAgICBtU2F3SW5wdXRFT1MgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgZXJyb3IgPSBzZXRFbmNvZGVBcmdzKAorICAgICAgICAgICAgICAgICZzX2VuY29kZV9pcCwgJnNfZW5jb2RlX29wLCBpbnB1dEJ1ZmZlckhlYWRlciwgb3V0cHV0QnVmZmVySGVhZGVyKTsKKyAgICAgICAgaWYgKGVycm9yICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgMCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBEVU1QX1RPX0ZJTEUoCisgICAgICAgICAgICAgICAgbUluRmlsZSwgc19lbmNvZGVfaXAuc19pbnBfYnVmLmFwdl9idWZzWzBdLAorICAgICAgICAgICAgICAgIChtSGVpZ2h0ICogbVN0cmlkZSAqIDMgLyAyKSk7CisgICAgICAgIC8vRFVNUF9UT19GSUxFKG1JbkZpbGUsIGlucHV0QnVmZmVySGVhZGVyLT5wQnVmZmVyICsgaW5wdXRCdWZmZXJIZWFkZXItPm5PZmZzZXQsCisgICAgICAgIC8vICAgIGlucHV0QnVmZmVySGVhZGVyLT5uRmlsbGVkTGVuKTsKKworICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBOVUxMKTsKKyAgICAgICAgLyogQ29tcHV0ZSB0aW1lIGVsYXBzZWQgYmV0d2VlbiBlbmQgb2YgcHJldmlvdXMgZGVjb2RlKCkKKyAgICAgICAgICogdG8gc3RhcnQgb2YgY3VycmVudCBkZWNvZGUoKSAqLworICAgICAgICBUSU1FX0RJRkYobVRpbWVFbmQsIG1UaW1lU3RhcnQsIHRpbWVEZWxheSk7CisKKyAgICAgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2VuY29kZV9pcCwgJnNfZW5jb2RlX29wKTsKKworICAgICAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFbmNvZGUgRnJhbWUgZmFpbGVkID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgc19lbmNvZGVfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIDApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgR0VUVElNRSgmbVRpbWVFbmQsIE5VTEwpOworICAgICAgICAvKiBDb21wdXRlIHRpbWUgdGFrZW4gZm9yIGRlY29kZSgpICovCisgICAgICAgIFRJTUVfRElGRihtVGltZVN0YXJ0LCBtVGltZUVuZCwgdGltZVRha2VuKTsKKworICAgICAgICBBTE9HVigidGltZVRha2VuPSU2ZCBkZWxheT0lNmQgbnVtQnl0ZXM9JTZkIiwgdGltZVRha2VuLCB0aW1lRGVsYXksCisgICAgICAgICAgICAgICAgc19lbmNvZGVfb3Auc19vdXRfYnVmLnU0X2J5dGVzKTsKKworCisgICAgICAgIG91dHB1dEJ1ZmZlckhlYWRlci0+bkZsYWdzID0gaW5wdXRCdWZmZXJIZWFkZXItPm5GbGFnczsKKyAgICAgICAgb3V0cHV0QnVmZmVySGVhZGVyLT5uRmlsbGVkTGVuID0gc19lbmNvZGVfb3Auc19vdXRfYnVmLnU0X2J5dGVzOworICAgICAgICBvdXRwdXRCdWZmZXJIZWFkZXItPm5UaW1lU3RhbXAgPSBpbnB1dEJ1ZmZlckhlYWRlci0+blRpbWVTdGFtcDsKKworICAgICAgICBpZiAoSVZfSURSX0ZSQU1FCisgICAgICAgICAgICAgICAgPT0gc19lbmNvZGVfb3AudTRfZW5jb2RlZF9mcmFtZV90eXBlKSB7CisgICAgICAgICAgICBvdXRwdXRCdWZmZXJIZWFkZXItPm5GbGFncyB8PSBPTVhfQlVGRkVSRkxBR19TWU5DRlJBTUU7CisgICAgICAgIH0KKworICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgICAgIGlucHV0QnVmZmVySW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworCisgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbnB1dEJ1ZmZlckhlYWRlcik7CisKKyAgICAgICAgaWYgKG1TYXdJbnB1dEVPUykgeworICAgICAgICAgICAgb3V0cHV0QnVmZmVySGVhZGVyLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICB9CisKKyAgICAgICAgb3V0cHV0QnVmZmVySW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKworICAgICAgICBEVU1QX1RPX0ZJTEUoCisgICAgICAgICAgICAgICAgbU91dEZpbGUsIG91dHB1dEJ1ZmZlckhlYWRlci0+cEJ1ZmZlciwKKyAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJIZWFkZXItPm5GaWxsZWRMZW4pOworICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRwdXRCdWZmZXJIZWFkZXIpOworCisgICAgfQorICAgIHJldHVybjsKK30KKworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCithbmRyb2lkOjpTb2Z0T01YQ29tcG9uZW50ICpjcmVhdGVTb2Z0T01YQ29tcG9uZW50KAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCisgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpIHsKKyAgICByZXR1cm4gbmV3IGFuZHJvaWQ6OlNvZnRBVkMobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGUyNmE5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmgKQEAgLTAsMCArMSwzMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19TT0ZUX0FWQ19FTkNfSF9fCisjZGVmaW5lIF9fU09GVF9BVkNfRU5DX0hfXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKKyNpbmNsdWRlICJTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE1lZGlhQnVmZmVyOworCisjZGVmaW5lIENPREVDX01BWF9DT1JFUyAgICAgICAgICA0CisjZGVmaW5lIExFTl9TVEFUVVNfQlVGRkVSICAgICAgICAoMTAgICogMTAyNCkKKyNkZWZpbmUgTUFYX1ZCVl9CVUZGX1NJWkUgICAgICAgICgxMjAgKiAxNjM4NCkKKyNkZWZpbmUgTUFYX05VTV9JT19CVUZTICAgICAgICAgICAzCisKKyNkZWZpbmUgREVGQVVMVF9NQVhfUkVGX0ZSTSAgICAgICAgIDEKKyNkZWZpbmUgREVGQVVMVF9NQVhfUkVPUkRFUl9GUk0gICAgIDAKKyNkZWZpbmUgREVGQVVMVF9RUF9NSU4gICAgICAgICAgICAgIDEwCisjZGVmaW5lIERFRkFVTFRfUVBfTUFYICAgICAgICAgICAgICA0MAorI2RlZmluZSBERUZBVUxUX01BWF9CSVRSQVRFICAgICAgICAgMjAwMDAwMDAKKyNkZWZpbmUgREVGQVVMVF9NQVhfU1JDSF9SQU5HRV9YICAgIDI1NgorI2RlZmluZSBERUZBVUxUX01BWF9TUkNIX1JBTkdFX1kgICAgMjU2CisjZGVmaW5lIERFRkFVTFRfTUFYX0ZSQU1FUkFURSAgICAgICAxMjAwMDAKKyNkZWZpbmUgREVGQVVMVF9OVU1fQ09SRVMgICAgICAgICAgIDEKKyNkZWZpbmUgREVGQVVMVF9OVU1fQ09SRVNfUFJFX0VOQyAgIDAKKyNkZWZpbmUgREVGQVVMVF9GUFMgICAgICAgICAgICAgICAgIDMwCisjZGVmaW5lIERFRkFVTFRfRU5DX1NQRUVEICAgICAgICAgICBJVkVfTk9STUFMCisKKyNkZWZpbmUgREVGQVVMVF9NRU1fUkVDX0NOVCAgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9SRUNPTl9FTkFCTEUgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9DSEtTVU1fRU5BQkxFICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9TVEFSVF9GUk0gICAgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9OVU1fRlJNUyAgICAgICAgICAgIDB4RkZGRkZGRkYKKyNkZWZpbmUgREVGQVVMVF9JTlBfQ09MT1JfRk9STUFUICAgICAgIElWX1lVVl80MjBTUF9WVQorI2RlZmluZSBERUZBVUxUX1JFQ09OX0NPTE9SX0ZPUk1BVCAgICAgSVZfWVVWXzQyMFAKKyNkZWZpbmUgREVGQVVMVF9MT09QQkFDSyAgICAgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9TUkNfRlJBTUVfUkFURSAgICAgIDMwCisjZGVmaW5lIERFRkFVTFRfVEdUX0ZSQU1FX1JBVEUgICAgICAzMAorI2RlZmluZSBERUZBVUxUX01BWF9XRCAgICAgICAgICAgICAgMTkyMAorI2RlZmluZSBERUZBVUxUX01BWF9IVCAgICAgICAgICAgICAgMTkyMAorI2RlZmluZSBERUZBVUxUX01BWF9MRVZFTCAgICAgICAgICAgNDAKKyNkZWZpbmUgREVGQVVMVF9TVFJJREUgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9XRCAgICAgICAgICAgICAgICAgIDEyODAKKyNkZWZpbmUgREVGQVVMVF9IVCAgICAgICAgICAgICAgICAgIDcyMAorI2RlZmluZSBERUZBVUxUX1BTTlJfRU5BQkxFICAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX01FX1NQRUVEICAgICAgICAgICAgMTAwCisjZGVmaW5lIERFRkFVTFRfRU5BQkxFX0ZBU1RfU0FEICAgICAwCisjZGVmaW5lIERFRkFVTFRfRU5BQkxFX0FMVF9SRUYgICAgICAwCisjZGVmaW5lIERFRkFVTFRfUkNfTU9ERSAgICAgICAgICAgICBJVkVfUkNfU1RPUkFHRQorI2RlZmluZSBERUZBVUxUX0JJVFJBVEUgICAgICAgICAgICAgNjAwMDAwMAorI2RlZmluZSBERUZBVUxUX0lfUVAgICAgICAgICAgICAgICAgMjIKKyNkZWZpbmUgREVGQVVMVF9JX1FQX01BWCAgICAgICAgICAgIERFRkFVTFRfUVBfTUFYCisjZGVmaW5lIERFRkFVTFRfSV9RUF9NSU4gICAgICAgICAgICBERUZBVUxUX1FQX01JTgorI2RlZmluZSBERUZBVUxUX1BfUVAgICAgICAgICAgICAgICAgMjgKKyNkZWZpbmUgREVGQVVMVF9QX1FQX01BWCAgICAgICAgICAgIERFRkFVTFRfUVBfTUFYCisjZGVmaW5lIERFRkFVTFRfUF9RUF9NSU4gICAgICAgICAgICBERUZBVUxUX1FQX01JTgorI2RlZmluZSBERUZBVUxUX0JfUVAgICAgICAgICAgICAgICAgMjIKKyNkZWZpbmUgREVGQVVMVF9CX1FQX01BWCAgICAgICAgICAgIERFRkFVTFRfUVBfTUFYCisjZGVmaW5lIERFRkFVTFRfQl9RUF9NSU4gICAgICAgICAgICBERUZBVUxUX1FQX01JTgorI2RlZmluZSBERUZBVUxUX0FJUiAgICAgICAgICAgICAgICAgSVZFX0FJUl9NT0RFX05PTkUKKyNkZWZpbmUgREVGQVVMVF9BSVJfUkVGUkVTSF9QRVJJT0QgIDMwCisjZGVmaW5lIERFRkFVTFRfU1JDSF9STkdfWCAgICAgICAgICA2NAorI2RlZmluZSBERUZBVUxUX1NSQ0hfUk5HX1kgICAgICAgICAgNDgKKyNkZWZpbmUgREVGQVVMVF9JX0lOVEVSVkFMICAgICAgICAgIDMwCisjZGVmaW5lIERFRkFVTFRfSURSX0lOVEVSVkFMICAgICAgICAxMDAwCisjZGVmaW5lIERFRkFVTFRfQl9GUkFNRVMgICAgICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfRElTQUJMRV9ERUJMS19MRVZFTCAwCisjZGVmaW5lIERFRkFVTFRfSFBFTCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFRkFVTFRfUVBFTCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFRkFVTFRfSTQgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFRkFVTFRfRVBST0ZJTEUgICAgICAgICAgICBJVl9QUk9GSUxFX0JBU0UKKyNkZWZpbmUgREVGQVVMVF9TTElDRV9NT0RFICAgICAgICAgIElWRV9TTElDRV9NT0RFX05PTkUKKyNkZWZpbmUgREVGQVVMVF9TTElDRV9QQVJBTSAgICAgICAgIDI1NgorI2RlZmluZSBERUZBVUxUX0FSQ0ggICAgICAgICAgICAgICAgQVJDSF9BUk1fQTlRCisjZGVmaW5lIERFRkFVTFRfU09DICAgICAgICAgICAgICAgICBTT0NfR0VORVJJQworI2RlZmluZSBERUZBVUxUX0lOVFJBNHg0ICAgICAgICAgICAgMAorI2RlZmluZSBTVFJMRU5HVEggICAgICAgICAgICAgICAgICAgNTAwCisKKworCisjZGVmaW5lIE1JTihhLCBiKSAoKGEpIDwgKGIpKT8gKGEpIDogKGIpCisjZGVmaW5lIE1BWChhLCBiKSAoKGEpID4gKGIpKT8gKGEpIDogKGIpCisjZGVmaW5lIEFMSUdOMTYoeCkgKCgoKHgpICsgMTUpID4+IDQpIDw8IDQpCisjZGVmaW5lIEFMSUdOMTI4KHgpICgoKCh4KSArIDEyNykgPj4gNykgPDwgNykKKyNkZWZpbmUgQUxJR040MDk2KHgpICgoKCh4KSArIDQwOTUpID4+IDEyKSA8PCAxMikKKworLyoqIFVzZWQgdG8gcmVtb3ZlIHdhcm5pbmdzIGFib3V0IHVudXNlZCBwYXJhbWV0ZXJzICovCisjZGVmaW5lIFVOVVNFRCh4KSAoKHZvaWQpKHgpKQorCisvKiogR2V0IHRpbWUgKi8KKyNkZWZpbmUgR0VUVElNRShhLCBiKSBnZXR0aW1lb2ZkYXkoYSwgYik7CisKKy8qKiBDb21wdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiBzdGFydCBhbmQgZW5kICovCisjZGVmaW5lIFRJTUVfRElGRihzdGFydCwgZW5kLCBkaWZmKSBcCisgICAgZGlmZiA9ICgoZW5kLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgKiAxMDAwMDAwKSArIFwKKyAgICAgICAgICAgIChlbmQudHZfdXNlYyAtIHN0YXJ0LnR2X3VzZWMpOworCisjZGVmaW5lIGl2ZV9hbGlnbmVkX21hbGxvYyhhbGlnbm1lbnQsIHNpemUpIG1lbWFsaWduKGFsaWdubWVudCwgc2l6ZSkKKyNkZWZpbmUgaXZlX2FsaWduZWRfZnJlZShidWYpIGZyZWUoYnVmKQorCitzdHJ1Y3QgU29mdEFWQyA6IHB1YmxpYyBTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50IHsKKyAgICBTb2Z0QVZDKAorICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KTsKKworICAgIC8vIE92ZXJyaWRlIFNpbXBsZVNvZnRPTVhDb21wb25lbnQgbWV0aG9kcworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbEdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKTsKKworICAgIHZpcnR1YWwgdm9pZCBvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflNvZnRBVkMoKTsKKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga051bUJ1ZmZlcnMgPSAyLAorICAgIH07CisKKyAgICAvLyBPTVggaW5wdXQgYnVmZmVyJ3MgdGltZXN0YW1wIGFuZCBmbGFncworICAgIHR5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgaW50NjRfdCBtVGltZVVzOworICAgICAgICBpbnQzMl90IG1GbGFnczsKKyAgICB9IElucHV0QnVmZmVySW5mbzsKKworICAgIGludDMyX3QgIG1TdHJpZGU7CisKKyAgICB1aW50MzJfdCBtRnJhbWVSYXRlOworCisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVTdGFydDsgICAvLyBUaW1lIGF0IHRoZSBzdGFydCBvZiBkZWNvZGUoKQorICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lRW5kOyAgICAgLy8gVGltZSBhdCB0aGUgZW5kIG9mIGRlY29kZSgpCisKKworICAgIC8vIElmIGEgcmVxdWVzdCBmb3IgYSBjaGFuZ2UgaXQgYml0cmF0ZSBoYXMgYmVlbiByZWNlaXZlZC4KKyAgICBib29sIG1CaXRyYXRlVXBkYXRlZDsKKworICAgIGJvb2wgbUtleUZyYW1lUmVxdWVzdGVkOworCisjaWZkZWYgRklMRV9EVU1QX0VOQUJMRQorICAgIGNoYXIgbUluRmlsZVsyMDBdOworICAgIGNoYXIgbU91dEZpbGVbMjAwXTsKKyNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisKKyAgICBJVl9DT0xPUl9GT1JNQVRfVCBtSXZWaWRlb0NvbG9yRm9ybWF0OworCisgICAgaW50MzJfdCAgbUlEUkZyYW1lUmVmcmVzaEludGVydmFsSW5TZWM7CisgICAgSVZfUFJPRklMRV9UIG1BVkNFbmNQcm9maWxlOworICAgIFdPUkQzMiAgIG1BVkNFbmNMZXZlbDsKKyAgICBpbnQ2NF90ICBtTnVtSW5wdXRGcmFtZXM7CisgICAgaW50NjRfdCAgbVByZXZUaW1lc3RhbXBVczsKKyAgICBib29sICAgICBtU3RhcnRlZDsKKyAgICBib29sICAgICBtU3BzUHBzSGVhZGVyUmVjZWl2ZWQ7CisKKyAgICBib29sICAgICBtU2F3SW5wdXRFT1M7CisgICAgYm9vbCAgICAgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgICAgIG1JbnRyYTR4NDsKKyAgICBib29sICAgICBtRW5hYmxlRmFzdFNhZDsKKyAgICBib29sICAgICBtRW5hYmxlQWx0UmVmOworICAgIGJvb2wgICAgbVJlY29uRW5hYmxlOworICAgIGJvb2wgICAgbVBTTlJFbmFibGU7CisgICAgSVZFX1NQRUVEX0NPTkZJRyAgICAgbUVuY1NwZWVkOworCisgICAgdWludDhfdCAqbUNvbnZlcnNpb25CdWZmZXI7CisKKyAgICBpdl9vYmpfdCAqbUNvZGVjQ3R4OyAgICAgICAgIC8vIENvZGVjIGNvbnRleHQKKyAgICBpdl9tZW1fcmVjX3QgKm1NZW1SZWNvcmRzOyAgIC8vIE1lbW9yeSByZWNvcmRzIHJlcXVlc3RlZCBieSB0aGUgY29kZWMKKyAgICBzaXplX3QgbU51bU1lbVJlY29yZHM7ICAgICAgIC8vIE51bWJlciBvZiBtZW1vcnkgcmVjb3JkcyByZXF1ZXN0ZWQgYnkgY29kZWMKKyAgICBzaXplX3QgbU51bUNvcmVzOyAgICAgICAgICAgIC8vIE51bWJlciBvZiBjb3JlcyB1c2VkIGJ5IHRoZSBjb2RlYworCisgICAgVVdPUkQzMiBtSGVhZGVyR2VuZXJhdGVkOworCisgICAgSVZfQVJDSF9UIG1BcmNoOworICAgIElWRV9TTElDRV9NT0RFX1QgbVNsaWNlTW9kZTsKKyAgICBVV09SRDMyIG1TbGljZVBhcmFtOworICAgIGJvb2wgbUhhbGZQZWxFbmFibGU7CisgICAgVVdPUkQzMiBtSUludGVydmFsOworICAgIFVXT1JEMzIgbUlEUkludGVydmFsOworICAgIFVXT1JEMzIgbURpc2FibGVEZWJsa0xldmVsOworICAgIElWRV9BSVJfTU9ERV9UIG1BSVJNb2RlOworICAgIFVXT1JEMzIgbUFJUlJlZnJlc2hQZXJpb2Q7CisKKyAgICBPTVhfRVJST1JUWVBFIGluaXRFbmNQYXJhbXMoKTsKKyAgICBPTVhfRVJST1JUWVBFIGluaXRFbmNvZGVyKCk7CisgICAgT01YX0VSUk9SVFlQRSByZWxlYXNlRW5jb2RlcigpOworCisgICAgLy8gVmVyaWZpZXMgdGhlIGNvbXBvbmVudCByb2xlIHRyaWVkIHRvIGJlIHNldCB0byB0aGlzIE9NWCBjb21wb25lbnQgaXMKKyAgICAvLyBzdHJpY3RseSB2aWRlb19lbmNvZGVyLmF2YworICAgIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRSb2xlUGFyYW1zKAorICAgICAgICBjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKnJvbGUpOworCisgICAgLy8gVXBkYXRlcyBiaXRyYXRlIHRvIHJlZmxlY3QgcG9ydCBzZXR0aW5ncy4KKyAgICBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0Qml0cmF0ZVBhcmFtcygKKyAgICAgICAgY29uc3QgT01YX1ZJREVPX1BBUkFNX0JJVFJBVEVUWVBFICpiaXRyYXRlKTsKKworICAgIE9NWF9FUlJPUlRZUEUgc2V0Q29uZmlnKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIF9wYXJhbXMpOworCisgICAgLy8gSGFuZGxlcyBwb3J0IGRlZmluaXRpb24gY2hhbmdlcy4KKyAgICBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0UG9ydFBhcmFtcygKKyAgICAgICAgY29uc3QgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqcG9ydCk7CisKKyAgICBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0Rm9ybWF0UGFyYW1zKAorICAgICAgICBjb25zdCBPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdCk7CisKKyAgICBPTVhfRVJST1JUWVBFIHNldEZyYW1lVHlwZShJVl9QSUNUVVJFX0NPRElOR19UWVBFX1QgIGVfZnJhbWVfdHlwZSk7CisgICAgT01YX0VSUk9SVFlQRSBzZXRRcCgpOworICAgIE9NWF9FUlJPUlRZUEUgc2V0RW5jTW9kZShJVkVfRU5DX01PREVfVCBlX2VuY19tb2RlKTsKKyAgICBPTVhfRVJST1JUWVBFIHNldERpbWVuc2lvbnMoKTsKKyAgICBPTVhfRVJST1JUWVBFIHNldE51bUNvcmVzKCk7CisgICAgT01YX0VSUk9SVFlQRSBzZXRGcmFtZVJhdGUoKTsKKyAgICBPTVhfRVJST1JUWVBFIHNldElwZVBhcmFtcygpOworICAgIE9NWF9FUlJPUlRZUEUgc2V0Qml0UmF0ZSgpOworICAgIE9NWF9FUlJPUlRZUEUgc2V0QWlyUGFyYW1zKCk7CisgICAgT01YX0VSUk9SVFlQRSBzZXRNZVBhcmFtcygpOworICAgIE9NWF9FUlJPUlRZUEUgc2V0R29wUGFyYW1zKCk7CisgICAgT01YX0VSUk9SVFlQRSBzZXRQcm9maWxlUGFyYW1zKCk7CisgICAgT01YX0VSUk9SVFlQRSBzZXREZWJsb2NrUGFyYW1zKCk7CisgICAgT01YX0VSUk9SVFlQRSBzZXRWYnZQYXJhbXMoKTsKKyAgICB2b2lkIGxvZ1ZlcnNpb24oKTsKKyAgICBPTVhfRVJST1JUWVBFIHNldEVuY29kZUFyZ3MoCisgICAgICAgIGl2ZV92aWRlb19lbmNvZGVfaXBfdCAqcHNfZW5jb2RlX2lwLAorICAgICAgICBpdmVfdmlkZW9fZW5jb2RlX29wX3QgKnBzX2VuY29kZV9vcCwKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmlucHV0QnVmZmVySGVhZGVyLAorICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0cHV0QnVmZmVySGVhZGVyKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvZnRBVkMpOworfTsKKworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKworI2RlZmluZSBJTlBVVF9EVU1QX1BBVEggICAgICIvc2RjYXJkL21lZGlhL2F2Y2VfaW5wdXQiCisjZGVmaW5lIElOUFVUX0RVTVBfRVhUICAgICAgInl1diIKKyNkZWZpbmUgT1VUUFVUX0RVTVBfUEFUSCAgICAiL3NkY2FyZC9tZWRpYS9hdmNlX291dHB1dCIKKyNkZWZpbmUgT1VUUFVUX0RVTVBfRVhUICAgICAiaDI2NCIKKworI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdHJjcHkobUluRmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNwcmludGYobUluRmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBJTlBVVF9EVU1QX1BBVEgsICBcCisgICAgICAgICAgICBtVGltZVN0YXJ0LnR2X3NlYywgbVRpbWVTdGFydC50dl91c2VjLCAgICAgIFwKKyAgICAgICAgICAgIElOUFVUX0RVTVBfRVhUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0cmNweShtT3V0RmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3ByaW50ZihtT3V0RmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBPVVRQVVRfRFVNUF9QQVRILFwKKyAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfc2VjLCBtVGltZVN0YXJ0LnR2X3VzZWMsICAgICAgXAorICAgICAgICAgICAgT1VUUFVUX0RVTVBfRVhUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKSB7ICAgICAgICAgICAgICAgICAgXAorICAgIEZJTEUgKmZwID0gZm9wZW4obV9maWxlbmFtZSwgIndiIik7ICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZwICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoIk9wZW5lZCBmaWxlICVzIiwgbV9maWxlbmFtZSk7ICAgICAgICAgICAgXAorICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCBvcGVuIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTsgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplKSAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZJTEUgKmZwID0gZm9wZW4obV9maWxlbmFtZSwgImFiIik7ICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZwICE9IE5VTEwgJiYgbV9idWYgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpID0gZndyaXRlKG1fYnVmLCAxLCBtX3NpemUsIGZwKTsgICAgICAgICAgICAgICBcCisgICAgICAgIEFMT0dEKCJmd3JpdGUgcmV0ICVkIHRvIHdyaXRlICVkIiwgaSwgbV9zaXplKTsgIFwKKyAgICAgICAgaWYgKGkgIT0gKGludCltX3NpemUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0QoIkVycm9yIGluIGZ3cml0ZSwgcmV0dXJuZWQgJWQiLCBpKTsgICBcCisgICAgICAgICAgICBwZXJyb3IoIkVycm9yIGluIHdyaXRlIHRvIGZpbGUiKTsgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCB3cml0ZSB0byBmaWxlICVzIiwgbV9maWxlbmFtZSk7XAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZWxzZSAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisjZGVmaW5lIElOUFVUX0RVTVBfUEFUSAorI2RlZmluZSBJTlBVVF9EVU1QX0VYVAorI2RlZmluZSBPVVRQVVRfRFVNUF9QQVRICisjZGVmaW5lIE9VVFBVVF9EVU1QX0VYVAorI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkKKyNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKQorI2RlZmluZSBEVU1QX1RPX0ZJTEUobV9maWxlbmFtZSwgbV9idWYsIG1fc2l6ZSkKKyNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gX19TT0ZUX0FWQ19FTkNfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwCmluZGV4IDEzMDEwNjAuLjllZGZmZDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwCkBAIC00MjEsNyArNDIxLDYgQEAKICAgICB9CiAKICAgICBGTEFDX19ib29sIG9rID0gdHJ1ZTsKLSAgICBGTEFDX19TdHJlYW1FbmNvZGVySW5pdFN0YXR1cyBpbml0U3RhdHVzID0gRkxBQ19fU1RSRUFNX0VOQ09ERVJfSU5JVF9TVEFUVVNfT0s7CiAgICAgb2sgPSBvayAmJiBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfY2hhbm5lbHMobUZsYWNTdHJlYW1FbmNvZGVyLCBtTnVtQ2hhbm5lbHMpOwogICAgIG9rID0gb2sgJiYgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X3NhbXBsZV9yYXRlKG1GbGFjU3RyZWFtRW5jb2RlciwgbVNhbXBsZVJhdGUpOwogICAgIG9rID0gb2sgJiYgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X2JpdHNfcGVyX3NhbXBsZShtRmxhY1N0cmVhbUVuY29kZXIsIDE2KTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuY3BwCmluZGV4IDNhNjkwOTUuLjAxNTUxNWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmNwcApAQCAtNDEsOCArNDEsOSBAQAogICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkKICAgICA6IFNpbXBsZVNvZnRPTVhDb21wb25lbnQobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpLAogICAgICAgbUlzTUxhdyh0cnVlKSwKKyAgICAgIG1TaWduYWxsZWRFcnJvcihmYWxzZSksCiAgICAgICBtTnVtQ2hhbm5lbHMoMSksCi0gICAgICBtU2lnbmFsbGVkRXJyb3IoZmFsc2UpIHsKKyAgICAgIG1TYW1wbGluZ1JhdGUoODAwMCkgewogICAgIGlmICghc3RyY21wKG5hbWUsICJPTVguZ29vZ2xlLmc3MTEuYWxhdy5kZWNvZGVyIikpIHsKICAgICAgICAgbUlzTUxhdyA9IGZhbHNlOwogICAgIH0gZWxzZSB7CkBAIC0xMjksNyArMTMwLDcgQEAKICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzFdID0gT01YX0FVRElPX0NoYW5uZWxSRjsKIAogICAgICAgICAgICAgcGNtUGFyYW1zLT5uQ2hhbm5lbHMgPSBtTnVtQ2hhbm5lbHM7Ci0gICAgICAgICAgICBwY21QYXJhbXMtPm5TYW1wbGluZ1JhdGUgPSA4MDAwOworICAgICAgICAgICAgcGNtUGFyYW1zLT5uU2FtcGxpbmdSYXRlID0gbVNhbXBsaW5nUmF0ZTsKIAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KQEAgLTE1OSw2ICsxNjAsOCBAQAogICAgICAgICAgICAgICAgIG1OdW1DaGFubmVscyA9IHBjbVBhcmFtcy0+bkNoYW5uZWxzOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBtU2FtcGxpbmdSYXRlID0gcGNtUGFyYW1zLT5uU2FtcGxpbmdSYXRlOworCiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5oCmluZGV4IGJmZjBjNjguLjE2YjYzNDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5oCkBAIC00Niw4ICs0Niw5IEBACiAgICAgfTsKIAogICAgIGJvb2wgbUlzTUxhdzsKLSAgICBPTVhfVTMyIG1OdW1DaGFubmVsczsKICAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBPTVhfVTMyIG1OdW1DaGFubmVsczsKKyAgICBpbnQzMl90IG1TYW1wbGluZ1JhdGU7CiAKICAgICB2b2lkIGluaXRQb3J0cygpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uY3BwCmluZGV4IDRkZWJjNDguLmJkMDFhMWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uY3BwCkBAIC0zNCw2ICszNCw5IEBACiAgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5TdGVwID0gMDsKIH0KIAorLy8gTWljcm9zb2Z0IFdBViBHU00gZW5jb2RpbmcgcGFja3MgdHdvIEdTTSBmcmFtZXMgaW50byA2NSBieXRlcy4KK3N0YXRpYyBjb25zdCBpbnQga01TR1NNRnJhbWVTaXplID0gNjU7CisKIFNvZnRHU006OlNvZnRHU00oCiAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCiAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKQEAgLTY0LDcgKzY3LDcgQEAKICAgICBkZWYuZURpciA9IE9NWF9EaXJJbnB1dDsKICAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bUJ1ZmZlcnM7CiAgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IGRlZi5uQnVmZmVyQ291bnRNaW47Ci0gICAgZGVmLm5CdWZmZXJTaXplID0gc2l6ZW9mKGdzbV9mcmFtZSk7CisgICAgZGVmLm5CdWZmZXJTaXplID0gMTAyNCAvIGtNU0dTTUZyYW1lU2l6ZSAqIGtNU0dTTUZyYW1lU2l6ZTsKICAgICBkZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKICAgICBkZWYuYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKICAgICBkZWYuZURvbWFpbiA9IE9NWF9Qb3J0RG9tYWluQXVkaW87CkBAIC0yMDcsOCArMjEwLDggQEAKICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CiAgICAgICAgIH0KIAotICAgICAgICBpZigoKGluSGVhZGVyLT5uRmlsbGVkTGVuIC8gNjUpICogNjUpICE9IGluSGVhZGVyLT5uRmlsbGVkTGVuKSB7Ci0gICAgICAgICAgICBBTE9HRSgiaW5wdXQgYnVmZmVyIG5vdCBtdWx0aXBsZSBvZiA2NSAoJWQpLiIsIGluSGVhZGVyLT5uRmlsbGVkTGVuKTsKKyAgICAgICAgaWYoKChpbkhlYWRlci0+bkZpbGxlZExlbiAvIGtNU0dTTUZyYW1lU2l6ZSkgKiBrTVNHU01GcmFtZVNpemUpICE9IGluSGVhZGVyLT5uRmlsbGVkTGVuKSB7CisgICAgICAgICAgICBBTE9HRSgiaW5wdXQgYnVmZmVyIG5vdCBtdWx0aXBsZSBvZiAlZCAoJWQpLiIsIGtNU0dTTUZyYW1lU2l6ZSwgaW5IZWFkZXItPm5GaWxsZWRMZW4pOwogICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOwogICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKICAgICAgICAgfQpAQCAtMjU4LDYgKzI2MSwyNSBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKK3ZvaWQgU29mdEdTTTo6b25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKKyAgICBpZiAocG9ydEluZGV4ID09IDApIHsKKyAgICAgICAgZ3NtX2Rlc3Ryb3kobUdzbSk7CisgICAgICAgIG1Hc20gPSBnc21fY3JlYXRlKCk7CisgICAgICAgIGludCBtc29wdCA9IDE7CisgICAgICAgIGdzbV9vcHRpb24obUdzbSwgR1NNX09QVF9XQVY0OSwgJm1zb3B0KTsKKyAgICB9Cit9CisKK3ZvaWQgU29mdEdTTTo6b25SZXNldCgpIHsKKyAgICBnc21fZGVzdHJveShtR3NtKTsKKyAgICBtR3NtID0gZ3NtX2NyZWF0ZSgpOworICAgIGludCBtc29wdCA9IDE7CisgICAgZ3NtX29wdGlvbihtR3NtLCBHU01fT1BUX1dBVjQ5LCAmbXNvcHQpOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworfQorCisKKwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmgKaW5kZXggOGFiNjExNi4uMDMwM2RlYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvU29mdEdTTS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uaApAQCAtNDMsNiArNDMsOSBAQAogCiAgICAgdmlydHVhbCB2b2lkIG9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpOwogCisgICAgdmlydHVhbCB2b2lkIG9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKKyAgICB2aXJ0dWFsIHZvaWQgb25SZXNldCgpOworCiBwcml2YXRlOgogICAgIGVudW0gewogICAgICAgICBrTnVtQnVmZmVycyA9IDQsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9maW5kX21pbl9tYXguY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZmluZF9taW5fbWF4LmNwcAppbmRleCBhMzU3ZWE2Li4xYWM4OGExIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9maW5kX21pbl9tYXguY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2ZpbmRfbWluX21heC5jcHAKQEAgLTEzOCw4ICsxMzgsOCBAQAogICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIDsgRGVmaW5lIGFsbCBsb2NhbCB2YXJpYWJsZXMKICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICByZWdpc3RlciAgICB1aW50ICAgIGksIGo7Ci0gICAgcmVnaXN0ZXIgICAgaW50IG1pbiwgbWF4OworICAgIHVpbnQgICAgaSwgajsKKyAgICBpbnQgbWluLCBtYXg7CiAKICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICA7IEZ1bmN0aW9uIGJvZHkgaGVyZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9BbmRyb2lkLm1rCmluZGV4IGM5MDA2ZDkuLjcxMTc2OTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL0FuZHJvaWQubWsKQEAgLTI1LDcgKzI1LDcgQEAKIAogTE9DQUxfQ0ZMQUdTIDo9IFwKICAgICAtREJYX1JDIFwKLSAgICAtRE9TQ0xfSU1QT1JUX1JFRj0gLURPU0NMX1VOVVNFRF9BUkc9IC1ET1NDTF9FWFBPUlRfUkVGPQorICAgIC1ET1NDTF9JTVBPUlRfUkVGPSAtRCJPU0NMX1VOVVNFRF9BUkcoeCk9KHZvaWQpKHgpIiAtRE9TQ0xfRVhQT1JUX1JFRj0KIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAgICAgJChMT0NBTF9QQVRIKS9zcmMgXApAQCAtNTUsNyArNTUsNyBAQAogCiBMT0NBTF9DRkxBR1MgOj0gXAogICAgIC1EQlhfUkMgXAotICAgIC1ET1NDTF9JTVBPUlRfUkVGPSAtRE9TQ0xfVU5VU0VEX0FSRz0gLURPU0NMX0VYUE9SVF9SRUY9CisgICAgLURPU0NMX0lNUE9SVF9SRUY9IC1EIk9TQ0xfVU5VU0VEX0FSRyh4KT0odm9pZCkoeCkiIC1ET1NDTF9FWFBPUlRfUkVGPQogCiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5jcHAKaW5kZXggZmEzNDg2Yy4uODI0MGY4MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuY3BwCkBAIC00MTMsMTMgKzQxMyw2IEBACiAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA+IDApIHsKICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmlucHV0RGF0YSA9IE5VTEw7CiAgICAgICAgICAgICBpZiAobUlucHV0RGF0YUlzTWV0YSkgewotICAgICAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiAhPSA4KSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJNZXRhRGF0YSBidWZmZXIgaXMgd3Jvbmcgc2l6ZSEgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoZ290ICV1IGJ5dGVzLCBleHBlY3RlZCA4KSIsIGluSGVhZGVyLT5uRmlsbGVkTGVuKTsKLSAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIDApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlucHV0RGF0YSA9CiAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RHcmFwaGljQnVmZmVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dEZyYW1lRGF0YSwgKG1XaWR0aCAqIG1IZWlnaHQgKiAzKSA+PiAxLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuaAppbmRleCAyNWVjZGM5Li4zMzg5YzM3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuaApAQCAtMjYsNyArMjYsNiBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQ29kZWNQcm9maWxlTGV2ZWw7Ci1zdHJ1Y3QgTWVkaWFCdWZmZXI7CiAKIHN0cnVjdCBTb2Z0TVBFRzRFbmNvZGVyIDogcHVibGljIFNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQgewogICAgIFNvZnRNUEVHNEVuY29kZXIoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9kY3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZGN0LmNwcAppbmRleCBmYTRhZTIzLi44ZDdkOWYxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9kY3QuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2RjdC5jcHAKQEAgLTI2Nyw3ICsyNjcsNyBAQAogICAgIFZvaWQgQmxvY2s0eDREQ1RfQUFOd1N1YihTaG9ydCAqb3V0LCBVQ2hhciAqY3VyLCBVQ2hhciAqcHJlZCwgSW50IHdpZHRoKQogICAgIHsKICAgICAgICAgU2hvcnQgKmRzdDsKLSAgICAgICAgcmVnaXN0ZXIgSW50IGswLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNzsKKyAgICAgICAgSW50IGswLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNzsKICAgICAgICAgSW50IHJvdW5kOwogICAgICAgICBJbnQgazEyID0gMHgwMjJBMDJENDsKICAgICAgICAgSW50IGsxNCA9IDB4MDE4ODA1M0E7CkBAIC00NzMsNyArNDczLDcgQEAKICAgICBWb2lkIEJsb2NrMngyRENUX0FBTndTdWIoU2hvcnQgKm91dCwgVUNoYXIgKmN1ciwgVUNoYXIgKnByZWQsIEludCB3aWR0aCkKICAgICB7CiAgICAgICAgIFNob3J0ICpkc3Q7Ci0gICAgICAgIHJlZ2lzdGVyIEludCBrMCwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazc7CisgICAgICAgIEludCBrMCwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazc7CiAgICAgICAgIEludCByb3VuZDsKICAgICAgICAgSW50IGsxMiA9IDB4MDIyQTAyRDQ7CiAgICAgICAgIEludCBrMTQgPSAweDAxODgwM0IyOwpAQCAtODYzLDcgKzg2Myw3IEBACiAgICAgVm9pZCBCbG9jazR4NERDVF9BQU5JbnRyYShTaG9ydCAqb3V0LCBVQ2hhciAqY3VyLCBVQ2hhciAqZHVtbXkyLCBJbnQgd2lkdGgpCiAgICAgewogICAgICAgICBTaG9ydCAqZHN0OwotICAgICAgICByZWdpc3RlciBJbnQgazAsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3OworICAgICAgICBJbnQgazAsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3OwogICAgICAgICBJbnQgcm91bmQ7CiAgICAgICAgIEludCBrMTIgPSAweDAyMkEwMkQ0OwogICAgICAgICBJbnQgazE0ID0gMHgwMTg4MDUzQTsKQEAgLTEwNTAsNyArMTA1MCw3IEBACiAgICAgVm9pZCBCbG9jazJ4MkRDVF9BQU5JbnRyYShTaG9ydCAqb3V0LCBVQ2hhciAqY3VyLCBVQ2hhciAqZHVtbXkyLCBJbnQgd2lkdGgpCiAgICAgewogICAgICAgICBTaG9ydCAqZHN0OwotICAgICAgICByZWdpc3RlciBJbnQgazAsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3OworICAgICAgICBJbnQgazAsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3OwogICAgICAgICBJbnQgcm91bmQ7CiAgICAgICAgIEludCBrMTIgPSAweDAyMkEwMkQ0OwogICAgICAgICBJbnQgazE0ID0gMHgwMTg4MDNCMjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3ZsY19lbmNvZGUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvdmxjX2VuY29kZS5jcHAKaW5kZXggN2VhNWRjNC4uMmFlYzgxNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvdmxjX2VuY29kZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvdmxjX2VuY29kZS5jcHAKQEAgLTI3MSw3ICsyNzEsNyBAQAogICAgIEludCBpbmQ7CiAgICAgSW50IGxlbmd0aDsKIAotICAgIGlmICgoaW50cmEgPT0gMCkpCisgICAgaWYgKGludHJhID09IDApCiAgICAgICAgIGNicHkgPSAxNSAtIGNicHk7CiAKICAgICBpbmQgPSBjYnB5OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9BbmRyb2lkLm1rCmluZGV4IDgyODQ0OTAuLjk0OGFlMjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL0FuZHJvaWQubWsKQEAgLTQ4LDcgKzQ4LDcgQEAKICAgICAgICAgJChMT0NBTF9QQVRIKS9pbmNsdWRlCiAKIExPQ0FMX0NGTEFHUyA6PSBcCi0gICAgICAgIC1ET1NDTF9VTlVTRURfQVJHPQorICAgICAgICAtRCJPU0NMX1VOVVNFRF9BUkcoeCk9KHZvaWQpKHgpIgogCiBMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYjEyNmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDI3IEBACitpZmVxICgkKGlmICQod2lsZGNhcmQgZXh0ZXJuYWwvbGlibXBlZzIpLDEsMCksMSkKKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRSAgICAgICAgICAgIDo9IGxpYnN0YWdlZnJpZ2h0X3NvZnRfbXBlZzJkZWMKK0xPQ0FMX01PRFVMRV9UQUdTICAgICAgIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgIDo9IGxpYm1wZWcyZGVjCitMT0NBTF9TUkNfRklMRVMgICAgICAgICA6PSBTb2Z0TVBFRzIuY3BwCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gJChUT1ApL2V4dGVybmFsL2xpYm1wZWcyL2RlY29kZXIKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChUT1ApL2V4dGVybmFsL2xpYm1wZWcyL2NvbW1vbgorTE9DQUxfQ19JTkNMVURFUyArPSAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyAgOj0gbGlic3RhZ2VmcmlnaHQKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgICs9IGxpYnN0YWdlZnJpZ2h0X29teAorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyAgKz0gbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbgorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyAgKz0gbGlidXRpbHMKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgICs9IGxpYmxvZworCitMT0NBTF9MREZMQUdTIDo9IC1XbCwtQnN5bWJvbGljCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9Tb2Z0TVBFRzIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL1NvZnRNUEVHMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U5ODkyOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9Tb2Z0TVBFRzIuY3BwCkBAIC0wLDAgKzEsNzcxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlNvZnRNUEVHMiIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIml2X2RhdGF0eXBlZGVmLmgiCisjaW5jbHVkZSAiaXYuaCIKKyNpbmNsdWRlICJpdmQuaCIKKyNpbmNsdWRlICJpdGhyZWFkLmgiCisjaW5jbHVkZSAiaW1wZWcyZC5oIgorI2luY2x1ZGUgIlNvZnRNUEVHMi5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxPTVhfVmlkZW9FeHQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjZGVmaW5lIGNvbXBvbmVudE5hbWUgICAgICAgICAgICAgICAgICAgInZpZGVvX2RlY29kZXIubXBlZzIiCisjZGVmaW5lIGNvZGluZ1R5cGUgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0NvZGluZ01QRUcyCisjZGVmaW5lIENPREVDX01JTUVfVFlQRSAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIKKworLyoqIEZ1bmN0aW9uIGFuZCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgdG8ga2VlcCBjb2RlIHNpbWlsYXIgZm9yIGVhY2ggY29kZWMgKi8KKyNkZWZpbmUgaXZkZWNfYXBpX2Z1bmN0aW9uICAgICAgICAgICAgICBpbXBlZzJkX2FwaV9mdW5jdGlvbgorI2RlZmluZSBpdmRleHRfaW5pdF9pcF90ICAgICAgICAgICAgICAgIGltcGVnMmRfaW5pdF9pcF90CisjZGVmaW5lIGl2ZGV4dF9pbml0X29wX3QgICAgICAgICAgICAgICAgaW1wZWcyZF9pbml0X29wX3QKKyNkZWZpbmUgaXZkZXh0X2ZpbGxfbWVtX3JlY19pcF90ICAgICAgICBpbXBlZzJkX2ZpbGxfbWVtX3JlY19pcF90CisjZGVmaW5lIGl2ZGV4dF9maWxsX21lbV9yZWNfb3BfdCAgICAgICAgaW1wZWcyZF9maWxsX21lbV9yZWNfb3BfdAorI2RlZmluZSBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCAgIGltcGVnMmRfY3RsX3NldF9udW1fY29yZXNfaXBfdAorI2RlZmluZSBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCAgIGltcGVnMmRfY3RsX3NldF9udW1fY29yZXNfb3BfdAorCisjZGVmaW5lIElWREVYVF9DTURfQ1RMX1NFVF9OVU1fQ09SRVMgICAgXAorICAgICAgICAoSVZEX0NPTlRST0xfQVBJX0NPTU1BTkRfVFlQRV9UKUlNUEVHMkRfQ01EX0NUTF9TRVRfTlVNX0NPUkVTCisKK3N0YXRpYyBjb25zdCBDb2RlY1Byb2ZpbGVMZXZlbCBrUHJvZmlsZUxldmVsc1tdID0geworICAgIHsgT01YX1ZJREVPX01QRUcyUHJvZmlsZVNpbXBsZSwgT01YX1ZJREVPX01QRUcyTGV2ZWxMTCAgfSwKKyAgICB7IE9NWF9WSURFT19NUEVHMlByb2ZpbGVTaW1wbGUsIE9NWF9WSURFT19NUEVHMkxldmVsTUwgIH0sCisgICAgeyBPTVhfVklERU9fTVBFRzJQcm9maWxlU2ltcGxlLCBPTVhfVklERU9fTVBFRzJMZXZlbEgxNCB9LAorICAgIHsgT01YX1ZJREVPX01QRUcyUHJvZmlsZVNpbXBsZSwgT01YX1ZJREVPX01QRUcyTGV2ZWxITCAgfSwKKworICAgIHsgT01YX1ZJREVPX01QRUcyUHJvZmlsZU1haW4gICwgT01YX1ZJREVPX01QRUcyTGV2ZWxMTCAgfSwKKyAgICB7IE9NWF9WSURFT19NUEVHMlByb2ZpbGVNYWluICAsIE9NWF9WSURFT19NUEVHMkxldmVsTUwgIH0sCisgICAgeyBPTVhfVklERU9fTVBFRzJQcm9maWxlTWFpbiAgLCBPTVhfVklERU9fTVBFRzJMZXZlbEgxNCB9LAorICAgIHsgT01YX1ZJREVPX01QRUcyUHJvZmlsZU1haW4gICwgT01YX1ZJREVPX01QRUcyTGV2ZWxITCAgfSwKK307CisKK1NvZnRNUEVHMjo6U29mdE1QRUcyKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCisgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpCisgICAgOiBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50KAorICAgICAgICAgICAgbmFtZSwgY29tcG9uZW50TmFtZSwgY29kaW5nVHlwZSwKKyAgICAgICAgICAgIGtQcm9maWxlTGV2ZWxzLCBBUlJBWV9TSVpFKGtQcm9maWxlTGV2ZWxzKSwKKyAgICAgICAgICAgIDMyMCAvKiB3aWR0aCAqLywgMjQwIC8qIGhlaWdodCAqLywgY2FsbGJhY2tzLAorICAgICAgICAgICAgYXBwRGF0YSwgY29tcG9uZW50KSwKKyAgICAgIG1NZW1SZWNvcmRzKE5VTEwpLAorICAgICAgbUZsdXNoT3V0QnVmZmVyKE5VTEwpLAorICAgICAgbU9teENvbG9yRm9ybWF0KE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpLAorICAgICAgbUl2Q29sb3JGb3JtYXQoSVZfWVVWXzQyMFApLAorICAgICAgbU5ld1dpZHRoKG1XaWR0aCksCisgICAgICBtTmV3SGVpZ2h0KG1IZWlnaHQpLAorICAgICAgbUNoYW5naW5nUmVzb2x1dGlvbihmYWxzZSkgeworICAgIGluaXRQb3J0cyhrTnVtQnVmZmVycywgSU5QVVRfQlVGX1NJWkUsIGtOdW1CdWZmZXJzLCBDT0RFQ19NSU1FX1RZUEUpOworCisgICAgLy8gSWYgaW5wdXQgZHVtcCBpcyBlbmFibGVkLCB0aGVuIG9wZW4gY3JlYXRlIGFuIGVtcHR5IGZpbGUKKyAgICBHRU5FUkFURV9GSUxFX05BTUVTKCk7CisgICAgQ1JFQVRFX0RVTVBfRklMRShtSW5GaWxlKTsKKworICAgIENIRUNLX0VRKGluaXREZWNvZGVyKCksIChzdGF0dXNfdClPSyk7Cit9CisKK1NvZnRNUEVHMjo6flNvZnRNUEVHMigpIHsKKyAgICBDSEVDS19FUShkZUluaXREZWNvZGVyKCksIChzdGF0dXNfdClPSyk7Cit9CisKKworc3RhdGljIHNpemVfdCBnZXRNaW5UaW1lc3RhbXBJZHgoT01YX1M2NCAqcE5UaW1lU3RhbXAsIGJvb2wgKnBJc1RpbWVTdGFtcFZhbGlkKSB7CisgICAgT01YX1M2NCBtaW5UaW1lU3RhbXAgPSBMTE9OR19NQVg7CisgICAgaW50IGlkeCA9IC0xOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTUFYX1RJTUVfU1RBTVBTOyBpKyspIHsKKyAgICAgICAgaWYgKHBJc1RpbWVTdGFtcFZhbGlkW2ldKSB7CisgICAgICAgICAgICBpZiAocE5UaW1lU3RhbXBbaV0gPCBtaW5UaW1lU3RhbXApIHsKKyAgICAgICAgICAgICAgICBtaW5UaW1lU3RhbXAgPSBwTlRpbWVTdGFtcFtpXTsKKyAgICAgICAgICAgICAgICBpZHggPSBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpZHg7Cit9CisKK3N0YXRpYyBzaXplX3QgR2V0Q1BVQ29yZUNvdW50KCkgeworICAgIGxvbmcgY3B1Q29yZUNvdW50ID0gMTsKKyNpZiBkZWZpbmVkKF9TQ19OUFJPQ0VTU09SU19PTkxOKQorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOworI2Vsc2UKKyAgICAvLyBfU0NfTlBST0NfT05MTiBtdXN0IGJlIGRlZmluZWQuLi4KKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ19PTkxOKTsKKyNlbmRpZgorICAgIENIRUNLKGNwdUNvcmVDb3VudCA+PSAxKTsKKyAgICBBTE9HVigiTnVtYmVyIG9mIENQVSBjb3JlczogJWxkIiwgY3B1Q29yZUNvdW50KTsKKyAgICByZXR1cm4gKHNpemVfdCljcHVDb3JlQ291bnQ7Cit9CisKK3ZvaWQgU29mdE1QRUcyOjpsb2dWZXJzaW9uKCkgeworICAgIGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9faXBfdCBzX2N0bF9pcDsKKyAgICBpdmRfY3RsX2dldHZlcnNpb25pbmZvX29wX3Qgc19jdGxfb3A7CisgICAgVVdPUkQ4IGF1MV9idWZbNTEyXTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXM7CisKKyAgICBzX2N0bF9pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfY3RsX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX0dFVFZFUlNJT047CisgICAgc19jdGxfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2dldHZlcnNpb25pbmZvX2lwX3QpOworICAgIHNfY3RsX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19vcF90KTsKKyAgICBzX2N0bF9pcC5wdl92ZXJzaW9uX2J1ZmZlciA9IGF1MV9idWY7CisgICAgc19jdGxfaXAudTRfdmVyc2lvbl9idWZmZXJfc2l6ZSA9IHNpemVvZihhdTFfYnVmKTsKKworICAgIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICh2b2lkICopJnNfY3RsX2lwLCAodm9pZCAqKSZzX2N0bF9vcCk7CisKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGluIGdldHRpbmcgdmVyc2lvbiBudW1iZXI6IDB4JXgiLAorICAgICAgICAgICAgICAgIHNfY3RsX29wLnU0X2Vycm9yX2NvZGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJJdHRpYW0gZGVjb2RlciB2ZXJzaW9uIG51bWJlcjogJXMiLAorICAgICAgICAgICAgICAgIChjaGFyICopc19jdGxfaXAucHZfdmVyc2lvbl9idWZmZXIpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3N0YXR1c190IFNvZnRNUEVHMjo6c2V0UGFyYW1zKHNpemVfdCBzdHJpZGUpIHsKKyAgICBpdmRfY3RsX3NldF9jb25maWdfaXBfdCBzX2N0bF9pcDsKKyAgICBpdmRfY3RsX3NldF9jb25maWdfb3BfdCBzX2N0bF9vcDsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXM7CisgICAgc19jdGxfaXAudTRfZGlzcF93ZCA9IChVV09SRDMyKXN0cmlkZTsKKyAgICBzX2N0bF9pcC5lX2ZybV9za2lwX21vZGUgPSBJVkRfU0tJUF9OT05FOworCisgICAgc19jdGxfaXAuZV9mcm1fb3V0X21vZGUgPSBJVkRfRElTUExBWV9GUkFNRV9PVVQ7CisgICAgc19jdGxfaXAuZV92aWRfZGVjX21vZGUgPSBJVkRfREVDT0RFX0ZSQU1FOworICAgIHNfY3RsX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19jdGxfaXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfU0VUUEFSQU1TOworICAgIHNfY3RsX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9zZXRfY29uZmlnX2lwX3QpOworICAgIHNfY3RsX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9zZXRfY29uZmlnX29wX3QpOworCisgICAgQUxPR1YoIlNldCB0aGUgcnVuLXRpbWUgKGR5bmFtaWMpIHBhcmFtZXRlcnMgc3RyaWRlID0gJXUiLCBzdHJpZGUpOworICAgIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICh2b2lkICopJnNfY3RsX2lwLCAodm9pZCAqKSZzX2N0bF9vcCk7CisKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGluIHNldHRpbmcgdGhlIHJ1bi10aW1lIHBhcmFtZXRlcnM6IDB4JXgiLAorICAgICAgICAgICAgICAgIHNfY3RsX29wLnU0X2Vycm9yX2NvZGUpOworCisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFNvZnRNUEVHMjo6cmVzZXRQbHVnaW4oKSB7CisgICAgbUlzSW5GbHVzaCA9IGZhbHNlOworICAgIG1SZWNlaXZlZEVPUyA9IGZhbHNlOworICAgIG1lbXNldChtVGltZVN0YW1wcywgMCwgc2l6ZW9mKG1UaW1lU3RhbXBzKSk7CisgICAgbWVtc2V0KG1UaW1lU3RhbXBzVmFsaWQsIDAsIHNpemVvZihtVGltZVN0YW1wc1ZhbGlkKSk7CisKKyAgICAvKiBJbml0aWFsaXplIGJvdGggc3RhcnQgYW5kIGVuZCB0aW1lcyAqLworICAgIGdldHRpbWVvZmRheSgmbVRpbWVTdGFydCwgTlVMTCk7CisgICAgZ2V0dGltZW9mZGF5KCZtVGltZUVuZCwgTlVMTCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFNvZnRNUEVHMjo6cmVzZXREZWNvZGVyKCkgeworICAgIGl2ZF9jdGxfcmVzZXRfaXBfdCBzX2N0bF9pcDsKKyAgICBpdmRfY3RsX3Jlc2V0X29wX3Qgc19jdGxfb3A7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc19jdGxfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2N0bF9pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9SRVNFVDsKKyAgICBzX2N0bF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfcmVzZXRfaXBfdCk7CisgICAgc19jdGxfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3Jlc2V0X29wX3QpOworCisgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19jdGxfaXAsICh2b2lkICopJnNfY3RsX29wKTsKKyAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGluIHJlc2V0OiAweCV4Iiwgc19jdGxfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIC8qIFNldCB0aGUgcnVuLXRpbWUgKGR5bmFtaWMpIHBhcmFtZXRlcnMgKi8KKyAgICBzZXRQYXJhbXMob3V0cHV0QnVmZmVyV2lkdGgoKSk7CisKKyAgICAvKiBTZXQgbnVtYmVyIG9mIGNvcmVzL3RocmVhZHMgdG8gYmUgdXNlZCBieSB0aGUgY29kZWMgKi8KKyAgICBzZXROdW1Db3JlcygpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTb2Z0TVBFRzI6OnNldE51bUNvcmVzKCkgeworICAgIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90IHNfc2V0X2NvcmVzX2lwOworICAgIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90IHNfc2V0X2NvcmVzX29wOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1czsKKyAgICBzX3NldF9jb3Jlc19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfc2V0X2NvcmVzX2lwLmVfc3ViX2NtZCA9IElWREVYVF9DTURfQ1RMX1NFVF9OVU1fQ09SRVM7CisgICAgc19zZXRfY29yZXNfaXAudTRfbnVtX2NvcmVzID0gTUlOKG1OdW1Db3JlcywgQ09ERUNfTUFYX05VTV9DT1JFUyk7CisgICAgc19zZXRfY29yZXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCk7CisgICAgc19zZXRfY29yZXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSZzX3NldF9jb3Jlc19pcCwgKHZvaWQgKikmc19zZXRfY29yZXNfb3ApOworICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICBBTE9HRSgiRXJyb3IgaW4gc2V0dGluZyBudW1iZXIgb2YgY29yZXM6IDB4JXgiLAorICAgICAgICAgICAgICAgIHNfc2V0X2NvcmVzX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTb2Z0TVBFRzI6OnNldEZsdXNoTW9kZSgpIHsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXM7CisgICAgaXZkX2N0bF9mbHVzaF9pcF90IHNfdmlkZW9fZmx1c2hfaXA7CisgICAgaXZkX2N0bF9mbHVzaF9vcF90IHNfdmlkZW9fZmx1c2hfb3A7CisKKyAgICBzX3ZpZGVvX2ZsdXNoX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc192aWRlb19mbHVzaF9pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9GTFVTSDsKKyAgICBzX3ZpZGVvX2ZsdXNoX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9mbHVzaF9pcF90KTsKKyAgICBzX3ZpZGVvX2ZsdXNoX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9mbHVzaF9vcF90KTsKKworICAgIC8qIFNldCB0aGUgZGVjb2RlciBpbiBGbHVzaCBtb2RlLCBzdWJzZXF1ZW50IGRlY29kZSgpIGNhbGxzIHdpbGwgZmx1c2ggKi8KKyAgICBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24oCisgICAgICAgICAgICBtQ29kZWNDdHgsICh2b2lkICopJnNfdmlkZW9fZmx1c2hfaXAsICh2b2lkICopJnNfdmlkZW9fZmx1c2hfb3ApOworCisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBpbiBzZXR0aW5nIHRoZSBkZWNvZGVyIGluIGZsdXNoIG1vZGU6ICglZCkgMHgleCIsIHN0YXR1cywKKyAgICAgICAgICAgICAgICBzX3ZpZGVvX2ZsdXNoX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBtV2FpdEZvckkgPSB0cnVlOworICAgIG1Jc0luRmx1c2ggPSB0cnVlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU29mdE1QRUcyOjppbml0RGVjb2RlcigpIHsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXM7CisKKyAgICBVV09SRDMyIHU0X251bV9yZW9yZGVyX2ZyYW1lczsKKyAgICBVV09SRDMyIHU0X251bV9yZWZfZnJhbWVzOworICAgIFVXT1JEMzIgdTRfc2hhcmVfZGlzcF9idWY7CisKKyAgICBtTnVtQ29yZXMgPSBHZXRDUFVDb3JlQ291bnQoKTsKKyAgICBtV2FpdEZvckkgPSB0cnVlOworCisgICAgLyogSW5pdGlhbGl6ZSBudW1iZXIgb2YgcmVmIGFuZCByZW9yZGVyIG1vZGVzIChmb3IgTVBFRzIpICovCisgICAgdTRfbnVtX3Jlb3JkZXJfZnJhbWVzID0gMTY7CisgICAgdTRfbnVtX3JlZl9mcmFtZXMgPSAxNjsKKyAgICB1NF9zaGFyZV9kaXNwX2J1ZiA9IDA7CisKKyAgICB1aW50MzJfdCBkaXNwbGF5U3RyaWRlID0gb3V0cHV0QnVmZmVyV2lkdGgoKTsKKyAgICB1aW50MzJfdCBkaXNwbGF5SGVpZ2h0ID0gb3V0cHV0QnVmZmVySGVpZ2h0KCk7CisgICAgdWludDMyX3QgZGlzcGxheVNpemVZID0gZGlzcGxheVN0cmlkZSAqIGRpc3BsYXlIZWlnaHQ7CisKKyAgICB7CisgICAgICAgIGl2X251bV9tZW1fcmVjX2lwX3Qgc19udW1fbWVtX3JlY19pcDsKKyAgICAgICAgaXZfbnVtX21lbV9yZWNfb3BfdCBzX251bV9tZW1fcmVjX29wOworCisgICAgICAgIHNfbnVtX21lbV9yZWNfaXAudTRfc2l6ZSA9IHNpemVvZihzX251bV9tZW1fcmVjX2lwKTsKKyAgICAgICAgc19udW1fbWVtX3JlY19vcC51NF9zaXplID0gc2l6ZW9mKHNfbnVtX21lbV9yZWNfb3ApOworICAgICAgICBzX251bV9tZW1fcmVjX2lwLmVfY21kID0gSVZfQ01EX0dFVF9OVU1fTUVNX1JFQzsKKworICAgICAgICBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24oCisgICAgICAgICAgICAgICAgbUNvZGVjQ3R4LCAodm9pZCAqKSZzX251bV9tZW1fcmVjX2lwLCAodm9pZCAqKSZzX251bV9tZW1fcmVjX29wKTsKKyAgICAgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisgICAgICAgICAgICBBTE9HRSgiRXJyb3IgaW4gZ2V0dGluZyBtZW0gcmVjb3JkczogMHgleCIsCisgICAgICAgICAgICAgICAgICAgIHNfbnVtX21lbV9yZWNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIG1OdW1NZW1SZWNvcmRzID0gc19udW1fbWVtX3JlY19vcC51NF9udW1fbWVtX3JlYzsKKyAgICB9CisKKyAgICBtTWVtUmVjb3JkcyA9IChpdl9tZW1fcmVjX3QgKilpdmRfYWxpZ25lZF9tYWxsb2MoCisgICAgICAgICAgICAxMjgsIG1OdW1NZW1SZWNvcmRzICogc2l6ZW9mKGl2X21lbV9yZWNfdCkpOworICAgIGlmIChtTWVtUmVjb3JkcyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJBbGxvY2F0aW9uIGZhaWx1cmUiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICBtZW1zZXQobU1lbVJlY29yZHMsIDAsIG1OdW1NZW1SZWNvcmRzICogc2l6ZW9mKGl2X21lbV9yZWNfdCkpOworCisgICAgeworICAgICAgICBzaXplX3QgaTsKKyAgICAgICAgaXZkZXh0X2ZpbGxfbWVtX3JlY19pcF90IHNfZmlsbF9tZW1faXA7CisgICAgICAgIGl2ZGV4dF9maWxsX21lbV9yZWNfb3BfdCBzX2ZpbGxfbWVtX29wOworICAgICAgICBpdl9tZW1fcmVjX3QgKnBzX21lbV9yZWM7CisKKyAgICAgICAgc19maWxsX21lbV9pcC5zX2l2ZF9maWxsX21lbV9yZWNfaXBfdC51NF9zaXplID0KKyAgICAgICAgICAgIHNpemVvZihpdmRleHRfZmlsbF9tZW1fcmVjX2lwX3QpOworCisgICAgICAgIHNfZmlsbF9tZW1faXAudTRfc2hhcmVfZGlzcF9idWYgPSB1NF9zaGFyZV9kaXNwX2J1ZjsKKyAgICAgICAgc19maWxsX21lbV9pcC5lX291dHB1dF9mb3JtYXQgPSBtSXZDb2xvckZvcm1hdDsKKworICAgICAgICBzX2ZpbGxfbWVtX2lwLnNfaXZkX2ZpbGxfbWVtX3JlY19pcF90LmVfY21kID0gSVZfQ01EX0ZJTExfTlVNX01FTV9SRUM7CisgICAgICAgIHNfZmlsbF9tZW1faXAuc19pdmRfZmlsbF9tZW1fcmVjX2lwX3QucHZfbWVtX3JlY19sb2NhdGlvbiA9IG1NZW1SZWNvcmRzOworICAgICAgICBzX2ZpbGxfbWVtX2lwLnNfaXZkX2ZpbGxfbWVtX3JlY19pcF90LnU0X21heF9mcm1fd2QgPSBkaXNwbGF5U3RyaWRlOworICAgICAgICBzX2ZpbGxfbWVtX2lwLnNfaXZkX2ZpbGxfbWVtX3JlY19pcF90LnU0X21heF9mcm1faHQgPSBkaXNwbGF5SGVpZ2h0OworICAgICAgICBzX2ZpbGxfbWVtX29wLnNfaXZkX2ZpbGxfbWVtX3JlY19vcF90LnU0X3NpemUgPQorICAgICAgICAgICAgc2l6ZW9mKGl2ZGV4dF9maWxsX21lbV9yZWNfb3BfdCk7CisKKyAgICAgICAgcHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbU51bU1lbVJlY29yZHM7IGkrKykgeworICAgICAgICAgICAgcHNfbWVtX3JlY1tpXS51NF9zaXplID0gc2l6ZW9mKGl2X21lbV9yZWNfdCk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24oCisgICAgICAgICAgICAgICAgbUNvZGVjQ3R4LCAodm9pZCAqKSZzX2ZpbGxfbWVtX2lwLCAodm9pZCAqKSZzX2ZpbGxfbWVtX29wKTsKKworICAgICAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFcnJvciBpbiBmaWxsaW5nIG1lbSByZWNvcmRzOiAweCV4IiwKKyAgICAgICAgICAgICAgICAgICAgc19maWxsX21lbV9vcC5zX2l2ZF9maWxsX21lbV9yZWNfb3BfdC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIG1OdW1NZW1SZWNvcmRzID0KKyAgICAgICAgICAgIHNfZmlsbF9tZW1fb3Auc19pdmRfZmlsbF9tZW1fcmVjX29wX3QudTRfbnVtX21lbV9yZWNfZmlsbGVkOworCisgICAgICAgIHBzX21lbV9yZWMgPSBtTWVtUmVjb3JkczsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbU51bU1lbVJlY29yZHM7IGkrKykgeworICAgICAgICAgICAgcHNfbWVtX3JlYy0+cHZfYmFzZSA9IGl2ZF9hbGlnbmVkX21hbGxvYygKKyAgICAgICAgICAgICAgICAgICAgcHNfbWVtX3JlYy0+dTRfbWVtX2FsaWdubWVudCwgcHNfbWVtX3JlYy0+dTRfbWVtX3NpemUpOworICAgICAgICAgICAgaWYgKHBzX21lbV9yZWMtPnB2X2Jhc2UgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBbGxvY2F0aW9uIGZhaWx1cmUgZm9yIG1lbW9yeSByZWNvcmQgIyV6dSBvZiBzaXplICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGksIHBzX21lbV9yZWMtPnU0X21lbV9zaXplKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBJVl9GQUlMOworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBzX21lbV9yZWMrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgdGhlIGRlY29kZXIgKi8KKyAgICB7CisgICAgICAgIGl2ZGV4dF9pbml0X2lwX3Qgc19pbml0X2lwOworICAgICAgICBpdmRleHRfaW5pdF9vcF90IHNfaW5pdF9vcDsKKworICAgICAgICB2b2lkICpkZWNfZnhucyA9ICh2b2lkICopaXZkZWNfYXBpX2Z1bmN0aW9uOworCisgICAgICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfaW5pdF9pcF90KTsKKyAgICAgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC5lX2NtZCA9IChJVkRfQVBJX0NPTU1BTkRfVFlQRV9UKUlWX0NNRF9JTklUOworICAgICAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LnB2X21lbV9yZWNfbG9jYXRpb24gPSBtTWVtUmVjb3JkczsKKyAgICAgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC51NF9mcm1fbWF4X3dkID0gZGlzcGxheVN0cmlkZTsKKyAgICAgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC51NF9mcm1fbWF4X2h0ID0gZGlzcGxheUhlaWdodDsKKworICAgICAgICBzX2luaXRfaXAudTRfc2hhcmVfZGlzcF9idWYgPSB1NF9zaGFyZV9kaXNwX2J1ZjsKKworICAgICAgICBzX2luaXRfb3Auc19pdmRfaW5pdF9vcF90LnU0X3NpemUgPSBzaXplb2Yoc19pbml0X29wKTsKKworICAgICAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LnU0X251bV9tZW1fcmVjID0gbU51bU1lbVJlY29yZHM7CisgICAgICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QuZV9vdXRwdXRfZm9ybWF0ID0gbUl2Q29sb3JGb3JtYXQ7CisKKyAgICAgICAgbUNvZGVjQ3R4ID0gKGl2X29ial90ICopbU1lbVJlY29yZHNbMF0ucHZfYmFzZTsKKyAgICAgICAgbUNvZGVjQ3R4LT5wdl9meG5zID0gZGVjX2Z4bnM7CisgICAgICAgIG1Db2RlY0N0eC0+dTRfc2l6ZSA9IHNpemVvZihpdl9vYmpfdCk7CisKKyAgICAgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19pbml0X2lwLCAodm9pZCAqKSZzX2luaXRfb3ApOworICAgICAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFcnJvciBpbiBpbml0OiAweCV4IiwKKyAgICAgICAgICAgICAgICAgICAgc19pbml0X29wLnNfaXZkX2luaXRfb3BfdC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgLyogUmVzZXQgdGhlIHBsdWdpbiBzdGF0ZSAqLworICAgIHJlc2V0UGx1Z2luKCk7CisKKyAgICAvKiBTZXQgdGhlIHJ1biB0aW1lIChkeW5hbWljKSBwYXJhbWV0ZXJzICovCisgICAgc2V0UGFyYW1zKGRpc3BsYXlTdHJpZGUpOworCisgICAgLyogU2V0IG51bWJlciBvZiBjb3Jlcy90aHJlYWRzIHRvIGJlIHVzZWQgYnkgdGhlIGNvZGVjICovCisgICAgc2V0TnVtQ29yZXMoKTsKKworICAgIC8qIEdldCBjb2RlYyB2ZXJzaW9uICovCisgICAgbG9nVmVyc2lvbigpOworCisgICAgLyogQWxsb2NhdGUgaW50ZXJuYWwgcGljdHVyZSBidWZmZXIgKi8KKyAgICB1aW50MzJfdCBidWZmZXJTaXplID0gZGlzcGxheVNpemVZICogMyAvIDI7CisgICAgbUZsdXNoT3V0QnVmZmVyID0gKHVpbnQ4X3QgKilpdmRfYWxpZ25lZF9tYWxsb2MoMTI4LCBidWZmZXJTaXplKTsKKyAgICBpZiAoTlVMTCA9PSBtRmx1c2hPdXRCdWZmZXIpIHsKKyAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBhbGxvY2F0ZSBmbHVzaE91dHB1dEJ1ZmZlciBvZiBzaXplICV6dSIsIGJ1ZmZlclNpemUpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIG1Jbml0TmVlZGVkID0gZmFsc2U7CisgICAgbUZsdXNoTmVlZGVkID0gZmFsc2U7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTb2Z0TVBFRzI6OmRlSW5pdERlY29kZXIoKSB7CisgICAgc2l6ZV90IGk7CisKKyAgICBpZiAobU1lbVJlY29yZHMpIHsKKyAgICAgICAgaXZfbWVtX3JlY190ICpwc19tZW1fcmVjOworCisgICAgICAgIHBzX21lbV9yZWMgPSBtTWVtUmVjb3JkczsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG1OdW1NZW1SZWNvcmRzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChwc19tZW1fcmVjLT5wdl9iYXNlKSB7CisgICAgICAgICAgICAgICAgaXZkX2FsaWduZWRfZnJlZShwc19tZW1fcmVjLT5wdl9iYXNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBzX21lbV9yZWMrKzsKKyAgICAgICAgfQorICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKG1NZW1SZWNvcmRzKTsKKyAgICAgICAgbU1lbVJlY29yZHMgPSBOVUxMOworICAgIH0KKworICAgIGlmIChtRmx1c2hPdXRCdWZmZXIpIHsKKyAgICAgICAgaXZkX2FsaWduZWRfZnJlZShtRmx1c2hPdXRCdWZmZXIpOworICAgICAgICBtRmx1c2hPdXRCdWZmZXIgPSBOVUxMOworICAgIH0KKworICAgIG1Jbml0TmVlZGVkID0gdHJ1ZTsKKyAgICBtQ2hhbmdpbmdSZXNvbHV0aW9uID0gZmFsc2U7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFNvZnRNUEVHMjo6cmVJbml0RGVjb2RlcigpIHsKKyAgICBzdGF0dXNfdCByZXQ7CisKKyAgICBkZUluaXREZWNvZGVyKCk7CisKKyAgICByZXQgPSBpbml0RGVjb2RlcigpOworICAgIGlmIChPSyAhPSByZXQpIHsKKyAgICAgICAgQUxPR0UoIkNyZWF0ZSBmYWlsdXJlIik7CisgICAgICAgIGRlSW5pdERlY29kZXIoKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIFNvZnRNUEVHMjo6b25SZXNldCgpIHsKKyAgICBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpvblJlc2V0KCk7CisKKyAgICBtV2FpdEZvckkgPSB0cnVlOworCisgICAgcmVzZXREZWNvZGVyKCk7CisgICAgcmVzZXRQbHVnaW4oKTsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0TVBFRzI6OmludGVybmFsU2V0UGFyYW1ldGVyKE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKSB7CisgICAgY29uc3QgdWludDMyX3Qgb2xkV2lkdGggPSBtV2lkdGg7CisgICAgY29uc3QgdWludDMyX3Qgb2xkSGVpZ2h0ID0gbUhlaWdodDsKKyAgICBPTVhfRVJST1JUWVBFIHJldCA9IFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OmludGVybmFsU2V0UGFyYW1ldGVyKGluZGV4LCBwYXJhbXMpOworICAgIGlmIChtV2lkdGggIT0gb2xkV2lkdGggfHwgbUhlaWdodCAhPSBvbGRIZWlnaHQpIHsKKyAgICAgICAgcmVJbml0RGVjb2RlcigpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIFNvZnRNUEVHMjo6c2V0RGVjb2RlQXJncygKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNfaXAsCisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjX29wLAorICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIsCisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIsCisgICAgICAgIHNpemVfdCB0aW1lU3RhbXBJeCkgeworICAgIHNpemVfdCBzaXplWSA9IG91dHB1dEJ1ZmZlcldpZHRoKCkgKiBvdXRwdXRCdWZmZXJIZWlnaHQoKTsKKyAgICBzaXplX3Qgc2l6ZVVWOworICAgIHVpbnQ4X3QgKnBCdWY7CisKKyAgICBwc19kZWNfaXAtPnU0X3NpemUgPSBzaXplb2YoaXZkX3ZpZGVvX2RlY29kZV9pcF90KTsKKyAgICBwc19kZWNfb3AtPnU0X3NpemUgPSBzaXplb2YoaXZkX3ZpZGVvX2RlY29kZV9vcF90KTsKKworICAgIHBzX2RlY19pcC0+ZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0RFQ09ERTsKKworICAgIC8qIFdoZW4gaW4gZmx1c2ggYW5kIGFmdGVyIEVPUyB3aXRoIHplcm8gYnl0ZSBpbnB1dCwKKyAgICAgKiBpbkhlYWRlciBpcyBzZXQgdG8gemVyby4gSGVuY2UgY2hlY2sgZm9yIG5vbi1udWxsICovCisgICAgaWYgKGluSGVhZGVyKSB7CisgICAgICAgIHBzX2RlY19pcC0+dTRfdHMgPSB0aW1lU3RhbXBJeDsKKyAgICAgICAgcHNfZGVjX2lwLT5wdl9zdHJlYW1fYnVmZmVyID0gaW5IZWFkZXItPnBCdWZmZXIKKyAgICAgICAgICAgICAgICArIGluSGVhZGVyLT5uT2Zmc2V0OworICAgICAgICBwc19kZWNfaXAtPnU0X251bV9CeXRlcyA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOworICAgIH0gZWxzZSB7CisgICAgICAgIHBzX2RlY19pcC0+dTRfdHMgPSAwOworICAgICAgICBwc19kZWNfaXAtPnB2X3N0cmVhbV9idWZmZXIgPSBOVUxMOworICAgICAgICBwc19kZWNfaXAtPnU0X251bV9CeXRlcyA9IDA7CisgICAgfQorCisgICAgaWYgKG91dEhlYWRlcikgeworICAgICAgICBwQnVmID0gb3V0SGVhZGVyLT5wQnVmZmVyOworICAgIH0gZWxzZSB7CisgICAgICAgIHBCdWYgPSBtRmx1c2hPdXRCdWZmZXI7CisgICAgfQorCisgICAgc2l6ZVVWID0gc2l6ZVkgLyA0OworICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMF0gPSBzaXplWTsKKyAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzFdID0gc2l6ZVVWOworICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMl0gPSBzaXplVVY7CisKKyAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1swXSA9IHBCdWY7CisgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMV0gPSBwQnVmICsgc2l6ZVk7CisgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMl0gPSBwQnVmICsgc2l6ZVkgKyBzaXplVVY7CisgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIudTRfbnVtX2J1ZnMgPSAzOworICAgIHJldHVybjsKK30KK3ZvaWQgU29mdE1QRUcyOjpvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCkgeworICAgIC8qIE9uY2UgdGhlIG91dHB1dCBidWZmZXJzIGFyZSBmbHVzaGVkLCBpZ25vcmUgYW55IGJ1ZmZlcnMgdGhhdCBhcmUgaGVsZCBpbiBkZWNvZGVyICovCisgICAgaWYgKGtPdXRwdXRQb3J0SW5kZXggPT0gcG9ydEluZGV4KSB7CisgICAgICAgIHNldEZsdXNoTW9kZSgpOworCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNfaXA7CisgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNfb3A7CisgICAgICAgICAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXM7CisgICAgICAgICAgICBzaXplX3Qgc2l6ZVksIHNpemVVVjsKKworICAgICAgICAgICAgc2V0RGVjb2RlQXJncygmc19kZWNfaXAsICZzX2RlY19vcCwgTlVMTCwgTlVMTCwgMCk7CisKKyAgICAgICAgICAgIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICh2b2lkICopJnNfZGVjX2lwLCAodm9pZCAqKSZzX2RlY19vcCk7CisgICAgICAgICAgICBpZiAoMCA9PSBzX2RlY19vcC51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgICAgIHJlc2V0UGx1Z2luKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgU29mdE1QRUcyOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7CisgICAgVU5VU0VEKHBvcnRJbmRleCk7CisKKyAgICBpZiAobU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSAhPSBOT05FKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJmluUXVldWUgPSBnZXRQb3J0UXVldWUoa0lucHV0UG9ydEluZGV4KTsKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKGtPdXRwdXRQb3J0SW5kZXgpOworCisgICAgLyogSWYgaW5wdXQgRU9TIGlzIHNlZW4gYW5kIGRlY29kZXIgaXMgbm90IGluIGZsdXNoIG1vZGUsCisgICAgICogc2V0IHRoZSBkZWNvZGVyIGluIGZsdXNoIG1vZGUuCisgICAgICogVGhlcmUgY2FuIGJlIGEgY2FzZSB3aGVyZSBFT1MgaXMgc2VudCBhbG9uZyB3aXRoIGxhc3QgcGljdHVyZSBkYXRhCisgICAgICogSW4gdGhhdCBjYXNlLCBvbmx5IGFmdGVyIGRlY29kaW5nIHRoYXQgaW5wdXQgZGF0YSwgZGVjb2RlciBoYXMgdG8gYmUKKyAgICAgKiBwdXQgaW4gZmx1c2guIFRoaXMgY2FzZSBpcyBoYW5kbGVkIGhlcmUgICovCisKKyAgICBpZiAobVJlY2VpdmVkRU9TICYmICFtSXNJbkZsdXNoKSB7CisgICAgICAgIHNldEZsdXNoTW9kZSgpOworICAgIH0KKworICAgIHdoaWxlICghb3V0UXVldWUuZW1wdHkoKSkgeworICAgICAgICBCdWZmZXJJbmZvICppbkluZm87CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlcjsKKworICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvOworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyOworICAgICAgICBzaXplX3QgdGltZVN0YW1wSXg7CisKKyAgICAgICAgaW5JbmZvID0gTlVMTDsKKyAgICAgICAgaW5IZWFkZXIgPSBOVUxMOworCisgICAgICAgIGlmICghbUlzSW5GbHVzaCkgeworICAgICAgICAgICAgaWYgKCFpblF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOworICAgICAgICAgICAgICAgIGluSGVhZGVyID0gaW5JbmZvLT5tSGVhZGVyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG91dEluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKKyAgICAgICAgb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKKyAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSAwOworICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPSAwOworICAgICAgICBvdXRIZWFkZXItPm5PZmZzZXQgPSAwOworCisgICAgICAgIGlmIChpbkhlYWRlciAhPSBOVUxMICYmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSkgeworICAgICAgICAgICAgbVJlY2VpdmVkRU9TID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisgICAgICAgICAgICAgICAgaW5IZWFkZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIHNldEZsdXNoTW9kZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gV2hlbiB0aGVyZSBpcyBhbiBpbml0IHJlcXVpcmVkIGFuZCB0aGUgZGVjb2RlciBpcyBub3QgaW4gZmx1c2ggbW9kZSwKKyAgICAgICAgLy8gdXBkYXRlIG91dHB1dCBwb3J0J3MgZGVmaW5pdGlvbiBhbmQgcmVpbml0aWFsaXplIGRlY29kZXIuCisgICAgICAgIGlmIChtSW5pdE5lZWRlZCAmJiAhbUlzSW5GbHVzaCkgeworICAgICAgICAgICAgYm9vbCBwb3J0V2lsbFJlc2V0ID0gZmFsc2U7CisgICAgICAgICAgICBoYW5kbGVQb3J0U2V0dGluZ3NDaGFuZ2UoJnBvcnRXaWxsUmVzZXQsIG1OZXdXaWR0aCwgbU5ld0hlaWdodCk7CisKKyAgICAgICAgICAgIENIRUNLX0VRKHJlSW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEdldCBhIGZyZWUgc2xvdCBpbiB0aW1lc3RhbXAgYXJyYXkgdG8gaG9sZCBpbnB1dCB0aW1lc3RhbXAgKi8KKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZV90IGk7CisgICAgICAgICAgICB0aW1lU3RhbXBJeCA9IDA7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1RJTUVfU1RBTVBTOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1UaW1lU3RhbXBzVmFsaWRbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgdGltZVN0YW1wSXggPSBpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5IZWFkZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1UaW1lU3RhbXBzVmFsaWRbdGltZVN0YW1wSXhdID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtVGltZVN0YW1wc1t0aW1lU3RhbXBJeF0gPSBpbkhlYWRlci0+blRpbWVTdGFtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY19pcDsKKyAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY19vcDsKKyAgICAgICAgICAgIFdPUkQzMiB0aW1lRGVsYXksIHRpbWVUYWtlbjsKKyAgICAgICAgICAgIHNpemVfdCBzaXplWSwgc2l6ZVVWOworCisgICAgICAgICAgICBzZXREZWNvZGVBcmdzKCZzX2RlY19pcCwgJnNfZGVjX29wLCBpbkhlYWRlciwgb3V0SGVhZGVyLCB0aW1lU3RhbXBJeCk7CisgICAgICAgICAgICAvLyBJZiBpbnB1dCBkdW1wIGlzIGVuYWJsZWQsIHRoZW4gd3JpdGUgdG8gZmlsZQorICAgICAgICAgICAgRFVNUF9UT19GSUxFKG1JbkZpbGUsIHNfZGVjX2lwLnB2X3N0cmVhbV9idWZmZXIsIHNfZGVjX2lwLnU0X251bV9CeXRlcyk7CisKKyAgICAgICAgICAgIGlmIChzX2RlY19pcC51NF9udW1fQnl0ZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgY2hhciAqcHRyID0gKGNoYXIgKilzX2RlY19pcC5wdl9zdHJlYW1fYnVmZmVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBOVUxMKTsKKyAgICAgICAgICAgIC8qIENvbXB1dGUgdGltZSBlbGFwc2VkIGJldHdlZW4gZW5kIG9mIHByZXZpb3VzIGRlY29kZSgpCisgICAgICAgICAgICAgKiB0byBzdGFydCBvZiBjdXJyZW50IGRlY29kZSgpICovCisgICAgICAgICAgICBUSU1FX0RJRkYobVRpbWVFbmQsIG1UaW1lU3RhcnQsIHRpbWVEZWxheSk7CisKKyAgICAgICAgICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1czsKKyAgICAgICAgICAgIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICh2b2lkICopJnNfZGVjX2lwLCAodm9pZCAqKSZzX2RlY19vcCk7CisKKyAgICAgICAgICAgIGJvb2wgdW5zdXBwb3J0ZWREaW1lbnNpb25zID0gKElNUEVHMkRfVU5TVVBQT1JURURfRElNRU5TSU9OUyA9PSBzX2RlY19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIGJvb2wgcmVzQ2hhbmdlZCA9IChJVkRfUkVTX0NIQU5HRUQgPT0gKHNfZGVjX29wLnU0X2Vycm9yX2NvZGUgJiAweEZGKSk7CisKKyAgICAgICAgICAgIEdFVFRJTUUoJm1UaW1lRW5kLCBOVUxMKTsKKyAgICAgICAgICAgIC8qIENvbXB1dGUgdGltZSB0YWtlbiBmb3IgZGVjb2RlKCkgKi8KKyAgICAgICAgICAgIFRJTUVfRElGRihtVGltZVN0YXJ0LCBtVGltZUVuZCwgdGltZVRha2VuKTsKKworICAgICAgICAgICAgQUxPR1YoInRpbWVUYWtlbj0lNmQgZGVsYXk9JTZkIG51bUJ5dGVzPSU2ZCIsIHRpbWVUYWtlbiwgdGltZURlbGF5LAorICAgICAgICAgICAgICAgICAgIHNfZGVjX29wLnU0X251bV9ieXRlc19jb25zdW1lZCk7CisgICAgICAgICAgICBpZiAoc19kZWNfb3AudTRfZnJhbWVfZGVjb2RlZF9mbGFnICYmICFtRmx1c2hOZWVkZWQpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hOZWVkZWQgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKGluSGVhZGVyICE9IE5VTEwpICYmICgxICE9IHNfZGVjX29wLnU0X2ZyYW1lX2RlY29kZWRfZmxhZykpIHsKKyAgICAgICAgICAgICAgICAvKiBJZiB0aGUgaW5wdXQgZGlkIG5vdCBjb250YWluIHBpY3R1cmUgZGF0YSwgdGhlbiBpZ25vcmUKKyAgICAgICAgICAgICAgICAgKiB0aGUgYXNzb2NpYXRlZCB0aW1lc3RhbXAgKi8KKyAgICAgICAgICAgICAgICBtVGltZVN0YW1wc1ZhbGlkW3RpbWVTdGFtcEl4XSA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBoYW5kbGUgQ1RTIERlY29kZXJUZXN0IHRlc3RDb2RlY1Jlc2V0c01QRUcyV2l0aG91dFN1cmZhY2UsCisgICAgICAgICAgICAvLyB3aGljaCBpcyBub3Qgc2VuZGluZyBTUFMvUFBTIGFmdGVyIHBvcnQgcmVjb25maWd1cmF0aW9uIGFuZCBmbHVzaCB0byB0aGUgY29kZWMuCisgICAgICAgICAgICBpZiAodW5zdXBwb3J0ZWREaW1lbnNpb25zICYmICFtRmx1c2hOZWVkZWQpIHsKKyAgICAgICAgICAgICAgICBib29sIHBvcnRXaWxsUmVzZXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBoYW5kbGVQb3J0U2V0dGluZ3NDaGFuZ2UoJnBvcnRXaWxsUmVzZXQsIHNfZGVjX29wLnU0X3BpY193ZCwgc19kZWNfb3AudTRfcGljX2h0KTsKKworICAgICAgICAgICAgICAgIENIRUNLX0VRKHJlSW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKKworICAgICAgICAgICAgICAgIHNldERlY29kZUFyZ3MoJnNfZGVjX2lwLCAmc19kZWNfb3AsIGluSGVhZGVyLCBvdXRIZWFkZXIsIHRpbWVTdGFtcEl4KTsKKworICAgICAgICAgICAgICAgIGl2ZGVjX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICh2b2lkICopJnNfZGVjX2lwLCAodm9pZCAqKSZzX2RlY19vcCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiB0aGUgZGVjb2RlciBpcyBpbiB0aGUgY2hhbmdpbmcgcmVzb2x1dGlvbiBtb2RlIGFuZCB0aGVyZSBpcyBubyBvdXRwdXQgcHJlc2VudCwKKyAgICAgICAgICAgIC8vIHRoYXQgbWVhbnMgdGhlIHN3aXRjaGluZyBpcyBkb25lIGFuZCBpdCdzIHJlYWR5IHRvIHJlc2V0IHRoZSBkZWNvZGVyIGFuZCB0aGUgcGx1Z2luLgorICAgICAgICAgICAgaWYgKG1DaGFuZ2luZ1Jlc29sdXRpb24gJiYgIXNfZGVjX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICAgICAgbUNoYW5naW5nUmVzb2x1dGlvbiA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJlc2V0RGVjb2RlcigpOworICAgICAgICAgICAgICAgIHJlc2V0UGx1Z2luKCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh1bnN1cHBvcnRlZERpbWVuc2lvbnMgfHwgcmVzQ2hhbmdlZCkgeworICAgICAgICAgICAgICAgIG1DaGFuZ2luZ1Jlc29sdXRpb24gPSB0cnVlOworICAgICAgICAgICAgICAgIGlmIChtRmx1c2hOZWVkZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0Rmx1c2hNb2RlKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHVuc3VwcG9ydGVkRGltZW5zaW9ucykgeworICAgICAgICAgICAgICAgICAgICBtTmV3V2lkdGggPSBzX2RlY19vcC51NF9waWNfd2Q7CisgICAgICAgICAgICAgICAgICAgIG1OZXdIZWlnaHQgPSBzX2RlY19vcC51NF9waWNfaHQ7CisgICAgICAgICAgICAgICAgICAgIG1Jbml0TmVlZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoMCA8IHNfZGVjX29wLnU0X3BpY193ZCkgJiYgKDAgPCBzX2RlY19vcC51NF9waWNfaHQpKSB7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgd2lkdGggPSBzX2RlY19vcC51NF9waWNfd2Q7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0ID0gc19kZWNfb3AudTRfcGljX2h0OworICAgICAgICAgICAgICAgIGJvb2wgcG9ydFdpbGxSZXNldCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZSgmcG9ydFdpbGxSZXNldCwgd2lkdGgsIGhlaWdodCk7CisKKyAgICAgICAgICAgICAgICBpZiAocG9ydFdpbGxSZXNldCkgeworICAgICAgICAgICAgICAgICAgICByZXNldERlY29kZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNfZGVjX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IHRpbWVTdGFtcElkeDsKKyAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAobVdpZHRoICogbUhlaWdodCAqIDMpIC8gMjsKKworICAgICAgICAgICAgICAgIHRpbWVTdGFtcElkeCA9IGdldE1pblRpbWVzdGFtcElkeChtVGltZVN0YW1wcywgbVRpbWVTdGFtcHNWYWxpZCk7CisgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gbVRpbWVTdGFtcHNbdGltZVN0YW1wSWR4XTsKKyAgICAgICAgICAgICAgICBtVGltZVN0YW1wc1ZhbGlkW3RpbWVTdGFtcElkeF0gPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIC8qIG1XYWl0Rm9ySSB3YWl0cyBmb3IgdGhlIGZpcnN0IEkgcGljdHVyZS4gT25jZSBtYWRlIEZBTFNFLCBpdAorICAgICAgICAgICAgICAgICAgIGhhcyB0byByZW1haW4gZmFsc2UgdGlsbCBleHBsaWNpdGx5IHNldCB0byBUUlVFLiAqLworICAgICAgICAgICAgICAgIG1XYWl0Rm9ySSA9IG1XYWl0Rm9ySSAmJiAhKElWX0lfRlJBTUUgPT0gc19kZWNfb3AuZV9waWNfdHlwZSk7CisKKyAgICAgICAgICAgICAgICBpZiAobVdhaXRGb3JJKSB7CisgICAgICAgICAgICAgICAgICAgIHNfZGVjX29wLnU0X291dHB1dF9wcmVzZW50ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIk91dHB1dCB0aW1lc3RhbXA6ICVsbGQsIHJlczogJXV4JXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpb3V0SGVhZGVyLT5uVGltZVN0YW1wLCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgICAgICAgICBEVU1QX1RPX0ZJTEUobU91dEZpbGUsIG91dEhlYWRlci0+cEJ1ZmZlciwgb3V0SGVhZGVyLT5uRmlsbGVkTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0SW5mbyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisgICAgICAgICAgICAgICAgICAgIG91dEhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBJZiBpbiBmbHVzaCBtb2RlIGFuZCBubyBvdXRwdXQgaXMgcmV0dXJuZWQgYnkgdGhlIGNvZGVjLAorICAgICAgICAgICAgICAgICAqIHRoZW4gY29tZSBvdXQgb2YgZmx1c2ggbW9kZSAqLworICAgICAgICAgICAgICAgIG1Jc0luRmx1c2ggPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIC8qIElmIEVPUyB3YXMgcmVjaWV2ZWQgb24gaW5wdXQgcG9ydCBhbmQgdGhlcmUgaXMgbm8gb3V0cHV0CisgICAgICAgICAgICAgICAgICogZnJvbSB0aGUgY29kZWMsIHRoZW4gc2lnbmFsIEVPUyBvbiBvdXRwdXQgcG9ydCAqLworICAgICAgICAgICAgICAgIGlmIChtUmVjZWl2ZWRFT1MpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfRU9TOworCisgICAgICAgICAgICAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICAgICAgICAgIG91dEluZm8gPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOworICAgICAgICAgICAgICAgICAgICBvdXRIZWFkZXIgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICByZXNldFBsdWdpbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IEhhbmRsZSBtb3JlIHRoYW4gb25lIHBpY3R1cmUgZGF0YQorICAgICAgICBpZiAoaW5IZWFkZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICBpbkluZm8gPSBOVUxMOworICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKyAgICAgICAgICAgIGluSGVhZGVyID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworYW5kcm9pZDo6U29mdE9NWENvbXBvbmVudCAqY3JlYXRlU29mdE9NWENvbXBvbmVudCgKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLCBPTVhfUFRSIGFwcERhdGEsCisgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KSB7CisgICAgcmV0dXJuIG5ldyBhbmRyb2lkOjpTb2Z0TVBFRzIobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL1NvZnRNUEVHMi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL1NvZnRNUEVHMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MjVlMDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvU29mdE1QRUcyLmgKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU09GVF9NUEVHMl9IXworCisjZGVmaW5lIFNPRlRfTVBFRzJfSF8KKworI2luY2x1ZGUgIlNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNkZWZpbmUgaXZkX2FsaWduZWRfbWFsbG9jKGFsaWdubWVudCwgc2l6ZSkgbWVtYWxpZ24oYWxpZ25tZW50LCBzaXplKQorI2RlZmluZSBpdmRfYWxpZ25lZF9mcmVlKGJ1ZikgZnJlZShidWYpCisKKy8qKiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgdGltZS1zdGFtcCBhcnJheSAqLworI2RlZmluZSBNQVhfVElNRV9TVEFNUFMgNjQKKworLyoqIE1heGltdW0gbnVtYmVyIG9mIGNvcmVzIHN1cHBvcnRlZCBieSB0aGUgY29kZWMgKi8KKyNkZWZpbmUgQ09ERUNfTUFYX05VTV9DT1JFUyA0CisKKyNkZWZpbmUgQ09ERUNfTUFYX1dJRFRIICAgICAxOTIwCisKKyNkZWZpbmUgQ09ERUNfTUFYX0hFSUdIVCAgICAxMDg4CisKKy8qKiBJbnB1dCBidWZmZXIgc2l6ZSAqLworI2RlZmluZSBJTlBVVF9CVUZfU0laRSAoMTAyNCAqIDEwMjQpCisKKyNkZWZpbmUgTUlOKGEsIGIpICgoYSkgPCAoYikpID8gKGEpIDogKGIpCisKKy8qKiBVc2VkIHRvIHJlbW92ZSB3YXJuaW5ncyBhYm91dCB1bnVzZWQgcGFyYW1ldGVycyAqLworI2RlZmluZSBVTlVTRUQoeCkgKCh2b2lkKSh4KSkKKworLyoqIEdldCB0aW1lICovCisjZGVmaW5lIEdFVFRJTUUoYSwgYikgZ2V0dGltZW9mZGF5KGEsIGIpOworCisvKiogQ29tcHV0ZSBkaWZmZXJlbmNlIGJldHdlZW4gc3RhcnQgYW5kIGVuZCAqLworI2RlZmluZSBUSU1FX0RJRkYoc3RhcnQsIGVuZCwgZGlmZikgXAorICAgIGRpZmYgPSAoKGVuZC50dl9zZWMgLSBzdGFydC50dl9zZWMpICogMTAwMDAwMCkgKyBcCisgICAgICAgICAgICAoZW5kLnR2X3VzZWMgLSBzdGFydC50dl91c2VjKTsKKworc3RydWN0IFNvZnRNUEVHMiA6IHB1YmxpYyBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50IHsKKyAgICBTb2Z0TVBFRzIoCisgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCisgICAgICAgICAgICBPTVhfUFRSIGFwcERhdGEsIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflNvZnRNUEVHMigpOworCisgICAgdmlydHVhbCB2b2lkIG9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpOworICAgIHZpcnR1YWwgdm9pZCBvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCk7CisgICAgdmlydHVhbCB2b2lkIG9uUmVzZXQoKTsKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRQYXJhbWV0ZXIoT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpOworcHJpdmF0ZToKKyAgICAvLyBOdW1iZXIgb2YgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzCisgICAgZW51bSB7CisgICAgICAgIGtOdW1CdWZmZXJzID0gOAorICAgIH07CisKKyAgICBpdl9vYmpfdCAqbUNvZGVjQ3R4OyAgICAgICAgIC8vIENvZGVjIGNvbnRleHQKKyAgICBpdl9tZW1fcmVjX3QgKm1NZW1SZWNvcmRzOyAgIC8vIE1lbW9yeSByZWNvcmRzIHJlcXVlc3RlZCBieSB0aGUgY29kZWMKKyAgICBzaXplX3QgbU51bU1lbVJlY29yZHM7ICAgICAgIC8vIE51bWJlciBvZiBtZW1vcnkgcmVjb3JkcyByZXF1ZXN0ZWQgYnkgdGhlIGNvZGVjCisKKyAgICBzaXplX3QgbU51bUNvcmVzOyAgICAgICAgICAgIC8vIE51bWJlciBvZiBjb3JlcyB0byBiZSB1ZXNkIGJ5IHRoZSBjb2RlYworCisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVTdGFydDsgICAvLyBUaW1lIGF0IHRoZSBzdGFydCBvZiBkZWNvZGUoKQorICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lRW5kOyAgICAgLy8gVGltZSBhdCB0aGUgZW5kIG9mIGRlY29kZSgpCisKKyAgICAvLyBJbnRlcm5hbCBidWZmZXIgdG8gYmUgdXNlZCB0byBmbHVzaCBvdXQgdGhlIGJ1ZmZlcnMgZnJvbSBkZWNvZGVyCisgICAgdWludDhfdCAqbUZsdXNoT3V0QnVmZmVyOworCisgICAgLy8gU3RhdHVzIG9mIGVudHJpZXMgaW4gdGhlIHRpbWVzdGFtcCBhcnJheQorICAgIGJvb2wgbVRpbWVTdGFtcHNWYWxpZFtNQVhfVElNRV9TVEFNUFNdOworCisgICAgLy8gVGltZXN0YW1wIGFycmF5IC0gU2luY2UgY29kZWMgZG9lcyBub3QgdGFrZSA2NCBiaXQgdGltZXN0YW1wcywKKyAgICAvLyB0aGV5IGFyZSBtYWludGFpbmVkIGluIHRoZSBwbHVnaW4KKyAgICBPTVhfUzY0IG1UaW1lU3RhbXBzW01BWF9USU1FX1NUQU1QU107CisKKyNpZmRlZiBGSUxFX0RVTVBfRU5BQkxFCisgICAgY2hhciBtSW5GaWxlWzIwMF07CisjZW5kaWYgLyogRklMRV9EVU1QX0VOQUJMRSAqLworCisgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgbU9teENvbG9yRm9ybWF0OyAgICAvLyBPTVggQ29sb3IgZm9ybWF0CisgICAgSVZfQ09MT1JfRk9STUFUX1QgbUl2Q29sb3JGb3JtYXQ7ICAgICAgICAvLyBJdHRpYW0gQ29sb3IgZm9ybWF0CisKKyAgICBib29sIG1Jc0luRmx1c2g7ICAgICAgICAvLyBjb2RlYyBpcyBmbHVzaCBtb2RlCisgICAgYm9vbCBtUmVjZWl2ZWRFT1M7ICAgICAgLy8gRU9TIGlzIHJlY2VpZXZlZCBvbiBpbnB1dCBwb3J0CisgICAgYm9vbCBtSW5pdE5lZWRlZDsKKyAgICB1aW50MzJfdCBtTmV3V2lkdGg7CisgICAgdWludDMyX3QgbU5ld0hlaWdodDsKKyAgICAvLyBUaGUgaW5wdXQgc3RyZWFtIGhhcyBjaGFuZ2VkIHRvIGEgZGlmZmVyZW50IHJlc29sdXRpb24sIHdoaWNoIGlzIHN0aWxsIHN1cHBvcnRlZCBieSB0aGUKKyAgICAvLyBjb2RlYy4gU28gdGhlIGNvZGVjIGlzIHN3aXRjaGluZyB0byBkZWNvZGUgdGhlIG5ldyByZXNvbHV0aW9uLgorICAgIGJvb2wgbUNoYW5naW5nUmVzb2x1dGlvbjsKKyAgICBib29sIG1GbHVzaE5lZWRlZDsKKyAgICBib29sIG1XYWl0Rm9ySTsKKworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgc3RhdHVzX3QgZGVJbml0RGVjb2RlcigpOworICAgIHN0YXR1c190IHNldEZsdXNoTW9kZSgpOworICAgIHN0YXR1c190IHNldFBhcmFtcyhzaXplX3Qgc3RyaWRlKTsKKyAgICB2b2lkIGxvZ1ZlcnNpb24oKTsKKyAgICBzdGF0dXNfdCBzZXROdW1Db3JlcygpOworICAgIHN0YXR1c190IHJlc2V0RGVjb2RlcigpOworICAgIHN0YXR1c190IHJlc2V0UGx1Z2luKCk7CisgICAgc3RhdHVzX3QgcmVJbml0RGVjb2RlcigpOworCisgICAgdm9pZCBzZXREZWNvZGVBcmdzKAorICAgICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNfaXAsCisgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3QgKnBzX2RlY19vcCwKKyAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciwKKyAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIsCisgICAgICAgICAgICBzaXplX3QgdGltZVN0YW1wSXgpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdE1QRUcyKTsKK307CisKKyNpZmRlZiBGSUxFX0RVTVBfRU5BQkxFCisKKyNkZWZpbmUgSU5QVVRfRFVNUF9QQVRIICAgICAiL3NkY2FyZC9tZWRpYS9tcGVnMmRfaW5wdXQiCisjZGVmaW5lIElOUFVUX0RVTVBfRVhUICAgICAgIm0ydiIKKworI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdHJjcHkobUluRmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNwcmludGYobUluRmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBJTlBVVF9EVU1QX1BBVEgsICBcCisgICAgICAgICAgICBtVGltZVN0YXJ0LnR2X3NlYywgbVRpbWVTdGFydC50dl91c2VjLCAgICAgIFwKKyAgICAgICAgICAgIElOUFVUX0RVTVBfRVhUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICBGSUxFICpmcCA9IGZvcGVuKG1fZmlsZW5hbWUsICJ3YiIpOyAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmcCAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBTE9HRCgiQ291bGQgbm90IG9wZW4gZmlsZSAlcyIsIG1fZmlsZW5hbWUpOyAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNkZWZpbmUgRFVNUF9UT19GSUxFKG1fZmlsZW5hbWUsIG1fYnVmLCBtX3NpemUpICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRklMRSAqZnAgPSBmb3BlbihtX2ZpbGVuYW1lLCAiYWIiKTsgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZnAgIT0gTlVMTCAmJiBtX2J1ZiAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGkgPSBmd3JpdGUobV9idWYsIDEsIG1fc2l6ZSwgZnApOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoImZ3cml0ZSByZXQgJWQgdG8gd3JpdGUgJWQiLCBpLCBtX3NpemUpOyAgXAorICAgICAgICBpZiAoaSAhPSAoaW50KW1fc2l6ZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiRXJyb3IgaW4gZndyaXRlLCByZXR1cm5lZCAlZCIsIGkpOyAgIFwKKyAgICAgICAgICAgIHBlcnJvcigiRXJyb3IgaW4gd3JpdGUgdG8gZmlsZSIpOyAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBTE9HRCgiQ291bGQgbm90IHdyaXRlIHRvIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTtcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNlbHNlIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKyNkZWZpbmUgSU5QVVRfRFVNUF9QQVRICisjZGVmaW5lIElOUFVUX0RVTVBfRVhUCisjZGVmaW5lIE9VVFBVVF9EVU1QX1BBVEgKKyNkZWZpbmUgT1VUUFVUX0RVTVBfRVhUCisjZGVmaW5lIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKQorI2RlZmluZSBDUkVBVEVfRFVNUF9GSUxFKG1fZmlsZW5hbWUpCisjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplKQorI2VuZGlmIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFNPRlRfTVBFRzJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9BbmRyb2lkLm1rCmluZGV4IGUyNjUxMDQuLjI1M2ZhMDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvQW5kcm9pZC5tawpAQCAtNiw3ICs2LDYgQEAKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAgICAgICAgICQoVE9QKS9leHRlcm5hbC9saWJ2cHgvbGlidnB4IFwKLSAgICAgICAgJChUT1ApL2V4dGVybmFsL29wZW5zc2wvaW5jbHVkZSBcCiAgICAgICAgICQoVE9QKS9leHRlcm5hbC9saWJ2cHgvbGlidnB4L3ZweF9jb2RlYyBcCiAgICAgICAgICQoVE9QKS9leHRlcm5hbC9saWJ2cHgvbGlidnB4L3ZweF9wb3J0cyBcCiAgICAgICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9BbmRyb2lkLm1rCmluZGV4IGJmMDNhZDkuLmU2M2I2YjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9BbmRyb2lkLm1rCkBAIC05NCw2ICs5NCw4IEBACiAgICAgTE9DQUxfQ19JTkNMVURFUyArPSAkKExPQ0FMX1BBVEgpLy4vb214ZGwvYXJtX25lb24vYXBpIFwKICAgICAgICAgICAgICAgICAgICAgICAgICQoTE9DQUxfUEFUSCkvLi9vbXhkbC9hcm1fbmVvbi92Yy9hcGkgXAogICAgICAgICAgICAgICAgICAgICAgICAgJChMT0NBTF9QQVRIKS8uL29teGRsL2FybV9uZW9uL3ZjL200cDEwL2FwaQorICAgICMgaDI2NGJzZFdyaXRlTWFjcm9ibG9jay5TIGRvZXMgbm90IGNvbXBpbGUgd2l0aCBDbGFuZy4KKyAgICBMT0NBTF9DTEFOR19BU0ZMQUdTX2FybSArPSAtbm8taW50ZWdyYXRlZC1hcwogICBlbmRpZgogZW5kaWYKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL2luYy9IMjY0U3dEZWNBcGkuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9pbmMvSDI2NFN3RGVjQXBpLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL2luYy9iYXNldHlwZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL2luYy9iYXNldHlwZS5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0JpdERlY19zLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fQml0RGVjX3MuaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fQml0c3RyZWFtLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fQml0c3RyZWFtLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0lEQ1RUYWJsZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0lEQ1RUYWJsZS5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9JRENUX3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9JRENUX3MuaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fTWFza1RhYmxlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fTWFza1RhYmxlLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX1ZlcnNpb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9WZXJzaW9uLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9zLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1PTVguaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtT01YLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9vbXh0eXBlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9vbXh0eXBlcy5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvb214dHlwZXNfcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9vbXh0eXBlc19zLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU0uYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU1fQml0c3RyZWFtLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU1fQml0c3RyZWFtLmMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NX0lEQ1RUYWJsZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NX0lEQ1RUYWJsZS5jCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTV9NYXNrVGFibGUuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTV9NYXNrVGFibGUuYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvYXBpL2FybVZDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvYXBpL2FybVZDLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9hcm1WQ0NPTU1fcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9hcm1WQ0NPTU1fcy5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvb214VkMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvb214VkMuaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvYXBpL29teFZDX3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvb214VkNfcy5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9EZWNUZXN0QmVuY2guYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvRGVjVGVzdEJlbmNoLmMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9FdmFsdWF0aW9uVGVzdEJlbmNoLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL0V2YWx1YXRpb25UZXN0QmVuY2guYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL0gyNjRTd0RlY0FwaS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9IMjY0U3dEZWNBcGkuYwppbmRleCA1MjRhM2YwLi5hMDczZGNiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL0gyNjRTd0RlY0FwaS5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvSDI2NFN3RGVjQXBpLmMKQEAgLTM2LDYgKzM2LDcgQEAKICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSAiYmFzZXR5cGUuaCIKICNpbmNsdWRlICJoMjY0YnNkX2NvbnRhaW5lci5oIgogI2luY2x1ZGUgIkgyNjRTd0RlY0FwaS5oIgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9UZXN0QmVuY2hNdWx0aXBsZUluc3RhbmNlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL1Rlc3RCZW5jaE11bHRpcGxlSW5zdGFuY2UuYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfYnl0ZV9zdHJlYW0uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9ieXRlX3N0cmVhbS5jCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9ieXRlX3N0cmVhbS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2J5dGVfc3RyZWFtLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NhdmxjLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY2F2bGMuYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY2F2bGMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jYXZsYy5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jZmcuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jZmcuaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY29uY2VhbC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NvbmNlYWwuYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY29uY2VhbC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NvbmNlYWwuaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY29udGFpbmVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY29udGFpbmVyLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RlYmxvY2tpbmcuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kZWJsb2NraW5nLmMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RlYmxvY2tpbmcuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kZWJsb2NraW5nLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RwYi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RwYi5jCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kcGIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kcGIuaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW1hZ2UuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbWFnZS5jCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbWFnZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ltYWdlLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludGVyX3ByZWRpY3Rpb24uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRlcl9wcmVkaWN0aW9uLmMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludGVyX3ByZWRpY3Rpb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRlcl9wcmVkaWN0aW9uLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX25hbF91bml0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmFsX3VuaXQuYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmFsX3VuaXQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9uYWxfdW5pdC5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9uZWlnaGJvdXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9uZWlnaGJvdXIuYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmVpZ2hib3VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmVpZ2hib3VyLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19vcmRlcl9jbnQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfb3JkZXJfY250LmMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19vcmRlcl9jbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfb3JkZXJfY250LmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19wYXJhbV9zZXQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfcGFyYW1fc2V0LmMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19wYXJhbV9zZXQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfcGFyYW1fc2V0LmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3JlY29uc3RydWN0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcmVjb25zdHJ1Y3QuYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcmVjb25zdHJ1Y3QuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9yZWNvbnN0cnVjdC5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zZWkuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zZWkuYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2VpLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2VpLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NlcV9wYXJhbV9zZXQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2RhdGEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9kYXRhLmMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2RhdGEuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9kYXRhLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2dyb3VwX21hcC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2dyb3VwX21hcC5jCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9ncm91cF9tYXAuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9ncm91cF9tYXAuaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfaGVhZGVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfaGVhZGVyLmMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2hlYWRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2hlYWRlci5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zdG9yYWdlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RvcmFnZS5jCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zdG9yYWdlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RvcmFnZS5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zdHJlYW0uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zdHJlYW0uYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RyZWFtLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RyZWFtLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3RyYW5zZm9ybS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3RyYW5zZm9ybS5jCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF90cmFuc2Zvcm0uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF90cmFuc2Zvcm0uaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdXRpbC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3V0aWwuYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdXRpbC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3V0aWwuaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdmxjLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdmxjLmMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3ZsYy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3ZsYy5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF92dWkuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF92dWkuYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdnVpLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdnVpLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2F1ZGlvLnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9hdWRpby54bWwKaW5kZXggYTA2Njg0Yi4uYjk1N2IwYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2F1ZGlvLnhtbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYXVkaW8ueG1sCkBAIC0zOCwxMiArMzgsMTIgQEAKICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmc3MTEuYWxhdy5kZWNvZGVyIiB0eXBlPSJhdWRpby9nNzExLWFsYXciPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAtNDgwMDAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjY0MDAwIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuZzcxMS5tbGF3LmRlY29kZXIiIHR5cGU9ImF1ZGlvL2c3MTEtbWxhdyI+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMC00ODAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNjQwMDAiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS52b3JiaXMuZGVjb2RlciIgdHlwZT0iYXVkaW8vdm9yYmlzIj4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV92aWRlby54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfdmlkZW8ueG1sCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggN2U5ZmExOC4uNzQwZjk2YgotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfdmlkZW8ueG1sCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV92aWRlby54bWwKQEAgLTE2LDYgKzE2LDE1IEBACiAKIDxJbmNsdWRlZD4KICAgICA8RGVjb2RlcnM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUubXBlZzIuZGVjb2RlciIgdHlwZT0idmlkZW8vbXBlZzIiPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZU1haW4gOiBMZXZlbEhMIC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMTZ4MTYiIG1heD0iMTkyMHgxMDg4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTI0NDgwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0yMDAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUubXBlZzQuZGVjb2RlciIgdHlwZT0idmlkZW8vbXA0di1lcyI+CiAgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlU2ltcGxlIDogTGV2ZWwzIC0tPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjM1MngyODgiIC8+CkBAIC0zNCwxMiArNDMsMTIgQEAKICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuaDI2NC5kZWNvZGVyIiB0eXBlPSJ2aWRlby9hdmMiPgotICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZUJhc2VsaW5lIDogTGV2ZWw1MSAtLT4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIyMDQ4eDIwNDgiIC8+CisgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlSGlnaCA6IExldmVsNDEgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIxNngxNiIgbWF4PSIxOTIweDEwODgiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtOTgzMDQwIiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTQwMDAwMDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS0yNDQ4MDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMTIwMDAwMDAiIC8+CiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmhldmMuZGVjb2RlciIgdHlwZT0idmlkZW8vaGV2YyI+CkBAIC03OCwxMiArODcsMTIgQEAKICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMjgwMDAiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5oMjY0LmVuY29kZXIiIHR5cGU9InZpZGVvL2F2YyI+Ci0gICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlQmFzZWxpbmUgOiBMZXZlbDIgLS0+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIxNngxNiIgbWF4PSI4OTZ4ODk2IiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZUJhc2VsaW5lIDogTGV2ZWw0MSAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjE2eDE2IiBtYXg9IjE5MjB4MTA4OCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS0xMTg4MCIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0yMDAwMDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS0yNDQ4MDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMTIwMDAwMDAiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5tcGVnNC5lbmNvZGVyIiB0eXBlPSJ2aWRlby9tcDR2LWVzIj4KICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVDb3JlIDogTGV2ZWwyIC0tPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5jcHAKaW5kZXggZTBkYzc2OC4uMmQ1N2FlZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuY3BwCkBAIC0xNyw2ICsxNyw3IEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkFMb29wZXJSb3N0ZXIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiAjaW5jbHVkZSAiQUxvb3BlclJvc3Rlci5oIgogCkBAIC0yNiw2ICsyNyw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RhdGljIGJvb2wgdmVyYm9zZVN0YXRzID0gZmFsc2U7CisKIEFMb29wZXJSb3N0ZXI6OkFMb29wZXJSb3N0ZXIoKQogICAgIDogbU5leHRIYW5kbGVySUQoMSksCiAgICAgICBtTmV4dFJlcGx5SUQoMSkgewpAQCAtMTM2LDYgKzEzOSwxNyBAQAogICAgIH0KIAogICAgIGhhbmRsZXItPm9uTWVzc2FnZVJlY2VpdmVkKG1zZyk7CisgICAgaGFuZGxlci0+bU1lc3NhZ2VDb3VudGVyKys7CisKKyAgICBpZiAodmVyYm9zZVN0YXRzKSB7CisgICAgICAgIHVpbnQzMl90IHdoYXQgPSBtc2ctPndoYXQoKTsKKyAgICAgICAgc3NpemVfdCBpZHggPSBoYW5kbGVyLT5tTWVzc2FnZXMuaW5kZXhPZktleSh3aGF0KTsKKyAgICAgICAgaWYgKGlkeCA8IDApIHsKKyAgICAgICAgICAgIGhhbmRsZXItPm1NZXNzYWdlcy5hZGQod2hhdCwgMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBoYW5kbGVyLT5tTWVzc2FnZXMuZWRpdFZhbHVlQXQoaWR4KSsrOworICAgICAgICB9CisgICAgfQogfQogCiBzcDxBTG9vcGVyPiBBTG9vcGVyUm9zdGVyOjpmaW5kTG9vcGVyKEFMb29wZXI6OmhhbmRsZXJfaWQgaGFuZGxlcklEKSB7CkBAIC0xOTYsNCArMjEwLDcyIEBACiAgICAgbVJlcGxpZXNDb25kaXRpb24uYnJvYWRjYXN0KCk7CiB9CiAKK3N0YXRpYyB2b2lkIG1ha2VGb3VyQ0ModWludDMyX3QgZm91cmNjLCBjaGFyICpzKSB7CisgICAgc1swXSA9IChmb3VyY2MgPj4gMjQpICYgMHhmZjsKKyAgICBpZiAoc1swXSkgeworICAgICAgICBzWzFdID0gKGZvdXJjYyA+PiAxNikgJiAweGZmOworICAgICAgICBzWzJdID0gKGZvdXJjYyA+PiA4KSAmIDB4ZmY7CisgICAgICAgIHNbM10gPSBmb3VyY2MgJiAweGZmOworICAgICAgICBzWzRdID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBzcHJpbnRmKHMsICIldSIsIGZvdXJjYyk7CisgICAgfQorfQorCit2b2lkIEFMb29wZXJSb3N0ZXI6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7CisgICAgYm9vbCBjbGVhciA9IGZhbHNlOworICAgIGJvb2wgb2xkVmVyYm9zZSA9IHZlcmJvc2VTdGF0czsKKyAgICBmb3IgKHNpemVfdCBpID0gMDtpIDwgYXJncy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoYXJnc1tpXSA9PSBTdHJpbmcxNigiLWMiKSkgeworICAgICAgICAgICAgY2xlYXIgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0gPT0gU3RyaW5nMTYoIi12b24iKSkgeworICAgICAgICAgICAgdmVyYm9zZVN0YXRzID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldID09IFN0cmluZzE2KCItdm9mZiIpKSB7CisgICAgICAgICAgICB2ZXJib3NlU3RhdHMgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBTdHJpbmc4IHM7CisgICAgaWYgKHZlcmJvc2VTdGF0cyAmJiAhb2xkVmVyYm9zZSkgeworICAgICAgICBzLmFwcGVuZCgiKHZlcmJvc2Ugc3RhdHMgY29sbGVjdGlvbiBlbmFibGVkLCBzdGF0cyB3aWxsIGJlIGNsZWFyZWQpXG4iKTsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHNpemVfdCBuID0gbUhhbmRsZXJzLnNpemUoKTsKKyAgICBzLmFwcGVuZEZvcm1hdCgiICV6ZCByZWdpc3RlcmVkIGhhbmRsZXJzOlxuIiwgbik7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBzLmFwcGVuZEZvcm1hdCgiICAlemQ6ICIsIGkpOworICAgICAgICBIYW5kbGVySW5mbyAmaW5mbyA9IG1IYW5kbGVycy5lZGl0VmFsdWVBdChpKTsKKyAgICAgICAgc3A8QUxvb3Blcj4gbG9vcGVyID0gaW5mby5tTG9vcGVyLnByb21vdGUoKTsKKyAgICAgICAgaWYgKGxvb3BlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBzLmFwcGVuZChsb29wZXItPm1OYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgc3A8QUhhbmRsZXI+IGhhbmRsZXIgPSBpbmZvLm1IYW5kbGVyLnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChoYW5kbGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBzLmFwcGVuZEZvcm1hdCgiOiAldSBtZXNzYWdlcyBwcm9jZXNzZWQiLCBoYW5kbGVyLT5tTWVzc2FnZUNvdW50ZXIpOworICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlU3RhdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBoYW5kbGVyLT5tTWVzc2FnZXMuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZm91cmNjWzE1XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VGb3VyQ0MoaGFuZGxlci0+bU1lc3NhZ2VzLmtleUF0KGopLCBmb3VyY2MpOworICAgICAgICAgICAgICAgICAgICAgICAgcy5hcHBlbmRGb3JtYXQoIlxuICAgICVzOiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdXJjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlci0+bU1lc3NhZ2VzLnZhbHVlQXQoaikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlci0+bU1lc3NhZ2VzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjbGVhciB8fCAodmVyYm9zZVN0YXRzICYmICFvbGRWZXJib3NlKSkgeworICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLT5tTWVzc2FnZUNvdW50ZXIgPSAwOworICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLT5tTWVzc2FnZXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHMuYXBwZW5kKCI6IDxzdGFsZSBoYW5kbGVyPiIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcy5hcHBlbmQoIjxzdGFsZT4iKTsKKyAgICAgICAgfQorICAgICAgICBzLmFwcGVuZCgiXG4iKTsKKyAgICB9CisgICAgd3JpdGUoZmQsIHMuc3RyaW5nKCksIHMuc2l6ZSgpKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5jcHAKaW5kZXggMjZiZWEyYy4uNDk0MmJhNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5jcHAKQEAgLTQyNiwxOSArNDI2LDE5IEBACiAKICAgICBBU3RyaW5nIHRtcDsKICAgICBpZiAoaXNGb3VyY2MobVdoYXQpKSB7Ci0gICAgICAgIHRtcCA9IFN0cmluZ1ByaW50ZigKKyAgICAgICAgdG1wID0gQVN0cmluZ1ByaW50ZigKICAgICAgICAgICAgICAgICAiJyVjJWMlYyVjJyIsCiAgICAgICAgICAgICAgICAgKGNoYXIpKG1XaGF0ID4+IDI0KSwKICAgICAgICAgICAgICAgICAoY2hhcikoKG1XaGF0ID4+IDE2KSAmIDB4ZmYpLAogICAgICAgICAgICAgICAgIChjaGFyKSgobVdoYXQgPj4gOCkgJiAweGZmKSwKICAgICAgICAgICAgICAgICAoY2hhcikobVdoYXQgJiAweGZmKSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgdG1wID0gU3RyaW5nUHJpbnRmKCIweCUwOHgiLCBtV2hhdCk7CisgICAgICAgIHRtcCA9IEFTdHJpbmdQcmludGYoIjB4JTA4eCIsIG1XaGF0KTsKICAgICB9CiAgICAgcy5hcHBlbmQodG1wKTsKIAogICAgIGlmIChtVGFyZ2V0ICE9IDApIHsKLSAgICAgICAgdG1wID0gU3RyaW5nUHJpbnRmKCIsIHRhcmdldCA9ICVkIiwgbVRhcmdldCk7CisgICAgICAgIHRtcCA9IEFTdHJpbmdQcmludGYoIiwgdGFyZ2V0ID0gJWQiLCBtVGFyZ2V0KTsKICAgICAgICAgcy5hcHBlbmQodG1wKTsKICAgICB9CiAgICAgcy5hcHBlbmQoIikgPSB7XG4iKTsKQEAgLTQ0OCwzNyArNDQ4LDM3IEBACiAKICAgICAgICAgc3dpdGNoIChpdGVtLm1UeXBlKSB7CiAgICAgICAgICAgICBjYXNlIGtUeXBlSW50MzI6Ci0gICAgICAgICAgICAgICAgdG1wID0gU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgIHRtcCA9IEFTdHJpbmdQcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICAiaW50MzJfdCAlcyA9ICVkIiwgaXRlbS5tTmFtZSwgaXRlbS51LmludDMyVmFsdWUpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBrVHlwZUludDY0OgotICAgICAgICAgICAgICAgIHRtcCA9IFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICB0bXAgPSBBU3RyaW5nUHJpbnRmKAogICAgICAgICAgICAgICAgICAgICAgICAgImludDY0X3QgJXMgPSAlbGxkIiwgaXRlbS5tTmFtZSwgaXRlbS51LmludDY0VmFsdWUpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBrVHlwZVNpemU6Ci0gICAgICAgICAgICAgICAgdG1wID0gU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgIHRtcCA9IEFTdHJpbmdQcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICAic2l6ZV90ICVzID0gJWQiLCBpdGVtLm1OYW1lLCBpdGVtLnUuc2l6ZVZhbHVlKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2Uga1R5cGVGbG9hdDoKLSAgICAgICAgICAgICAgICB0bXAgPSBTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgdG1wID0gQVN0cmluZ1ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgICJmbG9hdCAlcyA9ICVmIiwgaXRlbS5tTmFtZSwgaXRlbS51LmZsb2F0VmFsdWUpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBrVHlwZURvdWJsZToKLSAgICAgICAgICAgICAgICB0bXAgPSBTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgdG1wID0gQVN0cmluZ1ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgICJkb3VibGUgJXMgPSAlZiIsIGl0ZW0ubU5hbWUsIGl0ZW0udS5kb3VibGVWYWx1ZSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIGtUeXBlUG9pbnRlcjoKLSAgICAgICAgICAgICAgICB0bXAgPSBTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgdG1wID0gQVN0cmluZ1ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgICJ2b2lkIColcyA9ICVwIiwgaXRlbS5tTmFtZSwgaXRlbS51LnB0clZhbHVlKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2Uga1R5cGVTdHJpbmc6Ci0gICAgICAgICAgICAgICAgdG1wID0gU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgIHRtcCA9IEFTdHJpbmdQcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nICVzID0gXCIlc1wiIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnUuc3RyaW5nVmFsdWUtPmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBrVHlwZU9iamVjdDoKLSAgICAgICAgICAgICAgICB0bXAgPSBTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgdG1wID0gQVN0cmluZ1ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgICJSZWZCYXNlIColcyA9ICVwIiwgaXRlbS5tTmFtZSwgaXRlbS51LnJlZlZhbHVlKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2Uga1R5cGVCdWZmZXI6CkBAIC00ODYsMTggKzQ4NiwxOCBAQAogICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IHN0YXRpY19jYXN0PEFCdWZmZXIgKj4oaXRlbS51LnJlZlZhbHVlKTsKIAogICAgICAgICAgICAgICAgIGlmIChidWZmZXIgIT0gTlVMTCAmJiBidWZmZXItPmRhdGEoKSAhPSBOVUxMICYmIGJ1ZmZlci0+c2l6ZSgpIDw9IDY0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcCA9IFN0cmluZ1ByaW50ZigiQnVmZmVyICVzID0ge1xuIiwgaXRlbS5tTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IEFTdHJpbmdQcmludGYoIkJ1ZmZlciAlcyA9IHtcbiIsIGl0ZW0ubU5hbWUpOwogICAgICAgICAgICAgICAgICAgICBoZXhkdW1wKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSwgaW5kZW50ICsgNCwgJnRtcCk7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZEluZGVudCgmdG1wLCBpbmRlbnQgKyAyKTsKICAgICAgICAgICAgICAgICAgICAgdG1wLmFwcGVuZCgifSIpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcCA9IFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gQVN0cmluZ1ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQnVmZmVyIColcyA9ICVwIiwgaXRlbS5tTmFtZSwgYnVmZmVyLmdldCgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXNlIGtUeXBlTWVzc2FnZToKLSAgICAgICAgICAgICAgICB0bXAgPSBTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgdG1wID0gQVN0cmluZ1ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgICJBTWVzc2FnZSAlcyA9ICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBTWVzc2FnZSAqPigKQEAgLTUwNSw3ICs1MDUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKyBzdHJsZW4oaXRlbS5tTmFtZSkgKyAxNCkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIGtUeXBlUmVjdDoKLSAgICAgICAgICAgICAgICB0bXAgPSBTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgdG1wID0gQVN0cmluZ1ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgICJSZWN0ICVzKCVkLCAlZCwgJWQsICVkKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLm1OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS51LnJlY3RWYWx1ZS5tTGVmdCwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU5ldHdvcmtTZXNzaW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU5ldHdvcmtTZXNzaW9uLmNwcAppbmRleCA0NTA0YzJiLi5iMjMwNDAwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FOZXR3b3JrU2Vzc2lvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTmV0d29ya1Nlc3Npb24uY3BwCkBAIC0xODcsNyArMTg3LDcgQEAKICAgICAgICAgQ0hFQ0tfR0UocmVzLCAwKTsKIAogICAgICAgICBpbl9hZGRyX3QgYWRkciA9IG50b2hsKGxvY2FsQWRkci5zaW5fYWRkci5zX2FkZHIpOwotICAgICAgICBBU3RyaW5nIGxvY2FsQWRkclN0cmluZyA9IFN0cmluZ1ByaW50ZigKKyAgICAgICAgQVN0cmluZyBsb2NhbEFkZHJTdHJpbmcgPSBBU3RyaW5nUHJpbnRmKAogICAgICAgICAgICAgICAgICIlZC4lZC4lZC4lZCIsCiAgICAgICAgICAgICAgICAgKGFkZHIgPj4gMjQpLAogICAgICAgICAgICAgICAgIChhZGRyID4+IDE2KSAmIDB4ZmYsCkBAIC0xOTUsNyArMTk1LDcgQEAKICAgICAgICAgICAgICAgICBhZGRyICYgMHhmZik7CiAKICAgICAgICAgYWRkciA9IG50b2hsKHJlbW90ZUFkZHIuc2luX2FkZHIuc19hZGRyKTsKLSAgICAgICAgQVN0cmluZyByZW1vdGVBZGRyU3RyaW5nID0gU3RyaW5nUHJpbnRmKAorICAgICAgICBBU3RyaW5nIHJlbW90ZUFkZHJTdHJpbmcgPSBBU3RyaW5nUHJpbnRmKAogICAgICAgICAgICAgICAgICIlZC4lZC4lZC4lZCIsCiAgICAgICAgICAgICAgICAgKGFkZHIgPj4gMjQpLAogICAgICAgICAgICAgICAgIChhZGRyID4+IDE2KSAmIDB4ZmYsCkBAIC0zMDEsNyArMzAxLDcgQEAKICAgICAgICAgICAgICAgICB1aW50MzJfdCBpcCA9IG50b2hsKHJlbW90ZUFkZHIuc2luX2FkZHIuc19hZGRyKTsKICAgICAgICAgICAgICAgICBub3RpZnktPnNldFN0cmluZygKICAgICAgICAgICAgICAgICAgICAgICAgICJmcm9tQWRkciIsCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgICAgICAgICBBU3RyaW5nUHJpbnRmKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIldS4ldS4ldS4ldSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXAgPj4gMjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlwID4+IDE2KSAmIDB4ZmYsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmNwcAppbmRleCA5ODM1Y2EzLi5iMTY3NTQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5jcHAKQEAgLTM2Niw3ICszNjYsNyBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKLUFTdHJpbmcgU3RyaW5nUHJpbnRmKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSB7CitBU3RyaW5nIEFTdHJpbmdQcmludGYoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pIHsKICAgICB2YV9saXN0IGFwOwogICAgIHZhX3N0YXJ0KGFwLCBmb3JtYXQpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FXYWtlTG9jay5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FXYWtlTG9jay5jcHAKaW5kZXggODhjNGY2ZS4uZDkyNzdhYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BV2FrZUxvY2suY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVdha2VMb2NrLmNwcApAQCAtMzYsNyArMzYsNyBAQAogCiBBV2FrZUxvY2s6On5BV2FrZUxvY2soKSB7CiAgICAgaWYgKG1Qb3dlck1hbmFnZXIgIT0gTlVMTCkgewotICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBtUG93ZXJNYW5hZ2VyLT5hc0JpbmRlcigpOworICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBJSW50ZXJmYWNlOjphc0JpbmRlcihtUG93ZXJNYW5hZ2VyKTsKICAgICAgICAgYmluZGVyLT51bmxpbmtUb0RlYXRoKG1EZWF0aFJlY2lwaWVudCk7CiAgICAgfQogICAgIGNsZWFyUG93ZXJNYW5hZ2VyKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL01lZGlhSFRUUC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL01lZGlhSFRUUC5jcHAKaW5kZXggMmQyOTkxMy4uYmI4OTU2NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9NZWRpYUhUVFAuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvTWVkaWFIVFRQLmNwcApAQCAtMTI5LDcgKzEyOSw3IEBACiAKICAgICAqc2l6ZSA9IG1DYWNoZWRTaXplOwogCi0gICAgcmV0dXJuICpzaXplIDwgMCA/ICpzaXplIDogT0s7CisgICAgcmV0dXJuICpzaXplIDwgMCA/ICpzaXplIDogc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KE9LKTsKIH0KIAogdWludDMyX3QgTWVkaWFIVFRQOjpmbGFncygpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLm1rCmluZGV4IGU4ZDU1OGMuLjkzYjc5MzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5tawpAQCAtMTAsOCArMTAsNyBAQAogCiBMT0NBTF9DX0lOQ0xVREVTOj0gXAogCSQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKLQkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKLQkkKFRPUCkvZXh0ZXJuYWwvb3BlbnNzbC9pbmNsdWRlCisJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCiBMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5jcHAKaW5kZXggNDM1NWEzYy4uZDBmM2JjMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmNwcApAQCAtNzA5LDcgKzcwOSw2IEBACiAgICAgICAgICAgICBBU3RyaW5nIHVyaTsKICAgICAgICAgICAgIG1QbGF5bGlzdC0+aXRlbUF0KGksICZ1cmksICZtZXRhKTsKIAotICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBiYW5kd2lkdGg7CiAgICAgICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoImJhbmR3aWR0aCIsIChpbnQzMl90ICopJml0ZW0ubUJhbmR3aWR0aCkpOwogCiAgICAgICAgICAgICBpZiAoaW5pdGlhbEJhbmR3aWR0aCA9PSAwKSB7CkBAIC04NDcsMTEgKzg0NiwxMSBAQAogICAgICAgICAgICAgICAgIGhlYWRlcnMuYWRkKAogICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgiUmFuZ2UiKSwKICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTdHJpbmdQcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlcz0lbGxkLSVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2Vfb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZV9sZW5ndGggPCAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICIiIDogU3RyaW5nUHJpbnRmKCIlbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIiIgOiBBU3RyaW5nUHJpbnRmKCIlbGxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2Vfb2Zmc2V0ICsgcmFuZ2VfbGVuZ3RoIC0gMSkuY19zdHIoKSkuY19zdHIoKSkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUhUVFBEYXRhU291cmNlLT5jb25uZWN0KHVybCwgJmhlYWRlcnMpOwpAQCAtOTkwLDkgKzk4OSwxMSBAQAogICAgIHJldHVybiBwbGF5bGlzdDsKIH0KIAorI2lmIDAKIHN0YXRpYyBkb3VibGUgdW5pZm9ybVJhbmQoKSB7CiAgICAgcmV0dXJuIChkb3VibGUpcmFuZCgpIC8gUkFORF9NQVg7CiB9CisjZW5kaWYKIAogc2l6ZV90IExpdmVTZXNzaW9uOjpnZXRCYW5kd2lkdGhJbmRleCgpIHsKICAgICBpZiAobUJhbmR3aWR0aEl0ZW1zLnNpemUoKSA9PSAwKSB7CkBAIC0xNDY5LDcgKzE0NzAsNiBAQAogICAgICAgICBzcDxQbGF5bGlzdEZldGNoZXI+IGZldGNoZXIgPSBhZGRGZXRjaGVyKHVyaS5jX3N0cigpKTsKICAgICAgICAgQ0hFQ0soZmV0Y2hlciAhPSBOVUxMKTsKIAotICAgICAgICBpbnQzMl90IGxhdGVzdFNlcSA9IC0xOwogICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gLTE7CiAgICAgICAgIGludDY0X3Qgc2VnbWVudFN0YXJ0VGltZVVzID0gLTFsbDsKICAgICAgICAgaW50MzJfdCBkaXNjb250aW51aXR5U2VxID0gLTE7CkBAIC0xNDk3LDcgKzE0OTcsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9USU1FLCBleHRyYSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0eXBlOwotICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHNyY1NlZ21lbnRTdGFydFRpbWVVczsKICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1ldGE7CiAgICAgICAgICAgICAgICAgICAgIGlmIChwaWNrVHJhY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlbGVjdGluZwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmgKaW5kZXggZGZiNWU1OS4uMmQzYTI1YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5oCkBAIC0zMyw3ICszMyw2IEBACiBzdHJ1Y3QgTGl2ZURhdGFTb3VyY2U7CiBzdHJ1Y3QgTTNVUGFyc2VyOwogc3RydWN0IFBsYXlsaXN0RmV0Y2hlcjsKLXN0cnVjdCBQYXJjZWw7CiAKIHN0cnVjdCBMaXZlU2Vzc2lvbiA6IHB1YmxpYyBBSGFuZGxlciB7CiAgICAgZW51bSBGbGFncyB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmNwcAppbmRleCAwMGU1MmVlLi4xMjI3NjAwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5jcHAKQEAgLTI5MSw3ICsyOTEsNiBAQAogfQogCiBzdGF0dXNfdCBQbGF5bGlzdEZldGNoZXI6OmNoZWNrRGVjcnlwdFBhZGRpbmcoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgewotICAgIHN0YXR1c190IGVycjsKICAgICBBU3RyaW5nIG1ldGhvZDsKICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZFN0cmluZygiY2lwaGVyLW1ldGhvZCIsICZtZXRob2QpKTsKICAgICBpZiAobWV0aG9kID09ICJOT05FIikgewpAQCAtMTU0Nyw3ICsxNTQ2LDcgQEAKIAogICAgICAgICBDSEVDS19FUShiaXRzLmdldEJpdHMoMTIpLCAweGZmZnUpOwogICAgICAgICBiaXRzLnNraXBCaXRzKDMpOyAgLy8gSUQsIGxheWVyCi0gICAgICAgIGJvb2wgcHJvdGVjdGlvbl9hYnNlbnQgPSBiaXRzLmdldEJpdHMoMSkgIT0gMDsKKyAgICAgICAgYm9vbCBwcm90ZWN0aW9uX2Fic2VudCBfX3VudXNlZCA9IGJpdHMuZ2V0Qml0cygxKSAhPSAwOwogCiAgICAgICAgIHVuc2lnbmVkIHByb2ZpbGUgPSBiaXRzLmdldEJpdHMoMik7CiAgICAgICAgIENIRUNLX05FKHByb2ZpbGUsIDN1KTsKQEAgLTE2ODksNyArMTY4OCw3IEBACiB9CiAKIGludDY0X3QgUGxheWxpc3RGZXRjaGVyOjpyZXN1bWVUaHJlc2hvbGQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBpbnQ2NF90IGR1cmF0aW9uVXMsIHRocmVzaG9sZDsKKyAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CiAgICAgaWYgKG1zZy0+ZmluZEludDY0KCJkdXJhdGlvblVzIiwgJmR1cmF0aW9uVXMpICYmIGR1cmF0aW9uVXMgPiAwKSB7CiAgICAgICAgIHJldHVybiBrTnVtU2tpcEZyYW1lcyAqIGR1cmF0aW9uVXM7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuaAppbmRleCA2NzE2MWE5Li40ZTE1Zjg1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuaApAQCAtMzEsNyArMzEsNyBAQAogc3RydWN0IEhUVFBCYXNlOwogc3RydWN0IExpdmVEYXRhU291cmNlOwogc3RydWN0IE0zVVBhcnNlcjsKLXN0cnVjdCBTdHJpbmc4OworY2xhc3MgU3RyaW5nODsKIAogc3RydWN0IFBsYXlsaXN0RmV0Y2hlciA6IHB1YmxpYyBBSGFuZGxlciB7CiAgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga01pbkJ1ZmZlcmVkRHVyYXRpb25VczsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9JRDMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0lEMy5jcHAKaW5kZXggZWQyZDk0MS4uNDQxMDU3OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0lEMy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0lEMy5jcHAKQEAgLTY1Myw3ICs2NTMsMTAgQEAKICAgICAgICAgICAgICAgICB8IChtUGFyZW50Lm1EYXRhW21PZmZzZXQgKyA0XSA8PCA4KQogICAgICAgICAgICAgICAgIHwgbVBhcmVudC5tRGF0YVttT2Zmc2V0ICsgNV07CiAKLSAgICAgICAgICAgIG1GcmFtZVNpemUgKz0gNjsKKyAgICAgICAgICAgIGlmIChtRnJhbWVTaXplID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRnJhbWVTaXplICs9IDY7IC8vIGFkZCB0YWcgaWQgYW5kIHNpemUgZmllbGQKIAogICAgICAgICAgICAgLy8gUHJldmVudCBpbnRlZ2VyIG92ZXJmbG93IGluIHZhbGlkYXRpb24KICAgICAgICAgICAgIGlmIChTSVpFX01BWCAtIG1PZmZzZXQgPD0gbUZyYW1lU2l6ZSkgewpAQCAtODM1LDggKzgzOCw4IEBACiAgICAgICAgICAgICBtaW1lLT5zZXRUbygoY29uc3QgY2hhciAqKSZkYXRhWzFdKTsKICAgICAgICAgICAgIHNpemVfdCBtaW1lTGVuID0gc3RybGVuKChjb25zdCBjaGFyICopJmRhdGFbMV0pICsgMTsKIAotICAgICAgICAgICAgdWludDhfdCBwaWNUeXBlID0gZGF0YVsxICsgbWltZUxlbl07CiAjaWYgMAorICAgICAgICAgICAgdWludDhfdCBwaWNUeXBlID0gZGF0YVsxICsgbWltZUxlbl07CiAgICAgICAgICAgICBpZiAocGljVHlwZSAhPSAweDAzKSB7CiAgICAgICAgICAgICAgICAgLy8gRnJvbnQgQ292ZXIgQXJ0CiAgICAgICAgICAgICAgICAgaXQubmV4dCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BQUNFbmNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FBQ0VuY29kZXIuaAppbmRleCAzZDVmYzYwLi41MmJlYjBlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FBQ0VuY29kZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FBQ0VuY29kZXIuaApAQCAtMjUsNyArMjUsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBNZWRpYUJ1ZmZlckdyb3VwOworY2xhc3MgTWVkaWFCdWZmZXJHcm91cDsKIAogY2xhc3MgQUFDRW5jb2RlcjogcHVibGljIE1lZGlhU291cmNlIHsKICAgICBwdWJsaWM6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0lEMy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9JRDMuaAppbmRleCBlODNmM2VmLi5jMmM0YTZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0lEMy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSUQzLmgKQEAgLTIyLDggKzIyLDggQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgRGF0YVNvdXJjZTsKLXN0cnVjdCBTdHJpbmc4OworY2xhc3MgRGF0YVNvdXJjZTsKK2NsYXNzIFN0cmluZzg7CiAKIHN0cnVjdCBJRDMgewogICAgIGVudW0gVmVyc2lvbiB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzJUU0V4dHJhY3Rvci5oCmluZGV4IGM1ZTg2YTYuLmRiMTE4N2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzJUU0V4dHJhY3Rvci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzJUU0V4dHJhY3Rvci5oCkBAIC0yOCw3ICsyOCw3IEBACiBzdHJ1Y3QgQU1lc3NhZ2U7CiBzdHJ1Y3QgQW5vdGhlclBhY2tldFNvdXJjZTsKIHN0cnVjdCBBVFNQYXJzZXI7Ci1zdHJ1Y3QgRGF0YVNvdXJjZTsKK2NsYXNzIERhdGFTb3VyY2U7CiBzdHJ1Y3QgTVBFRzJUU1NvdXJjZTsKIHN0cnVjdCBTdHJpbmc4OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01pZGlFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTWlkaUV4dHJhY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMmFiYzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01pZGlFeHRyYWN0b3IuaApAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNSURJX0VYVFJBQ1RPUl9IXworI2RlZmluZSBNSURJX0VYVFJBQ1RPUl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CisjaW5jbHVkZSA8bWVkaWEvTWlkaUlvV3JhcHBlci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDxsaWJzb25pdm94L2Vhcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1pZGlFbmdpbmUgOiBwdWJsaWMgUmVmQmFzZSB7CitwdWJsaWM6CisgICAgTWlkaUVuZ2luZShjb25zdCBzcDxEYXRhU291cmNlPiAmZGF0YVNvdXJjZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmZmlsZU1ldGFkYXRhLAorICAgICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZ0cmFja01ldGFkYXRhKTsKKyAgICB+TWlkaUVuZ2luZSgpOworCisgICAgc3RhdHVzX3QgaW5pdENoZWNrKCk7CisKKyAgICBzdGF0dXNfdCBhbGxvY2F0ZUJ1ZmZlcnMoKTsKKyAgICBzdGF0dXNfdCByZWxlYXNlQnVmZmVycygpOworICAgIHN0YXR1c190IHNlZWtUbyhpbnQ2NF90IHBvc2l0aW9uVXMpOworICAgIE1lZGlhQnVmZmVyKiByZWFkQnVmZmVyKCk7Citwcml2YXRlOgorICAgIHNwPE1pZGlJb1dyYXBwZXI+IG1Jb1dyYXBwZXI7CisgICAgTWVkaWFCdWZmZXJHcm91cCAqbUdyb3VwOworICAgIEVBU19EQVRBX0hBTkRMRSBtRWFzRGF0YTsKKyAgICBFQVNfSEFORExFIG1FYXNIYW5kbGU7CisgICAgY29uc3QgU19FQVNfTElCX0NPTkZJRyogbUVhc0NvbmZpZzsKKyAgICBib29sIG1Jc0luaXRpYWxpemVkOworfTsKKworY2xhc3MgTWlkaUV4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7CisKK3B1YmxpYzoKKyAgICAvLyBFeHRyYWN0b3IgYXNzdW1lcyBvd25lcnNoaXAgb2Ygc291cmNlCisgICAgTWlkaUV4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKTsKKworICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7CisgICAgdmlydHVhbCBzcDxNZWRpYVNvdXJjZT4gZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRUcmFja01ldGFEYXRhKHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworCisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0TWV0YURhdGEoKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk1pZGlFeHRyYWN0b3IoKTsKKworcHJpdmF0ZToKKyAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOworICAgIHNwPE1ldGFEYXRhPiBtRmlsZU1ldGFkYXRhOworCisgICAgLy8gVGhlcmUgaXMgb25seSBvbmUgdHJhY2sKKyAgICBzcDxNZXRhRGF0YT4gbVRyYWNrTWV0YWRhdGE7CisKKyAgICBzcDxNaWRpRW5naW5lPiBtRW5naW5lOworCisgICAgRUFTX0RBVEFfSEFORExFICAgICBtRWFzRGF0YTsKKyAgICBFQVNfSEFORExFICAgICAgICAgIG1FYXNIYW5kbGU7CisgICAgRUFTX1BDTSogICAgICAgICAgICBtQXVkaW9CdWZmZXI7CisgICAgRUFTX0kzMiAgICAgICAgICAgICBtUGxheVRpbWU7CisgICAgRUFTX0kzMiAgICAgICAgICAgICBtRHVyYXRpb247CisgICAgRUFTX1NUQVRFICAgICAgICAgICBtU3RhdGU7CisgICAgRUFTX0ZJTEUgICAgICAgICAgICBtRmlsZUxvY2F0b3I7CisKKyAgICBNaWRpRXh0cmFjdG9yKGNvbnN0IE1pZGlFeHRyYWN0b3IgJik7CisgICAgTWlkaUV4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IE1pZGlFeHRyYWN0b3IgJik7CisKK307CisKK2Jvb2wgU25pZmZNaWRpKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLAorICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwgc3A8QU1lc3NhZ2U+ICopOworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1JRElfRVhUUkFDVE9SX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL2F2Y191dGlscy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9hdmNfdXRpbHMuaAppbmRleCBkNTE3MzIwLi5jMjcwYmMxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL2F2Y191dGlscy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvYXZjX3V0aWxzLmgKQEAgLTIzLDcgKzIzLDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgQUJpdFJlYWRlcjsKK2NsYXNzIEFCaXRSZWFkZXI7CiAKIGVudW0gewogICAgIGtBVkNQcm9maWxlQmFzZWxpbmUgICAgICA9IDB4NDIsCkBAIC00OSw3ICs0OSw3IEBACiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKipuYWxTdGFydCwgc2l6ZV90ICpuYWxTaXplLAogICAgICAgICBib29sIHN0YXJ0Q29kZUZvbGxvd3MgPSBmYWxzZSk7CiAKLXN0cnVjdCBNZXRhRGF0YTsKK2NsYXNzIE1ldGFEYXRhOwogc3A8TWV0YURhdGE+IE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCk7CiAKIGJvb2wgSXNJRFIoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuY3BwCmluZGV4IGU1MzMxOWIuLmMzMGU4MDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5jcHAKQEAgLTUwMSwxNyArNTAxLDYgQEAKICAgICByZXR1cm4gcHRyWzBdIDw8IDE2IHwgcHRyWzFdIDw8IDggfCBwdHJbMl07CiB9CiAKLXN0YXRpYyBzaXplX3QgY2x6KHVpbnQ4X3QgeCkgewotICAgIHNpemVfdCBudW1MZWFkaW5nWmVyb2VzID0gMDsKLQotICAgIHdoaWxlICghKHggJiAweDgwKSkgewotICAgICAgICArK251bUxlYWRpbmdaZXJvZXM7Ci0gICAgICAgIHggPSB4IDw8IDE7Ci0gICAgfQotCi0gICAgcmV0dXJuIG51bUxlYWRpbmdaZXJvZXM7Ci19Ci0KIHZvaWQgTWF0cm9za2FTb3VyY2U6OmNsZWFyUGVuZGluZ0ZyYW1lcygpIHsKICAgICB3aGlsZSAoIW1QZW5kaW5nRnJhbWVzLmVtcHR5KCkpIHsKICAgICAgICAgTWVkaWFCdWZmZXIgKmZyYW1lID0gKm1QZW5kaW5nRnJhbWVzLmJlZ2luKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAKaW5kZXggNDgyY2NmZi4uMWVhZTZjZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcApAQCAtMTM2LDYgKzEzNiw3IEBACiAgICAgc3A8QUJ1ZmZlcj4gbUJ1ZmZlcjsKICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBtU291cmNlOwogICAgIGJvb2wgbVBheWxvYWRTdGFydGVkOworICAgIGJvb2wgbUVPU1JlYWNoZWQ7CiAKICAgICB1aW50NjRfdCBtUHJldlBUUzsKIApAQCAtNDkzLDYgKzQ5NCw3IEBACiAgICAgICBtUENSX1BJRChQQ1JfUElEKSwKICAgICAgIG1FeHBlY3RlZENvbnRpbnVpdHlDb3VudGVyKC0xKSwKICAgICAgIG1QYXlsb2FkU3RhcnRlZChmYWxzZSksCisgICAgICBtRU9TUmVhY2hlZChmYWxzZSksCiAgICAgICBtUHJldlBUUygwKSwKICAgICAgIG1RdWV1ZShOVUxMKSB7CiAgICAgc3dpdGNoIChtU3RyZWFtVHlwZSkgewpAQCAtNjkyLDYgKzY5NCw4IEBACiAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewogICAgICAgICBtU291cmNlLT5zaWduYWxFT1MoZmluYWxSZXN1bHQpOwogICAgIH0KKyAgICBtRU9TUmVhY2hlZCA9IHRydWU7CisgICAgZmx1c2goKTsKIH0KIAogc3RhdHVzX3QgQVRTUGFyc2VyOjpTdHJlYW06OnBhcnNlUEVTKEFCaXRSZWFkZXIgKmJyKSB7CkBAIC05MDIsNiArOTA2LDEwIEBACiAKICAgICBzdGF0dXNfdCBlcnIgPSBtUXVldWUtPmFwcGVuZERhdGEoZGF0YSwgc2l6ZSwgdGltZVVzKTsKIAorICAgIGlmIChtRU9TUmVhY2hlZCkgeworICAgICAgICBtUXVldWUtPnNpZ25hbEVPUygpOworICAgIH0KKwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oCmluZGV4IDVkNzZjYmQuLjc1ZDc2ZGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaApAQCAtMjgsNyArMjgsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBBQml0UmVhZGVyOworY2xhc3MgQUJpdFJlYWRlcjsKIHN0cnVjdCBBQnVmZmVyOwogc3RydWN0IE1lZGlhU291cmNlOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmNwcAppbmRleCAyZWQzY2NjLi41NTI3ZGYwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAKQEAgLTM4LDcgKzM4LDggQEAKIAogRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpFbGVtZW50YXJ5U3RyZWFtUXVldWUoTW9kZSBtb2RlLCB1aW50MzJfdCBmbGFncykKICAgICA6IG1Nb2RlKG1vZGUpLAotICAgICAgbUZsYWdzKGZsYWdzKSB7CisgICAgICBtRmxhZ3MoZmxhZ3MpLAorICAgICAgbUVPU1JlYWNoZWQoZmFsc2UpIHsKIH0KIAogc3A8TWV0YURhdGE+IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6Z2V0Rm9ybWF0KCkgewpAQCAtNjMsOCArNjQsNiBAQAogICAgICAgICBjb25zdCB1aW50OF90ICpwdHIsIHNpemVfdCBzaXplLCBzcDxNZXRhRGF0YT4gKm1ldGFEYXRhKSB7CiAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYW5uZWxDb3VudFRhYmxlW10gPSB7MiwgMSwgMiwgMywgMywgNCwgNCwgNX07CiAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNhbXBsaW5nUmF0ZVRhYmxlW10gPSB7NDgwMDAsIDQ0MTAwLCAzMjAwMH07Ci0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHJhdGVzW10gPSB7MzIsIDQwLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNjAsIDE5MiwgMjI0LCAyNTYsCi0gICAgICAgICAgICAzMjAsIDM4NCwgNDQ4LCA1MTIsIDU3NiwgNjQwfTsKIAogICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBmcmFtZVNpemVUYWJsZVsxOV1bM10gPSB7CiAgICAgICAgIHsgNjQsIDY5LCA5NiB9LApAQCAtODksNyArODgsNiBAQAogICAgIH07CiAKICAgICBBQml0UmVhZGVyIGJpdHMocHRyLCBzaXplKTsKLSAgICB1bnNpZ25lZCBzeW5jU3RhcnRQb3MgPSAwOyAgLy8gaW4gYnl0ZXMKICAgICBpZiAoYml0cy5udW1CaXRzTGVmdCgpIDwgMTYpIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtMTIxLDExICsxMTksMTEgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgdW5zaWduZWQgYnNtb2QgPSBiaXRzLmdldEJpdHMoMyk7CisgICAgdW5zaWduZWQgYnNtb2QgX191bnVzZWQgPSBiaXRzLmdldEJpdHMoMyk7CiAgICAgdW5zaWduZWQgYWNtb2QgPSBiaXRzLmdldEJpdHMoMyk7Ci0gICAgdW5zaWduZWQgY21peGxldiA9IDA7Ci0gICAgdW5zaWduZWQgc3VybWl4bGV2ID0gMDsKLSAgICB1bnNpZ25lZCBkc3VybW9kID0gMDsKKyAgICB1bnNpZ25lZCBjbWl4bGV2IF9fdW51c2VkID0gMDsKKyAgICB1bnNpZ25lZCBzdXJtaXhsZXYgX191bnVzZWQgPSAwOworICAgIHVuc2lnbmVkIGRzdXJtb2QgX191bnVzZWQgPSAwOwogCiAgICAgaWYgKChhY21vZCAmIDEpID4gMCAmJiBhY21vZCAhPSAxKSB7CiAgICAgICAgIGlmIChiaXRzLm51bUJpdHNMZWZ0KCkgPCAyKSB7CkBAIC0yNDcsNiArMjQ1LDExIEBACiAKIHN0YXR1c190IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6YXBwZW5kRGF0YSgKICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIGludDY0X3QgdGltZVVzKSB7CisKKyAgICBpZiAobUVPU1JlYWNoZWQpIHsKKyAgICAgICAgQUxPR0UoImFwcGVuZGluZyBkYXRhIGFmdGVyIEVPUyIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KICAgICBpZiAobUJ1ZmZlciA9PSBOVUxMIHx8IG1CdWZmZXItPnNpemUoKSA9PSAwKSB7CiAgICAgICAgIHN3aXRjaCAobU1vZGUpIHsKICAgICAgICAgICAgIGNhc2UgSDI2NDoKQEAgLTI2MCw4ICsyNjMsOCBAQAogICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnB0ciA9ICh1aW50OF90ICopZGF0YTsKIAogICAgICAgICAgICAgICAgIHNzaXplX3Qgc3RhcnRPZmZzZXQgPSAtMTsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSArIDMgPCBzaXplOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtZW1jbXAoIlx4MDBceDAwXHgwMFx4MDEiLCAmcHRyW2ldLCA0KSkgeworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICsgMiA8IHNpemU7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIW1lbWNtcCgiXHgwMFx4MDBceDAxIiwgJnB0cltpXSwgMykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0T2Zmc2V0ID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC01NTYsNyArNTU5LDcgQEAKICAgICBDSEVDS19FUShiaXRzLmdldEJpdHMoOCksIDB4YTApOwogICAgIHVuc2lnbmVkIG51bUFVcyA9IGJpdHMuZ2V0Qml0cyg4KTsKICAgICBiaXRzLnNraXBCaXRzKDgpOwotICAgIHVuc2lnbmVkIHF1YW50aXphdGlvbl93b3JkX2xlbmd0aCA9IGJpdHMuZ2V0Qml0cygyKTsKKyAgICB1bnNpZ25lZCBxdWFudGl6YXRpb25fd29yZF9sZW5ndGggX191bnVzZWQgPSBiaXRzLmdldEJpdHMoMik7CiAgICAgdW5zaWduZWQgYXVkaW9fc2FtcGxpbmdfZnJlcXVlbmN5ID0gYml0cy5nZXRCaXRzKDMpOwogICAgIHVuc2lnbmVkIG51bV9jaGFubmVscyA9IGJpdHMuZ2V0Qml0cygzKTsKIApAQCAtNjM0LDcgKzYzNyw3IEBACiAKICAgICAgICAgQ0hFQ0tfRVEoYml0cy5nZXRCaXRzKDEyKSwgMHhmZmZ1KTsKICAgICAgICAgYml0cy5za2lwQml0cygzKTsgIC8vIElELCBsYXllcgotICAgICAgICBib29sIHByb3RlY3Rpb25fYWJzZW50ID0gYml0cy5nZXRCaXRzKDEpICE9IDA7CisgICAgICAgIGJvb2wgcHJvdGVjdGlvbl9hYnNlbnQgX191bnVzZWQgPSBiaXRzLmdldEJpdHMoMSkgIT0gMDsKIAogICAgICAgICBpZiAobUZvcm1hdCA9PSBOVUxMKSB7CiAgICAgICAgICAgICB1bnNpZ25lZCBwcm9maWxlID0gYml0cy5nZXRCaXRzKDIpOwpAQCAtNjgzLDcgKzY4Niw3IEBACiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogCi0gICAgICAgIHNpemVfdCBoZWFkZXJTaXplID0gcHJvdGVjdGlvbl9hYnNlbnQgPyA3IDogOTsKKyAgICAgICAgc2l6ZV90IGhlYWRlclNpemUgX191bnVzZWQgPSBwcm90ZWN0aW9uX2Fic2VudCA/IDcgOiA5OwogCiAgICAgICAgIG9mZnNldCArPSBhYWNfZnJhbWVfbGVuZ3RoOwogICAgICAgICAvLyBUT0RPOiBtb3ZlIGJhY2sgdG8gY29uY2F0ZW5hdGlvbiB3aGVuIGNvZGVjIGNhbiBzdXBwb3J0IGFyYml0cmFyeSBpbnB1dCBidWZmZXJzLgpAQCAtMTI4NSw0ICsxMjg4LDE3IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKK3ZvaWQgRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpzaWduYWxFT1MoKSB7CisgICAgaWYgKCFtRU9TUmVhY2hlZCkgeworICAgICAgICBpZiAobU1vZGUgPT0gTVBFR19WSURFTykgeworICAgICAgICAgICAgY29uc3QgY2hhciAqdGhlRW5kID0gIlx4MDBceDAwXHgwMVx4MDAiOworICAgICAgICAgICAgYXBwZW5kRGF0YSh0aGVFbmQsIDQsIDApOworICAgICAgICB9CisgICAgICAgIG1FT1NSZWFjaGVkID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVygiRU9TIGFscmVhZHkgc2lnbmFsZWQiKTsKKyAgICB9Cit9CisKKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmgKaW5kZXggN2M4MWZmMC4uYTZkODEyZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmgKQEAgLTI2LDcgKzI2LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFCdWZmZXI7Ci1zdHJ1Y3QgTWV0YURhdGE7CitjbGFzcyBNZXRhRGF0YTsKIAogc3RydWN0IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZSB7CiAgICAgZW51bSBNb2RlIHsKQEAgLTQ2LDYgKzQ2LDcgQEAKICAgICBFbGVtZW50YXJ5U3RyZWFtUXVldWUoTW9kZSBtb2RlLCB1aW50MzJfdCBmbGFncyA9IDApOwogCiAgICAgc3RhdHVzX3QgYXBwZW5kRGF0YShjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgaW50NjRfdCB0aW1lVXMpOworICAgIHZvaWQgc2lnbmFsRU9TKCk7CiAgICAgdm9pZCBjbGVhcihib29sIGNsZWFyRm9ybWF0KTsKIAogICAgIHNwPEFCdWZmZXI+IGRlcXVldWVBY2Nlc3NVbml0KCk7CkBAIC02MCw2ICs2MSw3IEBACiAKICAgICBNb2RlIG1Nb2RlOwogICAgIHVpbnQzMl90IG1GbGFnczsKKyAgICBib29sIG1FT1NSZWFjaGVkOwogCiAgICAgc3A8QUJ1ZmZlcj4gbUJ1ZmZlcjsKICAgICBMaXN0PFJhbmdlSW5mbz4gbVJhbmdlSW5mb3M7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyVFNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlRTRXh0cmFjdG9yLmNwcAppbmRleCAzNWNhMTE4Li43NGNiNWQ4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyVFNFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJUU0V4dHJhY3Rvci5jcHAKQEAgLTg1LDEyICs4NSw2IEBACiAgICAgICAgIE1lZGlhQnVmZmVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgICpvdXQgPSBOVUxMOwogCi0gICAgaW50NjRfdCBzZWVrVGltZVVzOwotICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBzZWVrTW9kZTsKLSAgICBpZiAobVNlZWthYmxlICYmIG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmc2Vla01vZGUpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KICAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdDsKICAgICB3aGlsZSAoIW1JbXBsLT5oYXNCdWZmZXJBdmFpbGFibGUoJmZpbmFsUmVzdWx0KSkgewogICAgICAgICBpZiAoZmluYWxSZXN1bHQgIT0gT0spIHsKQEAgLTEwMyw2ICs5NywxNyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgaW50NjRfdCBzZWVrVGltZVVzOworICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBzZWVrTW9kZTsKKyAgICBpZiAobVNlZWthYmxlICYmIG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmc2Vla01vZGUpKSB7CisgICAgICAgIC8vIEEgc2VlayB3YXMgcmVxdWVzdGVkLCBidXQgd2UgZG9uJ3QgYWN0dWFsbHkgc3VwcG9ydCBzZWVraW5nIGFuZCBzbyBjYW4gb25seSAic2VlayIgdG8KKyAgICAgICAgLy8gdGhlIGN1cnJlbnQgcG9zaXRpb24KKyAgICAgICAgaW50NjRfdCBuZXh0QnVmVGltZVVzOworICAgICAgICBpZiAobUltcGwtPm5leHRCdWZmZXJUaW1lKCZuZXh0QnVmVGltZVVzKSAhPSBPSyB8fCBzZWVrVGltZVVzICE9IG5leHRCdWZUaW1lVXMpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHJldHVybiBtSW1wbC0+cmVhZChvdXQsIG9wdGlvbnMpOwogfQogCkBAIC0xNTksNyArMTY0LDYgQEAKICAgICBpbnQgbnVtUGFja2V0c1BhcnNlZCA9IDA7CiAKICAgICB3aGlsZSAoZmVlZE1vcmUoKSA9PSBPSykgewotICAgICAgICBBVFNQYXJzZXI6OlNvdXJjZVR5cGUgdHlwZTsKICAgICAgICAgaWYgKGhhdmVBdWRpbyAmJiBoYXZlVmlkZW8pIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yMDAsNiArMjA0LDkgQEAKICAgICBzc2l6ZV90IG4gPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG1PZmZzZXQsIHBhY2tldCwga1RTUGFja2V0U2l6ZSk7CiAKICAgICBpZiAobiA8IChzc2l6ZV90KWtUU1BhY2tldFNpemUpIHsKKyAgICAgICAgaWYgKG4gPj0gMCkgeworICAgICAgICAgICAgbVBhcnNlci0+c2lnbmFsRU9TKEVSUk9SX0VORF9PRl9TVFJFQU0pOworICAgICAgICB9CiAgICAgICAgIHJldHVybiAobiA8IDApID8gKHN0YXR1c190KW4gOiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCmluZGV4IDQ0YzdlZGMuLjI5NDU2NDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKQEAgLTI4LDYgKzI4LDcgQEAKIAogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL01ldGFkYXRhQnVmZmVyVHlwZS5oPgogI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KKyNpbmNsdWRlIDxndWkvQnVmZmVySXRlbS5oPgogCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KIApAQCAtMzU5LDcgKzM2MCw3IEBACiAgICAgICAgIG1TdXNwZW5kZWQgPSB0cnVlOwogCiAgICAgICAgIHdoaWxlIChtTnVtRnJhbWVzQXZhaWxhYmxlID4gMCkgewotICAgICAgICAgICAgQnVmZmVyUXVldWU6OkJ1ZmZlckl0ZW0gaXRlbTsKKyAgICAgICAgICAgIEJ1ZmZlckl0ZW0gaXRlbTsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1Db25zdW1lci0+YWNxdWlyZUJ1ZmZlcigmaXRlbSwgMCk7CiAKICAgICAgICAgICAgIGlmIChlcnIgPT0gQnVmZmVyUXVldWU6Ok5PX0JVRkZFUl9BVkFJTEFCTEUpIHsKQEAgLTQwOSw3ICs0MTAsNyBAQAogCiAgICAgQUxPR1YoImZpbGxDb2RlY0J1ZmZlcl9sOiBhY3F1aXJpbmcgYnVmZmVyLCBhdmFpbD0lenUiLAogICAgICAgICAgICAgbU51bUZyYW1lc0F2YWlsYWJsZSk7Ci0gICAgQnVmZmVyUXVldWU6OkJ1ZmZlckl0ZW0gaXRlbTsKKyAgICBCdWZmZXJJdGVtIGl0ZW07CiAgICAgc3RhdHVzX3QgZXJyID0gbUNvbnN1bWVyLT5hY3F1aXJlQnVmZmVyKCZpdGVtLCAwKTsKICAgICBpZiAoZXJyID09IEJ1ZmZlclF1ZXVlOjpOT19CVUZGRVJfQVZBSUxBQkxFKSB7CiAgICAgICAgIC8vIHNob3VsZG4ndCBoYXBwZW4KQEAgLTQ5Miw3ICs0OTMsNyBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgQnVmZmVyUXVldWU6OkJ1ZmZlckl0ZW0gaXRlbTsKKyAgICBCdWZmZXJJdGVtIGl0ZW07CiAgICAgaXRlbS5tQnVmID0gbUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlcklkOwogICAgIGl0ZW0ubUZyYW1lTnVtYmVyID0gbUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlckZyYW1lTnVtOwogICAgIGl0ZW0ubVRpbWVzdGFtcCA9IG1SZXBlYXRMYXN0RnJhbWVUaW1lc3RhbXA7CkBAIC01MjMsNyArNTI0LDcgQEAKIH0KIAogdm9pZCBHcmFwaGljQnVmZmVyU291cmNlOjpzZXRMYXRlc3RTdWJtaXR0ZWRCdWZmZXJfbCgKLSAgICAgICAgY29uc3QgQnVmZmVyUXVldWU6OkJ1ZmZlckl0ZW0gJml0ZW0pIHsKKyAgICAgICAgY29uc3QgQnVmZmVySXRlbSAmaXRlbSkgewogICAgIEFMT0dWKCJzZXRMYXRlc3RTdWJtaXR0ZWRCdWZmZXJfbCIpOwogCiAgICAgaWYgKG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJJZCA+PSAwKSB7CkBAIC01NzksNyArNTgwLDcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLWludDY0X3QgR3JhcGhpY0J1ZmZlclNvdXJjZTo6Z2V0VGltZXN0YW1wKGNvbnN0IEJ1ZmZlclF1ZXVlOjpCdWZmZXJJdGVtICZpdGVtKSB7CitpbnQ2NF90IEdyYXBoaWNCdWZmZXJTb3VyY2U6OmdldFRpbWVzdGFtcChjb25zdCBCdWZmZXJJdGVtICZpdGVtKSB7CiAgICAgaW50NjRfdCB0aW1lVXMgPSBpdGVtLm1UaW1lc3RhbXAgLyAxMDAwOwogCiAgICAgaWYgKG1UaW1lUGVyQ2FwdHVyZVVzID4gMGxsKSB7CkBAIC02NDAsNyArNjQxLDcgQEAKIH0KIAogc3RhdHVzX3QgR3JhcGhpY0J1ZmZlclNvdXJjZTo6c3VibWl0QnVmZmVyX2woCi0gICAgICAgIGNvbnN0IEJ1ZmZlclF1ZXVlOjpCdWZmZXJJdGVtICZpdGVtLCBpbnQgY2JpKSB7CisgICAgICAgIGNvbnN0IEJ1ZmZlckl0ZW0gJml0ZW0sIGludCBjYmkpIHsKICAgICBBTE9HVigic3VibWl0QnVmZmVyX2wgY2JpPSVkIiwgY2JpKTsKIAogICAgIGludDY0X3QgdGltZVVzID0gZ2V0VGltZXN0YW1wKGl0ZW0pOwpAQCAtNzY2LDcgKzc2Nyw3IEBACiAgICAgICAgICAgICBBTE9HVigib25GcmFtZUF2YWlsYWJsZTogc3VzcGVuZGVkLCBpZ25vcmluZyBmcmFtZSIpOwogICAgICAgICB9CiAKLSAgICAgICAgQnVmZmVyUXVldWU6OkJ1ZmZlckl0ZW0gaXRlbTsKKyAgICAgICAgQnVmZmVySXRlbSBpdGVtOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ29uc3VtZXItPmFjcXVpcmVCdWZmZXIoJml0ZW0sIDApOwogICAgICAgICBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3JlIHNlZWluZyB0aGlzIGJ1ZmZlciwgYWRkIGl0IHRvIG91cgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmgKaW5kZXggYzhlMzc3NS4uNDAxYmJjMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5oCkBAIC0xODcsMTUgKzE4NywxNSBAQAogCiAgICAgLy8gTWFya3MgdGhlIG1Db2RlY0J1ZmZlcnMgZW50cnkgYXMgaW4tdXNlLCBjb3BpZXMgdGhlIEdyYXBoaWNCdWZmZXIKICAgICAvLyByZWZlcmVuY2UgaW50byB0aGUgY29kZWMgYnVmZmVyLCBhbmQgc3VibWl0cyB0aGUgZGF0YSB0byB0aGUgY29kZWMuCi0gICAgc3RhdHVzX3Qgc3VibWl0QnVmZmVyX2woY29uc3QgQnVmZmVyUXVldWU6OkJ1ZmZlckl0ZW0gJml0ZW0sIGludCBjYmkpOworICAgIHN0YXR1c190IHN1Ym1pdEJ1ZmZlcl9sKGNvbnN0IEJ1ZmZlckl0ZW0gJml0ZW0sIGludCBjYmkpOwogCiAgICAgLy8gU3VibWl0cyBhbiBlbXB0eSBidWZmZXIsIHdpdGggdGhlIEVPUyBmbGFnIHNldC4gICBSZXR1cm5zIHdpdGhvdXQKICAgICAvLyBkb2luZyBhbnl0aGluZyBpZiB3ZSBkb24ndCBoYXZlIGEgY29kZWMgYnVmZmVyIGF2YWlsYWJsZS4KICAgICB2b2lkIHN1Ym1pdEVuZE9mSW5wdXRTdHJlYW1fbCgpOwogCi0gICAgdm9pZCBzZXRMYXRlc3RTdWJtaXR0ZWRCdWZmZXJfbChjb25zdCBCdWZmZXJRdWV1ZTo6QnVmZmVySXRlbSAmaXRlbSk7CisgICAgdm9pZCBzZXRMYXRlc3RTdWJtaXR0ZWRCdWZmZXJfbChjb25zdCBCdWZmZXJJdGVtICZpdGVtKTsKICAgICBib29sIHJlcGVhdExhdGVzdFN1Ym1pdHRlZEJ1ZmZlcl9sKCk7Ci0gICAgaW50NjRfdCBnZXRUaW1lc3RhbXAoY29uc3QgQnVmZmVyUXVldWU6OkJ1ZmZlckl0ZW0gJml0ZW0pOworICAgIGludDY0X3QgZ2V0VGltZXN0YW1wKGNvbnN0IEJ1ZmZlckl0ZW0gJml0ZW0pOwogCiAgICAgLy8gTG9jaywgY292ZXJzIGFsbCBtZW1iZXIgdmFyaWFibGVzLgogICAgIG11dGFibGUgTXV0ZXggbU11dGV4OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcAppbmRleCAxMWIwZDZkLi45N2IzNjBkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcApAQCAtMjUwLDggKzI1MCw4IEBACiAKICAgICBpbnN0YW5jZS0+c2V0SGFuZGxlKCpub2RlLCBoYW5kbGUpOwogCi0gICAgbUxpdmVOb2Rlcy5hZGQob2JzZXJ2ZXItPmFzQmluZGVyKCksIGluc3RhbmNlKTsKLSAgICBvYnNlcnZlci0+YXNCaW5kZXIoKS0+bGlua1RvRGVhdGgodGhpcyk7CisgICAgbUxpdmVOb2Rlcy5hZGQoSUludGVyZmFjZTo6YXNCaW5kZXIob2JzZXJ2ZXIpLCBpbnN0YW5jZSk7CisgICAgSUludGVyZmFjZTo6YXNCaW5kZXIob2JzZXJ2ZXIpLT5saW5rVG9EZWF0aCh0aGlzKTsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTI2MSw3ICsyNjEsNyBAQAogCiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUxpdmVOb2Rlcy5pbmRleE9mS2V5KGluc3RhbmNlLT5vYnNlcnZlcigpLT5hc0JpbmRlcigpKTsKKyAgICAgICAgc3NpemVfdCBpbmRleCA9IG1MaXZlTm9kZXMuaW5kZXhPZktleShJSW50ZXJmYWNlOjphc0JpbmRlcihpbnN0YW5jZS0+b2JzZXJ2ZXIoKSkpOwogICAgICAgICBpZiAoaW5kZXggPCAwKSB7CiAgICAgICAgICAgICAvLyBUaGlzIGNvdWxkIGNvbmNlaXZhYmx5IGhhcHBlbiBpZiB0aGUgb2JzZXJ2ZXIgZGllcyBhdCByb3VnaGx5IHRoZQogICAgICAgICAgICAgLy8gc2FtZSB0aW1lIHRoYXQgYSBjbGllbnQgYXR0ZW1wdHMgdG8gZnJlZSB0aGUgbm9kZSBleHBsaWNpdGx5LgpAQCAtMjcwLDcgKzI3MCw3IEBACiAgICAgICAgIG1MaXZlTm9kZXMucmVtb3ZlSXRlbXNBdChpbmRleCk7CiAgICAgfQogCi0gICAgaW5zdGFuY2UtPm9ic2VydmVyKCktPmFzQmluZGVyKCktPnVubGlua1RvRGVhdGgodGhpcyk7CisgICAgSUludGVyZmFjZTo6YXNCaW5kZXIoaW5zdGFuY2UtPm9ic2VydmVyKCkpLT51bmxpbmtUb0RlYXRoKHRoaXMpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gaW5zdGFuY2UtPmZyZWVOb2RlKG1NYXN0ZXIpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCmluZGV4IGJmNWQ4MmMuLjdlYTM0ZmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCkBAIC0xNTgsNyArMTU4LDcgQEAKICAgICBzd2l0Y2ggKHBvcnRJbmRleCkgewogICAgICAgICBjYXNlIGtQb3J0SW5kZXhJbnB1dDogIHJldHVybiAiSW5wdXQiOwogICAgICAgICBjYXNlIGtQb3J0SW5kZXhPdXRwdXQ6IHJldHVybiAiT3V0cHV0IjsKLSAgICAgICAgY2FzZSB+MDogICAgICAgICAgICAgICByZXR1cm4gIkFsbCI7CisgICAgICAgIGNhc2UgfjBVOiAgICAgICAgICAgICAgcmV0dXJuICJBbGwiOwogICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgIHJldHVybiAicG9ydCI7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uY3BwCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggOWI2OTU4YS4uMGY5YzAwYwotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uY3BwCkBAIC00MCwxMSArNDAsMTIgQEAKICAgICB7ICJPTVguZ29vZ2xlLmFtcm5iLmVuY29kZXIiLCAiYW1ybmJlbmMiLCAiYXVkaW9fZW5jb2Rlci5hbXJuYiIgfSwKICAgICB7ICJPTVguZ29vZ2xlLmFtcndiLmRlY29kZXIiLCAiYW1yZGVjIiwgImF1ZGlvX2RlY29kZXIuYW1yd2IiIH0sCiAgICAgeyAiT01YLmdvb2dsZS5hbXJ3Yi5lbmNvZGVyIiwgImFtcndiZW5jIiwgImF1ZGlvX2VuY29kZXIuYW1yd2IiIH0sCi0gICAgeyAiT01YLmdvb2dsZS5oMjY0LmRlY29kZXIiLCAiaDI2NGRlYyIsICJ2aWRlb19kZWNvZGVyLmF2YyIgfSwKLSAgICB7ICJPTVguZ29vZ2xlLmgyNjQuZW5jb2RlciIsICJoMjY0ZW5jIiwgInZpZGVvX2VuY29kZXIuYXZjIiB9LAorICAgIHsgIk9NWC5nb29nbGUuaDI2NC5kZWNvZGVyIiwgImF2Y2RlYyIsICJ2aWRlb19kZWNvZGVyLmF2YyIgfSwKKyAgICB7ICJPTVguZ29vZ2xlLmgyNjQuZW5jb2RlciIsICJhdmNlbmMiLCAidmlkZW9fZW5jb2Rlci5hdmMiIH0sCiAgICAgeyAiT01YLmdvb2dsZS5oZXZjLmRlY29kZXIiLCAiaGV2Y2RlYyIsICJ2aWRlb19kZWNvZGVyLmhldmMiIH0sCiAgICAgeyAiT01YLmdvb2dsZS5nNzExLmFsYXcuZGVjb2RlciIsICJnNzExZGVjIiwgImF1ZGlvX2RlY29kZXIuZzcxMWFsYXciIH0sCiAgICAgeyAiT01YLmdvb2dsZS5nNzExLm1sYXcuZGVjb2RlciIsICJnNzExZGVjIiwgImF1ZGlvX2RlY29kZXIuZzcxMW1sYXciIH0sCisgICAgeyAiT01YLmdvb2dsZS5tcGVnMi5kZWNvZGVyIiwgIm1wZWcyZGVjIiwgInZpZGVvX2RlY29kZXIubXBlZzIiIH0sCiAgICAgeyAiT01YLmdvb2dsZS5oMjYzLmRlY29kZXIiLCAibXBlZzRkZWMiLCAidmlkZW9fZGVjb2Rlci5oMjYzIiB9LAogICAgIHsgIk9NWC5nb29nbGUuaDI2My5lbmNvZGVyIiwgIm1wZWc0ZW5jIiwgInZpZGVvX2VuY29kZXIuaDI2MyIgfSwKICAgICB7ICJPTVguZ29vZ2xlLm1wZWc0LmRlY29kZXIiLCAibXBlZzRkZWMiLCAidmlkZW9fZGVjb2Rlci5tcGVnNCIgfSwKQEAgLTg1LDcgKzg2LDcgQEAKICAgICAgICAgdm9pZCAqbGliSGFuZGxlID0gZGxvcGVuKGxpYk5hbWUuY19zdHIoKSwgUlRMRF9OT1cpOwogCiAgICAgICAgIGlmIChsaWJIYW5kbGUgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoInVuYWJsZSB0byBkbG9wZW4gJXMiLCBsaWJOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgQUxPR0UoInVuYWJsZSB0byBkbG9wZW4gJXM6ICVzIiwgbGliTmFtZS5jX3N0cigpLCBkbGVycm9yKCkpOwogCiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQ29tcG9uZW50Tm90Rm91bmQ7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmNwcAppbmRleCBiMmQzNjIzLi5kNGQ2MjE3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuY3BwCkBAIC01MDAsMTIgKzUwMCwxMiBAQAogICAgIHNpemVfdCBzcmNTdHJpZGU7CiAgICAgc2l6ZV90IHNyY1ZTdHJpZGU7CiAgICAgaWYgKHVzaW5nR3JhcGhpY0J1ZmZlcikgewotICAgICAgICBpZiAoc3JjU2l6ZSA8IDQgKyBzaXplb2YoR3JhcGhpY0J1ZmZlciAqKSkgewotICAgICAgICAgICAgQUxPR0UoIk1ldGFkYXRhIGlzIHRvbyBzbWFsbCAoJXp1IHZzICV6dSkiLCBzcmNTaXplLCA0ICsgc2l6ZW9mKEdyYXBoaWNCdWZmZXIgKikpOworICAgICAgICBpZiAoc3JjU2l6ZSA8IHNpemVvZihPTVhfVTMyKSArIHNpemVvZihHcmFwaGljQnVmZmVyICopKSB7CisgICAgICAgICAgICBBTE9HRSgiTWV0YWRhdGEgaXMgdG9vIHNtYWxsICglenUgdnMgJXp1KSIsIHNyY1NpemUsIHNpemVvZihPTVhfVTMyKSArIHNpemVvZihHcmFwaGljQnVmZmVyICopKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAKLSAgICAgICAgR3JhcGhpY0J1ZmZlciAqYnVmZmVyID0gKihHcmFwaGljQnVmZmVyICoqKShzcmMgKyA0KTsKKyAgICAgICAgR3JhcGhpY0J1ZmZlciAqYnVmZmVyID0gKihHcmFwaGljQnVmZmVyICoqKShzcmMgKyBzaXplb2YoT01YX1UzMikpOwogICAgICAgICBoYW5kbGUgPSBidWZmZXItPmhhbmRsZTsKICAgICAgICAgZm9ybWF0ID0gYnVmZmVyLT5mb3JtYXQ7CiAgICAgICAgIHNyY1N0cmlkZSA9IGJ1ZmZlci0+c3RyaWRlOwpAQCAtNTE5LDEyICs1MTksMTIgQEAKICAgICB9IGVsc2UgewogICAgICAgICAvLyBUT0RPOiByZW1vdmUgdGhpcyBwYXJ0LiAgQ2hlY2sgaWYgYW55b25lIHVzZXMgdGhpcy4KIAotICAgICAgICBpZiAoc3JjU2l6ZSA8IDQgKyBzaXplb2YoYnVmZmVyX2hhbmRsZV90KSkgewotICAgICAgICAgICAgQUxPR0UoIk1ldGFkYXRhIGlzIHRvbyBzbWFsbCAoJXp1IHZzICV6dSkiLCBzcmNTaXplLCA0ICsgc2l6ZW9mKGJ1ZmZlcl9oYW5kbGVfdCkpOworICAgICAgICBpZiAoc3JjU2l6ZSA8IHNpemVvZihPTVhfVTMyKSArIHNpemVvZihidWZmZXJfaGFuZGxlX3QpKSB7CisgICAgICAgICAgICBBTE9HRSgiTWV0YWRhdGEgaXMgdG9vIHNtYWxsICglenUgdnMgJXp1KSIsIHNyY1NpemUsIHNpemVvZihPTVhfVTMyKSArIHNpemVvZihidWZmZXJfaGFuZGxlX3QpKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAKLSAgICAgICAgaGFuZGxlID0gKihidWZmZXJfaGFuZGxlX3QgKikoc3JjICsgNCk7CisgICAgICAgIGhhbmRsZSA9ICooYnVmZmVyX2hhbmRsZV90ICopKHNyYyArIHNpemVvZihPTVhfVTMyKSk7CiAgICAgICAgIC8vIGFzc3VtZSBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4OAogICAgICAgICAvLyB0aGVyZSBpcyBubyB3YXkgdG8gZ2V0IHRoZSBzcmMgc3RyaWRlIHdpdGhvdXQgdGhlIGdyYXBoaWMgYnVmZmVyCiAgICAgICAgIGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuY3BwCmluZGV4IGY0ZGZkNmIuLjY3ZmYxNDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5jcHAKQEAgLTI1MywyOSArMjUzLDYgQEAKICAgICByZXR1cm4gTWVkaWFFeHRyYWN0b3I6OkNyZWF0ZShzb3VyY2UpOwogfQogCi1zdGF0aWMgc3A8TWVkaWFTb3VyY2U+IE1ha2VTb3VyY2UoCi0gICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKLSAgICAgICAgY29uc3QgY2hhciAqbWltZVR5cGUpIHsKLSAgICBzcDxNZWRpYUV4dHJhY3Rvcj4gZXh0cmFjdG9yID0gQ3JlYXRlRXh0cmFjdG9yRnJvbVVSSSh1cmkpOwotCi0gICAgaWYgKGV4dHJhY3RvciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOyArK2kpIHsKLSAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBleHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoaSk7Ci0KLSAgICAgICAgY29uc3QgY2hhciAqdHJhY2tNSU1FOwotICAgICAgICBDSEVDSyhtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZ0cmFja01JTUUpKTsKLQotICAgICAgICBpZiAoIXN0cmNhc2VjbXAodHJhY2tNSU1FLCBtaW1lVHlwZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBleHRyYWN0b3ItPmdldFRyYWNrKGkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KIHN0YXR1c190IEhhcm5lc3M6OnRlc3RTdGF0ZVRyYW5zaXRpb25zKAogICAgICAgICBjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpjb21wb25lbnRSb2xlKSB7CiAgICAgaWYgKHN0cm5jbXAoY29tcG9uZW50TmFtZSwgIk9NWC4iLCA0KSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQU1SQXNzZW1ibGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUFNUkFzc2VtYmxlci5jcHAKaW5kZXggOWU4NzI1YS4uYmIyYTIzOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQU1SQXNzZW1ibGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FBTVJBc3NlbWJsZXIuY3BwCkBAIC0xNDMsOCArMTQzLDggQEAKICAgICAgICAgcmV0dXJuIE1BTEZPUk1FRF9QQUNLRVQ7CiAgICAgfQogCi0gICAgdW5zaWduZWQgcGF5bG9hZEhlYWRlciA9IGJ1ZmZlci0+ZGF0YSgpWzBdOwotICAgIHVuc2lnbmVkIENNUiA9IHBheWxvYWRIZWFkZXIgPj4gNDsKKyAgICB1bnNpZ25lZCBwYXlsb2FkSGVhZGVyIF9fdW51c2VkID0gYnVmZmVyLT5kYXRhKClbMF07CisgICAgdW5zaWduZWQgQ01SIF9fdW51c2VkID0gcGF5bG9hZEhlYWRlciA+PiA0OwogCiAgICAgVmVjdG9yPHVpbnQ4X3Q+IHRhYmxlT2ZDb250ZW50czsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzJUU0Fzc2VtYmxlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzJUU0Fzc2VtYmxlci5oCmluZGV4IDcxMmUxOGUuLmYzOWMyYjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUcyVFNBc3NlbWJsZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHMlRTQXNzZW1ibGVyLmgKQEAgLTI0LDcgKzI0LDcgQEAKIAogc3RydWN0IEFNZXNzYWdlOwogc3RydWN0IEFTdHJpbmc7Ci1zdHJ1Y3QgTWV0YURhdGE7CitjbGFzcyBNZXRhRGF0YTsKIAogc3RydWN0IEFNUEVHMlRTQXNzZW1ibGVyIDogcHVibGljIEFSVFBBc3NlbWJsZXIgewogICAgIEFNUEVHMlRTQXNzZW1ibGVyKApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRBdWRpb0Fzc2VtYmxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEF1ZGlvQXNzZW1ibGVyLmNwcAppbmRleCA4NTE4MDVmLi5hMWE2NTc2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEF1ZGlvQXNzZW1ibGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEF1ZGlvQXNzZW1ibGVyLmNwcApAQCAtMTA4LDcgKzEwOCw3IEBACiBzdGF0aWMgc3RhdHVzX3QgcGFyc2VHQVNwZWNpZmljQ29uZmlnKAogICAgICAgICBBQml0UmVhZGVyICpiaXRzLAogICAgICAgICB1bnNpZ25lZCBhdWRpb09iamVjdFR5cGUsIHVuc2lnbmVkIGNoYW5uZWxDb25maWd1cmF0aW9uKSB7Ci0gICAgdW5zaWduZWQgZnJhbWVMZW5ndGhGbGFnID0gYml0cy0+Z2V0Qml0cygxKTsKKyAgICB1bnNpZ25lZCBmcmFtZUxlbmd0aEZsYWcgX191bnVzZWQgPSBiaXRzLT5nZXRCaXRzKDEpOwogICAgIHVuc2lnbmVkIGRlcGVuZHNPbkNvcmVDb2RlciA9IGJpdHMtPmdldEJpdHMoMSk7CiAgICAgaWYgKGRlcGVuZHNPbkNvcmVDb2RlcikgewogICAgICAgICAvKiB1bnNpZ25lZCBjb3JlQ29kZXJEZWxheSA9ICovYml0cy0+Z2V0Qml0cygxKTsKQEAgLTIxNyw3ICsyMTcsNyBAQAogICAgICAgICAgICAgICAgIC8vIEFwcGFyZW50bHkgYW4gZXh0ZW5zaW9uIGlzIGFsd2F5cyBjb25zaWRlcmVkIGFuIGV2ZW4KICAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSBvZiA4IGJpdHMgbG9uZy4KIAotICAgICAgICAgICAgICAgIEFMT0dJKCJTa2lwcGluZyAlZCBiaXRzIGFmdGVyIHN5bmMgZXh0ZW5zaW9uIiwKKyAgICAgICAgICAgICAgICBBTE9HSSgiU2tpcHBpbmcgJXp1IGJpdHMgYWZ0ZXIgc3luYyBleHRlbnNpb24iLAogICAgICAgICAgICAgICAgICAgICAgOCAtIChudW1CaXRzSW5FeHRlbnNpb24gJiA3KSk7CiAKICAgICAgICAgICAgICAgICBiaXRzLT5za2lwQml0cyg4IC0gKG51bUJpdHNJbkV4dGVuc2lvbiAmIDcpKTsKQEAgLTQyMyw3ICs0MjMsNyBAQAogICAgIH0KIAogICAgIGlmIChvZmZzZXQgPCBidWZmZXItPnNpemUoKSkgewotICAgICAgICBBTE9HSSgiaWdub3JpbmcgJWQgYnl0ZXMgb2YgdHJhaWxpbmcgZGF0YSIsIGJ1ZmZlci0+c2l6ZSgpIC0gb2Zmc2V0KTsKKyAgICAgICAgQUxPR0koImlnbm9yaW5nICV6dSBieXRlcyBvZiB0cmFpbGluZyBkYXRhIiwgYnVmZmVyLT5zaXplKCkgLSBvZmZzZXQpOwogICAgIH0KICAgICBDSEVDS19MRShvZmZzZXQsIGJ1ZmZlci0+c2l6ZSgpKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlci5jcHAKaW5kZXggN2ViNjU0Mi4uMTU2MDA0YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEVsZW1lbnRhcnlBc3NlbWJsZXIuY3BwCkBAIC0zNjAsNyArMzYwLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChvZmZzZXQgIT0gYnVmZmVyLT5zaXplKCkpIHsKLSAgICAgICAgICAgIEFMT0dXKCJwb3RlbnRpYWxseSBtYWxmb3JtZWQgcGFja2V0IChvZmZzZXQgJWQsIHNpemUgJWQpIiwKKyAgICAgICAgICAgIEFMT0dXKCJwb3RlbnRpYWxseSBtYWxmb3JtZWQgcGFja2V0IChvZmZzZXQgJXp1LCBzaXplICV6dSkiLAogICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIGJ1ZmZlci0+c2l6ZSgpKTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVBhY2tldFNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuY3BwCmluZGV4IDA5ZjUyYmMuLmNmYWZhYTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVBhY2tldFNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUGFja2V0U291cmNlLmNwcApAQCAtMjc5LDggKzI3OSw2IEBACiAgICAgLy8gYmUgZW5jb2RlZC4KICAgICBDSEVDS19MVCgyMCArIGNvbmZpZy0+c2l6ZSgpLCAxMjh1KTsKIAotICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBjb25maWctPmRhdGEoKTsKLQogICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtTdGF0aWNFU0RTW10gPSB7CiAgICAgICAgIDB4MDMsIDIyLAogICAgICAgICAweDAwLCAweDAwLCAgICAgLy8gRVNfSUQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5jcHAKaW5kZXggMzcyZmJlOS4uYTZiZDgyNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5jcHAKQEAgLTY2NCwxMSArNjY0LDEwIEBACiAKICAgICBTdHJlYW1JbmZvICpzID0gJippdDsKIAotICAgIHN0YXR1c190IGVycjsKICAgICBpZiAoaXQtPm1SVFBTb2NrZXQgPT0gaW5kZXgpIHsKLSAgICAgICAgZXJyID0gcGFyc2VSVFAocywgYnVmZmVyKTsKKyAgICAgICAgcGFyc2VSVFAocywgYnVmZmVyKTsKICAgICB9IGVsc2UgewotICAgICAgICBlcnIgPSBwYXJzZVJUQ1AocywgYnVmZmVyKTsKKyAgICAgICAgcGFyc2VSVENQKHMsIGJ1ZmZlcik7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmNwcAppbmRleCA3OTNkMTE2Li5lMTYwN2JmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5jcHAKQEAgLTQ2MSw3ICs0NjEsNyBAQAogICAgICAgICBzZHAuYXBwZW5kKCJtPWF1ZGlvICIpOwogICAgIH0KIAotICAgIHNkcC5hcHBlbmQoU3RyaW5nUHJpbnRmKCIlZCIsIG50b2hzKG1SVFBBZGRyLnNpbl9wb3J0KSkpOworICAgIHNkcC5hcHBlbmQoQVN0cmluZ1ByaW50ZigiJWQiLCBudG9ocyhtUlRQQWRkci5zaW5fcG9ydCkpKTsKICAgICBzZHAuYXBwZW5kKAogICAgICAgICAgICIgUlRQL0FWUCAiIFBUX1NUUiAiXHJcbiIKICAgICAgICAgICAiYj1BUyAzMjAwMDBcclxuIgpAQCAtNDgwLDcgKzQ4MCw3IEBACiAgICAgICAgIENIRUNLX0VRKHNhbXBsZVJhdGUsIChtTW9kZSA9PSBBTVJfTkIpID8gODAwMCA6IDE2MDAwKTsKIAogICAgICAgICBzZHAuYXBwZW5kKG1Nb2RlID09IEFNUl9OQiA/ICJBTVIiIDogIkFNUi1XQiIpOwotICAgICAgICBzZHAuYXBwZW5kKFN0cmluZ1ByaW50ZigiLyVkLyVkIiwgc2FtcGxlUmF0ZSwgbnVtQ2hhbm5lbHMpKTsKKyAgICAgICAgc2RwLmFwcGVuZChBU3RyaW5nUHJpbnRmKCIvJWQvJWQiLCBzYW1wbGVSYXRlLCBudW1DaGFubmVscykpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIFRSRVNQQVNTKCk7CiAgICAgfQpAQCAtNTQzLDcgKzU0Myw3IEBACiAgICAgQ0hFQ0tfRVEoKHVuc2lnbmVkKWRhdGFbMF0sIDB4Njd1KTsKIAogICAgIG1Qcm9maWxlTGV2ZWwgPQotICAgICAgICBTdHJpbmdQcmludGYoIiUwMlglMDJYJTAyWCIsIGRhdGFbMV0sIGRhdGFbMl0sIGRhdGFbM10pOworICAgICAgICBBU3RyaW5nUHJpbnRmKCIlMDJYJTAyWCUwMlgiLCBkYXRhWzFdLCBkYXRhWzJdLCBkYXRhWzNdKTsKIAogICAgIGVuY29kZUJhc2U2NChkYXRhLCBzdGFydENvZGVQb3MsICZtU2VxUGFyYW1TZXQpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKaW5kZXggZjI1NTM5Yy4uNjBiM2FhZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcApAQCAtNDIsNyArNDIsNyBAQAogCiAvLyBzdGF0aWMKIGNvbnN0IEFTdHJpbmcgQVJUU1BDb25uZWN0aW9uOjpzVXNlckFnZW50ID0KLSAgICBTdHJpbmdQcmludGYoIlVzZXItQWdlbnQ6ICVzXHJcbiIsIE1ha2VVc2VyQWdlbnQoKS5jX3N0cigpKTsKKyAgICBBU3RyaW5nUHJpbnRmKCJVc2VyLUFnZW50OiAlc1xyXG4iLCBNYWtlVXNlckFnZW50KCkuY19zdHIoKSk7CiAKIEFSVFNQQ29ubmVjdGlvbjo6QVJUU1BDb25uZWN0aW9uKGJvb2wgdWlkVmFsaWQsIHVpZF90IHVpZCkKICAgICA6IG1VSURWYWxpZCh1aWRWYWxpZCksCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSYXdBdWRpb0Fzc2VtYmxlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUmF3QXVkaW9Bc3NlbWJsZXIuaAppbmRleCBlZDdhZjA4Li5iYzFkZWE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSYXdBdWRpb0Fzc2VtYmxlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJhd0F1ZGlvQXNzZW1ibGVyLmgKQEAgLTI0LDcgKzI0LDcgQEAKIAogc3RydWN0IEFNZXNzYWdlOwogc3RydWN0IEFTdHJpbmc7Ci1zdHJ1Y3QgTWV0YURhdGE7CitjbGFzcyBNZXRhRGF0YTsKIAogc3RydWN0IEFSYXdBdWRpb0Fzc2VtYmxlciA6IHB1YmxpYyBBUlRQQXNzZW1ibGVyIHsKICAgICBBUmF3QXVkaW9Bc3NlbWJsZXIoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQubWsKaW5kZXggZDYwZGMyZi4uOWZlZGI3MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5tawpAQCAtMTksMTAgKzE5LDExIEBACiAgICAgICAgIEFTZXNzaW9uRGVzY3JpcHRpb24uY3BwICAgICBcCiAgICAgICAgIFNEUExvYWRlci5jcHAgICAgICAgICAgICAgICBcCiAKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliY3J5cHRvCisKIExPQ0FMX0NfSU5DTFVERVM6PSBcCiAJJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAotCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAotCSQoVE9QKS9leHRlcm5hbC9vcGVuc3NsL2luY2x1ZGUKKwkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKIExPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X3J0c3AKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKaW5kZXggNDIzYTQyMC4uM2JmNDg5YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oCkBAIC0xNTYsNyArMTU2LDcgQEAKICAgICAgICAgICAgIG1TZXNzaW9uVVJMLmFwcGVuZCgicnRzcDovLyIpOwogICAgICAgICAgICAgbVNlc3Npb25VUkwuYXBwZW5kKGhvc3QpOwogICAgICAgICAgICAgbVNlc3Npb25VUkwuYXBwZW5kKCI6Iik7Ci0gICAgICAgICAgICBtU2Vzc2lvblVSTC5hcHBlbmQoU3RyaW5nUHJpbnRmKCIldSIsIHBvcnQpKTsKKyAgICAgICAgICAgIG1TZXNzaW9uVVJMLmFwcGVuZChBU3RyaW5nUHJpbnRmKCIldSIsIHBvcnQpKTsKICAgICAgICAgICAgIG1TZXNzaW9uVVJMLmFwcGVuZChwYXRoKTsKIAogICAgICAgICAgICAgQUxPR1YoInJld3JpdHRlbiBzZXNzaW9uIHVybDogJyVzJyIsIG1TZXNzaW9uVVJMLmNfc3RyKCkpOwpAQCAtNTA4LDcgKzUwOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25VUkwuYXBwZW5kKCJydHNwOi8vIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25VUkwuYXBwZW5kKGhvc3QpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uVVJMLmFwcGVuZCgiOiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uVVJMLmFwcGVuZChTdHJpbmdQcmludGYoIiV1IiwgcG9ydCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uVVJMLmFwcGVuZChBU3RyaW5nUHJpbnRmKCIldSIsIHBvcnQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvblVSTC5hcHBlbmQocGF0aCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HSSgicmV3cml0dGVuIHNlc3Npb24gdXJsOiAnJXMnIiwgbVNlc3Npb25VUkwuY19zdHIoKSk7CkBAIC0xMjM4LDcgKzEyMzgsNyBAQAogICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CiAKICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTdHJpbmdQcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJhbmdlOiBucHQ9JWxsZC1cclxuIiwgdGltZVVzIC8gMTAwMDAwMGxsKSk7CiAKICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuY3BwCmluZGV4IDQyNGJhZGYuLmEyNGViNjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5jcHAKQEAgLTEwNSw3ICsxMDUsNyBAQAogICAgICAgICBoZWFkZXJzID0gTlVMTDsKICAgICB9CiAKLSAgICBvZmY2NF90IHNkcFNpemU7CisgICAgb2ZmNjRfdCBzZHBTaXplID0gMDsKICAgICBpZiAoZXJyID09IE9LICYmICFtQ2FuY2VsbGVkKSB7CiAgICAgICAgIGVyciA9IG1IVFRQRGF0YVNvdXJjZS0+Z2V0U2l6ZSgmc2RwU2l6ZSk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9BbmRyb2lkLm1rCmluZGV4IDk5YjQ4MGFkLi44ZDZmZjViIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0FuZHJvaWQubWsKQEAgLTEsOCArMSw3IEBACiAjIEJ1aWxkIHRoZSB1bml0IHRlc3RzLgogTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotaWZuZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKK0xPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9ICQoTE9DQUxfUEFUSCkvQW5kcm9pZC5tawogCiBMT0NBTF9NT0RVTEUgOj0gU3VyZmFjZU1lZGlhU291cmNlX3Rlc3QKIApAQCAtMjIsMzMgKzIxLDIzIEBACiAJbGlic3RhZ2VmcmlnaHQgXAogCWxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAogCWxpYnN0YWdlZnJpZ2h0X29teCBcCi0JbGlic3RscG9ydCBcCiAJbGlic3luYyBcCiAJbGlidWkgXAogCWxpYnV0aWxzIFwKIAlsaWJsb2cKIAotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCi0JbGliZ3Rlc3QgXAotCWxpYmd0ZXN0X21haW4gXAotCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKLQliaW9uaWMgXAotCWJpb25pYy9saWJzdGRjKysvaW5jbHVkZSBcCi0JZXh0ZXJuYWwvZ3Rlc3QvaW5jbHVkZSBcCi0JZXh0ZXJuYWwvc3RscG9ydC9zdGxwb3J0IFwKIAlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKIAlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAogCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogCiBMT0NBTF8zMl9CSVRfT05MWSA6PSB0cnVlCiAKLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQotCi1lbmRpZgoraW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQogCiAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMgOj0gJChMT0NBTF9QQVRIKS9BbmRyb2lkLm1rCiAKIExPQ0FMX01PRFVMRSA6PSBVdGlsc190ZXN0CiAKQEAgLTY0LDIzICs1MywxNCBAQAogCWxpYnN0YWdlZnJpZ2h0IFwKIAlsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKIAlsaWJzdGFnZWZyaWdodF9vbXggXAotCWxpYnN0bHBvcnQgXAotCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKLQlsaWJndGVzdCBcCi0JbGliZ3Rlc3RfbWFpbiBcCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAotCWJpb25pYyBcCi0JYmlvbmljL2xpYnN0ZGMrKy9pbmNsdWRlIFwKLQlleHRlcm5hbC9ndGVzdC9pbmNsdWRlIFwKLQlleHRlcm5hbC9zdGxwb3J0L3N0bHBvcnQgXAogCWZyYW1ld29ya3MvYXYvaW5jbHVkZSBcCiAJZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCiAJZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKIAkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKIAotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCitpbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCiAKICMgSW5jbHVkZSBzdWJkaXJlY3RvcnkgbWFrZWZpbGVzCiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dERyaXZlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0RHJpdmVyLmNwcAppbmRleCA3MWFhMjFlLi41NWE5ODAzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0RHJpdmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0RHJpdmVyLmNwcApAQCAtMTMzLDcgKzEzMyw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtUGxheWVyLT5zdGFydCgpOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1dDoKKyAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIFRSRVNQQVNTKCk7CiAgICAgfQogICAgIHJldHVybiByZXQ7CkBAIC0xODEsNyArMTgxLDcgQEAKICAgICAgICAgY2FzZSBQTEFZSU5HOgogICAgICAgICAgICAgbVBsYXllci0+c2Vla1RvQXN5bmModGltZVVzKTsKICAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgZGVmYXV0OgorICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgVFJFU1BBU1MoKTsKICAgICB9CiAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0UGxheWVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0UGxheWVyLmgKaW5kZXggZWM4ZWQyNS4uOWNiNDllYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dFBsYXllci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHRQbGF5ZXIuaApAQCAtMjcsNyArMjcsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIEFNZXNzYWdlOworc3RydWN0IEFNZXNzYWdlOwogY2xhc3MgTWVkaWFQbGF5ZXJCYXNlOwogY2xhc3MgVGltZWRUZXh0RHJpdmVyOwogY2xhc3MgVGltZWRUZXh0U291cmNlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dFNSVFNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dFNSVFNvdXJjZS5oCmluZGV4IDU5OGMyMDAuLjIzMjY3NWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHRTUlRTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0U1JUU291cmNlLmgKQEAgLTI1LDcgKzI1LDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBBU3RyaW5nOworc3RydWN0IEFTdHJpbmc7CiBjbGFzcyBEYXRhU291cmNlOwogY2xhc3MgTWVkaWFCdWZmZXI7CiBjbGFzcyBQYXJjZWw7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9UaW1lZFRleHRTUlRTb3VyY2VfdGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9UaW1lZFRleHRTUlRTb3VyY2VfdGVzdC5jcHAKaW5kZXggNDBlOTNjNy4uM2EwNmQ2MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvVGltZWRUZXh0U1JUU291cmNlX3Rlc3QuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L1RpbWVkVGV4dFNSVFNvdXJjZV90ZXN0LmNwcApAQCAtMTIwLDI2ICsxMjAsMjYgQEAKICAgICAgICAgZXJyID0gbVNvdXJjZS0+cmVhZCgmc3RhcnRUaW1lVXMsICZlbmRUaW1lVXMsICZwYXJjZWwpOwogICAgICAgICBFWFBFQ1RfRVEoT0ssIGVycik7CiAgICAgICAgIENoZWNrU3RhcnRUaW1lTXMocGFyY2VsLCBpICoga1NlY1RvTXNlYyk7Ci0gICAgICAgIHN1YnRpdGxlID0gU3RyaW5nUHJpbnRmKCIlZFxuXG4iLCBpKTsKKyAgICAgICAgc3VidGl0bGUgPSBBU3RyaW5nUHJpbnRmKCIlZFxuXG4iLCBpKTsKICAgICAgICAgQ2hlY2tEYXRhRXF1YWxzKHBhcmNlbCwgc3VidGl0bGUuY19zdHIoKSk7CiAgICAgfQogICAgIC8vIHJlYWQgZWRnZSBjYXNlcwogICAgIGVyciA9IG1Tb3VyY2UtPnJlYWQoJnN0YXJ0VGltZVVzLCAmZW5kVGltZVVzLCAmcGFyY2VsKTsKICAgICBFWFBFQ1RfRVEoT0ssIGVycik7CiAgICAgQ2hlY2tTdGFydFRpbWVNcyhwYXJjZWwsIDU1MDApOwotICAgIHN1YnRpdGxlID0gU3RyaW5nUHJpbnRmKCI2XG5cbiIpOworICAgIHN1YnRpdGxlID0gQVN0cmluZ1ByaW50ZigiNlxuXG4iKTsKICAgICBDaGVja0RhdGFFcXVhbHMocGFyY2VsLCBzdWJ0aXRsZS5jX3N0cigpKTsKIAogICAgIGVyciA9IG1Tb3VyY2UtPnJlYWQoJnN0YXJ0VGltZVVzLCAmZW5kVGltZVVzLCAmcGFyY2VsKTsKICAgICBFWFBFQ1RfRVEoT0ssIGVycik7CiAgICAgQ2hlY2tTdGFydFRpbWVNcyhwYXJjZWwsIDU4MDApOwotICAgIHN1YnRpdGxlID0gU3RyaW5nUHJpbnRmKCI3XG5cbiIpOworICAgIHN1YnRpdGxlID0gQVN0cmluZ1ByaW50ZigiN1xuXG4iKTsKICAgICBDaGVja0RhdGFFcXVhbHMocGFyY2VsLCBzdWJ0aXRsZS5jX3N0cigpKTsKIAogICAgIGVyciA9IG1Tb3VyY2UtPnJlYWQoJnN0YXJ0VGltZVVzLCAmZW5kVGltZVVzLCAmcGFyY2VsKTsKICAgICBFWFBFQ1RfRVEoT0ssIGVycik7CiAgICAgQ2hlY2tTdGFydFRpbWVNcyhwYXJjZWwsIDYwMDApOwotICAgIHN1YnRpdGxlID0gU3RyaW5nUHJpbnRmKCI4XG5cbiIpOworICAgIHN1YnRpdGxlID0gQVN0cmluZ1ByaW50ZigiOFxuXG4iKTsKICAgICBDaGVja0RhdGFFcXVhbHMocGFyY2VsLCBzdWJ0aXRsZS5jX3N0cigpKTsKIAogICAgIGVyciA9IG1Tb3VyY2UtPnJlYWQoJnN0YXJ0VGltZVVzLCAmZW5kVGltZVVzLCAmcGFyY2VsKTsKQEAgLTIwMiwyMSArMjAyLDIxIEBACiAgICAgZXJyID0gbVNvdXJjZS0+cmVhZCgmc3RhcnRUaW1lVXMsICZlbmRUaW1lVXMsICZwYXJjZWwsICZvcHRpb25zKTsKICAgICBFWFBFQ1RfRVEoT0ssIGVycik7CiAgICAgRVhQRUNUX0VRKDU1MDAgKiBrTXNlY1RvVXNlYywgc3RhcnRUaW1lVXMpOwotICAgIHN1YnRpdGxlID0gU3RyaW5nUHJpbnRmKCI2XG5cbiIpOworICAgIHN1YnRpdGxlID0gQVN0cmluZ1ByaW50ZigiNlxuXG4iKTsKICAgICBDaGVja0RhdGFFcXVhbHMocGFyY2VsLCBzdWJ0aXRsZS5jX3N0cigpKTsKIAogICAgIG9wdGlvbnMuc2V0U2Vla1RvKDU4MDAgKiBrTXNlY1RvVXNlYywgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkMpOwogICAgIGVyciA9IG1Tb3VyY2UtPnJlYWQoJnN0YXJ0VGltZVVzLCAmZW5kVGltZVVzLCAmcGFyY2VsLCAmb3B0aW9ucyk7CiAgICAgRVhQRUNUX0VRKE9LLCBlcnIpOwogICAgIEVYUEVDVF9FUSg1ODAwICoga01zZWNUb1VzZWMsIHN0YXJ0VGltZVVzKTsKLSAgICBzdWJ0aXRsZSA9IFN0cmluZ1ByaW50ZigiN1xuXG4iKTsKKyAgICBzdWJ0aXRsZSA9IEFTdHJpbmdQcmludGYoIjdcblxuIik7CiAgICAgQ2hlY2tEYXRhRXF1YWxzKHBhcmNlbCwgc3VidGl0bGUuY19zdHIoKSk7CiAKICAgICBvcHRpb25zLnNldFNlZWtUbyg2MDAwICoga01zZWNUb1VzZWMsIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DKTsKICAgICBlcnIgPSBtU291cmNlLT5yZWFkKCZzdGFydFRpbWVVcywgJmVuZFRpbWVVcywgJnBhcmNlbCwgJm9wdGlvbnMpOwogICAgIEVYUEVDVF9FUShPSywgZXJyKTsKICAgICBFWFBFQ1RfRVEoNjAwMCAqIGtNc2VjVG9Vc2VjLCBzdGFydFRpbWVVcyk7Ci0gICAgc3VidGl0bGUgPSBTdHJpbmdQcmludGYoIjhcblxuIik7CisgICAgc3VidGl0bGUgPSBBU3RyaW5nUHJpbnRmKCI4XG5cbiIpOwogICAgIENoZWNrRGF0YUVxdWFscyhwYXJjZWwsIHN1YnRpdGxlLmNfc3RyKCkpOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmNwcAppbmRleCAwM2NmOTJhLi4wNjk5NjFiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibVdyaXRlci5jcHAKQEAgLTMzMyw3ICszMzMsNiBAQAogICAgIHNlcmlhbGl6ZUNvZGVkVW5zaWduZWQoc2VnbWVudFNpemVDb2RlZCwgYmFyeSk7CiAgICAgOjp3cml0ZShtRmQsIGJhcnksIHNpemVPZihrTWt2VW5rbm93bkxlbmd0aCkpOwogCi0gICAgdWludDY0X3Qgc2l6ZTsKICAgICB1aW50NjRfdCBkdXJhdGlvbk9mZnNldCA9IG1JbmZvT2Zmc2V0ICsgc2l6ZU9mKGtNa3ZJbmZvKSArIHNpemVPZihtSW5mb1NpemUpCiAgICAgICAgICsgc2l6ZU9mKGtNa3ZTZWdtZW50RHVyYXRpb24pICsgc2l6ZU9mKHNpemVvZihkb3VibGUpKTsKICAgICBzcDxXZWJtRWxlbWVudD4gZHVyYXRpb24gPSBuZXcgV2VibUZsb2F0KApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L1ZpZGVvRm9ybWF0cy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvVmlkZW9Gb3JtYXRzLmNwcAppbmRleCAwNGUwMmMxLi4yZjRhZjViIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvVmlkZW9Gb3JtYXRzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvVmlkZW9Gb3JtYXRzLmNwcApAQCAtNDM1LDcgKzQzNSw3IEBACiAgICAgLy8gICBtYXgtaHJlcyAobm9uZSBvciAyIGJ5dGUpCiAgICAgLy8gICBtYXgtdnJlcyAobm9uZSBvciAyIGJ5dGUpCiAKLSAgICByZXR1cm4gU3RyaW5nUHJpbnRmKAorICAgIHJldHVybiBBU3RyaW5nUHJpbnRmKAogICAgICAgICAgICAgIiUwMnggMDAgJTAyeCAlMDJ4ICUwOHggJTA4eCAlMDh4IDAwIDAwMDAgMDAwMCAwMCBub25lIG5vbmUiLAogICAgICAgICAgICAgZm9yTTRNZXNzYWdlID8gMHgwMCA6ICgobU5hdGl2ZUluZGV4IDw8IDMpIHwgbU5hdGl2ZVR5cGUpLAogICAgICAgICAgICAgbUNvbmZpZ3NbbU5hdGl2ZVR5cGVdW21OYXRpdmVJbmRleF0ucHJvZmlsZSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvVFNQYWNrZXRpemVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvVFNQYWNrZXRpemVyLmNwcAppbmRleCA1MGQzMTdhLi40YzVhZDE3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1RTUGFja2V0aXplci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9UU1BhY2tldGl6ZXIuY3BwCkBAIC0xMDYsNyArMTA2LDcgQEAKICAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKG1NSU1FLmNfc3RyKCksIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykpIHsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7OyArK2kpIHsKICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGNzZDsKLSAgICAgICAgICAgIGlmICghbUZvcm1hdC0+ZmluZEJ1ZmZlcihTdHJpbmdQcmludGYoImNzZC0lZCIsIGkpLmNfc3RyKCksICZjc2QpKSB7CisgICAgICAgICAgICBpZiAoIW1Gb3JtYXQtPmZpbmRCdWZmZXIoQVN0cmluZ1ByaW50ZigiY3NkLSVkIiwgaSkuY19zdHIoKSwgJmNzZCkpIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9XaWZpRGlzcGxheVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1dpZmlEaXNwbGF5U291cmNlLmNwcAppbmRleCBkYTQwNWUyLi43ZWI4YjczIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1dpZmlEaXNwbGF5U291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1dpZmlEaXNwbGF5U291cmNlLmNwcApAQCAtNDMsNiArNDMsMTAgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gc3RhdGljCitjb25zdCBpbnQ2NF90IFdpZmlEaXNwbGF5U291cmNlOjprUmVhcGVySW50ZXJ2YWxVczsKK2NvbnN0IGludDY0X3QgV2lmaURpc3BsYXlTb3VyY2U6OmtUZWFyZG93blRyaWdnZXJUaW1lb3VTZWNzOworY29uc3QgaW50NjRfdCBXaWZpRGlzcGxheVNvdXJjZTo6a1BsYXliYWNrU2Vzc2lvblRpbWVvdXRTZWNzOworY29uc3QgaW50NjRfdCBXaWZpRGlzcGxheVNvdXJjZTo6a1BsYXliYWNrU2Vzc2lvblRpbWVvdXRVczsKIGNvbnN0IEFTdHJpbmcgV2lmaURpc3BsYXlTb3VyY2U6OnNVc2VyQWdlbnQgPSBNYWtlVXNlckFnZW50KCk7CiAKIFdpZmlEaXNwbGF5U291cmNlOjpXaWZpRGlzcGxheVNvdXJjZSgKQEAgLTU5NCw3ICs1OTgsNyBAQAogICAgIEFwcGVuZENvbW1vblJlc3BvbnNlKCZyZXF1ZXN0LCBtTmV4dENTZXEpOwogCiAgICAgcmVxdWVzdC5hcHBlbmQoIkNvbnRlbnQtVHlwZTogdGV4dC9wYXJhbWV0ZXJzXHJcbiIpOwotICAgIHJlcXVlc3QuYXBwZW5kKFN0cmluZ1ByaW50ZigiQ29udGVudC1MZW5ndGg6ICVkXHJcbiIsIGJvZHkuc2l6ZSgpKSk7CisgICAgcmVxdWVzdC5hcHBlbmQoQVN0cmluZ1ByaW50ZigiQ29udGVudC1MZW5ndGg6ICVkXHJcbiIsIGJvZHkuc2l6ZSgpKSk7CiAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKICAgICByZXF1ZXN0LmFwcGVuZChib2R5KTsKIApAQCAtNjM1LDI2ICs2MzksMjYgQEAKIAogICAgIGlmIChtU2lua1N1cHBvcnRzQXVkaW8pIHsKICAgICAgICAgYm9keS5hcHBlbmQoCi0gICAgICAgICAgICAgICAgU3RyaW5nUHJpbnRmKCJ3ZmRfYXVkaW9fY29kZWNzOiAlc1xyXG4iLAorICAgICAgICAgICAgICAgIEFTdHJpbmdQcmludGYoIndmZF9hdWRpb19jb2RlY3M6ICVzXHJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVXNpbmdQQ01BdWRpbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJMUENNIDAwMDAwMDAyIDAwIiAvLyAyIGNoIFBDTSA0OGtIegogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJBQUMgMDAwMDAwMDEgMDAiKSkpOyAgLy8gMiBjaCBBQUMgNDhrSHoKICAgICB9CiAKICAgICBib2R5LmFwcGVuZCgKLSAgICAgICAgICAgIFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgIEFTdHJpbmdQcmludGYoCiAgICAgICAgICAgICAgICAgIndmZF9wcmVzZW50YXRpb25fVVJMOiBydHNwOi8vJXMvd2ZkMS4wL3N0cmVhbWlkPTAgbm9uZVxyXG4iLAogICAgICAgICAgICAgICAgIG1DbGllbnRJbmZvLm1Mb2NhbElQLmNfc3RyKCkpKTsKIAogICAgIGJvZHkuYXBwZW5kKAotICAgICAgICAgICAgU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgQVN0cmluZ1ByaW50ZigKICAgICAgICAgICAgICAgICAid2ZkX2NsaWVudF9ydHBfcG9ydHM6ICVzXHJcbiIsIG1XZmRDbGllbnRSdHBQb3J0cy5jX3N0cigpKSk7CiAKICAgICBBU3RyaW5nIHJlcXVlc3QgPSAiU0VUX1BBUkFNRVRFUiBydHNwOi8vbG9jYWxob3N0L3dmZDEuMCBSVFNQLzEuMFxyXG4iOwogICAgIEFwcGVuZENvbW1vblJlc3BvbnNlKCZyZXF1ZXN0LCBtTmV4dENTZXEpOwogCiAgICAgcmVxdWVzdC5hcHBlbmQoIkNvbnRlbnQtVHlwZTogdGV4dC9wYXJhbWV0ZXJzXHJcbiIpOwotICAgIHJlcXVlc3QuYXBwZW5kKFN0cmluZ1ByaW50ZigiQ29udGVudC1MZW5ndGg6ICVkXHJcbiIsIGJvZHkuc2l6ZSgpKSk7CisgICAgcmVxdWVzdC5hcHBlbmQoQVN0cmluZ1ByaW50ZigiQ29udGVudC1MZW5ndGg6ICVkXHJcbiIsIGJvZHkuc2l6ZSgpKSk7CiAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKICAgICByZXF1ZXN0LmFwcGVuZChib2R5KTsKIApAQCAtNzAwLDcgKzcwNCw3IEBACiAgICAgQXBwZW5kQ29tbW9uUmVzcG9uc2UoJnJlcXVlc3QsIG1OZXh0Q1NlcSk7CiAKICAgICByZXF1ZXN0LmFwcGVuZCgiQ29udGVudC1UeXBlOiB0ZXh0L3BhcmFtZXRlcnNcclxuIik7Ci0gICAgcmVxdWVzdC5hcHBlbmQoU3RyaW5nUHJpbnRmKCJDb250ZW50LUxlbmd0aDogJWRcclxuIiwgYm9keS5zaXplKCkpKTsKKyAgICByZXF1ZXN0LmFwcGVuZChBU3RyaW5nUHJpbnRmKCJDb250ZW50LUxlbmd0aDogJWRcclxuIiwgYm9keS5zaXplKCkpKTsKICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOwogICAgIHJlcXVlc3QuYXBwZW5kKGJvZHkpOwogCkBAIC03MjUsNyArNzI5LDcgQEAKIAogICAgIENIRUNLX0VRKHNlc3Npb25JRCwgbUNsaWVudFNlc3Npb25JRCk7CiAgICAgcmVxdWVzdC5hcHBlbmQoCi0gICAgICAgICAgICBTdHJpbmdQcmludGYoIlNlc3Npb246ICVkXHJcbiIsIG1DbGllbnRJbmZvLm1QbGF5YmFja1Nlc3Npb25JRCkpOworICAgICAgICAgICAgQVN0cmluZ1ByaW50ZigiU2Vzc2lvbjogJWRcclxuIiwgbUNsaWVudEluZm8ubVBsYXliYWNrU2Vzc2lvbklEKSk7CiAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsgIC8vIEVtcHR5IGJvZHkKIAogICAgIHN0YXR1c190IGVyciA9CkBAIC0xMzAxLDcgKzEzMDUsNyBAQAogCiAgICAgaWYgKHJ0cE1vZGUgPT0gUlRQU2VuZGVyOjpUUkFOU1BPUlRfVENQX0lOVEVSTEVBVkVEKSB7CiAgICAgICAgIHJlc3BvbnNlLmFwcGVuZCgKLSAgICAgICAgICAgICAgICBTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgQVN0cmluZ1ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgIlRyYW5zcG9ydDogUlRQL0FWUC9UQ1A7aW50ZXJsZWF2ZWQ9JWQtJWQ7IiwKICAgICAgICAgICAgICAgICAgICAgY2xpZW50UnRwLCBjbGllbnRSdGNwKSk7CiAgICAgfSBlbHNlIHsKQEAgLTEzMTQsMTQgKzEzMTgsMTQgQEAKIAogICAgICAgICBpZiAoY2xpZW50UnRjcCA+PSAwKSB7CiAgICAgICAgICAgICByZXNwb25zZS5hcHBlbmQoCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgQVN0cmluZ1ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgICJUcmFuc3BvcnQ6IFJUUC9BVlAvJXM7dW5pY2FzdDtjbGllbnRfcG9ydD0lZC0lZDsiCiAgICAgICAgICAgICAgICAgICAgICAgICAic2VydmVyX3BvcnQ9JWQtJWRcclxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydFN0cmluZy5jX3N0cigpLAogICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50UnRwLCBjbGllbnRSdGNwLCBzZXJ2ZXJSdHAsIHNlcnZlclJ0cCArIDEpKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHJlc3BvbnNlLmFwcGVuZCgKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICBBU3RyaW5nUHJpbnRmKAogICAgICAgICAgICAgICAgICAgICAgICAgIlRyYW5zcG9ydDogUlRQL0FWUC8lczt1bmljYXN0O2NsaWVudF9wb3J0PSVkOyIKICAgICAgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXJfcG9ydD0lZFxyXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0U3RyaW5nLmNfc3RyKCksCkBAIC0xNTgxLDE1ICsxNTg1LDE1IEBACiAgICAgcmVzcG9uc2UtPmFwcGVuZChidWYpOwogICAgIHJlc3BvbnNlLT5hcHBlbmQoIlxyXG4iKTsKIAotICAgIHJlc3BvbnNlLT5hcHBlbmQoU3RyaW5nUHJpbnRmKCJTZXJ2ZXI6ICVzXHJcbiIsIHNVc2VyQWdlbnQuY19zdHIoKSkpOworICAgIHJlc3BvbnNlLT5hcHBlbmQoQVN0cmluZ1ByaW50ZigiU2VydmVyOiAlc1xyXG4iLCBzVXNlckFnZW50LmNfc3RyKCkpKTsKIAogICAgIGlmIChjc2VxID49IDApIHsKLSAgICAgICAgcmVzcG9uc2UtPmFwcGVuZChTdHJpbmdQcmludGYoIkNTZXE6ICVkXHJcbiIsIGNzZXEpKTsKKyAgICAgICAgcmVzcG9uc2UtPmFwcGVuZChBU3RyaW5nUHJpbnRmKCJDU2VxOiAlZFxyXG4iLCBjc2VxKSk7CiAgICAgfQogCiAgICAgaWYgKHBsYXliYWNrU2Vzc2lvbklEID49IDBsbCkgewogICAgICAgICByZXNwb25zZS0+YXBwZW5kKAotICAgICAgICAgICAgICAgIFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICBBU3RyaW5nUHJpbnRmKAogICAgICAgICAgICAgICAgICAgICAiU2Vzc2lvbjogJWQ7dGltZW91dD0lbGxkXHJcbiIsCiAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrU2Vzc2lvbklELCBrUGxheWJhY2tTZXNzaW9uVGltZW91dFNlY3MpKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGV2aWNlLmNwcCBiL21lZGlhL210cC9NdHBEZXZpY2UuY3BwCmluZGV4IGUwZDY3OWQuLjNlYWZkNmYgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBEZXZpY2UuY3BwCisrKyBiL21lZGlhL210cC9NdHBEZXZpY2UuY3BwCkBAIC0xMzEsMTMgKzEzMSwyMiBAQAogICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcF9pbl9kZXNjID0gTlVMTDsKICAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBfb3V0X2Rlc2MgPSBOVUxMOwogICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcF9pbnRyX2Rlc2MgPSBOVUxMOworICAgICAgICAgICAgLy9VU0IzIGFkZCBVU0JfRFRfU1NfRU5EUE9JTlRfQ09NUCBhcyBjb21wYW5pb24gZGVzY3JpcHRvcjsKKyAgICAgICAgICAgIHN0cnVjdCB1c2Jfc3NfZXBfY29tcF9kZXNjcmlwdG9yICplcF9zc19lcF9jb21wX2Rlc2MgPSBOVUxMOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKICAgICAgICAgICAgICAgICBlcCA9IChzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKil1c2JfZGVzY3JpcHRvcl9pdGVyX25leHQoJml0ZXIpOworICAgICAgICAgICAgICAgIGlmIChlcCAmJiBlcC0+YkRlc2NyaXB0b3JUeXBlID09IFVTQl9EVF9TU19FTkRQT0lOVF9DT01QKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJEZXNjcmlwdG9yIHR5cGUgaXMgVVNCX0RUX1NTX0VORFBPSU5UX0NPTVAgZm9yIFVTQjMgXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgZXBfc3NfZXBfY29tcF9kZXNjID0gKHVzYl9zc19lcF9jb21wX2Rlc2NyaXB0b3IqKWVwOworICAgICAgICAgICAgICAgICAgICBlcCA9IChzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKil1c2JfZGVzY3JpcHRvcl9pdGVyX25leHQoJml0ZXIpOworICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBpZiAoIWVwIHx8IGVwLT5iRGVzY3JpcHRvclR5cGUgIT0gVVNCX0RUX0VORFBPSU5UKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJlbmRwb2ludHMgbm90IGZvdW5kXG4iKTsKICAgICAgICAgICAgICAgICAgICAgdXNiX2RldmljZV9jbG9zZShkZXZpY2UpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBpZiAoZXAtPmJtQXR0cmlidXRlcyA9PSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChlcC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykKICAgICAgICAgICAgICAgICAgICAgICAgIGVwX2luX2Rlc2MgPSBlcDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQubWsKaW5kZXggZjAxOTZjNi4uNDRkMjU1MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQubWsKQEAgLTI5LDYgKzI5LDEyIEBACiAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCisjIENsYW5nKysgYWJvcnRzIG9uIEF1ZGlvTWl4ZXIuY3BwLAorIyBiLzE4MzczODY2LCAiZG8gbm90IGtub3cgaG93IHRvIHNwbGl0IHRoaXMgb3BlcmF0b3IuIgoraWZlcSAoJChmaWx0ZXIgJChUQVJHRVRfQVJDSCksYXJtIGFybTY0KSwkKFRBUkdFVF9BUkNIKSkKKyAgICBMT0NBTF9DTEFORyA6PSBmYWxzZQorZW5kaWYKKwogTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgICAgICBcCiAgICAgQXVkaW9GbGluZ2VyLmNwcCAgICAgICAgICAgIFwKICAgICBUaHJlYWRzLmNwcCAgICAgICAgICAgICAgICAgXApAQCAtNzQsMTMgKzgwLDYgQEAKIAogTE9DQUxfQ0ZMQUdTICs9IC1EU1RBVEVfUVVFVUVfSU5TVEFOVElBVElPTlM9JyJTdGF0ZVF1ZXVlSW5zdGFudGlhdGlvbnMuY3BwIicKIAotIyBEZWZpbmUgQU5EUk9JRF9TTVAgYXBwcm9wcmlhdGVseS4gVXNlZCB0byBnZXQgaW5saW5lIHRyYWNpbmcgZmFzdC1wYXRoLgotaWZlcSAoJChUQVJHRVRfQ1BVX1NNUCksdHJ1ZSkKLSAgICBMT0NBTF9DRkxBR1MgKz0gLURBTkRST0lEX1NNUD0xCi1lbHNlCi0gICAgTE9DQUxfQ0ZMQUdTICs9IC1EQU5EUk9JRF9TTVA9MAotZW5kaWYKLQogTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4KIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAppbmRleCBiNGM5OTA1Li4xOGJhMWFlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcApAQCAtMTIxOSw3ICsxMjE5LDcgQEAKIAogICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMuYWRkKHBpZCwgbm90aWZpY2F0aW9uQ2xpZW50KTsKIAotICAgICAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gY2xpZW50LT5hc0JpbmRlcigpOworICAgICAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gSUludGVyZmFjZTo6YXNCaW5kZXIoY2xpZW50KTsKICAgICAgICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgobm90aWZpY2F0aW9uQ2xpZW50KTsKICAgICAgICAgICAgIGNsaWVudEFkZGVkID0gdHJ1ZTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmgKaW5kZXggM2I5NzJiYi4uZjRmMTQyYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5oCkBAIC0yMSwxNSArMjEsMTUgQEAKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX2VmZmVjdC5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkxvZy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL0NvbXBhdC5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KIAotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KICNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlci5oIgogCi0jaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJMb2cuaD4KLQogLy8gRklYTUUgVGhpcyBpcyBhY3R1YWxseSB1bml0eSBnYWluLCB3aGljaCBtaWdodCBub3QgYmUgbWF4IGluIGZ1dHVyZSwgZXhwcmVzc2VkIGluIFUuMTIKICNkZWZpbmUgTUFYX0dBSU5fSU5UIEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fSU5UCiAKQEAgLTU4LDcgKzU4LDcgQEAKICAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgTUFYX05VTV9DSEFOTkVMU19UT19ET1dOTUlYID0gQVVESU9fQ0hBTk5FTF9DT1VOVF9NQVg7CiAKICAgICBzdGF0aWMgY29uc3QgdWludDE2X3QgVU5JVFlfR0FJTl9JTlQgPSAweDEwMDA7Ci0gICAgc3RhdGljIGNvbnN0IGZsb2F0ICAgIFVOSVRZX0dBSU5fRkxPQVQgPSAxLjBmOworICAgIHN0YXRpYyBjb25zdCBDT05TVEVYUFIgZmxvYXQgVU5JVFlfR0FJTl9GTE9BVCA9IDEuMGY7CiAKICAgICBlbnVtIHsgLy8gbmFtZXMKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXJPcHMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyT3BzLmgKaW5kZXggZjczNzZhOC4uMjY3ODg1NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXJPcHMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlck9wcy5oCkBAIC01MiwxNSArNTIsMTIgQEAKICAqCiAgKiBGb3IgaGlnaCBwcmVjaXNpb24gYXVkaW8sIG9ubHkgdGhlIDxUTywgVEksIFRWPiA9IDxmbG9hdCwgZmxvYXQsIGZsb2F0PgogICogbmVlZHMgdG8gYmUgYWNjZWxlcmF0ZWQuIFRoaXMgaXMgcGVyaGFwcyB0aGUgZWFzaWVzdCBmb3JtIHRvIGRvIHF1aWNrbHkgYXMgd2VsbC4KKyAqCisgKiBBIGdlbmVyaWMgdmVyc2lvbiBpcyBOT1QgZGVmaW5lZCB0byBjYXRjaCBhbnkgbWlzdGFrZSBvZiB1c2luZyBpdC4KICAqLwogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUVj4KLWlubGluZSBUTyBNaXhNdWwoVEkgdmFsdWUsIFRWIHZvbHVtZSkgewotICAgIENPTVBJTEVfVElNRV9BU1NFUlRfRlVOQ1RJT05fU0NPUEUoZmFsc2UpOwotICAgIC8vIHNob3VsZCBub3QgYmUgaGVyZSA6LSkuCi0gICAgLy8gVG8gYXZvaWQgbWlzdGFrZXMsIHRoaXMgdGVtcGxhdGUgaXMgYWx3YXlzIHNwZWNpYWxpemVkLgotICAgIHJldHVybiB2YWx1ZSAqIHZvbHVtZTsKLX0KK1RPIE1peE11bChUSSB2YWx1ZSwgVFYgdm9sdW1lKTsKIAogdGVtcGxhdGUgPD4KIGlubGluZSBpbnQzMl90IE1peE11bDxpbnQzMl90LCBpbnQxNl90LCBpbnQxNl90PihpbnQxNl90IHZhbHVlLCBpbnQxNl90IHZvbHVtZSkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlci5jcHAKaW5kZXggMWY3YTYxMy4uNDZlM2Q2YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXIuY3BwCkBAIC0yOSwxNCArMjksMTEgQEAKICNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlckR5bi5oIgogCiAjaWZkZWYgX19hcm1fXwotI2luY2x1ZGUgPG1hY2hpbmUvY3B1LWZlYXR1cmVzLmg+CisgICAgI2RlZmluZSBBU01fQVJNX1JFU0FNUDEgLy8gZW5hYmxlIGFzbSBvcHRpbWlzYXRpb24gZm9yIFJlc2FtcGxlck9yZGVyMQogI2VuZGlmCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotI2lmZGVmIF9fQVJNX0hBVkVfSEFMRldPUkRfTVVMVElQTFkgLy8gb3B0aW1pemVkIGFzbSBvcHRpb24KLSAgICAjZGVmaW5lIEFTTV9BUk1fUkVTQU1QMSAvLyBlbmFibGUgYXNtIG9wdGltaXNhdGlvbiBmb3IgUmVzYW1wbGVyT3JkZXIxCi0jZW5kaWYgLy8gX19BUk1fSEFWRV9IQUxGV09SRF9NVUxUSVBMWQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBjbGFzcyBBdWRpb1Jlc2FtcGxlck9yZGVyMSA6IHB1YmxpYyBBdWRpb1Jlc2FtcGxlciB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlci5oCmluZGV4IGNkYzZkOTIuLjA2OWQ5NDYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlci5oCkBAIC0xOSw3ICsxOSw5IEBACiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwogI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgorI2luY2x1ZGUgPHV0aWxzL0NvbXBhdC5oPgogCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgpAQCAtNDcsNyArNDksNyBAQAogICAgICAgICBEWU5fSElHSF9RVUFMSVRZPTcsCiAgICAgfTsKIAotICAgIHN0YXRpYyBjb25zdCBmbG9hdCBVTklUWV9HQUlOX0ZMT0FUID0gMS4wZjsKKyAgICBzdGF0aWMgY29uc3QgQ09OU1RFWFBSIGZsb2F0IFVOSVRZX0dBSU5fRkxPQVQgPSAxLjBmOwogCiAgICAgc3RhdGljIEF1ZGlvUmVzYW1wbGVyKiBjcmVhdGUoYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQgaW5DaGFubmVsQ291bnQsCiAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGUsIHNyY19xdWFsaXR5IHF1YWxpdHk9REVGQVVMVF9RVUFMSVRZKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpckdlbi5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRmlyR2VuLmgKaW5kZXggZDAyNGIyZi4uZjM3MThiNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRmlyR2VuLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRmlyR2VuLmgKQEAgLTE3LDYgKzE3LDggQEAKICNpZm5kZWYgQU5EUk9JRF9BVURJT19SRVNBTVBMRVJfRklSX0dFTl9ICiAjZGVmaW5lIEFORFJPSURfQVVESU9fUkVTQU1QTEVSX0ZJUl9HRU5fSAogCisjaW5jbHVkZSAidXRpbHMvQ29tcGF0LmgiCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLyoKQEAgLTE4NywyMiArMTg5LDIyIEBACiAKIHRlbXBsYXRlIDxpbnQgTj4KIHN0cnVjdCBJMFRlcm0gewotICAgIHN0YXRpYyBjb25zdCBkb3VibGUgdmFsdWUgPSBJMFRlcm08Ti0xPjo6dmFsdWUgLyAoNC4gKiBOICogTik7CisgICAgc3RhdGljIGNvbnN0IENPTlNURVhQUiBkb3VibGUgdmFsdWUgPSBJMFRlcm08Ti0xPjo6dmFsdWUgLyAoNC4gKiBOICogTik7CiB9OwogCiB0ZW1wbGF0ZSA8Pgogc3RydWN0IEkwVGVybTwwPiB7Ci0gICAgc3RhdGljIGNvbnN0IGRvdWJsZSB2YWx1ZSA9IDEuOworICAgIHN0YXRpYyBjb25zdCBDT05TVEVYUFIgZG91YmxlIHZhbHVlID0gMS47CiB9OwogCiB0ZW1wbGF0ZSA8aW50IE4+CiBzdHJ1Y3QgSTBBVGVybSB7Ci0gICAgc3RhdGljIGNvbnN0IGRvdWJsZSB2YWx1ZSA9IEkwQVRlcm08Ti0xPjo6dmFsdWUgKiAoMi4qTi0xLikgKiAoMi4qTi0xLikgLyAoOC4gKiBOKTsKKyAgICBzdGF0aWMgY29uc3QgQ09OU1RFWFBSIGRvdWJsZSB2YWx1ZSA9IEkwQVRlcm08Ti0xPjo6dmFsdWUgKiAoMi4qTi0xLikgKiAoMi4qTi0xLikgLyAoOC4gKiBOKTsKIH07CiAKIHRlbXBsYXRlIDw+CiBzdHJ1Y3QgSTBBVGVybTwwPiB7IC8vIDEvc3FydCgyKlBJKTsKLSAgICBzdGF0aWMgY29uc3QgZG91YmxlIHZhbHVlID0gMC4zOTg5NDIyODA0MDE0MzI2Nzc5Mzk5NDYwNTk5MzQzODE4Njg0NzU4NTg2MzExNjQ5MzQ2NTc2NjU5MjU7CisgICAgc3RhdGljIGNvbnN0IENPTlNURVhQUiBkb3VibGUgdmFsdWUgPSAwLjM5ODk0MjI4MDQwMTQzMjY3NzkzOTk0NjA1OTkzNDM4MTg2ODQ3NTg1ODYzMTE2NDkzNDY1NzY2NTkyNTsKIH07CiAKICNpZiBVU0VfSE9STkVSU19NRVRIT0QKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyU2luYy5jcHAKaW5kZXggZDAzZTU3OC4uZTZmYjc2YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyU2luYy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyU2luYy5jcHAKQEAgLTMxLDcgKzMxLDEwIEBACiAKICNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlclNpbmMuaCIKIAotCisjaWYgZGVmaW5lZChfX2NsYW5nX18pICYmICFfX2hhc19idWlsdGluKF9fYnVpbHRpbl9hc3N1bWVfYWxpZ25lZCkKKyNkZWZpbmUgX19idWlsdGluX2Fzc3VtZV9hbGlnbmVkKHAsIGEpIFwKKwkoKCh1aW50cHRyX3QocCkgJSAoYSkpID09IDApID8gKHApIDogKF9fYnVpbHRpbl91bnJlYWNoYWJsZSgpLCAocCkpKQorI2VuZGlmCiAKICNpZiBkZWZpbmVkKF9fYXJtX18pICYmICFkZWZpbmVkKF9fdGh1bWJfXykKICNkZWZpbmUgVVNFX0lOTElORV9BU1NFTUJMWSAodHJ1ZSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TdGF0ZVF1ZXVlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TdGF0ZVF1ZXVlLmNwcAppbmRleCA0MGQ3YmNkLi45ZDQxODhmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU3RhdGVRdWV1ZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1N0YXRlUXVldWUuY3BwCkBAIC00OCw3ICs0OCw3IEBACiAgICAgLCBtT2JzZXJ2ZXJEdW1wKCZtT2JzZXJ2ZXJEdW1teUR1bXApLCBtTXV0YXRvckR1bXAoJm1NdXRhdG9yRHVtbXlEdW1wKQogI2VuZGlmCiB7Ci0gICAgYXRvbWljX2luaXQoJm1OZXh0LCAwKTsKKyAgICBhdG9taWNfaW5pdCgmbU5leHQsIHN0YXRpY19jYXN0PHVpbnRwdHJfdD4oMCkpOwogfQogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBTdGF0ZVF1ZXVlPFQ+Ojp+U3RhdGVRdWV1ZSgpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKaW5kZXggNGM5MGJlNS4uOTY4YjBmOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcApAQCAtMzM4LDcgKzMzOCw3IEBACiAgICAgLy8gZG8gbm90IGxvY2sgdGhlIG11dGV4IGluIGRlc3RydWN0b3IKICAgICByZWxlYXNlV2FrZUxvY2tfbCgpOwogICAgIGlmIChtUG93ZXJNYW5hZ2VyICE9IDApIHsKLSAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gbVBvd2VyTWFuYWdlci0+YXNCaW5kZXIoKTsKKyAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gSUludGVyZmFjZTo6YXNCaW5kZXIobVBvd2VyTWFuYWdlcik7CiAgICAgICAgIGJpbmRlci0+dW5saW5rVG9EZWF0aChtRGVhdGhSZWNpcGllbnQpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL0FuZHJvaWQubWsKaW5kZXggN2JiYTA1Yi4uODYwNGVmNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL0FuZHJvaWQubWsKQEAgLTEwLDE5ICsxMCwxMCBAQAogCWxpYmxvZyBcCiAJbGlidXRpbHMgXAogCWxpYmN1dGlscyBcCi0JbGlic3RscG9ydCBcCiAJbGliYXVkaW91dGlscyBcCiAJbGliYXVkaW9yZXNhbXBsZXIKIAotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCi0JbGliZ3Rlc3QgXAotCWxpYmd0ZXN0X21haW4KLQogTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0JYmlvbmljIFwKLQliaW9uaWMvbGlic3RkYysrL2luY2x1ZGUgXAotCWV4dGVybmFsL2d0ZXN0L2luY2x1ZGUgXAotCWV4dGVybmFsL3N0bHBvcnQvc3RscG9ydCBcCiAJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCiAJZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIKIApAQCAtMzIsMjEgKzIzLDI0IEBACiBMT0NBTF9NT0RVTEUgOj0gcmVzYW1wbGVyX3Rlc3RzCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwogCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKK2luY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKIAogIwogIyBhdWRpbyBtaXhlciB0ZXN0IHRvb2wKICMKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCisjIENsYW5nKysgYWJvcnRzIG9uIEF1ZGlvTWl4ZXIuY3BwLAorIyBiLzE4MzczODY2LCAiZG8gbm90IGtub3cgaG93IHRvIHNwbGl0IHRoaXMgb3BlcmF0b3IuIgoraWZlcSAoJChmaWx0ZXIgJChUQVJHRVRfQVJDSCksYXJtIGFybTY0KSwkKFRBUkdFVF9BUkNIKSkKKyAgICBMT0NBTF9DTEFORyA6PSBmYWxzZQorZW5kaWYKKwogTE9DQUxfU1JDX0ZJTEVTOj0gXAogCXRlc3QtbWl4ZXIuY3BwIFwKIAkuLi9BdWRpb01peGVyLmNwcC5hcm0gXAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKLQliaW9uaWMgXAotCWJpb25pYy9saWJzdGRjKysvaW5jbHVkZSBcCi0JZXh0ZXJuYWwvc3RscG9ydC9zdGxwb3J0IFwKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tZWZmZWN0cykgXAogCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAogCWZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyCkBAIC01NSw3ICs0OSw2IEBACiAJbGlic25kZmlsZQogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJzdGxwb3J0IFwKIAlsaWJlZmZlY3RzIFwKIAlsaWJuYmFpbyBcCiAJbGliY29tbW9uX3RpbWVfY2xpZW50IFwKQEAgLTcwLDQgKzYzLDYgQEAKIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAorTE9DQUxfQ1hYX1NUTCA6PSBsaWJjKysKKwogaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAppbmRleCAwOTU1ZTEwLi5lYjkxMTZkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5U2VydmljZS5jcHAKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxoYXJkd2FyZV9sZWdhY3kvcG93ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0VmZmVjdC5oPgogI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KIAogI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CkBAIC0xNjAsNyArMTYxLDcgQEAKIAogICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy5hZGQodWlkLCBub3RpZmljYXRpb25DbGllbnQpOwogCi0gICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IGNsaWVudC0+YXNCaW5kZXIoKTsKKyAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gSUludGVyZmFjZTo6YXNCaW5kZXIoY2xpZW50KTsKICAgICAgICAgYmluZGVyLT5saW5rVG9EZWF0aChub3RpZmljYXRpb25DbGllbnQpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5U2VydmljZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKaW5kZXggMDkzNzVjZi4uODAyODRhNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKQEAgLTMxLDcgKzMxLDkgQEAKICNpbmNsdWRlIDxtZWRpYS9Ub25lR2VuZXJhdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgorI2lmZGVmIFVTRV9MRUdBQ1lfQVVESU9fUE9MSUNZCiAjaW5jbHVkZSA8aGFyZHdhcmVfbGVnYWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmg+CisjZW5kaWYKICNpbmNsdWRlICJBdWRpb1BvbGljeUVmZmVjdHMuaCIKICNpbmNsdWRlICJBdWRpb1BvbGljeU1hbmFnZXIuaCIKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcAppbmRleCA3NjQyOGRhLi4xMjMyYzMyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcApAQCAtNzU1LDcgKzc1NSw3IEBACiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXJ2aWNlTG9jayk7CiAgICAgICAgIHNwPEJhc2ljQ2xpZW50PiBjbGllbnRUbXA7CiAgICAgICAgIGlmICghY2FuQ29ubmVjdFVuc2FmZShjYW1lcmFJZCwgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFDbGllbnQtPmFzQmluZGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihjYW1lcmFDbGllbnQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqL2NsaWVudFRtcCkpIHsKICAgICAgICAgICAgIHJldHVybiAtRUJVU1k7CiAgICAgICAgIH0gZWxzZSBpZiAoY2xpZW50LmdldCgpICE9IE5VTEwpIHsKQEAgLTgxOCw3ICs4MTgsNyBAQAogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOwogICAgICAgICBzcDxCYXNpY0NsaWVudD4gY2xpZW50VG1wOwogICAgICAgICBpZiAoIWNhbkNvbm5lY3RVbnNhZmUoY2FtZXJhSWQsIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhQ2xpZW50LT5hc0JpbmRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIoY2FtZXJhQ2xpZW50KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki9jbGllbnRUbXApKSB7CiAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOwogICAgICAgICB9IGVsc2UgaWYgKGNsaWVudC5nZXQoKSAhPSBOVUxMKSB7CkBAIC04ODksNyArODg5LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgc3A8QmFzaWNDbGllbnQ+IGNsaWVudDsKICAgICAgICAgICAgIGlmICghY2FuQ29ubmVjdFVuc2FmZShjYW1lcmFJZCwgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhQ2ItPmFzQmluZGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIoY2FtZXJhQ2IpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki9jbGllbnQpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKICAgICAgICAgICAgIH0KQEAgLTk2Miw3ICs5NjIsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBzcDxCYXNpY0NsaWVudD4gY2xpZW50OwogICAgICAgICAgICAgaWYgKCFjYW5Db25uZWN0VW5zYWZlKGNhbWVyYUlkLCBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFDYi0+YXNCaW5kZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihjYW1lcmFDYiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqL2NsaWVudCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOwogICAgICAgICAgICAgfQpAQCAtMTAyNCw3ICsxMDI0LDcgQEAKIAogICAgIFZlY3RvcjxzcDxJQ2FtZXJhU2VydmljZUxpc3RlbmVyPiA+OjppdGVyYXRvciBpdCwgZW5kOwogICAgIGZvciAoaXQgPSBtTGlzdGVuZXJMaXN0LmJlZ2luKCk7IGl0ICE9IG1MaXN0ZW5lckxpc3QuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgaWYgKCgqaXQpLT5hc0JpbmRlcigpID09IGxpc3RlbmVyLT5hc0JpbmRlcigpKSB7CisgICAgICAgIGlmIChJSW50ZXJmYWNlOjphc0JpbmRlcigqaXQpID09IElJbnRlcmZhY2U6OmFzQmluZGVyKGxpc3RlbmVyKSkgewogICAgICAgICAgICAgQUxPR1coIiVzOiBUcmllZCB0byBhZGQgbGlzdGVuZXIgJXAgd2hpY2ggd2FzIGFscmVhZHkgc3Vic2NyaWJlZCIsCiAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGxpc3RlbmVyLmdldCgpKTsKICAgICAgICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKQEAgLTEwNTcsNyArMTA1Nyw3IEBACiAKICAgICBWZWN0b3I8c3A8SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gPjo6aXRlcmF0b3IgaXQ7CiAgICAgZm9yIChpdCA9IG1MaXN0ZW5lckxpc3QuYmVnaW4oKTsgaXQgIT0gbUxpc3RlbmVyTGlzdC5lbmQoKTsgKytpdCkgewotICAgICAgICBpZiAoKCppdCktPmFzQmluZGVyKCkgPT0gbGlzdGVuZXItPmFzQmluZGVyKCkpIHsKKyAgICAgICAgaWYgKElJbnRlcmZhY2U6OmFzQmluZGVyKCppdCkgPT0gSUludGVyZmFjZTo6YXNCaW5kZXIobGlzdGVuZXIpKSB7CiAgICAgICAgICAgICBtTGlzdGVuZXJMaXN0LmVyYXNlKGl0KTsKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQpAQCAtMTE3MCw3ICsxMTcwLDcgQEAKICAgICAgICAgICAgIC8vIEZvdW5kIG91ciBjYW1lcmEsIGNsZWFyIGFuZCBsZWF2ZS4KICAgICAgICAgICAgIExPRzEoInJlbW92ZUNsaWVudDogY2xlYXIgcHJvICVwIiwgY2xpZW50UHJvLmdldCgpKTsKIAotICAgICAgICAgICAgY2xpZW50UHJvLT5nZXRSZW1vdGVDYWxsYmFjaygpLT5hc0JpbmRlcigpLT51bmxpbmtUb0RlYXRoKHRoaXMpOworICAgICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIoY2xpZW50UHJvLT5nZXRSZW1vdGVDYWxsYmFjaygpKS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTM2NCw3ICsxMzY0LDggQEAKICAgICAgICAgaW50IGNhbWVyYUlkLCBpbnQgY2FtZXJhRmFjaW5nLAogICAgICAgICBpbnQgY2xpZW50UGlkLCB1aWRfdCBjbGllbnRVaWQsCiAgICAgICAgIGludCBzZXJ2aWNlUGlkKSA6Ci0gICAgICAgIENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50KGNhbWVyYVNlcnZpY2UsIGNhbWVyYUNsaWVudC0+YXNCaW5kZXIoKSwKKyAgICAgICAgQ2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQoY2FtZXJhU2VydmljZSwKKyAgICAgICAgICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihjYW1lcmFDbGllbnQpLAogICAgICAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBjYW1lcmFGYWNpbmcsCiAgICAgICAgICAgICAgICAgY2xpZW50UGlkLCBjbGllbnRVaWQsCkBAIC0xNDc3LDcgKzE0NzgsOSBAQAogCiAgICAgfQogICAgIC8vIEFsd2F5cyBzdG9wIHdhdGNoaW5nLCBldmVuIGlmIG5vIGNhbWVyYSBvcCBpcyBhY3RpdmUKLSAgICBtQXBwT3BzTWFuYWdlci5zdG9wV2F0Y2hpbmdNb2RlKG1PcHNDYWxsYmFjayk7CisgICAgaWYgKG1PcHNDYWxsYmFjayAhPSBOVUxMKSB7CisgICAgICAgIG1BcHBPcHNNYW5hZ2VyLnN0b3BXYXRjaGluZ01vZGUobU9wc0NhbGxiYWNrKTsKKyAgICB9CiAgICAgbU9wc0NhbGxiYWNrLmNsZWFyKCk7CiAKICAgICByZXR1cm4gT0s7CkBAIC0xNTczLDcgKzE1NzYsNyBAQAogICAgICAgICBpbnQgY2xpZW50UGlkLAogICAgICAgICB1aWRfdCBjbGllbnRVaWQsCiAgICAgICAgIGludCBzZXJ2aWNlUGlkKQotICAgICAgICA6IENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50KGNhbWVyYVNlcnZpY2UsIHJlbW90ZUNhbGxiYWNrLT5hc0JpbmRlcigpLAorICAgICAgICA6IENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50KGNhbWVyYVNlcnZpY2UsIElJbnRlcmZhY2U6OmFzQmluZGVyKHJlbW90ZUNhbGxiYWNrKSwKICAgICAgICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwgY2FtZXJhSWQsIGNhbWVyYUZhY2luZywKICAgICAgICAgICAgICAgICBjbGllbnRQaWQsICBjbGllbnRVaWQsIHNlcnZpY2VQaWQpCiB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKaW5kZXggYTczMjhjZi4uMTI2ZDhkOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaApAQCAtMjczLDcgKzI3Myw3IEBACiAgICAgICAgIH0KIAogICAgICAgICB2aXJ0dWFsIHNwPElCaW5kZXI+IGFzQmluZGVyV3JhcHBlcigpIHsKLSAgICAgICAgICAgIHJldHVybiBhc0JpbmRlcigpOworICAgICAgICAgICAgcmV0dXJuIGFzQmluZGVyKHRoaXMpOwogICAgICAgICB9CiAKICAgICBwcm90ZWN0ZWQ6CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcAppbmRleCBkY2FiNGFkLi4wZWQ1NTg2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAKQEAgLTE2NSw3ICsxNjUsOCBAQAogICAgIFN0cmluZzggcmVzdWx0OwogICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkNsaWVudDJbJWRdICglcCkgQ2xpZW50OiAlcyBQSUQ6ICVkLCBkdW1wOlxuIiwKICAgICAgICAgICAgIG1DYW1lcmFJZCwKLSAgICAgICAgICAgIGdldFJlbW90ZUNhbGxiYWNrKCktPmFzQmluZGVyKCkuZ2V0KCksCisgICAgICAgICAgICAoZ2V0UmVtb3RlQ2FsbGJhY2soKSAhPSBOVUxMID8KKyAgICAgICAgICAgICAgICAgICAgKElJbnRlcmZhY2U6OmFzQmluZGVyKGdldFJlbW90ZUNhbGxiYWNrKCkpLmdldCgpKSA6IE5VTEwpLAogICAgICAgICAgICAgU3RyaW5nOChtQ2xpZW50UGFja2FnZU5hbWUpLnN0cmluZygpLAogICAgICAgICAgICAgbUNsaWVudFBpZCk7CiAgICAgcmVzdWx0LmFwcGVuZCgiICBTdGF0ZTogIik7CkBAIC01MzEsNyArNTMyLDcgQEAKICAgICBzcDxJQmluZGVyPiBiaW5kZXI7CiAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gd2luZG93OwogICAgIGlmIChidWZmZXJQcm9kdWNlciAhPSAwKSB7Ci0gICAgICAgIGJpbmRlciA9IGJ1ZmZlclByb2R1Y2VyLT5hc0JpbmRlcigpOworICAgICAgICBiaW5kZXIgPSBJSW50ZXJmYWNlOjphc0JpbmRlcihidWZmZXJQcm9kdWNlcik7CiAgICAgICAgIC8vIFVzaW5nIGNvbnRyb2xsZWRCeUFwcCBmbGFnIHRvIGVuc3VyZSB0aGF0IHRoZSBidWZmZXIgcXVldWUgcmVtYWlucyBpbgogICAgICAgICAvLyBhc3luYyBtb2RlIGZvciB0aGUgb2xkIGNhbWVyYSBBUEksIHdoZXJlIG1hbnkgYXBwbGljYXRpb25zIGRlcGVuZAogICAgICAgICAvLyBvbiB0aGF0IGJlaGF2aW9yLgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwCmluZGV4IDFhNGQ5YTYuLmJiYjJmZTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5jcHAKQEAgLTExOCw3ICsxMTgsOCBAQAogCiAgICAgc2l6ZV90IGxlbiA9IHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkNsaWVudFslZF0gKCVwKSBQSUQ6ICVkXG4iLAogICAgICAgICAgICAgbUNhbWVyYUlkLAotICAgICAgICAgICAgZ2V0UmVtb3RlQ2FsbGJhY2soKS0+YXNCaW5kZXIoKS5nZXQoKSwKKyAgICAgICAgICAgIChnZXRSZW1vdGVDYWxsYmFjaygpICE9IE5VTEwgPworICAgICAgICAgICAgICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihnZXRSZW1vdGVDYWxsYmFjaygpKS5nZXQoKSA6IE5VTEwpLAogICAgICAgICAgICAgbUNsaWVudFBpZCk7CiAgICAgbGVuID0gKGxlbiA+IFNJWkUgLSAxKSA/IFNJWkUgLSAxIDogbGVuOwogICAgIHdyaXRlKGZkLCBidWZmZXIsIGxlbik7CkBAIC0yMDUsNyArMjA2LDcgQEAKICAgICB9CiAKICAgICBpZiAobVJlbW90ZUNhbGxiYWNrICE9IDAgJiYKLSAgICAgICAgKGNsaWVudC0+YXNCaW5kZXIoKSA9PSBtUmVtb3RlQ2FsbGJhY2stPmFzQmluZGVyKCkpKSB7CisgICAgICAgIChJSW50ZXJmYWNlOjphc0JpbmRlcihjbGllbnQpID09IElJbnRlcmZhY2U6OmFzQmluZGVyKG1SZW1vdGVDYWxsYmFjaykpKSB7CiAgICAgICAgIExPRzEoIkNvbm5lY3QgdG8gdGhlIHNhbWUgY2xpZW50Iik7CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CkBAIC0zMjgsNyArMzI5LDcgQEAKICAgICBzcDxJQmluZGVyPiBiaW5kZXI7CiAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gd2luZG93OwogICAgIGlmIChidWZmZXJQcm9kdWNlciAhPSAwKSB7Ci0gICAgICAgIGJpbmRlciA9IGJ1ZmZlclByb2R1Y2VyLT5hc0JpbmRlcigpOworICAgICAgICBiaW5kZXIgPSBJSW50ZXJmYWNlOjphc0JpbmRlcihidWZmZXJQcm9kdWNlcik7CiAgICAgICAgIC8vIFVzaW5nIGNvbnRyb2xsZWRCeUFwcCBmbGFnIHRvIGVuc3VyZSB0aGF0IHRoZSBidWZmZXIgcXVldWUgcmVtYWlucyBpbgogICAgICAgICAvLyBhc3luYyBtb2RlIGZvciB0aGUgb2xkIGNhbWVyYSBBUEksIHdoZXJlIG1hbnkgYXBwbGljYXRpb25zIGRlcGVuZAogICAgICAgICAvLyBvbiB0aGF0IGJlaGF2aW9yLgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmgKaW5kZXggN2U1YmU4NC4uZTYyOGE3ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5oCkBAIC0xOSwxMSArMTksMTMgQEAKIAogI2luY2x1ZGUgPHN5c3RlbS9ncmFwaGljcy5oPgogCisjaW5jbHVkZSA8dXRpbHMvQ29tcGF0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorCiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhUGFyYW1ldGVyczIuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KQEAgLTE4Nyw3ICsxODksNyBAQAogICAgIHN0YXRpYyBjb25zdCBpbnQgTUFYX0lOSVRJQUxfUFJFVklFV19XSURUSCA9IDE5MjA7CiAgICAgc3RhdGljIGNvbnN0IGludCBNQVhfSU5JVElBTF9QUkVWSUVXX0hFSUdIVCA9IDEwODA7CiAgICAgLy8gQXNwZWN0IHJhdGlvIHRvbGVyYW5jZQotICAgIHN0YXRpYyBjb25zdCBmbG9hdCBBU1BFQ1RfUkFUSU9fVE9MRVJBTkNFID0gMC4wMDE7CisgICAgc3RhdGljIGNvbnN0IENPTlNURVhQUiBmbG9hdCBBU1BFQ1RfUkFUSU9fVE9MRVJBTkNFID0gMC4wMDE7CiAKICAgICAvLyBGdWxsIHN0YXRpYyBjYW1lcmEgaW5mbywgb2JqZWN0IG93bmVkIGJ5IHNvbWVvbmUgZWxzZSwgc3VjaCBhcwogICAgIC8vIENhbWVyYTJEZXZpY2UuCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuY3BwCmluZGV4IDQ3MDYyNGIuLjE0NmQ1NzIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuY3BwCkBAIC0yNyw2ICsyNyw3IEBACiAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorI2luY2x1ZGUgPGd1aS9CdWZmZXJJdGVtLmg+CiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9NZXRhZGF0YUJ1ZmZlclR5cGUuaD4KIApAQCAtNjc1LDcgKzY3Niw3IEBACiAgICAgc3A8Q2FtZXJhMkNsaWVudD4gY2xpZW50ID0gbUNsaWVudC5wcm9tb3RlKCk7CiAgICAgaWYgKGNsaWVudCA9PSAwKSB7CiAgICAgICAgIC8vIERpc2NhcmQgZnJhbWVzIGR1cmluZyBzaHV0ZG93bgotICAgICAgICBCdWZmZXJJdGVtQ29uc3VtZXI6OkJ1ZmZlckl0ZW0gaW1nQnVmZmVyOworICAgICAgICBCdWZmZXJJdGVtIGltZ0J1ZmZlcjsKICAgICAgICAgcmVzID0gbVJlY29yZGluZ0NvbnN1bWVyLT5hY3F1aXJlQnVmZmVyKCZpbWdCdWZmZXIsIDApOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBpZiAocmVzICE9IEJ1ZmZlckl0ZW1Db25zdW1lcjo6Tk9fQlVGRkVSX0FWQUlMQUJMRSkgewpAQCAtNjkzLDcgKzY5NCw3IEBACiAgICAgICAgICAgICB3aXRoIENhbWVyYTJDbGllbnQgY29kZSBjYWxsaW5nIGludG8gU3RyZWFtaW5nUHJvY2Vzc29yICovCiAgICAgICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChjbGllbnQtPmdldFBhcmFtZXRlcnMoKSk7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBtKG1NdXRleCk7Ci0gICAgICAgIEJ1ZmZlckl0ZW1Db25zdW1lcjo6QnVmZmVySXRlbSBpbWdCdWZmZXI7CisgICAgICAgIEJ1ZmZlckl0ZW0gaW1nQnVmZmVyOwogICAgICAgICByZXMgPSBtUmVjb3JkaW5nQ29uc3VtZXItPmFjcXVpcmVCdWZmZXIoJmltZ0J1ZmZlciwgMCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIGlmIChyZXMgIT0gQnVmZmVySXRlbUNvbnN1bWVyOjpOT19CVUZGRVJfQVZBSUxBQkxFKSB7CkBAIC04MTksOCArODIwLDcgQEAKIAogICAgIHNpemVfdCBpdGVtSW5kZXg7CiAgICAgZm9yIChpdGVtSW5kZXggPSAwOyBpdGVtSW5kZXggPCBtUmVjb3JkaW5nQnVmZmVycy5zaXplKCk7IGl0ZW1JbmRleCsrKSB7Ci0gICAgICAgIGNvbnN0IEJ1ZmZlckl0ZW1Db25zdW1lcjo6QnVmZmVySXRlbSBpdGVtID0KLSAgICAgICAgICAgICAgICBtUmVjb3JkaW5nQnVmZmVyc1tpdGVtSW5kZXhdOworICAgICAgICBjb25zdCBCdWZmZXJJdGVtIGl0ZW0gPSBtUmVjb3JkaW5nQnVmZmVyc1tpdGVtSW5kZXhdOwogICAgICAgICBpZiAoaXRlbS5tQnVmICE9IEJ1ZmZlckl0ZW1Db25zdW1lcjo6SU5WQUxJRF9CVUZGRVJfU0xPVCAmJgogICAgICAgICAgICAgICAgIGl0ZW0ubUdyYXBoaWNCdWZmZXItPmhhbmRsZSA9PSBpbWdIYW5kbGUpIHsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtODY0LDggKzg2NCw3IEBACiAKICAgICBzaXplX3QgcmVsZWFzZWRDb3VudCA9IDA7CiAgICAgZm9yIChzaXplX3QgaXRlbUluZGV4ID0gMDsgaXRlbUluZGV4IDwgbVJlY29yZGluZ0J1ZmZlcnMuc2l6ZSgpOyBpdGVtSW5kZXgrKykgewotICAgICAgICBjb25zdCBCdWZmZXJJdGVtQ29uc3VtZXI6OkJ1ZmZlckl0ZW0gaXRlbSA9Ci0gICAgICAgICAgICAgICAgbVJlY29yZGluZ0J1ZmZlcnNbaXRlbUluZGV4XTsKKyAgICAgICAgY29uc3QgQnVmZmVySXRlbSBpdGVtID0gbVJlY29yZGluZ0J1ZmZlcnNbaXRlbUluZGV4XTsKICAgICAgICAgaWYgKGl0ZW0ubUJ1ZiAhPSBCdWZmZXJJdGVtQ29uc3VtZXI6OklOVkFMSURfQlVGRkVSX1NMT1QpIHsKICAgICAgICAgICAgIHJlcyA9IG1SZWNvcmRpbmdDb25zdW1lci0+cmVsZWFzZUJ1ZmZlcihtUmVjb3JkaW5nQnVmZmVyc1tpdGVtSW5kZXhdKTsKICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuaAppbmRleCAxZDY3OWE0Li4yNDc0MDYyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1N0cmVhbWluZ1Byb2Nlc3Nvci5oCkBAIC0xMjQsNyArMTI0LDcgQEAKIAogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0RlZmF1bHRSZWNvcmRpbmdIZWFwQ291bnQgPSA4OwogICAgIHNpemVfdCBtUmVjb3JkaW5nSGVhcENvdW50OwotICAgIFZlY3RvcjxCdWZmZXJJdGVtQ29uc3VtZXI6OkJ1ZmZlckl0ZW0+IG1SZWNvcmRpbmdCdWZmZXJzOworICAgIFZlY3RvcjxCdWZmZXJJdGVtPiBtUmVjb3JkaW5nQnVmZmVyczsKICAgICBzaXplX3QgbVJlY29yZGluZ0hlYXBIZWFkLCBtUmVjb3JkaW5nSGVhcEZyZWU7CiAKICAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmNwcAppbmRleCA4YjdlNGI0Li4xODZjZTZjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmNwcApAQCAtNDQwLDcgKzQ0MCw3IEBACiAgICAgICAgIHpzbENvbnN1bWVyID0gbVpzbENvbnN1bWVyOwogICAgIH0KICAgICBBTE9HVlYoIlRyeWluZyB0byBnZXQgbmV4dCBidWZmZXIiKTsKLSAgICBCdWZmZXJJdGVtQ29uc3VtZXI6OkJ1ZmZlckl0ZW0gaXRlbTsKKyAgICBCdWZmZXJJdGVtIGl0ZW07CiAgICAgcmVzID0genNsQ29uc3VtZXItPmFjcXVpcmVCdWZmZXIoJml0ZW0sIDApOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgaWYgKHJlcyAhPSBCdWZmZXJJdGVtQ29uc3VtZXI6Ok5PX0JVRkZFUl9BVkFJTEFCTEUpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuaAppbmRleCAyMDk5YzM4Li41ZjUwZDdiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5oCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KICNpbmNsdWRlIDx1dGlscy9Db25kaXRpb24uaD4KKyNpbmNsdWRlIDxndWkvQnVmZmVySXRlbS5oPgogI2luY2x1ZGUgPGd1aS9CdWZmZXJJdGVtQ29uc3VtZXIuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FwdHVyZVJlc3VsdC5oPgpAQCAtMTAzLDcgKzEwNCw3IEBACiAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gICAgICBtWnNsV2luZG93OwogCiAgICAgc3RydWN0IFpzbFBhaXIgewotICAgICAgICBCdWZmZXJJdGVtQ29uc3VtZXI6OkJ1ZmZlckl0ZW0gYnVmZmVyOworICAgICAgICBCdWZmZXJJdGVtIGJ1ZmZlcjsKICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgZnJhbWU7CiAgICAgfTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvcjMuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IzLmgKaW5kZXggZmM5ZjcwYy4uMjk2MDQ3OCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvcjMuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yMy5oCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KICNpbmNsdWRlIDx1dGlscy9Db25kaXRpb24uaD4KKyNpbmNsdWRlIDxndWkvQnVmZmVySXRlbS5oPgogI2luY2x1ZGUgPGd1aS9CdWZmZXJJdGVtQ29uc3VtZXIuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KIApAQCAtMTA0LDcgKzEwNSw3IEBACiAgICAgc3A8Y2FtZXJhMzo6Q2FtZXJhM1pzbFN0cmVhbT4gbVpzbFN0cmVhbTsKIAogICAgIHN0cnVjdCBac2xQYWlyIHsKLSAgICAgICAgQnVmZmVySXRlbUNvbnN1bWVyOjpCdWZmZXJJdGVtIGJ1ZmZlcjsKKyAgICAgICAgQnVmZmVySXRlbSBidWZmZXI7CiAgICAgICAgIENhbWVyYU1ldGFkYXRhIGZyYW1lOwogICAgIH07CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcAppbmRleCBlNjg2NWJiLi42YTFlZTQ0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwCkBAIC00Miw4ICs0MiwxNCBAQAogICAgICAgICBpbnQgY2xpZW50UGlkLAogICAgICAgICB1aWRfdCBjbGllbnRVaWQsCiAgICAgICAgIGludCBzZXJ2aWNlUGlkKSA6Ci0gICAgQmFzaWNDbGllbnQoY2FtZXJhU2VydmljZSwgcmVtb3RlQ2FsbGJhY2stPmFzQmluZGVyKCksIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBjYW1lcmFGYWNpbmcsIGNsaWVudFBpZCwgY2xpZW50VWlkLCBzZXJ2aWNlUGlkKSwKKyAgICBCYXNpY0NsaWVudChjYW1lcmFTZXJ2aWNlLAorICAgICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIocmVtb3RlQ2FsbGJhY2spLAorICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsCisgICAgICAgICAgICBjYW1lcmFJZCwKKyAgICAgICAgICAgIGNhbWVyYUZhY2luZywKKyAgICAgICAgICAgIGNsaWVudFBpZCwKKyAgICAgICAgICAgIGNsaWVudFVpZCwKKyAgICAgICAgICAgIHNlcnZpY2VQaWQpLAogICAgIG1SZW1vdGVDYWxsYmFjayhyZW1vdGVDYWxsYmFjaykgewogfQogCkBAIC0xNTcsNyArMTYzLDcgQEAKICAgICAgICAgICAgIGlmIChzdXJmYWNlID09IDApIGNvbnRpbnVlOwogCiAgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBnYnAgPSBzdXJmYWNlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCk7Ci0gICAgICAgICAgICBpbnQgaWR4ID0gbVN0cmVhbU1hcC5pbmRleE9mS2V5KGdicC0+YXNCaW5kZXIoKSk7CisgICAgICAgICAgICBpbnQgaWR4ID0gbVN0cmVhbU1hcC5pbmRleE9mS2V5KElJbnRlcmZhY2U6OmFzQmluZGVyKGdicCkpOwogCiAgICAgICAgICAgICAvLyBUcnlpbmcgdG8gc3VibWl0IHJlcXVlc3Qgd2l0aCBzdXJmYWNlIHRoYXQgd2Fzbid0IGNyZWF0ZWQKICAgICAgICAgICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKQEAgLTMyNyw3ICszMzMsNyBAQAogCiAgICAgLy8gRG9uJ3QgY3JlYXRlIG11bHRpcGxlIHN0cmVhbXMgZm9yIHRoZSBzYW1lIHRhcmdldCBzdXJmYWNlCiAgICAgewotICAgICAgICBzc2l6ZV90IGluZGV4ID0gbVN0cmVhbU1hcC5pbmRleE9mS2V5KGJ1ZmZlclByb2R1Y2VyLT5hc0JpbmRlcigpKTsKKyAgICAgICAgc3NpemVfdCBpbmRleCA9IG1TdHJlYW1NYXAuaW5kZXhPZktleShJSW50ZXJmYWNlOjphc0JpbmRlcihidWZmZXJQcm9kdWNlcikpOwogICAgICAgICBpZiAoaW5kZXggIT0gTkFNRV9OT1RfRk9VTkQpIHsKICAgICAgICAgICAgIEFMT0dXKCIlczogQ2FtZXJhICVkOiBCdWZmZXIgcHJvZHVjZXIgYWxyZWFkeSBoYXMgYSBzdHJlYW0gZm9yIGl0ICIKICAgICAgICAgICAgICAgICAgICIoSUQgJXpkKSIsCkBAIC0zNjEsMTIgKzM2Nyw4IEBACiAgICAgYm9vbCBmbGV4aWJsZUNvbnN1bWVyID0gKGNvbnN1bWVyVXNhZ2UgJiBkaXNhbGxvd2VkRmxhZ3MpID09IDAgJiYKICAgICAgICAgICAgIChjb25zdW1lclVzYWdlICYgYWxsb3dlZEZsYWdzKSAhPSAwOwogCi0gICAgc3A8SUJpbmRlcj4gYmluZGVyOwotICAgIHNwPEFOYXRpdmVXaW5kb3c+IGFudzsKLSAgICBpZiAoYnVmZmVyUHJvZHVjZXIgIT0gMCkgewotICAgICAgICBiaW5kZXIgPSBidWZmZXJQcm9kdWNlci0+YXNCaW5kZXIoKTsKLSAgICAgICAgYW53ID0gbmV3IFN1cmZhY2UoYnVmZmVyUHJvZHVjZXIsIHVzZUFzeW5jKTsKLSAgICB9CisgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gSUludGVyZmFjZTo6YXNCaW5kZXIoYnVmZmVyUHJvZHVjZXIpOworICAgIHNwPEFOYXRpdmVXaW5kb3c+IGFudyA9IG5ldyBTdXJmYWNlKGJ1ZmZlclByb2R1Y2VyLCB1c2VBc3luYyk7CiAKICAgICAvLyBUT0RPOiByZW1vdmUgdyxoLGYgc2luY2Ugd2UgYXJlIGlnbm9yaW5nIHRoZW0KIApAQCAtNDA3LDcgKzQwOSw3IEBACiAgICAgcmVzID0gbURldmljZS0+Y3JlYXRlU3RyZWFtKGFudywgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCAmc3RyZWFtSWQpOwogCiAgICAgaWYgKHJlcyA9PSBPSykgewotICAgICAgICBtU3RyZWFtTWFwLmFkZChidWZmZXJQcm9kdWNlci0+YXNCaW5kZXIoKSwgc3RyZWFtSWQpOworICAgICAgICBtU3RyZWFtTWFwLmFkZChiaW5kZXIsIHN0cmVhbUlkKTsKIAogICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogU3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgYSBuZXcgc3RyZWFtIElEICVkIiwKICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVhbUlkKTsKQEAgLTU4Miw3ICs1ODQsOCBAQAogICAgIFN0cmluZzggcmVzdWx0OwogICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkNhbWVyYURldmljZUNsaWVudFslZF0gKCVwKSBkdW1wOlxuIiwKICAgICAgICAgICAgIG1DYW1lcmFJZCwKLSAgICAgICAgICAgIGdldFJlbW90ZUNhbGxiYWNrKCktPmFzQmluZGVyKCkuZ2V0KCkpOworICAgICAgICAgICAgKGdldFJlbW90ZUNhbGxiYWNrKCkgIT0gTlVMTCA/CisgICAgICAgICAgICAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKGdldFJlbW90ZUNhbGxiYWNrKCkpLmdldCgpIDogTlVMTCkgKTsKICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIEN1cnJlbnQgY2xpZW50OiAlcyAoUElEICVkLCBVSUQgJXUpXG4iLAogICAgICAgICAgICAgU3RyaW5nOChtQ2xpZW50UGFja2FnZU5hbWUpLnN0cmluZygpLAogICAgICAgICAgICAgbUNsaWVudFBpZCwgbUNsaWVudFVpZCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGlfcHJvL1Byb0NhbWVyYTJDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpX3Byby9Qcm9DYW1lcmEyQ2xpZW50LmNwcAppbmRleCAyZWE0NjBmLi41OWU1MDgzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGlfcHJvL1Byb0NhbWVyYTJDbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaV9wcm8vUHJvQ2FtZXJhMkNsaWVudC5jcHAKQEAgLTI3Niw3ICsyNzYsNyBAQAogICAgIHNwPElCaW5kZXI+IGJpbmRlcjsKICAgICBzcDxBTmF0aXZlV2luZG93PiB3aW5kb3c7CiAgICAgaWYgKGJ1ZmZlclByb2R1Y2VyICE9IDApIHsKLSAgICAgICAgYmluZGVyID0gYnVmZmVyUHJvZHVjZXItPmFzQmluZGVyKCk7CisgICAgICAgIGJpbmRlciA9IElJbnRlcmZhY2U6OmFzQmluZGVyKGJ1ZmZlclByb2R1Y2VyKTsKICAgICAgICAgd2luZG93ID0gbmV3IFN1cmZhY2UoYnVmZmVyUHJvZHVjZXIpOwogICAgIH0KIApAQCAtMzM0LDcgKzMzNCw4IEBACiAgICAgU3RyaW5nOCByZXN1bHQ7CiAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiUHJvQ2FtZXJhMkNsaWVudFslZF0gKCVwKSBQSUQ6ICVkLCBkdW1wOlxuIiwKICAgICAgICAgICAgIG1DYW1lcmFJZCwKLSAgICAgICAgICAgIGdldFJlbW90ZUNhbGxiYWNrKCktPmFzQmluZGVyKCkuZ2V0KCksCisgICAgICAgICAgICAoZ2V0UmVtb3RlQ2FsbGJhY2soKSAhPSBOVUxMID8KKyAgICAgICAgICAgICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIoZ2V0UmVtb3RlQ2FsbGJhY2soKSkuZ2V0KCkgOiBOVUxMKSwKICAgICAgICAgICAgIG1DbGllbnRQaWQpOwogICAgIHJlc3VsdC5hcHBlbmQoIiAgU3RhdGU6XG4iKTsKICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwCmluZGV4IGQ2ZGIxNTEuLjQ1M2M4YmQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcApAQCAtMTI4LDcgKzEyOCw4IEBACiAgICAgU3RyaW5nOCByZXN1bHQ7CiAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiQ2FtZXJhMkNsaWVudEJhc2VbJWRdICglcCkgUElEOiAlZCwgZHVtcDpcbiIsCiAgICAgICAgICAgICBUQ2xpZW50QmFzZTo6bUNhbWVyYUlkLAotICAgICAgICAgICAgVENsaWVudEJhc2U6OmdldFJlbW90ZUNhbGxiYWNrKCktPmFzQmluZGVyKCkuZ2V0KCksCisgICAgICAgICAgICAoVENsaWVudEJhc2U6OmdldFJlbW90ZUNhbGxiYWNrKCkgIT0gTlVMTCA/CisgICAgICAgICAgICAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKFRDbGllbnRCYXNlOjpnZXRSZW1vdGVDYWxsYmFjaygpKS5nZXQoKSA6IE5VTEwpLAogICAgICAgICAgICAgVENsaWVudEJhc2U6Om1DbGllbnRQaWQpOwogICAgIHJlc3VsdC5hcHBlbmQoIiAgU3RhdGU6ICIpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oCmluZGV4IGQxOThlNGUuLmUwOWMxYjUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oCkBAIC0xMTEsNyArMTExLDcgQEAKICAgICBwaWRfdCBtSW5pdGlhbENsaWVudFBpZDsKIAogICAgIHZpcnR1YWwgc3A8SUJpbmRlcj4gYXNCaW5kZXJXcmFwcGVyKCkgewotICAgICAgICByZXR1cm4gSUludGVyZmFjZTo6YXNCaW5kZXIoKTsKKyAgICAgICAgcmV0dXJuIElJbnRlcmZhY2U6OmFzQmluZGVyKHRoaXMpOwogICAgIH0KIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBkdW1wRGV2aWNlKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UxL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UxL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmgKaW5kZXggNjM4NjgzOC4uMTkzNWMyYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaApAQCAtNTg4LDcgKzU4OCw3IEBACiAKICNpZm5kZWYgY29udGFpbmVyX29mCiAjZGVmaW5lIGNvbnRhaW5lcl9vZihwdHIsIHR5cGUsIG1lbWJlcikgKHsgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBjb25zdCB0eXBlb2YoKCh0eXBlICopIDApLT5tZW1iZXIpICpfX21wdHIgPSAocHRyKTsgICAgIFwKKyAgICAgICAgY29uc3QgX190eXBlb2ZfXygoKHR5cGUgKikgMCktPm1lbWJlcikgKl9fbXB0ciA9IChwdHIpOyAgICAgXAogICAgICAgICAodHlwZSAqKSAoKGNoYXIgKikgX19tcHRyIC0gKGNoYXIgKikoJigodHlwZSAqKTApLT5tZW1iZXIpKTsgfSkKICNlbmRpZgogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAKaW5kZXggMzE5YmUxZC4uOWMxZTI4YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQ0FNRVJBCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKKyNpbmNsdWRlIDxndWkvQnVmZmVySXRlbS5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAjaW5jbHVkZSAiQ2FtZXJhM0lucHV0U3RyZWFtLmgiCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaAppbmRleCBhZTQ5NDY3Li5mZDE3ZjRmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmgKQEAgLTQ4LDggKzQ4LDYgQEAKIAogICBwcml2YXRlOgogCi0gICAgdHlwZWRlZiBCdWZmZXJJdGVtQ29uc3VtZXI6OkJ1ZmZlckl0ZW0gQnVmZmVySXRlbTsKLQogICAgIHNwPEJ1ZmZlckl0ZW1Db25zdW1lcj4gbUNvbnN1bWVyOwogICAgIFZlY3RvcjxCdWZmZXJJdGVtPiBtQnVmZmVyc0luRmxpZ2h0OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9ndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2d1aS9SaW5nQnVmZmVyQ29uc3VtZXIuY3BwCmluZGV4IGQwZjI5ZGUuLjhjZDY4MDAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2d1aS9SaW5nQnVmZmVyQ29uc3VtZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2d1aS9SaW5nQnVmZmVyQ29uc3VtZXIuY3BwCkBAIC0yNjgsNyArMjY4LDcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgUmluZ0J1ZmZlckNvbnN1bWVyOjpvbkZyYW1lQXZhaWxhYmxlKGNvbnN0IGFuZHJvaWQ6OkJ1ZmZlckl0ZW0mIGl0ZW0pIHsKK3ZvaWQgUmluZ0J1ZmZlckNvbnN1bWVyOjpvbkZyYW1lQXZhaWxhYmxlKGNvbnN0IEJ1ZmZlckl0ZW0mIGl0ZW0pIHsKICAgICBzdGF0dXNfdCBlcnI7CiAKICAgICB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9ndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9ndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmgKaW5kZXggOTBmZDczNC4uODNlNzI5OCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZ3VpL1JpbmdCdWZmZXJDb25zdW1lci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2d1aS9SaW5nQnVmZmVyQ29uc3VtZXIuaApAQCAtMTcsNiArMTcsNyBAQAogI2lmbmRlZiBBTkRST0lEX0dVSV9SSU5HQlVGRkVSQ09OU1VNRVJfSAogI2RlZmluZSBBTkRST0lEX0dVSV9SSU5HQlVGRkVSQ09OU1VNRVJfSAogCisjaW5jbHVkZSA8Z3VpL0J1ZmZlckl0ZW0uaD4KICNpbmNsdWRlIDxndWkvQ29uc3VtZXJCYXNlLmg+CiAKICNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+CkBAIC01NCw4ICs1NSw2IEBACiAgIHB1YmxpYzoKICAgICB0eXBlZGVmIENvbnN1bWVyQmFzZTo6RnJhbWVBdmFpbGFibGVMaXN0ZW5lciBGcmFtZUF2YWlsYWJsZUxpc3RlbmVyOwogCi0gICAgdHlwZWRlZiBCdWZmZXJRdWV1ZTo6QnVmZmVySXRlbSBCdWZmZXJJdGVtOwotCiAgICAgZW51bSB7IElOVkFMSURfQlVGRkVSX1NMT1QgPSBCdWZmZXJRdWV1ZTo6SU5WQUxJRF9CVUZGRVJfU0xPVCB9OwogICAgIGVudW0geyBOT19CVUZGRVJfQVZBSUxBQkxFID0gQnVmZmVyUXVldWU6Ok5PX0JVRkZFUl9BVkFJTEFCTEUgfTsKIApAQCAtMTY1LDcgKzE2NCw3IEBACiAgIHByaXZhdGU6CiAKICAgICAvLyBPdmVycmlkZSBDb25zdW1lckJhc2U6Om9uRnJhbWVBdmFpbGFibGUKLSAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZShjb25zdCBhbmRyb2lkOjpCdWZmZXJJdGVtJiBpdGVtKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZShjb25zdCBCdWZmZXJJdGVtJiBpdGVtKTsKIAogICAgIHZvaWQgcGluQnVmZmVyTG9ja2VkKGNvbnN0IEJ1ZmZlckl0ZW0mIGl0ZW0pOwogICAgIHZvaWQgdW5waW5CdWZmZXIoY29uc3QgQnVmZmVySXRlbSYgaXRlbSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCmluZGV4IGQzYjY3ZjYuLjA4MWFmZjcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCkBAIC0xNDMsNyArMTQzLDcgQEAKICAgICBzcDxNb2R1bGU+IG1vZHVsZSA9IG1Nb2R1bGVzLnZhbHVlQXQoaW5kZXgpOwogCiAgICAgbW9kdWxlLT5zZXRDbGllbnQoY2xpZW50KTsKLSAgICBjbGllbnQtPmFzQmluZGVyKCktPmxpbmtUb0RlYXRoKG1vZHVsZSk7CisgICAgSUludGVyZmFjZTo6YXNCaW5kZXIoY2xpZW50KS0+bGlua1RvRGVhdGgobW9kdWxlKTsKICAgICBtb2R1bGVJbnRlcmZhY2UgPSBtb2R1bGU7CiAKICAgICBtb2R1bGUtPnNldENhcHR1cmVTdGF0ZV9sKG1DYXB0dXJlU3RhdGUpOwpAQCAtNTEwLDcgKzUxMCw3IEBACiAgICAgICAgIG1Nb2RlbHMuY2xlYXIoKTsKICAgICB9CiAgICAgaWYgKG1DbGllbnQgIT0gMCkgewotICAgICAgICBtQ2xpZW50LT5hc0JpbmRlcigpLT51bmxpbmtUb0RlYXRoKHRoaXMpOworICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtQ2xpZW50KS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKICAgICB9CiAgICAgc3A8U291bmRUcmlnZ2VySHdTZXJ2aWNlPiBzZXJ2aWNlID0gbVNlcnZpY2UucHJvbW90ZSgpOwogICAgIGlmIChzZXJ2aWNlID09IDApIHsKZGlmZiAtLWdpdCBhL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmNwcCBiL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmNwcAppbmRleCA0MjI4MGQxLi5lZWNjMWVhIDEwMDY0NAotLS0gYS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5jcHAKKysrIGIvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuY3BwCkBAIC01OCw3ICs1OCw3IEBACiAgICAgICAgIH0KICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVNvdW5kVHJpZ2dlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihtb2RlbE1lbW9yeS0+YXNCaW5kZXIoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIobW9kZWxNZW1vcnkpKTsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KExPQURfU09VTkRfTU9ERUwsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwKICAgICAgICAgICAgICAgICAoc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpKSAhPSBOT19FUlJPUikgewpAQCAtOTEsNyArOTEsNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKGRhdGFNZW1vcnktPnNpemUoKSk7CiAgICAgICAgIH0KLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihkYXRhTWVtb3J5LT5hc0JpbmRlcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihkYXRhTWVtb3J5KSk7CiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTVEFSVF9SRUNPR05JVElPTiwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOwpkaWZmIC0tZ2l0IGEvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJDbGllbnQuY3BwIGIvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJDbGllbnQuY3BwCmluZGV4IGIwYjQ0MjguLmUwZDNhZGQgMTAwNjQ0Ci0tLSBhL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyQ2xpZW50LmNwcAorKysgYi9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckNsaWVudC5jcHAKQEAgLTQ0LDcgKzQ0LDcgQEAKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTb3VuZFRyaWdnZXJDbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoZXZlbnRNZW1vcnktPmFzQmluZGVyKCkpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGV2ZW50TWVtb3J5KSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChPTl9SRUNPR05JVElPTl9FVkVOVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbHkpOwpAQCAtNTQsNyArNTQsNyBAQAogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVNvdW5kVHJpZ2dlckNsaWVudDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihldmVudE1lbW9yeS0+YXNCaW5kZXIoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoZXZlbnRNZW1vcnkpKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KE9OX1NPVU5ETU9ERUxfRVZFTlQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5KTsKQEAgLTYzLDcgKzYzLDcgQEAKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTb3VuZFRyaWdnZXJDbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoZXZlbnRNZW1vcnktPmFzQmluZGVyKCkpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGV2ZW50TWVtb3J5KSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChPTl9TRVJWSUNFX1NUQVRFX0NIQU5HRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbHkpOwpkaWZmIC0tZ2l0IGEvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwIGIvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCmluZGV4IDA1NzI4ZTkuLjc1ZjY4YjggMTAwNjQ0Ci0tLSBhL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcAorKysgYi9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAKQEAgLTgyLDcgKzgyLDcgQEAKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVNvdW5kVHJpZ2dlckh3U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZSgmaGFuZGxlLCBzaXplb2Yoc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihjbGllbnQtPmFzQmluZGVyKCkpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGNsaWVudCkpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQVRUQUNILCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgaWYgKHJlcGx5LnJlYWRJbnQzMigpICE9IDApIHsKQEAgLTE0Nyw3ICsxNDcsNyBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKICAgICAgICAgICAgIGlmIChtb2R1bGUgIT0gMCkgewogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDEpOwotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihtb2R1bGUtPmFzQmluZGVyKCkpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihtb2R1bGUpKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMCk7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmNwcCBiL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuY3BwCmluZGV4IDAwMTVjMzAuLjIxMzhjYjcgMTAwNjQ0Ci0tLSBhL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuY3BwCisrKyBiL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuY3BwCkBAIC0xMDQsNyArMTA0LDcgQEAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXJ2aWNlLT5hdHRhY2gobW9kdWxlLCBzb3VuZFRyaWdnZXIsIHNvdW5kVHJpZ2dlci0+bUlTb3VuZFRyaWdnZXIpOwogCiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiBzb3VuZFRyaWdnZXItPm1JU291bmRUcmlnZ2VyICE9IDApIHsKLSAgICAgICAgc291bmRUcmlnZ2VyLT5tSVNvdW5kVHJpZ2dlci0+YXNCaW5kZXIoKS0+bGlua1RvRGVhdGgoc291bmRUcmlnZ2VyKTsKKyAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIoc291bmRUcmlnZ2VyLT5tSVNvdW5kVHJpZ2dlciktPmxpbmtUb0RlYXRoKHNvdW5kVHJpZ2dlcik7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1coIkVycm9yICVkIGNvbm5lY3RpbmcgdG8gc291bmQgdHJpZ2dlciBzZXJ2aWNlIiwgc3RhdHVzKTsKICAgICAgICAgc291bmRUcmlnZ2VyLmNsZWFyKCk7CkBAIC0xNDQsNyArMTQ0LDcgQEAKICAgICBtQ2FsbGJhY2suY2xlYXIoKTsKICAgICBpZiAobUlTb3VuZFRyaWdnZXIgIT0gMCkgewogICAgICAgICBtSVNvdW5kVHJpZ2dlci0+ZGV0YWNoKCk7Ci0gICAgICAgIG1JU291bmRUcmlnZ2VyLT5hc0JpbmRlcigpLT51bmxpbmtUb0RlYXRoKHRoaXMpOworICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtSVNvdW5kVHJpZ2dlciktPnVubGlua1RvRGVhdGgodGhpcyk7CiAgICAgICAgIG1JU291bmRUcmlnZ2VyID0gMDsKICAgICB9CiB9Cg==