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+Z2V0U3RyaXBTaXplKCk7CiAgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzb3VyY2VzQ291bnQ7ICsraikgewpAQCAtMTI0LDcgKzEyMyw3IEBACiAgICAgICAgICAgICBBTE9HRSgiJXM6IE5vIHN0cmVhbSBmb3IgYnl0ZSBzdHJpcHMgZm9yIElGRCAldSIsIF9fRlVOQ1RJT05fXywgaWZkS2V5KTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KLSAgICAgICAgYXNzZXJ0KG5leHRPZmZzZXQgPT0gZW5kT3V0LmdldEN1cnJlbnRPZmZzZXQoKSk7CisgICAgICAgIGFzc2VydChvZmZzZXRWZWN0b3JbaV0gPT0gZW5kT3V0LmdldEN1cnJlbnRPZmZzZXQoKSk7CiAgICAgfQogCiAgICAgcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmNwcCBiL21lZGlhL2xpYmNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmNwcAppbmRleCBjZmRjYjUxLi5iNDNiMzZjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJjcHVzdGF0cy9UaHJlYWRDcHVVc2FnZS5jcHAKKysrIGIvbWVkaWEvbGliY3B1c3RhdHMvVGhyZWFkQ3B1VXNhZ2UuY3BwCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHRpbWUuaD4KIAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgpAQCAtNzQsNyArNzUsNiBAQAogCiBib29sIFRocmVhZENwdVVzYWdlOjpzYW1wbGVBbmRFbmFibGUoZG91YmxlJiBucykKIHsKLSAgICBib29sIHJldDsKICAgICBib29sIHdhc0V2ZXJFbmFibGVkID0gbVdhc0V2ZXJFbmFibGVkOwogICAgIGlmIChlbmFibGUoKSkgewogICAgICAgICAvLyBhbHJlYWR5IGVuYWJsZWQsIHNvIGFkZCBhIG5ldyBzYW1wbGUgcmVsYXRpdmUgdG8gcHJldmlvdXMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbG91ZG5lc3MvQW5kcm9pZC5tayBiL21lZGlhL2xpYmVmZmVjdHMvbG91ZG5lc3MvQW5kcm9pZC5tawppbmRleCBlZGY5NjRlLi41NWQwNjExIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2xvdWRuZXNzL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sb3VkbmVzcy9BbmRyb2lkLm1rCkBAIC0xMiwxNiArMTIsMTEgQEAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogCWxpYmN1dGlscyBcCiAJbGlibG9nIFwKLQlsaWJzdGxwb3J0CiAKIExPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IHNvdW5kZngKIExPQ0FMX01PRFVMRTo9IGxpYmxkbmhuY3IKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpIFwKLQliaW9uaWMgXAotCWJpb25pYy9saWJzdGRjKysvaW5jbHVkZSBcCi0JZXh0ZXJuYWwvc3RscG9ydC9zdGxwb3J0Ci0KIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKaW5kZXggODZjZTI3YS4uNDBjN2ZlZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCkBAIC0zMDUzLDEwICszMDUzLDcgQEAKICAgICAgICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0dFVF9QQVJBTSBzdGFydCIpOwogCiAgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCAqcCA9IChlZmZlY3RfcGFyYW1fdCAqKXBDbWREYXRhOwotICAgICAgICAgICAgaWYgKFNJWkVfTUFYIC0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSA8IChzaXplX3QpcC0+cHNpemUpIHsKLSAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI2MzQ3NTA5Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgPCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpIHx8CiAgICAgICAgICAgICAgICAgICAgIGNtZFNpemUgPCAoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHAtPnBzaXplKSB8fAogICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwgfHwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwCmluZGV4IDRkYzhiNDUuLmE0OGE0ZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcApAQCAtMTk1NiwxMCArMTk1Niw3IEBACiAgICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgogICAgICAgICAgICAgLy8gICAgICAgICJFRkZFQ1RfQ01EX0dFVF9QQVJBTSBzdGFydCIpOwogICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnAgPSAoZWZmZWN0X3BhcmFtX3QgKilwQ21kRGF0YTsKLSAgICAgICAgICAgIGlmIChTSVpFX01BWCAtIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgPCAoc2l6ZV90KXAtPnBzaXplKSB7Ci0gICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNjM0NzUwOSIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplIDwgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSB8fAogICAgICAgICAgICAgICAgICAgICBjbWRTaXplIDwgKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBwLT5wc2l6ZSkgfHwKICAgICAgICAgICAgICAgICAgICAgcFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Byb3h5L0FuZHJvaWQubWsgYi9tZWRpYS9saWJlZmZlY3RzL3Byb3h5L0FuZHJvaWQubWsKaW5kZXggYjQzODc5Ni4uMmJhNDUyZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9wcm94eS9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvcHJveHkvQW5kcm9pZC5tawpAQCAtMjgsNyArMjgsNiBAQAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKICAgICAgICAgc3lzdGVtL21lZGlhL2F1ZGlvX2VmZmVjdHMvaW5jbHVkZSBcCi0gICAgICAgIGJpb25pYy9saWJjL2luY2x1ZGUgXAogICAgICAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeQogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0FuZHJvaWQubWtfIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BbmRyb2lkLm1rXwppbmRleCA2NzJlYmJhLi4xNGMzNzNmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0FuZHJvaWQubWtfCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQW5kcm9pZC5ta18KQEAgLTMsMjQgKzMsMTggQEAKICMgVGVzdCBSZXZlcmIgbGlicmFyeQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKLUxPQ0FMX1NSQ19GSUxFUzo9IFwKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCiAJRWZmZWN0UmV2ZXJiLmMuYXJtIFwKIAlFZmZlY3RzTWF0aC5jLmFybQotTE9DQUxfQ0ZMQUdTKz0gLU8yCisKK0xPQ0FMX0NGTEFHUyA6PSAtTzIKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGliY3V0aWxzCisJbGliY3V0aWxzIFwKKwlsaWJkbAogCiBMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBzb3VuZGZ4Ci1MT0NBTF9NT0RVTEU6PSBsaWJyZXZlcmJ0ZXN0Ci0KLWlmZXEgKCQoVEFSR0VUX09TKS0kKFRBUkdFVF9TSU1VTEFUT1IpLGxpbnV4LXRydWUpCi1MT0NBTF9MRExJQlMgKz0gLWxkbAotZW5kaWYKLQotaWZuZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKLWVuZGlmCitMT0NBTF9NT0RVTEUgOj0gbGlicmV2ZXJidGVzdAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tZWZmZWN0cykgXApAQCAtMzMsNyArMjcsNyBAQAogIyBUZXN0IEVxdWFsaXplciBsaWJyYXJ5CiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAotTE9DQUxfU1JDX0ZJTEVTOj0gXAorTE9DQUxfU1JDX0ZJTEVTIDo9IFwKIAlFZmZlY3RzTWF0aC5jLmFybSBcCiAJRWZmZWN0RXF1YWxpemVyLmNwcCBcCiAJQXVkaW9CaXF1YWRGaWx0ZXIuY3BwLmFybSBcCkBAIC00MiwyMSArMzYsMTQgQEAKIAlBdWRpb1NoZWx2aW5nRmlsdGVyLmNwcC5hcm0gXAogCUF1ZGlvRXF1YWxpemVyLmNwcC5hcm0KIAotTE9DQUxfQ0ZMQUdTKz0gLU8yCitMT0NBTF9DRkxBR1MgOj0gLU8yCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYmN1dGlscworCWxpYmN1dGlscyBcCisJbGliZGwKIAogTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gc291bmRmeAotTE9DQUxfTU9EVUxFOj0gbGliZXF1YWxpemVydGVzdAotCi1pZmVxICgkKFRBUkdFVF9PUyktJChUQVJHRVRfU0lNVUxBVE9SKSxsaW51eC10cnVlKQotTE9DQUxfTERMSUJTICs9IC1sZGwKLWVuZGlmCi0KLWlmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmRsCi1lbmRpZgorTE9DQUxfTU9EVUxFIDo9IGxpYmVxdWFsaXplcnRlc3QKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGdyYXBoaWNzIGNvcmVjZykgXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5tayBiL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQubWsKaW5kZXggOTNiYjA1OS4uNjBlMmQ4MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLm1rCkBAIC00Myw2ICs0Myw3IEBACiAgICAgbWVkaWFyZWNvcmRlci5jcHAgXAogICAgIElNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmNwcCBcCiAgICAgbWVkaWFtZXRhZGF0YXJldHJpZXZlci5jcHAgXAorICAgIE1pZGlJb1dyYXBwZXIuY3BwIFwKICAgICBUb25lR2VuZXJhdG9yLmNwcCBcCiAgICAgSmV0UGxheWVyLmNwcCBcCiAgICAgSU9NWC5jcHAgXApAQCAtNTgsOCArNTksNiBAQAogICAgIEF1ZGlvRWZmZWN0LmNwcCBcCiAgICAgVmlzdWFsaXplci5jcHAgXAogICAgIE1lbW9yeUxlYWtUcmFja1V0aWwuY3BwIFwKLSAgICBTb3VuZFBvb2wuY3BwIFwKLSAgICBTb3VuZFBvb2xUaHJlYWQuY3BwIFwKICAgICBTdHJpbmdBcnJheS5jcHAgXAogICAgIEF1ZGlvUG9saWN5LmNwcAogCkBAIC03NiwxMiArNzUsMTIgQEAKIAogTE9DQUxfTU9EVUxFOj0gbGlibWVkaWEKIAorTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMgOj0gJChMT0NBTF9QQVRIKS9BbmRyb2lkLm1rCisKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2luY2x1ZGUvbWVkaWEvIFwKICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0gICAgJChUT1ApL2V4dGVybmFsL2ljdS9pY3U0Yy9zb3VyY2UvY29tbW9uIFwKLSAgICAkKFRPUCkvZXh0ZXJuYWwvaWN1L2ljdTRjL3NvdXJjZS9pMThuIFwKICAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tZWZmZWN0cykgXAogICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykKIApAQCAtODksOCArODgsNiBAQAogCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAotIyBmb3IgPGN1dGlscy9hdG9taWMtaW5saW5lLmg+Ci1MT0NBTF9DRkxBR1MgKz0gLURBTkRST0lEX1NNUD0kKGlmICQoZmluZHN0cmluZyB0cnVlLCQoVEFSR0VUX0NQVV9TTVApKSwxLDApCiBMT0NBTF9TUkNfRklMRVMgKz0gU2luZ2xlU3RhdGVRdWV1ZS5jcHAKIExPQ0FMX0NGTEFHUyArPSAtRFNJTkdMRV9TVEFURV9RVUVVRV9JTlNUQU5USUFUSU9OUz0nIlNpbmdsZVN0YXRlUXVldWVJbnN0YW50aWF0aW9ucy5jcHAiJwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BdWRpb0VmZmVjdC5jcHAgYi9tZWRpYS9saWJtZWRpYS9BdWRpb0VmZmVjdC5jcHAKaW5kZXggMGQ1ZDdlNC4uYWYxMDNjMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQXVkaW9FZmZlY3QuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvRWZmZWN0LmNwcApAQCAtMTUwLDcgKzE1MCw3IEBACiAgICAgaW50IGJ1Zk9mZnNldCA9ICgoc2l6ZW9mKGVmZmVjdF9wYXJhbV9jYmxrX3QpIC0gMSkgLyBzaXplb2YoaW50KSArIDEpICogc2l6ZW9mKGludCk7CiAgICAgbUNibGstPmJ1ZmZlciA9ICh1aW50OF90ICopbUNibGsgKyBidWZPZmZzZXQ7CiAKLSAgICBpRWZmZWN0LT5hc0JpbmRlcigpLT5saW5rVG9EZWF0aChtSUVmZmVjdENsaWVudCk7CisgICAgSUludGVyZmFjZTo6YXNCaW5kZXIoaUVmZmVjdCktPmxpbmtUb0RlYXRoKG1JRWZmZWN0Q2xpZW50KTsKICAgICBtQ2xpZW50UGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwogICAgIEFMT0dWKCJzZXQoKSAlcCBPSyBlZmZlY3Q6ICVzIGlkOiAlZCBzdGF0dXMgJWQgZW5hYmxlZCAlZCBwaWQgJWQiLCB0aGlzLCBtRGVzY3JpcHRvci5uYW1lLCBtSWQsCiAgICAgICAgICAgICBtU3RhdHVzLCBtRW5hYmxlZCwgbUNsaWVudFBpZCk7CkBAIC0xNzMsNyArMTczLDcgQEAKICAgICAgICAgfQogICAgICAgICBpZiAobUlFZmZlY3QgIT0gTlVMTCkgewogICAgICAgICAgICAgbUlFZmZlY3QtPmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgIG1JRWZmZWN0LT5hc0JpbmRlcigpLT51bmxpbmtUb0RlYXRoKG1JRWZmZWN0Q2xpZW50KTsKKyAgICAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKG1JRWZmZWN0KS0+dW5saW5rVG9EZWF0aChtSUVmZmVjdENsaWVudCk7CiAgICAgICAgIH0KICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvUmVjb3JkLmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvUmVjb3JkLmNwcAppbmRleCBjYTM4MzJkLi4wN2NhMTRmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BdWRpb1JlY29yZC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9SZWNvcmQuY3BwCkBAIC0xMDcsNyArMTA3LDcgQEAKICAgICAgICAgICAgIG1BdWRpb1JlY29yZFRocmVhZC0+cmVxdWVzdEV4aXRBbmRXYWl0KCk7CiAgICAgICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQuY2xlYXIoKTsKICAgICAgICAgfQotICAgICAgICBtQXVkaW9SZWNvcmQtPmFzQmluZGVyKCktPnVubGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIHRoaXMpOworICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtQXVkaW9SZWNvcmQpLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCB0aGlzKTsKICAgICAgICAgbUF1ZGlvUmVjb3JkLmNsZWFyKCk7CiAgICAgICAgIG1DYmxrTWVtb3J5LmNsZWFyKCk7CiAgICAgICAgIG1CdWZmZXJNZW1vcnkuY2xlYXIoKTsKQEAgLTUyNSw3ICs1MjUsNyBAQAogCiAgICAgLy8gaW52YXJpYW50IHRoYXQgbUF1ZGlvUmVjb3JkICE9IDAgaXMgdHJ1ZSBvbmx5IGFmdGVyIHNldCgpIHJldHVybnMgc3VjY2Vzc2Z1bGx5CiAgICAgaWYgKG1BdWRpb1JlY29yZCAhPSAwKSB7Ci0gICAgICAgIG1BdWRpb1JlY29yZC0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgdGhpcyk7CisgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKG1BdWRpb1JlY29yZCktPnVubGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIHRoaXMpOwogICAgICAgICBtRGVhdGhOb3RpZmllci5jbGVhcigpOwogICAgIH0KICAgICBtQXVkaW9SZWNvcmQgPSByZWNvcmQ7CkBAIC01NzUsNyArNTc1LDcgQEAKICAgICBtUHJveHktPnNldE1pbmltdW0obU5vdGlmaWNhdGlvbkZyYW1lc0FjdCk7CiAKICAgICBtRGVhdGhOb3RpZmllciA9IG5ldyBEZWF0aE5vdGlmaWVyKHRoaXMpOwotICAgIG1BdWRpb1JlY29yZC0+YXNCaW5kZXIoKS0+bGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIHRoaXMpOworICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKG1BdWRpb1JlY29yZCktPmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCB0aGlzKTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BdWRpb1RyYWNrLmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2suY3BwCmluZGV4IDM4OWFhY2MuLjczNWRiNWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2suY3BwCkBAIC0xOTQsNyArMTk0LDcgQEAKICAgICAgICAgICAgIG1BdWRpb1RyYWNrVGhyZWFkLT5yZXF1ZXN0RXhpdEFuZFdhaXQoKTsKICAgICAgICAgICAgIG1BdWRpb1RyYWNrVGhyZWFkLmNsZWFyKCk7CiAgICAgICAgIH0KLSAgICAgICAgbUF1ZGlvVHJhY2stPmFzQmluZGVyKCktPnVubGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIHRoaXMpOworICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtQXVkaW9UcmFjayktPnVubGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIHRoaXMpOwogICAgICAgICBtQXVkaW9UcmFjay5jbGVhcigpOwogICAgICAgICBtQ2Jsa01lbW9yeS5jbGVhcigpOwogICAgICAgICBtU2hhcmVkQnVmZmVyLmNsZWFyKCk7CkBAIC0xMTM4LDcgKzExMzgsNyBAQAogICAgIH0KICAgICAvLyBpbnZhcmlhbnQgdGhhdCBtQXVkaW9UcmFjayAhPSAwIGlzIHRydWUgb25seSBhZnRlciBzZXQoKSByZXR1cm5zIHN1Y2Nlc3NmdWxseQogICAgIGlmIChtQXVkaW9UcmFjayAhPSAwKSB7Ci0gICAgICAgIG1BdWRpb1RyYWNrLT5hc0JpbmRlcigpLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCB0aGlzKTsKKyAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUF1ZGlvVHJhY2spLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCB0aGlzKTsKICAgICAgICAgbURlYXRoTm90aWZpZXIuY2xlYXIoKTsKICAgICB9CiAgICAgbUF1ZGlvVHJhY2sgPSB0cmFjazsKQEAgLTEyNDUsNyArMTI0NSw3IEBACiAgICAgbVByb3h5LT5zZXRNaW5pbXVtKG1Ob3RpZmljYXRpb25GcmFtZXNBY3QpOwogCiAgICAgbURlYXRoTm90aWZpZXIgPSBuZXcgRGVhdGhOb3RpZmllcih0aGlzKTsKLSAgICBtQXVkaW9UcmFjay0+YXNCaW5kZXIoKS0+bGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIHRoaXMpOworICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKG1BdWRpb1RyYWNrKS0+bGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIHRoaXMpOwogCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvRmxpbmdlci5jcHAKaW5kZXggYWMyZDFjOS4uYTk0ZjljZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvRmxpbmdlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvRmxpbmdlci5jcHAKQEAgLTEyMSw3ICsxMjEsNyBAQAogICAgICAgICAvLyBoYXZlU2hhcmVkQnVmZmVyCiAgICAgICAgIGlmIChzaGFyZWRCdWZmZXIgIT0gMCkgewogICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKHRydWUpOwotICAgICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihzaGFyZWRCdWZmZXItPmFzQmluZGVyKCkpOworICAgICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihzaGFyZWRCdWZmZXIpKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihmYWxzZSk7CiAgICAgICAgIH0KQEAgLTQyMSw3ICs0MjEsNyBAQAogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihjbGllbnQtPmFzQmluZGVyKCkpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGNsaWVudCkpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVHSVNURVJfQ0xJRU5ULCBkYXRhLCAmcmVwbHkpOwogICAgIH0KIApAQCAtNzE4LDcgKzcxOCw3IEBACiAKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGUocERlc2MsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoY2xpZW50LT5hc0JpbmRlcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihjbGllbnQpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHByaW9yaXR5KTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBvdXRwdXQpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoc2Vzc2lvbklkKTsKQEAgLTk0MSw3ICs5NDEsNyBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZmxhZ3MpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2Vzc2lvbklkKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIodHJhY2stPmFzQmluZGVyKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKHRyYWNrKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgT1BFTl9SRUNPUkQ6IHsKQEAgLTk2OCw5ICs5NjgsOSBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2Vzc2lvbklkKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDY0KG5vdGlmaWNhdGlvbkZyYW1lcyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKHJlY29yZC0+YXNCaW5kZXIoKSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoY2Jsay0+YXNCaW5kZXIoKSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoYnVmZmVycy0+YXNCaW5kZXIoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIocmVjb3JkKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoY2JsaykpOworICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGJ1ZmZlcnMpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTQU1QTEVfUkFURTogewpAQCAtMTI2Miw3ICsxMjYyLDcgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpZCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlbmFibGVkKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihlZmZlY3QtPmFzQmluZGVyKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGVmZmVjdCkpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlKCZkZXNjLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAppbmRleCA1NmM4ZjNkLi4xYjhjYTJkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcApAQCAtNjMwLDcgKzYzMCw3IEBACiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGNsaWVudC0+YXNCaW5kZXIoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoY2xpZW50KSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRUdJU1RFUl9DTElFTlQsIGRhdGEsICZyZXBseSk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9UcmFjay5jcHAgYi9tZWRpYS9saWJtZWRpYS9JQXVkaW9UcmFjay5jcHAKaW5kZXggMjY1YmIxYi4uZGYyMDlmZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb1RyYWNrLmNwcApAQCAtMTM3LDcgKzEzNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcHRzKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1RyYWNrOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGJ1ZmZlci0+YXNCaW5kZXIoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoYnVmZmVyKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQ2NChwdHMpOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUVVFVUVfVElNRURfQlVGRkVSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgJnJlcGx5KTsKQEAgLTIwNyw3ICsyMDcsNyBAQAogICAgIHN3aXRjaCAoY29kZSkgewogICAgICAgICBjYXNlIEdFVF9DQkxLOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvVHJhY2ssIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihnZXRDYmxrKCktPmFzQmluZGVyKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGdldENibGsoKSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFNUQVJUOiB7CkBAIC0yNDEsNyArMjQxLDcgQEAKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGFsbG9jYXRlVGltZWRCdWZmZXIoZGF0YS5yZWFkSW50NjQoKSwgJmJ1ZmZlcik7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihidWZmZXItPmFzQmluZGVyKCkpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihidWZmZXIpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lEcm0uY3BwIGIvbWVkaWEvbGlibWVkaWEvSURybS5jcHAKaW5kZXggN2U3NGRlOS4uYjA4ZmE4MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSURybS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSURybS5jcHAKQEAgLTQ1MCw3ICs0NTAsNyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TGlzdGVuZXIoY29uc3Qgc3A8SURybUNsaWVudD4mIGxpc3RlbmVyKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIobGlzdGVuZXItPmFzQmluZGVyKCkpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGxpc3RlbmVyKSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfTElTVEVORVIsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JRWZmZWN0LmNwcCBiL21lZGlhL2xpYm1lZGlhL0lFZmZlY3QuY3BwCmluZGV4IDhjZDE1OGQuLjJmNmE5MWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lFZmZlY3QuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lFZmZlY3QuY3BwCkBAIC0yMDMsNyArMjAzLDcgQEAKIAogICAgICAgICBjYXNlIEdFVF9DQkxLOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUVmZmVjdCwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKGdldENibGsoKS0+YXNCaW5kZXIoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoZ2V0Q2JsaygpKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lIRENQLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lIRENQLmNwcAppbmRleCA5ZDkzMzIwLi43OTk0NGVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JSERDUC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSUhEQ1AuY3BwCkBAIC02NSw3ICs2NSw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPYnNlcnZlcihjb25zdCBzcDxJSERDUE9ic2VydmVyPiAmb2JzZXJ2ZXIpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUhEQ1A6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIob2JzZXJ2ZXItPmFzQmluZGVyKCkpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKG9ic2VydmVyKSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChIRENQX1NFVF9PQlNFUlZFUiwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYURlYXRoTm90aWZpZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhRGVhdGhOb3RpZmllci5jcHAKaW5kZXggMTA2MjA1YS4uZjVjMzQwYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhRGVhdGhOb3RpZmllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhRGVhdGhOb3RpZmllci5jcHAKQEAgLTEwNCw3ICsxMDQsNyBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChzU2VydmljZUxvY2spOwogICAgIHNPYml0UmVjaXBpZW50cy5jbGVhcigpOwogICAgIGlmIChzTWVkaWFQbGF5ZXJTZXJ2aWNlICE9IDApIHsKLSAgICAgICAgc01lZGlhUGxheWVyU2VydmljZS0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIoc01lZGlhUGxheWVyU2VydmljZSktPnVubGlua1RvRGVhdGgodGhpcyk7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFMb2dTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUxvZ1NlcnZpY2UuY3BwCmluZGV4IDhhNjZjN2MuLmE0YWY3YjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUxvZ1NlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUxvZ1NlcnZpY2UuY3BwCkBAIC00Miw3ICs0Miw3IEBACiAgICAgdmlydHVhbCB2b2lkICAgIHJlZ2lzdGVyV3JpdGVyKGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWQsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpuYW1lKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYUxvZ1NlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoc2hhcmVkLT5hc0JpbmRlcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihzaGFyZWQpKTsKICAgICAgICAgZGF0YS53cml0ZUludDY0KChpbnQ2NF90KSBzaXplKTsKICAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcobmFtZSk7CiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChSRUdJU1RFUl9XUklURVIsIGRhdGEsICZyZXBseSk7CkBAIC01Miw3ICs1Miw3IEBACiAgICAgdmlydHVhbCB2b2lkICAgIHVucmVnaXN0ZXJXcml0ZXIoY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZCkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFMb2dTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKHNoYXJlZC0+YXNCaW5kZXIoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoc2hhcmVkKSk7CiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChVTlJFR0lTVEVSX1dSSVRFUiwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgLy8gRklYTUUgaWdub3JlcyBzdGF0dXMKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHAKaW5kZXggMzhmNzE3Yy4uYWEyNjY1YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmNwcApAQCAtOTUsNyArOTUsNyBAQAogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihodHRwU2VydmljZSAhPSBOVUxMKTsKICAgICAgICAgaWYgKGh0dHBTZXJ2aWNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoaHR0cFNlcnZpY2UtPmFzQmluZGVyKCkpOworICAgICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihodHRwU2VydmljZSkpOwogICAgICAgICB9CiAgICAgICAgIGRhdGEud3JpdGVDU3RyaW5nKHNyY1VybCk7CiAKQEAgLTI0Niw3ICsyNDYsNyBAQAogICAgICAgICAgICAgc3A8SU1lbW9yeT4gYml0bWFwID0gZ2V0RnJhbWVBdFRpbWUodGltZVVzLCBvcHRpb24pOwogICAgICAgICAgICAgaWYgKGJpdG1hcCAhPSAwKSB7ICAvLyBEb24ndCBzZW5kIE5VTEwgYWNyb3NzIHRoZSBiaW5kZXIgaW50ZXJmYWNlCiAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoTk9fRVJST1IpOwotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihiaXRtYXAtPmFzQmluZGVyKCkpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihiaXRtYXApKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoVU5LTk9XTl9FUlJPUik7CiAgICAgICAgICAgICB9CkBAIC0yNjMsNyArMjYzLDcgQEAKICAgICAgICAgICAgIHNwPElNZW1vcnk+IGFsYnVtQXJ0ID0gZXh0cmFjdEFsYnVtQXJ0KCk7CiAgICAgICAgICAgICBpZiAoYWxidW1BcnQgIT0gMCkgeyAgLy8gRG9uJ3Qgc2VuZCBOVUxMIGFjcm9zcyB0aGUgYmluZGVyIGludGVyZmFjZQogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKE5PX0VSUk9SKTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoYWxidW1BcnQtPmFzQmluZGVyKCkpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihhbGJ1bUFydCkpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihVTktOT1dOX0VSUk9SKTsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwCmluZGV4IGEyOWE3ZGUuLmMxYjkwMjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcApAQCAtODUsNyArODUsNyBAQAogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoaHR0cFNlcnZpY2UgIT0gTlVMTCk7CiAgICAgICAgIGlmIChodHRwU2VydmljZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGh0dHBTZXJ2aWNlLT5hc0JpbmRlcigpKTsKKyAgICAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoaHR0cFNlcnZpY2UpKTsKICAgICAgICAgfQogICAgICAgICBkYXRhLndyaXRlQ1N0cmluZyh1cmwpOwogICAgICAgICBpZiAoaGVhZGVycyA9PSBOVUxMKSB7CkBAIC0xMTUsNyArMTE1LDcgQEAKICAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+ICZzb3VyY2UpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKHNvdXJjZS0+YXNCaW5kZXIoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoc291cmNlKSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfREFUQV9TT1VSQ0VfU1RSRUFNLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQpAQCAtMTI1LDcgKzEyNSw3IEBACiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFQbGF5ZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHNwPElCaW5kZXI+IGIoYnVmZmVyUHJvZHVjZXItPmFzQmluZGVyKCkpOworICAgICAgICBzcDxJQmluZGVyPiBiKElJbnRlcmZhY2U6OmFzQmluZGVyKGJ1ZmZlclByb2R1Y2VyKSk7CiAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoYik7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfVklERU9fU1VSRkFDRVRFWFRVUkUsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKQEAgLTMyMyw3ICszMjMsNyBAQAogICAgIHN0YXR1c190IHNldE5leHRQbGF5ZXIoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgcGxheWVyKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgc3A8SUJpbmRlcj4gYihwbGF5ZXItPmFzQmluZGVyKCkpOworICAgICAgICBzcDxJQmluZGVyPiBiKElJbnRlcmZhY2U6OmFzQmluZGVyKHBsYXllcikpOwogICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGIpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX05FWFRfUExBWUVSLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwCmluZGV4IDJlMDJkMTcuLmZlZWEyNjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwCkBAIC0zOSw4ICszOSw2IEBACiAKIGVudW0gewogICAgIENSRUFURSA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCi0gICAgREVDT0RFX1VSTCwKLSAgICBERUNPREVfRkQsCiAgICAgQ1JFQVRFX01FRElBX1JFQ09SREVSLAogICAgIENSRUFURV9NRVRBREFUQV9SRVRSSUVWRVIsCiAgICAgR0VUX09NWCwKQEAgLTczLDcgKzcxLDcgQEAKICAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYVBsYXllckNsaWVudD4mIGNsaWVudCwgaW50IGF1ZGlvU2Vzc2lvbklkKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoY2xpZW50LT5hc0JpbmRlcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihjbGllbnQpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGF1ZGlvU2Vzc2lvbklkKTsKIAogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ1JFQVRFLCBkYXRhLCAmcmVwbHkpOwpAQCAtODgsNTkgKzg2LDYgQEAKICAgICAgICAgcmV0dXJuIGludGVyZmFjZV9jYXN0PElNZWRpYVJlY29yZGVyPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVjb2RlKAotICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybCwKLSAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgIGludCogcE51bUNoYW5uZWxzLAotICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCi0gICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsCi0gICAgICAgICAgICBzaXplX3QgKnBTaXplKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGh0dHBTZXJ2aWNlICE9IE5VTEwpOwotICAgICAgICBpZiAoaHR0cFNlcnZpY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihodHRwU2VydmljZS0+YXNCaW5kZXIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcodXJsKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihoZWFwLT5hc0JpbmRlcigpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KERFQ09ERV9VUkwsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAqcFNhbXBsZVJhdGUgPSB1aW50MzJfdChyZXBseS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICAgICAgKnBOdW1DaGFubmVscyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgICAgICpwRm9ybWF0ID0gKGF1ZGlvX2Zvcm1hdF90KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgICAgICpwU2l6ZSA9IChzaXplX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGRlY29kZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCwgdWludDMyX3QgKnBTYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogcE51bUNoYW5uZWxzLCBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsIHNpemVfdCAqcFNpemUpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFQbGF5ZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlRmlsZURlc2NyaXB0b3IoZmQpOwotICAgICAgICBkYXRhLndyaXRlSW50NjQob2Zmc2V0KTsKLSAgICAgICAgZGF0YS53cml0ZUludDY0KGxlbmd0aCk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoaGVhcC0+YXNCaW5kZXIoKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChERUNPREVfRkQsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAqcFNhbXBsZVJhdGUgPSB1aW50MzJfdChyZXBseS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICAgICAgKnBOdW1DaGFubmVscyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgICAgICpwRm9ybWF0ID0gKGF1ZGlvX2Zvcm1hdF90KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgICAgICpwU2l6ZSA9IChzaXplX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KICAgICB2aXJ0dWFsIHNwPElPTVg+IGdldE9NWCgpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKQEAgLTE4OCw3ICsxMzMsNyBAQAogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihjbGllbnQtPmFzQmluZGVyKCkpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGNsaWVudCkpOwogICAgICAgICBkYXRhLndyaXRlU3RyaW5nOChpZmFjZSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChMSVNURU5fRk9SX1JFTU9URV9ESVNQTEFZLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8SVJlbW90ZURpc3BsYXk+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CkBAIC0yMTYsOTUgKzE2MSw0NCBAQAogICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElNZWRpYVBsYXllckNsaWVudD4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOwogICAgICAgICAgICAgaW50IGF1ZGlvU2Vzc2lvbklkID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHNwPElNZWRpYVBsYXllcj4gcGxheWVyID0gY3JlYXRlKGNsaWVudCwgYXVkaW9TZXNzaW9uSWQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKHBsYXllci0+YXNCaW5kZXIoKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgREVDT0RFX1VSTDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVBsYXllclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHNwPElNZWRpYUhUVFBTZXJ2aWNlPiBodHRwU2VydmljZTsKLSAgICAgICAgICAgIGlmIChkYXRhLnJlYWRJbnQzMigpKSB7Ci0gICAgICAgICAgICAgICAgaHR0cFNlcnZpY2UgPQotICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJTWVkaWFIVFRQU2VydmljZT4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29uc3QgY2hhciogdXJsID0gZGF0YS5yZWFkQ1N0cmluZygpOwotICAgICAgICAgICAgc3A8SU1lbW9yeUhlYXA+IGhlYXAgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5SGVhcD4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZTsKLSAgICAgICAgICAgIGludCBudW1DaGFubmVsczsKLSAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdDsKLSAgICAgICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0KLSAgICAgICAgICAgICAgICBkZWNvZGUoaHR0cFNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIHVybCwKLSAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICZudW1DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgJmZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgaGVhcCwKLSAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzYW1wbGVSYXRlKTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihudW1DaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3QpZm9ybWF0KTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigoaW50MzJfdClzaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBERUNPREVfRkQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQgZmQgPSBkdXAoZGF0YS5yZWFkRmlsZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgICAgICBpbnQ2NF90IG9mZnNldCA9IGRhdGEucmVhZEludDY0KCk7Ci0gICAgICAgICAgICBpbnQ2NF90IGxlbmd0aCA9IGRhdGEucmVhZEludDY0KCk7Ci0gICAgICAgICAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcCA9IGludGVyZmFjZV9jYXN0PElNZW1vcnlIZWFwPihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlOwotICAgICAgICAgICAgaW50IG51bUNoYW5uZWxzOwotICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0OwotICAgICAgICAgICAgc2l6ZV90IHNpemU7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZWNvZGUoZmQsIG9mZnNldCwgbGVuZ3RoLCAmc2FtcGxlUmF0ZSwgJm51bUNoYW5uZWxzLCAmZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXAsICZzaXplKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2FtcGxlUmF0ZSk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobnVtQ2hhbm5lbHMpOwotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KWZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3Qpc2l6ZSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIocGxheWVyKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgQ1JFQVRFX01FRElBX1JFQ09SREVSOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyU2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgc3A8SU1lZGlhUmVjb3JkZXI+IHJlY29yZGVyID0gY3JlYXRlTWVkaWFSZWNvcmRlcigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKHJlY29yZGVyLT5hc0JpbmRlcigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihyZWNvcmRlcikpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIENSRUFURV9NRVRBREFUQV9SRVRSSUVWRVI6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBzcDxJTWVkaWFNZXRhZGF0YVJldHJpZXZlcj4gcmV0cmlldmVyID0gY3JlYXRlTWV0YWRhdGFSZXRyaWV2ZXIoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihyZXRyaWV2ZXItPmFzQmluZGVyKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKHJldHJpZXZlcikpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIEdFVF9PTVg6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBzcDxJT01YPiBvbXggPSBnZXRPTVgoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihvbXgtPmFzQmluZGVyKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKG9teCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIE1BS0VfQ1JZUFRPOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyU2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgc3A8SUNyeXB0bz4gY3J5cHRvID0gbWFrZUNyeXB0bygpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKGNyeXB0by0+YXNCaW5kZXIoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoY3J5cHRvKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgTUFLRV9EUk06IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBzcDxJRHJtPiBkcm0gPSBtYWtlRHJtKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoZHJtLT5hc0JpbmRlcigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihkcm0pKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBNQUtFX0hEQ1A6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBib29sIGNyZWF0ZUVuY3J5cHRpb25Nb2R1bGUgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgc3A8SUhEQ1A+IGhkY3AgPSBtYWtlSERDUChjcmVhdGVFbmNyeXB0aW9uTW9kdWxlKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihoZGNwLT5hc0JpbmRlcigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihoZGNwKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgQUREX0JBVFRFUllfREFUQTogewpAQCAtMzI0LDEzICsyMTgsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SVJlbW90ZURpc3BsYXlDbGllbnQ+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKSk7CiAgICAgICAgICAgICBTdHJpbmc4IGlmYWNlKGRhdGEucmVhZFN0cmluZzgoKSk7CiAgICAgICAgICAgICBzcDxJUmVtb3RlRGlzcGxheT4gZGlzcGxheShsaXN0ZW5Gb3JSZW1vdGVEaXNwbGF5KGNsaWVudCwgaWZhY2UpKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihkaXNwbGF5LT5hc0JpbmRlcigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihkaXNwbGF5KSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgR0VUX0NPREVDX0xJU1Q6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBzcDxJTWVkaWFDb2RlY0xpc3Q+IG1jbCA9IGdldENvZGVjTGlzdCgpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKG1jbC0+YXNCaW5kZXIoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIobWNsKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAKaW5kZXggOTVhZjAwNi4uYTczM2I2OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcApAQCAtNzAsOCArNzAsOCBAQAogICAgICAgICBBTE9HVigic2V0Q2FtZXJhKCVwLCVwKSIsIGNhbWVyYS5nZXQoKSwgcHJveHkuZ2V0KCkpOwogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFSZWNvcmRlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihjYW1lcmEtPmFzQmluZGVyKCkpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKHByb3h5LT5hc0JpbmRlcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihjYW1lcmEpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihwcm94eSkpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0NBTUVSQSwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KQEAgLTk0LDcgKzk0LDcgQEAKICAgICAgICAgQUxPR1YoInNldFByZXZpZXdTdXJmYWNlKCVwKSIsIHN1cmZhY2UuZ2V0KCkpOwogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFSZWNvcmRlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihzdXJmYWNlLT5hc0JpbmRlcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihzdXJmYWNlKSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfUFJFVklFV19TVVJGQUNFLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQpAQCAtMjE1LDcgKzIxNSw3IEBACiAgICAgICAgIEFMT0dWKCJzZXRMaXN0ZW5lciglcCkiLCBsaXN0ZW5lci5nZXQoKSk7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVJlY29yZGVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGxpc3RlbmVyLT5hc0JpbmRlcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihsaXN0ZW5lcikpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0xJU1RFTkVSLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQpAQCAtNDY4LDcgKzQ2OCw3IEBACiAgICAgICAgICAgICBpbnQgcmV0dXJuZWROdWxsPSAoc3VyZmFjZU1lZGlhU291cmNlID09IE5VTEwpID8gMSA6IDAgOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmV0dXJuZWROdWxsKTsKICAgICAgICAgICAgIGlmICghcmV0dXJuZWROdWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKHN1cmZhY2VNZWRpYVNvdXJjZS0+YXNCaW5kZXIoKSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKHN1cmZhY2VNZWRpYVNvdXJjZSkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JT01YLmNwcAppbmRleCA3NWI5OWE2Li4wN2RlNTM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JT01YLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JT01YLmNwcApAQCAtMTAyLDcgKzEwMiw3IEBACiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVDU3RyaW5nKG5hbWUpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKG9ic2VydmVyLT5hc0JpbmRlcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihvYnNlcnZlcikpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQUxMT0NBVEVfTk9ERSwgZGF0YSwgJnJlcGx5KTsKIAogICAgICAgICBzdGF0dXNfdCBlcnIgPSByZXBseS5yZWFkSW50MzIoKTsKQEAgLTI1MCw3ICsyNTAsNyBAQAogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydF9pbmRleCk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIocGFyYW1zLT5hc0JpbmRlcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihwYXJhbXMpKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFVTRV9CVUZGRVIsIGRhdGEsICZyZXBseSk7CiAKICAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVwbHkucmVhZEludDMyKCk7CkBAIC00MjAsNyArNDIwLDcgQEAKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnRfaW5kZXgpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKHBhcmFtcy0+YXNCaW5kZXIoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIocGFyYW1zKSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChBTExPQ19CVUZGRVJfV0lUSF9CQUNLVVAsIGRhdGEsICZyZXBseSk7CiAKICAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVwbHkucmVhZEludDMyKCk7CkBAIC04MTYsNyArODE2LDcgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVycik7CiAKICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoYnVmZmVyUHJvZHVjZXItPmFzQmluZGVyKCkpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihidWZmZXJQcm9kdWNlcikpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JUmVtb3RlRGlzcGxheUNsaWVudC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JUmVtb3RlRGlzcGxheUNsaWVudC5jcHAKaW5kZXggNzE5MDg3OS4uOWQ2M2JjOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSVJlbW90ZURpc3BsYXlDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lSZW1vdGVEaXNwbGF5Q2xpZW50LmNwcApAQCAtNDIsNyArNDIsNyBAQAogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJlbW90ZURpc3BsYXlDbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoYnVmZmVyUHJvZHVjZXItPmFzQmluZGVyKCkpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGJ1ZmZlclByb2R1Y2VyKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMih3aWR0aCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihoZWlnaHQpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSVN0cmVhbVNvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9JU3RyZWFtU291cmNlLmNwcAppbmRleCBmZTJjYzYxLi5kNDgwYWVmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JU3RyZWFtU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JU3RyZWFtU291cmNlLmNwcApAQCAtNTUsNyArNTUsNyBAQAogICAgIHZpcnR1YWwgdm9pZCBzZXRMaXN0ZW5lcihjb25zdCBzcDxJU3RyZWFtTGlzdGVuZXI+ICZsaXN0ZW5lcikgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU3RyZWFtU291cmNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGxpc3RlbmVyLT5hc0JpbmRlcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihsaXN0ZW5lcikpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0xJU1RFTkVSLCBkYXRhLCAmcmVwbHkpOwogICAgIH0KIApAQCAtNjQsNyArNjQsNyBAQAogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVN0cmVhbVNvdXJjZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDY0KHN0YXRpY19jYXN0PGludDY0X3Q+KGJ1ZmZlcnMuc2l6ZSgpKSk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYnVmZmVycy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihidWZmZXJzLml0ZW1BdChpKS0+YXNCaW5kZXIoKSk7CisgICAgICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGJ1ZmZlcnMuaXRlbUF0KGkpKSk7CiAgICAgICAgIH0KICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9CVUZGRVJTLCBkYXRhLCAmcmVwbHkpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0pldFBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYS9KZXRQbGF5ZXIuY3BwCmluZGV4IGYwZjE4MzIuLjcyMWQ4ZDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0pldFBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSmV0UGxheWVyLmNwcApAQCAtMzYsNyArMzYsNiBAQAogICAgICAgICBtUGF1c2VkKGZhbHNlKSwKICAgICAgICAgbU1heFRyYWNrcyhtYXhUcmFja3MpLAogICAgICAgICBtRWFzRGF0YShOVUxMKSwKLSAgICAgICAgbUVhc0pldEZpbGVMb2MoTlVMTCksCiAgICAgICAgIG1UcmFja0J1ZmZlclNpemUodHJhY2tCdWZmZXJTaXplKQogewogICAgIEFMT0dWKCJKZXRQbGF5ZXIgY29uc3RydWN0b3IiKTsKQEAgLTEzMywxMCArMTMyLDcgQEAKICAgICAgICAgSkVUX1NodXRkb3duKG1FYXNEYXRhKTsKICAgICAgICAgRUFTX1NodXRkb3duKG1FYXNEYXRhKTsKICAgICB9Ci0gICAgaWYgKG1FYXNKZXRGaWxlTG9jKSB7Ci0gICAgICAgIGZyZWUobUVhc0pldEZpbGVMb2MpOwotICAgICAgICBtRWFzSmV0RmlsZUxvYyA9IE5VTEw7Ci0gICAgfQorICAgIG1Jb1dyYXBwZXIuY2xlYXIoKTsKICAgICBpZiAobUF1ZGlvVHJhY2sgIT0gMCkgewogICAgICAgICBtQXVkaW9UcmFjay0+c3RvcCgpOwogICAgICAgICBtQXVkaW9UcmFjay0+Zmx1c2goKTsKQEAgLTMyNywxNiArMzIzLDkgQEAKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CiAKLSAgICBtRWFzSmV0RmlsZUxvYyA9IChFQVNfRklMRV9MT0NBVE9SKSBtYWxsb2Moc2l6ZW9mKEVBU19GSUxFKSk7Ci0gICAgc3RybmNweShtSmV0RmlsZVBhdGgsIHBhdGgsIHNpemVvZihtSmV0RmlsZVBhdGgpKTsKLSAgICBtSmV0RmlsZVBhdGhbc2l6ZW9mKG1KZXRGaWxlUGF0aCkgLSAxXSA9ICdcMCc7Ci0gICAgbUVhc0pldEZpbGVMb2MtPnBhdGggPSBtSmV0RmlsZVBhdGg7CisgICAgbUlvV3JhcHBlciA9IG5ldyBNaWRpSW9XcmFwcGVyKHBhdGgpOwogCi0gICAgbUVhc0pldEZpbGVMb2MtPmZkID0gMDsKLSAgICBtRWFzSmV0RmlsZUxvYy0+bGVuZ3RoID0gMDsKLSAgICBtRWFzSmV0RmlsZUxvYy0+b2Zmc2V0ID0gMDsKLQotICAgIEVBU19SRVNVTFQgcmVzdWx0ID0gSkVUX09wZW5GaWxlKG1FYXNEYXRhLCBtRWFzSmV0RmlsZUxvYyk7CisgICAgRUFTX1JFU1VMVCByZXN1bHQgPSBKRVRfT3BlbkZpbGUobUVhc0RhdGEsIG1Jb1dyYXBwZXItPmdldExvY2F0b3IoKSk7CiAgICAgaWYgKHJlc3VsdCAhPSBFQVNfU1VDQ0VTUykKICAgICAgICAgbVN0YXRlID0gRUFTX1NUQVRFX0VSUk9SOwogICAgIGVsc2UKQEAgLTM1MiwxMyArMzQxLDkgQEAKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CiAKLSAgICBtRWFzSmV0RmlsZUxvYyA9IChFQVNfRklMRV9MT0NBVE9SKSBtYWxsb2Moc2l6ZW9mKEVBU19GSUxFKSk7Ci0gICAgbUVhc0pldEZpbGVMb2MtPmZkID0gZmQ7Ci0gICAgbUVhc0pldEZpbGVMb2MtPm9mZnNldCA9IG9mZnNldDsKLSAgICBtRWFzSmV0RmlsZUxvYy0+bGVuZ3RoID0gbGVuZ3RoOwotICAgIG1FYXNKZXRGaWxlTG9jLT5wYXRoID0gTlVMTDsKKyAgICBtSW9XcmFwcGVyID0gbmV3IE1pZGlJb1dyYXBwZXIoZmQsIG9mZnNldCwgbGVuZ3RoKTsKIAotICAgIEVBU19SRVNVTFQgcmVzdWx0ID0gSkVUX09wZW5GaWxlKG1FYXNEYXRhLCBtRWFzSmV0RmlsZUxvYyk7CisgICAgRUFTX1JFU1VMVCByZXN1bHQgPSBKRVRfT3BlbkZpbGUobUVhc0RhdGEsIG1Jb1dyYXBwZXItPmdldExvY2F0b3IoKSk7CiAgICAgaWYgKHJlc3VsdCAhPSBFQVNfU1VDQ0VTUykKICAgICAgICAgbVN0YXRlID0gRUFTX1NUQVRFX0VSUk9SOwogICAgIGVsc2UKQEAgLTQ1OSw3ICs0NDQsNiBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiB2b2lkIEpldFBsYXllcjo6ZHVtcCgpCiB7Ci0gICAgQUxPR0UoIkpldFBsYXllciBkdW1wOiBKRVQgZmlsZT0lcyIsIG1FYXNKZXRGaWxlTG9jLT5wYXRoKTsKIH0KIAogdm9pZCBKZXRQbGF5ZXI6OmR1bXBKZXRTdGF0dXMoU19KRVRfU1RBVFVTKiBwSmV0U3RhdHVzKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVtb3J5TGVha1RyYWNrVXRpbC5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZW1vcnlMZWFrVHJhY2tVdGlsLmNwcAppbmRleCA2NmY3MTYxLi5kMzFmNzIxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9NZW1vcnlMZWFrVHJhY2tVdGlsLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZW1vcnlMZWFrVHJhY2tVdGlsLmNwcApAQCAtMTgsNiArMTgsNyBAQAogCiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWlkaUlvV3JhcHBlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9NaWRpSW9XcmFwcGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTk3Y2UyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvTWlkaUlvV3JhcHBlci5jcHAKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWlkaUlvV3JhcHBlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlICJtZWRpYS9NaWRpSW9XcmFwcGVyLmgiCisKK3N0YXRpYyBpbnQgcmVhZEF0KHZvaWQgKmhhbmRsZSwgdm9pZCAqYnVmZmVyLCBpbnQgcG9zLCBpbnQgc2l6ZSkgeworICAgIHJldHVybiAoKGFuZHJvaWQ6Ok1pZGlJb1dyYXBwZXIqKWhhbmRsZSktPnJlYWRBdChidWZmZXIsIHBvcywgc2l6ZSk7Cit9CitzdGF0aWMgaW50IHNpemUodm9pZCAqaGFuZGxlKSB7CisgICAgcmV0dXJuICgoYW5kcm9pZDo6TWlkaUlvV3JhcHBlciopaGFuZGxlKS0+c2l6ZSgpOworfQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK01pZGlJb1dyYXBwZXI6Ok1pZGlJb1dyYXBwZXIoY29uc3QgY2hhciAqcGF0aCkgeworICAgIEFMT0dWKCJNaWRpSW9XcmFwcGVyKCVzKSIsIHBhdGgpOworICAgIG1GZCA9IG9wZW4ocGF0aCwgT19SRE9OTFkgfCBPX0xBUkdFRklMRSk7CisgICAgbUJhc2UgPSAwOworICAgIG1MZW5ndGggPSBsc2VlayhtRmQsIDAsIFNFRUtfRU5EKTsKK30KKworTWlkaUlvV3JhcHBlcjo6TWlkaUlvV3JhcHBlcihpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBpbnQ2NF90IHNpemUpIHsKKyAgICBBTE9HVigiTWlkaUlvV3JhcHBlcihmZD0lZCkiLCBmZCk7CisgICAgbUZkID0gZHVwKGZkKTsKKyAgICBtQmFzZSA9IG9mZnNldDsKKyAgICBtTGVuZ3RoID0gc2l6ZTsKK30KKworTWlkaUlvV3JhcHBlcjo6TWlkaUlvV3JhcHBlcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKSB7CisgICAgQUxPR1YoIk1pZGlJb1dyYXBwZXIoRGF0YVNvdXJjZSkiKTsKKyAgICBtRmQgPSAtMTsKKyAgICBtRGF0YVNvdXJjZSA9IHNvdXJjZTsKKyAgICBvZmY2NF90IGw7CisgICAgaWYgKG1EYXRhU291cmNlLT5nZXRTaXplKCZsKSA9PSBPSykgeworICAgICAgICBtTGVuZ3RoID0gbDsKKyAgICB9IGVsc2UgeworICAgICAgICBtTGVuZ3RoID0gMDsKKyAgICB9Cit9CisKK01pZGlJb1dyYXBwZXI6On5NaWRpSW9XcmFwcGVyKCkgeworICAgIEFMT0dWKCJ+TWlkaUlvV3JhcHBlciIpOworICAgIGNsb3NlKG1GZCk7Cit9CisKK2ludCBNaWRpSW9XcmFwcGVyOjpyZWFkQXQodm9pZCAqYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSkgeworICAgIEFMT0dWKCJyZWFkQXQoJXAsICVkLCAlZCkiLCBidWZmZXIsIG9mZnNldCwgc2l6ZSk7CisKKyAgICBpZiAobURhdGFTb3VyY2UgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGJ1ZmZlciwgc2l6ZSk7CisgICAgfQorICAgIGxzZWVrKG1GZCwgbUJhc2UgKyBvZmZzZXQsIFNFRUtfU0VUKTsKKyAgICBpZiAob2Zmc2V0ICsgc2l6ZSA+IG1MZW5ndGgpIHsKKyAgICAgICAgc2l6ZSA9IG1MZW5ndGggLSBvZmZzZXQ7CisgICAgfQorICAgIHJldHVybiByZWFkKG1GZCwgYnVmZmVyLCBzaXplKTsKK30KKworaW50IE1pZGlJb1dyYXBwZXI6OnNpemUoKSB7CisgICAgQUxPR1YoInNpemUoKSA9ICVkIiwgaW50KG1MZW5ndGgpKTsKKyAgICByZXR1cm4gbUxlbmd0aDsKK30KKworRUFTX0ZJTEVfTE9DQVRPUiBNaWRpSW9XcmFwcGVyOjpnZXRMb2NhdG9yKCkgeworICAgIG1FYXNGaWxlLmhhbmRsZSA9IHRoaXM7CisgICAgbUVhc0ZpbGUucmVhZEF0ID0gOjpyZWFkQXQ7CisgICAgbUVhc0ZpbGUuc2l6ZSA9IDo6c2l6ZTsKKyAgICByZXR1cm4gJm1FYXNGaWxlOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvU2luZ2xlU3RhdGVRdWV1ZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9TaW5nbGVTdGF0ZVF1ZXVlLmNwcAppbmRleCAzNTAzYmFhLi5jMjQxMTg0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9TaW5nbGVTdGF0ZVF1ZXVlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9TaW5nbGVTdGF0ZVF1ZXVlLmNwcApAQCAtMTYsNyArMTYsNiBAQAogCiAjaW5jbHVkZSA8bmV3PgogI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KLSNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLWlubGluZS5oPiAvLyBmb3IgYW5kcm9pZF9tZW1vcnlfYmFycmllcigpCiAjaW5jbHVkZSA8bWVkaWEvU2luZ2xlU3RhdGVRdWV1ZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9Tb3VuZFBvb2wuY3BwIGIvbWVkaWEvbGlibWVkaWEvU291bmRQb29sLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJlMzgxYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYS9Tb3VuZFBvb2wuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTIxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIlNvdW5kUG9vbCIKLQotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2RlZmluZSBVU0VfU0hBUkVEX01FTV9CVUZGRVIKLQotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvU291bmRQb29sLmg+Ci0jaW5jbHVkZSAiU291bmRQb29sVGhyZWFkLmgiCi0jaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQKLXsKLQotaW50IGtEZWZhdWx0QnVmZmVyQ291bnQgPSA0OwotdWludDMyX3Qga01heFNhbXBsZVJhdGUgPSA0ODAwMDsKLXVpbnQzMl90IGtEZWZhdWx0U2FtcGxlUmF0ZSA9IDQ0MTAwOwotdWludDMyX3Qga0RlZmF1bHRGcmFtZUNvdW50ID0gMTIwMDsKLXNpemVfdCBrRGVmYXVsdEhlYXBTaXplID0gMTAyNCAqIDEwMjQ7IC8vIDFNQgotCi0KLVNvdW5kUG9vbDo6U291bmRQb29sKGludCBtYXhDaGFubmVscywgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcykKLXsKLSAgICBBTE9HVigiU291bmRQb29sIGNvbnN0cnVjdG9yOiBtYXhDaGFubmVscz0lZCwgYXR0ci51c2FnZT0lZCwgYXR0ci5mbGFncz0weCV4LCBhdHRyLnRhZ3M9JXMiLAotICAgICAgICAgICAgbWF4Q2hhbm5lbHMsIHBBdHRyaWJ1dGVzLT51c2FnZSwgcEF0dHJpYnV0ZXMtPmZsYWdzLCBwQXR0cmlidXRlcy0+dGFncyk7Ci0KLSAgICAvLyBjaGVjayBsaW1pdHMKLSAgICBtTWF4Q2hhbm5lbHMgPSBtYXhDaGFubmVsczsKLSAgICBpZiAobU1heENoYW5uZWxzIDwgMSkgewotICAgICAgICBtTWF4Q2hhbm5lbHMgPSAxOwotICAgIH0KLSAgICBlbHNlIGlmIChtTWF4Q2hhbm5lbHMgPiAzMikgewotICAgICAgICBtTWF4Q2hhbm5lbHMgPSAzMjsKLSAgICB9Ci0gICAgQUxPR1dfSUYobWF4Q2hhbm5lbHMgIT0gbU1heENoYW5uZWxzLCAiQXBwIHJlcXVlc3RlZCAlZCBjaGFubmVscyIsIG1heENoYW5uZWxzKTsKLQotICAgIG1RdWl0ID0gZmFsc2U7Ci0gICAgbURlY29kZVRocmVhZCA9IDA7Ci0gICAgbWVtY3B5KCZtQXR0cmlidXRlcywgcEF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICBtQWxsb2NhdGVkID0gMDsKLSAgICBtTmV4dFNhbXBsZUlEID0gMDsKLSAgICBtTmV4dENoYW5uZWxJRCA9IDA7Ci0KLSAgICBtQ2FsbGJhY2sgPSAwOwotICAgIG1Vc2VyRGF0YSA9IDA7Ci0KLSAgICBtQ2hhbm5lbFBvb2wgPSBuZXcgU291bmRDaGFubmVsW21NYXhDaGFubmVsc107Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTWF4Q2hhbm5lbHM7ICsraSkgewotICAgICAgICBtQ2hhbm5lbFBvb2xbaV0uaW5pdCh0aGlzKTsKLSAgICAgICAgbUNoYW5uZWxzLnB1c2hfYmFjaygmbUNoYW5uZWxQb29sW2ldKTsKLSAgICB9Ci0KLSAgICAvLyBzdGFydCBkZWNvZGUgdGhyZWFkCi0gICAgc3RhcnRUaHJlYWRzKCk7Ci19Ci0KLVNvdW5kUG9vbDo6flNvdW5kUG9vbCgpCi17Ci0gICAgQUxPR1YoIlNvdW5kUG9vbCBkZXN0cnVjdG9yIik7Ci0gICAgbURlY29kZVRocmVhZC0+cXVpdCgpOwotICAgIHF1aXQoKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKCZtTG9jayk7Ci0KLSAgICBtQ2hhbm5lbHMuY2xlYXIoKTsKLSAgICBpZiAobUNoYW5uZWxQb29sKQotICAgICAgICBkZWxldGUgW10gbUNoYW5uZWxQb29sOwotICAgIC8vIGNsZWFuIHVwIHNhbXBsZXMKLSAgICBBTE9HVigiY2xlYXIgc2FtcGxlcyIpOwotICAgIG1TYW1wbGVzLmNsZWFyKCk7Ci0KLSAgICBpZiAobURlY29kZVRocmVhZCkKLSAgICAgICAgZGVsZXRlIG1EZWNvZGVUaHJlYWQ7Ci19Ci0KLXZvaWQgU291bmRQb29sOjphZGRUb1Jlc3RhcnRMaXN0KFNvdW5kQ2hhbm5lbCogY2hhbm5lbCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jaygmbVJlc3RhcnRMb2NrKTsKLSAgICBpZiAoIW1RdWl0KSB7Ci0gICAgICAgIG1SZXN0YXJ0LnB1c2hfYmFjayhjaGFubmVsKTsKLSAgICAgICAgbUNvbmRpdGlvbi5zaWduYWwoKTsKLSAgICB9Ci19Ci0KLXZvaWQgU291bmRQb29sOjphZGRUb1N0b3BMaXN0KFNvdW5kQ2hhbm5lbCogY2hhbm5lbCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jaygmbVJlc3RhcnRMb2NrKTsKLSAgICBpZiAoIW1RdWl0KSB7Ci0gICAgICAgIG1TdG9wLnB1c2hfYmFjayhjaGFubmVsKTsKLSAgICAgICAgbUNvbmRpdGlvbi5zaWduYWwoKTsKLSAgICB9Ci19Ci0KLWludCBTb3VuZFBvb2w6OmJlZ2luVGhyZWFkKHZvaWQqIGFyZykKLXsKLSAgICBTb3VuZFBvb2wqIHAgPSAoU291bmRQb29sKilhcmc7Ci0gICAgcmV0dXJuIHAtPnJ1bigpOwotfQotCi1pbnQgU291bmRQb29sOjpydW4oKQotewotICAgIG1SZXN0YXJ0TG9jay5sb2NrKCk7Ci0gICAgd2hpbGUgKCFtUXVpdCkgewotICAgICAgICBtQ29uZGl0aW9uLndhaXQobVJlc3RhcnRMb2NrKTsKLSAgICAgICAgQUxPR1YoImF3YWtlIik7Ci0gICAgICAgIGlmIChtUXVpdCkgYnJlYWs7Ci0KLSAgICAgICAgd2hpbGUgKCFtU3RvcC5lbXB0eSgpKSB7Ci0gICAgICAgICAgICBTb3VuZENoYW5uZWwqIGNoYW5uZWw7Ci0gICAgICAgICAgICBBTE9HVigiR2V0dGluZyBjaGFubmVsIGZyb20gc3RvcCBsaXN0Iik7Ci0gICAgICAgICAgICBMaXN0PFNvdW5kQ2hhbm5lbCogPjo6aXRlcmF0b3IgaXRlciA9IG1TdG9wLmJlZ2luKCk7Ci0gICAgICAgICAgICBjaGFubmVsID0gKml0ZXI7Ci0gICAgICAgICAgICBtU3RvcC5lcmFzZShpdGVyKTsKLSAgICAgICAgICAgIG1SZXN0YXJ0TG9jay51bmxvY2soKTsKLSAgICAgICAgICAgIGlmIChjaGFubmVsICE9IDApIHsKLSAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jaygmbUxvY2spOwotICAgICAgICAgICAgICAgIGNoYW5uZWwtPnN0b3AoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1SZXN0YXJ0TG9jay5sb2NrKCk7Ci0gICAgICAgICAgICBpZiAobVF1aXQpIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKCFtUmVzdGFydC5lbXB0eSgpKSB7Ci0gICAgICAgICAgICBTb3VuZENoYW5uZWwqIGNoYW5uZWw7Ci0gICAgICAgICAgICBBTE9HVigiR2V0dGluZyBjaGFubmVsIGZyb20gbGlzdCIpOwotICAgICAgICAgICAgTGlzdDxTb3VuZENoYW5uZWwqPjo6aXRlcmF0b3IgaXRlciA9IG1SZXN0YXJ0LmJlZ2luKCk7Ci0gICAgICAgICAgICBjaGFubmVsID0gKml0ZXI7Ci0gICAgICAgICAgICBtUmVzdGFydC5lcmFzZShpdGVyKTsKLSAgICAgICAgICAgIG1SZXN0YXJ0TG9jay51bmxvY2soKTsKLSAgICAgICAgICAgIGlmIChjaGFubmVsICE9IDApIHsKLSAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jaygmbUxvY2spOwotICAgICAgICAgICAgICAgIGNoYW5uZWwtPm5leHRFdmVudCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVJlc3RhcnRMb2NrLmxvY2soKTsKLSAgICAgICAgICAgIGlmIChtUXVpdCkgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtU3RvcC5jbGVhcigpOwotICAgIG1SZXN0YXJ0LmNsZWFyKCk7Ci0gICAgbUNvbmRpdGlvbi5zaWduYWwoKTsKLSAgICBtUmVzdGFydExvY2sudW5sb2NrKCk7Ci0gICAgQUxPR1YoImdvb2RieWUiKTsKLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBTb3VuZFBvb2w6OnF1aXQoKQotewotICAgIG1SZXN0YXJ0TG9jay5sb2NrKCk7Ci0gICAgbVF1aXQgPSB0cnVlOwotICAgIG1Db25kaXRpb24uc2lnbmFsKCk7Ci0gICAgbUNvbmRpdGlvbi53YWl0KG1SZXN0YXJ0TG9jayk7Ci0gICAgQUxPR1YoInJldHVybiBmcm9tIHF1aXQiKTsKLSAgICBtUmVzdGFydExvY2sudW5sb2NrKCk7Ci19Ci0KLWJvb2wgU291bmRQb29sOjpzdGFydFRocmVhZHMoKQotewotICAgIGNyZWF0ZVRocmVhZEV0YyhiZWdpblRocmVhZCwgdGhpcywgIlNvdW5kUG9vbCIpOwotICAgIGlmIChtRGVjb2RlVGhyZWFkID09IE5VTEwpCi0gICAgICAgIG1EZWNvZGVUaHJlYWQgPSBuZXcgU291bmRQb29sVGhyZWFkKHRoaXMpOwotICAgIHJldHVybiBtRGVjb2RlVGhyZWFkICE9IE5VTEw7Ci19Ci0KLVNvdW5kQ2hhbm5lbCogU291bmRQb29sOjpmaW5kQ2hhbm5lbChpbnQgY2hhbm5lbElEKQotewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU1heENoYW5uZWxzOyArK2kpIHsKLSAgICAgICAgaWYgKG1DaGFubmVsUG9vbFtpXS5jaGFubmVsSUQoKSA9PSBjaGFubmVsSUQpIHsKLSAgICAgICAgICAgIHJldHVybiAmbUNoYW5uZWxQb29sW2ldOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi1Tb3VuZENoYW5uZWwqIFNvdW5kUG9vbDo6ZmluZE5leHRDaGFubmVsKGludCBjaGFubmVsSUQpCi17Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTWF4Q2hhbm5lbHM7ICsraSkgewotICAgICAgICBpZiAobUNoYW5uZWxQb29sW2ldLm5leHRDaGFubmVsSUQoKSA9PSBjaGFubmVsSUQpIHsKLSAgICAgICAgICAgIHJldHVybiAmbUNoYW5uZWxQb29sW2ldOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi1pbnQgU291bmRQb29sOjpsb2FkKGNvbnN0IGNoYXIqIHBhdGgsIGludCBwcmlvcml0eSBfX3VudXNlZCkKLXsKLSAgICBBTE9HVigibG9hZDogcGF0aD0lcywgcHJpb3JpdHk9JWQiLCBwYXRoLCBwcmlvcml0eSk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soJm1Mb2NrKTsKLSAgICBzcDxTYW1wbGU+IHNhbXBsZSA9IG5ldyBTYW1wbGUoKyttTmV4dFNhbXBsZUlELCBwYXRoKTsKLSAgICBtU2FtcGxlcy5hZGQoc2FtcGxlLT5zYW1wbGVJRCgpLCBzYW1wbGUpOwotICAgIGRvTG9hZChzYW1wbGUpOwotICAgIHJldHVybiBzYW1wbGUtPnNhbXBsZUlEKCk7Ci19Ci0KLWludCBTb3VuZFBvb2w6OmxvYWQoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgsIGludCBwcmlvcml0eSBfX3VudXNlZCkKLXsKLSAgICBBTE9HVigibG9hZDogZmQ9JWQsIG9mZnNldD0lIiBQUklkNjQgIiwgbGVuZ3RoPSUiIFBSSWQ2NCAiLCBwcmlvcml0eT0lZCIsCi0gICAgICAgICAgICBmZCwgb2Zmc2V0LCBsZW5ndGgsIHByaW9yaXR5KTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jaygmbUxvY2spOwotICAgIHNwPFNhbXBsZT4gc2FtcGxlID0gbmV3IFNhbXBsZSgrK21OZXh0U2FtcGxlSUQsIGZkLCBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgbVNhbXBsZXMuYWRkKHNhbXBsZS0+c2FtcGxlSUQoKSwgc2FtcGxlKTsKLSAgICBkb0xvYWQoc2FtcGxlKTsKLSAgICByZXR1cm4gc2FtcGxlLT5zYW1wbGVJRCgpOwotfQotCi12b2lkIFNvdW5kUG9vbDo6ZG9Mb2FkKHNwPFNhbXBsZT4mIHNhbXBsZSkKLXsKLSAgICBBTE9HVigiZG9Mb2FkOiBsb2FkaW5nIHNhbXBsZSBzYW1wbGVJRD0lZCIsIHNhbXBsZS0+c2FtcGxlSUQoKSk7Ci0gICAgc2FtcGxlLT5zdGFydExvYWQoKTsKLSAgICBtRGVjb2RlVGhyZWFkLT5sb2FkU2FtcGxlKHNhbXBsZS0+c2FtcGxlSUQoKSk7Ci19Ci0KLWJvb2wgU291bmRQb29sOjp1bmxvYWQoaW50IHNhbXBsZUlEKQotewotICAgIEFMT0dWKCJ1bmxvYWQ6IHNhbXBsZUlEPSVkIiwgc2FtcGxlSUQpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKCZtTG9jayk7Ci0gICAgcmV0dXJuIG1TYW1wbGVzLnJlbW92ZUl0ZW0oc2FtcGxlSUQpOwotfQotCi1pbnQgU291bmRQb29sOjpwbGF5KGludCBzYW1wbGVJRCwgZmxvYXQgbGVmdFZvbHVtZSwgZmxvYXQgcmlnaHRWb2x1bWUsCi0gICAgICAgIGludCBwcmlvcml0eSwgaW50IGxvb3AsIGZsb2F0IHJhdGUpCi17Ci0gICAgQUxPR1YoInBsYXkgc2FtcGxlSUQ9JWQsIGxlZnRWb2x1bWU9JWYsIHJpZ2h0Vm9sdW1lPSVmLCBwcmlvcml0eT0lZCwgbG9vcD0lZCwgcmF0ZT0lZiIsCi0gICAgICAgICAgICBzYW1wbGVJRCwgbGVmdFZvbHVtZSwgcmlnaHRWb2x1bWUsIHByaW9yaXR5LCBsb29wLCByYXRlKTsKLSAgICBzcDxTYW1wbGU+IHNhbXBsZTsKLSAgICBTb3VuZENoYW5uZWwqIGNoYW5uZWw7Ci0gICAgaW50IGNoYW5uZWxJRDsKLQotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKCZtTG9jayk7Ci0KLSAgICBpZiAobVF1aXQpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIC8vIGlzIHNhbXBsZSByZWFkeT8KLSAgICBzYW1wbGUgPSBmaW5kU2FtcGxlKHNhbXBsZUlEKTsKLSAgICBpZiAoKHNhbXBsZSA9PSAwKSB8fCAoc2FtcGxlLT5zdGF0ZSgpICE9IFNhbXBsZTo6UkVBRFkpKSB7Ci0gICAgICAgIEFMT0dXKCIgIHNhbXBsZSAlZCBub3QgUkVBRFkiLCBzYW1wbGVJRCk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGR1bXAoKTsKLQotICAgIC8vIGFsbG9jYXRlIGEgY2hhbm5lbAotICAgIGNoYW5uZWwgPSBhbGxvY2F0ZUNoYW5uZWxfbChwcmlvcml0eSk7Ci0KLSAgICAvLyBubyBjaGFubmVsIGFsbG9jYXRlZCAtIHJldHVybiAwCi0gICAgaWYgKCFjaGFubmVsKSB7Ci0gICAgICAgIEFMT0dWKCJObyBjaGFubmVsIGFsbG9jYXRlZCIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBjaGFubmVsSUQgPSArK21OZXh0Q2hhbm5lbElEOwotCi0gICAgQUxPR1YoInBsYXkgY2hhbm5lbCAlcCBzdGF0ZSA9ICVkIiwgY2hhbm5lbCwgY2hhbm5lbC0+c3RhdGUoKSk7Ci0gICAgY2hhbm5lbC0+cGxheShzYW1wbGUsIGNoYW5uZWxJRCwgbGVmdFZvbHVtZSwgcmlnaHRWb2x1bWUsIHByaW9yaXR5LCBsb29wLCByYXRlKTsKLSAgICByZXR1cm4gY2hhbm5lbElEOwotfQotCi1Tb3VuZENoYW5uZWwqIFNvdW5kUG9vbDo6YWxsb2NhdGVDaGFubmVsX2woaW50IHByaW9yaXR5KQotewotICAgIExpc3Q8U291bmRDaGFubmVsKj46Oml0ZXJhdG9yIGl0ZXI7Ci0gICAgU291bmRDaGFubmVsKiBjaGFubmVsID0gTlVMTDsKLQotICAgIC8vIGFsbG9jYXRlIGEgY2hhbm5lbAotICAgIGlmICghbUNoYW5uZWxzLmVtcHR5KCkpIHsKLSAgICAgICAgaXRlciA9IG1DaGFubmVscy5iZWdpbigpOwotICAgICAgICBpZiAocHJpb3JpdHkgPj0gKCppdGVyKS0+cHJpb3JpdHkoKSkgewotICAgICAgICAgICAgY2hhbm5lbCA9ICppdGVyOwotICAgICAgICAgICAgbUNoYW5uZWxzLmVyYXNlKGl0ZXIpOwotICAgICAgICAgICAgQUxPR1YoIkFsbG9jYXRlZCBhY3RpdmUgY2hhbm5lbCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gdXBkYXRlIHByaW9yaXR5IGFuZCBwdXQgaXQgYmFjayBpbiB0aGUgbGlzdAotICAgIGlmIChjaGFubmVsKSB7Ci0gICAgICAgIGNoYW5uZWwtPnNldFByaW9yaXR5KHByaW9yaXR5KTsKLSAgICAgICAgZm9yIChpdGVyID0gbUNoYW5uZWxzLmJlZ2luKCk7IGl0ZXIgIT0gbUNoYW5uZWxzLmVuZCgpOyArK2l0ZXIpIHsKLSAgICAgICAgICAgIGlmIChwcmlvcml0eSA8ICgqaXRlciktPnByaW9yaXR5KCkpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtQ2hhbm5lbHMuaW5zZXJ0KGl0ZXIsIGNoYW5uZWwpOwotICAgIH0KLSAgICByZXR1cm4gY2hhbm5lbDsKLX0KLQotLy8gbW92ZSBhIGNoYW5uZWwgZnJvbSBpdHMgY3VycmVudCBwb3NpdGlvbiB0byB0aGUgZnJvbnQgb2YgdGhlIGxpc3QKLXZvaWQgU291bmRQb29sOjptb3ZlVG9Gcm9udF9sKFNvdW5kQ2hhbm5lbCogY2hhbm5lbCkKLXsKLSAgICBmb3IgKExpc3Q8U291bmRDaGFubmVsKj46Oml0ZXJhdG9yIGl0ZXIgPSBtQ2hhbm5lbHMuYmVnaW4oKTsgaXRlciAhPSBtQ2hhbm5lbHMuZW5kKCk7ICsraXRlcikgewotICAgICAgICBpZiAoKml0ZXIgPT0gY2hhbm5lbCkgewotICAgICAgICAgICAgbUNoYW5uZWxzLmVyYXNlKGl0ZXIpOwotICAgICAgICAgICAgbUNoYW5uZWxzLnB1c2hfZnJvbnQoY2hhbm5lbCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBTb3VuZFBvb2w6OnBhdXNlKGludCBjaGFubmVsSUQpCi17Ci0gICAgQUxPR1YoInBhdXNlKCVkKSIsIGNoYW5uZWxJRCk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soJm1Mb2NrKTsKLSAgICBTb3VuZENoYW5uZWwqIGNoYW5uZWwgPSBmaW5kQ2hhbm5lbChjaGFubmVsSUQpOwotICAgIGlmIChjaGFubmVsKSB7Ci0gICAgICAgIGNoYW5uZWwtPnBhdXNlKCk7Ci0gICAgfQotfQotCi12b2lkIFNvdW5kUG9vbDo6YXV0b1BhdXNlKCkKLXsKLSAgICBBTE9HVigiYXV0b1BhdXNlKCkiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jaygmbUxvY2spOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU1heENoYW5uZWxzOyArK2kpIHsKLSAgICAgICAgU291bmRDaGFubmVsKiBjaGFubmVsID0gJm1DaGFubmVsUG9vbFtpXTsKLSAgICAgICAgY2hhbm5lbC0+YXV0b1BhdXNlKCk7Ci0gICAgfQotfQotCi12b2lkIFNvdW5kUG9vbDo6cmVzdW1lKGludCBjaGFubmVsSUQpCi17Ci0gICAgQUxPR1YoInJlc3VtZSglZCkiLCBjaGFubmVsSUQpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKCZtTG9jayk7Ci0gICAgU291bmRDaGFubmVsKiBjaGFubmVsID0gZmluZENoYW5uZWwoY2hhbm5lbElEKTsKLSAgICBpZiAoY2hhbm5lbCkgewotICAgICAgICBjaGFubmVsLT5yZXN1bWUoKTsKLSAgICB9Ci19Ci0KLXZvaWQgU291bmRQb29sOjphdXRvUmVzdW1lKCkKLXsKLSAgICBBTE9HVigiYXV0b1Jlc3VtZSgpIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soJm1Mb2NrKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1NYXhDaGFubmVsczsgKytpKSB7Ci0gICAgICAgIFNvdW5kQ2hhbm5lbCogY2hhbm5lbCA9ICZtQ2hhbm5lbFBvb2xbaV07Ci0gICAgICAgIGNoYW5uZWwtPmF1dG9SZXN1bWUoKTsKLSAgICB9Ci19Ci0KLXZvaWQgU291bmRQb29sOjpzdG9wKGludCBjaGFubmVsSUQpCi17Ci0gICAgQUxPR1YoInN0b3AoJWQpIiwgY2hhbm5lbElEKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jaygmbUxvY2spOwotICAgIFNvdW5kQ2hhbm5lbCogY2hhbm5lbCA9IGZpbmRDaGFubmVsKGNoYW5uZWxJRCk7Ci0gICAgaWYgKGNoYW5uZWwpIHsKLSAgICAgICAgY2hhbm5lbC0+c3RvcCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNoYW5uZWwgPSBmaW5kTmV4dENoYW5uZWwoY2hhbm5lbElEKTsKLSAgICAgICAgaWYgKGNoYW5uZWwpCi0gICAgICAgICAgICBjaGFubmVsLT5jbGVhck5leHRFdmVudCgpOwotICAgIH0KLX0KLQotdm9pZCBTb3VuZFBvb2w6OnNldFZvbHVtZShpbnQgY2hhbm5lbElELCBmbG9hdCBsZWZ0Vm9sdW1lLCBmbG9hdCByaWdodFZvbHVtZSkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jaygmbUxvY2spOwotICAgIFNvdW5kQ2hhbm5lbCogY2hhbm5lbCA9IGZpbmRDaGFubmVsKGNoYW5uZWxJRCk7Ci0gICAgaWYgKGNoYW5uZWwpIHsKLSAgICAgICAgY2hhbm5lbC0+c2V0Vm9sdW1lKGxlZnRWb2x1bWUsIHJpZ2h0Vm9sdW1lKTsKLSAgICB9Ci19Ci0KLXZvaWQgU291bmRQb29sOjpzZXRQcmlvcml0eShpbnQgY2hhbm5lbElELCBpbnQgcHJpb3JpdHkpCi17Ci0gICAgQUxPR1YoInNldFByaW9yaXR5KCVkLCAlZCkiLCBjaGFubmVsSUQsIHByaW9yaXR5KTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jaygmbUxvY2spOwotICAgIFNvdW5kQ2hhbm5lbCogY2hhbm5lbCA9IGZpbmRDaGFubmVsKGNoYW5uZWxJRCk7Ci0gICAgaWYgKGNoYW5uZWwpIHsKLSAgICAgICAgY2hhbm5lbC0+c2V0UHJpb3JpdHkocHJpb3JpdHkpOwotICAgIH0KLX0KLQotdm9pZCBTb3VuZFBvb2w6OnNldExvb3AoaW50IGNoYW5uZWxJRCwgaW50IGxvb3ApCi17Ci0gICAgQUxPR1YoInNldExvb3AoJWQsICVkKSIsIGNoYW5uZWxJRCwgbG9vcCk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soJm1Mb2NrKTsKLSAgICBTb3VuZENoYW5uZWwqIGNoYW5uZWwgPSBmaW5kQ2hhbm5lbChjaGFubmVsSUQpOwotICAgIGlmIChjaGFubmVsKSB7Ci0gICAgICAgIGNoYW5uZWwtPnNldExvb3AobG9vcCk7Ci0gICAgfQotfQotCi12b2lkIFNvdW5kUG9vbDo6c2V0UmF0ZShpbnQgY2hhbm5lbElELCBmbG9hdCByYXRlKQotewotICAgIEFMT0dWKCJzZXRSYXRlKCVkLCAlZikiLCBjaGFubmVsSUQsIHJhdGUpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKCZtTG9jayk7Ci0gICAgU291bmRDaGFubmVsKiBjaGFubmVsID0gZmluZENoYW5uZWwoY2hhbm5lbElEKTsKLSAgICBpZiAoY2hhbm5lbCkgewotICAgICAgICBjaGFubmVsLT5zZXRSYXRlKHJhdGUpOwotICAgIH0KLX0KLQotLy8gY2FsbCB3aXRoIGxvY2sgaGVsZAotdm9pZCBTb3VuZFBvb2w6OmRvbmVfbChTb3VuZENoYW5uZWwqIGNoYW5uZWwpCi17Ci0gICAgQUxPR1YoImRvbmVfbCglZCkiLCBjaGFubmVsLT5jaGFubmVsSUQoKSk7Ci0gICAgLy8gaWYgInN0b2xlbiIsIHBsYXkgbmV4dCBldmVudAotICAgIGlmIChjaGFubmVsLT5uZXh0Q2hhbm5lbElEKCkgIT0gMCkgewotICAgICAgICBBTE9HVigiYWRkIHRvIHJlc3RhcnQgbGlzdCIpOwotICAgICAgICBhZGRUb1Jlc3RhcnRMaXN0KGNoYW5uZWwpOwotICAgIH0KLQotICAgIC8vIHJldHVybiB0byBpZGxlIHN0YXRlCi0gICAgZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJtb3ZlIHRvIGZyb250Iik7Ci0gICAgICAgIG1vdmVUb0Zyb250X2woY2hhbm5lbCk7Ci0gICAgfQotfQotCi12b2lkIFNvdW5kUG9vbDo6c2V0Q2FsbGJhY2soU291bmRQb29sQ2FsbGJhY2sqIGNhbGxiYWNrLCB2b2lkKiB1c2VyKQotewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKCZtQ2FsbGJhY2tMb2NrKTsKLSAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICBtVXNlckRhdGEgPSB1c2VyOwotfQotCi12b2lkIFNvdW5kUG9vbDo6bm90aWZ5KFNvdW5kUG9vbEV2ZW50IGV2ZW50KQotewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKCZtQ2FsbGJhY2tMb2NrKTsKLSAgICBpZiAobUNhbGxiYWNrICE9IE5VTEwpIHsKLSAgICAgICAgbUNhbGxiYWNrKGV2ZW50LCB0aGlzLCBtVXNlckRhdGEpOwotICAgIH0KLX0KLQotdm9pZCBTb3VuZFBvb2w6OmR1bXAoKQotewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU1heENoYW5uZWxzOyArK2kpIHsKLSAgICAgICAgbUNoYW5uZWxQb29sW2ldLmR1bXAoKTsKLSAgICB9Ci19Ci0KLQotU2FtcGxlOjpTYW1wbGUoaW50IHNhbXBsZUlELCBjb25zdCBjaGFyKiB1cmwpCi17Ci0gICAgaW5pdCgpOwotICAgIG1TYW1wbGVJRCA9IHNhbXBsZUlEOwotICAgIG1VcmwgPSBzdHJkdXAodXJsKTsKLSAgICBBTE9HVigiY3JlYXRlIHNhbXBsZUlEPSVkLCB1cmw9JXMiLCBtU2FtcGxlSUQsIG1VcmwpOwotfQotCi1TYW1wbGU6OlNhbXBsZShpbnQgc2FtcGxlSUQsIGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKQotewotICAgIGluaXQoKTsKLSAgICBtU2FtcGxlSUQgPSBzYW1wbGVJRDsKLSAgICBtRmQgPSBkdXAoZmQpOwotICAgIG1PZmZzZXQgPSBvZmZzZXQ7Ci0gICAgbUxlbmd0aCA9IGxlbmd0aDsKLSAgICBBTE9HVigiY3JlYXRlIHNhbXBsZUlEPSVkLCBmZD0lZCwgb2Zmc2V0PSUiIFBSSWQ2NCAiIGxlbmd0aD0lIiBQUklkNjQsCi0gICAgICAgIG1TYW1wbGVJRCwgbUZkLCBtTGVuZ3RoLCBtT2Zmc2V0KTsKLX0KLQotdm9pZCBTYW1wbGU6OmluaXQoKQotewotICAgIG1TaXplID0gMDsKLSAgICBtUmVmQ291bnQgPSAwOwotICAgIG1TYW1wbGVJRCA9IDA7Ci0gICAgbVN0YXRlID0gVU5MT0FERUQ7Ci0gICAgbUZkID0gLTE7Ci0gICAgbU9mZnNldCA9IDA7Ci0gICAgbUxlbmd0aCA9IDA7Ci0gICAgbVVybCA9IDA7Ci19Ci0KLVNhbXBsZTo6flNhbXBsZSgpCi17Ci0gICAgQUxPR1YoIlNhbXBsZTo6ZGVzdHJ1Y3RvciBzYW1wbGVJRD0lZCwgZmQ9JWQiLCBtU2FtcGxlSUQsIG1GZCk7Ci0gICAgaWYgKG1GZCA+IDApIHsKLSAgICAgICAgQUxPR1YoImNsb3NlKCVkKSIsIG1GZCk7Ci0gICAgICAgIDo6Y2xvc2UobUZkKTsKLSAgICB9Ci0gICAgZnJlZShtVXJsKTsKLX0KLQotc3RhdHVzX3QgU2FtcGxlOjpkb0xvYWQoKQotewotICAgIHVpbnQzMl90IHNhbXBsZVJhdGU7Ci0gICAgaW50IG51bUNoYW5uZWxzOwotICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdDsKLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgbUhlYXAgPSBuZXcgTWVtb3J5SGVhcEJhc2Uoa0RlZmF1bHRIZWFwU2l6ZSk7Ci0KLSAgICBBTE9HVigiU3RhcnQgZGVjb2RlIik7Ci0gICAgaWYgKG1VcmwpIHsKLSAgICAgICAgc3RhdHVzID0gTWVkaWFQbGF5ZXI6OmRlY29kZSgKLSAgICAgICAgICAgICAgICBOVUxMIC8qIGh0dHBTZXJ2aWNlICovLAotICAgICAgICAgICAgICAgIG1VcmwsCi0gICAgICAgICAgICAgICAgJnNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgJm51bUNoYW5uZWxzLAotICAgICAgICAgICAgICAgICZmb3JtYXQsCi0gICAgICAgICAgICAgICAgbUhlYXAsCi0gICAgICAgICAgICAgICAgJm1TaXplKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzdGF0dXMgPSBNZWRpYVBsYXllcjo6ZGVjb2RlKG1GZCwgbU9mZnNldCwgbUxlbmd0aCwgJnNhbXBsZVJhdGUsICZudW1DaGFubmVscywgJmZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhcCwgJm1TaXplKTsKLSAgICAgICAgQUxPR1YoImNsb3NlKCVkKSIsIG1GZCk7Ci0gICAgICAgIDo6Y2xvc2UobUZkKTsKLSAgICAgICAgbUZkID0gLTE7Ci0gICAgfQotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBsb2FkIHNhbXBsZTogJXMiLCBtVXJsKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0gICAgQUxPR1YoInBvaW50ZXIgPSAlcCwgc2l6ZSA9ICV6dSwgc2FtcGxlUmF0ZSA9ICV1LCBudW1DaGFubmVscyA9ICVkIiwKLSAgICAgICAgICBtSGVhcC0+Z2V0QmFzZSgpLCBtU2l6ZSwgc2FtcGxlUmF0ZSwgbnVtQ2hhbm5lbHMpOwotCi0gICAgaWYgKHNhbXBsZVJhdGUgPiBrTWF4U2FtcGxlUmF0ZSkgewotICAgICAgIEFMT0dFKCJTYW1wbGUgcmF0ZSAoJXUpIG91dCBvZiByYW5nZSIsIHNhbXBsZVJhdGUpOwotICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIGlmICgobnVtQ2hhbm5lbHMgPCAxKSB8fCAobnVtQ2hhbm5lbHMgPiAyKSkgewotICAgICAgICBBTE9HRSgiU2FtcGxlIGNoYW5uZWwgY291bnQgKCVkKSBvdXQgb2YgcmFuZ2UiLCBudW1DaGFubmVscyk7Ci0gICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICBtRGF0YSA9IG5ldyBNZW1vcnlCYXNlKG1IZWFwLCAwLCBtU2l6ZSk7Ci0gICAgbVNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOwotICAgIG1OdW1DaGFubmVscyA9IG51bUNoYW5uZWxzOwotICAgIG1Gb3JtYXQgPSBmb3JtYXQ7Ci0gICAgbVN0YXRlID0gUkVBRFk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotCi1lcnJvcjoKLSAgICBtSGVhcC5jbGVhcigpOwotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLQotdm9pZCBTb3VuZENoYW5uZWw6OmluaXQoU291bmRQb29sKiBzb3VuZFBvb2wpCi17Ci0gICAgbVNvdW5kUG9vbCA9IHNvdW5kUG9vbDsKLX0KLQotLy8gY2FsbCB3aXRoIHNvdW5kIHBvb2wgbG9jayBoZWxkCi12b2lkIFNvdW5kQ2hhbm5lbDo6cGxheShjb25zdCBzcDxTYW1wbGU+JiBzYW1wbGUsIGludCBuZXh0Q2hhbm5lbElELCBmbG9hdCBsZWZ0Vm9sdW1lLAotICAgICAgICBmbG9hdCByaWdodFZvbHVtZSwgaW50IHByaW9yaXR5LCBpbnQgbG9vcCwgZmxvYXQgcmF0ZSkKLXsKLSAgICBzcDxBdWRpb1RyYWNrPiBvbGRUcmFjazsKLSAgICBzcDxBdWRpb1RyYWNrPiBuZXdUcmFjazsKLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0KLSAgICB7IC8vIHNjb3BlIGZvciB0aGUgbG9jawotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jaygmbUxvY2spOwotCi0gICAgICAgIEFMT0dWKCJTb3VuZENoYW5uZWw6OnBsYXkgJXA6IHNhbXBsZUlEPSVkLCBjaGFubmVsSUQ9JWQsIGxlZnRWb2x1bWU9JWYsIHJpZ2h0Vm9sdW1lPSVmLCIKLSAgICAgICAgICAgICAgICAiIHByaW9yaXR5PSVkLCBsb29wPSVkLCByYXRlPSVmIiwKLSAgICAgICAgICAgICAgICB0aGlzLCBzYW1wbGUtPnNhbXBsZUlEKCksIG5leHRDaGFubmVsSUQsIGxlZnRWb2x1bWUsIHJpZ2h0Vm9sdW1lLAotICAgICAgICAgICAgICAgIHByaW9yaXR5LCBsb29wLCByYXRlKTsKLQotICAgICAgICAvLyBpZiBub3QgaWRsZSwgdGhpcyB2b2ljZSBpcyBiZWluZyBzdG9sZW4KLSAgICAgICAgaWYgKG1TdGF0ZSAhPSBJRExFKSB7Ci0gICAgICAgICAgICBBTE9HVigiY2hhbm5lbCAlZCBzdG9sZW4gLSBldmVudCBxdWV1ZWQgZm9yIGNoYW5uZWwgJWQiLCBjaGFubmVsSUQoKSwgbmV4dENoYW5uZWxJRCk7Ci0gICAgICAgICAgICBtTmV4dEV2ZW50LnNldChzYW1wbGUsIG5leHRDaGFubmVsSUQsIGxlZnRWb2x1bWUsIHJpZ2h0Vm9sdW1lLCBwcmlvcml0eSwgbG9vcCwgcmF0ZSk7Ci0gICAgICAgICAgICBzdG9wX2woKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGluaXRpYWxpemUgdHJhY2sKLSAgICAgICAgc2l6ZV90IGFmRnJhbWVDb3VudDsKLSAgICAgICAgdWludDMyX3QgYWZTYW1wbGVSYXRlOwotICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUgPSBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKG1Tb3VuZFBvb2wtPmF0dHJpYnV0ZXMoKSk7Ci0gICAgICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0RnJhbWVDb3VudCgmYWZGcmFtZUNvdW50LCBzdHJlYW1UeXBlKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgYWZGcmFtZUNvdW50ID0ga0RlZmF1bHRGcmFtZUNvdW50OwotICAgICAgICB9Ci0gICAgICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0U2FtcGxpbmdSYXRlKCZhZlNhbXBsZVJhdGUsIHN0cmVhbVR5cGUpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBhZlNhbXBsZVJhdGUgPSBrRGVmYXVsdFNhbXBsZVJhdGU7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IG51bUNoYW5uZWxzID0gc2FtcGxlLT5udW1DaGFubmVscygpOwotICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gdWludDMyX3QoZmxvYXQoc2FtcGxlLT5zYW1wbGVSYXRlKCkpICogcmF0ZSArIDAuNSk7Ci0gICAgICAgIHVpbnQzMl90IHRvdGFsRnJhbWVzID0gKGtEZWZhdWx0QnVmZmVyQ291bnQgKiBhZkZyYW1lQ291bnQgKiBzYW1wbGVSYXRlKSAvIGFmU2FtcGxlUmF0ZTsKLSAgICAgICAgdWludDMyX3QgYnVmZmVyRnJhbWVzID0gKHRvdGFsRnJhbWVzICsgKGtEZWZhdWx0QnVmZmVyQ291bnQgLSAxKSkgLyBrRGVmYXVsdEJ1ZmZlckNvdW50OwotICAgICAgICBzaXplX3QgZnJhbWVDb3VudCA9IDA7Ci0KLSAgICAgICAgaWYgKGxvb3ApIHsKLSAgICAgICAgICAgIGZyYW1lQ291bnQgPSBzYW1wbGUtPnNpemUoKS9udW1DaGFubmVscy8KLSAgICAgICAgICAgICAgICAoKHNhbXBsZS0+Zm9ybWF0KCkgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpID8gc2l6ZW9mKGludDE2X3QpIDogc2l6ZW9mKHVpbnQ4X3QpKTsKLSAgICAgICAgfQotCi0jaWZuZGVmIFVTRV9TSEFSRURfTUVNX0JVRkZFUgotICAgICAgICAvLyBFbnN1cmUgbWluaW11bSBhdWRpbyBidWZmZXIgc2l6ZSBpbiBjYXNlIG9mIHNob3J0IGxvb3BlZCBzYW1wbGUKLSAgICAgICAgaWYoZnJhbWVDb3VudCA8IHRvdGFsRnJhbWVzKSB7Ci0gICAgICAgICAgICBmcmFtZUNvdW50ID0gdG90YWxGcmFtZXM7Ci0gICAgICAgIH0KLSNlbmRpZgotCi0gICAgICAgIC8vIG1Ub2dnbGUgdG9nZ2xlcyBlYWNoIHRpbWUgYSB0cmFjayBpcyBzdGFydGVkIG9uIGEgZ2l2ZW4gY2hhbm5lbC4KLSAgICAgICAgLy8gVGhlIHRvZ2dsZSBpcyBjb25jYXRlbmF0ZWQgd2l0aCB0aGUgU291bmRDaGFubmVsIGFkZHJlc3MgYW5kIHBhc3NlZCB0byBBdWRpb1RyYWNrCi0gICAgICAgIC8vIGFzIGNhbGxiYWNrIHVzZXIgZGF0YS4gVGhpcyBlbmFibGVzIHRoZSBkZXRlY3Rpb24gb2YgY2FsbGJhY2tzIHJlY2VpdmVkIGZyb20gdGhlIG9sZAotICAgICAgICAvLyBhdWRpbyB0cmFjayB3aGlsZSB0aGUgbmV3IG9uZSBpcyBiZWluZyBzdGFydGVkIGFuZCBhdm9pZHMgcHJvY2Vzc2luZyB0aGVtIHdpdGgKLSAgICAgICAgLy8gd3JvbmcgYXVkaW8gYXVkaW8gYnVmZmVyIHNpemUgIChtQXVkaW9CdWZmZXJTaXplKQotICAgICAgICB1bnNpZ25lZCBsb25nIHRvZ2dsZSA9IG1Ub2dnbGUgXiAxOwotICAgICAgICB2b2lkICp1c2VyRGF0YSA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKXRoaXMgfCB0b2dnbGUpOwotICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChudW1DaGFubmVscyk7Ci0KLSAgICAgICAgLy8gZG8gbm90IGNyZWF0ZSBhIG5ldyBhdWRpbyB0cmFjayBpZiBjdXJyZW50IHRyYWNrIGlzIGNvbXBhdGlibGUgd2l0aCBzYW1wbGUgcGFyYW1ldGVycwotI2lmZGVmIFVTRV9TSEFSRURfTUVNX0JVRkZFUgotICAgICAgICBuZXdUcmFjayA9IG5ldyBBdWRpb1RyYWNrKHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIHNhbXBsZS0+Zm9ybWF0KCksCi0gICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIHNhbXBsZS0+Z2V0SU1lbW9yeSgpLCBBVURJT19PVVRQVVRfRkxBR19GQVNULCBjYWxsYmFjaywgdXNlckRhdGEpOwotI2Vsc2UKLSAgICAgICAgbmV3VHJhY2sgPSBuZXcgQXVkaW9UcmFjayhzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBzYW1wbGUtPmZvcm1hdCgpLAotICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBBVURJT19PVVRQVVRfRkxBR19GQVNULCBjYWxsYmFjaywgdXNlckRhdGEsCi0gICAgICAgICAgICAgICAgYnVmZmVyRnJhbWVzKTsKLSNlbmRpZgotICAgICAgICBvbGRUcmFjayA9IG1BdWRpb1RyYWNrOwotICAgICAgICBzdGF0dXMgPSBuZXdUcmFjay0+aW5pdENoZWNrKCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJFcnJvciBjcmVhdGluZyBBdWRpb1RyYWNrIik7Ci0gICAgICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoInNldFZvbHVtZSAlcCIsIG5ld1RyYWNrLmdldCgpKTsKLSAgICAgICAgbmV3VHJhY2stPnNldFZvbHVtZShsZWZ0Vm9sdW1lLCByaWdodFZvbHVtZSk7Ci0gICAgICAgIG5ld1RyYWNrLT5zZXRMb29wKDAsIGZyYW1lQ291bnQsIGxvb3ApOwotCi0gICAgICAgIC8vIEZyb20gbm93IG9uLCBBdWRpb1RyYWNrIGNhbGxiYWNrcyByZWNlaXZlZCB3aXRoIHByZXZpb3VzIHRvZ2dsZSB2YWx1ZSB3aWxsIGJlIGlnbm9yZWQuCi0gICAgICAgIG1Ub2dnbGUgPSB0b2dnbGU7Ci0gICAgICAgIG1BdWRpb1RyYWNrID0gbmV3VHJhY2s7Ci0gICAgICAgIG1Qb3MgPSAwOwotICAgICAgICBtU2FtcGxlID0gc2FtcGxlOwotICAgICAgICBtQ2hhbm5lbElEID0gbmV4dENoYW5uZWxJRDsKLSAgICAgICAgbVByaW9yaXR5ID0gcHJpb3JpdHk7Ci0gICAgICAgIG1Mb29wID0gbG9vcDsKLSAgICAgICAgbUxlZnRWb2x1bWUgPSBsZWZ0Vm9sdW1lOwotICAgICAgICBtUmlnaHRWb2x1bWUgPSByaWdodFZvbHVtZTsKLSAgICAgICAgbU51bUNoYW5uZWxzID0gbnVtQ2hhbm5lbHM7Ci0gICAgICAgIG1SYXRlID0gcmF0ZTsKLSAgICAgICAgY2xlYXJOZXh0RXZlbnQoKTsKLSAgICAgICAgbVN0YXRlID0gUExBWUlORzsKLSAgICAgICAgbUF1ZGlvVHJhY2stPnN0YXJ0KCk7Ci0gICAgICAgIG1BdWRpb0J1ZmZlclNpemUgPSBuZXdUcmFjay0+ZnJhbWVDb3VudCgpKm5ld1RyYWNrLT5mcmFtZVNpemUoKTsKLSAgICB9Ci0KLWV4aXQ6Ci0gICAgQUxPR1YoImRlbGV0ZSBvbGRUcmFjayAlcCIsIG9sZFRyYWNrLmdldCgpKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIG1BdWRpb1RyYWNrLmNsZWFyKCk7Ci0gICAgfQotfQotCi12b2lkIFNvdW5kQ2hhbm5lbDo6bmV4dEV2ZW50KCkKLXsKLSAgICBzcDxTYW1wbGU+IHNhbXBsZTsKLSAgICBpbnQgbmV4dENoYW5uZWxJRDsKLSAgICBmbG9hdCBsZWZ0Vm9sdW1lOwotICAgIGZsb2F0IHJpZ2h0Vm9sdW1lOwotICAgIGludCBwcmlvcml0eTsKLSAgICBpbnQgbG9vcDsKLSAgICBmbG9hdCByYXRlOwotCi0gICAgLy8gY2hlY2sgZm9yIHZhbGlkIGV2ZW50Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jaygmbUxvY2spOwotICAgICAgICBuZXh0Q2hhbm5lbElEID0gbU5leHRFdmVudC5jaGFubmVsSUQoKTsKLSAgICAgICAgaWYgKG5leHRDaGFubmVsSUQgID09IDApIHsKLSAgICAgICAgICAgIEFMT0dWKCJzdG9sZW4gY2hhbm5lbCBoYXMgbm8gZXZlbnQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHNhbXBsZSA9IG1OZXh0RXZlbnQuc2FtcGxlKCk7Ci0gICAgICAgIGxlZnRWb2x1bWUgPSBtTmV4dEV2ZW50LmxlZnRWb2x1bWUoKTsKLSAgICAgICAgcmlnaHRWb2x1bWUgPSBtTmV4dEV2ZW50LnJpZ2h0Vm9sdW1lKCk7Ci0gICAgICAgIHByaW9yaXR5ID0gbU5leHRFdmVudC5wcmlvcml0eSgpOwotICAgICAgICBsb29wID0gbU5leHRFdmVudC5sb29wKCk7Ci0gICAgICAgIHJhdGUgPSBtTmV4dEV2ZW50LnJhdGUoKTsKLSAgICB9Ci0KLSAgICBBTE9HVigiU3RhcnRpbmcgc3RvbGVuIGNoYW5uZWwgJWQgLT4gJWQiLCBjaGFubmVsSUQoKSwgbmV4dENoYW5uZWxJRCk7Ci0gICAgcGxheShzYW1wbGUsIG5leHRDaGFubmVsSUQsIGxlZnRWb2x1bWUsIHJpZ2h0Vm9sdW1lLCBwcmlvcml0eSwgbG9vcCwgcmF0ZSk7Ci19Ci0KLXZvaWQgU291bmRDaGFubmVsOjpjYWxsYmFjayhpbnQgZXZlbnQsIHZvaWQqIHVzZXIsIHZvaWQgKmluZm8pCi17Ci0gICAgU291bmRDaGFubmVsKiBjaGFubmVsID0gc3RhdGljX2Nhc3Q8U291bmRDaGFubmVsKj4oKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpdXNlciAmIH4xKSk7Ci0KLSAgICBjaGFubmVsLT5wcm9jZXNzKGV2ZW50LCBpbmZvLCAodW5zaWduZWQgbG9uZyl1c2VyICYgMSk7Ci19Ci0KLXZvaWQgU291bmRDaGFubmVsOjpwcm9jZXNzKGludCBldmVudCwgdm9pZCAqaW5mbywgdW5zaWduZWQgbG9uZyB0b2dnbGUpCi17Ci0gICAgLy9BTE9HVigicHJvY2VzcyglZCkiLCBtQ2hhbm5lbElEKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKCZtTG9jayk7Ci0KLSAgICBBdWRpb1RyYWNrOjpCdWZmZXIqIGIgPSBOVUxMOwotICAgIGlmIChldmVudCA9PSBBdWRpb1RyYWNrOjpFVkVOVF9NT1JFX0RBVEEpIHsKLSAgICAgICBiID0gc3RhdGljX2Nhc3Q8QXVkaW9UcmFjazo6QnVmZmVyICo+KGluZm8pOwotICAgIH0KLQotICAgIGlmIChtVG9nZ2xlICE9IHRvZ2dsZSkgewotICAgICAgICBBTE9HVigicHJvY2VzcyB3cm9uZyB0b2dnbGUgJXAgY2hhbm5lbCAlZCIsIHRoaXMsIG1DaGFubmVsSUQpOwotICAgICAgICBpZiAoYiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBiLT5zaXplID0gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3A8U2FtcGxlPiBzYW1wbGUgPSBtU2FtcGxlOwotCi0vLyAgICBBTE9HVigiU291bmRDaGFubmVsOjpwcm9jZXNzIGV2ZW50ICVkIiwgZXZlbnQpOwotCi0gICAgaWYgKGV2ZW50ID09IEF1ZGlvVHJhY2s6OkVWRU5UX01PUkVfREFUQSkgewotCi0gICAgICAgIC8vIGNoZWNrIGZvciBzdG9wIHN0YXRlCi0gICAgICAgIGlmIChiLT5zaXplID09IDApIHJldHVybjsKLQotICAgICAgICBpZiAobVN0YXRlID09IElETEUpIHsKLSAgICAgICAgICAgIGItPnNpemUgPSAwOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNhbXBsZSAhPSAwKSB7Ci0gICAgICAgICAgICAvLyBmaWxsIGJ1ZmZlcgotICAgICAgICAgICAgdWludDhfdCogcSA9ICh1aW50OF90KikgYi0+aTg7Ci0gICAgICAgICAgICBzaXplX3QgY291bnQgPSAwOwotCi0gICAgICAgICAgICBpZiAobVBvcyA8IChpbnQpc2FtcGxlLT5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICB1aW50OF90KiBwID0gc2FtcGxlLT5kYXRhKCkgKyBtUG9zOwotICAgICAgICAgICAgICAgIGNvdW50ID0gc2FtcGxlLT5zaXplKCkgLSBtUG9zOwotICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IGItPnNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgY291bnQgPSBiLT5zaXplOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZW1jcHkocSwgcCwgY291bnQpOwotLy8gICAgICAgICAgICAgIEFMT0dWKCJmaWxsOiBxPSVwLCBwPSVwLCBtUG9zPSV1LCBiLT5zaXplPSV1LCBjb3VudD0lZCIsIHEsIHAsIG1Qb3MsIGItPnNpemUsCi0vLyAgICAgICAgICAgICAgICAgICAgICBjb3VudCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1Qb3MgPCBtQXVkaW9CdWZmZXJTaXplKSB7Ci0gICAgICAgICAgICAgICAgY291bnQgPSBtQXVkaW9CdWZmZXJTaXplIC0gbVBvczsKLSAgICAgICAgICAgICAgICBpZiAoY291bnQgPiBiLT5zaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50ID0gYi0+c2l6ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVtc2V0KHEsIDAsIGNvdW50KTsKLS8vICAgICAgICAgICAgICBBTE9HVigiZmlsbCBleHRyYTogcT0lcCwgbVBvcz0ldSwgYi0+c2l6ZT0ldSwgY291bnQ9JWQiLCBxLCBtUG9zLCBiLT5zaXplLCBjb3VudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1Qb3MgKz0gY291bnQ7Ci0gICAgICAgICAgICBiLT5zaXplID0gY291bnQ7Ci0gICAgICAgICAgICAvL0FMT0dWKCJidWZmZXI9JXAsIFswXT0lZCIsIGItPmkxNiwgYi0+aTE2WzBdKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoZXZlbnQgPT0gQXVkaW9UcmFjazo6RVZFTlRfVU5ERVJSVU4gfHwgZXZlbnQgPT0gQXVkaW9UcmFjazo6RVZFTlRfQlVGRkVSX0VORCB8fAotICAgICAgICAgICAgZXZlbnQgPT0gQXVkaW9UcmFjazo6RVZFTlRfTkVXX0lBVURJT1RSQUNLKSB7Ci0gICAgICAgIEFMT0dWKCJwcm9jZXNzICVwIGNoYW5uZWwgJWQgZXZlbnQgJXMiLAotICAgICAgICAgICAgICB0aGlzLCBtQ2hhbm5lbElELCAoZXZlbnQgPT0gQXVkaW9UcmFjazo6RVZFTlRfVU5ERVJSVU4pID8gIlVOREVSUlVOIiA6Ci0gICAgICAgICAgICAgICAgICAgICAgKGV2ZW50ID09IEF1ZGlvVHJhY2s6OkVWRU5UX0JVRkZFUl9FTkQpID8gIkJVRkZFUl9FTkQiIDogIk5FV19JQVVESU9UUkFDSyIpOwotICAgICAgICBtU291bmRQb29sLT5hZGRUb1N0b3BMaXN0KHRoaXMpOwotICAgIH0gZWxzZSBpZiAoZXZlbnQgPT0gQXVkaW9UcmFjazo6RVZFTlRfTE9PUF9FTkQpIHsKLSAgICAgICAgQUxPR1YoIkVuZCBsb29wICVwIGNoYW5uZWwgJWQiLCB0aGlzLCBtQ2hhbm5lbElEKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVygiU291bmRDaGFubmVsOjpwcm9jZXNzIHVuZXhwZWN0ZWQgZXZlbnQgJWQiLCBldmVudCk7Ci0gICAgfQotfQotCi0KLS8vIGNhbGwgd2l0aCBsb2NrIGhlbGQKLWJvb2wgU291bmRDaGFubmVsOjpkb1N0b3BfbCgpCi17Ci0gICAgaWYgKG1TdGF0ZSAhPSBJRExFKSB7Ci0gICAgICAgIHNldFZvbHVtZV9sKDAsIDApOwotICAgICAgICBBTE9HVigic3RvcCIpOwotICAgICAgICBtQXVkaW9UcmFjay0+c3RvcCgpOwotICAgICAgICBtU2FtcGxlLmNsZWFyKCk7Ci0gICAgICAgIG1TdGF0ZSA9IElETEU7Ci0gICAgICAgIG1Qcmlvcml0eSA9IElETEVfUFJJT1JJVFk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8vIGNhbGwgd2l0aCBsb2NrIGhlbGQgYW5kIHNvdW5kIHBvb2wgbG9jayBoZWxkCi12b2lkIFNvdW5kQ2hhbm5lbDo6c3RvcF9sKCkKLXsKLSAgICBpZiAoZG9TdG9wX2woKSkgewotICAgICAgICBtU291bmRQb29sLT5kb25lX2wodGhpcyk7Ci0gICAgfQotfQotCi0vLyBjYWxsIHdpdGggc291bmQgcG9vbCBsb2NrIGhlbGQKLXZvaWQgU291bmRDaGFubmVsOjpzdG9wKCkKLXsKLSAgICBib29sIHN0b3BwZWQ7Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jaygmbUxvY2spOwotICAgICAgICBzdG9wcGVkID0gZG9TdG9wX2woKTsKLSAgICB9Ci0KLSAgICBpZiAoc3RvcHBlZCkgewotICAgICAgICBtU291bmRQb29sLT5kb25lX2wodGhpcyk7Ci0gICAgfQotfQotCi0vL0ZJWE1FOiBQYXVzZSBpcyBhIGxpdHRsZSBicm9rZW4gcmlnaHQgbm93Ci12b2lkIFNvdW5kQ2hhbm5lbDo6cGF1c2UoKQotewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKCZtTG9jayk7Ci0gICAgaWYgKG1TdGF0ZSA9PSBQTEFZSU5HKSB7Ci0gICAgICAgIEFMT0dWKCJwYXVzZSB0cmFjayIpOwotICAgICAgICBtU3RhdGUgPSBQQVVTRUQ7Ci0gICAgICAgIG1BdWRpb1RyYWNrLT5wYXVzZSgpOwotICAgIH0KLX0KLQotdm9pZCBTb3VuZENoYW5uZWw6OmF1dG9QYXVzZSgpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soJm1Mb2NrKTsKLSAgICBpZiAobVN0YXRlID09IFBMQVlJTkcpIHsKLSAgICAgICAgQUxPR1YoInBhdXNlIHRyYWNrIik7Ci0gICAgICAgIG1TdGF0ZSA9IFBBVVNFRDsKLSAgICAgICAgbUF1dG9QYXVzZWQgPSB0cnVlOwotICAgICAgICBtQXVkaW9UcmFjay0+cGF1c2UoKTsKLSAgICB9Ci19Ci0KLXZvaWQgU291bmRDaGFubmVsOjpyZXN1bWUoKQotewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKCZtTG9jayk7Ci0gICAgaWYgKG1TdGF0ZSA9PSBQQVVTRUQpIHsKLSAgICAgICAgQUxPR1YoInJlc3VtZSB0cmFjayIpOwotICAgICAgICBtU3RhdGUgPSBQTEFZSU5HOwotICAgICAgICBtQXV0b1BhdXNlZCA9IGZhbHNlOwotICAgICAgICBtQXVkaW9UcmFjay0+c3RhcnQoKTsKLSAgICB9Ci19Ci0KLXZvaWQgU291bmRDaGFubmVsOjphdXRvUmVzdW1lKCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jaygmbUxvY2spOwotICAgIGlmIChtQXV0b1BhdXNlZCAmJiAobVN0YXRlID09IFBBVVNFRCkpIHsKLSAgICAgICAgQUxPR1YoInJlc3VtZSB0cmFjayIpOwotICAgICAgICBtU3RhdGUgPSBQTEFZSU5HOwotICAgICAgICBtQXV0b1BhdXNlZCA9IGZhbHNlOwotICAgICAgICBtQXVkaW9UcmFjay0+c3RhcnQoKTsKLSAgICB9Ci19Ci0KLXZvaWQgU291bmRDaGFubmVsOjpzZXRSYXRlKGZsb2F0IHJhdGUpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soJm1Mb2NrKTsKLSAgICBpZiAobUF1ZGlvVHJhY2sgIT0gTlVMTCAmJiBtU2FtcGxlICE9IDApIHsKLSAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IHVpbnQzMl90KGZsb2F0KG1TYW1wbGUtPnNhbXBsZVJhdGUoKSkgKiByYXRlICsgMC41KTsKLSAgICAgICAgbUF1ZGlvVHJhY2stPnNldFNhbXBsZVJhdGUoc2FtcGxlUmF0ZSk7Ci0gICAgICAgIG1SYXRlID0gcmF0ZTsKLSAgICB9Ci19Ci0KLS8vIGNhbGwgd2l0aCBsb2NrIGhlbGQKLXZvaWQgU291bmRDaGFubmVsOjpzZXRWb2x1bWVfbChmbG9hdCBsZWZ0Vm9sdW1lLCBmbG9hdCByaWdodFZvbHVtZSkKLXsKLSAgICBtTGVmdFZvbHVtZSA9IGxlZnRWb2x1bWU7Ci0gICAgbVJpZ2h0Vm9sdW1lID0gcmlnaHRWb2x1bWU7Ci0gICAgaWYgKG1BdWRpb1RyYWNrICE9IE5VTEwpCi0gICAgICAgIG1BdWRpb1RyYWNrLT5zZXRWb2x1bWUobGVmdFZvbHVtZSwgcmlnaHRWb2x1bWUpOwotfQotCi12b2lkIFNvdW5kQ2hhbm5lbDo6c2V0Vm9sdW1lKGZsb2F0IGxlZnRWb2x1bWUsIGZsb2F0IHJpZ2h0Vm9sdW1lKQotewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKCZtTG9jayk7Ci0gICAgc2V0Vm9sdW1lX2wobGVmdFZvbHVtZSwgcmlnaHRWb2x1bWUpOwotfQotCi12b2lkIFNvdW5kQ2hhbm5lbDo6c2V0TG9vcChpbnQgbG9vcCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jaygmbUxvY2spOwotICAgIGlmIChtQXVkaW9UcmFjayAhPSBOVUxMICYmIG1TYW1wbGUgIT0gMCkgewotICAgICAgICB1aW50MzJfdCBsb29wRW5kID0gbVNhbXBsZS0+c2l6ZSgpL21OdW1DaGFubmVscy8KLSAgICAgICAgICAgICgobVNhbXBsZS0+Zm9ybWF0KCkgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpID8gc2l6ZW9mKGludDE2X3QpIDogc2l6ZW9mKHVpbnQ4X3QpKTsKLSAgICAgICAgbUF1ZGlvVHJhY2stPnNldExvb3AoMCwgbG9vcEVuZCwgbG9vcCk7Ci0gICAgICAgIG1Mb29wID0gbG9vcDsKLSAgICB9Ci19Ci0KLVNvdW5kQ2hhbm5lbDo6flNvdW5kQ2hhbm5lbCgpCi17Ci0gICAgQUxPR1YoIlNvdW5kQ2hhbm5lbCBkZXN0cnVjdG9yICVwIiwgdGhpcyk7Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jaygmbUxvY2spOwotICAgICAgICBjbGVhck5leHRFdmVudCgpOwotICAgICAgICBkb1N0b3BfbCgpOwotICAgIH0KLSAgICAvLyBkbyBub3QgY2FsbCBBdWRpb1RyYWNrIGRlc3RydWN0b3Igd2l0aCBtTG9jayBoZWxkIGFzIGl0IHdpbGwgd2FpdCBmb3IgdGhlIEF1ZGlvVHJhY2sKLSAgICAvLyBjYWxsYmFjayB0aHJlYWQgdG8gZXhpdCB3aGljaCBtYXkgbmVlZCB0byBleGVjdXRlIHByb2Nlc3MoKSBhbmQgYWNxdWlyZSB0aGUgbUxvY2suCi0gICAgbUF1ZGlvVHJhY2suY2xlYXIoKTsKLX0KLQotdm9pZCBTb3VuZENoYW5uZWw6OmR1bXAoKQotewotICAgIEFMT0dWKCJtU3RhdGUgPSAlZCBtQ2hhbm5lbElEPSVkLCBtTnVtQ2hhbm5lbHM9JWQsIG1Qb3MgPSAlZCwgbVByaW9yaXR5PSVkLCBtTG9vcD0lZCIsCi0gICAgICAgICAgICBtU3RhdGUsIG1DaGFubmVsSUQsIG1OdW1DaGFubmVscywgbVBvcywgbVByaW9yaXR5LCBtTG9vcCk7Ci19Ci0KLXZvaWQgU291bmRFdmVudDo6c2V0KGNvbnN0IHNwPFNhbXBsZT4mIHNhbXBsZSwgaW50IGNoYW5uZWxJRCwgZmxvYXQgbGVmdFZvbHVtZSwKLSAgICAgICAgICAgIGZsb2F0IHJpZ2h0Vm9sdW1lLCBpbnQgcHJpb3JpdHksIGludCBsb29wLCBmbG9hdCByYXRlKQotewotICAgIG1TYW1wbGUgPSBzYW1wbGU7Ci0gICAgbUNoYW5uZWxJRCA9IGNoYW5uZWxJRDsKLSAgICBtTGVmdFZvbHVtZSA9IGxlZnRWb2x1bWU7Ci0gICAgbVJpZ2h0Vm9sdW1lID0gcmlnaHRWb2x1bWU7Ci0gICAgbVByaW9yaXR5ID0gcHJpb3JpdHk7Ci0gICAgbUxvb3AgPSBsb29wOwotICAgIG1SYXRlID1yYXRlOwotfQotCi19IC8vIGVuZCBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvU291bmRQb29sVGhyZWFkLmNwcCBiL21lZGlhL2xpYm1lZGlhL1NvdW5kUG9vbFRocmVhZC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhM2I0ODIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWEvU291bmRQb29sVGhyZWFkLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJTb3VuZFBvb2xUaHJlYWQiCi0jaW5jbHVkZSAidXRpbHMvTG9nLmgiCi0KLSNpbmNsdWRlICJTb3VuZFBvb2xUaHJlYWQuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi12b2lkIFNvdW5kUG9vbFRocmVhZDo6d3JpdGUoU291bmRQb29sTXNnIG1zZykgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKCZtTG9jayk7Ci0gICAgd2hpbGUgKG1Nc2dRdWV1ZS5zaXplKCkgPj0gbWF4TWVzc2FnZXMpIHsKLSAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKLSAgICB9Ci0KLSAgICAvLyBpZiB0aHJlYWQgaXMgcXVpdHRpbmcsIGRvbid0IGFkZCB0byBxdWV1ZQotICAgIGlmIChtUnVubmluZykgewotICAgICAgICBtTXNnUXVldWUucHVzaChtc2cpOwotICAgICAgICBtQ29uZGl0aW9uLnNpZ25hbCgpOwotICAgIH0KLX0KLQotY29uc3QgU291bmRQb29sTXNnIFNvdW5kUG9vbFRocmVhZDo6cmVhZCgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jaygmbUxvY2spOwotICAgIHdoaWxlIChtTXNnUXVldWUuc2l6ZSgpID09IDApIHsKLSAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKLSAgICB9Ci0gICAgU291bmRQb29sTXNnIG1zZyA9IG1Nc2dRdWV1ZVswXTsKLSAgICBtTXNnUXVldWUucmVtb3ZlQXQoMCk7Ci0gICAgbUNvbmRpdGlvbi5zaWduYWwoKTsKLSAgICByZXR1cm4gbXNnOwotfQotCi12b2lkIFNvdW5kUG9vbFRocmVhZDo6cXVpdCgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jaygmbUxvY2spOwotICAgIGlmIChtUnVubmluZykgewotICAgICAgICBtUnVubmluZyA9IGZhbHNlOwotICAgICAgICBtTXNnUXVldWUuY2xlYXIoKTsKLSAgICAgICAgbU1zZ1F1ZXVlLnB1c2goU291bmRQb29sTXNnKFNvdW5kUG9vbE1zZzo6S0lMTCwgMCkpOwotICAgICAgICBtQ29uZGl0aW9uLnNpZ25hbCgpOwotICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOwotICAgIH0KLSAgICBBTE9HVigicmV0dXJuIGZyb20gcXVpdCIpOwotfQotCi1Tb3VuZFBvb2xUaHJlYWQ6OlNvdW5kUG9vbFRocmVhZChTb3VuZFBvb2wqIHNvdW5kUG9vbCkgOgotICAgIG1Tb3VuZFBvb2woc291bmRQb29sKQotewotICAgIG1Nc2dRdWV1ZS5zZXRDYXBhY2l0eShtYXhNZXNzYWdlcyk7Ci0gICAgaWYgKGNyZWF0ZVRocmVhZEV0YyhiZWdpblRocmVhZCwgdGhpcywgIlNvdW5kUG9vbFRocmVhZCIpKSB7Ci0gICAgICAgIG1SdW5uaW5nID0gdHJ1ZTsKLSAgICB9Ci19Ci0KLVNvdW5kUG9vbFRocmVhZDo6flNvdW5kUG9vbFRocmVhZCgpCi17Ci0gICAgcXVpdCgpOwotfQotCi1pbnQgU291bmRQb29sVGhyZWFkOjpiZWdpblRocmVhZCh2b2lkKiBhcmcpIHsKLSAgICBBTE9HVigiYmVnaW5UaHJlYWQiKTsKLSAgICBTb3VuZFBvb2xUaHJlYWQqIHNvdW5kUG9vbFRocmVhZCA9IChTb3VuZFBvb2xUaHJlYWQqKWFyZzsKLSAgICByZXR1cm4gc291bmRQb29sVGhyZWFkLT5ydW4oKTsKLX0KLQotaW50IFNvdW5kUG9vbFRocmVhZDo6cnVuKCkgewotICAgIEFMT0dWKCJydW4iKTsKLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIFNvdW5kUG9vbE1zZyBtc2cgPSByZWFkKCk7Ci0gICAgICAgIEFMT0dWKCJHb3QgbWVzc2FnZSBtPSVkLCBtRGF0YT0lZCIsIG1zZy5tTWVzc2FnZVR5cGUsIG1zZy5tRGF0YSk7Ci0gICAgICAgIHN3aXRjaCAobXNnLm1NZXNzYWdlVHlwZSkgewotICAgICAgICBjYXNlIFNvdW5kUG9vbE1zZzo6S0lMTDoKLSAgICAgICAgICAgIEFMT0dWKCJnb29kYnllIik7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIGNhc2UgU291bmRQb29sTXNnOjpMT0FEX1NBTVBMRToKLSAgICAgICAgICAgIGRvTG9hZFNhbXBsZShtc2cubURhdGEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVygicnVuOiBVbnJlY29nbml6ZWQgbWVzc2FnZSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgbXNnLm1NZXNzYWdlVHlwZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBTb3VuZFBvb2xUaHJlYWQ6OmxvYWRTYW1wbGUoaW50IHNhbXBsZUlEKSB7Ci0gICAgd3JpdGUoU291bmRQb29sTXNnKFNvdW5kUG9vbE1zZzo6TE9BRF9TQU1QTEUsIHNhbXBsZUlEKSk7Ci19Ci0KLXZvaWQgU291bmRQb29sVGhyZWFkOjpkb0xvYWRTYW1wbGUoaW50IHNhbXBsZUlEKSB7Ci0gICAgc3AgPFNhbXBsZT4gc2FtcGxlID0gbVNvdW5kUG9vbC0+ZmluZFNhbXBsZShzYW1wbGVJRCk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gLTE7Ci0gICAgaWYgKHNhbXBsZSAhPSAwKSB7Ci0gICAgICAgIHN0YXR1cyA9IHNhbXBsZS0+ZG9Mb2FkKCk7Ci0gICAgfQotICAgIG1Tb3VuZFBvb2wtPm5vdGlmeShTb3VuZFBvb2xFdmVudChTb3VuZFBvb2xFdmVudDo6U0FNUExFX0xPQURFRCwgc2FtcGxlSUQsIHN0YXR1cykpOwotfQotCi19IC8vIGVuZCBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvU291bmRQb29sVGhyZWFkLmggYi9tZWRpYS9saWJtZWRpYS9Tb3VuZFBvb2xUaHJlYWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U5NjkwMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYS9Tb3VuZFBvb2xUaHJlYWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFNPVU5EUE9PTFRIUkVBRF9IXwotI2RlZmluZSBTT1VORFBPT0xUSFJFQURfSF8KLQotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9Tb3VuZFBvb2wuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBTb3VuZFBvb2xNc2cgewotcHVibGljOgotICAgIGVudW0gTWVzc2FnZVR5cGUgeyBJTlZBTElELCBLSUxMLCBMT0FEX1NBTVBMRSB9OwotICAgIFNvdW5kUG9vbE1zZygpIDogbU1lc3NhZ2VUeXBlKElOVkFMSUQpLCBtRGF0YSgwKSB7fQotICAgIFNvdW5kUG9vbE1zZyhNZXNzYWdlVHlwZSBNZXNzYWdlVHlwZSwgaW50IGRhdGEpIDoKLSAgICAgICAgbU1lc3NhZ2VUeXBlKE1lc3NhZ2VUeXBlKSwgbURhdGEoZGF0YSkge30KLSAgICB1aW50MTZfdCAgICAgICAgIG1NZXNzYWdlVHlwZTsKLSAgICB1aW50MTZfdCAgICAgICAgIG1EYXRhOwotfTsKLQotLyoKLSAqIFRoaXMgY2xhc3MgaGFuZGxlcyBiYWNrZ3JvdW5kIHJlcXVlc3RzIGZyb20gdGhlIFNvdW5kUG9vbAotICovCi1jbGFzcyBTb3VuZFBvb2xUaHJlYWQgewotcHVibGljOgotICAgIFNvdW5kUG9vbFRocmVhZChTb3VuZFBvb2wqIFNvdW5kUG9vbCk7Ci0gICAgflNvdW5kUG9vbFRocmVhZCgpOwotICAgIHZvaWQgbG9hZFNhbXBsZShpbnQgc2FtcGxlSUQpOwotICAgIHZvaWQgcXVpdCgpOwotICAgIHZvaWQgd3JpdGUoU291bmRQb29sTXNnIG1zZyk7Ci0KLXByaXZhdGU6Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBtYXhNZXNzYWdlcyA9IDU7Ci0KLSAgICBzdGF0aWMgaW50IGJlZ2luVGhyZWFkKHZvaWQqIGFyZyk7Ci0gICAgaW50IHJ1bigpOwotICAgIHZvaWQgZG9Mb2FkU2FtcGxlKGludCBzYW1wbGVJRCk7Ci0gICAgY29uc3QgU291bmRQb29sTXNnIHJlYWQoKTsKLQotICAgIE11dGV4ICAgICAgICAgICAgICAgICAgIG1Mb2NrOwotICAgIENvbmRpdGlvbiAgICAgICAgICAgICAgIG1Db25kaXRpb247Ci0gICAgVmVjdG9yPFNvdW5kUG9vbE1zZz4gICAgbU1zZ1F1ZXVlOwotICAgIFNvdW5kUG9vbCogICAgICAgICAgICAgIG1Tb3VuZFBvb2w7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVJ1bm5pbmc7Ci19OwotCi19IC8vIGVuZCBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLypTT1VORFBPT0xUSFJFQURfSF8qLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvVG9uZUdlbmVyYXRvci5jcHAgYi9tZWRpYS9saWJtZWRpYS9Ub25lR2VuZXJhdG9yLmNwcAppbmRleCA2MWI2ZDM2Li4yY2M0Njg1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9Ub25lR2VuZXJhdG9yLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9Ub25lR2VuZXJhdG9yLmNwcApAQCAtMjgsNzE4ICsyOCw3MTggQEAKIAogLy8gRGVzY3JpcHRvcnMgZm9yIGFsbCBhdmFpbGFibGUgdG9uZXMgKFNlZSBUb25lR2VuZXJhdG9yOjpUb25lRGVzY3JpcHRvciBjbGFzcyBkZWNsYXJhdGlvbiBmb3IgZGV0YWlscykKIGNvbnN0IFRvbmVHZW5lcmF0b3I6OlRvbmVEZXNjcmlwdG9yIFRvbmVHZW5lcmF0b3I6OnNUb25lRGVzY3JpcHRvcnNbXSA9IHsKLSAgICAgICAgeyBzZWdtZW50czoge3sgZHVyYXRpb246IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLCB3YXZlRnJlcTogeyAxMzM2LCA5NDEsIDAgfSwgMCwgMH0sCi0gICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9EVE1GXzAKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwgd2F2ZUZyZXE6IHsgMTIwOSwgNjk3LCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9EVE1GXzEKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwgd2F2ZUZyZXE6IHsgMTMzNiwgNjk3LCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9EVE1GXzIKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwgd2F2ZUZyZXE6IHsgMTQ3NywgNjk3LCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9EVE1GXzMKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwgd2F2ZUZyZXE6IHsgMTIwOSwgNzcwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9EVE1GXzQKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwgd2F2ZUZyZXE6IHsgMTMzNiwgNzcwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9EVE1GXzUKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwgd2F2ZUZyZXE6IHsgMTQ3NywgNzcwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9EVE1GXzYKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwgd2F2ZUZyZXE6IHsgMTIwOSwgODUyLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9EVE1GXzcKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwgd2F2ZUZyZXE6IHsgMTMzNiwgODUyLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9EVE1GXzgKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwgd2F2ZUZyZXE6IHsgMTQ3NywgODUyLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9EVE1GXzkKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwgd2F2ZUZyZXE6IHsgMTIwOSwgOTQxLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9EVE1GX1MKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwgd2F2ZUZyZXE6IHsgMTQ3NywgOTQxLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9EVE1GX1AKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwgd2F2ZUZyZXE6IHsgMTYzMywgNjk3LCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9EVE1GX0EKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwgd2F2ZUZyZXE6IHsgMTYzMywgNzcwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0RUTUZfQgotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLCB3YXZlRnJlcTogeyAxNjMzLCA4NTIsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAgLCB3YXZlRnJlcTogeyAwIH0sIDAsIDB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0RUTUZfQwotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLCB3YXZlRnJlcTogeyAxNjMzLCA5NDEsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAgLCB3YXZlRnJlcTogeyAwIH0sIDAsIDB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0RUTUZfRAotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLCB3YXZlRnJlcTogeyA0MjUsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAgLCB3YXZlRnJlcTogeyAwIH0sIDAsIDB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX1NVUF9ESUFMCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogNTAwICwgd2F2ZUZyZXE6IHsgNDI1LCAwIH0sIDAsIDB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDUwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfQlVTWQotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDIwMCwgd2F2ZUZyZXE6IHsgNDI1LCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAgLCB3YXZlRnJlcTogeyAwIH0sIDAsIDB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX1NVUF9DT05HRVNUSU9OCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMjAwLCB3YXZlRnJlcTogeyA0MjUsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAgLCB3YXZlRnJlcTogeyAwIH0sIDAsIDB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IDAsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfU1VQX1JBRElPX0FDSwotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDIwMCwgd2F2ZUZyZXE6IHsgNDI1LCAwIH0sIDAsIDB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDIwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiAyLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX1NVUF9SQURJT19OT1RBVkFJTAotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDMzMCwgd2F2ZUZyZXE6IHsgOTUwLCAxNDAwLCAxODAwLCAwIH0sIDAsIDB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDEwMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfU1VQX0VSUk9SCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMjAwLCB3YXZlRnJlcTogeyA0MjUsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDYwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjAwLCB3YXZlRnJlcTogeyA0MjUsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDMwMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAgLCB3YXZlRnJlcTogeyAwIH0sIDAsIDB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX1NVUF9DQUxMX1dBSVRJTkcKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAxMDAwLCB3YXZlRnJlcTogeyA0MjUsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDQwMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAgLCB3YXZlRnJlcTogeyAwIH0sIDAsIDB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX1NVUF9SSU5HVE9ORQotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDQwLCB3YXZlRnJlcTogeyA0MDAsIDEyMDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAgLCB3YXZlRnJlcTogeyAwIH0sIDAsIDB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IDAsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfUFJPUF9CRUVQCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMTAwLCB3YXZlRnJlcTogeyAxMjAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAxMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiAxLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX1BST1BfQUNLCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogNDAwLCB3YXZlRnJlcTogeyAzMDAsIDQwMCwgNTAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiAwLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX1BST1BfTkFDSwotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDIwMCwgd2F2ZUZyZXE6IHsgNDAwLCAxMjAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiAwLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX1BST1BfUFJPTVBUCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogNDAsIHdhdmVGcmVxOiB7IDQwMCwgMTIwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA0MCwgd2F2ZUZyZXE6IHsgNDAwLCAxMjAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiAwLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfUFJPUF9CRUVQMgotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDI1MCwgd2F2ZUZyZXE6IHsgNDQwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNTAsIHdhdmVGcmVxOiB7IDYyMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX1NVUF9JTlRFUkNFUFQKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAyNTAsIHdhdmVGcmVxOiB7IDQ0MCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUwLCB3YXZlRnJlcTogeyA2MjAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAgLCB3YXZlRnJlcTogeyAwIH0sIDAsIDB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IDcsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfSU5URVJDRVBUX0FCQlJFVgotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDI1MCwgd2F2ZUZyZXE6IHsgNDgwLCA2MjAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1MCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH19LAotICAgICAgICAgIHJlcGVhdENudDogNywKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX1NVUF9DT05HRVNUSU9OX0FCQlJFVgotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDEwMCwgd2F2ZUZyZXE6IHsgMzUwLCA0NDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDEwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH19LAotICAgICAgICAgIHJlcGVhdENudDogMiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX1NVUF9DT05GSVJNCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMTAwLCB3YXZlRnJlcTogeyA0ODAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDEwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH19LAotICAgICAgICAgIHJlcGVhdENudDogMywKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfUElQCi0gICAgICAgIHsgc2VnbWVudHM6IHt7IGR1cmF0aW9uOiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwgd2F2ZUZyZXE6IHsgNDI1LCAwIH0sIDAsIDB9LAotICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9ESUFMX1RPTkVfTElURQotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDIwMDAsIHdhdmVGcmVxOiB7IDQ0MCwgNDgwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA0MDAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX05FVFdPUktfVVNBX1JJTkdCQUNLCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMjUwLCB3YXZlRnJlcTogeyA0NDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1MCwgd2F2ZUZyZXE6IHsgNjIwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiAgVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0lOVEVSQ0VQVAotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDI1MCwgd2F2ZUZyZXE6IHsgNDQwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNTAsIHdhdmVGcmVxOiB7IDYyMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH19LAotICAgICAgICAgIHJlcGVhdENudDogIDAsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0FCQlJfSU5URVJDRVBUCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMjUwLCB3YXZlRnJlcTogeyA0ODAsIDYyMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX1JFT1JERVIKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAyNTAsIHdhdmVGcmVxOiB7IDQ4MCwgNjIwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNTAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAgLCB3YXZlRnJlcTogeyAwIH0sIDAsIDB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IDcsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9BQkJSX1JFT1JERVIKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiA1MDAsIHdhdmVGcmVxOiB7IDQ4MCwgNjIwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA1MDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAgLCB3YXZlRnJlcTogeyAwIH0sIDAsIDB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfTkVUV09SS19CVVNZCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMTAwLCB3YXZlRnJlcTogeyAzNTAsIDQ0MCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMTAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiAyLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfQ09ORklSTQotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDUwMCwgd2F2ZUZyZXE6IHsgNjYwLCAxMDAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiAwLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfQU5TV0VSCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMzAwLCB3YXZlRnJlcTogeyA0NDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAgLCB3YXZlRnJlcTogeyAwIH0sIDAsIDB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IDAsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9ORVRXT1JLX0NBTExXQUlUSU5HCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMTAwLCB3YXZlRnJlcTogeyA0ODAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDEwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH19LAotICAgICAgICAgIHJlcGVhdENudDogMywKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX1BJUAorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwgLndhdmVGcmVxID0geyAxMzM2LCA5NDEsIDAgfSwgMCwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0RUTUZfMAorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwgLndhdmVGcmVxID0geyAxMjA5LCA2OTcsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9EVE1GXzEKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsIC53YXZlRnJlcSA9IHsgMTMzNiwgNjk3LCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfRFRNRl8yCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLCAud2F2ZUZyZXEgPSB7IDE0NzcsIDY5NywgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0RUTUZfMworICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwgLndhdmVGcmVxID0geyAxMjA5LCA3NzAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9EVE1GXzQKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsIC53YXZlRnJlcSA9IHsgMTMzNiwgNzcwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfRFRNRl81CisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLCAud2F2ZUZyZXEgPSB7IDE0NzcsIDc3MCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0RUTUZfNgorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwgLndhdmVGcmVxID0geyAxMjA5LCA4NTIsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9EVE1GXzcKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsIC53YXZlRnJlcSA9IHsgMTMzNiwgODUyLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfRFRNRl84CisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLCAud2F2ZUZyZXEgPSB7IDE0NzcsIDg1MiwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0RUTUZfOQorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwgLndhdmVGcmVxID0geyAxMjA5LCA5NDEsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9EVE1GX1MKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsIC53YXZlRnJlcSA9IHsgMTQ3NywgOTQxLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfRFRNRl9QCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLCAud2F2ZUZyZXEgPSB7IDE2MzMsIDY5NywgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0RUTUZfQQorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwgLndhdmVGcmVxID0geyAxNjMzLCA3NzAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0RUTUZfQgorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwgLndhdmVGcmVxID0geyAxNjMzLCA4NTIsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9EVE1GX0MKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsIC53YXZlRnJlcSA9IHsgMTYzMywgOTQxLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfRFRNRl9ECisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLCAud2F2ZUZyZXEgPSB7IDQyNSwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX1NVUF9ESUFMCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDUwMCAsIC53YXZlRnJlcSA9IHsgNDI1LCAwIH0sIDAsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA1MDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfU1VQX0JVU1kKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMjAwLCAud2F2ZUZyZXEgPSB7IDQyNSwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfU1VQX0NPTkdFU1RJT04KKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMjAwLCAud2F2ZUZyZXEgPSB7IDQyNSwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSAwLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfU1VQX1JBRElPX0FDSworICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAyMDAsIC53YXZlRnJlcSA9IHsgNDI1LCAwIH0sIDAsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IDIsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfUkFESU9fTk9UQVZBSUwKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMzMwLCAud2F2ZUZyZXEgPSB7IDk1MCwgMTQwMCwgMTgwMCwgMCB9LCAwLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMTAwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfRVJST1IKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMjAwLCAud2F2ZUZyZXEgPSB7IDQyNSwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDYwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjAwLCAud2F2ZUZyZXEgPSB7IDQyNSwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDMwMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX1NVUF9DQUxMX1dBSVRJTkcKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMTAwMCwgLndhdmVGcmVxID0geyA0MjUsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA0MDAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfUklOR1RPTkUKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gNDAsIC53YXZlRnJlcSA9IHsgNDAwLCAxMjAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IDAsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9QUk9QX0JFRVAKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMTAwLCAud2F2ZUZyZXEgPSB7IDEyMDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAxMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gMSwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX1BST1BfQUNLCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDQwMCwgLndhdmVGcmVxID0geyAzMDAsIDQwMCwgNTAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IDAsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9QUk9QX05BQ0sKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMjAwLCAud2F2ZUZyZXEgPSB7IDQwMCwgMTIwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSAwLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfUFJPUF9QUk9NUFQKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gNDAsIC53YXZlRnJlcSA9IHsgNDAwLCAxMjAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA0MCwgLndhdmVGcmVxID0geyA0MDAsIDEyMDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gMCwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfUFJPUF9CRUVQMgorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAyNTAsIC53YXZlRnJlcSA9IHsgNDQwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUwLCAud2F2ZUZyZXEgPSB7IDYyMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfSU5URVJDRVBUCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDI1MCwgLndhdmVGcmVxID0geyA0NDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNTAsIC53YXZlRnJlcSA9IHsgNjIwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IDcsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX1NVUF9JTlRFUkNFUFRfQUJCUkVWCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDI1MCwgLndhdmVGcmVxID0geyA0ODAsIDYyMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1MCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IDcsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX1NVUF9DT05HRVNUSU9OX0FCQlJFVgorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAxMDAsIC53YXZlRnJlcSA9IHsgMzUwLCA0NDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAxMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSAyLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfQ09ORklSTQorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAxMDAsIC53YXZlRnJlcSA9IHsgNDgwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMTAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gMywKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX1NVUF9QSVAKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7eyAuZHVyYXRpb24gPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwgLndhdmVGcmVxID0geyA0MjUsIDAgfSwgMCwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9ESUFMX1RPTkVfTElURQorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAyMDAwLCAud2F2ZUZyZXEgPSB7IDQ0MCwgNDgwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNDAwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9ORVRXT1JLX1VTQV9SSU5HQkFDSworICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAyNTAsIC53YXZlRnJlcSA9IHsgNDQwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUwLCAud2F2ZUZyZXEgPSB7IDYyMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSAgVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfSU5URVJDRVBUCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDI1MCwgLndhdmVGcmVxID0geyA0NDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNTAsIC53YXZlRnJlcSA9IHsgNjIwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9ICAwLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0FCQlJfSU5URVJDRVBUCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDI1MCwgLndhdmVGcmVxID0geyA0ODAsIDYyMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1MCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9SRU9SREVSCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDI1MCwgLndhdmVGcmVxID0geyA0ODAsIDYyMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1MCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IDcsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0FCQlJfUkVPUkRFUgorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSA1MDAsIC53YXZlRnJlcSA9IHsgNDgwLCA2MjAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA1MDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfTkVUV09SS19CVVNZCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDEwMCwgLndhdmVGcmVxID0geyAzNTAsIDQ0MCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDEwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IDIsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0NPTkZJUk0KKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gNTAwLCAud2F2ZUZyZXEgPSB7IDY2MCwgMTAwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSAwLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9BTlNXRVIKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMzAwLCAud2F2ZUZyZXEgPSB7IDQ0MCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSAwLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9ORVRXT1JLX0NBTExXQUlUSU5HCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDEwMCwgLndhdmVGcmVxID0geyA0ODAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAxMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSAzLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9QSVAKIAotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDMyLCB3YXZlRnJlcTogeyAyMDkxLCAwfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDY0LCB3YXZlRnJlcTogeyAyNTU2LCAwfSwgMTksIDB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDMyLCB3YXZlRnJlcTogeyAyMDkxLCAwfSwgMCwgMH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNDgsIHdhdmVGcmVxOiB7IDI1NTYsIDB9LCAwLCAwfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA0MDAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAsICB3YXZlRnJlcTogeyAwIH0sIDAsIDB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IDAsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0NBTExfU0lHTkFMX0lTRE5fTk9STUFMCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMzIsIHdhdmVGcmVxOiB7IDIwOTEsIDB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNjQsIHdhdmVGcmVxOiB7IDI1NTYsIDB9LCA3LCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMzIsIHdhdmVGcmVxOiB7IDIwOTEsIDB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNDAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAzMiwgIHdhdmVGcmVxOiB7IDIwOTEsIDB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNjQsICB3YXZlRnJlcTogeyAyNTU2LCAwfSwgNywgNCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDMyLCAgd2F2ZUZyZXE6IHsgMjA5MSwgMH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA0MDAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwLCAgICB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSB9LAotICAgICAgICAgIHJlcGVhdENudDogMCwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0NBTExfU0lHTkFMX0lTRE5fSU5URVJHUk9VUAotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDMyLCB3YXZlRnJlcTogeyAyMDkxLCAwfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDY0LCB3YXZlRnJlcTogeyAyNTU2LCAwfSwgMywgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDE2LCB3YXZlRnJlcTogeyAyMDkxLCAwfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDIwMCwgd2F2ZUZyZXE6IHsgMCB9LCAgICAgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDMyLCB3YXZlRnJlcTogeyAyMDkxLCAwfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDY0LCB3YXZlRnJlcTogeyAyNTU2LCAwfSwgMywgNCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDE2LCB3YXZlRnJlcTogeyAyMDkxLCAwfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDIwMCwgd2F2ZUZyZXE6IHsgMCB9LCAgICAgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAsICAgd2F2ZUZyZXE6IHsgMCB9LCAgICAgMCwgMCB9IH0sCi0gICAgICAgICAgcmVwZWF0Q250OiAwLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0NBTExfU0lHTkFMX0lTRE5fU1BfUFJJCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMCwgIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH0gfSwKLSAgICAgICAgICByZXBlYXRDbnQ6IDAsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfQ0FMTF9TSUdOQUxfSVNETl9QQVQzCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMzIsIHdhdmVGcmVxOiB7IDIwOTEsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDY0LCB3YXZlRnJlcTogeyAyNTU2LCAwIH0sIDQsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyMCwgd2F2ZUZyZXE6IHsgMjA5MSwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgIHdhdmVGcmVxOiB7IDAgfSAgICAgICwgMCwgMCB9IH0sCi0gICAgICAgICAgcmVwZWF0Q250OiAwLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9DQUxMX1NJR05BTF9JU0ROX1BJTkdfUklORwotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDAsICB3YXZlRnJlcTogeyAwIH0sIDAsIDB9IH0sCi0gICAgICAgICAgcmVwZWF0Q250OiAwLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9DQUxMX1NJR05BTF9JU0ROX1BBVDUKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAwLCAgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfSB9LAotICAgICAgICAgIHJlcGVhdENudDogMCwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfQ0FMTF9TSUdOQUxfSVNETl9QQVQ2Ci0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMCwgIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH0gfSwKLSAgICAgICAgICByZXBlYXRDbnQ6IDAsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0NBTExfU0lHTkFMX0lTRE5fUEFUNworICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAzMiwgLndhdmVGcmVxID0geyAyMDkxLCAwfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA2NCwgLndhdmVGcmVxID0geyAyNTU2LCAwfSwgMTksIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAzMiwgLndhdmVGcmVxID0geyAyMDkxLCAwfSwgMCwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDQ4LCAud2F2ZUZyZXEgPSB7IDI1NTYsIDB9LCAwLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNDAwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwLCAgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gMCwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9DQUxMX1NJR05BTF9JU0ROX05PUk1BTAorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAzMiwgLndhdmVGcmVxID0geyAyMDkxLCAwfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA2NCwgLndhdmVGcmVxID0geyAyNTU2LCAwfSwgNywgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAzMiwgLndhdmVGcmVxID0geyAyMDkxLCAwfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA0MDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDMyLCAgLndhdmVGcmVxID0geyAyMDkxLCAwfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA2NCwgIC53YXZlRnJlcSA9IHsgMjU1NiwgMH0sIDcsIDQgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMzIsICAud2F2ZUZyZXEgPSB7IDIwOTEsIDB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDQwMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAsICAgIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0gfSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gMCwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfQ0FMTF9TSUdOQUxfSVNETl9JTlRFUkdST1VQCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDMyLCAud2F2ZUZyZXEgPSB7IDIwOTEsIDB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDY0LCAud2F2ZUZyZXEgPSB7IDI1NTYsIDB9LCAzLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDE2LCAud2F2ZUZyZXEgPSB7IDIwOTEsIDB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyAwIH0sICAgICAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDMyLCAud2F2ZUZyZXEgPSB7IDIwOTEsIDB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDY0LCAud2F2ZUZyZXEgPSB7IDI1NTYsIDB9LCAzLCA0IH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDE2LCAud2F2ZUZyZXEgPSB7IDIwOTEsIDB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyAwIH0sICAgICAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAsICAgLndhdmVGcmVxID0geyAwIH0sICAgICAwLCAwIH0gfSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gMCwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0NBTExfU0lHTkFMX0lTRE5fU1BfUFJJCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDAsICAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH0gfSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gMCwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0NBTExfU0lHTkFMX0lTRE5fUEFUMworICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAzMiwgLndhdmVGcmVxID0geyAyMDkxLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNjQsIC53YXZlRnJlcSA9IHsgMjU1NiwgMCB9LCA0LCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwLCAud2F2ZUZyZXEgPSB7IDIwOTEsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwLCAgLndhdmVGcmVxID0geyAwIH0gICAgICAsIDAsIDAgfSB9LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSAwLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0NBTExfU0lHTkFMX0lTRE5fUElOR19SSU5HCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDAsICAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH0gfSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gMCwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9DQUxMX1NJR05BTF9JU0ROX1BBVDUKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMCwgIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfSB9LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSAwLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0NBTExfU0lHTkFMX0lTRE5fUEFUNgorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAwLCAgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9IH0sCisgICAgICAgICAgLnJlcGVhdENudCA9IDAsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfQ0FMTF9TSUdOQUxfSVNETl9QQVQ3CiAKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMzcwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDQwMDAsIDAgfSwgMzksIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA0MDAwLCB3YXZlRnJlcTogeyAwIH0sICAgICAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgICAgd2F2ZUZyZXE6IHsgMCB9LCAgICAgMCwgMCB9IH0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0hJR0hfTAotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAyNjAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMjkwMCwgMCB9LCAzOSwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDQwMDAsIHdhdmVGcmVxOiB7IDAgfSwgICAgIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwLCAgICB3YXZlRnJlcTogeyAwIH0sICAgICAwLCAwIH0gfSwKLSAgICAgICAgICByZXBlYXRDbnQ6IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfTUVEX0wKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMTMwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDE0NTAsIDAgfSwgMzksIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA0MDAwLCB3YXZlRnJlcTogeyAwIH0sICAgICAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgICAgd2F2ZUZyZXE6IHsgMCB9LCAgICAgMCwgMCB9IH0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0xPV19MCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDM3MDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyA0MDAwLCAwIH0sIDE1LCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNDAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSB9LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9ISUdIX1NTCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDI2MDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAyOTAwLCAwIH0sIDE1LCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNDAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX01FRF9TUwotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAxMzAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMTQ1MCwgMCB9LCAxNSwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDQwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9MT1dfU1MKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMzcwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDQwMDAsIDAgfSwgNywgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDIwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDM3MDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyA0MDAwLCAwIH0sIDcsIDMgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAzNzAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgNDAwMCwgMCB9LCAxNSwgNiB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDQwMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfSElHSF9TU0wKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMjYwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDI5MDAsIDAgfSwgNywgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDIwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDI2MDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAyOTAwLCAwIH0sIDcsIDMgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAyNjAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMjkwMCwgMCB9LCAxNSwgNiB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDQwMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfTUVEX1NTTAotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAxMzAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMTQ1MCwgMCB9LCA3LCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMTMwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDE0NTAsIDAgfSwgNywgMyB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDIwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDEzMDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAxNDUwLCAwIH0sIDE1LCA2IH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNDAwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9MT1dfU1NMCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDM3MDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyA0MDAwLCAwIH0sIDE5LCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMTAwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDM3MDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyA0MDAwLCAwIH0sIDE5LCAzIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMzAwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9ISUdIX1NTXzIKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMjYwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDI5MDAsIDAgfSwgMTksIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAxMDAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMjYwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDI5MDAsIDAgfSwgMTksIDMgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAzMDAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX01FRF9TU18yCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDEzMDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAxNDUwLCAwIH0sIDE5LCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMTAwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDEzMDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAxNDUwLCAwIH0sIDE5LCAzIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMzAwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9MT1dfU1NfMgotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAzNzAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgNDAwMCwgMCB9LCA5LCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNTAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMzcwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDQwMDAsIDAgfSwgMTksIDMgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA1MDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAzNzAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgNDAwMCwgMCB9LCA5LCA2IH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMzAwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9ISUdIX1NMUwotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAyNjAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMjkwMCwgMCB9LCA5LCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNTAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMjYwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDI5MDAsIDAgfSwgMTksIDMgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA1MDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAyNjAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMjkwMCwgMCB9LCA5LCA2IH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMzAwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9NRURfU0xTCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDEzMDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAxNDUwLCAwIH0sIDksIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA1MDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAxMzAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMTQ1MCwgMCB9LCAxOSwgMyB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDUwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDEzMDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAxNDUwLCAwIH0sIDksIDYgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAzMDAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0xPV19TTFMKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMzcwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDQwMDAsIDAgfSwgOSwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDUwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDM3MDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyA0MDAwLCAwIH0sIDksIDMgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA1MDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAzNzAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgNDAwMCwgMCB9LCA5LCA2IH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNTAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMzcwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDQwMDAsIDAgfSwgOSwgOSB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1MDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfSElHSF9TX1g0Ci0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDI2MDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAyOTAwLCAwIH0sIDksIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA1MDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAyNjAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMjkwMCwgMCB9LCA5LCAzIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNTAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMjYwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDI5MDAsIDAgfSwgOSwgNiB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDUwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDI2MDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAyOTAwLCAwIH0sIDksIDkgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNTAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX01FRF9TX1g0Ci0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDEzMDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAxNDUwLCAwIH0sIDksIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA1MDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAxMzAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMTQ1MCwgMCB9LCA5LCAzIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNTAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMTMwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDE0NTAsIDAgfSwgOSwgNiB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDUwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDEzMDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAxNDUwLCAwIH0sIDksIDkgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNTAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0xPV19TX1g0Ci0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDM3MDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyA0MDAwLCAwIH0sIDE5LCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjAwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9ISUdIX1BCWF9MCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDI2MDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAyOTAwLCAwIH0sIDE5LCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjAwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9NRURfUEJYX0wKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMTMwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDE0NTAsIDAgfSwgMTksIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyMDAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0xPV19QQlhfTAotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAzNzAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgNDAwMCwgMCB9LCA3LCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMzcwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDQwMDAsIDAgfSwgNywgMyB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDIwMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfSElHSF9QQlhfU1MKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMjYwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDI5MDAsIDAgfSwgNywgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDIwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDI2MDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAyOTAwLCAwIH0sIDcsIDMgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyMDAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX01FRF9QQlhfU1MKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMTMwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDE0NTAsIDAgfSwgNywgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDIwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDEzMDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAxNDUwLCAwIH0sIDcsIDMgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyMDAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0xPV19QQlhfU1MKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMzcwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDQwMDAsIDAgfSwgNywgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDIwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDM3MDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyA0MDAwLCAwIH0sIDcsIDMgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAzNzAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgNDAwMCwgMCB9LCAxNSwgNiB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDEwMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfSElHSF9QQlhfU1NMCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDI2MDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAyOTAwLCAwIH0sIDcsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAyNjAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMjkwMCwgMCB9LCA3LCAzIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMjYwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDI5MDAsIDAgfSwgMTUsIDYgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAxMDAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX01FRF9QQlhfU1NMCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDEzMDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAxNDUwLCAwIH0sIDcsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAxMzAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMTQ1MCwgMCB9LCA3LCAzIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMTMwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDE0NTAsIDAgfSwgMTUsIDYgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAxMDAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0xPV19QQlhfU1NMCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDM3MDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyA0MDAwLCAwIH0sIDcsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAzNzAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgNDAwMCwgMCB9LCAxNSwgMyB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDIwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDM3MDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyA0MDAwLCAwIH0sIDcsIDYgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAxMDAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0hJR0hfUEJYX1NMUwotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAyNjAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMjkwMCwgMCB9LCA3LCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMjYwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDI5MDAsIDAgfSwgMTUsIDMgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAyNjAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMjkwMCwgMCB9LCA3LCA2IH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMTAwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9NRURfUEJYX1NMUwotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAxMzAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMTQ1MCwgMCB9LCA3LCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMTMwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDE0NTAsIDAgfSwgMTUsIDMgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAxMzAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMTQ1MCwgMCB9LCA3LCA2IH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMTAwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9MT1dfUEJYX1NMUwotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAzNzAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgNDAwMCwgMCB9LCA3LCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMzcwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDQwMDAsIDAgfSwgNywgMyB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDIwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDM3MDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyA0MDAwLCAwIH0sIDcsIDYgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAzNzAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgNDAwMCwgMCB9LCA3LCA5IH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogODAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0hJR0hfUEJYX1NfWDQKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMjYwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDI5MDAsIDAgfSwgNywgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDIwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDI2MDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAyOTAwLCAwIH0sIDcsIDMgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAyNjAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMjkwMCwgMCB9LCA3LCA2IH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMjYwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDI5MDAsIDAgfSwgNywgOSB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDgwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9NRURfUEJYX1NfWDQKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMTMwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDE0NTAsIDAgfSwgNywgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDIwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDEzMDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAxNDUwLCAwIH0sIDcsIDMgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyMDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDI1LCB3YXZlRnJlcTogeyAxMzAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMTQ1MCwgMCB9LCA3LCA2IH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNSwgd2F2ZUZyZXE6IHsgMTMwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMjUsIHdhdmVGcmVxOiB7IDE0NTAsIDAgfSwgNywgOSB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDgwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9MT1dfUEJYX1NfWDQKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMzcwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDQwMDAsIDAgfSwgMzksIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNDAwMCwgLndhdmVGcmVxID0geyAwIH0sICAgICAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAsICAgIC53YXZlRnJlcSA9IHsgMCB9LCAgICAgMCwgMCB9IH0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9ISUdIX0wKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMjYwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDI5MDAsIDAgfSwgMzksIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNDAwMCwgLndhdmVGcmVxID0geyAwIH0sICAgICAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAsICAgIC53YXZlRnJlcSA9IHsgMCB9LCAgICAgMCwgMCB9IH0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9NRURfTAorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAxMzAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTQ1MCwgMCB9LCAzOSwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA0MDAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgICAgIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCwgICAgLndhdmVGcmVxID0geyAwIH0sICAgICAwLCAwIH0gfSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0xPV19MCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDM3MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyA0MDAwLCAwIH0sIDE1LCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDQwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSB9LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfSElHSF9TUworICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAyNjAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMjkwMCwgMCB9LCAxNSwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA0MDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfTUVEX1NTCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDEzMDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAxNDUwLCAwIH0sIDE1LCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDQwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9MT1dfU1MKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMzcwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDQwMDAsIDAgfSwgNywgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDM3MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyA0MDAwLCAwIH0sIDcsIDMgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAzNzAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgNDAwMCwgMCB9LCAxNSwgNiB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA0MDAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0hJR0hfU1NMCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDI2MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAyOTAwLCAwIH0sIDcsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAyNjAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMjkwMCwgMCB9LCA3LCAzIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMjYwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDI5MDAsIDAgfSwgMTUsIDYgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNDAwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9NRURfU1NMCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDEzMDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAxNDUwLCAwIH0sIDcsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAxMzAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTQ1MCwgMCB9LCA3LCAzIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTMwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDE0NTAsIDAgfSwgMTUsIDYgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNDAwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9MT1dfU1NMCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDM3MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDQwMDAsIDAgfSwgMTksIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMTAwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMzcwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDQwMDAsIDAgfSwgMTksIDMgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMzAwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9ISUdIX1NTXzIKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMjYwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDI5MDAsIDAgfSwgMTksIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMTAwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMjYwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDI5MDAsIDAgfSwgMTksIDMgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMzAwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9NRURfU1NfMgorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAxMzAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTQ1MCwgMCB9LCAxOSwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAxMDAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAxMzAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTQ1MCwgMCB9LCAxOSwgMyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAzMDAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0xPV19TU18yCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDM3MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyA0MDAwLCAwIH0sIDksIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNTAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAzNzAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgNDAwMCwgMCB9LCAxOSwgMyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA1MDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDM3MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyA0MDAwLCAwIH0sIDksIDYgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMzAwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9ISUdIX1NMUworICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAyNjAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMjkwMCwgMCB9LCA5LCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDUwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMjYwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDI5MDAsIDAgfSwgMTksIDMgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNTAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAyNjAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMjkwMCwgMCB9LCA5LCA2IH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDMwMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfTUVEX1NMUworICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAxMzAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTQ1MCwgMCB9LCA5LCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDUwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTMwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDE0NTAsIDAgfSwgMTksIDMgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNTAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAxMzAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTQ1MCwgMCB9LCA5LCA2IH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDMwMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfTE9XX1NMUworICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAzNzAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgNDAwMCwgMCB9LCA5LCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDUwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMzcwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDQwMDAsIDAgfSwgOSwgMyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA1MDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDM3MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyA0MDAwLCAwIH0sIDksIDYgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNTAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAzNzAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgNDAwMCwgMCB9LCA5LCA5IH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1MDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfSElHSF9TX1g0CisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDI2MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAyOTAwLCAwIH0sIDksIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNTAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAyNjAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMjkwMCwgMCB9LCA5LCAzIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDUwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMjYwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDI5MDAsIDAgfSwgOSwgNiB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA1MDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDI2MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAyOTAwLCAwIH0sIDksIDkgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9NRURfU19YNAorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAxMzAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTQ1MCwgMCB9LCA5LCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDUwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTMwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDE0NTAsIDAgfSwgOSwgMyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA1MDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDEzMDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAxNDUwLCAwIH0sIDksIDYgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNTAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAxMzAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTQ1MCwgMCB9LCA5LCA5IH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1MDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfTE9XX1NfWDQKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMzcwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDQwMDAsIDAgfSwgMTksIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjAwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9ISUdIX1BCWF9MCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDI2MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAyOTAwLCAwIH0sIDE5LCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfTUVEX1BCWF9MCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDEzMDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAxNDUwLCAwIH0sIDE5LCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfTE9XX1BCWF9MCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDM3MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyA0MDAwLCAwIH0sIDcsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAzNzAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgNDAwMCwgMCB9LCA3LCAzIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfSElHSF9QQlhfU1MKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMjYwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDI5MDAsIDAgfSwgNywgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDI2MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAyOTAwLCAwIH0sIDcsIDMgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjAwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9NRURfUEJYX1NTCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDEzMDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAxNDUwLCAwIH0sIDcsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAxMzAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTQ1MCwgMCB9LCA3LCAzIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfTE9XX1BCWF9TUworICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAzNzAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgNDAwMCwgMCB9LCA3LCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMzcwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDQwMDAsIDAgfSwgNywgMyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDM3MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyA0MDAwLCAwIH0sIDE1LCA2IH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDEwMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfSElHSF9QQlhfU1NMCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDI2MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAyOTAwLCAwIH0sIDcsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAyNjAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMjkwMCwgMCB9LCA3LCAzIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMjYwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDI5MDAsIDAgfSwgMTUsIDYgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMTAwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9NRURfUEJYX1NTTAorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAxMzAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTQ1MCwgMCB9LCA3LCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTMwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDE0NTAsIDAgfSwgNywgMyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDEzMDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAxNDUwLCAwIH0sIDE1LCA2IH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDEwMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfTE9XX1BCWF9TU0wKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMzcwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDQwMDAsIDAgfSwgNywgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDM3MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyA0MDAwLCAwIH0sIDE1LCAzIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMzcwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDQwMDAsIDAgfSwgNywgNiB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAxMDAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0hJR0hfUEJYX1NMUworICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAyNjAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMjkwMCwgMCB9LCA3LCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMjYwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDI5MDAsIDAgfSwgMTUsIDMgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAyNjAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMjkwMCwgMCB9LCA3LCA2IH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDEwMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfTUVEX1BCWF9TTFMKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTMwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDE0NTAsIDAgfSwgNywgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDEzMDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAxNDUwLCAwIH0sIDE1LCAzIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTMwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDE0NTAsIDAgfSwgNywgNiB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAxMDAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9fSwKKyAgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9MT1dfUEJYX1NMUworICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAzNzAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgNDAwMCwgMCB9LCA3LCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMzcwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDQwMDAsIDAgfSwgNywgMyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDM3MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyA0MDAwLCAwIH0sIDcsIDYgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAzNzAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgNDAwMCwgMCB9LCA3LCA5IH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDgwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9ISUdIX1BCWF9TX1g0CisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDI2MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAyOTAwLCAwIH0sIDcsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAyNjAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMjkwMCwgMCB9LCA3LCAzIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMjYwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDI5MDAsIDAgfSwgNywgNiB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDI2MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAyOTAwLCAwIH0sIDcsIDkgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gODAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX01FRF9QQlhfU19YNAorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAxMzAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTQ1MCwgMCB9LCA3LCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTMwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDE0NTAsIDAgfSwgNywgMyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDI1LCAud2F2ZUZyZXEgPSB7IDEzMDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAxNDUwLCAwIH0sIDcsIDYgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyNSwgLndhdmVGcmVxID0geyAxMzAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUsIC53YXZlRnJlcSA9IHsgMTQ1MCwgMCB9LCA3LCA5IH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDgwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9MT1dfUEJYX1NfWDQKIAotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDYyLCB3YXZlRnJlcTogeyAxMTA5LCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA2Miwgd2F2ZUZyZXE6IHsgNzg0LCAwIH0sICAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNjIsIHdhdmVGcmVxOiB7IDc0MCwgMCB9LCAgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDYyLCB3YXZlRnJlcTogeyA2MjIsIDAgfSwgIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA2Miwgd2F2ZUZyZXE6IHsgMTEwOSwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgIHdhdmVGcmVxOiB7IDAgfSwgICAgICAgMCwgMCB9IH0sCi0gICAgICAgICAgcmVwZWF0Q250OiAwLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0FMRVJUX05FVFdPUktfTElURQotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDYyLCB3YXZlRnJlcTogeyAxMjQ1LCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA2Miwgd2F2ZUZyZXE6IHsgNjU5LCAwIH0sICAyLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNjIsIHdhdmVGcmVxOiB7IDEyNDUsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAsICB3YXZlRnJlcTogeyAwIH0sICAgICAgIDAsIDAgfSB9LAotICAgICAgICAgIHJlcGVhdENudDogMCwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9BTEVSVF9BVVRPUkVESUFMX0xJVEUKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiA0MDAsIHdhdmVGcmVxOiB7IDExNTAsIDc3MCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgICB3YXZlRnJlcTogeyAwIH0sICAgICAgICAgICAgMCwgMCB9IH0sCi0gICAgICAgICAgcmVwZWF0Q250OiAwLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX09ORV9NSU5fQkVFUAotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDEyMCwgd2F2ZUZyZXE6IHsgOTQxLCAxNDc3LCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwLCAgIHdhdmVGcmVxOiB7IDAgfSwgICAgICAgICAgICAwLCAwIH0gfSwKLSAgICAgICAgICByZXBlYXRDbnQ6IDAsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfS0VZUEFEX1ZPTFVNRV9LRVlfTElURQotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDM3NSwgd2F2ZUZyZXE6IHsgNTg3LCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAxMjUsIHdhdmVGcmVxOiB7IDExNzUsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAsICAgd2F2ZUZyZXE6IHsgMCB9LCAgICAgICAwLCAwIH0gfSwKLSAgICAgICAgICByZXBlYXRDbnQ6IDAsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfUFJFU1NIT0xES0VZX0xJVEUKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiA2Miwgd2F2ZUZyZXE6IHsgNTg3LCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA2Miwgd2F2ZUZyZXE6IHsgNzg0LCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA2Miwgd2F2ZUZyZXE6IHsgODMxLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA2Miwgd2F2ZUZyZXE6IHsgNzg0LCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA2Miwgd2F2ZUZyZXE6IHsgMTEwOSwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNjIsIHdhdmVGcmVxOiB7IDc4NCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNjIsIHdhdmVGcmVxOiB7IDgzMSwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNjIsIHdhdmVGcmVxOiB7IDc4NCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgIHdhdmVGcmVxOiB7IDAgfSwgICAgICAwLCAwIH0gfSwKLSAgICAgICAgICByZXBlYXRDbnQ6IDAsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0FMRVJUX0lOQ0FMTF9MSVRFCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMTI1LCB3YXZlRnJlcTogeyA5NDEsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDEwLCAgd2F2ZUZyZXE6IHsgMCB9LCAgICAgIDIsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA0OTkwLCB3YXZlRnJlcTogeyAwIH0sICAgICAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgICAgd2F2ZUZyZXE6IHsgMCB9LCAgICAgMCwgMCB9IH0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9FTUVSR0VOQ1lfUklOR0JBQ0sKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAxMjUsIHdhdmVGcmVxOiB7IDEzMTksIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDEyNSwgd2F2ZUZyZXE6IHsgMCB9LCAgICAgICAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgICB3YXZlRnJlcTogeyAwIH0sICAgICAgIDAsIDAgfSB9LAotICAgICAgICAgIHJlcGVhdENudDogMiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9BTEVSVF9DQUxMX0dVQVJECi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMTI1LCB3YXZlRnJlcTogeyAxMDQ3LCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAxMjUsIHdhdmVGcmVxOiB7IDM3MCwgIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAsICAgd2F2ZUZyZXE6IHsgMCB9LCAgICAgICAwLCAwIH0gfSwKLSAgICAgICAgICByZXBlYXRDbnQ6IDAsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfU09GVF9FUlJPUl9MSVRFCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMTI1LCB3YXZlRnJlcTogeyAxNDgwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAxMjUsIHdhdmVGcmVxOiB7IDEzOTcsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDEyNSwgd2F2ZUZyZXE6IHsgNzg0LCAwIH0sICAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCwgICB3YXZlRnJlcTogeyAwIH0sICAgICAgIDAsIDAgfSB9LAotICAgICAgICAgIHJlcGVhdENudDogMCwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9DQUxMRFJPUF9MSVRFCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDYyLCAud2F2ZUZyZXEgPSB7IDExMDksIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA2MiwgLndhdmVGcmVxID0geyA3ODQsIDAgfSwgIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNjIsIC53YXZlRnJlcSA9IHsgNzQwLCAwIH0sICAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDYyLCAud2F2ZUZyZXEgPSB7IDYyMiwgMCB9LCAgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA2MiwgLndhdmVGcmVxID0geyAxMTA5LCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCwgIC53YXZlRnJlcSA9IHsgMCB9LCAgICAgICAwLCAwIH0gfSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gMCwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0FMRVJUX05FVFdPUktfTElURQorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSA2MiwgLndhdmVGcmVxID0geyAxMjQ1LCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNjIsIC53YXZlRnJlcSA9IHsgNjU5LCAwIH0sICAyLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDYyLCAud2F2ZUZyZXEgPSB7IDEyNDUsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwLCAgLndhdmVGcmVxID0geyAwIH0sICAgICAgIDAsIDAgfSB9LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSAwLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfQUxFUlRfQVVUT1JFRElBTF9MSVRFCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDQwMCwgLndhdmVGcmVxID0geyAxMTUwLCA3NzAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwLCAgIC53YXZlRnJlcSA9IHsgMCB9LCAgICAgICAgICAgIDAsIDAgfSB9LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSAwLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfT05FX01JTl9CRUVQCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDEyMCwgLndhdmVGcmVxID0geyA5NDEsIDE0NzcsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwLCAgIC53YXZlRnJlcSA9IHsgMCB9LCAgICAgICAgICAgIDAsIDAgfSB9LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSAwLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfS0VZUEFEX1ZPTFVNRV9LRVlfTElURQorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAzNzUsIC53YXZlRnJlcSA9IHsgNTg3LCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMTI1LCAud2F2ZUZyZXEgPSB7IDExNzUsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwLCAgIC53YXZlRnJlcSA9IHsgMCB9LCAgICAgICAwLCAwIH0gfSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gMCwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX1BSRVNTSE9MREtFWV9MSVRFCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDYyLCAud2F2ZUZyZXEgPSB7IDU4NywgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDYyLCAud2F2ZUZyZXEgPSB7IDc4NCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDYyLCAud2F2ZUZyZXEgPSB7IDgzMSwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDYyLCAud2F2ZUZyZXEgPSB7IDc4NCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDYyLCAud2F2ZUZyZXEgPSB7IDExMDksIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA2MiwgLndhdmVGcmVxID0geyA3ODQsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA2MiwgLndhdmVGcmVxID0geyA4MzEsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA2MiwgLndhdmVGcmVxID0geyA3ODQsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwLCAgLndhdmVGcmVxID0geyAwIH0sICAgICAgMCwgMCB9IH0sCisgICAgICAgICAgLnJlcGVhdENudCA9IDAsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfQUxFUlRfSU5DQUxMX0xJVEUKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMTI1LCAud2F2ZUZyZXEgPSB7IDk0MSwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDEwLCAgLndhdmVGcmVxID0geyAwIH0sICAgICAgMiwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA0OTkwLCAud2F2ZUZyZXEgPSB7IDAgfSwgICAgIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCwgICAgLndhdmVGcmVxID0geyAwIH0sICAgICAwLCAwIH0gfSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9FTUVSR0VOQ1lfUklOR0JBQ0sKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMTI1LCAud2F2ZUZyZXEgPSB7IDEzMTksIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAxMjUsIC53YXZlRnJlcSA9IHsgMCB9LCAgICAgICAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAsICAgLndhdmVGcmVxID0geyAwIH0sICAgICAgIDAsIDAgfSB9LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSAyLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfQUxFUlRfQ0FMTF9HVUFSRAorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAxMjUsIC53YXZlRnJlcSA9IHsgMTA0NywgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDEyNSwgLndhdmVGcmVxID0geyAzNzAsICAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCwgICAud2F2ZUZyZXEgPSB7IDAgfSwgICAgICAgMCwgMCB9IH0sCisgICAgICAgICAgLnJlcGVhdENudCA9IDAsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9TT0ZUX0VSUk9SX0xJVEUKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMTI1LCAud2F2ZUZyZXEgPSB7IDE0ODAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAxMjUsIC53YXZlRnJlcSA9IHsgMTM5NywgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDEyNSwgLndhdmVGcmVxID0geyA3ODQsIDAgfSwgIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCwgICAud2F2ZUZyZXEgPSB7IDAgfSwgICAgICAgMCwgMCB9IH0sCisgICAgICAgICAgLnJlcGVhdENudCA9IDAsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9DQUxMRFJPUF9MSVRFCiAKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiA1MDAsIHdhdmVGcmVxOiB7IDQyNSwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNTAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiAwLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfTkVUV09SS19CVVNZX09ORV9TSE9UCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogNDAwLCB3YXZlRnJlcTogeyAxMTUwLCA3NzAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IDAsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9BQkJSX0FMRVJUCi0gICAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiAwLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX1NJR05BTF9PRkYKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gNTAwLCAud2F2ZUZyZXEgPSB7IDQyNSwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDUwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IDAsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX05FVFdPUktfQlVTWV9PTkVfU0hPVAorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSA0MDAsIC53YXZlRnJlcSA9IHsgMTE1MCwgNzcwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IDAsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0FCQlJfQUxFUlQKKyAgICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gMCwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX1NJR05BTF9PRkYKIAotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLCB3YXZlRnJlcTogeyAzNTAsIDQ0MCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQU5TSV9ESUFMCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogNTAwLCB3YXZlRnJlcTogeyA0ODAsIDYyMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNTAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9BTlNJX0JVU1kKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAyNTAsIHdhdmVGcmVxOiB7IDQ4MCwgNjIwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyNTAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAgLCB3YXZlRnJlcTogeyAwIH0sIDAsIDB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0FOU0lfQ09OR0VTVElPTgotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IDMwMCwgd2F2ZUZyZXE6IHsgNDQwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA5NzAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAxMDAsIHdhdmVGcmVxOiB7IDQ0MCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMTAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAxMDAsIHdhdmVGcmVxOiB7IDQ0MCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMSB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQU5TSV9DQUxMX1dBSVRJTkcKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiAyMDAwLCB3YXZlRnJlcTogeyA0NDAsIDQ4MCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNDAwMCwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogMCAsIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH19LAotICAgICAgICAgIHJlcGVhdENudDogVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCi0gICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQU5TSV9SSU5HVE9ORQotICAgICAgICB7IHNlZ21lbnRzOiB7IHsgZHVyYXRpb246IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLCB3YXZlRnJlcTogeyA0MDAsIDAgfSwgMCwgMCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAgLCB3YXZlRnJlcTogeyAwIH0sIDAsIDB9fSwKLSAgICAgICAgICByZXBlYXRDbnQ6IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAotICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0pBUEFOX0RJQUwKLSAgICAgICAgeyBzZWdtZW50czogeyB7IGR1cmF0aW9uOiA1MDAsIHdhdmVGcmVxOiB7IDQwMCwgMCB9LCAwLCAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyBkdXJhdGlvbjogNTAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9KQVBBTl9CVVNZCi0gICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMTAwMCwgd2F2ZUZyZXE6IHsgNDAwLCAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyMDAwLCB3YXZlRnJlcTogeyAwIH0sIDAsIDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAwICwgd2F2ZUZyZXE6IHsgMCB9LCAwLCAwfX0sCi0gICAgICAgICAgcmVwZWF0Q250OiBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKLSAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9KQVBBTl9SQURJT19BQ0sKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsIC53YXZlRnJlcSA9IHsgMzUwLCA0NDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9BTlNJX0RJQUwKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gNTAwLCAud2F2ZUZyZXEgPSB7IDQ4MCwgNjIwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNTAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9BTlNJX0JVU1kKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMjUwLCAud2F2ZUZyZXEgPSB7IDQ4MCwgNjIwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjUwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9BTlNJX0NPTkdFU1RJT04KKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMzAwLCAud2F2ZUZyZXEgPSB7IDQ0MCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDk3MDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDEwMCwgLndhdmVGcmVxID0geyA0NDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAxMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDEwMCwgLndhdmVGcmVxID0geyA0NDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAxIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9BTlNJX0NBTExfV0FJVElORworICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAyMDAwLCAud2F2ZUZyZXEgPSB7IDQ0MCwgNDgwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNDAwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQU5TSV9SSU5HVE9ORQorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwgLndhdmVGcmVxID0geyA0MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9KQVBBTl9ESUFMCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDUwMCwgLndhdmVGcmVxID0geyA0MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA1MDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0pBUEFOX0JVU1kKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMTAwMCwgLndhdmVGcmVxID0geyA0MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMDAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9KQVBBTl9SQURJT19BQ0sKIAogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5jcHAKaW5kZXggNjdkNDEzOS4uZjZjYWIzOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5jcHAKQEAgLTE3Miw3ICsxNzIsNyBAQAogewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKHNTZXJ2aWNlTG9jayk7CiAgICAgaWYgKHNTZXJ2aWNlICE9IDApIHsKLSAgICAgICAgc1NlcnZpY2UtPmFzQmluZGVyKCktPnVubGlua1RvRGVhdGgodGhpcyk7CisgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKHNTZXJ2aWNlKS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcAppbmRleCAzNTdlZjg1Li5hYzA0N2M5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwCkBAIC04MzUsNTMgKzgzNSwxMiBAQAogICAgIH0KIH0KIAotLypzdGF0aWMqLyBzdGF0dXNfdCBNZWRpYVBsYXllcjo6ZGVjb2RlKAotICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAotICAgICAgICBjb25zdCBjaGFyKiB1cmwsCi0gICAgICAgIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwKLSAgICAgICAgaW50KiBwTnVtQ2hhbm5lbHMsCi0gICAgICAgIGF1ZGlvX2Zvcm1hdF90KiBwRm9ybWF0LAotICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsCi0gICAgICAgIHNpemVfdCAqcFNpemUpCi17Ci0gICAgQUxPR1YoImRlY29kZSglcykiLCB1cmwpOwotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBjb25zdCBzcDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPiBzZXJ2aWNlID0gZ2V0TWVkaWFQbGF5ZXJTZXJ2aWNlKCk7Ci0gICAgaWYgKHNlcnZpY2UgIT0gMCkgewotICAgICAgICBzdGF0dXMgPSBzZXJ2aWNlLT5kZWNvZGUoaHR0cFNlcnZpY2UsIHVybCwgcFNhbXBsZVJhdGUsIHBOdW1DaGFubmVscywgcEZvcm1hdCwgaGVhcCwgcFNpemUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJVbmFibGUgdG8gbG9jYXRlIG1lZGlhIHNlcnZpY2UiKTsKLSAgICAgICAgc3RhdHVzID0gREVBRF9PQkpFQ1Q7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci0KLX0KLQogdm9pZCBNZWRpYVBsYXllcjo6ZGllZCgpCiB7CiAgICAgQUxPR1YoImRpZWQiKTsKICAgICBub3RpZnkoTUVESUFfRVJST1IsIE1FRElBX0VSUk9SX1NFUlZFUl9ESUVELCAwKTsKIH0KIAotLypzdGF0aWMqLyBzdGF0dXNfdCBNZWRpYVBsYXllcjo6ZGVjb2RlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwgaW50KiBwTnVtQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwLCBzaXplX3QgKnBTaXplKQotewotICAgIEFMT0dWKCJkZWNvZGUoJWQsICUiIFBSSWQ2NCAiLCAlIiBQUklkNjQgIikiLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOwotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBjb25zdCBzcDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPiBzZXJ2aWNlID0gZ2V0TWVkaWFQbGF5ZXJTZXJ2aWNlKCk7Ci0gICAgaWYgKHNlcnZpY2UgIT0gMCkgewotICAgICAgICBzdGF0dXMgPSBzZXJ2aWNlLT5kZWNvZGUoZmQsIG9mZnNldCwgbGVuZ3RoLCBwU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOdW1DaGFubmVscywgcEZvcm1hdCwgaGVhcCwgcFNpemUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJVbmFibGUgdG8gbG9jYXRlIG1lZGlhIHNlcnZpY2UiKTsKLSAgICAgICAgc3RhdHVzID0gREVBRF9PQkpFQ1Q7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci0KLX0KLQogc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OnNldE5leHRNZWRpYVBsYXllcihjb25zdCBzcDxNZWRpYVBsYXllcj4mIG5leHQpIHsKICAgICBpZiAobVBsYXllciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQubWsgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5tawppbmRleCAyY2Y1NzEwLi45ZDhmZTYyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5tawpAQCAtMTUsOCArMTUsNiBAQAogICAgIE1lZGlhUGxheWVyU2VydmljZS5jcHAgICAgICBcCiAgICAgTWVkaWFSZWNvcmRlckNsaWVudC5jcHAgICAgIFwKICAgICBNZXRhZGF0YVJldHJpZXZlckNsaWVudC5jcHAgXAotICAgIE1pZGlGaWxlLmNwcCAgICAgICAgICAgICAgICBcCi0gICAgTWlkaU1ldGFkYXRhUmV0cmlldmVyLmNwcCAgIFwKICAgICBSZW1vdGVEaXNwbGF5LmNwcCAgICAgICAgICAgXAogICAgIFNoYXJlZExpYnJhcnkuY3BwICAgICAgICAgICBcCiAgICAgU3RhZ2VmcmlnaHRQbGF5ZXIuY3BwICAgICAgIFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9Ecm0uY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RybS5jcHAKaW5kZXggYWM5NDhhNi4uOWQ1YmExNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RybS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RybS5jcHAKQEAgLTg1LDEwICs4NSwxMCBAQAogewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1FdmVudExvY2spOwogICAgIGlmIChtTGlzdGVuZXIgIT0gTlVMTCl7Ci0gICAgICAgIG1MaXN0ZW5lci0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUxpc3RlbmVyKS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKICAgICB9CiAgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKLSAgICAgICAgbGlzdGVuZXItPmFzQmluZGVyKCktPmxpbmtUb0RlYXRoKHRoaXMpOworICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihsaXN0ZW5lciktPmxpbmtUb0RlYXRoKHRoaXMpOwogICAgIH0KICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKICAgICByZXR1cm4gTk9fRVJST1I7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllckZhY3RvcnkuY3BwCmluZGV4IGFlZWZiNGMuLjQ4ODg0YjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllckZhY3RvcnkuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllckZhY3RvcnkuY3BwCkBAIC0xNSw2ICsxNSw3IEBACiAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCiAKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiTWVkaWFQbGF5ZXJGYWN0b3J5IgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCkBAIC0yOSw3ICszMCw2IEBACiAKICNpbmNsdWRlICJNZWRpYVBsYXllckZhY3RvcnkuaCIKIAotI2luY2x1ZGUgIk1pZGlGaWxlLmgiCiAjaW5jbHVkZSAiVGVzdFBsYXllclN0dWIuaCIKICNpbmNsdWRlICJTdGFnZWZyaWdodFBsYXllci5oIgogI2luY2x1ZGUgIm51cGxheWVyL051UGxheWVyRHJpdmVyLmgiCkBAIC0yNzksNzUgKzI3OSw2IEBACiAgICAgfQogfTsKIAotY2xhc3MgU29uaXZveFBsYXllckZhY3RvcnkgOiBwdWJsaWMgTWVkaWFQbGF5ZXJGYWN0b3J5OjpJRmFjdG9yeSB7Ci0gIHB1YmxpYzoKLSAgICB2aXJ0dWFsIGZsb2F0IHNjb3JlRmFjdG9yeShjb25zdCBzcDxJTWVkaWFQbGF5ZXI+JiAvKmNsaWVudCovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjdXJTY29yZSkgewotICAgICAgICBzdGF0aWMgY29uc3QgZmxvYXQga091clNjb3JlID0gMC40OwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciogY29uc3QgRklMRV9FWFRTW10gPSB7ICIubWlkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLm1pZGkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuc21mIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLnhtZiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5teG1mIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLmlteSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5ydHR0bCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5ydHgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIub3RhIiB9OwotICAgICAgICBpZiAoa091clNjb3JlIDw9IGN1clNjb3JlKQotICAgICAgICAgICAgcmV0dXJuIDAuMDsKLQotICAgICAgICAvLyB1c2UgTWlkaUZpbGUgZm9yIE1JREkgZXh0ZW5zaW9ucwotICAgICAgICBpbnQgbGVuVVJMID0gc3RybGVuKHVybCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkVMRU0oRklMRV9FWFRTKTsgKytpKSB7Ci0gICAgICAgICAgICBpbnQgbGVuID0gc3RybGVuKEZJTEVfRVhUU1tpXSk7Ci0gICAgICAgICAgICBpbnQgc3RhcnQgPSBsZW5VUkwgLSBsZW47Ci0gICAgICAgICAgICBpZiAoc3RhcnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCh1cmwgKyBzdGFydCwgRklMRV9FWFRTW2ldLCBsZW4pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBrT3VyU2NvcmU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIDAuMDsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGZsb2F0IHNjb3JlRmFjdG9yeShjb25zdCBzcDxJTWVkaWFQbGF5ZXI+JiAvKmNsaWVudCovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjdXJTY29yZSkgewotICAgICAgICBzdGF0aWMgY29uc3QgZmxvYXQga091clNjb3JlID0gMC44OwotCi0gICAgICAgIGlmIChrT3VyU2NvcmUgPD0gY3VyU2NvcmUpCi0gICAgICAgICAgICByZXR1cm4gMC4wOwotCi0gICAgICAgIC8vIFNvbWUga2luZCBvZiBNSURJPwotICAgICAgICBFQVNfREFUQV9IQU5ETEUgZWFzZGF0YTsKLSAgICAgICAgaWYgKEVBU19Jbml0KCZlYXNkYXRhKSA9PSBFQVNfU1VDQ0VTUykgewotICAgICAgICAgICAgRUFTX0ZJTEUgbG9jYXRvcjsKLSAgICAgICAgICAgIGxvY2F0b3IucGF0aCA9IE5VTEw7Ci0gICAgICAgICAgICBsb2NhdG9yLmZkID0gZmQ7Ci0gICAgICAgICAgICBsb2NhdG9yLm9mZnNldCA9IG9mZnNldDsKLSAgICAgICAgICAgIGxvY2F0b3IubGVuZ3RoID0gbGVuZ3RoOwotICAgICAgICAgICAgRUFTX0hBTkRMRSAgZWFzaGFuZGxlOwotICAgICAgICAgICAgaWYgKEVBU19PcGVuRmlsZShlYXNkYXRhLCAmbG9jYXRvciwgJmVhc2hhbmRsZSkgPT0gRUFTX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICBFQVNfQ2xvc2VGaWxlKGVhc2RhdGEsIGVhc2hhbmRsZSk7Ci0gICAgICAgICAgICAgICAgRUFTX1NodXRkb3duKGVhc2RhdGEpOwotICAgICAgICAgICAgICAgIHJldHVybiBrT3VyU2NvcmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBFQVNfU2h1dGRvd24oZWFzZGF0YSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gMC4wOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3A8TWVkaWFQbGF5ZXJCYXNlPiBjcmVhdGVQbGF5ZXIoKSB7Ci0gICAgICAgIEFMT0dWKCIgY3JlYXRlIE1pZGlGaWxlIik7Ci0gICAgICAgIHJldHVybiBuZXcgTWlkaUZpbGUoKTsKLSAgICB9Ci19OwotCiBjbGFzcyBUZXN0UGxheWVyRmFjdG9yeSA6IHB1YmxpYyBNZWRpYVBsYXllckZhY3Rvcnk6OklGYWN0b3J5IHsKICAgcHVibGljOgogICAgIHZpcnR1YWwgZmxvYXQgc2NvcmVGYWN0b3J5KGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIC8qY2xpZW50Ki8sCkBAIC0zNzQsNyArMzA1LDYgQEAKIAogICAgIHJlZ2lzdGVyRmFjdG9yeV9sKG5ldyBTdGFnZWZyaWdodFBsYXllckZhY3RvcnkoKSwgU1RBR0VGUklHSFRfUExBWUVSKTsKICAgICByZWdpc3RlckZhY3RvcnlfbChuZXcgTnVQbGF5ZXJGYWN0b3J5KCksIE5VX1BMQVlFUik7Ci0gICAgcmVnaXN0ZXJGYWN0b3J5X2wobmV3IFNvbml2b3hQbGF5ZXJGYWN0b3J5KCksIFNPTklWT1hfUExBWUVSKTsKICAgICByZWdpc3RlckZhY3RvcnlfbChuZXcgVGVzdFBsYXllckZhY3RvcnkoKSwgVEVTVF9QTEFZRVIpOwogCiAgICAgc0luaXRDb21wbGV0ZSA9IHRydWU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCmluZGV4IGU5NWY2ZmQuLmRkMGJiNGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCkBAIC01OSw2ICs1OSw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BdWRpb1BsYXllci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmg+CiAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIApAQCAtNzAsNyArNzEsNiBAQAogI2luY2x1ZGUgIk1ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmgiCiAjaW5jbHVkZSAiTWVkaWFQbGF5ZXJGYWN0b3J5LmgiCiAKLSNpbmNsdWRlICJNaWRpRmlsZS5oIgogI2luY2x1ZGUgIlRlc3RQbGF5ZXJTdHViLmgiCiAjaW5jbHVkZSAiU3RhZ2VmcmlnaHRQbGF5ZXIuaCIKICNpbmNsdWRlICJudXBsYXllci9OdVBsYXllckRyaXZlci5oIgpAQCAtMjQ5LDYgKzI0OSw5IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorZXh0ZXJuIEFMb29wZXJSb3N0ZXIgZ0xvb3BlclJvc3RlcjsKKworCiBzdGF0aWMgYm9vbCBjaGVja1Blcm1pc3Npb24oY29uc3QgY2hhciogcGVybWlzc2lvblN0cmluZykgewogI2lmbmRlZiBIQVZFX0FORFJPSURfT1MKICAgICByZXR1cm4gdHJ1ZTsKQEAgLTM4NiwyOCArMzg5LDYgQEAKICAgICByZXR1cm4gbmV3IFJlbW90ZURpc3BsYXkoY2xpZW50LCBpZmFjZS5zdHJpbmcoKSk7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9DYWNoZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIC8qYXJncyovKSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgcmVzdWx0LmFwcGVuZCgiIEF1ZGlvQ2FjaGVcbiIpOwotICAgIGlmIChtSGVhcCAhPSAwKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAiICBoZWFwIGJhc2UoJXApLCBzaXplKCV6dSksIGZsYWdzKCVkKVxuIiwKLSAgICAgICAgICAgICAgICBtSGVhcC0+Z2V0QmFzZSgpLCBtSGVhcC0+Z2V0U2l6ZSgpLCBtSGVhcC0+Z2V0RmxhZ3MoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB9Ci0gICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIG1zZWMgcGVyIGZyYW1lKCVmKSwgY2hhbm5lbCBjb3VudCglZCksIGZvcm1hdCglZCksIGZyYW1lIGNvdW50KCV6ZClcbiIsCi0gICAgICAgICAgICBtTXNlY3NQZXJGcmFtZSwgbUNoYW5uZWxDb3VudCwgbUZvcm1hdCwgbUZyYW1lQ291bnQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgc2FtcGxlIHJhdGUoJWQpLCBzaXplKCVkKSwgZXJyb3IoJWQpLCBjb21tYW5kIGNvbXBsZXRlKCVzKVxuIiwKLSAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtU2l6ZSwgbUVycm9yLCBtQ29tbWFuZENvbXBsZXRlPyJ0cnVlIjoiZmFsc2UiKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgOjp3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KIHN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdAogewogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwpAQCAtNDUyLDYgKzQzMywxMCBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAorLyoqCisgKiBUaGUgb25seSBhcmd1bWVudHMgdGhpcyB1bmRlcnN0YW5kcyByaWdodCBub3cgYXJlIC1jLCAtdm9uIGFuZCAtdm9mZiwKKyAqIHdoaWNoIGFyZSBwYXJzZWQgYnkgQUxvb3BlclJvc3Rlcjo6ZHVtcCgpCisgKi8KIHN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CkBAIC00ODUsNyArNDcwLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiBGaWxlcyBvcGVuZWQgYW5kL29yIG1hcHBlZDpcbiIpOwotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIvcHJvYy8lZC9tYXBzIiwgZ2V0dGlkKCkpOworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIvcHJvYy8lZC9tYXBzIiwgZ2V0cGlkKCkpOwogICAgICAgICBGSUxFICpmID0gZm9wZW4oYnVmZmVyLCAiciIpOwogICAgICAgICBpZiAoZikgewogICAgICAgICAgICAgd2hpbGUgKCFmZW9mKGYpKSB7CkBAIC01MDUsMTMgKzQ5MCwxMyBAQAogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKICAgICAgICAgfQogCi0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi9wcm9jLyVkL2ZkIiwgZ2V0dGlkKCkpOworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIvcHJvYy8lZC9mZCIsIGdldHBpZCgpKTsKICAgICAgICAgRElSICpkID0gb3BlbmRpcihidWZmZXIpOwogICAgICAgICBpZiAoZCkgewogICAgICAgICAgICAgc3RydWN0IGRpcmVudCAqZW50OwogICAgICAgICAgICAgd2hpbGUoKGVudCA9IHJlYWRkaXIoZCkpICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBpZiAoc3RyY21wKGVudC0+ZF9uYW1lLCIuIikgJiYgc3RyY21wKGVudC0+ZF9uYW1lLCIuLiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi9wcm9jLyVkL2ZkLyVzIiwgZ2V0dGlkKCksIGVudC0+ZF9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiL3Byb2MvJWQvZmQvJXMiLCBnZXRwaWQoKSwgZW50LT5kX25hbWUpOwogICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3RhdCBzOwogICAgICAgICAgICAgICAgICAgICBpZiAobHN0YXQoYnVmZmVyLCAmcykgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzLnN0X21vZGUgJiBTX0lGTVQpID09IFNfSUZMTkspIHsKQEAgLTU1Miw2ICs1MzcsOCBAQAogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKICAgICAgICAgfQogCisgICAgICAgIGdMb29wZXJSb3N0ZXIuZHVtcChmZCwgYXJncyk7CisKICAgICAgICAgYm9vbCBkdW1wTWVtID0gZmFsc2U7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJncy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgaWYgKGFyZ3NbaV0gPT0gU3RyaW5nMTYoIi1tIikpIHsKQEAgLTgxOCw4ICs4MDUsNyBAQAogICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gcCA9IGdldFBsYXllcigpOwogICAgIGlmIChwID09IDApIHJldHVybiBVTktOT1dOX0VSUk9SOwogCi0gICAgc3A8SUJpbmRlcj4gYmluZGVyKGJ1ZmZlclByb2R1Y2VyID09IE5VTEwgPyBOVUxMIDoKLSAgICAgICAgICAgIGJ1ZmZlclByb2R1Y2VyLT5hc0JpbmRlcigpKTsKKyAgICBzcDxJQmluZGVyPiBiaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoYnVmZmVyUHJvZHVjZXIpKTsKICAgICBpZiAobUNvbm5lY3RlZFdpbmRvd0JpbmRlciA9PSBiaW5kZXIpIHsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KQEAgLTEyODIsMTI5ICsxMjY4LDYgQEAKIH0KICNlbmRpZgogCi1zdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OmRlY29kZSgKLSAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKLSAgICAgICAgY29uc3QgY2hhciogdXJsLAotICAgICAgICB1aW50MzJfdCAqcFNhbXBsZVJhdGUsCi0gICAgICAgIGludCogcE51bUNoYW5uZWxzLAotICAgICAgICBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKLSAgICAgICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwLAotICAgICAgICBzaXplX3QgKnBTaXplKQotewotICAgIEFMT0dWKCJkZWNvZGUoJXMpIiwgdXJsKTsKLSAgICBzcDxNZWRpYVBsYXllckJhc2U+IHBsYXllcjsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBCQURfVkFMVUU7Ci0KLSAgICAvLyBQcm90ZWN0IG91ciBwcmVjaW91cywgcHJlY2lvdXMgRFJNZCByaW5ndG9uZXMgYnkgb25seSBhbGxvd2luZwotICAgIC8vIGRlY29kaW5nIG9mIGh0dHAsIGJ1dCBub3QgZmlsZXN5c3RlbSBwYXRocyBvciBjb250ZW50IFVyaXMuCi0gICAgLy8gSWYgdGhlIGFwcGxpY2F0aW9uIHdhbnRzIHRvIGRlY29kZSB0aG9zZSwgaXQgc2hvdWxkIG9wZW4gYQotICAgIC8vIGZpbGVkZXNjcmlwdG9yIGZvciB0aGVtIGFuZCB1c2UgdGhhdC4KLSAgICBpZiAodXJsICE9IE5VTEwgJiYgc3RybmNtcCh1cmwsICJodHRwOi8vIiwgNykgIT0gMCkgewotICAgICAgICBBTE9HRCgiQ2FuJ3QgZGVjb2RlICVzIGJ5IHBhdGgsIHVzZSBmaWxlZGVzY3JpcHRvciBpbnN0ZWFkIiwgdXJsKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBwbGF5ZXJfdHlwZSBwbGF5ZXJUeXBlID0KLSAgICAgICAgTWVkaWFQbGF5ZXJGYWN0b3J5OjpnZXRQbGF5ZXJUeXBlKE5VTEwgLyogY2xpZW50ICovLCB1cmwpOwotICAgIEFMT0dWKCJwbGF5ZXIgdHlwZSA9ICVkIiwgcGxheWVyVHlwZSk7Ci0KLSAgICAvLyBjcmVhdGUgdGhlIHJpZ2h0IHR5cGUgb2YgcGxheWVyCi0gICAgc3A8QXVkaW9DYWNoZT4gY2FjaGUgPSBuZXcgQXVkaW9DYWNoZShoZWFwKTsKLSAgICBwbGF5ZXIgPSBNZWRpYVBsYXllckZhY3Rvcnk6OmNyZWF0ZVBsYXllcihwbGF5ZXJUeXBlLCBjYWNoZS5nZXQoKSwgY2FjaGUtPm5vdGlmeSk7Ci0gICAgaWYgKHBsYXllciA9PSBOVUxMKSBnb3RvIEV4aXQ7Ci0gICAgaWYgKHBsYXllci0+aGFyZHdhcmVPdXRwdXQoKSkgZ290byBFeGl0OwotCi0gICAgc3RhdGljX2Nhc3Q8TWVkaWFQbGF5ZXJJbnRlcmZhY2UqPihwbGF5ZXIuZ2V0KCkpLT5zZXRBdWRpb1NpbmsoY2FjaGUpOwotCi0gICAgLy8gc2V0IGRhdGEgc291cmNlCi0gICAgaWYgKHBsYXllci0+c2V0RGF0YVNvdXJjZShodHRwU2VydmljZSwgdXJsKSAhPSBOT19FUlJPUikgZ290byBFeGl0OwotCi0gICAgQUxPR1YoInByZXBhcmUiKTsKLSAgICBwbGF5ZXItPnByZXBhcmVBc3luYygpOwotCi0gICAgQUxPR1YoIndhaXQgZm9yIHByZXBhcmUiKTsKLSAgICBpZiAoY2FjaGUtPndhaXQoKSAhPSBOT19FUlJPUikgZ290byBFeGl0OwotCi0gICAgQUxPR1YoInN0YXJ0Iik7Ci0gICAgcGxheWVyLT5zdGFydCgpOwotCi0gICAgQUxPR1YoIndhaXQgZm9yIHBsYXliYWNrIGNvbXBsZXRlIik7Ci0gICAgY2FjaGUtPndhaXQoKTsKLSAgICAvLyBpbiBjYXNlIG9mIGVycm9yLCByZXR1cm4gd2hhdCB3YXMgc3VjY2Vzc2Z1bGx5IGRlY29kZWQuCi0gICAgaWYgKGNhY2hlLT5zaXplKCkgPT0gMCkgewotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgKnBTaXplID0gY2FjaGUtPnNpemUoKTsKLSAgICAqcFNhbXBsZVJhdGUgPSBjYWNoZS0+c2FtcGxlUmF0ZSgpOwotICAgICpwTnVtQ2hhbm5lbHMgPSBjYWNoZS0+Y2hhbm5lbENvdW50KCk7Ci0gICAgKnBGb3JtYXQgPSBjYWNoZS0+Zm9ybWF0KCk7Ci0gICAgQUxPR1YoInJldHVybiBzaXplICVkIHNhbXBsZVJhdGU9JXUsIGNoYW5uZWxDb3VudCA9ICVkLCBmb3JtYXQgPSAlZCIsCi0gICAgICAgICAgKnBTaXplLCAqcFNhbXBsZVJhdGUsICpwTnVtQ2hhbm5lbHMsICpwRm9ybWF0KTsKLSAgICBzdGF0dXMgPSBOT19FUlJPUjsKLQotRXhpdDoKLSAgICBpZiAocGxheWVyICE9IDApIHBsYXllci0+cmVzZXQoKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OmRlY29kZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwgaW50KiBwTnVtQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwgc2l6ZV90ICpwU2l6ZSkKLXsKLSAgICBBTE9HVigiZGVjb2RlKCVkLCAlbGxkLCAlbGxkKSIsIGZkLCBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiBwbGF5ZXI7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gQkFEX1ZBTFVFOwotCi0gICAgcGxheWVyX3R5cGUgcGxheWVyVHlwZSA9IE1lZGlhUGxheWVyRmFjdG9yeTo6Z2V0UGxheWVyVHlwZShOVUxMIC8qIGNsaWVudCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKTsKLSAgICBBTE9HVigicGxheWVyIHR5cGUgPSAlZCIsIHBsYXllclR5cGUpOwotCi0gICAgLy8gY3JlYXRlIHRoZSByaWdodCB0eXBlIG9mIHBsYXllcgotICAgIHNwPEF1ZGlvQ2FjaGU+IGNhY2hlID0gbmV3IEF1ZGlvQ2FjaGUoaGVhcCk7Ci0gICAgcGxheWVyID0gTWVkaWFQbGF5ZXJGYWN0b3J5OjpjcmVhdGVQbGF5ZXIocGxheWVyVHlwZSwgY2FjaGUuZ2V0KCksIGNhY2hlLT5ub3RpZnkpOwotICAgIGlmIChwbGF5ZXIgPT0gTlVMTCkgZ290byBFeGl0OwotICAgIGlmIChwbGF5ZXItPmhhcmR3YXJlT3V0cHV0KCkpIGdvdG8gRXhpdDsKLQotICAgIHN0YXRpY19jYXN0PE1lZGlhUGxheWVySW50ZXJmYWNlKj4ocGxheWVyLmdldCgpKS0+c2V0QXVkaW9TaW5rKGNhY2hlKTsKLQotICAgIC8vIHNldCBkYXRhIHNvdXJjZQotICAgIGlmIChwbGF5ZXItPnNldERhdGFTb3VyY2UoZmQsIG9mZnNldCwgbGVuZ3RoKSAhPSBOT19FUlJPUikgZ290byBFeGl0OwotCi0gICAgQUxPR1YoInByZXBhcmUiKTsKLSAgICBwbGF5ZXItPnByZXBhcmVBc3luYygpOwotCi0gICAgQUxPR1YoIndhaXQgZm9yIHByZXBhcmUiKTsKLSAgICBpZiAoY2FjaGUtPndhaXQoKSAhPSBOT19FUlJPUikgZ290byBFeGl0OwotCi0gICAgQUxPR1YoInN0YXJ0Iik7Ci0gICAgcGxheWVyLT5zdGFydCgpOwotCi0gICAgQUxPR1YoIndhaXQgZm9yIHBsYXliYWNrIGNvbXBsZXRlIik7Ci0gICAgY2FjaGUtPndhaXQoKTsKLSAgICAvLyBpbiBjYXNlIG9mIGVycm9yLCByZXR1cm4gd2hhdCB3YXMgc3VjY2Vzc2Z1bGx5IGRlY29kZWQuCi0gICAgaWYgKGNhY2hlLT5zaXplKCkgPT0gMCkgewotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgKnBTaXplID0gY2FjaGUtPnNpemUoKTsKLSAgICAqcFNhbXBsZVJhdGUgPSBjYWNoZS0+c2FtcGxlUmF0ZSgpOwotICAgICpwTnVtQ2hhbm5lbHMgPSBjYWNoZS0+Y2hhbm5lbENvdW50KCk7Ci0gICAgKnBGb3JtYXQgPSBjYWNoZS0+Zm9ybWF0KCk7Ci0gICAgQUxPR1YoInJldHVybiBzaXplICVkLCBzYW1wbGVSYXRlPSV1LCBjaGFubmVsQ291bnQgPSAlZCwgZm9ybWF0ID0gJWQiLAotICAgICAgICAgICpwU2l6ZSwgKnBTYW1wbGVSYXRlLCAqcE51bUNoYW5uZWxzLCAqcEZvcm1hdCk7Ci0gICAgc3RhdHVzID0gTk9fRVJST1I7Ci0KLUV4aXQ6Ci0gICAgaWYgKHBsYXllciAhPSAwKSBwbGF5ZXItPnJlc2V0KCk7Ci0gICAgOjpjbG9zZShmZCk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotCiAjdW5kZWYgTE9HX1RBRwogI2RlZmluZSBMT0dfVEFHICJBdWRpb1NpbmsiCiBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpBdWRpb091dHB1dChpbnQgc2Vzc2lvbklkLCBpbnQgdWlkLCBpbnQgcGlkLApAQCAtMTk1NCw0NyArMTgxNyw2IEBACiAgICAgcmV0dXJuIG1UcmFjay0+Z2V0U2FtcGxlUmF0ZSgpOwogfQogCi0jdW5kZWYgTE9HX1RBRwotI2RlZmluZSBMT0dfVEFHICJBdWRpb0NhY2hlIgotTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb0NhY2hlOjpBdWRpb0NhY2hlKGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCkgOgotICAgIG1IZWFwKGhlYXApLCBtQ2hhbm5lbENvdW50KDApLCBtRnJhbWVDb3VudCgxMDI0KSwgbVNhbXBsZVJhdGUoMCksIG1TaXplKDApLAotICAgIG1GcmFtZVNpemUoMSksIG1FcnJvcihOT19FUlJPUiksICBtQ29tbWFuZENvbXBsZXRlKGZhbHNlKQotewotfQotCi11aW50MzJfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvQ2FjaGU6OmxhdGVuY3kgKCkgY29uc3QKLXsKLSAgICByZXR1cm4gMDsKLX0KLQotZmxvYXQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb0NhY2hlOjptc2Vjc1BlckZyYW1lKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbU1zZWNzUGVyRnJhbWU7Ci19Ci0KLXN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9DYWNoZTo6Z2V0UG9zaXRpb24odWludDMyX3QgKnBvc2l0aW9uKSBjb25zdAotewotICAgIGlmIChwb3NpdGlvbiA9PSAwKSByZXR1cm4gQkFEX1ZBTFVFOwotICAgICpwb3NpdGlvbiA9IG1TaXplIC8gbUZyYW1lU2l6ZTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9DYWNoZTo6Z2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wICZ0cykgY29uc3QKLXsKLSAgICB0cy5tUG9zaXRpb24gPSBtU2l6ZSAvIG1GcmFtZVNpemU7Ci0gICAgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgdHMubVRpbWUudHZfc2VjID0gbm93IC8gMTAwMDAwMDAwMExMOwotICAgIHRzLm1UaW1lLnR2X25zZWMgPSBub3cgLSAoMTAwMDAwMDAwMExMICogdHMubVRpbWUudHZfc2VjKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9DYWNoZTo6Z2V0RnJhbWVzV3JpdHRlbih1aW50MzJfdCAqd3JpdHRlbikgY29uc3QKLXsKLSAgICBpZiAod3JpdHRlbiA9PSAwKSByZXR1cm4gQkFEX1ZBTFVFOwotICAgICp3cml0dGVuID0gbVNpemUgLyBtRnJhbWVTaXplOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogc3RydWN0IENhbGxiYWNrVGhyZWFkIDogcHVibGljIFRocmVhZCB7CkBAIC0yMDYyLDEzOSArMTg4NCw2IEBACiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLXN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9DYWNoZTo6b3BlbigKLSAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50IGNoYW5uZWxDb3VudCwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IGJ1ZmZlckNvdW50LAotICAgICAgICBBdWRpb0NhbGxiYWNrIGNiLCB2b2lkICpjb29raWUsIGF1ZGlvX291dHB1dF9mbGFnc190IC8qZmxhZ3MqLywKLSAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QqIC8qb2ZmbG9hZEluZm8qLykKLXsKLSAgICBBTE9HVigib3BlbigldSwgJWQsIDB4JXgsICVkLCAlZCkiLCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQsIGNoYW5uZWxNYXNrLCBmb3JtYXQsIGJ1ZmZlckNvdW50KTsKLSAgICBpZiAobUhlYXAtPmdldEhlYXBJRCgpIDwgMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0KLSAgICBtU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7Ci0gICAgbUNoYW5uZWxDb3VudCA9ICh1aW50MTZfdCljaGFubmVsQ291bnQ7Ci0gICAgbUZvcm1hdCA9IGZvcm1hdDsKLSAgICBtTXNlY3NQZXJGcmFtZSA9IDEuZTMgLyAoZmxvYXQpIHNhbXBsZVJhdGU7Ci0gICAgbUZyYW1lU2l6ZSA9ICBhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpCi0gICAgICAgICAgICA/IG1DaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKG1Gb3JtYXQpIDogMTsKLSAgICBtRnJhbWVDb3VudCA9IG1IZWFwLT5nZXRTaXplKCkgLyBtRnJhbWVTaXplOwotCi0gICAgaWYgKGNiICE9IE5VTEwpIHsKLSAgICAgICAgbUNhbGxiYWNrVGhyZWFkID0gbmV3IENhbGxiYWNrVGhyZWFkKHRoaXMsIGNiLCBjb29raWUpOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9DYWNoZTo6c3RhcnQoKSB7Ci0gICAgaWYgKG1DYWxsYmFja1RocmVhZCAhPSBOVUxMKSB7Ci0gICAgICAgIG1DYWxsYmFja1RocmVhZC0+cnVuKCJBdWRpb0NhY2hlIGNhbGxiYWNrIik7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvQ2FjaGU6OnN0b3AoKSB7Ci0gICAgaWYgKG1DYWxsYmFja1RocmVhZCAhPSBOVUxMKSB7Ci0gICAgICAgIG1DYWxsYmFja1RocmVhZC0+cmVxdWVzdEV4aXRBbmRXYWl0KCk7Ci0gICAgfQotfQotCi1zc2l6ZV90IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9DYWNoZTo6d3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKLXsKLSAgICBBTE9HVigid3JpdGUoJXAsICV1KSIsIGJ1ZmZlciwgc2l6ZSk7Ci0gICAgaWYgKChidWZmZXIgPT0gMCkgfHwgKHNpemUgPT0gMCkpIHJldHVybiBzaXplOwotCi0gICAgdWludDhfdCogcCA9IHN0YXRpY19jYXN0PHVpbnQ4X3QqPihtSGVhcC0+Z2V0QmFzZSgpKTsKLSAgICBpZiAocCA9PSBOVUxMKSByZXR1cm4gTk9fSU5JVDsKLSAgICBwICs9IG1TaXplOwotICAgIEFMT0dWKCJtZW1jcHkoJXAsICVwLCAldSkiLCBwLCBidWZmZXIsIHNpemUpOwotCi0gICAgYm9vbCBvdmVyZmxvdyA9IG1TaXplICsgc2l6ZSA+IG1IZWFwLT5nZXRTaXplKCk7Ci0gICAgaWYgKG92ZXJmbG93KSB7Ci0gICAgICAgIEFMT0dFKCJIZWFwIHNpemUgb3ZlcmZsb3chIHJlcSBzaXplOiAlZCwgbWF4IHNpemU6ICVkIiwgKG1TaXplICsgc2l6ZSksIG1IZWFwLT5nZXRTaXplKCkpOwotICAgICAgICBzaXplID0gbUhlYXAtPmdldFNpemUoKSAtIG1TaXplOwotICAgIH0KLSAgICBzaXplIC09IHNpemUgJSBtRnJhbWVTaXplOyAvLyBjb25zdW1lIG9ubHkgaW50ZWdyYWwgYW1vdW50cyBvZiBmcmFtZSBzaXplCi0gICAgbWVtY3B5KHAsIGJ1ZmZlciwgc2l6ZSk7Ci0gICAgbVNpemUgKz0gc2l6ZTsKLQotICAgIGlmIChvdmVyZmxvdykgewotICAgICAgICAvLyBTaWduYWwgaGVhcCBmaWxsZWQgaGVyZSAobGFzdCBmcmFtZSBtYXkgYmUgdHJ1bmNhdGVkKS4KLSAgICAgICAgLy8gQWZ0ZXIgdGhpcyBwb2ludCwgbm8gbW9yZSBkYXRhIHNob3VsZCBiZSB3cml0dGVuIGFzIHRoZQotICAgICAgICAvLyBoZWFwIGlzIGZpbGxlZCBhbmQgdGhlIEF1ZGlvQ2FjaGUgc2hvdWxkIGJlIGVmZmVjdGl2ZWx5Ci0gICAgICAgIC8vIGltbXV0YWJsZSB3aXRoIHJlc3BlY3QgdG8gZnV0dXJlIHdyaXRlcy4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gSXQgaXMgdGh1cyBzYWZlIGZvciBhbm90aGVyIHRocmVhZCB0byByZWFkIHRoZSBBdWRpb0NhY2hlLgotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgICAgIG1Db21tYW5kQ29tcGxldGUgPSB0cnVlOwotICAgICAgICBtU2lnbmFsLnNpZ25hbCgpOwotICAgIH0KLSAgICByZXR1cm4gc2l6ZTsKLX0KLQotLy8gY2FsbCB3aXRoIGxvY2sgaGVsZAotc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb0NhY2hlOjp3YWl0KCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgd2hpbGUgKCFtQ29tbWFuZENvbXBsZXRlKSB7Ci0gICAgICAgIG1TaWduYWwud2FpdChtTG9jayk7Ci0gICAgfQotICAgIG1Db21tYW5kQ29tcGxldGUgPSBmYWxzZTsKLQotICAgIGlmIChtRXJyb3IgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR1YoIndhaXQgLSBzdWNjZXNzIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIndhaXQgLSBlcnJvciIpOwotICAgIH0KLSAgICByZXR1cm4gbUVycm9yOwotfQotCi12b2lkIE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9DYWNoZTo6bm90aWZ5KAotICAgICAgICB2b2lkKiBjb29raWUsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsKiAvKm9iaiovKQotewotICAgIEFMT0dWKCJub3RpZnkoJXAsICVkLCAlZCwgJWQpIiwgY29va2llLCBtc2csIGV4dDEsIGV4dDIpOwotICAgIEF1ZGlvQ2FjaGUqIHAgPSBzdGF0aWNfY2FzdDxBdWRpb0NhY2hlKj4oY29va2llKTsKLQotICAgIC8vIGlnbm9yZSBidWZmZXJpbmcgbWVzc2FnZXMKLSAgICBzd2l0Y2ggKG1zZykKLSAgICB7Ci0gICAgY2FzZSBNRURJQV9FUlJPUjoKLSAgICAgICAgQUxPR0UoIkVycm9yICVkLCAlZCBvY2N1cnJlZCIsIGV4dDEsIGV4dDIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE1FRElBX1BSRVBBUkVEOgotICAgICAgICBBTE9HVigicHJlcGFyZWQiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNRURJQV9QTEFZQkFDS19DT01QTEVURToKLSAgICAgICAgQUxPR1YoInBsYXliYWNrIGNvbXBsZXRlIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dWKCJpZ25vcmVkIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyB3YWtlIHVwIHRocmVhZAotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKHAtPm1Mb2NrKTsKLSAgICBpZiAobXNnID09IE1FRElBX0VSUk9SKSB7Ci0gICAgICAgIHAtPm1FcnJvciA9IGV4dDE7Ci0gICAgfQotICAgIHAtPm1Db21tYW5kQ29tcGxldGUgPSB0cnVlOwotICAgIHAtPm1TaWduYWwuc2lnbmFsKCk7Ci19Ci0KLWludCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvQ2FjaGU6OmdldFNlc3Npb25JZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9DYWNoZTo6Z2V0U2FtcGxlUmF0ZSgpIGNvbnN0Ci17Ci0gICAgaWYgKG1Nc2Vjc1BlckZyYW1lID09IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAodWludDMyX3QpKDEuZTMgLyBtTXNlY3NQZXJGcmFtZSk7Ci19Ci0KIHZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjphZGRCYXR0ZXJ5RGF0YSh1aW50MzJfdCBwYXJhbXMpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwpAQCAtMjIzOCw3ICsxOTI3LDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIC8vIGFuIHN1ZGlvIHN0cmVhbSBpcyBzdGFydGVkCisgICAgLy8gYW4gYXVkaW8gc3RyZWFtIGlzIHN0YXJ0ZWQKICAgICBpZiAocGFyYW1zICYga0JhdHRlcnlEYXRhQXVkaW9GbGluZ2VyU3RhcnQpIHsKICAgICAgICAgLy8gcmVjb3JkIHRoZSBzdGFydCB0aW1lIG9ubHkgaWYgY3VycmVudGx5IG5vIG90aGVyIGF1ZGlvCiAgICAgICAgIC8vIGlzIGJlaW5nIHBsYXllZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oCmluZGV4IDNiOTZlODguLmZhZDM0NDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKQEAgLTc3LDcgKzc3LDYgQEAKICAgICAgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgfkF1ZGlvT3V0cHV0KCk7CiAKICAgICAgICAgdmlydHVhbCBib29sICAgICAgICAgICAgcmVhZHkoKSBjb25zdCB7IHJldHVybiBtVHJhY2sgIT0gMDsgfQotICAgICAgICB2aXJ0dWFsIGJvb2wgICAgICAgICAgICByZWFsdGltZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgdmlydHVhbCBzc2l6ZV90ICAgICAgICAgYnVmZmVyU2l6ZSgpIGNvbnN0OwogICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgICAgICBmcmFtZUNvdW50KCkgY29uc3Q7CiAgICAgICAgIHZpcnR1YWwgc3NpemVfdCAgICAgICAgIGNoYW5uZWxDb3VudCgpIGNvbnN0OwpAQCAtMTg0LDc1ICsxODMsNiBAQAogICAgIH07IC8vIEF1ZGlvT3V0cHV0CiAKIAotICAgIGNsYXNzIEF1ZGlvQ2FjaGUgOiBwdWJsaWMgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1NpbmsKLSAgICB7Ci0gICAgcHVibGljOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0NhY2hlKGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCk7Ci0gICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5BdWRpb0NhY2hlKCkge30KLQotICAgICAgICB2aXJ0dWFsIGJvb2wgICAgICAgICAgICByZWFkeSgpIGNvbnN0IHsgcmV0dXJuIChtQ2hhbm5lbENvdW50ID4gMCkgJiYgKG1IZWFwLT5nZXRIZWFwSUQoKSA+IDApOyB9Ci0gICAgICAgIHZpcnR1YWwgYm9vbCAgICAgICAgICAgIHJlYWx0aW1lKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICAgICAgdmlydHVhbCBzc2l6ZV90ICAgICAgICAgYnVmZmVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGZyYW1lU2l6ZSgpICogbUZyYW1lQ291bnQ7IH0KLSAgICAgICAgdmlydHVhbCBzc2l6ZV90ICAgICAgICAgZnJhbWVDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1GcmFtZUNvdW50OyB9Ci0gICAgICAgIHZpcnR1YWwgc3NpemVfdCAgICAgICAgIGNoYW5uZWxDb3VudCgpIGNvbnN0IHsgcmV0dXJuIChzc2l6ZV90KW1DaGFubmVsQ291bnQ7IH0KLSAgICAgICAgdmlydHVhbCBzc2l6ZV90ICAgICAgICAgZnJhbWVTaXplKCkgY29uc3QgeyByZXR1cm4gKHNzaXplX3QpbUZyYW1lU2l6ZTsgfQotICAgICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgICAgICBsYXRlbmN5KCkgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgZmxvYXQgICAgICAgICAgIG1zZWNzUGVyRnJhbWUoKSBjb25zdDsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0UG9zaXRpb24odWludDMyX3QgKnBvc2l0aW9uKSBjb25zdDsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wICZ0cykgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldEZyYW1lc1dyaXR0ZW4odWludDMyX3QgKmZyYW1lc3dyaXR0ZW4pIGNvbnN0OwotICAgICAgICB2aXJ0dWFsIGludCAgICAgICAgICAgICBnZXRTZXNzaW9uSWQoKSBjb25zdDsKLSAgICAgICAgdmlydHVhbCB1aW50MzJfdCAgICAgICAgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0OwotCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIG9wZW4oCi0gICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50IGNoYW5uZWxDb3VudCwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQgYnVmZmVyQ291bnQgPSAxLAotICAgICAgICAgICAgICAgIEF1ZGlvQ2FsbGJhY2sgY2IgPSBOVUxMLCB2b2lkICpjb29raWUgPSBOVUxMLAotICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKLSAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMKTsKLQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzdGFydCgpOwotICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgICAgICB3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgc3RvcCgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBmbHVzaCgpIHt9Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHBhdXNlKCkge30KLSAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgY2xvc2UoKSB7fQotICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBzZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlIF9fdW51c2VkKSB7fQotICAgICAgICAgICAgICAgIC8vIHN0cmVhbSB0eXBlIGlzIG5vdCB1c2VkIGZvciBBdWRpb0NhY2hlCi0gICAgICAgIHZpcnR1YWwgYXVkaW9fc3RyZWFtX3R5cGVfdCBnZXRBdWRpb1N0cmVhbVR5cGUoKSBjb25zdCB7IHJldHVybiBBVURJT19TVFJFQU1fREVGQVVMVDsgfQotCi0gICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIHNldFZvbHVtZShmbG9hdCBsZWZ0IF9fdW51c2VkLCBmbG9hdCByaWdodCBfX3VudXNlZCkge30KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0UGxheWJhY2tSYXRlUGVybWlsbGUoaW50MzJfdCByYXRlUGVybWlsbGUgX191bnVzZWQpIHsgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOyB9Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgIHNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtU2FtcGxlUmF0ZTsgfQotICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICBmb3JtYXQoKSBjb25zdCB7IHJldHVybiBtRm9ybWF0OyB9Ci0gICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgIHNpemUoKSBjb25zdCB7IHJldHVybiBtU2l6ZTsgfQotICAgICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICB3YWl0KCk7Ci0KLSAgICAgICAgICAgICAgICBzcDxJTWVtb3J5SGVhcD4gZ2V0SGVhcCgpIGNvbnN0IHsgcmV0dXJuIG1IZWFwOyB9Ci0KLSAgICAgICAgc3RhdGljICB2b2lkICAgICAgICAgICAgbm90aWZ5KHZvaWQqIGNvb2tpZSwgaW50IG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICpvYmopOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Q7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0NhY2hlKCk7Ci0KLSAgICAgICAgTXV0ZXggICAgICAgICAgICAgICBtTG9jazsKLSAgICAgICAgQ29uZGl0aW9uICAgICAgICAgICBtU2lnbmFsOwotICAgICAgICBzcDxJTWVtb3J5SGVhcD4gICAgIG1IZWFwOwotICAgICAgICBmbG9hdCAgICAgICAgICAgICAgIG1Nc2Vjc1BlckZyYW1lOwotICAgICAgICB1aW50MTZfdCAgICAgICAgICAgIG1DaGFubmVsQ291bnQ7Ci0gICAgICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgbUZvcm1hdDsKLSAgICAgICAgc3NpemVfdCAgICAgICAgICAgICBtRnJhbWVDb3VudDsKLSAgICAgICAgdWludDMyX3QgICAgICAgICAgICBtU2FtcGxlUmF0ZTsKLSAgICAgICAgdWludDMyX3QgICAgICAgICAgICBtU2l6ZTsKLSAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICBtRnJhbWVTaXplOwotICAgICAgICBpbnQgICAgICAgICAgICAgICAgIG1FcnJvcjsKLSAgICAgICAgYm9vbCAgICAgICAgICAgICAgICBtQ29tbWFuZENvbXBsZXRlOwotCi0gICAgICAgIHNwPFRocmVhZD4gICAgICAgICAgbUNhbGxiYWNrVGhyZWFkOwotICAgIH07IC8vIEF1ZGlvQ2FjaGUKLQogcHVibGljOgogICAgIHN0YXRpYyAgdm9pZCAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZSgpOwogCkBAIC0yNjMsMTkgKzE5Myw2IEBACiAKICAgICB2aXJ0dWFsIHNwPElNZWRpYVBsYXllcj4gICAgY3JlYXRlKGNvbnN0IHNwPElNZWRpYVBsYXllckNsaWVudD4mIGNsaWVudCwgaW50IGF1ZGlvU2Vzc2lvbklkKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICBkZWNvZGUoCi0gICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAotICAgICAgICAgICAgY29uc3QgY2hhciogdXJsLAotICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGVSYXRlLAotICAgICAgICAgICAgaW50KiBwTnVtQ2hhbm5lbHMsCi0gICAgICAgICAgICBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKLSAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwKLSAgICAgICAgICAgIHNpemVfdCAqcFNpemUpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgIGRlY29kZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwgaW50KiBwTnVtQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwgc2l6ZV90ICpwU2l6ZSk7CiAgICAgdmlydHVhbCBzcDxJTWVkaWFDb2RlY0xpc3Q+IGdldENvZGVjTGlzdCgpIGNvbnN0OwogICAgIHZpcnR1YWwgc3A8SU9NWD4gICAgICAgICAgICBnZXRPTVgoKTsKICAgICB2aXJ0dWFsIHNwPElDcnlwdG8+ICAgICAgICAgbWFrZUNyeXB0bygpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5jcHAKaW5kZXggYWE1OGIzNS4uMGY1YTAxYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuY3BwCkBAIC0zNSw3ICszNSw2IEBACiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFNZXRhZGF0YVJldHJpZXZlckludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmg+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+c2Vla1RvQXN5bmMoMCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSByZW5kZXJlciBoYXMgc3RvcHBlZCB0aGUgc2luayBhdCB0aGUgZW5kIGluIG9yZGVyIHRvIHBsYXkgb3V0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclNvdXJjZS5oCmluZGV4IDZkYWFkMWIuLmQ5ZjE0YTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclNvdXJjZS5oCkBAIC0yOCw3ICsyOCw2IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBQnVmZmVyOwotc3RydWN0IE1ldGFEYXRhOwogc3RydWN0IE1lZGlhQnVmZmVyOwogCiBzdHJ1Y3QgTnVQbGF5ZXI6OlNvdXJjZSA6IHB1YmxpYyBBSGFuZGxlciB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQUNXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmNwcAppbmRleCA3Y2M5NDMwLi4yZTQxZDgwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQUNXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FBQ1dyaXRlci5jcHAKQEAgLTgwLDEwICs4MCw2IEBACiAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CiB9CiAKLXN0YXRpYyBpbnQgd3JpdGVJbnQ4KGludCBmZCwgdWludDhfdCB4KSB7Ci0gICAgcmV0dXJuIDo6d3JpdGUoZmQsICZ4LCAxKTsKLX0KLQogCiBzdGF0dXNfdCBBQUNXcml0ZXI6OmFkZFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcAppbmRleCBmNjI0MDIwLi42ZDliNDEyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKQEAgLTk0MCw3ICs5NDAsNiBAQAogCiBBQ29kZWM6OkJ1ZmZlckluZm8gKkFDb2RlYzo6ZGVxdWV1ZUJ1ZmZlckZyb21OYXRpdmVXaW5kb3coKSB7CiAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciAqYnVmOwotICAgIGludCBmZW5jZUZkID0gLTE7CiAgICAgQ0hFQ0sobU5hdGl2ZVdpbmRvdy5nZXQoKSAhPSBOVUxMKTsKIAogICAgIGlmIChtVHVubmVsZWQpIHsKQEAgLTE1OTcsNyArMTU5NiwxMSBAQAogICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJjaGFubmVsLWNvdW50IiwgJm51bUNoYW5uZWxzKSkgewogICAgICAgICAgICAgZXJyID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlcnIgPSBzZXR1cEc3MTFDb2RlYyhlbmNvZGVyLCBudW1DaGFubmVscyk7CisgICAgICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGU7CisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJzYW1wbGUtcmF0ZSIsICZzYW1wbGVSYXRlKSkgeworICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUgPSA4MDAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXJyID0gc2V0dXBHNzExQ29kZWMoZW5jb2Rlciwgc2FtcGxlUmF0ZSwgbnVtQ2hhbm5lbHMpOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDKSkgewogICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzLCBzYW1wbGVSYXRlLCBjb21wcmVzc2lvbkxldmVsID0gLTE7CkBAIC0yMDUyLDExICsyMDU1LDExIEBACiAgICAgICAgICAgICAxIC8qIG51bUNoYW5uZWxzICovKTsKIH0KIAotc3RhdHVzX3QgQUNvZGVjOjpzZXR1cEc3MTFDb2RlYyhib29sIGVuY29kZXIsIGludDMyX3QgbnVtQ2hhbm5lbHMpIHsKK3N0YXR1c190IEFDb2RlYzo6c2V0dXBHNzExQ29kZWMoYm9vbCBlbmNvZGVyLCBpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgbnVtQ2hhbm5lbHMpIHsKICAgICBDSEVDSyghZW5jb2Rlcik7ICAvLyBYWFggVE9ETwogCiAgICAgcmV0dXJuIHNldHVwUmF3QXVkaW9Gb3JtYXQoCi0gICAgICAgICAgICBrUG9ydEluZGV4SW5wdXQsIDgwMDAgLyogc2FtcGxlUmF0ZSAqLywgbnVtQ2hhbm5lbHMpOworICAgICAgICAgICAga1BvcnRJbmRleElucHV0LCBzYW1wbGVSYXRlLCBudW1DaGFubmVscyk7CiB9CiAKIHN0YXR1c190IEFDb2RlYzo6c2V0dXBGbGFjQ29kZWMoCkBAIC0zMjY2LDcgKzMyNjksNiBAQAogfQogCiB2b2lkIEFDb2RlYzo6ZGVmZXJNZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgYm9vbCB3YXNFbXB0eUJlZm9yZSA9IG1EZWZlcnJlZFF1ZXVlLmVtcHR5KCk7CiAgICAgbURlZmVycmVkUXVldWUucHVzaF9iYWNrKG1zZyk7CiB9CiAKQEAgLTM5NzcsNyArMzk3OSw2IEBACiAgICAgLy8gb24gdGhlIHNjcmVlbiBhbmQgdGhlbiBiZWVuIHJlcGxhY2VkLCBzbyBhbiBwcmV2aW91cyB2aWRlbyBmcmFtZXMgYXJlCiAgICAgLy8gZ3VhcmFudGVlZCBOT1QgdG8gYmUgY3VycmVudGx5IGRpc3BsYXllZC4KICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJ1ZnMgKyAxOyBpKyspIHsKLSAgICAgICAgaW50IGZlbmNlRmQgPSAtMTsKICAgICAgICAgZXJyID0gbmF0aXZlX3dpbmRvd19kZXF1ZXVlX2J1ZmZlcl9hbmRfd2FpdChtTmF0aXZlV2luZG93LmdldCgpLCAmYW5iKTsKICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgQUxPR0UoImVycm9yIHB1c2hpbmcgYmxhbmsgZnJhbWVzOiBkZXF1ZXVlQnVmZmVyIGZhaWxlZDogJXMgKCVkKSIsCkBAIC00NzU2LDcgKzQ3NTcsNyBAQAogICAgIEFMT0dWKCJOb3cgdW5pbml0aWFsaXplZCIpOwogCiAgICAgaWYgKG1EZWF0aE5vdGlmaWVyICE9IE5VTEwpIHsKLSAgICAgICAgbUNvZGVjLT5tT01YLT5hc0JpbmRlcigpLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyKTsKKyAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUNvZGVjLT5tT01YKS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllcik7CiAgICAgICAgIG1EZWF0aE5vdGlmaWVyLmNsZWFyKCk7CiAgICAgfQogCkBAIC00ODQ5LDcgKzQ4NTAsNyBAQAogICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPTVhEaWVkLCBtQ29kZWMtPmlkKCkpOwogCiAgICAgbURlYXRoTm90aWZpZXIgPSBuZXcgRGVhdGhOb3RpZmllcihub3RpZnkpOwotICAgIGlmIChvbXgtPmFzQmluZGVyKCktPmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyKSAhPSBPSykgeworICAgIGlmIChJSW50ZXJmYWNlOjphc0JpbmRlcihvbXgpLT5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllcikgIT0gT0spIHsKICAgICAgICAgLy8gVGhpcyB3YXMgYSBsb2NhbCBiaW5kZXIsIGlmIGl0IGRpZXMgc28gZG8gd2UsIHdlIHdvbid0IGNhcmUKICAgICAgICAgLy8gYWJvdXQgYW55IG5vdGlmaWNhdGlvbnMgaW4gdGhlIGFmdGVybGlmZS4KICAgICAgICAgbURlYXRoTm90aWZpZXIuY2xlYXIoKTsKQEAgLTQ4OTQsNyArNDg5NSw3IEBACiAgICAgICAgIGNvbXBvbmVudE5hbWUgPSBtYXRjaGluZ0NvZGVjcy5pdGVtQXQobWF0Y2hJbmRleCkubU5hbWUuc3RyaW5nKCk7CiAgICAgICAgIHF1aXJrcyA9IG1hdGNoaW5nQ29kZWNzLml0ZW1BdChtYXRjaEluZGV4KS5tUXVpcmtzOwogCi0gICAgICAgIHBpZF90IHRpZCA9IGFuZHJvaWRHZXRUaWQoKTsKKyAgICAgICAgcGlkX3QgdGlkID0gZ2V0dGlkKCk7CiAgICAgICAgIGludCBwcmV2UHJpb3JpdHkgPSBhbmRyb2lkR2V0VGhyZWFkUHJpb3JpdHkodGlkKTsKICAgICAgICAgYW5kcm9pZFNldFRocmVhZFByaW9yaXR5KHRpZCwgQU5EUk9JRF9QUklPUklUWV9GT1JFR1JPVU5EKTsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gb214LT5hbGxvY2F0ZU5vZGUoY29tcG9uZW50TmFtZS5jX3N0cigpLCBvYnNlcnZlciwgJm5vZGUpOwpAQCAtNTY4MSw2ICs1NjgyLDcgQEAKICAgICAgICAgY2FzZSBrV2hhdEZsdXNoOgogICAgICAgICBjYXNlIGtXaGF0U2h1dGRvd246CiAgICAgICAgIGNhc2Uga1doYXRSZXN1bWU6CisgICAgICAgIGNhc2Uga1doYXRTZXRQYXJhbWV0ZXJzOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAobXNnLT53aGF0KCkgPT0ga1doYXRSZXN1bWUpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBEZWZlcnJpbmcgcmVzdW1lIiwgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rCmluZGV4IDE5M2Y4YTcuLjI2MjlhZmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5tawpAQCAtMzYsNiArMzYsNyBAQAogICAgICAgICBNZWRpYUNvZGVjU291cmNlLmNwcCAgICAgICAgICAgICAgXAogICAgICAgICBNZWRpYURlZnMuY3BwICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBNZWRpYUV4dHJhY3Rvci5jcHAgICAgICAgICAgICAgICAgXAorICAgICAgICBNaWRpRXh0cmFjdG9yLmNwcCAgICAgICAgICAgICAgICAgXAogICAgICAgICBodHRwL01lZGlhSFRUUC5jcHAgICAgICAgICAgICAgICAgXAogICAgICAgICBNZWRpYU11eGVyLmNwcCAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBNZWRpYVNvdXJjZS5jcHAgICAgICAgICAgICAgICAgICAgXApAQCAtNjgsMTEgKzY5LDggQEAKICAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCiAgICAgICAgICQoVE9QKS9leHRlcm5hbC9mbGFjL2luY2x1ZGUgXAogICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvdHJlbW9sbyBcCi0gICAgICAgICQoVE9QKS9leHRlcm5hbC9vcGVuc3NsL2luY2x1ZGUgXAogICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvbGlidnB4L2xpYndlYm0gXAogICAgICAgICAkKFRPUCkvc3lzdGVtL25ldGQvaW5jbHVkZSBcCi0gICAgICAgICQoVE9QKS9leHRlcm5hbC9pY3UvaWN1NGMvc291cmNlL2NvbW1vbiBcCi0gICAgICAgICQoVE9QKS9leHRlcm5hbC9pY3UvaWN1NGMvc291cmNlL2kxOG4gXAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGliYmluZGVyIFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAKaW5kZXggM2FkZmVhMC4uODgyMTlhZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAKQEAgLTg4OSwxMCArODg5LDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoKG1GbGFncyAmIExPT1BJTkcpCi0gICAgICAgICAgICB8fCAoKG1GbGFncyAmIEFVVE9fTE9PUElORykKLSAgICAgICAgICAgICAgICAmJiAobUF1ZGlvU2luayA9PSBOVUxMIHx8IG1BdWRpb1NpbmstPnJlYWx0aW1lKCkpKSkgewotICAgICAgICAvLyBEb24ndCBBVVRPX0xPT1AgaWYgd2UncmUgYmVpbmcgcmVjb3JkZWQsIHNpbmNlIHRoYXQgY2Fubm90IGJlCi0gICAgICAgIC8vIHR1cm5lZCBvZmYgYW5kIHJlY29yZGluZyB3b3VsZCBnbyBvbiBpbmRlZmluaXRlbHkuCisgICAgICAgICAgICB8fCAobUZsYWdzICYgQVVUT19MT09QSU5HKSkgewogCiAgICAgICAgIHNlZWtUb19sKDApOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcAppbmRleCBjM2E5NDBhLi5hZDEyYmRkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAKQEAgLTIxOSw3ICsyMTksNyBAQAogICAgICAgICBtQ2FtZXJhRmxhZ3MgfD0gRkxBR1NfSE9UX0NBTUVSQTsKICAgICAgICAgbURlYXRoTm90aWZpZXIgPSBuZXcgRGVhdGhOb3RpZmllcigpOwogICAgICAgICAvLyBpc0JpbmRlckFsaXZlIG5lZWRzIGxpbmtUb0RlYXRoIHRvIHdvcmsuCi0gICAgICAgIG1DYW1lcmFSZWNvcmRpbmdQcm94eS0+YXNCaW5kZXIoKS0+bGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIpOworICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtQ2FtZXJhUmVjb3JkaW5nUHJveHkpLT5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllcik7CiAgICAgfQogCiAgICAgbUNhbWVyYS0+bG9jaygpOwpAQCAtNzAyLDcgKzcwMiw3IEBACiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgICAgICBpZiAobUNhbWVyYVJlY29yZGluZ1Byb3h5ICE9IDApIHsKLSAgICAgICAgICAgIG1DYW1lcmFSZWNvcmRpbmdQcm94eS0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllcik7CisgICAgICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtQ2FtZXJhUmVjb3JkaW5nUHJveHkpLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyKTsKICAgICAgICAgICAgIG1DYW1lcmFSZWNvcmRpbmdQcm94eS5jbGVhcigpOwogICAgICAgICB9CiAgICAgICAgIG1DYW1lcmFGbGFncyA9IDA7CkBAIC04MjUsNyArODI1LDcgQEAKICAgICAgICAgICAgICAgICBtRnJhbWVBdmFpbGFibGVDb25kaXRpb24ud2FpdFJlbGF0aXZlKG1Mb2NrLAogICAgICAgICAgICAgICAgICAgICBtVGltZUJldHdlZW5GcmFtZUNhcHR1cmVVcyAqIDEwMDBMTCArIENBTUVSQV9TT1VSQ0VfVElNRU9VVF9OUykpIHsKICAgICAgICAgICAgICAgICBpZiAobUNhbWVyYVJlY29yZGluZ1Byb3h5ICE9IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgIW1DYW1lcmFSZWNvcmRpbmdQcm94eS0+YXNCaW5kZXIoKS0+aXNCaW5kZXJBbGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICFJSW50ZXJmYWNlOjphc0JpbmRlcihtQ2FtZXJhUmVjb3JkaW5nUHJveHkpLT5pc0JpbmRlckFsaXZlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNhbWVyYSByZWNvcmRpbmcgcHJveHkgaXMgZ29uZSIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuY3BwCmluZGV4IDY1YWQwZjEuLmRjM2IzOTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuY3BwCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSAiaW5jbHVkZS9EUk1FeHRyYWN0b3IuaCIKICNpbmNsdWRlICJpbmNsdWRlL0ZMQUNFeHRyYWN0b3IuaCIKICNpbmNsdWRlICJpbmNsdWRlL0hUVFBCYXNlLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9NaWRpRXh0cmFjdG9yLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9NUDNFeHRyYWN0b3IuaCIKICNpbmNsdWRlICJpbmNsdWRlL01QRUcyUFNFeHRyYWN0b3IuaCIKICNpbmNsdWRlICJpbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaCIKQEAgLTE3Miw2ICsxNzMsNyBAQAogICAgIFJlZ2lzdGVyU25pZmZlcl9sKFNuaWZmQUFDKTsKICAgICBSZWdpc3RlclNuaWZmZXJfbChTbmlmZk1QRUcyUFMpOwogICAgIFJlZ2lzdGVyU25pZmZlcl9sKFNuaWZmV1ZNKTsKKyAgICBSZWdpc3RlclNuaWZmZXJfbChTbmlmZk1pZGkpOwogCiAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwogICAgIGlmIChwcm9wZXJ0eV9nZXQoImRybS5zZXJ2aWNlLmVuYWJsZWQiLCB2YWx1ZSwgTlVMTCkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0RXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0RXh0cmFjdG9yLmNwcAppbmRleCA0MjNhYWViLi4yNjJjZmQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNEV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRFeHRyYWN0b3IuY3BwCkBAIC0yNjksNiArMjY5LDggQEAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAorc3RhdGljIGNvbnN0IGJvb2wga1VzZUhleER1bXAgPSBmYWxzZTsKKwogc3RhdGljIHZvaWQgaGV4ZHVtcChjb25zdCB2b2lkICpfZGF0YSwgc2l6ZV90IHNpemUpIHsKICAgICBjb25zdCB1aW50OF90ICpkYXRhID0gKGNvbnN0IHVpbnQ4X3QgKilfZGF0YTsKICAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKQEAgLTYxNSw3ICs2MTcsNiBAQAogICAgIGlmIChzaXplIDwgMCkgewogICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgfQotICAgIGludDMyX3QgY2xhc3NTaXplID0gc2l6ZTsKICAgICBkYXRhX29mZnNldCArPSBudW1PZkJ5dGVzOwogCiAgICAgd2hpbGUoc2l6ZSA+PSAxMSApIHsKQEAgLTY3Niw3ICs2NzcsNiBAQAogICAgIGlmIChzaXplIDwgMCkgewogICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgfQotICAgIGNsYXNzU2l6ZSA9IHNpemU7CiAgICAgZGF0YV9vZmZzZXQgKz0gbnVtT2ZCeXRlczsKIAogICAgIHdoaWxlIChzaXplID4gMCkgewpAQCAtNzc0LDcgKzc3NCw3IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICB9CiAgICAgdWludDY0X3QgY2h1bmtfc2l6ZSA9IG50b2hsKGhkclswXSk7Ci0gICAgdWludDMyX3QgY2h1bmtfdHlwZSA9IG50b2hsKGhkclsxXSk7CisgICAgaW50MzJfdCBjaHVua190eXBlID0gbnRvaGwoaGRyWzFdKTsKICAgICBvZmY2NF90IGRhdGFfb2Zmc2V0ID0gKm9mZnNldCArIDg7CiAKICAgICBpZiAoY2h1bmtfc2l6ZSA9PSAxKSB7CkBAIC04MTQsMjMgKzgxNCwyMyBAQAogICAgIE1ha2VGb3VyQ0NTdHJpbmcoY2h1bmtfdHlwZSwgY2h1bmspOwogICAgIEFMT0dWKCJjaHVuazogJXMgQCAlbGxkLCAlZCIsIGNodW5rLCAqb2Zmc2V0LCBkZXB0aCk7CiAKLSNpZiAwCi0gICAgc3RhdGljIGNvbnN0IGNoYXIga1doaXRlc3BhY2VbXSA9ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsKLSAgICBjb25zdCBjaGFyICppbmRlbnQgPSAma1doaXRlc3BhY2Vbc2l6ZW9mKGtXaGl0ZXNwYWNlKSAtIDEgLSAyICogZGVwdGhdOwotICAgIHByaW50ZigiJXNmb3VuZCBjaHVuayAnJXMnIG9mIHNpemUgJSIgUFJJdTY0ICJcbiIsIGluZGVudCwgY2h1bmssIGNodW5rX3NpemUpOworICAgIGlmIChrVXNlSGV4RHVtcCkgeworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBrV2hpdGVzcGFjZVtdID0gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOworICAgICAgICBjb25zdCBjaGFyICppbmRlbnQgPSAma1doaXRlc3BhY2Vbc2l6ZW9mKGtXaGl0ZXNwYWNlKSAtIDEgLSAyICogZGVwdGhdOworICAgICAgICBwcmludGYoIiVzZm91bmQgY2h1bmsgJyVzJyBvZiBzaXplICUiIFBSSXU2NCAiXG4iLCBpbmRlbnQsIGNodW5rLCBjaHVua19zaXplKTsKIAotICAgIGNoYXIgYnVmZmVyWzI1Nl07Ci0gICAgc2l6ZV90IG4gPSBjaHVua19zaXplOwotICAgIGlmIChuID4gc2l6ZW9mKGJ1ZmZlcikpIHsKLSAgICAgICAgbiA9IHNpemVvZihidWZmZXIpOwotICAgIH0KLSAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgqb2Zmc2V0LCBidWZmZXIsIG4pCi0gICAgICAgICAgICA8IChzc2l6ZV90KW4pIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgIH0KKyAgICAgICAgY2hhciBidWZmZXJbMjU2XTsKKyAgICAgICAgc2l6ZV90IG4gPSBjaHVua19zaXplOworICAgICAgICBpZiAobiA+IHNpemVvZihidWZmZXIpKSB7CisgICAgICAgICAgICBuID0gc2l6ZW9mKGJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCwgYnVmZmVyLCBuKQorICAgICAgICAgICAgICAgIDwgKHNzaXplX3QpbikgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICB9CiAKLSAgICBoZXhkdW1wKGJ1ZmZlciwgbik7Ci0jZW5kaWYKKyAgICAgICAgaGV4ZHVtcChidWZmZXIsIG4pOworICAgIH0KIAogICAgIFBhdGhBZGRlciBhdXRvQWRkZXIoJm1QYXRoLCBjaHVua190eXBlKTsKIApAQCAtMTE4NSw2ICsxMTg1LDExIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAoIXRpbWVzY2FsZSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJ0aW1lc2NhbGUgc2hvdWxkIG5vdCBiZSBaRVJPLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIG1MYXN0VHJhY2stPnRpbWVzY2FsZSA9IG50b2hsKHRpbWVzY2FsZSk7CiAKICAgICAgICAgICAgIC8vIDE0NDk2LTEyIHNheXMgYWxsIG9uZXMgbWVhbnMgaW5kZXRlcm1pbmF0ZSwgYnV0IHNvbWUgZmlsZXMgc2VlbSB0byB1c2UKQEAgLTEzMTQsNyArMTMxOSw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICB1aW50MTZfdCBkYXRhX3JlZl9pbmRleCA9IFUxNl9BVCgmYnVmZmVyWzZdKTsKKyAgICAgICAgICAgIHVpbnQxNl90IGRhdGFfcmVmX2luZGV4IF9fdW51c2VkID0gVTE2X0FUKCZidWZmZXJbNl0pOwogICAgICAgICAgICAgdWludDMyX3QgbnVtX2NoYW5uZWxzID0gVTE2X0FUKCZidWZmZXJbMTZdKTsKIAogICAgICAgICAgICAgdWludDE2X3Qgc2FtcGxlX3NpemUgPSBVMTZfQVQoJmJ1ZmZlclsxOF0pOwpAQCAtMTM2Nyw3ICsxMzcyLDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHVpbnQxNl90IGRhdGFfcmVmX2luZGV4ID0gVTE2X0FUKCZidWZmZXJbNl0pOworICAgICAgICAgICAgdWludDE2X3QgZGF0YV9yZWZfaW5kZXggX191bnVzZWQgPSBVMTZfQVQoJmJ1ZmZlcls2XSk7CiAgICAgICAgICAgICB1aW50MTZfdCB3aWR0aCA9IFUxNl9BVCgmYnVmZmVyWzYgKyAxOF0pOwogICAgICAgICAgICAgdWludDE2X3QgaGVpZ2h0ID0gVTE2X0FUKCZidWZmZXJbNiArIDIwXSk7CiAKQEAgLTE1NjEsMTMgKzE1NjYsMTMgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gQHh5egotICAgICAgICBjYXNlIEZPVVJDQygnXHhBOScsICd4JywgJ3knLCAneicpOgorICAgICAgICAvLyCpeHl6CisgICAgICAgIGNhc2UgRk9VUkNDKDB4QTksICd4JywgJ3knLCAneicpOgogICAgICAgICB7CiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAKLSAgICAgICAgICAgIC8vIEJlc3QgY2FzZSB0aGUgdG90YWwgZGF0YSBsZW5ndGggaW5zaWRlICJAeHl6IiBib3gKLSAgICAgICAgICAgIC8vIHdvdWxkIGJlIDgsIGZvciBpbnN0YW5jZSAiQHh5eiIgKyAiXHgwMFx4MDRceDE1XHhjNyIgKyAiMCswLyIsCisgICAgICAgICAgICAvLyBCZXN0IGNhc2UgdGhlIHRvdGFsIGRhdGEgbGVuZ3RoIGluc2lkZSAiqXh5eiIgYm94CisgICAgICAgICAgICAvLyB3b3VsZCBiZSA4LCBmb3IgaW5zdGFuY2UgIql4eXoiICsgIlx4MDBceDA0XHgxNVx4YzciICsgIjArMC8iLAogICAgICAgICAgICAgLy8gd2hlcmUgIlx4MDBceDA0IiBpcyB0aGUgdGV4dCBzdHJpbmcgbGVuZ3RoIHdpdGggdmFsdWUgPSA0LAogICAgICAgICAgICAgLy8gIlwweDE1XHhjNyIgaXMgdGhlIGxhbmd1YWdlIGNvZGUgPSBlbiwgYW5kICIwKzAiIGlzIGEKICAgICAgICAgICAgIC8vIGxvY2F0aW9uIChzdHJpbmcpIHZhbHVlIHdpdGggbG9uZ2l0dWRlID0gMCBhbmQgbGF0aXR1ZGUgPSAwLgpAQCAtMTkwNyw3ICsxOTEyLDYgQEAKICAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCAyNCkgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVpbnQzMl90IGR1cmF0aW9uOwogICAgICAgICAgICAgVHJleCB0cmV4OwogICAgICAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKGRhdGFfb2Zmc2V0ICsgNCwgJnRyZXgudHJhY2tfSUQpIHx8CiAgICAgICAgICAgICAgICAgIW1EYXRhU291cmNlLT5nZXRVSW50MzIoZGF0YV9vZmZzZXQgKyA4LCAmdHJleC5kZWZhdWx0X3NhbXBsZV9kZXNjcmlwdGlvbl9pbmRleCkgfHwKQEAgLTIxOTUsNyArMjE5OSw3IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICB9CiAKLSAgICB1aW50NjRfdCBjdGltZSwgbXRpbWUsIGR1cmF0aW9uOworICAgIHVpbnQ2NF90IGN0aW1lIF9fdW51c2VkLCBtdGltZSBfX3VudXNlZCwgZHVyYXRpb24gX191bnVzZWQ7CiAgICAgaW50MzJfdCBpZDsKIAogICAgIGlmICh2ZXJzaW9uID09IDEpIHsKQEAgLTIyMTcsMTIgKzIyMjEsMTMgQEAKICAgICBzaXplX3QgbWF0cml4T2Zmc2V0ID0gZHluU2l6ZSArIDE2OwogICAgIGludDMyX3QgYTAwID0gVTMyX0FUKCZidWZmZXJbbWF0cml4T2Zmc2V0XSk7CiAgICAgaW50MzJfdCBhMDEgPSBVMzJfQVQoJmJ1ZmZlclttYXRyaXhPZmZzZXQgKyA0XSk7Ci0gICAgaW50MzJfdCBkeCA9IFUzMl9BVCgmYnVmZmVyW21hdHJpeE9mZnNldCArIDhdKTsKICAgICBpbnQzMl90IGExMCA9IFUzMl9BVCgmYnVmZmVyW21hdHJpeE9mZnNldCArIDEyXSk7CiAgICAgaW50MzJfdCBhMTEgPSBVMzJfQVQoJmJ1ZmZlclttYXRyaXhPZmZzZXQgKyAxNl0pOwotICAgIGludDMyX3QgZHkgPSBVMzJfQVQoJmJ1ZmZlclttYXRyaXhPZmZzZXQgKyAyMF0pOwogCiAjaWYgMAorICAgIGludDMyX3QgZHggPSBVMzJfQVQoJmJ1ZmZlclttYXRyaXhPZmZzZXQgKyA4XSk7CisgICAgaW50MzJfdCBkeSA9IFUzMl9BVCgmYnVmZmVyW21hdHJpeE9mZnNldCArIDIwXSk7CisKICAgICBBTE9HSSgieCcgPSAlLjJmICogeCArICUuMmYgKiB5ICsgJS4yZiIsCiAgICAgICAgICBhMDAgLyA2NTUzNi4wZiwgYTAxIC8gNjU1MzYuMGYsIGR4IC8gNjU1MzYuMGYpOwogICAgIEFMT0dJKCJ5JyA9ICUuMmYgKiB4ICsgJS4yZiAqIHkgKyAlLjJmIiwKQEAgLTIyODMsNyArMjI4OCw3IEBACiAgICAgY2hhciBjaHVua1s1XTsKICAgICBNYWtlRm91ckNDU3RyaW5nKG1QYXRoWzRdLCBjaHVuayk7CiAgICAgQUxPR1YoIm1ldGE6ICVzIEAgJWxsZCIsIGNodW5rLCBvZmZzZXQpOwotICAgIHN3aXRjaCAobVBhdGhbNF0pIHsKKyAgICBzd2l0Y2ggKChpbnQzMl90KW1QYXRoWzRdKSB7CiAgICAgICAgIGNhc2UgRk9VUkNDKDB4YTksICdhJywgJ2wnLCAnYicpOgogICAgICAgICB7CiAgICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlBbGJ1bTsKQEAgLTI3MDMsNiArMjcwOCwxMSBAQAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAorICAgIGlmICh0cmFjay0+dGltZXNjYWxlID09IDApIHsKKyAgICAgICAgQUxPR0UoInRpbWVzY2FsZSBpbnZhbGlkLiIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMjc4OCwxMCArMjc5OCwxMCBAQAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAotI2lmIDAKLSAgICBwcmludGYoIkVTRCBvZiBzaXplICVkXG4iLCBjc2Rfc2l6ZSk7Ci0gICAgaGV4ZHVtcChjc2QsIGNzZF9zaXplKTsKLSNlbmRpZgorICAgIGlmIChrVXNlSGV4RHVtcCkgeworICAgICAgICBwcmludGYoIkVTRCBvZiBzaXplICVkXG4iLCBjc2Rfc2l6ZSk7CisgICAgICAgIGhleGR1bXAoY3NkLCBjc2Rfc2l6ZSk7CisgICAgfQogCiAgICAgaWYgKGNzZF9zaXplID09IDApIHsKICAgICAgICAgLy8gVGhlcmUncyBubyBmdXJ0aGVyIGluZm9ybWF0aW9uLCBpLmUuIG5vIGNvZGVjIHNwZWNpZmljIGRhdGEKQEAgLTI4NDIsNyArMjg1Miw3IEBACiAKICAgICBpZiAob2JqZWN0VHlwZSA9PSBBT1RfU0JSIHx8IG9iamVjdFR5cGUgPT0gQU9UX1BTKSB7Ly9TQlIgc3BlY2lmaWMgY29uZmlnIHBlciAxNDQ5Ni0zIHRhYmxlIDEuMTMKICAgICAgICAgdWludDMyX3QgZXh0RnJlcUluZGV4ID0gYnIuZ2V0Qml0cyg0KTsKLSAgICAgICAgaW50MzJfdCBleHRTYW1wbGVSYXRlOworICAgICAgICBpbnQzMl90IGV4dFNhbXBsZVJhdGUgX191bnVzZWQ7CiAgICAgICAgIGlmIChleHRGcmVxSW5kZXggPT0gMTUpIHsKICAgICAgICAgICAgIGlmIChjc2Rfc2l6ZSA8IDgpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwpAQCAtMjg5MiwxMiArMjkwMiwxMiBAQAogICAgICAgICBpZiAob2JqZWN0VHlwZSA9PSBBT1RfQUFDX0xDIHx8IG9iamVjdFR5cGUgPT0gQU9UX0VSX0FBQ19MQyB8fAogICAgICAgICAgICAgICAgIG9iamVjdFR5cGUgPT0gQU9UX0VSX0FBQ19MRCB8fCBvYmplY3RUeXBlID09IEFPVF9FUl9BQUNfU0NBTCB8fAogICAgICAgICAgICAgICAgIG9iamVjdFR5cGUgPT0gQU9UX0VSX0JTQUMpIHsKLSAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZnJhbWVMZW5ndGhGbGFnID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZnJhbWVMZW5ndGhGbGFnIF9fdW51c2VkID0gYnIuZ2V0Qml0cygxKTsKIAogICAgICAgICAgICAgY29uc3QgaW50MzJfdCBkZXBlbmRzT25Db3JlQ29kZXIgPSBici5nZXRCaXRzKDEpOwogCiAgICAgICAgICAgICBpZiAoZGVwZW5kc09uQ29yZUNvZGVyICkgewotICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgY29yZUNvZGVyRGVsYXkgPSBici5nZXRCaXRzKDE0KTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGNvcmVDb2RlckRlbGF5IF9fdW51c2VkID0gYnIuZ2V0Qml0cygxNCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGludDMyX3QgZXh0ZW5zaW9uRmxhZyA9IC0xOwpAQCAtMjkyNiw1NCArMjkzNiw1NCBAQAogICAgICAgICAgICAgaWYgKG51bUNoYW5uZWxzID09IDApIHsKICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxzRWZmZWN0aXZlTnVtID0gMDsKICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxzTnVtID0gMDsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IEVsZW1lbnRJbnN0YW5jZVRhZyA9IGJyLmdldEJpdHMoNCk7Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBQcm9maWxlID0gYnIuZ2V0Qml0cygyKTsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFNhbXBsaW5nRnJlcXVlbmN5SW5kZXggPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgRWxlbWVudEluc3RhbmNlVGFnIF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFByb2ZpbGUgX191bnVzZWQgPSBici5nZXRCaXRzKDIpOworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgU2FtcGxpbmdGcmVxdWVuY3lJbmRleCBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7CiAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1Gcm9udENoYW5uZWxFbGVtZW50cyA9IGJyLmdldEJpdHMoNCk7CiAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1TaWRlQ2hhbm5lbEVsZW1lbnRzID0gYnIuZ2V0Qml0cyg0KTsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE51bUJhY2tDaGFubmVsRWxlbWVudHMgPSBici5nZXRCaXRzKDQpOwogICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTnVtTGZlQ2hhbm5lbEVsZW1lbnRzID0gYnIuZ2V0Qml0cygyKTsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE51bUFzc29jRGF0YUVsZW1lbnRzID0gYnIuZ2V0Qml0cygzKTsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE51bVZhbGlkQ2NFbGVtZW50cyA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1Bc3NvY0RhdGFFbGVtZW50cyBfX3VudXNlZCA9IGJyLmdldEJpdHMoMyk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1WYWxpZENjRWxlbWVudHMgX191bnVzZWQgPSBici5nZXRCaXRzKDQpOwogCiAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBNb25vTWl4ZG93blByZXNlbnQgPSBici5nZXRCaXRzKDEpOwogICAgICAgICAgICAgICAgIGlmIChNb25vTWl4ZG93blByZXNlbnQgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE1vbm9NaXhkb3duRWxlbWVudE51bWJlciA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTW9ub01peGRvd25FbGVtZW50TnVtYmVyIF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFN0ZXJlb01peGRvd25QcmVzZW50ID0gYnIuZ2V0Qml0cygxKTsKICAgICAgICAgICAgICAgICBpZiAoU3RlcmVvTWl4ZG93blByZXNlbnQgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFN0ZXJlb01peGRvd25FbGVtZW50TnVtYmVyID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBTdGVyZW9NaXhkb3duRWxlbWVudE51bWJlciBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBNYXRyaXhNaXhkb3duSW5kZXhQcmVzZW50ID0gYnIuZ2V0Qml0cygxKTsKICAgICAgICAgICAgICAgICBpZiAoTWF0cml4TWl4ZG93bkluZGV4UHJlc2VudCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTWF0cml4TWl4ZG93bkluZGV4ID0gYnIuZ2V0Qml0cygyKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBQc2V1ZG9TdXJyb3VuZEVuYWJsZSA9IGJyLmdldEJpdHMoMSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTWF0cml4TWl4ZG93bkluZGV4IF9fdW51c2VkID0gYnIuZ2V0Qml0cygyKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBQc2V1ZG9TdXJyb3VuZEVuYWJsZSBfX3VudXNlZCA9IGJyLmdldEJpdHMoMSk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaW50IGk7CiAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBOdW1Gcm9udENoYW5uZWxFbGVtZW50czsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgRnJvbnRFbGVtZW50SXNDcGUgPSBici5nZXRCaXRzKDEpOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IEZyb250RWxlbWVudFRhZ1NlbGVjdCA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgRnJvbnRFbGVtZW50VGFnU2VsZWN0IF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNOdW0gKz0gRnJvbnRFbGVtZW50SXNDcGUgPyAyIDogMTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IE51bVNpZGVDaGFubmVsRWxlbWVudHM7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFNpZGVFbGVtZW50SXNDcGUgPSBici5nZXRCaXRzKDEpOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFNpZGVFbGVtZW50VGFnU2VsZWN0ID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBTaWRlRWxlbWVudFRhZ1NlbGVjdCBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7CiAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzTnVtICs9IFNpZGVFbGVtZW50SXNDcGUgPyAyIDogMTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IE51bUJhY2tDaGFubmVsRWxlbWVudHM7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IEJhY2tFbGVtZW50SXNDcGUgPSBici5nZXRCaXRzKDEpOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IEJhY2tFbGVtZW50VGFnU2VsZWN0ID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBCYWNrRWxlbWVudFRhZ1NlbGVjdCBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7CiAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzTnVtICs9IEJhY2tFbGVtZW50SXNDcGUgPyAyIDogMTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2hhbm5lbHNFZmZlY3RpdmVOdW0gPSBjaGFubmVsc051bTsKIAogICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgTnVtTGZlQ2hhbm5lbEVsZW1lbnRzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBMZmVFbGVtZW50VGFnU2VsZWN0ID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBMZmVFbGVtZW50VGFnU2VsZWN0IF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNOdW0gKz0gMTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQUxPR1YoIm1wZWc0IGF1ZGlvIGNoYW5uZWxzTnVtID0gJWQiLCBjaGFubmVsc051bSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAKaW5kZXggOWYyMGIxZC4uODQ0YTAxOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcApAQCAtODIzLDYgKzgyMyw4IEBACiAgICAgbUZkID0gLTE7CiAgICAgbUluaXRDaGVjayA9IE5PX0lOSVQ7CiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICBmcmVlKG1Nb292Qm94QnVmZmVyKTsKKyAgICBtTW9vdkJveEJ1ZmZlciA9IE5VTEw7CiB9CiAKIHN0YXR1c190IE1QRUc0V3JpdGVyOjpyZXNldCgpIHsKQEAgLTI4MDAsOCArMjgwMiwxMCBAQAogCiAgICAgbU93bmVyLT53cml0ZUludDE2KDB4MDMpOyAgLy8gWFhYCiAgICAgbU93bmVyLT53cml0ZUludDgoMHgwMCk7ICAgLy8gYnVmZmVyIHNpemUgMjQtYml0Ci0gICAgbU93bmVyLT53cml0ZUludDMyKDk2MDAwKTsgLy8gbWF4IGJpdCByYXRlCi0gICAgbU93bmVyLT53cml0ZUludDMyKDk2MDAwKTsgLy8gYXZnIGJpdCByYXRlCisgICAgaW50MzJfdCBiaXRSYXRlOworICAgIGJvb2wgc3VjY2VzcyA9IG1NZXRhLT5maW5kSW50MzIoa0tleUJpdFJhdGUsICZiaXRSYXRlKTsKKyAgICBtT3duZXItPndyaXRlSW50MzIoc3VjY2VzcyA/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+YXNCaW5kZXIoKS5nZXQoKTsgfQorICAgIHZpcnR1YWwgSUJpbmRlciAqb25Bc0JpbmRlcigpIHsgcmV0dXJuIElJbnRlcmZhY2U6OmFzQmluZGVyKG1SZW1vdGVPTVgpLmdldCgpOyB9CiAKICAgICB2aXJ0dWFsIGJvb2wgbGl2ZXNMb2NhbGx5KG5vZGVfaWQgbm9kZSwgcGlkX3QgcGlkKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwCmluZGV4IGM2NzMzODcuLjJhMDEyZjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENvZGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAKQEAgLTEwMSwxMCArMTAxLDEwIEBACiAjdW5kZWYgRkFDVE9SWV9DUkVBVEVfRU5DT0RFUgogI3VuZGVmIEZBQ1RPUllfUkVGCiAKLSNkZWZpbmUgQ09ERUNfTE9HSSh4LCAuLi4pIEFMT0dJKCJbJXNdICJ4LCBtQ29tcG9uZW50TmFtZSwgIyNfX1ZBX0FSR1NfXykKLSNkZWZpbmUgQ09ERUNfTE9HVih4LCAuLi4pIEFMT0dWKCJbJXNdICJ4LCBtQ29tcG9uZW50TmFtZSwgIyNfX1ZBX0FSR1NfXykKLSNkZWZpbmUgQ09ERUNfTE9HVyh4LCAuLi4pIEFMT0dXKCJbJXNdICJ4LCBtQ29tcG9uZW50TmFtZSwgIyNfX1ZBX0FSR1NfXykKLSNkZWZpbmUgQ09ERUNfTE9HRSh4LCAuLi4pIEFMT0dFKCJbJXNdICJ4LCBtQ29tcG9uZW50TmFtZSwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgQ09ERUNfTE9HSSh4LCAuLi4pIEFMT0dJKCJbJXNdICIgeCwgbUNvbXBvbmVudE5hbWUsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIENPREVDX0xPR1YoeCwgLi4uKSBBTE9HVigiWyVzXSAiIHgsIG1Db21wb25lbnROYW1lLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBDT0RFQ19MT0dXKHgsIC4uLikgQUxPR1coIlslc10gIiB4LCBtQ29tcG9uZW50TmFtZSwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgQ09ERUNfTE9HRSh4LCAuLi4pIEFMT0dFKCJbJXNdICIgeCwgbUNvbXBvbmVudE5hbWUsICMjX19WQV9BUkdTX18pCiAKIHN0cnVjdCBPTVhDb2RlY09ic2VydmVyIDogcHVibGljIEJuT01YT2JzZXJ2ZXIgewogICAgIE9NWENvZGVjT2JzZXJ2ZXIoKSB7CkBAIC00NTEsNyArNDUxLDcgQEAKICAgICAvLyBhc3NlcnRpb24sIGxldCdzIGJlIGxlbmllbnQgZm9yIG5vdy4uLgogICAgIC8vIENIRUNLKChwdHJbNF0gPj4gMikgPT0gMHgzZik7ICAvLyByZXNlcnZlZAogCi0gICAgc2l6ZV90IGxlbmd0aFNpemUgPSAxICsgKHB0cls0XSAmIDMpOworICAgIHNpemVfdCBsZW5ndGhTaXplIF9fdW51c2VkID0gMSArIChwdHJbNF0gJiAzKTsKIAogICAgIC8vIGNvbW1lbnRlZCBvdXQgY2hlY2sgYmVsb3cgYXMgSDI2NF9RVkdBXzUwMF9OT19BVURJTy4zZ3AKICAgICAvLyB2aW9sYXRlcyBpdC4uLgpAQCAtNjI5LDEwICs2MjksMTQgQEAKICAgICAgICAgLy8gVGhlc2UgYXJlIFBDTS1saWtlIGZvcm1hdHMgd2l0aCBhIGZpeGVkIHNhbXBsZSByYXRlIGJ1dAogICAgICAgICAvLyBhIHZhcmlhYmxlIG51bWJlciBvZiBjaGFubmVscy4KIAorICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGU7CiAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHM7CiAgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmbnVtQ2hhbm5lbHMpKTsKKyAgICAgICAgaWYgKCFtZXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVSYXRlKSkgeworICAgICAgICAgICAgc2FtcGxlUmF0ZSA9IDgwMDA7CisgICAgICAgIH0KIAotICAgICAgICBzZXRHNzExRm9ybWF0KG51bUNoYW5uZWxzKTsKKyAgICAgICAgc2V0RzcxMUZvcm1hdChzYW1wbGVSYXRlLCBudW1DaGFubmVscyk7CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19SQVcsIG1NSU1FKSkgewogICAgICAgICBDSEVDSyghbUlzRW5jb2Rlcik7CiAKQEAgLTIwMTEsNyArMjAxNSw2IEBACiBPTVhDb2RlYzo6QnVmZmVySW5mbyogT01YQ29kZWM6OmRlcXVldWVCdWZmZXJGcm9tTmF0aXZlV2luZG93KCkgewogICAgIC8vIERlcXVldWUgdGhlIG5leHQgYnVmZmVyIGZyb20gdGhlIG5hdGl2ZSB3aW5kb3cuCiAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmOwotICAgIGludCBmZW5jZUZkID0gLTE7CiAgICAgaW50IGVyciA9IG5hdGl2ZV93aW5kb3dfZGVxdWV1ZV9idWZmZXJfYW5kX3dhaXQobU5hdGl2ZVdpbmRvdy5nZXQoKSwgJmJ1Zik7CiAgICAgaWYgKGVyciAhPSAwKSB7CiAgICAgICBDT0RFQ19MT0dFKCJkZXF1ZXVlQnVmZmVyIGZhaWxlZCB3LyBlcnJvciAweCUwOHgiLCBlcnIpOwpAQCAtMjExNiw3ICsyMTE5LDYgQEAKICAgICAvLyBvbiB0aGUgc2NyZWVuIGFuZCB0aGVuIGJlZW4gcmVwbGFjZWQsIHNvIGFuIHByZXZpb3VzIHZpZGVvIGZyYW1lcyBhcmUKICAgICAvLyBndWFyYW50ZWVkIE5PVCB0byBiZSBjdXJyZW50bHkgZGlzcGxheWVkLgogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQnVmcyArIDE7IGkrKykgewotICAgICAgICBpbnQgZmVuY2VGZCA9IC0xOwogICAgICAgICBlcnIgPSBuYXRpdmVfd2luZG93X2RlcXVldWVfYnVmZmVyX2FuZF93YWl0KG1OYXRpdmVXaW5kb3cuZ2V0KCksICZhbmIpOwogICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IGRlcXVldWVCdWZmZXIgZmFpbGVkOiAlcyAoJWQpIiwKQEAgLTM2MjMsOSArMzYyNSw5IEBACiAgICAgICAgICAgICBzaXplb2YoZGVmKSk7CiB9CiAKLXZvaWQgT01YQ29kZWM6OnNldEc3MTFGb3JtYXQoaW50MzJfdCBudW1DaGFubmVscykgewordm9pZCBPTVhDb2RlYzo6c2V0RzcxMUZvcm1hdChpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgbnVtQ2hhbm5lbHMpIHsKICAgICBDSEVDSyghbUlzRW5jb2Rlcik7Ci0gICAgc2V0UmF3QXVkaW9Gb3JtYXQoa1BvcnRJbmRleElucHV0LCA4MDAwLCBudW1DaGFubmVscyk7CisgICAgc2V0UmF3QXVkaW9Gb3JtYXQoa1BvcnRJbmRleElucHV0LCBzYW1wbGVSYXRlLCBudW1DaGFubmVscyk7CiB9CiAKIHZvaWQgT01YQ29kZWM6OnNldEltYWdlT3V0cHV0Rm9ybWF0KApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09nZ0V4dHJhY3Rvci5jcHAKaW5kZXggMGE3MjBhYy4uYmNhMjZiOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PZ2dFeHRyYWN0b3IuY3BwCkBAIC04NTEsNiArODUxLDcgQEAKICAgICAgICAgeyAiVFJBQ0tOVU1CRVIiLCBrS2V5Q0RUcmFja051bWJlciB9LAogICAgICAgICB7ICJESVNDTlVNQkVSIiwga0tleURpc2NOdW1iZXIgfSwKICAgICAgICAgeyAiREFURSIsIGtLZXlEYXRlIH0sCisgICAgICAgIHsgIllFQVIiLCBrS2V5WWVhciB9LAogICAgICAgICB7ICJMWVJJQ0lTVCIsIGtLZXlXcml0ZXIgfSwKICAgICAgICAgeyAiTUVUQURBVEFfQkxPQ0tfUElDVFVSRSIsIGtLZXlBbGJ1bUFydCB9LAogICAgICAgICB7ICJBTkRST0lEX0xPT1AiLCBrS2V5QXV0b0xvb3AgfSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcAppbmRleCA0NDQ5ZDU3Li5kYjMzZTgzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwCkBAIC0yOCw5ICsyOCw2IEBACiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5oPgogI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvVmlkZW9GcmFtZS5oPgogCi0vLyBTb25pdm94IGluY2x1ZGVzCi0jaW5jbHVkZSA8bGlic29uaXZveC9lYXMuaD4KLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBTdGFnZWZyaWdodE1lZGlhU2Nhbm5lcjo6U3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIoKSB7fQpAQCAtNTcsNTQgKzU0LDYgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyBNZWRpYVNjYW5SZXN1bHQgSGFuZGxlTUlESSgKLSAgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsIE1lZGlhU2Nhbm5lckNsaWVudCAqY2xpZW50KSB7Ci0gICAgLy8gZ2V0IHRoZSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24gYW5kIGRvIHNhbml0eSBjaGVjawotICAgIGNvbnN0IFNfRUFTX0xJQl9DT05GSUcqIHBMaWJDb25maWcgPSBFQVNfQ29uZmlnKCk7Ci0gICAgaWYgKChwTGliQ29uZmlnID09IE5VTEwpIHx8IChMSUJfVkVSU0lPTiAhPSBwTGliQ29uZmlnLT5saWJWZXJzaW9uKSkgewotICAgICAgICBBTE9HRSgiRUFTIGxpYnJhcnkvaGVhZGVyIG1pc21hdGNoXG4iKTsKLSAgICAgICAgcmV0dXJuIE1FRElBX1NDQU5fUkVTVUxUX0VSUk9SOwotICAgIH0KLSAgICBFQVNfSTMyIHRlbXA7Ci0KLSAgICAvLyBzcGluIHVwIGEgbmV3IEVBUyBlbmdpbmUKLSAgICBFQVNfREFUQV9IQU5ETEUgZWFzRGF0YSA9IE5VTEw7Ci0gICAgRUFTX0hBTkRMRSBlYXNIYW5kbGUgPSBOVUxMOwotICAgIEVBU19SRVNVTFQgcmVzdWx0ID0gRUFTX0luaXQoJmVhc0RhdGEpOwotICAgIGlmIChyZXN1bHQgPT0gRUFTX1NVQ0NFU1MpIHsKLSAgICAgICAgRUFTX0ZJTEUgZmlsZTsKLSAgICAgICAgZmlsZS5wYXRoID0gZmlsZW5hbWU7Ci0gICAgICAgIGZpbGUuZmQgPSAwOwotICAgICAgICBmaWxlLm9mZnNldCA9IDA7Ci0gICAgICAgIGZpbGUubGVuZ3RoID0gMDsKLSAgICAgICAgcmVzdWx0ID0gRUFTX09wZW5GaWxlKGVhc0RhdGEsICZmaWxlLCAmZWFzSGFuZGxlKTsKLSAgICB9Ci0gICAgaWYgKHJlc3VsdCA9PSBFQVNfU1VDQ0VTUykgewotICAgICAgICByZXN1bHQgPSBFQVNfUHJlcGFyZShlYXNEYXRhLCBlYXNIYW5kbGUpOwotICAgIH0KLSAgICBpZiAocmVzdWx0ID09IEVBU19TVUNDRVNTKSB7Ci0gICAgICAgIHJlc3VsdCA9IEVBU19QYXJzZU1ldGFEYXRhKGVhc0RhdGEsIGVhc0hhbmRsZSwgJnRlbXApOwotICAgIH0KLSAgICBpZiAoZWFzSGFuZGxlKSB7Ci0gICAgICAgIEVBU19DbG9zZUZpbGUoZWFzRGF0YSwgZWFzSGFuZGxlKTsKLSAgICB9Ci0gICAgaWYgKGVhc0RhdGEpIHsKLSAgICAgICAgRUFTX1NodXRkb3duKGVhc0RhdGEpOwotICAgIH0KLQotICAgIGlmIChyZXN1bHQgIT0gRUFTX1NVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIE1FRElBX1NDQU5fUkVTVUxUX1NLSVBQRUQ7Ci0gICAgfQotCi0gICAgY2hhciBidWZmZXJbMjBdOwotICAgIHNwcmludGYoYnVmZmVyLCAiJWxkIiwgdGVtcCk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gY2xpZW50LT5hZGRTdHJpbmdUYWcoImR1cmF0aW9uIiwgYnVmZmVyKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBNRURJQV9TQ0FOX1JFU1VMVF9FUlJPUjsKLSAgICB9Ci0gICAgcmV0dXJuIE1FRElBX1NDQU5fUkVTVUxUX09LOwotfQotCiBNZWRpYVNjYW5SZXN1bHQgU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXI6OnByb2Nlc3NGaWxlKAogICAgICAgICBjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICptaW1lVHlwZSwKICAgICAgICAgTWVkaWFTY2FubmVyQ2xpZW50ICZjbGllbnQpIHsKQEAgLTEzMCwxOCArNzksNiBAQAogICAgICAgICByZXR1cm4gTUVESUFfU0NBTl9SRVNVTFRfU0tJUFBFRDsKICAgICB9CiAKLSAgICBpZiAoIXN0cmNhc2VjbXAoZXh0ZW5zaW9uLCAiLm1pZCIpCi0gICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChleHRlbnNpb24sICIuc21mIikKLSAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKGV4dGVuc2lvbiwgIi5pbXkiKQotICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAoZXh0ZW5zaW9uLCAiLm1pZGkiKQotICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAoZXh0ZW5zaW9uLCAiLnhtZiIpCi0gICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChleHRlbnNpb24sICIucnR0dGwiKQotICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAoZXh0ZW5zaW9uLCAiLnJ0eCIpCi0gICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChleHRlbnNpb24sICIub3RhIikKLSAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKGV4dGVuc2lvbiwgIi5teG1mIikpIHsKLSAgICAgICAgcmV0dXJuIEhhbmRsZU1JREkocGF0aCwgJmNsaWVudCk7Ci0gICAgfQotCiAgICAgc3A8TWVkaWFNZXRhZGF0YVJldHJpZXZlcj4gbVJldHJpZXZlcihuZXcgTWVkaWFNZXRhZGF0YVJldHJpZXZlcik7CiAKICAgICBpbnQgZmQgPSBvcGVuKHBhdGgsIE9fUkRPTkxZIHwgT19MQVJHRUZJTEUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5jcHAKaW5kZXggNTMwMzgzYi4uZThhYmY0OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuY3BwCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvTWV0YWRhdGFCdWZmZXJUeXBlLmg+CiAKICNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+CisjaW5jbHVkZSA8Z3VpL0J1ZmZlckl0ZW0uaD4KICNpbmNsdWRlIDxndWkvSVN1cmZhY2VDb21wb3Nlci5oPgogI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlckFsbG9jLmg+CiAjaW5jbHVkZSA8T01YX0NvbXBvbmVudC5oPgpAQCAtMjkwLDcgKzI5MSw3IEBACiAgICAgLy8gVE9ETzogbUN1cnJlbnRTbG90IGNhbiBiZSBtYWRlIGEgYnVmZmVyc3RhdGUgc2luY2UgdGhlcmUKICAgICAvLyBjYW4gYmUgbW9yZSB0aGFuIG9uZSAiY3VycmVudCIgc2xvdHMuCiAKLSAgICBCdWZmZXJRdWV1ZTo6QnVmZmVySXRlbSBpdGVtOworICAgIEJ1ZmZlckl0ZW0gaXRlbTsKICAgICAvLyBJZiB0aGUgcmVjb3JkaW5nIGhhcyBzdGFydGVkIGFuZCB0aGUgcXVldWUgaXMgZW1wdHksIHRoZW4ganVzdAogICAgIC8vIHdhaXQgaGVyZSB0aWxsIHRoZSBmcmFtZXMgY29tZSBpbiBmcm9tIHRoZSBjbGllbnQgc2lkZQogICAgIHdoaWxlIChtU3RhcnRlZCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVGltZWRFdmVudFF1ZXVlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1RpbWVkRXZlbnRRdWV1ZS5jcHAKaW5kZXggMWZkYjI0NC4uN2QxNTIyMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVGltZWRFdmVudFF1ZXVlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9UaW1lZEV2ZW50UXVldWUuY3BwCkBAIC01Miw3ICs1Miw3IEBACiBUaW1lZEV2ZW50UXVldWU6On5UaW1lZEV2ZW50UXVldWUoKSB7CiAgICAgc3RvcCgpOwogICAgIGlmIChtUG93ZXJNYW5hZ2VyICE9IDApIHsKLSAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gbVBvd2VyTWFuYWdlci0+YXNCaW5kZXIoKTsKKyAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gSUludGVyZmFjZTo6YXNCaW5kZXIobVBvd2VyTWFuYWdlcik7CiAgICAgICAgIGJpbmRlci0+dW5saW5rVG9EZWF0aChtRGVhdGhSZWNpcGllbnQpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcAppbmRleCAyMTRlMmZjLi45ODdmMTJkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwCkBAIC0yMDAsMTQgKzIwMCwxNCBAQAogICAgICAgICAgICAgQUxPR0UoImIvMjM2ODA3ODAiKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KLSAgICAgICAgdWludDhfdCBwcm9maWxlID0gcHRyWzFdOwotICAgICAgICB1aW50OF90IGxldmVsID0gcHRyWzNdOworICAgICAgICB1aW50OF90IHByb2ZpbGUgX191bnVzZWQgPSBwdHJbMV07CisgICAgICAgIHVpbnQ4X3QgbGV2ZWwgX191bnVzZWQgPSBwdHJbM107CiAKICAgICAgICAgLy8gVGhlcmUgaXMgZGVjb2RhYmxlIGNvbnRlbnQgb3V0IHRoZXJlIHRoYXQgZmFpbHMgdGhlIGZvbGxvd2luZwogICAgICAgICAvLyBhc3NlcnRpb24sIGxldCdzIGJlIGxlbmllbnQgZm9yIG5vdy4uLgogICAgICAgICAvLyBDSEVDSygocHRyWzRdID4+IDIpID09IDB4M2YpOyAgLy8gcmVzZXJ2ZWQKIAotICAgICAgICBzaXplX3QgbGVuZ3RoU2l6ZSA9IDEgKyAocHRyWzRdICYgMyk7CisgICAgICAgIHNpemVfdCBsZW5ndGhTaXplIF9fdW51c2VkID0gMSArIChwdHJbNF0gJiAzKTsKIAogICAgICAgICAvLyBjb21tZW50ZWQgb3V0IGNoZWNrIGJlbG93IGFzIEgyNjRfUVZHQV81MDBfTk9fQVVESU8uM2dwCiAgICAgICAgIC8vIHZpb2xhdGVzIGl0Li4uCkBAIC0yOTcsOCArMjk3LDggQEAKICAgICAgICAgICAgIEFMT0dFKCJiLzIzNjgwNzgwIik7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIHVpbnQ4X3QgcHJvZmlsZSA9IHB0clsxXSAmIDMxOwotICAgICAgICB1aW50OF90IGxldmVsID0gcHRyWzEyXTsKKyAgICAgICAgdWludDhfdCBwcm9maWxlIF9fdW51c2VkID0gcHRyWzFdICYgMzE7CisgICAgICAgIHVpbnQ4X3QgbGV2ZWwgX191bnVzZWQgPSBwdHJbMTJdOwogICAgICAgICBwdHIgKz0gMjI7CiAgICAgICAgIHNpemUgLT0gMjI7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2F2Y191dGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9hdmNfdXRpbHMuY3BwCmluZGV4IGNiZGI4MTYuLjVlYzM0MzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2F2Y191dGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYXZjX3V0aWxzLmNwcApAQCAtNTA1LDggKzUwNSw4IEBACiAgICAgQ0hFQ0tfTkUodmlkZW9fb2JqZWN0X3R5cGVfaW5kaWNhdGlvbiwKICAgICAgICAgICAgICAweDIxdSAvKiBGaW5lIEdyYW51bGFyaXR5IFNjYWxhYmxlICovKTsKIAotICAgIHVuc2lnbmVkIHZpZGVvX29iamVjdF9sYXllcl92ZXJpZDsKLSAgICB1bnNpZ25lZCB2aWRlb19vYmplY3RfbGF5ZXJfcHJpb3JpdHk7CisgICAgdW5zaWduZWQgdmlkZW9fb2JqZWN0X2xheWVyX3ZlcmlkIF9fdW51c2VkOworICAgIHVuc2lnbmVkIHZpZGVvX29iamVjdF9sYXllcl9wcmlvcml0eSBfX3VudXNlZDsKICAgICBpZiAoYnIuZ2V0Qml0cygxKSkgewogICAgICAgICB2aWRlb19vYmplY3RfbGF5ZXJfdmVyaWQgPSBici5nZXRCaXRzKDQpOwogICAgICAgICB2aWRlb19vYmplY3RfbGF5ZXJfcHJpb3JpdHkgPSBici5nZXRCaXRzKDMpOwpAQCAtNTY4LDcgKzU2OCw3IEBACiAgICAgdW5zaWduZWQgdmlkZW9fb2JqZWN0X2xheWVyX2hlaWdodCA9IGJyLmdldEJpdHMoMTMpOwogICAgIENIRUNLKGJyLmdldEJpdHMoMSkpOyAgLy8gbWFya2VyX2JpdAogCi0gICAgdW5zaWduZWQgaW50ZXJsYWNlZCA9IGJyLmdldEJpdHMoMSk7CisgICAgdW5zaWduZWQgaW50ZXJsYWNlZCBfX3VudXNlZCA9IGJyLmdldEJpdHMoMSk7CiAKICAgICAqd2lkdGggPSB2aWRlb19vYmplY3RfbGF5ZXJfd2lkdGg7CiAgICAgKmhlaWdodCA9IHZpZGVvX29iamVjdF9sYXllcl9oZWlnaHQ7CkBAIC02MTQsNyArNjE0LDcgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHVuc2lnbmVkIHByb3RlY3Rpb24gPSAoaGVhZGVyID4+IDE2KSAmIDE7CisgICAgdW5zaWduZWQgcHJvdGVjdGlvbiBfX3VudXNlZCA9IChoZWFkZXIgPj4gMTYpICYgMTsKIAogICAgIHVuc2lnbmVkIGJpdHJhdGVfaW5kZXggPSAoaGVhZGVyID4+IDEyKSAmIDB4MGY7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5jcHAKaW5kZXggYWNhMjYxYS4uOTRiMWM1YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5jcHAKQEAgLTkwNCw3ICs5MDQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKm5leHRUaW1lU3RhbXAgKz0gbVN0cmVhbUluZm8tPmFhY1NhbXBsZXNQZXJGcmFtZSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDBsbCAvIG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlOwogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImFkanVzdGVkIG5leHRUaW1lU3RhbXAvc2l6ZSB0byAlbGxkLyVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5leHRUaW1lU3RhbXAsICpjdXJyZW50QnVmTGVmdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpICpuZXh0VGltZVN0YW1wLCAqY3VycmVudEJ1ZkxlZnQpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW92ZSB0byBuZXh0IHRpbWVzdGFtcCBpbiBsaXN0CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUJ1ZmZlclRpbWVzdGFtcHMuc2l6ZSgpID4gMCkgewpAQCAtOTEzLDcgKzkxMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlclNpemVzLnJlbW92ZUF0KDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCdWZMZWZ0ID0gJm1CdWZmZXJTaXplcy5lZGl0SXRlbUF0KDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJtb3ZlZCB0byBuZXh0IHRpbWUvc2l6ZTogJWxsZC8lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmV4dFRpbWVTdGFtcCwgKmN1cnJlbnRCdWZMZWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpICpuZXh0VGltZVN0YW1wLCAqY3VycmVudEJ1ZkxlZnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGxpbWl0IG91dHB1dCBidWZmZXIgc2l6ZSB0byBtYXRjaCBpbnB1dCBidWZmZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoZS5nIHdoZW4gYW4gaW5wdXQgYnVmZmVyIGNvbnRhaW5lZCA0ICJzdWIiIGZyYW1lcywgb3V0cHV0CkBAIC0xMDIxLDggKzEwMjEsNiBAQAogfQogCiB2b2lkIFNvZnRBQUMyOjpkcmFpbkRlY29kZXIoKSB7Ci0gICAgaW50MzJfdCBvdXRwdXREZWxheSA9IG1TdHJlYW1JbmZvLT5vdXRwdXREZWxheSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVsczsKLQogICAgIC8vIGZsdXNoIGRlY29kZXIgdW50aWwgb3V0cHV0RGVsYXkgaXMgY29tcGVuc2F0ZWQKICAgICB3aGlsZSAobU91dHB1dERlbGF5Q29tcGVuc2F0ZWQgPiAwKSB7CiAgICAgICAgIC8vIGEgYnVmZmVyIGJpZyBlbm91Z2ggZm9yIE1BWF9DSEFOTkVMX0NPVU5UIGNoYW5uZWxzIG9mIGRlY29kZWQgSEUtQUFDCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FBQ0VuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BQUNFbmNvZGVyLmNwcAppbmRleCA4YjUwMDdlLi5iZWJiOWRjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FBQ0VuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQUFDRW5jb2Rlci5jcHAKQEAgLTIxNCw4ICsyMTQsNiBAQAogCiBzdGF0dXNfdCBBQUNFbmNvZGVyOjpyZWFkKAogICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLSAgICBzdGF0dXNfdCBlcnI7Ci0KICAgICAqb3V0ID0gTlVMTDsKIAogICAgIGludDY0X3Qgc2Vla1RpbWVVczsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3AvYmFzaWNfb3AuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3AvYmFzaWNfb3AuaAppbmRleCA1Y2Q3ZTVmLi5iYmM3NTNiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL2Jhc2ljX29wLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9iYXNpY19vcC5oCkBAIC01MTgsOCArNTE4LDYgQEAKICAgICAgICAgcmV0dXJuICBBU01fTF9zaHIoIExfdmFyMSwgLXZhcjIpOwogICAgIH0KICNlbHNlCi0gICAgV29yZDMyIExfdmFyX291dCA9IDBMOwotCiAgICAgaWYgKHZhcjIgPD0gMCkKICAgICB7CiAgICAgICAgIExfdmFyMSA9IExfc2hyKExfdmFyMSwgKFdvcmQxNiktdmFyMik7CkBAIC01NDAsNyArNTM4LDYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBMX3ZhcjEgPDw9IDE7Ci0gICAgICAgICAgICBMX3Zhcl9vdXQgPSBMX3ZhcjE7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIChMX3ZhcjEpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9vcGVyXzMyYi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9vcGVyXzMyYi5jCmluZGV4IDFkMDI5ZmMuLjRmZDE2YTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3Avb3Blcl8zMmIuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL29wZXJfMzJiLmMKQEAgLTI0NSwxMCArMjQ1LDkgQEAKIFdvcmQzMiByc3FydChXb3JkMzIgdmFsdWUsICAgICAvKiE8IE9wZXJhbmQgdG8gc3F1YXJlIHJvb3QgKDAuMCAuLi4gMSkgKi8KICAgICAgICAgICAgICBXb3JkMzIgYWNjdXJhY3kpICAvKiE8IE51bWJlciBvZiB2YWxpZCBiaXRzIHRoYXQgd2lsbCBiZSBjYWxjdWxhdGVkICovCiB7Ci0gICAgVU5VU0VEKGFjY3VyYWN5KTsKLQogICAgIFdvcmQzMiByb290ID0gMDsKIAlXb3JkMzIgc2NhbGU7CisgICAgVU5VU0VEKGFjY3VyYWN5KTsKIAogCWlmKHZhbHVlIDwgMCkKIAkJcmV0dXJuIDA7CkBAIC0zNTEsMTIgKzM1MCwxMSBAQAogICBVV29yZDMyIGlQYXJ0OwogICBVV29yZDMyIGZQYXJ0OwogICBXb3JkMzIgcmVzOwotICBXb3JkMzIgdG1wLCB0bXAyOwotICBXb3JkMzIgc2hpZnQsIHNoaWZ0MjsKKyAgV29yZDMyIHRtcDsKIAotICB0bXAyID0gLXg7Ci0gIGlQYXJ0ID0gdG1wMiAvIHk7Ci0gIGZQYXJ0ID0gdG1wMiAtIGlQYXJ0Knk7CisgIHRtcCA9IC14OworICBpUGFydCA9IHRtcCAvIHk7CisgIGZQYXJ0ID0gdG1wIC0gaVBhcnQqeTsKICAgaVBhcnQgPSBtaW4oaVBhcnQsSU5UX0JJVFMtMSk7CiAKICAgcmVzID0gcG93MlRhYmxlWyhQT1cyX1RBQkxFX1NJWkUqZlBhcnQpL3ldID4+IGlQYXJ0OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWFjZW5jLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hYWNlbmMuYwppbmRleCA0MGRiOTJjLi5kZjE3Nzg3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hYWNlbmMuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hYWNlbmMuYwpAQCAtMzksMTggKzM5LDIwIEBACiBWT19VMzIgVk9fQVBJIHZvQUFDRW5jSW5pdChWT19IQU5ETEUgKiBwaENvZGVjLFZPX0FVRElPX0NPRElOR1RZUEUgdlR5cGUsIFZPX0NPREVDX0lOSVRfVVNFUkRBVEEgKnBVc2VyRGF0YSkKIHsKIAlBQUNfRU5DT0RFUipoQWFjRW5jOwotCUFBQ0VOQ19DT05GSUcgY29uZmlnOwogCWludCBlcnJvcjsKIAogI2lmZGVmIFVTRV9ERUFVTFRfTUVNCiAJVk9fTUVNX09QRVJBVE9SIHZvTWVtb3ByYXRvcjsKICNlbmRpZgogCVZPX01FTV9PUEVSQVRPUiAqcE1lbU9QOworCisjaWZkZWYgVVNFX0RFQVVMVF9NRU0KIAlpbnQgaW50ZXJNZW07CisgICAgICAgIGludGVyTWVtID0gMDsKKyNlbmRpZgogCiAgICAgICAgIFVOVVNFRCh2VHlwZSk7CiAKLQlpbnRlck1lbSA9IDA7CiAJZXJyb3IgPSAwOwogCiAJLyogaW5pdCB0aGUgbWVtb3J5IG9wZXJhdG9yICovCkBAIC0yMTQsNyArMjE2LDcgQEAKIAlBQUNfRU5DT0RFUiogaEFhY0VuYyA9IChBQUNfRU5DT0RFUiopaENvZGVjOwogCVdvcmQxNiBudW1BbmNEYXRhQnl0ZXM9MDsKIAlXb3JkMzIgIGluYnVmbGVuOwotCWludCByZXQsIGxlbmd0aDsKKwlpbnQgbGVuZ3RoOwogCWlmKE5VTEwgPT0gaEFhY0VuYykKIAkJcmV0dXJuIFZPX0VSUl9JTlZBTElEX0FSRzsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWFjZW5jX2NvcmUuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FhY2VuY19jb3JlLmMKaW5kZXggY2VjYmM4Zi4uZGU0NTJkNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWFjZW5jX2NvcmUuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hYWNlbmNfY29yZS5jCkBAIC01OCw3ICs1OCw2IEBACiAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgQUFDRU5DX0NPTkZJRyAgICAgY29uZmlnICAgLyogcHJlLWluaXRpYWxpemVkIGNvbmZpZyBzdHJ1Y3QgKi8KICAgICAgICAgICAgICAgICAgICAgICkKIHsKLSAgV29yZDMyIGk7CiAgIFdvcmQzMiBlcnJvciA9IDA7CiAgIFdvcmQxNiBwcm9maWxlID0gMTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWRqX3Roci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWRqX3Roci5jCmluZGV4IDQ3MTYzMWMuLjhiOGJlMGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2Fkal90aHIuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hZGpfdGhyLmMKQEAgLTk2LDcgKzk2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIE1JTlNOUl9BREFQVF9QQVJBTSAqbXNhUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgICAgIG5DaGFubmVscykKIHsKLSAgV29yZDE2IGNoLCBzZmIsIHNmYk9mZnMsIHNoaWZ0OworICBXb3JkMTYgY2gsIHNmYiwgc2ZiT2ZmczsKICAgV29yZDMyIG5TZmIsIGF2Z0VuOwogICBXb3JkMTYgbG9nX2F2Z0VuID0gMDsKICAgV29yZDMyIHN0YXJ0UmF0aW9feF9hdmdFbiA9IDA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iaXRidWZmZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JpdGJ1ZmZlci5jCmluZGV4IDBjZTkzZDMuLjE1ZWViZDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JpdGJ1ZmZlci5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JpdGJ1ZmZlci5jCkBAIC0yNCwyOSArMjQsNiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKLSogZnVuY3Rpb24gbmFtZTogdXBkYXRlQml0QnVmV29yZFB0cgotKiBkZXNjcmlwdGlvbjogIHVwZGF0ZSBCaXQgQnVmZmVyIHBvaW50ZXIKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgdXBkYXRlQml0QnVmV29yZFB0cihIQU5ETEVfQklUX0JVRiBoQml0QnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVV29yZDggKipwQml0QnVmV29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgY250KQotewotICAqcEJpdEJ1ZldvcmQgKz0gY250OwotCi0KLSAgaWYoKnBCaXRCdWZXb3JkID4gaEJpdEJ1Zi0+cEJpdEJ1ZkVuZCkgewotICAgICpwQml0QnVmV29yZCAtPSAoaEJpdEJ1Zi0+cEJpdEJ1ZkVuZCAtIGhCaXRCdWYtPnBCaXRCdWZCYXNlICsgMSk7Ci0gIH0KLQotICBpZigqcEJpdEJ1ZldvcmQgPCBoQml0QnVmLT5wQml0QnVmQmFzZSkgewotICAgICpwQml0QnVmV29yZCArPSAoaEJpdEJ1Zi0+cEJpdEJ1ZkVuZCAtIGhCaXRCdWYtPnBCaXRCdWZCYXNlICsgMSk7Ci0gIH0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKICogZnVuY3Rpb24gbmFtZTogQ3JlYXRlQml0QnVmZmVyCiAqIGRlc2NyaXB0aW9uOiAgY3JlYXRlIGFuZCBpbml0IEJpdCBCdWZmZXIgTWFuYWdlbWVudAogKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYml0ZW5jLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iaXRlbmMuYwppbmRleCBkMWZkNjQ3Li45YzgxMjA0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iaXRlbmMuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iaXRlbmMuYwpAQCAtNTQ3LDcgKzU0Nyw3IEBACiAgICAgdG90RmlsbEJpdHMgPSB0b3RGaWxsQml0cyAtICgzKzQpOwogCiAKLSAgICBpZiAoKGNudCA9PSAoMTw8NCktMSkpIHsKKyAgICBpZiAoY250ID09ICgxPDw0KS0xKSB7CiAKICAgICAgIGVzY19jb3VudCA9IG1pbiggKCh0b3RGaWxsQml0cyA+PiAzKSAtICgoMTw8NCktMSkpLCAoMTw8OCktMSk7CiAgICAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSxlc2NfY291bnQsOCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9ibG9ja19zd2l0Y2guYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2Jsb2NrX3N3aXRjaC5jCmluZGV4IGM4MDUzOGYuLjExYmM3ZTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2Jsb2NrX3N3aXRjaC5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2Jsb2NrX3N3aXRjaC5jCkBAIC0zMCw5ICszMCw2IEBACiAjZGVmaW5lIEVORVJHWV9TSElGVCAoOCAtIDEpCiAKIC8qKioqKioqKioqKioqKioqIGludGVybmFsIGZ1bmN0aW9uIHByb3RvdHlwZXMgKioqKioqKioqKiovCi1zdGF0aWMgV29yZDE2Ci1JSVJGaWx0ZXIoY29uc3QgV29yZDE2IGluLCBjb25zdCBXb3JkMzIgY29lZmZbXSwgV29yZDMyIHN0YXRlc1tdKTsKLQogc3RhdGljIFdvcmQzMgogU3JjaE1heFdpdGhJbmRleChjb25zdCBXb3JkMzIgKmluLCBXb3JkMTYgKmluZGV4LCBXb3JkMTYgbik7CiAKQEAgLTI4MCw3ICsyNzcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGNoSW5jcmVtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHdpbmRvd0xlbikKIHsKLSAgV29yZDMyIHcsIGksIHdPZmZzZXQsIHRpZHgsIGNoOworICBXb3JkMzIgdywgaSwgdGlkeDsKICAgV29yZDMyIGFjY3VVRSwgYWNjdUZFOwogICBXb3JkMzIgdGVtcFVuZmlsdGVyZWQ7CiAgIFdvcmQzMiB0ZW1wRmlsdGVyZWQ7CkBAIC0zMjksMzAgKzMyNiw2IEBACiB9CiAjZW5kaWYKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IElJUkZpbHRlcgotKiBkZXNjcmlwdGlvbjogIGNhbGN1bGF0ZSB0aGUgaWlyLWZpbHRlciBmb3IgYW4gYXJyYXkKLSogcmV0dXJuczogICAgICB0aGUgcmVzdWx0IGFmdGVyIGlpci1maWx0ZXIKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgV29yZDE2IElJUkZpbHRlcihjb25zdCBXb3JkMTYgaW4sIGNvbnN0IFdvcmQzMiBjb2VmZltdLCBXb3JkMzIgc3RhdGVzW10pCi17Ci0gIFdvcmQzMiBhY2N1MSwgYWNjdTIsIGFjY3UzOwotICBXb3JkMzIgb3V0OwotCi0gIGFjY3UxID0gTF9tcHlfbHMoY29lZmZbMV0sIGluKTsKLSAgYWNjdTMgPSBhY2N1MSAtIHN0YXRlc1swXTsKLSAgYWNjdTIgPSBmaXhtdWwoIGNvZWZmWzBdLCBzdGF0ZXNbMV0gKTsKLSAgb3V0ID0gYWNjdTMgLSBhY2N1MjsKLQotICBzdGF0ZXNbMF0gPSBhY2N1MTsKLSAgc3RhdGVzWzFdID0gb3V0OwotCi0gIHJldHVybiByb3VuZDE2KG91dCk7Ci19Ci0KLQogc3RhdGljIFdvcmQxNiBzeW5jaHJvbml6ZWRCbG9ja1R5cGVUYWJsZVs0XVs0XSA9IHsKICAgLyogICAgICAgICAgICAgICAgIExPTkdfV0lORE9XICAgU1RBUlRfV0lORE9XICBTSE9SVF9XSU5ET1cgIFNUT1BfV0lORE9XICovCiAgIC8qIExPTkdfV0lORE9XICAqL3tMT05HX1dJTkRPVywgIFNUQVJUX1dJTkRPVywgU0hPUlRfV0lORE9XLCBTVE9QX1dJTkRPV30sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9tc19zdGVyZW8uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL21zX3N0ZXJlby5jCmluZGV4IDJlMzRmMTQuLjFlNGIyMjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL21zX3N0ZXJlby5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL21zX3N0ZXJlby5jCkBAIC01MCw3ICs1MCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIHNmYlBlckdyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICBtYXhTZmJQZXJHcm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqc2ZiT2Zmc2V0KSB7Ci0gIFdvcmQzMiB0ZW1wOwogICBXb3JkMzIgc2ZiLHNmYm9mZnMsIGo7CiAgIFdvcmQzMiBtc01hc2tUcnVlU29tZXdoZXJlID0gMDsKICAgV29yZDMyIG1zTWFza0ZhbHNlU29tZXdoZXJlID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3NmX2VzdGltLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9zZl9lc3RpbS5jCmluZGV4IGJjMzIwZWMuLjc4OTQ3ZTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3NmX2VzdGltLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvc2ZfZXN0aW0uYwpAQCAtOTksNyArOTksNyBAQAogewogCVdvcmQzMiBzZmJ3LCBzZmJ3MTsKIAlXb3JkMzIgaSwgajsKLQlXb3JkMzIgc2ZiT2Zmcywgc2ZiLCBzaGlmdDsKKwlXb3JkMzIgc2ZiT2Zmcywgc2ZiOwogCiAJc2ZidyA9IHNmYncxID0gMDsKIAlmb3IgKHNmYk9mZnM9MDsgc2ZiT2Zmczxwc3lPdXRDaGFuLT5zZmJDbnQ7IHNmYk9mZnMrPXBzeU91dENoYW4tPnNmYlBlckdyb3VwKXsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3Rucy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvdG5zLmMKaW5kZXggNTE3MjYxMi4uMjdjMzk3MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvdG5zLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvdG5zLmMKQEAgLTE0MCw3ICsxNDAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgYWN0aXZlKSAgICAgICAgICAgICAgLyohPCB0bnMgYWN0aXZlIGZsYWcgKi8KIHsKIAotICBXb3JkMzIgYml0cmF0ZVBlckNoYW5uZWw7CisgIFdvcmQzMiBiaXRyYXRlUGVyQ2hhbm5lbCBfX3VudXNlZDsKICAgdEMtPm1heE9yZGVyICAgICA9IFROU19NQVhfT1JERVI7CiAgIHRDLT50bnNTdGFydEZyZXEgPSAxMjc1OwogICB0Qy0+Y29lZlJlcyAgICAgID0gNDsKQEAgLTIwNiw3ICsyMDYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX0NPTkZJR1VSQVRJT05fU0hPUlQgKnBDLCAvKiE8IHBzeSBjb25maWcgc3RydWN0ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgYWN0aXZlKSAgICAgICAgICAgICAgIC8qITwgdG5zIGFjdGl2ZSBmbGFnICovCiB7Ci0gIFdvcmQzMiBiaXRyYXRlUGVyQ2hhbm5lbDsKKyAgV29yZDMyIGJpdHJhdGVQZXJDaGFubmVsIF9fdW51c2VkOwogICB0Qy0+bWF4T3JkZXIgICAgID0gVE5TX01BWF9PUkRFUl9TSE9SVDsKICAgdEMtPnRuc1N0YXJ0RnJlcSA9IDI3NTA7CiAgIHRDLT5jb2VmUmVzICAgICAgPSAzOwpAQCAtNDk3LDM2ICs0OTcsNiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKLSogZnVuY3Rpb24gbmFtZTogbV9wb3cyX2NvcmRpYwotKiBkZXNjcmlwdGlvbjogSXRlcmF0aXZlIHBvd2VyIGZ1bmN0aW9uCi0qCi0qCUNhbGN1bGF0ZXMgcG93KDIuMCx4LTEuMCooc2NhbGUrMSkpIHdpdGggSU5UX0JJVFMgYml0IHByZWNpc2lvbgotKgl1c2luZyBtb2RpZmllZCBjb3JkaWMgYWxnb3JpdGhtCi0qIHJldHVybnM6ICAgICB0aGUgcmVzdWx0IG9mIHBvdzIKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFdvcmQzMiBtX3BvdzJfY29yZGljKFdvcmQzMiB4LCBXb3JkMTYgc2NhbGUpCi17Ci0gIFdvcmQzMiBrOwotCi0gIFdvcmQzMiBhY2N1X3kgPSAweDQwMDAwMDAwOwotICBhY2N1X3kgPSBMX3NocihhY2N1X3ksc2NhbGUpOwotCi0gIGZvcihrPTE7IGs8SU5UX0JJVFM7IGsrKykgewotICAgIGNvbnN0IFdvcmQzMiB6ID0gbV9sb2cyX3RhYmxlW2tdOwotCi0gICAgd2hpbGUoTF9zdWIoeCx6KSA+PSAwKSB7Ci0KLSAgICAgIHggPSBMX3N1Yih4LCB6KTsKLSAgICAgIGFjY3VfeSA9IExfYWRkKGFjY3VfeSwgKGFjY3VfeSA+PiBrKSk7Ci0gICAgfQotICB9Ci0gIHJldHVybihhY2N1X3kpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgogKiBmdW5jdGlvbiBuYW1lOiBDYWxjV2VpZ2h0ZWRTcGVjdHJ1bQogKiBkZXNjcmlwdGlvbjogQ2FsY3VsYXRlIHdlaWdodGVkIHNwZWN0cnVtIGZvciBMUEMgY2FsY3VsYXRpb24KICoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3RyYW5zZm9ybS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvdHJhbnNmb3JtLmMKaW5kZXggYTAyMzM2Zi4uMDA4MDgxMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvdHJhbnNmb3JtLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvdHJhbnNmb3JtLmMKQEAgLTQ3NSw3ICs0NzUsNiBAQAogCVdvcmQzMiAqd2luUHRyOwogCiAJV29yZDMyIGRlbGF5QnVmZmVyU2YsdGltZVNpZ25hbFNmLG1pblNmOwotCVdvcmQzMiBoZWFkUm9vbT0wOwogCiAJc3dpdGNoKGJsb2NrVHlwZSl7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vQW5kcm9pZC5tawppbmRleCBhMmIzYzhmLi41ZTYzMmE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9BbmRyb2lkLm1rCkBAIC02Nyw3ICs2Nyw3IEBACiAgICAgICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZQogCiBMT0NBTF9DRkxBR1MgOj0gXAotICAgICAgICAtRE9TQ0xfVU5VU0VEX0FSRz0gLURPU0NMX0lNUE9SVF9SRUY9IC1ET1NDTF9FWFBPUlRfUkVGPQorICAgICAgICAtRCJPU0NMX1VOVVNFRF9BUkcoeCk9KHZvaWQpKHgpIiAtRE9TQ0xfSU1QT1JUX1JFRj0gLURPU0NMX0VYUE9SVF9SRUY9CiAKIExPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9iYXNpY19vcF9jX2VxdWl2YWxlbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9iYXNpY19vcF9jX2VxdWl2YWxlbnQuaAppbmRleCAzNTYzOGUzLi5jNGU0ZDRmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYmFzaWNfb3BfY19lcXVpdmFsZW50LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Jhc2ljX29wX2NfZXF1aXZhbGVudC5oCkBAIC0xMTUsNyArMTE1LDcgQEAKICAgICAgUmV0dXJuczoKICAgICAgICAgTF9zdW0gPSAzMi1iaXQgc3VtIG9mIExfdmFyMSBhbmQgTF92YXIyIChXb3JkMzIpCiAgICAgKi8KLSAgICBzdGF0aWMgaW5saW5lIFdvcmQzMiBMX2FkZChyZWdpc3RlciBXb3JkMzIgTF92YXIxLCByZWdpc3RlciBXb3JkMzIgTF92YXIyLCBGbGFnICpwT3ZlcmZsb3cpCisgICAgc3RhdGljIGlubGluZSBXb3JkMzIgTF9hZGQoV29yZDMyIExfdmFyMSwgV29yZDMyIExfdmFyMiwgRmxhZyAqcE92ZXJmbG93KQogICAgIHsKICAgICAgICAgV29yZDMyIExfc3VtOwogCkBAIC0xNTQsOCArMTU0LDggQEAKICAgICAgUmV0dXJuczoKICAgICAgICAgTF9kaWZmID0gMzItYml0IGRpZmZlcmVuY2Ugb2YgTF92YXIxIGFuZCBMX3ZhcjIgKFdvcmQzMikKICAgICAqLwotICAgIHN0YXRpYyBpbmxpbmUgV29yZDMyIExfc3ViKHJlZ2lzdGVyIFdvcmQzMiBMX3ZhcjEsIHJlZ2lzdGVyIFdvcmQzMiBMX3ZhcjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgRmxhZyAqcE92ZXJmbG93KQorICAgIHN0YXRpYyBpbmxpbmUgV29yZDMyIExfc3ViKFdvcmQzMiBMX3ZhcjEsIFdvcmQzMiBMX3ZhcjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZyAqcE92ZXJmbG93KQogICAgIHsKICAgICAgICAgV29yZDMyIExfZGlmZjsKIApAQCAtMjQ2LDcgKzI0Niw3IEBACiAgICAgKi8KICAgICBzdGF0aWMgaW5saW5lIFdvcmQzMiBMX211bHQoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyLCBGbGFnICpwT3ZlcmZsb3cpCiAgICAgewotICAgICAgICByZWdpc3RlciBXb3JkMzIgTF9wcm9kdWN0OworICAgICAgICBXb3JkMzIgTF9wcm9kdWN0OwogCiAgICAgICAgIExfcHJvZHVjdCA9IChXb3JkMzIpIHZhcjEgKiB2YXIyOwogCkBAIC00NTIsNyArNDUyLDcgQEAKICAgICAqLwogICAgIHN0YXRpYyBpbmxpbmUgV29yZDE2IG11bHQoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyLCBGbGFnICpwT3ZlcmZsb3cpCiAgICAgewotICAgICAgICByZWdpc3RlciBXb3JkMzIgcHJvZHVjdDsKKyAgICAgICAgV29yZDMyIHByb2R1Y3Q7CiAKICAgICAgICAgcHJvZHVjdCA9ICgoV29yZDMyKSB2YXIxICogdmFyMikgPj4gMTU7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2F6X2xzcC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9hel9sc3AuY3BwCmluZGV4IDQxMzVmMzAuLjk3NmIxYTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2F6X2xzcC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvYXpfbHNwLmNwcApAQCAtNTY0LDEwICs1NjQsMTAgQEAKICAgICBGbGFnICAgKnBPdmVyZmxvdyAgIC8qIChpL28pOiBvdmVyZmxvdyBmbGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICkKIHsKLSAgICByZWdpc3RlciBXb3JkMTYgaTsKLSAgICByZWdpc3RlciBXb3JkMTYgajsKLSAgICByZWdpc3RlciBXb3JkMTYgbmY7Ci0gICAgcmVnaXN0ZXIgV29yZDE2IGlwOworICAgIFdvcmQxNiBpOworICAgIFdvcmQxNiBqOworICAgIFdvcmQxNiBuZjsKKyAgICBXb3JkMTYgaXA7CiAgICAgV29yZDE2IHhsb3c7CiAgICAgV29yZDE2IHlsb3c7CiAgICAgV29yZDE2IHhoaWdoOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZGl2X3MuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZGl2X3MuY3BwCmluZGV4IGYzYmVkN2UuLjE0ZDMwYzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2Rpdl9zLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9kaXZfcy5jcHAKQEAgLTIwNywxMyArMjA3LDEzIEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIDsgRlVOQ1RJT04gQ09ERQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1Xb3JkMTYgZGl2X3MocmVnaXN0ZXIgV29yZDE2IHZhcjEsIHJlZ2lzdGVyIFdvcmQxNiB2YXIyKQorV29yZDE2IGRpdl9zKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikKIHsKICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICA7IERlZmluZSBhbGwgbG9jYWwgdmFyaWFibGVzCiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgV29yZDE2IHZhcl9vdXQgPSAwOwotICAgIHJlZ2lzdGVyIFdvcmQxNiBpdGVyYXRpb247CisgICAgV29yZDE2IGl0ZXJhdGlvbjsKICAgICBXb3JkMzIgTF9udW07CiAgICAgV29yZDMyIExfZGVub207CiAgICAgV29yZDMyIExfZGVub21fYnlfMjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2djX3ByZWQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZ2NfcHJlZC5jcHAKaW5kZXggMzY1MGYzYy4uMWM4YTcwMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZ2NfcHJlZC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZ2NfcHJlZC5jcHAKQEAgLTQ3Nyw5ICs0NzcsOSBAQAogICAgIEZsYWcgICAqcE92ZXJmbG93CiApCiB7Ci0gICAgcmVnaXN0ZXIgV29yZDE2IGk7Ci0gICAgcmVnaXN0ZXIgV29yZDMyIExfdGVtcDEsIExfdGVtcDI7Ci0gICAgcmVnaXN0ZXIgV29yZDMyIExfdG1wOworICAgIFdvcmQxNiBpOworICAgIFdvcmQzMiBMX3RlbXAxLCBMX3RlbXAyOworICAgIFdvcmQzMiBMX3RtcDsKICAgICBXb3JkMzIgZW5lcl9jb2RlOwogICAgIFdvcmQzMiBlbmVyOwogICAgIFdvcmQxNiBleHAsIGZyYWM7CkBAIC05OTMsNyArOTkzLDcgQEAKICkKIHsKICAgICBXb3JkMTYgYXZfcHJlZF9lbjsKLSAgICByZWdpc3RlciBXb3JkMTYgaTsKKyAgICBXb3JkMTYgaTsKIAogICAgIC8qIGRvIGF2ZXJhZ2UgaW4gTVIxMjIgbW9kZSAobG9nMigpIGRvbWFpbikgKi8KICAgICBhdl9wcmVkX2VuID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2dtZWRfbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9nbWVkX24uY3BwCmluZGV4IGJlNzYyNDEuLjJkM2I5ZTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2dtZWRfbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZ21lZF9uLmNwcApAQCAtMTg1LDkgKzE4NSw5IEBACiAgICAgV29yZDE2IG4gICAgICAgIC8qIGkgOiBudW1iZXIgb2YgaW5wdXRzICAgICovCiApCiB7Ci0gICAgcmVnaXN0ZXIgV29yZDE2IGksIGosIGl4ID0gMDsKLSAgICByZWdpc3RlciBXb3JkMTYgbWF4OwotICAgIHJlZ2lzdGVyIFdvcmQxNiBtZWRpYW5JbmRleDsKKyAgICBXb3JkMTYgaSwgaiwgaXggPSAwOworICAgIFdvcmQxNiBtYXg7CisgICAgV29yZDE2IG1lZGlhbkluZGV4OwogICAgIFdvcmQxNiAgdG1wW05NQVhdOwogICAgIFdvcmQxNiAgdG1wMltOTUFYXTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbHNwX2F6LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xzcF9hei5jcHAKaW5kZXggNmI3YjQ3MS4uNDk1MzU5ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbHNwX2F6LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sc3BfYXouY3BwCkBAIC0yNTQsOCArMjU0LDggQEAKICAgICBXb3JkMzIgKmYsCiAgICAgRmxhZyAgICpwT3ZlcmZsb3cpCiB7Ci0gICAgcmVnaXN0ZXIgV29yZDE2IGk7Ci0gICAgcmVnaXN0ZXIgV29yZDE2IGo7CisgICAgV29yZDE2IGk7CisgICAgV29yZDE2IGo7CiAKICAgICBXb3JkMTYgaGk7CiAgICAgV29yZDE2IGxvOwpAQCAtNTExLDggKzUxMSw4IEBACiAgICAgRmxhZyAgKnBPdmVyZmxvdyAgICAgLyogKG8pICA6IG92ZXJmbG93IGZsYWcgICAgICAgICAgICAgICAgICAgICAgICAqLwogKQogewotICAgIHJlZ2lzdGVyIFdvcmQxNiBpOwotICAgIHJlZ2lzdGVyIFdvcmQxNiBqOworICAgIFdvcmQxNiBpOworICAgIFdvcmQxNiBqOwogCiAgICAgV29yZDMyIGYxWzZdOwogICAgIFdvcmQzMiBmMls2XTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL211bHRfci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9tdWx0X3IuY3BwCmluZGV4IDA3NzdlNjguLjcxMTJiM2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL211bHRfci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbXVsdF9yLmNwcApAQCAtMTkwLDcgKzE5MCw3IEBACiBXb3JkMTYgbXVsdF9yKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMiwgRmxhZyAqcE92ZXJmbG93KQogewogCi0gICAgcmVnaXN0ZXIgV29yZDMyIExfcHJvZHVjdF9hcnI7CisgICAgV29yZDMyIExfcHJvZHVjdF9hcnI7CiAKICAgICBMX3Byb2R1Y3RfYXJyID0gKChXb3JkMzIpIHZhcjEpICogdmFyMjsgICAgICAgICAgICAgIC8qIHByb2R1Y3QgKi8KICAgICBMX3Byb2R1Y3RfYXJyICs9IChXb3JkMzIpIDB4MDAwMDQwMDBMOyAgICAgICAgICAgICAgIC8qIHJvdW5kICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9ub3JtX2wuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbm9ybV9sLmNwcAppbmRleCAxMzJmZWQ2Li5kOGQxMjU5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9ub3JtX2wuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL25vcm1fbC5jcHAKQEAgLTE5NywxMiArMTk3LDEyIEBACiA7IEZVTkNUSU9OIENPREUKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2lmICEoIGRlZmluZWQoUFZfQVJNX1Y1KSB8fCBkZWZpbmVkKFBWX0FSTV9HQ0NfVjUpICkKLVdvcmQxNiBub3JtX2wocmVnaXN0ZXIgV29yZDMyIExfdmFyMSkKK1dvcmQxNiBub3JtX2woV29yZDMyIExfdmFyMSkKIHsKICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICA7IERlZmluZSBhbGwgbG9jYWwgdmFyaWFibGVzCiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgcmVnaXN0ZXIgV29yZDE2IHZhcl9vdXQgPSAwOworICAgIFdvcmQxNiB2YXJfb3V0ID0gMDsKIAogICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIDsgRnVuY3Rpb24gYm9keSBoZXJlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9ub3JtX3MuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbm9ybV9zLmNwcAppbmRleCA4Y2RjZGI4Li42NDY4YjY3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9ub3JtX3MuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL25vcm1fcy5jcHAKQEAgLTE5NCwxMyArMTk0LDEzIEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNpZiAhKCBkZWZpbmVkKFBWX0FSTV9WNSkgfHwgZGVmaW5lZChQVl9BUk1fR0NDX1Y1KSApCiAKLVdvcmQxNiBub3JtX3MocmVnaXN0ZXIgV29yZDE2IHZhcjEpCitXb3JkMTYgbm9ybV9zKFdvcmQxNiB2YXIxKQogewogICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIDsgRGVmaW5lIGFsbCBsb2NhbCB2YXJpYWJsZXMKICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotICAgIHJlZ2lzdGVyIFdvcmQxNiB2YXJfb3V0ID0gMDsKKyAgICBXb3JkMTYgdmFyX291dCA9IDA7CiAKICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICA7IEZ1bmN0aW9uIGJvZHkgaGVyZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcHJlZF9sdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9wcmVkX2x0LmNwcAppbmRleCA5MTYzNjIzLi44YTFhYTllIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9wcmVkX2x0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9wcmVkX2x0LmNwcApAQCAtMjYwLDkgKzI2MCw5IEBACiAgICAgRmxhZyAgKnBPdmVyZmxvdyAgLyogb3V0cHV0OiBpZiBzZXQsIG92ZXJmbG93IG9jY3VycmVkIGluIHRoaXMgZnVuY3Rpb24gKi8KICkKIHsKLSAgICByZWdpc3RlciBXb3JkMTYgaTsKLSAgICByZWdpc3RlciBXb3JkMTYgajsKLSAgICByZWdpc3RlciBXb3JkMTYgazsKKyAgICBXb3JkMTYgaTsKKyAgICBXb3JkMTYgajsKKyAgICBXb3JkMTYgazsKIAogICAgIFdvcmQxNiAqcFgwOwogICAgIFdvcmQxNiAqcFgyOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcV9wbHNmXzMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcV9wbHNmXzMuY3BwCmluZGV4IDJiMzBiZjQuLmM3MDg0N2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3FfcGxzZl8zLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9xX3Bsc2ZfMy5jcHAKQEAgLTI4MSw3ICsyODEsNyBAQAogICAgIEZsYWcgICpwT3ZlcmZsb3cgICAgICAvKiBvIDogRmxhZyBzZXQgd2hlbiBvdmVyZmxvdyBvY2N1cnMgICAgICovCiApCiB7Ci0gICAgcmVnaXN0ZXIgV29yZDE2IGk7CisgICAgV29yZDE2IGk7CiAgICAgV29yZDE2IHRlbXA7CiAgICAgY29uc3QgV29yZDE2ICpwX2RpY287CiAgICAgV29yZDE2IGluZGV4ID0gMDsKQEAgLTYwNyw3ICs2MDcsNyBAQAogICAgIEZsYWcgdXNlX2hhbGYsICAgICAgICAvKiBpOiB1c2UgZXZlcnkgc2Vjb25kIGVudHJ5IGluIGNvZGVib29rICovCiAgICAgRmxhZyAgKnBPdmVyZmxvdykgICAgIC8qIG8gOiBGbGFnIHNldCB3aGVuIG92ZXJmbG93IG9jY3VycyAgICAgKi8KIHsKLSAgICByZWdpc3RlciBXb3JkMTYgaTsKKyAgICBXb3JkMTYgaTsKICAgICBXb3JkMTYgdGVtcDsKIAogICAgIGNvbnN0IFdvcmQxNiAqcF9kaWNvOwpAQCAtMTAxMyw3ICsxMDEzLDcgQEAKICAgICBGbGFnICAqcE92ZXJmbG93ICAgIC8qIG8gOiBGbGFnIHNldCB3aGVuIG92ZXJmbG93IG9jY3VycyAgICAgICAgICAgICAqLwogKQogewotICAgIHJlZ2lzdGVyIFdvcmQxNiBpLCBqOworICAgIFdvcmQxNiBpLCBqOwogICAgIFdvcmQxNiBsc2YxW01dOwogICAgIFdvcmQxNiB3ZjFbTV07CiAgICAgV29yZDE2IGxzZl9wW01dOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcmVzaWR1LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3Jlc2lkdS5jcHAKaW5kZXggYjI1ZDNiZS4uMmFkMTMyZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcmVzaWR1LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9yZXNpZHUuY3BwCkBAIC0yMDIsNyArMjAyLDcgQEAKIHsKIAogCi0gICAgcmVnaXN0ZXIgV29yZDE2IGksIGo7CisgICAgV29yZDE2IGksIGo7CiAgICAgV29yZDMyIHMxOwogICAgIFdvcmQzMiBzMjsKICAgICBXb3JkMzIgczM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9zaHIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvc2hyLmNwcAppbmRleCA3NzVkYzY5Li4xMDE4ZDljIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9zaHIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3Noci5jcHAKQEAgLTIwMiwxMCArMjAyLDEwIEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIDsgRlVOQ1RJT04gQ09ERQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1Xb3JkMTYgc2hyKHJlZ2lzdGVyIFdvcmQxNiB2YXIxLCByZWdpc3RlciBXb3JkMTYgdmFyMiwgRmxhZyAqcE92ZXJmbG93KQorV29yZDE2IHNocihXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIsIEZsYWcgKnBPdmVyZmxvdykKIHsKLSAgICByZWdpc3RlciBXb3JkMTYgcmVzdWx0OwotICAgIHJlZ2lzdGVyIFdvcmQzMiB0ZW1wX3JlczsKKyAgICBXb3JkMTYgcmVzdWx0OworICAgIFdvcmQzMiB0ZW1wX3JlczsKIAogICAgIGlmICh2YXIyICE9IDApCiAgICAgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvd2VpZ2h0X2EuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvd2VpZ2h0X2EuY3BwCmluZGV4IDJlMmVmYzQuLmVlODIxZWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3dlaWdodF9hLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy93ZWlnaHRfYS5jcHAKQEAgLTE3OCw3ICsxNzgsNyBAQAogICAgIFdvcmQxNiBhX2V4cFtdICAgICAgLyogKG8pICAgOiBTcGVjdHJhbCBleHBhbmRlZCBMUEMgY29lZmZpY2llbnRzICAgKi8KICkKIHsKLSAgICByZWdpc3RlciBXb3JkMTYgaTsKKyAgICBXb3JkMTYgaTsKIAogICAgICooYV9leHApID0gKihhKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLm1rCmluZGV4IGIwNjc0NTYuLjc2YTdmNDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQubWsKQEAgLTQ1LDcgKzQ1LDcgQEAKICAgICAgICAgJChMT0NBTF9QQVRIKS8uLi9jb21tb24vaW5jbHVkZQogCiBMT0NBTF9DRkxBR1MgOj0gXAotICAgICAgICAtRE9TQ0xfVU5VU0VEX0FSRz0gLURPU0NMX0lNUE9SVF9SRUY9CisgICAgICAgIC1EIk9TQ0xfVU5VU0VEX0FSRyh4KT0odm9pZCkoeCkiIC1ET1NDTF9JTVBPUlRfUkVGPQogCiBMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgogCkBAIC04MywzICs4MywyNCBAQAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgICAgICB0ZXN0L2Ftcm5iZGVjX3Rlc3QuY3BwCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgICAgICAkKExPQ0FMX1BBVEgpL3NyYyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvLi4vY29tbW9uL2luY2x1ZGUgXAorICAgICAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorICAgICAgICBsaWJzdGFnZWZyaWdodF9hbXJuYmRlYyBsaWJzbmRmaWxlCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgICAgICBsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24gbGliYXVkaW91dGlscyBsaWJsb2cKKworTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X2Ftcm5iZGVjX3Rlc3QKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDEwMzVwZi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kMTAzNXBmLmNwcAppbmRleCA4OTlkYWJhLi44NjFiM2U2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kMTAzNXBmLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kMTAzNXBmLmNwcApAQCAtMjA5LDcgKzIwOSw3IEBACiAgICAgV29yZDE2IGNvZFtdICAgICAgIC8qIChvKSAgICAgOiBhbGdlYnJhaWMgKGZpeGVkKSBjb2RlYm9vayBleGNpdGF0aW9uICAgICovCiApCiB7Ci0gICAgcmVnaXN0ZXIgV29yZDE2IGksIGosIHBvczEsIHBvczI7CisgICAgV29yZDE2IGksIGosIHBvczEsIHBvczI7CiAgICAgV29yZDE2IHNpZ24sIHRtcDsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBMX0NPREU7IGkrKykKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RfcGxzZl81LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RfcGxzZl81LmNwcAppbmRleCAwOGI2OTBkLi43MDY4YzBhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kX3Bsc2ZfNS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZF9wbHNmXzUuY3BwCkBAIC0zMDgsNyArMzA4LDcgQEAKICAgICBGbGFnICAqcE92ZXJmbG93ICAgIC8qIG8gOiBGbGFnIHNldCB3aGVuIG92ZXJmbG93IG9jY3VycyAgICAgICAgICAgICAgICAqLwogKQogewotICAgIHJlZ2lzdGVyIFdvcmQxNiBpOworICAgIFdvcmQxNiBpOwogICAgIFdvcmQxNiB0ZW1wOwogICAgIFdvcmQxNiBzaWduOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9pbnRfbHNmLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2ludF9sc2YuY3BwCmluZGV4IGM1YWVmZTQuLjJjYTMwZGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2ludF9sc2YuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2ludF9sc2YuY3BwCkBAIC0yMTgsOSArMjE4LDkgQEAKICAgICBGbGFnICAqcE92ZXJmbG93ICAvKiBvIDogZmxhZyBzZXQgaWYgb3ZlcmZsb3cgb2NjdXJzICAgICAgICAgICAgICAgICAgICAqLwogKQogewotICAgIHJlZ2lzdGVyIFdvcmQxNiBpOwotICAgIHJlZ2lzdGVyIFdvcmQxNiB0ZW1wMTsKLSAgICByZWdpc3RlciBXb3JkMTYgdGVtcDI7CisgICAgV29yZDE2IGk7CisgICAgV29yZDE2IHRlbXAxOworICAgIFdvcmQxNiB0ZW1wMjsKIAogICAgIGlmIChpX3N1YmZyID09IDApCiAgICAgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcGhfZGlzcC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9waF9kaXNwLmNwcAppbmRleCBkYTU0NDViLi4yODU0NjVmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9waF9kaXNwLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9waF9kaXNwLmNwcApAQCAtMjA3LDcgKzIwNyw3IEBACiAKIFdvcmQxNiBwaF9kaXNwX3Jlc2V0KHBoX2Rpc3BTdGF0ZSAqc3RhdGUpCiB7Ci0gICAgcmVnaXN0ZXIgV29yZDE2IGk7CisgICAgV29yZDE2IGk7CiAKICAgICBpZiAoc3RhdGUgPT0gKHBoX2Rpc3BTdGF0ZSAqKSBOVUxMKQogICAgIHsKQEAgLTY2NywxNSArNjY3LDE1IEBACiAgICAgRmxhZyAgICpwT3ZlcmZsb3cgICAgICAgLyogaS9vICAgICA6IG92ZWZsb3cgaW5kaWNhdG9yICAgICAgICAgICAgICAgICAgKi8KICkKIHsKLSAgICByZWdpc3RlciBXb3JkMTYgaSwgaTE7Ci0gICAgcmVnaXN0ZXIgV29yZDE2IHRtcDE7CisgICAgV29yZDE2IGksIGkxOworICAgIFdvcmQxNiB0bXAxOwogICAgIFdvcmQzMiBMX3RlbXA7CiAgICAgV29yZDMyIExfdGVtcDI7CiAgICAgV29yZDE2IGltcE5yOyAgICAgICAgICAgLyogaW5kaWNhdG9yIGZvciBhbW91bnQgb2YgZGlzcC4vZmlsdGVyIHVzZWQgKi8KIAogICAgIFdvcmQxNiBpbm5vX3NhdltMX1NVQkZSXTsKICAgICBXb3JkMTYgcHNfcG9zc1tMX1NVQkZSXTsKLSAgICByZWdpc3RlciBXb3JkMTYgbnplLCBuUHVsc2U7CisgICAgV29yZDE2IG56ZSwgblB1bHNlOwogICAgIFdvcmQxNiBwcG9zOwogICAgIGNvbnN0IFdvcmQxNiAqcGhfaW1wOyAgIC8qIFBvaW50ZXIgdG8gcGhhc2UgZGlzcGVyc2lvbiBmaWx0ZXIgKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcHN0ZmlsdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9wc3RmaWx0LmNwcAppbmRleCAwMzM2OTkwLi4zOWUwMWEyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9wc3RmaWx0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9wc3RmaWx0LmNwcApAQCAtNDQ1LDEzICs0NDUsMTMgQEAKICkKIHsKICAgICBXb3JkMTYgQXAzW01QMV07Ci0gICAgV29yZDE2IEFwNFtNUDFdOyAgICAgICAgICAgIC8qIGJhbmR3aWR0aCBleHBhbmRlZCBMUCBwYXJhbWV0ZXJzICovCi0gICAgV29yZDE2ICpBejsgICAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gQXpfNDogICAgICAgICAgICAgICAgICovCisgICAgV29yZDE2IEFwNFtNUDFdOyAgICAgIC8qIGJhbmR3aWR0aCBleHBhbmRlZCBMUCBwYXJhbWV0ZXJzICovCisgICAgV29yZDE2ICpBejsgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gQXpfNDogICAgICAgICAgICAgICAgICovCiAgICAgLyogIExQQyBwYXJhbWV0ZXJzIGluIGVhY2ggc3ViZnJhbWUgKi8KLSAgICByZWdpc3RlciBXb3JkMTYgaV9zdWJmcjsgICAgLyogaW5kZXggZm9yIGJlZ2lubmluZyBvZiBzdWJmcmFtZSAgKi8KKyAgICBXb3JkMTYgaV9zdWJmcjsgICAgICAgLyogaW5kZXggZm9yIGJlZ2lubmluZyBvZiBzdWJmcmFtZSAgKi8KICAgICBXb3JkMTYgaFtMX0hdOwogCi0gICAgcmVnaXN0ZXIgV29yZDE2IGk7CisgICAgV29yZDE2IGk7CiAgICAgV29yZDE2IHRlbXAxOwogICAgIFdvcmQxNiB0ZW1wMjsKICAgICBXb3JkMzIgTF90bXA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvYW1ybmJkZWNfdGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvYW1ybmJkZWNfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFhOWU5OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvdGVzdC9hbXJuYmRlY190ZXN0LmNwcApAQCAtMCwwICsxLDE1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICogQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTCisgKiBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQKKyAqIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgImdzbWFtcl9kZWMuaCIKKyNpbmNsdWRlIDxhdWRpb191dGlscy9zbmRmaWxlLmg+CisKKy8vIENvbnN0YW50cyBmb3IgQU1SLU5CCitlbnVtIHsKKyAgICBrSW5wdXRCdWZmZXJTaXplID0gNjQsCisgICAga1NhbXBsZXNQZXJGcmFtZSA9IDE2MCwKKyAgICBrQml0c1BlclNhbXBsZSA9IDE2LAorICAgIGtPdXRwdXRCdWZmZXJTaXplID0ga1NhbXBsZXNQZXJGcmFtZSAqIGtCaXRzUGVyU2FtcGxlLzgsCisgICAga1NhbXBsZVJhdGUgPSA4MDAwLAorICAgIGtDaGFubmVscyA9IDEsCisgICAga0ZpbGVIZWFkZXJTaXplID0gNgorfTsKK2NvbnN0IHVpbnQzMl90IGtGcmFtZVNpemVzW10gPSB7MTIsIDEzLCAxNSwgMTcsIDE5LCAyMCwgMjYsIDMxfTsKKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CisKKyAgICBpZihhcmdjICE9IDMpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJVc2FnZSAlcyA8aW5wdXQgZmlsZT4gPG91dHB1dCBmaWxlPlxuIiwgYXJndlswXSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8vIE9wZW4gdGhlIGlucHV0IGZpbGUKKyAgICBGSUxFKiBmcElucHV0ID0gZm9wZW4oYXJndlsxXSwgInJiIik7CisgICAgaWYgKCFmcElucHV0KSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IG9wZW4gJXNcbiIsIGFyZ3ZbMV0pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZSB0aGUgaW5wdXQgQU1SIGZpbGUKKyAgICBjaGFyIGhlYWRlcltrRmlsZUhlYWRlclNpemVdOworICAgIGludCBieXRlc1JlYWQgPSBmcmVhZChoZWFkZXIsIDEsIGtGaWxlSGVhZGVyU2l6ZSwgZnBJbnB1dCk7CisgICAgaWYgKGJ5dGVzUmVhZCAhPSBrRmlsZUhlYWRlclNpemUgfHwgbWVtY21wKGhlYWRlciwgIiMhQU1SXG4iLCBrRmlsZUhlYWRlclNpemUpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBBTVItTkIgZmlsZVxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8vIE9wZW4gdGhlIG91dHB1dCBmaWxlCisgICAgU0ZfSU5GTyBzZkluZm87CisgICAgbWVtc2V0KCZzZkluZm8sIDAsIHNpemVvZihTRl9JTkZPKSk7CisgICAgc2ZJbmZvLmNoYW5uZWxzID0ga0NoYW5uZWxzOworICAgIHNmSW5mby5mb3JtYXQgPSBTRl9GT1JNQVRfV0FWIHwgU0ZfRk9STUFUX1BDTV8xNjsKKyAgICBzZkluZm8uc2FtcGxlcmF0ZSA9IGtTYW1wbGVSYXRlOworICAgIFNOREZJTEUgKmhhbmRsZSA9IHNmX29wZW4oYXJndlsyXSwgU0ZNX1dSSVRFLCAmc2ZJbmZvKTsKKyAgICBpZighaGFuZGxlKXsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgY3JlYXRlICVzXG4iLCBhcmd2WzJdKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIEFNUi1OQiBkZWNvZGVyIGluc3RhbmNlCisgICAgdm9pZCogYW1ySGFuZGxlOworICAgIGludCBlcnIgPSBHU01Jbml0RGVjb2RlKCZhbXJIYW5kbGUsIChXb3JkOCopIkFNUk5CRGVjb2RlciIpOworICAgIGlmKGVyciAhPSAwKXsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBjcmVhdGluZyBBTVItTkIgZGVjb2RlciBpbnN0YW5jZVxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8vQWxsb2NhdGUgaW5wdXQgYnVmZmVyCisgICAgdm9pZCAqaW5wdXRCdWYgPSBtYWxsb2Moa0lucHV0QnVmZmVyU2l6ZSk7CisgICAgYXNzZXJ0KGlucHV0QnVmICE9IE5VTEwpOworCisgICAgLy9BbGxvY2F0ZSBvdXRwdXQgYnVmZmVyCisgICAgdm9pZCAqb3V0cHV0QnVmID0gbWFsbG9jKGtPdXRwdXRCdWZmZXJTaXplKTsKKyAgICBhc3NlcnQob3V0cHV0QnVmICE9IE5VTEwpOworCisKKyAgICAvLyBEZWNvZGUgbG9vcAorICAgIHVpbnQzMl90IHJldFZhbCA9IDA7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgLy8gUmVhZCBtb2RlCisgICAgICAgIHVpbnQ4X3QgbW9kZTsKKyAgICAgICAgYnl0ZXNSZWFkID0gZnJlYWQoJm1vZGUsIDEsIDEsIGZwSW5wdXQpOworICAgICAgICBpZiAoYnl0ZXNSZWFkICE9IDEpIGJyZWFrOworCisgICAgICAgIC8vIEZpbmQgZnJhbWUgdHlwZQorICAgICAgICBGcmFtZV9UeXBlXzNHUFAgZnJhbWVUeXBlID0gKEZyYW1lX1R5cGVfM0dQUCkoKG1vZGUgPj4gMykgJiAweDBmKTsKKyAgICAgICAgaWYgKGZyYW1lVHlwZSA+PSBBTVJfU0lEKXsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRnJhbWUgdHlwZSAlZCBub3Qgc3VwcG9ydGVkXG4iLGZyYW1lVHlwZSk7CisgICAgICAgICAgICByZXRWYWwgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBGaW5kIGZyYW1lIHR5cGUKKyAgICAgICAgaW50MzJfdCBmcmFtZVNpemUgPSBrRnJhbWVTaXplc1tmcmFtZVR5cGVdOworICAgICAgICBieXRlc1JlYWQgPSBmcmVhZChpbnB1dEJ1ZiwgMSwgZnJhbWVTaXplLCBmcElucHV0KTsKKyAgICAgICAgaWYgKGJ5dGVzUmVhZCAhPSBmcmFtZVNpemUpIGJyZWFrOworCisgICAgICAgIC8vRGVjb2RlIGZyYW1lCisgICAgICAgIGludDMyX3QgZGVjb2RlU3RhdHVzOworICAgICAgICBkZWNvZGVTdGF0dXMgPSBBTVJEZWNvZGUoYW1ySGFuZGxlLCBmcmFtZVR5cGUsICh1aW50OF90KilpbnB1dEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQxNl90KilvdXRwdXRCdWYsIE1JTUVfSUVURik7CisgICAgICAgIGlmKGRlY29kZVN0YXR1cyA9PSAtMSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJEZWNvZGVyIGVuY291bnRlcmVkIGVycm9yXG4iKTsKKyAgICAgICAgICAgIHJldFZhbCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vV3JpdGUgb3V0cHV0IHRvIHdhdgorICAgICAgICBzZl93cml0ZWZfc2hvcnQoaGFuZGxlLCAoaW50MTZfdCopb3V0cHV0QnVmLCBrU2FtcGxlc1BlckZyYW1lKTsKKworICAgIH0KKworICAgIC8vIENsb3NlIGlucHV0IGFuZCBvdXRwdXQgZmlsZQorICAgIGZjbG9zZShmcElucHV0KTsKKyAgICBzZl9jbG9zZShoYW5kbGUpOworCisgICAgLy9GcmVlIGFsbG9jYXRlZCBtZW1vcnkKKyAgICBmcmVlKGlucHV0QnVmKTsKKyAgICBmcmVlKG91dHB1dEJ1Zik7CisKKyAgICAvLyBDbG9zZSBkZWNvZGVyIGluc3RhbmNlCisgICAgR1NNRGVjb2RlRnJhbWVFeGl0KCZhbXJIYW5kbGUpOworCisgICAgcmV0dXJuIHJldFZhbDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5tawppbmRleCBhZmMwYjg5Li5iZGJhOGE5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLm1rCkBAIC02Nyw3ICs2Nyw3IEBACiAgICAgICAgICQoTE9DQUxfUEFUSCkvLi4vY29tbW9uL2luY2x1ZGUKIAogTE9DQUxfQ0ZMQUdTIDo9IFwKLSAgICAgICAgLURPU0NMX1VOVVNFRF9BUkc9CisgICAgICAgIC1EIk9TQ0xfVU5VU0VEX0FSRyh4KT0odm9pZCkoeCkiCiAKIExPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2F1dG9jb3JyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2F1dG9jb3JyLmNwcAppbmRleCAwZDNhY2FjLi5jNzE4MTFkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9hdXRvY29yci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYXV0b2NvcnIuY3BwCkBAIC0zMDYsOSArMzA2LDkgQEAKICAgICBGbGFnICAqcE92ZXJmbG93ICAgICAgIC8qIChvKSAgICA6IGluZGljYXRlcyBvdmVyZmxvdyAgICAgICAgICAgICAgICAgKi8KICkKIHsKLSAgICByZWdpc3RlciBXb3JkMTYgaTsKLSAgICByZWdpc3RlciBXb3JkMTYgajsKLSAgICByZWdpc3RlciBXb3JkMTYgbm9ybTsKKyAgICBXb3JkMTYgaTsKKyAgICBXb3JkMTYgajsKKyAgICBXb3JkMTYgbm9ybTsKIAogICAgIFdvcmQxNiB5W0xfV0lORE9XXTsKICAgICBXb3JkMzIgc3VtOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzJfOXBmLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MyXzlwZi5jcHAKaW5kZXggYTMzY2RmNzQuLmIyMTEwMzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MyXzlwZi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzJfOXBmLmNwcApAQCAtMzE4LDcgKzMxOCw3IEBACiAgICAgICAgIFdvcmQxNiBkbl9zaWduW0xfQ09ERV07CiAgICAgICAgIFdvcmQxNiBycltMX0NPREVdW0xfQ09ERV07CiAKLSAgICAgICAgcmVnaXN0ZXIgV29yZDE2IGk7CisgICAgICAgIFdvcmQxNiBpOwogCiAgICAgICAgIFdvcmQxNiBpbmRleDsKICAgICAgICAgV29yZDE2IHNoYXJwOwpAQCAtNTkyLDEwICs1OTIsMTAgQEAKICAgICAgICAgRmxhZyAgICogcE92ZXJmbG93ICAgLyogbyA6IEZsYWcgc2V0IHdoZW4gb3ZlcmZsb3cgb2NjdXJzICAgICAgKi8KICAgICApCiAgICAgewotICAgICAgICByZWdpc3RlciBXb3JkMTYgaTA7Ci0gICAgICAgIHJlZ2lzdGVyIFdvcmQxNiBpMTsKKyAgICAgICAgV29yZDE2IGkwOworICAgICAgICBXb3JkMTYgaTE7CiAgICAgICAgIFdvcmQxNiBpeCA9IDA7IC8qIGluaXRpYWxpemF0aW9uIG9ubHkgbmVlZGVkIHRvIGtlZXAgZ2NjIHNpbGVudCAqLwotICAgICAgICByZWdpc3RlciBXb3JkMTYgIHRyYWNrMTsKKyAgICAgICAgV29yZDE2IHRyYWNrMTsKICAgICAgICAgV29yZDE2IGlwb3NbTkJfUFVMU0VdOwogICAgICAgICBXb3JkMTYgcHNrOwogICAgICAgICBXb3JkMTYgcHMwOwpAQCAtNjA4LDcgKzYwOCw3IEBACiAgICAgICAgIFdvcmQzMiBzOwogICAgICAgICBXb3JkMzIgYWxwMDsKICAgICAgICAgV29yZDMyIGFscDE7Ci0gICAgICAgIHJlZ2lzdGVyIFdvcmQxNiBpOworICAgICAgICBXb3JkMTYgaTsKICAgICAgICAgV29yZDMyIExfdGVtcDsKICAgICAgICAgV29yZDE2ICpwX2NvZHZlYyA9ICZjb2R2ZWNbMF07CiAKQEAgLTk5MywxMyArOTkzLDEzIEBACiAgICAgICAgIEZsYWcgICpwT3ZlcmZsb3cgIC8qIG8gOiBGbGFnIHNldCB3aGVuIG92ZXJmbG93IG9jY3VycyAgICAgICAgICAgICAgKi8KICAgICApCiAgICAgewotICAgICAgICByZWdpc3RlciBXb3JkMTYgaTsKLSAgICAgICAgcmVnaXN0ZXIgV29yZDE2IGo7Ci0gICAgICAgIHJlZ2lzdGVyIFdvcmQxNiBrOwotICAgICAgICByZWdpc3RlciBXb3JkMTYgdHJhY2s7Ci0gICAgICAgIHJlZ2lzdGVyIFdvcmQxNiBmaXJzdDsKLSAgICAgICAgcmVnaXN0ZXIgV29yZDE2IGluZGV4OwotICAgICAgICByZWdpc3RlciBXb3JkMTYgcnNpZ247CisgICAgICAgIFdvcmQxNiBpOworICAgICAgICBXb3JkMTYgajsKKyAgICAgICAgV29yZDE2IGs7CisgICAgICAgIFdvcmQxNiB0cmFjazsKKyAgICAgICAgV29yZDE2IGZpcnN0OworICAgICAgICBXb3JkMTYgaW5kZXg7CisgICAgICAgIFdvcmQxNiByc2lnbjsKICAgICAgICAgV29yZDE2IGluZHg7CiAgICAgICAgIFdvcmQxNiBfc2lnbltOQl9QVUxTRV07CiAgICAgICAgIFdvcmQxNiAqcDA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jbF9sdHAuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY2xfbHRwLmNwcAppbmRleCA0YTA1MzI3Li41MjVlNTdkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jbF9sdHAuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NsX2x0cC5jcHAKQEAgLTYzOCw3ICs2MzgsNyBAQAogICAgIEZsYWcgICAqcE92ZXJmbG93ICAgIC8qIG8gICA6IG92ZXJmbG93IGluZGljYXRvciAgICAgICAgICAgICAgICAgICAgICAgICovCiApCiB7Ci0gICAgcmVnaXN0ZXIgV29yZDE2IGk7CisgICAgV29yZDE2IGk7CiAgICAgV29yZDE2IGluZGV4OwogICAgIFdvcmQzMiBMX3RlbXA7ICAgICAvKiB0ZW1wb3JhcmlseSB2YXJpYWJsZSAqLwogICAgIFdvcmQxNiByZXN1MzsgICAgICAvKiBmbGFnIGZvciB1cHNhbXBsZSByZXNvbHV0aW9uICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb252b2x2ZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb252b2x2ZS5jcHAKaW5kZXggZTljZTdiYS4uNTAxNWE0YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29udm9sdmUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NvbnZvbHZlLmNwcApAQCAtMjEyLDcgKzIxMiw3IEBACiAgICAgV29yZDE2IEwgICAgICAgICAgIC8qIChpKSAgICAgOiB2ZWN0b3Igc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogKQogewotICAgIHJlZ2lzdGVyIFdvcmQxNiBpLCBuOworICAgIFdvcmQxNiBpLCBuOwogICAgIFdvcmQzMiBzMSwgczI7CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29yX2guY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29yX2guY3BwCmluZGV4IGU0NmQ5OWYuLjIwNTgzYzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nvcl9oLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb3JfaC5jcHAKQEAgLTI3Miw4ICsyNzIsOCBAQAogICAgIEZsYWcgICpwT3ZlcmZsb3cKICkKIHsKLSAgICByZWdpc3RlciBXb3JkMTYgaTsKLSAgICByZWdpc3RlciBXb3JkMTYgZGVjOworICAgIFdvcmQxNiBpOworICAgIFdvcmQxNiBkZWM7CiAKICAgICBXb3JkMTYgaDJbTF9DT0RFXTsKICAgICBXb3JkMzIgczsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nvcl9oX3guY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29yX2hfeC5jcHAKaW5kZXggYmViMmFlYy4uYzI1YzAyNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29yX2hfeC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29yX2hfeC5jcHAKQEAgLTI0OSw5ICsyNDksOSBAQAogICAgIEZsYWcgICAqcE92ZXJmbG93IC8qIChvKTogcG9pbnRlciB0byBvdmVyZmxvdyBmbGFnICAgICAgICAgICAgICAgICAgICAgICovCiApCiB7Ci0gICAgcmVnaXN0ZXIgV29yZDE2IGk7Ci0gICAgcmVnaXN0ZXIgV29yZDE2IGo7Ci0gICAgcmVnaXN0ZXIgV29yZDE2IGs7CisgICAgV29yZDE2IGk7CisgICAgV29yZDE2IGo7CisgICAgV29yZDE2IGs7CiAKICAgICBXb3JkMzIgczsKICAgICBXb3JkMzIgeTMyW0xfQ09ERV07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb3JfaF94Mi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb3JfaF94Mi5jcHAKaW5kZXggZGE2MDY0MC4uYjRmZDg2NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29yX2hfeDIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nvcl9oX3gyLmNwcApAQCAtMjM2LDkgKzIzNiw5IEBACiAgICAgRmxhZyAqcE92ZXJmbG93CiApCiB7Ci0gICAgcmVnaXN0ZXIgV29yZDE2IGk7Ci0gICAgcmVnaXN0ZXIgV29yZDE2IGo7Ci0gICAgcmVnaXN0ZXIgV29yZDE2IGs7CisgICAgV29yZDE2IGk7CisgICAgV29yZDE2IGo7CisgICAgV29yZDE2IGs7CiAgICAgV29yZDMyIHM7CiAgICAgV29yZDMyIHkzMltMX0NPREVdOwogICAgIFdvcmQzMiBtYXg7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9kdHhfZW5jLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2R0eF9lbmMuY3BwCmluZGV4IDI3NmU1OTAuLjJjY2I3NzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2R0eF9lbmMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2R0eF9lbmMuY3BwCkBAIC0xMzAsNyArMTMwLDcgQEAKIDsgTUFDUk9TCiA7IERlZmluZSBtb2R1bGUgc3BlY2lmaWMgbWFjcm9zIGhlcmUKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotZXh0ZXJuIFdvcmQzMiBMX2FkZChyZWdpc3RlciBXb3JkMzIgTF92YXIxLCByZWdpc3RlciBXb3JkMzIgTF92YXIyLCBGbGFnICpwT3ZlcmZsb3cpOworZXh0ZXJuIFdvcmQzMiBMX2FkZChXb3JkMzIgTF92YXIxLCBXb3JkMzIgTF92YXIyLCBGbGFnICpwT3ZlcmZsb3cpOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIDsgREVGSU5FUwpAQCAtNjcxLDcgKzY3MSw3IEBACiAgICAgICAgICAgICAgRmxhZyAgICpwT3ZlcmZsb3cgICAgICAgIC8qIGkvbyA6IG92ZXJmbG93IGluZGljYXRvciAgICAgICAgICAgICovCiAgICAgICAgICAgICApCiB7Ci0gICAgcmVnaXN0ZXIgV29yZDE2IGksIGo7CisgICAgV29yZDE2IGksIGo7CiAgICAgV29yZDE2IHRlbXA7CiAgICAgV29yZDE2IGxvZ19lbjsKICAgICBXb3JkMTYgbHNmW01dOwpAQCAtOTQzLDcgKzk0Myw3IEBACiAgICAgICAgICAgICAgICApCiB7CiAKLSAgICByZWdpc3RlciBXb3JkMTYgaTsKKyAgICBXb3JkMTYgaTsKICAgICBXb3JkMzIgTF9mcmFtZV9lbjsKICAgICBXb3JkMzIgTF90ZW1wOwogICAgIFdvcmQxNiBsb2dfZW5fZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xldmluc29uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xldmluc29uLmNwcAppbmRleCAwMDE4OTdiLi4yOWNkYWM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9sZXZpbnNvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbGV2aW5zb24uY3BwCkBAIC02MzgsOCArNjM4LDggQEAKICAgICBGbGFnICAgKnBPdmVyZmxvdwogKQogewotICAgIHJlZ2lzdGVyIFdvcmQxNiBpOwotICAgIHJlZ2lzdGVyIFdvcmQxNiBqOworICAgIFdvcmQxNiBpOworICAgIFdvcmQxNiBqOwogICAgIFdvcmQxNiBoaTsKICAgICBXb3JkMTYgbG87CiAgICAgV29yZDE2IEtoOyAgICAgICAgICAgICAgICAgICAgLyogcmVmbGV4aW9uIGNvZWZmaWNpZW50OyBoaSBhbmQgbG8gICAqLwpAQCAtNjUxLDkgKzY1MSw5IEBACiAgICAgV29yZDE2IEFsW00gKyAxXTsKICAgICBXb3JkMTYgQW5oW00gKyAxXTsgICAgICAgICAgICAvKiBMUEMgY29lZi5mb3IgbmV4dCBpdGVyYXRpb24gaW4gICAgICovCiAgICAgV29yZDE2IEFubFtNICsgMV07ICAgICAgICAgICAgLyogZG91YmxlIHByZWMuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIHJlZ2lzdGVyIFdvcmQzMiB0MDsgICAgICAgICAgIC8qIHRlbXBvcmFyeSB2YXJpYWJsZSAgICAgICAgICAgICAgICAgKi8KLSAgICByZWdpc3RlciBXb3JkMzIgdDE7ICAgICAgICAgICAvKiB0ZW1wb3JhcnkgdmFyaWFibGUgICAgICAgICAgICAgICAgICovCi0gICAgcmVnaXN0ZXIgV29yZDMyIHQyOyAgICAgICAgICAgLyogdGVtcG9yYXJ5IHZhcmlhYmxlICAgICAgICAgICAgICAgICAqLworICAgIFdvcmQzMiB0MDsgICAgICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB2YXJpYWJsZSAgICAgICAgICAgICAgICAgKi8KKyAgICBXb3JkMzIgdDE7ICAgICAgICAgICAgICAgICAgICAvKiB0ZW1wb3JhcnkgdmFyaWFibGUgICAgICAgICAgICAgICAgICovCisgICAgV29yZDMyIHQyOyAgICAgICAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IHZhcmlhYmxlICAgICAgICAgICAgICAgICAqLwogCiAgICAgV29yZDE2ICpwX1JoOwogICAgIFdvcmQxNiAqcF9SbDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3BpdGNoX29sLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3BpdGNoX29sLmNwcAppbmRleCBkM2EyZWMwLi5jMDM5YmIwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9waXRjaF9vbC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcGl0Y2hfb2wuY3BwCkBAIC0zMjAsNyArMzIwLDcgQEAKICkKICNlbmRpZgogewotICAgIHJlZ2lzdGVyIFdvcmQxNiBpOworICAgIFdvcmQxNiBpOwogICAgIFdvcmQxNiAqcDsKICAgICBXb3JkMzIgbWF4OwogICAgIFdvcmQzMiB0MDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3ByZV9wcm9jLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3ByZV9wcm9jLmNwcAppbmRleCBmZGMyNDQwLi4wNDI5MjBlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9wcmVfcHJvYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcHJlX3Byb2MuY3BwCkBAIC01NDIsNyArNTQyLDcgQEAKICAgICBXb3JkMTYgc2lnbmFsW10sIC8qIGlucHV0L291dHB1dCBzaWduYWwgKi8KICAgICBXb3JkMTYgbGcpICAgICAgIC8qIGxlbmd0aCBvZiBzaWduYWwgICAgKi8KIHsKLSAgICByZWdpc3RlciBXb3JkMTYgaTsKKyAgICBXb3JkMTYgaTsKICAgICBXb3JkMTYgeF9uXzI7CiAgICAgV29yZDE2IHhfbl8xOwogICAgIFdvcmQzMiBMX3RtcDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3NldF9zaWduLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3NldF9zaWduLmNwcAppbmRleCBkNjI2ZGUzLi5mYTQzZjc4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zZXRfc2lnbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc2V0X3NpZ24uY3BwCkBAIC0yNDgsNyArMjQ4LDcgQEAKICAgICAgICAgICAgICAgV29yZDE2IG4gICAgICAgLyogaSAgIDogIyBvZiBtYXhpbXVtIGNvcnJlbGF0aW9ucyBpbiBkbjJbXSAgICAqLwogICAgICAgICAgICAgICkKIHsKLSAgICByZWdpc3RlciBXb3JkMTYgaSwgaiwgazsKKyAgICBXb3JkMTYgaSwgaiwgazsKICAgICBXb3JkMTYgdmFsLCBtaW47CiAgICAgV29yZDE2IHBvcyA9IDA7IC8qIGluaXRpYWxpemF0aW9uIG9ubHkgbmVlZGVkIHRvIGtlZXAgZ2NjIHNpbGVudCAqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9BbmRyb2lkLm1rCmluZGV4IGVmZGY5ODguLjY4NmY3YTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9BbmRyb2lkLm1rCkBAIC00OCw3ICs0OCw3IEBACiAgICAgICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZQogCiBMT0NBTF9DRkxBR1MgOj0gXAotICAgICAgICAtRE9TQ0xfVU5VU0VEX0FSRz0gLURPU0NMX0lNUE9SVF9SRUY9CisgICAgICAgIC1EIk9TQ0xfVU5VU0VEX0FSRyh4KT0odm9pZCkoeCkiIC1ET1NDTF9JTVBPUlRfUkVGPQogCiBMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3B2YW1yd2JfbWF0aF9vcC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3B2YW1yd2JfbWF0aF9vcC5jcHAKaW5kZXggZDFlYzc5MC4uNTg3MjUxMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9wdmFtcndiX21hdGhfb3AuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHZhbXJ3Yl9tYXRoX29wLmNwcApAQCAtMjA1LDcgKzIwNSw3IEBACiB7CiAKICAgICBpbnQxNiB2YXJfb3V0ID0gMDsKLSAgICByZWdpc3RlciBpbnQxNiBpdGVyYXRpb247CisgICAgaW50MTYgaXRlcmF0aW9uOwogICAgIGludDMyIExfbnVtOwogICAgIGludDMyIExfZGVub207CiAgICAgaW50MzIgTF9kZW5vbV9ieV8yOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5tawppbmRleCA2NGZlOGQxLi4wMjRhMjkyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5tawpAQCAtODYsNiArODYsOSBAQAogCiBlbmRpZgogCisjIEFSTVY1RS9GaWx0XzZrXzdrX29wdC5zIGRvZXMgbm90IGNvbXBpbGUgd2l0aCBDbGFuZy4KK0xPQ0FMX0NMQU5HX0FTRkxBR1NfYXJtICs9IC1uby1pbnRlZ3JhdGVkLWFzCisKIExPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9hbXJ3YmVuYwogCiBMT0NBTF9BUk1fTU9ERSA6PSBhcm0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcV9wdWxzZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9xX3B1bHNlLmMKaW5kZXggODBhMGI3My4uZDY1ODYwMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9xX3B1bHNlLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9xX3B1bHNlLmMKQEAgLTE4OCw3ICsxODgsNyBAQAogCQlXb3JkMTYgcG9zW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBwb3NpdGlvbiBvZiB0aGUgcHVsc2UgMS4uNCAgKi8KIAkJV29yZDE2IE4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgbnVtYmVyIG9mIGJpdHMgZm9yIHBvc2l0aW9uICovCiB7Ci0JV29yZDE2IG5iX3BvcywgbWFzaywgbl8xLCB0bXA7CisJV29yZDE2IG5iX3BvcywgbWFzayBfX3VudXNlZCwgbl8xLCB0bXA7CiAJV29yZDE2IHBvc0FbNF0sIHBvc0JbNF07CiAJV29yZDMyIGksIGosIGssIGluZGV4OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3diX3ZhZC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy93Yl92YWQuYwppbmRleCAxM2RkMmFhLi4yYmVhZWZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3diX3ZhZC5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvd2JfdmFkLmMKQEAgLTQwNCw3ICs0MDQsNyBAQAogCQlhbHBoYV9kb3duID0gQUxQSEFfRE9XTjE7CiAJfSBlbHNlCiAJewotCQlpZiAoKHN0LT5zdGF0X2NvdW50ID09IDApKQorCQlpZiAoc3QtPnN0YXRfY291bnQgPT0gMCkKIAkJewogCQkJYWxwaGFfdXAgPSBBTFBIQV9VUDI7CiAJCQlhbHBoYV9kb3duID0gQUxQSEFfRE9XTjI7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2NvbW1vbi9zcmMvZGVibG9jay5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2NvbW1vbi9zcmMvZGVibG9jay5jcHAKaW5kZXggZGUyZDJiNi4uNWY4YjY5MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9jb21tb24vc3JjL2RlYmxvY2suY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvY29tbW9uL3NyYy9kZWJsb2NrLmNwcApAQCAtMTI3OSw3ICsxMjc5LDcgQEAKICAgICBpbnQgIEMwLCBjMCwgZGlmLCBBYnNEZWx0YSwgU3RybmcsIHRtcCwgdG1wMTsKICAgICBpbnQgIEwyID0gMCwgTDEsIEwwLCBSMCwgUjEsIFIyID0gMDsKICAgICB1aW50OCAqcHRyLCAqcHRyMTsKLSAgICByZWdpc3RlciB1aW50IFJfaW4sIExfaW47CisgICAgdWludCBSX2luLCBMX2luOwogICAgIHVpbnQgUl9vdXQsIExfb3V0OwogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9BbmRyb2lkLm1rCmluZGV4IDUzN2JhNDIuLjJjZWViYzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvQW5kcm9pZC5tawpAQCAtMjgsNyArMjgsNyBAQAogICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAogTE9DQUxfQ0ZMQUdTIDo9IFwKLSAgICAtRE9TQ0xfSU1QT1JUX1JFRj0gLURPU0NMX1VOVVNFRF9BUkc9IC1ET1NDTF9FWFBPUlRfUkVGPQorICAgIC1ET1NDTF9JTVBPUlRfUkVGPSAtRCJPU0NMX1VOVVNFRF9BUkcoeCk9KHZvaWQpKHgpIiAtRE9TQ0xfRVhQT1JUX1JFRj0KIAogTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKIApAQCAtNTEsNyArNTEsNyBAQAogICAgICAgICAkKExPQ0FMX1BBVEgpLy4uL2NvbW1vbgogCiBMT0NBTF9DRkxBR1MgOj0gXAotICAgIC1ET1NDTF9JTVBPUlRfUkVGPSAtRE9TQ0xfVU5VU0VEX0FSRz0gLURPU0NMX0VYUE9SVF9SRUY9CisgICAgLURPU0NMX0lNUE9SVF9SRUY9IC1EIk9TQ0xfVU5VU0VEX0FSRyh4KT0odm9pZCkoeCkiIC1ET1NDTF9FWFBPUlRfUkVGPQogCiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvU29mdEFWQ0VuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvU29mdEFWQ0VuY29kZXIuY3BwCmluZGV4IDE3M2FiZjcuLmNjZTZkMTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL1NvZnRBVkNFbmNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9Tb2Z0QVZDRW5jb2Rlci5jcHAKQEAgLTU4NSwxMyArNTg1LDYgQEAKICAgICAgICAgICAgICAgICB2aWRlb0lucHV0LmNvZGluZ190aW1lc3RhbXAgPSAoaW5IZWFkZXItPm5UaW1lU3RhbXAgKyA1MDApIC8gMTAwMDsgIC8vIGluIG1zCiAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW5wdXREYXRhID0gTlVMTDsKICAgICAgICAgICAgICAgICBpZiAobUlucHV0RGF0YUlzTWV0YSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gIT0gOCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk1ldGFEYXRhIGJ1ZmZlciBpcyB3cm9uZyBzaXplISAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoZ290ICV1IGJ5dGVzLCBleHBlY3RlZCA4KSIsIGluSGVhZGVyLT5uRmlsbGVkTGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaW5wdXREYXRhID0KICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RHcmFwaGljQnVmZmVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRGcmFtZURhdGEsIChtV2lkdGggKiBtSGVpZ2h0ICogMykgPj4gMSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL1NvZnRBVkNFbmNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9Tb2Z0QVZDRW5jb2Rlci5oCmluZGV4IGYzMWMxZjQuLjgxZGUxMDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL1NvZnRBVkNFbmNvZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvU29mdEFWQ0VuY29kZXIuaApAQCAtMjYsOCArMjYsNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBNZWRpYUJ1ZmZlcjsKLQogc3RydWN0IFNvZnRBVkNFbmNvZGVyIDogcHVibGljIE1lZGlhQnVmZmVyT2JzZXJ2ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudCB7CiAgICAgU29mdEFWQ0VuY29kZXIoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvZmluZGhhbGZwZWwuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2ZpbmRoYWxmcGVsLmNwcAppbmRleCAzOGEyYTE1Li4wYjhkOWUyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvZmluZGhhbGZwZWwuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9maW5kaGFsZnBlbC5jcHAKQEAgLTE1MSw4ICsxNTEsNyBAQAogICAgIHVpbnQ4IHRtcDg7CiAgICAgaW50MzIgdG1wMzI7CiAgICAgaW50MTYgdG1wX2hvcnpbMTgqMjJdLCAqZHN0XzE2LCAqc3JjXzE2OwotICAgIHJlZ2lzdGVyIGludCBhID0gMCwgYiA9IDAsIGMgPSAwLCBkID0gMCwgZSA9IDAsIGYgPSAwOyAvLyB0ZW1wIHJlZ2lzdGVyCi0gICAgaW50IG1zazsKKyAgICBpbnQgYSA9IDAsIGIgPSAwLCBjID0gMCwgZCA9IDAsIGUgPSAwLCBmID0gMDsgLy8gdGVtcAogICAgIGludCBpLCBqOwogCiAgICAgLyogZmlyc3QgY29weSBmdWxsLXBlbCB0byB0aGUgZmlyc3QgYXJyYXkgKi8KQEAgLTM3OSw3ICszNzgsNiBAQAogICAgIC8vIG9uZSBjYW4ganVzdCB1c2UgdGhlIGFib3ZlIGNvZGUgYW5kIGNoYW5nZSB0aGUgZm9yKGk9MiB0byBmb3IoaT0xOAogICAgIGZvciAoaSA9IDE2OyBpID4gMDsgaSAtPSA0KQogICAgIHsKLSAgICAgICAgbXNrID0gMDsKICAgICAgICAgZm9yIChqID0gMTc7IGogPiAwOyBqLS0pCiAgICAgICAgIHsKICAgICAgICAgICAgIGEgPSAqKCh1aW50MzIqKXJlZik7IC8qIGxvYWQgNCBieXRlcyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2luaXQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2luaXQuY3BwCmluZGV4IGMyNThiNTcuLjZlMTQxM2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9pbml0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvaW5pdC5jcHAKQEAgLTE3NywxMCArMTc3LDYgQEAKICAgICAgICAgICAgIHNlcVBhcmFtLT5vZmZzZXRfZm9yX25vbl9yZWZfcGljID0gZXh0Uy0+b2Zmc2V0X2Zvcl9ub25fcmVmX3BpYzsKICAgICAgICAgICAgIHNlcVBhcmFtLT5vZmZzZXRfZm9yX3RvcF90b19ib3R0b21fZmllbGQgPSBleHRTLT5vZmZzZXRfZm9yX3RvcF90b19ib3R0b21fZmllbGQ7CiAgICAgICAgICAgICBzZXFQYXJhbS0+bnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZSA9IGV4dFMtPm51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGU7Ci0gICAgICAgICAgICBpZiAoZXh0Uy0+b2Zmc2V0X2Zvcl9yZWZfZnJhbWUgPT0gTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0VOQ1BBUkFNX01FTV9GQUlMOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgKGludCkgZXh0Uy0+bnVtX3JlZl9mcmFtZXM7IGlpKyspCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgc2VxUGFyYW0tPm9mZnNldF9mb3JfcmVmX2ZyYW1lW2lpXSA9IGV4dFMtPm9mZnNldF9mb3JfcmVmX2ZyYW1lW2lpXTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9yYXRlX2NvbnRyb2wuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL3JhdGVfY29udHJvbC5jcHAKaW5kZXggYWExMzg3My4uMDlkY2MyOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL3JhdGVfY29udHJvbC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL3JhdGVfY29udHJvbC5jcHAKQEAgLTE3MSw3ICsxNzEsNyBAQAogICAgIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCA9IGVuY3ZpZC0+cmF0ZUN0cmw7CiAgICAgZG91YmxlIEwxLCBMMiwgTDMsIGJwcDsKICAgICBpbnQgcXA7Ci0gICAgaW50IGksIGo7CisgICAgaW50IGk7CiAKICAgICByYXRlQ3RybC0+YmFzaWNVbml0ID0gdmlkZW8tPlBpY1NpemVJbk1iczsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMmFiNTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyNyBAQAorI2lmZXEgKCQoaWYgJCh3aWxkY2FyZCBleHRlcm5hbC9saWJoMjY0KSwxLDApLDEpCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgICAgICAgICAgICA6PSBsaWJzdGFnZWZyaWdodF9zb2Z0X2F2Y2RlYworTE9DQUxfTU9EVUxFX1RBR1MgICAgICAgOj0gb3B0aW9uYWwKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyAgOj0gbGliYXZjZGVjCitMT0NBTF9TUkNfRklMRVMgICAgICAgICA6PSBTb2Z0QVZDRGVjLmNwcAorCitMT0NBTF9DX0lOQ0xVREVTIDo9ICQoVE9QKS9leHRlcm5hbC9saWJhdmMvZGVjb2RlcgorTE9DQUxfQ19JTkNMVURFUyArPSAkKFRPUCkvZXh0ZXJuYWwvbGliYXZjL2NvbW1vbgorTE9DQUxfQ19JTkNMVURFUyArPSAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyAgOj0gbGlic3RhZ2VmcmlnaHQKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgICs9IGxpYnN0YWdlZnJpZ2h0X29teAorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyAgKz0gbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbgorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyAgKz0gbGlidXRpbHMKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgICs9IGxpYmxvZworCitMT0NBTF9MREZMQUdTIDo9IC1XbCwtQnN5bWJvbGljCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL1NvZnRBVkNEZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9Tb2Z0QVZDRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mzg4NDcyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9Tb2Z0QVZDRGVjLmNwcApAQCAtMCwwICsxLDgwOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTb2Z0QVZDRGVjIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiaWgyNjRfdHlwZWRlZnMuaCIKKyNpbmNsdWRlICJpdi5oIgorI2luY2x1ZGUgIml2ZC5oIgorI2luY2x1ZGUgIml0aHJlYWQuaCIKKyNpbmNsdWRlICJpaDI2NGQuaCIKKyNpbmNsdWRlICJTb2Z0QVZDRGVjLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPE9NWF9WaWRlb0V4dC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNkZWZpbmUgUFJJTlRfVElNRSAgQUxPR1YKKworI2RlZmluZSBjb21wb25lbnROYW1lICAgICAgICAgICAgICAgICAgICJ2aWRlb19kZWNvZGVyLmF2YyIKKyNkZWZpbmUgY29kaW5nVHlwZSAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fQ29kaW5nQVZDCisjZGVmaW5lIENPREVDX01JTUVfVFlQRSAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDCisKKy8qKiBGdW5jdGlvbiBhbmQgc3RydWN0dXJlIGRlZmluaXRpb25zIHRvIGtlZXAgY29kZSBzaW1pbGFyIGZvciBlYWNoIGNvZGVjICovCisjZGVmaW5lIGl2ZGVjX2FwaV9mdW5jdGlvbiAgICAgICAgICAgICAgaWgyNjRkX2FwaV9mdW5jdGlvbgorI2RlZmluZSBpdmRleHRfaW5pdF9pcF90ICAgICAgICAgICAgICAgIGloMjY0ZF9pbml0X2lwX3QKKyNkZWZpbmUgaXZkZXh0X2luaXRfb3BfdCAgICAgICAgICAgICAgICBpaDI2NGRfaW5pdF9vcF90CisjZGVmaW5lIGl2ZGV4dF9maWxsX21lbV9yZWNfaXBfdCAgICAgICAgaWgyNjRkX2ZpbGxfbWVtX3JlY19pcF90CisjZGVmaW5lIGl2ZGV4dF9maWxsX21lbV9yZWNfb3BfdCAgICAgICAgaWgyNjRkX2ZpbGxfbWVtX3JlY19vcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90ICAgaWgyNjRkX2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX29wX3QgICBpaDI2NGRfY3RsX3NldF9udW1fY29yZXNfb3BfdAorCisjZGVmaW5lIElWREVYVF9DTURfQ1RMX1NFVF9OVU1fQ09SRVMgICAgXAorICAgICAgICAoSVZEX0NPTlRST0xfQVBJX0NPTU1BTkRfVFlQRV9UKUlIMjY0RF9DTURfQ1RMX1NFVF9OVU1fQ09SRVMKKworc3RhdGljIGNvbnN0IENvZGVjUHJvZmlsZUxldmVsIGtQcm9maWxlTGV2ZWxzW10gPSB7CisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwxICB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMWIgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDExIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwxMiB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMTMgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDIgIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwyMSB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMjIgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDMgIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwzMSB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMzIgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDQgIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWw0MSB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsNDIgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDUgIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWw1MSB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsNTIgfSwKKworICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCAgICAgT01YX1ZJREVPX0FWQ0xldmVsMSAgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgICAgIE9NWF9WSURFT19BVkNMZXZlbDFiIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sICAgICBPTVhfVklERU9fQVZDTGV2ZWwxMSB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCAgICAgT01YX1ZJREVPX0FWQ0xldmVsMTIgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgICAgIE9NWF9WSURFT19BVkNMZXZlbDEzIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sICAgICBPTVhfVklERU9fQVZDTGV2ZWwyICB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCAgICAgT01YX1ZJREVPX0FWQ0xldmVsMjEgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgICAgIE9NWF9WSURFT19BVkNMZXZlbDIyIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sICAgICBPTVhfVklERU9fQVZDTGV2ZWwzICB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCAgICAgT01YX1ZJREVPX0FWQ0xldmVsMzEgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgICAgIE9NWF9WSURFT19BVkNMZXZlbDMyIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sICAgICBPTVhfVklERU9fQVZDTGV2ZWw0ICB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCAgICAgT01YX1ZJREVPX0FWQ0xldmVsNDEgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgICAgIE9NWF9WSURFT19BVkNMZXZlbDQyIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sICAgICBPTVhfVklERU9fQVZDTGV2ZWw1ICB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCAgICAgT01YX1ZJREVPX0FWQ0xldmVsNTEgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgICAgIE9NWF9WSURFT19BVkNMZXZlbDUyIH0sCisKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlSGlnaCwgICAgIE9NWF9WSURFT19BVkNMZXZlbDEgIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gsICAgICBPTVhfVklERU9fQVZDTGV2ZWwxYiB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoLCAgICAgT01YX1ZJREVPX0FWQ0xldmVsMTEgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlSGlnaCwgICAgIE9NWF9WSURFT19BVkNMZXZlbDEyIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gsICAgICBPTVhfVklERU9fQVZDTGV2ZWwxMyB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoLCAgICAgT01YX1ZJREVPX0FWQ0xldmVsMiAgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlSGlnaCwgICAgIE9NWF9WSURFT19BVkNMZXZlbDIxIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gsICAgICBPTVhfVklERU9fQVZDTGV2ZWwyMiB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoLCAgICAgT01YX1ZJREVPX0FWQ0xldmVsMyAgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlSGlnaCwgICAgIE9NWF9WSURFT19BVkNMZXZlbDMxIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gsICAgICBPTVhfVklERU9fQVZDTGV2ZWwzMiB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoLCAgICAgT01YX1ZJREVPX0FWQ0xldmVsNCAgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlSGlnaCwgICAgIE9NWF9WSURFT19BVkNMZXZlbDQxIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gsICAgICBPTVhfVklERU9fQVZDTGV2ZWw0MiB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoLCAgICAgT01YX1ZJREVPX0FWQ0xldmVsNSAgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlSGlnaCwgICAgIE9NWF9WSURFT19BVkNMZXZlbDUxIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gsICAgICBPTVhfVklERU9fQVZDTGV2ZWw1MiB9LAorfTsKKworU29mdEFWQzo6U29mdEFWQygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICBPTVhfUFRSIGFwcERhdGEsCisgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KQorICAgIDogU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudCgKKyAgICAgICAgICAgIG5hbWUsIGNvbXBvbmVudE5hbWUsIGNvZGluZ1R5cGUsCisgICAgICAgICAgICBrUHJvZmlsZUxldmVscywgQVJSQVlfU0laRShrUHJvZmlsZUxldmVscyksCisgICAgICAgICAgICAzMjAgLyogd2lkdGggKi8sIDI0MCAvKiBoZWlnaHQgKi8sIGNhbGxiYWNrcywKKyAgICAgICAgICAgIGFwcERhdGEsIGNvbXBvbmVudCksCisgICAgICBtTWVtUmVjb3JkcyhOVUxMKSwKKyAgICAgIG1GbHVzaE91dEJ1ZmZlcihOVUxMKSwKKyAgICAgIG1PbXhDb2xvckZvcm1hdChPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKSwKKyAgICAgIG1JdkNvbG9yRm9ybWF0KElWX1lVVl80MjBQKSwKKyAgICAgIG1OZXdXaWR0aChtV2lkdGgpLAorICAgICAgbU5ld0hlaWdodChtSGVpZ2h0KSwKKyAgICAgIG1DaGFuZ2luZ1Jlc29sdXRpb24oZmFsc2UpIHsKKyAgICBpbml0UG9ydHMoCisgICAgICAgICAgICBrTnVtQnVmZmVycywgSU5QVVRfQlVGX1NJWkUsIGtOdW1CdWZmZXJzLCBDT0RFQ19NSU1FX1RZUEUpOworCisgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgTlVMTCk7CisKKyAgICAvLyBJZiBpbnB1dCBkdW1wIGlzIGVuYWJsZWQsIHRoZW4gb3BlbiBjcmVhdGUgYW4gZW1wdHkgZmlsZQorICAgIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKTsKKyAgICBDUkVBVEVfRFVNUF9GSUxFKG1JbkZpbGUpOworCisgICAgQ0hFQ0tfRVEoaW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKK30KKworU29mdEFWQzo6flNvZnRBVkMoKSB7CisgICAgQ0hFQ0tfRVEoZGVJbml0RGVjb2RlcigpLCAoc3RhdHVzX3QpT0spOworfQorCitzdGF0aWMgc2l6ZV90IEdldENQVUNvcmVDb3VudCgpIHsKKyAgICBsb25nIGNwdUNvcmVDb3VudCA9IDE7CisjaWYgZGVmaW5lZChfU0NfTlBST0NFU1NPUlNfT05MTikKKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKTsKKyNlbHNlCisgICAgLy8gX1NDX05QUk9DX09OTE4gbXVzdCBiZSBkZWZpbmVkLi4uCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NfT05MTik7CisjZW5kaWYKKyAgICBDSEVDSyhjcHVDb3JlQ291bnQgPj0gMSk7CisgICAgQUxPR0QoIk51bWJlciBvZiBDUFUgY29yZXM6ICVsZCIsIGNwdUNvcmVDb3VudCk7CisgICAgcmV0dXJuIChzaXplX3QpY3B1Q29yZUNvdW50OworfQorCit2b2lkIFNvZnRBVkM6OmxvZ1ZlcnNpb24oKSB7CisgICAgaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90IHNfY3RsX2lwOworICAgIGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCBzX2N0bF9vcDsKKyAgICBVV09SRDggYXUxX2J1Zls1MTJdOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1czsKKworICAgIHNfY3RsX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19jdGxfaXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfR0VUVkVSU0lPTjsKKyAgICBzX2N0bF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9faXBfdCk7CisgICAgc19jdGxfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2dldHZlcnNpb25pbmZvX29wX3QpOworICAgIHNfY3RsX2lwLnB2X3ZlcnNpb25fYnVmZmVyID0gYXUxX2J1ZjsKKyAgICBzX2N0bF9pcC51NF92ZXJzaW9uX2J1ZmZlcl9zaXplID0gc2l6ZW9mKGF1MV9idWYpOworCisgICAgc3RhdHVzID0KKyAgICAgICAgaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19jdGxfaXAsICh2b2lkICopJnNfY3RsX29wKTsKKworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiRXJyb3IgaW4gZ2V0dGluZyB2ZXJzaW9uIG51bWJlcjogMHgleCIsCisgICAgICAgICAgICAgICAgc19jdGxfb3AudTRfZXJyb3JfY29kZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIkl0dGlhbSBkZWNvZGVyIHZlcnNpb24gbnVtYmVyOiAlcyIsCisgICAgICAgICAgICAgICAgKGNoYXIgKilzX2N0bF9pcC5wdl92ZXJzaW9uX2J1ZmZlcik7CisgICAgfQorICAgIHJldHVybjsKK30KKworc3RhdHVzX3QgU29mdEFWQzo6c2V0UGFyYW1zKHNpemVfdCBzdHJpZGUpIHsKKyAgICBpdmRfY3RsX3NldF9jb25maWdfaXBfdCBzX2N0bF9pcDsKKyAgICBpdmRfY3RsX3NldF9jb25maWdfb3BfdCBzX2N0bF9vcDsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXM7CisgICAgc19jdGxfaXAudTRfZGlzcF93ZCA9IChVV09SRDMyKXN0cmlkZTsKKyAgICBzX2N0bF9pcC5lX2ZybV9za2lwX21vZGUgPSBJVkRfU0tJUF9OT05FOworCisgICAgc19jdGxfaXAuZV9mcm1fb3V0X21vZGUgPSBJVkRfRElTUExBWV9GUkFNRV9PVVQ7CisgICAgc19jdGxfaXAuZV92aWRfZGVjX21vZGUgPSBJVkRfREVDT0RFX0ZSQU1FOworICAgIHNfY3RsX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19jdGxfaXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfU0VUUEFSQU1TOworICAgIHNfY3RsX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9zZXRfY29uZmlnX2lwX3QpOworICAgIHNfY3RsX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9zZXRfY29uZmlnX29wX3QpOworCisgICAgQUxPR1YoIlNldCB0aGUgcnVuLXRpbWUgKGR5bmFtaWMpIHBhcmFtZXRlcnMgc3RyaWRlID0gJXUiLCBzdHJpZGUpOworICAgIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICh2b2lkICopJnNfY3RsX2lwLCAodm9pZCAqKSZzX2N0bF9vcCk7CisKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGluIHNldHRpbmcgdGhlIHJ1bi10aW1lIHBhcmFtZXRlcnM6IDB4JXgiLAorICAgICAgICAgICAgICAgIHNfY3RsX29wLnU0X2Vycm9yX2NvZGUpOworCisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFNvZnRBVkM6OnJlc2V0UGx1Z2luKCkgeworICAgIG1Jc0luRmx1c2ggPSBmYWxzZTsKKyAgICBtUmVjZWl2ZWRFT1MgPSBmYWxzZTsKKyAgICBtZW1zZXQobVRpbWVTdGFtcHMsIDAsIHNpemVvZihtVGltZVN0YW1wcykpOworICAgIG1lbXNldChtVGltZVN0YW1wc1ZhbGlkLCAwLCBzaXplb2YobVRpbWVTdGFtcHNWYWxpZCkpOworCisgICAgLyogSW5pdGlhbGl6ZSBib3RoIHN0YXJ0IGFuZCBlbmQgdGltZXMgKi8KKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lU3RhcnQsIE5VTEwpOworICAgIGdldHRpbWVvZmRheSgmbVRpbWVFbmQsIE5VTEwpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTb2Z0QVZDOjpyZXNldERlY29kZXIoKSB7CisgICAgaXZkX2N0bF9yZXNldF9pcF90IHNfY3RsX2lwOworICAgIGl2ZF9jdGxfcmVzZXRfb3BfdCBzX2N0bF9vcDsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXM7CisKKyAgICBzX2N0bF9pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfY3RsX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX1JFU0VUOworICAgIHNfY3RsX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9yZXNldF9pcF90KTsKKyAgICBzX2N0bF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfcmVzZXRfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSZzX2N0bF9pcCwgKHZvaWQgKikmc19jdGxfb3ApOworICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICBBTE9HRSgiRXJyb3IgaW4gcmVzZXQ6IDB4JXgiLCBzX2N0bF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgLyogU2V0IHRoZSBydW4tdGltZSAoZHluYW1pYykgcGFyYW1ldGVycyAqLworICAgIHNldFBhcmFtcyhvdXRwdXRCdWZmZXJXaWR0aCgpKTsKKworICAgIC8qIFNldCBudW1iZXIgb2YgY29yZXMvdGhyZWFkcyB0byBiZSB1c2VkIGJ5IHRoZSBjb2RlYyAqLworICAgIHNldE51bUNvcmVzKCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFNvZnRBVkM6OnNldE51bUNvcmVzKCkgeworICAgIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90IHNfc2V0X2NvcmVzX2lwOworICAgIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90IHNfc2V0X2NvcmVzX29wOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1czsKKyAgICBzX3NldF9jb3Jlc19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfc2V0X2NvcmVzX2lwLmVfc3ViX2NtZCA9IElWREVYVF9DTURfQ1RMX1NFVF9OVU1fQ09SRVM7CisgICAgc19zZXRfY29yZXNfaXAudTRfbnVtX2NvcmVzID0gTUlOKG1OdW1Db3JlcywgQ09ERUNfTUFYX05VTV9DT1JFUyk7CisgICAgc19zZXRfY29yZXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCk7CisgICAgc19zZXRfY29yZXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCk7CisgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKAorICAgICAgICAgICAgbUNvZGVjQ3R4LCAodm9pZCAqKSZzX3NldF9jb3Jlc19pcCwgKHZvaWQgKikmc19zZXRfY29yZXNfb3ApOworICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICBBTE9HRSgiRXJyb3IgaW4gc2V0dGluZyBudW1iZXIgb2YgY29yZXM6IDB4JXgiLAorICAgICAgICAgICAgICAgIHNfc2V0X2NvcmVzX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTb2Z0QVZDOjpzZXRGbHVzaE1vZGUoKSB7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzOworICAgIGl2ZF9jdGxfZmx1c2hfaXBfdCBzX3ZpZGVvX2ZsdXNoX2lwOworICAgIGl2ZF9jdGxfZmx1c2hfb3BfdCBzX3ZpZGVvX2ZsdXNoX29wOworCisgICAgc192aWRlb19mbHVzaF9pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfdmlkZW9fZmx1c2hfaXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfRkxVU0g7CisgICAgc192aWRlb19mbHVzaF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZmx1c2hfaXBfdCk7CisgICAgc192aWRlb19mbHVzaF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZmx1c2hfb3BfdCk7CisKKyAgICAvKiBTZXQgdGhlIGRlY29kZXIgaW4gRmx1c2ggbW9kZSwgc3Vic2VxdWVudCBkZWNvZGUoKSBjYWxscyB3aWxsIGZsdXNoICovCisgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKAorICAgICAgICAgICAgbUNvZGVjQ3R4LCAodm9pZCAqKSZzX3ZpZGVvX2ZsdXNoX2lwLCAodm9pZCAqKSZzX3ZpZGVvX2ZsdXNoX29wKTsKKworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiRXJyb3IgaW4gc2V0dGluZyB0aGUgZGVjb2RlciBpbiBmbHVzaCBtb2RlOiAoJWQpIDB4JXgiLCBzdGF0dXMsCisgICAgICAgICAgICAgICAgc192aWRlb19mbHVzaF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgbUlzSW5GbHVzaCA9IHRydWU7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTb2Z0QVZDOjppbml0RGVjb2RlcigpIHsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXM7CisKKyAgICBVV09SRDMyIHU0X251bV9yZW9yZGVyX2ZyYW1lczsKKyAgICBVV09SRDMyIHU0X251bV9yZWZfZnJhbWVzOworICAgIFVXT1JEMzIgdTRfc2hhcmVfZGlzcF9idWY7CisgICAgV09SRDMyIGk0X2xldmVsOworCisgICAgbU51bUNvcmVzID0gR2V0Q1BVQ29yZUNvdW50KCk7CisKKyAgICAvKiBJbml0aWFsaXplIG51bWJlciBvZiByZWYgYW5kIHJlb3JkZXIgbW9kZXMgKGZvciBIMjY0KSAqLworICAgIHU0X251bV9yZW9yZGVyX2ZyYW1lcyA9IDE2OworICAgIHU0X251bV9yZWZfZnJhbWVzID0gMTY7CisgICAgdTRfc2hhcmVfZGlzcF9idWYgPSAwOworCisgICAgdWludDMyX3QgZGlzcGxheVN0cmlkZSA9IG91dHB1dEJ1ZmZlcldpZHRoKCk7CisgICAgdWludDMyX3QgZGlzcGxheUhlaWdodCA9IG91dHB1dEJ1ZmZlckhlaWdodCgpOworICAgIHVpbnQzMl90IGRpc3BsYXlTaXplWSA9IGRpc3BsYXlTdHJpZGUgKiBkaXNwbGF5SGVpZ2h0OworCisgICAgaWYgKGRpc3BsYXlTaXplWSA+ICgxOTIwICogMTA4OCkpIHsKKyAgICAgICAgaTRfbGV2ZWwgPSA1MDsKKyAgICB9IGVsc2UgaWYgKGRpc3BsYXlTaXplWSA+ICgxMjgwICogNzIwKSkgeworICAgICAgICBpNF9sZXZlbCA9IDQwOworICAgIH0gZWxzZSBpZiAoZGlzcGxheVNpemVZID4gKDcyMCAqIDU3NikpIHsKKyAgICAgICAgaTRfbGV2ZWwgPSAzMTsKKyAgICB9IGVsc2UgaWYgKGRpc3BsYXlTaXplWSA+ICg2MjQgKiAzMjApKSB7CisgICAgICAgIGk0X2xldmVsID0gMzA7CisgICAgfSBlbHNlIGlmIChkaXNwbGF5U2l6ZVkgPiAoMzUyICogMjg4KSkgeworICAgICAgICBpNF9sZXZlbCA9IDIxOworICAgIH0gZWxzZSB7CisgICAgICAgIGk0X2xldmVsID0gMjA7CisgICAgfQorCisgICAgeworICAgICAgICBpdl9udW1fbWVtX3JlY19pcF90IHNfbnVtX21lbV9yZWNfaXA7CisgICAgICAgIGl2X251bV9tZW1fcmVjX29wX3Qgc19udW1fbWVtX3JlY19vcDsKKworICAgICAgICBzX251bV9tZW1fcmVjX2lwLnU0X3NpemUgPSBzaXplb2Yoc19udW1fbWVtX3JlY19pcCk7CisgICAgICAgIHNfbnVtX21lbV9yZWNfb3AudTRfc2l6ZSA9IHNpemVvZihzX251bV9tZW1fcmVjX29wKTsKKyAgICAgICAgc19udW1fbWVtX3JlY19pcC5lX2NtZCA9IElWX0NNRF9HRVRfTlVNX01FTV9SRUM7CisKKyAgICAgICAgQUxPR1YoIkdldCBudW1iZXIgb2YgbWVtIHJlY29yZHMiKTsKKyAgICAgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKAorICAgICAgICAgICAgICAgIG1Db2RlY0N0eCwgKHZvaWQgKikmc19udW1fbWVtX3JlY19pcCwgKHZvaWQgKikmc19udW1fbWVtX3JlY19vcCk7CisgICAgICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICAgICAgQUxPR0UoIkVycm9yIGluIGdldHRpbmcgbWVtIHJlY29yZHM6IDB4JXgiLAorICAgICAgICAgICAgICAgICAgICBzX251bV9tZW1fcmVjX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBtTnVtTWVtUmVjb3JkcyA9IHNfbnVtX21lbV9yZWNfb3AudTRfbnVtX21lbV9yZWM7CisgICAgfQorCisgICAgbU1lbVJlY29yZHMgPSAoaXZfbWVtX3JlY190ICopaXZkX2FsaWduZWRfbWFsbG9jKAorICAgICAgICAgICAgMTI4LCBtTnVtTWVtUmVjb3JkcyAqIHNpemVvZihpdl9tZW1fcmVjX3QpKTsKKyAgICBpZiAobU1lbVJlY29yZHMgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiQWxsb2NhdGlvbiBmYWlsdXJlIik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgbWVtc2V0KG1NZW1SZWNvcmRzLCAwLCBtTnVtTWVtUmVjb3JkcyAqIHNpemVvZihpdl9tZW1fcmVjX3QpKTsKKworICAgIHsKKyAgICAgICAgc2l6ZV90IGk7CisgICAgICAgIGl2ZGV4dF9maWxsX21lbV9yZWNfaXBfdCBzX2ZpbGxfbWVtX2lwOworICAgICAgICBpdmRleHRfZmlsbF9tZW1fcmVjX29wX3Qgc19maWxsX21lbV9vcDsKKyAgICAgICAgaXZfbWVtX3JlY190ICpwc19tZW1fcmVjOworCisgICAgICAgIHNfZmlsbF9tZW1faXAuc19pdmRfZmlsbF9tZW1fcmVjX2lwX3QudTRfc2l6ZSA9CisgICAgICAgICAgICBzaXplb2YoaXZkZXh0X2ZpbGxfbWVtX3JlY19pcF90KTsKKyAgICAgICAgc19maWxsX21lbV9pcC5pNF9sZXZlbCA9IGk0X2xldmVsOworICAgICAgICBzX2ZpbGxfbWVtX2lwLnU0X251bV9yZW9yZGVyX2ZyYW1lcyA9IHU0X251bV9yZW9yZGVyX2ZyYW1lczsKKyAgICAgICAgc19maWxsX21lbV9pcC51NF9udW1fcmVmX2ZyYW1lcyA9IHU0X251bV9yZWZfZnJhbWVzOworICAgICAgICBzX2ZpbGxfbWVtX2lwLnU0X3NoYXJlX2Rpc3BfYnVmID0gdTRfc2hhcmVfZGlzcF9idWY7CisgICAgICAgIHNfZmlsbF9tZW1faXAudTRfbnVtX2V4dHJhX2Rpc3BfYnVmID0gMDsKKyAgICAgICAgc19maWxsX21lbV9pcC5lX291dHB1dF9mb3JtYXQgPSBtSXZDb2xvckZvcm1hdDsKKworICAgICAgICBzX2ZpbGxfbWVtX2lwLnNfaXZkX2ZpbGxfbWVtX3JlY19pcF90LmVfY21kID0gSVZfQ01EX0ZJTExfTlVNX01FTV9SRUM7CisgICAgICAgIHNfZmlsbF9tZW1faXAuc19pdmRfZmlsbF9tZW1fcmVjX2lwX3QucHZfbWVtX3JlY19sb2NhdGlvbiA9IG1NZW1SZWNvcmRzOworICAgICAgICBzX2ZpbGxfbWVtX2lwLnNfaXZkX2ZpbGxfbWVtX3JlY19pcF90LnU0X21heF9mcm1fd2QgPSBkaXNwbGF5U3RyaWRlOworICAgICAgICBzX2ZpbGxfbWVtX2lwLnNfaXZkX2ZpbGxfbWVtX3JlY19pcF90LnU0X21heF9mcm1faHQgPSBkaXNwbGF5SGVpZ2h0OworICAgICAgICBzX2ZpbGxfbWVtX29wLnNfaXZkX2ZpbGxfbWVtX3JlY19vcF90LnU0X3NpemUgPQorICAgICAgICAgICAgc2l6ZW9mKGl2ZGV4dF9maWxsX21lbV9yZWNfb3BfdCk7CisKKyAgICAgICAgcHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbU51bU1lbVJlY29yZHM7IGkrKykgeworICAgICAgICAgICAgcHNfbWVtX3JlY1tpXS51NF9zaXplID0gc2l6ZW9mKGl2X21lbV9yZWNfdCk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24oCisgICAgICAgICAgICAgICAgbUNvZGVjQ3R4LCAodm9pZCAqKSZzX2ZpbGxfbWVtX2lwLCAodm9pZCAqKSZzX2ZpbGxfbWVtX29wKTsKKworICAgICAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFcnJvciBpbiBmaWxsaW5nIG1lbSByZWNvcmRzOiAweCV4IiwKKyAgICAgICAgICAgICAgICAgICAgc19maWxsX21lbV9vcC5zX2l2ZF9maWxsX21lbV9yZWNfb3BfdC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIG1OdW1NZW1SZWNvcmRzID0KKyAgICAgICAgICAgIHNfZmlsbF9tZW1fb3Auc19pdmRfZmlsbF9tZW1fcmVjX29wX3QudTRfbnVtX21lbV9yZWNfZmlsbGVkOworCisgICAgICAgIHBzX21lbV9yZWMgPSBtTWVtUmVjb3JkczsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbU51bU1lbVJlY29yZHM7IGkrKykgeworICAgICAgICAgICAgcHNfbWVtX3JlYy0+cHZfYmFzZSA9IGl2ZF9hbGlnbmVkX21hbGxvYygKKyAgICAgICAgICAgICAgICAgICAgcHNfbWVtX3JlYy0+dTRfbWVtX2FsaWdubWVudCwgcHNfbWVtX3JlYy0+dTRfbWVtX3NpemUpOworICAgICAgICAgICAgaWYgKHBzX21lbV9yZWMtPnB2X2Jhc2UgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBbGxvY2F0aW9uIGZhaWx1cmUgZm9yIG1lbW9yeSByZWNvcmQgIyV6dSBvZiBzaXplICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGksIHBzX21lbV9yZWMtPnU0X21lbV9zaXplKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBJVl9GQUlMOworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBzX21lbV9yZWMrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgdGhlIGRlY29kZXIgKi8KKyAgICB7CisgICAgICAgIGl2ZGV4dF9pbml0X2lwX3Qgc19pbml0X2lwOworICAgICAgICBpdmRleHRfaW5pdF9vcF90IHNfaW5pdF9vcDsKKworICAgICAgICB2b2lkICpkZWNfZnhucyA9ICh2b2lkICopaXZkZWNfYXBpX2Z1bmN0aW9uOworCisgICAgICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfaW5pdF9pcF90KTsKKyAgICAgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC5lX2NtZCA9IChJVkRfQVBJX0NPTU1BTkRfVFlQRV9UKUlWX0NNRF9JTklUOworICAgICAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LnB2X21lbV9yZWNfbG9jYXRpb24gPSBtTWVtUmVjb3JkczsKKyAgICAgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC51NF9mcm1fbWF4X3dkID0gZGlzcGxheVN0cmlkZTsKKyAgICAgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC51NF9mcm1fbWF4X2h0ID0gZGlzcGxheUhlaWdodDsKKworICAgICAgICBzX2luaXRfaXAuaTRfbGV2ZWwgPSBpNF9sZXZlbDsKKyAgICAgICAgc19pbml0X2lwLnU0X251bV9yZW9yZGVyX2ZyYW1lcyA9IHU0X251bV9yZW9yZGVyX2ZyYW1lczsKKyAgICAgICAgc19pbml0X2lwLnU0X251bV9yZWZfZnJhbWVzID0gdTRfbnVtX3JlZl9mcmFtZXM7CisgICAgICAgIHNfaW5pdF9pcC51NF9zaGFyZV9kaXNwX2J1ZiA9IHU0X3NoYXJlX2Rpc3BfYnVmOworICAgICAgICBzX2luaXRfaXAudTRfbnVtX2V4dHJhX2Rpc3BfYnVmID0gMDsKKworICAgICAgICBzX2luaXRfb3Auc19pdmRfaW5pdF9vcF90LnU0X3NpemUgPSBzaXplb2Yoc19pbml0X29wKTsKKworICAgICAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LnU0X251bV9tZW1fcmVjID0gbU51bU1lbVJlY29yZHM7CisgICAgICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QuZV9vdXRwdXRfZm9ybWF0ID0gbUl2Q29sb3JGb3JtYXQ7CisKKyAgICAgICAgbUNvZGVjQ3R4ID0gKGl2X29ial90ICopbU1lbVJlY29yZHNbMF0ucHZfYmFzZTsKKyAgICAgICAgbUNvZGVjQ3R4LT5wdl9meG5zID0gZGVjX2Z4bnM7CisgICAgICAgIG1Db2RlY0N0eC0+dTRfc2l6ZSA9IHNpemVvZihpdl9vYmpfdCk7CisKKyAgICAgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19pbml0X2lwLCAodm9pZCAqKSZzX2luaXRfb3ApOworICAgICAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFcnJvciBpbiBpbml0OiAweCV4IiwKKyAgICAgICAgICAgICAgICAgICAgc19pbml0X29wLnNfaXZkX2luaXRfb3BfdC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgLyogUmVzZXQgdGhlIHBsdWdpbiBzdGF0ZSAqLworICAgIHJlc2V0UGx1Z2luKCk7CisKKyAgICAvKiBTZXQgdGhlIHJ1biB0aW1lIChkeW5hbWljKSBwYXJhbWV0ZXJzICovCisgICAgc2V0UGFyYW1zKGRpc3BsYXlTdHJpZGUpOworCisgICAgLyogU2V0IG51bWJlciBvZiBjb3Jlcy90aHJlYWRzIHRvIGJlIHVzZWQgYnkgdGhlIGNvZGVjICovCisgICAgc2V0TnVtQ29yZXMoKTsKKworICAgIC8qIEdldCBjb2RlYyB2ZXJzaW9uICovCisgICAgbG9nVmVyc2lvbigpOworCisgICAgLyogQWxsb2NhdGUgaW50ZXJuYWwgcGljdHVyZSBidWZmZXIgKi8KKyAgICB1aW50MzJfdCBidWZmZXJTaXplID0gZGlzcGxheVNpemVZICogMyAvIDI7CisgICAgbUZsdXNoT3V0QnVmZmVyID0gKHVpbnQ4X3QgKilpdmRfYWxpZ25lZF9tYWxsb2MoMTI4LCBidWZmZXJTaXplKTsKKyAgICBpZiAoTlVMTCA9PSBtRmx1c2hPdXRCdWZmZXIpIHsKKyAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBhbGxvY2F0ZSBmbHVzaE91dHB1dEJ1ZmZlciBvZiBzaXplICV6dSIsIGJ1ZmZlclNpemUpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIG1Jbml0TmVlZGVkID0gZmFsc2U7CisgICAgbUZsdXNoTmVlZGVkID0gZmFsc2U7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTb2Z0QVZDOjpkZUluaXREZWNvZGVyKCkgeworICAgIHNpemVfdCBpOworCisgICAgaWYgKG1NZW1SZWNvcmRzKSB7CisgICAgICAgIGl2X21lbV9yZWNfdCAqcHNfbWVtX3JlYzsKKworICAgICAgICBwc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtTnVtTWVtUmVjb3JkczsgaSsrKSB7CisgICAgICAgICAgICBpZiAocHNfbWVtX3JlYy0+cHZfYmFzZSkgeworICAgICAgICAgICAgICAgIGl2ZF9hbGlnbmVkX2ZyZWUocHNfbWVtX3JlYy0+cHZfYmFzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwc19tZW1fcmVjKys7CisgICAgICAgIH0KKyAgICAgICAgaXZkX2FsaWduZWRfZnJlZShtTWVtUmVjb3Jkcyk7CisgICAgICAgIG1NZW1SZWNvcmRzID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobUZsdXNoT3V0QnVmZmVyKSB7CisgICAgICAgIGl2ZF9hbGlnbmVkX2ZyZWUobUZsdXNoT3V0QnVmZmVyKTsKKyAgICAgICAgbUZsdXNoT3V0QnVmZmVyID0gTlVMTDsKKyAgICB9CisKKyAgICBtSW5pdE5lZWRlZCA9IHRydWU7CisgICAgbUNoYW5naW5nUmVzb2x1dGlvbiA9IGZhbHNlOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTb2Z0QVZDOjpyZUluaXREZWNvZGVyKCkgeworICAgIHN0YXR1c190IHJldDsKKworICAgIGRlSW5pdERlY29kZXIoKTsKKworICAgIHJldCA9IGluaXREZWNvZGVyKCk7CisgICAgaWYgKE9LICE9IHJldCkgeworICAgICAgICBBTE9HRSgiQ3JlYXRlIGZhaWx1cmUiKTsKKyAgICAgICAgZGVJbml0RGVjb2RlcigpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgU29mdEFWQzo6b25SZXNldCgpIHsKKyAgICBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpvblJlc2V0KCk7CisKKyAgICByZXNldERlY29kZXIoKTsKKyAgICByZXNldFBsdWdpbigpOworfQorCitPTVhfRVJST1JUWVBFIFNvZnRBVkM6OmludGVybmFsU2V0UGFyYW1ldGVyKE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKSB7CisgICAgY29uc3QgdWludDMyX3Qgb2xkV2lkdGggPSBtV2lkdGg7CisgICAgY29uc3QgdWludDMyX3Qgb2xkSGVpZ2h0ID0gbUhlaWdodDsKKyAgICBPTVhfRVJST1JUWVBFIHJldCA9IFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OmludGVybmFsU2V0UGFyYW1ldGVyKGluZGV4LCBwYXJhbXMpOworICAgIGlmIChtV2lkdGggIT0gb2xkV2lkdGggfHwgbUhlaWdodCAhPSBvbGRIZWlnaHQpIHsKKyAgICAgICAgcmVJbml0RGVjb2RlcigpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIFNvZnRBVkM6OnNldERlY29kZUFyZ3MoCisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCAqcHNfZGVjX2lwLAorICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3QgKnBzX2RlY19vcCwKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyLAorICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyLAorICAgICAgICBzaXplX3QgdGltZVN0YW1wSXgpIHsKKyAgICBzaXplX3Qgc2l6ZVkgPSBvdXRwdXRCdWZmZXJXaWR0aCgpICogb3V0cHV0QnVmZmVySGVpZ2h0KCk7CisgICAgc2l6ZV90IHNpemVVVjsKKyAgICB1aW50OF90ICpwQnVmOworCisgICAgcHNfZGVjX2lwLT51NF9zaXplID0gc2l6ZW9mKGl2ZF92aWRlb19kZWNvZGVfaXBfdCk7CisgICAgcHNfZGVjX29wLT51NF9zaXplID0gc2l6ZW9mKGl2ZF92aWRlb19kZWNvZGVfb3BfdCk7CisKKyAgICBwc19kZWNfaXAtPmVfY21kID0gSVZEX0NNRF9WSURFT19ERUNPREU7CisKKyAgICAvKiBXaGVuIGluIGZsdXNoIGFuZCBhZnRlciBFT1Mgd2l0aCB6ZXJvIGJ5dGUgaW5wdXQsCisgICAgICogaW5IZWFkZXIgaXMgc2V0IHRvIHplcm8uIEhlbmNlIGNoZWNrIGZvciBub24tbnVsbCAqLworICAgIGlmIChpbkhlYWRlcikgeworICAgICAgICBwc19kZWNfaXAtPnU0X3RzID0gdGltZVN0YW1wSXg7CisgICAgICAgIHBzX2RlY19pcC0+cHZfc3RyZWFtX2J1ZmZlciA9CisgICAgICAgICAgICBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0OworICAgICAgICBwc19kZWNfaXAtPnU0X251bV9CeXRlcyA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOworICAgIH0gZWxzZSB7CisgICAgICAgIHBzX2RlY19pcC0+dTRfdHMgPSAwOworICAgICAgICBwc19kZWNfaXAtPnB2X3N0cmVhbV9idWZmZXIgPSBOVUxMOworICAgICAgICBwc19kZWNfaXAtPnU0X251bV9CeXRlcyA9IDA7CisgICAgfQorCisgICAgaWYgKG91dEhlYWRlcikgeworICAgICAgICBwQnVmID0gb3V0SGVhZGVyLT5wQnVmZmVyOworICAgIH0gZWxzZSB7CisgICAgICAgIHBCdWYgPSBtRmx1c2hPdXRCdWZmZXI7CisgICAgfQorCisgICAgc2l6ZVVWID0gc2l6ZVkgLyA0OworICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMF0gPSBzaXplWTsKKyAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzFdID0gc2l6ZVVWOworICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMl0gPSBzaXplVVY7CisKKyAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1swXSA9IHBCdWY7CisgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMV0gPSBwQnVmICsgc2l6ZVk7CisgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMl0gPSBwQnVmICsgc2l6ZVkgKyBzaXplVVY7CisgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIudTRfbnVtX2J1ZnMgPSAzOworICAgIHJldHVybjsKK30KK3ZvaWQgU29mdEFWQzo6b25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKKyAgICAvKiBPbmNlIHRoZSBvdXRwdXQgYnVmZmVycyBhcmUgZmx1c2hlZCwgaWdub3JlIGFueSBidWZmZXJzIHRoYXQgYXJlIGhlbGQgaW4gZGVjb2RlciAqLworICAgIGlmIChrT3V0cHV0UG9ydEluZGV4ID09IHBvcnRJbmRleCkgeworICAgICAgICBzZXRGbHVzaE1vZGUoKTsKKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjX2lwOworICAgICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjX29wOworICAgICAgICAgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzOworICAgICAgICAgICAgc2l6ZV90IHNpemVZLCBzaXplVVY7CisKKyAgICAgICAgICAgIHNldERlY29kZUFyZ3MoJnNfZGVjX2lwLCAmc19kZWNfb3AsIE5VTEwsIE5VTEwsIDApOworCisgICAgICAgICAgICBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSZzX2RlY19pcCwgKHZvaWQgKikmc19kZWNfb3ApOworICAgICAgICAgICAgaWYgKDAgPT0gc19kZWNfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgICAgICByZXNldFBsdWdpbigpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFNvZnRBVkM6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKKyAgICBVTlVTRUQocG9ydEluZGV4KTsKKworICAgIGlmIChtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlICE9IE5PTkUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmaW5RdWV1ZSA9IGdldFBvcnRRdWV1ZShrSW5wdXRQb3J0SW5kZXgpOworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoa091dHB1dFBvcnRJbmRleCk7CisKKyAgICAvKiBJZiBpbnB1dCBFT1MgaXMgc2VlbiBhbmQgZGVjb2RlciBpcyBub3QgaW4gZmx1c2ggbW9kZSwKKyAgICAgKiBzZXQgdGhlIGRlY29kZXIgaW4gZmx1c2ggbW9kZS4KKyAgICAgKiBUaGVyZSBjYW4gYmUgYSBjYXNlIHdoZXJlIEVPUyBpcyBzZW50IGFsb25nIHdpdGggbGFzdCBwaWN0dXJlIGRhdGEKKyAgICAgKiBJbiB0aGF0IGNhc2UsIG9ubHkgYWZ0ZXIgZGVjb2RpbmcgdGhhdCBpbnB1dCBkYXRhLCBkZWNvZGVyIGhhcyB0byBiZQorICAgICAqIHB1dCBpbiBmbHVzaC4gVGhpcyBjYXNlIGlzIGhhbmRsZWQgaGVyZSAgKi8KKworICAgIGlmIChtUmVjZWl2ZWRFT1MgJiYgIW1Jc0luRmx1c2gpIHsKKyAgICAgICAgc2V0Rmx1c2hNb2RlKCk7CisgICAgfQorCisgICAgd2hpbGUgKCFvdXRRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgIEJ1ZmZlckluZm8gKmluSW5mbzsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyOworCisgICAgICAgIEJ1ZmZlckluZm8gKm91dEluZm87CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXI7CisgICAgICAgIHNpemVfdCB0aW1lU3RhbXBJeDsKKworICAgICAgICBpbkluZm8gPSBOVUxMOworICAgICAgICBpbkhlYWRlciA9IE5VTEw7CisKKyAgICAgICAgaWYgKCFtSXNJbkZsdXNoKSB7CisgICAgICAgICAgICBpZiAoIWluUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGluSW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOworICAgICAgICBvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOworICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IDA7CisgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IDA7CisgICAgICAgIG91dEhlYWRlci0+bk9mZnNldCA9IDA7CisKKyAgICAgICAgaWYgKGluSGVhZGVyICE9IE5VTEwgJiYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpKSB7CisgICAgICAgICAgICBtUmVjZWl2ZWRFT1MgPSB0cnVlOworICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuID09IDApIHsKKyAgICAgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKyAgICAgICAgICAgICAgICBpbkhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgc2V0Rmx1c2hNb2RlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBXaGVuIHRoZXJlIGlzIGFuIGluaXQgcmVxdWlyZWQgYW5kIHRoZSBkZWNvZGVyIGlzIG5vdCBpbiBmbHVzaCBtb2RlLAorICAgICAgICAvLyB1cGRhdGUgb3V0cHV0IHBvcnQncyBkZWZpbml0aW9uIGFuZCByZWluaXRpYWxpemUgZGVjb2Rlci4KKyAgICAgICAgaWYgKG1Jbml0TmVlZGVkICYmICFtSXNJbkZsdXNoKSB7CisgICAgICAgICAgICBib29sIHBvcnRXaWxsUmVzZXQgPSBmYWxzZTsKKyAgICAgICAgICAgIGhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZSgmcG9ydFdpbGxSZXNldCwgbU5ld1dpZHRoLCBtTmV3SGVpZ2h0KTsKKworICAgICAgICAgICAgQ0hFQ0tfRVEocmVJbml0RGVjb2RlcigpLCAoc3RhdHVzX3QpT0spOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLyogR2V0IGEgZnJlZSBzbG90IGluIHRpbWVzdGFtcCBhcnJheSB0byBob2xkIGlucHV0IHRpbWVzdGFtcCAqLworICAgICAgICB7CisgICAgICAgICAgICBzaXplX3QgaTsKKyAgICAgICAgICAgIHRpbWVTdGFtcEl4ID0gMDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfVElNRV9TVEFNUFM7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICghbVRpbWVTdGFtcHNWYWxpZFtpXSkgeworICAgICAgICAgICAgICAgICAgICB0aW1lU3RhbXBJeCA9IGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbkhlYWRlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbVRpbWVTdGFtcHNWYWxpZFt0aW1lU3RhbXBJeF0gPSB0cnVlOworICAgICAgICAgICAgICAgIG1UaW1lU3RhbXBzW3RpbWVTdGFtcEl4XSA9IGluSGVhZGVyLT5uVGltZVN0YW1wOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjX2lwOworICAgICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjX29wOworICAgICAgICAgICAgV09SRDMyIHRpbWVEZWxheSwgdGltZVRha2VuOworICAgICAgICAgICAgc2l6ZV90IHNpemVZLCBzaXplVVY7CisKKyAgICAgICAgICAgIHNldERlY29kZUFyZ3MoJnNfZGVjX2lwLCAmc19kZWNfb3AsIGluSGVhZGVyLCBvdXRIZWFkZXIsIHRpbWVTdGFtcEl4KTsKKyAgICAgICAgICAgIC8vIElmIGlucHV0IGR1bXAgaXMgZW5hYmxlZCwgdGhlbiB3cml0ZSB0byBmaWxlCisgICAgICAgICAgICBEVU1QX1RPX0ZJTEUobUluRmlsZSwgc19kZWNfaXAucHZfc3RyZWFtX2J1ZmZlciwgc19kZWNfaXAudTRfbnVtX0J5dGVzKTsKKworICAgICAgICAgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgTlVMTCk7CisgICAgICAgICAgICAvKiBDb21wdXRlIHRpbWUgZWxhcHNlZCBiZXR3ZWVuIGVuZCBvZiBwcmV2aW91cyBkZWNvZGUoKQorICAgICAgICAgICAgICogdG8gc3RhcnQgb2YgY3VycmVudCBkZWNvZGUoKSAqLworICAgICAgICAgICAgVElNRV9ESUZGKG1UaW1lRW5kLCBtVGltZVN0YXJ0LCB0aW1lRGVsYXkpOworCisgICAgICAgICAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXM7CisgICAgICAgICAgICBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSZzX2RlY19pcCwgKHZvaWQgKikmc19kZWNfb3ApOworCisgICAgICAgICAgICBib29sIHVuc3VwcG9ydGVkRGltZW5zaW9ucyA9CisgICAgICAgICAgICAgICAgKElWRF9TVFJFQU1fV0lEVEhfSEVJR0hUX05PVF9TVVBQT1JURUQgPT0gKHNfZGVjX29wLnU0X2Vycm9yX2NvZGUgJiAweEZGKSk7CisgICAgICAgICAgICBib29sIHJlc0NoYW5nZWQgPSAoSVZEX1JFU19DSEFOR0VEID09IChzX2RlY19vcC51NF9lcnJvcl9jb2RlICYgMHhGRikpOworCisgICAgICAgICAgICBHRVRUSU1FKCZtVGltZUVuZCwgTlVMTCk7CisgICAgICAgICAgICAvKiBDb21wdXRlIHRpbWUgdGFrZW4gZm9yIGRlY29kZSgpICovCisgICAgICAgICAgICBUSU1FX0RJRkYobVRpbWVTdGFydCwgbVRpbWVFbmQsIHRpbWVUYWtlbik7CisKKyAgICAgICAgICAgIFBSSU5UX1RJTUUoInRpbWVUYWtlbj0lNmQgZGVsYXk9JTZkIG51bUJ5dGVzPSU2ZCIsIHRpbWVUYWtlbiwgdGltZURlbGF5LAorICAgICAgICAgICAgICAgICAgIHNfZGVjX29wLnU0X251bV9ieXRlc19jb25zdW1lZCk7CisgICAgICAgICAgICBpZiAoc19kZWNfb3AudTRfZnJhbWVfZGVjb2RlZF9mbGFnICYmICFtRmx1c2hOZWVkZWQpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hOZWVkZWQgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKGluSGVhZGVyICE9IE5VTEwpICYmICgxICE9IHNfZGVjX29wLnU0X2ZyYW1lX2RlY29kZWRfZmxhZykpIHsKKyAgICAgICAgICAgICAgICAvKiBJZiB0aGUgaW5wdXQgZGlkIG5vdCBjb250YWluIHBpY3R1cmUgZGF0YSwgdGhlbiBpZ25vcmUKKyAgICAgICAgICAgICAgICAgKiB0aGUgYXNzb2NpYXRlZCB0aW1lc3RhbXAgKi8KKyAgICAgICAgICAgICAgICBtVGltZVN0YW1wc1ZhbGlkW3RpbWVTdGFtcEl4XSA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBoYW5kbGUgQ1RTIERlY29kZXJUZXN0IHRlc3RDb2RlY1Jlc2V0c0gyNjRXaXRob3V0U3VyZmFjZSwKKyAgICAgICAgICAgIC8vIHdoaWNoIGlzIG5vdCBzZW5kaW5nIFNQUy9QUFMgYWZ0ZXIgcG9ydCByZWNvbmZpZ3VyYXRpb24gYW5kIGZsdXNoIHRvIHRoZSBjb2RlYy4KKyAgICAgICAgICAgIGlmICh1bnN1cHBvcnRlZERpbWVuc2lvbnMgJiYgIW1GbHVzaE5lZWRlZCkgeworICAgICAgICAgICAgICAgIGJvb2wgcG9ydFdpbGxSZXNldCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZSgmcG9ydFdpbGxSZXNldCwgc19kZWNfb3AudTRfcGljX3dkLCBzX2RlY19vcC51NF9waWNfaHQpOworCisgICAgICAgICAgICAgICAgQ0hFQ0tfRVEocmVJbml0RGVjb2RlcigpLCAoc3RhdHVzX3QpT0spOworCisgICAgICAgICAgICAgICAgc2V0RGVjb2RlQXJncygmc19kZWNfaXAsICZzX2RlY19vcCwgaW5IZWFkZXIsIG91dEhlYWRlciwgdGltZVN0YW1wSXgpOworCisgICAgICAgICAgICAgICAgaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19kZWNfaXAsICh2b2lkICopJnNfZGVjX29wKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElmIHRoZSBkZWNvZGVyIGlzIGluIHRoZSBjaGFuZ2luZyByZXNvbHV0aW9uIG1vZGUgYW5kIHRoZXJlIGlzIG5vIG91dHB1dCBwcmVzZW50LAorICAgICAgICAgICAgLy8gdGhhdCBtZWFucyB0aGUgc3dpdGNoaW5nIGlzIGRvbmUgYW5kIGl0J3MgcmVhZHkgdG8gcmVzZXQgdGhlIGRlY29kZXIgYW5kIHRoZSBwbHVnaW4uCisgICAgICAgICAgICBpZiAobUNoYW5naW5nUmVzb2x1dGlvbiAmJiAhc19kZWNfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgICAgICBtQ2hhbmdpbmdSZXNvbHV0aW9uID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmVzZXREZWNvZGVyKCk7CisgICAgICAgICAgICAgICAgcmVzZXRQbHVnaW4oKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHVuc3VwcG9ydGVkRGltZW5zaW9ucyB8fCByZXNDaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgbUNoYW5naW5nUmVzb2x1dGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKG1GbHVzaE5lZWRlZCkgeworICAgICAgICAgICAgICAgICAgICBzZXRGbHVzaE1vZGUoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodW5zdXBwb3J0ZWREaW1lbnNpb25zKSB7CisgICAgICAgICAgICAgICAgICAgIG1OZXdXaWR0aCA9IHNfZGVjX29wLnU0X3BpY193ZDsKKyAgICAgICAgICAgICAgICAgICAgbU5ld0hlaWdodCA9IHNfZGVjX29wLnU0X3BpY19odDsKKyAgICAgICAgICAgICAgICAgICAgbUluaXROZWVkZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCgwIDwgc19kZWNfb3AudTRfcGljX3dkKSAmJiAoMCA8IHNfZGVjX29wLnU0X3BpY19odCkpIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCA9IHNfZGVjX29wLnU0X3BpY193ZDsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQgPSBzX2RlY19vcC51NF9waWNfaHQ7CisgICAgICAgICAgICAgICAgYm9vbCBwb3J0V2lsbFJlc2V0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaGFuZGxlUG9ydFNldHRpbmdzQ2hhbmdlKCZwb3J0V2lsbFJlc2V0LCB3aWR0aCwgaGVpZ2h0KTsKKworICAgICAgICAgICAgICAgIGlmIChwb3J0V2lsbFJlc2V0KSB7CisgICAgICAgICAgICAgICAgICAgIHJlc2V0RGVjb2RlcigpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc19kZWNfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAobVdpZHRoICogbUhlaWdodCAqIDMpIC8gMjsKKworICAgICAgICAgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IG1UaW1lU3RhbXBzW3NfZGVjX29wLnU0X3RzXTsKKyAgICAgICAgICAgICAgICBtVGltZVN0YW1wc1ZhbGlkW3NfZGVjX29wLnU0X3RzXSA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgICAgIG91dEluZm8gPSBOVUxMOworICAgICAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisgICAgICAgICAgICAgICAgb3V0SGVhZGVyID0gTlVMTDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogSWYgaW4gZmx1c2ggbW9kZSBhbmQgbm8gb3V0cHV0IGlzIHJldHVybmVkIGJ5IHRoZSBjb2RlYywKKyAgICAgICAgICAgICAgICAgKiB0aGVuIGNvbWUgb3V0IG9mIGZsdXNoIG1vZGUgKi8KKyAgICAgICAgICAgICAgICBtSXNJbkZsdXNoID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICAvKiBJZiBFT1Mgd2FzIHJlY2lldmVkIG9uIGlucHV0IHBvcnQgYW5kIHRoZXJlIGlzIG5vIG91dHB1dAorICAgICAgICAgICAgICAgICAqIGZyb20gdGhlIGNvZGVjLCB0aGVuIHNpZ25hbCBFT1Mgb24gb3V0cHV0IHBvcnQgKi8KKyAgICAgICAgICAgICAgICBpZiAobVJlY2VpdmVkRU9TKSB7CisgICAgICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKworICAgICAgICAgICAgICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgICAgICAgICBvdXRJbmZvID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0SGVhZGVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgcmVzZXRQbHVnaW4oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW5IZWFkZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICBpbkluZm8gPSBOVUxMOworICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKyAgICAgICAgICAgIGluSGVhZGVyID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworYW5kcm9pZDo6U29mdE9NWENvbXBvbmVudCAqY3JlYXRlU29mdE9NWENvbXBvbmVudCgKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLCBPTVhfUFRSIGFwcERhdGEsCisgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KSB7CisgICAgcmV0dXJuIG5ldyBhbmRyb2lkOjpTb2Z0QVZDKG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9Tb2Z0QVZDRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkxYTcxZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5oCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNPRlRfSDI2NF9ERUNfSF8KKworI2RlZmluZSBTT0ZUX0gyNjRfREVDX0hfCisKKyNpbmNsdWRlICJTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjZGVmaW5lIGl2ZF9hbGlnbmVkX21hbGxvYyhhbGlnbm1lbnQsIHNpemUpIG1lbWFsaWduKGFsaWdubWVudCwgc2l6ZSkKKyNkZWZpbmUgaXZkX2FsaWduZWRfZnJlZShidWYpIGZyZWUoYnVmKQorCisvKiogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHRpbWUtc3RhbXAgYXJyYXkgKi8KKyNkZWZpbmUgTUFYX1RJTUVfU1RBTVBTIDY0CisKKy8qKiBNYXhpbXVtIG51bWJlciBvZiBjb3JlcyBzdXBwb3J0ZWQgYnkgdGhlIGNvZGVjICovCisjZGVmaW5lIENPREVDX01BWF9OVU1fQ09SRVMgNAorCisjZGVmaW5lIENPREVDX01BWF9XSURUSCAgICAgMTkyMAorCisjZGVmaW5lIENPREVDX01BWF9IRUlHSFQgICAgMTA4OAorCisvKiogSW5wdXQgYnVmZmVyIHNpemUgKi8KKyNkZWZpbmUgSU5QVVRfQlVGX1NJWkUgKDEwMjQgKiAxMDI0KQorCisjZGVmaW5lIE1JTihhLCBiKSAoKGEpIDwgKGIpKSA/IChhKSA6IChiKQorCisvKiogVXNlZCB0byByZW1vdmUgd2FybmluZ3MgYWJvdXQgdW51c2VkIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgVU5VU0VEKHgpICgodm9pZCkoeCkpCisKKy8qKiBHZXQgdGltZSAqLworI2RlZmluZSBHRVRUSU1FKGEsIGIpIGdldHRpbWVvZmRheShhLCBiKTsKKworLyoqIENvbXB1dGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmQgKi8KKyNkZWZpbmUgVElNRV9ESUZGKHN0YXJ0LCBlbmQsIGRpZmYpIFwKKyAgICBkaWZmID0gKChlbmQudHZfc2VjIC0gc3RhcnQudHZfc2VjKSAqIDEwMDAwMDApICsgXAorICAgICAgICAgICAgKGVuZC50dl91c2VjIC0gc3RhcnQudHZfdXNlYyk7CisKK3N0cnVjdCBTb2Z0QVZDIDogcHVibGljIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQgeworICAgIFNvZnRBVkMoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICAgICAgT01YX1BUUiBhcHBEYXRhLCBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5Tb2Z0QVZDKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCk7CisgICAgdmlydHVhbCB2b2lkIG9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKKyAgICB2aXJ0dWFsIHZvaWQgb25SZXNldCgpOworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldFBhcmFtZXRlcihPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcyk7Citwcml2YXRlOgorICAgIC8vIE51bWJlciBvZiBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMKKyAgICBlbnVtIHsKKyAgICAgICAga051bUJ1ZmZlcnMgPSA4CisgICAgfTsKKworICAgIGl2X29ial90ICptQ29kZWNDdHg7ICAgICAgICAgLy8gQ29kZWMgY29udGV4dAorICAgIGl2X21lbV9yZWNfdCAqbU1lbVJlY29yZHM7ICAgLy8gTWVtb3J5IHJlY29yZHMgcmVxdWVzdGVkIGJ5IHRoZSBjb2RlYworICAgIHNpemVfdCBtTnVtTWVtUmVjb3JkczsgICAgICAgLy8gTnVtYmVyIG9mIG1lbW9yeSByZWNvcmRzIHJlcXVlc3RlZCBieSB0aGUgY29kZWMKKworICAgIHNpemVfdCBtTnVtQ29yZXM7ICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGNvcmVzIHRvIGJlIHVlc2QgYnkgdGhlIGNvZGVjCisKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZVN0YXJ0OyAgIC8vIFRpbWUgYXQgdGhlIHN0YXJ0IG9mIGRlY29kZSgpCisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVFbmQ7ICAgICAvLyBUaW1lIGF0IHRoZSBlbmQgb2YgZGVjb2RlKCkKKworICAgIC8vIEludGVybmFsIGJ1ZmZlciB0byBiZSB1c2VkIHRvIGZsdXNoIG91dCB0aGUgYnVmZmVycyBmcm9tIGRlY29kZXIKKyAgICB1aW50OF90ICptRmx1c2hPdXRCdWZmZXI7CisKKyAgICAvLyBTdGF0dXMgb2YgZW50cmllcyBpbiB0aGUgdGltZXN0YW1wIGFycmF5CisgICAgYm9vbCBtVGltZVN0YW1wc1ZhbGlkW01BWF9USU1FX1NUQU1QU107CisKKyAgICAvLyBUaW1lc3RhbXAgYXJyYXkgLSBTaW5jZSBjb2RlYyBkb2VzIG5vdCB0YWtlIDY0IGJpdCB0aW1lc3RhbXBzLAorICAgIC8vIHRoZXkgYXJlIG1haW50YWluZWQgaW4gdGhlIHBsdWdpbgorICAgIE9NWF9TNjQgbVRpbWVTdGFtcHNbTUFYX1RJTUVfU1RBTVBTXTsKKworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKyAgICBjaGFyIG1JbkZpbGVbMjAwXTsKKyNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisKKyAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBtT214Q29sb3JGb3JtYXQ7ICAgIC8vIE9NWCBDb2xvciBmb3JtYXQKKyAgICBJVl9DT0xPUl9GT1JNQVRfVCBtSXZDb2xvckZvcm1hdDsgICAgICAgIC8vIEl0dGlhbSBDb2xvciBmb3JtYXQKKworICAgIGJvb2wgbUlzSW5GbHVzaDsgICAgICAgIC8vIGNvZGVjIGlzIGZsdXNoIG1vZGUKKyAgICBib29sIG1SZWNlaXZlZEVPUzsgICAgICAvLyBFT1MgaXMgcmVjZWlldmVkIG9uIGlucHV0IHBvcnQKKyAgICBib29sIG1Jbml0TmVlZGVkOworICAgIHVpbnQzMl90IG1OZXdXaWR0aDsKKyAgICB1aW50MzJfdCBtTmV3SGVpZ2h0OworICAgIC8vIFRoZSBpbnB1dCBzdHJlYW0gaGFzIGNoYW5nZWQgdG8gYSBkaWZmZXJlbnQgcmVzb2x1dGlvbiwgd2hpY2ggaXMgc3RpbGwgc3VwcG9ydGVkIGJ5IHRoZQorICAgIC8vIGNvZGVjLiBTbyB0aGUgY29kZWMgaXMgc3dpdGNoaW5nIHRvIGRlY29kZSB0aGUgbmV3IHJlc29sdXRpb24uCisgICAgYm9vbCBtQ2hhbmdpbmdSZXNvbHV0aW9uOworICAgIGJvb2wgbUZsdXNoTmVlZGVkOworCisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKyAgICBzdGF0dXNfdCBkZUluaXREZWNvZGVyKCk7CisgICAgc3RhdHVzX3Qgc2V0Rmx1c2hNb2RlKCk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1zKHNpemVfdCBzdHJpZGUpOworICAgIHZvaWQgbG9nVmVyc2lvbigpOworICAgIHN0YXR1c190IHNldE51bUNvcmVzKCk7CisgICAgc3RhdHVzX3QgcmVzZXREZWNvZGVyKCk7CisgICAgc3RhdHVzX3QgcmVzZXRQbHVnaW4oKTsKKyAgICBzdGF0dXNfdCByZUluaXREZWNvZGVyKCk7CisKKyAgICB2b2lkIHNldERlY29kZUFyZ3MoCisgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3QgKnBzX2RlY19pcCwKKyAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjX29wLAorICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyLAorICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciwKKyAgICAgICAgICAgIHNpemVfdCB0aW1lU3RhbXBJeCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTb2Z0QVZDKTsKK307CisKKyNpZmRlZiBGSUxFX0RVTVBfRU5BQkxFCisKKyNkZWZpbmUgSU5QVVRfRFVNUF9QQVRIICAgICAiL3NkY2FyZC9tZWRpYS9hdmNkX2lucHV0IgorI2RlZmluZSBJTlBVVF9EVU1QX0VYVCAgICAgICJoMjY0IgorCisjZGVmaW5lIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0cmNweShtSW5GaWxlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3ByaW50ZihtSW5GaWxlLCAiJXNfJWxkLiVsZC4lcyIsIElOUFVUX0RVTVBfUEFUSCwgIFwKKyAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfc2VjLCBtVGltZVN0YXJ0LnR2X3VzZWMsICAgICAgXAorICAgICAgICAgICAgSU5QVVRfRFVNUF9FWFQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKSB7ICAgICAgICAgICAgICAgICAgXAorICAgIEZJTEUgKmZwID0gZm9wZW4obV9maWxlbmFtZSwgIndiIik7ICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZwICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZmNsb3NlKGZwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFMT0dEKCJDb3VsZCBub3Qgb3BlbiBmaWxlICVzIiwgbV9maWxlbmFtZSk7ICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2RlZmluZSBEVU1QX1RPX0ZJTEUobV9maWxlbmFtZSwgbV9idWYsIG1fc2l6ZSkgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGSUxFICpmcCA9IGZvcGVuKG1fZmlsZW5hbWUsICJhYiIpOyAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmcCAhPSBOVUxMICYmIG1fYnVmICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaSA9IGZ3cml0ZShtX2J1ZiwgMSwgbV9zaXplLCBmcCk7ICAgICAgICAgICAgICAgXAorICAgICAgICBBTE9HRCgiZndyaXRlIHJldCAlZCB0byB3cml0ZSAlZCIsIGksIG1fc2l6ZSk7ICBcCisgICAgICAgIGlmIChpICE9IChpbnQpIG1fc2l6ZSkgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dEKCJFcnJvciBpbiBmd3JpdGUsIHJldHVybmVkICVkIiwgaSk7ICAgXAorICAgICAgICAgICAgcGVycm9yKCJFcnJvciBpbiB3cml0ZSB0byBmaWxlIik7ICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZmNsb3NlKGZwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFMT0dEKCJDb3VsZCBub3Qgd3JpdGUgdG8gZmlsZSAlcyIsIG1fZmlsZW5hbWUpO1wKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2Vsc2UgLyogRklMRV9EVU1QX0VOQUJMRSAqLworI2RlZmluZSBJTlBVVF9EVU1QX1BBVEgKKyNkZWZpbmUgSU5QVVRfRFVNUF9FWFQKKyNkZWZpbmUgT1VUUFVUX0RVTVBfUEFUSAorI2RlZmluZSBPVVRQVVRfRFVNUF9FWFQKKyNkZWZpbmUgR0VORVJBVEVfRklMRV9OQU1FUygpCisjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkKKyNkZWZpbmUgRFVNUF9UT19GSUxFKG1fZmlsZW5hbWUsIG1fYnVmLCBtX3NpemUpCisjZW5kaWYgLyogRklMRV9EVU1QX0VOQUJMRSAqLworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gU09GVF9IMjY0X0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YTRkYjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMCBAQAorI2lmZXEgKCQoaWYgJCh3aWxkY2FyZCBleHRlcm5hbC9saWJoMjY0KSwxLDApLDEpCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgICAgICAgICAgICA6PSBsaWJzdGFnZWZyaWdodF9zb2Z0X2F2Y2VuYworTE9DQUxfTU9EVUxFX1RBR1MgICAgICAgOj0gb3B0aW9uYWwKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyAgOj0gbGliYXZjZW5jCitMT0NBTF9TUkNfRklMRVMgICAgICAgICA6PSBTb2Z0QVZDRW5jLmNwcAorCitMT0NBTF9DX0lOQ0xVREVTIDo9ICQoVE9QKS9leHRlcm5hbC9saWJhdmMvZW5jb2RlcgorTE9DQUxfQ19JTkNMVURFUyArPSAkKFRPUCkvZXh0ZXJuYWwvbGliYXZjL2NvbW1vbgorTE9DQUxfQ19JTkNMVURFUyArPSAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZQorTE9DQUxfQ19JTkNMVURFUyArPSAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9oYXJkd2FyZQorTE9DQUxfQ19JTkNMVURFUyArPSAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgIDo9IGxpYnN0YWdlZnJpZ2h0CitMT0NBTF9TSEFSRURfTElCUkFSSUVTICArPSBsaWJzdGFnZWZyaWdodF9vbXgKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgICs9IGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24KK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgICs9IGxpYnV0aWxzCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICArPSBsaWJsb2cKKworTE9DQUxfTERGTEFHUyA6PSAtV2wsLUJzeW1ib2xpYworCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY1ZTM1MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5jcHAKQEAgLTAsMCArMSwxMzM1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlNvZnRBVkNFbmMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgorCisjaW5jbHVkZSAiT01YX1ZpZGVvLmgiCisKKyNpbmNsdWRlIDxIYXJkd2FyZUFQSS5oPgorI2luY2x1ZGUgPE1ldGFkYXRhQnVmZmVyVHlwZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisjaW5jbHVkZSA8dWkvUmVjdC5oPgorCisjaW5jbHVkZSAiaWgyNjRfdHlwZWRlZnMuaCIKKyNpbmNsdWRlICJpdjIuaCIKKyNpbmNsdWRlICJpdmUyLmgiCisjaW5jbHVkZSAiaWgyNjRlLmgiCisjaW5jbHVkZSAiU29mdEFWQ0VuYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyAgICAjZGVmaW5lIGl2ZV9hcGlfZnVuY3Rpb24gaWgyNjRlX2FwaV9mdW5jdGlvbgorCit0ZW1wbGF0ZTxjbGFzcyBUPgorc3RhdGljIHZvaWQgSW5pdE9NWFBhcmFtcyhUICpwYXJhbXMpIHsKKyAgICBwYXJhbXMtPm5TaXplID0gc2l6ZW9mKFQpOworICAgIHBhcmFtcy0+blZlcnNpb24ucy5uVmVyc2lvbk1ham9yID0gMTsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublZlcnNpb25NaW5vciA9IDA7CisgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5SZXZpc2lvbiA9IDA7CisgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5TdGVwID0gMDsKK30KKwordHlwZWRlZiBzdHJ1Y3QgTGV2ZWxDb252ZXJzaW9uIHsKKyAgICBPTVhfVklERU9fQVZDTEVWRUxUWVBFIG9teExldmVsOworICAgIFdPUkQzMiBhdmNMZXZlbDsKK30gTGV2ZWxDb25jZXJzaW9uOworCitzdGF0aWMgTGV2ZWxDb252ZXJzaW9uIENvbnZlcnNpb25UYWJsZVtdID0geworICAgIHsgT01YX1ZJREVPX0FWQ0xldmVsMSwgIDEwIH0sCisgICAgeyBPTVhfVklERU9fQVZDTGV2ZWwxYiwgOSAgfSwKKyAgICB7IE9NWF9WSURFT19BVkNMZXZlbDExLCAxMSB9LAorICAgIHsgT01YX1ZJREVPX0FWQ0xldmVsMTIsIDEyIH0sCisgICAgeyBPTVhfVklERU9fQVZDTGV2ZWwxMywgMTMgfSwKKyAgICB7IE9NWF9WSURFT19BVkNMZXZlbDIsICAyMCB9LAorICAgIHsgT01YX1ZJREVPX0FWQ0xldmVsMjEsIDIxIH0sCisgICAgeyBPTVhfVklERU9fQVZDTGV2ZWwyMiwgMjIgfSwKKyAgICB7IE9NWF9WSURFT19BVkNMZXZlbDMsICAzMCB9LAorICAgIHsgT01YX1ZJREVPX0FWQ0xldmVsMzEsIDMxIH0sCisgICAgeyBPTVhfVklERU9fQVZDTGV2ZWwzMiwgMzIgfSwKKyAgICB7IE9NWF9WSURFT19BVkNMZXZlbDQsICA0MCB9LAorICAgIHsgT01YX1ZJREVPX0FWQ0xldmVsNDEsIDQxIH0sCisgICAgeyBPTVhfVklERU9fQVZDTGV2ZWw0MiwgNDIgfSwKKyAgICB7IE9NWF9WSURFT19BVkNMZXZlbDUsICA1MCB9LAorICAgIHsgT01YX1ZJREVPX0FWQ0xldmVsNTEsIDUxIH0sCit9OworCitzdGF0aWMgY29uc3QgQ29kZWNQcm9maWxlTGV2ZWwga1Byb2ZpbGVMZXZlbHNbXSA9IHsKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDEgIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwxYiB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMTEgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDEyIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwxMyB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMiAgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDIxIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwyMiB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMyAgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDMxIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwzMiB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsNCAgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDQxIH0sCit9OworCisKK3N0YXRpYyBzaXplX3QgR2V0Q1BVQ29yZUNvdW50KCkgeworICAgIGxvbmcgY3B1Q29yZUNvdW50ID0gMTsKKyNpZiBkZWZpbmVkKF9TQ19OUFJPQ0VTU09SU19PTkxOKQorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOworI2Vsc2UKKyAgICAvLyBfU0NfTlBST0NfT05MTiBtdXN0IGJlIGRlZmluZWQuLi4KKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ19PTkxOKTsKKyNlbmRpZgorICAgIENIRUNLKGNwdUNvcmVDb3VudCA+PSAxKTsKKyAgICBBTE9HRCgiTnVtYmVyIG9mIENQVSBjb3JlczogJWxkIiwgY3B1Q29yZUNvdW50KTsKKyAgICByZXR1cm4gKHNpemVfdCljcHVDb3JlQ291bnQ7Cit9CisKK3N0YXRpYyBzdGF0dXNfdCBDb252ZXJ0T214QXZjTGV2ZWxUb0F2Y1NwZWNMZXZlbCgKKyAgICAgICAgT01YX1ZJREVPX0FWQ0xFVkVMVFlQRSBvbXhMZXZlbCwgV09SRDMyICphdmNMZXZlbCkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTkVMRU0oQ29udmVyc2lvblRhYmxlKTsgKytpKSB7CisgICAgICAgIGlmIChvbXhMZXZlbCA9PSBDb252ZXJzaW9uVGFibGVbaV0ub214TGV2ZWwpIHsKKyAgICAgICAgICAgICphdmNMZXZlbCA9IENvbnZlcnNpb25UYWJsZVtpXS5hdmNMZXZlbDsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dFKCJDb252ZXJ0T214QXZjTGV2ZWxUb0F2Y1NwZWNMZXZlbDogJWQgbGV2ZWwgbm90IHN1cHBvcnRlZCIsCisgICAgICAgICAgICAoaW50MzJfdClvbXhMZXZlbCk7CisKKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCitzdGF0aWMgc3RhdHVzX3QgQ29udmVydEF2Y1NwZWNMZXZlbFRvT214QXZjTGV2ZWwoCisgICAgICAgIFdPUkQzMiBhdmNMZXZlbCwgT01YX1ZJREVPX0FWQ0xFVkVMVFlQRSAqb214TGV2ZWwpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE5FTEVNKENvbnZlcnNpb25UYWJsZSk7ICsraSkgeworICAgICAgICBpZiAoYXZjTGV2ZWwgPT0gQ29udmVyc2lvblRhYmxlW2ldLmF2Y0xldmVsKSB7CisgICAgICAgICAgICAqb214TGV2ZWwgPSBDb252ZXJzaW9uVGFibGVbaV0ub214TGV2ZWw7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HRSgiQ29udmVydEF2Y1NwZWNMZXZlbFRvT214QXZjTGV2ZWw6ICVkIGxldmVsIG5vdCBzdXBwb3J0ZWQiLAorICAgICAgICAgICAgKGludDMyX3QpYXZjTGV2ZWwpOworCisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworCitTb2Z0QVZDOjpTb2Z0QVZDKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCisgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpCisgICAgOiBTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50KAorICAgICAgICAgICAgbmFtZSwgInZpZGVvX2VuY29kZXIuYXZjIiwgT01YX1ZJREVPX0NvZGluZ0FWQywKKyAgICAgICAgICAgIGtQcm9maWxlTGV2ZWxzLCBORUxFTShrUHJvZmlsZUxldmVscyksCisgICAgICAgICAgICAxNzYgLyogd2lkdGggKi8sIDE0NCAvKiBoZWlnaHQgKi8sCisgICAgICAgICAgICBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCksCisgICAgICBtSXZWaWRlb0NvbG9yRm9ybWF0KElWX1lVVl80MjBQKSwKKyAgICAgIG1JRFJGcmFtZVJlZnJlc2hJbnRlcnZhbEluU2VjKDEpLAorICAgICAgbUFWQ0VuY1Byb2ZpbGUoSVZfUFJPRklMRV9CQVNFKSwKKyAgICAgIG1BVkNFbmNMZXZlbCgzMSksCisgICAgICBtUHJldlRpbWVzdGFtcFVzKC0xKSwKKyAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICAgIG1TYXdJbnB1dEVPUyhmYWxzZSksCisgICAgICBtU2lnbmFsbGVkRXJyb3IoZmFsc2UpLAorICAgICAgbUNvbnZlcnNpb25CdWZmZXIoTlVMTCksCisgICAgICBtQ29kZWNDdHgoTlVMTCkgeworCisgICAgaW5pdFBvcnRzKGtOdW1CdWZmZXJzLCBrTnVtQnVmZmVycywgKChtV2lkdGggKiBtSGVpZ2h0ICogMykgPj4gMSksCisgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsIDIpOworCisgICAgLy8gSWYgZHVtcCBpcyBlbmFibGVkLCB0aGVuIG9wZW4gY3JlYXRlIGFuIGVtcHR5IGZpbGUKKyAgICBHRU5FUkFURV9GSUxFX05BTUVTKCk7CisgICAgQ1JFQVRFX0RVTVBfRklMRShtSW5GaWxlKTsKKyAgICBDUkVBVEVfRFVNUF9GSUxFKG1PdXRGaWxlKTsKKworfQorCitTb2Z0QVZDOjp+U29mdEFWQygpIHsKKyAgICByZWxlYXNlRW5jb2RlcigpOworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoMSk7CisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDApOworICAgIENIRUNLKG91dFF1ZXVlLmVtcHR5KCkpOworICAgIENIRUNLKGluUXVldWUuZW1wdHkoKSk7Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdEFWQzo6aW5pdEVuY1BhcmFtcygpIHsKKyAgICBtQ29kZWNDdHggPSBOVUxMOworICAgIG1NZW1SZWNvcmRzID0gTlVMTDsKKyAgICBtTnVtTWVtUmVjb3JkcyA9IERFRkFVTFRfTUVNX1JFQ19DTlQ7CisgICAgbUhlYWRlckdlbmVyYXRlZCA9IDA7CisgICAgbU51bUNvcmVzID0gR2V0Q1BVQ29yZUNvdW50KCk7CisgICAgbUFyY2ggPSBERUZBVUxUX0FSQ0g7CisgICAgbVNsaWNlTW9kZSA9IERFRkFVTFRfU0xJQ0VfTU9ERTsKKyAgICBtU2xpY2VQYXJhbSA9IERFRkFVTFRfU0xJQ0VfUEFSQU07CisgICAgbUhhbGZQZWxFbmFibGUgPSBERUZBVUxUX0hQRUw7CisgICAgbUlJbnRlcnZhbCA9IERFRkFVTFRfSV9JTlRFUlZBTDsKKyAgICBtSURSSW50ZXJ2YWwgPSBERUZBVUxUX0lEUl9JTlRFUlZBTDsKKyAgICBtRGlzYWJsZURlYmxrTGV2ZWwgPSBERUZBVUxUX0RJU0FCTEVfREVCTEtfTEVWRUw7CisgICAgbUZyYW1lUmF0ZSA9IERFRkFVTFRfU1JDX0ZSQU1FX1JBVEU7CisgICAgbUVuYWJsZUZhc3RTYWQgPSBERUZBVUxUX0VOQUJMRV9GQVNUX1NBRDsKKyAgICBtRW5hYmxlQWx0UmVmID0gREVGQVVMVF9FTkFCTEVfQUxUX1JFRjsKKyAgICBtRW5jU3BlZWQgPSBERUZBVUxUX0VOQ19TUEVFRDsKKyAgICBtSW50cmE0eDQgPSBERUZBVUxUX0lOVFJBNHg0OworICAgIG1BSVJNb2RlID0gREVGQVVMVF9BSVI7CisgICAgbUFJUlJlZnJlc2hQZXJpb2QgPSBERUZBVUxUX0FJUl9SRUZSRVNIX1BFUklPRDsKKyAgICBtUFNOUkVuYWJsZSA9IERFRkFVTFRfUFNOUl9FTkFCTEU7CisgICAgbVJlY29uRW5hYmxlID0gREVGQVVMVF9SRUNPTl9FTkFCTEU7CisKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lU3RhcnQsIE5VTEwpOworICAgIGdldHRpbWVvZmRheSgmbVRpbWVFbmQsIE5VTEwpOworCisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKKworT01YX0VSUk9SVFlQRSBTb2Z0QVZDOjpzZXREaW1lbnNpb25zKCkgeworICAgIGl2ZV9jdGxfc2V0X2RpbWVuc2lvbnNfaXBfdCBzX2RpbWVuc2lvbnNfaXA7CisgICAgaXZlX2N0bF9zZXRfZGltZW5zaW9uc19vcF90IHNfZGltZW5zaW9uc19vcDsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisKKyAgICBzX2RpbWVuc2lvbnNfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2RpbWVuc2lvbnNfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0RJTUVOU0lPTlM7CisgICAgc19kaW1lbnNpb25zX2lwLnU0X2h0ID0gbUhlaWdodDsKKyAgICBzX2RpbWVuc2lvbnNfaXAudTRfd2QgPSBtV2lkdGg7CisgICAgc19kaW1lbnNpb25zX2lwLnU0X3N0cmQgPSBtU3RyaWRlOworCisgICAgc19kaW1lbnNpb25zX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19kaW1lbnNpb25zX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfZGltZW5zaW9uc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2RpbWVuc2lvbnNfaXBfdCk7CisgICAgc19kaW1lbnNpb25zX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZGltZW5zaW9uc19vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19kaW1lbnNpb25zX2lwLCAmc19kaW1lbnNpb25zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgZnJhbWUgZGltZW5zaW9ucyA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19kaW1lbnNpb25zX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgIH0KKyAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0QVZDOjpzZXROdW1Db3JlcygpIHsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisgICAgaXZlX2N0bF9zZXRfbnVtX2NvcmVzX2lwX3Qgc19udW1fY29yZXNfaXA7CisgICAgaXZlX2N0bF9zZXRfbnVtX2NvcmVzX29wX3Qgc19udW1fY29yZXNfb3A7CisgICAgc19udW1fY29yZXNfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX251bV9jb3Jlc19pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfTlVNX0NPUkVTOworICAgIHNfbnVtX2NvcmVzX2lwLnU0X251bV9jb3JlcyA9IE1JTihtTnVtQ29yZXMsIENPREVDX01BWF9DT1JFUyk7CisgICAgc19udW1fY29yZXNfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX251bV9jb3Jlc19pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisgICAgc19udW1fY29yZXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9udW1fY29yZXNfaXBfdCk7CisKKyAgICBzX251bV9jb3Jlc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X251bV9jb3Jlc19vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24oCisgICAgICAgICAgICBtQ29kZWNDdHgsICh2b2lkICopICZzX251bV9jb3Jlc19pcCwgKHZvaWQgKikgJnNfbnVtX2NvcmVzX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgcHJvY2Vzc29yIHBhcmFtcyA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19udW1fY29yZXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgfQorICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworfQorCitPTVhfRVJST1JUWVBFIFNvZnRBVkM6OnNldEZyYW1lUmF0ZSgpIHsKKyAgICBpdmVfY3RsX3NldF9mcmFtZV9yYXRlX2lwX3Qgc19mcmFtZV9yYXRlX2lwOworICAgIGl2ZV9jdGxfc2V0X2ZyYW1lX3JhdGVfb3BfdCBzX2ZyYW1lX3JhdGVfb3A7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc19mcmFtZV9yYXRlX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19mcmFtZV9yYXRlX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9GUkFNRVJBVEU7CisKKyAgICBzX2ZyYW1lX3JhdGVfaXAudTRfc3JjX2ZyYW1lX3JhdGUgPSBtRnJhbWVSYXRlOworICAgIHNfZnJhbWVfcmF0ZV9pcC51NF90Z3RfZnJhbWVfcmF0ZSA9IG1GcmFtZVJhdGU7CisKKyAgICBzX2ZyYW1lX3JhdGVfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2ZyYW1lX3JhdGVfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19mcmFtZV9yYXRlX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZnJhbWVfcmF0ZV9pcF90KTsKKyAgICBzX2ZyYW1lX3JhdGVfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9mcmFtZV9yYXRlX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2ZyYW1lX3JhdGVfaXAsICZzX2ZyYW1lX3JhdGVfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBmcmFtZSByYXRlID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX2ZyYW1lX3JhdGVfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgfQorICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworfQorCitPTVhfRVJST1JUWVBFIFNvZnRBVkM6OnNldElwZVBhcmFtcygpIHsKKyAgICBpdmVfY3RsX3NldF9pcGVfcGFyYW1zX2lwX3Qgc19pcGVfcGFyYW1zX2lwOworICAgIGl2ZV9jdGxfc2V0X2lwZV9wYXJhbXNfb3BfdCBzX2lwZV9wYXJhbXNfb3A7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc19pcGVfcGFyYW1zX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19pcGVfcGFyYW1zX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9JUEVfUEFSQU1TOworCisgICAgc19pcGVfcGFyYW1zX2lwLnU0X2VuYWJsZV9pbnRyYV80eDQgPSBtSW50cmE0eDQ7CisgICAgc19pcGVfcGFyYW1zX2lwLnU0X2VuY19zcGVlZF9wcmVzZXQgPSBtRW5jU3BlZWQ7CisKKyAgICBzX2lwZV9wYXJhbXNfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2lwZV9wYXJhbXNfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19pcGVfcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfaXBlX3BhcmFtc19pcF90KTsKKyAgICBzX2lwZV9wYXJhbXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9pcGVfcGFyYW1zX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2lwZV9wYXJhbXNfaXAsICZzX2lwZV9wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBpcGUgcGFyYW1zID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX2lwZV9wYXJhbXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgfQorICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworfQorCitPTVhfRVJST1JUWVBFIFNvZnRBVkM6OnNldEJpdFJhdGUoKSB7CisgICAgaXZlX2N0bF9zZXRfYml0cmF0ZV9pcF90IHNfYml0cmF0ZV9pcDsKKyAgICBpdmVfY3RsX3NldF9iaXRyYXRlX29wX3Qgc19iaXRyYXRlX29wOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKworICAgIHNfYml0cmF0ZV9pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfYml0cmF0ZV9pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfQklUUkFURTsKKworICAgIHNfYml0cmF0ZV9pcC51NF90YXJnZXRfYml0cmF0ZSA9IG1CaXRyYXRlOworCisgICAgc19iaXRyYXRlX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19iaXRyYXRlX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfYml0cmF0ZV9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2JpdHJhdGVfaXBfdCk7CisgICAgc19iaXRyYXRlX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfYml0cmF0ZV9vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19iaXRyYXRlX2lwLCAmc19iaXRyYXRlX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgYml0IHJhdGUgPSAweCV4XG4iLCBzX2JpdHJhdGVfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgfQorICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworfQorCitPTVhfRVJST1JUWVBFIFNvZnRBVkM6OnNldEZyYW1lVHlwZShJVl9QSUNUVVJFX0NPRElOR19UWVBFX1QgZV9mcmFtZV90eXBlKSB7CisgICAgaXZlX2N0bF9zZXRfZnJhbWVfdHlwZV9pcF90IHNfZnJhbWVfdHlwZV9pcDsKKyAgICBpdmVfY3RsX3NldF9mcmFtZV90eXBlX29wX3Qgc19mcmFtZV90eXBlX29wOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKworICAgIHNfZnJhbWVfdHlwZV9pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfZnJhbWVfdHlwZV9pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfRlJBTUVUWVBFOworCisgICAgc19mcmFtZV90eXBlX2lwLmVfZnJhbWVfdHlwZSA9IGVfZnJhbWVfdHlwZTsKKworICAgIHNfZnJhbWVfdHlwZV9pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfZnJhbWVfdHlwZV9pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX2ZyYW1lX3R5cGVfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9mcmFtZV90eXBlX2lwX3QpOworICAgIHNfZnJhbWVfdHlwZV9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2ZyYW1lX3R5cGVfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZnJhbWVfdHlwZV9pcCwgJnNfZnJhbWVfdHlwZV9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IGZyYW1lIHR5cGUgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgIHNfZnJhbWVfdHlwZV9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICB9CisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdEFWQzo6c2V0UXAoKSB7CisgICAgaXZlX2N0bF9zZXRfcXBfaXBfdCBzX3FwX2lwOworICAgIGl2ZV9jdGxfc2V0X3FwX29wX3Qgc19xcF9vcDsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisKKyAgICBzX3FwX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19xcF9pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfUVA7CisKKyAgICBzX3FwX2lwLnU0X2lfcXAgPSBERUZBVUxUX0lfUVA7CisgICAgc19xcF9pcC51NF9pX3FwX21heCA9IERFRkFVTFRfUVBfTUFYOworICAgIHNfcXBfaXAudTRfaV9xcF9taW4gPSBERUZBVUxUX1FQX01JTjsKKworICAgIHNfcXBfaXAudTRfcF9xcCA9IERFRkFVTFRfUF9RUDsKKyAgICBzX3FwX2lwLnU0X3BfcXBfbWF4ID0gREVGQVVMVF9RUF9NQVg7CisgICAgc19xcF9pcC51NF9wX3FwX21pbiA9IERFRkFVTFRfUVBfTUlOOworCisgICAgc19xcF9pcC51NF9iX3FwID0gREVGQVVMVF9QX1FQOworICAgIHNfcXBfaXAudTRfYl9xcF9tYXggPSBERUZBVUxUX1FQX01BWDsKKyAgICBzX3FwX2lwLnU0X2JfcXBfbWluID0gREVGQVVMVF9RUF9NSU47CisKKyAgICBzX3FwX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19xcF9pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX3FwX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfcXBfaXBfdCk7CisgICAgc19xcF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X3FwX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX3FwX2lwLCAmc19xcF9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IHFwIDB4JXhcbiIsIHNfcXBfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgfQorICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworfQorCitPTVhfRVJST1JUWVBFIFNvZnRBVkM6OnNldEVuY01vZGUoSVZFX0VOQ19NT0RFX1QgZV9lbmNfbW9kZSkgeworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBpdmVfY3RsX3NldF9lbmNfbW9kZV9pcF90IHNfZW5jX21vZGVfaXA7CisgICAgaXZlX2N0bF9zZXRfZW5jX21vZGVfb3BfdCBzX2VuY19tb2RlX29wOworCisgICAgc19lbmNfbW9kZV9pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfZW5jX21vZGVfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0VOQ19NT0RFOworCisgICAgc19lbmNfbW9kZV9pcC5lX2VuY19tb2RlID0gZV9lbmNfbW9kZTsKKworICAgIHNfZW5jX21vZGVfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2VuY19tb2RlX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfZW5jX21vZGVfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9lbmNfbW9kZV9pcF90KTsKKyAgICBzX2VuY19tb2RlX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZW5jX21vZGVfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZW5jX21vZGVfaXAsICZzX2VuY19tb2RlX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgaW4gaGVhZGVyIGVuY29kZSBtb2RlID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX2VuY19tb2RlX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgIH0KKyAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0QVZDOjpzZXRWYnZQYXJhbXMoKSB7CisgICAgaXZlX2N0bF9zZXRfdmJ2X3BhcmFtc19pcF90IHNfdmJ2X2lwOworICAgIGl2ZV9jdGxfc2V0X3Zidl9wYXJhbXNfb3BfdCBzX3Zidl9vcDsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisKKyAgICBzX3Zidl9pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfdmJ2X2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9WQlZfUEFSQU1TOworCisgICAgc192YnZfaXAudTRfdmJ2X2J1Zl9zaXplID0gMDsKKyAgICBzX3Zidl9pcC51NF92YnZfYnVmZmVyX2RlbGF5ID0gMTAwMDsKKworICAgIHNfdmJ2X2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc192YnZfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc192YnZfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF92YnZfcGFyYW1zX2lwX3QpOworICAgIHNfdmJ2X29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfdmJ2X3BhcmFtc19vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc192YnZfaXAsICZzX3Zidl9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IFZCQyBwYXJhbXMgPSAweCV4XG4iLCBzX3Zidl9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICB9CisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdEFWQzo6c2V0QWlyUGFyYW1zKCkgeworICAgIGl2ZV9jdGxfc2V0X2Fpcl9wYXJhbXNfaXBfdCBzX2Fpcl9pcDsKKyAgICBpdmVfY3RsX3NldF9haXJfcGFyYW1zX29wX3Qgc19haXJfb3A7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc19haXJfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2Fpcl9pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfQUlSX1BBUkFNUzsKKworICAgIHNfYWlyX2lwLmVfYWlyX21vZGUgPSBtQUlSTW9kZTsKKyAgICBzX2Fpcl9pcC51NF9haXJfcmVmcmVzaF9wZXJpb2QgPSBtQUlSUmVmcmVzaFBlcmlvZDsKKworICAgIHNfYWlyX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19haXJfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19haXJfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9haXJfcGFyYW1zX2lwX3QpOworICAgIHNfYWlyX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfYWlyX3BhcmFtc19vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19haXJfaXAsICZzX2Fpcl9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IGFpciBwYXJhbXMgPSAweCV4XG4iLCBzX2Fpcl9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICB9CisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdEFWQzo6c2V0TWVQYXJhbXMoKSB7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworICAgIGl2ZV9jdGxfc2V0X21lX3BhcmFtc19pcF90IHNfbWVfcGFyYW1zX2lwOworICAgIGl2ZV9jdGxfc2V0X21lX3BhcmFtc19vcF90IHNfbWVfcGFyYW1zX29wOworCisgICAgc19tZV9wYXJhbXNfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX21lX3BhcmFtc19pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfTUVfUEFSQU1TOworCisgICAgc19tZV9wYXJhbXNfaXAudTRfZW5hYmxlX2Zhc3Rfc2FkID0gbUVuYWJsZUZhc3RTYWQ7CisgICAgc19tZV9wYXJhbXNfaXAudTRfZW5hYmxlX2FsdF9yZWYgPSBtRW5hYmxlQWx0UmVmOworCisgICAgc19tZV9wYXJhbXNfaXAudTRfZW5hYmxlX2hwZWwgPSBtSGFsZlBlbEVuYWJsZTsKKyAgICBzX21lX3BhcmFtc19pcC51NF9lbmFibGVfcXBlbCA9IERFRkFVTFRfUVBFTDsKKyAgICBzX21lX3BhcmFtc19pcC51NF9tZV9zcGVlZF9wcmVzZXQgPSBERUZBVUxUX01FX1NQRUVEOworICAgIHNfbWVfcGFyYW1zX2lwLnU0X3NyY2hfcm5nX3ggPSBERUZBVUxUX1NSQ0hfUk5HX1g7CisgICAgc19tZV9wYXJhbXNfaXAudTRfc3JjaF9ybmdfeSA9IERFRkFVTFRfU1JDSF9STkdfWTsKKworICAgIHNfbWVfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19tZV9wYXJhbXNfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19tZV9wYXJhbXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9tZV9wYXJhbXNfaXBfdCk7CisgICAgc19tZV9wYXJhbXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9tZV9wYXJhbXNfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfbWVfcGFyYW1zX2lwLCAmc19tZV9wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBtZSBwYXJhbXMgPSAweCV4XG4iLCBzX21lX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICB9CisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdEFWQzo6c2V0R29wUGFyYW1zKCkgeworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBpdmVfY3RsX3NldF9nb3BfcGFyYW1zX2lwX3Qgc19nb3BfcGFyYW1zX2lwOworICAgIGl2ZV9jdGxfc2V0X2dvcF9wYXJhbXNfb3BfdCBzX2dvcF9wYXJhbXNfb3A7CisKKyAgICBzX2dvcF9wYXJhbXNfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2dvcF9wYXJhbXNfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0dPUF9QQVJBTVM7CisKKyAgICBzX2dvcF9wYXJhbXNfaXAudTRfaV9mcm1faW50ZXJ2YWwgPSBtSUludGVydmFsOworICAgIHNfZ29wX3BhcmFtc19pcC51NF9pZHJfZnJtX2ludGVydmFsID0gbUlEUkludGVydmFsOworICAgIHNfZ29wX3BhcmFtc19pcC51NF9udW1fYl9mcmFtZXMgPSBERUZBVUxUX0JfRlJBTUVTOworCisgICAgc19nb3BfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19nb3BfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfZ29wX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2dvcF9wYXJhbXNfaXBfdCk7CisgICAgc19nb3BfcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZ29wX3BhcmFtc19vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19nb3BfcGFyYW1zX2lwLCAmc19nb3BfcGFyYW1zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgTUUgcGFyYW1zID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX2dvcF9wYXJhbXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgfQorICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworfQorCitPTVhfRVJST1JUWVBFIFNvZnRBVkM6OnNldFByb2ZpbGVQYXJhbXMoKSB7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworICAgIGl2ZV9jdGxfc2V0X3Byb2ZpbGVfcGFyYW1zX2lwX3Qgc19wcm9maWxlX3BhcmFtc19pcDsKKyAgICBpdmVfY3RsX3NldF9wcm9maWxlX3BhcmFtc19vcF90IHNfcHJvZmlsZV9wYXJhbXNfb3A7CisKKyAgICBzX3Byb2ZpbGVfcGFyYW1zX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19wcm9maWxlX3BhcmFtc19pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfUFJPRklMRV9QQVJBTVM7CisKKyAgICBzX3Byb2ZpbGVfcGFyYW1zX2lwLmVfcHJvZmlsZSA9IERFRkFVTFRfRVBST0ZJTEU7CisKKyAgICBzX3Byb2ZpbGVfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19wcm9maWxlX3BhcmFtc19pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX3Byb2ZpbGVfcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfcHJvZmlsZV9wYXJhbXNfaXBfdCk7CisgICAgc19wcm9maWxlX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X3Byb2ZpbGVfcGFyYW1zX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX3Byb2ZpbGVfcGFyYW1zX2lwLCAmc19wcm9maWxlX3BhcmFtc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IHByb2ZpbGUgcGFyYW1zID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX3Byb2ZpbGVfcGFyYW1zX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgIH0KKyAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0QVZDOjpzZXREZWJsb2NrUGFyYW1zKCkgeworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBpdmVfY3RsX3NldF9kZWJsb2NrX3BhcmFtc19pcF90IHNfZGVibG9ja19wYXJhbXNfaXA7CisgICAgaXZlX2N0bF9zZXRfZGVibG9ja19wYXJhbXNfb3BfdCBzX2RlYmxvY2tfcGFyYW1zX29wOworCisgICAgc19kZWJsb2NrX3BhcmFtc19pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfZGVibG9ja19wYXJhbXNfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0RFQkxPQ0tfUEFSQU1TOworCisgICAgc19kZWJsb2NrX3BhcmFtc19pcC51NF9kaXNhYmxlX2RlYmxvY2tfbGV2ZWwgPSBtRGlzYWJsZURlYmxrTGV2ZWw7CisKKyAgICBzX2RlYmxvY2tfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19kZWJsb2NrX3BhcmFtc19pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX2RlYmxvY2tfcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZGVibG9ja19wYXJhbXNfaXBfdCk7CisgICAgc19kZWJsb2NrX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2RlYmxvY2tfcGFyYW1zX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2RlYmxvY2tfcGFyYW1zX2lwLCAmc19kZWJsb2NrX3BhcmFtc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gZW5hYmxlL2Rpc2FibGUgZGVibG9jayBwYXJhbXMgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgIHNfZGVibG9ja19wYXJhbXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgfQorICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworfQorCit2b2lkIFNvZnRBVkM6OmxvZ1ZlcnNpb24oKSB7CisgICAgaXZlX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90IHNfY3RsX2lwOworICAgIGl2ZV9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCBzX2N0bF9vcDsKKyAgICBVV09SRDggYXUxX2J1Zls1MTJdOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKworICAgIHNfY3RsX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19jdGxfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfR0VUVkVSU0lPTjsKKyAgICBzX2N0bF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfZ2V0dmVyc2lvbmluZm9faXBfdCk7CisgICAgc19jdGxfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX2dldHZlcnNpb25pbmZvX29wX3QpOworICAgIHNfY3RsX2lwLnB1MV92ZXJzaW9uID0gYXUxX2J1ZjsKKyAgICBzX2N0bF9pcC51NF92ZXJzaW9uX2J1ZnNpemUgPSBzaXplb2YoYXUxX2J1Zik7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikgJnNfY3RsX2lwLCAodm9pZCAqKSAmc19jdGxfb3ApOworCisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBpbiBnZXR0aW5nIHZlcnNpb246IDB4JXgiLCBzX2N0bF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiSXR0aWFtIGVuY29kZXIgdmVyc2lvbjogJXMiLCAoY2hhciAqKXNfY3RsX2lwLnB1MV92ZXJzaW9uKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCitPTVhfRVJST1JUWVBFIFNvZnRBVkM6OmluaXRFbmNvZGVyKCkgeworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBzaXplX3QgaTsKKyAgICBXT1JEMzIgbGV2ZWw7CisgICAgdWludDMyX3QgZGlzcGxheVNpemVZOworICAgIENIRUNLKCFtU3RhcnRlZCk7CisKKyAgICBPTVhfRVJST1JUWVBFIGVyclR5cGUgPSBPTVhfRXJyb3JOb25lOworCisgICAgZGlzcGxheVNpemVZID0gbVdpZHRoICogbUhlaWdodDsKKyAgICBpZiAoZGlzcGxheVNpemVZID4gKDE5MjAgKiAxMDg4KSkgeworICAgICAgICBsZXZlbCA9IDUwOworICAgIH0gZWxzZSBpZiAoZGlzcGxheVNpemVZID4gKDEyODAgKiA3MjApKSB7CisgICAgICAgIGxldmVsID0gNDA7CisgICAgfSBlbHNlIGlmIChkaXNwbGF5U2l6ZVkgPiAoNzIwICogNTc2KSkgeworICAgICAgICBsZXZlbCA9IDMxOworICAgIH0gZWxzZSBpZiAoZGlzcGxheVNpemVZID4gKDYyNCAqIDMyMCkpIHsKKyAgICAgICAgbGV2ZWwgPSAzMDsKKyAgICB9IGVsc2UgaWYgKGRpc3BsYXlTaXplWSA+ICgzNTIgKiAyODgpKSB7CisgICAgICAgIGxldmVsID0gMjE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbGV2ZWwgPSAyMDsKKyAgICB9CisgICAgbUFWQ0VuY0xldmVsID0gTUFYKGxldmVsLCBtQVZDRW5jTGV2ZWwpOworCisgICAgaWYgKE9NWF9FcnJvck5vbmUgIT0gKGVyclR5cGUgPSBpbml0RW5jUGFyYW1zKCkpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBlbmNvZGVyIHBhcmFtcyIpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgMCk7CisgICAgICAgIHJldHVybiBlcnJUeXBlOworICAgIH0KKworICAgIG1TdHJpZGUgPSBBTElHTjE2KG1XaWR0aCk7CisKKyAgICBpZiAobUlucHV0RGF0YUlzTWV0YSkgeworICAgICAgICBpZiAobUNvbnZlcnNpb25CdWZmZXIpIHsKKyAgICAgICAgICAgIGZyZWUobUNvbnZlcnNpb25CdWZmZXIpOworICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXIgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Db252ZXJzaW9uQnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyID0gKHVpbnQ4X3QgKiltYWxsb2MobVN0cmlkZSAqIG1IZWlnaHQgKiAzIC8gMik7CisgICAgICAgICAgICBpZiAobUNvbnZlcnNpb25CdWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBbGxvY2F0aW5nIGNvbnZlcnNpb24gYnVmZmVyIGZhaWxlZC4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc3dpdGNoIChtQ29sb3JGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKKyAgICAgICAgICAgIG1JdlZpZGVvQ29sb3JGb3JtYXQgPSBJVl9ZVVZfNDIwU1BfVVY7CisgICAgICAgICAgICBBTE9HVigiY29sb3JGb3JtYXQgWVVWXzQyMFNQIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgorICAgICAgICAgICAgbUl2VmlkZW9Db2xvckZvcm1hdCA9IElWX1lVVl80MjBQOworICAgICAgICAgICAgQUxPR1YoImNvbG9yRm9ybWF0IFlVVl80MjBQIik7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBBTE9HVigiUGFyYW1zIHdpZHRoICVkIGhlaWdodCAlZCBsZXZlbCAlZCBjb2xvckZvcm1hdCAlZCIsIG1XaWR0aCwKKyAgICAgICAgICAgIG1IZWlnaHQsIG1BVkNFbmNMZXZlbCwgbUl2VmlkZW9Db2xvckZvcm1hdCk7CisKKyAgICAvKiBHZXR0aW5nIE51bWJlciBvZiBNZW1SZWNvcmRzICovCisgICAgeworICAgICAgICBpdl9udW1fbWVtX3JlY19pcF90IHNfbnVtX21lbV9yZWNfaXA7CisgICAgICAgIGl2X251bV9tZW1fcmVjX29wX3Qgc19udW1fbWVtX3JlY19vcDsKKworICAgICAgICBzX251bV9tZW1fcmVjX2lwLnU0X3NpemUgPSBzaXplb2YoaXZfbnVtX21lbV9yZWNfaXBfdCk7CisgICAgICAgIHNfbnVtX21lbV9yZWNfb3AudTRfc2l6ZSA9IHNpemVvZihpdl9udW1fbWVtX3JlY19vcF90KTsKKworICAgICAgICBzX251bV9tZW1fcmVjX2lwLmVfY21kID0gSVZfQ01EX0dFVF9OVU1fTUVNX1JFQzsKKworICAgICAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKDAsICZzX251bV9tZW1fcmVjX2lwLCAmc19udW1fbWVtX3JlY19vcCk7CisKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgICAgICBBTE9HRSgiR2V0IG51bWJlciBvZiBtZW1vcnkgcmVjb3JkcyBmYWlsZWQgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICBzX251bV9tZW1fcmVjX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgfQorCisgICAgICAgIG1OdW1NZW1SZWNvcmRzID0gc19udW1fbWVtX3JlY19vcC51NF9udW1fbWVtX3JlYzsKKyAgICB9CisKKyAgICAvKiBBbGxvY2F0ZSBhcnJheSB0byBob2xkIG1lbW9yeSByZWNvcmRzICovCisgICAgbU1lbVJlY29yZHMgPSAoaXZfbWVtX3JlY190ICopbWFsbG9jKG1OdW1NZW1SZWNvcmRzICogc2l6ZW9mKGl2X21lbV9yZWNfdCkpOworICAgIGlmIChOVUxMID09IG1NZW1SZWNvcmRzKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBob2xkIG1lbW9yeSByZWNvcmRzOiBTaXplICVkIiwKKyAgICAgICAgICAgICAgICBtTnVtTWVtUmVjb3JkcyAqIHNpemVvZihpdl9tZW1fcmVjX3QpKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIDApOworICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgIH0KKworICAgIHsKKyAgICAgICAgaXZfbWVtX3JlY190ICpwc19tZW1fcmVjOworICAgICAgICBwc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtTnVtTWVtUmVjb3JkczsgaSsrKSB7CisgICAgICAgICAgICBwc19tZW1fcmVjLT51NF9zaXplID0gc2l6ZW9mKGl2X21lbV9yZWNfdCk7CisgICAgICAgICAgICBwc19tZW1fcmVjLT5wdl9iYXNlID0gTlVMTDsKKyAgICAgICAgICAgIHBzX21lbV9yZWMtPnU0X21lbV9zaXplID0gMDsKKyAgICAgICAgICAgIHBzX21lbV9yZWMtPnU0X21lbV9hbGlnbm1lbnQgPSAwOworICAgICAgICAgICAgcHNfbWVtX3JlYy0+ZV9tZW1fdHlwZSA9IElWX05BX01FTV9UWVBFOworCisgICAgICAgICAgICBwc19tZW1fcmVjKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBHZXR0aW5nIE1lbVJlY29yZHMgQXR0cmlidXRlcyAqLworICAgIHsKKyAgICAgICAgaXZfZmlsbF9tZW1fcmVjX2lwX3Qgc19maWxsX21lbV9yZWNfaXA7CisgICAgICAgIGl2X2ZpbGxfbWVtX3JlY19vcF90IHNfZmlsbF9tZW1fcmVjX29wOworCisgICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnU0X3NpemUgPSBzaXplb2YoaXZfZmlsbF9tZW1fcmVjX2lwX3QpOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19vcC51NF9zaXplID0gc2l6ZW9mKGl2X2ZpbGxfbWVtX3JlY19vcF90KTsKKworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC5lX2NtZCA9IElWX0NNRF9GSUxMX05VTV9NRU1fUkVDOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC5wc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisgICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnU0X251bV9tZW1fcmVjID0gbU51bU1lbVJlY29yZHM7CisgICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnU0X21heF93ZCA9IG1XaWR0aDsKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAudTRfbWF4X2h0ID0gbUhlaWdodDsKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAudTRfbWF4X2xldmVsID0gbUFWQ0VuY0xldmVsOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC5lX2NvbG9yX2Zvcm1hdCA9IERFRkFVTFRfSU5QX0NPTE9SX0ZPUk1BVDsKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAudTRfbWF4X3JlZl9jbnQgPSBERUZBVUxUX01BWF9SRUZfRlJNOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9tYXhfcmVvcmRlcl9jbnQgPSBERUZBVUxUX01BWF9SRU9SREVSX0ZSTTsKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAudTRfbWF4X3NyY2hfcm5nX3ggPSBERUZBVUxUX01BWF9TUkNIX1JBTkdFX1g7CisgICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnU0X21heF9zcmNoX3JuZ195ID0gREVGQVVMVF9NQVhfU1JDSF9SQU5HRV9ZOworCisgICAgICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24oMCwgJnNfZmlsbF9tZW1fcmVjX2lwLCAmc19maWxsX21lbV9yZWNfb3ApOworCisgICAgICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICAgICAgQUxPR0UoIkZpbGwgbWVtb3J5IHJlY29yZHMgZmFpbGVkID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgc19maWxsX21lbV9yZWNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIDApOworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEFsbG9jYXRpbmcgTWVtb3J5IGZvciBNZW0gUmVjb3JkcyAqLworICAgIHsKKyAgICAgICAgV09SRDMyIHRvdGFsX3NpemU7CisgICAgICAgIGl2X21lbV9yZWNfdCAqcHNfbWVtX3JlYzsKKyAgICAgICAgdG90YWxfc2l6ZSA9IDA7CisKKyAgICAgICAgcHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbU51bU1lbVJlY29yZHM7IGkrKykgeworICAgICAgICAgICAgcHNfbWVtX3JlYy0+cHZfYmFzZSA9IGl2ZV9hbGlnbmVkX21hbGxvYygKKyAgICAgICAgICAgICAgICAgICAgcHNfbWVtX3JlYy0+dTRfbWVtX2FsaWdubWVudCwgcHNfbWVtX3JlYy0+dTRfbWVtX3NpemUpOworICAgICAgICAgICAgaWYgKHBzX21lbV9yZWMtPnB2X2Jhc2UgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBbGxvY2F0aW9uIGZhaWx1cmUgZm9yIG1lbSByZWNvcmQgaWQgJWQgc2l6ZSAlZFxuIiwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBzX21lbV9yZWMtPnU0X21lbV9zaXplKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCAwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICB0b3RhbF9zaXplICs9IHBzX21lbV9yZWMtPnU0X21lbV9zaXplOworCisgICAgICAgICAgICBwc19tZW1fcmVjKys7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCJcblRvdGFsIG1lbW9yeSBmb3IgY29kZWMgJWRcbiIsIHRvdGFsX3NpemUpOworICAgIH0KKworICAgIC8qIENvZGVjIEluc3RhbmNlIENyZWF0aW9uICovCisgICAgeworICAgICAgICBpdmVfaW5pdF9pcF90IHNfaW5pdF9pcDsKKyAgICAgICAgaXZlX2luaXRfb3BfdCBzX2luaXRfb3A7CisKKyAgICAgICAgbUNvZGVjQ3R4ID0gKGl2X29ial90ICopbU1lbVJlY29yZHNbMF0ucHZfYmFzZTsKKyAgICAgICAgbUNvZGVjQ3R4LT51NF9zaXplID0gc2l6ZW9mKGl2X29ial90KTsKKyAgICAgICAgbUNvZGVjQ3R4LT5wdl9meG5zID0gKHZvaWQgKilpdmVfYXBpX2Z1bmN0aW9uOworCisgICAgICAgIHNfaW5pdF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9pbml0X2lwX3QpOworICAgICAgICBzX2luaXRfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfaW5pdF9vcF90KTsKKworICAgICAgICBzX2luaXRfaXAuZV9jbWQgPSBJVl9DTURfSU5JVDsKKyAgICAgICAgc19pbml0X2lwLnU0X251bV9tZW1fcmVjID0gbU51bU1lbVJlY29yZHM7CisgICAgICAgIHNfaW5pdF9pcC5wc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfd2QgPSBtV2lkdGg7CisgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfaHQgPSBtSGVpZ2h0OworICAgICAgICBzX2luaXRfaXAudTRfbWF4X3JlZl9jbnQgPSBERUZBVUxUX01BWF9SRUZfRlJNOworICAgICAgICBzX2luaXRfaXAudTRfbWF4X3Jlb3JkZXJfY250ID0gREVGQVVMVF9NQVhfUkVPUkRFUl9GUk07CisgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfbGV2ZWwgPSBtQVZDRW5jTGV2ZWw7CisgICAgICAgIHNfaW5pdF9pcC5lX2lucF9jb2xvcl9mbXQgPSBtSXZWaWRlb0NvbG9yRm9ybWF0OworCisgICAgICAgIGlmIChtUmVjb25FbmFibGUgfHwgbVBTTlJFbmFibGUpIHsKKyAgICAgICAgICAgIHNfaW5pdF9pcC51NF9lbmFibGVfcmVjb24gPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc19pbml0X2lwLnU0X2VuYWJsZV9yZWNvbiA9IDA7CisgICAgICAgIH0KKyAgICAgICAgc19pbml0X2lwLmVfcmVjb25fY29sb3JfZm10ID0gREVGQVVMVF9SRUNPTl9DT0xPUl9GT1JNQVQ7CisgICAgICAgIHNfaW5pdF9pcC5lX3JjX21vZGUgPSBERUZBVUxUX1JDX01PREU7CisgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfZnJhbWVyYXRlID0gREVGQVVMVF9NQVhfRlJBTUVSQVRFOworICAgICAgICBzX2luaXRfaXAudTRfbWF4X2JpdHJhdGUgPSBERUZBVUxUX01BWF9CSVRSQVRFOworICAgICAgICBzX2luaXRfaXAudTRfbWF4X251bV9iZnJhbWVzID0gREVGQVVMVF9CX0ZSQU1FUzsKKyAgICAgICAgc19pbml0X2lwLmVfY29udGVudF90eXBlID0gSVZfUFJPR1JFU1NJVkU7CisgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfc3JjaF9ybmdfeCA9IERFRkFVTFRfTUFYX1NSQ0hfUkFOR0VfWDsKKyAgICAgICAgc19pbml0X2lwLnU0X21heF9zcmNoX3JuZ195ID0gREVGQVVMVF9NQVhfU1JDSF9SQU5HRV9ZOworICAgICAgICBzX2luaXRfaXAuZV9zbGljZV9tb2RlID0gbVNsaWNlTW9kZTsKKyAgICAgICAgc19pbml0X2lwLnU0X3NsaWNlX3BhcmFtID0gbVNsaWNlUGFyYW07CisgICAgICAgIHNfaW5pdF9pcC5lX2FyY2ggPSBtQXJjaDsKKyAgICAgICAgc19pbml0X2lwLmVfc29jID0gREVGQVVMVF9TT0M7CisKKyAgICAgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2luaXRfaXAsICZzX2luaXRfb3ApOworCisgICAgICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICAgICAgQUxPR0UoIkluaXQgbWVtb3J5IHJlY29yZHMgZmFpbGVkID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgc19pbml0X29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwIC8qIGFyZzIgKi8sIE5VTEwgLyogZGF0YSAqLyk7CisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICB9CisgICAgfQorCisgICAgLyogR2V0IENvZGVjIFZlcnNpb24gKi8KKyAgICBsb2dWZXJzaW9uKCk7CisKKyAgICAvKiBzZXQgcHJvY2Vzc29yIGRldGFpbHMgKi8KKyAgICBzZXROdW1Db3JlcygpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgRnJhbWUgZGltZW5zaW9ucyAqLworICAgIHNldERpbWVuc2lvbnMoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IEZyYW1lIHJhdGVzICovCisgICAgc2V0RnJhbWVSYXRlKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBJUEUgUGFyYW1zICovCisgICAgc2V0SXBlUGFyYW1zKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBCaXRyYXRlICovCisgICAgc2V0Qml0UmF0ZSgpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgUVAgKi8KKyAgICBzZXRRcCgpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgQUlSIHBhcmFtcyAqLworICAgIHNldEFpclBhcmFtcygpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgVkJWIHBhcmFtcyAqLworICAgIHNldFZidlBhcmFtcygpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgTW90aW9uIGVzdGltYXRpb24gcGFyYW1zICovCisgICAgc2V0TWVQYXJhbXMoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IEdPUCBwYXJhbXMgKi8KKyAgICBzZXRHb3BQYXJhbXMoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IERlYmxvY2sgcGFyYW1zICovCisgICAgc2V0RGVibG9ja1BhcmFtcygpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgUHJvZmlsZSBwYXJhbXMgKi8KKyAgICBzZXRQcm9maWxlUGFyYW1zKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBpbiBFbmNvZGUgaGVhZGVyIG1vZGUgKi8KKyAgICBzZXRFbmNNb2RlKElWRV9FTkNfTU9ERV9IRUFERVIpOworCisgICAgQUxPR1YoImluaXRfY29kZWMgc3VjY2Vzc2Z1bGwiKTsKKworICAgIG1TcHNQcHNIZWFkZXJSZWNlaXZlZCA9IGZhbHNlOworICAgIG1TdGFydGVkID0gdHJ1ZTsKKworICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworfQorCitPTVhfRVJST1JUWVBFIFNvZnRBVkM6OnJlbGVhc2VFbmNvZGVyKCkgeworICAgIElWX1NUQVRVU19UIHN0YXR1cyA9IElWX1NVQ0NFU1M7CisgICAgaXZfcmV0cmlldmVfbWVtX3JlY19pcF90IHNfcmV0cmlldmVfbWVtX2lwOworICAgIGl2X3JldHJpZXZlX21lbV9yZWNfb3BfdCBzX3JldHJpZXZlX21lbV9vcDsKKyAgICBpdl9tZW1fcmVjX3QgKnBzX21lbV9yZWM7CisgICAgVVdPUkQzMiBpOworCisgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICB9CisKKyAgICBzX3JldHJpZXZlX21lbV9pcC51NF9zaXplID0gc2l6ZW9mKGl2X3JldHJpZXZlX21lbV9yZWNfaXBfdCk7CisgICAgc19yZXRyaWV2ZV9tZW1fb3AudTRfc2l6ZSA9IHNpemVvZihpdl9yZXRyaWV2ZV9tZW1fcmVjX29wX3QpOworICAgIHNfcmV0cmlldmVfbWVtX2lwLmVfY21kID0gSVZfQ01EX1JFVFJJRVZFX01FTVJFQzsKKyAgICBzX3JldHJpZXZlX21lbV9pcC5wc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfcmV0cmlldmVfbWVtX2lwLCAmc19yZXRyaWV2ZV9tZW1fb3ApOworCisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gcmV0cmlldmUgbWVtb3J5IHJlY29yZHMgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgIHNfcmV0cmlldmVfbWVtX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgIH0KKworICAgIC8qIEZyZWUgbWVtb3J5IHJlY29yZHMgKi8KKyAgICBwc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisgICAgZm9yIChpID0gMDsgaSA8IHNfcmV0cmlldmVfbWVtX29wLnU0X251bV9tZW1fcmVjX2ZpbGxlZDsgaSsrKSB7CisgICAgICAgIGl2ZV9hbGlnbmVkX2ZyZWUocHNfbWVtX3JlYy0+cHZfYmFzZSk7CisgICAgICAgIHBzX21lbV9yZWMrKzsKKyAgICB9CisKKyAgICBmcmVlKG1NZW1SZWNvcmRzKTsKKworICAgIGlmIChtQ29udmVyc2lvbkJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgIGZyZWUobUNvbnZlcnNpb25CdWZmZXIpOworICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlciA9IE5VTEw7CisgICAgfQorCisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKworICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworfQorCitPTVhfRVJST1JUWVBFIFNvZnRBVkM6OmludGVybmFsR2V0UGFyYW1ldGVyKE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CisgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9CaXRyYXRlOgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fQklUUkFURVRZUEUgKmJpdFJhdGUgPQorICAgICAgICAgICAgICAgIChPTVhfVklERU9fUEFSQU1fQklUUkFURVRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmIChiaXRSYXRlLT5uUG9ydEluZGV4ICE9IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiaXRSYXRlLT5lQ29udHJvbFJhdGUgPSBPTVhfVmlkZW9fQ29udHJvbFJhdGVWYXJpYWJsZTsKKyAgICAgICAgICAgIGJpdFJhdGUtPm5UYXJnZXRCaXRyYXRlID0gbUJpdHJhdGU7CisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0F2YzoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX0FWQ1RZUEUgKmF2Y1BhcmFtcyA9IChPTVhfVklERU9fUEFSQU1fQVZDVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKGF2Y1BhcmFtcy0+blBvcnRJbmRleCAhPSAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXZjUGFyYW1zLT5lUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmU7CisgICAgICAgICAgICBPTVhfVklERU9fQVZDTEVWRUxUWVBFIG9teExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMzE7CisgICAgICAgICAgICBpZiAoT01YX0Vycm9yTm9uZQorICAgICAgICAgICAgICAgICAgICAhPSBDb252ZXJ0QXZjU3BlY0xldmVsVG9PbXhBdmNMZXZlbChtQVZDRW5jTGV2ZWwsICZvbXhMZXZlbCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdmNQYXJhbXMtPmVMZXZlbCA9IG9teExldmVsOworICAgICAgICAgICAgYXZjUGFyYW1zLT5uUmVmRnJhbWVzID0gMTsKKyAgICAgICAgICAgIGF2Y1BhcmFtcy0+bkJGcmFtZXMgPSAwOworICAgICAgICAgICAgYXZjUGFyYW1zLT5iVXNlSGFkYW1hcmQgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgIGF2Y1BhcmFtcy0+bkFsbG93ZWRQaWN0dXJlVHlwZXMgPSAoT01YX1ZJREVPX1BpY3R1cmVUeXBlSQorICAgICAgICAgICAgICAgICAgICB8IE9NWF9WSURFT19QaWN0dXJlVHlwZVApOworICAgICAgICAgICAgYXZjUGFyYW1zLT5uUmVmSWR4MTBBY3RpdmVNaW51czEgPSAwOworICAgICAgICAgICAgYXZjUGFyYW1zLT5uUmVmSWR4MTFBY3RpdmVNaW51czEgPSAwOworICAgICAgICAgICAgYXZjUGFyYW1zLT5iV2VpZ2h0ZWRQUHJlZGljdGlvbiA9IE9NWF9GQUxTRTsKKyAgICAgICAgICAgIGF2Y1BhcmFtcy0+YkVudHJvcHlDb2RpbmdDQUJBQyA9IE9NWF9GQUxTRTsKKyAgICAgICAgICAgIGF2Y1BhcmFtcy0+YmNvbnN0SXByZWQgPSBPTVhfRkFMU0U7CisgICAgICAgICAgICBhdmNQYXJhbXMtPmJEaXJlY3Q4eDhJbmZlcmVuY2UgPSBPTVhfRkFMU0U7CisgICAgICAgICAgICBhdmNQYXJhbXMtPmJEaXJlY3RTcGF0aWFsVGVtcG9yYWwgPSBPTVhfRkFMU0U7CisgICAgICAgICAgICBhdmNQYXJhbXMtPm5DYWJhY0luaXRJZGMgPSAwOworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQ6OmludGVybmFsR2V0UGFyYW1ldGVyKGluZGV4LCBwYXJhbXMpOworICAgIH0KK30KKworT01YX0VSUk9SVFlQRSBTb2Z0QVZDOjppbnRlcm5hbFNldFBhcmFtZXRlcihPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcykgeworICAgIGludDMyX3QgaW5kZXhGdWxsID0gaW5kZXg7CisKKyAgICBzd2l0Y2ggKGluZGV4RnVsbCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9CaXRyYXRlOgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gaW50ZXJuYWxTZXRCaXRyYXRlUGFyYW1zKAorICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1ZJREVPX1BBUkFNX0JJVFJBVEVUWVBFICopcGFyYW1zKTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0F2YzoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX0FWQ1RZUEUgKmF2Y1R5cGUgPSAoT01YX1ZJREVPX1BBUkFNX0FWQ1RZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmIChhdmNUeXBlLT5uUG9ydEluZGV4ICE9IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYXZjVHlwZS0+ZVByb2ZpbGUgIT0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZQorICAgICAgICAgICAgICAgICAgICB8fCBhdmNUeXBlLT5uUmVmRnJhbWVzICE9IDEgfHwgYXZjVHlwZS0+bkJGcmFtZXMgIT0gMAorICAgICAgICAgICAgICAgICAgICB8fCBhdmNUeXBlLT5iVXNlSGFkYW1hcmQgIT0gT01YX1RSVUUKKyAgICAgICAgICAgICAgICAgICAgfHwgKGF2Y1R5cGUtPm5BbGxvd2VkUGljdHVyZVR5cGVzICYgT01YX1ZJREVPX1BpY3R1cmVUeXBlQikgIT0gMAorICAgICAgICAgICAgICAgICAgICB8fCBhdmNUeXBlLT5uUmVmSWR4MTBBY3RpdmVNaW51czEgIT0gMAorICAgICAgICAgICAgICAgICAgICB8fCBhdmNUeXBlLT5uUmVmSWR4MTFBY3RpdmVNaW51czEgIT0gMAorICAgICAgICAgICAgICAgICAgICB8fCBhdmNUeXBlLT5iV2VpZ2h0ZWRQUHJlZGljdGlvbiAhPSBPTVhfRkFMU0UKKyAgICAgICAgICAgICAgICAgICAgfHwgYXZjVHlwZS0+YkVudHJvcHlDb2RpbmdDQUJBQyAhPSBPTVhfRkFMU0UKKyAgICAgICAgICAgICAgICAgICAgfHwgYXZjVHlwZS0+YmNvbnN0SXByZWQgIT0gT01YX0ZBTFNFCisgICAgICAgICAgICAgICAgICAgIHx8IGF2Y1R5cGUtPmJEaXJlY3Q4eDhJbmZlcmVuY2UgIT0gT01YX0ZBTFNFCisgICAgICAgICAgICAgICAgICAgIHx8IGF2Y1R5cGUtPmJEaXJlY3RTcGF0aWFsVGVtcG9yYWwgIT0gT01YX0ZBTFNFCisgICAgICAgICAgICAgICAgICAgIHx8IGF2Y1R5cGUtPm5DYWJhY0luaXRJZGMgIT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChPSyAhPSBDb252ZXJ0T214QXZjTGV2ZWxUb0F2Y1NwZWNMZXZlbChhdmNUeXBlLT5lTGV2ZWwsICZtQVZDRW5jTGV2ZWwpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQ6OmludGVybmFsU2V0UGFyYW1ldGVyKGluZGV4LCBwYXJhbXMpOworICAgIH0KK30KKworT01YX0VSUk9SVFlQRSBTb2Z0QVZDOjpzZXRDb25maWcoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgX3BhcmFtcykgeworICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdWaWRlb0ludHJhVk9QUmVmcmVzaDoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX0NPTkZJR19JTlRSQVJFRlJFU0hWT1BUWVBFICpwYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfQ09ORklHX0lOVFJBUkVGUkVTSFZPUFRZUEUgKilfcGFyYW1zOworCisgICAgICAgICAgICBpZiAocGFyYW1zLT5uUG9ydEluZGV4ICE9IGtPdXRwdXRQb3J0SW5kZXgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtS2V5RnJhbWVSZXF1ZXN0ZWQgPSBwYXJhbXMtPkludHJhUmVmcmVzaFZPUDsKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdWaWRlb0JpdHJhdGU6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9WSURFT19DT05GSUdfQklUUkFURVRZUEUgKnBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9WSURFT19DT05GSUdfQklUUkFURVRZUEUgKilfcGFyYW1zOworCisgICAgICAgICAgICBpZiAocGFyYW1zLT5uUG9ydEluZGV4ICE9IGtPdXRwdXRQb3J0SW5kZXgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobUJpdHJhdGUgIT0gcGFyYW1zLT5uRW5jb2RlQml0cmF0ZSkgeworICAgICAgICAgICAgICAgIG1CaXRyYXRlID0gcGFyYW1zLT5uRW5jb2RlQml0cmF0ZTsKKyAgICAgICAgICAgICAgICBtQml0cmF0ZVVwZGF0ZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OnNldENvbmZpZyhpbmRleCwgX3BhcmFtcyk7CisgICAgfQorfQorCitPTVhfRVJST1JUWVBFIFNvZnRBVkM6OmludGVybmFsU2V0Qml0cmF0ZVBhcmFtcygKKyAgICAgICAgY29uc3QgT01YX1ZJREVPX1BBUkFNX0JJVFJBVEVUWVBFICpiaXRyYXRlKSB7CisgICAgaWYgKGJpdHJhdGUtPm5Qb3J0SW5kZXggIT0ga091dHB1dFBvcnRJbmRleCkgeworICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKKyAgICB9CisKKyAgICBtQml0cmF0ZSA9IGJpdHJhdGUtPm5UYXJnZXRCaXRyYXRlOworICAgIG1CaXRyYXRlVXBkYXRlZCA9IHRydWU7CisKKyAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0QVZDOjpzZXRFbmNvZGVBcmdzKAorICAgICAgICBpdmVfdmlkZW9fZW5jb2RlX2lwX3QgKnBzX2VuY29kZV9pcCwKKyAgICAgICAgaXZlX3ZpZGVvX2VuY29kZV9vcF90ICpwc19lbmNvZGVfb3AsCisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbnB1dEJ1ZmZlckhlYWRlciwKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dHB1dEJ1ZmZlckhlYWRlcikgeworICAgIGl2X3Jhd19idWZfdCAqcHNfaW5wX3Jhd19idWY7CisgICAgY29uc3QgdWludDhfdCAqc291cmNlOworICAgIFVXT1JEOCAqcHUxX2J1ZjsKKworICAgIHBzX2lucF9yYXdfYnVmID0gJnBzX2VuY29kZV9pcC0+c19pbnBfYnVmOworICAgIHBzX2VuY29kZV9pcC0+c19vdXRfYnVmLnB2X2J1ZiA9IG91dHB1dEJ1ZmZlckhlYWRlci0+cEJ1ZmZlcjsKKyAgICBwc19lbmNvZGVfaXAtPnNfb3V0X2J1Zi51NF9ieXRlcyA9IDA7CisgICAgcHNfZW5jb2RlX2lwLT5zX291dF9idWYudTRfYnVmc2l6ZSA9IG91dHB1dEJ1ZmZlckhlYWRlci0+bkFsbG9jTGVuOworICAgIHBzX2VuY29kZV9pcC0+dTRfc2l6ZSA9IHNpemVvZihpdmVfdmlkZW9fZW5jb2RlX2lwX3QpOworICAgIHBzX2VuY29kZV9vcC0+dTRfc2l6ZSA9IHNpemVvZihpdmVfdmlkZW9fZW5jb2RlX29wX3QpOworCisgICAgcHNfZW5jb2RlX2lwLT5lX2NtZCA9IElWRV9DTURfVklERU9fRU5DT0RFOworICAgIHBzX2VuY29kZV9pcC0+cHZfYnVmcyA9IE5VTEw7CisgICAgcHNfZW5jb2RlX2lwLT5wdl9tYl9pbmZvID0gTlVMTDsKKyAgICBwc19lbmNvZGVfaXAtPnB2X3BpY19pbmZvID0gTlVMTDsKKyAgICBwc19lbmNvZGVfaXAtPnU0X21iX2luZm9fdHlwZSA9IDA7CisgICAgcHNfZW5jb2RlX2lwLT51NF9waWNfaW5mb190eXBlID0gMDsKKyAgICBwc19lbmNvZGVfb3AtPnNfb3V0X2J1Zi5wdl9idWYgPSBOVUxMOworCisgICAgLyogSW5pdGlhbGl6ZSBjb2xvciBmb3JtYXRzICovCisgICAgcHNfaW5wX3Jhd19idWYtPmVfY29sb3JfZm10ID0gbUl2VmlkZW9Db2xvckZvcm1hdDsKKworICAgIHNvdXJjZSA9IE5VTEw7CisgICAgaWYgKGlucHV0QnVmZmVySGVhZGVyKSB7CisgICAgICAgIHNvdXJjZSA9IGlucHV0QnVmZmVySGVhZGVyLT5wQnVmZmVyICsgaW5wdXRCdWZmZXJIZWFkZXItPm5PZmZzZXQ7CisKKyAgICAgICAgaWYgKG1JbnB1dERhdGFJc01ldGEpIHsKKyAgICAgICAgICAgIHNvdXJjZSA9IGV4dHJhY3RHcmFwaGljQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlciwgKG1XaWR0aCAqIG1IZWlnaHQgKiAzIC8gMiksIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXJIZWFkZXItPm5GaWxsZWRMZW4sIG1XaWR0aCwgbUhlaWdodCk7CisKKyAgICAgICAgICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJFcnJvciBpbiBleHRyYWN0R3JhcGhpY0J1ZmZlciIpOworICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCAwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHUxX2J1ZiA9IChVV09SRDggKilzb3VyY2U7CisgICAgc3dpdGNoIChtSXZWaWRlb0NvbG9yRm9ybWF0KSB7CisgICAgICAgIGNhc2UgSVZfWVVWXzQyMFA6CisgICAgICAgIHsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hcHZfYnVmc1swXSA9IHB1MV9idWY7CisgICAgICAgICAgICBwdTFfYnVmICs9IChtU3RyaWRlKSAqIG1IZWlnaHQ7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXB2X2J1ZnNbMV0gPSBwdTFfYnVmOworICAgICAgICAgICAgcHUxX2J1ZiArPSAobVN0cmlkZSAvIDIpICogbUhlaWdodCAvIDI7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXB2X2J1ZnNbMl0gPSBwdTFfYnVmOworCisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X3dkWzBdID0gbVdpZHRoOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF93ZFsxXSA9IG1XaWR0aCAvIDI7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X3dkWzJdID0gbVdpZHRoIC8gMjsKKworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9odFswXSA9IG1IZWlnaHQ7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X2h0WzFdID0gbUhlaWdodCAvIDI7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X2h0WzJdID0gbUhlaWdodCAvIDI7CisKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfc3RyZFswXSA9IG1TdHJpZGU7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X3N0cmRbMV0gPSAobVN0cmlkZSAvIDIpOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9zdHJkWzJdID0gKG1TdHJpZGUgLyAyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBJVl9ZVVZfNDIySUxFOgorICAgICAgICB7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXB2X2J1ZnNbMF0gPSBwdTFfYnVmOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF93ZFswXSA9IG1XaWR0aCAqIDI7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X2h0WzBdID0gbUhlaWdodDsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfc3RyZFswXSA9IG1TdHJpZGUgKiAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIElWX1lVVl80MjBTUF9VVjoKKyAgICAgICAgY2FzZSBJVl9ZVVZfNDIwU1BfVlU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hcHZfYnVmc1swXSA9IHB1MV9idWY7CisgICAgICAgICAgICBwdTFfYnVmICs9IChtU3RyaWRlKSAqIG1IZWlnaHQ7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXB2X2J1ZnNbMV0gPSBwdTFfYnVmOworCisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X3dkWzBdID0gbVdpZHRoOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF93ZFsxXSA9IG1XaWR0aDsKKworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9odFswXSA9IG1IZWlnaHQ7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X2h0WzFdID0gbUhlaWdodCAvIDI7CisKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfc3RyZFswXSA9IG1TdHJpZGU7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X3N0cmRbMV0gPSBtU3RyaWRlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwc19lbmNvZGVfaXAtPnU0X2lzX2xhc3QgPSAwOworCisgICAgaWYgKGlucHV0QnVmZmVySGVhZGVyKSB7CisgICAgICAgIHBzX2VuY29kZV9pcC0+dTRfdGltZXN0YW1wX2hpZ2ggPSAoaW5wdXRCdWZmZXJIZWFkZXItPm5UaW1lU3RhbXApID4+IDMyOworICAgICAgICBwc19lbmNvZGVfaXAtPnU0X3RpbWVzdGFtcF9sb3cgPSAoaW5wdXRCdWZmZXJIZWFkZXItPm5UaW1lU3RhbXApICYgMHhGRkZGRkZGRjsKKyAgICB9CisKKyAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKK30KKwordm9pZCBTb2Z0QVZDOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworICAgIFdPUkQzMiB0aW1lRGVsYXksIHRpbWVUYWtlbjsKKworICAgIFVOVVNFRChwb3J0SW5kZXgpOworCisgICAgLy8gSW5pdGlhbGl6ZSBlbmNvZGVyIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpemVkCisgICAgaWYgKG1Db2RlY0N0eCA9PSBOVUxMKSB7CisgICAgICAgIGlmIChPTVhfRXJyb3JOb25lICE9IGluaXRFbmNvZGVyKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBlbmNvZGVyIik7CisgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCAvKiBhcmcyICovLCBOVUxMIC8qIGRhdGEgKi8pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNhd0lucHV0RU9TKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJmluUXVldWUgPSBnZXRQb3J0UXVldWUoMCk7CisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZSgxKTsKKworICAgIHdoaWxlICghbVNhd0lucHV0RU9TICYmICFpblF1ZXVlLmVtcHR5KCkgJiYgIW91dFF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgT01YX0VSUk9SVFlQRSBlcnJvcjsKKyAgICAgICAgaXZlX3ZpZGVvX2VuY29kZV9pcF90IHNfZW5jb2RlX2lwOworICAgICAgICBpdmVfdmlkZW9fZW5jb2RlX29wX3Qgc19lbmNvZGVfb3A7CisKKyAgICAgICAgQnVmZmVySW5mbyAqaW5wdXRCdWZmZXJJbmZvID0gKmluUXVldWUuYmVnaW4oKTsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmlucHV0QnVmZmVySGVhZGVyID0gaW5wdXRCdWZmZXJJbmZvLT5tSGVhZGVyOworCisgICAgICAgIEJ1ZmZlckluZm8gKm91dHB1dEJ1ZmZlckluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dHB1dEJ1ZmZlckhlYWRlciA9IG91dHB1dEJ1ZmZlckluZm8tPm1IZWFkZXI7CisKKyAgICAgICAgaWYgKGlucHV0QnVmZmVySGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIGlucHV0QnVmZmVySW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGlucHV0QnVmZmVySGVhZGVyKTsKKworICAgICAgICAgICAgb3V0cHV0QnVmZmVySGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKKyAgICAgICAgICAgIG91dHB1dEJ1ZmZlckhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOworCisgICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIG91dHB1dEJ1ZmZlckluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dHB1dEJ1ZmZlckhlYWRlcik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBvdXRwdXRCdWZmZXJIZWFkZXItPm5UaW1lU3RhbXAgPSAwOworICAgICAgICBvdXRwdXRCdWZmZXJIZWFkZXItPm5GbGFncyA9IDA7CisgICAgICAgIG91dHB1dEJ1ZmZlckhlYWRlci0+bk9mZnNldCA9IDA7CisgICAgICAgIG91dHB1dEJ1ZmZlckhlYWRlci0+bkZpbGxlZExlbiA9IDA7CisgICAgICAgIG91dHB1dEJ1ZmZlckhlYWRlci0+bk9mZnNldCA9IDA7CisKKyAgICAgICAgdWludDhfdCAqb3V0UHRyID0gKHVpbnQ4X3QgKilvdXRwdXRCdWZmZXJIZWFkZXItPnBCdWZmZXI7CisKKyAgICAgICAgaWYgKCFtU3BzUHBzSGVhZGVyUmVjZWl2ZWQpIHsKKyAgICAgICAgICAgIGVycm9yID0gc2V0RW5jb2RlQXJncygmc19lbmNvZGVfaXAsICZzX2VuY29kZV9vcCwgTlVMTCwgb3V0cHV0QnVmZmVySGVhZGVyKTsKKyAgICAgICAgICAgIGlmIChlcnJvciAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2VuY29kZV9pcCwgJnNfZW5jb2RlX29wKTsKKworICAgICAgICAgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkVuY29kZSBGcmFtZSBmYWlsZWQgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc19lbmNvZGVfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dWKCJCeXRlcyBHZW5lcmF0ZWQgaW4gaGVhZGVyICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc19lbmNvZGVfb3Auc19vdXRfYnVmLnU0X2J5dGVzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVNwc1Bwc0hlYWRlclJlY2VpdmVkID0gdHJ1ZTsKKworICAgICAgICAgICAgb3V0cHV0QnVmZmVySGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRzsKKyAgICAgICAgICAgIG91dHB1dEJ1ZmZlckhlYWRlci0+bkZpbGxlZExlbiA9IHNfZW5jb2RlX29wLnNfb3V0X2J1Zi51NF9ieXRlczsKKyAgICAgICAgICAgIG91dHB1dEJ1ZmZlckhlYWRlci0+blRpbWVTdGFtcCA9IGlucHV0QnVmZmVySGVhZGVyLT5uVGltZVN0YW1wOworCisgICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIG91dHB1dEJ1ZmZlckluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgIERVTVBfVE9fRklMRSgKKyAgICAgICAgICAgICAgICAgICAgbU91dEZpbGUsIG91dHB1dEJ1ZmZlckhlYWRlci0+cEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVySGVhZGVyLT5uRmlsbGVkTGVuKTsKKyAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dHB1dEJ1ZmZlckhlYWRlcik7CisKKyAgICAgICAgICAgIHNldEVuY01vZGUoSVZFX0VOQ19NT0RFX1BJQ1RVUkUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1CaXRyYXRlVXBkYXRlZCkgeworICAgICAgICAgICAgc2V0Qml0UmF0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1LZXlGcmFtZVJlcXVlc3RlZCkgeworICAgICAgICAgICAgc2V0RnJhbWVUeXBlKElWX0lEUl9GUkFNRSk7CisgICAgICAgIH0KKworICAgICAgICBtUHJldlRpbWVzdGFtcFVzID0gaW5wdXRCdWZmZXJIZWFkZXItPm5UaW1lU3RhbXA7CisKKyAgICAgICAgaWYgKGlucHV0QnVmZmVySGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgICAgIG1TYXdJbnB1dEVPUyA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBlcnJvciA9IHNldEVuY29kZUFyZ3MoCisgICAgICAgICAgICAgICAgJnNfZW5jb2RlX2lwLCAmc19lbmNvZGVfb3AsIGlucHV0QnVmZmVySGVhZGVyLCBvdXRwdXRCdWZmZXJIZWFkZXIpOworICAgICAgICBpZiAoZXJyb3IgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCAwKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIERVTVBfVE9fRklMRSgKKyAgICAgICAgICAgICAgICBtSW5GaWxlLCBzX2VuY29kZV9pcC5zX2lucF9idWYuYXB2X2J1ZnNbMF0sCisgICAgICAgICAgICAgICAgKG1IZWlnaHQgKiBtU3RyaWRlICogMyAvIDIpKTsKKyAgICAgICAgLy9EVU1QX1RPX0ZJTEUobUluRmlsZSwgaW5wdXRCdWZmZXJIZWFkZXItPnBCdWZmZXIgKyBpbnB1dEJ1ZmZlckhlYWRlci0+bk9mZnNldCwKKyAgICAgICAgLy8gICAgaW5wdXRCdWZmZXJIZWFkZXItPm5GaWxsZWRMZW4pOworCisgICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIE5VTEwpOworICAgICAgICAvKiBDb21wdXRlIHRpbWUgZWxhcHNlZCBiZXR3ZWVuIGVuZCBvZiBwcmV2aW91cyBkZWNvZGUoKQorICAgICAgICAgKiB0byBzdGFydCBvZiBjdXJyZW50IGRlY29kZSgpICovCisgICAgICAgIFRJTUVfRElGRihtVGltZUVuZCwgbVRpbWVTdGFydCwgdGltZURlbGF5KTsKKworICAgICAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZW5jb2RlX2lwLCAmc19lbmNvZGVfb3ApOworCisgICAgICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICAgICAgQUxPR0UoIkVuY29kZSBGcmFtZSBmYWlsZWQgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICBzX2VuY29kZV9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgMCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBHRVRUSU1FKCZtVGltZUVuZCwgTlVMTCk7CisgICAgICAgIC8qIENvbXB1dGUgdGltZSB0YWtlbiBmb3IgZGVjb2RlKCkgKi8KKyAgICAgICAgVElNRV9ESUZGKG1UaW1lU3RhcnQsIG1UaW1lRW5kLCB0aW1lVGFrZW4pOworCisgICAgICAgIEFMT0dWKCJ0aW1lVGFrZW49JTZkIGRlbGF5PSU2ZCBudW1CeXRlcz0lNmQiLCB0aW1lVGFrZW4sIHRpbWVEZWxheSwKKyAgICAgICAgICAgICAgICBzX2VuY29kZV9vcC5zX291dF9idWYudTRfYnl0ZXMpOworCisKKyAgICAgICAgb3V0cHV0QnVmZmVySGVhZGVyLT5uRmxhZ3MgPSBpbnB1dEJ1ZmZlckhlYWRlci0+bkZsYWdzOworICAgICAgICBvdXRwdXRCdWZmZXJIZWFkZXItPm5GaWxsZWRMZW4gPSBzX2VuY29kZV9vcC5zX291dF9idWYudTRfYnl0ZXM7CisgICAgICAgIG91dHB1dEJ1ZmZlckhlYWRlci0+blRpbWVTdGFtcCA9IGlucHV0QnVmZmVySGVhZGVyLT5uVGltZVN0YW1wOworCisgICAgICAgIGlmIChJVl9JRFJfRlJBTUUKKyAgICAgICAgICAgICAgICA9PSBzX2VuY29kZV9vcC51NF9lbmNvZGVkX2ZyYW1lX3R5cGUpIHsKKyAgICAgICAgICAgIG91dHB1dEJ1ZmZlckhlYWRlci0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX1NZTkNGUkFNRTsKKyAgICAgICAgfQorCisgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgaW5wdXRCdWZmZXJJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisKKyAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGlucHV0QnVmZmVySGVhZGVyKTsKKworICAgICAgICBpZiAobVNhd0lucHV0RU9TKSB7CisgICAgICAgICAgICBvdXRwdXRCdWZmZXJIZWFkZXItPm5GbGFncyB8PSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgIH0KKworICAgICAgICBvdXRwdXRCdWZmZXJJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOworCisgICAgICAgIERVTVBfVE9fRklMRSgKKyAgICAgICAgICAgICAgICBtT3V0RmlsZSwgb3V0cHV0QnVmZmVySGVhZGVyLT5wQnVmZmVyLAorICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlckhlYWRlci0+bkZpbGxlZExlbik7CisgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dHB1dEJ1ZmZlckhlYWRlcik7CisKKyAgICB9CisgICAgcmV0dXJuOworfQorCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2FuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgT01YX1BUUiBhcHBEYXRhLCBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgeworICAgIHJldHVybiBuZXcgYW5kcm9pZDo6U29mdEFWQyhuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZTI2YTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuaApAQCAtMCwwICsxLDMwOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX1NPRlRfQVZDX0VOQ19IX18KKyNkZWZpbmUgX19TT0ZUX0FWQ19FTkNfSF9fCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworI2luY2x1ZGUgIlNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgTWVkaWFCdWZmZXI7CisKKyNkZWZpbmUgQ09ERUNfTUFYX0NPUkVTICAgICAgICAgIDQKKyNkZWZpbmUgTEVOX1NUQVRVU19CVUZGRVIgICAgICAgICgxMCAgKiAxMDI0KQorI2RlZmluZSBNQVhfVkJWX0JVRkZfU0laRSAgICAgICAgKDEyMCAqIDE2Mzg0KQorI2RlZmluZSBNQVhfTlVNX0lPX0JVRlMgICAgICAgICAgIDMKKworI2RlZmluZSBERUZBVUxUX01BWF9SRUZfRlJNICAgICAgICAgMQorI2RlZmluZSBERUZBVUxUX01BWF9SRU9SREVSX0ZSTSAgICAgMAorI2RlZmluZSBERUZBVUxUX1FQX01JTiAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgREVGQVVMVF9RUF9NQVggICAgICAgICAgICAgIDQwCisjZGVmaW5lIERFRkFVTFRfTUFYX0JJVFJBVEUgICAgICAgICAyMDAwMDAwMAorI2RlZmluZSBERUZBVUxUX01BWF9TUkNIX1JBTkdFX1ggICAgMjU2CisjZGVmaW5lIERFRkFVTFRfTUFYX1NSQ0hfUkFOR0VfWSAgICAyNTYKKyNkZWZpbmUgREVGQVVMVF9NQVhfRlJBTUVSQVRFICAgICAgIDEyMDAwMAorI2RlZmluZSBERUZBVUxUX05VTV9DT1JFUyAgICAgICAgICAgMQorI2RlZmluZSBERUZBVUxUX05VTV9DT1JFU19QUkVfRU5DICAgMAorI2RlZmluZSBERUZBVUxUX0ZQUyAgICAgICAgICAgICAgICAgMzAKKyNkZWZpbmUgREVGQVVMVF9FTkNfU1BFRUQgICAgICAgICAgIElWRV9OT1JNQUwKKworI2RlZmluZSBERUZBVUxUX01FTV9SRUNfQ05UICAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX1JFQ09OX0VOQUJMRSAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX0NIS1NVTV9FTkFCTEUgICAgICAgMAorI2RlZmluZSBERUZBVUxUX1NUQVJUX0ZSTSAgICAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX05VTV9GUk1TICAgICAgICAgICAgMHhGRkZGRkZGRgorI2RlZmluZSBERUZBVUxUX0lOUF9DT0xPUl9GT1JNQVQgICAgICAgSVZfWVVWXzQyMFNQX1ZVCisjZGVmaW5lIERFRkFVTFRfUkVDT05fQ09MT1JfRk9STUFUICAgICBJVl9ZVVZfNDIwUAorI2RlZmluZSBERUZBVUxUX0xPT1BCQUNLICAgICAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX1NSQ19GUkFNRV9SQVRFICAgICAgMzAKKyNkZWZpbmUgREVGQVVMVF9UR1RfRlJBTUVfUkFURSAgICAgIDMwCisjZGVmaW5lIERFRkFVTFRfTUFYX1dEICAgICAgICAgICAgICAxOTIwCisjZGVmaW5lIERFRkFVTFRfTUFYX0hUICAgICAgICAgICAgICAxOTIwCisjZGVmaW5lIERFRkFVTFRfTUFYX0xFVkVMICAgICAgICAgICA0MAorI2RlZmluZSBERUZBVUxUX1NUUklERSAgICAgICAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX1dEICAgICAgICAgICAgICAgICAgMTI4MAorI2RlZmluZSBERUZBVUxUX0hUICAgICAgICAgICAgICAgICAgNzIwCisjZGVmaW5lIERFRkFVTFRfUFNOUl9FTkFCTEUgICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfTUVfU1BFRUQgICAgICAgICAgICAxMDAKKyNkZWZpbmUgREVGQVVMVF9FTkFCTEVfRkFTVF9TQUQgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9FTkFCTEVfQUxUX1JFRiAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9SQ19NT0RFICAgICAgICAgICAgIElWRV9SQ19TVE9SQUdFCisjZGVmaW5lIERFRkFVTFRfQklUUkFURSAgICAgICAgICAgICA2MDAwMDAwCisjZGVmaW5lIERFRkFVTFRfSV9RUCAgICAgICAgICAgICAgICAyMgorI2RlZmluZSBERUZBVUxUX0lfUVBfTUFYICAgICAgICAgICAgREVGQVVMVF9RUF9NQVgKKyNkZWZpbmUgREVGQVVMVF9JX1FQX01JTiAgICAgICAgICAgIERFRkFVTFRfUVBfTUlOCisjZGVmaW5lIERFRkFVTFRfUF9RUCAgICAgICAgICAgICAgICAyOAorI2RlZmluZSBERUZBVUxUX1BfUVBfTUFYICAgICAgICAgICAgREVGQVVMVF9RUF9NQVgKKyNkZWZpbmUgREVGQVVMVF9QX1FQX01JTiAgICAgICAgICAgIERFRkFVTFRfUVBfTUlOCisjZGVmaW5lIERFRkFVTFRfQl9RUCAgICAgICAgICAgICAgICAyMgorI2RlZmluZSBERUZBVUxUX0JfUVBfTUFYICAgICAgICAgICAgREVGQVVMVF9RUF9NQVgKKyNkZWZpbmUgREVGQVVMVF9CX1FQX01JTiAgICAgICAgICAgIERFRkFVTFRfUVBfTUlOCisjZGVmaW5lIERFRkFVTFRfQUlSICAgICAgICAgICAgICAgICBJVkVfQUlSX01PREVfTk9ORQorI2RlZmluZSBERUZBVUxUX0FJUl9SRUZSRVNIX1BFUklPRCAgMzAKKyNkZWZpbmUgREVGQVVMVF9TUkNIX1JOR19YICAgICAgICAgIDY0CisjZGVmaW5lIERFRkFVTFRfU1JDSF9STkdfWSAgICAgICAgICA0OAorI2RlZmluZSBERUZBVUxUX0lfSU5URVJWQUwgICAgICAgICAgMzAKKyNkZWZpbmUgREVGQVVMVF9JRFJfSU5URVJWQUwgICAgICAgIDEwMDAKKyNkZWZpbmUgREVGQVVMVF9CX0ZSQU1FUyAgICAgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9ESVNBQkxFX0RFQkxLX0xFVkVMIDAKKyNkZWZpbmUgREVGQVVMVF9IUEVMICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVGQVVMVF9RUEVMICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVGQVVMVF9JNCAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVGQVVMVF9FUFJPRklMRSAgICAgICAgICAgIElWX1BST0ZJTEVfQkFTRQorI2RlZmluZSBERUZBVUxUX1NMSUNFX01PREUgICAgICAgICAgSVZFX1NMSUNFX01PREVfTk9ORQorI2RlZmluZSBERUZBVUxUX1NMSUNFX1BBUkFNICAgICAgICAgMjU2CisjZGVmaW5lIERFRkFVTFRfQVJDSCAgICAgICAgICAgICAgICBBUkNIX0FSTV9BOVEKKyNkZWZpbmUgREVGQVVMVF9TT0MgICAgICAgICAgICAgICAgIFNPQ19HRU5FUklDCisjZGVmaW5lIERFRkFVTFRfSU5UUkE0eDQgICAgICAgICAgICAwCisjZGVmaW5lIFNUUkxFTkdUSCAgICAgICAgICAgICAgICAgICA1MDAKKworCisKKyNkZWZpbmUgTUlOKGEsIGIpICgoYSkgPCAoYikpPyAoYSkgOiAoYikKKyNkZWZpbmUgTUFYKGEsIGIpICgoYSkgPiAoYikpPyAoYSkgOiAoYikKKyNkZWZpbmUgQUxJR04xNih4KSAoKCgoeCkgKyAxNSkgPj4gNCkgPDwgNCkKKyNkZWZpbmUgQUxJR04xMjgoeCkgKCgoKHgpICsgMTI3KSA+PiA3KSA8PCA3KQorI2RlZmluZSBBTElHTjQwOTYoeCkgKCgoKHgpICsgNDA5NSkgPj4gMTIpIDw8IDEyKQorCisvKiogVXNlZCB0byByZW1vdmUgd2FybmluZ3MgYWJvdXQgdW51c2VkIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgVU5VU0VEKHgpICgodm9pZCkoeCkpCisKKy8qKiBHZXQgdGltZSAqLworI2RlZmluZSBHRVRUSU1FKGEsIGIpIGdldHRpbWVvZmRheShhLCBiKTsKKworLyoqIENvbXB1dGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmQgKi8KKyNkZWZpbmUgVElNRV9ESUZGKHN0YXJ0LCBlbmQsIGRpZmYpIFwKKyAgICBkaWZmID0gKChlbmQudHZfc2VjIC0gc3RhcnQudHZfc2VjKSAqIDEwMDAwMDApICsgXAorICAgICAgICAgICAgKGVuZC50dl91c2VjIC0gc3RhcnQudHZfdXNlYyk7CisKKyNkZWZpbmUgaXZlX2FsaWduZWRfbWFsbG9jKGFsaWdubWVudCwgc2l6ZSkgbWVtYWxpZ24oYWxpZ25tZW50LCBzaXplKQorI2RlZmluZSBpdmVfYWxpZ25lZF9mcmVlKGJ1ZikgZnJlZShidWYpCisKK3N0cnVjdCBTb2Z0QVZDIDogcHVibGljIFNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQgeworICAgIFNvZnRBVkMoCisgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICAgICAgT01YX1BUUiBhcHBEYXRhLAorICAgICAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpOworCisgICAgLy8gT3ZlcnJpZGUgU2ltcGxlU29mdE9NWENvbXBvbmVudCBtZXRob2RzCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGludGVybmFsR2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpOworCisgICAgdmlydHVhbCB2b2lkIG9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+U29mdEFWQygpOworCitwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrTnVtQnVmZmVycyA9IDIsCisgICAgfTsKKworICAgIC8vIE9NWCBpbnB1dCBidWZmZXIncyB0aW1lc3RhbXAgYW5kIGZsYWdzCisgICAgdHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBpbnQ2NF90IG1UaW1lVXM7CisgICAgICAgIGludDMyX3QgbUZsYWdzOworICAgIH0gSW5wdXRCdWZmZXJJbmZvOworCisgICAgaW50MzJfdCAgbVN0cmlkZTsKKworICAgIHVpbnQzMl90IG1GcmFtZVJhdGU7CisKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZVN0YXJ0OyAgIC8vIFRpbWUgYXQgdGhlIHN0YXJ0IG9mIGRlY29kZSgpCisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVFbmQ7ICAgICAvLyBUaW1lIGF0IHRoZSBlbmQgb2YgZGVjb2RlKCkKKworCisgICAgLy8gSWYgYSByZXF1ZXN0IGZvciBhIGNoYW5nZSBpdCBiaXRyYXRlIGhhcyBiZWVuIHJlY2VpdmVkLgorICAgIGJvb2wgbUJpdHJhdGVVcGRhdGVkOworCisgICAgYm9vbCBtS2V5RnJhbWVSZXF1ZXN0ZWQ7CisKKyNpZmRlZiBGSUxFX0RVTVBfRU5BQkxFCisgICAgY2hhciBtSW5GaWxlWzIwMF07CisgICAgY2hhciBtT3V0RmlsZVsyMDBdOworI2VuZGlmIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKworICAgIElWX0NPTE9SX0ZPUk1BVF9UIG1JdlZpZGVvQ29sb3JGb3JtYXQ7CisKKyAgICBpbnQzMl90ICBtSURSRnJhbWVSZWZyZXNoSW50ZXJ2YWxJblNlYzsKKyAgICBJVl9QUk9GSUxFX1QgbUFWQ0VuY1Byb2ZpbGU7CisgICAgV09SRDMyICAgbUFWQ0VuY0xldmVsOworICAgIGludDY0X3QgIG1OdW1JbnB1dEZyYW1lczsKKyAgICBpbnQ2NF90ICBtUHJldlRpbWVzdGFtcFVzOworICAgIGJvb2wgICAgIG1TdGFydGVkOworICAgIGJvb2wgICAgIG1TcHNQcHNIZWFkZXJSZWNlaXZlZDsKKworICAgIGJvb2wgICAgIG1TYXdJbnB1dEVPUzsKKyAgICBib29sICAgICBtU2lnbmFsbGVkRXJyb3I7CisgICAgYm9vbCAgICAgbUludHJhNHg0OworICAgIGJvb2wgICAgIG1FbmFibGVGYXN0U2FkOworICAgIGJvb2wgICAgIG1FbmFibGVBbHRSZWY7CisgICAgYm9vbCAgICBtUmVjb25FbmFibGU7CisgICAgYm9vbCAgICBtUFNOUkVuYWJsZTsKKyAgICBJVkVfU1BFRURfQ09ORklHICAgICBtRW5jU3BlZWQ7CisKKyAgICB1aW50OF90ICptQ29udmVyc2lvbkJ1ZmZlcjsKKworICAgIGl2X29ial90ICptQ29kZWNDdHg7ICAgICAgICAgLy8gQ29kZWMgY29udGV4dAorICAgIGl2X21lbV9yZWNfdCAqbU1lbVJlY29yZHM7ICAgLy8gTWVtb3J5IHJlY29yZHMgcmVxdWVzdGVkIGJ5IHRoZSBjb2RlYworICAgIHNpemVfdCBtTnVtTWVtUmVjb3JkczsgICAgICAgLy8gTnVtYmVyIG9mIG1lbW9yeSByZWNvcmRzIHJlcXVlc3RlZCBieSBjb2RlYworICAgIHNpemVfdCBtTnVtQ29yZXM7ICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGNvcmVzIHVzZWQgYnkgdGhlIGNvZGVjCisKKyAgICBVV09SRDMyIG1IZWFkZXJHZW5lcmF0ZWQ7CisKKyAgICBJVl9BUkNIX1QgbUFyY2g7CisgICAgSVZFX1NMSUNFX01PREVfVCBtU2xpY2VNb2RlOworICAgIFVXT1JEMzIgbVNsaWNlUGFyYW07CisgICAgYm9vbCBtSGFsZlBlbEVuYWJsZTsKKyAgICBVV09SRDMyIG1JSW50ZXJ2YWw7CisgICAgVVdPUkQzMiBtSURSSW50ZXJ2YWw7CisgICAgVVdPUkQzMiBtRGlzYWJsZURlYmxrTGV2ZWw7CisgICAgSVZFX0FJUl9NT0RFX1QgbUFJUk1vZGU7CisgICAgVVdPUkQzMiBtQUlSUmVmcmVzaFBlcmlvZDsKKworICAgIE9NWF9FUlJPUlRZUEUgaW5pdEVuY1BhcmFtcygpOworICAgIE9NWF9FUlJPUlRZUEUgaW5pdEVuY29kZXIoKTsKKyAgICBPTVhfRVJST1JUWVBFIHJlbGVhc2VFbmNvZGVyKCk7CisKKyAgICAvLyBWZXJpZmllcyB0aGUgY29tcG9uZW50IHJvbGUgdHJpZWQgdG8gYmUgc2V0IHRvIHRoaXMgT01YIGNvbXBvbmVudCBpcworICAgIC8vIHN0cmljdGx5IHZpZGVvX2VuY29kZXIuYXZjCisgICAgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldFJvbGVQYXJhbXMoCisgICAgICAgIGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqcm9sZSk7CisKKyAgICAvLyBVcGRhdGVzIGJpdHJhdGUgdG8gcmVmbGVjdCBwb3J0IHNldHRpbmdzLgorICAgIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRCaXRyYXRlUGFyYW1zKAorICAgICAgICBjb25zdCBPTVhfVklERU9fUEFSQU1fQklUUkFURVRZUEUgKmJpdHJhdGUpOworCisgICAgT01YX0VSUk9SVFlQRSBzZXRDb25maWcoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgX3BhcmFtcyk7CisKKyAgICAvLyBIYW5kbGVzIHBvcnQgZGVmaW5pdGlvbiBjaGFuZ2VzLgorICAgIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRQb3J0UGFyYW1zKAorICAgICAgICBjb25zdCBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpwb3J0KTsKKworICAgIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRGb3JtYXRQYXJhbXMoCisgICAgICAgIGNvbnN0IE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0KTsKKworICAgIE9NWF9FUlJPUlRZUEUgc2V0RnJhbWVUeXBlKElWX1BJQ1RVUkVfQ09ESU5HX1RZUEVfVCAgZV9mcmFtZV90eXBlKTsKKyAgICBPTVhfRVJST1JUWVBFIHNldFFwKCk7CisgICAgT01YX0VSUk9SVFlQRSBzZXRFbmNNb2RlKElWRV9FTkNfTU9ERV9UIGVfZW5jX21vZGUpOworICAgIE9NWF9FUlJPUlRZUEUgc2V0RGltZW5zaW9ucygpOworICAgIE9NWF9FUlJPUlRZUEUgc2V0TnVtQ29yZXMoKTsKKyAgICBPTVhfRVJST1JUWVBFIHNldEZyYW1lUmF0ZSgpOworICAgIE9NWF9FUlJPUlRZUEUgc2V0SXBlUGFyYW1zKCk7CisgICAgT01YX0VSUk9SVFlQRSBzZXRCaXRSYXRlKCk7CisgICAgT01YX0VSUk9SVFlQRSBzZXRBaXJQYXJhbXMoKTsKKyAgICBPTVhfRVJST1JUWVBFIHNldE1lUGFyYW1zKCk7CisgICAgT01YX0VSUk9SVFlQRSBzZXRHb3BQYXJhbXMoKTsKKyAgICBPTVhfRVJST1JUWVBFIHNldFByb2ZpbGVQYXJhbXMoKTsKKyAgICBPTVhfRVJST1JUWVBFIHNldERlYmxvY2tQYXJhbXMoKTsKKyAgICBPTVhfRVJST1JUWVBFIHNldFZidlBhcmFtcygpOworICAgIHZvaWQgbG9nVmVyc2lvbigpOworICAgIE9NWF9FUlJPUlRZUEUgc2V0RW5jb2RlQXJncygKKyAgICAgICAgaXZlX3ZpZGVvX2VuY29kZV9pcF90ICpwc19lbmNvZGVfaXAsCisgICAgICAgIGl2ZV92aWRlb19lbmNvZGVfb3BfdCAqcHNfZW5jb2RlX29wLAorICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5wdXRCdWZmZXJIZWFkZXIsCisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRwdXRCdWZmZXJIZWFkZXIpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdEFWQyk7Cit9OworCisjaWZkZWYgRklMRV9EVU1QX0VOQUJMRQorCisjZGVmaW5lIElOUFVUX0RVTVBfUEFUSCAgICAgIi9zZGNhcmQvbWVkaWEvYXZjZV9pbnB1dCIKKyNkZWZpbmUgSU5QVVRfRFVNUF9FWFQgICAgICAieXV2IgorI2RlZmluZSBPVVRQVVRfRFVNUF9QQVRIICAgICIvc2RjYXJkL21lZGlhL2F2Y2Vfb3V0cHV0IgorI2RlZmluZSBPVVRQVVRfRFVNUF9FWFQgICAgICJoMjY0IgorCisjZGVmaW5lIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0cmNweShtSW5GaWxlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3ByaW50ZihtSW5GaWxlLCAiJXNfJWxkLiVsZC4lcyIsIElOUFVUX0RVTVBfUEFUSCwgIFwKKyAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfc2VjLCBtVGltZVN0YXJ0LnR2X3VzZWMsICAgICAgXAorICAgICAgICAgICAgSU5QVVRfRFVNUF9FWFQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RyY3B5KG1PdXRGaWxlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcHJpbnRmKG1PdXRGaWxlLCAiJXNfJWxkLiVsZC4lcyIsIE9VVFBVVF9EVU1QX1BBVEgsXAorICAgICAgICAgICAgbVRpbWVTdGFydC50dl9zZWMsIG1UaW1lU3RhcnQudHZfdXNlYywgICAgICBcCisgICAgICAgICAgICBPVVRQVVRfRFVNUF9FWFQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDUkVBVEVfRFVNUF9GSUxFKG1fZmlsZW5hbWUpIHsgICAgICAgICAgICAgICAgICBcCisgICAgRklMRSAqZnAgPSBmb3BlbihtX2ZpbGVuYW1lLCAid2IiKTsgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZnAgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBTE9HRCgiT3BlbmVkIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTsgICAgICAgICAgICBcCisgICAgICAgIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBTE9HRCgiQ291bGQgbm90IG9wZW4gZmlsZSAlcyIsIG1fZmlsZW5hbWUpOyAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNkZWZpbmUgRFVNUF9UT19GSUxFKG1fZmlsZW5hbWUsIG1fYnVmLCBtX3NpemUpICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRklMRSAqZnAgPSBmb3BlbihtX2ZpbGVuYW1lLCAiYWIiKTsgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZnAgIT0gTlVMTCAmJiBtX2J1ZiAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGkgPSBmd3JpdGUobV9idWYsIDEsIG1fc2l6ZSwgZnApOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoImZ3cml0ZSByZXQgJWQgdG8gd3JpdGUgJWQiLCBpLCBtX3NpemUpOyAgXAorICAgICAgICBpZiAoaSAhPSAoaW50KW1fc2l6ZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiRXJyb3IgaW4gZndyaXRlLCByZXR1cm5lZCAlZCIsIGkpOyAgIFwKKyAgICAgICAgICAgIHBlcnJvcigiRXJyb3IgaW4gd3JpdGUgdG8gZmlsZSIpOyAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBTE9HRCgiQ291bGQgbm90IHdyaXRlIHRvIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTtcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNlbHNlIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKyNkZWZpbmUgSU5QVVRfRFVNUF9QQVRICisjZGVmaW5lIElOUFVUX0RVTVBfRVhUCisjZGVmaW5lIE9VVFBVVF9EVU1QX1BBVEgKKyNkZWZpbmUgT1VUUFVUX0RVTVBfRVhUCisjZGVmaW5lIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKQorI2RlZmluZSBDUkVBVEVfRFVNUF9GSUxFKG1fZmlsZW5hbWUpCisjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplKQorI2VuZGlmIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBfX1NPRlRfQVZDX0VOQ19IX18KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5jcHAKaW5kZXggZTFlZTNhOS4uY2FjZWRhOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5jcHAKQEAgLTQ0Nyw3ICs0NDcsNiBAQAogICAgIH0KIAogICAgIEZMQUNfX2Jvb2wgb2sgPSB0cnVlOwotICAgIEZMQUNfX1N0cmVhbUVuY29kZXJJbml0U3RhdHVzIGluaXRTdGF0dXMgPSBGTEFDX19TVFJFQU1fRU5DT0RFUl9JTklUX1NUQVRVU19PSzsKICAgICBvayA9IG9rICYmIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9jaGFubmVscyhtRmxhY1N0cmVhbUVuY29kZXIsIG1OdW1DaGFubmVscyk7CiAgICAgb2sgPSBvayAmJiBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfc2FtcGxlX3JhdGUobUZsYWNTdHJlYW1FbmNvZGVyLCBtU2FtcGxlUmF0ZSk7CiAgICAgb2sgPSBvayAmJiBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfYml0c19wZXJfc2FtcGxlKG1GbGFjU3RyZWFtRW5jb2RlciwgMTYpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5jcHAKaW5kZXggNjE3ZjNkZS4uM2RlOTVhNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuY3BwCkBAIC00MSw4ICs0MSw5IEBACiAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KQogICAgIDogU2ltcGxlU29mdE9NWENvbXBvbmVudChuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCksCiAgICAgICBtSXNNTGF3KHRydWUpLAorICAgICAgbVNpZ25hbGxlZEVycm9yKGZhbHNlKSwKICAgICAgIG1OdW1DaGFubmVscygxKSwKLSAgICAgIG1TaWduYWxsZWRFcnJvcihmYWxzZSkgeworICAgICAgbVNhbXBsaW5nUmF0ZSg4MDAwKSB7CiAgICAgaWYgKCFzdHJjbXAobmFtZSwgIk9NWC5nb29nbGUuZzcxMS5hbGF3LmRlY29kZXIiKSkgewogICAgICAgICBtSXNNTGF3ID0gZmFsc2U7CiAgICAgfSBlbHNlIHsKQEAgLTEzMyw3ICsxMzQsNyBAQAogICAgICAgICAgICAgcGNtUGFyYW1zLT5lQ2hhbm5lbE1hcHBpbmdbMV0gPSBPTVhfQVVESU9fQ2hhbm5lbFJGOwogCiAgICAgICAgICAgICBwY21QYXJhbXMtPm5DaGFubmVscyA9IG1OdW1DaGFubmVsczsKLSAgICAgICAgICAgIHBjbVBhcmFtcy0+blNhbXBsaW5nUmF0ZSA9IDgwMDA7CisgICAgICAgICAgICBwY21QYXJhbXMtPm5TYW1wbGluZ1JhdGUgPSBtU2FtcGxpbmdSYXRlOwogCiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQpAQCAtMTY3LDYgKzE2OCw4IEBACiAgICAgICAgICAgICAgICAgbU51bUNoYW5uZWxzID0gcGNtUGFyYW1zLT5uQ2hhbm5lbHM7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIG1TYW1wbGluZ1JhdGUgPSBwY21QYXJhbXMtPm5TYW1wbGluZ1JhdGU7CisKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmgKaW5kZXggYmZmMGM2OC4uMTZiNjM0MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmgKQEAgLTQ2LDggKzQ2LDkgQEAKICAgICB9OwogCiAgICAgYm9vbCBtSXNNTGF3OwotICAgIE9NWF9VMzIgbU51bUNoYW5uZWxzOwogICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIE9NWF9VMzIgbU51bUNoYW5uZWxzOworICAgIGludDMyX3QgbVNhbXBsaW5nUmF0ZTsKIAogICAgIHZvaWQgaW5pdFBvcnRzKCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvU29mdEdTTS5jcHAKaW5kZXggODdiMTRmZS4uNzkxNmM0NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvU29mdEdTTS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvU29mdEdTTS5jcHAKQEAgLTM0LDYgKzM0LDkgQEAKICAgICBwYXJhbXMtPm5WZXJzaW9uLnMublN0ZXAgPSAwOwogfQogCisvLyBNaWNyb3NvZnQgV0FWIEdTTSBlbmNvZGluZyBwYWNrcyB0d28gR1NNIGZyYW1lcyBpbnRvIDY1IGJ5dGVzLgorc3RhdGljIGNvbnN0IGludCBrTVNHU01GcmFtZVNpemUgPSA2NTsKKwogU29mdEdTTTo6U29mdEdTTSgKICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKICAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLApAQCAtNjQsNyArNjcsNyBAQAogICAgIGRlZi5lRGlyID0gT01YX0RpcklucHV0OwogICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtQnVmZmVyczsKICAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsID0gZGVmLm5CdWZmZXJDb3VudE1pbjsKLSAgICBkZWYubkJ1ZmZlclNpemUgPSBzaXplb2YoZ3NtX2ZyYW1lKTsKKyAgICBkZWYubkJ1ZmZlclNpemUgPSAxMDI0IC8ga01TR1NNRnJhbWVTaXplICoga01TR1NNRnJhbWVTaXplOwogICAgIGRlZi5iRW5hYmxlZCA9IE9NWF9UUlVFOwogICAgIGRlZi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOwogICAgIGRlZi5lRG9tYWluID0gT01YX1BvcnREb21haW5BdWRpbzsKQEAgLTIxOSw4ICsyMjIsOCBAQAogICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKICAgICAgICAgfQogCi0gICAgICAgIGlmKCgoaW5IZWFkZXItPm5GaWxsZWRMZW4gLyA2NSkgKiA2NSkgIT0gaW5IZWFkZXItPm5GaWxsZWRMZW4pIHsKLSAgICAgICAgICAgIEFMT0dFKCJpbnB1dCBidWZmZXIgbm90IG11bHRpcGxlIG9mIDY1ICglZCkuIiwgaW5IZWFkZXItPm5GaWxsZWRMZW4pOworICAgICAgICBpZigoKGluSGVhZGVyLT5uRmlsbGVkTGVuIC8ga01TR1NNRnJhbWVTaXplKSAqIGtNU0dTTUZyYW1lU2l6ZSkgIT0gaW5IZWFkZXItPm5GaWxsZWRMZW4pIHsKKyAgICAgICAgICAgIEFMT0dFKCJpbnB1dCBidWZmZXIgbm90IG11bHRpcGxlIG9mICVkICglZCkuIiwga01TR1NNRnJhbWVTaXplLCBpbkhlYWRlci0+bkZpbGxlZExlbik7CiAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CiAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwogICAgICAgICB9CkBAIC0yNzAsNiArMjczLDI1IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAordm9pZCBTb2Z0R1NNOjpvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCkgeworICAgIGlmIChwb3J0SW5kZXggPT0gMCkgeworICAgICAgICBnc21fZGVzdHJveShtR3NtKTsKKyAgICAgICAgbUdzbSA9IGdzbV9jcmVhdGUoKTsKKyAgICAgICAgaW50IG1zb3B0ID0gMTsKKyAgICAgICAgZ3NtX29wdGlvbihtR3NtLCBHU01fT1BUX1dBVjQ5LCAmbXNvcHQpOworICAgIH0KK30KKwordm9pZCBTb2Z0R1NNOjpvblJlc2V0KCkgeworICAgIGdzbV9kZXN0cm95KG1Hc20pOworICAgIG1Hc20gPSBnc21fY3JlYXRlKCk7CisgICAgaW50IG1zb3B0ID0gMTsKKyAgICBnc21fb3B0aW9uKG1Hc20sIEdTTV9PUFRfV0FWNDksICZtc29wdCk7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7Cit9CisKKworCiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uaAppbmRleCA4YWI2MTE2Li4wMzAzZGVhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvU29mdEdTTS5oCkBAIC00Myw2ICs0Myw5IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgb25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCk7CiAKKyAgICB2aXJ0dWFsIHZvaWQgb25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpOworICAgIHZpcnR1YWwgdm9pZCBvblJlc2V0KCk7CisKIHByaXZhdGU6CiAgICAgZW51bSB7CiAgICAgICAgIGtOdW1CdWZmZXJzID0gNCwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2ZpbmRfbWluX21heC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9maW5kX21pbl9tYXguY3BwCmluZGV4IGEzNTdlYTYuLjFhYzg4YTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2ZpbmRfbWluX21heC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZmluZF9taW5fbWF4LmNwcApAQCAtMTM4LDggKzEzOCw4IEBACiAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcwogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHJlZ2lzdGVyICAgIHVpbnQgICAgaSwgajsKLSAgICByZWdpc3RlciAgICBpbnQgbWluLCBtYXg7CisgICAgdWludCAgICBpLCBqOworICAgIGludCBtaW4sIG1heDsKIAogICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIDsgRnVuY3Rpb24gYm9keSBoZXJlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL0FuZHJvaWQubWsKaW5kZXggYzkwMDZkOS4uNzExNzY5MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvQW5kcm9pZC5tawpAQCAtMjUsNyArMjUsNyBAQAogCiBMT0NBTF9DRkxBR1MgOj0gXAogICAgIC1EQlhfUkMgXAotICAgIC1ET1NDTF9JTVBPUlRfUkVGPSAtRE9TQ0xfVU5VU0VEX0FSRz0gLURPU0NMX0VYUE9SVF9SRUY9CisgICAgLURPU0NMX0lNUE9SVF9SRUY9IC1EIk9TQ0xfVU5VU0VEX0FSRyh4KT0odm9pZCkoeCkiIC1ET1NDTF9FWFBPUlRfUkVGPQogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKICAgICAkKExPQ0FMX1BBVEgpL3NyYyBcCkBAIC01NSw3ICs1NSw3IEBACiAKIExPQ0FMX0NGTEFHUyA6PSBcCiAgICAgLURCWF9SQyBcCi0gICAgLURPU0NMX0lNUE9SVF9SRUY9IC1ET1NDTF9VTlVTRURfQVJHPSAtRE9TQ0xfRVhQT1JUX1JFRj0KKyAgICAtRE9TQ0xfSU1QT1JUX1JFRj0gLUQiT1NDTF9VTlVTRURfQVJHKHgpPSh2b2lkKSh4KSIgLURPU0NMX0VYUE9SVF9SRUY9CiAKIAogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmNwcAppbmRleCAzYmQyZTFhLi43NjM4YmI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5jcHAKQEAgLTQ0NiwxMyArNDQ2LDYgQEAKICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuID4gMCkgewogICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW5wdXREYXRhID0gTlVMTDsKICAgICAgICAgICAgIGlmIChtSW5wdXREYXRhSXNNZXRhKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuICE9IDgpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk1ldGFEYXRhIGJ1ZmZlciBpcyB3cm9uZyBzaXplISAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIihnb3QgJXUgYnl0ZXMsIGV4cGVjdGVkIDgpIiwgaW5IZWFkZXItPm5GaWxsZWRMZW4pOwotICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaW5wdXREYXRhID0KICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdEdyYXBoaWNCdWZmZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0RnJhbWVEYXRhLCAobVdpZHRoICogbUhlaWdodCAqIDMpID4+IDEsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5oCmluZGV4IDI1ZWNkYzkuLjMzODljMzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5oCkBAIC0yNiw3ICsyNiw2IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBDb2RlY1Byb2ZpbGVMZXZlbDsKLXN0cnVjdCBNZWRpYUJ1ZmZlcjsKIAogc3RydWN0IFNvZnRNUEVHNEVuY29kZXIgOiBwdWJsaWMgU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudCB7CiAgICAgU29mdE1QRUc0RW5jb2RlcigKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2RjdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9kY3QuY3BwCmluZGV4IGZhNGFlMjMuLjhkN2Q5ZjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2RjdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZGN0LmNwcApAQCAtMjY3LDcgKzI2Nyw3IEBACiAgICAgVm9pZCBCbG9jazR4NERDVF9BQU53U3ViKFNob3J0ICpvdXQsIFVDaGFyICpjdXIsIFVDaGFyICpwcmVkLCBJbnQgd2lkdGgpCiAgICAgewogICAgICAgICBTaG9ydCAqZHN0OwotICAgICAgICByZWdpc3RlciBJbnQgazAsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3OworICAgICAgICBJbnQgazAsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3OwogICAgICAgICBJbnQgcm91bmQ7CiAgICAgICAgIEludCBrMTIgPSAweDAyMkEwMkQ0OwogICAgICAgICBJbnQgazE0ID0gMHgwMTg4MDUzQTsKQEAgLTQ3Myw3ICs0NzMsNyBAQAogICAgIFZvaWQgQmxvY2syeDJEQ1RfQUFOd1N1YihTaG9ydCAqb3V0LCBVQ2hhciAqY3VyLCBVQ2hhciAqcHJlZCwgSW50IHdpZHRoKQogICAgIHsKICAgICAgICAgU2hvcnQgKmRzdDsKLSAgICAgICAgcmVnaXN0ZXIgSW50IGswLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNzsKKyAgICAgICAgSW50IGswLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNzsKICAgICAgICAgSW50IHJvdW5kOwogICAgICAgICBJbnQgazEyID0gMHgwMjJBMDJENDsKICAgICAgICAgSW50IGsxNCA9IDB4MDE4ODAzQjI7CkBAIC04NjMsNyArODYzLDcgQEAKICAgICBWb2lkIEJsb2NrNHg0RENUX0FBTkludHJhKFNob3J0ICpvdXQsIFVDaGFyICpjdXIsIFVDaGFyICpkdW1teTIsIEludCB3aWR0aCkKICAgICB7CiAgICAgICAgIFNob3J0ICpkc3Q7Ci0gICAgICAgIHJlZ2lzdGVyIEludCBrMCwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazc7CisgICAgICAgIEludCBrMCwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazc7CiAgICAgICAgIEludCByb3VuZDsKICAgICAgICAgSW50IGsxMiA9IDB4MDIyQTAyRDQ7CiAgICAgICAgIEludCBrMTQgPSAweDAxODgwNTNBOwpAQCAtMTA1MCw3ICsxMDUwLDcgQEAKICAgICBWb2lkIEJsb2NrMngyRENUX0FBTkludHJhKFNob3J0ICpvdXQsIFVDaGFyICpjdXIsIFVDaGFyICpkdW1teTIsIEludCB3aWR0aCkKICAgICB7CiAgICAgICAgIFNob3J0ICpkc3Q7Ci0gICAgICAgIHJlZ2lzdGVyIEludCBrMCwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazc7CisgICAgICAgIEludCBrMCwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazc7CiAgICAgICAgIEludCByb3VuZDsKICAgICAgICAgSW50IGsxMiA9IDB4MDIyQTAyRDQ7CiAgICAgICAgIEludCBrMTQgPSAweDAxODgwM0IyOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvdmxjX2VuY29kZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy92bGNfZW5jb2RlLmNwcAppbmRleCA3ZWE1ZGM0Li4yYWVjODE1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy92bGNfZW5jb2RlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy92bGNfZW5jb2RlLmNwcApAQCAtMjcxLDcgKzI3MSw3IEBACiAgICAgSW50IGluZDsKICAgICBJbnQgbGVuZ3RoOwogCi0gICAgaWYgKChpbnRyYSA9PSAwKSkKKyAgICBpZiAoaW50cmEgPT0gMCkKICAgICAgICAgY2JweSA9IDE1IC0gY2JweTsKIAogICAgIGluZCA9IGNicHk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL0FuZHJvaWQubWsKaW5kZXggODI4NDQ5MC4uOTQ4YWUyOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5tawpAQCAtNDgsNyArNDgsNyBAQAogICAgICAgICAkKExPQ0FMX1BBVEgpL2luY2x1ZGUKIAogTE9DQUxfQ0ZMQUdTIDo9IFwKLSAgICAgICAgLURPU0NMX1VOVVNFRF9BUkc9CisgICAgICAgIC1EIk9TQ0xfVU5VU0VEX0FSRyh4KT0odm9pZCkoeCkiCiAKIExPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNiMTI2ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjcgQEAKK2lmZXEgKCQoaWYgJCh3aWxkY2FyZCBleHRlcm5hbC9saWJtcGVnMiksMSwwKSwxKQorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFICAgICAgICAgICAgOj0gbGlic3RhZ2VmcmlnaHRfc29mdF9tcGVnMmRlYworTE9DQUxfTU9EVUxFX1RBR1MgICAgICAgOj0gb3B0aW9uYWwKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyAgOj0gbGlibXBlZzJkZWMKK0xPQ0FMX1NSQ19GSUxFUyAgICAgICAgIDo9IFNvZnRNUEVHMi5jcHAKKworTE9DQUxfQ19JTkNMVURFUyA6PSAkKFRPUCkvZXh0ZXJuYWwvbGlibXBlZzIvZGVjb2RlcgorTE9DQUxfQ19JTkNMVURFUyArPSAkKFRPUCkvZXh0ZXJuYWwvbGlibXBlZzIvY29tbW9uCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICA6PSBsaWJzdGFnZWZyaWdodAorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyAgKz0gbGlic3RhZ2VmcmlnaHRfb214CitMT0NBTF9TSEFSRURfTElCUkFSSUVTICArPSBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICArPSBsaWJ1dGlscworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyAgKz0gbGlibG9nCisKK0xPQ0FMX0xERkxBR1MgOj0gLVdsLC1Cc3ltYm9saWMKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL1NvZnRNUEVHMi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvU29mdE1QRUcyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTk4OTI4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL1NvZnRNUEVHMi5jcHAKQEAgLTAsMCArMSw3NzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU29mdE1QRUcyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiaXZfZGF0YXR5cGVkZWYuaCIKKyNpbmNsdWRlICJpdi5oIgorI2luY2x1ZGUgIml2ZC5oIgorI2luY2x1ZGUgIml0aHJlYWQuaCIKKyNpbmNsdWRlICJpbXBlZzJkLmgiCisjaW5jbHVkZSAiU29mdE1QRUcyLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPE9NWF9WaWRlb0V4dC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNkZWZpbmUgY29tcG9uZW50TmFtZSAgICAgICAgICAgICAgICAgICAidmlkZW9fZGVjb2Rlci5tcGVnMiIKKyNkZWZpbmUgY29kaW5nVHlwZSAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fQ29kaW5nTVBFRzIKKyNkZWZpbmUgQ09ERUNfTUlNRV9UWVBFICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMgorCisvKiogRnVuY3Rpb24gYW5kIHN0cnVjdHVyZSBkZWZpbml0aW9ucyB0byBrZWVwIGNvZGUgc2ltaWxhciBmb3IgZWFjaCBjb2RlYyAqLworI2RlZmluZSBpdmRlY19hcGlfZnVuY3Rpb24gICAgICAgICAgICAgIGltcGVnMmRfYXBpX2Z1bmN0aW9uCisjZGVmaW5lIGl2ZGV4dF9pbml0X2lwX3QgICAgICAgICAgICAgICAgaW1wZWcyZF9pbml0X2lwX3QKKyNkZWZpbmUgaXZkZXh0X2luaXRfb3BfdCAgICAgICAgICAgICAgICBpbXBlZzJkX2luaXRfb3BfdAorI2RlZmluZSBpdmRleHRfZmlsbF9tZW1fcmVjX2lwX3QgICAgICAgIGltcGVnMmRfZmlsbF9tZW1fcmVjX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2ZpbGxfbWVtX3JlY19vcF90ICAgICAgICBpbXBlZzJkX2ZpbGxfbWVtX3JlY19vcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90ICAgaW1wZWcyZF9jdGxfc2V0X251bV9jb3Jlc19pcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90ICAgaW1wZWcyZF9jdGxfc2V0X251bV9jb3Jlc19vcF90CisKKyNkZWZpbmUgSVZERVhUX0NNRF9DVExfU0VUX05VTV9DT1JFUyAgICBcCisgICAgICAgIChJVkRfQ09OVFJPTF9BUElfQ09NTUFORF9UWVBFX1QpSU1QRUcyRF9DTURfQ1RMX1NFVF9OVU1fQ09SRVMKKworc3RhdGljIGNvbnN0IENvZGVjUHJvZmlsZUxldmVsIGtQcm9maWxlTGV2ZWxzW10gPSB7CisgICAgeyBPTVhfVklERU9fTVBFRzJQcm9maWxlU2ltcGxlLCBPTVhfVklERU9fTVBFRzJMZXZlbExMICB9LAorICAgIHsgT01YX1ZJREVPX01QRUcyUHJvZmlsZVNpbXBsZSwgT01YX1ZJREVPX01QRUcyTGV2ZWxNTCAgfSwKKyAgICB7IE9NWF9WSURFT19NUEVHMlByb2ZpbGVTaW1wbGUsIE9NWF9WSURFT19NUEVHMkxldmVsSDE0IH0sCisgICAgeyBPTVhfVklERU9fTVBFRzJQcm9maWxlU2ltcGxlLCBPTVhfVklERU9fTVBFRzJMZXZlbEhMICB9LAorCisgICAgeyBPTVhfVklERU9fTVBFRzJQcm9maWxlTWFpbiAgLCBPTVhfVklERU9fTVBFRzJMZXZlbExMICB9LAorICAgIHsgT01YX1ZJREVPX01QRUcyUHJvZmlsZU1haW4gICwgT01YX1ZJREVPX01QRUcyTGV2ZWxNTCAgfSwKKyAgICB7IE9NWF9WSURFT19NUEVHMlByb2ZpbGVNYWluICAsIE9NWF9WSURFT19NUEVHMkxldmVsSDE0IH0sCisgICAgeyBPTVhfVklERU9fTVBFRzJQcm9maWxlTWFpbiAgLCBPTVhfVklERU9fTVBFRzJMZXZlbEhMICB9LAorfTsKKworU29mdE1QRUcyOjpTb2Z0TVBFRzIoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgT01YX1BUUiBhcHBEYXRhLAorICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkKKyAgICA6IFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQoCisgICAgICAgICAgICBuYW1lLCBjb21wb25lbnROYW1lLCBjb2RpbmdUeXBlLAorICAgICAgICAgICAga1Byb2ZpbGVMZXZlbHMsIEFSUkFZX1NJWkUoa1Byb2ZpbGVMZXZlbHMpLAorICAgICAgICAgICAgMzIwIC8qIHdpZHRoICovLCAyNDAgLyogaGVpZ2h0ICovLCBjYWxsYmFja3MsCisgICAgICAgICAgICBhcHBEYXRhLCBjb21wb25lbnQpLAorICAgICAgbU1lbVJlY29yZHMoTlVMTCksCisgICAgICBtRmx1c2hPdXRCdWZmZXIoTlVMTCksCisgICAgICBtT214Q29sb3JGb3JtYXQoT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hciksCisgICAgICBtSXZDb2xvckZvcm1hdChJVl9ZVVZfNDIwUCksCisgICAgICBtTmV3V2lkdGgobVdpZHRoKSwKKyAgICAgIG1OZXdIZWlnaHQobUhlaWdodCksCisgICAgICBtQ2hhbmdpbmdSZXNvbHV0aW9uKGZhbHNlKSB7CisgICAgaW5pdFBvcnRzKGtOdW1CdWZmZXJzLCBJTlBVVF9CVUZfU0laRSwga051bUJ1ZmZlcnMsIENPREVDX01JTUVfVFlQRSk7CisKKyAgICAvLyBJZiBpbnB1dCBkdW1wIGlzIGVuYWJsZWQsIHRoZW4gb3BlbiBjcmVhdGUgYW4gZW1wdHkgZmlsZQorICAgIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKTsKKyAgICBDUkVBVEVfRFVNUF9GSUxFKG1JbkZpbGUpOworCisgICAgQ0hFQ0tfRVEoaW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKK30KKworU29mdE1QRUcyOjp+U29mdE1QRUcyKCkgeworICAgIENIRUNLX0VRKGRlSW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKK30KKworCitzdGF0aWMgc2l6ZV90IGdldE1pblRpbWVzdGFtcElkeChPTVhfUzY0ICpwTlRpbWVTdGFtcCwgYm9vbCAqcElzVGltZVN0YW1wVmFsaWQpIHsKKyAgICBPTVhfUzY0IG1pblRpbWVTdGFtcCA9IExMT05HX01BWDsKKyAgICBpbnQgaWR4ID0gLTE7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBNQVhfVElNRV9TVEFNUFM7IGkrKykgeworICAgICAgICBpZiAocElzVGltZVN0YW1wVmFsaWRbaV0pIHsKKyAgICAgICAgICAgIGlmIChwTlRpbWVTdGFtcFtpXSA8IG1pblRpbWVTdGFtcCkgeworICAgICAgICAgICAgICAgIG1pblRpbWVTdGFtcCA9IHBOVGltZVN0YW1wW2ldOworICAgICAgICAgICAgICAgIGlkeCA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGlkeDsKK30KKworc3RhdGljIHNpemVfdCBHZXRDUFVDb3JlQ291bnQoKSB7CisgICAgbG9uZyBjcHVDb3JlQ291bnQgPSAxOworI2lmIGRlZmluZWQoX1NDX05QUk9DRVNTT1JTX09OTE4pCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisjZWxzZQorICAgIC8vIF9TQ19OUFJPQ19PTkxOIG11c3QgYmUgZGVmaW5lZC4uLgorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DX09OTE4pOworI2VuZGlmCisgICAgQ0hFQ0soY3B1Q29yZUNvdW50ID49IDEpOworICAgIEFMT0dWKCJOdW1iZXIgb2YgQ1BVIGNvcmVzOiAlbGQiLCBjcHVDb3JlQ291bnQpOworICAgIHJldHVybiAoc2l6ZV90KWNwdUNvcmVDb3VudDsKK30KKwordm9pZCBTb2Z0TVBFRzI6OmxvZ1ZlcnNpb24oKSB7CisgICAgaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90IHNfY3RsX2lwOworICAgIGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCBzX2N0bF9vcDsKKyAgICBVV09SRDggYXUxX2J1Zls1MTJdOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1czsKKworICAgIHNfY3RsX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19jdGxfaXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfR0VUVkVSU0lPTjsKKyAgICBzX2N0bF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9faXBfdCk7CisgICAgc19jdGxfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2dldHZlcnNpb25pbmZvX29wX3QpOworICAgIHNfY3RsX2lwLnB2X3ZlcnNpb25fYnVmZmVyID0gYXUxX2J1ZjsKKyAgICBzX2N0bF9pcC51NF92ZXJzaW9uX2J1ZmZlcl9zaXplID0gc2l6ZW9mKGF1MV9idWYpOworCisgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19jdGxfaXAsICh2b2lkICopJnNfY3RsX29wKTsKKworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiRXJyb3IgaW4gZ2V0dGluZyB2ZXJzaW9uIG51bWJlcjogMHgleCIsCisgICAgICAgICAgICAgICAgc19jdGxfb3AudTRfZXJyb3JfY29kZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIkl0dGlhbSBkZWNvZGVyIHZlcnNpb24gbnVtYmVyOiAlcyIsCisgICAgICAgICAgICAgICAgKGNoYXIgKilzX2N0bF9pcC5wdl92ZXJzaW9uX2J1ZmZlcik7CisgICAgfQorICAgIHJldHVybjsKK30KKworc3RhdHVzX3QgU29mdE1QRUcyOjpzZXRQYXJhbXMoc2l6ZV90IHN0cmlkZSkgeworICAgIGl2ZF9jdGxfc2V0X2NvbmZpZ19pcF90IHNfY3RsX2lwOworICAgIGl2ZF9jdGxfc2V0X2NvbmZpZ19vcF90IHNfY3RsX29wOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1czsKKyAgICBzX2N0bF9pcC51NF9kaXNwX3dkID0gKFVXT1JEMzIpc3RyaWRlOworICAgIHNfY3RsX2lwLmVfZnJtX3NraXBfbW9kZSA9IElWRF9TS0lQX05PTkU7CisKKyAgICBzX2N0bF9pcC5lX2ZybV9vdXRfbW9kZSA9IElWRF9ESVNQTEFZX0ZSQU1FX09VVDsKKyAgICBzX2N0bF9pcC5lX3ZpZF9kZWNfbW9kZSA9IElWRF9ERUNPREVfRlJBTUU7CisgICAgc19jdGxfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2N0bF9pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9TRVRQQVJBTVM7CisgICAgc19jdGxfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3NldF9jb25maWdfaXBfdCk7CisgICAgc19jdGxfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3NldF9jb25maWdfb3BfdCk7CisKKyAgICBBTE9HVigiU2V0IHRoZSBydW4tdGltZSAoZHluYW1pYykgcGFyYW1ldGVycyBzdHJpZGUgPSAldSIsIHN0cmlkZSk7CisgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19jdGxfaXAsICh2b2lkICopJnNfY3RsX29wKTsKKworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiRXJyb3IgaW4gc2V0dGluZyB0aGUgcnVuLXRpbWUgcGFyYW1ldGVyczogMHgleCIsCisgICAgICAgICAgICAgICAgc19jdGxfb3AudTRfZXJyb3JfY29kZSk7CisKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU29mdE1QRUcyOjpyZXNldFBsdWdpbigpIHsKKyAgICBtSXNJbkZsdXNoID0gZmFsc2U7CisgICAgbVJlY2VpdmVkRU9TID0gZmFsc2U7CisgICAgbWVtc2V0KG1UaW1lU3RhbXBzLCAwLCBzaXplb2YobVRpbWVTdGFtcHMpKTsKKyAgICBtZW1zZXQobVRpbWVTdGFtcHNWYWxpZCwgMCwgc2l6ZW9mKG1UaW1lU3RhbXBzVmFsaWQpKTsKKworICAgIC8qIEluaXRpYWxpemUgYm90aCBzdGFydCBhbmQgZW5kIHRpbWVzICovCisgICAgZ2V0dGltZW9mZGF5KCZtVGltZVN0YXJ0LCBOVUxMKTsKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lRW5kLCBOVUxMKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU29mdE1QRUcyOjpyZXNldERlY29kZXIoKSB7CisgICAgaXZkX2N0bF9yZXNldF9pcF90IHNfY3RsX2lwOworICAgIGl2ZF9jdGxfcmVzZXRfb3BfdCBzX2N0bF9vcDsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXM7CisKKyAgICBzX2N0bF9pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfY3RsX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX1JFU0VUOworICAgIHNfY3RsX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9yZXNldF9pcF90KTsKKyAgICBzX2N0bF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfcmVzZXRfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSZzX2N0bF9pcCwgKHZvaWQgKikmc19jdGxfb3ApOworICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICBBTE9HRSgiRXJyb3IgaW4gcmVzZXQ6IDB4JXgiLCBzX2N0bF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgLyogU2V0IHRoZSBydW4tdGltZSAoZHluYW1pYykgcGFyYW1ldGVycyAqLworICAgIHNldFBhcmFtcyhvdXRwdXRCdWZmZXJXaWR0aCgpKTsKKworICAgIC8qIFNldCBudW1iZXIgb2YgY29yZXMvdGhyZWFkcyB0byBiZSB1c2VkIGJ5IHRoZSBjb2RlYyAqLworICAgIHNldE51bUNvcmVzKCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFNvZnRNUEVHMjo6c2V0TnVtQ29yZXMoKSB7CisgICAgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX2lwX3Qgc19zZXRfY29yZXNfaXA7CisgICAgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX29wX3Qgc19zZXRfY29yZXNfb3A7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzOworICAgIHNfc2V0X2NvcmVzX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19zZXRfY29yZXNfaXAuZV9zdWJfY21kID0gSVZERVhUX0NNRF9DVExfU0VUX05VTV9DT1JFUzsKKyAgICBzX3NldF9jb3Jlc19pcC51NF9udW1fY29yZXMgPSBNSU4obU51bUNvcmVzLCBDT0RFQ19NQVhfTlVNX0NPUkVTKTsKKyAgICBzX3NldF9jb3Jlc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90KTsKKyAgICBzX3NldF9jb3Jlc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICh2b2lkICopJnNfc2V0X2NvcmVzX2lwLCAodm9pZCAqKSZzX3NldF9jb3Jlc19vcCk7CisgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBpbiBzZXR0aW5nIG51bWJlciBvZiBjb3JlczogMHgleCIsCisgICAgICAgICAgICAgICAgc19zZXRfY29yZXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFNvZnRNUEVHMjo6c2V0Rmx1c2hNb2RlKCkgeworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1czsKKyAgICBpdmRfY3RsX2ZsdXNoX2lwX3Qgc192aWRlb19mbHVzaF9pcDsKKyAgICBpdmRfY3RsX2ZsdXNoX29wX3Qgc192aWRlb19mbHVzaF9vcDsKKworICAgIHNfdmlkZW9fZmx1c2hfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3ZpZGVvX2ZsdXNoX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX0ZMVVNIOworICAgIHNfdmlkZW9fZmx1c2hfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2ZsdXNoX2lwX3QpOworICAgIHNfdmlkZW9fZmx1c2hfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2ZsdXNoX29wX3QpOworCisgICAgLyogU2V0IHRoZSBkZWNvZGVyIGluIEZsdXNoIG1vZGUsIHN1YnNlcXVlbnQgZGVjb2RlKCkgY2FsbHMgd2lsbCBmbHVzaCAqLworICAgIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbigKKyAgICAgICAgICAgIG1Db2RlY0N0eCwgKHZvaWQgKikmc192aWRlb19mbHVzaF9pcCwgKHZvaWQgKikmc192aWRlb19mbHVzaF9vcCk7CisKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGluIHNldHRpbmcgdGhlIGRlY29kZXIgaW4gZmx1c2ggbW9kZTogKCVkKSAweCV4Iiwgc3RhdHVzLAorICAgICAgICAgICAgICAgIHNfdmlkZW9fZmx1c2hfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIG1XYWl0Rm9ySSA9IHRydWU7CisgICAgbUlzSW5GbHVzaCA9IHRydWU7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTb2Z0TVBFRzI6OmluaXREZWNvZGVyKCkgeworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1czsKKworICAgIFVXT1JEMzIgdTRfbnVtX3Jlb3JkZXJfZnJhbWVzOworICAgIFVXT1JEMzIgdTRfbnVtX3JlZl9mcmFtZXM7CisgICAgVVdPUkQzMiB1NF9zaGFyZV9kaXNwX2J1ZjsKKworICAgIG1OdW1Db3JlcyA9IEdldENQVUNvcmVDb3VudCgpOworICAgIG1XYWl0Rm9ySSA9IHRydWU7CisKKyAgICAvKiBJbml0aWFsaXplIG51bWJlciBvZiByZWYgYW5kIHJlb3JkZXIgbW9kZXMgKGZvciBNUEVHMikgKi8KKyAgICB1NF9udW1fcmVvcmRlcl9mcmFtZXMgPSAxNjsKKyAgICB1NF9udW1fcmVmX2ZyYW1lcyA9IDE2OworICAgIHU0X3NoYXJlX2Rpc3BfYnVmID0gMDsKKworICAgIHVpbnQzMl90IGRpc3BsYXlTdHJpZGUgPSBvdXRwdXRCdWZmZXJXaWR0aCgpOworICAgIHVpbnQzMl90IGRpc3BsYXlIZWlnaHQgPSBvdXRwdXRCdWZmZXJIZWlnaHQoKTsKKyAgICB1aW50MzJfdCBkaXNwbGF5U2l6ZVkgPSBkaXNwbGF5U3RyaWRlICogZGlzcGxheUhlaWdodDsKKworICAgIHsKKyAgICAgICAgaXZfbnVtX21lbV9yZWNfaXBfdCBzX251bV9tZW1fcmVjX2lwOworICAgICAgICBpdl9udW1fbWVtX3JlY19vcF90IHNfbnVtX21lbV9yZWNfb3A7CisKKyAgICAgICAgc19udW1fbWVtX3JlY19pcC51NF9zaXplID0gc2l6ZW9mKHNfbnVtX21lbV9yZWNfaXApOworICAgICAgICBzX251bV9tZW1fcmVjX29wLnU0X3NpemUgPSBzaXplb2Yoc19udW1fbWVtX3JlY19vcCk7CisgICAgICAgIHNfbnVtX21lbV9yZWNfaXAuZV9jbWQgPSBJVl9DTURfR0VUX05VTV9NRU1fUkVDOworCisgICAgICAgIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbigKKyAgICAgICAgICAgICAgICBtQ29kZWNDdHgsICh2b2lkICopJnNfbnVtX21lbV9yZWNfaXAsICh2b2lkICopJnNfbnVtX21lbV9yZWNfb3ApOworICAgICAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFcnJvciBpbiBnZXR0aW5nIG1lbSByZWNvcmRzOiAweCV4IiwKKyAgICAgICAgICAgICAgICAgICAgc19udW1fbWVtX3JlY19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgbU51bU1lbVJlY29yZHMgPSBzX251bV9tZW1fcmVjX29wLnU0X251bV9tZW1fcmVjOworICAgIH0KKworICAgIG1NZW1SZWNvcmRzID0gKGl2X21lbV9yZWNfdCAqKWl2ZF9hbGlnbmVkX21hbGxvYygKKyAgICAgICAgICAgIDEyOCwgbU51bU1lbVJlY29yZHMgKiBzaXplb2YoaXZfbWVtX3JlY190KSk7CisgICAgaWYgKG1NZW1SZWNvcmRzID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkFsbG9jYXRpb24gZmFpbHVyZSIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIG1lbXNldChtTWVtUmVjb3JkcywgMCwgbU51bU1lbVJlY29yZHMgKiBzaXplb2YoaXZfbWVtX3JlY190KSk7CisKKyAgICB7CisgICAgICAgIHNpemVfdCBpOworICAgICAgICBpdmRleHRfZmlsbF9tZW1fcmVjX2lwX3Qgc19maWxsX21lbV9pcDsKKyAgICAgICAgaXZkZXh0X2ZpbGxfbWVtX3JlY19vcF90IHNfZmlsbF9tZW1fb3A7CisgICAgICAgIGl2X21lbV9yZWNfdCAqcHNfbWVtX3JlYzsKKworICAgICAgICBzX2ZpbGxfbWVtX2lwLnNfaXZkX2ZpbGxfbWVtX3JlY19pcF90LnU0X3NpemUgPQorICAgICAgICAgICAgc2l6ZW9mKGl2ZGV4dF9maWxsX21lbV9yZWNfaXBfdCk7CisKKyAgICAgICAgc19maWxsX21lbV9pcC51NF9zaGFyZV9kaXNwX2J1ZiA9IHU0X3NoYXJlX2Rpc3BfYnVmOworICAgICAgICBzX2ZpbGxfbWVtX2lwLmVfb3V0cHV0X2Zvcm1hdCA9IG1JdkNvbG9yRm9ybWF0OworCisgICAgICAgIHNfZmlsbF9tZW1faXAuc19pdmRfZmlsbF9tZW1fcmVjX2lwX3QuZV9jbWQgPSBJVl9DTURfRklMTF9OVU1fTUVNX1JFQzsKKyAgICAgICAgc19maWxsX21lbV9pcC5zX2l2ZF9maWxsX21lbV9yZWNfaXBfdC5wdl9tZW1fcmVjX2xvY2F0aW9uID0gbU1lbVJlY29yZHM7CisgICAgICAgIHNfZmlsbF9tZW1faXAuc19pdmRfZmlsbF9tZW1fcmVjX2lwX3QudTRfbWF4X2ZybV93ZCA9IGRpc3BsYXlTdHJpZGU7CisgICAgICAgIHNfZmlsbF9tZW1faXAuc19pdmRfZmlsbF9tZW1fcmVjX2lwX3QudTRfbWF4X2ZybV9odCA9IGRpc3BsYXlIZWlnaHQ7CisgICAgICAgIHNfZmlsbF9tZW1fb3Auc19pdmRfZmlsbF9tZW1fcmVjX29wX3QudTRfc2l6ZSA9CisgICAgICAgICAgICBzaXplb2YoaXZkZXh0X2ZpbGxfbWVtX3JlY19vcF90KTsKKworICAgICAgICBwc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtTnVtTWVtUmVjb3JkczsgaSsrKSB7CisgICAgICAgICAgICBwc19tZW1fcmVjW2ldLnU0X3NpemUgPSBzaXplb2YoaXZfbWVtX3JlY190KTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbigKKyAgICAgICAgICAgICAgICBtQ29kZWNDdHgsICh2b2lkICopJnNfZmlsbF9tZW1faXAsICh2b2lkICopJnNfZmlsbF9tZW1fb3ApOworCisgICAgICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICAgICAgQUxPR0UoIkVycm9yIGluIGZpbGxpbmcgbWVtIHJlY29yZHM6IDB4JXgiLAorICAgICAgICAgICAgICAgICAgICBzX2ZpbGxfbWVtX29wLnNfaXZkX2ZpbGxfbWVtX3JlY19vcF90LnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgbU51bU1lbVJlY29yZHMgPQorICAgICAgICAgICAgc19maWxsX21lbV9vcC5zX2l2ZF9maWxsX21lbV9yZWNfb3BfdC51NF9udW1fbWVtX3JlY19maWxsZWQ7CisKKyAgICAgICAgcHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtTnVtTWVtUmVjb3JkczsgaSsrKSB7CisgICAgICAgICAgICBwc19tZW1fcmVjLT5wdl9iYXNlID0gaXZkX2FsaWduZWRfbWFsbG9jKAorICAgICAgICAgICAgICAgICAgICBwc19tZW1fcmVjLT51NF9tZW1fYWxpZ25tZW50LCBwc19tZW1fcmVjLT51NF9tZW1fc2l6ZSk7CisgICAgICAgICAgICBpZiAocHNfbWVtX3JlYy0+cHZfYmFzZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkFsbG9jYXRpb24gZmFpbHVyZSBmb3IgbWVtb3J5IHJlY29yZCAjJXp1IG9mIHNpemUgJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgaSwgcHNfbWVtX3JlYy0+dTRfbWVtX3NpemUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IElWX0ZBSUw7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHNfbWVtX3JlYysrOworICAgICAgICB9CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgZGVjb2RlciAqLworICAgIHsKKyAgICAgICAgaXZkZXh0X2luaXRfaXBfdCBzX2luaXRfaXA7CisgICAgICAgIGl2ZGV4dF9pbml0X29wX3Qgc19pbml0X29wOworCisgICAgICAgIHZvaWQgKmRlY19meG5zID0gKHZvaWQgKilpdmRlY19hcGlfZnVuY3Rpb247CisKKyAgICAgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9pbml0X2lwX3QpOworICAgICAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LmVfY21kID0gKElWRF9BUElfQ09NTUFORF9UWVBFX1QpSVZfQ01EX0lOSVQ7CisgICAgICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QucHZfbWVtX3JlY19sb2NhdGlvbiA9IG1NZW1SZWNvcmRzOworICAgICAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LnU0X2ZybV9tYXhfd2QgPSBkaXNwbGF5U3RyaWRlOworICAgICAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LnU0X2ZybV9tYXhfaHQgPSBkaXNwbGF5SGVpZ2h0OworCisgICAgICAgIHNfaW5pdF9pcC51NF9zaGFyZV9kaXNwX2J1ZiA9IHU0X3NoYXJlX2Rpc3BfYnVmOworCisgICAgICAgIHNfaW5pdF9vcC5zX2l2ZF9pbml0X29wX3QudTRfc2l6ZSA9IHNpemVvZihzX2luaXRfb3ApOworCisgICAgICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QudTRfbnVtX21lbV9yZWMgPSBtTnVtTWVtUmVjb3JkczsKKyAgICAgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC5lX291dHB1dF9mb3JtYXQgPSBtSXZDb2xvckZvcm1hdDsKKworICAgICAgICBtQ29kZWNDdHggPSAoaXZfb2JqX3QgKiltTWVtUmVjb3Jkc1swXS5wdl9iYXNlOworICAgICAgICBtQ29kZWNDdHgtPnB2X2Z4bnMgPSBkZWNfZnhuczsKKyAgICAgICAgbUNvZGVjQ3R4LT51NF9zaXplID0gc2l6ZW9mKGl2X29ial90KTsKKworICAgICAgICBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSZzX2luaXRfaXAsICh2b2lkICopJnNfaW5pdF9vcCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICAgICAgQUxPR0UoIkVycm9yIGluIGluaXQ6IDB4JXgiLAorICAgICAgICAgICAgICAgICAgICBzX2luaXRfb3Auc19pdmRfaW5pdF9vcF90LnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBSZXNldCB0aGUgcGx1Z2luIHN0YXRlICovCisgICAgcmVzZXRQbHVnaW4oKTsKKworICAgIC8qIFNldCB0aGUgcnVuIHRpbWUgKGR5bmFtaWMpIHBhcmFtZXRlcnMgKi8KKyAgICBzZXRQYXJhbXMoZGlzcGxheVN0cmlkZSk7CisKKyAgICAvKiBTZXQgbnVtYmVyIG9mIGNvcmVzL3RocmVhZHMgdG8gYmUgdXNlZCBieSB0aGUgY29kZWMgKi8KKyAgICBzZXROdW1Db3JlcygpOworCisgICAgLyogR2V0IGNvZGVjIHZlcnNpb24gKi8KKyAgICBsb2dWZXJzaW9uKCk7CisKKyAgICAvKiBBbGxvY2F0ZSBpbnRlcm5hbCBwaWN0dXJlIGJ1ZmZlciAqLworICAgIHVpbnQzMl90IGJ1ZmZlclNpemUgPSBkaXNwbGF5U2l6ZVkgKiAzIC8gMjsKKyAgICBtRmx1c2hPdXRCdWZmZXIgPSAodWludDhfdCAqKWl2ZF9hbGlnbmVkX21hbGxvYygxMjgsIGJ1ZmZlclNpemUpOworICAgIGlmIChOVUxMID09IG1GbHVzaE91dEJ1ZmZlcikgeworICAgICAgICBBTE9HRSgiQ291bGQgbm90IGFsbG9jYXRlIGZsdXNoT3V0cHV0QnVmZmVyIG9mIHNpemUgJXp1IiwgYnVmZmVyU2l6ZSk7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgbUluaXROZWVkZWQgPSBmYWxzZTsKKyAgICBtRmx1c2hOZWVkZWQgPSBmYWxzZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFNvZnRNUEVHMjo6ZGVJbml0RGVjb2RlcigpIHsKKyAgICBzaXplX3QgaTsKKworICAgIGlmIChtTWVtUmVjb3JkcykgeworICAgICAgICBpdl9tZW1fcmVjX3QgKnBzX21lbV9yZWM7CisKKyAgICAgICAgcHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbU51bU1lbVJlY29yZHM7IGkrKykgeworICAgICAgICAgICAgaWYgKHBzX21lbV9yZWMtPnB2X2Jhc2UpIHsKKyAgICAgICAgICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKHBzX21lbV9yZWMtPnB2X2Jhc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHNfbWVtX3JlYysrOworICAgICAgICB9CisgICAgICAgIGl2ZF9hbGlnbmVkX2ZyZWUobU1lbVJlY29yZHMpOworICAgICAgICBtTWVtUmVjb3JkcyA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKG1GbHVzaE91dEJ1ZmZlcikgeworICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKG1GbHVzaE91dEJ1ZmZlcik7CisgICAgICAgIG1GbHVzaE91dEJ1ZmZlciA9IE5VTEw7CisgICAgfQorCisgICAgbUluaXROZWVkZWQgPSB0cnVlOworICAgIG1DaGFuZ2luZ1Jlc29sdXRpb24gPSBmYWxzZTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU29mdE1QRUcyOjpyZUluaXREZWNvZGVyKCkgeworICAgIHN0YXR1c190IHJldDsKKworICAgIGRlSW5pdERlY29kZXIoKTsKKworICAgIHJldCA9IGluaXREZWNvZGVyKCk7CisgICAgaWYgKE9LICE9IHJldCkgeworICAgICAgICBBTE9HRSgiQ3JlYXRlIGZhaWx1cmUiKTsKKyAgICAgICAgZGVJbml0RGVjb2RlcigpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgU29mdE1QRUcyOjpvblJlc2V0KCkgeworICAgIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6Om9uUmVzZXQoKTsKKworICAgIG1XYWl0Rm9ySSA9IHRydWU7CisKKyAgICByZXNldERlY29kZXIoKTsKKyAgICByZXNldFBsdWdpbigpOworfQorCitPTVhfRVJST1JUWVBFIFNvZnRNUEVHMjo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpIHsKKyAgICBjb25zdCB1aW50MzJfdCBvbGRXaWR0aCA9IG1XaWR0aDsKKyAgICBjb25zdCB1aW50MzJfdCBvbGRIZWlnaHQgPSBtSGVpZ2h0OworICAgIE9NWF9FUlJPUlRZUEUgcmV0ID0gU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoaW5kZXgsIHBhcmFtcyk7CisgICAgaWYgKG1XaWR0aCAhPSBvbGRXaWR0aCB8fCBtSGVpZ2h0ICE9IG9sZEhlaWdodCkgeworICAgICAgICByZUluaXREZWNvZGVyKCk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgU29mdE1QRUcyOjpzZXREZWNvZGVBcmdzKAorICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3QgKnBzX2RlY19pcCwKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90ICpwc19kZWNfb3AsCisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciwKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciwKKyAgICAgICAgc2l6ZV90IHRpbWVTdGFtcEl4KSB7CisgICAgc2l6ZV90IHNpemVZID0gb3V0cHV0QnVmZmVyV2lkdGgoKSAqIG91dHB1dEJ1ZmZlckhlaWdodCgpOworICAgIHNpemVfdCBzaXplVVY7CisgICAgdWludDhfdCAqcEJ1ZjsKKworICAgIHBzX2RlY19pcC0+dTRfc2l6ZSA9IHNpemVvZihpdmRfdmlkZW9fZGVjb2RlX2lwX3QpOworICAgIHBzX2RlY19vcC0+dTRfc2l6ZSA9IHNpemVvZihpdmRfdmlkZW9fZGVjb2RlX29wX3QpOworCisgICAgcHNfZGVjX2lwLT5lX2NtZCA9IElWRF9DTURfVklERU9fREVDT0RFOworCisgICAgLyogV2hlbiBpbiBmbHVzaCBhbmQgYWZ0ZXIgRU9TIHdpdGggemVybyBieXRlIGlucHV0LAorICAgICAqIGluSGVhZGVyIGlzIHNldCB0byB6ZXJvLiBIZW5jZSBjaGVjayBmb3Igbm9uLW51bGwgKi8KKyAgICBpZiAoaW5IZWFkZXIpIHsKKyAgICAgICAgcHNfZGVjX2lwLT51NF90cyA9IHRpbWVTdGFtcEl4OworICAgICAgICBwc19kZWNfaXAtPnB2X3N0cmVhbV9idWZmZXIgPSBpbkhlYWRlci0+cEJ1ZmZlcgorICAgICAgICAgICAgICAgICsgaW5IZWFkZXItPm5PZmZzZXQ7CisgICAgICAgIHBzX2RlY19pcC0+dTRfbnVtX0J5dGVzID0gaW5IZWFkZXItPm5GaWxsZWRMZW47CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHNfZGVjX2lwLT51NF90cyA9IDA7CisgICAgICAgIHBzX2RlY19pcC0+cHZfc3RyZWFtX2J1ZmZlciA9IE5VTEw7CisgICAgICAgIHBzX2RlY19pcC0+dTRfbnVtX0J5dGVzID0gMDsKKyAgICB9CisKKyAgICBpZiAob3V0SGVhZGVyKSB7CisgICAgICAgIHBCdWYgPSBvdXRIZWFkZXItPnBCdWZmZXI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcEJ1ZiA9IG1GbHVzaE91dEJ1ZmZlcjsKKyAgICB9CisKKyAgICBzaXplVVYgPSBzaXplWSAvIDQ7CisgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVswXSA9IHNpemVZOworICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMV0gPSBzaXplVVY7CisgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVsyXSA9IHNpemVVVjsKKworICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzBdID0gcEJ1ZjsKKyAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1sxXSA9IHBCdWYgKyBzaXplWTsKKyAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1syXSA9IHBCdWYgKyBzaXplWSArIHNpemVVVjsKKyAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci51NF9udW1fYnVmcyA9IDM7CisgICAgcmV0dXJuOworfQordm9pZCBTb2Z0TVBFRzI6Om9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7CisgICAgLyogT25jZSB0aGUgb3V0cHV0IGJ1ZmZlcnMgYXJlIGZsdXNoZWQsIGlnbm9yZSBhbnkgYnVmZmVycyB0aGF0IGFyZSBoZWxkIGluIGRlY29kZXIgKi8KKyAgICBpZiAoa091dHB1dFBvcnRJbmRleCA9PSBwb3J0SW5kZXgpIHsKKyAgICAgICAgc2V0Rmx1c2hNb2RlKCk7CisKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY19pcDsKKyAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY19vcDsKKyAgICAgICAgICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1czsKKyAgICAgICAgICAgIHNpemVfdCBzaXplWSwgc2l6ZVVWOworCisgICAgICAgICAgICBzZXREZWNvZGVBcmdzKCZzX2RlY19pcCwgJnNfZGVjX29wLCBOVUxMLCBOVUxMLCAwKTsKKworICAgICAgICAgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19kZWNfaXAsICh2b2lkICopJnNfZGVjX29wKTsKKyAgICAgICAgICAgIGlmICgwID09IHNfZGVjX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICAgICAgcmVzZXRQbHVnaW4oKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBTb2Z0TVBFRzI6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKKyAgICBVTlVTRUQocG9ydEluZGV4KTsKKworICAgIGlmIChtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlICE9IE5PTkUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmaW5RdWV1ZSA9IGdldFBvcnRRdWV1ZShrSW5wdXRQb3J0SW5kZXgpOworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoa091dHB1dFBvcnRJbmRleCk7CisKKyAgICAvKiBJZiBpbnB1dCBFT1MgaXMgc2VlbiBhbmQgZGVjb2RlciBpcyBub3QgaW4gZmx1c2ggbW9kZSwKKyAgICAgKiBzZXQgdGhlIGRlY29kZXIgaW4gZmx1c2ggbW9kZS4KKyAgICAgKiBUaGVyZSBjYW4gYmUgYSBjYXNlIHdoZXJlIEVPUyBpcyBzZW50IGFsb25nIHdpdGggbGFzdCBwaWN0dXJlIGRhdGEKKyAgICAgKiBJbiB0aGF0IGNhc2UsIG9ubHkgYWZ0ZXIgZGVjb2RpbmcgdGhhdCBpbnB1dCBkYXRhLCBkZWNvZGVyIGhhcyB0byBiZQorICAgICAqIHB1dCBpbiBmbHVzaC4gVGhpcyBjYXNlIGlzIGhhbmRsZWQgaGVyZSAgKi8KKworICAgIGlmIChtUmVjZWl2ZWRFT1MgJiYgIW1Jc0luRmx1c2gpIHsKKyAgICAgICAgc2V0Rmx1c2hNb2RlKCk7CisgICAgfQorCisgICAgd2hpbGUgKCFvdXRRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgIEJ1ZmZlckluZm8gKmluSW5mbzsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyOworCisgICAgICAgIEJ1ZmZlckluZm8gKm91dEluZm87CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXI7CisgICAgICAgIHNpemVfdCB0aW1lU3RhbXBJeDsKKworICAgICAgICBpbkluZm8gPSBOVUxMOworICAgICAgICBpbkhlYWRlciA9IE5VTEw7CisKKyAgICAgICAgaWYgKCFtSXNJbkZsdXNoKSB7CisgICAgICAgICAgICBpZiAoIWluUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGluSW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOworICAgICAgICBvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOworICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IDA7CisgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IDA7CisgICAgICAgIG91dEhlYWRlci0+bk9mZnNldCA9IDA7CisKKyAgICAgICAgaWYgKGluSGVhZGVyICE9IE5VTEwgJiYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpKSB7CisgICAgICAgICAgICBtUmVjZWl2ZWRFT1MgPSB0cnVlOworICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuID09IDApIHsKKyAgICAgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKyAgICAgICAgICAgICAgICBpbkhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgc2V0Rmx1c2hNb2RlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBXaGVuIHRoZXJlIGlzIGFuIGluaXQgcmVxdWlyZWQgYW5kIHRoZSBkZWNvZGVyIGlzIG5vdCBpbiBmbHVzaCBtb2RlLAorICAgICAgICAvLyB1cGRhdGUgb3V0cHV0IHBvcnQncyBkZWZpbml0aW9uIGFuZCByZWluaXRpYWxpemUgZGVjb2Rlci4KKyAgICAgICAgaWYgKG1Jbml0TmVlZGVkICYmICFtSXNJbkZsdXNoKSB7CisgICAgICAgICAgICBib29sIHBvcnRXaWxsUmVzZXQgPSBmYWxzZTsKKyAgICAgICAgICAgIGhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZSgmcG9ydFdpbGxSZXNldCwgbU5ld1dpZHRoLCBtTmV3SGVpZ2h0KTsKKworICAgICAgICAgICAgQ0hFQ0tfRVEocmVJbml0RGVjb2RlcigpLCAoc3RhdHVzX3QpT0spOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLyogR2V0IGEgZnJlZSBzbG90IGluIHRpbWVzdGFtcCBhcnJheSB0byBob2xkIGlucHV0IHRpbWVzdGFtcCAqLworICAgICAgICB7CisgICAgICAgICAgICBzaXplX3QgaTsKKyAgICAgICAgICAgIHRpbWVTdGFtcEl4ID0gMDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfVElNRV9TVEFNUFM7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICghbVRpbWVTdGFtcHNWYWxpZFtpXSkgeworICAgICAgICAgICAgICAgICAgICB0aW1lU3RhbXBJeCA9IGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbkhlYWRlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbVRpbWVTdGFtcHNWYWxpZFt0aW1lU3RhbXBJeF0gPSB0cnVlOworICAgICAgICAgICAgICAgIG1UaW1lU3RhbXBzW3RpbWVTdGFtcEl4XSA9IGluSGVhZGVyLT5uVGltZVN0YW1wOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjX2lwOworICAgICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjX29wOworICAgICAgICAgICAgV09SRDMyIHRpbWVEZWxheSwgdGltZVRha2VuOworICAgICAgICAgICAgc2l6ZV90IHNpemVZLCBzaXplVVY7CisKKyAgICAgICAgICAgIHNldERlY29kZUFyZ3MoJnNfZGVjX2lwLCAmc19kZWNfb3AsIGluSGVhZGVyLCBvdXRIZWFkZXIsIHRpbWVTdGFtcEl4KTsKKyAgICAgICAgICAgIC8vIElmIGlucHV0IGR1bXAgaXMgZW5hYmxlZCwgdGhlbiB3cml0ZSB0byBmaWxlCisgICAgICAgICAgICBEVU1QX1RPX0ZJTEUobUluRmlsZSwgc19kZWNfaXAucHZfc3RyZWFtX2J1ZmZlciwgc19kZWNfaXAudTRfbnVtX0J5dGVzKTsKKworICAgICAgICAgICAgaWYgKHNfZGVjX2lwLnU0X251bV9CeXRlcyA+IDApIHsKKyAgICAgICAgICAgICAgICBjaGFyICpwdHIgPSAoY2hhciAqKXNfZGVjX2lwLnB2X3N0cmVhbV9idWZmZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIE5VTEwpOworICAgICAgICAgICAgLyogQ29tcHV0ZSB0aW1lIGVsYXBzZWQgYmV0d2VlbiBlbmQgb2YgcHJldmlvdXMgZGVjb2RlKCkKKyAgICAgICAgICAgICAqIHRvIHN0YXJ0IG9mIGN1cnJlbnQgZGVjb2RlKCkgKi8KKyAgICAgICAgICAgIFRJTUVfRElGRihtVGltZUVuZCwgbVRpbWVTdGFydCwgdGltZURlbGF5KTsKKworICAgICAgICAgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzOworICAgICAgICAgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19kZWNfaXAsICh2b2lkICopJnNfZGVjX29wKTsKKworICAgICAgICAgICAgYm9vbCB1bnN1cHBvcnRlZERpbWVuc2lvbnMgPSAoSU1QRUcyRF9VTlNVUFBPUlRFRF9ESU1FTlNJT05TID09IHNfZGVjX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgYm9vbCByZXNDaGFuZ2VkID0gKElWRF9SRVNfQ0hBTkdFRCA9PSAoc19kZWNfb3AudTRfZXJyb3JfY29kZSAmIDB4RkYpKTsKKworICAgICAgICAgICAgR0VUVElNRSgmbVRpbWVFbmQsIE5VTEwpOworICAgICAgICAgICAgLyogQ29tcHV0ZSB0aW1lIHRha2VuIGZvciBkZWNvZGUoKSAqLworICAgICAgICAgICAgVElNRV9ESUZGKG1UaW1lU3RhcnQsIG1UaW1lRW5kLCB0aW1lVGFrZW4pOworCisgICAgICAgICAgICBBTE9HVigidGltZVRha2VuPSU2ZCBkZWxheT0lNmQgbnVtQnl0ZXM9JTZkIiwgdGltZVRha2VuLCB0aW1lRGVsYXksCisgICAgICAgICAgICAgICAgICAgc19kZWNfb3AudTRfbnVtX2J5dGVzX2NvbnN1bWVkKTsKKyAgICAgICAgICAgIGlmIChzX2RlY19vcC51NF9mcmFtZV9kZWNvZGVkX2ZsYWcgJiYgIW1GbHVzaE5lZWRlZCkgeworICAgICAgICAgICAgICAgIG1GbHVzaE5lZWRlZCA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoaW5IZWFkZXIgIT0gTlVMTCkgJiYgKDEgIT0gc19kZWNfb3AudTRfZnJhbWVfZGVjb2RlZF9mbGFnKSkgeworICAgICAgICAgICAgICAgIC8qIElmIHRoZSBpbnB1dCBkaWQgbm90IGNvbnRhaW4gcGljdHVyZSBkYXRhLCB0aGVuIGlnbm9yZQorICAgICAgICAgICAgICAgICAqIHRoZSBhc3NvY2lhdGVkIHRpbWVzdGFtcCAqLworICAgICAgICAgICAgICAgIG1UaW1lU3RhbXBzVmFsaWRbdGltZVN0YW1wSXhdID0gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIHRvIGhhbmRsZSBDVFMgRGVjb2RlclRlc3QgdGVzdENvZGVjUmVzZXRzTVBFRzJXaXRob3V0U3VyZmFjZSwKKyAgICAgICAgICAgIC8vIHdoaWNoIGlzIG5vdCBzZW5kaW5nIFNQUy9QUFMgYWZ0ZXIgcG9ydCByZWNvbmZpZ3VyYXRpb24gYW5kIGZsdXNoIHRvIHRoZSBjb2RlYy4KKyAgICAgICAgICAgIGlmICh1bnN1cHBvcnRlZERpbWVuc2lvbnMgJiYgIW1GbHVzaE5lZWRlZCkgeworICAgICAgICAgICAgICAgIGJvb2wgcG9ydFdpbGxSZXNldCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZSgmcG9ydFdpbGxSZXNldCwgc19kZWNfb3AudTRfcGljX3dkLCBzX2RlY19vcC51NF9waWNfaHQpOworCisgICAgICAgICAgICAgICAgQ0hFQ0tfRVEocmVJbml0RGVjb2RlcigpLCAoc3RhdHVzX3QpT0spOworCisgICAgICAgICAgICAgICAgc2V0RGVjb2RlQXJncygmc19kZWNfaXAsICZzX2RlY19vcCwgaW5IZWFkZXIsIG91dEhlYWRlciwgdGltZVN0YW1wSXgpOworCisgICAgICAgICAgICAgICAgaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19kZWNfaXAsICh2b2lkICopJnNfZGVjX29wKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElmIHRoZSBkZWNvZGVyIGlzIGluIHRoZSBjaGFuZ2luZyByZXNvbHV0aW9uIG1vZGUgYW5kIHRoZXJlIGlzIG5vIG91dHB1dCBwcmVzZW50LAorICAgICAgICAgICAgLy8gdGhhdCBtZWFucyB0aGUgc3dpdGNoaW5nIGlzIGRvbmUgYW5kIGl0J3MgcmVhZHkgdG8gcmVzZXQgdGhlIGRlY29kZXIgYW5kIHRoZSBwbHVnaW4uCisgICAgICAgICAgICBpZiAobUNoYW5naW5nUmVzb2x1dGlvbiAmJiAhc19kZWNfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgICAgICBtQ2hhbmdpbmdSZXNvbHV0aW9uID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmVzZXREZWNvZGVyKCk7CisgICAgICAgICAgICAgICAgcmVzZXRQbHVnaW4oKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHVuc3VwcG9ydGVkRGltZW5zaW9ucyB8fCByZXNDaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgbUNoYW5naW5nUmVzb2x1dGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKG1GbHVzaE5lZWRlZCkgeworICAgICAgICAgICAgICAgICAgICBzZXRGbHVzaE1vZGUoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodW5zdXBwb3J0ZWREaW1lbnNpb25zKSB7CisgICAgICAgICAgICAgICAgICAgIG1OZXdXaWR0aCA9IHNfZGVjX29wLnU0X3BpY193ZDsKKyAgICAgICAgICAgICAgICAgICAgbU5ld0hlaWdodCA9IHNfZGVjX29wLnU0X3BpY19odDsKKyAgICAgICAgICAgICAgICAgICAgbUluaXROZWVkZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCgwIDwgc19kZWNfb3AudTRfcGljX3dkKSAmJiAoMCA8IHNfZGVjX29wLnU0X3BpY19odCkpIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCA9IHNfZGVjX29wLnU0X3BpY193ZDsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQgPSBzX2RlY19vcC51NF9waWNfaHQ7CisgICAgICAgICAgICAgICAgYm9vbCBwb3J0V2lsbFJlc2V0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaGFuZGxlUG9ydFNldHRpbmdzQ2hhbmdlKCZwb3J0V2lsbFJlc2V0LCB3aWR0aCwgaGVpZ2h0KTsKKworICAgICAgICAgICAgICAgIGlmIChwb3J0V2lsbFJlc2V0KSB7CisgICAgICAgICAgICAgICAgICAgIHJlc2V0RGVjb2RlcigpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc19kZWNfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgICAgICBzaXplX3QgdGltZVN0YW1wSWR4OworICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IChtV2lkdGggKiBtSGVpZ2h0ICogMykgLyAyOworCisgICAgICAgICAgICAgICAgdGltZVN0YW1wSWR4ID0gZ2V0TWluVGltZXN0YW1wSWR4KG1UaW1lU3RhbXBzLCBtVGltZVN0YW1wc1ZhbGlkKTsKKyAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPSBtVGltZVN0YW1wc1t0aW1lU3RhbXBJZHhdOworICAgICAgICAgICAgICAgIG1UaW1lU3RhbXBzVmFsaWRbdGltZVN0YW1wSWR4XSA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgLyogbVdhaXRGb3JJIHdhaXRzIGZvciB0aGUgZmlyc3QgSSBwaWN0dXJlLiBPbmNlIG1hZGUgRkFMU0UsIGl0CisgICAgICAgICAgICAgICAgICAgaGFzIHRvIHJlbWFpbiBmYWxzZSB0aWxsIGV4cGxpY2l0bHkgc2V0IHRvIFRSVUUuICovCisgICAgICAgICAgICAgICAgbVdhaXRGb3JJID0gbVdhaXRGb3JJICYmICEoSVZfSV9GUkFNRSA9PSBzX2RlY19vcC5lX3BpY190eXBlKTsKKworICAgICAgICAgICAgICAgIGlmIChtV2FpdEZvckkpIHsKKyAgICAgICAgICAgICAgICAgICAgc19kZWNfb3AudTRfb3V0cHV0X3ByZXNlbnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiT3V0cHV0IHRpbWVzdGFtcDogJWxsZCwgcmVzOiAldXgldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylvdXRIZWFkZXItPm5UaW1lU3RhbXAsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIERVTVBfVE9fRklMRShtT3V0RmlsZSwgb3V0SGVhZGVyLT5wQnVmZmVyLCBvdXRIZWFkZXItPm5GaWxsZWRMZW4pOworICAgICAgICAgICAgICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgICAgICAgICBvdXRJbmZvID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0SGVhZGVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIElmIGluIGZsdXNoIG1vZGUgYW5kIG5vIG91dHB1dCBpcyByZXR1cm5lZCBieSB0aGUgY29kZWMsCisgICAgICAgICAgICAgICAgICogdGhlbiBjb21lIG91dCBvZiBmbHVzaCBtb2RlICovCisgICAgICAgICAgICAgICAgbUlzSW5GbHVzaCA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgLyogSWYgRU9TIHdhcyByZWNpZXZlZCBvbiBpbnB1dCBwb3J0IGFuZCB0aGVyZSBpcyBubyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgKiBmcm9tIHRoZSBjb2RlYywgdGhlbiBzaWduYWwgRU9TIG9uIG91dHB1dCBwb3J0ICovCisgICAgICAgICAgICAgICAgaWYgKG1SZWNlaXZlZEVPUykgeworICAgICAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAwOworICAgICAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5GbGFncyB8PSBPTVhfQlVGRkVSRkxBR19FT1M7CisKKyAgICAgICAgICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0SW5mbyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisgICAgICAgICAgICAgICAgICAgIG91dEhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIHJlc2V0UGx1Z2luKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogSGFuZGxlIG1vcmUgdGhhbiBvbmUgcGljdHVyZSBkYXRhCisgICAgICAgIGlmIChpbkhlYWRlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIGluSW5mbyA9IE5VTEw7CisgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICAgICAgICAgaW5IZWFkZXIgPSBOVUxMOworICAgICAgICB9CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCithbmRyb2lkOjpTb2Z0T01YQ29tcG9uZW50ICpjcmVhdGVTb2Z0T01YQ29tcG9uZW50KAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpIHsKKyAgICByZXR1cm4gbmV3IGFuZHJvaWQ6OlNvZnRNUEVHMihuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvU29mdE1QRUcyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvU29mdE1QRUcyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYyNWUwOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9Tb2Z0TVBFRzIuaApAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTT0ZUX01QRUcyX0hfCisKKyNkZWZpbmUgU09GVF9NUEVHMl9IXworCisjaW5jbHVkZSAiU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2RlZmluZSBpdmRfYWxpZ25lZF9tYWxsb2MoYWxpZ25tZW50LCBzaXplKSBtZW1hbGlnbihhbGlnbm1lbnQsIHNpemUpCisjZGVmaW5lIGl2ZF9hbGlnbmVkX2ZyZWUoYnVmKSBmcmVlKGJ1ZikKKworLyoqIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSB0aW1lLXN0YW1wIGFycmF5ICovCisjZGVmaW5lIE1BWF9USU1FX1NUQU1QUyA2NAorCisvKiogTWF4aW11bSBudW1iZXIgb2YgY29yZXMgc3VwcG9ydGVkIGJ5IHRoZSBjb2RlYyAqLworI2RlZmluZSBDT0RFQ19NQVhfTlVNX0NPUkVTIDQKKworI2RlZmluZSBDT0RFQ19NQVhfV0lEVEggICAgIDE5MjAKKworI2RlZmluZSBDT0RFQ19NQVhfSEVJR0hUICAgIDEwODgKKworLyoqIElucHV0IGJ1ZmZlciBzaXplICovCisjZGVmaW5lIElOUFVUX0JVRl9TSVpFICgxMDI0ICogMTAyNCkKKworI2RlZmluZSBNSU4oYSwgYikgKChhKSA8IChiKSkgPyAoYSkgOiAoYikKKworLyoqIFVzZWQgdG8gcmVtb3ZlIHdhcm5pbmdzIGFib3V0IHVudXNlZCBwYXJhbWV0ZXJzICovCisjZGVmaW5lIFVOVVNFRCh4KSAoKHZvaWQpKHgpKQorCisvKiogR2V0IHRpbWUgKi8KKyNkZWZpbmUgR0VUVElNRShhLCBiKSBnZXR0aW1lb2ZkYXkoYSwgYik7CisKKy8qKiBDb21wdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiBzdGFydCBhbmQgZW5kICovCisjZGVmaW5lIFRJTUVfRElGRihzdGFydCwgZW5kLCBkaWZmKSBcCisgICAgZGlmZiA9ICgoZW5kLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgKiAxMDAwMDAwKSArIFwKKyAgICAgICAgICAgIChlbmQudHZfdXNlYyAtIHN0YXJ0LnR2X3VzZWMpOworCitzdHJ1Y3QgU29mdE1QRUcyIDogcHVibGljIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQgeworICAgIFNvZnRNUEVHMigKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+U29mdE1QRUcyKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCk7CisgICAgdmlydHVhbCB2b2lkIG9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKKyAgICB2aXJ0dWFsIHZvaWQgb25SZXNldCgpOworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldFBhcmFtZXRlcihPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcyk7Citwcml2YXRlOgorICAgIC8vIE51bWJlciBvZiBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMKKyAgICBlbnVtIHsKKyAgICAgICAga051bUJ1ZmZlcnMgPSA4CisgICAgfTsKKworICAgIGl2X29ial90ICptQ29kZWNDdHg7ICAgICAgICAgLy8gQ29kZWMgY29udGV4dAorICAgIGl2X21lbV9yZWNfdCAqbU1lbVJlY29yZHM7ICAgLy8gTWVtb3J5IHJlY29yZHMgcmVxdWVzdGVkIGJ5IHRoZSBjb2RlYworICAgIHNpemVfdCBtTnVtTWVtUmVjb3JkczsgICAgICAgLy8gTnVtYmVyIG9mIG1lbW9yeSByZWNvcmRzIHJlcXVlc3RlZCBieSB0aGUgY29kZWMKKworICAgIHNpemVfdCBtTnVtQ29yZXM7ICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGNvcmVzIHRvIGJlIHVlc2QgYnkgdGhlIGNvZGVjCisKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZVN0YXJ0OyAgIC8vIFRpbWUgYXQgdGhlIHN0YXJ0IG9mIGRlY29kZSgpCisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVFbmQ7ICAgICAvLyBUaW1lIGF0IHRoZSBlbmQgb2YgZGVjb2RlKCkKKworICAgIC8vIEludGVybmFsIGJ1ZmZlciB0byBiZSB1c2VkIHRvIGZsdXNoIG91dCB0aGUgYnVmZmVycyBmcm9tIGRlY29kZXIKKyAgICB1aW50OF90ICptRmx1c2hPdXRCdWZmZXI7CisKKyAgICAvLyBTdGF0dXMgb2YgZW50cmllcyBpbiB0aGUgdGltZXN0YW1wIGFycmF5CisgICAgYm9vbCBtVGltZVN0YW1wc1ZhbGlkW01BWF9USU1FX1NUQU1QU107CisKKyAgICAvLyBUaW1lc3RhbXAgYXJyYXkgLSBTaW5jZSBjb2RlYyBkb2VzIG5vdCB0YWtlIDY0IGJpdCB0aW1lc3RhbXBzLAorICAgIC8vIHRoZXkgYXJlIG1haW50YWluZWQgaW4gdGhlIHBsdWdpbgorICAgIE9NWF9TNjQgbVRpbWVTdGFtcHNbTUFYX1RJTUVfU1RBTVBTXTsKKworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKyAgICBjaGFyIG1JbkZpbGVbMjAwXTsKKyNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisKKyAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBtT214Q29sb3JGb3JtYXQ7ICAgIC8vIE9NWCBDb2xvciBmb3JtYXQKKyAgICBJVl9DT0xPUl9GT1JNQVRfVCBtSXZDb2xvckZvcm1hdDsgICAgICAgIC8vIEl0dGlhbSBDb2xvciBmb3JtYXQKKworICAgIGJvb2wgbUlzSW5GbHVzaDsgICAgICAgIC8vIGNvZGVjIGlzIGZsdXNoIG1vZGUKKyAgICBib29sIG1SZWNlaXZlZEVPUzsgICAgICAvLyBFT1MgaXMgcmVjZWlldmVkIG9uIGlucHV0IHBvcnQKKyAgICBib29sIG1Jbml0TmVlZGVkOworICAgIHVpbnQzMl90IG1OZXdXaWR0aDsKKyAgICB1aW50MzJfdCBtTmV3SGVpZ2h0OworICAgIC8vIFRoZSBpbnB1dCBzdHJlYW0gaGFzIGNoYW5nZWQgdG8gYSBkaWZmZXJlbnQgcmVzb2x1dGlvbiwgd2hpY2ggaXMgc3RpbGwgc3VwcG9ydGVkIGJ5IHRoZQorICAgIC8vIGNvZGVjLiBTbyB0aGUgY29kZWMgaXMgc3dpdGNoaW5nIHRvIGRlY29kZSB0aGUgbmV3IHJlc29sdXRpb24uCisgICAgYm9vbCBtQ2hhbmdpbmdSZXNvbHV0aW9uOworICAgIGJvb2wgbUZsdXNoTmVlZGVkOworICAgIGJvb2wgbVdhaXRGb3JJOworCisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKyAgICBzdGF0dXNfdCBkZUluaXREZWNvZGVyKCk7CisgICAgc3RhdHVzX3Qgc2V0Rmx1c2hNb2RlKCk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1zKHNpemVfdCBzdHJpZGUpOworICAgIHZvaWQgbG9nVmVyc2lvbigpOworICAgIHN0YXR1c190IHNldE51bUNvcmVzKCk7CisgICAgc3RhdHVzX3QgcmVzZXREZWNvZGVyKCk7CisgICAgc3RhdHVzX3QgcmVzZXRQbHVnaW4oKTsKKyAgICBzdGF0dXNfdCByZUluaXREZWNvZGVyKCk7CisKKyAgICB2b2lkIHNldERlY29kZUFyZ3MoCisgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3QgKnBzX2RlY19pcCwKKyAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjX29wLAorICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyLAorICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciwKKyAgICAgICAgICAgIHNpemVfdCB0aW1lU3RhbXBJeCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTb2Z0TVBFRzIpOworfTsKKworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKworI2RlZmluZSBJTlBVVF9EVU1QX1BBVEggICAgICIvc2RjYXJkL21lZGlhL21wZWcyZF9pbnB1dCIKKyNkZWZpbmUgSU5QVVRfRFVNUF9FWFQgICAgICAibTJ2IgorCisjZGVmaW5lIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0cmNweShtSW5GaWxlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3ByaW50ZihtSW5GaWxlLCAiJXNfJWxkLiVsZC4lcyIsIElOUFVUX0RVTVBfUEFUSCwgIFwKKyAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfc2VjLCBtVGltZVN0YXJ0LnR2X3VzZWMsICAgICAgXAorICAgICAgICAgICAgSU5QVVRfRFVNUF9FWFQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKSB7ICAgICAgICAgICAgICAgICAgXAorICAgIEZJTEUgKmZwID0gZm9wZW4obV9maWxlbmFtZSwgIndiIik7ICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZwICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZmNsb3NlKGZwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFMT0dEKCJDb3VsZCBub3Qgb3BlbiBmaWxlICVzIiwgbV9maWxlbmFtZSk7ICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2RlZmluZSBEVU1QX1RPX0ZJTEUobV9maWxlbmFtZSwgbV9idWYsIG1fc2l6ZSkgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGSUxFICpmcCA9IGZvcGVuKG1fZmlsZW5hbWUsICJhYiIpOyAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmcCAhPSBOVUxMICYmIG1fYnVmICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaSA9IGZ3cml0ZShtX2J1ZiwgMSwgbV9zaXplLCBmcCk7ICAgICAgICAgICAgICAgXAorICAgICAgICBBTE9HRCgiZndyaXRlIHJldCAlZCB0byB3cml0ZSAlZCIsIGksIG1fc2l6ZSk7ICBcCisgICAgICAgIGlmIChpICE9IChpbnQpbV9zaXplKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dEKCJFcnJvciBpbiBmd3JpdGUsIHJldHVybmVkICVkIiwgaSk7ICAgXAorICAgICAgICAgICAgcGVycm9yKCJFcnJvciBpbiB3cml0ZSB0byBmaWxlIik7ICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZmNsb3NlKGZwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFMT0dEKCJDb3VsZCBub3Qgd3JpdGUgdG8gZmlsZSAlcyIsIG1fZmlsZW5hbWUpO1wKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2Vsc2UgLyogRklMRV9EVU1QX0VOQUJMRSAqLworI2RlZmluZSBJTlBVVF9EVU1QX1BBVEgKKyNkZWZpbmUgSU5QVVRfRFVNUF9FWFQKKyNkZWZpbmUgT1VUUFVUX0RVTVBfUEFUSAorI2RlZmluZSBPVVRQVVRfRFVNUF9FWFQKKyNkZWZpbmUgR0VORVJBVEVfRklMRV9OQU1FUygpCisjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkKKyNkZWZpbmUgRFVNUF9UT19GSUxFKG1fZmlsZW5hbWUsIG1fYnVmLCBtX3NpemUpCisjZW5kaWYgLyogRklMRV9EVU1QX0VOQUJMRSAqLworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gU09GVF9NUEVHMl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL0FuZHJvaWQubWsKaW5kZXggZTI2NTEwNC4uMjUzZmEwNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9BbmRyb2lkLm1rCkBAIC02LDcgKzYsNiBAQAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKICAgICAgICAgJChUT1ApL2V4dGVybmFsL2xpYnZweC9saWJ2cHggXAotICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvb3BlbnNzbC9pbmNsdWRlIFwKICAgICAgICAgJChUT1ApL2V4dGVybmFsL2xpYnZweC9saWJ2cHgvdnB4X2NvZGVjIFwKICAgICAgICAgJChUT1ApL2V4dGVybmFsL2xpYnZweC9saWJ2cHgvdnB4X3BvcnRzIFwKICAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL0FuZHJvaWQubWsKaW5kZXggYmYwM2FkOS4uZTYzYjZiMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL0FuZHJvaWQubWsKQEAgLTk0LDYgKzk0LDggQEAKICAgICBMT0NBTF9DX0lOQ0xVREVTICs9ICQoTE9DQUxfUEFUSCkvLi9vbXhkbC9hcm1fbmVvbi9hcGkgXAogICAgICAgICAgICAgICAgICAgICAgICAgJChMT0NBTF9QQVRIKS8uL29teGRsL2FybV9uZW9uL3ZjL2FwaSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAkKExPQ0FMX1BBVEgpLy4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvYXBpCisgICAgIyBoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrLlMgZG9lcyBub3QgY29tcGlsZSB3aXRoIENsYW5nLgorICAgIExPQ0FMX0NMQU5HX0FTRkxBR1NfYXJtICs9IC1uby1pbnRlZ3JhdGVkLWFzCiAgIGVuZGlmCiBlbmRpZgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvaW5jL0gyNjRTd0RlY0FwaS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL2luYy9IMjY0U3dEZWNBcGkuaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvaW5jL2Jhc2V0eXBlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvaW5jL2Jhc2V0eXBlLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU0uaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fQml0RGVjX3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9CaXREZWNfcy5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fSURDVFRhYmxlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fSURDVFRhYmxlLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0lEQ1Rfcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0lEQ1Rfcy5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9NYXNrVGFibGUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9NYXNrVGFibGUuaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fVmVyc2lvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX1ZlcnNpb24uaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX3MuaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybU9NWC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1PTVguaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL29teHR5cGVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL29teHR5cGVzLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9vbXh0eXBlc19zLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL29teHR5cGVzX3MuaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU0uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTS5jCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU1fSURDVFRhYmxlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU1fSURDVFRhYmxlLmMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NX01hc2tUYWJsZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NX01hc2tUYWJsZS5jCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvYXJtVkMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvYXJtVkMuaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvYXBpL2FybVZDQ09NTV9zLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvYXBpL2FybVZDQ09NTV9zLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9vbXhWQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9vbXhWQy5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvb214VkNfcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9vbXhWQ19zLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvYXBpL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfTG9va3VwX1RhYmxlcy5jCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvc3JjL2FybVZDX1ZlcnNpb24uYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL0RlY1Rlc3RCZW5jaC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9EZWNUZXN0QmVuY2guYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL0V2YWx1YXRpb25UZXN0QmVuY2guYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvRXZhbHVhdGlvblRlc3RCZW5jaC5jCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvSDI2NFN3RGVjQXBpLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL0gyNjRTd0RlY0FwaS5jCmluZGV4IDJjMTUyZWIuLmY4MjBkZmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvSDI2NFN3RGVjQXBpLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9IMjY0U3dEZWNBcGkuYwpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgPGxvZy9sb2cuaD4KIAogI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgImJhc2V0eXBlLmgiCiAjaW5jbHVkZSAiaDI2NGJzZF9jb250YWluZXIuaCIKICNpbmNsdWRlICJIMjY0U3dEZWNBcGkuaCIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvVGVzdEJlbmNoTXVsdGlwbGVJbnN0YW5jZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9UZXN0QmVuY2hNdWx0aXBsZUluc3RhbmNlLmMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2J5dGVfc3RyZWFtLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfYnl0ZV9zdHJlYW0uYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfYnl0ZV9zdHJlYW0uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9ieXRlX3N0cmVhbS5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jYXZsYy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NhdmxjLmMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NhdmxjLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY2F2bGMuaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY2ZnLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY2ZnLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NvbmNlYWwuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jb25jZWFsLmMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NvbmNlYWwuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jb25jZWFsLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NvbnRhaW5lci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NvbnRhaW5lci5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kZWJsb2NraW5nLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZGVibG9ja2luZy5jCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kZWJsb2NraW5nLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZGVibG9ja2luZy5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kcGIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kcGIuYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZHBiLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZHBiLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ltYWdlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW1hZ2UuYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW1hZ2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbWFnZS5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRlcl9wcmVkaWN0aW9uLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW50ZXJfcHJlZGljdGlvbi5jCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRlcl9wcmVkaWN0aW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW50ZXJfcHJlZGljdGlvbi5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW50cmFfcHJlZGljdGlvbi5jCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW50cmFfcHJlZGljdGlvbi5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbWFjcm9ibG9ja19sYXllci5jCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbWFjcm9ibG9ja19sYXllci5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9uYWxfdW5pdC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX25hbF91bml0LmMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX25hbF91bml0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmFsX3VuaXQuaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmVpZ2hib3VyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmVpZ2hib3VyLmMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX25laWdoYm91ci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX25laWdoYm91ci5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfb3JkZXJfY250LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcGljX29yZGVyX2NudC5jCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfb3JkZXJfY250LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcGljX29yZGVyX2NudC5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfcGFyYW1fc2V0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcGljX3BhcmFtX3NldC5jCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfcGFyYW1fc2V0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcGljX3BhcmFtX3NldC5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9yZWNvbnN0cnVjdC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3JlY29uc3RydWN0LmMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3JlY29uc3RydWN0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcmVjb25zdHJ1Y3QuaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2VpLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2VpLmMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NlaS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NlaS5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2VxX3BhcmFtX3NldC5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9kYXRhLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfZGF0YS5jCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9kYXRhLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfZGF0YS5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9ncm91cF9tYXAuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9ncm91cF9tYXAuYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfZ3JvdXBfbWFwLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfZ3JvdXBfbWFwLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2hlYWRlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2hlYWRlci5jCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9oZWFkZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9oZWFkZXIuaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RvcmFnZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3N0b3JhZ2UuYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RvcmFnZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3N0b3JhZ2UuaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RyZWFtLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RyZWFtLmMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3N0cmVhbS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3N0cmVhbS5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF90cmFuc2Zvcm0uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF90cmFuc2Zvcm0uYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdHJhbnNmb3JtLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdHJhbnNmb3JtLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3V0aWwuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF91dGlsLmMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3V0aWwuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF91dGlsLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3ZsYy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3ZsYy5jCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF92bGMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF92bGMuaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdnVpLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdnVpLmMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3Z1aS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3Z1aS5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9hdWRpby54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYXVkaW8ueG1sCmluZGV4IGEwNjY4NGIuLmI5NTdiMGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9hdWRpby54bWwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2F1ZGlvLnhtbApAQCAtMzgsMTIgKzM4LDEyIEBACiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5nNzExLmFsYXcuZGVjb2RlciIgdHlwZT0iYXVkaW8vZzcxMS1hbGF3Ij4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjEiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwLTQ4MDAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI2NDAwMCIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmc3MTEubWxhdy5kZWNvZGVyIiB0eXBlPSJhdWRpby9nNzExLW1sYXciPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAtNDgwMDAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjY0MDAwIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUudm9yYmlzLmRlY29kZXIiIHR5cGU9ImF1ZGlvL3ZvcmJpcyI+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfdmlkZW8ueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX3ZpZGVvLnhtbApvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDdlOWZhMTguLjc0MGY5NmIKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX3ZpZGVvLnhtbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfdmlkZW8ueG1sCkBAIC0xNiw2ICsxNiwxNSBAQAogCiA8SW5jbHVkZWQ+CiAgICAgPERlY29kZXJzPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLm1wZWcyLmRlY29kZXIiIHR5cGU9InZpZGVvL21wZWcyIj4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTGV2ZWxITCAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjE2eDE2IiBtYXg9IjE5MjB4MTA4OCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS0yNDQ4MDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMjAwMDAwMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLm1wZWc0LmRlY29kZXIiIHR5cGU9InZpZGVvL21wNHYtZXMiPgogICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZVNpbXBsZSA6IExldmVsMyAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIzNTJ4Mjg4IiAvPgpAQCAtMzQsMTIgKzQzLDEyIEBACiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmgyNjQuZGVjb2RlciIgdHlwZT0idmlkZW8vYXZjIj4KLSAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVCYXNlbGluZSA6IExldmVsNTEgLS0+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMjA0OHgyMDQ4IiAvPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZUhpZ2ggOiBMZXZlbDQxIC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMTZ4MTYiIG1heD0iMTkyMHgxMDg4IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTk4MzA0MCIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS00MDAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtMjQ0ODAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTEyMDAwMDAwIiAvPgogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5oZXZjLmRlY29kZXIiIHR5cGU9InZpZGVvL2hldmMiPgpAQCAtNzgsMTIgKzg3LDEyIEBACiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMTI4MDAwIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuaDI2NC5lbmNvZGVyIiB0eXBlPSJ2aWRlby9hdmMiPgotICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZUJhc2VsaW5lIDogTGV2ZWwyIC0tPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMTZ4MTYiIG1heD0iODk2eDg5NiIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVCYXNlbGluZSA6IExldmVsNDEgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIxNngxNiIgbWF4PSIxOTIweDEwODgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtMTE4ODAiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMjAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtMjQ0ODAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTEyMDAwMDAwIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUubXBlZzQuZW5jb2RlciIgdHlwZT0idmlkZW8vbXA0di1lcyI+CiAgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlQ29yZSA6IExldmVsMiAtLT4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuY3BwCmluZGV4IGUwZGM3NjguLjJkNTdhZWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmNwcApAQCAtMTcsNiArMTcsNyBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJBTG9vcGVyUm9zdGVyIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogI2luY2x1ZGUgIkFMb29wZXJSb3N0ZXIuaCIKIApAQCAtMjYsNiArMjcsOCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3N0YXRpYyBib29sIHZlcmJvc2VTdGF0cyA9IGZhbHNlOworCiBBTG9vcGVyUm9zdGVyOjpBTG9vcGVyUm9zdGVyKCkKICAgICA6IG1OZXh0SGFuZGxlcklEKDEpLAogICAgICAgbU5leHRSZXBseUlEKDEpIHsKQEAgLTEzNiw2ICsxMzksMTcgQEAKICAgICB9CiAKICAgICBoYW5kbGVyLT5vbk1lc3NhZ2VSZWNlaXZlZChtc2cpOworICAgIGhhbmRsZXItPm1NZXNzYWdlQ291bnRlcisrOworCisgICAgaWYgKHZlcmJvc2VTdGF0cykgeworICAgICAgICB1aW50MzJfdCB3aGF0ID0gbXNnLT53aGF0KCk7CisgICAgICAgIHNzaXplX3QgaWR4ID0gaGFuZGxlci0+bU1lc3NhZ2VzLmluZGV4T2ZLZXkod2hhdCk7CisgICAgICAgIGlmIChpZHggPCAwKSB7CisgICAgICAgICAgICBoYW5kbGVyLT5tTWVzc2FnZXMuYWRkKHdoYXQsIDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaGFuZGxlci0+bU1lc3NhZ2VzLmVkaXRWYWx1ZUF0KGlkeCkrKzsKKyAgICAgICAgfQorICAgIH0KIH0KIAogc3A8QUxvb3Blcj4gQUxvb3BlclJvc3Rlcjo6ZmluZExvb3BlcihBTG9vcGVyOjpoYW5kbGVyX2lkIGhhbmRsZXJJRCkgewpAQCAtMTk2LDQgKzIxMCw3MiBAQAogICAgIG1SZXBsaWVzQ29uZGl0aW9uLmJyb2FkY2FzdCgpOwogfQogCitzdGF0aWMgdm9pZCBtYWtlRm91ckNDKHVpbnQzMl90IGZvdXJjYywgY2hhciAqcykgeworICAgIHNbMF0gPSAoZm91cmNjID4+IDI0KSAmIDB4ZmY7CisgICAgaWYgKHNbMF0pIHsKKyAgICAgICAgc1sxXSA9IChmb3VyY2MgPj4gMTYpICYgMHhmZjsKKyAgICAgICAgc1syXSA9IChmb3VyY2MgPj4gOCkgJiAweGZmOworICAgICAgICBzWzNdID0gZm91cmNjICYgMHhmZjsKKyAgICAgICAgc1s0XSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3ByaW50ZihzLCAiJXUiLCBmb3VyY2MpOworICAgIH0KK30KKwordm9pZCBBTG9vcGVyUm9zdGVyOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgeworICAgIGJvb2wgY2xlYXIgPSBmYWxzZTsKKyAgICBib29sIG9sZFZlcmJvc2UgPSB2ZXJib3NlU3RhdHM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7aSA8IGFyZ3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGFyZ3NbaV0gPT0gU3RyaW5nMTYoIi1jIikpIHsKKyAgICAgICAgICAgIGNsZWFyID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldID09IFN0cmluZzE2KCItdm9uIikpIHsKKyAgICAgICAgICAgIHZlcmJvc2VTdGF0cyA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXSA9PSBTdHJpbmcxNigiLXZvZmYiKSkgeworICAgICAgICAgICAgdmVyYm9zZVN0YXRzID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgU3RyaW5nOCBzOworICAgIGlmICh2ZXJib3NlU3RhdHMgJiYgIW9sZFZlcmJvc2UpIHsKKyAgICAgICAgcy5hcHBlbmQoIih2ZXJib3NlIHN0YXRzIGNvbGxlY3Rpb24gZW5hYmxlZCwgc3RhdHMgd2lsbCBiZSBjbGVhcmVkKVxuIik7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBzaXplX3QgbiA9IG1IYW5kbGVycy5zaXplKCk7CisgICAgcy5hcHBlbmRGb3JtYXQoIiAlemQgcmVnaXN0ZXJlZCBoYW5kbGVyczpcbiIsIG4pOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgcy5hcHBlbmRGb3JtYXQoIiAgJXpkOiAiLCBpKTsKKyAgICAgICAgSGFuZGxlckluZm8gJmluZm8gPSBtSGFuZGxlcnMuZWRpdFZhbHVlQXQoaSk7CisgICAgICAgIHNwPEFMb29wZXI+IGxvb3BlciA9IGluZm8ubUxvb3Blci5wcm9tb3RlKCk7CisgICAgICAgIGlmIChsb29wZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgcy5hcHBlbmQobG9vcGVyLT5tTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIHNwPEFIYW5kbGVyPiBoYW5kbGVyID0gaW5mby5tSGFuZGxlci5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoaGFuZGxlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcy5hcHBlbmRGb3JtYXQoIjogJXUgbWVzc2FnZXMgcHJvY2Vzc2VkIiwgaGFuZGxlci0+bU1lc3NhZ2VDb3VudGVyKTsKKyAgICAgICAgICAgICAgICBpZiAodmVyYm9zZVN0YXRzKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaGFuZGxlci0+bU1lc3NhZ2VzLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGZvdXJjY1sxNV07CisgICAgICAgICAgICAgICAgICAgICAgICBtYWtlRm91ckNDKGhhbmRsZXItPm1NZXNzYWdlcy5rZXlBdChqKSwgZm91cmNjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMuYXBwZW5kRm9ybWF0KCJcbiAgICAlczogJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VyY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXItPm1NZXNzYWdlcy52YWx1ZUF0KGopKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZXItPm1NZXNzYWdlcy5jbGVhcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY2xlYXIgfHwgKHZlcmJvc2VTdGF0cyAmJiAhb2xkVmVyYm9zZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlci0+bU1lc3NhZ2VDb3VudGVyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlci0+bU1lc3NhZ2VzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzLmFwcGVuZCgiOiA8c3RhbGUgaGFuZGxlcj4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHMuYXBwZW5kKCI8c3RhbGU+Iik7CisgICAgICAgIH0KKyAgICAgICAgcy5hcHBlbmQoIlxuIik7CisgICAgfQorICAgIHdyaXRlKGZkLCBzLnN0cmluZygpLCBzLnNpemUoKSk7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuY3BwCmluZGV4IDI2YmVhMmMuLjQ5NDJiYTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuY3BwCkBAIC00MjYsMTkgKzQyNiwxOSBAQAogCiAgICAgQVN0cmluZyB0bXA7CiAgICAgaWYgKGlzRm91cmNjKG1XaGF0KSkgewotICAgICAgICB0bXAgPSBTdHJpbmdQcmludGYoCisgICAgICAgIHRtcCA9IEFTdHJpbmdQcmludGYoCiAgICAgICAgICAgICAgICAgIiclYyVjJWMlYyciLAogICAgICAgICAgICAgICAgIChjaGFyKShtV2hhdCA+PiAyNCksCiAgICAgICAgICAgICAgICAgKGNoYXIpKChtV2hhdCA+PiAxNikgJiAweGZmKSwKICAgICAgICAgICAgICAgICAoY2hhcikoKG1XaGF0ID4+IDgpICYgMHhmZiksCiAgICAgICAgICAgICAgICAgKGNoYXIpKG1XaGF0ICYgMHhmZikpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHRtcCA9IFN0cmluZ1ByaW50ZigiMHglMDh4IiwgbVdoYXQpOworICAgICAgICB0bXAgPSBBU3RyaW5nUHJpbnRmKCIweCUwOHgiLCBtV2hhdCk7CiAgICAgfQogICAgIHMuYXBwZW5kKHRtcCk7CiAKICAgICBpZiAobVRhcmdldCAhPSAwKSB7Ci0gICAgICAgIHRtcCA9IFN0cmluZ1ByaW50ZigiLCB0YXJnZXQgPSAlZCIsIG1UYXJnZXQpOworICAgICAgICB0bXAgPSBBU3RyaW5nUHJpbnRmKCIsIHRhcmdldCA9ICVkIiwgbVRhcmdldCk7CiAgICAgICAgIHMuYXBwZW5kKHRtcCk7CiAgICAgfQogICAgIHMuYXBwZW5kKCIpID0ge1xuIik7CkBAIC00NDgsMzcgKzQ0OCwzNyBAQAogCiAgICAgICAgIHN3aXRjaCAoaXRlbS5tVHlwZSkgewogICAgICAgICAgICAgY2FzZSBrVHlwZUludDMyOgotICAgICAgICAgICAgICAgIHRtcCA9IFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICB0bXAgPSBBU3RyaW5nUHJpbnRmKAogICAgICAgICAgICAgICAgICAgICAgICAgImludDMyX3QgJXMgPSAlZCIsIGl0ZW0ubU5hbWUsIGl0ZW0udS5pbnQzMlZhbHVlKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2Uga1R5cGVJbnQ2NDoKLSAgICAgICAgICAgICAgICB0bXAgPSBTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgdG1wID0gQVN0cmluZ1ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgICJpbnQ2NF90ICVzID0gJWxsZCIsIGl0ZW0ubU5hbWUsIGl0ZW0udS5pbnQ2NFZhbHVlKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2Uga1R5cGVTaXplOgotICAgICAgICAgICAgICAgIHRtcCA9IFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICB0bXAgPSBBU3RyaW5nUHJpbnRmKAogICAgICAgICAgICAgICAgICAgICAgICAgInNpemVfdCAlcyA9ICVkIiwgaXRlbS5tTmFtZSwgaXRlbS51LnNpemVWYWx1ZSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIGtUeXBlRmxvYXQ6Ci0gICAgICAgICAgICAgICAgdG1wID0gU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgIHRtcCA9IEFTdHJpbmdQcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICAiZmxvYXQgJXMgPSAlZiIsIGl0ZW0ubU5hbWUsIGl0ZW0udS5mbG9hdFZhbHVlKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2Uga1R5cGVEb3VibGU6Ci0gICAgICAgICAgICAgICAgdG1wID0gU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgIHRtcCA9IEFTdHJpbmdQcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICAiZG91YmxlICVzID0gJWYiLCBpdGVtLm1OYW1lLCBpdGVtLnUuZG91YmxlVmFsdWUpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBrVHlwZVBvaW50ZXI6Ci0gICAgICAgICAgICAgICAgdG1wID0gU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgIHRtcCA9IEFTdHJpbmdQcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICAidm9pZCAqJXMgPSAlcCIsIGl0ZW0ubU5hbWUsIGl0ZW0udS5wdHJWYWx1ZSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIGtUeXBlU3RyaW5nOgotICAgICAgICAgICAgICAgIHRtcCA9IFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICB0bXAgPSBBU3RyaW5nUHJpbnRmKAogICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZyAlcyA9IFwiJXNcIiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLm1OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS51LnN0cmluZ1ZhbHVlLT5jX3N0cigpKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2Uga1R5cGVPYmplY3Q6Ci0gICAgICAgICAgICAgICAgdG1wID0gU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgIHRtcCA9IEFTdHJpbmdQcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICAiUmVmQmFzZSAqJXMgPSAlcCIsIGl0ZW0ubU5hbWUsIGl0ZW0udS5yZWZWYWx1ZSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIGtUeXBlQnVmZmVyOgpAQCAtNDg2LDE4ICs0ODYsMTggQEAKICAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBzdGF0aWNfY2FzdDxBQnVmZmVyICo+KGl0ZW0udS5yZWZWYWx1ZSk7CiAKICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyICE9IE5VTEwgJiYgYnVmZmVyLT5kYXRhKCkgIT0gTlVMTCAmJiBidWZmZXItPnNpemUoKSA8PSA2NCkgewotICAgICAgICAgICAgICAgICAgICB0bXAgPSBTdHJpbmdQcmludGYoIkJ1ZmZlciAlcyA9IHtcbiIsIGl0ZW0ubU5hbWUpOworICAgICAgICAgICAgICAgICAgICB0bXAgPSBBU3RyaW5nUHJpbnRmKCJCdWZmZXIgJXMgPSB7XG4iLCBpdGVtLm1OYW1lKTsKICAgICAgICAgICAgICAgICAgICAgaGV4ZHVtcChidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCksIGluZGVudCArIDQsICZ0bXApOwogICAgICAgICAgICAgICAgICAgICBhcHBlbmRJbmRlbnQoJnRtcCwgaW5kZW50ICsgMik7CiAgICAgICAgICAgICAgICAgICAgIHRtcC5hcHBlbmQoIn0iKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0bXAgPSBTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgICAgIHRtcCA9IEFTdHJpbmdQcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJ1ZmZlciAqJXMgPSAlcCIsIGl0ZW0ubU5hbWUsIGJ1ZmZlci5nZXQoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2FzZSBrVHlwZU1lc3NhZ2U6Ci0gICAgICAgICAgICAgICAgdG1wID0gU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgIHRtcCA9IEFTdHJpbmdQcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICAiQU1lc3NhZ2UgJXMgPSAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLm1OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QU1lc3NhZ2UgKj4oCkBAIC01MDUsNyArNTA1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50ICsgc3RybGVuKGl0ZW0ubU5hbWUpICsgMTQpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBrVHlwZVJlY3Q6Ci0gICAgICAgICAgICAgICAgdG1wID0gU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgIHRtcCA9IEFTdHJpbmdQcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICAiUmVjdCAlcyglZCwgJWQsICVkLCAlZCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5tTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0udS5yZWN0VmFsdWUubUxlZnQsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FOZXR3b3JrU2Vzc2lvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FOZXR3b3JrU2Vzc2lvbi5jcHAKaW5kZXggNDUwNGMyYi4uYjIzMDQwMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTmV0d29ya1Nlc3Npb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU5ldHdvcmtTZXNzaW9uLmNwcApAQCAtMTg3LDcgKzE4Nyw3IEBACiAgICAgICAgIENIRUNLX0dFKHJlcywgMCk7CiAKICAgICAgICAgaW5fYWRkcl90IGFkZHIgPSBudG9obChsb2NhbEFkZHIuc2luX2FkZHIuc19hZGRyKTsKLSAgICAgICAgQVN0cmluZyBsb2NhbEFkZHJTdHJpbmcgPSBTdHJpbmdQcmludGYoCisgICAgICAgIEFTdHJpbmcgbG9jYWxBZGRyU3RyaW5nID0gQVN0cmluZ1ByaW50ZigKICAgICAgICAgICAgICAgICAiJWQuJWQuJWQuJWQiLAogICAgICAgICAgICAgICAgIChhZGRyID4+IDI0KSwKICAgICAgICAgICAgICAgICAoYWRkciA+PiAxNikgJiAweGZmLApAQCAtMTk1LDcgKzE5NSw3IEBACiAgICAgICAgICAgICAgICAgYWRkciAmIDB4ZmYpOwogCiAgICAgICAgIGFkZHIgPSBudG9obChyZW1vdGVBZGRyLnNpbl9hZGRyLnNfYWRkcik7Ci0gICAgICAgIEFTdHJpbmcgcmVtb3RlQWRkclN0cmluZyA9IFN0cmluZ1ByaW50ZigKKyAgICAgICAgQVN0cmluZyByZW1vdGVBZGRyU3RyaW5nID0gQVN0cmluZ1ByaW50ZigKICAgICAgICAgICAgICAgICAiJWQuJWQuJWQuJWQiLAogICAgICAgICAgICAgICAgIChhZGRyID4+IDI0KSwKICAgICAgICAgICAgICAgICAoYWRkciA+PiAxNikgJiAweGZmLApAQCAtMzAxLDcgKzMwMSw3IEBACiAgICAgICAgICAgICAgICAgdWludDMyX3QgaXAgPSBudG9obChyZW1vdGVBZGRyLnNpbl9hZGRyLnNfYWRkcik7CiAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICAiZnJvbUFkZHIiLAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgQVN0cmluZ1ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXUuJXUuJXUuJXUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwID4+IDI0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpcCA+PiAxNikgJiAweGZmLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5jcHAKaW5kZXggOTgzNWNhMy4uYjE2NzU0MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuY3BwCkBAIC0zNjYsNyArMzY2LDcgQEAKICAgICByZXR1cm4gZXJyOwogfQogCi1BU3RyaW5nIFN0cmluZ1ByaW50Zihjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgeworQVN0cmluZyBBU3RyaW5nUHJpbnRmKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSB7CiAgICAgdmFfbGlzdCBhcDsKICAgICB2YV9zdGFydChhcCwgZm9ybWF0KTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BV2FrZUxvY2suY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BV2FrZUxvY2suY3BwCmluZGV4IDg4YzRmNmUuLmQ5Mjc3YWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVdha2VMb2NrLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FXYWtlTG9jay5jcHAKQEAgLTM2LDcgKzM2LDcgQEAKIAogQVdha2VMb2NrOjp+QVdha2VMb2NrKCkgewogICAgIGlmIChtUG93ZXJNYW5hZ2VyICE9IE5VTEwpIHsKLSAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gbVBvd2VyTWFuYWdlci0+YXNCaW5kZXIoKTsKKyAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gSUludGVyZmFjZTo6YXNCaW5kZXIobVBvd2VyTWFuYWdlcik7CiAgICAgICAgIGJpbmRlci0+dW5saW5rVG9EZWF0aChtRGVhdGhSZWNpcGllbnQpOwogICAgIH0KICAgICBjbGVhclBvd2VyTWFuYWdlcigpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9NZWRpYUhUVFAuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9NZWRpYUhUVFAuY3BwCmluZGV4IDJkMjk5MTMuLmJiODk1NjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvTWVkaWFIVFRQLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL01lZGlhSFRUUC5jcHAKQEAgLTEyOSw3ICsxMjksNyBAQAogCiAgICAgKnNpemUgPSBtQ2FjaGVkU2l6ZTsKIAotICAgIHJldHVybiAqc2l6ZSA8IDAgPyAqc2l6ZSA6IE9LOworICAgIHJldHVybiAqc2l6ZSA8IDAgPyAqc2l6ZSA6IHN0YXRpY19jYXN0PHN0YXR1c190PihPSyk7CiB9CiAKIHVpbnQzMl90IE1lZGlhSFRUUDo6ZmxhZ3MoKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5tawppbmRleCBlOGQ1NThjLi45M2I3OTM1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQubWsKQEAgLTEwLDggKzEwLDcgQEAKIAogTE9DQUxfQ19JTkNMVURFUzo9IFwKIAkkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0JJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCi0JJChUT1ApL2V4dGVybmFsL29wZW5zc2wvaW5jbHVkZQorCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAogTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uY3BwCmluZGV4IDQzNTVhM2MuLmQwZjNiYzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5jcHAKQEAgLTcwOSw3ICs3MDksNiBAQAogICAgICAgICAgICAgQVN0cmluZyB1cmk7CiAgICAgICAgICAgICBtUGxheWxpc3QtPml0ZW1BdChpLCAmdXJpLCAmbWV0YSk7CiAKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYmFuZHdpZHRoOwogICAgICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKCJiYW5kd2lkdGgiLCAoaW50MzJfdCAqKSZpdGVtLm1CYW5kd2lkdGgpKTsKIAogICAgICAgICAgICAgaWYgKGluaXRpYWxCYW5kd2lkdGggPT0gMCkgewpAQCAtODQ3LDExICs4NDYsMTEgQEAKICAgICAgICAgICAgICAgICBoZWFkZXJzLmFkZCgKICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoIlJhbmdlIiksCiAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU3RyaW5nUHJpbnRmKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZXM9JWxsZC0lcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlX29mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VfbGVuZ3RoIDwgMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAiIiA6IFN0cmluZ1ByaW50ZigiJWxsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICIiIDogQVN0cmluZ1ByaW50ZigiJWxsZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlX29mZnNldCArIHJhbmdlX2xlbmd0aCAtIDEpLmNfc3RyKCkpLmNfc3RyKCkpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1IVFRQRGF0YVNvdXJjZS0+Y29ubmVjdCh1cmwsICZoZWFkZXJzKTsKQEAgLTk5MCw5ICs5ODksMTEgQEAKICAgICByZXR1cm4gcGxheWxpc3Q7CiB9CiAKKyNpZiAwCiBzdGF0aWMgZG91YmxlIHVuaWZvcm1SYW5kKCkgewogICAgIHJldHVybiAoZG91YmxlKXJhbmQoKSAvIFJBTkRfTUFYOwogfQorI2VuZGlmCiAKIHNpemVfdCBMaXZlU2Vzc2lvbjo6Z2V0QmFuZHdpZHRoSW5kZXgoKSB7CiAgICAgaWYgKG1CYW5kd2lkdGhJdGVtcy5zaXplKCkgPT0gMCkgewpAQCAtMTQ2OSw3ICsxNDcwLDYgQEAKICAgICAgICAgc3A8UGxheWxpc3RGZXRjaGVyPiBmZXRjaGVyID0gYWRkRmV0Y2hlcih1cmkuY19zdHIoKSk7CiAgICAgICAgIENIRUNLKGZldGNoZXIgIT0gTlVMTCk7CiAKLSAgICAgICAgaW50MzJfdCBsYXRlc3RTZXEgPSAtMTsKICAgICAgICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IC0xOwogICAgICAgICBpbnQ2NF90IHNlZ21lbnRTdGFydFRpbWVVcyA9IC0xbGw7CiAgICAgICAgIGludDMyX3QgZGlzY29udGludWl0eVNlcSA9IC0xOwpAQCAtMTQ5Nyw3ICsxNDk3LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfVElNRSwgZXh0cmEsIHRydWUpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdHlwZTsKLSAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBzcmNTZWdtZW50U3RhcnRUaW1lVXM7CiAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtZXRhOwogICAgICAgICAgICAgICAgICAgICBpZiAocGlja1RyYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWxlY3RpbmcKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5oCmluZGV4IGRmYjVlNTkuLjJkM2EyNWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uaApAQCAtMzMsNyArMzMsNiBAQAogc3RydWN0IExpdmVEYXRhU291cmNlOwogc3RydWN0IE0zVVBhcnNlcjsKIHN0cnVjdCBQbGF5bGlzdEZldGNoZXI7Ci1zdHJ1Y3QgUGFyY2VsOwogCiBzdHJ1Y3QgTGl2ZVNlc3Npb24gOiBwdWJsaWMgQUhhbmRsZXIgewogICAgIGVudW0gRmxhZ3MgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5jcHAKaW5kZXggMDBlNTJlZS4uMTIyNzYwMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuY3BwCkBAIC0yOTEsNyArMjkxLDYgQEAKIH0KIAogc3RhdHVzX3QgUGxheWxpc3RGZXRjaGVyOjpjaGVja0RlY3J5cHRQYWRkaW5nKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKLSAgICBzdGF0dXNfdCBlcnI7CiAgICAgQVN0cmluZyBtZXRob2Q7CiAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRTdHJpbmcoImNpcGhlci1tZXRob2QiLCAmbWV0aG9kKSk7CiAgICAgaWYgKG1ldGhvZCA9PSAiTk9ORSIpIHsKQEAgLTE1NDcsNyArMTU0Niw3IEBACiAKICAgICAgICAgQ0hFQ0tfRVEoYml0cy5nZXRCaXRzKDEyKSwgMHhmZmZ1KTsKICAgICAgICAgYml0cy5za2lwQml0cygzKTsgIC8vIElELCBsYXllcgotICAgICAgICBib29sIHByb3RlY3Rpb25fYWJzZW50ID0gYml0cy5nZXRCaXRzKDEpICE9IDA7CisgICAgICAgIGJvb2wgcHJvdGVjdGlvbl9hYnNlbnQgX191bnVzZWQgPSBiaXRzLmdldEJpdHMoMSkgIT0gMDsKIAogICAgICAgICB1bnNpZ25lZCBwcm9maWxlID0gYml0cy5nZXRCaXRzKDIpOwogICAgICAgICBDSEVDS19ORShwcm9maWxlLCAzdSk7CkBAIC0xNjg5LDcgKzE2ODgsNyBAQAogfQogCiBpbnQ2NF90IFBsYXlsaXN0RmV0Y2hlcjo6cmVzdW1lVGhyZXNob2xkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgaW50NjRfdCBkdXJhdGlvblVzLCB0aHJlc2hvbGQ7CisgICAgaW50NjRfdCBkdXJhdGlvblVzOwogICAgIGlmIChtc2ctPmZpbmRJbnQ2NCgiZHVyYXRpb25VcyIsICZkdXJhdGlvblVzKSAmJiBkdXJhdGlvblVzID4gMCkgewogICAgICAgICByZXR1cm4ga051bVNraXBGcmFtZXMgKiBkdXJhdGlvblVzOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmgKaW5kZXggNjcxNjFhOS4uNGUxNWY4NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmgKQEAgLTMxLDcgKzMxLDcgQEAKIHN0cnVjdCBIVFRQQmFzZTsKIHN0cnVjdCBMaXZlRGF0YVNvdXJjZTsKIHN0cnVjdCBNM1VQYXJzZXI7Ci1zdHJ1Y3QgU3RyaW5nODsKK2NsYXNzIFN0cmluZzg7CiAKIHN0cnVjdCBQbGF5bGlzdEZldGNoZXIgOiBwdWJsaWMgQUhhbmRsZXIgewogICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNaW5CdWZmZXJlZER1cmF0aW9uVXM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvSUQzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9JRDMuY3BwCmluZGV4IGVkMmQ5NDEuLjQ0MTA1NzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9JRDMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9JRDMuY3BwCkBAIC02NTMsNyArNjUzLDEwIEBACiAgICAgICAgICAgICAgICAgfCAobVBhcmVudC5tRGF0YVttT2Zmc2V0ICsgNF0gPDwgOCkKICAgICAgICAgICAgICAgICB8IG1QYXJlbnQubURhdGFbbU9mZnNldCArIDVdOwogCi0gICAgICAgICAgICBtRnJhbWVTaXplICs9IDY7CisgICAgICAgICAgICBpZiAobUZyYW1lU2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUZyYW1lU2l6ZSArPSA2OyAvLyBhZGQgdGFnIGlkIGFuZCBzaXplIGZpZWxkCiAKICAgICAgICAgICAgIC8vIFByZXZlbnQgaW50ZWdlciBvdmVyZmxvdyBpbiB2YWxpZGF0aW9uCiAgICAgICAgICAgICBpZiAoU0laRV9NQVggLSBtT2Zmc2V0IDw9IG1GcmFtZVNpemUpIHsKQEAgLTgzNSw4ICs4MzgsOCBAQAogICAgICAgICAgICAgbWltZS0+c2V0VG8oKGNvbnN0IGNoYXIgKikmZGF0YVsxXSk7CiAgICAgICAgICAgICBzaXplX3QgbWltZUxlbiA9IHN0cmxlbigoY29uc3QgY2hhciAqKSZkYXRhWzFdKSArIDE7CiAKLSAgICAgICAgICAgIHVpbnQ4X3QgcGljVHlwZSA9IGRhdGFbMSArIG1pbWVMZW5dOwogI2lmIDAKKyAgICAgICAgICAgIHVpbnQ4X3QgcGljVHlwZSA9IGRhdGFbMSArIG1pbWVMZW5dOwogICAgICAgICAgICAgaWYgKHBpY1R5cGUgIT0gMHgwMykgewogICAgICAgICAgICAgICAgIC8vIEZyb250IENvdmVyIEFydAogICAgICAgICAgICAgICAgIGl0Lm5leHQoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQUFDRW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BQUNFbmNvZGVyLmgKaW5kZXggM2Q1ZmM2MC4uNTJiZWIwZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BQUNFbmNvZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BQUNFbmNvZGVyLmgKQEAgLTI1LDcgKzI1LDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgTWVkaWFCdWZmZXJHcm91cDsKK2NsYXNzIE1lZGlhQnVmZmVyR3JvdXA7CiAKIGNsYXNzIEFBQ0VuY29kZXI6IHB1YmxpYyBNZWRpYVNvdXJjZSB7CiAgICAgcHVibGljOgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9JRDMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSUQzLmgKaW5kZXggZTgzZjNlZi4uYzJjNGE2ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9JRDMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0lEMy5oCkBAIC0yMiw4ICsyMiw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IERhdGFTb3VyY2U7Ci1zdHJ1Y3QgU3RyaW5nODsKK2NsYXNzIERhdGFTb3VyY2U7CitjbGFzcyBTdHJpbmc4OwogCiBzdHJ1Y3QgSUQzIHsKICAgICBlbnVtIFZlcnNpb24gewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHMlRTRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaAppbmRleCBjNWU4NmE2Li5kYjExODdkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaApAQCAtMjgsNyArMjgsNyBAQAogc3RydWN0IEFNZXNzYWdlOwogc3RydWN0IEFub3RoZXJQYWNrZXRTb3VyY2U7CiBzdHJ1Y3QgQVRTUGFyc2VyOwotc3RydWN0IERhdGFTb3VyY2U7CitjbGFzcyBEYXRhU291cmNlOwogc3RydWN0IE1QRUcyVFNTb3VyY2U7CiBzdHJ1Y3QgU3RyaW5nODsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NaWRpRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01pZGlFeHRyYWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTJhYmMwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NaWRpRXh0cmFjdG9yLmgKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUlESV9FWFRSQUNUT1JfSF8KKyNkZWZpbmUgTUlESV9FWFRSQUNUT1JfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgorI2luY2x1ZGUgPG1lZGlhL01pZGlJb1dyYXBwZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8bGlic29uaXZveC9lYXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNaWRpRW5naW5lIDogcHVibGljIFJlZkJhc2UgeworcHVibGljOgorICAgIE1pZGlFbmdpbmUoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFTb3VyY2UsCisgICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJmZpbGVNZXRhZGF0YSwKKyAgICAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmdHJhY2tNZXRhZGF0YSk7CisgICAgfk1pZGlFbmdpbmUoKTsKKworICAgIHN0YXR1c190IGluaXRDaGVjaygpOworCisgICAgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXJzKCk7CisgICAgc3RhdHVzX3QgcmVsZWFzZUJ1ZmZlcnMoKTsKKyAgICBzdGF0dXNfdCBzZWVrVG8oaW50NjRfdCBwb3NpdGlvblVzKTsKKyAgICBNZWRpYUJ1ZmZlciogcmVhZEJ1ZmZlcigpOworcHJpdmF0ZToKKyAgICBzcDxNaWRpSW9XcmFwcGVyPiBtSW9XcmFwcGVyOworICAgIE1lZGlhQnVmZmVyR3JvdXAgKm1Hcm91cDsKKyAgICBFQVNfREFUQV9IQU5ETEUgbUVhc0RhdGE7CisgICAgRUFTX0hBTkRMRSBtRWFzSGFuZGxlOworICAgIGNvbnN0IFNfRUFTX0xJQl9DT05GSUcqIG1FYXNDb25maWc7CisgICAgYm9vbCBtSXNJbml0aWFsaXplZDsKK307CisKK2NsYXNzIE1pZGlFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworCitwdWJsaWM6CisgICAgLy8gRXh0cmFjdG9yIGFzc3VtZXMgb3duZXJzaGlwIG9mIHNvdXJjZQorICAgIE1pZGlFeHRyYWN0b3IoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSk7CisKKyAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOworICAgIHZpcnR1YWwgc3A8TWVkaWFTb3VyY2U+IGdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0VHJhY2tNZXRhRGF0YShzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKworICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldE1ldGFEYXRhKCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5NaWRpRXh0cmFjdG9yKCk7CisKK3ByaXZhdGU6CisgICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7CisgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKKyAgICBzcDxNZXRhRGF0YT4gbUZpbGVNZXRhZGF0YTsKKworICAgIC8vIFRoZXJlIGlzIG9ubHkgb25lIHRyYWNrCisgICAgc3A8TWV0YURhdGE+IG1UcmFja01ldGFkYXRhOworCisgICAgc3A8TWlkaUVuZ2luZT4gbUVuZ2luZTsKKworICAgIEVBU19EQVRBX0hBTkRMRSAgICAgbUVhc0RhdGE7CisgICAgRUFTX0hBTkRMRSAgICAgICAgICBtRWFzSGFuZGxlOworICAgIEVBU19QQ00qICAgICAgICAgICAgbUF1ZGlvQnVmZmVyOworICAgIEVBU19JMzIgICAgICAgICAgICAgbVBsYXlUaW1lOworICAgIEVBU19JMzIgICAgICAgICAgICAgbUR1cmF0aW9uOworICAgIEVBU19TVEFURSAgICAgICAgICAgbVN0YXRlOworICAgIEVBU19GSUxFICAgICAgICAgICAgbUZpbGVMb2NhdG9yOworCisgICAgTWlkaUV4dHJhY3Rvcihjb25zdCBNaWRpRXh0cmFjdG9yICYpOworICAgIE1pZGlFeHRyYWN0b3IgJm9wZXJhdG9yPShjb25zdCBNaWRpRXh0cmFjdG9yICYpOworCit9OworCitib29sIFNuaWZmTWlkaShjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwKKyAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsIHNwPEFNZXNzYWdlPiAqKTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNSURJX0VYVFJBQ1RPUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9hdmNfdXRpbHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvYXZjX3V0aWxzLmgKaW5kZXggZDUxNzMyMC4uYzI3MGJjMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9hdmNfdXRpbHMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL2F2Y191dGlscy5oCkBAIC0yMyw3ICsyMyw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IEFCaXRSZWFkZXI7CitjbGFzcyBBQml0UmVhZGVyOwogCiBlbnVtIHsKICAgICBrQVZDUHJvZmlsZUJhc2VsaW5lICAgICAgPSAweDQyLApAQCAtNDksNyArNDksNyBAQAogICAgICAgICBjb25zdCB1aW50OF90ICoqbmFsU3RhcnQsIHNpemVfdCAqbmFsU2l6ZSwKICAgICAgICAgYm9vbCBzdGFydENvZGVGb2xsb3dzID0gZmFsc2UpOwogCi1zdHJ1Y3QgTWV0YURhdGE7CitjbGFzcyBNZXRhRGF0YTsKIHNwPE1ldGFEYXRhPiBNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpOwogCiBib29sIElzSURSKGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmNwcAppbmRleCBlNTMzMTliLi5jMzBlODA3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuY3BwCkBAIC01MDEsMTcgKzUwMSw2IEBACiAgICAgcmV0dXJuIHB0clswXSA8PCAxNiB8IHB0clsxXSA8PCA4IHwgcHRyWzJdOwogfQogCi1zdGF0aWMgc2l6ZV90IGNseih1aW50OF90IHgpIHsKLSAgICBzaXplX3QgbnVtTGVhZGluZ1plcm9lcyA9IDA7Ci0KLSAgICB3aGlsZSAoISh4ICYgMHg4MCkpIHsKLSAgICAgICAgKytudW1MZWFkaW5nWmVyb2VzOwotICAgICAgICB4ID0geCA8PCAxOwotICAgIH0KLQotICAgIHJldHVybiBudW1MZWFkaW5nWmVyb2VzOwotfQotCiB2b2lkIE1hdHJvc2thU291cmNlOjpjbGVhclBlbmRpbmdGcmFtZXMoKSB7CiAgICAgd2hpbGUgKCFtUGVuZGluZ0ZyYW1lcy5lbXB0eSgpKSB7CiAgICAgICAgIE1lZGlhQnVmZmVyICpmcmFtZSA9ICptUGVuZGluZ0ZyYW1lcy5iZWdpbigpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwCmluZGV4IDQ4MmNjZmYuLjFlYWU2Y2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAKQEAgLTEzNiw2ICsxMzYsNyBAQAogICAgIHNwPEFCdWZmZXI+IG1CdWZmZXI7CiAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gbVNvdXJjZTsKICAgICBib29sIG1QYXlsb2FkU3RhcnRlZDsKKyAgICBib29sIG1FT1NSZWFjaGVkOwogCiAgICAgdWludDY0X3QgbVByZXZQVFM7CiAKQEAgLTQ5Myw2ICs0OTQsNyBAQAogICAgICAgbVBDUl9QSUQoUENSX1BJRCksCiAgICAgICBtRXhwZWN0ZWRDb250aW51aXR5Q291bnRlcigtMSksCiAgICAgICBtUGF5bG9hZFN0YXJ0ZWQoZmFsc2UpLAorICAgICAgbUVPU1JlYWNoZWQoZmFsc2UpLAogICAgICAgbVByZXZQVFMoMCksCiAgICAgICBtUXVldWUoTlVMTCkgewogICAgIHN3aXRjaCAobVN0cmVhbVR5cGUpIHsKQEAgLTY5Miw2ICs2OTQsOCBAQAogICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKICAgICAgICAgbVNvdXJjZS0+c2lnbmFsRU9TKGZpbmFsUmVzdWx0KTsKICAgICB9CisgICAgbUVPU1JlYWNoZWQgPSB0cnVlOworICAgIGZsdXNoKCk7CiB9CiAKIHN0YXR1c190IEFUU1BhcnNlcjo6U3RyZWFtOjpwYXJzZVBFUyhBQml0UmVhZGVyICpicikgewpAQCAtOTAyLDYgKzkwNiwxMCBAQAogCiAgICAgc3RhdHVzX3QgZXJyID0gbVF1ZXVlLT5hcHBlbmREYXRhKGRhdGEsIHNpemUsIHRpbWVVcyk7CiAKKyAgICBpZiAobUVPU1JlYWNoZWQpIHsKKyAgICAgICAgbVF1ZXVlLT5zaWduYWxFT1MoKTsKKyAgICB9CisKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaAppbmRleCA1ZDc2Y2JkLi43NWQ3NmRjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmgKQEAgLTI4LDcgKzI4LDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgQUJpdFJlYWRlcjsKK2NsYXNzIEFCaXRSZWFkZXI7CiBzdHJ1Y3QgQUJ1ZmZlcjsKIHN0cnVjdCBNZWRpYVNvdXJjZTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAKaW5kZXggMmVkM2NjYy4uNTUyN2RmMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwCkBAIC0zOCw3ICszOCw4IEBACiAKIEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6RWxlbWVudGFyeVN0cmVhbVF1ZXVlKE1vZGUgbW9kZSwgdWludDMyX3QgZmxhZ3MpCiAgICAgOiBtTW9kZShtb2RlKSwKLSAgICAgIG1GbGFncyhmbGFncykgeworICAgICAgbUZsYWdzKGZsYWdzKSwKKyAgICAgIG1FT1NSZWFjaGVkKGZhbHNlKSB7CiB9CiAKIHNwPE1ldGFEYXRhPiBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmdldEZvcm1hdCgpIHsKQEAgLTYzLDggKzY0LDYgQEAKICAgICAgICAgY29uc3QgdWludDhfdCAqcHRyLCBzaXplX3Qgc2l6ZSwgc3A8TWV0YURhdGE+ICptZXRhRGF0YSkgewogICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFubmVsQ291bnRUYWJsZVtdID0gezIsIDEsIDIsIDMsIDMsIDQsIDQsIDV9OwogICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzYW1wbGluZ1JhdGVUYWJsZVtdID0gezQ4MDAwLCA0NDEwMCwgMzIwMDB9OwotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCByYXRlc1tdID0gezMyLCA0MCwgNDgsIDU2LCA2NCwgODAsIDk2LCAxMTIsIDEyOCwgMTYwLCAxOTIsIDIyNCwgMjU2LAotICAgICAgICAgICAgMzIwLCAzODQsIDQ0OCwgNTEyLCA1NzYsIDY0MH07CiAKICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgZnJhbWVTaXplVGFibGVbMTldWzNdID0gewogICAgICAgICB7IDY0LCA2OSwgOTYgfSwKQEAgLTg5LDcgKzg4LDYgQEAKICAgICB9OwogCiAgICAgQUJpdFJlYWRlciBiaXRzKHB0ciwgc2l6ZSk7Ci0gICAgdW5zaWduZWQgc3luY1N0YXJ0UG9zID0gMDsgIC8vIGluIGJ5dGVzCiAgICAgaWYgKGJpdHMubnVtQml0c0xlZnQoKSA8IDE2KSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTEyMSwxMSArMTE5LDExIEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIHVuc2lnbmVkIGJzbW9kID0gYml0cy5nZXRCaXRzKDMpOworICAgIHVuc2lnbmVkIGJzbW9kIF9fdW51c2VkID0gYml0cy5nZXRCaXRzKDMpOwogICAgIHVuc2lnbmVkIGFjbW9kID0gYml0cy5nZXRCaXRzKDMpOwotICAgIHVuc2lnbmVkIGNtaXhsZXYgPSAwOwotICAgIHVuc2lnbmVkIHN1cm1peGxldiA9IDA7Ci0gICAgdW5zaWduZWQgZHN1cm1vZCA9IDA7CisgICAgdW5zaWduZWQgY21peGxldiBfX3VudXNlZCA9IDA7CisgICAgdW5zaWduZWQgc3VybWl4bGV2IF9fdW51c2VkID0gMDsKKyAgICB1bnNpZ25lZCBkc3VybW9kIF9fdW51c2VkID0gMDsKIAogICAgIGlmICgoYWNtb2QgJiAxKSA+IDAgJiYgYWNtb2QgIT0gMSkgewogICAgICAgICBpZiAoYml0cy5udW1CaXRzTGVmdCgpIDwgMikgewpAQCAtMjQ3LDYgKzI0NSwxMSBAQAogCiBzdGF0dXNfdCBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmFwcGVuZERhdGEoCiAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBpbnQ2NF90IHRpbWVVcykgeworCisgICAgaWYgKG1FT1NSZWFjaGVkKSB7CisgICAgICAgIEFMT0dFKCJhcHBlbmRpbmcgZGF0YSBhZnRlciBFT1MiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CiAgICAgaWYgKG1CdWZmZXIgPT0gTlVMTCB8fCBtQnVmZmVyLT5zaXplKCkgPT0gMCkgewogICAgICAgICBzd2l0Y2ggKG1Nb2RlKSB7CiAgICAgICAgICAgICBjYXNlIEgyNjQ6CkBAIC0yNjAsOCArMjYzLDggQEAKICAgICAgICAgICAgICAgICB1aW50OF90ICpwdHIgPSAodWludDhfdCAqKWRhdGE7CiAKICAgICAgICAgICAgICAgICBzc2l6ZV90IHN0YXJ0T2Zmc2V0ID0gLTE7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgKyAzIDwgc2l6ZTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbWVtY21wKCJceDAwXHgwMFx4MDBceDAxIiwgJnB0cltpXSwgNCkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSArIDIgPCBzaXplOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtZW1jbXAoIlx4MDBceDAwXHgwMSIsICZwdHJbaV0sIDMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydE9mZnNldCA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNTU2LDcgKzU1OSw3IEBACiAgICAgQ0hFQ0tfRVEoYml0cy5nZXRCaXRzKDgpLCAweGEwKTsKICAgICB1bnNpZ25lZCBudW1BVXMgPSBiaXRzLmdldEJpdHMoOCk7CiAgICAgYml0cy5za2lwQml0cyg4KTsKLSAgICB1bnNpZ25lZCBxdWFudGl6YXRpb25fd29yZF9sZW5ndGggPSBiaXRzLmdldEJpdHMoMik7CisgICAgdW5zaWduZWQgcXVhbnRpemF0aW9uX3dvcmRfbGVuZ3RoIF9fdW51c2VkID0gYml0cy5nZXRCaXRzKDIpOwogICAgIHVuc2lnbmVkIGF1ZGlvX3NhbXBsaW5nX2ZyZXF1ZW5jeSA9IGJpdHMuZ2V0Qml0cygzKTsKICAgICB1bnNpZ25lZCBudW1fY2hhbm5lbHMgPSBiaXRzLmdldEJpdHMoMyk7CiAKQEAgLTYzNCw3ICs2MzcsNyBAQAogCiAgICAgICAgIENIRUNLX0VRKGJpdHMuZ2V0Qml0cygxMiksIDB4ZmZmdSk7CiAgICAgICAgIGJpdHMuc2tpcEJpdHMoMyk7ICAvLyBJRCwgbGF5ZXIKLSAgICAgICAgYm9vbCBwcm90ZWN0aW9uX2Fic2VudCA9IGJpdHMuZ2V0Qml0cygxKSAhPSAwOworICAgICAgICBib29sIHByb3RlY3Rpb25fYWJzZW50IF9fdW51c2VkID0gYml0cy5nZXRCaXRzKDEpICE9IDA7CiAKICAgICAgICAgaWYgKG1Gb3JtYXQgPT0gTlVMTCkgewogICAgICAgICAgICAgdW5zaWduZWQgcHJvZmlsZSA9IGJpdHMuZ2V0Qml0cygyKTsKQEAgLTY4Myw3ICs2ODYsNyBAQAogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KIAotICAgICAgICBzaXplX3QgaGVhZGVyU2l6ZSA9IHByb3RlY3Rpb25fYWJzZW50ID8gNyA6IDk7CisgICAgICAgIHNpemVfdCBoZWFkZXJTaXplIF9fdW51c2VkID0gcHJvdGVjdGlvbl9hYnNlbnQgPyA3IDogOTsKIAogICAgICAgICBvZmZzZXQgKz0gYWFjX2ZyYW1lX2xlbmd0aDsKICAgICAgICAgLy8gVE9ETzogbW92ZSBiYWNrIHRvIGNvbmNhdGVuYXRpb24gd2hlbiBjb2RlYyBjYW4gc3VwcG9ydCBhcmJpdHJhcnkgaW5wdXQgYnVmZmVycy4KQEAgLTEyODUsNCArMTI4OCwxNyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCit2b2lkIEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6c2lnbmFsRU9TKCkgeworICAgIGlmICghbUVPU1JlYWNoZWQpIHsKKyAgICAgICAgaWYgKG1Nb2RlID09IE1QRUdfVklERU8pIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRoZUVuZCA9ICJceDAwXHgwMFx4MDFceDAwIjsKKyAgICAgICAgICAgIGFwcGVuZERhdGEodGhlRW5kLCA0LCAwKTsKKyAgICAgICAgfQorICAgICAgICBtRU9TUmVhY2hlZCA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1coIkVPUyBhbHJlYWR5IHNpZ25hbGVkIik7CisgICAgfQorfQorCisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5oCmluZGV4IDdjODFmZjAuLmE2ZDgxMmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5oCkBAIC0yNiw3ICsyNiw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBQnVmZmVyOwotc3RydWN0IE1ldGFEYXRhOworY2xhc3MgTWV0YURhdGE7CiAKIHN0cnVjdCBFbGVtZW50YXJ5U3RyZWFtUXVldWUgewogICAgIGVudW0gTW9kZSB7CkBAIC00Niw2ICs0Niw3IEBACiAgICAgRWxlbWVudGFyeVN0cmVhbVF1ZXVlKE1vZGUgbW9kZSwgdWludDMyX3QgZmxhZ3MgPSAwKTsKIAogICAgIHN0YXR1c190IGFwcGVuZERhdGEoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIGludDY0X3QgdGltZVVzKTsKKyAgICB2b2lkIHNpZ25hbEVPUygpOwogICAgIHZvaWQgY2xlYXIoYm9vbCBjbGVhckZvcm1hdCk7CiAKICAgICBzcDxBQnVmZmVyPiBkZXF1ZXVlQWNjZXNzVW5pdCgpOwpAQCAtNjAsNiArNjEsNyBAQAogCiAgICAgTW9kZSBtTW9kZTsKICAgICB1aW50MzJfdCBtRmxhZ3M7CisgICAgYm9vbCBtRU9TUmVhY2hlZDsKIAogICAgIHNwPEFCdWZmZXI+IG1CdWZmZXI7CiAgICAgTGlzdDxSYW5nZUluZm8+IG1SYW5nZUluZm9zOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlRTRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJUU0V4dHJhY3Rvci5jcHAKaW5kZXggMzVjYTExOC4uNzRjYjVkOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlRTRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyVFNFeHRyYWN0b3IuY3BwCkBAIC04NSwxMiArODUsNiBAQAogICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKICAgICAqb3V0ID0gTlVMTDsKIAotICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgc2Vla01vZGU7Ci0gICAgaWYgKG1TZWVrYWJsZSAmJiBvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJnNlZWtNb2RlKSkgewotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCiAgICAgc3RhdHVzX3QgZmluYWxSZXN1bHQ7CiAgICAgd2hpbGUgKCFtSW1wbC0+aGFzQnVmZmVyQXZhaWxhYmxlKCZmaW5hbFJlc3VsdCkpIHsKICAgICAgICAgaWYgKGZpbmFsUmVzdWx0ICE9IE9LKSB7CkBAIC0xMDMsNiArOTcsMTcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIGludDY0X3Qgc2Vla1RpbWVVczsKKyAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgc2Vla01vZGU7CisgICAgaWYgKG1TZWVrYWJsZSAmJiBvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJnNlZWtNb2RlKSkgeworICAgICAgICAvLyBBIHNlZWsgd2FzIHJlcXVlc3RlZCwgYnV0IHdlIGRvbid0IGFjdHVhbGx5IHN1cHBvcnQgc2Vla2luZyBhbmQgc28gY2FuIG9ubHkgInNlZWsiIHRvCisgICAgICAgIC8vIHRoZSBjdXJyZW50IHBvc2l0aW9uCisgICAgICAgIGludDY0X3QgbmV4dEJ1ZlRpbWVVczsKKyAgICAgICAgaWYgKG1JbXBsLT5uZXh0QnVmZmVyVGltZSgmbmV4dEJ1ZlRpbWVVcykgIT0gT0sgfHwgc2Vla1RpbWVVcyAhPSBuZXh0QnVmVGltZVVzKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgIH0KKyAgICB9CisKICAgICByZXR1cm4gbUltcGwtPnJlYWQob3V0LCBvcHRpb25zKTsKIH0KIApAQCAtMTU5LDcgKzE2NCw2IEBACiAgICAgaW50IG51bVBhY2tldHNQYXJzZWQgPSAwOwogCiAgICAgd2hpbGUgKGZlZWRNb3JlKCkgPT0gT0spIHsKLSAgICAgICAgQVRTUGFyc2VyOjpTb3VyY2VUeXBlIHR5cGU7CiAgICAgICAgIGlmIChoYXZlQXVkaW8gJiYgaGF2ZVZpZGVvKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjAwLDYgKzIwNCw5IEBACiAgICAgc3NpemVfdCBuID0gbURhdGFTb3VyY2UtPnJlYWRBdChtT2Zmc2V0LCBwYWNrZXQsIGtUU1BhY2tldFNpemUpOwogCiAgICAgaWYgKG4gPCAoc3NpemVfdClrVFNQYWNrZXRTaXplKSB7CisgICAgICAgIGlmIChuID49IDApIHsKKyAgICAgICAgICAgIG1QYXJzZXItPnNpZ25hbEVPUyhFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gKG4gPCAwKSA/IChzdGF0dXNfdCluIDogRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmNwcAppbmRleCA0NGM3ZWRjLi4yOTQ1NjQ0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCkBAIC0yOCw2ICsyOCw3IEBACiAKICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9NZXRhZGF0YUJ1ZmZlclR5cGUuaD4KICNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+CisjaW5jbHVkZSA8Z3VpL0J1ZmZlckl0ZW0uaD4KIAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKQEAgLTM1OSw3ICszNjAsNyBAQAogICAgICAgICBtU3VzcGVuZGVkID0gdHJ1ZTsKIAogICAgICAgICB3aGlsZSAobU51bUZyYW1lc0F2YWlsYWJsZSA+IDApIHsKLSAgICAgICAgICAgIEJ1ZmZlclF1ZXVlOjpCdWZmZXJJdGVtIGl0ZW07CisgICAgICAgICAgICBCdWZmZXJJdGVtIGl0ZW07CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ29uc3VtZXItPmFjcXVpcmVCdWZmZXIoJml0ZW0sIDApOwogCiAgICAgICAgICAgICBpZiAoZXJyID09IEJ1ZmZlclF1ZXVlOjpOT19CVUZGRVJfQVZBSUxBQkxFKSB7CkBAIC00MDksNyArNDEwLDcgQEAKIAogICAgIEFMT0dWKCJmaWxsQ29kZWNCdWZmZXJfbDogYWNxdWlyaW5nIGJ1ZmZlciwgYXZhaWw9JXp1IiwKICAgICAgICAgICAgIG1OdW1GcmFtZXNBdmFpbGFibGUpOwotICAgIEJ1ZmZlclF1ZXVlOjpCdWZmZXJJdGVtIGl0ZW07CisgICAgQnVmZmVySXRlbSBpdGVtOwogICAgIHN0YXR1c190IGVyciA9IG1Db25zdW1lci0+YWNxdWlyZUJ1ZmZlcigmaXRlbSwgMCk7CiAgICAgaWYgKGVyciA9PSBCdWZmZXJRdWV1ZTo6Tk9fQlVGRkVSX0FWQUlMQUJMRSkgewogICAgICAgICAvLyBzaG91bGRuJ3QgaGFwcGVuCkBAIC00OTIsNyArNDkzLDcgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIEJ1ZmZlclF1ZXVlOjpCdWZmZXJJdGVtIGl0ZW07CisgICAgQnVmZmVySXRlbSBpdGVtOwogICAgIGl0ZW0ubUJ1ZiA9IG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJJZDsKICAgICBpdGVtLm1GcmFtZU51bWJlciA9IG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJGcmFtZU51bTsKICAgICBpdGVtLm1UaW1lc3RhbXAgPSBtUmVwZWF0TGFzdEZyYW1lVGltZXN0YW1wOwpAQCAtNTIzLDcgKzUyNCw3IEBACiB9CiAKIHZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2V0TGF0ZXN0U3VibWl0dGVkQnVmZmVyX2woCi0gICAgICAgIGNvbnN0IEJ1ZmZlclF1ZXVlOjpCdWZmZXJJdGVtICZpdGVtKSB7CisgICAgICAgIGNvbnN0IEJ1ZmZlckl0ZW0gJml0ZW0pIHsKICAgICBBTE9HVigic2V0TGF0ZXN0U3VibWl0dGVkQnVmZmVyX2wiKTsKIAogICAgIGlmIChtTGF0ZXN0U3VibWl0dGVkQnVmZmVySWQgPj0gMCkgewpAQCAtNTc5LDcgKzU4MCw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1pbnQ2NF90IEdyYXBoaWNCdWZmZXJTb3VyY2U6OmdldFRpbWVzdGFtcChjb25zdCBCdWZmZXJRdWV1ZTo6QnVmZmVySXRlbSAmaXRlbSkgeworaW50NjRfdCBHcmFwaGljQnVmZmVyU291cmNlOjpnZXRUaW1lc3RhbXAoY29uc3QgQnVmZmVySXRlbSAmaXRlbSkgewogICAgIGludDY0X3QgdGltZVVzID0gaXRlbS5tVGltZXN0YW1wIC8gMTAwMDsKIAogICAgIGlmIChtVGltZVBlckNhcHR1cmVVcyA+IDBsbCkgewpAQCAtNjQwLDcgKzY0MSw3IEBACiB9CiAKIHN0YXR1c190IEdyYXBoaWNCdWZmZXJTb3VyY2U6OnN1Ym1pdEJ1ZmZlcl9sKAotICAgICAgICBjb25zdCBCdWZmZXJRdWV1ZTo6QnVmZmVySXRlbSAmaXRlbSwgaW50IGNiaSkgeworICAgICAgICBjb25zdCBCdWZmZXJJdGVtICZpdGVtLCBpbnQgY2JpKSB7CiAgICAgQUxPR1YoInN1Ym1pdEJ1ZmZlcl9sIGNiaT0lZCIsIGNiaSk7CiAKICAgICBpbnQ2NF90IHRpbWVVcyA9IGdldFRpbWVzdGFtcChpdGVtKTsKQEAgLTc2Niw3ICs3NjcsNyBAQAogICAgICAgICAgICAgQUxPR1YoIm9uRnJhbWVBdmFpbGFibGU6IHN1c3BlbmRlZCwgaWdub3JpbmcgZnJhbWUiKTsKICAgICAgICAgfQogCi0gICAgICAgIEJ1ZmZlclF1ZXVlOjpCdWZmZXJJdGVtIGl0ZW07CisgICAgICAgIEJ1ZmZlckl0ZW0gaXRlbTsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNvbnN1bWVyLT5hY3F1aXJlQnVmZmVyKCZpdGVtLCAwKTsKICAgICAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSdyZSBzZWVpbmcgdGhpcyBidWZmZXIsIGFkZCBpdCB0byBvdXIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5oCmluZGV4IGM4ZTM3NzUuLjQwMWJiYzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuaApAQCAtMTg3LDE1ICsxODcsMTUgQEAKIAogICAgIC8vIE1hcmtzIHRoZSBtQ29kZWNCdWZmZXJzIGVudHJ5IGFzIGluLXVzZSwgY29waWVzIHRoZSBHcmFwaGljQnVmZmVyCiAgICAgLy8gcmVmZXJlbmNlIGludG8gdGhlIGNvZGVjIGJ1ZmZlciwgYW5kIHN1Ym1pdHMgdGhlIGRhdGEgdG8gdGhlIGNvZGVjLgotICAgIHN0YXR1c190IHN1Ym1pdEJ1ZmZlcl9sKGNvbnN0IEJ1ZmZlclF1ZXVlOjpCdWZmZXJJdGVtICZpdGVtLCBpbnQgY2JpKTsKKyAgICBzdGF0dXNfdCBzdWJtaXRCdWZmZXJfbChjb25zdCBCdWZmZXJJdGVtICZpdGVtLCBpbnQgY2JpKTsKIAogICAgIC8vIFN1Ym1pdHMgYW4gZW1wdHkgYnVmZmVyLCB3aXRoIHRoZSBFT1MgZmxhZyBzZXQuICAgUmV0dXJucyB3aXRob3V0CiAgICAgLy8gZG9pbmcgYW55dGhpbmcgaWYgd2UgZG9uJ3QgaGF2ZSBhIGNvZGVjIGJ1ZmZlciBhdmFpbGFibGUuCiAgICAgdm9pZCBzdWJtaXRFbmRPZklucHV0U3RyZWFtX2woKTsKIAotICAgIHZvaWQgc2V0TGF0ZXN0U3VibWl0dGVkQnVmZmVyX2woY29uc3QgQnVmZmVyUXVldWU6OkJ1ZmZlckl0ZW0gJml0ZW0pOworICAgIHZvaWQgc2V0TGF0ZXN0U3VibWl0dGVkQnVmZmVyX2woY29uc3QgQnVmZmVySXRlbSAmaXRlbSk7CiAgICAgYm9vbCByZXBlYXRMYXRlc3RTdWJtaXR0ZWRCdWZmZXJfbCgpOwotICAgIGludDY0X3QgZ2V0VGltZXN0YW1wKGNvbnN0IEJ1ZmZlclF1ZXVlOjpCdWZmZXJJdGVtICZpdGVtKTsKKyAgICBpbnQ2NF90IGdldFRpbWVzdGFtcChjb25zdCBCdWZmZXJJdGVtICZpdGVtKTsKIAogICAgIC8vIExvY2ssIGNvdmVycyBhbGwgbWVtYmVyIHZhcmlhYmxlcy4KICAgICBtdXRhYmxlIE11dGV4IG1NdXRleDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVguY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAKaW5kZXggZjhhNmYxNy4uYTk0MzY0NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAKQEAgLTI1NSw4ICsyNTUsOCBAQAogCiAgICAgaW5zdGFuY2UtPnNldEhhbmRsZSgqbm9kZSwgaGFuZGxlKTsKIAotICAgIG1MaXZlTm9kZXMuYWRkKG9ic2VydmVyLT5hc0JpbmRlcigpLCBpbnN0YW5jZSk7Ci0gICAgb2JzZXJ2ZXItPmFzQmluZGVyKCktPmxpbmtUb0RlYXRoKHRoaXMpOworICAgIG1MaXZlTm9kZXMuYWRkKElJbnRlcmZhY2U6OmFzQmluZGVyKG9ic2VydmVyKSwgaW5zdGFuY2UpOworICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKG9ic2VydmVyKS0+bGlua1RvRGVhdGgodGhpcyk7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0yNjYsNyArMjY2LDcgQEAKIAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICAgICAgc3NpemVfdCBpbmRleCA9IG1MaXZlTm9kZXMuaW5kZXhPZktleShpbnN0YW5jZS0+b2JzZXJ2ZXIoKS0+YXNCaW5kZXIoKSk7CisgICAgICAgIHNzaXplX3QgaW5kZXggPSBtTGl2ZU5vZGVzLmluZGV4T2ZLZXkoSUludGVyZmFjZTo6YXNCaW5kZXIoaW5zdGFuY2UtPm9ic2VydmVyKCkpKTsKICAgICAgICAgaWYgKGluZGV4IDwgMCkgewogICAgICAgICAgICAgLy8gVGhpcyBjb3VsZCBjb25jZWl2YWJseSBoYXBwZW4gaWYgdGhlIG9ic2VydmVyIGRpZXMgYXQgcm91Z2hseSB0aGUKICAgICAgICAgICAgIC8vIHNhbWUgdGltZSB0aGF0IGEgY2xpZW50IGF0dGVtcHRzIHRvIGZyZWUgdGhlIG5vZGUgZXhwbGljaXRseS4KQEAgLTI3NSw3ICsyNzUsNyBAQAogICAgICAgICBtTGl2ZU5vZGVzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwogICAgIH0KIAotICAgIGluc3RhbmNlLT5vYnNlcnZlcigpLT5hc0JpbmRlcigpLT51bmxpbmtUb0RlYXRoKHRoaXMpOworICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKGluc3RhbmNlLT5vYnNlcnZlcigpKS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKIAogICAgIHN0YXR1c190IGVyciA9IGluc3RhbmNlLT5mcmVlTm9kZShtTWFzdGVyKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcAppbmRleCBiZjVkODJjLi43ZWEzNGZmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcApAQCAtMTU4LDcgKzE1OCw3IEBACiAgICAgc3dpdGNoIChwb3J0SW5kZXgpIHsKICAgICAgICAgY2FzZSBrUG9ydEluZGV4SW5wdXQ6ICByZXR1cm4gIklucHV0IjsKICAgICAgICAgY2FzZSBrUG9ydEluZGV4T3V0cHV0OiByZXR1cm4gIk91dHB1dCI7Ci0gICAgICAgIGNhc2UgfjA6ICAgICAgICAgICAgICAgcmV0dXJuICJBbGwiOworICAgICAgICBjYXNlIH4wVTogICAgICAgICAgICAgIHJldHVybiAiQWxsIjsKICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICByZXR1cm4gInBvcnQiOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmNwcApvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDliNjk1OGEuLjBmOWMwMGMKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmNwcApAQCAtNDAsMTEgKzQwLDEyIEBACiAgICAgeyAiT01YLmdvb2dsZS5hbXJuYi5lbmNvZGVyIiwgImFtcm5iZW5jIiwgImF1ZGlvX2VuY29kZXIuYW1ybmIiIH0sCiAgICAgeyAiT01YLmdvb2dsZS5hbXJ3Yi5kZWNvZGVyIiwgImFtcmRlYyIsICJhdWRpb19kZWNvZGVyLmFtcndiIiB9LAogICAgIHsgIk9NWC5nb29nbGUuYW1yd2IuZW5jb2RlciIsICJhbXJ3YmVuYyIsICJhdWRpb19lbmNvZGVyLmFtcndiIiB9LAotICAgIHsgIk9NWC5nb29nbGUuaDI2NC5kZWNvZGVyIiwgImgyNjRkZWMiLCAidmlkZW9fZGVjb2Rlci5hdmMiIH0sCi0gICAgeyAiT01YLmdvb2dsZS5oMjY0LmVuY29kZXIiLCAiaDI2NGVuYyIsICJ2aWRlb19lbmNvZGVyLmF2YyIgfSwKKyAgICB7ICJPTVguZ29vZ2xlLmgyNjQuZGVjb2RlciIsICJhdmNkZWMiLCAidmlkZW9fZGVjb2Rlci5hdmMiIH0sCisgICAgeyAiT01YLmdvb2dsZS5oMjY0LmVuY29kZXIiLCAiYXZjZW5jIiwgInZpZGVvX2VuY29kZXIuYXZjIiB9LAogICAgIHsgIk9NWC5nb29nbGUuaGV2Yy5kZWNvZGVyIiwgImhldmNkZWMiLCAidmlkZW9fZGVjb2Rlci5oZXZjIiB9LAogICAgIHsgIk9NWC5nb29nbGUuZzcxMS5hbGF3LmRlY29kZXIiLCAiZzcxMWRlYyIsICJhdWRpb19kZWNvZGVyLmc3MTFhbGF3IiB9LAogICAgIHsgIk9NWC5nb29nbGUuZzcxMS5tbGF3LmRlY29kZXIiLCAiZzcxMWRlYyIsICJhdWRpb19kZWNvZGVyLmc3MTFtbGF3IiB9LAorICAgIHsgIk9NWC5nb29nbGUubXBlZzIuZGVjb2RlciIsICJtcGVnMmRlYyIsICJ2aWRlb19kZWNvZGVyLm1wZWcyIiB9LAogICAgIHsgIk9NWC5nb29nbGUuaDI2My5kZWNvZGVyIiwgIm1wZWc0ZGVjIiwgInZpZGVvX2RlY29kZXIuaDI2MyIgfSwKICAgICB7ICJPTVguZ29vZ2xlLmgyNjMuZW5jb2RlciIsICJtcGVnNGVuYyIsICJ2aWRlb19lbmNvZGVyLmgyNjMiIH0sCiAgICAgeyAiT01YLmdvb2dsZS5tcGVnNC5kZWNvZGVyIiwgIm1wZWc0ZGVjIiwgInZpZGVvX2RlY29kZXIubXBlZzQiIH0sCkBAIC04NSw3ICs4Niw3IEBACiAgICAgICAgIHZvaWQgKmxpYkhhbmRsZSA9IGRsb3BlbihsaWJOYW1lLmNfc3RyKCksIFJUTERfTk9XKTsKIAogICAgICAgICBpZiAobGliSGFuZGxlID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJ1bmFibGUgdG8gZGxvcGVuICVzIiwgbGliTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIEFMT0dFKCJ1bmFibGUgdG8gZGxvcGVuICVzOiAlcyIsIGxpYk5hbWUuY19zdHIoKSwgZGxlcnJvcigpKTsKIAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckNvbXBvbmVudE5vdEZvdW5kOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5jcHAKaW5kZXggMzc1ZDMxMi4uOWExMGViYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmNwcApAQCAtNTI1LDEyICs1MjUsMTIgQEAKICAgICBzaXplX3Qgc3JjU3RyaWRlOwogICAgIHNpemVfdCBzcmNWU3RyaWRlOwogICAgIGlmICh1c2luZ0dyYXBoaWNCdWZmZXIpIHsKLSAgICAgICAgaWYgKHNyY1NpemUgPCA0ICsgc2l6ZW9mKEdyYXBoaWNCdWZmZXIgKikpIHsKLSAgICAgICAgICAgIEFMT0dFKCJNZXRhZGF0YSBpcyB0b28gc21hbGwgKCV6dSB2cyAlenUpIiwgc3JjU2l6ZSwgNCArIHNpemVvZihHcmFwaGljQnVmZmVyICopKTsKKyAgICAgICAgaWYgKHNyY1NpemUgPCBzaXplb2YoT01YX1UzMikgKyBzaXplb2YoR3JhcGhpY0J1ZmZlciAqKSkgeworICAgICAgICAgICAgQUxPR0UoIk1ldGFkYXRhIGlzIHRvbyBzbWFsbCAoJXp1IHZzICV6dSkiLCBzcmNTaXplLCBzaXplb2YoT01YX1UzMikgKyBzaXplb2YoR3JhcGhpY0J1ZmZlciAqKSk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogCi0gICAgICAgIEdyYXBoaWNCdWZmZXIgKmJ1ZmZlciA9ICooR3JhcGhpY0J1ZmZlciAqKikoc3JjICsgNCk7CisgICAgICAgIEdyYXBoaWNCdWZmZXIgKmJ1ZmZlciA9ICooR3JhcGhpY0J1ZmZlciAqKikoc3JjICsgc2l6ZW9mKE9NWF9VMzIpKTsKICAgICAgICAgaGFuZGxlID0gYnVmZmVyLT5oYW5kbGU7CiAgICAgICAgIGZvcm1hdCA9IGJ1ZmZlci0+Zm9ybWF0OwogICAgICAgICBzcmNTdHJpZGUgPSBidWZmZXItPnN0cmlkZTsKQEAgLTU0NCwxMiArNTQ0LDEyIEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgcGFydC4gIENoZWNrIGlmIGFueW9uZSB1c2VzIHRoaXMuCiAKLSAgICAgICAgaWYgKHNyY1NpemUgPCA0ICsgc2l6ZW9mKGJ1ZmZlcl9oYW5kbGVfdCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJNZXRhZGF0YSBpcyB0b28gc21hbGwgKCV6dSB2cyAlenUpIiwgc3JjU2l6ZSwgNCArIHNpemVvZihidWZmZXJfaGFuZGxlX3QpKTsKKyAgICAgICAgaWYgKHNyY1NpemUgPCBzaXplb2YoT01YX1UzMikgKyBzaXplb2YoYnVmZmVyX2hhbmRsZV90KSkgeworICAgICAgICAgICAgQUxPR0UoIk1ldGFkYXRhIGlzIHRvbyBzbWFsbCAoJXp1IHZzICV6dSkiLCBzcmNTaXplLCBzaXplb2YoT01YX1UzMikgKyBzaXplb2YoYnVmZmVyX2hhbmRsZV90KSk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogCi0gICAgICAgIGhhbmRsZSA9ICooYnVmZmVyX2hhbmRsZV90ICopKHNyYyArIDQpOworICAgICAgICBoYW5kbGUgPSAqKGJ1ZmZlcl9oYW5kbGVfdCAqKShzcmMgKyBzaXplb2YoT01YX1UzMikpOwogICAgICAgICAvLyBhc3N1bWUgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODgKICAgICAgICAgLy8gdGhlcmUgaXMgbm8gd2F5IHRvIGdldCB0aGUgc3JjIHN0cmlkZSB3aXRob3V0IHRoZSBncmFwaGljIGJ1ZmZlcgogICAgICAgICBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4ODsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmNwcAppbmRleCBmNGRmZDZiLi42N2ZmMTQ1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuY3BwCkBAIC0yNTMsMjkgKzI1Myw2IEBACiAgICAgcmV0dXJuIE1lZGlhRXh0cmFjdG9yOjpDcmVhdGUoc291cmNlKTsKIH0KIAotc3RhdGljIHNwPE1lZGlhU291cmNlPiBNYWtlU291cmNlKAotICAgICAgICBjb25zdCBjaGFyICp1cmksCi0gICAgICAgIGNvbnN0IGNoYXIgKm1pbWVUeXBlKSB7Ci0gICAgc3A8TWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvciA9IENyZWF0ZUV4dHJhY3RvckZyb21VUkkodXJpKTsKLQotICAgIGlmIChleHRyYWN0b3IgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsgKytpKSB7Ci0gICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gZXh0cmFjdG9yLT5nZXRUcmFja01ldGFEYXRhKGkpOwotCi0gICAgICAgIGNvbnN0IGNoYXIgKnRyYWNrTUlNRTsKLSAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmdHJhY2tNSU1FKSk7Ci0KLSAgICAgICAgaWYgKCFzdHJjYXNlY21wKHRyYWNrTUlNRSwgbWltZVR5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXh0cmFjdG9yLT5nZXRUcmFjayhpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotfQotCiBzdGF0dXNfdCBIYXJuZXNzOjp0ZXN0U3RhdGVUcmFuc2l0aW9ucygKICAgICAgICAgY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqY29tcG9uZW50Um9sZSkgewogICAgIGlmIChzdHJuY21wKGNvbXBvbmVudE5hbWUsICJPTVguIiwgNCkpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUFNUkFzc2VtYmxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FBTVJBc3NlbWJsZXIuY3BwCmluZGV4IDllODcyNWEuLmJiMmEyMzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUFNUkFzc2VtYmxlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQU1SQXNzZW1ibGVyLmNwcApAQCAtMTQzLDggKzE0Myw4IEBACiAgICAgICAgIHJldHVybiBNQUxGT1JNRURfUEFDS0VUOwogICAgIH0KIAotICAgIHVuc2lnbmVkIHBheWxvYWRIZWFkZXIgPSBidWZmZXItPmRhdGEoKVswXTsKLSAgICB1bnNpZ25lZCBDTVIgPSBwYXlsb2FkSGVhZGVyID4+IDQ7CisgICAgdW5zaWduZWQgcGF5bG9hZEhlYWRlciBfX3VudXNlZCA9IGJ1ZmZlci0+ZGF0YSgpWzBdOworICAgIHVuc2lnbmVkIENNUiBfX3VudXNlZCA9IHBheWxvYWRIZWFkZXIgPj4gNDsKIAogICAgIFZlY3Rvcjx1aW50OF90PiB0YWJsZU9mQ29udGVudHM7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUcyVFNBc3NlbWJsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUcyVFNBc3NlbWJsZXIuaAppbmRleCA3MTJlMThlLi5mMzljMmI1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHMlRTQXNzZW1ibGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzJUU0Fzc2VtYmxlci5oCkBAIC0yNCw3ICsyNCw3IEBACiAKIHN0cnVjdCBBTWVzc2FnZTsKIHN0cnVjdCBBU3RyaW5nOwotc3RydWN0IE1ldGFEYXRhOworY2xhc3MgTWV0YURhdGE7CiAKIHN0cnVjdCBBTVBFRzJUU0Fzc2VtYmxlciA6IHB1YmxpYyBBUlRQQXNzZW1ibGVyIHsKICAgICBBTVBFRzJUU0Fzc2VtYmxlcigKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0QXVkaW9Bc3NlbWJsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRBdWRpb0Fzc2VtYmxlci5jcHAKaW5kZXggODUxODA1Zi4uYTFhNjU3NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRBdWRpb0Fzc2VtYmxlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRBdWRpb0Fzc2VtYmxlci5jcHAKQEAgLTEwOCw3ICsxMDgsNyBAQAogc3RhdGljIHN0YXR1c190IHBhcnNlR0FTcGVjaWZpY0NvbmZpZygKICAgICAgICAgQUJpdFJlYWRlciAqYml0cywKICAgICAgICAgdW5zaWduZWQgYXVkaW9PYmplY3RUeXBlLCB1bnNpZ25lZCBjaGFubmVsQ29uZmlndXJhdGlvbikgewotICAgIHVuc2lnbmVkIGZyYW1lTGVuZ3RoRmxhZyA9IGJpdHMtPmdldEJpdHMoMSk7CisgICAgdW5zaWduZWQgZnJhbWVMZW5ndGhGbGFnIF9fdW51c2VkID0gYml0cy0+Z2V0Qml0cygxKTsKICAgICB1bnNpZ25lZCBkZXBlbmRzT25Db3JlQ29kZXIgPSBiaXRzLT5nZXRCaXRzKDEpOwogICAgIGlmIChkZXBlbmRzT25Db3JlQ29kZXIpIHsKICAgICAgICAgLyogdW5zaWduZWQgY29yZUNvZGVyRGVsYXkgPSAqL2JpdHMtPmdldEJpdHMoMSk7CkBAIC0yMTcsNyArMjE3LDcgQEAKICAgICAgICAgICAgICAgICAvLyBBcHBhcmVudGx5IGFuIGV4dGVuc2lvbiBpcyBhbHdheXMgY29uc2lkZXJlZCBhbiBldmVuCiAgICAgICAgICAgICAgICAgLy8gbXVsdGlwbGUgb2YgOCBiaXRzIGxvbmcuCiAKLSAgICAgICAgICAgICAgICBBTE9HSSgiU2tpcHBpbmcgJWQgYml0cyBhZnRlciBzeW5jIGV4dGVuc2lvbiIsCisgICAgICAgICAgICAgICAgQUxPR0koIlNraXBwaW5nICV6dSBiaXRzIGFmdGVyIHN5bmMgZXh0ZW5zaW9uIiwKICAgICAgICAgICAgICAgICAgICAgIDggLSAobnVtQml0c0luRXh0ZW5zaW9uICYgNykpOwogCiAgICAgICAgICAgICAgICAgYml0cy0+c2tpcEJpdHMoOCAtIChudW1CaXRzSW5FeHRlbnNpb24gJiA3KSk7CkBAIC00MjMsNyArNDIzLDcgQEAKICAgICB9CiAKICAgICBpZiAob2Zmc2V0IDwgYnVmZmVyLT5zaXplKCkpIHsKLSAgICAgICAgQUxPR0koImlnbm9yaW5nICVkIGJ5dGVzIG9mIHRyYWlsaW5nIGRhdGEiLCBidWZmZXItPnNpemUoKSAtIG9mZnNldCk7CisgICAgICAgIEFMT0dJKCJpZ25vcmluZyAlenUgYnl0ZXMgb2YgdHJhaWxpbmcgZGF0YSIsIGJ1ZmZlci0+c2l6ZSgpIC0gb2Zmc2V0KTsKICAgICB9CiAgICAgQ0hFQ0tfTEUob2Zmc2V0LCBidWZmZXItPnNpemUoKSk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEVsZW1lbnRhcnlBc3NlbWJsZXIuY3BwCmluZGV4IDdlYjY1NDIuLjE1NjAwNGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyLmNwcApAQCAtMzYwLDcgKzM2MCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAob2Zmc2V0ICE9IGJ1ZmZlci0+c2l6ZSgpKSB7Ci0gICAgICAgICAgICBBTE9HVygicG90ZW50aWFsbHkgbWFsZm9ybWVkIHBhY2tldCAob2Zmc2V0ICVkLCBzaXplICVkKSIsCisgICAgICAgICAgICBBTE9HVygicG90ZW50aWFsbHkgbWFsZm9ybWVkIHBhY2tldCAob2Zmc2V0ICV6dSwgc2l6ZSAlenUpIiwKICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCBidWZmZXItPnNpemUoKSk7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUGFja2V0U291cmNlLmNwcAppbmRleCAwOWY1MmJjLi5jZmFmYWE3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVBhY2tldFNvdXJjZS5jcHAKQEAgLTI3OSw4ICsyNzksNiBAQAogICAgIC8vIGJlIGVuY29kZWQuCiAgICAgQ0hFQ0tfTFQoMjAgKyBjb25maWctPnNpemUoKSwgMTI4dSk7CiAKLSAgICBjb25zdCB1aW50OF90ICpkYXRhID0gY29uZmlnLT5kYXRhKCk7Ci0KICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrU3RhdGljRVNEU1tdID0gewogICAgICAgICAweDAzLCAyMiwKICAgICAgICAgMHgwMCwgMHgwMCwgICAgIC8vIEVTX0lECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBDb25uZWN0aW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uY3BwCmluZGV4IDM3MmZiZTkuLmE2YmQ4MjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uY3BwCkBAIC02NjQsMTEgKzY2NCwxMCBAQAogCiAgICAgU3RyZWFtSW5mbyAqcyA9ICYqaXQ7CiAKLSAgICBzdGF0dXNfdCBlcnI7CiAgICAgaWYgKGl0LT5tUlRQU29ja2V0ID09IGluZGV4KSB7Ci0gICAgICAgIGVyciA9IHBhcnNlUlRQKHMsIGJ1ZmZlcik7CisgICAgICAgIHBhcnNlUlRQKHMsIGJ1ZmZlcik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgZXJyID0gcGFyc2VSVENQKHMsIGJ1ZmZlcik7CisgICAgICAgIHBhcnNlUlRDUChzLCBidWZmZXIpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5jcHAKaW5kZXggNzkzZDExNi4uZTE2MDdiZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuY3BwCkBAIC00NjEsNyArNDYxLDcgQEAKICAgICAgICAgc2RwLmFwcGVuZCgibT1hdWRpbyAiKTsKICAgICB9CiAKLSAgICBzZHAuYXBwZW5kKFN0cmluZ1ByaW50ZigiJWQiLCBudG9ocyhtUlRQQWRkci5zaW5fcG9ydCkpKTsKKyAgICBzZHAuYXBwZW5kKEFTdHJpbmdQcmludGYoIiVkIiwgbnRvaHMobVJUUEFkZHIuc2luX3BvcnQpKSk7CiAgICAgc2RwLmFwcGVuZCgKICAgICAgICAgICAiIFJUUC9BVlAgIiBQVF9TVFIgIlxyXG4iCiAgICAgICAgICAgImI9QVMgMzIwMDAwXHJcbiIKQEAgLTQ4MCw3ICs0ODAsNyBAQAogICAgICAgICBDSEVDS19FUShzYW1wbGVSYXRlLCAobU1vZGUgPT0gQU1SX05CKSA/IDgwMDAgOiAxNjAwMCk7CiAKICAgICAgICAgc2RwLmFwcGVuZChtTW9kZSA9PSBBTVJfTkIgPyAiQU1SIiA6ICJBTVItV0IiKTsKLSAgICAgICAgc2RwLmFwcGVuZChTdHJpbmdQcmludGYoIi8lZC8lZCIsIHNhbXBsZVJhdGUsIG51bUNoYW5uZWxzKSk7CisgICAgICAgIHNkcC5hcHBlbmQoQVN0cmluZ1ByaW50ZigiLyVkLyVkIiwgc2FtcGxlUmF0ZSwgbnVtQ2hhbm5lbHMpKTsKICAgICB9IGVsc2UgewogICAgICAgICBUUkVTUEFTUygpOwogICAgIH0KQEAgLTU0Myw3ICs1NDMsNyBAQAogICAgIENIRUNLX0VRKCh1bnNpZ25lZClkYXRhWzBdLCAweDY3dSk7CiAKICAgICBtUHJvZmlsZUxldmVsID0KLSAgICAgICAgU3RyaW5nUHJpbnRmKCIlMDJYJTAyWCUwMlgiLCBkYXRhWzFdLCBkYXRhWzJdLCBkYXRhWzNdKTsKKyAgICAgICAgQVN0cmluZ1ByaW50ZigiJTAyWCUwMlglMDJYIiwgZGF0YVsxXSwgZGF0YVsyXSwgZGF0YVszXSk7CiAKICAgICBlbmNvZGVCYXNlNjQoZGF0YSwgc3RhcnRDb2RlUG9zLCAmbVNlcVBhcmFtU2V0KTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCmluZGV4IGYyNTUzOWMuLjYwYjNhYWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKQEAgLTQyLDcgKzQyLDcgQEAKIAogLy8gc3RhdGljCiBjb25zdCBBU3RyaW5nIEFSVFNQQ29ubmVjdGlvbjo6c1VzZXJBZ2VudCA9Ci0gICAgU3RyaW5nUHJpbnRmKCJVc2VyLUFnZW50OiAlc1xyXG4iLCBNYWtlVXNlckFnZW50KCkuY19zdHIoKSk7CisgICAgQVN0cmluZ1ByaW50ZigiVXNlci1BZ2VudDogJXNcclxuIiwgTWFrZVVzZXJBZ2VudCgpLmNfc3RyKCkpOwogCiBBUlRTUENvbm5lY3Rpb246OkFSVFNQQ29ubmVjdGlvbihib29sIHVpZFZhbGlkLCB1aWRfdCB1aWQpCiAgICAgOiBtVUlEVmFsaWQodWlkVmFsaWQpLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUmF3QXVkaW9Bc3NlbWJsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJhd0F1ZGlvQXNzZW1ibGVyLmgKaW5kZXggZWQ3YWYwOC4uYmMxZGVhNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUmF3QXVkaW9Bc3NlbWJsZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSYXdBdWRpb0Fzc2VtYmxlci5oCkBAIC0yNCw3ICsyNCw3IEBACiAKIHN0cnVjdCBBTWVzc2FnZTsKIHN0cnVjdCBBU3RyaW5nOwotc3RydWN0IE1ldGFEYXRhOworY2xhc3MgTWV0YURhdGE7CiAKIHN0cnVjdCBBUmF3QXVkaW9Bc3NlbWJsZXIgOiBwdWJsaWMgQVJUUEFzc2VtYmxlciB7CiAgICAgQVJhd0F1ZGlvQXNzZW1ibGVyKApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLm1rCmluZGV4IGQ2MGRjMmYuLjlmZWRiNzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQubWsKQEAgLTE5LDEwICsxOSwxMSBAQAogICAgICAgICBBU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcCAgICAgXAogICAgICAgICBTRFBMb2FkZXIuY3BwICAgICAgICAgICAgICAgXAogCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmNyeXB0bworCiBMT0NBTF9DX0lOQ0xVREVTOj0gXAogCSQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKLQkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKLQkkKFRPUCkvZXh0ZXJuYWwvb3BlbnNzbC9pbmNsdWRlCisJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCiBMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF9ydHNwCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oCmluZGV4IDQyM2E0MjAuLjNiZjQ4OWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaApAQCAtMTU2LDcgKzE1Niw3IEBACiAgICAgICAgICAgICBtU2Vzc2lvblVSTC5hcHBlbmQoInJ0c3A6Ly8iKTsKICAgICAgICAgICAgIG1TZXNzaW9uVVJMLmFwcGVuZChob3N0KTsKICAgICAgICAgICAgIG1TZXNzaW9uVVJMLmFwcGVuZCgiOiIpOwotICAgICAgICAgICAgbVNlc3Npb25VUkwuYXBwZW5kKFN0cmluZ1ByaW50ZigiJXUiLCBwb3J0KSk7CisgICAgICAgICAgICBtU2Vzc2lvblVSTC5hcHBlbmQoQVN0cmluZ1ByaW50ZigiJXUiLCBwb3J0KSk7CiAgICAgICAgICAgICBtU2Vzc2lvblVSTC5hcHBlbmQocGF0aCk7CiAKICAgICAgICAgICAgIEFMT0dWKCJyZXdyaXR0ZW4gc2Vzc2lvbiB1cmw6ICclcyciLCBtU2Vzc2lvblVSTC5jX3N0cigpKTsKQEAgLTUwOCw3ICs1MDgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uVVJMLmFwcGVuZCgicnRzcDovLyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uVVJMLmFwcGVuZChob3N0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvblVSTC5hcHBlbmQoIjoiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvblVSTC5hcHBlbmQoU3RyaW5nUHJpbnRmKCIldSIsIHBvcnQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvblVSTC5hcHBlbmQoQVN0cmluZ1ByaW50ZigiJXUiLCBwb3J0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25VUkwuYXBwZW5kKHBhdGgpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0koInJld3JpdHRlbiBzZXNzaW9uIHVybDogJyVzJyIsIG1TZXNzaW9uVVJMLmNfc3RyKCkpOwpAQCAtMTIzOCw3ICsxMjM4LDcgQEAKICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOwogCiAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgICAgICAgICBBU3RyaW5nUHJpbnRmKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSYW5nZTogbnB0PSVsbGQtXHJcbiIsIHRpbWVVcyAvIDEwMDAwMDBsbCkpOwogCiAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmNwcAppbmRleCA0MjRiYWRmLi5hMjRlYjY5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuY3BwCkBAIC0xMDUsNyArMTA1LDcgQEAKICAgICAgICAgaGVhZGVycyA9IE5VTEw7CiAgICAgfQogCi0gICAgb2ZmNjRfdCBzZHBTaXplOworICAgIG9mZjY0X3Qgc2RwU2l6ZSA9IDA7CiAgICAgaWYgKGVyciA9PSBPSyAmJiAhbUNhbmNlbGxlZCkgewogICAgICAgICBlcnIgPSBtSFRUUERhdGFTb3VyY2UtPmdldFNpemUoJnNkcFNpemUpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvQW5kcm9pZC5tawppbmRleCA5OWI0ODBhZC4uOGQ2ZmY1YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9BbmRyb2lkLm1rCkBAIC0xLDggKzEsNyBAQAogIyBCdWlsZCB0aGUgdW5pdCB0ZXN0cy4KIExPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLWlmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCitMT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUyA6PSAkKExPQ0FMX1BBVEgpL0FuZHJvaWQubWsKIAogTE9DQUxfTU9EVUxFIDo9IFN1cmZhY2VNZWRpYVNvdXJjZV90ZXN0CiAKQEAgLTIyLDMzICsyMSwyMyBAQAogCWxpYnN0YWdlZnJpZ2h0IFwKIAlsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKIAlsaWJzdGFnZWZyaWdodF9vbXggXAotCWxpYnN0bHBvcnQgXAogCWxpYnN5bmMgXAogCWxpYnVpIFwKIAlsaWJ1dGlscyBcCiAJbGlibG9nCiAKLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAotCWxpYmd0ZXN0IFwKLQlsaWJndGVzdF9tYWluIFwKLQogTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0JYmlvbmljIFwKLQliaW9uaWMvbGlic3RkYysrL2luY2x1ZGUgXAotCWV4dGVybmFsL2d0ZXN0L2luY2x1ZGUgXAotCWV4dGVybmFsL3N0bHBvcnQvc3RscG9ydCBcCiAJZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCiAJZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKIAkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKIAogTE9DQUxfMzJfQklUX09OTFkgOj0gdHJ1ZQogCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKLQotZW5kaWYKK2luY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKIAogCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9ICQoTE9DQUxfUEFUSCkvQW5kcm9pZC5tawogCiBMT0NBTF9NT0RVTEUgOj0gVXRpbHNfdGVzdAogCkBAIC02NCwyMyArNTMsMTQgQEAKIAlsaWJzdGFnZWZyaWdodCBcCiAJbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCiAJbGlic3RhZ2VmcmlnaHRfb214IFwKLQlsaWJzdGxwb3J0IFwKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCi0JbGliZ3Rlc3QgXAotCWxpYmd0ZXN0X21haW4gXAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKLQliaW9uaWMgXAotCWJpb25pYy9saWJzdGRjKysvaW5jbHVkZSBcCi0JZXh0ZXJuYWwvZ3Rlc3QvaW5jbHVkZSBcCi0JZXh0ZXJuYWwvc3RscG9ydC9zdGxwb3J0IFwKIAlmcmFtZXdvcmtzL2F2L2luY2x1ZGUgXAogCWZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAogCWZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCiAJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCiAKLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQoraW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQogCiAjIEluY2x1ZGUgc3ViZGlyZWN0b3J5IG1ha2VmaWxlcwogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHREcml2ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dERyaXZlci5jcHAKaW5kZXggNzFhYTIxZS4uNTVhOTgwMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dERyaXZlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dERyaXZlci5jcHAKQEAgLTEzMyw3ICsxMzMsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgbVBsYXllci0+c3RhcnQoKTsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdXQ6CisgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBUUkVTUEFTUygpOwogICAgIH0KICAgICByZXR1cm4gcmV0OwpAQCAtMTgxLDcgKzE4MSw3IEBACiAgICAgICAgIGNhc2UgUExBWUlORzoKICAgICAgICAgICAgIG1QbGF5ZXItPnNlZWtUb0FzeW5jKHRpbWVVcyk7CiAgICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIGRlZmF1dDoKKyAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIFRSRVNQQVNTKCk7CiAgICAgfQogICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dFBsYXllci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dFBsYXllci5oCmluZGV4IGVjOGVkMjUuLjljYjQ5ZWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHRQbGF5ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0UGxheWVyLmgKQEAgLTI3LDcgKzI3LDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBBTWVzc2FnZTsKK3N0cnVjdCBBTWVzc2FnZTsKIGNsYXNzIE1lZGlhUGxheWVyQmFzZTsKIGNsYXNzIFRpbWVkVGV4dERyaXZlcjsKIGNsYXNzIFRpbWVkVGV4dFNvdXJjZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHRTUlRTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHRTUlRTb3VyY2UuaAppbmRleCA1OThjMjAwLi4yMzI2NzVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0U1JUU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dFNSVFNvdXJjZS5oCkBAIC0yNSw3ICsyNSw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgQVN0cmluZzsKK3N0cnVjdCBBU3RyaW5nOwogY2xhc3MgRGF0YVNvdXJjZTsKIGNsYXNzIE1lZGlhQnVmZmVyOwogY2xhc3MgUGFyY2VsOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvVGltZWRUZXh0U1JUU291cmNlX3Rlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvVGltZWRUZXh0U1JUU291cmNlX3Rlc3QuY3BwCmluZGV4IDQwZTkzYzcuLjNhMDZkNjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L1RpbWVkVGV4dFNSVFNvdXJjZV90ZXN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9UaW1lZFRleHRTUlRTb3VyY2VfdGVzdC5jcHAKQEAgLTEyMCwyNiArMTIwLDI2IEBACiAgICAgICAgIGVyciA9IG1Tb3VyY2UtPnJlYWQoJnN0YXJ0VGltZVVzLCAmZW5kVGltZVVzLCAmcGFyY2VsKTsKICAgICAgICAgRVhQRUNUX0VRKE9LLCBlcnIpOwogICAgICAgICBDaGVja1N0YXJ0VGltZU1zKHBhcmNlbCwgaSAqIGtTZWNUb01zZWMpOwotICAgICAgICBzdWJ0aXRsZSA9IFN0cmluZ1ByaW50ZigiJWRcblxuIiwgaSk7CisgICAgICAgIHN1YnRpdGxlID0gQVN0cmluZ1ByaW50ZigiJWRcblxuIiwgaSk7CiAgICAgICAgIENoZWNrRGF0YUVxdWFscyhwYXJjZWwsIHN1YnRpdGxlLmNfc3RyKCkpOwogICAgIH0KICAgICAvLyByZWFkIGVkZ2UgY2FzZXMKICAgICBlcnIgPSBtU291cmNlLT5yZWFkKCZzdGFydFRpbWVVcywgJmVuZFRpbWVVcywgJnBhcmNlbCk7CiAgICAgRVhQRUNUX0VRKE9LLCBlcnIpOwogICAgIENoZWNrU3RhcnRUaW1lTXMocGFyY2VsLCA1NTAwKTsKLSAgICBzdWJ0aXRsZSA9IFN0cmluZ1ByaW50ZigiNlxuXG4iKTsKKyAgICBzdWJ0aXRsZSA9IEFTdHJpbmdQcmludGYoIjZcblxuIik7CiAgICAgQ2hlY2tEYXRhRXF1YWxzKHBhcmNlbCwgc3VidGl0bGUuY19zdHIoKSk7CiAKICAgICBlcnIgPSBtU291cmNlLT5yZWFkKCZzdGFydFRpbWVVcywgJmVuZFRpbWVVcywgJnBhcmNlbCk7CiAgICAgRVhQRUNUX0VRKE9LLCBlcnIpOwogICAgIENoZWNrU3RhcnRUaW1lTXMocGFyY2VsLCA1ODAwKTsKLSAgICBzdWJ0aXRsZSA9IFN0cmluZ1ByaW50ZigiN1xuXG4iKTsKKyAgICBzdWJ0aXRsZSA9IEFTdHJpbmdQcmludGYoIjdcblxuIik7CiAgICAgQ2hlY2tEYXRhRXF1YWxzKHBhcmNlbCwgc3VidGl0bGUuY19zdHIoKSk7CiAKICAgICBlcnIgPSBtU291cmNlLT5yZWFkKCZzdGFydFRpbWVVcywgJmVuZFRpbWVVcywgJnBhcmNlbCk7CiAgICAgRVhQRUNUX0VRKE9LLCBlcnIpOwogICAgIENoZWNrU3RhcnRUaW1lTXMocGFyY2VsLCA2MDAwKTsKLSAgICBzdWJ0aXRsZSA9IFN0cmluZ1ByaW50ZigiOFxuXG4iKTsKKyAgICBzdWJ0aXRsZSA9IEFTdHJpbmdQcmludGYoIjhcblxuIik7CiAgICAgQ2hlY2tEYXRhRXF1YWxzKHBhcmNlbCwgc3VidGl0bGUuY19zdHIoKSk7CiAKICAgICBlcnIgPSBtU291cmNlLT5yZWFkKCZzdGFydFRpbWVVcywgJmVuZFRpbWVVcywgJnBhcmNlbCk7CkBAIC0yMDIsMjEgKzIwMiwyMSBAQAogICAgIGVyciA9IG1Tb3VyY2UtPnJlYWQoJnN0YXJ0VGltZVVzLCAmZW5kVGltZVVzLCAmcGFyY2VsLCAmb3B0aW9ucyk7CiAgICAgRVhQRUNUX0VRKE9LLCBlcnIpOwogICAgIEVYUEVDVF9FUSg1NTAwICoga01zZWNUb1VzZWMsIHN0YXJ0VGltZVVzKTsKLSAgICBzdWJ0aXRsZSA9IFN0cmluZ1ByaW50ZigiNlxuXG4iKTsKKyAgICBzdWJ0aXRsZSA9IEFTdHJpbmdQcmludGYoIjZcblxuIik7CiAgICAgQ2hlY2tEYXRhRXF1YWxzKHBhcmNlbCwgc3VidGl0bGUuY19zdHIoKSk7CiAKICAgICBvcHRpb25zLnNldFNlZWtUbyg1ODAwICoga01zZWNUb1VzZWMsIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DKTsKICAgICBlcnIgPSBtU291cmNlLT5yZWFkKCZzdGFydFRpbWVVcywgJmVuZFRpbWVVcywgJnBhcmNlbCwgJm9wdGlvbnMpOwogICAgIEVYUEVDVF9FUShPSywgZXJyKTsKICAgICBFWFBFQ1RfRVEoNTgwMCAqIGtNc2VjVG9Vc2VjLCBzdGFydFRpbWVVcyk7Ci0gICAgc3VidGl0bGUgPSBTdHJpbmdQcmludGYoIjdcblxuIik7CisgICAgc3VidGl0bGUgPSBBU3RyaW5nUHJpbnRmKCI3XG5cbiIpOwogICAgIENoZWNrRGF0YUVxdWFscyhwYXJjZWwsIHN1YnRpdGxlLmNfc3RyKCkpOwogCiAgICAgb3B0aW9ucy5zZXRTZWVrVG8oNjAwMCAqIGtNc2VjVG9Vc2VjLCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQyk7CiAgICAgZXJyID0gbVNvdXJjZS0+cmVhZCgmc3RhcnRUaW1lVXMsICZlbmRUaW1lVXMsICZwYXJjZWwsICZvcHRpb25zKTsKICAgICBFWFBFQ1RfRVEoT0ssIGVycik7CiAgICAgRVhQRUNUX0VRKDYwMDAgKiBrTXNlY1RvVXNlYywgc3RhcnRUaW1lVXMpOwotICAgIHN1YnRpdGxlID0gU3RyaW5nUHJpbnRmKCI4XG5cbiIpOworICAgIHN1YnRpdGxlID0gQVN0cmluZ1ByaW50ZigiOFxuXG4iKTsKICAgICBDaGVja0RhdGFFcXVhbHMocGFyY2VsLCBzdWJ0aXRsZS5jX3N0cigpKTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibVdyaXRlci5jcHAKaW5kZXggMDNjZjkyYS4uMDY5OTYxYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuY3BwCkBAIC0zMzMsNyArMzMzLDYgQEAKICAgICBzZXJpYWxpemVDb2RlZFVuc2lnbmVkKHNlZ21lbnRTaXplQ29kZWQsIGJhcnkpOwogICAgIDo6d3JpdGUobUZkLCBiYXJ5LCBzaXplT2Yoa01rdlVua25vd25MZW5ndGgpKTsKIAotICAgIHVpbnQ2NF90IHNpemU7CiAgICAgdWludDY0X3QgZHVyYXRpb25PZmZzZXQgPSBtSW5mb09mZnNldCArIHNpemVPZihrTWt2SW5mbykgKyBzaXplT2YobUluZm9TaXplKQogICAgICAgICArIHNpemVPZihrTWt2U2VnbWVudER1cmF0aW9uKSArIHNpemVPZihzaXplb2YoZG91YmxlKSk7CiAgICAgc3A8V2VibUVsZW1lbnQ+IGR1cmF0aW9uID0gbmV3IFdlYm1GbG9hdCgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9WaWRlb0Zvcm1hdHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L1ZpZGVvRm9ybWF0cy5jcHAKaW5kZXggMDRlMDJjMS4uMmY0YWY1YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L1ZpZGVvRm9ybWF0cy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L1ZpZGVvRm9ybWF0cy5jcHAKQEAgLTQzNSw3ICs0MzUsNyBAQAogICAgIC8vICAgbWF4LWhyZXMgKG5vbmUgb3IgMiBieXRlKQogICAgIC8vICAgbWF4LXZyZXMgKG5vbmUgb3IgMiBieXRlKQogCi0gICAgcmV0dXJuIFN0cmluZ1ByaW50ZigKKyAgICByZXR1cm4gQVN0cmluZ1ByaW50ZigKICAgICAgICAgICAgICIlMDJ4IDAwICUwMnggJTAyeCAlMDh4ICUwOHggJTA4eCAwMCAwMDAwIDAwMDAgMDAgbm9uZSBub25lIiwKICAgICAgICAgICAgIGZvck00TWVzc2FnZSA/IDB4MDAgOiAoKG1OYXRpdmVJbmRleCA8PCAzKSB8IG1OYXRpdmVUeXBlKSwKICAgICAgICAgICAgIG1Db25maWdzW21OYXRpdmVUeXBlXVttTmF0aXZlSW5kZXhdLnByb2ZpbGUsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1RTUGFja2V0aXplci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1RTUGFja2V0aXplci5jcHAKaW5kZXggNTBkMzE3YS4uNGM1YWQxNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9UU1BhY2tldGl6ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvVFNQYWNrZXRpemVyLmNwcApAQCAtMTA2LDcgKzEwNiw3IEBACiAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChtTUlNRS5jX3N0cigpLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpKSB7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOzsgKytpKSB7CiAgICAgICAgICAgICBzcDxBQnVmZmVyPiBjc2Q7Ci0gICAgICAgICAgICBpZiAoIW1Gb3JtYXQtPmZpbmRCdWZmZXIoU3RyaW5nUHJpbnRmKCJjc2QtJWQiLCBpKS5jX3N0cigpLCAmY3NkKSkgeworICAgICAgICAgICAgaWYgKCFtRm9ybWF0LT5maW5kQnVmZmVyKEFTdHJpbmdQcmludGYoImNzZC0lZCIsIGkpLmNfc3RyKCksICZjc2QpKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvV2lmaURpc3BsYXlTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9XaWZpRGlzcGxheVNvdXJjZS5jcHAKaW5kZXggZGE0MDVlMi4uN2ViOGI3MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9XaWZpRGlzcGxheVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9XaWZpRGlzcGxheVNvdXJjZS5jcHAKQEAgLTQzLDYgKzQzLDEwIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIHN0YXRpYworY29uc3QgaW50NjRfdCBXaWZpRGlzcGxheVNvdXJjZTo6a1JlYXBlckludGVydmFsVXM7Citjb25zdCBpbnQ2NF90IFdpZmlEaXNwbGF5U291cmNlOjprVGVhcmRvd25UcmlnZ2VyVGltZW91U2VjczsKK2NvbnN0IGludDY0X3QgV2lmaURpc3BsYXlTb3VyY2U6OmtQbGF5YmFja1Nlc3Npb25UaW1lb3V0U2VjczsKK2NvbnN0IGludDY0X3QgV2lmaURpc3BsYXlTb3VyY2U6OmtQbGF5YmFja1Nlc3Npb25UaW1lb3V0VXM7CiBjb25zdCBBU3RyaW5nIFdpZmlEaXNwbGF5U291cmNlOjpzVXNlckFnZW50ID0gTWFrZVVzZXJBZ2VudCgpOwogCiBXaWZpRGlzcGxheVNvdXJjZTo6V2lmaURpc3BsYXlTb3VyY2UoCkBAIC01OTQsNyArNTk4LDcgQEAKICAgICBBcHBlbmRDb21tb25SZXNwb25zZSgmcmVxdWVzdCwgbU5leHRDU2VxKTsKIAogICAgIHJlcXVlc3QuYXBwZW5kKCJDb250ZW50LVR5cGU6IHRleHQvcGFyYW1ldGVyc1xyXG4iKTsKLSAgICByZXF1ZXN0LmFwcGVuZChTdHJpbmdQcmludGYoIkNvbnRlbnQtTGVuZ3RoOiAlZFxyXG4iLCBib2R5LnNpemUoKSkpOworICAgIHJlcXVlc3QuYXBwZW5kKEFTdHJpbmdQcmludGYoIkNvbnRlbnQtTGVuZ3RoOiAlZFxyXG4iLCBib2R5LnNpemUoKSkpOwogICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CiAgICAgcmVxdWVzdC5hcHBlbmQoYm9keSk7CiAKQEAgLTYzNSwyNiArNjM5LDI2IEBACiAKICAgICBpZiAobVNpbmtTdXBwb3J0c0F1ZGlvKSB7CiAgICAgICAgIGJvZHkuYXBwZW5kKAotICAgICAgICAgICAgICAgIFN0cmluZ1ByaW50Zigid2ZkX2F1ZGlvX2NvZGVjczogJXNcclxuIiwKKyAgICAgICAgICAgICAgICBBU3RyaW5nUHJpbnRmKCJ3ZmRfYXVkaW9fY29kZWNzOiAlc1xyXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVVzaW5nUENNQXVkaW8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAiTFBDTSAwMDAwMDAwMiAwMCIgLy8gMiBjaCBQQ00gNDhrSHoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiQUFDIDAwMDAwMDAxIDAwIikpKTsgIC8vIDIgY2ggQUFDIDQ4a0h6CiAgICAgfQogCiAgICAgYm9keS5hcHBlbmQoCi0gICAgICAgICAgICBTdHJpbmdQcmludGYoCisgICAgICAgICAgICBBU3RyaW5nUHJpbnRmKAogICAgICAgICAgICAgICAgICJ3ZmRfcHJlc2VudGF0aW9uX1VSTDogcnRzcDovLyVzL3dmZDEuMC9zdHJlYW1pZD0wIG5vbmVcclxuIiwKICAgICAgICAgICAgICAgICBtQ2xpZW50SW5mby5tTG9jYWxJUC5jX3N0cigpKSk7CiAKICAgICBib2R5LmFwcGVuZCgKLSAgICAgICAgICAgIFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgIEFTdHJpbmdQcmludGYoCiAgICAgICAgICAgICAgICAgIndmZF9jbGllbnRfcnRwX3BvcnRzOiAlc1xyXG4iLCBtV2ZkQ2xpZW50UnRwUG9ydHMuY19zdHIoKSkpOwogCiAgICAgQVN0cmluZyByZXF1ZXN0ID0gIlNFVF9QQVJBTUVURVIgcnRzcDovL2xvY2FsaG9zdC93ZmQxLjAgUlRTUC8xLjBcclxuIjsKICAgICBBcHBlbmRDb21tb25SZXNwb25zZSgmcmVxdWVzdCwgbU5leHRDU2VxKTsKIAogICAgIHJlcXVlc3QuYXBwZW5kKCJDb250ZW50LVR5cGU6IHRleHQvcGFyYW1ldGVyc1xyXG4iKTsKLSAgICByZXF1ZXN0LmFwcGVuZChTdHJpbmdQcmludGYoIkNvbnRlbnQtTGVuZ3RoOiAlZFxyXG4iLCBib2R5LnNpemUoKSkpOworICAgIHJlcXVlc3QuYXBwZW5kKEFTdHJpbmdQcmludGYoIkNvbnRlbnQtTGVuZ3RoOiAlZFxyXG4iLCBib2R5LnNpemUoKSkpOwogICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CiAgICAgcmVxdWVzdC5hcHBlbmQoYm9keSk7CiAKQEAgLTcwMCw3ICs3MDQsNyBAQAogICAgIEFwcGVuZENvbW1vblJlc3BvbnNlKCZyZXF1ZXN0LCBtTmV4dENTZXEpOwogCiAgICAgcmVxdWVzdC5hcHBlbmQoIkNvbnRlbnQtVHlwZTogdGV4dC9wYXJhbWV0ZXJzXHJcbiIpOwotICAgIHJlcXVlc3QuYXBwZW5kKFN0cmluZ1ByaW50ZigiQ29udGVudC1MZW5ndGg6ICVkXHJcbiIsIGJvZHkuc2l6ZSgpKSk7CisgICAgcmVxdWVzdC5hcHBlbmQoQVN0cmluZ1ByaW50ZigiQ29udGVudC1MZW5ndGg6ICVkXHJcbiIsIGJvZHkuc2l6ZSgpKSk7CiAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKICAgICByZXF1ZXN0LmFwcGVuZChib2R5KTsKIApAQCAtNzI1LDcgKzcyOSw3IEBACiAKICAgICBDSEVDS19FUShzZXNzaW9uSUQsIG1DbGllbnRTZXNzaW9uSUQpOwogICAgIHJlcXVlc3QuYXBwZW5kKAotICAgICAgICAgICAgU3RyaW5nUHJpbnRmKCJTZXNzaW9uOiAlZFxyXG4iLCBtQ2xpZW50SW5mby5tUGxheWJhY2tTZXNzaW9uSUQpKTsKKyAgICAgICAgICAgIEFTdHJpbmdQcmludGYoIlNlc3Npb246ICVkXHJcbiIsIG1DbGllbnRJbmZvLm1QbGF5YmFja1Nlc3Npb25JRCkpOwogICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7ICAvLyBFbXB0eSBib2R5CiAKICAgICBzdGF0dXNfdCBlcnIgPQpAQCAtMTMwMSw3ICsxMzA1LDcgQEAKIAogICAgIGlmIChydHBNb2RlID09IFJUUFNlbmRlcjo6VFJBTlNQT1JUX1RDUF9JTlRFUkxFQVZFRCkgewogICAgICAgICByZXNwb25zZS5hcHBlbmQoCi0gICAgICAgICAgICAgICAgU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgIEFTdHJpbmdQcmludGYoCiAgICAgICAgICAgICAgICAgICAgICJUcmFuc3BvcnQ6IFJUUC9BVlAvVENQO2ludGVybGVhdmVkPSVkLSVkOyIsCiAgICAgICAgICAgICAgICAgICAgIGNsaWVudFJ0cCwgY2xpZW50UnRjcCkpOwogICAgIH0gZWxzZSB7CkBAIC0xMzE0LDE0ICsxMzE4LDE0IEBACiAKICAgICAgICAgaWYgKGNsaWVudFJ0Y3AgPj0gMCkgewogICAgICAgICAgICAgcmVzcG9uc2UuYXBwZW5kKAotICAgICAgICAgICAgICAgICAgICBTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgICAgIEFTdHJpbmdQcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICAiVHJhbnNwb3J0OiBSVFAvQVZQLyVzO3VuaWNhc3Q7Y2xpZW50X3BvcnQ9JWQtJWQ7IgogICAgICAgICAgICAgICAgICAgICAgICAgInNlcnZlcl9wb3J0PSVkLSVkXHJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRTdHJpbmcuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFJ0cCwgY2xpZW50UnRjcCwgc2VydmVyUnRwLCBzZXJ2ZXJSdHAgKyAxKSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXNwb25zZS5hcHBlbmQoCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgQVN0cmluZ1ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgICJUcmFuc3BvcnQ6IFJUUC9BVlAvJXM7dW5pY2FzdDtjbGllbnRfcG9ydD0lZDsiCiAgICAgICAgICAgICAgICAgICAgICAgICAic2VydmVyX3BvcnQ9JWRcclxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydFN0cmluZy5jX3N0cigpLApAQCAtMTU4MSwxNSArMTU4NSwxNSBAQAogICAgIHJlc3BvbnNlLT5hcHBlbmQoYnVmKTsKICAgICByZXNwb25zZS0+YXBwZW5kKCJcclxuIik7CiAKLSAgICByZXNwb25zZS0+YXBwZW5kKFN0cmluZ1ByaW50ZigiU2VydmVyOiAlc1xyXG4iLCBzVXNlckFnZW50LmNfc3RyKCkpKTsKKyAgICByZXNwb25zZS0+YXBwZW5kKEFTdHJpbmdQcmludGYoIlNlcnZlcjogJXNcclxuIiwgc1VzZXJBZ2VudC5jX3N0cigpKSk7CiAKICAgICBpZiAoY3NlcSA+PSAwKSB7Ci0gICAgICAgIHJlc3BvbnNlLT5hcHBlbmQoU3RyaW5nUHJpbnRmKCJDU2VxOiAlZFxyXG4iLCBjc2VxKSk7CisgICAgICAgIHJlc3BvbnNlLT5hcHBlbmQoQVN0cmluZ1ByaW50ZigiQ1NlcTogJWRcclxuIiwgY3NlcSkpOwogICAgIH0KIAogICAgIGlmIChwbGF5YmFja1Nlc3Npb25JRCA+PSAwbGwpIHsKICAgICAgICAgcmVzcG9uc2UtPmFwcGVuZCgKLSAgICAgICAgICAgICAgICBTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgQVN0cmluZ1ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgIlNlc3Npb246ICVkO3RpbWVvdXQ9JWxsZFxyXG4iLAogICAgICAgICAgICAgICAgICAgICBwbGF5YmFja1Nlc3Npb25JRCwga1BsYXliYWNrU2Vzc2lvblRpbWVvdXRTZWNzKSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERldmljZS5jcHAgYi9tZWRpYS9tdHAvTXRwRGV2aWNlLmNwcAppbmRleCBlMGQ2NzlkLi4zZWFmZDZmIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwRGV2aWNlLmNwcAorKysgYi9tZWRpYS9tdHAvTXRwRGV2aWNlLmNwcApAQCAtMTMxLDEzICsxMzEsMjIgQEAKICAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBfaW5fZGVzYyA9IE5VTEw7CiAgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwX291dF9kZXNjID0gTlVMTDsKICAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBfaW50cl9kZXNjID0gTlVMTDsKKyAgICAgICAgICAgIC8vVVNCMyBhZGQgVVNCX0RUX1NTX0VORFBPSU5UX0NPTVAgYXMgY29tcGFuaW9uIGRlc2NyaXB0b3I7CisgICAgICAgICAgICBzdHJ1Y3QgdXNiX3NzX2VwX2NvbXBfZGVzY3JpcHRvciAqZXBfc3NfZXBfY29tcF9kZXNjID0gTlVMTDsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAgICAgICAgICAgICAgICAgZXAgPSAoc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICopdXNiX2Rlc2NyaXB0b3JfaXRlcl9uZXh0KCZpdGVyKTsKKyAgICAgICAgICAgICAgICBpZiAoZXAgJiYgZXAtPmJEZXNjcmlwdG9yVHlwZSA9PSBVU0JfRFRfU1NfRU5EUE9JTlRfQ09NUCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiRGVzY3JpcHRvciB0eXBlIGlzIFVTQl9EVF9TU19FTkRQT0lOVF9DT01QIGZvciBVU0IzIFxuIik7CisgICAgICAgICAgICAgICAgICAgIGVwX3NzX2VwX2NvbXBfZGVzYyA9ICh1c2Jfc3NfZXBfY29tcF9kZXNjcmlwdG9yKillcDsKKyAgICAgICAgICAgICAgICAgICAgZXAgPSAoc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICopdXNiX2Rlc2NyaXB0b3JfaXRlcl9uZXh0KCZpdGVyKTsKKyAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgaWYgKCFlcCB8fCBlcC0+YkRlc2NyaXB0b3JUeXBlICE9IFVTQl9EVF9FTkRQT0lOVCkgewogICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZW5kcG9pbnRzIG5vdCBmb3VuZFxuIik7CiAgICAgICAgICAgICAgICAgICAgIHVzYl9kZXZpY2VfY2xvc2UoZGV2aWNlKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgaWYgKGVwLT5ibUF0dHJpYnV0ZXMgPT0gVVNCX0VORFBPSU5UX1hGRVJfQlVMSykgewogICAgICAgICAgICAgICAgICAgICBpZiAoZXAtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spCiAgICAgICAgICAgICAgICAgICAgICAgICBlcF9pbl9kZXNjID0gZXA7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rCmluZGV4IGYwMTk2YzYuLjQ0ZDI1NTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rCkBAIC0yOSw2ICsyOSwxMiBAQAogCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAorIyBDbGFuZysrIGFib3J0cyBvbiBBdWRpb01peGVyLmNwcCwKKyMgYi8xODM3Mzg2NiwgImRvIG5vdCBrbm93IGhvdyB0byBzcGxpdCB0aGlzIG9wZXJhdG9yLiIKK2lmZXEgKCQoZmlsdGVyICQoVEFSR0VUX0FSQ0gpLGFybSBhcm02NCksJChUQVJHRVRfQVJDSCkpCisgICAgTE9DQUxfQ0xBTkcgOj0gZmFsc2UKK2VuZGlmCisKIExPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgXAogICAgIEF1ZGlvRmxpbmdlci5jcHAgICAgICAgICAgICBcCiAgICAgVGhyZWFkcy5jcHAgICAgICAgICAgICAgICAgIFwKQEAgLTc0LDEzICs4MCw2IEBACiAKIExPQ0FMX0NGTEFHUyArPSAtRFNUQVRFX1FVRVVFX0lOU1RBTlRJQVRJT05TPSciU3RhdGVRdWV1ZUluc3RhbnRpYXRpb25zLmNwcCInCiAKLSMgRGVmaW5lIEFORFJPSURfU01QIGFwcHJvcHJpYXRlbHkuIFVzZWQgdG8gZ2V0IGlubGluZSB0cmFjaW5nIGZhc3QtcGF0aC4KLWlmZXEgKCQoVEFSR0VUX0NQVV9TTVApLHRydWUpCi0gICAgTE9DQUxfQ0ZMQUdTICs9IC1EQU5EUk9JRF9TTVA9MQotZWxzZQotICAgIExPQ0FMX0NGTEFHUyArPSAtREFORFJPSURfU01QPTAKLWVuZGlmCi0KIExPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKaW5kZXggYjRjOTkwNS4uMThiYTFhZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKQEAgLTEyMTksNyArMTIxOSw3IEBACiAKICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLmFkZChwaWQsIG5vdGlmaWNhdGlvbkNsaWVudCk7CiAKLSAgICAgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IGNsaWVudC0+YXNCaW5kZXIoKTsKKyAgICAgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IElJbnRlcmZhY2U6OmFzQmluZGVyKGNsaWVudCk7CiAgICAgICAgICAgICBiaW5kZXItPmxpbmtUb0RlYXRoKG5vdGlmaWNhdGlvbkNsaWVudCk7CiAgICAgICAgICAgICBjbGllbnRBZGRlZCA9IHRydWU7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5oCmluZGV4IDNiOTcyYmIuLmY0ZjE0MmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuaApAQCAtMjEsMTUgKzIxLDE1IEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19lZmZlY3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJMb2cuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9Db21wYXQuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmg+CiAjaW5jbHVkZSAiQXVkaW9SZXNhbXBsZXIuaCIKIAotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX2VmZmVjdC5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CTG9nLmg+Ci0KIC8vIEZJWE1FIFRoaXMgaXMgYWN0dWFsbHkgdW5pdHkgZ2Fpbiwgd2hpY2ggbWlnaHQgbm90IGJlIG1heCBpbiBmdXR1cmUsIGV4cHJlc3NlZCBpbiBVLjEyCiAjZGVmaW5lIE1BWF9HQUlOX0lOVCBBdWRpb01peGVyOjpVTklUWV9HQUlOX0lOVAogCkBAIC01OCw3ICs1OCw3IEBACiAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE1BWF9OVU1fQ0hBTk5FTFNfVE9fRE9XTk1JWCA9IEFVRElPX0NIQU5ORUxfQ09VTlRfTUFYOwogCiAgICAgc3RhdGljIGNvbnN0IHVpbnQxNl90IFVOSVRZX0dBSU5fSU5UID0gMHgxMDAwOwotICAgIHN0YXRpYyBjb25zdCBmbG9hdCAgICBVTklUWV9HQUlOX0ZMT0FUID0gMS4wZjsKKyAgICBzdGF0aWMgY29uc3QgQ09OU1RFWFBSIGZsb2F0IFVOSVRZX0dBSU5fRkxPQVQgPSAxLjBmOwogCiAgICAgZW51bSB7IC8vIG5hbWVzCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyT3BzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlck9wcy5oCmluZGV4IGY3Mzc2YTguLjI2Nzg4NTcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyT3BzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXJPcHMuaApAQCAtNTIsMTUgKzUyLDEyIEBACiAgKgogICogRm9yIGhpZ2ggcHJlY2lzaW9uIGF1ZGlvLCBvbmx5IHRoZSA8VE8sIFRJLCBUVj4gPSA8ZmxvYXQsIGZsb2F0LCBmbG9hdD4KICAqIG5lZWRzIHRvIGJlIGFjY2VsZXJhdGVkLiBUaGlzIGlzIHBlcmhhcHMgdGhlIGVhc2llc3QgZm9ybSB0byBkbyBxdWlja2x5IGFzIHdlbGwuCisgKgorICogQSBnZW5lcmljIHZlcnNpb24gaXMgTk9UIGRlZmluZWQgdG8gY2F0Y2ggYW55IG1pc3Rha2Ugb2YgdXNpbmcgaXQuCiAgKi8KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVFY+Ci1pbmxpbmUgVE8gTWl4TXVsKFRJIHZhbHVlLCBUViB2b2x1bWUpIHsKLSAgICBDT01QSUxFX1RJTUVfQVNTRVJUX0ZVTkNUSU9OX1NDT1BFKGZhbHNlKTsKLSAgICAvLyBzaG91bGQgbm90IGJlIGhlcmUgOi0pLgotICAgIC8vIFRvIGF2b2lkIG1pc3Rha2VzLCB0aGlzIHRlbXBsYXRlIGlzIGFsd2F5cyBzcGVjaWFsaXplZC4KLSAgICByZXR1cm4gdmFsdWUgKiB2b2x1bWU7Ci19CitUTyBNaXhNdWwoVEkgdmFsdWUsIFRWIHZvbHVtZSk7CiAKIHRlbXBsYXRlIDw+CiBpbmxpbmUgaW50MzJfdCBNaXhNdWw8aW50MzJfdCwgaW50MTZfdCwgaW50MTZfdD4oaW50MTZfdCB2YWx1ZSwgaW50MTZfdCB2b2x1bWUpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXIuY3BwCmluZGV4IDFmN2E2MTMuLjQ2ZTNkNmMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyLmNwcApAQCAtMjksMTQgKzI5LDExIEBACiAjaW5jbHVkZSAiQXVkaW9SZXNhbXBsZXJEeW4uaCIKIAogI2lmZGVmIF9fYXJtX18KLSNpbmNsdWRlIDxtYWNoaW5lL2NwdS1mZWF0dXJlcy5oPgorICAgICNkZWZpbmUgQVNNX0FSTV9SRVNBTVAxIC8vIGVuYWJsZSBhc20gb3B0aW1pc2F0aW9uIGZvciBSZXNhbXBsZXJPcmRlcjEKICNlbmRpZgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLSNpZmRlZiBfX0FSTV9IQVZFX0hBTEZXT1JEX01VTFRJUExZIC8vIG9wdGltaXplZCBhc20gb3B0aW9uCi0gICAgI2RlZmluZSBBU01fQVJNX1JFU0FNUDEgLy8gZW5hYmxlIGFzbSBvcHRpbWlzYXRpb24gZm9yIFJlc2FtcGxlck9yZGVyMQotI2VuZGlmIC8vIF9fQVJNX0hBVkVfSEFMRldPUkRfTVVMVElQTFkKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogY2xhc3MgQXVkaW9SZXNhbXBsZXJPcmRlcjEgOiBwdWJsaWMgQXVkaW9SZXNhbXBsZXIgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXIuaAppbmRleCBjZGM2ZDkyLi4wNjlkOTQ2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXIuaApAQCAtMTksNyArMTksOSBAQAogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKICNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9Db21wYXQuaD4KIAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KQEAgLTQ3LDcgKzQ5LDcgQEAKICAgICAgICAgRFlOX0hJR0hfUVVBTElUWT03LAogICAgIH07CiAKLSAgICBzdGF0aWMgY29uc3QgZmxvYXQgVU5JVFlfR0FJTl9GTE9BVCA9IDEuMGY7CisgICAgc3RhdGljIGNvbnN0IENPTlNURVhQUiBmbG9hdCBVTklUWV9HQUlOX0ZMT0FUID0gMS4wZjsKIAogICAgIHN0YXRpYyBBdWRpb1Jlc2FtcGxlciogY3JlYXRlKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IGluQ2hhbm5lbENvdW50LAogICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlLCBzcmNfcXVhbGl0eSBxdWFsaXR5PURFRkFVTFRfUVVBTElUWSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJGaXJHZW4uaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpckdlbi5oCmluZGV4IGQwMjRiMmYuLmYzNzE4YjYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpckdlbi5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpckdlbi5oCkBAIC0xNyw2ICsxNyw4IEBACiAjaWZuZGVmIEFORFJPSURfQVVESU9fUkVTQU1QTEVSX0ZJUl9HRU5fSAogI2RlZmluZSBBTkRST0lEX0FVRElPX1JFU0FNUExFUl9GSVJfR0VOX0gKIAorI2luY2x1ZGUgInV0aWxzL0NvbXBhdC5oIgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8qCkBAIC0xODcsMjIgKzE4OSwyMiBAQAogCiB0ZW1wbGF0ZSA8aW50IE4+CiBzdHJ1Y3QgSTBUZXJtIHsKLSAgICBzdGF0aWMgY29uc3QgZG91YmxlIHZhbHVlID0gSTBUZXJtPE4tMT46OnZhbHVlIC8gKDQuICogTiAqIE4pOworICAgIHN0YXRpYyBjb25zdCBDT05TVEVYUFIgZG91YmxlIHZhbHVlID0gSTBUZXJtPE4tMT46OnZhbHVlIC8gKDQuICogTiAqIE4pOwogfTsKIAogdGVtcGxhdGUgPD4KIHN0cnVjdCBJMFRlcm08MD4gewotICAgIHN0YXRpYyBjb25zdCBkb3VibGUgdmFsdWUgPSAxLjsKKyAgICBzdGF0aWMgY29uc3QgQ09OU1RFWFBSIGRvdWJsZSB2YWx1ZSA9IDEuOwogfTsKIAogdGVtcGxhdGUgPGludCBOPgogc3RydWN0IEkwQVRlcm0gewotICAgIHN0YXRpYyBjb25zdCBkb3VibGUgdmFsdWUgPSBJMEFUZXJtPE4tMT46OnZhbHVlICogKDIuKk4tMS4pICogKDIuKk4tMS4pIC8gKDguICogTik7CisgICAgc3RhdGljIGNvbnN0IENPTlNURVhQUiBkb3VibGUgdmFsdWUgPSBJMEFUZXJtPE4tMT46OnZhbHVlICogKDIuKk4tMS4pICogKDIuKk4tMS4pIC8gKDguICogTik7CiB9OwogCiB0ZW1wbGF0ZSA8Pgogc3RydWN0IEkwQVRlcm08MD4geyAvLyAxL3NxcnQoMipQSSk7Ci0gICAgc3RhdGljIGNvbnN0IGRvdWJsZSB2YWx1ZSA9IDAuMzk4OTQyMjgwNDAxNDMyNjc3OTM5OTQ2MDU5OTM0MzgxODY4NDc1ODU4NjMxMTY0OTM0NjU3NjY1OTI1OworICAgIHN0YXRpYyBjb25zdCBDT05TVEVYUFIgZG91YmxlIHZhbHVlID0gMC4zOTg5NDIyODA0MDE0MzI2Nzc5Mzk5NDYwNTk5MzQzODE4Njg0NzU4NTg2MzExNjQ5MzQ2NTc2NjU5MjU7CiB9OwogCiAjaWYgVVNFX0hPUk5FUlNfTUVUSE9ECmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmMuY3BwCmluZGV4IGQwM2U1NzguLmU2ZmI3NmMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmMuY3BwCkBAIC0zMSw3ICszMSwxMCBAQAogCiAjaW5jbHVkZSAiQXVkaW9SZXNhbXBsZXJTaW5jLmgiCiAKLQorI2lmIGRlZmluZWQoX19jbGFuZ19fKSAmJiAhX19oYXNfYnVpbHRpbihfX2J1aWx0aW5fYXNzdW1lX2FsaWduZWQpCisjZGVmaW5lIF9fYnVpbHRpbl9hc3N1bWVfYWxpZ25lZChwLCBhKSBcCisJKCgodWludHB0cl90KHApICUgKGEpKSA9PSAwKSA/IChwKSA6IChfX2J1aWx0aW5fdW5yZWFjaGFibGUoKSwgKHApKSkKKyNlbmRpZgogCiAjaWYgZGVmaW5lZChfX2FybV9fKSAmJiAhZGVmaW5lZChfX3RodW1iX18pCiAjZGVmaW5lIFVTRV9JTkxJTkVfQVNTRU1CTFkgKHRydWUpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU3RhdGVRdWV1ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU3RhdGVRdWV1ZS5jcHAKaW5kZXggNDBkN2JjZC4uOWQ0MTg4ZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1N0YXRlUXVldWUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TdGF0ZVF1ZXVlLmNwcApAQCAtNDgsNyArNDgsNyBAQAogICAgICwgbU9ic2VydmVyRHVtcCgmbU9ic2VydmVyRHVtbXlEdW1wKSwgbU11dGF0b3JEdW1wKCZtTXV0YXRvckR1bW15RHVtcCkKICNlbmRpZgogewotICAgIGF0b21pY19pbml0KCZtTmV4dCwgMCk7CisgICAgYXRvbWljX2luaXQoJm1OZXh0LCBzdGF0aWNfY2FzdDx1aW50cHRyX3Q+KDApKTsKIH0KIAogdGVtcGxhdGU8dHlwZW5hbWUgVD4gU3RhdGVRdWV1ZTxUPjo6flN0YXRlUXVldWUoKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCmluZGV4IDRjOTBiZTUuLjk2OGIwZjkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKQEAgLTMzOCw3ICszMzgsNyBAQAogICAgIC8vIGRvIG5vdCBsb2NrIHRoZSBtdXRleCBpbiBkZXN0cnVjdG9yCiAgICAgcmVsZWFzZVdha2VMb2NrX2woKTsKICAgICBpZiAobVBvd2VyTWFuYWdlciAhPSAwKSB7Ci0gICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IG1Qb3dlck1hbmFnZXItPmFzQmluZGVyKCk7CisgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IElJbnRlcmZhY2U6OmFzQmluZGVyKG1Qb3dlck1hbmFnZXIpOwogICAgICAgICBiaW5kZXItPnVubGlua1RvRGVhdGgobURlYXRoUmVjaXBpZW50KTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy9BbmRyb2lkLm1rCmluZGV4IDdiYmEwNWIuLjg2MDRlZjUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy9BbmRyb2lkLm1rCkBAIC0xMCwxOSArMTAsMTAgQEAKIAlsaWJsb2cgXAogCWxpYnV0aWxzIFwKIAlsaWJjdXRpbHMgXAotCWxpYnN0bHBvcnQgXAogCWxpYmF1ZGlvdXRpbHMgXAogCWxpYmF1ZGlvcmVzYW1wbGVyCiAKLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAotCWxpYmd0ZXN0IFwKLQlsaWJndGVzdF9tYWluCi0KIExPQ0FMX0NfSU5DTFVERVMgOj0gXAotCWJpb25pYyBcCi0JYmlvbmljL2xpYnN0ZGMrKy9pbmNsdWRlIFwKLQlleHRlcm5hbC9ndGVzdC9pbmNsdWRlIFwKLQlleHRlcm5hbC9zdGxwb3J0L3N0bHBvcnQgXAogCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAogCWZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyCiAKQEAgLTMyLDIxICsyMywyNCBAQAogTE9DQUxfTU9EVUxFIDo9IHJlc2FtcGxlcl90ZXN0cwogTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKIAotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCitpbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCiAKICMKICMgYXVkaW8gbWl4ZXIgdGVzdCB0b29sCiAjCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAorIyBDbGFuZysrIGFib3J0cyBvbiBBdWRpb01peGVyLmNwcCwKKyMgYi8xODM3Mzg2NiwgImRvIG5vdCBrbm93IGhvdyB0byBzcGxpdCB0aGlzIG9wZXJhdG9yLiIKK2lmZXEgKCQoZmlsdGVyICQoVEFSR0VUX0FSQ0gpLGFybSBhcm02NCksJChUQVJHRVRfQVJDSCkpCisgICAgTE9DQUxfQ0xBTkcgOj0gZmFsc2UKK2VuZGlmCisKIExPQ0FMX1NSQ19GSUxFUzo9IFwKIAl0ZXN0LW1peGVyLmNwcCBcCiAJLi4vQXVkaW9NaXhlci5jcHAuYXJtIFwKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0JYmlvbmljIFwKLQliaW9uaWMvbGlic3RkYysrL2luY2x1ZGUgXAotCWV4dGVybmFsL3N0bHBvcnQvc3RscG9ydCBcCiAJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpIFwKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKIAlmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvZmxpbmdlcgpAQCAtNTUsNyArNDksNiBAQAogCWxpYnNuZGZpbGUKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGlic3RscG9ydCBcCiAJbGliZWZmZWN0cyBcCiAJbGlibmJhaW8gXAogCWxpYmNvbW1vbl90aW1lX2NsaWVudCBcCkBAIC03MCw0ICs2Myw2IEBACiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiAKK0xPQ0FMX0NYWF9TVEwgOj0gbGliYysrCisKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5U2VydmljZS5jcHAKaW5kZXggMDk1NWUxMC4uZWI5MTE2ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8aGFyZHdhcmVfbGVnYWN5L3Bvd2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KICNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CiAKICNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgpAQCAtMTYwLDcgKzE2MSw3IEBACiAKICAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMuYWRkKHVpZCwgbm90aWZpY2F0aW9uQ2xpZW50KTsKIAotICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBjbGllbnQtPmFzQmluZGVyKCk7CisgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IElJbnRlcmZhY2U6OmFzQmluZGVyKGNsaWVudCk7CiAgICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgobm90aWZpY2F0aW9uQ2xpZW50KTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeVNlcnZpY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5U2VydmljZS5oCmluZGV4IDA5Mzc1Y2YuLjgwMjg0YTQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5U2VydmljZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5U2VydmljZS5oCkBAIC0zMSw3ICszMSw5IEBACiAjaW5jbHVkZSA8bWVkaWEvVG9uZUdlbmVyYXRvci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KKyNpZmRlZiBVU0VfTEVHQUNZX0FVRElPX1BPTElDWQogI2luY2x1ZGUgPGhhcmR3YXJlX2xlZ2FjeS9BdWRpb1BvbGljeUludGVyZmFjZS5oPgorI2VuZGlmCiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lFZmZlY3RzLmgiCiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lNYW5hZ2VyLmgiCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKaW5kZXggMjgyMmUwMy4uYTE0NDc1MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKQEAgLTc1NSw3ICs3NTUsNyBAQAogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOwogICAgICAgICBzcDxCYXNpY0NsaWVudD4gY2xpZW50VG1wOwogICAgICAgICBpZiAoIWNhbkNvbm5lY3RVbnNhZmUoY2FtZXJhSWQsIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhQ2xpZW50LT5hc0JpbmRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIoY2FtZXJhQ2xpZW50KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki9jbGllbnRUbXApKSB7CiAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOwogICAgICAgICB9IGVsc2UgaWYgKGNsaWVudC5nZXQoKSAhPSBOVUxMKSB7CkBAIC04MTgsNyArODE4LDcgQEAKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlcnZpY2VMb2NrKTsKICAgICAgICAgc3A8QmFzaWNDbGllbnQ+IGNsaWVudFRtcDsKICAgICAgICAgaWYgKCFjYW5Db25uZWN0VW5zYWZlKGNhbWVyYUlkLCBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUNsaWVudC0+YXNCaW5kZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKGNhbWVyYUNsaWVudCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovY2xpZW50VG1wKSkgewogICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKICAgICAgICAgfSBlbHNlIGlmIChjbGllbnQuZ2V0KCkgIT0gTlVMTCkgewpAQCAtODg5LDcgKzg4OSw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIHNwPEJhc2ljQ2xpZW50PiBjbGllbnQ7CiAgICAgICAgICAgICBpZiAoIWNhbkNvbm5lY3RVbnNhZmUoY2FtZXJhSWQsIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUNiLT5hc0JpbmRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKGNhbWVyYUNiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovY2xpZW50KSkgewogICAgICAgICAgICAgICAgIHJldHVybiAtRUJVU1k7CiAgICAgICAgICAgICB9CkBAIC05NjIsNyArOTYyLDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgc3A8QmFzaWNDbGllbnQ+IGNsaWVudDsKICAgICAgICAgICAgIGlmICghY2FuQ29ubmVjdFVuc2FmZShjYW1lcmFJZCwgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhQ2ItPmFzQmluZGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIoY2FtZXJhQ2IpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki9jbGllbnQpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKICAgICAgICAgICAgIH0KQEAgLTEwMjQsNyArMTAyNCw3IEBACiAKICAgICBWZWN0b3I8c3A8SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gPjo6aXRlcmF0b3IgaXQsIGVuZDsKICAgICBmb3IgKGl0ID0gbUxpc3RlbmVyTGlzdC5iZWdpbigpOyBpdCAhPSBtTGlzdGVuZXJMaXN0LmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIGlmICgoKml0KS0+YXNCaW5kZXIoKSA9PSBsaXN0ZW5lci0+YXNCaW5kZXIoKSkgeworICAgICAgICBpZiAoSUludGVyZmFjZTo6YXNCaW5kZXIoKml0KSA9PSBJSW50ZXJmYWNlOjphc0JpbmRlcihsaXN0ZW5lcikpIHsKICAgICAgICAgICAgIEFMT0dXKCIlczogVHJpZWQgdG8gYWRkIGxpc3RlbmVyICVwIHdoaWNoIHdhcyBhbHJlYWR5IHN1YnNjcmliZWQiLAogICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBsaXN0ZW5lci5nZXQoKSk7CiAgICAgICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7CkBAIC0xMDU3LDcgKzEwNTcsNyBAQAogCiAgICAgVmVjdG9yPHNwPElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+ID46Oml0ZXJhdG9yIGl0OwogICAgIGZvciAoaXQgPSBtTGlzdGVuZXJMaXN0LmJlZ2luKCk7IGl0ICE9IG1MaXN0ZW5lckxpc3QuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgaWYgKCgqaXQpLT5hc0JpbmRlcigpID09IGxpc3RlbmVyLT5hc0JpbmRlcigpKSB7CisgICAgICAgIGlmIChJSW50ZXJmYWNlOjphc0JpbmRlcigqaXQpID09IElJbnRlcmZhY2U6OmFzQmluZGVyKGxpc3RlbmVyKSkgewogICAgICAgICAgICAgbUxpc3RlbmVyTGlzdC5lcmFzZShpdCk7CiAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KQEAgLTExNzAsNyArMTE3MCw3IEBACiAgICAgICAgICAgICAvLyBGb3VuZCBvdXIgY2FtZXJhLCBjbGVhciBhbmQgbGVhdmUuCiAgICAgICAgICAgICBMT0cxKCJyZW1vdmVDbGllbnQ6IGNsZWFyIHBybyAlcCIsIGNsaWVudFByby5nZXQoKSk7CiAKLSAgICAgICAgICAgIGNsaWVudFByby0+Z2V0UmVtb3RlQ2FsbGJhY2soKS0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKGNsaWVudFByby0+Z2V0UmVtb3RlQ2FsbGJhY2soKSktPnVubGlua1RvRGVhdGgodGhpcyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEzNjQsNyArMTM2NCw4IEBACiAgICAgICAgIGludCBjYW1lcmFJZCwgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgaW50IGNsaWVudFBpZCwgdWlkX3QgY2xpZW50VWlkLAogICAgICAgICBpbnQgc2VydmljZVBpZCkgOgotICAgICAgICBDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudChjYW1lcmFTZXJ2aWNlLCBjYW1lcmFDbGllbnQtPmFzQmluZGVyKCksCisgICAgICAgIENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50KGNhbWVyYVNlcnZpY2UsCisgICAgICAgICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIoY2FtZXJhQ2xpZW50KSwKICAgICAgICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgY2FtZXJhRmFjaW5nLAogICAgICAgICAgICAgICAgIGNsaWVudFBpZCwgY2xpZW50VWlkLApAQCAtMTQ4NSw3ICsxNDg2LDkgQEAKIAogICAgIH0KICAgICAvLyBBbHdheXMgc3RvcCB3YXRjaGluZywgZXZlbiBpZiBubyBjYW1lcmEgb3AgaXMgYWN0aXZlCi0gICAgbUFwcE9wc01hbmFnZXIuc3RvcFdhdGNoaW5nTW9kZShtT3BzQ2FsbGJhY2spOworICAgIGlmIChtT3BzQ2FsbGJhY2sgIT0gTlVMTCkgeworICAgICAgICBtQXBwT3BzTWFuYWdlci5zdG9wV2F0Y2hpbmdNb2RlKG1PcHNDYWxsYmFjayk7CisgICAgfQogICAgIG1PcHNDYWxsYmFjay5jbGVhcigpOwogCiAgICAgcmV0dXJuIE9LOwpAQCAtMTU4MSw3ICsxNTg0LDcgQEAKICAgICAgICAgaW50IGNsaWVudFBpZCwKICAgICAgICAgdWlkX3QgY2xpZW50VWlkLAogICAgICAgICBpbnQgc2VydmljZVBpZCkKLSAgICAgICAgOiBDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudChjYW1lcmFTZXJ2aWNlLCByZW1vdGVDYWxsYmFjay0+YXNCaW5kZXIoKSwKKyAgICAgICAgOiBDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudChjYW1lcmFTZXJ2aWNlLCBJSW50ZXJmYWNlOjphc0JpbmRlcihyZW1vdGVDYWxsYmFjayksCiAgICAgICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsIGNhbWVyYUlkLCBjYW1lcmFGYWNpbmcsCiAgICAgICAgICAgICAgICAgY2xpZW50UGlkLCAgY2xpZW50VWlkLCBzZXJ2aWNlUGlkKQogewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCmluZGV4IDhhM2RiMDguLmZkMmEyZWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKQEAgLTI3OSw3ICsyNzksNyBAQAogICAgICAgICB9CiAKICAgICAgICAgdmlydHVhbCBzcDxJQmluZGVyPiBhc0JpbmRlcldyYXBwZXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gYXNCaW5kZXIoKTsKKyAgICAgICAgICAgIHJldHVybiBhc0JpbmRlcih0aGlzKTsKICAgICAgICAgfQogCiAgICAgcHJvdGVjdGVkOgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAKaW5kZXggOWEzZDQ2Yi4uY2Q4MDhkYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwCkBAIC0xNjksNyArMTY5LDggQEAKICAgICBTdHJpbmc4IHJlc3VsdDsKICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJDbGllbnQyWyVkXSAoJXApIENsaWVudDogJXMgUElEOiAlZCwgZHVtcDpcbiIsCiAgICAgICAgICAgICBtQ2FtZXJhSWQsCi0gICAgICAgICAgICBnZXRSZW1vdGVDYWxsYmFjaygpLT5hc0JpbmRlcigpLmdldCgpLAorICAgICAgICAgICAgKGdldFJlbW90ZUNhbGxiYWNrKCkgIT0gTlVMTCA/CisgICAgICAgICAgICAgICAgICAgIChJSW50ZXJmYWNlOjphc0JpbmRlcihnZXRSZW1vdGVDYWxsYmFjaygpKS5nZXQoKSkgOiBOVUxMKSwKICAgICAgICAgICAgIFN0cmluZzgobUNsaWVudFBhY2thZ2VOYW1lKS5zdHJpbmcoKSwKICAgICAgICAgICAgIG1DbGllbnRQaWQpOwogICAgIHJlc3VsdC5hcHBlbmQoIiAgU3RhdGU6ICIpOwpAQCAtNTM1LDcgKzUzNiw3IEBACiAgICAgc3A8SUJpbmRlcj4gYmluZGVyOwogICAgIHNwPEFOYXRpdmVXaW5kb3c+IHdpbmRvdzsKICAgICBpZiAoYnVmZmVyUHJvZHVjZXIgIT0gMCkgewotICAgICAgICBiaW5kZXIgPSBidWZmZXJQcm9kdWNlci0+YXNCaW5kZXIoKTsKKyAgICAgICAgYmluZGVyID0gSUludGVyZmFjZTo6YXNCaW5kZXIoYnVmZmVyUHJvZHVjZXIpOwogICAgICAgICAvLyBVc2luZyBjb250cm9sbGVkQnlBcHAgZmxhZyB0byBlbnN1cmUgdGhhdCB0aGUgYnVmZmVyIHF1ZXVlIHJlbWFpbnMgaW4KICAgICAgICAgLy8gYXN5bmMgbW9kZSBmb3IgdGhlIG9sZCBjYW1lcmEgQVBJLCB3aGVyZSBtYW55IGFwcGxpY2F0aW9ucyBkZXBlbmQKICAgICAgICAgLy8gb24gdGhhdCBiZWhhdmlvci4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmNwcAppbmRleCA3NWIzYjcyLi5kMWI5MjllIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwCkBAIC0xMjIsNyArMTIyLDggQEAKIAogICAgIHNpemVfdCBsZW4gPSBzbnByaW50ZihidWZmZXIsIFNJWkUsICJDbGllbnRbJWRdICglcCkgUElEOiAlZFxuIiwKICAgICAgICAgICAgIG1DYW1lcmFJZCwKLSAgICAgICAgICAgIGdldFJlbW90ZUNhbGxiYWNrKCktPmFzQmluZGVyKCkuZ2V0KCksCisgICAgICAgICAgICAoZ2V0UmVtb3RlQ2FsbGJhY2soKSAhPSBOVUxMID8KKyAgICAgICAgICAgICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIoZ2V0UmVtb3RlQ2FsbGJhY2soKSkuZ2V0KCkgOiBOVUxMKSwKICAgICAgICAgICAgIG1DbGllbnRQaWQpOwogICAgIGxlbiA9IChsZW4gPiBTSVpFIC0gMSkgPyBTSVpFIC0gMSA6IGxlbjsKICAgICB3cml0ZShmZCwgYnVmZmVyLCBsZW4pOwpAQCAtMjA5LDcgKzIxMCw3IEBACiAgICAgfQogCiAgICAgaWYgKG1SZW1vdGVDYWxsYmFjayAhPSAwICYmCi0gICAgICAgIChjbGllbnQtPmFzQmluZGVyKCkgPT0gbVJlbW90ZUNhbGxiYWNrLT5hc0JpbmRlcigpKSkgeworICAgICAgICAoSUludGVyZmFjZTo6YXNCaW5kZXIoY2xpZW50KSA9PSBJSW50ZXJmYWNlOjphc0JpbmRlcihtUmVtb3RlQ2FsbGJhY2spKSkgewogICAgICAgICBMT0cxKCJDb25uZWN0IHRvIHRoZSBzYW1lIGNsaWVudCIpOwogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQpAQCAtMzMyLDcgKzMzMyw3IEBACiAgICAgc3A8SUJpbmRlcj4gYmluZGVyOwogICAgIHNwPEFOYXRpdmVXaW5kb3c+IHdpbmRvdzsKICAgICBpZiAoYnVmZmVyUHJvZHVjZXIgIT0gMCkgewotICAgICAgICBiaW5kZXIgPSBidWZmZXJQcm9kdWNlci0+YXNCaW5kZXIoKTsKKyAgICAgICAgYmluZGVyID0gSUludGVyZmFjZTo6YXNCaW5kZXIoYnVmZmVyUHJvZHVjZXIpOwogICAgICAgICAvLyBVc2luZyBjb250cm9sbGVkQnlBcHAgZmxhZyB0byBlbnN1cmUgdGhhdCB0aGUgYnVmZmVyIHF1ZXVlIHJlbWFpbnMgaW4KICAgICAgICAgLy8gYXN5bmMgbW9kZSBmb3IgdGhlIG9sZCBjYW1lcmEgQVBJLCB3aGVyZSBtYW55IGFwcGxpY2F0aW9ucyBkZXBlbmQKICAgICAgICAgLy8gb24gdGhhdCBiZWhhdmlvci4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5oCmluZGV4IDdlNWJlODQuLmU2MjhhN2UgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaApAQCAtMTksMTEgKzE5LDEzIEBACiAKICNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MuaD4KIAorI2luY2x1ZGUgPHV0aWxzL0NvbXBhdC5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKwogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMyLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+CkBAIC0xODcsNyArMTg5LDcgQEAKICAgICBzdGF0aWMgY29uc3QgaW50IE1BWF9JTklUSUFMX1BSRVZJRVdfV0lEVEggPSAxOTIwOwogICAgIHN0YXRpYyBjb25zdCBpbnQgTUFYX0lOSVRJQUxfUFJFVklFV19IRUlHSFQgPSAxMDgwOwogICAgIC8vIEFzcGVjdCByYXRpbyB0b2xlcmFuY2UKLSAgICBzdGF0aWMgY29uc3QgZmxvYXQgQVNQRUNUX1JBVElPX1RPTEVSQU5DRSA9IDAuMDAxOworICAgIHN0YXRpYyBjb25zdCBDT05TVEVYUFIgZmxvYXQgQVNQRUNUX1JBVElPX1RPTEVSQU5DRSA9IDAuMDAxOwogCiAgICAgLy8gRnVsbCBzdGF0aWMgY2FtZXJhIGluZm8sIG9iamVjdCBvd25lZCBieSBzb21lb25lIGVsc2UsIHN1Y2ggYXMKICAgICAvLyBDYW1lcmEyRGV2aWNlLgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1N0cmVhbWluZ1Byb2Nlc3Nvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmNwcAppbmRleCA0NzA2MjRiLi4xNDZkNTcyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmNwcApAQCAtMjcsNiArMjcsNyBAQAogCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKyNpbmNsdWRlIDxndWkvQnVmZmVySXRlbS5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvTWV0YWRhdGFCdWZmZXJUeXBlLmg+CiAKQEAgLTY3NSw3ICs2NzYsNyBAQAogICAgIHNwPENhbWVyYTJDbGllbnQ+IGNsaWVudCA9IG1DbGllbnQucHJvbW90ZSgpOwogICAgIGlmIChjbGllbnQgPT0gMCkgewogICAgICAgICAvLyBEaXNjYXJkIGZyYW1lcyBkdXJpbmcgc2h1dGRvd24KLSAgICAgICAgQnVmZmVySXRlbUNvbnN1bWVyOjpCdWZmZXJJdGVtIGltZ0J1ZmZlcjsKKyAgICAgICAgQnVmZmVySXRlbSBpbWdCdWZmZXI7CiAgICAgICAgIHJlcyA9IG1SZWNvcmRpbmdDb25zdW1lci0+YWNxdWlyZUJ1ZmZlcigmaW1nQnVmZmVyLCAwKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgaWYgKHJlcyAhPSBCdWZmZXJJdGVtQ29uc3VtZXI6Ok5PX0JVRkZFUl9BVkFJTEFCTEUpIHsKQEAgLTY5Myw3ICs2OTQsNyBAQAogICAgICAgICAgICAgd2l0aCBDYW1lcmEyQ2xpZW50IGNvZGUgY2FsbGluZyBpbnRvIFN0cmVhbWluZ1Byb2Nlc3NvciAqLwogICAgICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpMb2NrIGwoY2xpZW50LT5nZXRQYXJhbWV0ZXJzKCkpOwogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbShtTXV0ZXgpOwotICAgICAgICBCdWZmZXJJdGVtQ29uc3VtZXI6OkJ1ZmZlckl0ZW0gaW1nQnVmZmVyOworICAgICAgICBCdWZmZXJJdGVtIGltZ0J1ZmZlcjsKICAgICAgICAgcmVzID0gbVJlY29yZGluZ0NvbnN1bWVyLT5hY3F1aXJlQnVmZmVyKCZpbWdCdWZmZXIsIDApOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBpZiAocmVzICE9IEJ1ZmZlckl0ZW1Db25zdW1lcjo6Tk9fQlVGRkVSX0FWQUlMQUJMRSkgewpAQCAtODE5LDggKzgyMCw3IEBACiAKICAgICBzaXplX3QgaXRlbUluZGV4OwogICAgIGZvciAoaXRlbUluZGV4ID0gMDsgaXRlbUluZGV4IDwgbVJlY29yZGluZ0J1ZmZlcnMuc2l6ZSgpOyBpdGVtSW5kZXgrKykgewotICAgICAgICBjb25zdCBCdWZmZXJJdGVtQ29uc3VtZXI6OkJ1ZmZlckl0ZW0gaXRlbSA9Ci0gICAgICAgICAgICAgICAgbVJlY29yZGluZ0J1ZmZlcnNbaXRlbUluZGV4XTsKKyAgICAgICAgY29uc3QgQnVmZmVySXRlbSBpdGVtID0gbVJlY29yZGluZ0J1ZmZlcnNbaXRlbUluZGV4XTsKICAgICAgICAgaWYgKGl0ZW0ubUJ1ZiAhPSBCdWZmZXJJdGVtQ29uc3VtZXI6OklOVkFMSURfQlVGRkVSX1NMT1QgJiYKICAgICAgICAgICAgICAgICBpdGVtLm1HcmFwaGljQnVmZmVyLT5oYW5kbGUgPT0gaW1nSGFuZGxlKSB7CiAgICAgICAgICAgICBicmVhazsKQEAgLTg2NCw4ICs4NjQsNyBAQAogCiAgICAgc2l6ZV90IHJlbGVhc2VkQ291bnQgPSAwOwogICAgIGZvciAoc2l6ZV90IGl0ZW1JbmRleCA9IDA7IGl0ZW1JbmRleCA8IG1SZWNvcmRpbmdCdWZmZXJzLnNpemUoKTsgaXRlbUluZGV4KyspIHsKLSAgICAgICAgY29uc3QgQnVmZmVySXRlbUNvbnN1bWVyOjpCdWZmZXJJdGVtIGl0ZW0gPQotICAgICAgICAgICAgICAgIG1SZWNvcmRpbmdCdWZmZXJzW2l0ZW1JbmRleF07CisgICAgICAgIGNvbnN0IEJ1ZmZlckl0ZW0gaXRlbSA9IG1SZWNvcmRpbmdCdWZmZXJzW2l0ZW1JbmRleF07CiAgICAgICAgIGlmIChpdGVtLm1CdWYgIT0gQnVmZmVySXRlbUNvbnN1bWVyOjpJTlZBTElEX0JVRkZFUl9TTE9UKSB7CiAgICAgICAgICAgICByZXMgPSBtUmVjb3JkaW5nQ29uc3VtZXItPnJlbGVhc2VCdWZmZXIobVJlY29yZGluZ0J1ZmZlcnNbaXRlbUluZGV4XSk7CiAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmgKaW5kZXggMWQ2NzlhNC4uMjQ3NDA2MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1N0cmVhbWluZ1Byb2Nlc3Nvci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuaApAQCAtMTI0LDcgKzEyNCw3IEBACiAKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtEZWZhdWx0UmVjb3JkaW5nSGVhcENvdW50ID0gODsKICAgICBzaXplX3QgbVJlY29yZGluZ0hlYXBDb3VudDsKLSAgICBWZWN0b3I8QnVmZmVySXRlbUNvbnN1bWVyOjpCdWZmZXJJdGVtPiBtUmVjb3JkaW5nQnVmZmVyczsKKyAgICBWZWN0b3I8QnVmZmVySXRlbT4gbVJlY29yZGluZ0J1ZmZlcnM7CiAgICAgc2l6ZV90IG1SZWNvcmRpbmdIZWFwSGVhZCwgbVJlY29yZGluZ0hlYXBGcmVlOwogCiAgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5jcHAKaW5kZXggOGI3ZTRiNC4uMTg2Y2U2YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5jcHAKQEAgLTQ0MCw3ICs0NDAsNyBAQAogICAgICAgICB6c2xDb25zdW1lciA9IG1ac2xDb25zdW1lcjsKICAgICB9CiAgICAgQUxPR1ZWKCJUcnlpbmcgdG8gZ2V0IG5leHQgYnVmZmVyIik7Ci0gICAgQnVmZmVySXRlbUNvbnN1bWVyOjpCdWZmZXJJdGVtIGl0ZW07CisgICAgQnVmZmVySXRlbSBpdGVtOwogICAgIHJlcyA9IHpzbENvbnN1bWVyLT5hY3F1aXJlQnVmZmVyKCZpdGVtLCAwKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIGlmIChyZXMgIT0gQnVmZmVySXRlbUNvbnN1bWVyOjpOT19CVUZGRVJfQVZBSUxBQkxFKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmgKaW5kZXggMjA5OWMzOC4uNWY1MGQ3YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuaApAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvQ29uZGl0aW9uLmg+CisjaW5jbHVkZSA8Z3VpL0J1ZmZlckl0ZW0uaD4KICNpbmNsdWRlIDxndWkvQnVmZmVySXRlbUNvbnN1bWVyLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhcHR1cmVSZXN1bHQuaD4KQEAgLTEwMyw3ICsxMDQsNyBAQAogICAgIHNwPEFOYXRpdmVXaW5kb3c+ICAgICAgbVpzbFdpbmRvdzsKIAogICAgIHN0cnVjdCBac2xQYWlyIHsKLSAgICAgICAgQnVmZmVySXRlbUNvbnN1bWVyOjpCdWZmZXJJdGVtIGJ1ZmZlcjsKKyAgICAgICAgQnVmZmVySXRlbSBidWZmZXI7CiAgICAgICAgIENhbWVyYU1ldGFkYXRhIGZyYW1lOwogICAgIH07CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IzLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yMy5oCmluZGV4IGZjOWY3MGMuLjI5NjA0NzggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IzLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvcjMuaApAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvQ29uZGl0aW9uLmg+CisjaW5jbHVkZSA8Z3VpL0J1ZmZlckl0ZW0uaD4KICNpbmNsdWRlIDxndWkvQnVmZmVySXRlbUNvbnN1bWVyLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+CiAKQEAgLTEwNCw3ICsxMDUsNyBAQAogICAgIHNwPGNhbWVyYTM6OkNhbWVyYTNac2xTdHJlYW0+IG1ac2xTdHJlYW07CiAKICAgICBzdHJ1Y3QgWnNsUGFpciB7Ci0gICAgICAgIEJ1ZmZlckl0ZW1Db25zdW1lcjo6QnVmZmVySXRlbSBidWZmZXI7CisgICAgICAgIEJ1ZmZlckl0ZW0gYnVmZmVyOwogICAgICAgICBDYW1lcmFNZXRhZGF0YSBmcmFtZTsKICAgICB9OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAKaW5kZXggYmIyNDMyZS4uOGYyZDNjYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcApAQCAtNDIsOCArNDIsMTQgQEAKICAgICAgICAgaW50IGNsaWVudFBpZCwKICAgICAgICAgdWlkX3QgY2xpZW50VWlkLAogICAgICAgICBpbnQgc2VydmljZVBpZCkgOgotICAgIEJhc2ljQ2xpZW50KGNhbWVyYVNlcnZpY2UsIHJlbW90ZUNhbGxiYWNrLT5hc0JpbmRlcigpLCBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICBjYW1lcmFJZCwgY2FtZXJhRmFjaW5nLCBjbGllbnRQaWQsIGNsaWVudFVpZCwgc2VydmljZVBpZCksCisgICAgQmFzaWNDbGllbnQoY2FtZXJhU2VydmljZSwKKyAgICAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKHJlbW90ZUNhbGxiYWNrKSwKKyAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgY2FtZXJhSWQsCisgICAgICAgICAgICBjYW1lcmFGYWNpbmcsCisgICAgICAgICAgICBjbGllbnRQaWQsCisgICAgICAgICAgICBjbGllbnRVaWQsCisgICAgICAgICAgICBzZXJ2aWNlUGlkKSwKICAgICBtUmVtb3RlQ2FsbGJhY2socmVtb3RlQ2FsbGJhY2spIHsKIH0KIApAQCAtMTU3LDcgKzE2Myw3IEBACiAgICAgICAgICAgICBpZiAoc3VyZmFjZSA9PSAwKSBjb250aW51ZTsKIAogICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZ2JwID0gc3VyZmFjZS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpOwotICAgICAgICAgICAgaW50IGlkeCA9IG1TdHJlYW1NYXAuaW5kZXhPZktleShnYnAtPmFzQmluZGVyKCkpOworICAgICAgICAgICAgaW50IGlkeCA9IG1TdHJlYW1NYXAuaW5kZXhPZktleShJSW50ZXJmYWNlOjphc0JpbmRlcihnYnApKTsKIAogICAgICAgICAgICAgLy8gVHJ5aW5nIHRvIHN1Ym1pdCByZXF1ZXN0IHdpdGggc3VyZmFjZSB0aGF0IHdhc24ndCBjcmVhdGVkCiAgICAgICAgICAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CkBAIC0zMjcsNyArMzMzLDcgQEAKIAogICAgIC8vIERvbid0IGNyZWF0ZSBtdWx0aXBsZSBzdHJlYW1zIGZvciB0aGUgc2FtZSB0YXJnZXQgc3VyZmFjZQogICAgIHsKLSAgICAgICAgc3NpemVfdCBpbmRleCA9IG1TdHJlYW1NYXAuaW5kZXhPZktleShidWZmZXJQcm9kdWNlci0+YXNCaW5kZXIoKSk7CisgICAgICAgIHNzaXplX3QgaW5kZXggPSBtU3RyZWFtTWFwLmluZGV4T2ZLZXkoSUludGVyZmFjZTo6YXNCaW5kZXIoYnVmZmVyUHJvZHVjZXIpKTsKICAgICAgICAgaWYgKGluZGV4ICE9IE5BTUVfTk9UX0ZPVU5EKSB7CiAgICAgICAgICAgICBBTE9HVygiJXM6IENhbWVyYSAlZDogQnVmZmVyIHByb2R1Y2VyIGFscmVhZHkgaGFzIGEgc3RyZWFtIGZvciBpdCAiCiAgICAgICAgICAgICAgICAgICAiKElEICV6ZCkiLApAQCAtMzYxLDEyICszNjcsOCBAQAogICAgIGJvb2wgZmxleGlibGVDb25zdW1lciA9IChjb25zdW1lclVzYWdlICYgZGlzYWxsb3dlZEZsYWdzKSA9PSAwICYmCiAgICAgICAgICAgICAoY29uc3VtZXJVc2FnZSAmIGFsbG93ZWRGbGFncykgIT0gMDsKIAotICAgIHNwPElCaW5kZXI+IGJpbmRlcjsKLSAgICBzcDxBTmF0aXZlV2luZG93PiBhbnc7Ci0gICAgaWYgKGJ1ZmZlclByb2R1Y2VyICE9IDApIHsKLSAgICAgICAgYmluZGVyID0gYnVmZmVyUHJvZHVjZXItPmFzQmluZGVyKCk7Ci0gICAgICAgIGFudyA9IG5ldyBTdXJmYWNlKGJ1ZmZlclByb2R1Y2VyLCB1c2VBc3luYyk7Ci0gICAgfQorICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IElJbnRlcmZhY2U6OmFzQmluZGVyKGJ1ZmZlclByb2R1Y2VyKTsKKyAgICBzcDxBTmF0aXZlV2luZG93PiBhbncgPSBuZXcgU3VyZmFjZShidWZmZXJQcm9kdWNlciwgdXNlQXN5bmMpOwogCiAgICAgLy8gVE9ETzogcmVtb3ZlIHcsaCxmIHNpbmNlIHdlIGFyZSBpZ25vcmluZyB0aGVtCiAKQEAgLTQwNyw3ICs0MDksNyBAQAogICAgIHJlcyA9IG1EZXZpY2UtPmNyZWF0ZVN0cmVhbShhbncsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgJnN0cmVhbUlkKTsKIAogICAgIGlmIChyZXMgPT0gT0spIHsKLSAgICAgICAgbVN0cmVhbU1hcC5hZGQoYnVmZmVyUHJvZHVjZXItPmFzQmluZGVyKCksIHN0cmVhbUlkKTsKKyAgICAgICAgbVN0cmVhbU1hcC5hZGQoYmluZGVyLCBzdHJlYW1JZCk7CiAKICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IFN1Y2Nlc3NmdWxseSBjcmVhdGVkIGEgbmV3IHN0cmVhbSBJRCAlZCIsCiAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlYW1JZCk7CkBAIC01ODYsNyArNTg4LDggQEAKICAgICBTdHJpbmc4IHJlc3VsdDsKICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJDYW1lcmFEZXZpY2VDbGllbnRbJWRdICglcCkgZHVtcDpcbiIsCiAgICAgICAgICAgICBtQ2FtZXJhSWQsCi0gICAgICAgICAgICBnZXRSZW1vdGVDYWxsYmFjaygpLT5hc0JpbmRlcigpLmdldCgpKTsKKyAgICAgICAgICAgIChnZXRSZW1vdGVDYWxsYmFjaygpICE9IE5VTEwgPworICAgICAgICAgICAgICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihnZXRSZW1vdGVDYWxsYmFjaygpKS5nZXQoKSA6IE5VTEwpICk7CiAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBDdXJyZW50IGNsaWVudDogJXMgKFBJRCAlZCwgVUlEICV1KVxuIiwKICAgICAgICAgICAgIFN0cmluZzgobUNsaWVudFBhY2thZ2VOYW1lKS5zdHJpbmcoKSwKICAgICAgICAgICAgIG1DbGllbnRQaWQsIG1DbGllbnRVaWQpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpX3Byby9Qcm9DYW1lcmEyQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaV9wcm8vUHJvQ2FtZXJhMkNsaWVudC5jcHAKaW5kZXggNmFiMjVlMi4uNmI0NWM3ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpX3Byby9Qcm9DYW1lcmEyQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGlfcHJvL1Byb0NhbWVyYTJDbGllbnQuY3BwCkBAIC0yNzYsNyArMjc2LDcgQEAKICAgICBzcDxJQmluZGVyPiBiaW5kZXI7CiAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gd2luZG93OwogICAgIGlmIChidWZmZXJQcm9kdWNlciAhPSAwKSB7Ci0gICAgICAgIGJpbmRlciA9IGJ1ZmZlclByb2R1Y2VyLT5hc0JpbmRlcigpOworICAgICAgICBiaW5kZXIgPSBJSW50ZXJmYWNlOjphc0JpbmRlcihidWZmZXJQcm9kdWNlcik7CiAgICAgICAgIHdpbmRvdyA9IG5ldyBTdXJmYWNlKGJ1ZmZlclByb2R1Y2VyKTsKICAgICB9CiAKQEAgLTMzOCw3ICszMzgsOCBAQAogICAgIFN0cmluZzggcmVzdWx0OwogICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlByb0NhbWVyYTJDbGllbnRbJWRdICglcCkgUElEOiAlZCwgZHVtcDpcbiIsCiAgICAgICAgICAgICBtQ2FtZXJhSWQsCi0gICAgICAgICAgICBnZXRSZW1vdGVDYWxsYmFjaygpLT5hc0JpbmRlcigpLmdldCgpLAorICAgICAgICAgICAgKGdldFJlbW90ZUNhbGxiYWNrKCkgIT0gTlVMTCA/CisgICAgICAgICAgICAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKGdldFJlbW90ZUNhbGxiYWNrKCkpLmdldCgpIDogTlVMTCksCiAgICAgICAgICAgICBtQ2xpZW50UGlkKTsKICAgICByZXN1bHQuYXBwZW5kKCIgIFN0YXRlOlxuIik7CiAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcAppbmRleCAzYmU2Mzk4Li4yNGFjZmJmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAKQEAgLTEyOCw3ICsxMjgsOCBAQAogICAgIFN0cmluZzggcmVzdWx0OwogICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkNhbWVyYTJDbGllbnRCYXNlWyVkXSAoJXApIFBJRDogJWQsIGR1bXA6XG4iLAogICAgICAgICAgICAgVENsaWVudEJhc2U6Om1DYW1lcmFJZCwKLSAgICAgICAgICAgIFRDbGllbnRCYXNlOjpnZXRSZW1vdGVDYWxsYmFjaygpLT5hc0JpbmRlcigpLmdldCgpLAorICAgICAgICAgICAgKFRDbGllbnRCYXNlOjpnZXRSZW1vdGVDYWxsYmFjaygpICE9IE5VTEwgPworICAgICAgICAgICAgICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihUQ2xpZW50QmFzZTo6Z2V0UmVtb3RlQ2FsbGJhY2soKSkuZ2V0KCkgOiBOVUxMKSwKICAgICAgICAgICAgIFRDbGllbnRCYXNlOjptQ2xpZW50UGlkKTsKICAgICByZXN1bHQuYXBwZW5kKCIgIFN0YXRlOiAiKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaAppbmRleCBjZWJiOWE3Li43N2FlNGZjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaApAQCAtMTExLDcgKzExMSw3IEBACiAgICAgcGlkX3QgbUluaXRpYWxDbGllbnRQaWQ7CiAKICAgICB2aXJ0dWFsIHNwPElCaW5kZXI+IGFzQmluZGVyV3JhcHBlcigpIHsKLSAgICAgICAgcmV0dXJuIElJbnRlcmZhY2U6OmFzQmluZGVyKCk7CisgICAgICAgIHJldHVybiBJSW50ZXJmYWNlOjphc0JpbmRlcih0aGlzKTsKICAgICB9CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgZHVtcERldmljZShpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oCmluZGV4IDYzODY4MzguLjE5MzVjMmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UxL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmgKQEAgLTU4OCw3ICs1ODgsNyBAQAogCiAjaWZuZGVmIGNvbnRhaW5lcl9vZgogI2RlZmluZSBjb250YWluZXJfb2YocHRyLCB0eXBlLCBtZW1iZXIpICh7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgY29uc3QgdHlwZW9mKCgodHlwZSAqKSAwKS0+bWVtYmVyKSAqX19tcHRyID0gKHB0cik7ICAgICBcCisgICAgICAgIGNvbnN0IF9fdHlwZW9mX18oKCh0eXBlICopIDApLT5tZW1iZXIpICpfX21wdHIgPSAocHRyKTsgICAgIFwKICAgICAgICAgKHR5cGUgKikgKChjaGFyICopIF9fbXB0ciAtIChjaGFyICopKCYoKHR5cGUgKikwKS0+bWVtYmVyKSk7IH0pCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwCmluZGV4IDMxOWJlMWQuLjljMWUyOGIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCisjaW5jbHVkZSA8Z3VpL0J1ZmZlckl0ZW0uaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogI2luY2x1ZGUgIkNhbWVyYTNJbnB1dFN0cmVhbS5oIgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmgKaW5kZXggYWU0OTQ2Ny4uZmQxN2Y0ZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oCkBAIC00OCw4ICs0OCw2IEBACiAKICAgcHJpdmF0ZToKIAotICAgIHR5cGVkZWYgQnVmZmVySXRlbUNvbnN1bWVyOjpCdWZmZXJJdGVtIEJ1ZmZlckl0ZW07Ci0KICAgICBzcDxCdWZmZXJJdGVtQ29uc3VtZXI+IG1Db25zdW1lcjsKICAgICBWZWN0b3I8QnVmZmVySXRlbT4gbUJ1ZmZlcnNJbkZsaWdodDsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZ3VpL1JpbmdCdWZmZXJDb25zdW1lci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9ndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmNwcAppbmRleCBkMGYyOWRlLi44Y2Q2ODAwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9ndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9ndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmNwcApAQCAtMjY4LDcgKzI2OCw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIFJpbmdCdWZmZXJDb25zdW1lcjo6b25GcmFtZUF2YWlsYWJsZShjb25zdCBhbmRyb2lkOjpCdWZmZXJJdGVtJiBpdGVtKSB7Cit2b2lkIFJpbmdCdWZmZXJDb25zdW1lcjo6b25GcmFtZUF2YWlsYWJsZShjb25zdCBCdWZmZXJJdGVtJiBpdGVtKSB7CiAgICAgc3RhdHVzX3QgZXJyOwogCiAgICAgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZ3VpL1JpbmdCdWZmZXJDb25zdW1lci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZ3VpL1JpbmdCdWZmZXJDb25zdW1lci5oCmluZGV4IDkwZmQ3MzQuLjgzZTcyOTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2d1aS9SaW5nQnVmZmVyQ29uc3VtZXIuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9ndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmgKQEAgLTE3LDYgKzE3LDcgQEAKICNpZm5kZWYgQU5EUk9JRF9HVUlfUklOR0JVRkZFUkNPTlNVTUVSX0gKICNkZWZpbmUgQU5EUk9JRF9HVUlfUklOR0JVRkZFUkNPTlNVTUVSX0gKIAorI2luY2x1ZGUgPGd1aS9CdWZmZXJJdGVtLmg+CiAjaW5jbHVkZSA8Z3VpL0NvbnN1bWVyQmFzZS5oPgogCiAjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgpAQCAtNTQsOCArNTUsNiBAQAogICBwdWJsaWM6CiAgICAgdHlwZWRlZiBDb25zdW1lckJhc2U6OkZyYW1lQXZhaWxhYmxlTGlzdGVuZXIgRnJhbWVBdmFpbGFibGVMaXN0ZW5lcjsKIAotICAgIHR5cGVkZWYgQnVmZmVyUXVldWU6OkJ1ZmZlckl0ZW0gQnVmZmVySXRlbTsKLQogICAgIGVudW0geyBJTlZBTElEX0JVRkZFUl9TTE9UID0gQnVmZmVyUXVldWU6OklOVkFMSURfQlVGRkVSX1NMT1QgfTsKICAgICBlbnVtIHsgTk9fQlVGRkVSX0FWQUlMQUJMRSA9IEJ1ZmZlclF1ZXVlOjpOT19CVUZGRVJfQVZBSUxBQkxFIH07CiAKQEAgLTE2NSw3ICsxNjQsNyBAQAogICBwcml2YXRlOgogCiAgICAgLy8gT3ZlcnJpZGUgQ29uc3VtZXJCYXNlOjpvbkZyYW1lQXZhaWxhYmxlCi0gICAgdmlydHVhbCB2b2lkIG9uRnJhbWVBdmFpbGFibGUoY29uc3QgYW5kcm9pZDo6QnVmZmVySXRlbSYgaXRlbSk7CisgICAgdmlydHVhbCB2b2lkIG9uRnJhbWVBdmFpbGFibGUoY29uc3QgQnVmZmVySXRlbSYgaXRlbSk7CiAKICAgICB2b2lkIHBpbkJ1ZmZlckxvY2tlZChjb25zdCBCdWZmZXJJdGVtJiBpdGVtKTsKICAgICB2b2lkIHVucGluQnVmZmVyKGNvbnN0IEJ1ZmZlckl0ZW0mIGl0ZW0pOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcAppbmRleCBkM2I2N2Y2Li4wODFhZmY3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcApAQCAtMTQzLDcgKzE0Myw3IEBACiAgICAgc3A8TW9kdWxlPiBtb2R1bGUgPSBtTW9kdWxlcy52YWx1ZUF0KGluZGV4KTsKIAogICAgIG1vZHVsZS0+c2V0Q2xpZW50KGNsaWVudCk7Ci0gICAgY2xpZW50LT5hc0JpbmRlcigpLT5saW5rVG9EZWF0aChtb2R1bGUpOworICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKGNsaWVudCktPmxpbmtUb0RlYXRoKG1vZHVsZSk7CiAgICAgbW9kdWxlSW50ZXJmYWNlID0gbW9kdWxlOwogCiAgICAgbW9kdWxlLT5zZXRDYXB0dXJlU3RhdGVfbChtQ2FwdHVyZVN0YXRlKTsKQEAgLTUxMCw3ICs1MTAsNyBAQAogICAgICAgICBtTW9kZWxzLmNsZWFyKCk7CiAgICAgfQogICAgIGlmIChtQ2xpZW50ICE9IDApIHsKLSAgICAgICAgbUNsaWVudC0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUNsaWVudCktPnVubGlua1RvRGVhdGgodGhpcyk7CiAgICAgfQogICAgIHNwPFNvdW5kVHJpZ2dlckh3U2VydmljZT4gc2VydmljZSA9IG1TZXJ2aWNlLnByb21vdGUoKTsKICAgICBpZiAoc2VydmljZSA9PSAwKSB7CmRpZmYgLS1naXQgYS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5jcHAgYi9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5jcHAKaW5kZXggNDIyODBkMS4uZWVjYzFlYSAxMDA2NDQKLS0tIGEvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuY3BwCisrKyBiL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmNwcApAQCAtNTgsNyArNTgsNyBAQAogICAgICAgICB9CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTb3VuZFRyaWdnZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIobW9kZWxNZW1vcnktPmFzQmluZGVyKCkpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKG1vZGVsTWVtb3J5KSk7CiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChMT0FEX1NPVU5EX01PREVMLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8CiAgICAgICAgICAgICAgICAgKHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKSkgIT0gTk9fRVJST1IpIHsKQEAgLTkxLDcgKzkxLDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihkYXRhTWVtb3J5LT5zaXplKCkpOwogICAgICAgICB9Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoZGF0YU1lbW9yeS0+YXNCaW5kZXIoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoZGF0YU1lbW9yeSkpOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU1RBUlRfUkVDT0dOSVRJT04sIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKZGlmZiAtLWdpdCBhL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyQ2xpZW50LmNwcCBiL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyQ2xpZW50LmNwcAppbmRleCBiMGI0NDI4Li5lMGQzYWRkIDEwMDY0NAotLS0gYS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckNsaWVudC5jcHAKKysrIGIvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJDbGllbnQuY3BwCkBAIC00NCw3ICs0NCw3IEBACiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU291bmRUcmlnZ2VyQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGV2ZW50TWVtb3J5LT5hc0JpbmRlcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihldmVudE1lbW9yeSkpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoT05fUkVDT0dOSVRJT05fRVZFTlQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5KTsKQEAgLTU0LDcgKzU0LDcgQEAKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTb3VuZFRyaWdnZXJDbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoZXZlbnRNZW1vcnktPmFzQmluZGVyKCkpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGV2ZW50TWVtb3J5KSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChPTl9TT1VORE1PREVMX0VWRU5ULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBseSk7CkBAIC02Myw3ICs2Myw3IEBACiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU291bmRUcmlnZ2VyQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGV2ZW50TWVtb3J5LT5hc0JpbmRlcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihldmVudE1lbW9yeSkpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoT05fU0VSVklDRV9TVEFURV9DSEFOR0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5KTsKZGlmZiAtLWdpdCBhL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcCBiL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcAppbmRleCAwNTcyOGU5Li43NWY2OGI4IDEwMDY0NAotLS0gYS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAKKysrIGIvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCkBAIC04Miw3ICs4Miw3IEBACiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTb3VuZFRyaWdnZXJId1NlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGUoJmhhbmRsZSwgc2l6ZW9mKHNvdW5kX3RyaWdnZXJfbW9kdWxlX2hhbmRsZV90KSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoY2xpZW50LT5hc0JpbmRlcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihjbGllbnQpKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEFUVEFDSCwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgIGlmIChyZXBseS5yZWFkSW50MzIoKSAhPSAwKSB7CkBAIC0xNDcsNyArMTQ3LDcgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICBpZiAobW9kdWxlICE9IDApIHsKICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigxKTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIobW9kdWxlLT5hc0JpbmRlcigpKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIobW9kdWxlKSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDApOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5jcHAgYi9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmNwcAppbmRleCAwMDE1YzMwLi4yMTM4Y2I3IDEwMDY0NAotLS0gYS9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmNwcAorKysgYi9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmNwcApAQCAtMTA0LDcgKzEwNCw3IEBACiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2VydmljZS0+YXR0YWNoKG1vZHVsZSwgc291bmRUcmlnZ2VyLCBzb3VuZFRyaWdnZXItPm1JU291bmRUcmlnZ2VyKTsKIAogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgc291bmRUcmlnZ2VyLT5tSVNvdW5kVHJpZ2dlciAhPSAwKSB7Ci0gICAgICAgIHNvdW5kVHJpZ2dlci0+bUlTb3VuZFRyaWdnZXItPmFzQmluZGVyKCktPmxpbmtUb0RlYXRoKHNvdW5kVHJpZ2dlcik7CisgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKHNvdW5kVHJpZ2dlci0+bUlTb3VuZFRyaWdnZXIpLT5saW5rVG9EZWF0aChzb3VuZFRyaWdnZXIpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dXKCJFcnJvciAlZCBjb25uZWN0aW5nIHRvIHNvdW5kIHRyaWdnZXIgc2VydmljZSIsIHN0YXR1cyk7CiAgICAgICAgIHNvdW5kVHJpZ2dlci5jbGVhcigpOwpAQCAtMTQ0LDcgKzE0NCw3IEBACiAgICAgbUNhbGxiYWNrLmNsZWFyKCk7CiAgICAgaWYgKG1JU291bmRUcmlnZ2VyICE9IDApIHsKICAgICAgICAgbUlTb3VuZFRyaWdnZXItPmRldGFjaCgpOwotICAgICAgICBtSVNvdW5kVHJpZ2dlci0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUlTb3VuZFRyaWdnZXIpLT51bmxpbmtUb0RlYXRoKHRoaXMpOwogICAgICAgICBtSVNvdW5kVHJpZ2dlciA9IDA7CiAgICAgfQogfQo=