ZGlmZiAtLWdpdCBhL2NvcmUvTWFrZWZpbGUgYi9jb3JlL01ha2VmaWxlCmluZGV4IGI1YTdlNzQuLjdkN2I5ZTcgMTAwNjQ0Ci0tLSBhL2NvcmUvTWFrZWZpbGUKKysrIGIvY29yZS9NYWtlZmlsZQpAQCAtMTA1Miw2ICsxMDUyLDM1IEBACiBlbmRpZgogZW5kaWYKIAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGR0Ym8gaW1hZ2UKK2lmZGVmIEJPQVJEX1BSRUJVSUxUX0RUQk9JTUFHRQorSU5TVEFMTEVEX0RUQk9JTUFHRV9UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkvZHRiby5pbWcKKworaWZlcSAoJChCT0FSRF9BVkJfRU5BQkxFKSx0cnVlKQorJChJTlNUQUxMRURfRFRCT0lNQUdFX1RBUkdFVCk6ICQoQk9BUkRfUFJFQlVJTFRfRFRCT0lNQUdFKSAkKEFWQlRPT0wpICQoQk9BUkRfQVZCX0RUQk9fS0VZX1BBVEgpCisJY3AgJChCT0FSRF9QUkVCVUlMVF9EVEJPSU1BR0UpICRACisJY2htb2QgK3cgJEAKKwkkKEFWQlRPT0wpIGFkZF9oYXNoX2Zvb3RlciBcCisJICAgIC0taW1hZ2UgJEAgXAorCSAgICAkKGNhbGwgZ2V0LXBhcnRpdGlvbi1zaXplLWFyZ3VtZW50LCQoQk9BUkRfRFRCT0lNR19QQVJUSVRJT05fU0laRSkpIFwKKwkgICAgLS1wYXJ0aXRpb25fbmFtZSBkdGJvICQoSU5URVJOQUxfQVZCX0RUQk9fU0lHTklOR19BUkdTKSBcCisJICAgICQoQk9BUkRfQVZCX0RUQk9fQUREX0hBU0hfRk9PVEVSX0FSR1MpCisKKyQoY2FsbCBkZWNsYXJlLTFwLWNvbnRhaW5lciwkKElOU1RBTExFRF9EVEJPSU1BR0VfVEFSR0VUKSwpCiskKGNhbGwgZGVjbGFyZS1jb250YWluZXItbGljZW5zZS1kZXBzLCQoSU5TVEFMTEVEX0RUQk9JTUFHRV9UQVJHRVQpLCQoQk9BUkRfUFJFQlVJTFRfRFRCT0lNQUdFKSwkKFBST0RVQ1RfT1VUKS86LykKKworVU5NT1VOVEVEX05PVElDRV9WRU5ET1JfREVQUys9ICQoSU5TVEFMTEVEX0RUQk9JTUFHRV9UQVJHRVQpCitlbHNlCiskKElOU1RBTExFRF9EVEJPSU1BR0VfVEFSR0VUKTogJChCT0FSRF9QUkVCVUlMVF9EVEJPSU1BR0UpCisJY3AgJChCT0FSRF9QUkVCVUlMVF9EVEJPSU1BR0UpICRACitlbmRpZgorCitlbmRpZiAjIEJPQVJEX1BSRUJVSUxUX0RUQk9JTUFHRQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgdGhlIHJhbWRpc2sKIElOU1RBTExFRF9GSUxFU19PVVRTSURFX0lNQUdFUyA6PSAkKGZpbHRlci1vdXQgJChUQVJHRVRfUkFNRElTS19PVVQpLyUsICQoSU5TVEFMTEVEX0ZJTEVTX09VVFNJREVfSU1BR0VTKSkKQEAgLTEwNzUsNiArMTEwNCwxNiBAQAogCiBCVUlMVF9SQU1ESVNLX1RBUkdFVCA6PSAkKFBST0RVQ1RfT1VUKS9yYW1kaXNrLmltZwogCitpZmVxICgkKEJPQVJEX1JBTURJU0tfVVNFX0xaNCksdHJ1ZSkKKyMgLWwgZW5hYmxlcyB0aGUgbGVnYWN5IGZvcm1hdCB1c2VkIGJ5IHRoZSBMaW51eCBrZXJuZWwKK0NPTVBSRVNTSU9OX0NPTU1BTkRfREVQUyA6PSAkKExaNCkKK0NPTVBSRVNTSU9OX0NPTU1BTkQgOj0gJChMWjQpIC1sIC0xMiAtLWZhdm9yLWRlY1NwZWVkCitSQU1ESVNLX0VYVCA6PSAubHo0CitlbHNlCitDT01QUkVTU0lPTl9DT01NQU5EX0RFUFMgOj0gJChHWklQKQorQ09NUFJFU1NJT05fQ09NTUFORCA6PSAkKEdaSVApCitSQU1ESVNLX0VYVCA6PSAuZ3oKK2VuZGlmCiAKIGlmbmVxICgkKEJPQVJEX0tFUk5FTF9NT0RVTEVTXzE2SyksKQogCkBAIC0xMTU0LDM0ICsxMTkzLDYgQEAKIGVuZGlmCiAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgZHRibyBpbWFnZQotaWZkZWYgQk9BUkRfUFJFQlVJTFRfRFRCT0lNQUdFCi1JTlNUQUxMRURfRFRCT0lNQUdFX1RBUkdFVCA6PSAkKFBST0RVQ1RfT1VUKS9kdGJvLmltZwotCi1pZmVxICgkKEJPQVJEX0FWQl9FTkFCTEUpLHRydWUpCi0kKElOU1RBTExFRF9EVEJPSU1BR0VfVEFSR0VUKTogJChCT0FSRF9QUkVCVUlMVF9EVEJPSU1BR0UpICQoQVZCVE9PTCkgJChCT0FSRF9BVkJfRFRCT19LRVlfUEFUSCkKLQljcCAkKEJPQVJEX1BSRUJVSUxUX0RUQk9JTUFHRSkgJEAKLQljaG1vZCArdyAkQAotCSQoQVZCVE9PTCkgYWRkX2hhc2hfZm9vdGVyIFwKLQkgICAgLS1pbWFnZSAkQCBcCi0JICAgICQoY2FsbCBnZXQtcGFydGl0aW9uLXNpemUtYXJndW1lbnQsJChCT0FSRF9EVEJPSU1HX1BBUlRJVElPTl9TSVpFKSkgXAotCSAgICAtLXBhcnRpdGlvbl9uYW1lIGR0Ym8gJChJTlRFUk5BTF9BVkJfRFRCT19TSUdOSU5HX0FSR1MpIFwKLQkgICAgJChCT0FSRF9BVkJfRFRCT19BRERfSEFTSF9GT09URVJfQVJHUykKLQotJChjYWxsIGRlY2xhcmUtMXAtY29udGFpbmVyLCQoSU5TVEFMTEVEX0RUQk9JTUFHRV9UQVJHRVQpLCkKLSQoY2FsbCBkZWNsYXJlLWNvbnRhaW5lci1saWNlbnNlLWRlcHMsJChJTlNUQUxMRURfRFRCT0lNQUdFX1RBUkdFVCksJChCT0FSRF9QUkVCVUlMVF9EVEJPSU1BR0UpLCQoUFJPRFVDVF9PVVQpLzovKQotCi1VTk1PVU5URURfTk9USUNFX1ZFTkRPUl9ERVBTKz0gJChJTlNUQUxMRURfRFRCT0lNQUdFX1RBUkdFVCkKLWVsc2UKLSQoSU5TVEFMTEVEX0RUQk9JTUFHRV9UQVJHRVQpOiAkKEJPQVJEX1BSRUJVSUxUX0RUQk9JTUFHRSkKLQljcCAkKEJPQVJEX1BSRUJVSUxUX0RUQk9JTUFHRSkgJEAKLWVuZGlmCi0KLWVuZGlmICMgQk9BUkRfUFJFQlVJTFRfRFRCT0lNQUdFCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyAxNktCIGR0Ym8gaW1hZ2UKIGlmZGVmIEJPQVJEX1BSRUJVSUxUX0RUQk9JTUFHRV8xNktCCiBJTlNUQUxMRURfRFRCT0lNQUdFXzE2S0JfVEFSR0VUIDo9ICQoUFJPRFVDVF9PVVQpL2R0Ym9fMTZrLmltZwpAQCAtMTI1NywxNyArMTI2OCw2IEBACiBlbmRpZgogCiAKLWlmZXEgKCQoQk9BUkRfUkFNRElTS19VU0VfTFo0KSx0cnVlKQotIyAtbCBlbmFibGVzIHRoZSBsZWdhY3kgZm9ybWF0IHVzZWQgYnkgdGhlIExpbnV4IGtlcm5lbAotQ09NUFJFU1NJT05fQ09NTUFORF9ERVBTIDo9ICQoTFo0KQotQ09NUFJFU1NJT05fQ09NTUFORCA6PSAkKExaNCkgLWwgLTEyIC0tZmF2b3ItZGVjU3BlZWQKLVJBTURJU0tfRVhUIDo9IC5sejQKLWVsc2UKLUNPTVBSRVNTSU9OX0NPTU1BTkRfREVQUyA6PSAkKEdaSVApCi1DT01QUkVTU0lPTl9DT01NQU5EIDo9ICQoR1pJUCkKLVJBTURJU0tfRVhUIDo9IC5negotZW5kaWYKLQogIyBUaGlzIGZpbGUgY29udGFpbnMgL2RldiBub2RlcyBkZXNjcmlwdGlvbiBhZGRlZCB0byB0aGUgZ2VuZXJpYyByYW1kaXNrCiBSQU1ESVNLX05PREVfTElTVCA6PSAkKFBST0RVQ1RfT1VUKS9yYW1kaXNrX25vZGVfbGlzdAogCkBAIC0zNTU3LDYgKzM1NTcsMjQgQEAKIGVuZGVmCiAKICQoZXZhbCAkKGNhbGwgd3JpdGUtcGFydGl0aW9uLWZpbGUtbGlzdCwkKHN5c3RlbWltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQsJChUQVJHRVRfT1VUKSwkKEZVTExfU1lTVEVNSU1BR0VfREVQUykpKQorCitpZm5lcSAoJChQUk9EVUNUX1NPT05HX0RFRklORURfU1lTVEVNX0lNQUdFKSwpCitmaWxlX2xpc3RfZGlmZiA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9maWxlX2xpc3RfZGlmZiQoSE9TVF9FWEVDVVRBQkxFX1NVRkZJWCkKK3N5c3RlbV9maWxlX2RpZmZfdGltZXN0YW1wIDo9ICQoc3lzdGVtaW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9kaWZmLnRpbWVzdGFtcAorCiskKHN5c3RlbV9maWxlX2RpZmZfdGltZXN0YW1wKTogXAorCSAgICAkKHN5c3RlbWltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQgXAorCSAgICAkKEFMTF9NT0RVTEVTLiQoUFJPRFVDVF9TT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRSkuRklMRVNZU1RFTV9GSUxFTElTVCkgXAorCSAgICAkKEFMTF9NT0RVTEVTLnN5c3RlbV9pbWFnZV9kaWZmX2FsbG93bGlzdC5JTlNUQUxMRUQpIFwKKwkgICAgJChmaWxlX2xpc3RfZGlmZikKKwkkKGZpbGVfbGlzdF9kaWZmKSAkKHN5c3RlbWltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQgXAorCSAgJChBTExfTU9EVUxFUy4kKFBST0RVQ1RfU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0UpLkZJTEVTWVNURU1fRklMRUxJU1QpIFwKKwkgICQoQUxMX01PRFVMRVMuc3lzdGVtX2ltYWdlX2RpZmZfYWxsb3dsaXN0LklOU1RBTExFRCkgJChQUk9EVUNUX1NPT05HX0RFRklORURfU1lTVEVNX0lNQUdFKQorCXRvdWNoICRACisKKyQoQlVJTFRfU1lTVEVNSU1BR0UpOiAkKHN5c3RlbV9maWxlX2RpZmZfdGltZXN0YW1wKQorZW5kaWYKKwogIyBVc2VkIGJ5IHNvb25nIHNhbmR3aWNoIHRvIHJlcXVlc3QgdGhlIHN0YWdpbmcgZGlyIGJlIGJ1aWx0CiAkKHN5c3RlbWltYWdlX2ludGVybWVkaWF0ZXMpL3N0YWdpbmdfZGlyLnN0YW1wOiAkKGZpbHRlciAkKFRBUkdFVF9PVVQpLyUsJChGVUxMX1NZU1RFTUlNQUdFX0RFUFMpKQogCXRvdWNoICRACkBAIC0zNTY0LDggKzM1ODIsMTkgQEAKIGlmZXEgKCQoQk9BUkRfQVZCX0VOQUJMRSksdHJ1ZSkKICQoQlVJTFRfU1lTVEVNSU1BR0UpOiAkKEJPQVJEX0FWQl9TWVNURU1fS0VZX1BBVEgpCiBlbmRpZgorCitpZmVxICgkKFVTRV9TT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRSksdHJ1ZSkKK2lmZXEgKCQoUFJPRFVDVF9TT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRSksKQorJChlcnJvciBQUk9EVUNUX1NPT05HX0RFRklORURfU1lTVEVNX0lNQUdFIG11c3QgYmUgc2V0IGlmIFVTRV9TT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRSBpcyB0cnVlKQorZW5kaWYKK3Nvb25nX2RlZmluZWRfc3lzdGVtX2ltYWdlIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsRVRDLCQoUFJPRFVDVF9TT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRSkpLyQoUFJPRFVDVF9TT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRSkKKyQoQlVJTFRfU1lTVEVNSU1BR0UpOiAkKElOU1RBTExFRF9GSUxFU19GSUxFKSAkKHN5c3RlbWltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQgJChzb29uZ19kZWZpbmVkX3N5c3RlbV9pbWFnZSkKKyQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwgJChzb29uZ19kZWZpbmVkX3N5c3RlbV9pbWFnZSksICQoQlVJTFRfU1lTVEVNSU1BR0UpKSkKK3Nvb25nX2RlZmluZWRfc3lzdGVtX2ltYWdlIDo9CitlbHNlCiAkKEJVSUxUX1NZU1RFTUlNQUdFKTogJChGVUxMX1NZU1RFTUlNQUdFX0RFUFMpICQoSU5TVEFMTEVEX0ZJTEVTX0ZJTEUpICQoc3lzdGVtaW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dAogCSQoY2FsbCBidWlsZC1zeXN0ZW1pbWFnZS10YXJnZXQsJEApCitlbmRpZgogCiAkKGNhbGwgZGVjbGFyZS0xcC1jb250YWluZXIsJChCVUlMVF9TWVNURU1JTUFHRSksc3lzdGVtL2V4dHJhcykKICQoY2FsbCBkZWNsYXJlLWNvbnRhaW5lci1saWNlbnNlLWRlcHMsJChCVUlMVF9TWVNURU1JTUFHRSksJChGVUxMX1NZU1RFTUlNQUdFX0RFUFMpLCQoUFJPRFVDVF9PVVQpLzovKQpAQCAtNzgzMyw2ICs3ODYyLDI5IEBACiAjIEV4dHJhY3QgcGxhdGZvcm0gZm9udHMgdXNlZCBpbiBMYXlvdXRsaWIKIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2xheW91dGxpYl9kYXRhLm1rCiAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRGVza3RvcCBwYWNrIGltYWdlIGhvb2suCitpZm5lcSAoLCQoc3RyaXAgJChQQUNLX0RFU0tUT1BfRklMRVNZU1RFTV9JTUFHRVMpKSkKK1BBQ0tfSU1BR0VfVEFSR0VUIDo9ICQoUFJPRFVDVF9PVVQpL2FuZHJvaWQtZGVza3RvcF9pbWFnZS5iaW4KK1BBQ0tfSU1BR0VfU0NSSVBUIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL3BhY2tfaW1hZ2UKK0lNQUdFUyA6PSAkKElOU1RBTExFRF9CT09USU1BR0VfVEFSR0VUKSBcCisJJChJTlNUQUxMRURfU1VQRVJJTUFHRV9UQVJHRVQpIFwKKwkkKElOU1RBTExFRF9JTklUX0JPT1RfSU1BR0VfVEFSR0VUKSBcCisJJChJTlNUQUxMRURfVkVORE9SX0JPT1RJTUFHRV9UQVJHRVQpIFwKKwkkKElOU1RBTExFRF9WQk1FVEFJTUFHRV9UQVJHRVQpIFwKKwkkKElOU1RBTExFRF9VU0VSREFUQUlNQUdFX1RBUkdFVCkKKworJChQQUNLX0lNQUdFX1RBUkdFVCk6ICQoSU1BR0VTKSAkKFBBQ0tfSU1BR0VfU0NSSVBUKQorCSQoUEFDS19JTUFHRV9TQ1JJUFQpIC0tb3V0X2RpciAkKFBST0RVQ1RfT1VUKSAtLW5vYXJjaGl2ZQorCitQQUNLRURfSU1BR0VfQVJDSElWRV9UQVJHRVQgOj0gJChQQUNLX0lNQUdFX1RBUkdFVCkuZ3oKKworJChQQUNLRURfSU1BR0VfQVJDSElWRV9UQVJHRVQpOiAkKFBBQ0tfSU1BR0VfVEFSR0VUKSB8ICQoR1pJUCkKKwkkKEdaSVApIC1mayAkKFBBQ0tfSU1BR0VfVEFSR0VUKQorCitkcm9pZGNvcmUtdW5idW5kbGVkOiAkKFBBQ0tFRF9JTUFHRV9BUkNISVZFX1RBUkdFVCkKKworZW5kaWYgIyBQQUNLX0RFU0tUT1BfRklMRVNZU1RFTV9JTUFHRVMKIAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBPUyBMaWNlbnNpbmcKZGlmZiAtLWdpdCBhL2NvcmUvYmFzZV9ydWxlcy5tayBiL2NvcmUvYmFzZV9ydWxlcy5tawppbmRleCBhOGNmNjdlLi5hOWQ2NDk0IDEwMDY0NAotLS0gYS9jb3JlL2Jhc2VfcnVsZXMubWsKKysrIGIvY29yZS9iYXNlX3J1bGVzLm1rCkBAIC0xMDU5LDYgKzEwNTksMTEgQEAKICAgICAgICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5BQ09ORklHX0ZJTEVTKSAkKExPQ0FMX0FDT05GSUdfRklMRVMpCiBlbmRpZgogCitpZmRlZiBMT0NBTF9GSUxFU1lTVEVNX0ZJTEVMSVNUCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuRklMRVNZU1RFTV9GSUxFTElTVCA6PSBcCisgICAgICAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuRklMRVNZU1RFTV9GSUxFTElTVCkgJChMT0NBTF9GSUxFU1lTVEVNX0ZJTEVMSVNUKQorZW5kaWYKKwogaWZuZGVmIExPQ0FMX1NPT05HX01PRFVMRV9JTkZPX0pTT04KICAgQUxMX01BS0VfTU9EVUxFX0lORk9fSlNPTl9NT0RVTEVTICs9ICQobXlfcmVnaXN0ZXJfbmFtZSkKICAgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5TSEFSRURfTElCUyA6PSBcCmRpZmYgLS1naXQgYS9jb3JlL2NsZWFyX3ZhcnMubWsgYi9jb3JlL2NsZWFyX3ZhcnMubWsKaW5kZXggNjE5MjY5MC4uZmVkMTllNiAxMDA2NDQKLS0tIGEvY29yZS9jbGVhcl92YXJzLm1rCisrKyBiL2NvcmUvY2xlYXJfdmFycy5tawpAQCAtODcsNiArODcsNyBAQAogTE9DQUxfRVhUUkFfRlVMTF9URVNUX0NPTkZJR1M6PQogTE9DQUxfRVhUUkFDVF9BUEs6PQogTE9DQUxfRVhUUkFDVF9EUElfQVBLOj0KK0xPQ0FMX0ZJTEVTWVNURU1fRklMRUxJU1Q6PQogTE9DQUxfRklOREJVR1NfRkxBR1M6PQogTE9DQUxfRk9SQ0VfU1RBVElDX0VYRUNVVEFCTEU6PQogTE9DQUxfRlVMTF9DTEFTU0VTX0pBQ09DT19KQVI6PQpkaWZmIC0tZ2l0IGEvY29yZS9kZWZpbml0aW9ucy5tayBiL2NvcmUvZGVmaW5pdGlvbnMubWsKaW5kZXggNTFkZWYyOS4uYjMwYjE1OSAxMDA2NDQKLS0tIGEvY29yZS9kZWZpbml0aW9ucy5taworKysgYi9jb3JlL2RlZmluaXRpb25zLm1rCkBAIC0yNTg0LDcgKzI1ODQsMjggQEAKICAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCA5ODAwMSw5ODUwMCwkKDEpKSwkKDIpKQogICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDk4NTAxLDk5MDAwLCQoMSkpLCQoMikpCiAgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgOTkwMDEsOTk1MDAsJCgxKSksJCgyKSkKLSAgICAgICAgQCQoaWYgJCh3b3JkbGlzdCA5OTUwMSw5OTUwMiwkKDEpKSwkKGVycm9yIGR1bXAtd29yZHMtdG8tZmlsZTogVG9vIG1hbnkgd29yZHMgKCQod29yZHMgJCgxKSkpKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCA5OTUwMSwxMDAwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMDAwMDEsMTAwNTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTAwNTAxLDEwMTAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEwMTAwMSwxMDE1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMDE1MDEsMTAyMDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTAyMDAxLDEwMjUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEwMjUwMSwxMDMwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMDMwMDEsMTAzNTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTAzNTAxLDEwNDAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEwNDAwMSwxMDQ1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMDQ1MDEsMTA1MDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTA1MDAxLDEwNTUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEwNTUwMSwxMDYwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMDYwMDEsMTA2NTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTA2NTAxLDEwNzAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEwNzAwMSwxMDc1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMDc1MDEsMTA4MDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTA4MDAxLDEwODUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEwODUwMSwxMDkwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMDkwMDEsMTA5NTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTA5NTAxLDExMDAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChpZiAkKHdvcmRsaXN0IDExMDAwMSwxMTAwMDIsJCgxKSksJChlcnJvciBkdW1wLXdvcmRzLXRvLWZpbGU6IFRvbyBtYW55IHdvcmRzICgkKHdvcmRzICQoMSkpKSkpCiBlbmRlZgogIyBSZXR1cm4gamFyIGFyZ3VtZW50cyB0byBjb21wcmVzcyBmaWxlcyBpbiBhIGdpdmVuIGRpcmVjdG9yeQogIyAkKDEpOiBkaXJlY3RvcnkKZGlmZiAtLWdpdCBhL2NvcmUvbWFpbi5tayBiL2NvcmUvbWFpbi5tawppbmRleCBmMzk4MGYxLi44ZDczNzkzIDEwMDY0NAotLS0gYS9jb3JlL21haW4ubWsKKysrIGIvY29yZS9tYWluLm1rCkBAIC02ODgsMTEgKzY4OCwxNiBAQAogICAgICAgICAgICQoZXZhbCBteV90ZXN0Y2FzZXMgOj0gJChIT1NUX09VVF9URVNUQ0FTRVMpKSxcCiAgICAgICAgICAgJChldmFsIG15X3Rlc3RjYXNlcyA6PSAkJChDT01QQVRJQklMSVRZX1RFU1RDQVNFU19PVVRfJChzdWl0ZSkpKSlcCiAgICAgICAgICQoZXZhbCB0YXJnZXQgOj0gJChteV90ZXN0Y2FzZXMpLyQobGFzdHdvcmQgJChzdWJzdCAvLCAsJChkaXIgJChmKSkpKS8kKG5vdGRpciAkKGYpKSlcCisgICAgICAgICQoZXZhbCBsaW5rX3RhcmdldCA6PSAuLi8uLi8uLi8kKGxhc3R3b3JkICQoc3Vic3QgLywgLCQoZGlyICQoZikpKSkvJChub3RkaXIgJChmKSkpXAorICAgICAgICAkKGV2YWwgc3ltbGluayA6PSAkKG15X3Rlc3RjYXNlcykvJChtKS9zaGFyZWRfbGlicy8kKGxhc3R3b3JkICQoc3Vic3QgLywgLCQoZGlyICQoZikpKSkvJChub3RkaXIgJChmKSkpXAorICAgICAgICAkKGV2YWwgQ09NUEFUSUJJTElUWS4kKHN1aXRlKS5TWU1MSU5LUyA6PSBcCisgICAgICAgICAgJCQoQ09NUEFUSUJJTElUWS4kKHN1aXRlKS5TWU1MSU5LUykgJChmKTokKGxpbmtfdGFyZ2V0KTokKHN5bWxpbmspKVwKICAgICAgICAgJChpZiAkKHN0cmlwICQoQUxMX1RBUkdFVFMuJCh0YXJnZXQpLk1FVEFfTElDKSksLCQoY2FsbCBkZWNsYXJlLWNvcHktdGFyZ2V0LWxpY2Vuc2UtbWV0YWRhdGEsJCh0YXJnZXQpLCQoZikpKVwKICAgICAgICAgJChldmFsIENPTVBBVElCSUxJVFkuJChzdWl0ZSkuSE9TVF9TSEFSRURfTElCUkFSWS5GSUxFUyA6PSBcCiAgICAgICAgICAgJCQoQ09NUEFUSUJJTElUWS4kKHN1aXRlKS5IT1NUX1NIQVJFRF9MSUJSQVJZLkZJTEVTKSAkKGYpOiQodGFyZ2V0KSlcCiAgICAgICAgICQoZXZhbCBDT01QQVRJQklMSVRZLiQoc3VpdGUpLkhPU1RfU0hBUkVEX0xJQlJBUlkuRklMRVMgOj0gXAotICAgICAgICAgICQoc29ydCAkKENPTVBBVElCSUxJVFkuJChzdWl0ZSkuSE9TVF9TSEFSRURfTElCUkFSWS5GSUxFUykpKSkpKSkKKyAgICAgICAgICAkKHNvcnQgJChDT01QQVRJQklMSVRZLiQoc3VpdGUpLkhPU1RfU0hBUkVEX0xJQlJBUlkuRklMRVMpKSkpKSlcCisgICQoZXZhbCBDT01QQVRJQklMSVRZLiQoc3VpdGUpLlNZTUxJTktTIDo9ICQoc29ydCAkKENPTVBBVElCSUxJVFkuJChzdWl0ZSkuU1lNTElOS1MpKSkpCiBlbmRlZgogCiAkKGNhbGwgcmVzb2x2ZS1zaGFyZWQtbGlicy1kZXBlcyxUQVJHRVRfKQpkaWZmIC0tZ2l0IGEvY29yZS9wYWNrYWdpbmcvZmxhZ3MubWsgYi9jb3JlL3BhY2thZ2luZy9mbGFncy5tawppbmRleCAyODJlMThlOS4uYTc3OTU2YiAxMDA2NDQKLS0tIGEvY29yZS9wYWNrYWdpbmcvZmxhZ3MubWsKKysrIGIvY29yZS9wYWNrYWdpbmcvZmxhZ3MubWsKQEAgLTE0MCw5ICsxNDAsNyBAQAogCQkJCSQoYWNvbmZpZ19zdG9yYWdlX3BhY2thZ2VfbWFwLiQocGFydGl0aW9uKSksIFwKIAkJCQkkKGFjb25maWdfc3RvcmFnZV9mbGFnX21hcC4kKHBhcnRpdGlvbikpLCBcCiAJCQkJJChhY29uZmlnX3N0b3JhZ2VfZmxhZ192YWwuJChwYXJ0aXRpb24pKSwgXAotCQkJCSQoc29ydCAkKGZvcmVhY2ggbSwkKGNhbGwgcmVnaXN0ZXItbmFtZXMtZm9yLXBhcnRpdGlvbiwgJChwYXJ0aXRpb24pKSwgXAotCQkJCQkkKEFMTF9NT0RVTEVTLiQobSkuQUNPTkZJR19GSUxFUykgXAotCQkJCSkpLCBcCisJCQkJJChhY29uZmlnX2ZsYWdfc3VtbWFyaWVzX3Byb3RvYnVmLiQocGFydGl0aW9uKSksIFwKIAkJCQkkKHBhcnRpdGlvbiksIFwKIAkpKSBcCiApCmRpZmYgLS1naXQgYS9jb3JlL3Byb2R1Y3QubWsgYi9jb3JlL3Byb2R1Y3QubWsKaW5kZXggYTU2N2Q4Zi4uYWQ4MGVlNCAxMDA2NDQKLS0tIGEvY29yZS9wcm9kdWN0Lm1rCisrKyBiL2NvcmUvcHJvZHVjdC5tawpAQCAtMzcsOSArMzcsNiBAQAogIyBCb29sZWFuIHZhcmlhYmxlIGRldGVybWluaW5nIGlmIEFPU1AgcmVsaWVzIG9uIGJpb25pYydzIFBBR0VfU0laRSBtYWNyby4KIF9wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfTk9fQklPTklDX1BBR0VfU0laRV9NQUNSTwogCi0jIEJvb2xlYW4gdmFyaWFibGUgZGV0ZXJtaW5pbmcgaWYgdGhlIGtlcm5lbCBib290cyB3aXRoIDE2a2IgcGFnZSBzaXplIGtlcm5lbC4KLV9wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfQk9PVFNfMTZLCi0KICMgVGhlIHJlc291cmNlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgcHJvZHVjdC4KIF9wcm9kdWN0X2xpc3RfdmFycyArPSBQUk9EVUNUX0xPQ0FMRVMKIF9wcm9kdWN0X2xpc3RfdmFycyArPSBQUk9EVUNUX0FBUFRfQ09ORklHCkBAIC00OTUsNiArNDkyLDkgQEAKICMgYnkgdGhpcyBmbGFnLgogX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9OT1RfREVCVUdHQUJMRV9JTl9VU0VSREVCVUcKIAorIyBJZiBzZXQsIGJ1aWxkIHdvdWxkIGdlbmVyYXRlIHN5c3RlbSBpbWFnZSBmcm9tIFNvb25nLWRlZmluZWQgbW9kdWxlLgorX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9TT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRQorCiAuS0FUSV9SRUFET05MWSA6PSBfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyBfcHJvZHVjdF9saXN0X3ZhcnMKIF9wcm9kdWN0X3Zhcl9saXN0IDo9JD0gJChfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycykgJChfcHJvZHVjdF9saXN0X3ZhcnMpCiAKZGlmZiAtLWdpdCBhL2NvcmUvcnVzdF9kZXZpY2VfdGVzdF9jb25maWdfdGVtcGxhdGUueG1sIGIvY29yZS9ydXN0X2RldmljZV90ZXN0X2NvbmZpZ190ZW1wbGF0ZS54bWwKaW5kZXggYWFjYWJjYi4uYmZkMmY0NyAxMDA2NDQKLS0tIGEvY29yZS9ydXN0X2RldmljZV90ZXN0X2NvbmZpZ190ZW1wbGF0ZS54bWwKKysrIGIvY29yZS9ydXN0X2RldmljZV90ZXN0X2NvbmZpZ190ZW1wbGF0ZS54bWwKQEAgLTIwLDExICsyMCwxMSBAQAogCiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5QdXNoRmlsZVByZXBhcmVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0ie01PRFVMRX0tPntURVNUX0lOU1RBTExfQkFTRX0ve01PRFVMRX0iIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9IntNT0RVTEV9LT4vZGF0YS9sb2NhbC90bXAve01PRFVMRX0iIC8+CiAgICAgPC90YXJnZXRfcHJlcGFyZXI+CiAKICAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUucnVzdC5SdXN0QmluYXJ5VGVzdCIgPgotICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSJ7VEVTVF9JTlNUQUxMX0JBU0V9IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJ7TU9EVUxFfSIgLz4KICAgICA8L3Rlc3Q+CiA8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9jb3JlL3Nvb25nX2NvbmZpZy5tayBiL2NvcmUvc29vbmdfY29uZmlnLm1rCmluZGV4IDA2ODAzNGIuLjEyYjQxMzUgMTAwNjQ0Ci0tLSBhL2NvcmUvc29vbmdfY29uZmlnLm1rCisrKyBiL2NvcmUvc29vbmdfY29uZmlnLm1rCkBAIC0xMDksNiArMTA5LDggQEAKICQoY2FsbCBhZGRfanNvbl9saXN0LCBBQVBUUHJlYnVpbHREUEksICAgICAgICAgICAgICAgICAgICQoUFJPRFVDVF9BQVBUX1BSRUJVSUxUX0RQSSkpCiAKICQoY2FsbCBhZGRfanNvbl9zdHIsICBEZWZhdWx0QXBwQ2VydGlmaWNhdGUsICAgICAgICAgICAgICQoUFJPRFVDVF9ERUZBVUxUX0RFVl9DRVJUSUZJQ0FURSkpCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgRXh0cmFPdGFLZXlzLCAgICAgICAgICAgICAgICAgICAgICAkKFBST0RVQ1RfRVhUUkFfT1RBX0tFWVMpKQorJChjYWxsIGFkZF9qc29uX2xpc3QsIEV4dHJhT3RhUmVjb3ZlcnlLZXlzLCAgICAgICAgICAgICAgJChQUk9EVUNUX0VYVFJBX1JFQ09WRVJZX0tFWVMpKQogJChjYWxsIGFkZF9qc29uX3N0ciwgIE1haW5saW5lU2Vwb2xpY3lEZXZDZXJ0aWZpY2F0ZXMsICAgJChNQUlOTElORV9TRVBPTElDWV9ERVZfQ0VSVElGSUNBVEVTKSkKIAogJChjYWxsIGFkZF9qc29uX3N0ciwgIEFwcHNEZWZhdWx0VmVyc2lvbk5hbWUsICAgICAgICAgICAgJChBUFBTX0RFRkFVTFRfVkVSU0lPTl9OQU1FKSkKZGlmZiAtLWdpdCBhL2NvcmUvc3lzcHJvcF9jb25maWcubWsgYi9jb3JlL3N5c3Byb3BfY29uZmlnLm1rCmluZGV4IDZlM2RhNzIuLmY5YjlkMWMgMTAwNjQ0Ci0tLSBhL2NvcmUvc3lzcHJvcF9jb25maWcubWsKKysrIGIvY29yZS9zeXNwcm9wX2NvbmZpZy5tawpAQCAtNTAsNiArNTAsMTIgQEAKIEFERElUSU9OQUxfUFJPRFVDVF9QUk9QRVJUSUVTICs9IHJvLnByb2R1Y3QuYnVpbGQuMTZrX3BhZ2UuZW5hYmxlZD1mYWxzZQogZW5kaWYKIAoraWZlcSAoJChUQVJHRVRfQk9PVFNfMTZLKSx0cnVlKQorQURESVRJT05BTF9QUk9EVUNUX1BST1BFUlRJRVMgKz0gcm8ucHJvZHVjdC5wYWdlX3NpemU9MTYzODQKK2Vsc2UKK0FERElUSU9OQUxfUFJPRFVDVF9QUk9QRVJUSUVTICs9IHJvLnByb2R1Y3QucGFnZV9zaXplPTQwOTYKK2VuZGlmCisKICMgRW5hYmxlIGNvcmUgcGxhdGZvcm0gQVBJIHZpb2xhdGlvbiB3YXJuaW5ncyBvbiB1c2VyZGVidWcgYW5kIGVuZyBidWlsZHMuCiBpZm5lcSAoJChUQVJHRVRfQlVJTERfVkFSSUFOVCksdXNlcikKIEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gcGVyc2lzdC5kZWJ1Zy5kYWx2aWsudm0uY29yZV9wbGF0Zm9ybV9hcGlfcG9saWN5PWp1c3Qtd2FybgpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9ob3N0LXVuaXQtdGVzdHMubWsgYi9jb3JlL3Rhc2tzL2hvc3QtdW5pdC10ZXN0cy5tawppbmRleCA3MzNhMmUyLi40Y2IyM2MwIDEwMDY0NAotLS0gYS9jb3JlL3Rhc2tzL2hvc3QtdW5pdC10ZXN0cy5taworKysgYi9jb3JlL3Rhc2tzL2hvc3QtdW5pdC10ZXN0cy5tawpAQCAtMjksMTUgKzI5LDI4IEBACiAgICAgJChldmFsIF9jbWZfc3JjIDo9ICQod29yZCAxLCQoX2NtZl90dXBsZSkpKSBcCiAgICAgJChfY21mX3NyYykpKQogCitteV9zeW1saW5rc19mb3JfaG9zdF91bml0X3Rlc3RzIDo9ICQoZm9yZWFjaCBmLCQoQ09NUEFUSUJJTElUWS5ob3N0LXVuaXQtdGVzdHMuU1lNTElOS1MpLFwKKwkkKHN0cmlwICQoZXZhbCBfY21mX3R1cGxlIDo9ICQoc3Vic3QgOiwgLCQoZikpKSBcCisJJChldmFsIF9jbWZfZGVwIDo9ICQod29yZCAxLCQoX2NtZl90dXBsZSkpKSBcCisJJChldmFsIF9jbWZfc3JjIDo9ICQod29yZCAyLCQoX2NtZl90dXBsZSkpKSBcCisJJChldmFsIF9jbWZfZGVzdCA6PSAkKHdvcmQgMywkKF9jbWZfdHVwbGUpKSkgXAorCSQoY2FsbCBzeW1saW5rLWZpbGUsJChfY21mX2RlcCksJChfY21mX3NyYyksJChfY21mX2Rlc3QpKSBcCisJJChfY21mX2Rlc3QpKSkKKwogJChob3N0X3VuaXRfdGVzdHNfemlwKSA6IFBSSVZBVEVfSE9TVF9TSEFSRURfTElCUyA6PSAkKG15X2hvc3Rfc2hhcmVkX2xpYl9mb3JfaG9zdF91bml0X3Rlc3RzKQogCi0kKGhvc3RfdW5pdF90ZXN0c196aXApIDogJChDT01QQVRJQklMSVRZLmhvc3QtdW5pdC10ZXN0cy5GSUxFUykgJChteV9ob3N0X3NoYXJlZF9saWJfZm9yX2hvc3RfdW5pdF90ZXN0cykgJChTT09OR19aSVApCiskKGhvc3RfdW5pdF90ZXN0c196aXApIDogUFJJVkFURV9TWU1MSU5LUyA6PSAkKG15X3N5bWxpbmtzX2Zvcl9ob3N0X3VuaXRfdGVzdHMpCisKKyQoaG9zdF91bml0X3Rlc3RzX3ppcCkgOiAkKENPTVBBVElCSUxJVFkuaG9zdC11bml0LXRlc3RzLkZJTEVTKSAkKG15X2hvc3Rfc2hhcmVkX2xpYl9mb3JfaG9zdF91bml0X3Rlc3RzKSAkKG15X3N5bWxpbmtzX2Zvcl9ob3N0X3VuaXRfdGVzdHMpICQoU09PTkdfWklQKQogCWVjaG8gJChzb3J0ICQoQ09NUEFUSUJJTElUWS5ob3N0LXVuaXQtdGVzdHMuRklMRVMpKSB8IHRyICIgIiAiXG4iID4gJEAubGlzdAogCWdyZXAgJChIT1NUX09VVF9URVNUQ0FTRVMpICRALmxpc3QgPiAkQC1ob3N0Lmxpc3QgfHwgdHJ1ZQogCWVjaG8gIiIgPj4gJEAtaG9zdC1saWJzLmxpc3QKIAkkKGhpZGUpIGZvciBzaGFyZWRfbGliIGluICQoUFJJVkFURV9IT1NUX1NIQVJFRF9MSUJTKTsgZG8gXAogCSAgZWNobyAkJHNoYXJlZF9saWIgPj4gJEAtaG9zdC1saWJzLmxpc3Q7IFwKIAlkb25lCisJJChoaWRlKSBmb3Igc3ltbGluayBpbiAkKFBSSVZBVEVfU1lNTElOS1MpOyBkbyBcCisJICBlY2hvICQkc3ltbGluayA+PiAkQC1ob3N0Lmxpc3Q7IFwKKwlkb25lCiAJZ3JlcCAkKFRBUkdFVF9PVVRfVEVTVENBU0VTKSAkQC5saXN0ID4gJEAtdGFyZ2V0Lmxpc3QgfHwgdHJ1ZQogCSQoaGlkZSkgJChTT09OR19aSVApIC1kIC1vICRAIC1QIGhvc3QgLUMgJChIT1NUX09VVCkgLWwgJEAtaG9zdC5saXN0IFwKIAkgIC1QIHRhcmdldCAtQyAkKFBST0RVQ1RfT1VUKSAtbCAkQC10YXJnZXQubGlzdCBcCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9zZGsubWsgYi90YXJnZXQvcHJvZHVjdC9zZGsubWsKaW5kZXggMWEwNzM2My4uM2Q1NmE4MCAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3Qvc2RrLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L3Nkay5tawpAQCAtNDAsMyArNDAsNiBAQAogaWZlcSAoJChXSVRIT1VUX0NIRUNLX0FQSSksdHJ1ZSkKICAgJChlcnJvciBXSVRIT1VUX0NIRUNLX0FQSSBjYW5ub3QgYmUgc2V0IHRvIHRydWUgZm9yIFNESyBwcm9kdWN0IGJ1aWxkcykKIGVuZGlmCisKKyMgSW5jbHVkZSBXZWFyIGZsYWcgdmFsdWVzIHNvIHRoYXQgV2Vhci1yZWxhdGVkIEFQSXMgYXJlIGJ1aWxkIGluIHNka3MuCitQUk9EVUNUX1JFTEVBU0VfQ09ORklHX01BUFMgKz0gJCh3aWxkY2FyZCB2ZW5kb3IvZ29vZ2xlX3NoYXJlZC93ZWFyL3JlbGVhc2UvcmVsZWFzZV9jb25maWdfbWFwLnRleHRwcm90bykKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L0FuZHJvaWQuYnAgYi90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9BbmRyb2lkLmJwCmluZGV4IDFlMjZkNTkuLjBkN2IzNWUgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L0FuZHJvaWQuYnAKKysrIGIvdGFyZ2V0L3Byb2R1Y3Qvc2VjdXJpdHkvQW5kcm9pZC5icApAQCAtMjUsMyArMjUsMTUgQEAKICAgICBzdWJfZGlyOiAic2VjdXJpdHkvZnN2ZXJpdHkiLAogICAgIGZpbGVuYW1lX2Zyb21fc3JjOiB0cnVlLAogfQorCisvLyBvdGFjZXJ0czogQSBrZXlzdG9yZSB3aXRoIHRoZSBhdXRob3JpemVkIGtleXMgaW4gaXQsIHdoaWNoIGlzIHVzZWQgdG8gdmVyaWZ5CisvLyB0aGUgYXV0aGVudGljaXR5IG9mIGRvd25sb2FkZWQgT1RBIHBhY2thZ2VzLgorLy8gVGhpcyBtb2R1bGUgemlwcyBmaWxlcyBkZWZpbmVkIGluIFBST0RVQ1RfREVGQVVMVF9ERVZfQ0VSVElGSUNBVEUgYW5kCisvLyBQUk9EVUNUX0VYVFJBX09UQV9LRVlTIGZvciBzeXN0ZW0gb3IgUFJPRFVDVF9FWFRSQV9SRUNPVkVSWV9LRVlTIGZvciByZWNvdmVyeQorLy8gaW1hZ2UKK290YWNlcnRzX3ppcCB7CisgICAgbmFtZTogIm90YWNlcnRzIiwKKyAgICByZWNvdmVyeV9hdmFpbGFibGU6IHRydWUsCisgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAic2VjdXJpdHkiLAorICAgIGZpbGVuYW1lOiAib3RhY2VydHMuemlwIiwKK30KZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L0FuZHJvaWQubWsgYi90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9BbmRyb2lkLm1rCmluZGV4IDRiZDhlZmMuLjkxYjI3MmMgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L0FuZHJvaWQubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3Qvc2VjdXJpdHkvQW5kcm9pZC5tawpAQCAtMTUsNTQgKzE1LDMgQEAKICAgICBpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCiAgIGVuZGlmCiBlbmRpZgotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBvdGFjZXJ0czogQSBrZXlzdG9yZSB3aXRoIHRoZSBhdXRob3JpemVkIGtleXMgaW4gaXQsIHdoaWNoIGlzIHVzZWQgdG8gdmVyaWZ5IHRoZSBhdXRoZW50aWNpdHkgb2YKLSMgZG93bmxvYWRlZCBPVEEgcGFja2FnZXMuCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IG90YWNlcnRzCi1MT0NBTF9MSUNFTlNFX0tJTkRTIDo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLUxPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUyA6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFIDo9IGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UKLUxPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLUxPQ0FMX01PRFVMRV9TVEVNIDo9IG90YWNlcnRzLnppcAotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0VUQykvc2VjdXJpdHkKLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2Jhc2VfcnVsZXMubWsKLQotZXh0cmFfb3RhX2tleXMgOj0gJChhZGRzdWZmaXggLng1MDkucGVtLCQoUFJPRFVDVF9FWFRSQV9PVEFfS0VZUykpCi0KLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9DRVJUIDo9ICQoREVGQVVMVF9TWVNURU1fREVWX0NFUlRJRklDQVRFKS54NTA5LnBlbQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0VYVFJBX09UQV9LRVlTIDo9ICQoZXh0cmFfb3RhX2tleXMpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFwKLQkgICAgJChTT09OR19aSVApIFwKLQkgICAgJChERUZBVUxUX1NZU1RFTV9ERVZfQ0VSVElGSUNBVEUpLng1MDkucGVtIFwKLQkgICAgJChleHRyYV9vdGFfa2V5cykKLQkkKFNPT05HX1pJUCkgLW8gJEAgLWogLXN5bWxpbmtzPWZhbHNlIFwKLQkgICAgJChhZGRwcmVmaXggLWYgLCQoUFJJVkFURV9DRVJUKSAkKFBSSVZBVEVfRVhUUkFfT1RBX0tFWVMpKQotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBvdGFjZXJ0cyBmb3IgcmVjb3ZlcnkgaW1hZ2UuCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IG90YWNlcnRzLnJlY292ZXJ5Ci1MT0NBTF9MSUNFTlNFX0tJTkRTIDo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLUxPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUyA6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFIDo9IGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UKLUxPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLUxPQ0FMX01PRFVMRV9TVEVNIDo9IG90YWNlcnRzLnppcAotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfUkVDT1ZFUllfUk9PVF9PVVQpL3N5c3RlbS9ldGMvc2VjdXJpdHkKLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2Jhc2VfcnVsZXMubWsKLQotZXh0cmFfcmVjb3Zlcnlfa2V5cyA6PSAkKGFkZHN1ZmZpeCAueDUwOS5wZW0sJChQUk9EVUNUX0VYVFJBX1JFQ09WRVJZX0tFWVMpKQotCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQ0VSVCA6PSAkKERFRkFVTFRfU1lTVEVNX0RFVl9DRVJUSUZJQ0FURSkueDUwOS5wZW0KLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9FWFRSQV9SRUNPVkVSWV9LRVlTIDo9ICQoZXh0cmFfcmVjb3Zlcnlfa2V5cykKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogXAotCSAgICAkKFNPT05HX1pJUCkgXAotCSAgICAkKERFRkFVTFRfU1lTVEVNX0RFVl9DRVJUSUZJQ0FURSkueDUwOS5wZW0gXAotCSAgICAkKGV4dHJhX3JlY292ZXJ5X2tleXMpCi0JJChTT09OR19aSVApIC1vICRAIC1qIC1zeW1saW5rcz1mYWxzZSBcCi0JICAgICQoYWRkcHJlZml4IC1mICwkKFBSSVZBVEVfQ0VSVCkgJChQUklWQVRFX0VYVFJBX1JFQ09WRVJZX0tFWVMpKQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvdmlydHVhbF9hYl9vdGEvT1dORVJTIGIvdGFyZ2V0L3Byb2R1Y3QvdmlydHVhbF9hYl9vdGEvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYjA2ODYKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvcHJvZHVjdC92aXJ0dWFsX2FiX290YS9PV05FUlMKQEAgLTAsMCArMSw0IEBACit6aGFuZ2tlbHZpbkBnb29nbGUuY29tCitkdmFuZGVyQGdvb2dsZS5jb20KK2FrYWlsYXNoQGdvb2dsZS5jb20KKwpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvdmlydHVhbF9hYl9vdGEvY29tcHJlc3Npb24ubWsgYi90YXJnZXQvcHJvZHVjdC92aXJ0dWFsX2FiX290YS9jb21wcmVzc2lvbi5tawppbmRleCBjOTY0ODYwLi5kYzFlZTNlIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC92aXJ0dWFsX2FiX290YS9jb21wcmVzc2lvbi5taworKysgYi90YXJnZXQvcHJvZHVjdC92aXJ0dWFsX2FiX290YS9jb21wcmVzc2lvbi5tawpAQCAtMjgsNCArMjgsNSBAQAogUFJPRFVDVF9WSVJUVUFMX0FCX0NPTVBSRVNTSU9OIDo9IHRydWUKIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAogICAgIHNuYXB1c2VyZC52ZW5kb3JfcmFtZGlzayBcCi0gICAgc25hcHVzZXJkCisgICAgc25hcHVzZXJkIFwKKyAgICBzbmFwdXNlcmQucmVjb3ZlcnkKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3ZpcnR1YWxfYWJfb3RhL2NvbXByZXNzaW9uX3JldHJvZml0Lm1rIGIvdGFyZ2V0L3Byb2R1Y3QvdmlydHVhbF9hYl9vdGEvY29tcHJlc3Npb25fcmV0cm9maXQubWsKaW5kZXggMTE4ZDNmMi4uNmMyOWNiYSAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvdmlydHVhbF9hYl9vdGEvY29tcHJlc3Npb25fcmV0cm9maXQubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvdmlydHVhbF9hYl9vdGEvY29tcHJlc3Npb25fcmV0cm9maXQubWsKQEAgLTI0LDQgKzI0LDUgQEAKICMgYXMgd2VsbC4KIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAogICAgIHNuYXB1c2VyZC5yYW1kaXNrIFwKLSAgICBzbmFwdXNlcmQKKyAgICBzbmFwdXNlcmQgXAorICAgIHNuYXB1c2VyZC5yZWNvdmVyeQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9URVNUX01BUFBJTkcgYi90b29scy9hY29uZmlnL1RFU1RfTUFQUElORwppbmRleCA0NDhkOGNmLi4xNWU0MTg3IDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL1RFU1RfTUFQUElORworKysgYi90b29scy9hY29uZmlnL1RFU1RfTUFQUElORwpAQCAtOTgsNiArOTgsMTAgQEAKICAgICB7CiAgICAgICAvLyBhY29uZmlnX3N0b3JhZ2UgZmlsZSBjcHAgaW50ZWdyYXRpb24gdGVzdHMKICAgICAgICJuYW1lIjogImFjb25maWdfc3RvcmFnZV9maWxlLnRlc3QuY3BwIgorICAgIH0sCisgICAgeworICAgICAgLy8gYWNvbmZpZ19zdG9yYWdlIGZpbGUgamF2YSBpbnRlZ3JhdGlvbiB0ZXN0cworICAgICAgIm5hbWUiOiAiYWNvbmZpZ19zdG9yYWdlX2ZpbGUudGVzdC5qYXZhIgogICAgIH0KICAgXSwKICAgInBvc3RzdWJtaXQiOiBbCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL2NvZGVnZW4vamF2YS5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvY29kZWdlbi9qYXZhLnJzCmluZGV4IDMzNjBkZGQuLmVjMjJlYmMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvY29kZWdlbi9qYXZhLnJzCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvY29kZWdlbi9qYXZhLnJzCkBAIC0yMCwyMiArMjAsMjQgQEAKIHVzZSBzdGQ6OnBhdGg6OlBhdGhCdWY7CiB1c2UgdGlueXRlbXBsYXRlOjpUaW55VGVtcGxhdGU7CiAKLXVzZSBhY29uZmlnX3Byb3Rvczo6e1Byb3RvRmxhZ1Blcm1pc3Npb24sIFByb3RvRmxhZ1N0YXRlLCBQcm90b1BhcnNlZEZsYWd9OwotCiB1c2UgY3JhdGU6OmNvZGVnZW47CiB1c2UgY3JhdGU6OmNvZGVnZW46OkNvZGVnZW5Nb2RlOwogdXNlIGNyYXRlOjpjb21tYW5kczo6T3V0cHV0RmlsZTsKK3VzZSBhY29uZmlnX3Byb3Rvczo6e1Byb3RvRmxhZ1Blcm1pc3Npb24sIFByb3RvRmxhZ1N0YXRlLCBQcm90b1BhcnNlZEZsYWd9OwordXNlIHN0ZDo6Y29sbGVjdGlvbnM6Okhhc2hNYXA7CiAKIHB1YiBmbiBnZW5lcmF0ZV9qYXZhX2NvZGU8ST4oCiAgICAgcGFja2FnZTogJnN0ciwKICAgICBwYXJzZWRfZmxhZ3NfaXRlcjogSSwKICAgICBjb2RlZ2VuX21vZGU6IENvZGVnZW5Nb2RlLAorICAgIGZsYWdfaWRzOiBIYXNoTWFwPFN0cmluZywgdTE2PiwKKyAgICBhbGxvd19pbnN0cnVtZW50YXRpb246IGJvb2wsCiApIC0+IFJlc3VsdDxWZWM8T3V0cHV0RmlsZT4+CiB3aGVyZQogICAgIEk6IEl0ZXJhdG9yPEl0ZW0gPSBQcm90b1BhcnNlZEZsYWc+LAogewogICAgIGxldCBmbGFnX2VsZW1lbnRzOiBWZWM8RmxhZ0VsZW1lbnQ+ID0KLSAgICAgICAgcGFyc2VkX2ZsYWdzX2l0ZXIubWFwKHxwZnwgY3JlYXRlX2ZsYWdfZWxlbWVudChwYWNrYWdlLCAmcGYpKS5jb2xsZWN0KCk7CisgICAgICAgIHBhcnNlZF9mbGFnc19pdGVyLm1hcCh8cGZ8IGNyZWF0ZV9mbGFnX2VsZW1lbnQocGFja2FnZSwgJnBmLCBmbGFnX2lkcy5jbG9uZSgpKSkuY29sbGVjdCgpOwogICAgIGxldCBuYW1lc3BhY2VfZmxhZ3MgPSBnZW5fZmxhZ3NfYnlfbmFtZXNwYWNlKCZmbGFnX2VsZW1lbnRzKTsKICAgICBsZXQgcHJvcGVydGllc19zZXQ6IEJUcmVlU2V0PFN0cmluZz4gPQogICAgICAgICBmbGFnX2VsZW1lbnRzLml0ZXIoKS5tYXAofGZlfCBmb3JtYXRfcHJvcGVydHlfbmFtZSgmZmUuZGV2aWNlX2NvbmZpZ19uYW1lc3BhY2UpKS5jb2xsZWN0KCk7CkBAIC00Myw2ICs0NSw3IEBACiAgICAgbGV0IGxpYnJhcnlfZXhwb3J0ZWQgPSBjb2RlZ2VuX21vZGUgPT0gQ29kZWdlbk1vZGU6OkV4cG9ydGVkOwogICAgIGxldCBydW50aW1lX2xvb2t1cF9yZXF1aXJlZCA9CiAgICAgICAgIGZsYWdfZWxlbWVudHMuaXRlcigpLmFueSh8ZWxlbXwgZWxlbS5pc19yZWFkX3dyaXRlKSB8fCBsaWJyYXJ5X2V4cG9ydGVkOworICAgIGxldCBjb250YWluZXIgPSAoZmxhZ19lbGVtZW50cy5maXJzdCgpLmV4cGVjdCgiemVybyB0ZW1wbGF0ZSBmbGFncyIpLmNvbnRhaW5lcikudG9fc3RyaW5nKCk7CiAKICAgICBsZXQgY29udGV4dCA9IENvbnRleHQgewogICAgICAgICBmbGFnX2VsZW1lbnRzLApAQCAtNTIsNiArNTUsOCBAQAogICAgICAgICBwcm9wZXJ0aWVzX3NldCwKICAgICAgICAgcGFja2FnZV9uYW1lOiBwYWNrYWdlLnRvX3N0cmluZygpLAogICAgICAgICBsaWJyYXJ5X2V4cG9ydGVkLAorICAgICAgICBhbGxvd19pbnN0cnVtZW50YXRpb24sCisgICAgICAgIGNvbnRhaW5lciwKICAgICB9OwogICAgIGxldCBtdXQgdGVtcGxhdGUgPSBUaW55VGVtcGxhdGU6Om5ldygpOwogICAgIHRlbXBsYXRlLmFkZF90ZW1wbGF0ZSgiRmxhZ3MuamF2YSIsIGluY2x1ZGVfc3RyISgiLi4vLi4vdGVtcGxhdGVzL0ZsYWdzLmphdmEudGVtcGxhdGUiKSk/OwpAQCAtMTE3LDYgKzEyMiw4IEBACiAgICAgcHViIHByb3BlcnRpZXNfc2V0OiBCVHJlZVNldDxTdHJpbmc+LAogICAgIHB1YiBwYWNrYWdlX25hbWU6IFN0cmluZywKICAgICBwdWIgbGlicmFyeV9leHBvcnRlZDogYm9vbCwKKyAgICBwdWIgYWxsb3dfaW5zdHJ1bWVudGF0aW9uOiBib29sLAorICAgIHB1YiBjb250YWluZXI6IFN0cmluZywKIH0KIAogI1tkZXJpdmUoU2VyaWFsaXplLCBEZWJ1ZyldCkBAIC0xMjcsMjMgKzEzNCwzMSBAQAogCiAjW2Rlcml2ZShTZXJpYWxpemUsIENsb25lLCBEZWJ1ZyldCiBzdHJ1Y3QgRmxhZ0VsZW1lbnQgeworICAgIHB1YiBjb250YWluZXI6IFN0cmluZywKICAgICBwdWIgZGVmYXVsdF92YWx1ZTogYm9vbCwKICAgICBwdWIgZGV2aWNlX2NvbmZpZ19uYW1lc3BhY2U6IFN0cmluZywKICAgICBwdWIgZGV2aWNlX2NvbmZpZ19mbGFnOiBTdHJpbmcsCiAgICAgcHViIGZsYWdfbmFtZV9jb25zdGFudF9zdWZmaXg6IFN0cmluZywKKyAgICBwdWIgZmxhZ19vZmZzZXQ6IHUxNiwKICAgICBwdWIgaXNfcmVhZF93cml0ZTogYm9vbCwKICAgICBwdWIgbWV0aG9kX25hbWU6IFN0cmluZywKICAgICBwdWIgcHJvcGVydGllczogU3RyaW5nLAogfQogCi1mbiBjcmVhdGVfZmxhZ19lbGVtZW50KHBhY2thZ2U6ICZzdHIsIHBmOiAmUHJvdG9QYXJzZWRGbGFnKSAtPiBGbGFnRWxlbWVudCB7CitmbiBjcmVhdGVfZmxhZ19lbGVtZW50KAorICAgIHBhY2thZ2U6ICZzdHIsCisgICAgcGY6ICZQcm90b1BhcnNlZEZsYWcsCisgICAgZmxhZ19vZmZzZXRzOiBIYXNoTWFwPFN0cmluZywgdTE2PiwKKykgLT4gRmxhZ0VsZW1lbnQgewogICAgIGxldCBkZXZpY2VfY29uZmlnX2ZsYWcgPSBjb2RlZ2VuOjpjcmVhdGVfZGV2aWNlX2NvbmZpZ19pZGVudChwYWNrYWdlLCBwZi5uYW1lKCkpCiAgICAgICAgIC5leHBlY3QoInZhbHVlcyBjaGVja2VkIGF0IGZsYWcgcGFyc2UgdGltZSIpOwogICAgIEZsYWdFbGVtZW50IHsKKyAgICAgICAgY29udGFpbmVyOiBwZi5jb250YWluZXIoKS50b19zdHJpbmcoKSwKICAgICAgICAgZGVmYXVsdF92YWx1ZTogcGYuc3RhdGUoKSA9PSBQcm90b0ZsYWdTdGF0ZTo6RU5BQkxFRCwKICAgICAgICAgZGV2aWNlX2NvbmZpZ19uYW1lc3BhY2U6IHBmLm5hbWVzcGFjZSgpLnRvX3N0cmluZygpLAogICAgICAgICBkZXZpY2VfY29uZmlnX2ZsYWcsCiAgICAgICAgIGZsYWdfbmFtZV9jb25zdGFudF9zdWZmaXg6IHBmLm5hbWUoKS50b19hc2NpaV91cHBlcmNhc2UoKSwKKyAgICAgICAgZmxhZ19vZmZzZXQ6ICpmbGFnX29mZnNldHMuZ2V0KHBmLm5hbWUoKSkuZXhwZWN0KCJkaWRudCBmaW5kIHBhY2thZ2Ugb2Zmc2V0IDooIiksCiAgICAgICAgIGlzX3JlYWRfd3JpdGU6IHBmLnBlcm1pc3Npb24oKSA9PSBQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX1dSSVRFLAogICAgICAgICBtZXRob2RfbmFtZTogZm9ybWF0X2phdmFfbWV0aG9kX25hbWUocGYubmFtZSgpKSwKICAgICAgICAgcHJvcGVydGllczogZm9ybWF0X3Byb3BlcnR5X25hbWUocGYubmFtZXNwYWNlKCkpLApAQCAtMTc5LDYgKzE5NCw3IEBACiAjW2NmZyh0ZXN0KV0KIG1vZCB0ZXN0cyB7CiAgICAgdXNlIHN1cGVyOjoqOworICAgIHVzZSBjcmF0ZTo6Y29tbWFuZHM6OmFzc2lnbl9mbGFnX2lkczsKICAgICB1c2Ugc3RkOjpjb2xsZWN0aW9uczo6SGFzaE1hcDsKIAogICAgIGNvbnN0IEVYUEVDVEVEX0ZFQVRVUkVGTEFHU19DT01NT05fQ09OVEVOVDogJnN0ciA9IHIjIgpAQCAtNDc3LDkgKzQ5MywxNiBAQAogICAgICAgICBsZXQgbW9kZSA9IENvZGVnZW5Nb2RlOjpQcm9kdWN0aW9uOwogICAgICAgICBsZXQgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzID0KICAgICAgICAgICAgIGNyYXRlOjpjb21tYW5kczo6bW9kaWZ5X3BhcnNlZF9mbGFnc19iYXNlZF9vbl9tb2RlKHBhcnNlZF9mbGFncywgbW9kZSkudW53cmFwKCk7Ci0gICAgICAgIGxldCBnZW5lcmF0ZWRfZmlsZXMgPQotICAgICAgICAgICAgZ2VuZXJhdGVfamF2YV9jb2RlKGNyYXRlOjp0ZXN0OjpURVNUX1BBQ0tBR0UsIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pbnRvX2l0ZXIoKSwgbW9kZSkKLSAgICAgICAgICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGxldCBmbGFnX2lkcyA9CisgICAgICAgICAgICBhc3NpZ25fZmxhZ19pZHMoY3JhdGU6OnRlc3Q6OlRFU1RfUEFDS0FHRSwgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzLml0ZXIoKSkudW53cmFwKCk7CisgICAgICAgIGxldCBnZW5lcmF0ZWRfZmlsZXMgPSBnZW5lcmF0ZV9qYXZhX2NvZGUoCisgICAgICAgICAgICBjcmF0ZTo6dGVzdDo6VEVTVF9QQUNLQUdFLAorICAgICAgICAgICAgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzLmludG9faXRlcigpLAorICAgICAgICAgICAgbW9kZSwKKyAgICAgICAgICAgIGZsYWdfaWRzLAorICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICkKKyAgICAgICAgLnVud3JhcCgpOwogICAgICAgICBsZXQgZXhwZWN0X2ZsYWdzX2NvbnRlbnQgPSBFWFBFQ1RFRF9GTEFHX0NPTU1PTl9DT05URU5ULnRvX3N0cmluZygpCiAgICAgICAgICAgICArIHIjIgogICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgRmVhdHVyZUZsYWdzIEZFQVRVUkVfRkxBR1MgPSBuZXcgRmVhdHVyZUZsYWdzSW1wbCgpOwpAQCAtNTA1LDExICs1MjgsMTEgQEAKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBEZXZpY2VDb25maWcuZ2V0UHJvcGVydGllcygiYWNvbmZpZ190ZXN0Iik7CiAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkUncgPQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5nZXRCb29sZWFuKCJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcnciLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmdldEJvb2xlYW4oRmxhZ3MuRkxBR19ESVNBQkxFRF9SVywgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZFJ3RXhwb3J0ZWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5nZXRCb29sZWFuKCJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcndfZXhwb3J0ZWQiLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmdldEJvb2xlYW4oRmxhZ3MuRkxBR19ESVNBQkxFRF9SV19FWFBPUlRFRCwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICBlbmFibGVkUncgPQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5nZXRCb29sZWFuKCJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9ydyIsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5nZXRCb29sZWFuKEZsYWdzLkZMQUdfRU5BQkxFRF9SVywgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcmVhZCB2YWx1ZSBmcm9tIG5hbWVzcGFjZSBhY29uZmlnX3Rlc3QgIgpAQCAtNTI3LDcgKzU1MCw3IEBACiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gRGV2aWNlQ29uZmlnLmdldFByb3BlcnRpZXMoIm90aGVyX25hbWVzcGFjZSIpOwogICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZFJ3SW5PdGhlck5hbWVzcGFjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmdldEJvb2xlYW4oImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UiLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmdldEJvb2xlYW4oRmxhZ3MuRkxBR19ESVNBQkxFRF9SV19JTl9PVEhFUl9OQU1FU1BBQ0UsIGZhbHNlKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCByZWFkIHZhbHVlIGZyb20gbmFtZXNwYWNlIG90aGVyX25hbWVzcGFjZSAiCkBAIC02NDcsOSArNjcwLDE2IEBACiAgICAgICAgIGxldCBtb2RlID0gQ29kZWdlbk1vZGU6OkV4cG9ydGVkOwogICAgICAgICBsZXQgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzID0KICAgICAgICAgICAgIGNyYXRlOjpjb21tYW5kczo6bW9kaWZ5X3BhcnNlZF9mbGFnc19iYXNlZF9vbl9tb2RlKHBhcnNlZF9mbGFncywgbW9kZSkudW53cmFwKCk7Ci0gICAgICAgIGxldCBnZW5lcmF0ZWRfZmlsZXMgPQotICAgICAgICAgICAgZ2VuZXJhdGVfamF2YV9jb2RlKGNyYXRlOjp0ZXN0OjpURVNUX1BBQ0tBR0UsIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pbnRvX2l0ZXIoKSwgbW9kZSkKLSAgICAgICAgICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGxldCBmbGFnX2lkcyA9CisgICAgICAgICAgICBhc3NpZ25fZmxhZ19pZHMoY3JhdGU6OnRlc3Q6OlRFU1RfUEFDS0FHRSwgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzLml0ZXIoKSkudW53cmFwKCk7CisgICAgICAgIGxldCBnZW5lcmF0ZWRfZmlsZXMgPSBnZW5lcmF0ZV9qYXZhX2NvZGUoCisgICAgICAgICAgICBjcmF0ZTo6dGVzdDo6VEVTVF9QQUNLQUdFLAorICAgICAgICAgICAgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzLmludG9faXRlcigpLAorICAgICAgICAgICAgbW9kZSwKKyAgICAgICAgICAgIGZsYWdfaWRzLAorICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICkKKyAgICAgICAgLnVud3JhcCgpOwogCiAgICAgICAgIGxldCBleHBlY3RfZmxhZ3NfY29udGVudCA9IHIjIgogICAgICAgICBwYWNrYWdlIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdDsKQEAgLTcwMCwxMSArNzMwLDExIEBACiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gRGV2aWNlQ29uZmlnLmdldFByb3BlcnRpZXMoImFjb25maWdfdGVzdCIpOwogICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZFJ3RXhwb3J0ZWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5nZXRCb29sZWFuKCJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcndfZXhwb3J0ZWQiLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmdldEJvb2xlYW4oRmxhZ3MuRkxBR19ESVNBQkxFRF9SV19FWFBPUlRFRCwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICBlbmFibGVkRml4ZWRSb0V4cG9ydGVkID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuZ2V0Qm9vbGVhbigiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQiLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmdldEJvb2xlYW4oRmxhZ3MuRkxBR19FTkFCTEVEX0ZJWEVEX1JPX0VYUE9SVEVELCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWRSb0V4cG9ydGVkID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuZ2V0Qm9vbGVhbigiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfcm9fZXhwb3J0ZWQiLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmdldEJvb2xlYW4oRmxhZ3MuRkxBR19FTkFCTEVEX1JPX0VYUE9SVEVELCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcmVhZCB2YWx1ZSBmcm9tIG5hbWVzcGFjZSBhY29uZmlnX3Rlc3QgIgpAQCAtODMzLDkgKzg2MywxNiBAQAogICAgICAgICBsZXQgbW9kZSA9IENvZGVnZW5Nb2RlOjpUZXN0OwogICAgICAgICBsZXQgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzID0KICAgICAgICAgICAgIGNyYXRlOjpjb21tYW5kczo6bW9kaWZ5X3BhcnNlZF9mbGFnc19iYXNlZF9vbl9tb2RlKHBhcnNlZF9mbGFncywgbW9kZSkudW53cmFwKCk7Ci0gICAgICAgIGxldCBnZW5lcmF0ZWRfZmlsZXMgPQotICAgICAgICAgICAgZ2VuZXJhdGVfamF2YV9jb2RlKGNyYXRlOjp0ZXN0OjpURVNUX1BBQ0tBR0UsIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pbnRvX2l0ZXIoKSwgbW9kZSkKLSAgICAgICAgICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGxldCBmbGFnX2lkcyA9CisgICAgICAgICAgICBhc3NpZ25fZmxhZ19pZHMoY3JhdGU6OnRlc3Q6OlRFU1RfUEFDS0FHRSwgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzLml0ZXIoKSkudW53cmFwKCk7CisgICAgICAgIGxldCBnZW5lcmF0ZWRfZmlsZXMgPSBnZW5lcmF0ZV9qYXZhX2NvZGUoCisgICAgICAgICAgICBjcmF0ZTo6dGVzdDo6VEVTVF9QQUNLQUdFLAorICAgICAgICAgICAgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzLmludG9faXRlcigpLAorICAgICAgICAgICAgbW9kZSwKKyAgICAgICAgICAgIGZsYWdfaWRzLAorICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICkKKyAgICAgICAgLnVud3JhcCgpOwogCiAgICAgICAgIGxldCBleHBlY3RfZmxhZ3NfY29udGVudCA9IEVYUEVDVEVEX0ZMQUdfQ09NTU9OX0NPTlRFTlQudG9fc3RyaW5nKCkKICAgICAgICAgICAgICsgciMiCkBAIC04NTAsNjkgKzg4Nyw1OCBAQAogICAgICAgICAiIzsKICAgICAgICAgbGV0IGV4cGVjdF9mZWF0dXJlZmxhZ3NpbXBsX2NvbnRlbnQgPSByIyIKICAgICAgICAgcGFja2FnZSBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3Q7Ci0gICAgICAgIC8vIFRPRE8oYi8zMDM3NzMwNTUpOiBSZW1vdmUgdGhlIGFubm90YXRpb24gYWZ0ZXIgYWNjZXNzIGlzc3VlIGlzIHJlc29sdmVkLgotICAgICAgICBpbXBvcnQgYW5kcm9pZC5jb21wYXQuYW5ub3RhdGlvbi5VbnN1cHBvcnRlZEFwcFVzYWdlOwogICAgICAgICAvKiogQGhpZGUgKi8KICAgICAgICAgcHVibGljIGZpbmFsIGNsYXNzIEZlYXR1cmVGbGFnc0ltcGwgaW1wbGVtZW50cyBGZWF0dXJlRmxhZ3MgewogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCi0gICAgICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZGlzYWJsZWRSbygpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgICJNZXRob2QgaXMgbm90IGltcGxlbWVudGVkLiIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCi0gICAgICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZGlzYWJsZWRSdygpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgICJNZXRob2QgaXMgbm90IGltcGxlbWVudGVkLiIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCi0gICAgICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZGlzYWJsZWRSd0V4cG9ydGVkKCkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgIk1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKLSAgICAgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBkaXNhYmxlZFJ3SW5PdGhlck5hbWVzcGFjZSgpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgICJNZXRob2QgaXMgbm90IGltcGxlbWVudGVkLiIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCi0gICAgICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlZEZpeGVkUm8oKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICAiTWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgotICAgICAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZWRGaXhlZFJvRXhwb3J0ZWQoKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICAiTWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgotICAgICAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZWRSbygpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgICJNZXRob2QgaXMgbm90IGltcGxlbWVudGVkLiIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCi0gICAgICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlZFJvRXhwb3J0ZWQoKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICAiTWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgotICAgICAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZWRSdygpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgICJNZXRob2QgaXMgbm90IGltcGxlbWVudGVkLiIpOwpAQCAtOTU4LDkgKzk4NCwxNiBAQAogICAgICAgICBsZXQgbW9kZSA9IENvZGVnZW5Nb2RlOjpGb3JjZVJlYWRPbmx5OwogICAgICAgICBsZXQgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzID0KICAgICAgICAgICAgIGNyYXRlOjpjb21tYW5kczo6bW9kaWZ5X3BhcnNlZF9mbGFnc19iYXNlZF9vbl9tb2RlKHBhcnNlZF9mbGFncywgbW9kZSkudW53cmFwKCk7Ci0gICAgICAgIGxldCBnZW5lcmF0ZWRfZmlsZXMgPQotICAgICAgICAgICAgZ2VuZXJhdGVfamF2YV9jb2RlKGNyYXRlOjp0ZXN0OjpURVNUX1BBQ0tBR0UsIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pbnRvX2l0ZXIoKSwgbW9kZSkKLSAgICAgICAgICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGxldCBmbGFnX2lkcyA9CisgICAgICAgICAgICBhc3NpZ25fZmxhZ19pZHMoY3JhdGU6OnRlc3Q6OlRFU1RfUEFDS0FHRSwgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzLml0ZXIoKSkudW53cmFwKCk7CisgICAgICAgIGxldCBnZW5lcmF0ZWRfZmlsZXMgPSBnZW5lcmF0ZV9qYXZhX2NvZGUoCisgICAgICAgICAgICBjcmF0ZTo6dGVzdDo6VEVTVF9QQUNLQUdFLAorICAgICAgICAgICAgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzLmludG9faXRlcigpLAorICAgICAgICAgICAgbW9kZSwKKyAgICAgICAgICAgIGZsYWdfaWRzLAorICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICkKKyAgICAgICAgLnVud3JhcCgpOwogICAgICAgICBsZXQgZXhwZWN0X2ZlYXR1cmVmbGFnc19jb250ZW50ID0gciMiCiAgICAgICAgIHBhY2thZ2UgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0OwogICAgICAgICAvLyBUT0RPKGIvMzAzNzczMDU1KTogUmVtb3ZlIHRoZSBhbm5vdGF0aW9uIGFmdGVyIGFjY2VzcyBpc3N1ZSBpcyByZXNvbHZlZC4KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvY29tbWFuZHMucnMgYi90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL2NvbW1hbmRzLnJzCmluZGV4IDY5NDVmZDQuLjZkMWMyZjUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvY29tbWFuZHMucnMKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9jb21tYW5kcy5ycwpAQCAtMTkxLDE1ICsxOTEsMjUgQEAKICAgICBPayhvdXRwdXQpCiB9CiAKLXB1YiBmbiBjcmVhdGVfamF2YV9saWIobXV0IGlucHV0OiBJbnB1dCwgY29kZWdlbl9tb2RlOiBDb2RlZ2VuTW9kZSkgLT4gUmVzdWx0PFZlYzxPdXRwdXRGaWxlPj4geworcHViIGZuIGNyZWF0ZV9qYXZhX2xpYigKKyAgICBtdXQgaW5wdXQ6IElucHV0LAorICAgIGNvZGVnZW5fbW9kZTogQ29kZWdlbk1vZGUsCisgICAgYWxsb3dfaW5zdHJ1bWVudGF0aW9uOiBib29sLAorKSAtPiBSZXN1bHQ8VmVjPE91dHB1dEZpbGU+PiB7CiAgICAgbGV0IHBhcnNlZF9mbGFncyA9IGlucHV0LnRyeV9wYXJzZV9mbGFncygpPzsKICAgICBsZXQgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzID0gbW9kaWZ5X3BhcnNlZF9mbGFnc19iYXNlZF9vbl9tb2RlKHBhcnNlZF9mbGFncywgY29kZWdlbl9tb2RlKT87CiAgICAgbGV0IFNvbWUocGFja2FnZSkgPSBmaW5kX3VuaXF1ZV9wYWNrYWdlKCZtb2RpZmllZF9wYXJzZWRfZmxhZ3MpIGVsc2UgewogICAgICAgICBiYWlsISgibm8gcGFyc2VkIGZsYWdzLCBvciB0aGUgcGFyc2VkIGZsYWdzIHVzZSBkaWZmZXJlbnQgcGFja2FnZXMiKTsKICAgICB9OwogICAgIGxldCBwYWNrYWdlID0gcGFja2FnZS50b19zdHJpbmcoKTsKLSAgICBsZXQgX2ZsYWdfaWRzID0gYXNzaWduX2ZsYWdfaWRzKCZwYWNrYWdlLCBtb2RpZmllZF9wYXJzZWRfZmxhZ3MuaXRlcigpKT87Ci0gICAgZ2VuZXJhdGVfamF2YV9jb2RlKCZwYWNrYWdlLCBtb2RpZmllZF9wYXJzZWRfZmxhZ3MuaW50b19pdGVyKCksIGNvZGVnZW5fbW9kZSkKKyAgICBsZXQgZmxhZ19pZHMgPSBhc3NpZ25fZmxhZ19pZHMoJnBhY2thZ2UsIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pdGVyKCkpPzsKKyAgICBnZW5lcmF0ZV9qYXZhX2NvZGUoCisgICAgICAgICZwYWNrYWdlLAorICAgICAgICBtb2RpZmllZF9wYXJzZWRfZmxhZ3MuaW50b19pdGVyKCksCisgICAgICAgIGNvZGVnZW5fbW9kZSwKKyAgICAgICAgZmxhZ19pZHMsCisgICAgICAgIGFsbG93X2luc3RydW1lbnRhdGlvbiwKKyAgICApCiB9CiAKIHB1YiBmbiBjcmVhdGVfY3BwX2xpYigKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvbWFpbi5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvbWFpbi5ycwppbmRleCA3MmJlMWM5Li43ZWMyNzJmIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL21haW4ucnMKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9tYWluLnJzCkBAIC03Miw2ICs3MiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLmxvbmcoIm1vZGUiKQogICAgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlX3BhcnNlcihFbnVtVmFsdWVQYXJzZXI6OjxDb2RlZ2VuTW9kZT46Om5ldygpKQogICAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHRfdmFsdWUoInByb2R1Y3Rpb24iKSwKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgLmFyZygKKyAgICAgICAgICAgICAgICAgICAgQXJnOjpuZXcoImFsbG93LWluc3RydW1lbnRhdGlvbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAubG9uZygiYWxsb3ctaW5zdHJ1bWVudGF0aW9uIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZV9wYXJzZXIoY2xhcDo6dmFsdWVfcGFyc2VyIShib29sKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0X3ZhbHVlKCJmYWxzZSIpLAogICAgICAgICAgICAgICAgICksCiAgICAgICAgICkKICAgICAgICAgLnN1YmNvbW1hbmQoCkBAIC0yMzcsOCArMjQzLDEwIEBACiAgICAgICAgIFNvbWUoKCJjcmVhdGUtamF2YS1saWIiLCBzdWJfbWF0Y2hlcykpID0+IHsKICAgICAgICAgICAgIGxldCBjYWNoZSA9IG9wZW5fc2luZ2xlX2ZpbGUoc3ViX21hdGNoZXMsICJjYWNoZSIpPzsKICAgICAgICAgICAgIGxldCBtb2RlID0gZ2V0X3JlcXVpcmVkX2FyZzo6PENvZGVnZW5Nb2RlPihzdWJfbWF0Y2hlcywgIm1vZGUiKT87Ci0gICAgICAgICAgICBsZXQgZ2VuZXJhdGVkX2ZpbGVzID0KLSAgICAgICAgICAgICAgICBjb21tYW5kczo6Y3JlYXRlX2phdmFfbGliKGNhY2hlLCAqbW9kZSkuY29udGV4dCgiZmFpbGVkIHRvIGNyZWF0ZSBqYXZhIGxpYiIpPzsKKyAgICAgICAgICAgIGxldCBhbGxvd19pbnN0cnVtZW50YXRpb24gPQorICAgICAgICAgICAgICAgIGdldF9yZXF1aXJlZF9hcmc6Ojxib29sPihzdWJfbWF0Y2hlcywgImFsbG93LWluc3RydW1lbnRhdGlvbiIpPzsKKyAgICAgICAgICAgIGxldCBnZW5lcmF0ZWRfZmlsZXMgPSBjb21tYW5kczo6Y3JlYXRlX2phdmFfbGliKGNhY2hlLCAqbW9kZSwgKmFsbG93X2luc3RydW1lbnRhdGlvbikKKyAgICAgICAgICAgICAgICAuY29udGV4dCgiZmFpbGVkIHRvIGNyZWF0ZSBqYXZhIGxpYiIpPzsKICAgICAgICAgICAgIGxldCBkaXIgPSBQYXRoQnVmOjpmcm9tKGdldF9yZXF1aXJlZF9hcmc6OjxTdHJpbmc+KHN1Yl9tYXRjaGVzLCAib3V0Iik/KTsKICAgICAgICAgICAgIGdlbmVyYXRlZF9maWxlcwogICAgICAgICAgICAgICAgIC5pdGVyKCkKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZW1wbGF0ZXMvRmVhdHVyZUZsYWdzSW1wbC5qYXZhLnRlbXBsYXRlIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9GZWF0dXJlRmxhZ3NJbXBsLmphdmEudGVtcGxhdGUKaW5kZXggNjIzNWU2OS4uY2QyZTNkYiAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9GZWF0dXJlRmxhZ3NJbXBsLmphdmEudGVtcGxhdGUKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9GZWF0dXJlRmxhZ3NJbXBsLmphdmEudGVtcGxhdGUKQEAgLTEsMTMgKzEsMjMgQEAKIHBhY2thZ2Uge3BhY2thZ2VfbmFtZX07Cit7eyAtaWYgbm90IGlzX3Rlc3RfbW9kZSB9fQoge3sgaWYgbm90IGxpYnJhcnlfZXhwb3J0ZWQtIH19CiAvLyBUT0RPKGIvMzAzNzczMDU1KTogUmVtb3ZlIHRoZSBhbm5vdGF0aW9uIGFmdGVyIGFjY2VzcyBpc3N1ZSBpcyByZXNvbHZlZC4KIGltcG9ydCBhbmRyb2lkLmNvbXBhdC5hbm5vdGF0aW9uLlVuc3VwcG9ydGVkQXBwVXNhZ2U7CiB7eyAtZW5kaWYgfX0KLXt7IC1pZiBub3QgaXNfdGVzdF9tb2RlIH19CisKIHt7IC1pZiBydW50aW1lX2xvb2t1cF9yZXF1aXJlZCB9fQogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuRGV2aWNlQ29uZmlnOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuRGV2aWNlQ29uZmlnLlByb3BlcnRpZXM7Ci17eyBlbmRpZiB9fQorCisKK3t7IC1pZiBhbGxvd19pbnN0cnVtZW50YXRpb24gfX0KK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5TdG9yYWdlSW50ZXJuYWxSZWFkZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK3t7IC1lbmRpZiB9fQorCit7eyAtZW5kaWYgfX0KIC8qKiBAaGlkZSAqLwogcHVibGljIGZpbmFsIGNsYXNzIEZlYXR1cmVGbGFnc0ltcGwgaW1wbGVtZW50cyBGZWF0dXJlRmxhZ3MgXHsKIHt7IC1pZiBydW50aW1lX2xvb2t1cF9yZXF1aXJlZCB9fQpAQCAtMjAsMTQgKzMwLDQ3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB7ZmxhZy5tZXRob2RfbmFtZX0gPSB7ZmxhZy5kZWZhdWx0X3ZhbHVlfTsKIHt7IC1lbmRpZiB9fQoge3sgLWVuZGZvciB9fQore3sgLWlmIGFsbG93X2luc3RydW1lbnRhdGlvbiB9fQorICAgIFN0b3JhZ2VJbnRlcm5hbFJlYWRlciByZWFkZXI7CisgICAgYm9vbGVhbiByZWFkRnJvbU5ld1N0b3JhZ2U7CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHID0gIkFjb25maWdKYXZhQ29kZWdlbiI7CisKKyAgICBwdWJsaWMgRmVhdHVyZUZsYWdzSW1wbCgpIFx7CisgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKCIvbWV0YWRhdGEvYWNvbmZpZ190ZXN0X21pc3Npb25zL21pc3Npb25fMSIpOworICAgICAgICBpZiAoZmlsZS5leGlzdHMoKSkgXHsKKyAgICAgICAgICAgIHJlYWRGcm9tTmV3U3RvcmFnZSA9IHRydWU7CisgICAgICAgICAgICByZWFkZXIgPSBuZXcgU3RvcmFnZUludGVybmFsUmVhZGVyKCJ7Y29udGFpbmVyfSIsICJ7cGFja2FnZV9uYW1lfSIpOworICAgICAgICB9CisgICAgfQore3sgLWVuZGlmIH19CiB7eyBmb3IgbmFtZXNwYWNlX3dpdGhfZmxhZ3MgaW4gbmFtZXNwYWNlX2ZsYWdzIH19CiAgICAgcHJpdmF0ZSB2b2lkIGxvYWRfb3ZlcnJpZGVzX3tuYW1lc3BhY2Vfd2l0aF9mbGFncy5uYW1lc3BhY2V9KCkgXHsKICAgICAgICAgdHJ5IFx7Cit7eyAtaWYgYWxsb3dfaW5zdHJ1bWVudGF0aW9uIH19CisgICAgICAgICAgICBib29sZWFuIHZhbDsKK3t7IC1lbmRpZiB9fQogICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gRGV2aWNlQ29uZmlnLmdldFByb3BlcnRpZXMoIntuYW1lc3BhY2Vfd2l0aF9mbGFncy5uYW1lc3BhY2V9Iik7CiB7eyAtZm9yIGZsYWcgaW4gbmFtZXNwYWNlX3dpdGhfZmxhZ3MuZmxhZ3MgfX0KIHt7IC1pZiBmbGFnLmlzX3JlYWRfd3JpdGUgfX0KICAgICAgICAgICAgIHtmbGFnLm1ldGhvZF9uYW1lfSA9Ci0gICAgICAgICAgICAgICAgcHJvcGVydGllcy5nZXRCb29sZWFuKCJ7ZmxhZy5kZXZpY2VfY29uZmlnX2ZsYWd9Iiwge2ZsYWcuZGVmYXVsdF92YWx1ZX0pOworICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuZ2V0Qm9vbGVhbihGbGFncy5GTEFHX3tmbGFnLmZsYWdfbmFtZV9jb25zdGFudF9zdWZmaXh9LCB7ZmxhZy5kZWZhdWx0X3ZhbHVlfSk7Cit7eyAtaWYgYWxsb3dfaW5zdHJ1bWVudGF0aW9uIH19CisgICAgICAgICAgICBpZiAocmVhZEZyb21OZXdTdG9yYWdlKSBceworICAgICAgICAgICAgICAgIHRyeSBceworICAgICAgICAgICAgICAgICAgICB2YWwgPSByZWFkZXIuZ2V0Qm9vbGVhbkZsYWdWYWx1ZSh7ZmxhZy5mbGFnX29mZnNldH0pOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsID09IHtmbGFnLm1ldGhvZF9uYW1lfSkgXHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgInN1Y2Nlc3M6IHtmbGFnLm1ldGhvZF9uYW1lfSB2YWx1ZSBtYXRjaGVzIik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBceworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvcjoge2ZsYWcubWV0aG9kX25hbWV9IHZhbHVlIG1pc21hdGNoLCBuZXcgc3RvcmFnZSB2YWx1ZSBpcyAlcywgb2xkIHN0b3JhZ2UgdmFsdWUgaXMgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCwge2ZsYWcubWV0aG9kX25hbWV9KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgXHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCJlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyB2YWx1ZSBvZiB7ZmxhZy5tZXRob2RfbmFtZX0iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9Cit7eyAtZW5kaWYgfX0KIHt7IC1lbmRpZiB9fQoge3sgLWVuZGZvciB9fQogICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSBcewpAQCAtNzAsNyArMTEzLDYgQEAKICAgICBAT3ZlcnJpZGUKIHt7IC1pZiBub3QgbGlicmFyeV9leHBvcnRlZCB9fQogICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKLSAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQoge3sgLWVuZGlmIH19CiAgICAgcHVibGljIGJvb2xlYW4ge2ZsYWcubWV0aG9kX25hbWV9KCkgXHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKApkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9BbmRyb2lkLmJwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9BbmRyb2lkLmJwCmluZGV4IDJjNzcxZTAuLjJkOTQzZGUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19kZXZpY2VfcGF0aHMvQW5kcm9pZC5icAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL0FuZHJvaWQuYnAKQEAgLTQyLDEwICs0MiwxMSBAQAogICAgIHNyY3M6IFsic3JjL0RldmljZVBhdGhzVGVtcGxhdGUuamF2YSJdLAogICAgIG91dDogWyJEZXZpY2VQYXRocy5qYXZhIl0sCiAgICAgdG9vbF9maWxlczogWyJwYXJ0aXRpb25fYWNvbmZpZ19mbGFnc19wYXRocy50eHQiXSwKLSAgICBjbWQ6ICJzZWQgLWUgJy9URU1QTEFURS97ciQobG9jYXRpb24gcGFydGl0aW9uX2Fjb25maWdfZmxhZ3NfcGF0aHMudHh0KScgLWUgJ2R9JyAkKGluKSA+ICQob3V0KSIKKyAgICBjbWQ6ICJzZWQgLWUgJy9URU1QTEFURS97ciQobG9jYXRpb24gcGFydGl0aW9uX2Fjb25maWdfZmxhZ3NfcGF0aHMudHh0KScgLWUgJ2R9JyAkKGluKSA+ICQob3V0KSIsCiB9CiAKIGphdmFfbGlicmFyeSB7CiAgICAgbmFtZTogImFjb25maWdfZGV2aWNlX3BhdGhzX2phdmEiLAogICAgIHNyY3M6IFsiOmxpYmFjb25maWdfamF2YV9kZXZpY2VfcGF0aHNfc3JjIl0sCisgICAgc2RrX3ZlcnNpb246ICJjb3JlX2N1cnJlbnQiLAogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9zcmMvRGV2aWNlUGF0aHNUZW1wbGF0ZS5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9zcmMvRGV2aWNlUGF0aHNUZW1wbGF0ZS5qYXZhCmluZGV4IGYyN2I5YmQuLjE2MzU1YTMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19kZXZpY2VfcGF0aHMvc3JjL0RldmljZVBhdGhzVGVtcGxhdGUuamF2YQorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL3NyYy9EZXZpY2VQYXRoc1RlbXBsYXRlLmphdmEKQEAgLTM2LDcgKzM2LDcgQEAKICAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGFsbCBvbi1kZXZpY2UgYWNvbmZpZyBwcm90b3MgcGF0aHMuCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IHBhcnNlZEZsYWdzUHJvdG9QYXRocygpIHsKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBwYXJzZWRGbGFnc1Byb3RvUGF0aHMoKSB7CiAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHBhdGhzID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KFBBVEhTKSk7CiAKICAgICAgICAgRmlsZSBhcGV4RGlyZWN0b3J5ID0gbmV3IEZpbGUoQVBFWF9ESVIpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9BbmRyb2lkLmJwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9BbmRyb2lkLmJwCmluZGV4IGUwNjZlMzEuLjM4NTkxOTQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvQW5kcm9pZC5icAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL0FuZHJvaWQuYnAKQEAgLTEzNywzICsxMzcsMTIgQEAKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCiAgICAgZG91YmxlX2xvYWRhYmxlOiB0cnVlLAogfQorCisvLyBzdG9yYWdlIGZpbGUgcGFyc2UgYXBpIGphdmEgY2NfbGlicmFyeQoramF2YV9saWJyYXJ5IHsKKyAgICBuYW1lOiAiYWNvbmZpZ19zdG9yYWdlX2ZpbGVfamF2YSIsCisgICAgc3JjczogWworICAgICAgICAic3Jjcy8qKi8qLmphdmEiLAorICAgIF0sCisgICAgc2RrX3ZlcnNpb246ICJjb3JlX2N1cnJlbnQiLAorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnlfcHJvdG8vQW5kcm9pZC5icCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9BY29uZmlnU3RvcmFnZUV4Y2VwdGlvbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNjIlCmNvcHkgZnJvbSB0b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5X3Byb3RvL0FuZHJvaWQuYnAKY29weSB0byB0b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24uamF2YQppbmRleCA3MGYxNWNkLi44NmE3NWYyIDEwMDY0NAotLS0gYS90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5X3Byb3RvL0FuZHJvaWQuYnAKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0Fjb25maWdTdG9yYWdlRXhjZXB0aW9uLmphdmEKQEAgLTE0LDIwICsxNCwxNCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSB7Ci0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbIkFuZHJvaWQtQXBhY2hlLTIuMCJdLAotfQorcGFja2FnZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZTsKIAotY2NfbGlicmFyeV9ob3N0X3N0YXRpYyB7Ci0gICAgbmFtZTogImlkZV9xdWVyeV9wcm90byIsCi0gICAgc3JjczogWwotICAgICAgICAiaWRlX3F1ZXJ5LnByb3RvIiwKLSAgICBdLAotICAgIHByb3RvOiB7Ci0gICAgICAgIGV4cG9ydF9wcm90b19oZWFkZXJzOiB0cnVlLAotICAgICAgICB0eXBlOiAiZnVsbCIsCi0gICAgICAgIGNhbm9uaWNhbF9wYXRoX2Zyb21fcm9vdDogZmFsc2UsCi0gICAgfSwKLSAgICBjb21waWxlX211bHRpbGliOiAiNjQiLAotICAgIHNoYXJlZF9saWJzOiBbImxpYnByb3RvYnVmLWNwcC1mdWxsIl0sCitwdWJsaWMgY2xhc3MgQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24oU3RyaW5nIG1zZykgeworICAgICAgICBzdXBlcihtc2cpOworICAgIH0KKworICAgIHB1YmxpYyBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgc3VwZXIobXNnLCBjYXVzZSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0J5dGVCdWZmZXJSZWFkZXIuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9CeXRlQnVmZmVyUmVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM3MjM2NAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9CeXRlQnVmZmVyUmVhZGVyLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2U7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CisKK3B1YmxpYyBjbGFzcyBCeXRlQnVmZmVyUmVhZGVyIHsKKworICAgIHByaXZhdGUgQnl0ZUJ1ZmZlciBtQnl0ZUJ1ZmZlcjsKKworICAgIHB1YmxpYyBCeXRlQnVmZmVyUmVhZGVyKEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlcikgeworICAgICAgICB0aGlzLm1CeXRlQnVmZmVyID0gYnl0ZUJ1ZmZlcjsKKyAgICAgICAgdGhpcy5tQnl0ZUJ1ZmZlci5vcmRlcihCeXRlT3JkZXIuTElUVExFX0VORElBTik7CisgICAgfQorCisgICAgcHVibGljIGludCByZWFkQnl0ZSgpIHsKKyAgICAgICAgcmV0dXJuIEJ5dGUudG9VbnNpZ25lZEludChtQnl0ZUJ1ZmZlci5nZXQoKSk7CisgICAgfQorCisgICAgcHVibGljIGludCByZWFkU2hvcnQoKSB7CisgICAgICAgIHJldHVybiBTaG9ydC50b1Vuc2lnbmVkSW50KG1CeXRlQnVmZmVyLmdldFNob3J0KCkpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgcmVhZEludCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubUJ5dGVCdWZmZXIuZ2V0SW50KCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyByZWFkU3RyaW5nKCkgeworICAgICAgICBpbnQgbGVuZ3RoID0gcmVhZEludCgpOworICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtsZW5ndGhdOworICAgICAgICBtQnl0ZUJ1ZmZlci5nZXQoYnl0ZXMsIDAsIGxlbmd0aCk7CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ5dGVzLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwb3NpdGlvbihpbnQgbmV3UG9zaXRpb24pIHsKKyAgICAgICAgbUJ5dGVCdWZmZXIucG9zaXRpb24obmV3UG9zaXRpb24pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9GaWxlVHlwZS5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0ZpbGVUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBiMWI5YgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9GaWxlVHlwZS5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlOworCitwdWJsaWMgZW51bSBGaWxlVHlwZSB7CisgICAgUEFDS0FHRV9NQVAoMCksCisgICAgRkxBR19NQVAoMSksCisgICAgRkxBR19WQUwoMiksCisgICAgRkxBR19JTkZPKDMpOworCisgICAgcHVibGljIGZpbmFsIGludCB0eXBlOworCisgICAgRmlsZVR5cGUoaW50IHR5cGUpIHsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEZpbGVUeXBlIGZyb21JbnQoaW50IGluZGV4KSB7CisgICAgICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICByZXR1cm4gUEFDS0FHRV9NQVA7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZMQUdfTUFQOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIHJldHVybiBGTEFHX1ZBTDsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICByZXR1cm4gRkxBR19JTkZPOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9GbGFnVGFibGUuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9GbGFnVGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODVmZGVlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0ZsYWdUYWJsZS5qYXZhCkBAIC0wLDAgKzEsMTc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZTsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKKworcHVibGljIGNsYXNzIEZsYWdUYWJsZSB7CisKKyAgICBwcml2YXRlIEhlYWRlciBtSGVhZGVyOworICAgIHByaXZhdGUgTWFwPFN0cmluZywgTm9kZT4gbU5vZGVNYXA7CisKKyAgICBwdWJsaWMgc3RhdGljIEZsYWdUYWJsZSBmcm9tQnl0ZXMoQnl0ZUJ1ZmZlciBieXRlcykgeworICAgICAgICBGbGFnVGFibGUgZmxhZ1RhYmxlID0gbmV3IEZsYWdUYWJsZSgpOworICAgICAgICBCeXRlQnVmZmVyUmVhZGVyIHJlYWRlciA9IG5ldyBCeXRlQnVmZmVyUmVhZGVyKGJ5dGVzKTsKKyAgICAgICAgSGVhZGVyIGhlYWRlciA9IEhlYWRlci5mcm9tQnl0ZXMocmVhZGVyKTsKKyAgICAgICAgZmxhZ1RhYmxlLm1IZWFkZXIgPSBoZWFkZXI7CisgICAgICAgIGZsYWdUYWJsZS5tTm9kZU1hcCA9IG5ldyBIYXNoTWFwKFRhYmxlVXRpbHMuZ2V0VGFibGVTaXplKGhlYWRlci5tTnVtRmxhZ3MpKTsKKyAgICAgICAgcmVhZGVyLnBvc2l0aW9uKGhlYWRlci5tTm9kZU9mZnNldCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVhZGVyLm1OdW1GbGFnczsgaSsrKSB7CisgICAgICAgICAgICBOb2RlIG5vZGUgPSBOb2RlLmZyb21CeXRlcyhyZWFkZXIpOworICAgICAgICAgICAgZmxhZ1RhYmxlLm1Ob2RlTWFwLnB1dChtYWtlS2V5KG5vZGUubVBhY2thZ2VJZCwgbm9kZS5tRmxhZ05hbWUpLCBub2RlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmxhZ1RhYmxlOworICAgIH0KKworICAgIHB1YmxpYyBOb2RlIGdldChpbnQgcGFja2FnZUlkLCBTdHJpbmcgZmxhZ05hbWUpIHsKKyAgICAgICAgcmV0dXJuIG1Ob2RlTWFwLmdldChtYWtlS2V5KHBhY2thZ2VJZCwgZmxhZ05hbWUpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSGVhZGVyIGdldEhlYWRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1IZWFkZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1ha2VLZXkoaW50IHBhY2thZ2VJZCwgU3RyaW5nIGZsYWdOYW1lKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgcmV0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgcmV0dXJuIHJldC5hcHBlbmQocGFja2FnZUlkKS5hcHBlbmQoJy8nKS5hcHBlbmQoZmxhZ05hbWUpLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIZWFkZXIgeworCisgICAgICAgIHByaXZhdGUgaW50IG1WZXJzaW9uOworICAgICAgICBwcml2YXRlIFN0cmluZyBtQ29udGFpbmVyOworICAgICAgICBwcml2YXRlIEZpbGVUeXBlIG1GaWxlVHlwZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUZpbGVTaXplOworICAgICAgICBwcml2YXRlIGludCBtTnVtRmxhZ3M7CisgICAgICAgIHByaXZhdGUgaW50IG1CdWNrZXRPZmZzZXQ7CisgICAgICAgIHByaXZhdGUgaW50IG1Ob2RlT2Zmc2V0OworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgSGVhZGVyIGZyb21CeXRlcyhCeXRlQnVmZmVyUmVhZGVyIHJlYWRlcikgeworICAgICAgICAgICAgSGVhZGVyIGhlYWRlciA9IG5ldyBIZWFkZXIoKTsKKyAgICAgICAgICAgIGhlYWRlci5tVmVyc2lvbiA9IHJlYWRlci5yZWFkSW50KCk7CisgICAgICAgICAgICBoZWFkZXIubUNvbnRhaW5lciA9IHJlYWRlci5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBoZWFkZXIubUZpbGVUeXBlID0gRmlsZVR5cGUuZnJvbUludChyZWFkZXIucmVhZEJ5dGUoKSk7CisgICAgICAgICAgICBoZWFkZXIubUZpbGVTaXplID0gcmVhZGVyLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGhlYWRlci5tTnVtRmxhZ3MgPSByZWFkZXIucmVhZEludCgpOworICAgICAgICAgICAgaGVhZGVyLm1CdWNrZXRPZmZzZXQgPSByZWFkZXIucmVhZEludCgpOworICAgICAgICAgICAgaGVhZGVyLm1Ob2RlT2Zmc2V0ID0gcmVhZGVyLnJlYWRJbnQoKTsKKworICAgICAgICAgICAgaWYgKGhlYWRlci5tRmlsZVR5cGUgIT0gRmlsZVR5cGUuRkxBR19NQVApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24oImJpbmFyeSBmaWxlIGlzIG5vdCBhIGZsYWcgbWFwIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBoZWFkZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldFZlcnNpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gbVZlcnNpb247CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRhaW5lcigpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ29udGFpbmVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEZpbGVUeXBlIGdldEZpbGVUeXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1GaWxlVHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0RmlsZVNpemUoKSB7CisgICAgICAgICAgICByZXR1cm4gbUZpbGVTaXplOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXROdW1GbGFncygpIHsKKyAgICAgICAgICAgIHJldHVybiBtTnVtRmxhZ3M7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldEJ1Y2tldE9mZnNldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQnVja2V0T2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXROb2RlT2Zmc2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1Ob2RlT2Zmc2V0OworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOb2RlIHsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBtRmxhZ05hbWU7CisgICAgICAgIHByaXZhdGUgRmxhZ1R5cGUgbUZsYWdUeXBlOworICAgICAgICBwcml2YXRlIGludCBtUGFja2FnZUlkOworICAgICAgICBwcml2YXRlIGludCBtRmxhZ0luZGV4OworICAgICAgICBwcml2YXRlIGludCBtTmV4dE9mZnNldDsKKworICAgICAgICBwdWJsaWMgc3RhdGljIE5vZGUgZnJvbUJ5dGVzKEJ5dGVCdWZmZXJSZWFkZXIgcmVhZGVyKSB7CisgICAgICAgICAgICBOb2RlIG5vZGUgPSBuZXcgTm9kZSgpOworICAgICAgICAgICAgbm9kZS5tUGFja2FnZUlkID0gcmVhZGVyLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIG5vZGUubUZsYWdOYW1lID0gcmVhZGVyLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIG5vZGUubUZsYWdUeXBlID0gRmxhZ1R5cGUuZnJvbUludChyZWFkZXIucmVhZFNob3J0KCkpOworICAgICAgICAgICAgbm9kZS5tRmxhZ0luZGV4ID0gcmVhZGVyLnJlYWRTaG9ydCgpOworICAgICAgICAgICAgbm9kZS5tTmV4dE9mZnNldCA9IHJlYWRlci5yZWFkSW50KCk7CisgICAgICAgICAgICBub2RlLm1OZXh0T2Zmc2V0ID0gbm9kZS5tTmV4dE9mZnNldCA9PSAwID8gLTEgOiBub2RlLm1OZXh0T2Zmc2V0OworICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBPYmplY3RzLmhhc2gobUZsYWdOYW1lLCBtRmxhZ1R5cGUsIG1QYWNrYWdlSWQsIG1GbGFnSW5kZXgsIG1OZXh0T2Zmc2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgaWYgKHRoaXMgPT0gb2JqKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCAhKG9iaiBpbnN0YW5jZW9mIE5vZGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBOb2RlIG90aGVyID0gKE5vZGUpIG9iajsKKyAgICAgICAgICAgIHJldHVybiBPYmplY3RzLmVxdWFscyhtRmxhZ05hbWUsIG90aGVyLm1GbGFnTmFtZSkKKyAgICAgICAgICAgICAgICAgICAgJiYgT2JqZWN0cy5lcXVhbHMobUZsYWdUeXBlLCBvdGhlci5tRmxhZ1R5cGUpCisgICAgICAgICAgICAgICAgICAgICYmIG1QYWNrYWdlSWQgPT0gb3RoZXIubVBhY2thZ2VJZAorICAgICAgICAgICAgICAgICAgICAmJiBtRmxhZ0luZGV4ID09IG90aGVyLm1GbGFnSW5kZXgKKyAgICAgICAgICAgICAgICAgICAgJiYgbU5leHRPZmZzZXQgPT0gb3RoZXIubU5leHRPZmZzZXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEZsYWdOYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG1GbGFnTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBGbGFnVHlwZSBnZXRGbGFnVHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRmxhZ1R5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldFBhY2thZ2VJZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtUGFja2FnZUlkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRGbGFnSW5kZXgoKSB7CisgICAgICAgICAgICByZXR1cm4gbUZsYWdJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0TmV4dE9mZnNldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTmV4dE9mZnNldDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9GbGFnVHlwZS5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0ZsYWdUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg1ZTJkOQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9GbGFnVHlwZS5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlOworCitwdWJsaWMgZW51bSBGbGFnVHlwZSB7CisgICAgUmVhZFdyaXRlQm9vbGVhbiAoMCksCisgICAgUmVhZE9ubHlCb29sZWFuKDEpLAorICAgIEZpeGVkUmVhZE9ubHlCb29sZWFuKDIpOworCisgICAgcHVibGljIGZpbmFsIGludCB0eXBlOworCisgICAgRmxhZ1R5cGUoaW50IHR5cGUpIHsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEZsYWdUeXBlIGZyb21JbnQoaW50IGluZGV4KSB7CisgICAgICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVhZFdyaXRlQm9vbGVhbjsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVhZE9ubHlCb29sZWFuOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIHJldHVybiBGaXhlZFJlYWRPbmx5Qm9vbGVhbjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvRmxhZ1ZhbHVlTGlzdC5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0ZsYWdWYWx1ZUxpc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGRjMTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0ZsYWdWYWx1ZUxpc3QuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2U7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBGbGFnVmFsdWVMaXN0IHsKKworICAgIHByaXZhdGUgSGVhZGVyIG1IZWFkZXI7CisgICAgcHJpdmF0ZSBMaXN0PEJvb2xlYW4+IG1MaXN0OworCisgICAgcHJpdmF0ZSBpbnQgbVNpemU7CisKKyAgICBwdWJsaWMgc3RhdGljIEZsYWdWYWx1ZUxpc3QgZnJvbUJ5dGVzKEJ5dGVCdWZmZXIgYnl0ZXMpIHsKKyAgICAgICAgRmxhZ1ZhbHVlTGlzdCBmbGFnVmFsdWVMaXN0ID0gbmV3IEZsYWdWYWx1ZUxpc3QoKTsKKyAgICAgICAgQnl0ZUJ1ZmZlclJlYWRlciByZWFkZXIgPSBuZXcgQnl0ZUJ1ZmZlclJlYWRlcihieXRlcyk7CisgICAgICAgIEhlYWRlciBoZWFkZXIgPSBIZWFkZXIuZnJvbUJ5dGVzKHJlYWRlcik7CisgICAgICAgIGZsYWdWYWx1ZUxpc3QubUhlYWRlciA9IGhlYWRlcjsKKyAgICAgICAgZmxhZ1ZhbHVlTGlzdC5tTGlzdCA9IG5ldyBBcnJheUxpc3QoaGVhZGVyLm1OdW1GbGFncyk7CisgICAgICAgIHJlYWRlci5wb3NpdGlvbihoZWFkZXIubUJvb2xlYW5WYWx1ZU9mZnNldCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVhZGVyLm1OdW1GbGFnczsgaSsrKSB7CisgICAgICAgICAgICBib29sZWFuIHZhbCA9IHJlYWRlci5yZWFkQnl0ZSgpID09IDE7CisgICAgICAgICAgICBmbGFnVmFsdWVMaXN0Lm1MaXN0LmFkZCh2YWwpOworICAgICAgICB9CisgICAgICAgIGZsYWdWYWx1ZUxpc3QubVNpemUgPSBmbGFnVmFsdWVMaXN0Lm1MaXN0LnNpemUoKTsKKyAgICAgICAgcmV0dXJuIGZsYWdWYWx1ZUxpc3Q7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0KGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gbUxpc3QuZ2V0KGluZGV4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgSGVhZGVyIGdldEhlYWRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1IZWFkZXI7CisgICAgfQorCisgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICByZXR1cm4gbVNpemU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIZWFkZXIgeworCisgICAgICAgIHByaXZhdGUgaW50IG1WZXJzaW9uOworICAgICAgICBwcml2YXRlIFN0cmluZyBtQ29udGFpbmVyOworICAgICAgICBwcml2YXRlIEZpbGVUeXBlIG1GaWxlVHlwZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUZpbGVTaXplOworICAgICAgICBwcml2YXRlIGludCBtTnVtRmxhZ3M7CisgICAgICAgIHByaXZhdGUgaW50IG1Cb29sZWFuVmFsdWVPZmZzZXQ7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBIZWFkZXIgZnJvbUJ5dGVzKEJ5dGVCdWZmZXJSZWFkZXIgcmVhZGVyKSB7CisgICAgICAgICAgICBIZWFkZXIgaGVhZGVyID0gbmV3IEhlYWRlcigpOworICAgICAgICAgICAgaGVhZGVyLm1WZXJzaW9uID0gcmVhZGVyLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGhlYWRlci5tQ29udGFpbmVyID0gcmVhZGVyLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIGhlYWRlci5tRmlsZVR5cGUgPSBGaWxlVHlwZS5mcm9tSW50KHJlYWRlci5yZWFkQnl0ZSgpKTsKKyAgICAgICAgICAgIGhlYWRlci5tRmlsZVNpemUgPSByZWFkZXIucmVhZEludCgpOworICAgICAgICAgICAgaGVhZGVyLm1OdW1GbGFncyA9IHJlYWRlci5yZWFkSW50KCk7CisgICAgICAgICAgICBoZWFkZXIubUJvb2xlYW5WYWx1ZU9mZnNldCA9IHJlYWRlci5yZWFkSW50KCk7CisKKyAgICAgICAgICAgIGlmIChoZWFkZXIubUZpbGVUeXBlICE9IEZpbGVUeXBlLkZMQUdfVkFMKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFjb25maWdTdG9yYWdlRXhjZXB0aW9uKCJiaW5hcnkgZmlsZSBpcyBub3QgYSBmbGFnIHZhbHVlIGZpbGUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGhlYWRlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0VmVyc2lvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBtVmVyc2lvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGFpbmVyKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Db250YWluZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRmlsZVR5cGUgZ2V0RmlsZVR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbUZpbGVUeXBlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRGaWxlU2l6ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRmlsZVNpemU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldE51bUZsYWdzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1OdW1GbGFnczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Qm9vbGVhblZhbHVlT2Zmc2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1Cb29sZWFuVmFsdWVPZmZzZXQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvUGFja2FnZVRhYmxlLmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvUGFja2FnZVRhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA0ZTFhYwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9QYWNrYWdlVGFibGUuamF2YQpAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2U7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CisKK3B1YmxpYyBjbGFzcyBQYWNrYWdlVGFibGUgeworCisgICAgcHJpdmF0ZSBIZWFkZXIgbUhlYWRlcjsKKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE5vZGU+IG1Ob2RlTWFwOworCisgICAgcHVibGljIHN0YXRpYyBQYWNrYWdlVGFibGUgZnJvbUJ5dGVzKEJ5dGVCdWZmZXIgYnl0ZXMpIHsKKyAgICAgICAgUGFja2FnZVRhYmxlIHBhY2thZ2VUYWJsZSA9IG5ldyBQYWNrYWdlVGFibGUoKTsKKyAgICAgICAgQnl0ZUJ1ZmZlclJlYWRlciByZWFkZXIgPSBuZXcgQnl0ZUJ1ZmZlclJlYWRlcihieXRlcyk7CisgICAgICAgIEhlYWRlciBoZWFkZXIgPSBIZWFkZXIuZnJvbUJ5dGVzKHJlYWRlcik7CisgICAgICAgIHBhY2thZ2VUYWJsZS5tSGVhZGVyID0gaGVhZGVyOworICAgICAgICBwYWNrYWdlVGFibGUubU5vZGVNYXAgPSBuZXcgSGFzaE1hcChUYWJsZVV0aWxzLmdldFRhYmxlU2l6ZShoZWFkZXIubU51bVBhY2thZ2VzKSk7CisgICAgICAgIHJlYWRlci5wb3NpdGlvbihoZWFkZXIubU5vZGVPZmZzZXQpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhlYWRlci5tTnVtUGFja2FnZXM7IGkrKykgeworICAgICAgICAgICAgTm9kZSBub2RlID0gTm9kZS5mcm9tQnl0ZXMocmVhZGVyKTsKKyAgICAgICAgICAgIHBhY2thZ2VUYWJsZS5tTm9kZU1hcC5wdXQobm9kZS5tUGFja2FnZU5hbWUsIG5vZGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYWNrYWdlVGFibGU7CisgICAgfQorCisgICAgcHVibGljIE5vZGUgZ2V0KFN0cmluZyBwYWNrYWdlTmFtZSkgeworICAgICAgICByZXR1cm4gbU5vZGVNYXAuZ2V0KHBhY2thZ2VOYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSGVhZGVyIGdldEhlYWRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1IZWFkZXI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIZWFkZXIgeworCisgICAgICAgIHByaXZhdGUgaW50IG1WZXJzaW9uOworICAgICAgICBwcml2YXRlIFN0cmluZyBtQ29udGFpbmVyOworICAgICAgICBwcml2YXRlIEZpbGVUeXBlIG1GaWxlVHlwZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUZpbGVTaXplOworICAgICAgICBwcml2YXRlIGludCBtTnVtUGFja2FnZXM7CisgICAgICAgIHByaXZhdGUgaW50IG1CdWNrZXRPZmZzZXQ7CisgICAgICAgIHByaXZhdGUgaW50IG1Ob2RlT2Zmc2V0OworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgSGVhZGVyIGZyb21CeXRlcyhCeXRlQnVmZmVyUmVhZGVyIHJlYWRlcikgeworICAgICAgICAgICAgSGVhZGVyIGhlYWRlciA9IG5ldyBIZWFkZXIoKTsKKyAgICAgICAgICAgIGhlYWRlci5tVmVyc2lvbiA9IHJlYWRlci5yZWFkSW50KCk7CisgICAgICAgICAgICBoZWFkZXIubUNvbnRhaW5lciA9IHJlYWRlci5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBoZWFkZXIubUZpbGVUeXBlID0gRmlsZVR5cGUuZnJvbUludChyZWFkZXIucmVhZEJ5dGUoKSk7CisgICAgICAgICAgICBoZWFkZXIubUZpbGVTaXplID0gcmVhZGVyLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGhlYWRlci5tTnVtUGFja2FnZXMgPSByZWFkZXIucmVhZEludCgpOworICAgICAgICAgICAgaGVhZGVyLm1CdWNrZXRPZmZzZXQgPSByZWFkZXIucmVhZEludCgpOworICAgICAgICAgICAgaGVhZGVyLm1Ob2RlT2Zmc2V0ID0gcmVhZGVyLnJlYWRJbnQoKTsKKworICAgICAgICAgICAgaWYgKGhlYWRlci5tRmlsZVR5cGUgIT0gRmlsZVR5cGUuUEFDS0FHRV9NQVApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24oImJpbmFyeSBmaWxlIGlzIG5vdCBhIHBhY2thZ2UgbWFwIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBoZWFkZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldFZlcnNpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gbVZlcnNpb247CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRhaW5lcigpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ29udGFpbmVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEZpbGVUeXBlIGdldEZpbGVUeXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1GaWxlVHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0RmlsZVNpemUoKSB7CisgICAgICAgICAgICByZXR1cm4gbUZpbGVTaXplOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXROdW1QYWNrYWdlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBtTnVtUGFja2FnZXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldEJ1Y2tldE9mZnNldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQnVja2V0T2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXROb2RlT2Zmc2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1Ob2RlT2Zmc2V0OworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOb2RlIHsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBtUGFja2FnZU5hbWU7CisgICAgICAgIHByaXZhdGUgaW50IG1QYWNrYWdlSWQ7CisgICAgICAgIHByaXZhdGUgaW50IG1Cb29sZWFuU3RhcnRJbmRleDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbU5leHRPZmZzZXQ7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBOb2RlIGZyb21CeXRlcyhCeXRlQnVmZmVyUmVhZGVyIHJlYWRlcikgeworICAgICAgICAgICAgTm9kZSBub2RlID0gbmV3IE5vZGUoKTsKKyAgICAgICAgICAgIG5vZGUubVBhY2thZ2VOYW1lID0gcmVhZGVyLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIG5vZGUubVBhY2thZ2VJZCA9IHJlYWRlci5yZWFkSW50KCk7CisgICAgICAgICAgICBub2RlLm1Cb29sZWFuU3RhcnRJbmRleCA9IHJlYWRlci5yZWFkSW50KCk7CisgICAgICAgICAgICBub2RlLm1OZXh0T2Zmc2V0ID0gcmVhZGVyLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIG5vZGUubU5leHRPZmZzZXQgPSBub2RlLm1OZXh0T2Zmc2V0ID09IDAgPyAtMSA6IG5vZGUubU5leHRPZmZzZXQ7CisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgcmV0dXJuIE9iamVjdHMuaGFzaChtUGFja2FnZU5hbWUsIG1QYWNrYWdlSWQsIG1Cb29sZWFuU3RhcnRJbmRleCwgbU5leHRPZmZzZXQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgICAgICBpZiAodGhpcyA9PSBvYmopIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsIHx8ICEob2JqIGluc3RhbmNlb2YgTm9kZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE5vZGUgb3RoZXIgPSAoTm9kZSkgb2JqOworICAgICAgICAgICAgcmV0dXJuIE9iamVjdHMuZXF1YWxzKG1QYWNrYWdlTmFtZSwgb3RoZXIubVBhY2thZ2VOYW1lKQorICAgICAgICAgICAgICAgICAgICAmJiBtUGFja2FnZUlkID09IG90aGVyLm1QYWNrYWdlSWQKKyAgICAgICAgICAgICAgICAgICAgJiYgbUJvb2xlYW5TdGFydEluZGV4ID09IG90aGVyLm1Cb29sZWFuU3RhcnRJbmRleAorICAgICAgICAgICAgICAgICAgICAmJiBtTmV4dE9mZnNldCA9PSBvdGhlci5tTmV4dE9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbVBhY2thZ2VOYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRQYWNrYWdlSWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbVBhY2thZ2VJZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Qm9vbGVhblN0YXJ0SW5kZXgoKSB7CisgICAgICAgICAgICByZXR1cm4gbUJvb2xlYW5TdGFydEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXROZXh0T2Zmc2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1OZXh0T2Zmc2V0OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL1RhYmxlVXRpbHMuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9UYWJsZVV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE0YjUzYgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9UYWJsZVV0aWxzLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2U7CisKK3B1YmxpYyBjbGFzcyBUYWJsZVV0aWxzIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIEhBU0hfUFJJTUVTID0KKyAgICAgICAgICAgIG5ldyBpbnRbXSB7CisgICAgICAgICAgICAgICAgNywKKyAgICAgICAgICAgICAgICAxNywKKyAgICAgICAgICAgICAgICAyOSwKKyAgICAgICAgICAgICAgICA1MywKKyAgICAgICAgICAgICAgICA5NywKKyAgICAgICAgICAgICAgICAxOTMsCisgICAgICAgICAgICAgICAgMzg5LAorICAgICAgICAgICAgICAgIDc2OSwKKyAgICAgICAgICAgICAgICAxNTQzLAorICAgICAgICAgICAgICAgIDMwNzksCisgICAgICAgICAgICAgICAgNjE1MSwKKyAgICAgICAgICAgICAgICAxMjI4OSwKKyAgICAgICAgICAgICAgICAyNDU5MywKKyAgICAgICAgICAgICAgICA0OTE1NywKKyAgICAgICAgICAgICAgICA5ODMxNywKKyAgICAgICAgICAgICAgICAxOTY2MTMsCisgICAgICAgICAgICAgICAgMzkzMjQxLAorICAgICAgICAgICAgICAgIDc4NjQzMywKKyAgICAgICAgICAgICAgICAxNTcyODY5LAorICAgICAgICAgICAgICAgIDMxNDU3MzksCisgICAgICAgICAgICAgICAgNjI5MTQ2OSwKKyAgICAgICAgICAgICAgICAxMjU4MjkxNywKKyAgICAgICAgICAgICAgICAyNTE2NTg0MywKKyAgICAgICAgICAgICAgICA1MDMzMTY1MywKKyAgICAgICAgICAgICAgICAxMDA2NjMzMTksCisgICAgICAgICAgICAgICAgMjAxMzI2NjExLAorICAgICAgICAgICAgICAgIDQwMjY1MzE4OSwKKyAgICAgICAgICAgICAgICA4MDUzMDY0NTcsCisgICAgICAgICAgICAgICAgMTYxMDYxMjc0MQorICAgICAgICAgICAgfTsKKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFRhYmxlU2l6ZShpbnQgbnVtRW50cmllcykgeworICAgICAgICBmb3IgKGludCBpIDogSEFTSF9QUklNRVMpIHsKKyAgICAgICAgICAgIGlmIChpIDwgMiAqIG51bUVudHJpZXMpIGNvbnRpbnVlOworICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IEFjb25maWdTdG9yYWdlRXhjZXB0aW9uKCJOdW1iZXIgb2YgaXRlbXMgaW4gYSBoYXNoIHRhYmxlIGV4Y2VlZHMgbGltaXQiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL0FuZHJvaWQuYnAgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggMjZiNzgwMC4uYzMzMTI3ZiAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvQW5kcm9pZC5icApAQCAtMSw0ICsxLDMgQEAKLQogY2NfdGVzdCB7CiAgICAgbmFtZTogImFjb25maWdfc3RvcmFnZV9maWxlLnRlc3QuY3BwIiwKICAgICB0ZWFtOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9jb3JlX2V4cGVyaW1lbnRzIiwKQEAgLTIxLDMgKzIwLDI3IEBACiAgICAgICAgICJnZW5lcmFsLXRlc3RzIiwKICAgICBdLAogfQorCithbmRyb2lkX3Rlc3QgeworICAgIG5hbWU6ICJhY29uZmlnX3N0b3JhZ2VfZmlsZS50ZXN0LmphdmEiLAorICAgIHRlYW06ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX2NvcmVfZXhwZXJpbWVudHMiLAorICAgIHNyY3M6IFsKKyAgICAgICAgInNyY3MvKiovKi5qYXZhIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhY29uZmlnX3N0b3JhZ2VfZmlsZV9qYXZhIiwKKyAgICAgICAgImFuZHJvaWR4LnRlc3QucnVubmVyIiwKKyAgICAgICAgImp1bml0IiwKKyAgICBdLAorICAgIHNka192ZXJzaW9uOiAidGVzdF9jdXJyZW50IiwKKyAgICB0ZXN0X2NvbmZpZzogIkFuZHJvaWRTdG9yYWdlSmF2ZVRlc3QueG1sIiwKKyAgICBkYXRhOiBbCisgICAgICAgICJwYWNrYWdlLm1hcCIsCisgICAgICAgICJmbGFnLm1hcCIsCisgICAgICAgICJmbGFnLnZhbCIsCisgICAgICAgICJmbGFnLmluZm8iLAorICAgIF0sCisgICAgdGVzdF9zdWl0ZXM6IFsKKyAgICAgICAgImdlbmVyYWwtdGVzdHMiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUwMTg3OQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDI3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICB+IENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgIH4KKyAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIH4KKyAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICB+CisgIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0Ij4KKyAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorICAgIDwvYXBwbGljYXRpb24+CisKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0IiAvPgorCis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9BbmRyb2lkU3RvcmFnZUphdmVUZXN0LnhtbCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvQW5kcm9pZFN0b3JhZ2VKYXZlVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ1MmQ0NAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvQW5kcm9pZFN0b3JhZ2VKYXZlVGVzdC54bWwKQEAgLTAsMCArMSwzMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgfiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICB+CisgIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICB+CisgIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgfgorICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iVGVzdCBhY29uZmlnIHN0b3JhZ2UgamF2YSB0ZXN0cyI+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9ImFjb25maWdfc3RvcmFnZV9maWxlLnRlc3QuamF2YS5hcGsiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5GaWxlUHVzaGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0icGFja2FnZS5tYXAtPi9kYXRhL2xvY2FsL3RtcC9hY29uZmlnX3N0b3JhZ2VfZmlsZV90ZXN0X2phdmEvdGVzdGRhdGEvcGFja2FnZS5tYXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9ImZsYWcubWFwLT4vZGF0YS9sb2NhbC90bXAvYWNvbmZpZ19zdG9yYWdlX2ZpbGVfdGVzdF9qYXZhL3Rlc3RkYXRhL2ZsYWcubWFwIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJmbGFnLnZhbC0+L2RhdGEvbG9jYWwvdG1wL2Fjb25maWdfc3RvcmFnZV9maWxlX3Rlc3RfamF2YS90ZXN0ZGF0YS9mbGFnLnZhbCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iZmxhZy5pbmZvLT4vZGF0YS9sb2NhbC90bXAvYWNvbmZpZ19zdG9yYWdlX2ZpbGVfdGVzdF9qYXZhL3Rlc3RkYXRhL2ZsYWcuaW5mbyIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuQW5kcm9pZEpVbml0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9InBhY2thZ2UiIHZhbHVlPSJhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjFtIiAvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL3NyY3MvQnl0ZUJ1ZmZlclJlYWRlclRlc3QuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9CeXRlQnVmZmVyUmVhZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YTgxNjYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL3NyY3MvQnl0ZUJ1ZmZlclJlYWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuQnl0ZUJ1ZmZlclJlYWRlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5KVW5pdDQ7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CisKK0BSdW5XaXRoKEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBCeXRlQnVmZmVyUmVhZGVyVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkQnl0ZSgpIHsKKyAgICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDEpOworICAgICAgICBieXRlIGV4cGVjdCA9IDEwOworICAgICAgICBidWZmZXIucHV0KGV4cGVjdCkucmV3aW5kKCk7CisKKyAgICAgICAgQnl0ZUJ1ZmZlclJlYWRlciByZWFkZXIgPSBuZXcgQnl0ZUJ1ZmZlclJlYWRlcihidWZmZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0LCByZWFkZXIucmVhZEJ5dGUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZFNob3J0KCkgeworICAgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoNCk7CisgICAgICAgIGJ1ZmZlci5vcmRlcihCeXRlT3JkZXIuTElUVExFX0VORElBTik7CisgICAgICAgIHNob3J0IGV4cGVjdCA9IFNob3J0Lk1BWF9WQUxVRTsKKyAgICAgICAgYnVmZmVyLnB1dFNob3J0KGV4cGVjdCkucmV3aW5kKCk7CisKKyAgICAgICAgQnl0ZUJ1ZmZlclJlYWRlciByZWFkZXIgPSBuZXcgQnl0ZUJ1ZmZlclJlYWRlcihidWZmZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0LCByZWFkZXIucmVhZFNob3J0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRJbnQoKSB7CisgICAgICAgIEJ5dGVCdWZmZXIgYnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSg0KTsKKyAgICAgICAgYnVmZmVyLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsKKyAgICAgICAgaW50IGV4cGVjdCA9IDEwMDAwOworICAgICAgICBidWZmZXIucHV0SW50KGV4cGVjdCkucmV3aW5kKCk7CisKKyAgICAgICAgQnl0ZUJ1ZmZlclJlYWRlciByZWFkZXIgPSBuZXcgQnl0ZUJ1ZmZlclJlYWRlcihidWZmZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0LCByZWFkZXIucmVhZEludCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkU3RyaW5nKCkgeworICAgICAgICBTdHJpbmcgZXhwZWN0ID0gInRlc3QgcmVhZCBzdHJpbmciOworICAgICAgICBieXRlW10gYnl0ZXMgPSBleHBlY3QuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisKKyAgICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKGV4cGVjdC5sZW5ndGgoKSAqIDIgKyA0KTsKKyAgICAgICAgYnVmZmVyLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsKKyAgICAgICAgYnVmZmVyLnB1dEludChleHBlY3QubGVuZ3RoKCkpLnB1dChieXRlcykucmV3aW5kKCk7CisKKyAgICAgICAgQnl0ZUJ1ZmZlclJlYWRlciByZWFkZXIgPSBuZXcgQnl0ZUJ1ZmZlclJlYWRlcihidWZmZXIpOworCisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3QsIHJlYWRlci5yZWFkU3RyaW5nKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9GbGFnVGFibGVUZXN0LmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL3NyY3MvRmxhZ1RhYmxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNDBkNGMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL3NyY3MvRmxhZ1RhYmxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuRmlsZVR5cGU7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuRmxhZ1RhYmxlOworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZsYWdUeXBlOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKKworQFJ1bldpdGgoSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIEZsYWdUYWJsZVRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmxhZ1RhYmxlX3JpZ2h0SGVhZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEZsYWdUYWJsZSBmbGFnVGFibGUgPSBGbGFnVGFibGUuZnJvbUJ5dGVzKFRlc3REYXRhVXRpbHMuZ2V0VGVzdEZsYWdNYXBCeXRlQnVmZmVyKCkpOworICAgICAgICBGbGFnVGFibGUuSGVhZGVyIGhlYWRlciA9IGZsYWdUYWJsZS5nZXRIZWFkZXIoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGhlYWRlci5nZXRWZXJzaW9uKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm1vY2t1cCIsIGhlYWRlci5nZXRDb250YWluZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhGaWxlVHlwZS5GTEFHX01BUCwgaGVhZGVyLmdldEZpbGVUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMzIxLCBoZWFkZXIuZ2V0RmlsZVNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg4LCBoZWFkZXIuZ2V0TnVtRmxhZ3MoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzMSwgaGVhZGVyLmdldEJ1Y2tldE9mZnNldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDk5LCBoZWFkZXIuZ2V0Tm9kZU9mZnNldCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGbGFnVGFibGVfcmlnaHROb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEZsYWdUYWJsZSBmbGFnVGFibGUgPSBGbGFnVGFibGUuZnJvbUJ5dGVzKFRlc3REYXRhVXRpbHMuZ2V0VGVzdEZsYWdNYXBCeXRlQnVmZmVyKCkpOworCisgICAgICAgIEZsYWdUYWJsZS5Ob2RlIG5vZGUxID0gZmxhZ1RhYmxlLmdldCgwLCAiZW5hYmxlZF9ybyIpOworICAgICAgICBGbGFnVGFibGUuTm9kZSBub2RlMiA9IGZsYWdUYWJsZS5nZXQoMCwgImVuYWJsZWRfcnciKTsKKyAgICAgICAgRmxhZ1RhYmxlLk5vZGUgbm9kZTMgPSBmbGFnVGFibGUuZ2V0KDIsICJlbmFibGVkX3J3Iik7CisgICAgICAgIEZsYWdUYWJsZS5Ob2RlIG5vZGU0ID0gZmxhZ1RhYmxlLmdldCgxLCAiZGlzYWJsZWRfcnciKTsKKyAgICAgICAgRmxhZ1RhYmxlLk5vZGUgbm9kZTUgPSBmbGFnVGFibGUuZ2V0KDEsICJlbmFibGVkX2ZpeGVkX3JvIik7CisgICAgICAgIEZsYWdUYWJsZS5Ob2RlIG5vZGU2ID0gZmxhZ1RhYmxlLmdldCgxLCAiZW5hYmxlZF9ybyIpOworICAgICAgICBGbGFnVGFibGUuTm9kZSBub2RlNyA9IGZsYWdUYWJsZS5nZXQoMiwgImVuYWJsZWRfZml4ZWRfcm8iKTsKKyAgICAgICAgRmxhZ1RhYmxlLk5vZGUgbm9kZTggPSBmbGFnVGFibGUuZ2V0KDAsICJkaXNhYmxlZF9ydyIpOworCisgICAgICAgIGFzc2VydEVxdWFscygiZW5hYmxlZF9ybyIsIG5vZGUxLmdldEZsYWdOYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImVuYWJsZWRfcnciLCBub2RlMi5nZXRGbGFnTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJlbmFibGVkX3J3Iiwgbm9kZTMuZ2V0RmxhZ05hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZGlzYWJsZWRfcnciLCBub2RlNC5nZXRGbGFnTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJlbmFibGVkX2ZpeGVkX3JvIiwgbm9kZTUuZ2V0RmxhZ05hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZW5hYmxlZF9ybyIsIG5vZGU2LmdldEZsYWdOYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImVuYWJsZWRfZml4ZWRfcm8iLCBub2RlNy5nZXRGbGFnTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkaXNhYmxlZF9ydyIsIG5vZGU4LmdldEZsYWdOYW1lKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygwLCBub2RlMS5nZXRQYWNrYWdlSWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBub2RlMi5nZXRQYWNrYWdlSWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBub2RlMy5nZXRQYWNrYWdlSWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBub2RlNC5nZXRQYWNrYWdlSWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBub2RlNS5nZXRQYWNrYWdlSWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBub2RlNi5nZXRQYWNrYWdlSWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBub2RlNy5nZXRQYWNrYWdlSWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBub2RlOC5nZXRQYWNrYWdlSWQoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEZsYWdUeXBlLlJlYWRPbmx5Qm9vbGVhbiwgbm9kZTEuZ2V0RmxhZ1R5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhGbGFnVHlwZS5SZWFkV3JpdGVCb29sZWFuLCBub2RlMi5nZXRGbGFnVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEZsYWdUeXBlLlJlYWRXcml0ZUJvb2xlYW4sIG5vZGUzLmdldEZsYWdUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoRmxhZ1R5cGUuUmVhZFdyaXRlQm9vbGVhbiwgbm9kZTQuZ2V0RmxhZ1R5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhGbGFnVHlwZS5GaXhlZFJlYWRPbmx5Qm9vbGVhbiwgbm9kZTUuZ2V0RmxhZ1R5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhGbGFnVHlwZS5SZWFkT25seUJvb2xlYW4sIG5vZGU2LmdldEZsYWdUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoRmxhZ1R5cGUuRml4ZWRSZWFkT25seUJvb2xlYW4sIG5vZGU3LmdldEZsYWdUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoRmxhZ1R5cGUuUmVhZFdyaXRlQm9vbGVhbiwgbm9kZTguZ2V0RmxhZ1R5cGUoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5vZGUxLmdldEZsYWdJbmRleCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG5vZGUyLmdldEZsYWdJbmRleCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5vZGUzLmdldEZsYWdJbmRleCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG5vZGU0LmdldEZsYWdJbmRleCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5vZGU1LmdldEZsYWdJbmRleCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG5vZGU2LmdldEZsYWdJbmRleCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG5vZGU3LmdldEZsYWdJbmRleCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG5vZGU4LmdldEZsYWdJbmRleCgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIG5vZGUxLmdldE5leHRPZmZzZXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxNTEsIG5vZGUyLmdldE5leHRPZmZzZXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgbm9kZTMuZ2V0TmV4dE9mZnNldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBub2RlNC5nZXROZXh0T2Zmc2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjM2LCBub2RlNS5nZXROZXh0T2Zmc2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIG5vZGU2LmdldE5leHRPZmZzZXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgbm9kZTcuZ2V0TmV4dE9mZnNldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBub2RlOC5nZXROZXh0T2Zmc2V0KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9GbGFnVmFsdWVMaXN0VGVzdC5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL0ZsYWdWYWx1ZUxpc3RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE4NTkwYQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9GbGFnVmFsdWVMaXN0VGVzdC5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZpbGVUeXBlOworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZsYWdUYWJsZTsKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5GbGFnVmFsdWVMaXN0OworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLlBhY2thZ2VUYWJsZTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5KVW5pdDQ7CisKK0BSdW5XaXRoKEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBGbGFnVmFsdWVMaXN0VGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGbGFnVmFsdWVMaXN0X3JpZ2h0SGVhZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEZsYWdWYWx1ZUxpc3QgZmxhZ1ZhbHVlTGlzdCA9CisgICAgICAgICAgICAgICAgRmxhZ1ZhbHVlTGlzdC5mcm9tQnl0ZXMoVGVzdERhdGFVdGlscy5nZXRUZXN0RmxhZ1ZhbEJ5dGVCdWZmZXIoKSk7CisgICAgICAgIEZsYWdWYWx1ZUxpc3QuSGVhZGVyIGhlYWRlciA9IGZsYWdWYWx1ZUxpc3QuZ2V0SGVhZGVyKCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBoZWFkZXIuZ2V0VmVyc2lvbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtb2NrdXAiLCBoZWFkZXIuZ2V0Q29udGFpbmVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoRmlsZVR5cGUuRkxBR19WQUwsIGhlYWRlci5nZXRGaWxlVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDM1LCBoZWFkZXIuZ2V0RmlsZVNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg4LCBoZWFkZXIuZ2V0TnVtRmxhZ3MoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyNywgaGVhZGVyLmdldEJvb2xlYW5WYWx1ZU9mZnNldCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGbGFnVmFsdWVMaXN0X3JpZ2h0Tm9kZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBGbGFnVmFsdWVMaXN0IGZsYWdWYWx1ZUxpc3QgPQorICAgICAgICAgICAgICAgIEZsYWdWYWx1ZUxpc3QuZnJvbUJ5dGVzKFRlc3REYXRhVXRpbHMuZ2V0VGVzdEZsYWdWYWxCeXRlQnVmZmVyKCkpOworCisgICAgICAgIGJvb2xlYW5bXSBleHBlY3RlZCA9IG5ldyBib29sZWFuW10ge2ZhbHNlLCB0cnVlLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZX07CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGZsYWdWYWx1ZUxpc3Quc2l6ZSgpKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZsYWdWYWx1ZUxpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFtpXSwgZmxhZ1ZhbHVlTGlzdC5nZXQoaSkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmxhZ1ZhbHVlTGlzdF9nZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBQYWNrYWdlVGFibGUgcGFja2FnZVRhYmxlID0KKyAgICAgICAgICAgICAgICBQYWNrYWdlVGFibGUuZnJvbUJ5dGVzKFRlc3REYXRhVXRpbHMuZ2V0VGVzdFBhY2thZ2VNYXBCeXRlQnVmZmVyKCkpOworICAgICAgICBGbGFnVGFibGUgZmxhZ1RhYmxlID0gRmxhZ1RhYmxlLmZyb21CeXRlcyhUZXN0RGF0YVV0aWxzLmdldFRlc3RGbGFnTWFwQnl0ZUJ1ZmZlcigpKTsKKworICAgICAgICBGbGFnVmFsdWVMaXN0IGZsYWdWYWx1ZUxpc3QgPQorICAgICAgICAgICAgICAgIEZsYWdWYWx1ZUxpc3QuZnJvbUJ5dGVzKFRlc3REYXRhVXRpbHMuZ2V0VGVzdEZsYWdWYWxCeXRlQnVmZmVyKCkpOworCisgICAgICAgIFBhY2thZ2VUYWJsZS5Ob2RlIHBOb2RlID0gcGFja2FnZVRhYmxlLmdldCgiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIpOworICAgICAgICBGbGFnVGFibGUuTm9kZSBmTm9kZSA9IGZsYWdUYWJsZS5nZXQocE5vZGUuZ2V0UGFja2FnZUlkKCksICJlbmFibGVkX3J3Iik7CisgICAgICAgIGFzc2VydFRydWUoZmxhZ1ZhbHVlTGlzdC5nZXQocE5vZGUuZ2V0Qm9vbGVhblN0YXJ0SW5kZXgoKSArIGZOb2RlLmdldEZsYWdJbmRleCgpKSk7CisKKyAgICAgICAgcE5vZGUgPSBwYWNrYWdlVGFibGUuZ2V0KCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80Iik7CisgICAgICAgIGZOb2RlID0gZmxhZ1RhYmxlLmdldChwTm9kZS5nZXRQYWNrYWdlSWQoKSwgImVuYWJsZWRfZml4ZWRfcm8iKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShmbGFnVmFsdWVMaXN0LmdldChwTm9kZS5nZXRCb29sZWFuU3RhcnRJbmRleCgpICsgZk5vZGUuZ2V0RmxhZ0luZGV4KCkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL3NyY3MvUGFja2FnZVRhYmxlVGVzdC5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL1BhY2thZ2VUYWJsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2UxOWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL1BhY2thZ2VUYWJsZVRlc3QuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuRmlsZVR5cGU7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuUGFja2FnZVRhYmxlOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKKworQFJ1bldpdGgoSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIFBhY2thZ2VUYWJsZVRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFja2FnZVRhYmxlX3JpZ2h0SGVhZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFBhY2thZ2VUYWJsZSBwYWNrYWdlVGFibGUgPQorICAgICAgICAgICAgICAgIFBhY2thZ2VUYWJsZS5mcm9tQnl0ZXMoVGVzdERhdGFVdGlscy5nZXRUZXN0UGFja2FnZU1hcEJ5dGVCdWZmZXIoKSk7CisgICAgICAgIFBhY2thZ2VUYWJsZS5IZWFkZXIgaGVhZGVyID0gcGFja2FnZVRhYmxlLmdldEhlYWRlcigpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaGVhZGVyLmdldFZlcnNpb24oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibW9ja3VwIiwgaGVhZGVyLmdldENvbnRhaW5lcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEZpbGVUeXBlLlBBQ0tBR0VfTUFQLCBoZWFkZXIuZ2V0RmlsZVR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDksIGhlYWRlci5nZXRGaWxlU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGhlYWRlci5nZXROdW1QYWNrYWdlcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMxLCBoZWFkZXIuZ2V0QnVja2V0T2Zmc2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNTksIGhlYWRlci5nZXROb2RlT2Zmc2V0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhY2thZ2VUYWJsZV9yaWdodE5vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUGFja2FnZVRhYmxlIHBhY2thZ2VUYWJsZSA9CisgICAgICAgICAgICAgICAgUGFja2FnZVRhYmxlLmZyb21CeXRlcyhUZXN0RGF0YVV0aWxzLmdldFRlc3RQYWNrYWdlTWFwQnl0ZUJ1ZmZlcigpKTsKKworICAgICAgICBQYWNrYWdlVGFibGUuTm9kZSBub2RlMSA9IHBhY2thZ2VUYWJsZS5nZXQoImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiKTsKKyAgICAgICAgUGFja2FnZVRhYmxlLk5vZGUgbm9kZTIgPSBwYWNrYWdlVGFibGUuZ2V0KCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIik7CisgICAgICAgIFBhY2thZ2VUYWJsZS5Ob2RlIG5vZGU0ID0gcGFja2FnZVRhYmxlLmdldCgiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfNCIpOworCisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIsIG5vZGUxLmdldFBhY2thZ2VOYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiLCBub2RlMi5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80Iiwgbm9kZTQuZ2V0UGFja2FnZU5hbWUoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG5vZGUxLmdldFBhY2thZ2VJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5vZGUyLmdldFBhY2thZ2VJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG5vZGU0LmdldFBhY2thZ2VJZCgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbm9kZTEuZ2V0Qm9vbGVhblN0YXJ0SW5kZXgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBub2RlMi5nZXRCb29sZWFuU3RhcnRJbmRleCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDYsIG5vZGU0LmdldEJvb2xlYW5TdGFydEluZGV4KCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygxNTksIG5vZGUxLmdldE5leHRPZmZzZXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgbm9kZTIuZ2V0TmV4dE9mZnNldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBub2RlNC5nZXROZXh0T2Zmc2V0KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9UZXN0RGF0YVV0aWxzLmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL3NyY3MvVGVzdERhdGFVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNTk1MmQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL3NyY3MvVGVzdERhdGFVdGlscy5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBUZXN0RGF0YVV0aWxzIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QQUNLQUdFX01BUF9QQVRIID0gInBhY2thZ2UubWFwIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9GTEFHX01BUF9QQVRIID0gImZsYWcubWFwIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9GTEFHX1ZBTF9QQVRIID0gImZsYWcudmFsIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9GTEFHX0lORk9fUEFUSCA9ICJmbGFnLmluZm8iOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1REQVRBX1BBVEggPQorICAgICAgICAgICAgIi9kYXRhL2xvY2FsL3RtcC9hY29uZmlnX3N0b3JhZ2VfZmlsZV90ZXN0X2phdmEvdGVzdGRhdGEvIjsKKworICAgIHB1YmxpYyBzdGF0aWMgQnl0ZUJ1ZmZlciBnZXRUZXN0UGFja2FnZU1hcEJ5dGVCdWZmZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHJlYWRGaWxlKFRFU1REQVRBX1BBVEggKyBURVNUX1BBQ0tBR0VfTUFQX1BBVEgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQnl0ZUJ1ZmZlciBnZXRUZXN0RmxhZ01hcEJ5dGVCdWZmZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHJlYWRGaWxlKFRFU1REQVRBX1BBVEggKyBURVNUX0ZMQUdfTUFQX1BBVEgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQnl0ZUJ1ZmZlciBnZXRUZXN0RmxhZ1ZhbEJ5dGVCdWZmZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHJlYWRGaWxlKFRFU1REQVRBX1BBVEggKyBURVNUX0ZMQUdfVkFMX1BBVEgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQnl0ZUJ1ZmZlciBnZXRUZXN0RmxhZ0luZm9CeXRlQnVmZmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiByZWFkRmlsZShURVNUREFUQV9QQVRIICsgVEVTVF9GTEFHX0lORk9fUEFUSCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQnl0ZUJ1ZmZlciByZWFkRmlsZShTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZU5hbWUpOworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlci53cmFwKGlucHV0LnJlYWRBbGxCeXRlcygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9BbmRyb2lkLmJwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvQW5kcm9pZC5icAppbmRleCA1ZTllYjU0Li5jMmY0YzE4IDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9BbmRyb2lkLmJwCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL0FuZHJvaWQuYnAKQEAgLTE1NCw3ICsxNTQsOSBAQAogamF2YV9saWJyYXJ5IHsKICAgICBuYW1lOiAibGliYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpX2phdmEiLAogICAgIHNyY3M6IFsKLSAgICAgICAgInNyY3MvKiovKi5qYXZhIiwKKyAgICAgICAgInNyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLmphdmEiLAorICAgICAgICAic3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9GbGFnUmVhZENvbnRleHQuamF2YSIsCisgICAgICAgICJzcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL1BhY2thZ2VSZWFkQ29udGV4dC5qYXZhIiwKICAgICBdLAogICAgIHJlcXVpcmVkOiBbImxpYmFjb25maWdfc3RvcmFnZV9yZWFkX2FwaV9ydXN0X2puaSJdLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIlVwc2lkZURvd25DYWtlIiwKQEAgLTE2MywzICsxNjUsMTQgQEAKICAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAogICAgIF0sCiB9CisKK2phdmFfbGlicmFyeSB7CisgICAgbmFtZTogImFjb25maWdfc3RvcmFnZV9yZWFkZXJfamF2YSIsCisgICAgc3JjczogWworICAgICAgICAic3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9TdG9yYWdlSW50ZXJuYWxSZWFkZXIuamF2YSIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYWNvbmZpZ19zdG9yYWdlX2ZpbGVfamF2YSIsCisgICAgXSwKKyAgICBzZGtfdmVyc2lvbjogImNvcmVfY3VycmVudCIsCit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL1N0b3JhZ2VJbnRlcm5hbFJlYWRlci5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9TdG9yYWdlSW50ZXJuYWxSZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjMxMDE3Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9TdG9yYWdlSW50ZXJuYWxSZWFkZXIuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmlvLk1hcHBlZEJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWw7CisKK3B1YmxpYyBjbGFzcyBTdG9yYWdlSW50ZXJuYWxSZWFkZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUF9QQVRIID0gIi9tZXRhZGF0YS9hY29uZmlnL21hcHMvIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9PVF9QQVRIID0gIi9tZXRhZGF0YS9hY29uZmlnL2Jvb3QvIjsKKworICAgIHByaXZhdGUgUGFja2FnZVRhYmxlIG1QYWNrYWdlVGFibGU7CisgICAgcHJpdmF0ZSBGbGFnVmFsdWVMaXN0IG1GbGFnVmFsdWVMaXN0OworCisgICAgcHJpdmF0ZSBpbnQgbVBhY2thZ2VCb29sZWFuU3RhcnRPZmZzZXQ7CisKKyAgICBwdWJsaWMgU3RvcmFnZUludGVybmFsUmVhZGVyKFN0cmluZyBjb250YWluZXIsIFN0cmluZyBwYWNrYWdlTmFtZSkgeworICAgICAgICB0aGlzKHBhY2thZ2VOYW1lLCBNQVBfUEFUSCArIGNvbnRhaW5lciArICIucGFja2FnZS5tYXAiLCBCT09UX1BBVEggKyBjb250YWluZXIgKyAiLnZhbCIpOworICAgIH0KKworICAgIHB1YmxpYyBTdG9yYWdlSW50ZXJuYWxSZWFkZXIoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgcGFja2FnZU1hcEZpbGUsIFN0cmluZyBmbGFnVmFsdWVGaWxlKSB7CisgICAgICAgIG1QYWNrYWdlVGFibGUgPSBQYWNrYWdlVGFibGUuZnJvbUJ5dGVzKG1hcFN0b3JhZ2VGaWxlKHBhY2thZ2VNYXBGaWxlKSk7CisgICAgICAgIG1GbGFnVmFsdWVMaXN0ID0gRmxhZ1ZhbHVlTGlzdC5mcm9tQnl0ZXMobWFwU3RvcmFnZUZpbGUoZmxhZ1ZhbHVlRmlsZSkpOworICAgICAgICBtUGFja2FnZUJvb2xlYW5TdGFydE9mZnNldCA9IGdldFBhY2thZ2VCb29sZWFuU3RhcnRPZmZzZXQocGFja2FnZU5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldEJvb2xlYW5GbGFnVmFsdWUoaW50IGluZGV4KSB7CisgICAgICAgIGluZGV4ICs9IG1QYWNrYWdlQm9vbGVhblN0YXJ0T2Zmc2V0OworICAgICAgICBpZiAoaW5kZXggPj0gbUZsYWdWYWx1ZUxpc3Quc2l6ZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24oIkZhaWwgdG8gZ2V0IGJvb2xlYW4gZmxhZyB2YWx1ZSIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtRmxhZ1ZhbHVlTGlzdC5nZXQoaW5kZXgpOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldFBhY2thZ2VCb29sZWFuU3RhcnRPZmZzZXQoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CisgICAgICAgIFBhY2thZ2VUYWJsZS5Ob2RlIHBOb2RlID0gbVBhY2thZ2VUYWJsZS5nZXQocGFja2FnZU5hbWUpOworICAgICAgICBpZiAocE5vZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgUGFja2FnZVRhYmxlLkhlYWRlciBoZWFkZXIgPSBtUGFja2FnZVRhYmxlLmdldEhlYWRlcigpOworICAgICAgICAgICAgdGhyb3cgbmV3IEFjb25maWdTdG9yYWdlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsIHRvIGdldCBwYWNrYWdlICVzIGZyb20gY29udGFpbmVyICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSwgaGVhZGVyLmdldENvbnRhaW5lcigpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBOb2RlLmdldEJvb2xlYW5TdGFydEluZGV4KCk7CisgICAgfQorCisgICAgLy8gTWFwIGEgc3RvcmFnZSBmaWxlIGdpdmVuIGZpbGUgcGF0aAorICAgIHByaXZhdGUgc3RhdGljIE1hcHBlZEJ5dGVCdWZmZXIgbWFwU3RvcmFnZUZpbGUoU3RyaW5nIGZpbGUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOworICAgICAgICAgICAgRmlsZUNoYW5uZWwgY2hhbm5lbCA9IHN0cmVhbS5nZXRDaGFubmVsKCk7CisgICAgICAgICAgICByZXR1cm4gY2hhbm5lbC5tYXAoRmlsZUNoYW5uZWwuTWFwTW9kZS5SRUFEX09OTFksIDAsIGNoYW5uZWwuc2l6ZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiRmFpbCB0byBtbWFwIHN0b3JhZ2UgZmlsZSAlcyIsIGZpbGUpLCBlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2phdmEvQW5kcm9pZC5icCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2phdmEvQW5kcm9pZC5icAppbmRleCBkOTRiMmI0Li4xMWIzODI0IDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9qYXZhL0FuZHJvaWQuYnAKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvamF2YS9BbmRyb2lkLmJwCkBAIC0xLDcgKzEsOCBAQAogYW5kcm9pZF90ZXN0IHsKICAgICBuYW1lOiAiYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpLnRlc3QuamF2YSIsCi0gICAgc3JjczogWyJBY29uZmlnU3RvcmFnZVJlYWRBUElUZXN0LmphdmEiXSwKKyAgICBzcmNzOiBbIi4vKiovKi5qYXZhIl0sCiAgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFjb25maWdfc3RvcmFnZV9yZWFkZXJfamF2YSIsCiAgICAgICAgICJhbmRyb2lkeC50ZXN0LnJ1bGVzIiwKICAgICAgICAgImxpYmFjb25maWdfc3RvcmFnZV9yZWFkX2FwaV9qYXZhIiwKICAgICAgICAgImp1bml0IiwKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2phdmEvU3RvcmFnZUludGVybmFsUmVhZGVyVGVzdC5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvamF2YS9TdG9yYWdlSW50ZXJuYWxSZWFkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ExYmJhMAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2phdmEvU3RvcmFnZUludGVybmFsUmVhZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuU3RvcmFnZUludGVybmFsUmVhZGVyOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKKworQFJ1bldpdGgoSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIFN0b3JhZ2VJbnRlcm5hbFJlYWRlclRlc3QgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgbVN0b3JhZ2VEaXIgPSAiL2RhdGEvbG9jYWwvdG1wL2Fjb25maWdfamF2YV9hcGlfdGVzdCI7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdG9yYWdlSW50ZXJuYWxSZWFkZXJfZ2V0RmxhZygpIHsKKworICAgICAgICBTdHJpbmcgcGFja2FnZU1hcEZpbGUgPSBtU3RvcmFnZURpciArICIvbWFwcy9tb2NrdXAucGFja2FnZS5tYXAiOworICAgICAgICBTdHJpbmcgZmxhZ1ZhbHVlRmlsZSA9IG1TdG9yYWdlRGlyICsgIi9ib290L21vY2t1cC52YWwiOworCisgICAgICAgIFN0b3JhZ2VJbnRlcm5hbFJlYWRlciByZWFkZXIgPQorICAgICAgICAgICAgICAgIG5ldyBTdG9yYWdlSW50ZXJuYWxSZWFkZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIsIHBhY2thZ2VNYXBGaWxlLCBmbGFnVmFsdWVGaWxlKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocmVhZGVyLmdldEJvb2xlYW5GbGFnVmFsdWUoMCkpOworICAgICAgICBhc3NlcnRUcnVlKHJlYWRlci5nZXRCb29sZWFuRmxhZ1ZhbHVlKDEpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvdGVzdHMvQW5kcm9pZC5icCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IGQ3YWZjMWEuLjU1MDhkYWMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS90ZXN0cy9BbmRyb2lkLmJwCkBAIC0zOCw4ICszOCw3IEBACiAgICAgICAgICJkZXZpY2UtdGVzdHMiLAogICAgICAgICAiZ2VuZXJhbC10ZXN0cyIsCiAgICAgXSwKLSAgICBsZGZsYWdzOiBbIi1XbCwtLWFsbG93LW11bHRpcGxlLWRlZmluaXRpb24iXSwKLSAgICAgICAgZ2VuZXJhdGVkX2hlYWRlcnM6IFsKKyAgICBnZW5lcmF0ZWRfaGVhZGVyczogWwogICAgICAgICAiY3h4LWJyaWRnZS1oZWFkZXIiLAogICAgICAgICAibGliY3h4X2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaV9icmlkZ2VfaGVhZGVyIiwKICAgICBdLApkaWZmIC0tZ2l0IGEvdG9vbHMvY2hlY2stZmxhZ2dlZC1hcGlzL3NyYy9jb20vYW5kcm9pZC9jaGVja2ZsYWdnZWRhcGlzL01haW4ua3QgYi90b29scy9jaGVjay1mbGFnZ2VkLWFwaXMvc3JjL2NvbS9hbmRyb2lkL2NoZWNrZmxhZ2dlZGFwaXMvTWFpbi5rdAppbmRleCAxMTI1ZDM5Li5kMzIzYzIwIDEwMDY0NAotLS0gYS90b29scy9jaGVjay1mbGFnZ2VkLWFwaXMvc3JjL2NvbS9hbmRyb2lkL2NoZWNrZmxhZ2dlZGFwaXMvTWFpbi5rdAorKysgYi90b29scy9jaGVjay1mbGFnZ2VkLWFwaXMvc3JjL2NvbS9hbmRyb2lkL2NoZWNrZmxhZ2dlZGFwaXMvTWFpbi5rdApAQCAtMTksMTAgKzE5LDEwIEBACiAKIGltcG9ydCBhbmRyb2lkLmFjb25maWcuQWNvbmZpZwogaW1wb3J0IGNvbS5hbmRyb2lkLnRvb2xzLm1ldGFsYXZhLm1vZGVsLkJhc2VJdGVtVmlzaXRvcgoraW1wb3J0IGNvbS5hbmRyb2lkLnRvb2xzLm1ldGFsYXZhLm1vZGVsLkNhbGxhYmxlSXRlbQogaW1wb3J0IGNvbS5hbmRyb2lkLnRvb2xzLm1ldGFsYXZhLm1vZGVsLkNsYXNzSXRlbQogaW1wb3J0IGNvbS5hbmRyb2lkLnRvb2xzLm1ldGFsYXZhLm1vZGVsLkZpZWxkSXRlbQogaW1wb3J0IGNvbS5hbmRyb2lkLnRvb2xzLm1ldGFsYXZhLm1vZGVsLkl0ZW0KLWltcG9ydCBjb20uYW5kcm9pZC50b29scy5tZXRhbGF2YS5tb2RlbC5NZXRob2RJdGVtCiBpbXBvcnQgY29tLmFuZHJvaWQudG9vbHMubWV0YWxhdmEubW9kZWwudGV4dC5BcGlGaWxlCiBpbXBvcnQgY29tLmdpdGh1Yi5hamFsdC5jbGlrdC5jb3JlLkNsaWt0Q29tbWFuZAogaW1wb3J0IGNvbS5naXRodWIuYWphbHQuY2xpa3QuY29yZS5Qcm9ncmFtUmVzdWx0CkBAIC0yNzQsMTUgKzI3NCwxNSBAQAogICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIG92ZXJyaWRlIGZ1biB2aXNpdE1ldGhvZChtZXRob2Q6IE1ldGhvZEl0ZW0pIHsKLSAgICAgICAgICBnZXRGbGFnT3JOdWxsKG1ldGhvZCk/LmxldCB7IGZsYWcgLT4KLSAgICAgICAgICAgIHZhbCBtZXRob2ROYW1lID0gYnVpbGRTdHJpbmcgewotICAgICAgICAgICAgICBhcHBlbmQobWV0aG9kLm5hbWUoKSkKKyAgICAgICAgb3ZlcnJpZGUgZnVuIHZpc2l0Q2FsbGFibGUoY2FsbGFibGU6IENhbGxhYmxlSXRlbSkgeworICAgICAgICAgIGdldEZsYWdPck51bGwoY2FsbGFibGUpPy5sZXQgeyBmbGFnIC0+CisgICAgICAgICAgICB2YWwgY2FsbGFibGVTaWduYXR1cmUgPSBidWlsZFN0cmluZyB7CisgICAgICAgICAgICAgIGFwcGVuZChjYWxsYWJsZS5uYW1lKCkpCiAgICAgICAgICAgICAgIGFwcGVuZCgiKCIpCi0gICAgICAgICAgICAgIG1ldGhvZC5wYXJhbWV0ZXJzKCkuam9pblRvKHRoaXMsIHNlcGFyYXRvciA9ICIiKSB7IGl0LnR5cGUoKS5pbnRlcm5hbE5hbWUoKSB9CisgICAgICAgICAgICAgIGNhbGxhYmxlLnBhcmFtZXRlcnMoKS5qb2luVG8odGhpcywgc2VwYXJhdG9yID0gIiIpIHsgaXQudHlwZSgpLmludGVybmFsTmFtZSgpIH0KICAgICAgICAgICAgICAgYXBwZW5kKCIpIikKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhbCBzeW1ib2wgPSBTeW1ib2wuY3JlYXRlTWV0aG9kKG1ldGhvZC5jb250YWluaW5nQ2xhc3MoKS5xdWFsaWZpZWROYW1lKCksIG1ldGhvZE5hbWUpCisgICAgICAgICAgICB2YWwgc3ltYm9sID0gU3ltYm9sLmNyZWF0ZU1ldGhvZChjYWxsYWJsZS5jb250YWluaW5nQ2xhc3MoKS5xdWFsaWZpZWROYW1lKCksIGNhbGxhYmxlU2lnbmF0dXJlKQogICAgICAgICAgICAgb3V0cHV0LmFkZChQYWlyKHN5bWJvbCwgZmxhZykpCiAgICAgICAgICAgfQogICAgICAgICB9CmRpZmYgLS1naXQgYS90b29scy9maWxlbGlzdGRpZmYvQW5kcm9pZC5icCBiL3Rvb2xzL2ZpbGVsaXN0ZGlmZi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMmFkYTMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9maWxlbGlzdGRpZmYvQW5kcm9pZC5icApAQCAtMCwwICsxLDI3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbIkFuZHJvaWQtQXBhY2hlLTIuMCJdLAorfQorCitweXRob25fYmluYXJ5X2hvc3QgeworICAgIG5hbWU6ICJmaWxlX2xpc3RfZGlmZiIsCisgICAgc3JjczogWyJmaWxlX2xpc3RfZGlmZi5weSJdLAorfQorCitwcmVidWlsdF9ldGNfaG9zdCB7CisgICAgbmFtZTogInN5c3RlbV9pbWFnZV9kaWZmX2FsbG93bGlzdCIsCisgICAgc3JjOiAiYWxsb3dsaXN0IiwKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbGVsaXN0ZGlmZi9hbGxvd2xpc3QgYi90b29scy9maWxlbGlzdGRpZmYvYWxsb3dsaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0M2Y5NTUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9maWxlbGlzdGRpZmYvYWxsb3dsaXN0CkBAIC0wLDAgKzEsODcgQEAKKyMgS25vd24gZGlmZnMgb25seSBpbiB0aGUgS0FUSSBzeXN0ZW0gaW1hZ2UKK2V0Yy9OT1RJQ0UueG1sLmd6CitldGMvY29tcGF0Y29uZmlnL1RlbGVTZXJ2aWNlLXBsYXRmb3JtLWNvbXBhdC1jb25maWcueG1sCitldGMvY29tcGF0Y29uZmlnL2NhbGVuZGFyLXByb3ZpZGVyLWNvbXBhdC1jb25maWcueG1sCitldGMvY29tcGF0Y29uZmlnL2NvbnRhY3RzLXByb3ZpZGVyLXBsYXRmb3JtLWNvbXBhdC1jb25maWcueG1sCitldGMvY29tcGF0Y29uZmlnL2RvY3VtZW50cy11aS1jb21wYXQtY29uZmlnLnhtbAorZXRjL2NvbXBhdGNvbmZpZy9mcmFtZXdvcmstbG9jYXRpb24tY29tcGF0LWNvbmZpZy54bWwKK2V0Yy9jb21wYXRjb25maWcvZnJhbWV3b3JrLXBsYXRmb3JtLWNvbXBhdC1jb25maWcueG1sCitldGMvY29tcGF0Y29uZmlnL2ljdTRqLXBsYXRmb3JtLWNvbXBhdC1jb25maWcueG1sCitldGMvY29tcGF0Y29uZmlnL3NlcnZpY2VzLXBsYXRmb3JtLWNvbXBhdC1jb25maWcueG1sCitldGMvcGVybWlzc2lvbnMvYW5kcm9pZC5zb2Z0d2FyZS5jcmVkZW50aWFscy54bWwKK2V0Yy9wZXJtaXNzaW9ucy9hbmRyb2lkLnNvZnR3YXJlLnByZXZpZXdfc2RrLnhtbAorZXRjL3Blcm1pc3Npb25zL2FuZHJvaWQuc29mdHdhcmUud2Vidmlldy54bWwKK2V0Yy9wZXJtaXNzaW9ucy9hbmRyb2lkLnNvZnR3YXJlLndpbmRvd19tYWduaWZpY2F0aW9uLnhtbAorZXRjL3Blcm1pc3Npb25zL2NvbS5hbmRyb2lkLmFkc2VydmljZXMuc2Rrc2FuZGJveC54bWwKK2V0Yy9zZWN1cml0eS9vdGFjZXJ0cy56aXAKK2V0Yy92aW50Zi9jb21wYXRpYmlsaXR5X21hdHJpeC4yMDI0MDQueG1sCitldGMvdmludGYvY29tcGF0aWJpbGl0eV9tYXRyaXguMjAyNTA0LnhtbAorZXRjL3ZpbnRmL2NvbXBhdGliaWxpdHlfbWF0cml4LjUueG1sCitldGMvdmludGYvY29tcGF0aWJpbGl0eV9tYXRyaXguNi54bWwKK2V0Yy92aW50Zi9jb21wYXRpYmlsaXR5X21hdHJpeC43LnhtbAorZXRjL3ZpbnRmL2NvbXBhdGliaWxpdHlfbWF0cml4LjgueG1sCitldGMvdmludGYvY29tcGF0aWJpbGl0eV9tYXRyaXguZGV2aWNlLnhtbAorZXRjL3ZpbnRmL21hbmlmZXN0LnhtbAorZnJhbWV3b3JrL2Jvb3QtYXBhY2hlLXhtbC52ZGV4CitmcmFtZXdvcmsvYm9vdC1hcGFjaGUteG1sLnZkZXguZnN2X21ldGEKK2ZyYW1ld29yay9ib290LWJvdW5jeWNhc3RsZS52ZGV4CitmcmFtZXdvcmsvYm9vdC1ib3VuY3ljYXN0bGUudmRleC5mc3ZfbWV0YQorZnJhbWV3b3JrL2Jvb3QtY29yZS1pY3U0ai52ZGV4CitmcmFtZXdvcmsvYm9vdC1jb3JlLWljdTRqLnZkZXguZnN2X21ldGEKK2ZyYW1ld29yay9ib290LWNvcmUtbGliYXJ0LnZkZXgKK2ZyYW1ld29yay9ib290LWNvcmUtbGliYXJ0LnZkZXguZnN2X21ldGEKK2ZyYW1ld29yay9ib290LWV4dC52ZGV4CitmcmFtZXdvcmsvYm9vdC1leHQudmRleC5mc3ZfbWV0YQorZnJhbWV3b3JrL2Jvb3QtZnJhbWV3b3JrLWFkc2VydmljZXMudmRleAorZnJhbWV3b3JrL2Jvb3QtZnJhbWV3b3JrLWFkc2VydmljZXMudmRleC5mc3ZfbWV0YQorZnJhbWV3b3JrL2Jvb3QtZnJhbWV3b3JrLWdyYXBoaWNzLnZkZXgKK2ZyYW1ld29yay9ib290LWZyYW1ld29yay1ncmFwaGljcy52ZGV4LmZzdl9tZXRhCitmcmFtZXdvcmsvYm9vdC1mcmFtZXdvcmstbG9jYXRpb24udmRleAorZnJhbWV3b3JrL2Jvb3QtZnJhbWV3b3JrLWxvY2F0aW9uLnZkZXguZnN2X21ldGEKK2ZyYW1ld29yay9ib290LWZyYW1ld29yay52ZGV4CitmcmFtZXdvcmsvYm9vdC1mcmFtZXdvcmsudmRleC5mc3ZfbWV0YQorZnJhbWV3b3JrL2Jvb3QtaW1zLWNvbW1vbi52ZGV4CitmcmFtZXdvcmsvYm9vdC1pbXMtY29tbW9uLnZkZXguZnN2X21ldGEKK2ZyYW1ld29yay9ib290LW9raHR0cC52ZGV4CitmcmFtZXdvcmsvYm9vdC1va2h0dHAudmRleC5mc3ZfbWV0YQorZnJhbWV3b3JrL2Jvb3QtdGVsZXBob255LWNvbW1vbi52ZGV4CitmcmFtZXdvcmsvYm9vdC10ZWxlcGhvbnktY29tbW9uLnZkZXguZnN2X21ldGEKK2ZyYW1ld29yay9ib290LXZvaXAtY29tbW9uLnZkZXgKK2ZyYW1ld29yay9ib290LXZvaXAtY29tbW9uLnZkZXguZnN2X21ldGEKK2ZyYW1ld29yay9ib290LnZkZXgKK2ZyYW1ld29yay9ib290LnZkZXguZnN2X21ldGEKK2ZyYW1ld29yay9vYXQveDg2XzY0L2FwZXhAY29tLmFuZHJvaWQuY29tcG9zQGphdmFsaWJAc2VydmljZS1jb21wb3MuamFyQGNsYXNzZXMub2RleAorZnJhbWV3b3JrL29hdC94ODZfNjQvYXBleEBjb20uYW5kcm9pZC5jb21wb3NAamF2YWxpYkBzZXJ2aWNlLWNvbXBvcy5qYXJAY2xhc3Nlcy5vZGV4LmZzdl9tZXRhCitmcmFtZXdvcmsvb2F0L3g4Nl82NC9hcGV4QGNvbS5hbmRyb2lkLmNvbXBvc0BqYXZhbGliQHNlcnZpY2UtY29tcG9zLmphckBjbGFzc2VzLnZkZXgKK2ZyYW1ld29yay9vYXQveDg2XzY0L2FwZXhAY29tLmFuZHJvaWQuY29tcG9zQGphdmFsaWJAc2VydmljZS1jb21wb3MuamFyQGNsYXNzZXMudmRleC5mc3ZfbWV0YQorbGliL2FhdWRpby1haWRsLWNwcC5zbworbGliL2FuZHJvaWQuaGFyZHdhcmUuYmlvbWV0cmljcy5maW5nZXJwcmludEAyLjEuc28KK2xpYi9hbmRyb2lkLmhhcmR3YXJlLnJhZGlvLmNvbmZpZ0AxLjAuc28KK2xpYi9hbmRyb2lkLmhhcmR3YXJlLnJhZGlvLmRlcHJlY2F0ZWRAMS4wLnNvCitsaWIvYW5kcm9pZC5oYXJkd2FyZS5yYWRpb0AxLjAuc28KK2xpYi9hbmRyb2lkLmhhcmR3YXJlLnJhZGlvQDEuMS5zbworbGliL2FuZHJvaWQuaGFyZHdhcmUucmFkaW9AMS4yLnNvCitsaWIvYW5kcm9pZC5oYXJkd2FyZS5yYWRpb0AxLjMuc28KK2xpYi9hbmRyb2lkLmhhcmR3YXJlLnJhZGlvQDEuNC5zbworbGliL2FuZHJvaWQuaGFyZHdhcmUuc2VjdXJlX2VsZW1lbnRAMS4wLnNvCitsaWIvY29tLmFuZHJvaWQubWVkaWEuYWF1ZGlvLWFjb25maWctY2Muc28KK2xpYi9oZWFwcHJvZmRfY2xpZW50LnNvCitsaWIvaGVhcHByb2ZkX2NsaWVudF9hcGkuc28KK2xpYi9saWJhYXVkaW8uc28KK2xpYi9saWJhYXVkaW9faW50ZXJuYWwuc28KK2xpYi9saWJhbGFybV9qbmkuc28KK2xpYi9saWJhbWlkaS5zbworbGliL2xpYmN1cHMuc28KK2xpYi9saWJqbmlfZGV2aWNlQXNXZWJjYW0uc28KK2xpYi9saWJwcmludHNwb29sZXJfam5pLnNvCitsaWIvbGlidmVuZG9yc3VwcG9ydC5zbworbGliL2xpYndmZHMuc28KK2xpYi9saWJ5dXYuc28KKworIyBiLzM1MTI1ODQ2MQorYWRiX2tleXMKK2luaXQuZW52aXJvbi5yYworCisjIEtub3duIGRpZmZzIG9ubHkgaW4gdGhlIFNvb25nIHN5c3RlbSBpbWFnZQorbGliL2xpYmhpZGNvbW1hbmRfam5pLnNvCitsaWIvbGlidWlucHV0Y29tbWFuZF9qbmkuc28KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9maWxlbGlzdGRpZmYvZmlsZV9saXN0X2RpZmYucHkgYi90b29scy9maWxlbGlzdGRpZmYvZmlsZV9saXN0X2RpZmYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RjNWIyZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2ZpbGVsaXN0ZGlmZi9maWxlX2xpc3RfZGlmZi5weQpAQCAtMCwwICsxLDY2IEBACisjIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBzeXMKKworQ09MT1JfV0FSTklORyA9ICdcMDMzWzkzbScKK0NPTE9SX0VSUk9SID0gJ1wwMzNbOTFtJworQ09MT1JfTk9STUFMID0gJ1wwMzNbMG0nCisKK2RlZiBmaW5kX3VuaXF1ZV9pdGVtcyhrYXRpX2luc3RhbGxlZF9maWxlcywgc29vbmdfaW5zdGFsbGVkX2ZpbGVzLCBhbGxvd2xpc3QsIHN5c3RlbV9tb2R1bGVfbmFtZSk6CisgICAgd2l0aCBvcGVuKGthdGlfaW5zdGFsbGVkX2ZpbGVzLCAncicpIGFzIGthdGlfbGlzdF9maWxlLCBcCisgICAgICAgICAgICBvcGVuKHNvb25nX2luc3RhbGxlZF9maWxlcywgJ3InKSBhcyBzb29uZ19saXN0X2ZpbGUsIFwKKyAgICAgICAgICAgIG9wZW4oYWxsb3dsaXN0LCAncicpIGFzIGFsbG93bGlzdF9maWxlOgorICAgICAgICBrYXRpX2ZpbGVzID0gc2V0KGthdGlfbGlzdF9maWxlLnJlYWQoKS5zcGxpdCgpKQorICAgICAgICBzb29uZ19maWxlcyA9IHNldChzb29uZ19saXN0X2ZpbGUucmVhZCgpLnNwbGl0KCkpCisgICAgICAgIGFsbG93ZWRfZmlsZXMgPSBzZXQoZmlsdGVyKGxhbWJkYSB4OiBsZW4oeCksIG1hcChsYW1iZGEgeDogeC5sc3RyaXAoKS5zcGxpdCgnIycsMSlbMF0ucnN0cmlwKCkgLCBhbGxvd2xpc3RfZmlsZS5yZWFkKCkuc3BsaXQoJ1xuJykpKSkKKworICAgIGRlZiBpc191bmtub3duX2RpZmYoZmlsZXBhdGgpOgorICAgICAgICByZXR1cm4gbm90IGZpbGVwYXRoIGluIGFsbG93ZWRfZmlsZXMKKworICAgIHVuaXF1ZV9pbl9rYXRpID0gc2V0KGZpbHRlcihpc191bmtub3duX2RpZmYsIGthdGlfZmlsZXMgLSBzb29uZ19maWxlcykpCisgICAgdW5pcXVlX2luX3Nvb25nID0gc2V0KGZpbHRlcihpc191bmtub3duX2RpZmYsIHNvb25nX2ZpbGVzIC0ga2F0aV9maWxlcykpCisKKyAgICBpZiB1bmlxdWVfaW5fa2F0aToKKyAgICAgICAgcHJpbnQoZid7Q09MT1JfRVJST1J9UGxlYXNlIGFkZCBmb2xsb3dpbmcgbW9kdWxlcyBpbnRvIHN5c3RlbSBpbWFnZSBtb2R1bGUge3N5c3RlbV9tb2R1bGVfbmFtZX0ue0NPTE9SX05PUk1BTH0nKQorICAgICAgICBwcmludChmJ3tDT0xPUl9XQVJOSU5HfUtBVEkgb25seSBtb2R1bGUocyk6e0NPTE9SX05PUk1BTH0nKQorICAgICAgICBmb3IgaXRlbSBpbiBzb3J0ZWQodW5pcXVlX2luX2thdGkpOgorICAgICAgICAgICAgcHJpbnQoaXRlbSkKKworICAgIGlmIHVuaXF1ZV9pbl9zb29uZzoKKyAgICAgICAgaWYgdW5pcXVlX2luX2thdGk6CisgICAgICAgICAgICBwcmludCgnJykKKworICAgICAgICBwcmludChmJ3tDT0xPUl9FUlJPUn1QbGVhc2UgYWRkIGZvbGxvd2luZyBtb2R1bGVzIGludG8gYnVpbGQvbWFrZS90YXJnZXQvcHJvZHVjdC9iYXNlX3N5c3RlbS5tay57Q09MT1JfTk9STUFMfScpCisgICAgICAgIHByaW50KGYne0NPTE9SX1dBUk5JTkd9U29vbmcgb25seSBtb2R1bGUocyk6e0NPTE9SX05PUk1BTH0nKQorICAgICAgICBmb3IgaXRlbSBpbiBzb3J0ZWQodW5pcXVlX2luX3Nvb25nKToKKyAgICAgICAgICAgIHByaW50KGl0ZW0pCisKKyAgICBpZiB1bmlxdWVfaW5fa2F0aSBvciB1bmlxdWVfaW5fc29vbmc6CisgICAgICAgIHByaW50KCcnKQorICAgICAgICBwcmludChmJ3tDT0xPUl9FUlJPUn1GQUlMRUQ6IFN5c3RlbSBpbWFnZSBmcm9tIEtBVEkgYW5kIFNPT05HIGRpZmZlcnMgZnJvbSBpbnN0YWxsZWQgZmlsZSBsaXN0LntDT0xPUl9OT1JNQUx9JykKKyAgICAgICAgc3lzLmV4aXQoMSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKworICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ2thdGlfaW5zdGFsbGVkX2ZpbGVfbGlzdCcpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnc29vbmdfaW5zdGFsbGVkX2ZpbGVfbGlzdCcpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnYWxsb3dsaXN0JykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdzeXN0ZW1fbW9kdWxlX25hbWUnKQorICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCisKKyAgICBmaW5kX3VuaXF1ZV9pdGVtcyhhcmdzLmthdGlfaW5zdGFsbGVkX2ZpbGVfbGlzdCwgYXJncy5zb29uZ19pbnN0YWxsZWRfZmlsZV9saXN0LCBhcmdzLmFsbG93bGlzdCwgYXJncy5zeXN0ZW1fbW9kdWxlX25hbWUpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L09XTkVSUyBiL3Rvb2xzL2lkZV9xdWVyeS9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE0YTlhMgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9PV05FUlMKQEAgLTAsMCArMSw0IEBACitpYWxpeWV2QGdvb2dsZS5jb20KK2l2YW5raXJpY2hlbmtvQGdvb2dsZS5jb20KK2thZGlyY2V0QGdvb2dsZS5jb20KK21pY2hhZWxtZXJnQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplci9BbmRyb2lkLmJwIGIvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyL0FuZHJvaWQuYnAKaW5kZXggM2NiYmIwNS4uZTg1ZDQ0NSAxMDA2NDQKLS0tIGEvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyL0FuZHJvaWQuYnAKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyL0FuZHJvaWQuYnAKQEAgLTU4LDcgKzU4LDcgQEAKICAgICBzaGFyZWRfbGliczogWyJsaWJjbGFuZy1jcHBfaG9zdCJdLAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJpbmNsdWRlX3NjYW5uZXIiLAotICAgICAgICAiaWRlX3F1ZXJ5X3Byb3RvIiwKKyAgICAgICAgImNjX2FuYWx5emVyX3Byb3RvIiwKICAgICBdLAogICAgIGRlZmF1bHRzOiBbImlkZV9xdWVyeV9jY19hbmFseXplcl9kZWZhdWx0cyJdLAogfQpAQCAtNzIsNyArNzIsNyBAQAogICAgICAgICAibGlicHJvdG9idWYtY3BwLWZ1bGwiLAogICAgIF0sCiAgICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImlkZV9xdWVyeV9wcm90byIsCisgICAgICAgICJjY19hbmFseXplcl9wcm90byIsCiAgICAgICAgICJidWlsdGluX2hlYWRlcnMiLAogICAgICAgICAiaW5jbHVkZV9zY2FubmVyIiwKICAgICAgICAgImFuYWx5emVyIiwKZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplci9hbmFseXplci5jYyBiL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplci9hbmFseXplci5jYwppbmRleCBiYjdjYTBiLi40Y2NlYzU0IDEwMDY0NAotLS0gYS90b29scy9pZGVfcXVlcnkvY2NfYW5hbHl6ZXIvYW5hbHl6ZXIuY2MKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyL2FuYWx5emVyLmNjCkBAIC0yMCw5ICsyMCw5IEBACiAjaW5jbHVkZSA8dXRpbGl0eT4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKKyNpbmNsdWRlICJjY19hbmFseXplci5wYi5oIgogI2luY2x1ZGUgImNsYW5nL1Rvb2xpbmcvQ29tcGlsYXRpb25EYXRhYmFzZS5oIgogI2luY2x1ZGUgImNsYW5nL1Rvb2xpbmcvSlNPTkNvbXBpbGF0aW9uRGF0YWJhc2UuaCIKLSNpbmNsdWRlICJpZGVfcXVlcnkucGIuaCIKICNpbmNsdWRlICJpbmNsdWRlX3NjYW5uZXIuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgogI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgpAQCAtNDgsMTEgKzQ4LDExIEBACiB9CiB9ICAvLyBuYW1lc3BhY2UKIAotOjppZGVfcXVlcnk6OkRlcHNSZXNwb25zZSBHZXREZXBzKDo6aWRlX3F1ZXJ5OjpSZXBvU3RhdGUgc3RhdGUpIHsKLSAgOjppZGVfcXVlcnk6OkRlcHNSZXNwb25zZSByZXN1bHRzOworOjpjY19hbmFseXplcjo6RGVwc1Jlc3BvbnNlIEdldERlcHMoOjpjY19hbmFseXplcjo6UmVwb1N0YXRlIHN0YXRlKSB7CisgIDo6Y2NfYW5hbHl6ZXI6OkRlcHNSZXNwb25zZSByZXN1bHRzOwogICBhdXRvIGRiID0gTG9hZENvbXBEQihzdGF0ZS5jb21wX2RiX3BhdGgoKSk7CiAgIGlmICghZGIpIHsKLSAgICByZXN1bHRzLm11dGFibGVfc3RhdHVzKCktPnNldF9jb2RlKDo6aWRlX3F1ZXJ5OjpTdGF0dXM6OkZBSUxVUkUpOworICAgIHJlc3VsdHMubXV0YWJsZV9zdGF0dXMoKS0+c2V0X2NvZGUoOjpjY19hbmFseXplcjo6U3RhdHVzOjpGQUlMVVJFKTsKICAgICByZXN1bHRzLm11dGFibGVfc3RhdHVzKCktPnNldF9tZXNzYWdlKGxsdm06OnRvU3RyaW5nKGRiLnRha2VFcnJvcigpKSk7CiAgICAgcmV0dXJuIHJlc3VsdHM7CiAgIH0KQEAgLTYzLDcgKzYzLDcgQEAKICAgICBsbHZtOjpzeXM6OnBhdGg6OmFwcGVuZChhYnNfZmlsZSwgYWN0aXZlX2ZpbGUpOwogICAgIGF1dG8gY21kcyA9IGRiLT5nZXQoKS0+Z2V0Q29tcGlsZUNvbW1hbmRzKGFjdGl2ZV9maWxlKTsKICAgICBpZiAoY21kcy5lbXB0eSgpKSB7Ci0gICAgICByZXN1bHQubXV0YWJsZV9zdGF0dXMoKS0+c2V0X2NvZGUoOjppZGVfcXVlcnk6OlN0YXR1czo6RkFJTFVSRSk7CisgICAgICByZXN1bHQubXV0YWJsZV9zdGF0dXMoKS0+c2V0X2NvZGUoOjpjY19hbmFseXplcjo6U3RhdHVzOjpGQUlMVVJFKTsKICAgICAgIHJlc3VsdC5tdXRhYmxlX3N0YXR1cygpLT5zZXRfbWVzc2FnZSgKICAgICAgICAgICBsbHZtOjpUd2luZSgiQ2FuJ3QgZmluZCBjb21waWxlIGZsYWdzIGZvciBmaWxlOiAiLCBhYnNfZmlsZSkuc3RyKCkpOwogICAgICAgY29udGludWU7CkBAIC04MCwxMSArODAsMTEgQEAKICAgcmV0dXJuIHJlc3VsdHM7CiB9CiAKLTo6aWRlX3F1ZXJ5OjpJZGVBbmFseXNpcyBHZXRCdWlsZElucHV0cyg6OmlkZV9xdWVyeTo6UmVwb1N0YXRlIHN0YXRlKSB7Cis6OmNjX2FuYWx5emVyOjpJZGVBbmFseXNpcyBHZXRCdWlsZElucHV0cyg6OmNjX2FuYWx5emVyOjpSZXBvU3RhdGUgc3RhdGUpIHsKICAgYXV0byBkYiA9IExvYWRDb21wREIoc3RhdGUuY29tcF9kYl9wYXRoKCkpOwotICA6OmlkZV9xdWVyeTo6SWRlQW5hbHlzaXMgcmVzdWx0czsKKyAgOjpjY19hbmFseXplcjo6SWRlQW5hbHlzaXMgcmVzdWx0czsKICAgaWYgKCFkYikgewotICAgIHJlc3VsdHMubXV0YWJsZV9zdGF0dXMoKS0+c2V0X2NvZGUoOjppZGVfcXVlcnk6OlN0YXR1czo6RkFJTFVSRSk7CisgICAgcmVzdWx0cy5tdXRhYmxlX3N0YXR1cygpLT5zZXRfY29kZSg6OmNjX2FuYWx5emVyOjpTdGF0dXM6OkZBSUxVUkUpOwogICAgIHJlc3VsdHMubXV0YWJsZV9zdGF0dXMoKS0+c2V0X21lc3NhZ2UobGx2bTo6dG9TdHJpbmcoZGIudGFrZUVycm9yKCkpKTsKICAgICByZXR1cm4gcmVzdWx0czsKICAgfQpAQCAtOTcsNyArOTcsNiBAQAogICAgIGdlbmZpbGVfcm9vdF9hYnMucHVzaF9iYWNrKCcvJyk7CiAgIH0KIAotICByZXN1bHRzLnNldF9idWlsZF9hcnRpZmFjdF9yb290KHN0YXRlLm91dF9kaXIoKSk7CiAgIGZvciAobGx2bTo6U3RyaW5nUmVmIGFjdGl2ZV9maWxlIDogc3RhdGUuYWN0aXZlX2ZpbGVfcGF0aCgpKSB7CiAgICAgYXV0byYgcmVzdWx0ID0gKnJlc3VsdHMuYWRkX3NvdXJjZXMoKTsKICAgICByZXN1bHQuc2V0X3BhdGgoYWN0aXZlX2ZpbGUuc3RyKCkpOwpAQCAtMTA2LDcgKzEwNSw3IEBACiAgICAgbGx2bTo6c3lzOjpwYXRoOjphcHBlbmQoYWJzX2ZpbGUsIGFjdGl2ZV9maWxlKTsKICAgICBhdXRvIGNtZHMgPSBkYi0+Z2V0KCktPmdldENvbXBpbGVDb21tYW5kcyhhYnNfZmlsZSk7CiAgICAgaWYgKGNtZHMuZW1wdHkoKSkgewotICAgICAgcmVzdWx0Lm11dGFibGVfc3RhdHVzKCktPnNldF9jb2RlKDo6aWRlX3F1ZXJ5OjpTdGF0dXM6OkZBSUxVUkUpOworICAgICAgcmVzdWx0Lm11dGFibGVfc3RhdHVzKCktPnNldF9jb2RlKDo6Y2NfYW5hbHl6ZXI6OlN0YXR1czo6RkFJTFVSRSk7CiAgICAgICByZXN1bHQubXV0YWJsZV9zdGF0dXMoKS0+c2V0X21lc3NhZ2UoCiAgICAgICAgICAgbGx2bTo6VHdpbmUoIkNhbid0IGZpbmQgY29tcGlsZSBmbGFncyBmb3IgZmlsZTogIiwgYWJzX2ZpbGUpLnN0cigpKTsKICAgICAgIGNvbnRpbnVlOwpAQCAtMTE0LDcgKzExMyw3IEBACiAgICAgY29uc3QgYXV0byYgY21kID0gY21kcy5mcm9udCgpOwogICAgIGxsdm06OlN0cmluZ1JlZiB3b3JraW5nX2RpciA9IGNtZC5EaXJlY3Rvcnk7CiAgICAgaWYgKCF3b3JraW5nX2Rpci5jb25zdW1lX2Zyb250KHJlcG9fZGlyKSkgewotICAgICAgcmVzdWx0Lm11dGFibGVfc3RhdHVzKCktPnNldF9jb2RlKDo6aWRlX3F1ZXJ5OjpTdGF0dXM6OkZBSUxVUkUpOworICAgICAgcmVzdWx0Lm11dGFibGVfc3RhdHVzKCktPnNldF9jb2RlKDo6Y2NfYW5hbHl6ZXI6OlN0YXR1czo6RkFJTFVSRSk7CiAgICAgICByZXN1bHQubXV0YWJsZV9zdGF0dXMoKS0+c2V0X21lc3NhZ2UoIkNvbW1hbmQgd29ya2luZyBkaXIgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2luZ19kaXIuc3RyKCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgb3V0c2lkZSByZXBvc2l0b3J5ICIgKyByZXBvX2Rpcik7CkBAIC0xMjcsNyArMTI2LDcgQEAKICAgICBhdXRvIGluY2x1ZGVzID0KICAgICAgICAgU2NhbkluY2x1ZGVzKGNtZHMuZnJvbnQoKSwgbGx2bTo6dmZzOjpjcmVhdGVQaHlzaWNhbEZpbGVTeXN0ZW0oKSk7CiAgICAgaWYgKCFpbmNsdWRlcykgewotICAgICAgcmVzdWx0Lm11dGFibGVfc3RhdHVzKCktPnNldF9jb2RlKDo6aWRlX3F1ZXJ5OjpTdGF0dXM6OkZBSUxVUkUpOworICAgICAgcmVzdWx0Lm11dGFibGVfc3RhdHVzKCktPnNldF9jb2RlKDo6Y2NfYW5hbHl6ZXI6OlN0YXR1czo6RkFJTFVSRSk7CiAgICAgICByZXN1bHQubXV0YWJsZV9zdGF0dXMoKS0+c2V0X21lc3NhZ2UoCiAgICAgICAgICAgbGx2bTo6dG9TdHJpbmcoaW5jbHVkZXMudGFrZUVycm9yKCkpKTsKICAgICAgIGNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyL2FuYWx5emVyLmggYi90b29scy9pZGVfcXVlcnkvY2NfYW5hbHl6ZXIvYW5hbHl6ZXIuaAppbmRleCAzMTMzNzk1Li5mZDE5MDgyIDEwMDY0NAotLS0gYS90b29scy9pZGVfcXVlcnkvY2NfYW5hbHl6ZXIvYW5hbHl6ZXIuaAorKysgYi90b29scy9pZGVfcXVlcnkvY2NfYW5hbHl6ZXIvYW5hbHl6ZXIuaApAQCAtMTcsMTcgKzE3LDE3IEBACiAjaWZuZGVmIF9UT09MU19JREVfUVVFUllfQ0NfQU5BTFlaRVJfQU5BTFlaRVJfSF8KICNkZWZpbmUgX1RPT0xTX0lERV9RVUVSWV9DQ19BTkFMWVpFUl9BTkFMWVpFUl9IXwogCi0jaW5jbHVkZSAiaWRlX3F1ZXJ5LnBiLmgiCisjaW5jbHVkZSAiY2NfYW5hbHl6ZXIucGIuaCIKIAogbmFtZXNwYWNlIHRvb2xzOjppZGVfcXVlcnk6OmNjX2FuYWx5emVyIHsKIAogLy8gU2NhbnMgdGhlIGJ1aWxkIGdyYXBoIGFuZCByZXR1cm5zIHRhcmdldCBuYW1lcyBmcm9tIHRoZSBidWlsZCBncmFwaCB0bwogLy8gZ2VuZXJhdGUgYWxsIHRoZSBkZXBlbmRlbmNpZXMgZm9yIHRoZSBhY3RpdmUgZmlsZXMuCi06OmlkZV9xdWVyeTo6RGVwc1Jlc3BvbnNlIEdldERlcHMoOjppZGVfcXVlcnk6OlJlcG9TdGF0ZSBzdGF0ZSk7Cis6OmNjX2FuYWx5emVyOjpEZXBzUmVzcG9uc2UgR2V0RGVwcyg6OmNjX2FuYWx5emVyOjpSZXBvU3RhdGUgc3RhdGUpOwogCiAvLyBTY2FucyB0aGUgc291cmNlcyBhbmQgcmV0dXJucyBhbGwgdGhlIHNvdXJjZSBmaWxlcyByZXF1aXJlZCBmb3IgYW5hbHl6aW5nIHRoZQogLy8gYWN0aXZlIGZpbGVzLgotOjppZGVfcXVlcnk6OklkZUFuYWx5c2lzIEdldEJ1aWxkSW5wdXRzKDo6aWRlX3F1ZXJ5OjpSZXBvU3RhdGUgc3RhdGUpOworOjpjY19hbmFseXplcjo6SWRlQW5hbHlzaXMgR2V0QnVpbGRJbnB1dHMoOjpjY19hbmFseXplcjo6UmVwb1N0YXRlIHN0YXRlKTsKIAogfSAgLy8gbmFtZXNwYWNlIHRvb2xzOjppZGVfcXVlcnk6OmNjX2FuYWx5emVyCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplci9tYWluLmNjIGIvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyL21haW4uY2MKaW5kZXggOGUwMGM2My4uZDg2ZmM4YyAxMDA2NDQKLS0tIGEvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyL21haW4uY2MKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyL21haW4uY2MKQEAgLTI4LDcgKzI4LDcgQEAKIAogI2luY2x1ZGUgImFuYWx5emVyLmgiCiAjaW5jbHVkZSAiZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaCIKLSNpbmNsdWRlICJpZGVfcXVlcnkucGIuaCIKKyNpbmNsdWRlICJjY19hbmFseXplci5wYi5oIgogI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9UYXJnZXRTZWxlY3QuaCIKQEAgLTQ4LDkgKzQ4LDkgQEAKICAgICBsbHZtOjpjbDo6ZGVzYygiUHJpbnQgdGhlIGxpc3Qgb2YgaGVhZGVycyB0byBpbnNlcnQgYW5kIHJlbW92ZSIpLAogfTsKIAotaWRlX3F1ZXJ5OjpJZGVBbmFseXNpcyBSZXR1cm5FcnJvcihsbHZtOjpTdHJpbmdSZWYgbWVzc2FnZSkgewotICBpZGVfcXVlcnk6OklkZUFuYWx5c2lzIHJlc3VsdDsKLSAgcmVzdWx0Lm11dGFibGVfc3RhdHVzKCktPnNldF9jb2RlKGlkZV9xdWVyeTo6U3RhdHVzOjpGQUlMVVJFKTsKK2NjX2FuYWx5emVyOjpJZGVBbmFseXNpcyBSZXR1cm5FcnJvcihsbHZtOjpTdHJpbmdSZWYgbWVzc2FnZSkgeworICBjY19hbmFseXplcjo6SWRlQW5hbHlzaXMgcmVzdWx0OworICByZXN1bHQubXV0YWJsZV9zdGF0dXMoKS0+c2V0X2NvZGUoY2NfYW5hbHl6ZXI6OlN0YXR1czo6RkFJTFVSRSk7CiAgIHJlc3VsdC5tdXRhYmxlX3N0YXR1cygpLT5zZXRfbWVzc2FnZShtZXNzYWdlLnN0cigpKTsKICAgcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTYxLDcgKzYxLDcgQEAKICAgbGx2bTo6SW5pdGlhbGl6ZUFsbFRhcmdldEluZm9zKCk7CiAgIGxsdm06OmNsOjpQYXJzZUNvbW1hbmRMaW5lT3B0aW9ucyhhcmdjLCBhcmd2KTsKIAotICBpZGVfcXVlcnk6OlJlcG9TdGF0ZSBzdGF0ZTsKKyAgY2NfYW5hbHl6ZXI6OlJlcG9TdGF0ZSBzdGF0ZTsKICAgaWYgKCFzdGF0ZS5QYXJzZUZyb21GaWxlRGVzY3JpcHRvcihTVERJTl9GSUxFTk8pKSB7CiAgICAgbGx2bTo6ZXJycygpIDw8ICJGYWlsZWQgdG8gcGFyc2UgaW5wdXQhXG4iOwogICAgIHJldHVybiAxOwpAQCAtNzAsMTIgKzcwLDEyIEBACiAgIHN0ZDo6dW5pcXVlX3B0cjxnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlPiByZXN1bHQ7CiAgIHN3aXRjaCAobW9kZSkgewogICAgIGNhc2UgT3BNb2RlOjpERVBTOiB7Ci0gICAgICByZXN1bHQgPSBzdGQ6Om1ha2VfdW5pcXVlPGlkZV9xdWVyeTo6RGVwc1Jlc3BvbnNlPigKKyAgICAgIHJlc3VsdCA9IHN0ZDo6bWFrZV91bmlxdWU8Y2NfYW5hbHl6ZXI6OkRlcHNSZXNwb25zZT4oCiAgICAgICAgICAgdG9vbHM6OmlkZV9xdWVyeTo6Y2NfYW5hbHl6ZXI6OkdldERlcHMoc3RkOjptb3ZlKHN0YXRlKSkpOwogICAgICAgYnJlYWs7CiAgICAgfQogICAgIGNhc2UgT3BNb2RlOjpJTlBVVFM6IHsKLSAgICAgIHJlc3VsdCA9IHN0ZDo6bWFrZV91bmlxdWU8aWRlX3F1ZXJ5OjpJZGVBbmFseXNpcz4oCisgICAgICByZXN1bHQgPSBzdGQ6Om1ha2VfdW5pcXVlPGNjX2FuYWx5emVyOjpJZGVBbmFseXNpcz4oCiAgICAgICAgICAgdG9vbHM6OmlkZV9xdWVyeTo6Y2NfYW5hbHl6ZXI6OkdldEJ1aWxkSW5wdXRzKHN0ZDo6bW92ZShzdGF0ZSkpKTsKICAgICAgIGJyZWFrOwogICAgIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnlfcHJvdG8vQW5kcm9pZC5icCBiL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplcl9wcm90by9BbmRyb2lkLmJwCnNpbWlsYXJpdHkgaW5kZXggOTMlCnJlbmFtZSBmcm9tIHRvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnlfcHJvdG8vQW5kcm9pZC5icApyZW5hbWUgdG8gdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyX3Byb3RvL0FuZHJvaWQuYnAKaW5kZXggNzBmMTVjZC4uMGVkMDdiNCAxMDA2NDQKLS0tIGEvdG9vbHMvaWRlX3F1ZXJ5L2lkZV9xdWVyeV9wcm90by9BbmRyb2lkLmJwCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplcl9wcm90by9BbmRyb2lkLmJwCkBAIC0xOSw5ICsxOSw5IEBACiB9CiAKIGNjX2xpYnJhcnlfaG9zdF9zdGF0aWMgewotICAgIG5hbWU6ICJpZGVfcXVlcnlfcHJvdG8iLAorICAgIG5hbWU6ICJjY19hbmFseXplcl9wcm90byIsCiAgICAgc3JjczogWwotICAgICAgICAiaWRlX3F1ZXJ5LnByb3RvIiwKKyAgICAgICAgImNjX2FuYWx5emVyLnByb3RvIiwKICAgICBdLAogICAgIHByb3RvOiB7CiAgICAgICAgIGV4cG9ydF9wcm90b19oZWFkZXJzOiB0cnVlLApkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyX3Byb3RvL2NjX2FuYWx5emVyLnBiLmdvIGIvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyX3Byb3RvL2NjX2FuYWx5emVyLnBiLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYmU1YzAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9pZGVfcXVlcnkvY2NfYW5hbHl6ZXJfcHJvdG8vY2NfYW5hbHl6ZXIucGIuZ28KQEAgLTAsMCArMSw3ODkgQEAKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gQ29kZSBnZW5lcmF0ZWQgYnkgcHJvdG9jLWdlbi1nby4gRE8gTk9UIEVESVQuCisvLyB2ZXJzaW9uczoKKy8vIAlwcm90b2MtZ2VuLWdvIHYxLjMwLjAKKy8vIAlwcm90b2MgICAgICAgIHYzLjIxLjEyCisvLyBzb3VyY2U6IGNjX2FuYWx5emVyLnByb3RvCisKK3BhY2thZ2UgY2NfYW5hbHl6ZXJfcHJvdG8KKworaW1wb3J0ICgKKwlwcm90b3JlZmxlY3QgImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3JlZmxlY3QvcHJvdG9yZWZsZWN0IgorCXByb3RvaW1wbCAiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcnVudGltZS9wcm90b2ltcGwiCisJcmVmbGVjdCAicmVmbGVjdCIKKwlzeW5jICJzeW5jIgorKQorCitjb25zdCAoCisJLy8gVmVyaWZ5IHRoYXQgdGhpcyBnZW5lcmF0ZWQgY29kZSBpcyBzdWZmaWNpZW50bHkgdXAtdG8tZGF0ZS4KKwlfID0gcHJvdG9pbXBsLkVuZm9yY2VWZXJzaW9uKDIwIC0gcHJvdG9pbXBsLk1pblZlcnNpb24pCisJLy8gVmVyaWZ5IHRoYXQgcnVudGltZS9wcm90b2ltcGwgaXMgc3VmZmljaWVudGx5IHVwLXRvLWRhdGUuCisJXyA9IHByb3RvaW1wbC5FbmZvcmNlVmVyc2lvbihwcm90b2ltcGwuTWF4VmVyc2lvbiAtIDIwKQorKQorCit0eXBlIFN0YXR1c19Db2RlIGludDMyCisKK2NvbnN0ICgKKwlTdGF0dXNfT0sgICAgICBTdGF0dXNfQ29kZSA9IDAKKwlTdGF0dXNfRkFJTFVSRSBTdGF0dXNfQ29kZSA9IDEKKykKKworLy8gRW51bSB2YWx1ZSBtYXBzIGZvciBTdGF0dXNfQ29kZS4KK3ZhciAoCisJU3RhdHVzX0NvZGVfbmFtZSA9IG1hcFtpbnQzMl1zdHJpbmd7CisJCTA6ICJPSyIsCisJCTE6ICJGQUlMVVJFIiwKKwl9CisJU3RhdHVzX0NvZGVfdmFsdWUgPSBtYXBbc3RyaW5nXWludDMyeworCQkiT0siOiAgICAgIDAsCisJCSJGQUlMVVJFIjogMSwKKwl9CispCisKK2Z1bmMgKHggU3RhdHVzX0NvZGUpIEVudW0oKSAqU3RhdHVzX0NvZGUgeworCXAgOj0gbmV3KFN0YXR1c19Db2RlKQorCSpwID0geAorCXJldHVybiBwCit9CisKK2Z1bmMgKHggU3RhdHVzX0NvZGUpIFN0cmluZygpIHN0cmluZyB7CisJcmV0dXJuIHByb3RvaW1wbC5YLkVudW1TdHJpbmdPZih4LkRlc2NyaXB0b3IoKSwgcHJvdG9yZWZsZWN0LkVudW1OdW1iZXIoeCkpCit9CisKK2Z1bmMgKFN0YXR1c19Db2RlKSBEZXNjcmlwdG9yKCkgcHJvdG9yZWZsZWN0LkVudW1EZXNjcmlwdG9yIHsKKwlyZXR1cm4gZmlsZV9jY19hbmFseXplcl9wcm90b19lbnVtVHlwZXNbMF0uRGVzY3JpcHRvcigpCit9CisKK2Z1bmMgKFN0YXR1c19Db2RlKSBUeXBlKCkgcHJvdG9yZWZsZWN0LkVudW1UeXBlIHsKKwlyZXR1cm4gJmZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fZW51bVR5cGVzWzBdCit9CisKK2Z1bmMgKHggU3RhdHVzX0NvZGUpIE51bWJlcigpIHByb3RvcmVmbGVjdC5FbnVtTnVtYmVyIHsKKwlyZXR1cm4gcHJvdG9yZWZsZWN0LkVudW1OdW1iZXIoeCkKK30KKworLy8gRGVwcmVjYXRlZDogVXNlIFN0YXR1c19Db2RlLkRlc2NyaXB0b3IgaW5zdGVhZC4KK2Z1bmMgKFN0YXR1c19Db2RlKSBFbnVtRGVzY3JpcHRvcigpIChbXWJ5dGUsIFtdaW50KSB7CisJcmV0dXJuIGZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fcmF3RGVzY0daSVAoKSwgW11pbnR7MCwgMH0KK30KKworLy8gSW5kaWNhdGVzIHRoZSBzdWNjZXNzL2ZhaWx1cmUgZm9yIGFuYWx5c2lzLgordHlwZSBTdGF0dXMgc3RydWN0IHsKKwlzdGF0ZSAgICAgICAgIHByb3RvaW1wbC5NZXNzYWdlU3RhdGUKKwlzaXplQ2FjaGUgICAgIHByb3RvaW1wbC5TaXplQ2FjaGUKKwl1bmtub3duRmllbGRzIHByb3RvaW1wbC5Vbmtub3duRmllbGRzCisKKwlDb2RlIFN0YXR1c19Db2RlIGBwcm90b2J1ZjoidmFyaW50LDEsb3B0LG5hbWU9Y29kZSxwcm90bzMsZW51bT1jY19hbmFseXplci5TdGF0dXNfQ29kZSIganNvbjoiY29kZSxvbWl0ZW1wdHkiYAorCS8vIERldGFpbHMgYWJvdXQgdGhlIHN0YXR1cywgbWlnaHQgYmUgZGlzcGxheWVkIHRvIHVzZXIuCisJTWVzc2FnZSAqc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsMixvcHQsbmFtZT1tZXNzYWdlLHByb3RvMyxvbmVvZiIganNvbjoibWVzc2FnZSxvbWl0ZW1wdHkiYAorfQorCitmdW5jICh4ICpTdGF0dXMpIFJlc2V0KCkgeworCSp4ID0gU3RhdHVze30KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCB7CisJCW1pIDo9ICZmaWxlX2NjX2FuYWx5emVyX3Byb3RvX21zZ1R5cGVzWzBdCisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQorCX0KK30KKworZnVuYyAoeCAqU3RhdHVzKSBTdHJpbmcoKSBzdHJpbmcgeworCXJldHVybiBwcm90b2ltcGwuWC5NZXNzYWdlU3RyaW5nT2YoeCkKK30KKworZnVuYyAoKlN0YXR1cykgUHJvdG9NZXNzYWdlKCkge30KKworZnVuYyAoeCAqU3RhdHVzKSBQcm90b1JlZmxlY3QoKSBwcm90b3JlZmxlY3QuTWVzc2FnZSB7CisJbWkgOj0gJmZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbMF0KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCAmJiB4ICE9IG5pbCB7CisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQlpZiBtcy5Mb2FkTWVzc2FnZUluZm8oKSA9PSBuaWwgeworCQkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKKwkJfQorCQlyZXR1cm4gbXMKKwl9CisJcmV0dXJuIG1pLk1lc3NhZ2VPZih4KQorfQorCisvLyBEZXByZWNhdGVkOiBVc2UgU3RhdHVzLlByb3RvUmVmbGVjdC5EZXNjcmlwdG9yIGluc3RlYWQuCitmdW5jICgqU3RhdHVzKSBEZXNjcmlwdG9yKCkgKFtdYnl0ZSwgW11pbnQpIHsKKwlyZXR1cm4gZmlsZV9jY19hbmFseXplcl9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHswfQorfQorCitmdW5jICh4ICpTdGF0dXMpIEdldENvZGUoKSBTdGF0dXNfQ29kZSB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5Db2RlCisJfQorCXJldHVybiBTdGF0dXNfT0sKK30KKworZnVuYyAoeCAqU3RhdHVzKSBHZXRNZXNzYWdlKCkgc3RyaW5nIHsKKwlpZiB4ICE9IG5pbCAmJiB4Lk1lc3NhZ2UgIT0gbmlsIHsKKwkJcmV0dXJuICp4Lk1lc3NhZ2UKKwl9CisJcmV0dXJuICIiCit9CisKKy8vIFJlcHJlc2VudHMgYW4gQW5kcm9pZCBjaGVja291dCBvbiB1c2VyJ3Mgd29ya3N0YXRpb24uCit0eXBlIFJlcG9TdGF0ZSBzdHJ1Y3QgeworCXN0YXRlICAgICAgICAgcHJvdG9pbXBsLk1lc3NhZ2VTdGF0ZQorCXNpemVDYWNoZSAgICAgcHJvdG9pbXBsLlNpemVDYWNoZQorCXVua25vd25GaWVsZHMgcHJvdG9pbXBsLlVua25vd25GaWVsZHMKKworCS8vIEFic29sdXRlIHBhdGggZm9yIHRoZSBjaGVja291dCBpbiB0aGUgd29ya3N0YXRpb24uCisJLy8gZS5nLiAvaG9tZS91c2VyL3dvcmsvYW5kcm9pZC8KKwlSZXBvRGlyIHN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDEsb3B0LG5hbWU9cmVwb19kaXIsanNvbj1yZXBvRGlyLHByb3RvMyIganNvbjoicmVwb19kaXIsb21pdGVtcHR5ImAKKwkvLyBSZWxhdGl2ZSB0byByZXBvX2Rpci4KKwlBY3RpdmVGaWxlUGF0aCBbXXN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDIscmVwLG5hbWU9YWN0aXZlX2ZpbGVfcGF0aCxqc29uPWFjdGl2ZUZpbGVQYXRoLHByb3RvMyIganNvbjoiYWN0aXZlX2ZpbGVfcGF0aCxvbWl0ZW1wdHkiYAorCS8vIFJlcG9zaXRvcnkgcmVsYXRpdmUgcGF0aCB0byBvdXRwdXQgZGlyZWN0b3J5IGluIHdvcmtzdGF0aW9uLgorCU91dERpciBzdHJpbmcgYHByb3RvYnVmOiJieXRlcywzLG9wdCxuYW1lPW91dF9kaXIsanNvbj1vdXREaXIscHJvdG8zIiBqc29uOiJvdXRfZGlyLG9taXRlbXB0eSJgCisJLy8gUmVwb3NpdG9yeSByZWxhdGl2ZSBwYXRoIHRvIGNvbXBpbGVfY29tbWFuZHMuanNvbiBpbiB3b3Jrc3RhdGlvbi4KKwlDb21wRGJQYXRoIHN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDQsb3B0LG5hbWU9Y29tcF9kYl9wYXRoLGpzb249Y29tcERiUGF0aCxwcm90bzMiIGpzb246ImNvbXBfZGJfcGF0aCxvbWl0ZW1wdHkiYAorfQorCitmdW5jICh4ICpSZXBvU3RhdGUpIFJlc2V0KCkgeworCSp4ID0gUmVwb1N0YXRle30KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCB7CisJCW1pIDo9ICZmaWxlX2NjX2FuYWx5emVyX3Byb3RvX21zZ1R5cGVzWzFdCisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQorCX0KK30KKworZnVuYyAoeCAqUmVwb1N0YXRlKSBTdHJpbmcoKSBzdHJpbmcgeworCXJldHVybiBwcm90b2ltcGwuWC5NZXNzYWdlU3RyaW5nT2YoeCkKK30KKworZnVuYyAoKlJlcG9TdGF0ZSkgUHJvdG9NZXNzYWdlKCkge30KKworZnVuYyAoeCAqUmVwb1N0YXRlKSBQcm90b1JlZmxlY3QoKSBwcm90b3JlZmxlY3QuTWVzc2FnZSB7CisJbWkgOj0gJmZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbMV0KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCAmJiB4ICE9IG5pbCB7CisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQlpZiBtcy5Mb2FkTWVzc2FnZUluZm8oKSA9PSBuaWwgeworCQkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKKwkJfQorCQlyZXR1cm4gbXMKKwl9CisJcmV0dXJuIG1pLk1lc3NhZ2VPZih4KQorfQorCisvLyBEZXByZWNhdGVkOiBVc2UgUmVwb1N0YXRlLlByb3RvUmVmbGVjdC5EZXNjcmlwdG9yIGluc3RlYWQuCitmdW5jICgqUmVwb1N0YXRlKSBEZXNjcmlwdG9yKCkgKFtdYnl0ZSwgW11pbnQpIHsKKwlyZXR1cm4gZmlsZV9jY19hbmFseXplcl9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHsxfQorfQorCitmdW5jICh4ICpSZXBvU3RhdGUpIEdldFJlcG9EaXIoKSBzdHJpbmcgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguUmVwb0RpcgorCX0KKwlyZXR1cm4gIiIKK30KKworZnVuYyAoeCAqUmVwb1N0YXRlKSBHZXRBY3RpdmVGaWxlUGF0aCgpIFtdc3RyaW5nIHsKKwlpZiB4ICE9IG5pbCB7CisJCXJldHVybiB4LkFjdGl2ZUZpbGVQYXRoCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAoeCAqUmVwb1N0YXRlKSBHZXRPdXREaXIoKSBzdHJpbmcgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguT3V0RGlyCisJfQorCXJldHVybiAiIgorfQorCitmdW5jICh4ICpSZXBvU3RhdGUpIEdldENvbXBEYlBhdGgoKSBzdHJpbmcgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguQ29tcERiUGF0aAorCX0KKwlyZXR1cm4gIiIKK30KKworLy8gUHJvdmlkZXMgYWxsIHRoZSB0YXJnZXRzIHRoYXQgYXJlIHByZS1yZXF1aXNpdGllcyBmb3IgcnVubmluZyBsYW5ndWFnZQorLy8gc2VydmljZXMgb24gYWN0aXZlX2ZpbGVfcGF0aHMuCit0eXBlIERlcHNSZXNwb25zZSBzdHJ1Y3QgeworCXN0YXRlICAgICAgICAgcHJvdG9pbXBsLk1lc3NhZ2VTdGF0ZQorCXNpemVDYWNoZSAgICAgcHJvdG9pbXBsLlNpemVDYWNoZQorCXVua25vd25GaWVsZHMgcHJvdG9pbXBsLlVua25vd25GaWVsZHMKKworCURlcHMgICBbXSpEZXBzUmVzcG9uc2VfRGVwcyBgcHJvdG9idWY6ImJ5dGVzLDEscmVwLG5hbWU9ZGVwcyxwcm90bzMiIGpzb246ImRlcHMsb21pdGVtcHR5ImAKKwlTdGF0dXMgKlN0YXR1cyAgICAgICAgICAgICAgYHByb3RvYnVmOiJieXRlcywyLG9wdCxuYW1lPXN0YXR1cyxwcm90bzMsb25lb2YiIGpzb246InN0YXR1cyxvbWl0ZW1wdHkiYAorfQorCitmdW5jICh4ICpEZXBzUmVzcG9uc2UpIFJlc2V0KCkgeworCSp4ID0gRGVwc1Jlc3BvbnNle30KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCB7CisJCW1pIDo9ICZmaWxlX2NjX2FuYWx5emVyX3Byb3RvX21zZ1R5cGVzWzJdCisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQorCX0KK30KKworZnVuYyAoeCAqRGVwc1Jlc3BvbnNlKSBTdHJpbmcoKSBzdHJpbmcgeworCXJldHVybiBwcm90b2ltcGwuWC5NZXNzYWdlU3RyaW5nT2YoeCkKK30KKworZnVuYyAoKkRlcHNSZXNwb25zZSkgUHJvdG9NZXNzYWdlKCkge30KKworZnVuYyAoeCAqRGVwc1Jlc3BvbnNlKSBQcm90b1JlZmxlY3QoKSBwcm90b3JlZmxlY3QuTWVzc2FnZSB7CisJbWkgOj0gJmZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbMl0KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCAmJiB4ICE9IG5pbCB7CisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQlpZiBtcy5Mb2FkTWVzc2FnZUluZm8oKSA9PSBuaWwgeworCQkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKKwkJfQorCQlyZXR1cm4gbXMKKwl9CisJcmV0dXJuIG1pLk1lc3NhZ2VPZih4KQorfQorCisvLyBEZXByZWNhdGVkOiBVc2UgRGVwc1Jlc3BvbnNlLlByb3RvUmVmbGVjdC5EZXNjcmlwdG9yIGluc3RlYWQuCitmdW5jICgqRGVwc1Jlc3BvbnNlKSBEZXNjcmlwdG9yKCkgKFtdYnl0ZSwgW11pbnQpIHsKKwlyZXR1cm4gZmlsZV9jY19hbmFseXplcl9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHsyfQorfQorCitmdW5jICh4ICpEZXBzUmVzcG9uc2UpIEdldERlcHMoKSBbXSpEZXBzUmVzcG9uc2VfRGVwcyB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5EZXBzCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAoeCAqRGVwc1Jlc3BvbnNlKSBHZXRTdGF0dXMoKSAqU3RhdHVzIHsKKwlpZiB4ICE9IG5pbCB7CisJCXJldHVybiB4LlN0YXR1cworCX0KKwlyZXR1cm4gbmlsCit9CisKKy8vIFJldHVybnMgYWxsIHRoZSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgZm9yIHByb3ZpZGluZyBsYW5ndWFnZSBzZXJ2aWNlcyBmb3IgdGhlCisvLyBhY3RpdmUgZmlsZXMuCit0eXBlIEdlbmVyYXRlZEZpbGUgc3RydWN0IHsKKwlzdGF0ZSAgICAgICAgIHByb3RvaW1wbC5NZXNzYWdlU3RhdGUKKwlzaXplQ2FjaGUgICAgIHByb3RvaW1wbC5TaXplQ2FjaGUKKwl1bmtub3duRmllbGRzIHByb3RvaW1wbC5Vbmtub3duRmllbGRzCisKKwkvLyBQYXRoIHRvIHRoZSBmaWxlIHJlbGF0aXZlIHRvIHJlcG9zaXRvcnkgcm9vdC4KKwlQYXRoIHN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDEsb3B0LG5hbWU9cGF0aCxwcm90bzMiIGpzb246InBhdGgsb21pdGVtcHR5ImAKKwkvLyBUaGUgdGV4dCBvZiB0aGUgZ2VuZXJhdGVkIGZpbGUsIGlmIG5vdCBwcm92aWRlZCBjb250ZW50cyB3aWxsIGJlIHJlYWQKKwkvLyBmcm9tIHRoZSBwYXRoIGFib3ZlIGluIHVzZXIncyB3b3Jrc3RhdGlvbi4KKwlDb250ZW50cyBbXWJ5dGUgYHByb3RvYnVmOiJieXRlcywyLG9wdCxuYW1lPWNvbnRlbnRzLHByb3RvMyxvbmVvZiIganNvbjoiY29udGVudHMsb21pdGVtcHR5ImAKK30KKworZnVuYyAoeCAqR2VuZXJhdGVkRmlsZSkgUmVzZXQoKSB7CisJKnggPSBHZW5lcmF0ZWRGaWxle30KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCB7CisJCW1pIDo9ICZmaWxlX2NjX2FuYWx5emVyX3Byb3RvX21zZ1R5cGVzWzNdCisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQorCX0KK30KKworZnVuYyAoeCAqR2VuZXJhdGVkRmlsZSkgU3RyaW5nKCkgc3RyaW5nIHsKKwlyZXR1cm4gcHJvdG9pbXBsLlguTWVzc2FnZVN0cmluZ09mKHgpCit9CisKK2Z1bmMgKCpHZW5lcmF0ZWRGaWxlKSBQcm90b01lc3NhZ2UoKSB7fQorCitmdW5jICh4ICpHZW5lcmF0ZWRGaWxlKSBQcm90b1JlZmxlY3QoKSBwcm90b3JlZmxlY3QuTWVzc2FnZSB7CisJbWkgOj0gJmZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbM10KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCAmJiB4ICE9IG5pbCB7CisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQlpZiBtcy5Mb2FkTWVzc2FnZUluZm8oKSA9PSBuaWwgeworCQkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKKwkJfQorCQlyZXR1cm4gbXMKKwl9CisJcmV0dXJuIG1pLk1lc3NhZ2VPZih4KQorfQorCisvLyBEZXByZWNhdGVkOiBVc2UgR2VuZXJhdGVkRmlsZS5Qcm90b1JlZmxlY3QuRGVzY3JpcHRvciBpbnN0ZWFkLgorZnVuYyAoKkdlbmVyYXRlZEZpbGUpIERlc2NyaXB0b3IoKSAoW11ieXRlLCBbXWludCkgeworCXJldHVybiBmaWxlX2NjX2FuYWx5emVyX3Byb3RvX3Jhd0Rlc2NHWklQKCksIFtdaW50ezN9Cit9CisKK2Z1bmMgKHggKkdlbmVyYXRlZEZpbGUpIEdldFBhdGgoKSBzdHJpbmcgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguUGF0aAorCX0KKwlyZXR1cm4gIiIKK30KKworZnVuYyAoeCAqR2VuZXJhdGVkRmlsZSkgR2V0Q29udGVudHMoKSBbXWJ5dGUgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguQ29udGVudHMKKwl9CisJcmV0dXJuIG5pbAorfQorCit0eXBlIFNvdXJjZUZpbGUgc3RydWN0IHsKKwlzdGF0ZSAgICAgICAgIHByb3RvaW1wbC5NZXNzYWdlU3RhdGUKKwlzaXplQ2FjaGUgICAgIHByb3RvaW1wbC5TaXplQ2FjaGUKKwl1bmtub3duRmllbGRzIHByb3RvaW1wbC5Vbmtub3duRmllbGRzCisKKwkvLyBQYXRoIHRvIHRoZSBzb3VyY2UgZmlsZSByZWxhdGl2ZSB0byByZXBvc2l0b3J5IHJvb3QuCisJUGF0aCBzdHJpbmcgYHByb3RvYnVmOiJieXRlcywxLG9wdCxuYW1lPXBhdGgscHJvdG8zIiBqc29uOiJwYXRoLG9taXRlbXB0eSJgCisJLy8gV29ya2luZyBkaXJlY3RvcnkgdXNlZCBieSB0aGUgYnVpbGQgc3lzdGVtLiBBbGwgdGhlIHJlbGF0aXZlCisJLy8gcGF0aHMgaW4gY29tcGlsZXJfYXJndW1lbnRzIHNob3VsZCBiZSByZWxhdGl2ZSB0byB0aGlzIHBhdGguCisJLy8gUmVsYXRpdmUgdG8gcmVwb3NpdG9yeSByb290LgorCVdvcmtpbmdEaXIgc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsMixvcHQsbmFtZT13b3JraW5nX2Rpcixqc29uPXdvcmtpbmdEaXIscHJvdG8zIiBqc29uOiJ3b3JraW5nX2RpcixvbWl0ZW1wdHkiYAorCS8vIENvbXBpbGVyIGFyZ3VtZW50cyB0byBjb21waWxlIHRoZSBzb3VyY2UgZmlsZS4gSWYgbXVsdGlwbGUgdmFyaWFudHMKKwkvLyBvZiB0aGUgbW9kdWxlIGJlaW5nIGNvbXBpbGVkIGFyZSBwb3NzaWJsZSwgdGhlIHF1ZXJ5IHNjcmlwdCB3aWxsIGNob29zZQorCS8vIG9uZS4KKwlDb21waWxlckFyZ3VtZW50cyBbXXN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDMscmVwLG5hbWU9Y29tcGlsZXJfYXJndW1lbnRzLGpzb249Y29tcGlsZXJBcmd1bWVudHMscHJvdG8zIiBqc29uOiJjb21waWxlcl9hcmd1bWVudHMsb21pdGVtcHR5ImAKKwkvLyBBbnkgZ2VuZXJhdGVkIGZpbGVzIHRoYXQgYXJlIHVzZWQgaW4gY29tcGlsaW5nIHRoZSBmaWxlLgorCUdlbmVyYXRlZCBbXSpHZW5lcmF0ZWRGaWxlIGBwcm90b2J1ZjoiYnl0ZXMsNCxyZXAsbmFtZT1nZW5lcmF0ZWQscHJvdG8zIiBqc29uOiJnZW5lcmF0ZWQsb21pdGVtcHR5ImAKKwkvLyBQYXRocyB0byBhbGwgb2YgdGhlIHNvdXJjZXMsIGxpa2UgYnVpbGQgZmlsZXMsIGNvZGUgZ2VuZXJhdG9ycywKKwkvLyBwcm90byBmaWxlcyBldGMuIHRoYXQgd2VyZSB1c2VkIGR1cmluZyBhbmFseXNpcy4gVXNlZCB0byBmaWd1cmUKKwkvLyBvdXQgd2hlbiBhIHNldCBvZiBidWlsZCBhcnRpZmFjdHMgYXJlIHN0YWxlIGFuZCB0aGUgcXVlcnkgdG9vbAorCS8vIG11c3QgYmUgcmUtcnVuLgorCS8vIFJlbGF0aXZlIHRvIHJlcG9zaXRvcnkgcm9vdC4KKwlEZXBzIFtdc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsNSxyZXAsbmFtZT1kZXBzLHByb3RvMyIganNvbjoiZGVwcyxvbWl0ZW1wdHkiYAorCS8vIFJlcHJlc2VudHMgYW5hbHlzaXMgc3RhdHVzIGZvciB0aGlzIHBhcnRpY3VsYXIgZmlsZS4gZS5nLiBub3QgcGFydAorCS8vIG9mIHRoZSBidWlsZCBncmFwaC4KKwlTdGF0dXMgKlN0YXR1cyBgcHJvdG9idWY6ImJ5dGVzLDYsb3B0LG5hbWU9c3RhdHVzLHByb3RvMyxvbmVvZiIganNvbjoic3RhdHVzLG9taXRlbXB0eSJgCit9CisKK2Z1bmMgKHggKlNvdXJjZUZpbGUpIFJlc2V0KCkgeworCSp4ID0gU291cmNlRmlsZXt9CisJaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgeworCQltaSA6PSAmZmlsZV9jY19hbmFseXplcl9wcm90b19tc2dUeXBlc1s0XQorCQltcyA6PSBwcm90b2ltcGwuWC5NZXNzYWdlU3RhdGVPZihwcm90b2ltcGwuUG9pbnRlcih4KSkKKwkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKKwl9Cit9CisKK2Z1bmMgKHggKlNvdXJjZUZpbGUpIFN0cmluZygpIHN0cmluZyB7CisJcmV0dXJuIHByb3RvaW1wbC5YLk1lc3NhZ2VTdHJpbmdPZih4KQorfQorCitmdW5jICgqU291cmNlRmlsZSkgUHJvdG9NZXNzYWdlKCkge30KKworZnVuYyAoeCAqU291cmNlRmlsZSkgUHJvdG9SZWZsZWN0KCkgcHJvdG9yZWZsZWN0Lk1lc3NhZ2UgeworCW1pIDo9ICZmaWxlX2NjX2FuYWx5emVyX3Byb3RvX21zZ1R5cGVzWzRdCisJaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgJiYgeCAhPSBuaWwgeworCQltcyA6PSBwcm90b2ltcGwuWC5NZXNzYWdlU3RhdGVPZihwcm90b2ltcGwuUG9pbnRlcih4KSkKKwkJaWYgbXMuTG9hZE1lc3NhZ2VJbmZvKCkgPT0gbmlsIHsKKwkJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCisJCX0KKwkJcmV0dXJuIG1zCisJfQorCXJldHVybiBtaS5NZXNzYWdlT2YoeCkKK30KKworLy8gRGVwcmVjYXRlZDogVXNlIFNvdXJjZUZpbGUuUHJvdG9SZWZsZWN0LkRlc2NyaXB0b3IgaW5zdGVhZC4KK2Z1bmMgKCpTb3VyY2VGaWxlKSBEZXNjcmlwdG9yKCkgKFtdYnl0ZSwgW11pbnQpIHsKKwlyZXR1cm4gZmlsZV9jY19hbmFseXplcl9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHs0fQorfQorCitmdW5jICh4ICpTb3VyY2VGaWxlKSBHZXRQYXRoKCkgc3RyaW5nIHsKKwlpZiB4ICE9IG5pbCB7CisJCXJldHVybiB4LlBhdGgKKwl9CisJcmV0dXJuICIiCit9CisKK2Z1bmMgKHggKlNvdXJjZUZpbGUpIEdldFdvcmtpbmdEaXIoKSBzdHJpbmcgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguV29ya2luZ0RpcgorCX0KKwlyZXR1cm4gIiIKK30KKworZnVuYyAoeCAqU291cmNlRmlsZSkgR2V0Q29tcGlsZXJBcmd1bWVudHMoKSBbXXN0cmluZyB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5Db21waWxlckFyZ3VtZW50cworCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHggKlNvdXJjZUZpbGUpIEdldEdlbmVyYXRlZCgpIFtdKkdlbmVyYXRlZEZpbGUgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguR2VuZXJhdGVkCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAoeCAqU291cmNlRmlsZSkgR2V0RGVwcygpIFtdc3RyaW5nIHsKKwlpZiB4ICE9IG5pbCB7CisJCXJldHVybiB4LkRlcHMKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jICh4ICpTb3VyY2VGaWxlKSBHZXRTdGF0dXMoKSAqU3RhdHVzIHsKKwlpZiB4ICE9IG5pbCB7CisJCXJldHVybiB4LlN0YXR1cworCX0KKwlyZXR1cm4gbmlsCit9CisKK3R5cGUgSWRlQW5hbHlzaXMgc3RydWN0IHsKKwlzdGF0ZSAgICAgICAgIHByb3RvaW1wbC5NZXNzYWdlU3RhdGUKKwlzaXplQ2FjaGUgICAgIHByb3RvaW1wbC5TaXplQ2FjaGUKKwl1bmtub3duRmllbGRzIHByb3RvaW1wbC5Vbmtub3duRmllbGRzCisKKwlTb3VyY2VzIFtdKlNvdXJjZUZpbGUgYHByb3RvYnVmOiJieXRlcywyLHJlcCxuYW1lPXNvdXJjZXMscHJvdG8zIiBqc29uOiJzb3VyY2VzLG9taXRlbXB0eSJgCisJLy8gU3RhdHVzIHJlcHJlc2VudGluZyBvdmVyYWxsIGFuYWx5c2lzLgorCS8vIFNob3VsZCBmYWlsIG9ubHkgd2hlbiBubyBhbmFseXNpcyBjYW4gYmUgcGVyZm9ybWVkLgorCVN0YXR1cyAqU3RhdHVzIGBwcm90b2J1ZjoiYnl0ZXMsMyxvcHQsbmFtZT1zdGF0dXMscHJvdG8zLG9uZW9mIiBqc29uOiJzdGF0dXMsb21pdGVtcHR5ImAKK30KKworZnVuYyAoeCAqSWRlQW5hbHlzaXMpIFJlc2V0KCkgeworCSp4ID0gSWRlQW5hbHlzaXN7fQorCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkIHsKKwkJbWkgOj0gJmZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbNV0KKwkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCisJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCisJfQorfQorCitmdW5jICh4ICpJZGVBbmFseXNpcykgU3RyaW5nKCkgc3RyaW5nIHsKKwlyZXR1cm4gcHJvdG9pbXBsLlguTWVzc2FnZVN0cmluZ09mKHgpCit9CisKK2Z1bmMgKCpJZGVBbmFseXNpcykgUHJvdG9NZXNzYWdlKCkge30KKworZnVuYyAoeCAqSWRlQW5hbHlzaXMpIFByb3RvUmVmbGVjdCgpIHByb3RvcmVmbGVjdC5NZXNzYWdlIHsKKwltaSA6PSAmZmlsZV9jY19hbmFseXplcl9wcm90b19tc2dUeXBlc1s1XQorCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkICYmIHggIT0gbmlsIHsKKwkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCisJCWlmIG1zLkxvYWRNZXNzYWdlSW5mbygpID09IG5pbCB7CisJCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQorCQl9CisJCXJldHVybiBtcworCX0KKwlyZXR1cm4gbWkuTWVzc2FnZU9mKHgpCit9CisKKy8vIERlcHJlY2F0ZWQ6IFVzZSBJZGVBbmFseXNpcy5Qcm90b1JlZmxlY3QuRGVzY3JpcHRvciBpbnN0ZWFkLgorZnVuYyAoKklkZUFuYWx5c2lzKSBEZXNjcmlwdG9yKCkgKFtdYnl0ZSwgW11pbnQpIHsKKwlyZXR1cm4gZmlsZV9jY19hbmFseXplcl9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHs1fQorfQorCitmdW5jICh4ICpJZGVBbmFseXNpcykgR2V0U291cmNlcygpIFtdKlNvdXJjZUZpbGUgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguU291cmNlcworCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHggKklkZUFuYWx5c2lzKSBHZXRTdGF0dXMoKSAqU3RhdHVzIHsKKwlpZiB4ICE9IG5pbCB7CisJCXJldHVybiB4LlN0YXR1cworCX0KKwlyZXR1cm4gbmlsCit9CisKKy8vIEJ1aWxkIGRlcGVuZGVuY2llcyBvZiBhIHNvdXJjZSBmaWxlIGZvciBwcm92aWRpbmcgbGFuZ3VhZ2Ugc2VydmljZXMuCit0eXBlIERlcHNSZXNwb25zZV9EZXBzIHN0cnVjdCB7CisJc3RhdGUgICAgICAgICBwcm90b2ltcGwuTWVzc2FnZVN0YXRlCisJc2l6ZUNhY2hlICAgICBwcm90b2ltcGwuU2l6ZUNhY2hlCisJdW5rbm93bkZpZWxkcyBwcm90b2ltcGwuVW5rbm93bkZpZWxkcworCisJLy8gUmVsYXRpdmUgdG8gcmVwb19kaXIuCisJU291cmNlRmlsZSBzdHJpbmcgYHByb3RvYnVmOiJieXRlcywxLG9wdCxuYW1lPXNvdXJjZV9maWxlLGpzb249c291cmNlRmlsZSxwcm90bzMiIGpzb246InNvdXJjZV9maWxlLG9taXRlbXB0eSJgCisJLy8gQnVpbGQgdGFyZ2V0IHRvIGV4ZWN1dGUgZm9yIGdlbmVyYXRpbmcgZGVwLgorCUJ1aWxkVGFyZ2V0IFtdc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsMixyZXAsbmFtZT1idWlsZF90YXJnZXQsanNvbj1idWlsZFRhcmdldCxwcm90bzMiIGpzb246ImJ1aWxkX3RhcmdldCxvbWl0ZW1wdHkiYAorCVN0YXR1cyAgICAgICpTdGF0dXMgIGBwcm90b2J1ZjoiYnl0ZXMsMyxvcHQsbmFtZT1zdGF0dXMscHJvdG8zLG9uZW9mIiBqc29uOiJzdGF0dXMsb21pdGVtcHR5ImAKK30KKworZnVuYyAoeCAqRGVwc1Jlc3BvbnNlX0RlcHMpIFJlc2V0KCkgeworCSp4ID0gRGVwc1Jlc3BvbnNlX0RlcHN7fQorCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkIHsKKwkJbWkgOj0gJmZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbNl0KKwkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCisJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCisJfQorfQorCitmdW5jICh4ICpEZXBzUmVzcG9uc2VfRGVwcykgU3RyaW5nKCkgc3RyaW5nIHsKKwlyZXR1cm4gcHJvdG9pbXBsLlguTWVzc2FnZVN0cmluZ09mKHgpCit9CisKK2Z1bmMgKCpEZXBzUmVzcG9uc2VfRGVwcykgUHJvdG9NZXNzYWdlKCkge30KKworZnVuYyAoeCAqRGVwc1Jlc3BvbnNlX0RlcHMpIFByb3RvUmVmbGVjdCgpIHByb3RvcmVmbGVjdC5NZXNzYWdlIHsKKwltaSA6PSAmZmlsZV9jY19hbmFseXplcl9wcm90b19tc2dUeXBlc1s2XQorCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkICYmIHggIT0gbmlsIHsKKwkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCisJCWlmIG1zLkxvYWRNZXNzYWdlSW5mbygpID09IG5pbCB7CisJCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQorCQl9CisJCXJldHVybiBtcworCX0KKwlyZXR1cm4gbWkuTWVzc2FnZU9mKHgpCit9CisKKy8vIERlcHJlY2F0ZWQ6IFVzZSBEZXBzUmVzcG9uc2VfRGVwcy5Qcm90b1JlZmxlY3QuRGVzY3JpcHRvciBpbnN0ZWFkLgorZnVuYyAoKkRlcHNSZXNwb25zZV9EZXBzKSBEZXNjcmlwdG9yKCkgKFtdYnl0ZSwgW11pbnQpIHsKKwlyZXR1cm4gZmlsZV9jY19hbmFseXplcl9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHsyLCAwfQorfQorCitmdW5jICh4ICpEZXBzUmVzcG9uc2VfRGVwcykgR2V0U291cmNlRmlsZSgpIHN0cmluZyB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5Tb3VyY2VGaWxlCisJfQorCXJldHVybiAiIgorfQorCitmdW5jICh4ICpEZXBzUmVzcG9uc2VfRGVwcykgR2V0QnVpbGRUYXJnZXQoKSBbXXN0cmluZyB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5CdWlsZFRhcmdldAorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHggKkRlcHNSZXNwb25zZV9EZXBzKSBHZXRTdGF0dXMoKSAqU3RhdHVzIHsKKwlpZiB4ICE9IG5pbCB7CisJCXJldHVybiB4LlN0YXR1cworCX0KKwlyZXR1cm4gbmlsCit9CisKK3ZhciBGaWxlX2NjX2FuYWx5emVyX3Byb3RvIHByb3RvcmVmbGVjdC5GaWxlRGVzY3JpcHRvcgorCit2YXIgZmlsZV9jY19hbmFseXplcl9wcm90b19yYXdEZXNjID0gW11ieXRleworCTB4MGEsIDB4MTEsIDB4NjMsIDB4NjMsIDB4NWYsIDB4NjEsIDB4NmUsIDB4NjEsIDB4NmMsIDB4NzksIDB4N2EsIDB4NjUsIDB4NzIsIDB4MmUsIDB4NzAsIDB4NzIsCisJMHg2ZiwgMHg3NCwgMHg2ZiwgMHgxMiwgMHgwYiwgMHg2MywgMHg2MywgMHg1ZiwgMHg2MSwgMHg2ZSwgMHg2MSwgMHg2YywgMHg3OSwgMHg3YSwgMHg2NSwgMHg3MiwKKwkweDIyLCAweDdlLCAweDBhLCAweDA2LCAweDUzLCAweDc0LCAweDYxLCAweDc0LCAweDc1LCAweDczLCAweDEyLCAweDJjLCAweDBhLCAweDA0LCAweDYzLCAweDZmLAorCTB4NjQsIDB4NjUsIDB4MTgsIDB4MDEsIDB4MjAsIDB4MDEsIDB4MjgsIDB4MGUsIDB4MzIsIDB4MTgsIDB4MmUsIDB4NjMsIDB4NjMsIDB4NWYsIDB4NjEsIDB4NmUsCisJMHg2MSwgMHg2YywgMHg3OSwgMHg3YSwgMHg2NSwgMHg3MiwgMHgyZSwgMHg1MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHgyZSwgMHg0MywgMHg2ZiwKKwkweDY0LCAweDY1LCAweDUyLCAweDA0LCAweDYzLCAweDZmLCAweDY0LCAweDY1LCAweDEyLCAweDFkLCAweDBhLCAweDA3LCAweDZkLCAweDY1LCAweDczLCAweDczLAorCTB4NjEsIDB4NjcsIDB4NjUsIDB4MTgsIDB4MDIsIDB4MjAsIDB4MDEsIDB4MjgsIDB4MDksIDB4NDgsIDB4MDAsIDB4NTIsIDB4MDcsIDB4NmQsIDB4NjUsIDB4NzMsCisJMHg3MywgMHg2MSwgMHg2NywgMHg2NSwgMHg4OCwgMHgwMSwgMHgwMSwgMHgyMiwgMHgxYiwgMHgwYSwgMHgwNCwgMHg0MywgMHg2ZiwgMHg2NCwgMHg2NSwgMHgxMiwKKwkweDA2LCAweDBhLCAweDAyLCAweDRmLCAweDRiLCAweDEwLCAweDAwLCAweDEyLCAweDBiLCAweDBhLCAweDA3LCAweDQ2LCAweDQxLCAweDQ5LCAweDRjLCAweDU1LAorCTB4NTIsIDB4NDUsIDB4MTAsIDB4MDEsIDB4NDIsIDB4MGEsIDB4MGEsIDB4MDgsIDB4NWYsIDB4NmQsIDB4NjUsIDB4NzMsIDB4NzMsIDB4NjEsIDB4NjcsIDB4NjUsCisJMHgyMiwgMHg4YiwgMHgwMSwgMHgwYSwgMHgwOSwgMHg1MiwgMHg2NSwgMHg3MCwgMHg2ZiwgMHg1MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg2NSwgMHgxMiwgMHgxOSwKKwkweDBhLCAweDA4LCAweDcyLCAweDY1LCAweDcwLCAweDZmLCAweDVmLCAweDY0LCAweDY5LCAweDcyLCAweDE4LCAweDAxLCAweDIwLCAweDAxLCAweDI4LCAweDA5LAorCTB4NTIsIDB4MDcsIDB4NzIsIDB4NjUsIDB4NzAsIDB4NmYsIDB4NDQsIDB4NjksIDB4NzIsIDB4MTIsIDB4MjgsIDB4MGEsIDB4MTAsIDB4NjEsIDB4NjMsIDB4NzQsCisJMHg2OSwgMHg3NiwgMHg2NSwgMHg1ZiwgMHg2NiwgMHg2OSwgMHg2YywgMHg2NSwgMHg1ZiwgMHg3MCwgMHg2MSwgMHg3NCwgMHg2OCwgMHgxOCwgMHgwMiwgMHgyMCwKKwkweDAzLCAweDI4LCAweDA5LCAweDUyLCAweDBlLCAweDYxLCAweDYzLCAweDc0LCAweDY5LCAweDc2LCAweDY1LCAweDQ2LCAweDY5LCAweDZjLCAweDY1LCAweDUwLAorCTB4NjEsIDB4NzQsIDB4NjgsIDB4MTIsIDB4MTcsIDB4MGEsIDB4MDcsIDB4NmYsIDB4NzUsIDB4NzQsIDB4NWYsIDB4NjQsIDB4NjksIDB4NzIsIDB4MTgsIDB4MDMsCisJMHgyMCwgMHgwMSwgMHgyOCwgMHgwOSwgMHg1MiwgMHgwNiwgMHg2ZiwgMHg3NSwgMHg3NCwgMHg0NCwgMHg2OSwgMHg3MiwgMHgxMiwgMHgyMCwgMHgwYSwgMHgwYywKKwkweDYzLCAweDZmLCAweDZkLCAweDcwLCAweDVmLCAweDY0LCAweDYyLCAweDVmLCAweDcwLCAweDYxLCAweDc0LCAweDY4LCAweDE4LCAweDA0LCAweDIwLCAweDAxLAorCTB4MjgsIDB4MDksIDB4NTIsIDB4MGEsIDB4NjMsIDB4NmYsIDB4NmQsIDB4NzAsIDB4NDQsIDB4NjIsIDB4NTAsIDB4NjEsIDB4NzQsIDB4NjgsIDB4MjIsIDB4ODksCisJMHgwMiwgMHgwYSwgMHgwYywgMHg0NCwgMHg2NSwgMHg3MCwgMHg3MywgMHg1MiwgMHg2NSwgMHg3MywgMHg3MCwgMHg2ZiwgMHg2ZSwgMHg3MywgMHg2NSwgMHgxMiwKKwkweDMyLCAweDBhLCAweDA0LCAweDY0LCAweDY1LCAweDcwLCAweDczLCAweDE4LCAweDAxLCAweDIwLCAweDAzLCAweDI4LCAweDBiLCAweDMyLCAweDFlLCAweDJlLAorCTB4NjMsIDB4NjMsIDB4NWYsIDB4NjEsIDB4NmUsIDB4NjEsIDB4NmMsIDB4NzksIDB4N2EsIDB4NjUsIDB4NzIsIDB4MmUsIDB4NDQsIDB4NjUsIDB4NzAsIDB4NzMsCisJMHg1MiwgMHg2NSwgMHg3MywgMHg3MCwgMHg2ZiwgMHg2ZSwgMHg3MywgMHg2NSwgMHgyZSwgMHg0NCwgMHg2NSwgMHg3MCwgMHg3MywgMHg1MiwgMHgwNCwgMHg2NCwKKwkweDY1LCAweDcwLCAweDczLCAweDEyLCAweDMwLCAweDBhLCAweDA2LCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDc1LCAweDczLCAweDE4LCAweDAyLCAweDIwLAorCTB4MDEsIDB4MjgsIDB4MGIsIDB4MzIsIDB4MTMsIDB4MmUsIDB4NjMsIDB4NjMsIDB4NWYsIDB4NjEsIDB4NmUsIDB4NjEsIDB4NmMsIDB4NzksIDB4N2EsIDB4NjUsCisJMHg3MiwgMHgyZSwgMHg1MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHg0OCwgMHgwMCwgMHg1MiwgMHgwNiwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwKKwkweDc1LCAweDczLCAweDg4LCAweDAxLCAweDAxLCAweDFhLCAweDg3LCAweDAxLCAweDBhLCAweDA0LCAweDQ0LCAweDY1LCAweDcwLCAweDczLCAweDEyLCAweDFmLAorCTB4MGEsIDB4MGIsIDB4NzMsIDB4NmYsIDB4NzUsIDB4NzIsIDB4NjMsIDB4NjUsIDB4NWYsIDB4NjYsIDB4NjksIDB4NmMsIDB4NjUsIDB4MTgsIDB4MDEsIDB4MjAsCisJMHgwMSwgMHgyOCwgMHgwOSwgMHg1MiwgMHgwYSwgMHg3MywgMHg2ZiwgMHg3NSwgMHg3MiwgMHg2MywgMHg2NSwgMHg0NiwgMHg2OSwgMHg2YywgMHg2NSwgMHgxMiwKKwkweDIxLCAweDBhLCAweDBjLCAweDYyLCAweDc1LCAweDY5LCAweDZjLCAweDY0LCAweDVmLCAweDc0LCAweDYxLCAweDcyLCAweDY3LCAweDY1LCAweDc0LCAweDE4LAorCTB4MDIsIDB4MjAsIDB4MDMsIDB4MjgsIDB4MDksIDB4NTIsIDB4MGIsIDB4NjIsIDB4NzUsIDB4NjksIDB4NmMsIDB4NjQsIDB4NTQsIDB4NjEsIDB4NzIsIDB4NjcsCisJMHg2NSwgMHg3NCwgMHgxMiwgMHgzMCwgMHgwYSwgMHgwNiwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHgxOCwgMHgwMywgMHgyMCwgMHgwMSwKKwkweDI4LCAweDBiLCAweDMyLCAweDEzLCAweDJlLCAweDYzLCAweDYzLCAweDVmLCAweDYxLCAweDZlLCAweDYxLCAweDZjLCAweDc5LCAweDdhLCAweDY1LCAweDcyLAorCTB4MmUsIDB4NTMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4NzUsIDB4NzMsIDB4NDgsIDB4MDAsIDB4NTIsIDB4MDYsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4NzUsCisJMHg3MywgMHg4OCwgMHgwMSwgMHgwMSwgMHg0MiwgMHgwOSwgMHgwYSwgMHgwNywgMHg1ZiwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHg0MiwKKwkweDA5LCAweDBhLCAweDA3LCAweDVmLCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDc1LCAweDczLCAweDIyLCAweDUxLCAweDBhLCAweDBkLCAweDQ3LCAweDY1LAorCTB4NmUsIDB4NjUsIDB4NzIsIDB4NjEsIDB4NzQsIDB4NjUsIDB4NjQsIDB4NDYsIDB4NjksIDB4NmMsIDB4NjUsIDB4MTIsIDB4MTIsIDB4MGEsIDB4MDQsIDB4NzAsCisJMHg2MSwgMHg3NCwgMHg2OCwgMHgxOCwgMHgwMSwgMHgyMCwgMHgwMSwgMHgyOCwgMHgwOSwgMHg1MiwgMHgwNCwgMHg3MCwgMHg2MSwgMHg3NCwgMHg2OCwgMHgxMiwKKwkweDFmLCAweDBhLCAweDA4LCAweDYzLCAweDZmLCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDc0LCAweDczLCAweDE4LCAweDAyLCAweDIwLCAweDAxLCAweDI4LAorCTB4MGMsIDB4NDgsIDB4MDAsIDB4NTIsIDB4MDgsIDB4NjMsIDB4NmYsIDB4NmUsIDB4NzQsIDB4NjUsIDB4NmUsIDB4NzQsIDB4NzMsIDB4ODgsIDB4MDEsIDB4MDEsCisJMHg0MiwgMHgwYiwgMHgwYSwgMHgwOSwgMHg1ZiwgMHg2MywgMHg2ZiwgMHg2ZSwgMHg3NCwgMHg2NSwgMHg2ZSwgMHg3NCwgMHg3MywgMHgyMiwgMHhmYiwgMHgwMSwKKwkweDBhLCAweDBhLCAweDUzLCAweDZmLCAweDc1LCAweDcyLCAweDYzLCAweDY1LCAweDQ2LCAweDY5LCAweDZjLCAweDY1LCAweDEyLCAweDEyLCAweDBhLCAweDA0LAorCTB4NzAsIDB4NjEsIDB4NzQsIDB4NjgsIDB4MTgsIDB4MDEsIDB4MjAsIDB4MDEsIDB4MjgsIDB4MDksIDB4NTIsIDB4MDQsIDB4NzAsIDB4NjEsIDB4NzQsIDB4NjgsCisJMHgxMiwgMHgxZiwgMHgwYSwgMHgwYiwgMHg3NywgMHg2ZiwgMHg3MiwgMHg2YiwgMHg2OSwgMHg2ZSwgMHg2NywgMHg1ZiwgMHg2NCwgMHg2OSwgMHg3MiwgMHgxOCwKKwkweDAyLCAweDIwLCAweDAxLCAweDI4LCAweDA5LCAweDUyLCAweDBhLCAweDc3LCAweDZmLCAweDcyLCAweDZiLCAweDY5LCAweDZlLCAweDY3LCAweDQ0LCAweDY5LAorCTB4NzIsIDB4MTIsIDB4MmQsIDB4MGEsIDB4MTIsIDB4NjMsIDB4NmYsIDB4NmQsIDB4NzAsIDB4NjksIDB4NmMsIDB4NjUsIDB4NzIsIDB4NWYsIDB4NjEsIDB4NzIsCisJMHg2NywgMHg3NSwgMHg2ZCwgMHg2NSwgMHg2ZSwgMHg3NCwgMHg3MywgMHgxOCwgMHgwMywgMHgyMCwgMHgwMywgMHgyOCwgMHgwOSwgMHg1MiwgMHgxMSwgMHg2MywKKwkweDZmLCAweDZkLCAweDcwLCAweDY5LCAweDZjLCAweDY1LCAweDcyLCAweDQxLCAweDcyLCAweDY3LCAweDc1LCAweDZkLCAweDY1LCAweDZlLCAweDc0LCAweDczLAorCTB4MTIsIDB4MzgsIDB4MGEsIDB4MDksIDB4NjcsIDB4NjUsIDB4NmUsIDB4NjUsIDB4NzIsIDB4NjEsIDB4NzQsIDB4NjUsIDB4NjQsIDB4MTgsIDB4MDQsIDB4MjAsCisJMHgwMywgMHgyOCwgMHgwYiwgMHgzMiwgMHgxYSwgMHgyZSwgMHg2MywgMHg2MywgMHg1ZiwgMHg2MSwgMHg2ZSwgMHg2MSwgMHg2YywgMHg3OSwgMHg3YSwgMHg2NSwKKwkweDcyLCAweDJlLCAweDQ3LCAweDY1LCAweDZlLCAweDY1LCAweDcyLCAweDYxLCAweDc0LCAweDY1LCAweDY0LCAweDQ2LCAweDY5LCAweDZjLCAweDY1LCAweDUyLAorCTB4MDksIDB4NjcsIDB4NjUsIDB4NmUsIDB4NjUsIDB4NzIsIDB4NjEsIDB4NzQsIDB4NjUsIDB4NjQsIDB4MTIsIDB4MTIsIDB4MGEsIDB4MDQsIDB4NjQsIDB4NjUsCisJMHg3MCwgMHg3MywgMHgxOCwgMHgwNSwgMHgyMCwgMHgwMywgMHgyOCwgMHgwOSwgMHg1MiwgMHgwNCwgMHg2NCwgMHg2NSwgMHg3MCwgMHg3MywgMHgxMiwgMHgzMCwKKwkweDBhLCAweDA2LCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDc1LCAweDczLCAweDE4LCAweDA2LCAweDIwLCAweDAxLCAweDI4LCAweDBiLCAweDMyLCAweDEzLAorCTB4MmUsIDB4NjMsIDB4NjMsIDB4NWYsIDB4NjEsIDB4NmUsIDB4NjEsIDB4NmMsIDB4NzksIDB4N2EsIDB4NjUsIDB4NzIsIDB4MmUsIDB4NTMsIDB4NzQsIDB4NjEsCisJMHg3NCwgMHg3NSwgMHg3MywgMHg0OCwgMHgwMCwgMHg1MiwgMHgwNiwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHg4OCwgMHgwMSwgMHgwMSwKKwkweDQyLCAweDA5LCAweDBhLCAweDA3LCAweDVmLCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDc1LCAweDczLCAweDIyLCAweDgzLCAweDAxLCAweDBhLCAweDBiLAorCTB4NDksIDB4NjQsIDB4NjUsIDB4NDEsIDB4NmUsIDB4NjEsIDB4NmMsIDB4NzksIDB4NzMsIDB4NjksIDB4NzMsIDB4MTIsIDB4MzEsIDB4MGEsIDB4MDcsIDB4NzMsCisJMHg2ZiwgMHg3NSwgMHg3MiwgMHg2MywgMHg2NSwgMHg3MywgMHgxOCwgMHgwMiwgMHgyMCwgMHgwMywgMHgyOCwgMHgwYiwgMHgzMiwgMHgxNywgMHgyZSwgMHg2MywKKwkweDYzLCAweDVmLCAweDYxLCAweDZlLCAweDYxLCAweDZjLCAweDc5LCAweDdhLCAweDY1LCAweDcyLCAweDJlLCAweDUzLCAweDZmLCAweDc1LCAweDcyLCAweDYzLAorCTB4NjUsIDB4NDYsIDB4NjksIDB4NmMsIDB4NjUsIDB4NTIsIDB4MDcsIDB4NzMsIDB4NmYsIDB4NzUsIDB4NzIsIDB4NjMsIDB4NjUsIDB4NzMsIDB4MTIsIDB4MzAsCisJMHgwYSwgMHgwNiwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHgxOCwgMHgwMywgMHgyMCwgMHgwMSwgMHgyOCwgMHgwYiwgMHgzMiwgMHgxMywKKwkweDJlLCAweDYzLCAweDYzLCAweDVmLCAweDYxLCAweDZlLCAweDYxLCAweDZjLCAweDc5LCAweDdhLCAweDY1LCAweDcyLCAweDJlLCAweDUzLCAweDc0LCAweDYxLAorCTB4NzQsIDB4NzUsIDB4NzMsIDB4NDgsIDB4MDAsIDB4NTIsIDB4MDYsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4NzUsIDB4NzMsIDB4ODgsIDB4MDEsIDB4MDEsCisJMHg0MiwgMHgwOSwgMHgwYSwgMHgwNywgMHg1ZiwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHg0YSwgMHgwNCwgMHgwOCwgMHgwMSwgMHgxMCwKKwkweDAyLCAweDQyLCAweDFkLCAweDVhLCAweDFiLCAweDY5LCAweDY0LCAweDY1LCAweDVmLCAweDcxLCAweDc1LCAweDY1LCAweDcyLCAweDc5LCAweDJmLCAweDYzLAorCTB4NjMsIDB4NWYsIDB4NjEsIDB4NmUsIDB4NjEsIDB4NmMsIDB4NzksIDB4N2EsIDB4NjUsIDB4NzIsIDB4NWYsIDB4NzAsIDB4NzIsIDB4NmYsIDB4NzQsIDB4NmYsCisJMHg2MiwgMHgwNiwgMHg3MCwgMHg3MiwgMHg2ZiwgMHg3NCwgMHg2ZiwgMHgzMywKK30KKwordmFyICgKKwlmaWxlX2NjX2FuYWx5emVyX3Byb3RvX3Jhd0Rlc2NPbmNlIHN5bmMuT25jZQorCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fcmF3RGVzY0RhdGEgPSBmaWxlX2NjX2FuYWx5emVyX3Byb3RvX3Jhd0Rlc2MKKykKKworZnVuYyBmaWxlX2NjX2FuYWx5emVyX3Byb3RvX3Jhd0Rlc2NHWklQKCkgW11ieXRlIHsKKwlmaWxlX2NjX2FuYWx5emVyX3Byb3RvX3Jhd0Rlc2NPbmNlLkRvKGZ1bmMoKSB7CisJCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fcmF3RGVzY0RhdGEgPSBwcm90b2ltcGwuWC5Db21wcmVzc0daSVAoZmlsZV9jY19hbmFseXplcl9wcm90b19yYXdEZXNjRGF0YSkKKwl9KQorCXJldHVybiBmaWxlX2NjX2FuYWx5emVyX3Byb3RvX3Jhd0Rlc2NEYXRhCit9CisKK3ZhciBmaWxlX2NjX2FuYWx5emVyX3Byb3RvX2VudW1UeXBlcyA9IG1ha2UoW11wcm90b2ltcGwuRW51bUluZm8sIDEpCit2YXIgZmlsZV9jY19hbmFseXplcl9wcm90b19tc2dUeXBlcyA9IG1ha2UoW11wcm90b2ltcGwuTWVzc2FnZUluZm8sIDcpCit2YXIgZmlsZV9jY19hbmFseXplcl9wcm90b19nb1R5cGVzID0gW11pbnRlcmZhY2V7fXsKKwkoU3RhdHVzX0NvZGUpKDApLCAgICAgICAgICAvLyAwOiBjY19hbmFseXplci5TdGF0dXMuQ29kZQorCSgqU3RhdHVzKShuaWwpLCAgICAgICAgICAgIC8vIDE6IGNjX2FuYWx5emVyLlN0YXR1cworCSgqUmVwb1N0YXRlKShuaWwpLCAgICAgICAgIC8vIDI6IGNjX2FuYWx5emVyLlJlcG9TdGF0ZQorCSgqRGVwc1Jlc3BvbnNlKShuaWwpLCAgICAgIC8vIDM6IGNjX2FuYWx5emVyLkRlcHNSZXNwb25zZQorCSgqR2VuZXJhdGVkRmlsZSkobmlsKSwgICAgIC8vIDQ6IGNjX2FuYWx5emVyLkdlbmVyYXRlZEZpbGUKKwkoKlNvdXJjZUZpbGUpKG5pbCksICAgICAgICAvLyA1OiBjY19hbmFseXplci5Tb3VyY2VGaWxlCisJKCpJZGVBbmFseXNpcykobmlsKSwgICAgICAgLy8gNjogY2NfYW5hbHl6ZXIuSWRlQW5hbHlzaXMKKwkoKkRlcHNSZXNwb25zZV9EZXBzKShuaWwpLCAvLyA3OiBjY19hbmFseXplci5EZXBzUmVzcG9uc2UuRGVwcworfQordmFyIGZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fZGVwSWR4cyA9IFtdaW50MzJ7CisJMCwgLy8gMDogY2NfYW5hbHl6ZXIuU3RhdHVzLmNvZGU6dHlwZV9uYW1lIC0+IGNjX2FuYWx5emVyLlN0YXR1cy5Db2RlCisJNywgLy8gMTogY2NfYW5hbHl6ZXIuRGVwc1Jlc3BvbnNlLmRlcHM6dHlwZV9uYW1lIC0+IGNjX2FuYWx5emVyLkRlcHNSZXNwb25zZS5EZXBzCisJMSwgLy8gMjogY2NfYW5hbHl6ZXIuRGVwc1Jlc3BvbnNlLnN0YXR1czp0eXBlX25hbWUgLT4gY2NfYW5hbHl6ZXIuU3RhdHVzCisJNCwgLy8gMzogY2NfYW5hbHl6ZXIuU291cmNlRmlsZS5nZW5lcmF0ZWQ6dHlwZV9uYW1lIC0+IGNjX2FuYWx5emVyLkdlbmVyYXRlZEZpbGUKKwkxLCAvLyA0OiBjY19hbmFseXplci5Tb3VyY2VGaWxlLnN0YXR1czp0eXBlX25hbWUgLT4gY2NfYW5hbHl6ZXIuU3RhdHVzCisJNSwgLy8gNTogY2NfYW5hbHl6ZXIuSWRlQW5hbHlzaXMuc291cmNlczp0eXBlX25hbWUgLT4gY2NfYW5hbHl6ZXIuU291cmNlRmlsZQorCTEsIC8vIDY6IGNjX2FuYWx5emVyLklkZUFuYWx5c2lzLnN0YXR1czp0eXBlX25hbWUgLT4gY2NfYW5hbHl6ZXIuU3RhdHVzCisJMSwgLy8gNzogY2NfYW5hbHl6ZXIuRGVwc1Jlc3BvbnNlLkRlcHMuc3RhdHVzOnR5cGVfbmFtZSAtPiBjY19hbmFseXplci5TdGF0dXMKKwk4LCAvLyBbODo4XSBpcyB0aGUgc3ViLWxpc3QgZm9yIG1ldGhvZCBvdXRwdXRfdHlwZQorCTgsIC8vIFs4OjhdIGlzIHRoZSBzdWItbGlzdCBmb3IgbWV0aG9kIGlucHV0X3R5cGUKKwk4LCAvLyBbODo4XSBpcyB0aGUgc3ViLWxpc3QgZm9yIGV4dGVuc2lvbiB0eXBlX25hbWUKKwk4LCAvLyBbODo4XSBpcyB0aGUgc3ViLWxpc3QgZm9yIGV4dGVuc2lvbiBleHRlbmRlZQorCTAsIC8vIFswOjhdIGlzIHRoZSBzdWItbGlzdCBmb3IgZmllbGQgdHlwZV9uYW1lCit9CisKK2Z1bmMgaW5pdCgpIHsgZmlsZV9jY19hbmFseXplcl9wcm90b19pbml0KCkgfQorZnVuYyBmaWxlX2NjX2FuYWx5emVyX3Byb3RvX2luaXQoKSB7CisJaWYgRmlsZV9jY19hbmFseXplcl9wcm90byAhPSBuaWwgeworCQlyZXR1cm4KKwl9CisJaWYgIXByb3RvaW1wbC5VbnNhZmVFbmFibGVkIHsKKwkJZmlsZV9jY19hbmFseXplcl9wcm90b19tc2dUeXBlc1swXS5FeHBvcnRlciA9IGZ1bmModiBpbnRlcmZhY2V7fSwgaSBpbnQpIGludGVyZmFjZXt9IHsKKwkJCXN3aXRjaCB2IDo9IHYuKCpTdGF0dXMpOyBpIHsKKwkJCWNhc2UgMDoKKwkJCQlyZXR1cm4gJnYuc3RhdGUKKwkJCWNhc2UgMToKKwkJCQlyZXR1cm4gJnYuc2l6ZUNhY2hlCisJCQljYXNlIDI6CisJCQkJcmV0dXJuICZ2LnVua25vd25GaWVsZHMKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIG5pbAorCQkJfQorCQl9CisJCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbMV0uRXhwb3J0ZXIgPSBmdW5jKHYgaW50ZXJmYWNle30sIGkgaW50KSBpbnRlcmZhY2V7fSB7CisJCQlzd2l0Y2ggdiA6PSB2LigqUmVwb1N0YXRlKTsgaSB7CisJCQljYXNlIDA6CisJCQkJcmV0dXJuICZ2LnN0YXRlCisJCQljYXNlIDE6CisJCQkJcmV0dXJuICZ2LnNpemVDYWNoZQorCQkJY2FzZSAyOgorCQkJCXJldHVybiAmdi51bmtub3duRmllbGRzCisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBuaWwKKwkJCX0KKwkJfQorCQlmaWxlX2NjX2FuYWx5emVyX3Byb3RvX21zZ1R5cGVzWzJdLkV4cG9ydGVyID0gZnVuYyh2IGludGVyZmFjZXt9LCBpIGludCkgaW50ZXJmYWNle30geworCQkJc3dpdGNoIHYgOj0gdi4oKkRlcHNSZXNwb25zZSk7IGkgeworCQkJY2FzZSAwOgorCQkJCXJldHVybiAmdi5zdGF0ZQorCQkJY2FzZSAxOgorCQkJCXJldHVybiAmdi5zaXplQ2FjaGUKKwkJCWNhc2UgMjoKKwkJCQlyZXR1cm4gJnYudW5rbm93bkZpZWxkcworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gbmlsCisJCQl9CisJCX0KKwkJZmlsZV9jY19hbmFseXplcl9wcm90b19tc2dUeXBlc1szXS5FeHBvcnRlciA9IGZ1bmModiBpbnRlcmZhY2V7fSwgaSBpbnQpIGludGVyZmFjZXt9IHsKKwkJCXN3aXRjaCB2IDo9IHYuKCpHZW5lcmF0ZWRGaWxlKTsgaSB7CisJCQljYXNlIDA6CisJCQkJcmV0dXJuICZ2LnN0YXRlCisJCQljYXNlIDE6CisJCQkJcmV0dXJuICZ2LnNpemVDYWNoZQorCQkJY2FzZSAyOgorCQkJCXJldHVybiAmdi51bmtub3duRmllbGRzCisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBuaWwKKwkJCX0KKwkJfQorCQlmaWxlX2NjX2FuYWx5emVyX3Byb3RvX21zZ1R5cGVzWzRdLkV4cG9ydGVyID0gZnVuYyh2IGludGVyZmFjZXt9LCBpIGludCkgaW50ZXJmYWNle30geworCQkJc3dpdGNoIHYgOj0gdi4oKlNvdXJjZUZpbGUpOyBpIHsKKwkJCWNhc2UgMDoKKwkJCQlyZXR1cm4gJnYuc3RhdGUKKwkJCWNhc2UgMToKKwkJCQlyZXR1cm4gJnYuc2l6ZUNhY2hlCisJCQljYXNlIDI6CisJCQkJcmV0dXJuICZ2LnVua25vd25GaWVsZHMKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIG5pbAorCQkJfQorCQl9CisJCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbNV0uRXhwb3J0ZXIgPSBmdW5jKHYgaW50ZXJmYWNle30sIGkgaW50KSBpbnRlcmZhY2V7fSB7CisJCQlzd2l0Y2ggdiA6PSB2LigqSWRlQW5hbHlzaXMpOyBpIHsKKwkJCWNhc2UgMDoKKwkJCQlyZXR1cm4gJnYuc3RhdGUKKwkJCWNhc2UgMToKKwkJCQlyZXR1cm4gJnYuc2l6ZUNhY2hlCisJCQljYXNlIDI6CisJCQkJcmV0dXJuICZ2LnVua25vd25GaWVsZHMKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIG5pbAorCQkJfQorCQl9CisJCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbNl0uRXhwb3J0ZXIgPSBmdW5jKHYgaW50ZXJmYWNle30sIGkgaW50KSBpbnRlcmZhY2V7fSB7CisJCQlzd2l0Y2ggdiA6PSB2LigqRGVwc1Jlc3BvbnNlX0RlcHMpOyBpIHsKKwkJCWNhc2UgMDoKKwkJCQlyZXR1cm4gJnYuc3RhdGUKKwkJCWNhc2UgMToKKwkJCQlyZXR1cm4gJnYuc2l6ZUNhY2hlCisJCQljYXNlIDI6CisJCQkJcmV0dXJuICZ2LnVua25vd25GaWVsZHMKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIG5pbAorCQkJfQorCQl9CisJfQorCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbMF0uT25lb2ZXcmFwcGVycyA9IFtdaW50ZXJmYWNle317fQorCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbMl0uT25lb2ZXcmFwcGVycyA9IFtdaW50ZXJmYWNle317fQorCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbM10uT25lb2ZXcmFwcGVycyA9IFtdaW50ZXJmYWNle317fQorCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbNF0uT25lb2ZXcmFwcGVycyA9IFtdaW50ZXJmYWNle317fQorCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbNV0uT25lb2ZXcmFwcGVycyA9IFtdaW50ZXJmYWNle317fQorCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbNl0uT25lb2ZXcmFwcGVycyA9IFtdaW50ZXJmYWNle317fQorCXR5cGUgeCBzdHJ1Y3R7fQorCW91dCA6PSBwcm90b2ltcGwuVHlwZUJ1aWxkZXJ7CisJCUZpbGU6IHByb3RvaW1wbC5EZXNjQnVpbGRlcnsKKwkJCUdvUGFja2FnZVBhdGg6IHJlZmxlY3QuVHlwZU9mKHh7fSkuUGtnUGF0aCgpLAorCQkJUmF3RGVzY3JpcHRvcjogZmlsZV9jY19hbmFseXplcl9wcm90b19yYXdEZXNjLAorCQkJTnVtRW51bXM6ICAgICAgMSwKKwkJCU51bU1lc3NhZ2VzOiAgIDcsCisJCQlOdW1FeHRlbnNpb25zOiAwLAorCQkJTnVtU2VydmljZXM6ICAgMCwKKwkJfSwKKwkJR29UeXBlczogICAgICAgICAgIGZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fZ29UeXBlcywKKwkJRGVwZW5kZW5jeUluZGV4ZXM6IGZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fZGVwSWR4cywKKwkJRW51bUluZm9zOiAgICAgICAgIGZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fZW51bVR5cGVzLAorCQlNZXNzYWdlSW5mb3M6ICAgICAgZmlsZV9jY19hbmFseXplcl9wcm90b19tc2dUeXBlcywKKwl9LkJ1aWxkKCkKKwlGaWxlX2NjX2FuYWx5emVyX3Byb3RvID0gb3V0LkZpbGUKKwlmaWxlX2NjX2FuYWx5emVyX3Byb3RvX3Jhd0Rlc2MgPSBuaWwKKwlmaWxlX2NjX2FuYWx5emVyX3Byb3RvX2dvVHlwZXMgPSBuaWwKKwlmaWxlX2NjX2FuYWx5emVyX3Byb3RvX2RlcElkeHMgPSBuaWwKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplcl9wcm90by9jY19hbmFseXplci5wcm90byBiL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplcl9wcm90by9jY19hbmFseXplci5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTRlYjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyX3Byb3RvL2NjX2FuYWx5emVyLnByb3RvCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3N5bnRheCA9ICJwcm90bzMiOworCitwYWNrYWdlIGNjX2FuYWx5emVyOworCitvcHRpb24gZ29fcGFja2FnZSA9ICJpZGVfcXVlcnkvY2NfYW5hbHl6ZXJfcHJvdG8iOworCisvLyBJbmRpY2F0ZXMgdGhlIHN1Y2Nlc3MvZmFpbHVyZSBmb3IgYW5hbHlzaXMuCittZXNzYWdlIFN0YXR1cyB7CisgIGVudW0gQ29kZSB7CisgICAgT0sgPSAwOworICAgIEZBSUxVUkUgPSAxOworICB9CisgIENvZGUgY29kZSA9IDE7CisgIC8vIERldGFpbHMgYWJvdXQgdGhlIHN0YXR1cywgbWlnaHQgYmUgZGlzcGxheWVkIHRvIHVzZXIuCisgIG9wdGlvbmFsIHN0cmluZyBtZXNzYWdlID0gMjsKK30KKworLy8gUmVwcmVzZW50cyBhbiBBbmRyb2lkIGNoZWNrb3V0IG9uIHVzZXIncyB3b3Jrc3RhdGlvbi4KK21lc3NhZ2UgUmVwb1N0YXRlIHsKKyAgLy8gQWJzb2x1dGUgcGF0aCBmb3IgdGhlIGNoZWNrb3V0IGluIHRoZSB3b3Jrc3RhdGlvbi4KKyAgLy8gZS5nLiAvaG9tZS91c2VyL3dvcmsvYW5kcm9pZC8KKyAgc3RyaW5nIHJlcG9fZGlyID0gMTsKKyAgLy8gUmVsYXRpdmUgdG8gcmVwb19kaXIuCisgIHJlcGVhdGVkIHN0cmluZyBhY3RpdmVfZmlsZV9wYXRoID0gMjsKKyAgLy8gUmVwb3NpdG9yeSByZWxhdGl2ZSBwYXRoIHRvIG91dHB1dCBkaXJlY3RvcnkgaW4gd29ya3N0YXRpb24uCisgIHN0cmluZyBvdXRfZGlyID0gMzsKKyAgLy8gUmVwb3NpdG9yeSByZWxhdGl2ZSBwYXRoIHRvIGNvbXBpbGVfY29tbWFuZHMuanNvbiBpbiB3b3Jrc3RhdGlvbi4KKyAgc3RyaW5nIGNvbXBfZGJfcGF0aCA9IDQ7Cit9CisKKy8vIFByb3ZpZGVzIGFsbCB0aGUgdGFyZ2V0cyB0aGF0IGFyZSBwcmUtcmVxdWlzaXRpZXMgZm9yIHJ1bm5pbmcgbGFuZ3VhZ2UKKy8vIHNlcnZpY2VzIG9uIGFjdGl2ZV9maWxlX3BhdGhzLgorbWVzc2FnZSBEZXBzUmVzcG9uc2UgeworICAvLyBCdWlsZCBkZXBlbmRlbmNpZXMgb2YgYSBzb3VyY2UgZmlsZSBmb3IgcHJvdmlkaW5nIGxhbmd1YWdlIHNlcnZpY2VzLgorICBtZXNzYWdlIERlcHMgeworICAgIC8vIFJlbGF0aXZlIHRvIHJlcG9fZGlyLgorICAgIHN0cmluZyBzb3VyY2VfZmlsZSA9IDE7CisgICAgLy8gQnVpbGQgdGFyZ2V0IHRvIGV4ZWN1dGUgZm9yIGdlbmVyYXRpbmcgZGVwLgorICAgIHJlcGVhdGVkIHN0cmluZyBidWlsZF90YXJnZXQgPSAyOworICAgIG9wdGlvbmFsIFN0YXR1cyBzdGF0dXMgPSAzOworICB9CisgIHJlcGVhdGVkIERlcHMgZGVwcyA9IDE7CisgIG9wdGlvbmFsIFN0YXR1cyBzdGF0dXMgPSAyOworfQorCisvLyBSZXR1cm5zIGFsbCB0aGUgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IGZvciBwcm92aWRpbmcgbGFuZ3VhZ2Ugc2VydmljZXMgZm9yIHRoZQorLy8gYWN0aXZlIGZpbGVzLgorbWVzc2FnZSBHZW5lcmF0ZWRGaWxlIHsKKyAgLy8gUGF0aCB0byB0aGUgZmlsZSByZWxhdGl2ZSB0byByZXBvc2l0b3J5IHJvb3QuCisgIHN0cmluZyBwYXRoID0gMTsKKworICAvLyBUaGUgdGV4dCBvZiB0aGUgZ2VuZXJhdGVkIGZpbGUsIGlmIG5vdCBwcm92aWRlZCBjb250ZW50cyB3aWxsIGJlIHJlYWQKKyAgLy8gZnJvbSB0aGUgcGF0aCBhYm92ZSBpbiB1c2VyJ3Mgd29ya3N0YXRpb24uCisgIG9wdGlvbmFsIGJ5dGVzIGNvbnRlbnRzID0gMjsKK30KKworbWVzc2FnZSBTb3VyY2VGaWxlIHsKKyAgLy8gUGF0aCB0byB0aGUgc291cmNlIGZpbGUgcmVsYXRpdmUgdG8gcmVwb3NpdG9yeSByb290LgorICBzdHJpbmcgcGF0aCA9IDE7CisKKyAgLy8gV29ya2luZyBkaXJlY3RvcnkgdXNlZCBieSB0aGUgYnVpbGQgc3lzdGVtLiBBbGwgdGhlIHJlbGF0aXZlCisgIC8vIHBhdGhzIGluIGNvbXBpbGVyX2FyZ3VtZW50cyBzaG91bGQgYmUgcmVsYXRpdmUgdG8gdGhpcyBwYXRoLgorICAvLyBSZWxhdGl2ZSB0byByZXBvc2l0b3J5IHJvb3QuCisgIHN0cmluZyB3b3JraW5nX2RpciA9IDI7CisKKyAgLy8gQ29tcGlsZXIgYXJndW1lbnRzIHRvIGNvbXBpbGUgdGhlIHNvdXJjZSBmaWxlLiBJZiBtdWx0aXBsZSB2YXJpYW50cworICAvLyBvZiB0aGUgbW9kdWxlIGJlaW5nIGNvbXBpbGVkIGFyZSBwb3NzaWJsZSwgdGhlIHF1ZXJ5IHNjcmlwdCB3aWxsIGNob29zZQorICAvLyBvbmUuCisgIHJlcGVhdGVkIHN0cmluZyBjb21waWxlcl9hcmd1bWVudHMgPSAzOworCisgIC8vIEFueSBnZW5lcmF0ZWQgZmlsZXMgdGhhdCBhcmUgdXNlZCBpbiBjb21waWxpbmcgdGhlIGZpbGUuCisgIHJlcGVhdGVkIEdlbmVyYXRlZEZpbGUgZ2VuZXJhdGVkID0gNDsKKworICAvLyBQYXRocyB0byBhbGwgb2YgdGhlIHNvdXJjZXMsIGxpa2UgYnVpbGQgZmlsZXMsIGNvZGUgZ2VuZXJhdG9ycywKKyAgLy8gcHJvdG8gZmlsZXMgZXRjLiB0aGF0IHdlcmUgdXNlZCBkdXJpbmcgYW5hbHlzaXMuIFVzZWQgdG8gZmlndXJlCisgIC8vIG91dCB3aGVuIGEgc2V0IG9mIGJ1aWxkIGFydGlmYWN0cyBhcmUgc3RhbGUgYW5kIHRoZSBxdWVyeSB0b29sCisgIC8vIG11c3QgYmUgcmUtcnVuLgorICAvLyBSZWxhdGl2ZSB0byByZXBvc2l0b3J5IHJvb3QuCisgIHJlcGVhdGVkIHN0cmluZyBkZXBzID0gNTsKKworICAvLyBSZXByZXNlbnRzIGFuYWx5c2lzIHN0YXR1cyBmb3IgdGhpcyBwYXJ0aWN1bGFyIGZpbGUuIGUuZy4gbm90IHBhcnQKKyAgLy8gb2YgdGhlIGJ1aWxkIGdyYXBoLgorICBvcHRpb25hbCBTdGF0dXMgc3RhdHVzID0gNjsKK30KKworbWVzc2FnZSBJZGVBbmFseXNpcyB7CisgIHJlcGVhdGVkIFNvdXJjZUZpbGUgc291cmNlcyA9IDI7CisKKyAgLy8gU3RhdHVzIHJlcHJlc2VudGluZyBvdmVyYWxsIGFuYWx5c2lzLgorICAvLyBTaG91bGQgZmFpbCBvbmx5IHdoZW4gbm8gYW5hbHlzaXMgY2FuIGJlIHBlcmZvcm1lZC4KKyAgb3B0aW9uYWwgU3RhdHVzIHN0YXR1cyA9IDM7CisKKyAgcmVzZXJ2ZWQgMTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplcl9wcm90by9yZWdlbi5zaCBiL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplcl9wcm90by9yZWdlbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZjQ0Zjg4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyX3Byb3RvL3JlZ2VuLnNoCkBAIC0wLDAgKzEsMyBAQAorIyEvYmluL2Jhc2gKKworYXByb3RvYyAtLWdvX291dD1wYXRocz1zb3VyY2VfcmVsYXRpdmU6LiBjY19hbmFseXplci5wcm90bwpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L2lkZV9xdWVyeS5nbyBiL3Rvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnkuZ28KaW5kZXggZGU4NGZiZS4uMjNjN2FiZCAxMDA2NDQKLS0tIGEvdG9vbHMvaWRlX3F1ZXJ5L2lkZV9xdWVyeS5nbworKysgYi90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5LmdvCkBAIC0zMyw2ICszMyw3IEBACiAJInN0cmluZ3MiCiAKIAkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcHJvdG8iCisJYXBiICJpZGVfcXVlcnkvY2NfYW5hbHl6ZXJfcHJvdG8iCiAJcGIgImlkZV9xdWVyeS9pZGVfcXVlcnlfcHJvdG8iCiApCiAKQEAgLTQyLDkgKzQzLDYgQEAKIAlSZXBvRGlyICAgICAgICBzdHJpbmcKIAlPdXREaXIgICAgICAgICBzdHJpbmcKIAlDbGFuZ1Rvb2xzUm9vdCBzdHJpbmcKLQotCUNjRmlsZXMgICBbXXN0cmluZwotCUphdmFGaWxlcyBbXXN0cmluZwogfQogCiAvLyBMdW5jaFRhcmdldCBpcyBhIHBhcnNlZCBBbmRyb2lkIGx1bmNoIHRhcmdldC4KQEAgLTgzLDcgKzgxLDcgQEAKIAogZnVuYyBtYWluKCkgewogCXZhciBlbnYgRW52Ci0JZW52Lk91dERpciA9IG9zLkdldGVudigiT1VUX0RJUiIpCisJZW52Lk91dERpciA9IHN0cmluZ3MuVHJpbVN1ZmZpeChvcy5HZXRlbnYoIk9VVF9ESVIiKSwgIi8iKQogCWVudi5SZXBvRGlyID0gb3MuR2V0ZW52KCJBTkRST0lEX0JVSUxEX1RPUCIpCiAJZW52LkNsYW5nVG9vbHNSb290ID0gb3MuR2V0ZW52KCJQUkVCVUlMVFNfQ0xBTkdfVE9PTFNfUk9PVCIpCiAJZmxhZy5WYXIoJmVudi5MdW5jaFRhcmdldCwgImx1bmNoX3RhcmdldCIsICJUaGUgbHVuY2ggdGFyZ2V0IHRvIHF1ZXJ5IikKQEAgLTk1LDEyICs5MywxMyBAQAogCQlyZXR1cm4KIAl9CiAKKwl2YXIgY2NGaWxlcywgamF2YUZpbGVzIFtdc3RyaW5nCiAJZm9yIF8sIGYgOj0gcmFuZ2UgZmlsZXMgewogCQlzd2l0Y2ggewogCQljYXNlIHN0cmluZ3MuSGFzU3VmZml4KGYsICIuamF2YSIpIHx8IHN0cmluZ3MuSGFzU3VmZml4KGYsICIua3QiKToKLQkJCWVudi5KYXZhRmlsZXMgPSBhcHBlbmQoZW52LkphdmFGaWxlcywgZikKKwkJCWphdmFGaWxlcyA9IGFwcGVuZChqYXZhRmlsZXMsIGYpCiAJCWNhc2Ugc3RyaW5ncy5IYXNTdWZmaXgoZiwgIi5jYyIpIHx8IHN0cmluZ3MuSGFzU3VmZml4KGYsICIuY3BwIikgfHwgc3RyaW5ncy5IYXNTdWZmaXgoZiwgIi5oIik6Ci0JCQllbnYuQ2NGaWxlcyA9IGFwcGVuZChlbnYuQ2NGaWxlcywgZikKKwkJCWNjRmlsZXMgPSBhcHBlbmQoY2NGaWxlcywgZikKIAkJZGVmYXVsdDoKIAkJCWxvZy5QcmludGYoIkZpbGUgJXEgaXMgc3VwcG9ydGVkIC0gd2lsbCBiZSBza2lwcGVkLiIsIGYpCiAJCX0KQEAgLTExMCwyOCArMTA5LDU0IEBACiAJLy8gVE9ETyhtaWNoYWVsbWVyZyk6IEZpZ3VyZSBvdXQgaWYgbW9kdWxlX2JwX2phdmFfZGVwcy5qc29uIGFuZCBjb21waWxlX2NvbW1hbmRzLmpzb24gaXMgb3V0ZGF0ZWQuCiAJcnVuTWFrZShjdHgsIGVudiwgIm5vdGhpbmciKQogCi0JamF2YU1vZHVsZXMsIGphdmFGaWxlVG9Nb2R1bGVNYXAsIGVyciA6PSBsb2FkSmF2YU1vZHVsZXMoJmVudikKKwlqYXZhTW9kdWxlcywgZXJyIDo9IGxvYWRKYXZhTW9kdWxlcyhlbnYpCiAJaWYgZXJyICE9IG5pbCB7CiAJCWxvZy5QcmludGYoIkZhaWxlZCB0byBsb2FkIGphdmEgbW9kdWxlczogJXYiLCBlcnIpCiAJfQotCXRvTWFrZSA6PSBnZXRKYXZhVGFyZ2V0cyhqYXZhRmlsZVRvTW9kdWxlTWFwKQogCi0JY2NUYXJnZXRzLCBzdGF0dXMgOj0gZ2V0Q0NUYXJnZXRzKGN0eCwgJmVudikKLQlpZiBzdGF0dXMgIT0gbmlsICYmIHN0YXR1cy5Db2RlICE9IHBiLlN0YXR1c19PSyB7Ci0JCWxvZy5GYXRhbGYoIkZhaWxlZCB0byBxdWVyeSBjYyB0YXJnZXRzOiAldiIsICpzdGF0dXMuTWVzc2FnZSkKLQl9Ci0JdG9NYWtlID0gYXBwZW5kKHRvTWFrZSwgY2NUYXJnZXRzLi4uKQotCWZtdC5GcHJpbnRmKG9zLlN0ZGVyciwgIlJ1bm5pbmcgbWFrZSBmb3IgbW9kdWxlczogJXZcbiIsIHN0cmluZ3MuSm9pbih0b01ha2UsICIsICIpKQotCWlmIGVyciA6PSBydW5NYWtlKGN0eCwgZW52LCB0b01ha2UuLi4pOyBlcnIgIT0gbmlsIHsKLQkJbG9nLlByaW50ZigiQnVpbGRpbmcgZGVwcyBmYWlsZWQ6ICV2IiwgZXJyKQorCXZhciB0YXJnZXRzIFtdc3RyaW5nCisJamF2YVRhcmdldHNCeUZpbGUgOj0gZmluZEphdmFNb2R1bGVzKGphdmFGaWxlcywgamF2YU1vZHVsZXMpCisJZm9yIF8sIHQgOj0gcmFuZ2UgamF2YVRhcmdldHNCeUZpbGUgeworCQl0YXJnZXRzID0gYXBwZW5kKHRhcmdldHMsIHQpCiAJfQogCi0JcmVzIDo9IGdldEphdmFJbnB1dHMoJmVudiwgamF2YU1vZHVsZXMsIGphdmFGaWxlVG9Nb2R1bGVNYXApCi0JY2NBbmFseXNpcyA6PSBnZXRDQ0lucHV0cyhjdHgsICZlbnYpCi0JcHJvdG8uTWVyZ2UocmVzLCBjY0FuYWx5c2lzKQorCWNjVGFyZ2V0cywgZXJyIDo9IGdldENDVGFyZ2V0cyhjdHgsIGVudiwgY2NGaWxlcykKKwlpZiBlcnIgIT0gbmlsIHsKKwkJbG9nLkZhdGFsZigiRmFpbGVkIHRvIHF1ZXJ5IGNjIHRhcmdldHM6ICV2IiwgZXJyKQorCX0KKwl0YXJnZXRzID0gYXBwZW5kKHRhcmdldHMsIGNjVGFyZ2V0cy4uLikKKwlpZiBsZW4odGFyZ2V0cykgPT0gMCB7CisJCWZtdC5QcmludGxuKCJObyB0YXJnZXRzIGZvdW5kLiIpCisJCW9zLkV4aXQoMSkKKwkJcmV0dXJuCisJfQogCi0JcmVzLkJ1aWxkQXJ0aWZhY3RSb290ID0gZW52Lk91dERpcgotCWRhdGEsIGVyciA6PSBwcm90by5NYXJzaGFsKHJlcykKKwlmbXQuRnByaW50Zihvcy5TdGRlcnIsICJSdW5uaW5nIG1ha2UgZm9yIG1vZHVsZXM6ICV2XG4iLCBzdHJpbmdzLkpvaW4odGFyZ2V0cywgIiwgIikpCisJaWYgZXJyIDo9IHJ1bk1ha2UoY3R4LCBlbnYsIHRhcmdldHMuLi4pOyBlcnIgIT0gbmlsIHsKKwkJbG9nLlByaW50ZigiQnVpbGRpbmcgbW9kdWxlcyBmYWlsZWQ6ICV2IiwgZXJyKQorCX0KKworCXZhciBhbmFseXNpcyBwYi5JZGVBbmFseXNpcworCXJlc3VsdHMsIHVuaXRzIDo9IGdldEphdmFJbnB1dHMoZW52LCBqYXZhVGFyZ2V0c0J5RmlsZSwgamF2YU1vZHVsZXMpCisJYW5hbHlzaXMuUmVzdWx0cyA9IHJlc3VsdHMKKwlhbmFseXNpcy5Vbml0cyA9IHVuaXRzCisJaWYgZXJyICE9IG5pbCAmJiBhbmFseXNpcy5FcnJvciA9PSBuaWwgeworCQlhbmFseXNpcy5FcnJvciA9ICZwYi5BbmFseXNpc0Vycm9yeworCQkJRXJyb3JNZXNzYWdlOiBlcnIuRXJyb3IoKSwKKwkJfQorCX0KKworCXJlc3VsdHMsIHVuaXRzLCBlcnIgPSBnZXRDQ0lucHV0cyhjdHgsIGVudiwgY2NGaWxlcykKKwlhbmFseXNpcy5SZXN1bHRzID0gYXBwZW5kKGFuYWx5c2lzLlJlc3VsdHMsIHJlc3VsdHMuLi4pCisJYW5hbHlzaXMuVW5pdHMgPSBhcHBlbmQoYW5hbHlzaXMuVW5pdHMsIHVuaXRzLi4uKQorCWlmIGVyciAhPSBuaWwgJiYgYW5hbHlzaXMuRXJyb3IgPT0gbmlsIHsKKwkJYW5hbHlzaXMuRXJyb3IgPSAmcGIuQW5hbHlzaXNFcnJvcnsKKwkJCUVycm9yTWVzc2FnZTogZXJyLkVycm9yKCksCisJCX0KKwl9CisKKwlhbmFseXNpcy5CdWlsZE91dERpciA9IGVudi5PdXREaXIKKwlkYXRhLCBlcnIgOj0gcHJvdG8uTWFyc2hhbCgmYW5hbHlzaXMpCiAJaWYgZXJyICE9IG5pbCB7CiAJCWxvZy5GYXRhbGYoIkZhaWxlZCB0byBtYXJzaGFsIHJlc3VsdCBwcm90bzogJXYiLCBlcnIpCiAJfQpAQCAtMTQxLDIyICsxNjYsMjIgQEAKIAkJbG9nLkZhdGFsZigiRmFpbGVkIHRvIHdyaXRlIHJlc3VsdCBwcm90bzogJXYiLCBlcnIpCiAJfQogCi0JZm9yIF8sIHMgOj0gcmFuZ2UgcmVzLlNvdXJjZXMgewotCQlmbXQuRnByaW50Zihvcy5TdGRlcnIsICIlczogJXYgKERlcHM6ICVkLCBHZW5lcmF0ZWQ6ICVkKVxuIiwgcy5HZXRQYXRoKCksIHMuR2V0U3RhdHVzKCksIGxlbihzLkdldERlcHMoKSksIGxlbihzLkdldEdlbmVyYXRlZCgpKSkKKwlmb3IgXywgciA6PSByYW5nZSBhbmFseXNpcy5SZXN1bHRzIHsKKwkJZm10LkZwcmludGYob3MuU3RkZXJyLCAiJXM6ICUrdlxuIiwgci5HZXRTb3VyY2VGaWxlUGF0aCgpLCByLkdldFN0YXR1cygpKQogCX0KIH0KIAotZnVuYyByZXBvU3RhdGUoZW52ICpFbnYpICpwYi5SZXBvU3RhdGUgeworZnVuYyByZXBvU3RhdGUoZW52IEVudiwgZmlsZVBhdGhzIFtdc3RyaW5nKSAqYXBiLlJlcG9TdGF0ZSB7CiAJY29uc3QgY29tcERiUGF0aCA9ICJzb29uZy9kZXZlbG9wbWVudC9pZGUvY29tcGRiL2NvbXBpbGVfY29tbWFuZHMuanNvbiIKLQlyZXR1cm4gJnBiLlJlcG9TdGF0ZXsKKwlyZXR1cm4gJmFwYi5SZXBvU3RhdGV7CiAJCVJlcG9EaXI6ICAgICAgICBlbnYuUmVwb0RpciwKLQkJQWN0aXZlRmlsZVBhdGg6IGVudi5DY0ZpbGVzLAorCQlBY3RpdmVGaWxlUGF0aDogZmlsZVBhdGhzLAogCQlPdXREaXI6ICAgICAgICAgZW52Lk91dERpciwKIAkJQ29tcERiUGF0aDogICAgIHBhdGguSm9pbihlbnYuT3V0RGlyLCBjb21wRGJQYXRoKSwKIAl9CiB9CiAKLWZ1bmMgcnVuQ0NhbmFseXplcihjdHggY29udGV4dC5Db250ZXh0LCBlbnYgKkVudiwgbW9kZSBzdHJpbmcsIGluIFtdYnl0ZSkgKFtdYnl0ZSwgZXJyb3IpIHsKK2Z1bmMgcnVuQ0NhbmFseXplcihjdHggY29udGV4dC5Db250ZXh0LCBlbnYgRW52LCBtb2RlIHN0cmluZywgaW4gW11ieXRlKSAoW11ieXRlLCBlcnJvcikgewogCWNjQW5hbHl6ZXJQYXRoIDo9IHBhdGguSm9pbihlbnYuQ2xhbmdUb29sc1Jvb3QsICJiaW4vaWRlX3F1ZXJ5X2NjX2FuYWx5emVyIikKIAlvdXRCdWZmZXIgOj0gbmV3KGJ5dGVzLkJ1ZmZlcikKIApAQCAtMTc2LDEyNyArMjAxLDIwNSBAQAogfQogCiAvLyBFeGVjdXRlIGNjX2FuYWx5emVyIGFuZCBnZXQgYWxsIHRoZSB0YXJnZXRzIHRoYXQgbmVlZHMgdG8gYmUgYnVpbGQgZm9yIGFuYWx5emluZyBmaWxlcy4KLWZ1bmMgZ2V0Q0NUYXJnZXRzKGN0eCBjb250ZXh0LkNvbnRleHQsIGVudiAqRW52KSAoW11zdHJpbmcsICpwYi5TdGF0dXMpIHsKLQlzdGF0ZSA6PSByZXBvU3RhdGUoZW52KQotCWJ5dGVzLCBlcnIgOj0gcHJvdG8uTWFyc2hhbChzdGF0ZSkKK2Z1bmMgZ2V0Q0NUYXJnZXRzKGN0eCBjb250ZXh0LkNvbnRleHQsIGVudiBFbnYsIGZpbGVQYXRocyBbXXN0cmluZykgKFtdc3RyaW5nLCBlcnJvcikgeworCXN0YXRlLCBlcnIgOj0gcHJvdG8uTWFyc2hhbChyZXBvU3RhdGUoZW52LCBmaWxlUGF0aHMpKQogCWlmIGVyciAhPSBuaWwgewogCQlsb2cuRmF0YWxsbigiRmFpbGVkIHRvIHNlcmlhbGl6ZSBzdGF0ZToiLCBlcnIpCiAJfQogCi0JcmVzcCA6PSBuZXcocGIuRGVwc1Jlc3BvbnNlKQotCXJlc3VsdCwgZXJyIDo9IHJ1bkNDYW5hbHl6ZXIoY3R4LCBlbnYsICJkZXBzIiwgYnl0ZXMpCi0JaWYgbWFyc2hhbF9lcnIgOj0gcHJvdG8uVW5tYXJzaGFsKHJlc3VsdCwgcmVzcCk7IG1hcnNoYWxfZXJyICE9IG5pbCB7Ci0JCXJldHVybiBuaWwsICZwYi5TdGF0dXN7Ci0JCQlDb2RlOiAgICBwYi5TdGF0dXNfRkFJTFVSRSwKLQkJCU1lc3NhZ2U6IHByb3RvLlN0cmluZygiTWFsZm9ybWVkIHJlc3BvbnNlIGZyb20gY2NfYW5hbHl6ZXI6ICIgKyBtYXJzaGFsX2Vyci5FcnJvcigpKSwKLQkJfQorCXJlc3AgOj0gbmV3KGFwYi5EZXBzUmVzcG9uc2UpCisJcmVzdWx0LCBlcnIgOj0gcnVuQ0NhbmFseXplcihjdHgsIGVudiwgImRlcHMiLCBzdGF0ZSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgZXJyCisJfQorCisJaWYgZXJyIDo9IHByb3RvLlVubWFyc2hhbChyZXN1bHQsIHJlc3ApOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgZm10LkVycm9yZigibWFsZm9ybWVkIHJlc3BvbnNlIGZyb20gY2NfYW5hbHl6ZXI6ICV2IiwgZXJyKQogCX0KIAogCXZhciB0YXJnZXRzIFtdc3RyaW5nCi0JaWYgcmVzcC5TdGF0dXMgIT0gbmlsICYmIHJlc3AuU3RhdHVzLkNvZGUgIT0gcGIuU3RhdHVzX09LIHsKLQkJcmV0dXJuIHRhcmdldHMsIHJlc3AuU3RhdHVzCisJaWYgcmVzcC5TdGF0dXMgIT0gbmlsICYmIHJlc3AuU3RhdHVzLkNvZGUgIT0gYXBiLlN0YXR1c19PSyB7CisJCXJldHVybiB0YXJnZXRzLCBmbXQuRXJyb3JmKCJjY19hbmFseXplciBmYWlsZWQ6ICV2IiwgcmVzcC5TdGF0dXMuTWVzc2FnZSkKIAl9CisKIAlmb3IgXywgZGVwcyA6PSByYW5nZSByZXNwLkRlcHMgewogCQl0YXJnZXRzID0gYXBwZW5kKHRhcmdldHMsIGRlcHMuQnVpbGRUYXJnZXQuLi4pCiAJfQotCi0Jc3RhdHVzIDo9ICZwYi5TdGF0dXN7Q29kZTogcGIuU3RhdHVzX09LfQotCWlmIGVyciAhPSBuaWwgewotCQlzdGF0dXMgPSAmcGIuU3RhdHVzewotCQkJQ29kZTogICAgcGIuU3RhdHVzX0ZBSUxVUkUsCi0JCQlNZXNzYWdlOiBwcm90by5TdHJpbmcoZXJyLkVycm9yKCkpLAotCQl9Ci0JfQotCXJldHVybiB0YXJnZXRzLCBzdGF0dXMKKwlyZXR1cm4gdGFyZ2V0cywgbmlsCiB9CiAKLWZ1bmMgZ2V0Q0NJbnB1dHMoY3R4IGNvbnRleHQuQ29udGV4dCwgZW52ICpFbnYpICpwYi5JZGVBbmFseXNpcyB7Ci0Jc3RhdGUgOj0gcmVwb1N0YXRlKGVudikKLQlieXRlcywgZXJyIDo9IHByb3RvLk1hcnNoYWwoc3RhdGUpCitmdW5jIGdldENDSW5wdXRzKGN0eCBjb250ZXh0LkNvbnRleHQsIGVudiBFbnYsIGZpbGVQYXRocyBbXXN0cmluZykgKFtdKnBiLkFuYWx5c2lzUmVzdWx0LCBbXSpwYi5CdWlsZGFibGVVbml0LCBlcnJvcikgeworCXN0YXRlLCBlcnIgOj0gcHJvdG8uTWFyc2hhbChyZXBvU3RhdGUoZW52LCBmaWxlUGF0aHMpKQogCWlmIGVyciAhPSBuaWwgewogCQlsb2cuRmF0YWxsbigiRmFpbGVkIHRvIHNlcmlhbGl6ZSBzdGF0ZToiLCBlcnIpCiAJfQogCi0JcmVzcCA6PSBuZXcocGIuSWRlQW5hbHlzaXMpCi0JcmVzdWx0LCBlcnIgOj0gcnVuQ0NhbmFseXplcihjdHgsIGVudiwgImlucHV0cyIsIGJ5dGVzKQotCWlmIG1hcnNoYWxfZXJyIDo9IHByb3RvLlVubWFyc2hhbChyZXN1bHQsIHJlc3ApOyBtYXJzaGFsX2VyciAhPSBuaWwgewotCQlyZXNwLlN0YXR1cyA9ICZwYi5TdGF0dXN7Ci0JCQlDb2RlOiAgICBwYi5TdGF0dXNfRkFJTFVSRSwKLQkJCU1lc3NhZ2U6IHByb3RvLlN0cmluZygiTWFsZm9ybWVkIHJlc3BvbnNlIGZyb20gY2NfYW5hbHl6ZXI6ICIgKyBtYXJzaGFsX2Vyci5FcnJvcigpKSwKLQkJfQotCQlyZXR1cm4gcmVzcAorCXJlc3AgOj0gbmV3KGFwYi5JZGVBbmFseXNpcykKKwlyZXN1bHQsIGVyciA6PSBydW5DQ2FuYWx5emVyKGN0eCwgZW52LCAiaW5wdXRzIiwgc3RhdGUpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIG5pbCwgZm10LkVycm9yZigiY2NfYW5hbHl6ZXIgZmFpbGVkOiIsIGVycikKKwl9CisJaWYgZXJyIDo9IHByb3RvLlVubWFyc2hhbChyZXN1bHQsIHJlc3ApOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgbmlsLCBmbXQuRXJyb3JmKCJtYWxmb3JtZWQgcmVzcG9uc2UgZnJvbSBjY19hbmFseXplcjogJXYiLCBlcnIpCisJfQorCWlmIHJlc3AuU3RhdHVzICE9IG5pbCAmJiByZXNwLlN0YXR1cy5Db2RlICE9IGFwYi5TdGF0dXNfT0sgeworCQlyZXR1cm4gbmlsLCBuaWwsIGZtdC5FcnJvcmYoImNjX2FuYWx5emVyIGZhaWxlZDogJXYiLCByZXNwLlN0YXR1cy5NZXNzYWdlKQogCX0KIAotCWlmIGVyciAhPSBuaWwgJiYgKHJlc3AuU3RhdHVzID09IG5pbCB8fCByZXNwLlN0YXR1cy5Db2RlID09IHBiLlN0YXR1c19PSykgewotCQlyZXNwLlN0YXR1cyA9ICZwYi5TdGF0dXN7Ci0JCQlDb2RlOiAgICBwYi5TdGF0dXNfRkFJTFVSRSwKLQkJCU1lc3NhZ2U6IHByb3RvLlN0cmluZyhlcnIuRXJyb3IoKSksCisJdmFyIHJlc3VsdHMgW10qcGIuQW5hbHlzaXNSZXN1bHQKKwl2YXIgdW5pdHMgW10qcGIuQnVpbGRhYmxlVW5pdAorCWZvciBfLCBzIDo9IHJhbmdlIHJlc3AuU291cmNlcyB7CisJCXN0YXR1cyA6PSAmcGIuQW5hbHlzaXNSZXN1bHRfU3RhdHVzeworCQkJQ29kZTogcGIuQW5hbHlzaXNSZXN1bHRfU3RhdHVzX0NPREVfT0ssCiAJCX0KLQl9Ci0JcmV0dXJuIHJlc3AKLX0KLQotZnVuYyBnZXRKYXZhVGFyZ2V0cyhqYXZhRmlsZVRvTW9kdWxlTWFwIG1hcFtzdHJpbmddKmphdmFNb2R1bGUpIFtdc3RyaW5nIHsKLQl2YXIgdGFyZ2V0cyBbXXN0cmluZwotCWZvciBfLCBtIDo9IHJhbmdlIGphdmFGaWxlVG9Nb2R1bGVNYXAgewotCQl0YXJnZXRzID0gYXBwZW5kKHRhcmdldHMsIG0uTmFtZSkKLQl9Ci0JcmV0dXJuIHRhcmdldHMKLX0KLQotZnVuYyBnZXRKYXZhSW5wdXRzKGVudiAqRW52LCBqYXZhTW9kdWxlcyBtYXBbc3RyaW5nXSpqYXZhTW9kdWxlLCBqYXZhRmlsZVRvTW9kdWxlTWFwIG1hcFtzdHJpbmddKmphdmFNb2R1bGUpICpwYi5JZGVBbmFseXNpcyB7Ci0JdmFyIHNvdXJjZXMgW10qcGIuU291cmNlRmlsZQotCXR5cGUgZGVwc0FuZEdlbmVyYXRlZCBzdHJ1Y3QgewotCQlEZXBzICAgICAgW11zdHJpbmcKLQkJR2VuZXJhdGVkIFtdKnBiLkdlbmVyYXRlZEZpbGUKLQl9Ci0JbW9kdWxlVG9EZXBzIDo9IG1ha2UobWFwW3N0cmluZ10qZGVwc0FuZEdlbmVyYXRlZCkKLQlmb3IgXywgZiA6PSByYW5nZSBlbnYuSmF2YUZpbGVzIHsKLQkJZmlsZSA6PSAmcGIuU291cmNlRmlsZXsKLQkJCVBhdGg6IGYsCi0JCX0KLQkJc291cmNlcyA9IGFwcGVuZChzb3VyY2VzLCBmaWxlKQotCi0JCW0gOj0gamF2YUZpbGVUb01vZHVsZU1hcFtmXQotCQlpZiBtID09IG5pbCB7Ci0JCQlmaWxlLlN0YXR1cyA9ICZwYi5TdGF0dXN7Ci0JCQkJQ29kZTogICAgcGIuU3RhdHVzX0ZBSUxVUkUsCi0JCQkJTWVzc2FnZTogcHJvdG8uU3RyaW5nKCJGaWxlIG5vdCBmb3VuZCBpbiBhbnkgbW9kdWxlLiIpLAotCQkJfQotCQkJY29udGludWUKKwkJaWYgcy5HZXRTdGF0dXMoKS5HZXRDb2RlKCkgIT0gYXBiLlN0YXR1c19PSyB7CisJCQlzdGF0dXMuQ29kZSA9IHBiLkFuYWx5c2lzUmVzdWx0X1N0YXR1c19DT0RFX0JVSUxEX0ZBSUxFRAorCQkJc3RhdHVzLlN0YXR1c01lc3NhZ2UgPSBwcm90by5TdHJpbmcocy5HZXRTdGF0dXMoKS5HZXRNZXNzYWdlKCkpCiAJCX0KIAotCQlmaWxlLlN0YXR1cyA9ICZwYi5TdGF0dXN7Q29kZTogcGIuU3RhdHVzX09LfQotCQlpZiBtb2R1bGVUb0RlcHNbbS5OYW1lXSAhPSBuaWwgewotCQkJZmlsZS5HZW5lcmF0ZWQgPSBtb2R1bGVUb0RlcHNbbS5OYW1lXS5HZW5lcmF0ZWQKLQkJCWZpbGUuRGVwcyA9IG1vZHVsZVRvRGVwc1ttLk5hbWVdLkRlcHMKLQkJCWNvbnRpbnVlCisJCXJlc3VsdCA6PSAmcGIuQW5hbHlzaXNSZXN1bHR7CisJCQlTb3VyY2VGaWxlUGF0aDogcy5HZXRQYXRoKCksCisJCQlVbml0SWQ6ICAgICAgICAgcy5HZXRQYXRoKCksCisJCQlTdGF0dXM6ICAgICAgICAgc3RhdHVzLAogCQl9CisJCXJlc3VsdHMgPSBhcHBlbmQocmVzdWx0cywgcmVzdWx0KQogCi0JCWRlcHMgOj0gdHJhbnNpdGl2ZURlcHMobSwgamF2YU1vZHVsZXMpCiAJCXZhciBnZW5lcmF0ZWQgW10qcGIuR2VuZXJhdGVkRmlsZQotCQlvdXRQcmVmaXggOj0gZW52Lk91dERpciArICIvIgotCQlmb3IgXywgZCA6PSByYW5nZSBkZXBzIHsKLQkJCWlmIHJlbFBhdGgsIG9rIDo9IHN0cmluZ3MuQ3V0UHJlZml4KGQsIG91dFByZWZpeCk7IG9rIHsKLQkJCQljb250ZW50cywgZXJyIDo9IG9zLlJlYWRGaWxlKGQpCi0JCQkJaWYgZXJyICE9IG5pbCB7Ci0JCQkJCWZtdC5QcmludGYoIkdlbmVyYXRlZCBmaWxlICVxIG5vdCBmb3VuZCAtIHdpbGwgYmUgc2tpcHBlZC5cbiIsIGQpCi0JCQkJCWNvbnRpbnVlCi0JCQkJfQorCQlmb3IgXywgZiA6PSByYW5nZSBzLkdlbmVyYXRlZCB7CisJCQlnZW5lcmF0ZWQgPSBhcHBlbmQoZ2VuZXJhdGVkLCAmcGIuR2VuZXJhdGVkRmlsZXsKKwkJCQlQYXRoOiAgICAgZi5HZXRQYXRoKCksCisJCQkJQ29udGVudHM6IGYuR2V0Q29udGVudHMoKSwKKwkJCX0pCisJCX0KKwkJZ2VuVW5pdCA6PSAmcGIuQnVpbGRhYmxlVW5pdHsKKwkJCUlkOiAgICAgICAgICAgICAgImdlbmZpbGVzX2Zvcl8iICsgcy5HZXRQYXRoKCksCisJCQlTb3VyY2VGaWxlUGF0aHM6IHMuR2V0RGVwcygpLAorCQkJR2VuZXJhdGVkRmlsZXM6ICBnZW5lcmF0ZWQsCisJCX0KIAotCQkJCWdlbmVyYXRlZCA9IGFwcGVuZChnZW5lcmF0ZWQsICZwYi5HZW5lcmF0ZWRGaWxlewotCQkJCQlQYXRoOiAgICAgcmVsUGF0aCwKLQkJCQkJQ29udGVudHM6IGNvbnRlbnRzLAotCQkJCX0pCisJCXVuaXQgOj0gJnBiLkJ1aWxkYWJsZVVuaXR7CisJCQlJZDogICAgICAgICAgICAgICAgcy5HZXRQYXRoKCksCisJCQlMYW5ndWFnZTogICAgICAgICAgcGIuTGFuZ3VhZ2VfTEFOR1VBR0VfQ1BQLAorCQkJU291cmNlRmlsZVBhdGhzOiAgIFtdc3RyaW5ne3MuR2V0UGF0aCgpfSwKKwkJCUNvbXBpbGVyQXJndW1lbnRzOiBzLkdldENvbXBpbGVyQXJndW1lbnRzKCksCisJCQlEZXBlbmRlbmN5SWRzOiAgICAgW11zdHJpbmd7Z2VuVW5pdC5HZXRJZCgpfSwKKwkJfQorCQl1bml0cyA9IGFwcGVuZCh1bml0cywgdW5pdCwgZ2VuVW5pdCkKKwl9CisJcmV0dXJuIHJlc3VsdHMsIHVuaXRzLCBuaWwKK30KKworLy8gZmluZEphdmFNb2R1bGVzIHRyaWVzIHRvIGZpbmQgdGhlIG1vZHVsZXMgdGhhdCBjb3ZlciB0aGUgZ2l2ZW4gZmlsZSBwYXRocy4KKy8vIElmIGEgZmlsZSBpcyBjb3ZlcmVkIGJ5IG11bHRpcGxlIG1vZHVsZXMsIHRoZSBmaXJzdCBtb2R1bGUgaXMgcmV0dXJuZWQuCitmdW5jIGZpbmRKYXZhTW9kdWxlcyhwYXRocyBbXXN0cmluZywgbW9kdWxlcyBtYXBbc3RyaW5nXSpqYXZhTW9kdWxlKSBtYXBbc3RyaW5nXXN0cmluZyB7CisJcmV0IDo9IG1ha2UobWFwW3N0cmluZ11zdHJpbmcpCisJZm9yIG5hbWUsIG1vZHVsZSA6PSByYW5nZSBtb2R1bGVzIHsKKwkJaWYgc3RyaW5ncy5IYXNTdWZmaXgobmFtZSwgIi5pbXBsIikgeworCQkJY29udGludWUKKwkJfQorCisJCWZvciBpLCBwIDo9IHJhbmdlIHBhdGhzIHsKKwkJCWlmIHNsaWNlcy5Db250YWlucyhtb2R1bGUuU3JjcywgcCkgeworCQkJCXJldFtwXSA9IG5hbWUKKwkJCQlwYXRocyA9IGFwcGVuZChwYXRoc1s6aV0sIHBhdGhzW2krMTpdLi4uKQorCQkJCWJyZWFrCiAJCQl9CiAJCX0KLQkJbW9kdWxlVG9EZXBzW20uTmFtZV0gPSAmZGVwc0FuZEdlbmVyYXRlZHtkZXBzLCBnZW5lcmF0ZWR9Ci0JCWZpbGUuR2VuZXJhdGVkID0gZ2VuZXJhdGVkCi0JCWZpbGUuRGVwcyA9IGRlcHMKKwkJaWYgbGVuKHBhdGhzKSA9PSAwIHsKKwkJCWJyZWFrCisJCX0KIAl9Ci0JcmV0dXJuICZwYi5JZGVBbmFseXNpc3sKLQkJU291cmNlczogc291cmNlcywKKwlyZXR1cm4gcmV0Cit9CisKK2Z1bmMgZ2V0SmF2YUlucHV0cyhlbnYgRW52LCBtb2R1bGVzQnlQYXRoIG1hcFtzdHJpbmddc3RyaW5nLCBtb2R1bGVzIG1hcFtzdHJpbmddKmphdmFNb2R1bGUpIChbXSpwYi5BbmFseXNpc1Jlc3VsdCwgW10qcGIuQnVpbGRhYmxlVW5pdCkgeworCXZhciByZXN1bHRzIFtdKnBiLkFuYWx5c2lzUmVzdWx0CisJdW5pdHNCeUlkIDo9IG1ha2UobWFwW3N0cmluZ10qcGIuQnVpbGRhYmxlVW5pdCkKKwlmb3IgcCwgbW9kdWxlTmFtZSA6PSByYW5nZSBtb2R1bGVzQnlQYXRoIHsKKwkJciA6PSAmcGIuQW5hbHlzaXNSZXN1bHR7CisJCQlTb3VyY2VGaWxlUGF0aDogcCwKKwkJfQorCQlyZXN1bHRzID0gYXBwZW5kKHJlc3VsdHMsIHIpCisKKwkJbSA6PSBtb2R1bGVzW21vZHVsZU5hbWVdCisJCWlmIG0gPT0gbmlsIHsKKwkJCXIuU3RhdHVzID0gJnBiLkFuYWx5c2lzUmVzdWx0X1N0YXR1c3sKKwkJCQlDb2RlOiAgICAgICAgICBwYi5BbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ09ERV9OT1RfRk9VTkQsCisJCQkJU3RhdHVzTWVzc2FnZTogcHJvdG8uU3RyaW5nKCJGaWxlIG5vdCBmb3VuZCBpbiBhbnkgbW9kdWxlLiIpLAorCQkJfQorCQkJY29udGludWUKKwkJfQorCisJCXIuVW5pdElkID0gbW9kdWxlTmFtZQorCQlyLlN0YXR1cyA9ICZwYi5BbmFseXNpc1Jlc3VsdF9TdGF0dXN7Q29kZTogcGIuQW5hbHlzaXNSZXN1bHRfU3RhdHVzX0NPREVfT0t9CisJCWlmIHVuaXRzQnlJZFtyLlVuaXRJZF0gIT0gbmlsIHsKKwkJCS8vIEZpbGUgaXMgY292ZXJlZCBieSBhbiBhbHJlYWR5IGNyZWF0ZWQgdW5pdC4KKwkJCWNvbnRpbnVlCisJCX0KKworCQl1IDo9ICZwYi5CdWlsZGFibGVVbml0eworCQkJSWQ6ICAgICAgICAgICAgICBtb2R1bGVOYW1lLAorCQkJTGFuZ3VhZ2U6ICAgICAgICBwYi5MYW5ndWFnZV9MQU5HVUFHRV9KQVZBLAorCQkJU291cmNlRmlsZVBhdGhzOiBtLlNyY3MsCisJCX0KKwkJdW5pdHNCeUlkW3UuSWRdID0gdQorCisJCXEgOj0gbGlzdC5OZXcoKQorCQlmb3IgXywgZCA6PSByYW5nZSBtLkRlcHMgeworCQkJcS5QdXNoQmFjayhkKQorCQl9CisJCWZvciBxLkxlbigpID4gMCB7CisJCQluYW1lIDo9IHEuUmVtb3ZlKHEuRnJvbnQoKSkuKHN0cmluZykKKwkJCW1vZCA6PSBtb2R1bGVzW25hbWVdCisJCQlpZiBtb2QgPT0gbmlsIHx8IHVuaXRzQnlJZFtuYW1lXSAhPSBuaWwgeworCQkJCWNvbnRpbnVlCisJCQl9CisKKwkJCXZhciBwYXRocyBbXXN0cmluZworCQkJcGF0aHMgPSBhcHBlbmQocGF0aHMsIG1vZC5TcmNzLi4uKQorCQkJcGF0aHMgPSBhcHBlbmQocGF0aHMsIG1vZC5TcmNKYXJzLi4uKQorCQkJcGF0aHMgPSBhcHBlbmQocGF0aHMsIG1vZC5KYXJzLi4uKQorCQkJdW5pdHNCeUlkW25hbWVdID0gJnBiLkJ1aWxkYWJsZVVuaXR7CisJCQkJSWQ6ICAgICAgICAgICAgICBuYW1lLAorCQkJCVNvdXJjZUZpbGVQYXRoczogbW9kLlNyY3MsCisJCQkJR2VuZXJhdGVkRmlsZXM6ICBnZW5GaWxlcyhlbnYsIHBhdGhzKSwKKwkJCX0KKworCQkJZm9yIF8sIGQgOj0gcmFuZ2UgbW9kLkRlcHMgeworCQkJCXEuUHVzaEJhY2soZCkKKwkJCX0KKwkJfQogCX0KKworCXVuaXRzIDo9IG1ha2UoW10qcGIuQnVpbGRhYmxlVW5pdCwgMCwgbGVuKHVuaXRzQnlJZCkpCisJZm9yIF8sIHUgOj0gcmFuZ2UgdW5pdHNCeUlkIHsKKwkJdW5pdHMgPSBhcHBlbmQodW5pdHMsIHUpCisJfQorCXJldHVybiByZXN1bHRzLCB1bml0cworfQorCisvLyBnZW5GaWxlcyByZXR1cm5zIHRoZSBnZW5lcmF0ZWQgZmlsZXMgKHBhdGhzIHRoYXQgc3RhcnQgd2l0aCBvdXREaXIvKSBmb3IgdGhlCisvLyBnaXZlbiBwYXRocy4gR2VuZXJhdGVkIGZpbGVzIHRoYXQgZG8gbm90IGV4aXN0IGFyZSBpZ25vcmVkLgorZnVuYyBnZW5GaWxlcyhlbnYgRW52LCBwYXRocyBbXXN0cmluZykgW10qcGIuR2VuZXJhdGVkRmlsZSB7CisJcHJlZml4IDo9IGVudi5PdXREaXIgKyAiLyIKKwl2YXIgcmV0IFtdKnBiLkdlbmVyYXRlZEZpbGUKKwlmb3IgXywgcCA6PSByYW5nZSBwYXRocyB7CisJCXJlbFBhdGgsIG9rIDo9IHN0cmluZ3MuQ3V0UHJlZml4KHAsIHByZWZpeCkKKwkJaWYgIW9rIHsKKwkJCWNvbnRpbnVlCisJCX0KKworCQljb250ZW50cywgZXJyIDo9IG9zLlJlYWRGaWxlKHBhdGguSm9pbihlbnYuUmVwb0RpciwgcCkpCisJCWlmIGVyciAhPSBuaWwgeworCQkJY29udGludWUKKwkJfQorCisJCXJldCA9IGFwcGVuZChyZXQsICZwYi5HZW5lcmF0ZWRGaWxleworCQkJUGF0aDogICAgIHJlbFBhdGgsCisJCQlDb250ZW50czogY29udGVudHMsCisJCX0pCisJfQorCXJldHVybiByZXQKIH0KIAogLy8gcnVuTWFrZSBydW5zIFNvb25nIGJ1aWxkIGZvciB0aGUgZ2l2ZW4gbW9kdWxlcy4KQEAgLTMwOCw2ICs0MTEsNyBAQAogCQkiVEFSR0VUX1BST0RVQ1Q9IiArIGVudi5MdW5jaFRhcmdldC5Qcm9kdWN0LAogCQkiVEFSR0VUX1JFTEVBU0U9IiArIGVudi5MdW5jaFRhcmdldC5SZWxlYXNlLAogCQkiVEFSR0VUX0JVSUxEX1ZBUklBTlQ9IiArIGVudi5MdW5jaFRhcmdldC5WYXJpYW50LAorCQkiVEFSR0VUX0JVSUxEX1RZUEU9cmVsZWFzZSIsCiAJCSItayIsCiAJfQogCWFyZ3MgPSBhcHBlbmQoYXJncywgbW9kdWxlcy4uLikKQEAgLTMxOSw3ICs0MjMsNiBAQAogfQogCiB0eXBlIGphdmFNb2R1bGUgc3RydWN0IHsKLQlOYW1lICAgIHN0cmluZwogCVBhdGggICAgW11zdHJpbmcgYGpzb246InBhdGgsb21pdGVtcHR5ImAKIAlEZXBzICAgIFtdc3RyaW5nIGBqc29uOiJkZXBlbmRlbmNpZXMsb21pdGVtcHR5ImAKIAlTcmNzICAgIFtdc3RyaW5nIGBqc29uOiJzcmNzLG9taXRlbXB0eSJgCkBAIC0zMjcsNjYgKzQzMCwyMyBAQAogCVNyY0phcnMgW11zdHJpbmcgYGpzb246InNyY2phcnMsb21pdGVtcHR5ImAKIH0KIAotZnVuYyBsb2FkSmF2YU1vZHVsZXMoZW52ICpFbnYpIChtYXBbc3RyaW5nXSpqYXZhTW9kdWxlLCBtYXBbc3RyaW5nXSpqYXZhTW9kdWxlLCBlcnJvcikgeworZnVuYyBsb2FkSmF2YU1vZHVsZXMoZW52IEVudikgKG1hcFtzdHJpbmddKmphdmFNb2R1bGUsIGVycm9yKSB7CiAJamF2YURlcHNQYXRoIDo9IHBhdGguSm9pbihlbnYuUmVwb0RpciwgZW52Lk91dERpciwgInNvb25nL21vZHVsZV9icF9qYXZhX2RlcHMuanNvbiIpCiAJZGF0YSwgZXJyIDo9IG9zLlJlYWRGaWxlKGphdmFEZXBzUGF0aCkKIAlpZiBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuIG5pbCwgbmlsLCBlcnIKKwkJcmV0dXJuIG5pbCwgZXJyCiAJfQogCi0JdmFyIG1vZHVsZU1hcHBpbmcgbWFwW3N0cmluZ10qamF2YU1vZHVsZSAvLyBtb2R1bGUgbmFtZSAtPiBtb2R1bGUKLQlpZiBlcnIgPSBqc29uLlVubWFyc2hhbChkYXRhLCAmbW9kdWxlTWFwcGluZyk7IGVyciAhPSBuaWwgewotCQlyZXR1cm4gbmlsLCBuaWwsIGVycgorCXZhciByZXQgbWFwW3N0cmluZ10qamF2YU1vZHVsZSAvLyBtb2R1bGUgbmFtZSAtPiBtb2R1bGUKKwlpZiBlcnIgPSBqc29uLlVubWFyc2hhbChkYXRhLCAmcmV0KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIGVycgogCX0KIAotCWphdmFNb2R1bGVzIDo9IG1ha2UobWFwW3N0cmluZ10qamF2YU1vZHVsZSkKLQlqYXZhRmlsZVRvTW9kdWxlTWFwIDo9IG1ha2UobWFwW3N0cmluZ10qamF2YU1vZHVsZSkKLQlmb3IgbmFtZSwgbW9kdWxlIDo9IHJhbmdlIG1vZHVsZU1hcHBpbmcgewotCQlpZiBzdHJpbmdzLkhhc1N1ZmZpeChuYW1lLCAiLWphcmphciIpIHx8IHN0cmluZ3MuSGFzU3VmZml4KG5hbWUsICIuaW1wbCIpIHsKLQkJCWNvbnRpbnVlCi0JCX0KLQkJbW9kdWxlLk5hbWUgPSBuYW1lCi0JCWphdmFNb2R1bGVzW25hbWVdID0gbW9kdWxlCi0JCWZvciBfLCBzcmMgOj0gcmFuZ2UgbW9kdWxlLlNyY3MgewotCQkJaWYgIXNsaWNlcy5Db250YWlucyhlbnYuSmF2YUZpbGVzLCBzcmMpIHsKLQkJCQkvLyBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGFjdGl2ZSBmaWxlcy4KLQkJCQljb250aW51ZQotCQkJfQotCQkJaWYgamF2YUZpbGVUb01vZHVsZU1hcFtzcmNdICE9IG5pbCB7Ci0JCQkJLy8gVE9ETyhtaWNoYWVsbWVyZyk6IEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBhIGZpbGUgaXMgY292ZXJlZCBieSBtdWx0aXBsZSBtb2R1bGVzLgotCQkJCWxvZy5QcmludGYoIkZpbGUgJXEgZm91bmQgaW4gbW9kdWxlICVxIGJ1dCBpcyBhbHJlYWR5IGNvdmVyZWQgYnkgbW9kdWxlICVxIiwgc3JjLCBtb2R1bGUuTmFtZSwgamF2YUZpbGVUb01vZHVsZU1hcFtzcmNdLk5hbWUpCi0JCQkJY29udGludWUKLQkJCX0KLQkJCWphdmFGaWxlVG9Nb2R1bGVNYXBbc3JjXSA9IG1vZHVsZQorCS8vIEFkZCB0b3AgbGV2ZWwgamF2YV9zZGtfbGlicmFyeSBmb3IgLmltcGwgbW9kdWxlcy4KKwlmb3IgbmFtZSwgbW9kdWxlIDo9IHJhbmdlIHJldCB7CisJCWlmIHN0cmlwZWQgOj0gc3RyaW5ncy5UcmltU3VmZml4KG5hbWUsICIuaW1wbCIpOyBzdHJpcGVkICE9IG5hbWUgeworCQkJcmV0W3N0cmlwZWRdID0gbW9kdWxlCiAJCX0KIAl9Ci0JcmV0dXJuIGphdmFNb2R1bGVzLCBqYXZhRmlsZVRvTW9kdWxlTWFwLCBuaWwKLX0KLQotZnVuYyB0cmFuc2l0aXZlRGVwcyhtICpqYXZhTW9kdWxlLCBtb2R1bGVzIG1hcFtzdHJpbmddKmphdmFNb2R1bGUpIFtdc3RyaW5nIHsKLQl2YXIgcmV0IFtdc3RyaW5nCi0JcSA6PSBsaXN0Lk5ldygpCi0JcS5QdXNoQmFjayhtLk5hbWUpCi0Jc2VlbiA6PSBtYWtlKG1hcFtzdHJpbmddYm9vbCkgLy8gbW9kdWxlIG5hbWVzIC0+IHRydWUKLQlmb3IgcS5MZW4oKSA+IDAgewotCQluYW1lIDo9IHEuUmVtb3ZlKHEuRnJvbnQoKSkuKHN0cmluZykKLQkJbW9kIDo9IG1vZHVsZXNbbmFtZV0KLQkJaWYgbW9kID09IG5pbCB7Ci0JCQljb250aW51ZQotCQl9Ci0KLQkJcmV0ID0gYXBwZW5kKHJldCwgbW9kLlNyY3MuLi4pCi0JCXJldCA9IGFwcGVuZChyZXQsIG1vZC5TcmNKYXJzLi4uKQotCQlyZXQgPSBhcHBlbmQocmV0LCBtb2QuSmFycy4uLikKLQkJZm9yIF8sIGQgOj0gcmFuZ2UgbW9kLkRlcHMgewotCQkJaWYgc2VlbltkXSB7Ci0JCQkJY29udGludWUKLQkJCX0KLQkJCXNlZW5bZF0gPSB0cnVlCi0JCQlxLlB1c2hCYWNrKGQpCi0JCX0KLQl9Ci0Jc2xpY2VzLlNvcnQocmV0KQotCXJldCA9IHNsaWNlcy5Db21wYWN0KHJldCkKLQlyZXR1cm4gcmV0CisJcmV0dXJuIHJldCwgbmlsCiB9CmRpZmYgLS1naXQgYS90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5LnNoIGIvdG9vbHMvaWRlX3F1ZXJ5L2lkZV9xdWVyeS5zaAppbmRleCAyZGY0OGQwLi42ZjliMGM0IDEwMDc1NQotLS0gYS90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5LnNoCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnkuc2gKQEAgLTMyLDYgKzMyLDcgQEAKICAgICAgIDs7CiBlc2FjCiAKK2V4cG9ydCBCVUlMRF9FTlZfU0VRVUVOQ0VfTlVNQkVSPTEzCiBleHBvcnQgQU5EUk9JRF9CVUlMRF9UT1A9JFRPUAogZXhwb3J0IE9VVF9ESVI9JHtPVVRfRElSfQogZXhlYyAiJHtQUkVCVUlMVFNfR09fUk9PVH0vYmluL2dvIiAicnVuIiAiaWRlX3F1ZXJ5IiAiJEAiCmRpZmYgLS1naXQgYS90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5X3Byb3RvL2lkZV9xdWVyeS5wYi5nbyBiL3Rvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnlfcHJvdG8vaWRlX3F1ZXJ5LnBiLmdvCmluZGV4IGYzYTAxNmQuLmExOTAyMjMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnlfcHJvdG8vaWRlX3F1ZXJ5LnBiLmdvCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnlfcHJvdG8vaWRlX3F1ZXJ5LnBiLmdvCkBAIC0xLDYgKzEsMjEgQEAKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKwogLy8gQ29kZSBnZW5lcmF0ZWQgYnkgcHJvdG9jLWdlbi1nby4gRE8gTk9UIEVESVQuCiAvLyB2ZXJzaW9uczoKLS8vIAlwcm90b2MtZ2VuLWdvIHYxLjI1LjAtZGV2ZWwKKy8vIAlwcm90b2MtZ2VuLWdvIHYxLjMwLjAKIC8vIAlwcm90b2MgICAgICAgIHYzLjIxLjEyCiAvLyBzb3VyY2U6IGlkZV9xdWVyeS5wcm90bwogCkBAIC0yMCwyNTEgKzM1LDExMyBAQAogCV8gPSBwcm90b2ltcGwuRW5mb3JjZVZlcnNpb24ocHJvdG9pbXBsLk1heFZlcnNpb24gLSAyMCkKICkKIAotdHlwZSBTdGF0dXNfQ29kZSBpbnQzMgordHlwZSBMYW5ndWFnZSBpbnQzMgogCiBjb25zdCAoCi0JU3RhdHVzX09LICAgICAgU3RhdHVzX0NvZGUgPSAwCi0JU3RhdHVzX0ZBSUxVUkUgU3RhdHVzX0NvZGUgPSAxCisJTGFuZ3VhZ2VfTEFOR1VBR0VfVU5TUEVDSUZJRUQgTGFuZ3VhZ2UgPSAwCisJTGFuZ3VhZ2VfTEFOR1VBR0VfSkFWQSAgICAgICAgTGFuZ3VhZ2UgPSAxIC8vIGFsc28gaW5jbHVkZXMgS290bGluCisJTGFuZ3VhZ2VfTEFOR1VBR0VfQ1BQICAgICAgICAgTGFuZ3VhZ2UgPSAyCiApCiAKLS8vIEVudW0gdmFsdWUgbWFwcyBmb3IgU3RhdHVzX0NvZGUuCisvLyBFbnVtIHZhbHVlIG1hcHMgZm9yIExhbmd1YWdlLgogdmFyICgKLQlTdGF0dXNfQ29kZV9uYW1lID0gbWFwW2ludDMyXXN0cmluZ3sKLQkJMDogIk9LIiwKLQkJMTogIkZBSUxVUkUiLAorCUxhbmd1YWdlX25hbWUgPSBtYXBbaW50MzJdc3RyaW5neworCQkwOiAiTEFOR1VBR0VfVU5TUEVDSUZJRUQiLAorCQkxOiAiTEFOR1VBR0VfSkFWQSIsCisJCTI6ICJMQU5HVUFHRV9DUFAiLAogCX0KLQlTdGF0dXNfQ29kZV92YWx1ZSA9IG1hcFtzdHJpbmddaW50MzJ7Ci0JCSJPSyI6ICAgICAgMCwKLQkJIkZBSUxVUkUiOiAxLAorCUxhbmd1YWdlX3ZhbHVlID0gbWFwW3N0cmluZ11pbnQzMnsKKwkJIkxBTkdVQUdFX1VOU1BFQ0lGSUVEIjogMCwKKwkJIkxBTkdVQUdFX0pBVkEiOiAgICAgICAgMSwKKwkJIkxBTkdVQUdFX0NQUCI6ICAgICAgICAgMiwKIAl9CiApCiAKLWZ1bmMgKHggU3RhdHVzX0NvZGUpIEVudW0oKSAqU3RhdHVzX0NvZGUgewotCXAgOj0gbmV3KFN0YXR1c19Db2RlKQorZnVuYyAoeCBMYW5ndWFnZSkgRW51bSgpICpMYW5ndWFnZSB7CisJcCA6PSBuZXcoTGFuZ3VhZ2UpCiAJKnAgPSB4CiAJcmV0dXJuIHAKIH0KIAotZnVuYyAoeCBTdGF0dXNfQ29kZSkgU3RyaW5nKCkgc3RyaW5nIHsKK2Z1bmMgKHggTGFuZ3VhZ2UpIFN0cmluZygpIHN0cmluZyB7CiAJcmV0dXJuIHByb3RvaW1wbC5YLkVudW1TdHJpbmdPZih4LkRlc2NyaXB0b3IoKSwgcHJvdG9yZWZsZWN0LkVudW1OdW1iZXIoeCkpCiB9CiAKLWZ1bmMgKFN0YXR1c19Db2RlKSBEZXNjcmlwdG9yKCkgcHJvdG9yZWZsZWN0LkVudW1EZXNjcmlwdG9yIHsKK2Z1bmMgKExhbmd1YWdlKSBEZXNjcmlwdG9yKCkgcHJvdG9yZWZsZWN0LkVudW1EZXNjcmlwdG9yIHsKIAlyZXR1cm4gZmlsZV9pZGVfcXVlcnlfcHJvdG9fZW51bVR5cGVzWzBdLkRlc2NyaXB0b3IoKQogfQogCi1mdW5jIChTdGF0dXNfQ29kZSkgVHlwZSgpIHByb3RvcmVmbGVjdC5FbnVtVHlwZSB7CitmdW5jIChMYW5ndWFnZSkgVHlwZSgpIHByb3RvcmVmbGVjdC5FbnVtVHlwZSB7CiAJcmV0dXJuICZmaWxlX2lkZV9xdWVyeV9wcm90b19lbnVtVHlwZXNbMF0KIH0KIAotZnVuYyAoeCBTdGF0dXNfQ29kZSkgTnVtYmVyKCkgcHJvdG9yZWZsZWN0LkVudW1OdW1iZXIgeworZnVuYyAoeCBMYW5ndWFnZSkgTnVtYmVyKCkgcHJvdG9yZWZsZWN0LkVudW1OdW1iZXIgewogCXJldHVybiBwcm90b3JlZmxlY3QuRW51bU51bWJlcih4KQogfQogCi0vLyBEZXByZWNhdGVkOiBVc2UgU3RhdHVzX0NvZGUuRGVzY3JpcHRvciBpbnN0ZWFkLgotZnVuYyAoU3RhdHVzX0NvZGUpIEVudW1EZXNjcmlwdG9yKCkgKFtdYnl0ZSwgW11pbnQpIHsKLQlyZXR1cm4gZmlsZV9pZGVfcXVlcnlfcHJvdG9fcmF3RGVzY0daSVAoKSwgW11pbnR7MCwgMH0KLX0KLQotLy8gSW5kaWNhdGVzIHRoZSBzdWNjZXNzL2ZhaWx1cmUgZm9yIGFuYWx5c2lzLgotdHlwZSBTdGF0dXMgc3RydWN0IHsKLQlzdGF0ZSAgICAgICAgIHByb3RvaW1wbC5NZXNzYWdlU3RhdGUKLQlzaXplQ2FjaGUgICAgIHByb3RvaW1wbC5TaXplQ2FjaGUKLQl1bmtub3duRmllbGRzIHByb3RvaW1wbC5Vbmtub3duRmllbGRzCi0KLQlDb2RlIFN0YXR1c19Db2RlIGBwcm90b2J1ZjoidmFyaW50LDEsb3B0LG5hbWU9Y29kZSxwcm90bzMsZW51bT1pZGVfcXVlcnkuU3RhdHVzX0NvZGUiIGpzb246ImNvZGUsb21pdGVtcHR5ImAKLQkvLyBEZXRhaWxzIGFib3V0IHRoZSBzdGF0dXMsIG1pZ2h0IGJlIGRpc3BsYXllZCB0byB1c2VyLgotCU1lc3NhZ2UgKnN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDIsb3B0LG5hbWU9bWVzc2FnZSxwcm90bzMsb25lb2YiIGpzb246Im1lc3NhZ2Usb21pdGVtcHR5ImAKLX0KLQotZnVuYyAoeCAqU3RhdHVzKSBSZXNldCgpIHsKLQkqeCA9IFN0YXR1c3t9Ci0JaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgewotCQltaSA6PSAmZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbMF0KLQkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCi0JCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCi0JfQotfQotCi1mdW5jICh4ICpTdGF0dXMpIFN0cmluZygpIHN0cmluZyB7Ci0JcmV0dXJuIHByb3RvaW1wbC5YLk1lc3NhZ2VTdHJpbmdPZih4KQotfQotCi1mdW5jICgqU3RhdHVzKSBQcm90b01lc3NhZ2UoKSB7fQotCi1mdW5jICh4ICpTdGF0dXMpIFByb3RvUmVmbGVjdCgpIHByb3RvcmVmbGVjdC5NZXNzYWdlIHsKLQltaSA6PSAmZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbMF0KLQlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCAmJiB4ICE9IG5pbCB7Ci0JCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQotCQlpZiBtcy5Mb2FkTWVzc2FnZUluZm8oKSA9PSBuaWwgewotCQkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKLQkJfQotCQlyZXR1cm4gbXMKLQl9Ci0JcmV0dXJuIG1pLk1lc3NhZ2VPZih4KQotfQotCi0vLyBEZXByZWNhdGVkOiBVc2UgU3RhdHVzLlByb3RvUmVmbGVjdC5EZXNjcmlwdG9yIGluc3RlYWQuCi1mdW5jICgqU3RhdHVzKSBEZXNjcmlwdG9yKCkgKFtdYnl0ZSwgW11pbnQpIHsKKy8vIERlcHJlY2F0ZWQ6IFVzZSBMYW5ndWFnZS5EZXNjcmlwdG9yIGluc3RlYWQuCitmdW5jIChMYW5ndWFnZSkgRW51bURlc2NyaXB0b3IoKSAoW11ieXRlLCBbXWludCkgewogCXJldHVybiBmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHswfQogfQogCi1mdW5jICh4ICpTdGF0dXMpIEdldENvZGUoKSBTdGF0dXNfQ29kZSB7Ci0JaWYgeCAhPSBuaWwgewotCQlyZXR1cm4geC5Db2RlCit0eXBlIEFuYWx5c2lzUmVzdWx0X1N0YXR1c19Db2RlIGludDMyCisKK2NvbnN0ICgKKwlBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ09ERV9VTlNQRUNJRklFRCAgQW5hbHlzaXNSZXN1bHRfU3RhdHVzX0NvZGUgPSAwCisJQW5hbHlzaXNSZXN1bHRfU3RhdHVzX0NPREVfT0sgICAgICAgICAgIEFuYWx5c2lzUmVzdWx0X1N0YXR1c19Db2RlID0gMQorCUFuYWx5c2lzUmVzdWx0X1N0YXR1c19DT0RFX05PVF9GT1VORCAgICBBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZSA9IDIgLy8gbm8gdGFyZ2V0IG9yIG1vZHVsZSBmb3VuZCBmb3IgdGhlIHNvdXJjZSBmaWxlLgorCUFuYWx5c2lzUmVzdWx0X1N0YXR1c19DT0RFX0JVSUxEX0ZBSUxFRCBBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZSA9IDMKKykKKworLy8gRW51bSB2YWx1ZSBtYXBzIGZvciBBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZS4KK3ZhciAoCisJQW5hbHlzaXNSZXN1bHRfU3RhdHVzX0NvZGVfbmFtZSA9IG1hcFtpbnQzMl1zdHJpbmd7CisJCTA6ICJDT0RFX1VOU1BFQ0lGSUVEIiwKKwkJMTogIkNPREVfT0siLAorCQkyOiAiQ09ERV9OT1RfRk9VTkQiLAorCQkzOiAiQ09ERV9CVUlMRF9GQUlMRUQiLAogCX0KLQlyZXR1cm4gU3RhdHVzX09LCi19Ci0KLWZ1bmMgKHggKlN0YXR1cykgR2V0TWVzc2FnZSgpIHN0cmluZyB7Ci0JaWYgeCAhPSBuaWwgJiYgeC5NZXNzYWdlICE9IG5pbCB7Ci0JCXJldHVybiAqeC5NZXNzYWdlCisJQW5hbHlzaXNSZXN1bHRfU3RhdHVzX0NvZGVfdmFsdWUgPSBtYXBbc3RyaW5nXWludDMyeworCQkiQ09ERV9VTlNQRUNJRklFRCI6ICAwLAorCQkiQ09ERV9PSyI6ICAgICAgICAgICAxLAorCQkiQ09ERV9OT1RfRk9VTkQiOiAgICAyLAorCQkiQ09ERV9CVUlMRF9GQUlMRUQiOiAzLAogCX0KLQlyZXR1cm4gIiIKKykKKworZnVuYyAoeCBBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZSkgRW51bSgpICpBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZSB7CisJcCA6PSBuZXcoQW5hbHlzaXNSZXN1bHRfU3RhdHVzX0NvZGUpCisJKnAgPSB4CisJcmV0dXJuIHAKIH0KIAotLy8gUmVwcmVzZW50cyBhbiBBbmRyb2lkIGNoZWNrb3V0IG9uIHVzZXIncyB3b3Jrc3RhdGlvbi4KLXR5cGUgUmVwb1N0YXRlIHN0cnVjdCB7Ci0Jc3RhdGUgICAgICAgICBwcm90b2ltcGwuTWVzc2FnZVN0YXRlCi0Jc2l6ZUNhY2hlICAgICBwcm90b2ltcGwuU2l6ZUNhY2hlCi0JdW5rbm93bkZpZWxkcyBwcm90b2ltcGwuVW5rbm93bkZpZWxkcwotCi0JLy8gQWJzb2x1dGUgcGF0aCBmb3IgdGhlIGNoZWNrb3V0IGluIHRoZSB3b3Jrc3RhdGlvbi4KLQkvLyBlLmcuIC9ob21lL3VzZXIvd29yay9hbmRyb2lkLwotCVJlcG9EaXIgc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsMSxvcHQsbmFtZT1yZXBvX2Rpcixqc29uPXJlcG9EaXIscHJvdG8zIiBqc29uOiJyZXBvX2RpcixvbWl0ZW1wdHkiYAotCS8vIFJlbGF0aXZlIHRvIHJlcG9fZGlyLgotCUFjdGl2ZUZpbGVQYXRoIFtdc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsMixyZXAsbmFtZT1hY3RpdmVfZmlsZV9wYXRoLGpzb249YWN0aXZlRmlsZVBhdGgscHJvdG8zIiBqc29uOiJhY3RpdmVfZmlsZV9wYXRoLG9taXRlbXB0eSJgCi0JLy8gUmVwb3NpdG9yeSByZWxhdGl2ZSBwYXRoIHRvIG91dHB1dCBkaXJlY3RvcnkgaW4gd29ya3N0YXRpb24uCi0JT3V0RGlyIHN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDMsb3B0LG5hbWU9b3V0X2Rpcixqc29uPW91dERpcixwcm90bzMiIGpzb246Im91dF9kaXIsb21pdGVtcHR5ImAKLQkvLyBSZXBvc2l0b3J5IHJlbGF0aXZlIHBhdGggdG8gY29tcGlsZV9jb21tYW5kcy5qc29uIGluIHdvcmtzdGF0aW9uLgotCUNvbXBEYlBhdGggc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsNCxvcHQsbmFtZT1jb21wX2RiX3BhdGgsanNvbj1jb21wRGJQYXRoLHByb3RvMyIganNvbjoiY29tcF9kYl9wYXRoLG9taXRlbXB0eSJgCitmdW5jICh4IEFuYWx5c2lzUmVzdWx0X1N0YXR1c19Db2RlKSBTdHJpbmcoKSBzdHJpbmcgeworCXJldHVybiBwcm90b2ltcGwuWC5FbnVtU3RyaW5nT2YoeC5EZXNjcmlwdG9yKCksIHByb3RvcmVmbGVjdC5FbnVtTnVtYmVyKHgpKQogfQogCi1mdW5jICh4ICpSZXBvU3RhdGUpIFJlc2V0KCkgewotCSp4ID0gUmVwb1N0YXRle30KLQlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCB7Ci0JCW1pIDo9ICZmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1sxXQotCQltcyA6PSBwcm90b2ltcGwuWC5NZXNzYWdlU3RhdGVPZihwcm90b2ltcGwuUG9pbnRlcih4KSkKLQkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKLQl9CitmdW5jIChBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZSkgRGVzY3JpcHRvcigpIHByb3RvcmVmbGVjdC5FbnVtRGVzY3JpcHRvciB7CisJcmV0dXJuIGZpbGVfaWRlX3F1ZXJ5X3Byb3RvX2VudW1UeXBlc1sxXS5EZXNjcmlwdG9yKCkKIH0KIAotZnVuYyAoeCAqUmVwb1N0YXRlKSBTdHJpbmcoKSBzdHJpbmcgewotCXJldHVybiBwcm90b2ltcGwuWC5NZXNzYWdlU3RyaW5nT2YoeCkKK2Z1bmMgKEFuYWx5c2lzUmVzdWx0X1N0YXR1c19Db2RlKSBUeXBlKCkgcHJvdG9yZWZsZWN0LkVudW1UeXBlIHsKKwlyZXR1cm4gJmZpbGVfaWRlX3F1ZXJ5X3Byb3RvX2VudW1UeXBlc1sxXQogfQogCi1mdW5jICgqUmVwb1N0YXRlKSBQcm90b01lc3NhZ2UoKSB7fQotCi1mdW5jICh4ICpSZXBvU3RhdGUpIFByb3RvUmVmbGVjdCgpIHByb3RvcmVmbGVjdC5NZXNzYWdlIHsKLQltaSA6PSAmZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbMV0KLQlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCAmJiB4ICE9IG5pbCB7Ci0JCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQotCQlpZiBtcy5Mb2FkTWVzc2FnZUluZm8oKSA9PSBuaWwgewotCQkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKLQkJfQotCQlyZXR1cm4gbXMKLQl9Ci0JcmV0dXJuIG1pLk1lc3NhZ2VPZih4KQorZnVuYyAoeCBBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZSkgTnVtYmVyKCkgcHJvdG9yZWZsZWN0LkVudW1OdW1iZXIgeworCXJldHVybiBwcm90b3JlZmxlY3QuRW51bU51bWJlcih4KQogfQogCi0vLyBEZXByZWNhdGVkOiBVc2UgUmVwb1N0YXRlLlByb3RvUmVmbGVjdC5EZXNjcmlwdG9yIGluc3RlYWQuCi1mdW5jICgqUmVwb1N0YXRlKSBEZXNjcmlwdG9yKCkgKFtdYnl0ZSwgW11pbnQpIHsKLQlyZXR1cm4gZmlsZV9pZGVfcXVlcnlfcHJvdG9fcmF3RGVzY0daSVAoKSwgW11pbnR7MX0KKy8vIERlcHJlY2F0ZWQ6IFVzZSBBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZS5EZXNjcmlwdG9yIGluc3RlYWQuCitmdW5jIChBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZSkgRW51bURlc2NyaXB0b3IoKSAoW11ieXRlLCBbXWludCkgeworCXJldHVybiBmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHszLCAwLCAwfQogfQogCi1mdW5jICh4ICpSZXBvU3RhdGUpIEdldFJlcG9EaXIoKSBzdHJpbmcgewotCWlmIHggIT0gbmlsIHsKLQkJcmV0dXJuIHguUmVwb0RpcgotCX0KLQlyZXR1cm4gIiIKLX0KLQotZnVuYyAoeCAqUmVwb1N0YXRlKSBHZXRBY3RpdmVGaWxlUGF0aCgpIFtdc3RyaW5nIHsKLQlpZiB4ICE9IG5pbCB7Ci0JCXJldHVybiB4LkFjdGl2ZUZpbGVQYXRoCi0JfQotCXJldHVybiBuaWwKLX0KLQotZnVuYyAoeCAqUmVwb1N0YXRlKSBHZXRPdXREaXIoKSBzdHJpbmcgewotCWlmIHggIT0gbmlsIHsKLQkJcmV0dXJuIHguT3V0RGlyCi0JfQotCXJldHVybiAiIgotfQotCi1mdW5jICh4ICpSZXBvU3RhdGUpIEdldENvbXBEYlBhdGgoKSBzdHJpbmcgewotCWlmIHggIT0gbmlsIHsKLQkJcmV0dXJuIHguQ29tcERiUGF0aAotCX0KLQlyZXR1cm4gIiIKLX0KLQotLy8gUHJvdmlkZXMgYWxsIHRoZSB0YXJnZXRzIHRoYXQgYXJlIHByZS1yZXF1aXNpdGllcyBmb3IgcnVubmluZyBsYW5ndWFnZQotLy8gc2VydmljZXMgb24gYWN0aXZlX2ZpbGVfcGF0aHMuCi10eXBlIERlcHNSZXNwb25zZSBzdHJ1Y3QgewotCXN0YXRlICAgICAgICAgcHJvdG9pbXBsLk1lc3NhZ2VTdGF0ZQotCXNpemVDYWNoZSAgICAgcHJvdG9pbXBsLlNpemVDYWNoZQotCXVua25vd25GaWVsZHMgcHJvdG9pbXBsLlVua25vd25GaWVsZHMKLQotCURlcHMgICBbXSpEZXBzUmVzcG9uc2VfRGVwcyBgcHJvdG9idWY6ImJ5dGVzLDEscmVwLG5hbWU9ZGVwcyxwcm90bzMiIGpzb246ImRlcHMsb21pdGVtcHR5ImAKLQlTdGF0dXMgKlN0YXR1cyAgICAgICAgICAgICAgYHByb3RvYnVmOiJieXRlcywyLG9wdCxuYW1lPXN0YXR1cyxwcm90bzMsb25lb2YiIGpzb246InN0YXR1cyxvbWl0ZW1wdHkiYAotfQotCi1mdW5jICh4ICpEZXBzUmVzcG9uc2UpIFJlc2V0KCkgewotCSp4ID0gRGVwc1Jlc3BvbnNle30KLQlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCB7Ci0JCW1pIDo9ICZmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1syXQotCQltcyA6PSBwcm90b2ltcGwuWC5NZXNzYWdlU3RhdGVPZihwcm90b2ltcGwuUG9pbnRlcih4KSkKLQkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKLQl9Ci19Ci0KLWZ1bmMgKHggKkRlcHNSZXNwb25zZSkgU3RyaW5nKCkgc3RyaW5nIHsKLQlyZXR1cm4gcHJvdG9pbXBsLlguTWVzc2FnZVN0cmluZ09mKHgpCi19Ci0KLWZ1bmMgKCpEZXBzUmVzcG9uc2UpIFByb3RvTWVzc2FnZSgpIHt9Ci0KLWZ1bmMgKHggKkRlcHNSZXNwb25zZSkgUHJvdG9SZWZsZWN0KCkgcHJvdG9yZWZsZWN0Lk1lc3NhZ2UgewotCW1pIDo9ICZmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1syXQotCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkICYmIHggIT0gbmlsIHsKLQkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCi0JCWlmIG1zLkxvYWRNZXNzYWdlSW5mbygpID09IG5pbCB7Ci0JCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQotCQl9Ci0JCXJldHVybiBtcwotCX0KLQlyZXR1cm4gbWkuTWVzc2FnZU9mKHgpCi19Ci0KLS8vIERlcHJlY2F0ZWQ6IFVzZSBEZXBzUmVzcG9uc2UuUHJvdG9SZWZsZWN0LkRlc2NyaXB0b3IgaW5zdGVhZC4KLWZ1bmMgKCpEZXBzUmVzcG9uc2UpIERlc2NyaXB0b3IoKSAoW11ieXRlLCBbXWludCkgewotCXJldHVybiBmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHsyfQotfQotCi1mdW5jICh4ICpEZXBzUmVzcG9uc2UpIEdldERlcHMoKSBbXSpEZXBzUmVzcG9uc2VfRGVwcyB7Ci0JaWYgeCAhPSBuaWwgewotCQlyZXR1cm4geC5EZXBzCi0JfQotCXJldHVybiBuaWwKLX0KLQotZnVuYyAoeCAqRGVwc1Jlc3BvbnNlKSBHZXRTdGF0dXMoKSAqU3RhdHVzIHsKLQlpZiB4ICE9IG5pbCB7Ci0JCXJldHVybiB4LlN0YXR1cwotCX0KLQlyZXR1cm4gbmlsCi19Ci0KLS8vIFJldHVybnMgYWxsIHRoZSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgZm9yIHByb3ZpZGluZyBsYW5ndWFnZSBzZXJ2aWNlcyBmb3IgdGhlCi0vLyBhY3RpdmUgZmlsZXMuCiB0eXBlIEdlbmVyYXRlZEZpbGUgc3RydWN0IHsKIAlzdGF0ZSAgICAgICAgIHByb3RvaW1wbC5NZXNzYWdlU3RhdGUKIAlzaXplQ2FjaGUgICAgIHByb3RvaW1wbC5TaXplQ2FjaGUKIAl1bmtub3duRmllbGRzIHByb3RvaW1wbC5Vbmtub3duRmllbGRzCiAKLQkvLyBQYXRoIHRvIHRoZSBmaWxlIHJlbGF0aXZlIHRvIElkZUFuYWx5c2lzLmJ1aWxkX2FydGlmYWN0X3Jvb3QuCisJLy8gUGF0aCB0byB0aGUgZmlsZSByZWxhdGl2ZSB0byBidWlsZF9vdXRfZGlyLgogCVBhdGggc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsMSxvcHQsbmFtZT1wYXRoLHByb3RvMyIganNvbjoicGF0aCxvbWl0ZW1wdHkiYAogCS8vIFRoZSB0ZXh0IG9mIHRoZSBnZW5lcmF0ZWQgZmlsZSwgaWYgbm90IHByb3ZpZGVkIGNvbnRlbnRzIHdpbGwgYmUgcmVhZAogCS8vIGZyb20gdGhlIHBhdGggYWJvdmUgaW4gdXNlcidzIHdvcmtzdGF0aW9uLgpAQCAtMjc0LDcgKzE1MSw3IEBACiBmdW5jICh4ICpHZW5lcmF0ZWRGaWxlKSBSZXNldCgpIHsKIAkqeCA9IEdlbmVyYXRlZEZpbGV7fQogCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkIHsKLQkJbWkgOj0gJmZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzNdCisJCW1pIDo9ICZmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1swXQogCQltcyA6PSBwcm90b2ltcGwuWC5NZXNzYWdlU3RhdGVPZihwcm90b2ltcGwuUG9pbnRlcih4KSkKIAkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKIAl9CkBAIC0yODcsNyArMTY0LDcgQEAKIGZ1bmMgKCpHZW5lcmF0ZWRGaWxlKSBQcm90b01lc3NhZ2UoKSB7fQogCiBmdW5jICh4ICpHZW5lcmF0ZWRGaWxlKSBQcm90b1JlZmxlY3QoKSBwcm90b3JlZmxlY3QuTWVzc2FnZSB7Ci0JbWkgOj0gJmZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzNdCisJbWkgOj0gJmZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzBdCiAJaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgJiYgeCAhPSBuaWwgewogCQltcyA6PSBwcm90b2ltcGwuWC5NZXNzYWdlU3RhdGVPZihwcm90b2ltcGwuUG9pbnRlcih4KSkKIAkJaWYgbXMuTG9hZE1lc3NhZ2VJbmZvKCkgPT0gbmlsIHsKQEAgLTMwMCw3ICsxNzcsNyBAQAogCiAvLyBEZXByZWNhdGVkOiBVc2UgR2VuZXJhdGVkRmlsZS5Qcm90b1JlZmxlY3QuRGVzY3JpcHRvciBpbnN0ZWFkLgogZnVuYyAoKkdlbmVyYXRlZEZpbGUpIERlc2NyaXB0b3IoKSAoW11ieXRlLCBbXWludCkgewotCXJldHVybiBmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHszfQorCXJldHVybiBmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHswfQogfQogCiBmdW5jICh4ICpHZW5lcmF0ZWRGaWxlKSBHZXRQYXRoKCkgc3RyaW5nIHsKQEAgLTMxNywxMjcgKzE5NCwyOSBAQAogCXJldHVybiBuaWwKIH0KIAotdHlwZSBTb3VyY2VGaWxlIHN0cnVjdCB7Ci0Jc3RhdGUgICAgICAgICBwcm90b2ltcGwuTWVzc2FnZVN0YXRlCi0Jc2l6ZUNhY2hlICAgICBwcm90b2ltcGwuU2l6ZUNhY2hlCi0JdW5rbm93bkZpZWxkcyBwcm90b2ltcGwuVW5rbm93bkZpZWxkcwotCi0JLy8gUGF0aCB0byB0aGUgc291cmNlIGZpbGUgcmVsYXRpdmUgdG8gcmVwb3NpdG9yeSByb290LgotCVBhdGggc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsMSxvcHQsbmFtZT1wYXRoLHByb3RvMyIganNvbjoicGF0aCxvbWl0ZW1wdHkiYAotCS8vIFdvcmtpbmcgZGlyZWN0b3J5IHVzZWQgYnkgdGhlIGJ1aWxkIHN5c3RlbS4gQWxsIHRoZSByZWxhdGl2ZQotCS8vIHBhdGhzIGluIGNvbXBpbGVyX2FyZ3VtZW50cyBzaG91bGQgYmUgcmVsYXRpdmUgdG8gdGhpcyBwYXRoLgotCS8vIFJlbGF0aXZlIHRvIHJlcG9zaXRvcnkgcm9vdC4KLQlXb3JraW5nRGlyIHN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDIsb3B0LG5hbWU9d29ya2luZ19kaXIsanNvbj13b3JraW5nRGlyLHByb3RvMyIganNvbjoid29ya2luZ19kaXIsb21pdGVtcHR5ImAKLQkvLyBDb21waWxlciBhcmd1bWVudHMgdG8gY29tcGlsZSB0aGUgc291cmNlIGZpbGUuIElmIG11bHRpcGxlIHZhcmlhbnRzCi0JLy8gb2YgdGhlIG1vZHVsZSBiZWluZyBjb21waWxlZCBhcmUgcG9zc2libGUsIHRoZSBxdWVyeSBzY3JpcHQgd2lsbCBjaG9vc2UKLQkvLyBvbmUuCi0JQ29tcGlsZXJBcmd1bWVudHMgW11zdHJpbmcgYHByb3RvYnVmOiJieXRlcywzLHJlcCxuYW1lPWNvbXBpbGVyX2FyZ3VtZW50cyxqc29uPWNvbXBpbGVyQXJndW1lbnRzLHByb3RvMyIganNvbjoiY29tcGlsZXJfYXJndW1lbnRzLG9taXRlbXB0eSJgCi0JLy8gQW55IGdlbmVyYXRlZCBmaWxlcyB0aGF0IGFyZSB1c2VkIGluIGNvbXBpbGluZyB0aGUgZmlsZS4KLQlHZW5lcmF0ZWQgW10qR2VuZXJhdGVkRmlsZSBgcHJvdG9idWY6ImJ5dGVzLDQscmVwLG5hbWU9Z2VuZXJhdGVkLHByb3RvMyIganNvbjoiZ2VuZXJhdGVkLG9taXRlbXB0eSJgCi0JLy8gUGF0aHMgdG8gYWxsIG9mIHRoZSBzb3VyY2VzLCBsaWtlIGJ1aWxkIGZpbGVzLCBjb2RlIGdlbmVyYXRvcnMsCi0JLy8gcHJvdG8gZmlsZXMgZXRjLiB0aGF0IHdlcmUgdXNlZCBkdXJpbmcgYW5hbHlzaXMuIFVzZWQgdG8gZmlndXJlCi0JLy8gb3V0IHdoZW4gYSBzZXQgb2YgYnVpbGQgYXJ0aWZhY3RzIGFyZSBzdGFsZSBhbmQgdGhlIHF1ZXJ5IHRvb2wKLQkvLyBtdXN0IGJlIHJlLXJ1bi4KLQkvLyBSZWxhdGl2ZSB0byByZXBvc2l0b3J5IHJvb3QuCi0JRGVwcyBbXXN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDUscmVwLG5hbWU9ZGVwcyxwcm90bzMiIGpzb246ImRlcHMsb21pdGVtcHR5ImAKLQkvLyBSZXByZXNlbnRzIGFuYWx5c2lzIHN0YXR1cyBmb3IgdGhpcyBwYXJ0aWN1bGFyIGZpbGUuIGUuZy4gbm90IHBhcnQKLQkvLyBvZiB0aGUgYnVpbGQgZ3JhcGguCi0JU3RhdHVzICpTdGF0dXMgYHByb3RvYnVmOiJieXRlcyw2LG9wdCxuYW1lPXN0YXR1cyxwcm90bzMsb25lb2YiIGpzb246InN0YXR1cyxvbWl0ZW1wdHkiYAotfQotCi1mdW5jICh4ICpTb3VyY2VGaWxlKSBSZXNldCgpIHsKLQkqeCA9IFNvdXJjZUZpbGV7fQotCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkIHsKLQkJbWkgOj0gJmZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzRdCi0JCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQotCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQotCX0KLX0KLQotZnVuYyAoeCAqU291cmNlRmlsZSkgU3RyaW5nKCkgc3RyaW5nIHsKLQlyZXR1cm4gcHJvdG9pbXBsLlguTWVzc2FnZVN0cmluZ09mKHgpCi19Ci0KLWZ1bmMgKCpTb3VyY2VGaWxlKSBQcm90b01lc3NhZ2UoKSB7fQotCi1mdW5jICh4ICpTb3VyY2VGaWxlKSBQcm90b1JlZmxlY3QoKSBwcm90b3JlZmxlY3QuTWVzc2FnZSB7Ci0JbWkgOj0gJmZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzRdCi0JaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgJiYgeCAhPSBuaWwgewotCQltcyA6PSBwcm90b2ltcGwuWC5NZXNzYWdlU3RhdGVPZihwcm90b2ltcGwuUG9pbnRlcih4KSkKLQkJaWYgbXMuTG9hZE1lc3NhZ2VJbmZvKCkgPT0gbmlsIHsKLQkJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCi0JCX0KLQkJcmV0dXJuIG1zCi0JfQotCXJldHVybiBtaS5NZXNzYWdlT2YoeCkKLX0KLQotLy8gRGVwcmVjYXRlZDogVXNlIFNvdXJjZUZpbGUuUHJvdG9SZWZsZWN0LkRlc2NyaXB0b3IgaW5zdGVhZC4KLWZ1bmMgKCpTb3VyY2VGaWxlKSBEZXNjcmlwdG9yKCkgKFtdYnl0ZSwgW11pbnQpIHsKLQlyZXR1cm4gZmlsZV9pZGVfcXVlcnlfcHJvdG9fcmF3RGVzY0daSVAoKSwgW11pbnR7NH0KLX0KLQotZnVuYyAoeCAqU291cmNlRmlsZSkgR2V0UGF0aCgpIHN0cmluZyB7Ci0JaWYgeCAhPSBuaWwgewotCQlyZXR1cm4geC5QYXRoCi0JfQotCXJldHVybiAiIgotfQotCi1mdW5jICh4ICpTb3VyY2VGaWxlKSBHZXRXb3JraW5nRGlyKCkgc3RyaW5nIHsKLQlpZiB4ICE9IG5pbCB7Ci0JCXJldHVybiB4LldvcmtpbmdEaXIKLQl9Ci0JcmV0dXJuICIiCi19Ci0KLWZ1bmMgKHggKlNvdXJjZUZpbGUpIEdldENvbXBpbGVyQXJndW1lbnRzKCkgW11zdHJpbmcgewotCWlmIHggIT0gbmlsIHsKLQkJcmV0dXJuIHguQ29tcGlsZXJBcmd1bWVudHMKLQl9Ci0JcmV0dXJuIG5pbAotfQotCi1mdW5jICh4ICpTb3VyY2VGaWxlKSBHZXRHZW5lcmF0ZWQoKSBbXSpHZW5lcmF0ZWRGaWxlIHsKLQlpZiB4ICE9IG5pbCB7Ci0JCXJldHVybiB4LkdlbmVyYXRlZAotCX0KLQlyZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHggKlNvdXJjZUZpbGUpIEdldERlcHMoKSBbXXN0cmluZyB7Ci0JaWYgeCAhPSBuaWwgewotCQlyZXR1cm4geC5EZXBzCi0JfQotCXJldHVybiBuaWwKLX0KLQotZnVuYyAoeCAqU291cmNlRmlsZSkgR2V0U3RhdHVzKCkgKlN0YXR1cyB7Ci0JaWYgeCAhPSBuaWwgewotCQlyZXR1cm4geC5TdGF0dXMKLQl9Ci0JcmV0dXJuIG5pbAotfQotCiB0eXBlIElkZUFuYWx5c2lzIHN0cnVjdCB7CiAJc3RhdGUgICAgICAgICBwcm90b2ltcGwuTWVzc2FnZVN0YXRlCiAJc2l6ZUNhY2hlICAgICBwcm90b2ltcGwuU2l6ZUNhY2hlCiAJdW5rbm93bkZpZWxkcyBwcm90b2ltcGwuVW5rbm93bkZpZWxkcwogCi0JLy8gUGF0aCByZWxhdGl2ZSB0byByZXBvc2l0b3J5IHJvb3QsIGNvbnRhaW5pbmcgYWxsIHRoZSBhcnRpZmFjdHMKLQkvLyBnZW5lcmF0ZWQgYnkgdGhlIGJ1aWxkIHN5c3RlbS4gR2VuZXJhdGVkRmlsZS5wYXRoIGFyZSBhbHdheXMKLQkvLyByZWxhdGl2ZSB0byB0aGlzIGRpcmVjdG9yeS4KLQlCdWlsZEFydGlmYWN0Um9vdCBzdHJpbmcgICAgICAgIGBwcm90b2J1ZjoiYnl0ZXMsMSxvcHQsbmFtZT1idWlsZF9hcnRpZmFjdF9yb290LGpzb249YnVpbGRBcnRpZmFjdFJvb3QscHJvdG8zIiBqc29uOiJidWlsZF9hcnRpZmFjdF9yb290LG9taXRlbXB0eSJgCi0JU291cmNlcyAgICAgICAgICAgW10qU291cmNlRmlsZSBgcHJvdG9idWY6ImJ5dGVzLDIscmVwLG5hbWU9c291cmNlcyxwcm90bzMiIGpzb246InNvdXJjZXMsb21pdGVtcHR5ImAKLQkvLyBTdGF0dXMgcmVwcmVzZW50aW5nIG92ZXJhbGwgYW5hbHlzaXMuCi0JLy8gU2hvdWxkIGZhaWwgb25seSB3aGVuIG5vIGFuYWx5c2lzIGNhbiBiZSBwZXJmb3JtZWQuCi0JU3RhdHVzICpTdGF0dXMgYHByb3RvYnVmOiJieXRlcywzLG9wdCxuYW1lPXN0YXR1cyxwcm90bzMsb25lb2YiIGpzb246InN0YXR1cyxvbWl0ZW1wdHkiYAorCS8vIERpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGJ1aWxkIG91dHB1dHMgZ2VuZXJhdGVkIGJ5IHRoZSBidWlsZCBzeXN0ZW0uCisJLy8gUmVsYXRpdmUgdG8gcmVwb3NpdG9yeSByb290LgorCUJ1aWxkT3V0RGlyIHN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDEsb3B0LG5hbWU9YnVpbGRfb3V0X2Rpcixqc29uPWJ1aWxkT3V0RGlyLHByb3RvMyIganNvbjoiYnVpbGRfb3V0X2RpcixvbWl0ZW1wdHkiYAorCS8vIFdvcmtpbmcgZGlyZWN0b3J5IHVzZWQgYnkgdGhlIGJ1aWxkIHN5c3RlbS4KKwkvLyBSZWxhdGl2ZSB0byByZXBvc2l0b3J5IHJvb3QuCisJV29ya2luZ0RpciBzdHJpbmcgYHByb3RvYnVmOiJieXRlcyw0LG9wdCxuYW1lPXdvcmtpbmdfZGlyLGpzb249d29ya2luZ0Rpcixwcm90bzMiIGpzb246IndvcmtpbmdfZGlyLG9taXRlbXB0eSJgCisJLy8gT25seSBzZXQgaWYgdGhlIHdob2xlIHF1ZXJ5IGZhaWxlZC4KKwlFcnJvciAqQW5hbHlzaXNFcnJvciBgcHJvdG9idWY6ImJ5dGVzLDUsb3B0LG5hbWU9ZXJyb3IscHJvdG8zLG9uZW9mIiBqc29uOiJlcnJvcixvbWl0ZW1wdHkiYAorCS8vIExpc3Qgb2YgcmVzdWx0cywgb25lIHBlciBxdWVyaWVkIGZpbGUuCisJUmVzdWx0cyBbXSpBbmFseXNpc1Jlc3VsdCBgcHJvdG9idWY6ImJ5dGVzLDYscmVwLG5hbWU9cmVzdWx0cyxwcm90bzMiIGpzb246InJlc3VsdHMsb21pdGVtcHR5ImAKKwkvLyBMaXN0IG9mIGJ1aWxkYWJsZSB1bml0cyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHJlZmVyZW5jZXMgYnkgdGhlIHJlc3VsdHMuCisJVW5pdHMgW10qQnVpbGRhYmxlVW5pdCBgcHJvdG9idWY6ImJ5dGVzLDcscmVwLG5hbWU9dW5pdHMscHJvdG8zIiBqc29uOiJ1bml0cyxvbWl0ZW1wdHkiYAogfQogCiBmdW5jICh4ICpJZGVBbmFseXNpcykgUmVzZXQoKSB7CiAJKnggPSBJZGVBbmFseXNpc3t9CiAJaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgewotCQltaSA6PSAmZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbNV0KKwkJbWkgOj0gJmZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzFdCiAJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQogCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQogCX0KQEAgLTQ1MCw3ICsyMjksNyBAQAogZnVuYyAoKklkZUFuYWx5c2lzKSBQcm90b01lc3NhZ2UoKSB7fQogCiBmdW5jICh4ICpJZGVBbmFseXNpcykgUHJvdG9SZWZsZWN0KCkgcHJvdG9yZWZsZWN0Lk1lc3NhZ2UgewotCW1pIDo9ICZmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1s1XQorCW1pIDo9ICZmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1sxXQogCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkICYmIHggIT0gbmlsIHsKIAkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCiAJCWlmIG1zLkxvYWRNZXNzYWdlSW5mbygpID09IG5pbCB7CkBAIC00NjMsNDUgKzI0MiwzNDUgQEAKIAogLy8gRGVwcmVjYXRlZDogVXNlIElkZUFuYWx5c2lzLlByb3RvUmVmbGVjdC5EZXNjcmlwdG9yIGluc3RlYWQuCiBmdW5jICgqSWRlQW5hbHlzaXMpIERlc2NyaXB0b3IoKSAoW11ieXRlLCBbXWludCkgewotCXJldHVybiBmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHs1fQorCXJldHVybiBmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHsxfQogfQogCi1mdW5jICh4ICpJZGVBbmFseXNpcykgR2V0QnVpbGRBcnRpZmFjdFJvb3QoKSBzdHJpbmcgeworZnVuYyAoeCAqSWRlQW5hbHlzaXMpIEdldEJ1aWxkT3V0RGlyKCkgc3RyaW5nIHsKIAlpZiB4ICE9IG5pbCB7Ci0JCXJldHVybiB4LkJ1aWxkQXJ0aWZhY3RSb290CisJCXJldHVybiB4LkJ1aWxkT3V0RGlyCiAJfQogCXJldHVybiAiIgogfQogCi1mdW5jICh4ICpJZGVBbmFseXNpcykgR2V0U291cmNlcygpIFtdKlNvdXJjZUZpbGUgeworZnVuYyAoeCAqSWRlQW5hbHlzaXMpIEdldFdvcmtpbmdEaXIoKSBzdHJpbmcgewogCWlmIHggIT0gbmlsIHsKLQkJcmV0dXJuIHguU291cmNlcworCQlyZXR1cm4geC5Xb3JraW5nRGlyCisJfQorCXJldHVybiAiIgorfQorCitmdW5jICh4ICpJZGVBbmFseXNpcykgR2V0RXJyb3IoKSAqQW5hbHlzaXNFcnJvciB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5FcnJvcgogCX0KIAlyZXR1cm4gbmlsCiB9CiAKLWZ1bmMgKHggKklkZUFuYWx5c2lzKSBHZXRTdGF0dXMoKSAqU3RhdHVzIHsKK2Z1bmMgKHggKklkZUFuYWx5c2lzKSBHZXRSZXN1bHRzKCkgW10qQW5hbHlzaXNSZXN1bHQgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguUmVzdWx0cworCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHggKklkZUFuYWx5c2lzKSBHZXRVbml0cygpIFtdKkJ1aWxkYWJsZVVuaXQgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguVW5pdHMKKwl9CisJcmV0dXJuIG5pbAorfQorCit0eXBlIEFuYWx5c2lzRXJyb3Igc3RydWN0IHsKKwlzdGF0ZSAgICAgICAgIHByb3RvaW1wbC5NZXNzYWdlU3RhdGUKKwlzaXplQ2FjaGUgICAgIHByb3RvaW1wbC5TaXplQ2FjaGUKKwl1bmtub3duRmllbGRzIHByb3RvaW1wbC5Vbmtub3duRmllbGRzCisKKwkvLyBIdW1hbiByZWFkYWJsZSBlcnJvciBtZXNzYWdlLgorCUVycm9yTWVzc2FnZSBzdHJpbmcgYHByb3RvYnVmOiJieXRlcywxLG9wdCxuYW1lPWVycm9yX21lc3NhZ2UsanNvbj1lcnJvck1lc3NhZ2UscHJvdG8zIiBqc29uOiJlcnJvcl9tZXNzYWdlLG9taXRlbXB0eSJgCit9CisKK2Z1bmMgKHggKkFuYWx5c2lzRXJyb3IpIFJlc2V0KCkgeworCSp4ID0gQW5hbHlzaXNFcnJvcnt9CisJaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgeworCQltaSA6PSAmZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbMl0KKwkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCisJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCisJfQorfQorCitmdW5jICh4ICpBbmFseXNpc0Vycm9yKSBTdHJpbmcoKSBzdHJpbmcgeworCXJldHVybiBwcm90b2ltcGwuWC5NZXNzYWdlU3RyaW5nT2YoeCkKK30KKworZnVuYyAoKkFuYWx5c2lzRXJyb3IpIFByb3RvTWVzc2FnZSgpIHt9CisKK2Z1bmMgKHggKkFuYWx5c2lzRXJyb3IpIFByb3RvUmVmbGVjdCgpIHByb3RvcmVmbGVjdC5NZXNzYWdlIHsKKwltaSA6PSAmZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbMl0KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCAmJiB4ICE9IG5pbCB7CisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQlpZiBtcy5Mb2FkTWVzc2FnZUluZm8oKSA9PSBuaWwgeworCQkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKKwkJfQorCQlyZXR1cm4gbXMKKwl9CisJcmV0dXJuIG1pLk1lc3NhZ2VPZih4KQorfQorCisvLyBEZXByZWNhdGVkOiBVc2UgQW5hbHlzaXNFcnJvci5Qcm90b1JlZmxlY3QuRGVzY3JpcHRvciBpbnN0ZWFkLgorZnVuYyAoKkFuYWx5c2lzRXJyb3IpIERlc2NyaXB0b3IoKSAoW11ieXRlLCBbXWludCkgeworCXJldHVybiBmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHsyfQorfQorCitmdW5jICh4ICpBbmFseXNpc0Vycm9yKSBHZXRFcnJvck1lc3NhZ2UoKSBzdHJpbmcgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguRXJyb3JNZXNzYWdlCisJfQorCXJldHVybiAiIgorfQorCit0eXBlIEFuYWx5c2lzUmVzdWx0IHN0cnVjdCB7CisJc3RhdGUgICAgICAgICBwcm90b2ltcGwuTWVzc2FnZVN0YXRlCisJc2l6ZUNhY2hlICAgICBwcm90b2ltcGwuU2l6ZUNhY2hlCisJdW5rbm93bkZpZWxkcyBwcm90b2ltcGwuVW5rbm93bkZpZWxkcworCisJLy8gUGF0aCB0byB0aGUgc291cmNlIGZpbGUgdGhhdCB3YXMgcXVlcmllZCwgcmVsYXRpdmUgdG8gcmVwb3NpdG9yeSByb290LgorCVNvdXJjZUZpbGVQYXRoIHN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDEsb3B0LG5hbWU9c291cmNlX2ZpbGVfcGF0aCxqc29uPXNvdXJjZUZpbGVQYXRoLHByb3RvMyIganNvbjoic291cmNlX2ZpbGVfcGF0aCxvbWl0ZW1wdHkiYAorCS8vIFJlcHJlc2VudHMgc3RhdHVzIGZvciB0aGlzIHJlc3VsdC4gZS5nLiBub3QgcGFydCBvZiB0aGUgYnVpbGQgZ3JhcGguCisJU3RhdHVzICpBbmFseXNpc1Jlc3VsdF9TdGF0dXMgYHByb3RvYnVmOiJieXRlcywyLG9wdCxuYW1lPXN0YXR1cyxwcm90bzMiIGpzb246InN0YXR1cyxvbWl0ZW1wdHkiYAorCS8vIElEIG9mIGJ1aWxkYWJsZSB1bml0IHRoYXQgY29udGFpbnMgdGhlIHNvdXJjZSBmaWxlLgorCS8vIFRoZSBpZGVfcXVlcnkgc2NyaXB0IGNhbiBjaG9vc2UgdGhlIG1vc3QgcmVsZXZhbnQgdW5pdCBmcm9tIG11bHRpcGxlCisJLy8gb3B0aW9ucy4KKwlVbml0SWQgc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsMyxvcHQsbmFtZT11bml0X2lkLGpzb249dW5pdElkLHByb3RvMyIganNvbjoidW5pdF9pZCxvbWl0ZW1wdHkiYAorCS8vIEludmFsaWRhdGlvbiBydWxlIHRvIGNoZWNrIGlmIHRoZSByZXN1bHQgaXMgc3RpbGwgdmFsaWQuCisJSW52YWxpZGF0aW9uICpJbnZhbGlkYXRpb24gYHByb3RvYnVmOiJieXRlcyw0LG9wdCxuYW1lPWludmFsaWRhdGlvbixwcm90bzMiIGpzb246ImludmFsaWRhdGlvbixvbWl0ZW1wdHkiYAorfQorCitmdW5jICh4ICpBbmFseXNpc1Jlc3VsdCkgUmVzZXQoKSB7CisJKnggPSBBbmFseXNpc1Jlc3VsdHt9CisJaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgeworCQltaSA6PSAmZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbM10KKwkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCisJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCisJfQorfQorCitmdW5jICh4ICpBbmFseXNpc1Jlc3VsdCkgU3RyaW5nKCkgc3RyaW5nIHsKKwlyZXR1cm4gcHJvdG9pbXBsLlguTWVzc2FnZVN0cmluZ09mKHgpCit9CisKK2Z1bmMgKCpBbmFseXNpc1Jlc3VsdCkgUHJvdG9NZXNzYWdlKCkge30KKworZnVuYyAoeCAqQW5hbHlzaXNSZXN1bHQpIFByb3RvUmVmbGVjdCgpIHByb3RvcmVmbGVjdC5NZXNzYWdlIHsKKwltaSA6PSAmZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbM10KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCAmJiB4ICE9IG5pbCB7CisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQlpZiBtcy5Mb2FkTWVzc2FnZUluZm8oKSA9PSBuaWwgeworCQkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKKwkJfQorCQlyZXR1cm4gbXMKKwl9CisJcmV0dXJuIG1pLk1lc3NhZ2VPZih4KQorfQorCisvLyBEZXByZWNhdGVkOiBVc2UgQW5hbHlzaXNSZXN1bHQuUHJvdG9SZWZsZWN0LkRlc2NyaXB0b3IgaW5zdGVhZC4KK2Z1bmMgKCpBbmFseXNpc1Jlc3VsdCkgRGVzY3JpcHRvcigpIChbXWJ5dGUsIFtdaW50KSB7CisJcmV0dXJuIGZpbGVfaWRlX3F1ZXJ5X3Byb3RvX3Jhd0Rlc2NHWklQKCksIFtdaW50ezN9Cit9CisKK2Z1bmMgKHggKkFuYWx5c2lzUmVzdWx0KSBHZXRTb3VyY2VGaWxlUGF0aCgpIHN0cmluZyB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5Tb3VyY2VGaWxlUGF0aAorCX0KKwlyZXR1cm4gIiIKK30KKworZnVuYyAoeCAqQW5hbHlzaXNSZXN1bHQpIEdldFN0YXR1cygpICpBbmFseXNpc1Jlc3VsdF9TdGF0dXMgewogCWlmIHggIT0gbmlsIHsKIAkJcmV0dXJuIHguU3RhdHVzCiAJfQogCXJldHVybiBuaWwKIH0KIAotLy8gQnVpbGQgZGVwZW5kZW5jaWVzIG9mIGEgc291cmNlIGZpbGUgZm9yIHByb3ZpZGluZyBsYW5ndWFnZSBzZXJ2aWNlcy4KLXR5cGUgRGVwc1Jlc3BvbnNlX0RlcHMgc3RydWN0IHsKK2Z1bmMgKHggKkFuYWx5c2lzUmVzdWx0KSBHZXRVbml0SWQoKSBzdHJpbmcgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguVW5pdElkCisJfQorCXJldHVybiAiIgorfQorCitmdW5jICh4ICpBbmFseXNpc1Jlc3VsdCkgR2V0SW52YWxpZGF0aW9uKCkgKkludmFsaWRhdGlvbiB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5JbnZhbGlkYXRpb24KKwl9CisJcmV0dXJuIG5pbAorfQorCit0eXBlIEJ1aWxkYWJsZVVuaXQgc3RydWN0IHsKIAlzdGF0ZSAgICAgICAgIHByb3RvaW1wbC5NZXNzYWdlU3RhdGUKIAlzaXplQ2FjaGUgICAgIHByb3RvaW1wbC5TaXplQ2FjaGUKIAl1bmtub3duRmllbGRzIHByb3RvaW1wbC5Vbmtub3duRmllbGRzCiAKLQkvLyBSZWxhdGl2ZSB0byByZXBvX2Rpci4KLQlTb3VyY2VGaWxlIHN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDEsb3B0LG5hbWU9c291cmNlX2ZpbGUsanNvbj1zb3VyY2VGaWxlLHByb3RvMyIganNvbjoic291cmNlX2ZpbGUsb21pdGVtcHR5ImAKLQkvLyBCdWlsZCB0YXJnZXQgdG8gZXhlY3V0ZSBmb3IgZ2VuZXJhdGluZyBkZXAuCi0JQnVpbGRUYXJnZXQgW11zdHJpbmcgYHByb3RvYnVmOiJieXRlcywyLHJlcCxuYW1lPWJ1aWxkX3RhcmdldCxqc29uPWJ1aWxkVGFyZ2V0LHByb3RvMyIganNvbjoiYnVpbGRfdGFyZ2V0LG9taXRlbXB0eSJgCi0JU3RhdHVzICAgICAgKlN0YXR1cyAgYHByb3RvYnVmOiJieXRlcywzLG9wdCxuYW1lPXN0YXR1cyxwcm90bzMsb25lb2YiIGpzb246InN0YXR1cyxvbWl0ZW1wdHkiYAorCS8vIFVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBidWlsZGFibGUgdW5pdC4KKwkvLworCS8vIEV4YW1wbGVzOgorCS8vICAgLSBKYXZhOiBtb2R1bGUgb3IgdGFyZ2V0IG5hbWUsIGUuZy4gImZyYW1ld29yay1ibHVldG9vdGgiIG9yCisJLy8gICAgICIvL3RoaXJkX3BhcnR5L2hhbWNyZXN0OmhhbWNyZXN0X2phdmEiCisJLy8gICAtIEMrKzogc291cmNlIGZpbGUsIGUuZy4gInBhdGgvdG8vZmlsZS5jYyIKKwlJZCBzdHJpbmcgYHByb3RvYnVmOiJieXRlcywxLG9wdCxuYW1lPWlkLHByb3RvMyIganNvbjoiaWQsb21pdGVtcHR5ImAKKwkvLyBMYW5ndWFnZSBvZiB0aGUgdW5pdC4KKwkvLyBSZXF1aXJlZCBmb3IgYnVpbGRhYmxlIHVuaXRzIGRpcmVjdGx5IHJlZmVyZW5jZWQgYnkgdGhlIEFuYWx5c2lzUmVzdWx0LAorCS8vIGUuZy4gdGhlIHVuaXQgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb21waWxhdGlvbiBzdGFnZSBmb3IgdGhlIHNvdXJjZSBmaWxlLgorCUxhbmd1YWdlIExhbmd1YWdlIGBwcm90b2J1ZjoidmFyaW50LDIsb3B0LG5hbWU9bGFuZ3VhZ2UscHJvdG8zLGVudW09aWRlX3F1ZXJ5Lkxhbmd1YWdlIiBqc29uOiJsYW5ndWFnZSxvbWl0ZW1wdHkiYAorCS8vIFNvdXJjZSBmaWxlcyB0aGF0IGFyZSBwYXJ0IG9mIHRoaXMgdW5pdC4KKwkvLyBQYXRoIHRvIHRoZSBmaWxlIHJlbGF0aXZlIHRvIHdvcmtpbmdfZGlyLgorCVNvdXJjZUZpbGVQYXRocyBbXXN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDMscmVwLG5hbWU9c291cmNlX2ZpbGVfcGF0aHMsanNvbj1zb3VyY2VGaWxlUGF0aHMscHJvdG8zIiBqc29uOiJzb3VyY2VfZmlsZV9wYXRocyxvbWl0ZW1wdHkiYAorCS8vIENvbXBpbGVyIGFyZ3VtZW50cyB0byBjb21waWxlIHRoZSBzb3VyY2UgZmlsZXMuCisJQ29tcGlsZXJBcmd1bWVudHMgW11zdHJpbmcgYHByb3RvYnVmOiJieXRlcyw0LHJlcCxuYW1lPWNvbXBpbGVyX2FyZ3VtZW50cyxqc29uPWNvbXBpbGVyQXJndW1lbnRzLHByb3RvMyIganNvbjoiY29tcGlsZXJfYXJndW1lbnRzLG9taXRlbXB0eSJgCisJLy8gTGlzdCBvZiBnZW5lcmF0ZWQgZmlsZXMgcHJvZHVjZWQgYnkgdGhpcyB1bml0LgorCUdlbmVyYXRlZEZpbGVzIFtdKkdlbmVyYXRlZEZpbGUgYHByb3RvYnVmOiJieXRlcyw1LHJlcCxuYW1lPWdlbmVyYXRlZF9maWxlcyxqc29uPWdlbmVyYXRlZEZpbGVzLHByb3RvMyIganNvbjoiZ2VuZXJhdGVkX2ZpbGVzLG9taXRlbXB0eSJgCisJLy8gTGlzdCBvZiBvdGhlciBCdWlsZGFibGVVbml0cyB0aGlzIHVuaXQgZGVwZW5kIG9uLgorCURlcGVuZGVuY3lJZHMgW11zdHJpbmcgYHByb3RvYnVmOiJieXRlcyw2LHJlcCxuYW1lPWRlcGVuZGVuY3lfaWRzLGpzb249ZGVwZW5kZW5jeUlkcyxwcm90bzMiIGpzb246ImRlcGVuZGVuY3lfaWRzLG9taXRlbXB0eSJgCiB9CiAKLWZ1bmMgKHggKkRlcHNSZXNwb25zZV9EZXBzKSBSZXNldCgpIHsKLQkqeCA9IERlcHNSZXNwb25zZV9EZXBze30KK2Z1bmMgKHggKkJ1aWxkYWJsZVVuaXQpIFJlc2V0KCkgeworCSp4ID0gQnVpbGRhYmxlVW5pdHt9CisJaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgeworCQltaSA6PSAmZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbNF0KKwkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCisJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCisJfQorfQorCitmdW5jICh4ICpCdWlsZGFibGVVbml0KSBTdHJpbmcoKSBzdHJpbmcgeworCXJldHVybiBwcm90b2ltcGwuWC5NZXNzYWdlU3RyaW5nT2YoeCkKK30KKworZnVuYyAoKkJ1aWxkYWJsZVVuaXQpIFByb3RvTWVzc2FnZSgpIHt9CisKK2Z1bmMgKHggKkJ1aWxkYWJsZVVuaXQpIFByb3RvUmVmbGVjdCgpIHByb3RvcmVmbGVjdC5NZXNzYWdlIHsKKwltaSA6PSAmZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbNF0KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCAmJiB4ICE9IG5pbCB7CisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQlpZiBtcy5Mb2FkTWVzc2FnZUluZm8oKSA9PSBuaWwgeworCQkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKKwkJfQorCQlyZXR1cm4gbXMKKwl9CisJcmV0dXJuIG1pLk1lc3NhZ2VPZih4KQorfQorCisvLyBEZXByZWNhdGVkOiBVc2UgQnVpbGRhYmxlVW5pdC5Qcm90b1JlZmxlY3QuRGVzY3JpcHRvciBpbnN0ZWFkLgorZnVuYyAoKkJ1aWxkYWJsZVVuaXQpIERlc2NyaXB0b3IoKSAoW11ieXRlLCBbXWludCkgeworCXJldHVybiBmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHs0fQorfQorCitmdW5jICh4ICpCdWlsZGFibGVVbml0KSBHZXRJZCgpIHN0cmluZyB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5JZAorCX0KKwlyZXR1cm4gIiIKK30KKworZnVuYyAoeCAqQnVpbGRhYmxlVW5pdCkgR2V0TGFuZ3VhZ2UoKSBMYW5ndWFnZSB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5MYW5ndWFnZQorCX0KKwlyZXR1cm4gTGFuZ3VhZ2VfTEFOR1VBR0VfVU5TUEVDSUZJRUQKK30KKworZnVuYyAoeCAqQnVpbGRhYmxlVW5pdCkgR2V0U291cmNlRmlsZVBhdGhzKCkgW11zdHJpbmcgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguU291cmNlRmlsZVBhdGhzCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAoeCAqQnVpbGRhYmxlVW5pdCkgR2V0Q29tcGlsZXJBcmd1bWVudHMoKSBbXXN0cmluZyB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5Db21waWxlckFyZ3VtZW50cworCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHggKkJ1aWxkYWJsZVVuaXQpIEdldEdlbmVyYXRlZEZpbGVzKCkgW10qR2VuZXJhdGVkRmlsZSB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5HZW5lcmF0ZWRGaWxlcworCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHggKkJ1aWxkYWJsZVVuaXQpIEdldERlcGVuZGVuY3lJZHMoKSBbXXN0cmluZyB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5EZXBlbmRlbmN5SWRzCisJfQorCXJldHVybiBuaWwKK30KKworLy8gSW52YWxpZGF0aW9uIHJ1bGUgdG8gY2hlY2sgaWYgdGhlIHJlc3VsdCBpcyBzdGlsbCB2YWxpZC4KKy8vIFRoaXMgc2hvdWxkIGNvbnRhaW4gZmlsZXMvZGlycyB0aGF0IGFyZSBub3QgZGlyZWN0bHkgcGFydCBvZiB0aGUgYnVpbGQgZ3JhcGgKKy8vIGJ1dCBzdGlsbCBhZmZlY3QgdGhlIHJlc3VsdC4gRm9yIGV4YW1wbGUgQlVJTEQgZmlsZXMsIGRpcmVjdG9yeSB0byB0aGUKKy8vIHRvb2xjaGFpbiBvciBjb25maWcgZmlsZXMgZXRjLgordHlwZSBJbnZhbGlkYXRpb24gc3RydWN0IHsKKwlzdGF0ZSAgICAgICAgIHByb3RvaW1wbC5NZXNzYWdlU3RhdGUKKwlzaXplQ2FjaGUgICAgIHByb3RvaW1wbC5TaXplQ2FjaGUKKwl1bmtub3duRmllbGRzIHByb3RvaW1wbC5Vbmtub3duRmllbGRzCisKKwkvLyBJZiBhbnkgb2YgdGhlc2UgZmlsZXMgY2hhbmdlIHRoZSByZXN1bHQgbWF5IGJlY29tZSBpbnZhbGlkLgorCS8vIFBhdGggdG8gdGhlIGZpbGUgcmVsYXRpdmUgdG8gcmVwb3NpdG9yeSByb290LgorCUZpbGVQYXRocyBbXXN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDEscmVwLG5hbWU9ZmlsZV9wYXRocyxqc29uPWZpbGVQYXRocyxwcm90bzMiIGpzb246ImZpbGVfcGF0aHMsb21pdGVtcHR5ImAKKwkvLyBJZiBhbnkgb2YgdGhlc2UgcnVsZXMgbWF0Y2ggYSBjaGFuZ2VkIGZpbGUgdGhlIHJlc3VsdCBtYXkgYmVjb21lIGludmFsaWQuCisJV2lsZGNhcmRzIFtdKkludmFsaWRhdGlvbl9XaWxkY2FyZCBgcHJvdG9idWY6ImJ5dGVzLDQscmVwLG5hbWU9d2lsZGNhcmRzLHByb3RvMyIganNvbjoid2lsZGNhcmRzLG9taXRlbXB0eSJgCit9CisKK2Z1bmMgKHggKkludmFsaWRhdGlvbikgUmVzZXQoKSB7CisJKnggPSBJbnZhbGlkYXRpb257fQorCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkIHsKKwkJbWkgOj0gJmZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzVdCisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQorCX0KK30KKworZnVuYyAoeCAqSW52YWxpZGF0aW9uKSBTdHJpbmcoKSBzdHJpbmcgeworCXJldHVybiBwcm90b2ltcGwuWC5NZXNzYWdlU3RyaW5nT2YoeCkKK30KKworZnVuYyAoKkludmFsaWRhdGlvbikgUHJvdG9NZXNzYWdlKCkge30KKworZnVuYyAoeCAqSW52YWxpZGF0aW9uKSBQcm90b1JlZmxlY3QoKSBwcm90b3JlZmxlY3QuTWVzc2FnZSB7CisJbWkgOj0gJmZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzVdCisJaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgJiYgeCAhPSBuaWwgeworCQltcyA6PSBwcm90b2ltcGwuWC5NZXNzYWdlU3RhdGVPZihwcm90b2ltcGwuUG9pbnRlcih4KSkKKwkJaWYgbXMuTG9hZE1lc3NhZ2VJbmZvKCkgPT0gbmlsIHsKKwkJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCisJCX0KKwkJcmV0dXJuIG1zCisJfQorCXJldHVybiBtaS5NZXNzYWdlT2YoeCkKK30KKworLy8gRGVwcmVjYXRlZDogVXNlIEludmFsaWRhdGlvbi5Qcm90b1JlZmxlY3QuRGVzY3JpcHRvciBpbnN0ZWFkLgorZnVuYyAoKkludmFsaWRhdGlvbikgRGVzY3JpcHRvcigpIChbXWJ5dGUsIFtdaW50KSB7CisJcmV0dXJuIGZpbGVfaWRlX3F1ZXJ5X3Byb3RvX3Jhd0Rlc2NHWklQKCksIFtdaW50ezV9Cit9CisKK2Z1bmMgKHggKkludmFsaWRhdGlvbikgR2V0RmlsZVBhdGhzKCkgW11zdHJpbmcgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguRmlsZVBhdGhzCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAoeCAqSW52YWxpZGF0aW9uKSBHZXRXaWxkY2FyZHMoKSBbXSpJbnZhbGlkYXRpb25fV2lsZGNhcmQgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguV2lsZGNhcmRzCisJfQorCXJldHVybiBuaWwKK30KKworLy8gSW5kaWNhdGVzIHRoZSBzdWNjZXNzL2ZhaWx1cmUgZm9yIHRoZSBxdWVyeS4KK3R5cGUgQW5hbHlzaXNSZXN1bHRfU3RhdHVzIHN0cnVjdCB7CisJc3RhdGUgICAgICAgICBwcm90b2ltcGwuTWVzc2FnZVN0YXRlCisJc2l6ZUNhY2hlICAgICBwcm90b2ltcGwuU2l6ZUNhY2hlCisJdW5rbm93bkZpZWxkcyBwcm90b2ltcGwuVW5rbm93bkZpZWxkcworCisJQ29kZSBBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZSBgcHJvdG9idWY6InZhcmludCwxLG9wdCxuYW1lPWNvZGUscHJvdG8zLGVudW09aWRlX3F1ZXJ5LkFuYWx5c2lzUmVzdWx0X1N0YXR1c19Db2RlIiBqc29uOiJjb2RlLG9taXRlbXB0eSJgCisJLy8gRGV0YWlscyBhYm91dCB0aGUgc3RhdHVzLCBtaWdodCBiZSBkaXNwbGF5ZWQgdG8gdXNlci4KKwlTdGF0dXNNZXNzYWdlICpzdHJpbmcgYHByb3RvYnVmOiJieXRlcywyLG9wdCxuYW1lPXN0YXR1c19tZXNzYWdlLGpzb249c3RhdHVzTWVzc2FnZSxwcm90bzMsb25lb2YiIGpzb246InN0YXR1c19tZXNzYWdlLG9taXRlbXB0eSJgCit9CisKK2Z1bmMgKHggKkFuYWx5c2lzUmVzdWx0X1N0YXR1cykgUmVzZXQoKSB7CisJKnggPSBBbmFseXNpc1Jlc3VsdF9TdGF0dXN7fQogCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkIHsKIAkJbWkgOj0gJmZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzZdCiAJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQpAQCAtNTA5LDEzICs1ODgsMTMgQEAKIAl9CiB9CiAKLWZ1bmMgKHggKkRlcHNSZXNwb25zZV9EZXBzKSBTdHJpbmcoKSBzdHJpbmcgeworZnVuYyAoeCAqQW5hbHlzaXNSZXN1bHRfU3RhdHVzKSBTdHJpbmcoKSBzdHJpbmcgewogCXJldHVybiBwcm90b2ltcGwuWC5NZXNzYWdlU3RyaW5nT2YoeCkKIH0KIAotZnVuYyAoKkRlcHNSZXNwb25zZV9EZXBzKSBQcm90b01lc3NhZ2UoKSB7fQorZnVuYyAoKkFuYWx5c2lzUmVzdWx0X1N0YXR1cykgUHJvdG9NZXNzYWdlKCkge30KIAotZnVuYyAoeCAqRGVwc1Jlc3BvbnNlX0RlcHMpIFByb3RvUmVmbGVjdCgpIHByb3RvcmVmbGVjdC5NZXNzYWdlIHsKK2Z1bmMgKHggKkFuYWx5c2lzUmVzdWx0X1N0YXR1cykgUHJvdG9SZWZsZWN0KCkgcHJvdG9yZWZsZWN0Lk1lc3NhZ2UgewogCW1pIDo9ICZmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1s2XQogCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkICYmIHggIT0gbmlsIHsKIAkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCkBAIC01MjcsMTA0ICs2MDYsMTkwIEBACiAJcmV0dXJuIG1pLk1lc3NhZ2VPZih4KQogfQogCi0vLyBEZXByZWNhdGVkOiBVc2UgRGVwc1Jlc3BvbnNlX0RlcHMuUHJvdG9SZWZsZWN0LkRlc2NyaXB0b3IgaW5zdGVhZC4KLWZ1bmMgKCpEZXBzUmVzcG9uc2VfRGVwcykgRGVzY3JpcHRvcigpIChbXWJ5dGUsIFtdaW50KSB7Ci0JcmV0dXJuIGZpbGVfaWRlX3F1ZXJ5X3Byb3RvX3Jhd0Rlc2NHWklQKCksIFtdaW50ezIsIDB9CisvLyBEZXByZWNhdGVkOiBVc2UgQW5hbHlzaXNSZXN1bHRfU3RhdHVzLlByb3RvUmVmbGVjdC5EZXNjcmlwdG9yIGluc3RlYWQuCitmdW5jICgqQW5hbHlzaXNSZXN1bHRfU3RhdHVzKSBEZXNjcmlwdG9yKCkgKFtdYnl0ZSwgW11pbnQpIHsKKwlyZXR1cm4gZmlsZV9pZGVfcXVlcnlfcHJvdG9fcmF3RGVzY0daSVAoKSwgW11pbnR7MywgMH0KIH0KIAotZnVuYyAoeCAqRGVwc1Jlc3BvbnNlX0RlcHMpIEdldFNvdXJjZUZpbGUoKSBzdHJpbmcgeworZnVuYyAoeCAqQW5hbHlzaXNSZXN1bHRfU3RhdHVzKSBHZXRDb2RlKCkgQW5hbHlzaXNSZXN1bHRfU3RhdHVzX0NvZGUgewogCWlmIHggIT0gbmlsIHsKLQkJcmV0dXJuIHguU291cmNlRmlsZQorCQlyZXR1cm4geC5Db2RlCisJfQorCXJldHVybiBBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ09ERV9VTlNQRUNJRklFRAorfQorCitmdW5jICh4ICpBbmFseXNpc1Jlc3VsdF9TdGF0dXMpIEdldFN0YXR1c01lc3NhZ2UoKSBzdHJpbmcgeworCWlmIHggIT0gbmlsICYmIHguU3RhdHVzTWVzc2FnZSAhPSBuaWwgeworCQlyZXR1cm4gKnguU3RhdHVzTWVzc2FnZQogCX0KIAlyZXR1cm4gIiIKIH0KIAotZnVuYyAoeCAqRGVwc1Jlc3BvbnNlX0RlcHMpIEdldEJ1aWxkVGFyZ2V0KCkgW11zdHJpbmcgewotCWlmIHggIT0gbmlsIHsKLQkJcmV0dXJuIHguQnVpbGRUYXJnZXQKLQl9Ci0JcmV0dXJuIG5pbAordHlwZSBJbnZhbGlkYXRpb25fV2lsZGNhcmQgc3RydWN0IHsKKwlzdGF0ZSAgICAgICAgIHByb3RvaW1wbC5NZXNzYWdlU3RhdGUKKwlzaXplQ2FjaGUgICAgIHByb3RvaW1wbC5TaXplQ2FjaGUKKwl1bmtub3duRmllbGRzIHByb3RvaW1wbC5Vbmtub3duRmllbGRzCisKKwkvLyBQcmVmaXggb2YgdGhlIGZpbGUgcGF0aCAoZS5nLiAicGF0aC90by8iKQorCVByZWZpeCAqc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsMSxvcHQsbmFtZT1wcmVmaXgscHJvdG8zLG9uZW9mIiBqc29uOiJwcmVmaXgsb21pdGVtcHR5ImAKKwkvLyBTdWZmaXggb2YgdGhlIGZpbGUgcGF0aCAoZS5nLiAiQW5kcm9pZC5icCIpCisJU3VmZml4ICpzdHJpbmcgYHByb3RvYnVmOiJieXRlcywyLG9wdCxuYW1lPXN1ZmZpeCxwcm90bzMsb25lb2YiIGpzb246InN1ZmZpeCxvbWl0ZW1wdHkiYAorCS8vIElmIGZhbHNlLCB0aGUgcGFydCBvZiB0aGUgcGF0aCBiZXR3ZWVuIHRoZSBnaXZlbiBgcHJlZml4YCBhbmQgYHN1ZmZpeGAKKwkvLyBzaG91bGQgbm90IGNvbnRhaW4gZGlyZWN0b3J5IHNlcGFyYXRvcnMgKCcvJykuCisJQ2FuQ3Jvc3NGb2xkZXIgKmJvb2wgYHByb3RvYnVmOiJ2YXJpbnQsMyxvcHQsbmFtZT1jYW5fY3Jvc3NfZm9sZGVyLGpzb249Y2FuQ3Jvc3NGb2xkZXIscHJvdG8zLG9uZW9mIiBqc29uOiJjYW5fY3Jvc3NfZm9sZGVyLG9taXRlbXB0eSJgCiB9CiAKLWZ1bmMgKHggKkRlcHNSZXNwb25zZV9EZXBzKSBHZXRTdGF0dXMoKSAqU3RhdHVzIHsKLQlpZiB4ICE9IG5pbCB7Ci0JCXJldHVybiB4LlN0YXR1cworZnVuYyAoeCAqSW52YWxpZGF0aW9uX1dpbGRjYXJkKSBSZXNldCgpIHsKKwkqeCA9IEludmFsaWRhdGlvbl9XaWxkY2FyZHt9CisJaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgeworCQltaSA6PSAmZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbN10KKwkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCisJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCiAJfQotCXJldHVybiBuaWwKK30KKworZnVuYyAoeCAqSW52YWxpZGF0aW9uX1dpbGRjYXJkKSBTdHJpbmcoKSBzdHJpbmcgeworCXJldHVybiBwcm90b2ltcGwuWC5NZXNzYWdlU3RyaW5nT2YoeCkKK30KKworZnVuYyAoKkludmFsaWRhdGlvbl9XaWxkY2FyZCkgUHJvdG9NZXNzYWdlKCkge30KKworZnVuYyAoeCAqSW52YWxpZGF0aW9uX1dpbGRjYXJkKSBQcm90b1JlZmxlY3QoKSBwcm90b3JlZmxlY3QuTWVzc2FnZSB7CisJbWkgOj0gJmZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzddCisJaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgJiYgeCAhPSBuaWwgeworCQltcyA6PSBwcm90b2ltcGwuWC5NZXNzYWdlU3RhdGVPZihwcm90b2ltcGwuUG9pbnRlcih4KSkKKwkJaWYgbXMuTG9hZE1lc3NhZ2VJbmZvKCkgPT0gbmlsIHsKKwkJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCisJCX0KKwkJcmV0dXJuIG1zCisJfQorCXJldHVybiBtaS5NZXNzYWdlT2YoeCkKK30KKworLy8gRGVwcmVjYXRlZDogVXNlIEludmFsaWRhdGlvbl9XaWxkY2FyZC5Qcm90b1JlZmxlY3QuRGVzY3JpcHRvciBpbnN0ZWFkLgorZnVuYyAoKkludmFsaWRhdGlvbl9XaWxkY2FyZCkgRGVzY3JpcHRvcigpIChbXWJ5dGUsIFtdaW50KSB7CisJcmV0dXJuIGZpbGVfaWRlX3F1ZXJ5X3Byb3RvX3Jhd0Rlc2NHWklQKCksIFtdaW50ezUsIDB9Cit9CisKK2Z1bmMgKHggKkludmFsaWRhdGlvbl9XaWxkY2FyZCkgR2V0UHJlZml4KCkgc3RyaW5nIHsKKwlpZiB4ICE9IG5pbCAmJiB4LlByZWZpeCAhPSBuaWwgeworCQlyZXR1cm4gKnguUHJlZml4CisJfQorCXJldHVybiAiIgorfQorCitmdW5jICh4ICpJbnZhbGlkYXRpb25fV2lsZGNhcmQpIEdldFN1ZmZpeCgpIHN0cmluZyB7CisJaWYgeCAhPSBuaWwgJiYgeC5TdWZmaXggIT0gbmlsIHsKKwkJcmV0dXJuICp4LlN1ZmZpeAorCX0KKwlyZXR1cm4gIiIKK30KKworZnVuYyAoeCAqSW52YWxpZGF0aW9uX1dpbGRjYXJkKSBHZXRDYW5Dcm9zc0ZvbGRlcigpIGJvb2wgeworCWlmIHggIT0gbmlsICYmIHguQ2FuQ3Jvc3NGb2xkZXIgIT0gbmlsIHsKKwkJcmV0dXJuICp4LkNhbkNyb3NzRm9sZGVyCisJfQorCXJldHVybiBmYWxzZQogfQogCiB2YXIgRmlsZV9pZGVfcXVlcnlfcHJvdG8gcHJvdG9yZWZsZWN0LkZpbGVEZXNjcmlwdG9yCiAKIHZhciBmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjID0gW11ieXRlewogCTB4MGEsIDB4MGYsIDB4NjksIDB4NjQsIDB4NjUsIDB4NWYsIDB4NzEsIDB4NzUsIDB4NjUsIDB4NzIsIDB4NzksIDB4MmUsIDB4NzAsIDB4NzIsIDB4NmYsIDB4NzQsCi0JMHg2ZiwgMHgxMiwgMHgwOSwgMHg2OSwgMHg2NCwgMHg2NSwgMHg1ZiwgMHg3MSwgMHg3NSwgMHg2NSwgMHg3MiwgMHg3OSwgMHgyMiwgMHg3YywgMHgwYSwgMHgwNiwKLQkweDUzLCAweDc0LCAweDYxLCAweDc0LCAweDc1LCAweDczLCAweDEyLCAweDJhLCAweDBhLCAweDA0LCAweDYzLCAweDZmLCAweDY0LCAweDY1LCAweDE4LCAweDAxLAotCTB4MjAsIDB4MDEsIDB4MjgsIDB4MGUsIDB4MzIsIDB4MTYsIDB4MmUsIDB4NjksIDB4NjQsIDB4NjUsIDB4NWYsIDB4NzEsIDB4NzUsIDB4NjUsIDB4NzIsIDB4NzksCi0JMHgyZSwgMHg1MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHgyZSwgMHg0MywgMHg2ZiwgMHg2NCwgMHg2NSwgMHg1MiwgMHgwNCwgMHg2MywgMHg2ZiwKLQkweDY0LCAweDY1LCAweDEyLCAweDFkLCAweDBhLCAweDA3LCAweDZkLCAweDY1LCAweDczLCAweDczLCAweDYxLCAweDY3LCAweDY1LCAweDE4LCAweDAyLCAweDIwLAotCTB4MDEsIDB4MjgsIDB4MDksIDB4NDgsIDB4MDAsIDB4NTIsIDB4MDcsIDB4NmQsIDB4NjUsIDB4NzMsIDB4NzMsIDB4NjEsIDB4NjcsIDB4NjUsIDB4ODgsIDB4MDEsCi0JMHgwMSwgMHgyMiwgMHgxYiwgMHgwYSwgMHgwNCwgMHg0MywgMHg2ZiwgMHg2NCwgMHg2NSwgMHgxMiwgMHgwNiwgMHgwYSwgMHgwMiwgMHg0ZiwgMHg0YiwgMHgxMCwKLQkweDAwLCAweDEyLCAweDBiLCAweDBhLCAweDA3LCAweDQ2LCAweDQxLCAweDQ5LCAweDRjLCAweDU1LCAweDUyLCAweDQ1LCAweDEwLCAweDAxLCAweDQyLCAweDBhLAotCTB4MGEsIDB4MDgsIDB4NWYsIDB4NmQsIDB4NjUsIDB4NzMsIDB4NzMsIDB4NjEsIDB4NjcsIDB4NjUsIDB4MjIsIDB4OGIsIDB4MDEsIDB4MGEsIDB4MDksIDB4NTIsCi0JMHg2NSwgMHg3MCwgMHg2ZiwgMHg1MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg2NSwgMHgxMiwgMHgxOSwgMHgwYSwgMHgwOCwgMHg3MiwgMHg2NSwgMHg3MCwgMHg2ZiwKLQkweDVmLCAweDY0LCAweDY5LCAweDcyLCAweDE4LCAweDAxLCAweDIwLCAweDAxLCAweDI4LCAweDA5LCAweDUyLCAweDA3LCAweDcyLCAweDY1LCAweDcwLCAweDZmLAotCTB4NDQsIDB4NjksIDB4NzIsIDB4MTIsIDB4MjgsIDB4MGEsIDB4MTAsIDB4NjEsIDB4NjMsIDB4NzQsIDB4NjksIDB4NzYsIDB4NjUsIDB4NWYsIDB4NjYsIDB4NjksCi0JMHg2YywgMHg2NSwgMHg1ZiwgMHg3MCwgMHg2MSwgMHg3NCwgMHg2OCwgMHgxOCwgMHgwMiwgMHgyMCwgMHgwMywgMHgyOCwgMHgwOSwgMHg1MiwgMHgwZSwgMHg2MSwKLQkweDYzLCAweDc0LCAweDY5LCAweDc2LCAweDY1LCAweDQ2LCAweDY5LCAweDZjLCAweDY1LCAweDUwLCAweDYxLCAweDc0LCAweDY4LCAweDEyLCAweDE3LCAweDBhLAotCTB4MDcsIDB4NmYsIDB4NzUsIDB4NzQsIDB4NWYsIDB4NjQsIDB4NjksIDB4NzIsIDB4MTgsIDB4MDMsIDB4MjAsIDB4MDEsIDB4MjgsIDB4MDksIDB4NTIsIDB4MDYsCi0JMHg2ZiwgMHg3NSwgMHg3NCwgMHg0NCwgMHg2OSwgMHg3MiwgMHgxMiwgMHgyMCwgMHgwYSwgMHgwYywgMHg2MywgMHg2ZiwgMHg2ZCwgMHg3MCwgMHg1ZiwgMHg2NCwKLQkweDYyLCAweDVmLCAweDcwLCAweDYxLCAweDc0LCAweDY4LCAweDE4LCAweDA0LCAweDIwLCAweDAxLCAweDI4LCAweDA5LCAweDUyLCAweDBhLCAweDYzLCAweDZmLAotCTB4NmQsIDB4NzAsIDB4NDQsIDB4NjIsIDB4NTAsIDB4NjEsIDB4NzQsIDB4NjgsIDB4MjIsIDB4ODMsIDB4MDIsIDB4MGEsIDB4MGMsIDB4NDQsIDB4NjUsIDB4NzAsCi0JMHg3MywgMHg1MiwgMHg2NSwgMHg3MywgMHg3MCwgMHg2ZiwgMHg2ZSwgMHg3MywgMHg2NSwgMHgxMiwgMHgzMCwgMHgwYSwgMHgwNCwgMHg2NCwgMHg2NSwgMHg3MCwKLQkweDczLCAweDE4LCAweDAxLCAweDIwLCAweDAzLCAweDI4LCAweDBiLCAweDMyLCAweDFjLCAweDJlLCAweDY5LCAweDY0LCAweDY1LCAweDVmLCAweDcxLCAweDc1LAotCTB4NjUsIDB4NzIsIDB4NzksIDB4MmUsIDB4NDQsIDB4NjUsIDB4NzAsIDB4NzMsIDB4NTIsIDB4NjUsIDB4NzMsIDB4NzAsIDB4NmYsIDB4NmUsIDB4NzMsIDB4NjUsCi0JMHgyZSwgMHg0NCwgMHg2NSwgMHg3MCwgMHg3MywgMHg1MiwgMHgwNCwgMHg2NCwgMHg2NSwgMHg3MCwgMHg3MywgMHgxMiwgMHgyZSwgMHgwYSwgMHgwNiwgMHg3MywKLQkweDc0LCAweDYxLCAweDc0LCAweDc1LCAweDczLCAweDE4LCAweDAyLCAweDIwLCAweDAxLCAweDI4LCAweDBiLCAweDMyLCAweDExLCAweDJlLCAweDY5LCAweDY0LAotCTB4NjUsIDB4NWYsIDB4NzEsIDB4NzUsIDB4NjUsIDB4NzIsIDB4NzksIDB4MmUsIDB4NTMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4NzUsIDB4NzMsIDB4NDgsIDB4MDAsCi0JMHg1MiwgMHgwNiwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHg4OCwgMHgwMSwgMHgwMSwgMHgxYSwgMHg4NSwgMHgwMSwgMHgwYSwgMHgwNCwKLQkweDQ0LCAweDY1LCAweDcwLCAweDczLCAweDEyLCAweDFmLCAweDBhLCAweDBiLCAweDczLCAweDZmLCAweDc1LCAweDcyLCAweDYzLCAweDY1LCAweDVmLCAweDY2LAotCTB4NjksIDB4NmMsIDB4NjUsIDB4MTgsIDB4MDEsIDB4MjAsIDB4MDEsIDB4MjgsIDB4MDksIDB4NTIsIDB4MGEsIDB4NzMsIDB4NmYsIDB4NzUsIDB4NzIsIDB4NjMsCi0JMHg2NSwgMHg0NiwgMHg2OSwgMHg2YywgMHg2NSwgMHgxMiwgMHgyMSwgMHgwYSwgMHgwYywgMHg2MiwgMHg3NSwgMHg2OSwgMHg2YywgMHg2NCwgMHg1ZiwgMHg3NCwKLQkweDYxLCAweDcyLCAweDY3LCAweDY1LCAweDc0LCAweDE4LCAweDAyLCAweDIwLCAweDAzLCAweDI4LCAweDA5LCAweDUyLCAweDBiLCAweDYyLCAweDc1LCAweDY5LAotCTB4NmMsIDB4NjQsIDB4NTQsIDB4NjEsIDB4NzIsIDB4NjcsIDB4NjUsIDB4NzQsIDB4MTIsIDB4MmUsIDB4MGEsIDB4MDYsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzQsCi0JMHg3NSwgMHg3MywgMHgxOCwgMHgwMywgMHgyMCwgMHgwMSwgMHgyOCwgMHgwYiwgMHgzMiwgMHgxMSwgMHgyZSwgMHg2OSwgMHg2NCwgMHg2NSwgMHg1ZiwgMHg3MSwKLQkweDc1LCAweDY1LCAweDcyLCAweDc5LCAweDJlLCAweDUzLCAweDc0LCAweDYxLCAweDc0LCAweDc1LCAweDczLCAweDQ4LCAweDAwLCAweDUyLCAweDA2LCAweDczLAotCTB4NzQsIDB4NjEsIDB4NzQsIDB4NzUsIDB4NzMsIDB4ODgsIDB4MDEsIDB4MDEsIDB4NDIsIDB4MDksIDB4MGEsIDB4MDcsIDB4NWYsIDB4NzMsIDB4NzQsIDB4NjEsCi0JMHg3NCwgMHg3NSwgMHg3MywgMHg0MiwgMHgwOSwgMHgwYSwgMHgwNywgMHg1ZiwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHgyMiwgMHg1MSwKLQkweDBhLCAweDBkLCAweDQ3LCAweDY1LCAweDZlLCAweDY1LCAweDcyLCAweDYxLCAweDc0LCAweDY1LCAweDY0LCAweDQ2LCAweDY5LCAweDZjLCAweDY1LCAweDEyLAotCTB4MTIsIDB4MGEsIDB4MDQsIDB4NzAsIDB4NjEsIDB4NzQsIDB4NjgsIDB4MTgsIDB4MDEsIDB4MjAsIDB4MDEsIDB4MjgsIDB4MDksIDB4NTIsIDB4MDQsIDB4NzAsCi0JMHg2MSwgMHg3NCwgMHg2OCwgMHgxMiwgMHgxZiwgMHgwYSwgMHgwOCwgMHg2MywgMHg2ZiwgMHg2ZSwgMHg3NCwgMHg2NSwgMHg2ZSwgMHg3NCwgMHg3MywgMHgxOCwKLQkweDAyLCAweDIwLCAweDAxLCAweDI4LCAweDBjLCAweDQ4LCAweDAwLCAweDUyLCAweDA4LCAweDYzLCAweDZmLCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDc0LAotCTB4NzMsIDB4ODgsIDB4MDEsIDB4MDEsIDB4NDIsIDB4MGIsIDB4MGEsIDB4MDksIDB4NWYsIDB4NjMsIDB4NmYsIDB4NmUsIDB4NzQsIDB4NjUsIDB4NmUsIDB4NzQsCi0JMHg3MywgMHgyMiwgMHhmNywgMHgwMSwgMHgwYSwgMHgwYSwgMHg1MywgMHg2ZiwgMHg3NSwgMHg3MiwgMHg2MywgMHg2NSwgMHg0NiwgMHg2OSwgMHg2YywgMHg2NSwKLQkweDEyLCAweDEyLCAweDBhLCAweDA0LCAweDcwLCAweDYxLCAweDc0LCAweDY4LCAweDE4LCAweDAxLCAweDIwLCAweDAxLCAweDI4LCAweDA5LCAweDUyLCAweDA0LAotCTB4NzAsIDB4NjEsIDB4NzQsIDB4NjgsIDB4MTIsIDB4MWYsIDB4MGEsIDB4MGIsIDB4NzcsIDB4NmYsIDB4NzIsIDB4NmIsIDB4NjksIDB4NmUsIDB4NjcsIDB4NWYsCi0JMHg2NCwgMHg2OSwgMHg3MiwgMHgxOCwgMHgwMiwgMHgyMCwgMHgwMSwgMHgyOCwgMHgwOSwgMHg1MiwgMHgwYSwgMHg3NywgMHg2ZiwgMHg3MiwgMHg2YiwgMHg2OSwKLQkweDZlLCAweDY3LCAweDQ0LCAweDY5LCAweDcyLCAweDEyLCAweDJkLCAweDBhLCAweDEyLCAweDYzLCAweDZmLCAweDZkLCAweDcwLCAweDY5LCAweDZjLCAweDY1LAotCTB4NzIsIDB4NWYsIDB4NjEsIDB4NzIsIDB4NjcsIDB4NzUsIDB4NmQsIDB4NjUsIDB4NmUsIDB4NzQsIDB4NzMsIDB4MTgsIDB4MDMsIDB4MjAsIDB4MDMsIDB4MjgsCi0JMHgwOSwgMHg1MiwgMHgxMSwgMHg2MywgMHg2ZiwgMHg2ZCwgMHg3MCwgMHg2OSwgMHg2YywgMHg2NSwgMHg3MiwgMHg0MSwgMHg3MiwgMHg2NywgMHg3NSwgMHg2ZCwKLQkweDY1LCAweDZlLCAweDc0LCAweDczLCAweDEyLCAweDM2LCAweDBhLCAweDA5LCAweDY3LCAweDY1LCAweDZlLCAweDY1LCAweDcyLCAweDYxLCAweDc0LCAweDY1LAotCTB4NjQsIDB4MTgsIDB4MDQsIDB4MjAsIDB4MDMsIDB4MjgsIDB4MGIsIDB4MzIsIDB4MTgsIDB4MmUsIDB4NjksIDB4NjQsIDB4NjUsIDB4NWYsIDB4NzEsIDB4NzUsCi0JMHg2NSwgMHg3MiwgMHg3OSwgMHgyZSwgMHg0NywgMHg2NSwgMHg2ZSwgMHg2NSwgMHg3MiwgMHg2MSwgMHg3NCwgMHg2NSwgMHg2NCwgMHg0NiwgMHg2OSwgMHg2YywKLQkweDY1LCAweDUyLCAweDA5LCAweDY3LCAweDY1LCAweDZlLCAweDY1LCAweDcyLCAweDYxLCAweDc0LCAweDY1LCAweDY0LCAweDEyLCAweDEyLCAweDBhLCAweDA0LAotCTB4NjQsIDB4NjUsIDB4NzAsIDB4NzMsIDB4MTgsIDB4MDUsIDB4MjAsIDB4MDMsIDB4MjgsIDB4MDksIDB4NTIsIDB4MDQsIDB4NjQsIDB4NjUsIDB4NzAsIDB4NzMsCi0JMHgxMiwgMHgyZSwgMHgwYSwgMHgwNiwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHgxOCwgMHgwNiwgMHgyMCwgMHgwMSwgMHgyOCwgMHgwYiwKLQkweDMyLCAweDExLCAweDJlLCAweDY5LCAweDY0LCAweDY1LCAweDVmLCAweDcxLCAweDc1LCAweDY1LCAweDcyLCAweDc5LCAweDJlLCAweDUzLCAweDc0LCAweDYxLAotCTB4NzQsIDB4NzUsIDB4NzMsIDB4NDgsIDB4MDAsIDB4NTIsIDB4MDYsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4NzUsIDB4NzMsIDB4ODgsIDB4MDEsIDB4MDEsCi0JMHg0MiwgMHgwOSwgMHgwYSwgMHgwNywgMHg1ZiwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHgyMiwgMHhhOSwgMHgwMSwgMHgwYSwgMHgwYiwKLQkweDQ5LCAweDY0LCAweDY1LCAweDQxLCAweDZlLCAweDYxLCAweDZjLCAweDc5LCAweDczLCAweDY5LCAweDczLCAweDEyLCAweDJlLCAweDBhLCAweDEzLCAweDYyLAotCTB4NzUsIDB4NjksIDB4NmMsIDB4NjQsIDB4NWYsIDB4NjEsIDB4NzIsIDB4NzQsIDB4NjksIDB4NjYsIDB4NjEsIDB4NjMsIDB4NzQsIDB4NWYsIDB4NzIsIDB4NmYsCi0JMHg2ZiwgMHg3NCwgMHgxOCwgMHgwMSwgMHgyMCwgMHgwMSwgMHgyOCwgMHgwOSwgMHg1MiwgMHgxMSwgMHg2MiwgMHg3NSwgMHg2OSwgMHg2YywgMHg2NCwgMHg0MSwKLQkweDcyLCAweDc0LCAweDY5LCAweDY2LCAweDYxLCAweDYzLCAweDc0LCAweDUyLCAweDZmLCAweDZmLCAweDc0LCAweDEyLCAweDJmLCAweDBhLCAweDA3LCAweDczLAotCTB4NmYsIDB4NzUsIDB4NzIsIDB4NjMsIDB4NjUsIDB4NzMsIDB4MTgsIDB4MDIsIDB4MjAsIDB4MDMsIDB4MjgsIDB4MGIsIDB4MzIsIDB4MTUsIDB4MmUsIDB4NjksCi0JMHg2NCwgMHg2NSwgMHg1ZiwgMHg3MSwgMHg3NSwgMHg2NSwgMHg3MiwgMHg3OSwgMHgyZSwgMHg1MywgMHg2ZiwgMHg3NSwgMHg3MiwgMHg2MywgMHg2NSwgMHg0NiwKLQkweDY5LCAweDZjLCAweDY1LCAweDUyLCAweDA3LCAweDczLCAweDZmLCAweDc1LCAweDcyLCAweDYzLCAweDY1LCAweDczLCAweDEyLCAweDJlLCAweDBhLCAweDA2LAotCTB4NzMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4NzUsIDB4NzMsIDB4MTgsIDB4MDMsIDB4MjAsIDB4MDEsIDB4MjgsIDB4MGIsIDB4MzIsIDB4MTEsIDB4MmUsIDB4NjksCi0JMHg2NCwgMHg2NSwgMHg1ZiwgMHg3MSwgMHg3NSwgMHg2NSwgMHg3MiwgMHg3OSwgMHgyZSwgMHg1MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHg0OCwKLQkweDAwLCAweDUyLCAweDA2LCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDc1LCAweDczLCAweDg4LCAweDAxLCAweDAxLCAweDQyLCAweDA5LCAweDBhLCAweDA3LAotCTB4NWYsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4NzUsIDB4NzMsIDB4NDIsIDB4MWIsIDB4NWEsIDB4MTksIDB4NjksIDB4NjQsIDB4NjUsIDB4NWYsIDB4NzEsCi0JMHg3NSwgMHg2NSwgMHg3MiwgMHg3OSwgMHgyZiwgMHg2OSwgMHg2NCwgMHg2NSwgMHg1ZiwgMHg3MSwgMHg3NSwgMHg2NSwgMHg3MiwgMHg3OSwgMHg1ZiwgMHg3MCwKLQkweDcyLCAweDZmLCAweDc0LCAweDZmLCAweDYyLCAweDA2LCAweDcwLCAweDcyLCAweDZmLCAweDc0LCAweDZmLCAweDMzLAorCTB4NmYsIDB4MTIsIDB4MDksIDB4NjksIDB4NjQsIDB4NjUsIDB4NWYsIDB4NzEsIDB4NzUsIDB4NjUsIDB4NzIsIDB4NzksIDB4MjIsIDB4NTEsIDB4MGEsIDB4MGQsCisJMHg0NywgMHg2NSwgMHg2ZSwgMHg2NSwgMHg3MiwgMHg2MSwgMHg3NCwgMHg2NSwgMHg2NCwgMHg0NiwgMHg2OSwgMHg2YywgMHg2NSwgMHgxMiwgMHgxMiwgMHgwYSwKKwkweDA0LCAweDcwLCAweDYxLCAweDc0LCAweDY4LCAweDE4LCAweDAxLCAweDIwLCAweDAxLCAweDI4LCAweDA5LCAweDUyLCAweDA0LCAweDcwLCAweDYxLCAweDc0LAorCTB4NjgsIDB4MTIsIDB4MWYsIDB4MGEsIDB4MDgsIDB4NjMsIDB4NmYsIDB4NmUsIDB4NzQsIDB4NjUsIDB4NmUsIDB4NzQsIDB4NzMsIDB4MTgsIDB4MDIsIDB4MjAsCisJMHgwMSwgMHgyOCwgMHgwYywgMHg0OCwgMHgwMCwgMHg1MiwgMHgwOCwgMHg2MywgMHg2ZiwgMHg2ZSwgMHg3NCwgMHg2NSwgMHg2ZSwgMHg3NCwgMHg3MywgMHg4OCwKKwkweDAxLCAweDAxLCAweDQyLCAweDBiLCAweDBhLCAweDA5LCAweDVmLCAweDYzLCAweDZmLCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDc0LCAweDczLCAweDIyLAorCTB4ODIsIDB4MDIsIDB4MGEsIDB4MGIsIDB4NDksIDB4NjQsIDB4NjUsIDB4NDEsIDB4NmUsIDB4NjEsIDB4NmMsIDB4NzksIDB4NzMsIDB4NjksIDB4NzMsIDB4MTIsCisJMHgyMiwgMHgwYSwgMHgwZCwgMHg2MiwgMHg3NSwgMHg2OSwgMHg2YywgMHg2NCwgMHg1ZiwgMHg2ZiwgMHg3NSwgMHg3NCwgMHg1ZiwgMHg2NCwgMHg2OSwgMHg3MiwKKwkweDE4LCAweDAxLCAweDIwLCAweDAxLCAweDI4LCAweDA5LCAweDUyLCAweDBiLCAweDYyLCAweDc1LCAweDY5LCAweDZjLCAweDY0LCAweDRmLCAweDc1LCAweDc0LAorCTB4NDQsIDB4NjksIDB4NzIsIDB4MTIsIDB4MWYsIDB4MGEsIDB4MGIsIDB4NzcsIDB4NmYsIDB4NzIsIDB4NmIsIDB4NjksIDB4NmUsIDB4NjcsIDB4NWYsIDB4NjQsCisJMHg2OSwgMHg3MiwgMHgxOCwgMHgwNCwgMHgyMCwgMHgwMSwgMHgyOCwgMHgwOSwgMHg1MiwgMHgwYSwgMHg3NywgMHg2ZiwgMHg3MiwgMHg2YiwgMHg2OSwgMHg2ZSwKKwkweDY3LCAweDQ0LCAweDY5LCAweDcyLCAweDEyLCAweDMzLCAweDBhLCAweDA1LCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDE4LCAweDA1LCAweDIwLAorCTB4MDEsIDB4MjgsIDB4MGIsIDB4MzIsIDB4MTgsIDB4MmUsIDB4NjksIDB4NjQsIDB4NjUsIDB4NWYsIDB4NzEsIDB4NzUsIDB4NjUsIDB4NzIsIDB4NzksIDB4MmUsCisJMHg0MSwgMHg2ZSwgMHg2MSwgMHg2YywgMHg3OSwgMHg3MywgMHg2OSwgMHg3MywgMHg0NSwgMHg3MiwgMHg3MiwgMHg2ZiwgMHg3MiwgMHg0OCwgMHgwMCwgMHg1MiwKKwkweDA1LCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDg4LCAweDAxLCAweDAxLCAweDEyLCAweDMzLCAweDBhLCAweDA3LCAweDcyLCAweDY1LCAweDczLAorCTB4NzUsIDB4NmMsIDB4NzQsIDB4NzMsIDB4MTgsIDB4MDYsIDB4MjAsIDB4MDMsIDB4MjgsIDB4MGIsIDB4MzIsIDB4MTksIDB4MmUsIDB4NjksIDB4NjQsIDB4NjUsCisJMHg1ZiwgMHg3MSwgMHg3NSwgMHg2NSwgMHg3MiwgMHg3OSwgMHgyZSwgMHg0MSwgMHg2ZSwgMHg2MSwgMHg2YywgMHg3OSwgMHg3MywgMHg2OSwgMHg3MywgMHg1MiwKKwkweDY1LCAweDczLCAweDc1LCAweDZjLCAweDc0LCAweDUyLCAweDA3LCAweDcyLCAweDY1LCAweDczLCAweDc1LCAweDZjLCAweDc0LCAweDczLCAweDEyLCAweDJlLAorCTB4MGEsIDB4MDUsIDB4NzUsIDB4NmUsIDB4NjksIDB4NzQsIDB4NzMsIDB4MTgsIDB4MDcsIDB4MjAsIDB4MDMsIDB4MjgsIDB4MGIsIDB4MzIsIDB4MTgsIDB4MmUsCisJMHg2OSwgMHg2NCwgMHg2NSwgMHg1ZiwgMHg3MSwgMHg3NSwgMHg2NSwgMHg3MiwgMHg3OSwgMHgyZSwgMHg0MiwgMHg3NSwgMHg2OSwgMHg2YywgMHg2NCwgMHg2MSwKKwkweDYyLCAweDZjLCAweDY1LCAweDU1LCAweDZlLCAweDY5LCAweDc0LCAweDUyLCAweDA1LCAweDc1LCAweDZlLCAweDY5LCAweDc0LCAweDczLCAweDQyLCAweDA4LAorCTB4MGEsIDB4MDYsIDB4NWYsIDB4NjUsIDB4NzIsIDB4NzIsIDB4NmYsIDB4NzIsIDB4NGEsIDB4MDQsIDB4MDgsIDB4MDIsIDB4MTAsIDB4MDMsIDB4NGEsIDB4MDQsCisJMHgwOCwgMHgwMywgMHgxMCwgMHgwNCwgMHgyMiwgMHgzNCwgMHgwYSwgMHgwZCwgMHg0MSwgMHg2ZSwgMHg2MSwgMHg2YywgMHg3OSwgMHg3MywgMHg2OSwgMHg3MywKKwkweDQ1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDEyLCAweDIzLCAweDBhLCAweDBkLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDVmLCAweDZkLAorCTB4NjUsIDB4NzMsIDB4NzMsIDB4NjEsIDB4NjcsIDB4NjUsIDB4MTgsIDB4MDEsIDB4MjAsIDB4MDEsIDB4MjgsIDB4MDksIDB4NTIsIDB4MGMsIDB4NjUsIDB4NzIsCisJMHg3MiwgMHg2ZiwgMHg3MiwgMHg0ZCwgMHg2NSwgMHg3MywgMHg3MywgMHg2MSwgMHg2NywgMHg2NSwgMHgyMiwgMHhhNSwgMHgwMywgMHgwYSwgMHgwZSwgMHg0MSwKKwkweDZlLCAweDYxLCAweDZjLCAweDc5LCAweDczLCAweDY5LCAweDczLCAweDUyLCAweDY1LCAweDczLCAweDc1LCAweDZjLCAweDc0LCAweDEyLCAweDI4LCAweDBhLAorCTB4MTAsIDB4NzMsIDB4NmYsIDB4NzUsIDB4NzIsIDB4NjMsIDB4NjUsIDB4NWYsIDB4NjYsIDB4NjksIDB4NmMsIDB4NjUsIDB4NWYsIDB4NzAsIDB4NjEsIDB4NzQsCisJMHg2OCwgMHgxOCwgMHgwMSwgMHgyMCwgMHgwMSwgMHgyOCwgMHgwOSwgMHg1MiwgMHgwZSwgMHg3MywgMHg2ZiwgMHg3NSwgMHg3MiwgMHg2MywgMHg2NSwgMHg0NiwKKwkweDY5LCAweDZjLCAweDY1LCAweDUwLCAweDYxLCAweDc0LCAweDY4LCAweDEyLCAweDM4LCAweDBhLCAweDA2LCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDc1LAorCTB4NzMsIDB4MTgsIDB4MDIsIDB4MjAsIDB4MDEsIDB4MjgsIDB4MGIsIDB4MzIsIDB4MjAsIDB4MmUsIDB4NjksIDB4NjQsIDB4NjUsIDB4NWYsIDB4NzEsIDB4NzUsCisJMHg2NSwgMHg3MiwgMHg3OSwgMHgyZSwgMHg0MSwgMHg2ZSwgMHg2MSwgMHg2YywgMHg3OSwgMHg3MywgMHg2OSwgMHg3MywgMHg1MiwgMHg2NSwgMHg3MywgMHg3NSwKKwkweDZjLCAweDc0LCAweDJlLCAweDUzLCAweDc0LCAweDYxLCAweDc0LCAweDc1LCAweDczLCAweDUyLCAweDA2LCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDc1LAorCTB4NzMsIDB4MTIsIDB4MTcsIDB4MGEsIDB4MDcsIDB4NzUsIDB4NmUsIDB4NjksIDB4NzQsIDB4NWYsIDB4NjksIDB4NjQsIDB4MTgsIDB4MDMsIDB4MjAsIDB4MDEsCisJMHgyOCwgMHgwOSwgMHg1MiwgMHgwNiwgMHg3NSwgMHg2ZSwgMHg2OSwgMHg3NCwgMHg0OSwgMHg2NCwgMHgxMiwgMHgzYiwgMHgwYSwgMHgwYywgMHg2OSwgMHg2ZSwKKwkweDc2LCAweDYxLCAweDZjLCAweDY5LCAweDY0LCAweDYxLCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDE4LCAweDA0LCAweDIwLCAweDAxLCAweDI4LCAweDBiLAorCTB4MzIsIDB4MTcsIDB4MmUsIDB4NjksIDB4NjQsIDB4NjUsIDB4NWYsIDB4NzEsIDB4NzUsIDB4NjUsIDB4NzIsIDB4NzksIDB4MmUsIDB4NDksIDB4NmUsIDB4NzYsCisJMHg2MSwgMHg2YywgMHg2OSwgMHg2NCwgMHg2MSwgMHg3NCwgMHg2OSwgMHg2ZiwgMHg2ZSwgMHg1MiwgMHgwYywgMHg2OSwgMHg2ZSwgMHg3NiwgMHg2MSwgMHg2YywKKwkweDY5LCAweDY0LCAweDYxLCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDFhLCAweGQ4LCAweDAxLCAweDBhLCAweDA2LCAweDUzLCAweDc0LCAweDYxLCAweDc0LAorCTB4NzUsIDB4NzMsIDB4MTIsIDB4MzksIDB4MGEsIDB4MDQsIDB4NjMsIDB4NmYsIDB4NjQsIDB4NjUsIDB4MTgsIDB4MDEsIDB4MjAsIDB4MDEsIDB4MjgsIDB4MGUsCisJMHgzMiwgMHgyNSwgMHgyZSwgMHg2OSwgMHg2NCwgMHg2NSwgMHg1ZiwgMHg3MSwgMHg3NSwgMHg2NSwgMHg3MiwgMHg3OSwgMHgyZSwgMHg0MSwgMHg2ZSwgMHg2MSwKKwkweDZjLCAweDc5LCAweDczLCAweDY5LCAweDczLCAweDUyLCAweDY1LCAweDczLCAweDc1LCAweDZjLCAweDc0LCAweDJlLCAweDUzLCAweDc0LCAweDYxLCAweDc0LAorCTB4NzUsIDB4NzMsIDB4MmUsIDB4NDMsIDB4NmYsIDB4NjQsIDB4NjUsIDB4NTIsIDB4MDQsIDB4NjMsIDB4NmYsIDB4NjQsIDB4NjUsIDB4MTIsIDB4MmEsIDB4MGEsCisJMHgwZSwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHg1ZiwgMHg2ZCwgMHg2NSwgMHg3MywgMHg3MywgMHg2MSwgMHg2NywgMHg2NSwgMHgxOCwKKwkweDAyLCAweDIwLCAweDAxLCAweDI4LCAweDA5LCAweDQ4LCAweDAwLCAweDUyLCAweDBkLCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDc1LCAweDczLCAweDRkLAorCTB4NjUsIDB4NzMsIDB4NzMsIDB4NjEsIDB4NjcsIDB4NjUsIDB4ODgsIDB4MDEsIDB4MDEsIDB4MjIsIDB4NTQsIDB4MGEsIDB4MDQsIDB4NDMsIDB4NmYsIDB4NjQsCisJMHg2NSwgMHgxMiwgMHgxNCwgMHgwYSwgMHgxMCwgMHg0MywgMHg0ZiwgMHg0NCwgMHg0NSwgMHg1ZiwgMHg1NSwgMHg0ZSwgMHg1MywgMHg1MCwgMHg0NSwgMHg0MywKKwkweDQ5LCAweDQ2LCAweDQ5LCAweDQ1LCAweDQ0LCAweDEwLCAweDAwLCAweDEyLCAweDBiLCAweDBhLCAweDA3LCAweDQzLCAweDRmLCAweDQ0LCAweDQ1LCAweDVmLAorCTB4NGYsIDB4NGIsIDB4MTAsIDB4MDEsIDB4MTIsIDB4MTIsIDB4MGEsIDB4MGUsIDB4NDMsIDB4NGYsIDB4NDQsIDB4NDUsIDB4NWYsIDB4NGUsIDB4NGYsIDB4NTQsCisJMHg1ZiwgMHg0NiwgMHg0ZiwgMHg1NSwgMHg0ZSwgMHg0NCwgMHgxMCwgMHgwMiwgMHgxMiwgMHgxNSwgMHgwYSwgMHgxMSwgMHg0MywgMHg0ZiwgMHg0NCwgMHg0NSwKKwkweDVmLCAweDQyLCAweDU1LCAweDQ5LCAweDRjLCAweDQ0LCAweDVmLCAweDQ2LCAweDQxLCAweDQ5LCAweDRjLCAweDQ1LCAweDQ0LCAweDEwLCAweDAzLCAweDQyLAorCTB4MTEsIDB4MGEsIDB4MGYsIDB4NWYsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4NzUsIDB4NzMsIDB4NWYsIDB4NmQsIDB4NjUsIDB4NzMsIDB4NzMsIDB4NjEsCisJMHg2NywgMHg2NSwgMHgyMiwgMHg5NSwgMHgwMiwgMHgwYSwgMHgwZCwgMHg0MiwgMHg3NSwgMHg2OSwgMHg2YywgMHg2NCwgMHg2MSwgMHg2MiwgMHg2YywgMHg2NSwKKwkweDU1LCAweDZlLCAweDY5LCAweDc0LCAweDEyLCAweDBlLCAweDBhLCAweDAyLCAweDY5LCAweDY0LCAweDE4LCAweDAxLCAweDIwLCAweDAxLCAweDI4LCAweDA5LAorCTB4NTIsIDB4MDIsIDB4NjksIDB4NjQsIDB4MTIsIDB4MmYsIDB4MGEsIDB4MDgsIDB4NmMsIDB4NjEsIDB4NmUsIDB4NjcsIDB4NzUsIDB4NjEsIDB4NjcsIDB4NjUsCisJMHgxOCwgMHgwMiwgMHgyMCwgMHgwMSwgMHgyOCwgMHgwZSwgMHgzMiwgMHgxMywgMHgyZSwgMHg2OSwgMHg2NCwgMHg2NSwgMHg1ZiwgMHg3MSwgMHg3NSwgMHg2NSwKKwkweDcyLCAweDc5LCAweDJlLCAweDRjLCAweDYxLCAweDZlLCAweDY3LCAweDc1LCAweDYxLCAweDY3LCAweDY1LCAweDUyLCAweDA4LCAweDZjLCAweDYxLCAweDZlLAorCTB4NjcsIDB4NzUsIDB4NjEsIDB4NjcsIDB4NjUsIDB4MTIsIDB4MmEsIDB4MGEsIDB4MTEsIDB4NzMsIDB4NmYsIDB4NzUsIDB4NzIsIDB4NjMsIDB4NjUsIDB4NWYsCisJMHg2NiwgMHg2OSwgMHg2YywgMHg2NSwgMHg1ZiwgMHg3MCwgMHg2MSwgMHg3NCwgMHg2OCwgMHg3MywgMHgxOCwgMHgwMywgMHgyMCwgMHgwMywgMHgyOCwgMHgwOSwKKwkweDUyLCAweDBmLCAweDczLCAweDZmLCAweDc1LCAweDcyLCAweDYzLCAweDY1LCAweDQ2LCAweDY5LCAweDZjLCAweDY1LCAweDUwLCAweDYxLCAweDc0LCAweDY4LAorCTB4NzMsIDB4MTIsIDB4MmQsIDB4MGEsIDB4MTIsIDB4NjMsIDB4NmYsIDB4NmQsIDB4NzAsIDB4NjksIDB4NmMsIDB4NjUsIDB4NzIsIDB4NWYsIDB4NjEsIDB4NzIsCisJMHg2NywgMHg3NSwgMHg2ZCwgMHg2NSwgMHg2ZSwgMHg3NCwgMHg3MywgMHgxOCwgMHgwNCwgMHgyMCwgMHgwMywgMHgyOCwgMHgwOSwgMHg1MiwgMHgxMSwgMHg2MywKKwkweDZmLCAweDZkLCAweDcwLCAweDY5LCAweDZjLCAweDY1LCAweDcyLCAweDQxLCAweDcyLCAweDY3LCAweDc1LCAweDZkLCAweDY1LCAweDZlLCAweDc0LCAweDczLAorCTB4MTIsIDB4NDEsIDB4MGEsIDB4MGYsIDB4NjcsIDB4NjUsIDB4NmUsIDB4NjUsIDB4NzIsIDB4NjEsIDB4NzQsIDB4NjUsIDB4NjQsIDB4NWYsIDB4NjYsIDB4NjksCisJMHg2YywgMHg2NSwgMHg3MywgMHgxOCwgMHgwNSwgMHgyMCwgMHgwMywgMHgyOCwgMHgwYiwgMHgzMiwgMHgxOCwgMHgyZSwgMHg2OSwgMHg2NCwgMHg2NSwgMHg1ZiwKKwkweDcxLCAweDc1LCAweDY1LCAweDcyLCAweDc5LCAweDJlLCAweDQ3LCAweDY1LCAweDZlLCAweDY1LCAweDcyLCAweDYxLCAweDc0LCAweDY1LCAweDY0LCAweDQ2LAorCTB4NjksIDB4NmMsIDB4NjUsIDB4NTIsIDB4MGUsIDB4NjcsIDB4NjUsIDB4NmUsIDB4NjUsIDB4NzIsIDB4NjEsIDB4NzQsIDB4NjUsIDB4NjQsIDB4NDYsIDB4NjksCisJMHg2YywgMHg2NSwgMHg3MywgMHgxMiwgMHgyNSwgMHgwYSwgMHgwZSwgMHg2NCwgMHg2NSwgMHg3MCwgMHg2NSwgMHg2ZSwgMHg2NCwgMHg2NSwgMHg2ZSwgMHg2MywKKwkweDc5LCAweDVmLCAweDY5LCAweDY0LCAweDczLCAweDE4LCAweDA2LCAweDIwLCAweDAzLCAweDI4LCAweDA5LCAweDUyLCAweDBkLCAweDY0LCAweDY1LCAweDcwLAorCTB4NjUsIDB4NmUsIDB4NjQsIDB4NjUsIDB4NmUsIDB4NjMsIDB4NzksIDB4NDksIDB4NjQsIDB4NzMsIDB4MjIsIDB4OGUsIDB4MDIsIDB4MGEsIDB4MGMsIDB4NDksCisJMHg2ZSwgMHg3NiwgMHg2MSwgMHg2YywgMHg2OSwgMHg2NCwgMHg2MSwgMHg3NCwgMHg2OSwgMHg2ZiwgMHg2ZSwgMHgxMiwgMHgxZCwgMHgwYSwgMHgwYSwgMHg2NiwKKwkweDY5LCAweDZjLCAweDY1LCAweDVmLCAweDcwLCAweDYxLCAweDc0LCAweDY4LCAweDczLCAweDE4LCAweDAxLCAweDIwLCAweDAzLCAweDI4LCAweDA5LCAweDUyLAorCTB4MDksIDB4NjYsIDB4NjksIDB4NmMsIDB4NjUsIDB4NTAsIDB4NjEsIDB4NzQsIDB4NjgsIDB4NzMsIDB4MTIsIDB4M2UsIDB4MGEsIDB4MDksIDB4NzcsIDB4NjksCisJMHg2YywgMHg2NCwgMHg2MywgMHg2MSwgMHg3MiwgMHg2NCwgMHg3MywgMHgxOCwgMHgwNCwgMHgyMCwgMHgwMywgMHgyOCwgMHgwYiwgMHgzMiwgMHgyMCwgMHgyZSwKKwkweDY5LCAweDY0LCAweDY1LCAweDVmLCAweDcxLCAweDc1LCAweDY1LCAweDcyLCAweDc5LCAweDJlLCAweDQ5LCAweDZlLCAweDc2LCAweDYxLCAweDZjLCAweDY5LAorCTB4NjQsIDB4NjEsIDB4NzQsIDB4NjksIDB4NmYsIDB4NmUsIDB4MmUsIDB4NTcsIDB4NjksIDB4NmMsIDB4NjQsIDB4NjMsIDB4NjEsIDB4NzIsIDB4NjQsIDB4NTIsCisJMHgwOSwgMHg3NywgMHg2OSwgMHg2YywgMHg2NCwgMHg2MywgMHg2MSwgMHg3MiwgMHg2NCwgMHg3MywgMHgxYSwgMHg5ZSwgMHgwMSwgMHgwYSwgMHgwOCwgMHg1NywKKwkweDY5LCAweDZjLCAweDY0LCAweDYzLCAweDYxLCAweDcyLCAweDY0LCAweDEyLCAweDFiLCAweDBhLCAweDA2LCAweDcwLCAweDcyLCAweDY1LCAweDY2LCAweDY5LAorCTB4NzgsIDB4MTgsIDB4MDEsIDB4MjAsIDB4MDEsIDB4MjgsIDB4MDksIDB4NDgsIDB4MDAsIDB4NTIsIDB4MDYsIDB4NzAsIDB4NzIsIDB4NjUsIDB4NjYsIDB4NjksCisJMHg3OCwgMHg4OCwgMHgwMSwgMHgwMSwgMHgxMiwgMHgxYiwgMHgwYSwgMHgwNiwgMHg3MywgMHg3NSwgMHg2NiwgMHg2NiwgMHg2OSwgMHg3OCwgMHgxOCwgMHgwMiwKKwkweDIwLCAweDAxLCAweDI4LCAweDA5LCAweDQ4LCAweDAxLCAweDUyLCAweDA2LCAweDczLCAweDc1LCAweDY2LCAweDY2LCAweDY5LCAweDc4LCAweDg4LCAweDAxLAorCTB4MDEsIDB4MTIsIDB4MmQsIDB4MGEsIDB4MTAsIDB4NjMsIDB4NjEsIDB4NmUsIDB4NWYsIDB4NjMsIDB4NzIsIDB4NmYsIDB4NzMsIDB4NzMsIDB4NWYsIDB4NjYsCisJMHg2ZiwgMHg2YywgMHg2NCwgMHg2NSwgMHg3MiwgMHgxOCwgMHgwMywgMHgyMCwgMHgwMSwgMHgyOCwgMHgwOCwgMHg0OCwgMHgwMiwgMHg1MiwgMHgwZSwgMHg2MywKKwkweDYxLCAweDZlLCAweDQzLCAweDcyLCAweDZmLCAweDczLCAweDczLCAweDQ2LCAweDZmLCAweDZjLCAweDY0LCAweDY1LCAweDcyLCAweDg4LCAweDAxLCAweDAxLAorCTB4NDIsIDB4MDksIDB4MGEsIDB4MDcsIDB4NWYsIDB4NzAsIDB4NzIsIDB4NjUsIDB4NjYsIDB4NjksIDB4NzgsIDB4NDIsIDB4MDksIDB4MGEsIDB4MDcsIDB4NWYsCisJMHg3MywgMHg3NSwgMHg2NiwgMHg2NiwgMHg2OSwgMHg3OCwgMHg0MiwgMHgxMywgMHgwYSwgMHgxMSwgMHg1ZiwgMHg2MywgMHg2MSwgMHg2ZSwgMHg1ZiwgMHg2MywKKwkweDcyLCAweDZmLCAweDczLCAweDczLCAweDVmLCAweDY2LCAweDZmLCAweDZjLCAweDY0LCAweDY1LCAweDcyLCAweDJhLCAweDQ5LCAweDBhLCAweDA4LCAweDRjLAorCTB4NjEsIDB4NmUsIDB4NjcsIDB4NzUsIDB4NjEsIDB4NjcsIDB4NjUsIDB4MTIsIDB4MTgsIDB4MGEsIDB4MTQsIDB4NGMsIDB4NDEsIDB4NGUsIDB4NDcsIDB4NTUsCisJMHg0MSwgMHg0NywgMHg0NSwgMHg1ZiwgMHg1NSwgMHg0ZSwgMHg1MywgMHg1MCwgMHg0NSwgMHg0MywgMHg0OSwgMHg0NiwgMHg0OSwgMHg0NSwgMHg0NCwgMHgxMCwKKwkweDAwLCAweDEyLCAweDExLCAweDBhLCAweDBkLCAweDRjLCAweDQxLCAweDRlLCAweDQ3LCAweDU1LCAweDQxLCAweDQ3LCAweDQ1LCAweDVmLCAweDRhLCAweDQxLAorCTB4NTYsIDB4NDEsIDB4MTAsIDB4MDEsIDB4MTIsIDB4MTAsIDB4MGEsIDB4MGMsIDB4NGMsIDB4NDEsIDB4NGUsIDB4NDcsIDB4NTUsIDB4NDEsIDB4NDcsIDB4NDUsCisJMHg1ZiwgMHg0MywgMHg1MCwgMHg1MCwgMHgxMCwgMHgwMiwgMHg0MiwgMHgxYiwgMHg1YSwgMHgxOSwgMHg2OSwgMHg2NCwgMHg2NSwgMHg1ZiwgMHg3MSwgMHg3NSwKKwkweDY1LCAweDcyLCAweDc5LCAweDJmLCAweDY5LCAweDY0LCAweDY1LCAweDVmLCAweDcxLCAweDc1LCAweDY1LCAweDcyLCAweDc5LCAweDVmLCAweDcwLCAweDcyLAorCTB4NmYsIDB4NzQsIDB4NmYsIDB4NjIsIDB4MDYsIDB4NzAsIDB4NzIsIDB4NmYsIDB4NzQsIDB4NmYsIDB4MzMsCiB9CiAKIHZhciAoCkBAIC02MzksMzIgKzgwNCwzNSBAQAogCXJldHVybiBmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjRGF0YQogfQogCi12YXIgZmlsZV9pZGVfcXVlcnlfcHJvdG9fZW51bVR5cGVzID0gbWFrZShbXXByb3RvaW1wbC5FbnVtSW5mbywgMSkKLXZhciBmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlcyA9IG1ha2UoW11wcm90b2ltcGwuTWVzc2FnZUluZm8sIDcpCit2YXIgZmlsZV9pZGVfcXVlcnlfcHJvdG9fZW51bVR5cGVzID0gbWFrZShbXXByb3RvaW1wbC5FbnVtSW5mbywgMikKK3ZhciBmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlcyA9IG1ha2UoW11wcm90b2ltcGwuTWVzc2FnZUluZm8sIDgpCiB2YXIgZmlsZV9pZGVfcXVlcnlfcHJvdG9fZ29UeXBlcyA9IFtdaW50ZXJmYWNle317Ci0JKFN0YXR1c19Db2RlKSgwKSwgICAgICAgICAgLy8gMDogaWRlX3F1ZXJ5LlN0YXR1cy5Db2RlCi0JKCpTdGF0dXMpKG5pbCksICAgICAgICAgICAgLy8gMTogaWRlX3F1ZXJ5LlN0YXR1cwotCSgqUmVwb1N0YXRlKShuaWwpLCAgICAgICAgIC8vIDI6IGlkZV9xdWVyeS5SZXBvU3RhdGUKLQkoKkRlcHNSZXNwb25zZSkobmlsKSwgICAgICAvLyAzOiBpZGVfcXVlcnkuRGVwc1Jlc3BvbnNlCi0JKCpHZW5lcmF0ZWRGaWxlKShuaWwpLCAgICAgLy8gNDogaWRlX3F1ZXJ5LkdlbmVyYXRlZEZpbGUKLQkoKlNvdXJjZUZpbGUpKG5pbCksICAgICAgICAvLyA1OiBpZGVfcXVlcnkuU291cmNlRmlsZQotCSgqSWRlQW5hbHlzaXMpKG5pbCksICAgICAgIC8vIDY6IGlkZV9xdWVyeS5JZGVBbmFseXNpcwotCSgqRGVwc1Jlc3BvbnNlX0RlcHMpKG5pbCksIC8vIDc6IGlkZV9xdWVyeS5EZXBzUmVzcG9uc2UuRGVwcworCShMYW5ndWFnZSkoMCksICAgICAgICAgICAgICAgICAgIC8vIDA6IGlkZV9xdWVyeS5MYW5ndWFnZQorCShBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZSkoMCksIC8vIDE6IGlkZV9xdWVyeS5BbmFseXNpc1Jlc3VsdC5TdGF0dXMuQ29kZQorCSgqR2VuZXJhdGVkRmlsZSkobmlsKSwgICAgICAgICAgIC8vIDI6IGlkZV9xdWVyeS5HZW5lcmF0ZWRGaWxlCisJKCpJZGVBbmFseXNpcykobmlsKSwgICAgICAgICAgICAgLy8gMzogaWRlX3F1ZXJ5LklkZUFuYWx5c2lzCisJKCpBbmFseXNpc0Vycm9yKShuaWwpLCAgICAgICAgICAgLy8gNDogaWRlX3F1ZXJ5LkFuYWx5c2lzRXJyb3IKKwkoKkFuYWx5c2lzUmVzdWx0KShuaWwpLCAgICAgICAgICAvLyA1OiBpZGVfcXVlcnkuQW5hbHlzaXNSZXN1bHQKKwkoKkJ1aWxkYWJsZVVuaXQpKG5pbCksICAgICAgICAgICAvLyA2OiBpZGVfcXVlcnkuQnVpbGRhYmxlVW5pdAorCSgqSW52YWxpZGF0aW9uKShuaWwpLCAgICAgICAgICAgIC8vIDc6IGlkZV9xdWVyeS5JbnZhbGlkYXRpb24KKwkoKkFuYWx5c2lzUmVzdWx0X1N0YXR1cykobmlsKSwgICAvLyA4OiBpZGVfcXVlcnkuQW5hbHlzaXNSZXN1bHQuU3RhdHVzCisJKCpJbnZhbGlkYXRpb25fV2lsZGNhcmQpKG5pbCksICAgLy8gOTogaWRlX3F1ZXJ5LkludmFsaWRhdGlvbi5XaWxkY2FyZAogfQogdmFyIGZpbGVfaWRlX3F1ZXJ5X3Byb3RvX2RlcElkeHMgPSBbXWludDMyewotCTAsIC8vIDA6IGlkZV9xdWVyeS5TdGF0dXMuY29kZTp0eXBlX25hbWUgLT4gaWRlX3F1ZXJ5LlN0YXR1cy5Db2RlCi0JNywgLy8gMTogaWRlX3F1ZXJ5LkRlcHNSZXNwb25zZS5kZXBzOnR5cGVfbmFtZSAtPiBpZGVfcXVlcnkuRGVwc1Jlc3BvbnNlLkRlcHMKLQkxLCAvLyAyOiBpZGVfcXVlcnkuRGVwc1Jlc3BvbnNlLnN0YXR1czp0eXBlX25hbWUgLT4gaWRlX3F1ZXJ5LlN0YXR1cwotCTQsIC8vIDM6IGlkZV9xdWVyeS5Tb3VyY2VGaWxlLmdlbmVyYXRlZDp0eXBlX25hbWUgLT4gaWRlX3F1ZXJ5LkdlbmVyYXRlZEZpbGUKLQkxLCAvLyA0OiBpZGVfcXVlcnkuU291cmNlRmlsZS5zdGF0dXM6dHlwZV9uYW1lIC0+IGlkZV9xdWVyeS5TdGF0dXMKLQk1LCAvLyA1OiBpZGVfcXVlcnkuSWRlQW5hbHlzaXMuc291cmNlczp0eXBlX25hbWUgLT4gaWRlX3F1ZXJ5LlNvdXJjZUZpbGUKLQkxLCAvLyA2OiBpZGVfcXVlcnkuSWRlQW5hbHlzaXMuc3RhdHVzOnR5cGVfbmFtZSAtPiBpZGVfcXVlcnkuU3RhdHVzCi0JMSwgLy8gNzogaWRlX3F1ZXJ5LkRlcHNSZXNwb25zZS5EZXBzLnN0YXR1czp0eXBlX25hbWUgLT4gaWRlX3F1ZXJ5LlN0YXR1cwotCTgsIC8vIFs4OjhdIGlzIHRoZSBzdWItbGlzdCBmb3IgbWV0aG9kIG91dHB1dF90eXBlCi0JOCwgLy8gWzg6OF0gaXMgdGhlIHN1Yi1saXN0IGZvciBtZXRob2QgaW5wdXRfdHlwZQotCTgsIC8vIFs4OjhdIGlzIHRoZSBzdWItbGlzdCBmb3IgZXh0ZW5zaW9uIHR5cGVfbmFtZQotCTgsIC8vIFs4OjhdIGlzIHRoZSBzdWItbGlzdCBmb3IgZXh0ZW5zaW9uIGV4dGVuZGVlCi0JMCwgLy8gWzA6OF0gaXMgdGhlIHN1Yi1saXN0IGZvciBmaWVsZCB0eXBlX25hbWUKKwk0LCAvLyAwOiBpZGVfcXVlcnkuSWRlQW5hbHlzaXMuZXJyb3I6dHlwZV9uYW1lIC0+IGlkZV9xdWVyeS5BbmFseXNpc0Vycm9yCisJNSwgLy8gMTogaWRlX3F1ZXJ5LklkZUFuYWx5c2lzLnJlc3VsdHM6dHlwZV9uYW1lIC0+IGlkZV9xdWVyeS5BbmFseXNpc1Jlc3VsdAorCTYsIC8vIDI6IGlkZV9xdWVyeS5JZGVBbmFseXNpcy51bml0czp0eXBlX25hbWUgLT4gaWRlX3F1ZXJ5LkJ1aWxkYWJsZVVuaXQKKwk4LCAvLyAzOiBpZGVfcXVlcnkuQW5hbHlzaXNSZXN1bHQuc3RhdHVzOnR5cGVfbmFtZSAtPiBpZGVfcXVlcnkuQW5hbHlzaXNSZXN1bHQuU3RhdHVzCisJNywgLy8gNDogaWRlX3F1ZXJ5LkFuYWx5c2lzUmVzdWx0LmludmFsaWRhdGlvbjp0eXBlX25hbWUgLT4gaWRlX3F1ZXJ5LkludmFsaWRhdGlvbgorCTAsIC8vIDU6IGlkZV9xdWVyeS5CdWlsZGFibGVVbml0Lmxhbmd1YWdlOnR5cGVfbmFtZSAtPiBpZGVfcXVlcnkuTGFuZ3VhZ2UKKwkyLCAvLyA2OiBpZGVfcXVlcnkuQnVpbGRhYmxlVW5pdC5nZW5lcmF0ZWRfZmlsZXM6dHlwZV9uYW1lIC0+IGlkZV9xdWVyeS5HZW5lcmF0ZWRGaWxlCisJOSwgLy8gNzogaWRlX3F1ZXJ5LkludmFsaWRhdGlvbi53aWxkY2FyZHM6dHlwZV9uYW1lIC0+IGlkZV9xdWVyeS5JbnZhbGlkYXRpb24uV2lsZGNhcmQKKwkxLCAvLyA4OiBpZGVfcXVlcnkuQW5hbHlzaXNSZXN1bHQuU3RhdHVzLmNvZGU6dHlwZV9uYW1lIC0+IGlkZV9xdWVyeS5BbmFseXNpc1Jlc3VsdC5TdGF0dXMuQ29kZQorCTksIC8vIFs5OjldIGlzIHRoZSBzdWItbGlzdCBmb3IgbWV0aG9kIG91dHB1dF90eXBlCisJOSwgLy8gWzk6OV0gaXMgdGhlIHN1Yi1saXN0IGZvciBtZXRob2QgaW5wdXRfdHlwZQorCTksIC8vIFs5OjldIGlzIHRoZSBzdWItbGlzdCBmb3IgZXh0ZW5zaW9uIHR5cGVfbmFtZQorCTksIC8vIFs5OjldIGlzIHRoZSBzdWItbGlzdCBmb3IgZXh0ZW5zaW9uIGV4dGVuZGVlCisJMCwgLy8gWzA6OV0gaXMgdGhlIHN1Yi1saXN0IGZvciBmaWVsZCB0eXBlX25hbWUKIH0KIAogZnVuYyBpbml0KCkgeyBmaWxlX2lkZV9xdWVyeV9wcm90b19pbml0KCkgfQpAQCAtNjc0LDQyICs4NDIsNiBAQAogCX0KIAlpZiAhcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgewogCQlmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1swXS5FeHBvcnRlciA9IGZ1bmModiBpbnRlcmZhY2V7fSwgaSBpbnQpIGludGVyZmFjZXt9IHsKLQkJCXN3aXRjaCB2IDo9IHYuKCpTdGF0dXMpOyBpIHsKLQkJCWNhc2UgMDoKLQkJCQlyZXR1cm4gJnYuc3RhdGUKLQkJCWNhc2UgMToKLQkJCQlyZXR1cm4gJnYuc2l6ZUNhY2hlCi0JCQljYXNlIDI6Ci0JCQkJcmV0dXJuICZ2LnVua25vd25GaWVsZHMKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIG5pbAotCQkJfQotCQl9Ci0JCWZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzFdLkV4cG9ydGVyID0gZnVuYyh2IGludGVyZmFjZXt9LCBpIGludCkgaW50ZXJmYWNle30gewotCQkJc3dpdGNoIHYgOj0gdi4oKlJlcG9TdGF0ZSk7IGkgewotCQkJY2FzZSAwOgotCQkJCXJldHVybiAmdi5zdGF0ZQotCQkJY2FzZSAxOgotCQkJCXJldHVybiAmdi5zaXplQ2FjaGUKLQkJCWNhc2UgMjoKLQkJCQlyZXR1cm4gJnYudW5rbm93bkZpZWxkcwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gbmlsCi0JCQl9Ci0JCX0KLQkJZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbMl0uRXhwb3J0ZXIgPSBmdW5jKHYgaW50ZXJmYWNle30sIGkgaW50KSBpbnRlcmZhY2V7fSB7Ci0JCQlzd2l0Y2ggdiA6PSB2LigqRGVwc1Jlc3BvbnNlKTsgaSB7Ci0JCQljYXNlIDA6Ci0JCQkJcmV0dXJuICZ2LnN0YXRlCi0JCQljYXNlIDE6Ci0JCQkJcmV0dXJuICZ2LnNpemVDYWNoZQotCQkJY2FzZSAyOgotCQkJCXJldHVybiAmdi51bmtub3duRmllbGRzCi0JCQlkZWZhdWx0OgotCQkJCXJldHVybiBuaWwKLQkJCX0KLQkJfQotCQlmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1szXS5FeHBvcnRlciA9IGZ1bmModiBpbnRlcmZhY2V7fSwgaSBpbnQpIGludGVyZmFjZXt9IHsKIAkJCXN3aXRjaCB2IDo9IHYuKCpHZW5lcmF0ZWRGaWxlKTsgaSB7CiAJCQljYXNlIDA6CiAJCQkJcmV0dXJuICZ2LnN0YXRlCkBAIC03MjEsMTkgKzg1Myw3IEBACiAJCQkJcmV0dXJuIG5pbAogCQkJfQogCQl9Ci0JCWZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzRdLkV4cG9ydGVyID0gZnVuYyh2IGludGVyZmFjZXt9LCBpIGludCkgaW50ZXJmYWNle30gewotCQkJc3dpdGNoIHYgOj0gdi4oKlNvdXJjZUZpbGUpOyBpIHsKLQkJCWNhc2UgMDoKLQkJCQlyZXR1cm4gJnYuc3RhdGUKLQkJCWNhc2UgMToKLQkJCQlyZXR1cm4gJnYuc2l6ZUNhY2hlCi0JCQljYXNlIDI6Ci0JCQkJcmV0dXJuICZ2LnVua25vd25GaWVsZHMKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIG5pbAotCQkJfQotCQl9Ci0JCWZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzVdLkV4cG9ydGVyID0gZnVuYyh2IGludGVyZmFjZXt9LCBpIGludCkgaW50ZXJmYWNle30geworCQlmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1sxXS5FeHBvcnRlciA9IGZ1bmModiBpbnRlcmZhY2V7fSwgaSBpbnQpIGludGVyZmFjZXt9IHsKIAkJCXN3aXRjaCB2IDo9IHYuKCpJZGVBbmFseXNpcyk7IGkgewogCQkJY2FzZSAwOgogCQkJCXJldHVybiAmdi5zdGF0ZQpAQCAtNzQ1LDggKzg2NSw2OCBAQAogCQkJCXJldHVybiBuaWwKIAkJCX0KIAkJfQorCQlmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1syXS5FeHBvcnRlciA9IGZ1bmModiBpbnRlcmZhY2V7fSwgaSBpbnQpIGludGVyZmFjZXt9IHsKKwkJCXN3aXRjaCB2IDo9IHYuKCpBbmFseXNpc0Vycm9yKTsgaSB7CisJCQljYXNlIDA6CisJCQkJcmV0dXJuICZ2LnN0YXRlCisJCQljYXNlIDE6CisJCQkJcmV0dXJuICZ2LnNpemVDYWNoZQorCQkJY2FzZSAyOgorCQkJCXJldHVybiAmdi51bmtub3duRmllbGRzCisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBuaWwKKwkJCX0KKwkJfQorCQlmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1szXS5FeHBvcnRlciA9IGZ1bmModiBpbnRlcmZhY2V7fSwgaSBpbnQpIGludGVyZmFjZXt9IHsKKwkJCXN3aXRjaCB2IDo9IHYuKCpBbmFseXNpc1Jlc3VsdCk7IGkgeworCQkJY2FzZSAwOgorCQkJCXJldHVybiAmdi5zdGF0ZQorCQkJY2FzZSAxOgorCQkJCXJldHVybiAmdi5zaXplQ2FjaGUKKwkJCWNhc2UgMjoKKwkJCQlyZXR1cm4gJnYudW5rbm93bkZpZWxkcworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gbmlsCisJCQl9CisJCX0KKwkJZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbNF0uRXhwb3J0ZXIgPSBmdW5jKHYgaW50ZXJmYWNle30sIGkgaW50KSBpbnRlcmZhY2V7fSB7CisJCQlzd2l0Y2ggdiA6PSB2LigqQnVpbGRhYmxlVW5pdCk7IGkgeworCQkJY2FzZSAwOgorCQkJCXJldHVybiAmdi5zdGF0ZQorCQkJY2FzZSAxOgorCQkJCXJldHVybiAmdi5zaXplQ2FjaGUKKwkJCWNhc2UgMjoKKwkJCQlyZXR1cm4gJnYudW5rbm93bkZpZWxkcworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gbmlsCisJCQl9CisJCX0KKwkJZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbNV0uRXhwb3J0ZXIgPSBmdW5jKHYgaW50ZXJmYWNle30sIGkgaW50KSBpbnRlcmZhY2V7fSB7CisJCQlzd2l0Y2ggdiA6PSB2LigqSW52YWxpZGF0aW9uKTsgaSB7CisJCQljYXNlIDA6CisJCQkJcmV0dXJuICZ2LnN0YXRlCisJCQljYXNlIDE6CisJCQkJcmV0dXJuICZ2LnNpemVDYWNoZQorCQkJY2FzZSAyOgorCQkJCXJldHVybiAmdi51bmtub3duRmllbGRzCisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBuaWwKKwkJCX0KKwkJfQogCQlmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1s2XS5FeHBvcnRlciA9IGZ1bmModiBpbnRlcmZhY2V7fSwgaSBpbnQpIGludGVyZmFjZXt9IHsKLQkJCXN3aXRjaCB2IDo9IHYuKCpEZXBzUmVzcG9uc2VfRGVwcyk7IGkgeworCQkJc3dpdGNoIHYgOj0gdi4oKkFuYWx5c2lzUmVzdWx0X1N0YXR1cyk7IGkgeworCQkJY2FzZSAwOgorCQkJCXJldHVybiAmdi5zdGF0ZQorCQkJY2FzZSAxOgorCQkJCXJldHVybiAmdi5zaXplQ2FjaGUKKwkJCWNhc2UgMjoKKwkJCQlyZXR1cm4gJnYudW5rbm93bkZpZWxkcworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gbmlsCisJCQl9CisJCX0KKwkJZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbN10uRXhwb3J0ZXIgPSBmdW5jKHYgaW50ZXJmYWNle30sIGkgaW50KSBpbnRlcmZhY2V7fSB7CisJCQlzd2l0Y2ggdiA6PSB2LigqSW52YWxpZGF0aW9uX1dpbGRjYXJkKTsgaSB7CiAJCQljYXNlIDA6CiAJCQkJcmV0dXJuICZ2LnN0YXRlCiAJCQljYXNlIDE6CkBAIC03NTksMTggKzkzOSwxNiBAQAogCQl9CiAJfQogCWZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzBdLk9uZW9mV3JhcHBlcnMgPSBbXWludGVyZmFjZXt9e30KLQlmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1syXS5PbmVvZldyYXBwZXJzID0gW11pbnRlcmZhY2V7fXt9Ci0JZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbM10uT25lb2ZXcmFwcGVycyA9IFtdaW50ZXJmYWNle317fQotCWZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzRdLk9uZW9mV3JhcHBlcnMgPSBbXWludGVyZmFjZXt9e30KLQlmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1s1XS5PbmVvZldyYXBwZXJzID0gW11pbnRlcmZhY2V7fXt9CisJZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbMV0uT25lb2ZXcmFwcGVycyA9IFtdaW50ZXJmYWNle317fQogCWZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzZdLk9uZW9mV3JhcHBlcnMgPSBbXWludGVyZmFjZXt9e30KKwlmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1s3XS5PbmVvZldyYXBwZXJzID0gW11pbnRlcmZhY2V7fXt9CiAJdHlwZSB4IHN0cnVjdHt9CiAJb3V0IDo9IHByb3RvaW1wbC5UeXBlQnVpbGRlcnsKIAkJRmlsZTogcHJvdG9pbXBsLkRlc2NCdWlsZGVyewogCQkJR29QYWNrYWdlUGF0aDogcmVmbGVjdC5UeXBlT2YoeHt9KS5Qa2dQYXRoKCksCiAJCQlSYXdEZXNjcmlwdG9yOiBmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjLAotCQkJTnVtRW51bXM6ICAgICAgMSwKLQkJCU51bU1lc3NhZ2VzOiAgIDcsCisJCQlOdW1FbnVtczogICAgICAyLAorCQkJTnVtTWVzc2FnZXM6ICAgOCwKIAkJCU51bUV4dGVuc2lvbnM6IDAsCiAJCQlOdW1TZXJ2aWNlczogICAwLAogCQl9LApkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L2lkZV9xdWVyeV9wcm90by9pZGVfcXVlcnkucHJvdG8gYi90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5X3Byb3RvL2lkZV9xdWVyeS5wcm90bwppbmRleCAzZDdhOGU3Li4xM2YzNDljIDEwMDY0NAotLS0gYS90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5X3Byb3RvL2lkZV9xdWVyeS5wcm90bworKysgYi90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5X3Byb3RvL2lkZV9xdWVyeS5wcm90bwpAQCAtMTYsNTEgKzE2LDExIEBACiBzeW50YXggPSAicHJvdG8zIjsKIAogcGFja2FnZSBpZGVfcXVlcnk7CisKIG9wdGlvbiBnb19wYWNrYWdlID0gImlkZV9xdWVyeS9pZGVfcXVlcnlfcHJvdG8iOwogCi0vLyBJbmRpY2F0ZXMgdGhlIHN1Y2Nlc3MvZmFpbHVyZSBmb3IgYW5hbHlzaXMuCi1tZXNzYWdlIFN0YXR1cyB7Ci0gIGVudW0gQ29kZSB7Ci0gICAgT0sgPSAwOwotICAgIEZBSUxVUkUgPSAxOwotICB9Ci0gIENvZGUgY29kZSA9IDE7Ci0gIC8vIERldGFpbHMgYWJvdXQgdGhlIHN0YXR1cywgbWlnaHQgYmUgZGlzcGxheWVkIHRvIHVzZXIuCi0gIG9wdGlvbmFsIHN0cmluZyBtZXNzYWdlID0gMjsKLX0KLQotLy8gUmVwcmVzZW50cyBhbiBBbmRyb2lkIGNoZWNrb3V0IG9uIHVzZXIncyB3b3Jrc3RhdGlvbi4KLW1lc3NhZ2UgUmVwb1N0YXRlIHsKLSAgLy8gQWJzb2x1dGUgcGF0aCBmb3IgdGhlIGNoZWNrb3V0IGluIHRoZSB3b3Jrc3RhdGlvbi4KLSAgLy8gZS5nLiAvaG9tZS91c2VyL3dvcmsvYW5kcm9pZC8KLSAgc3RyaW5nIHJlcG9fZGlyID0gMTsKLSAgLy8gUmVsYXRpdmUgdG8gcmVwb19kaXIuCi0gIHJlcGVhdGVkIHN0cmluZyBhY3RpdmVfZmlsZV9wYXRoID0gMjsKLSAgLy8gUmVwb3NpdG9yeSByZWxhdGl2ZSBwYXRoIHRvIG91dHB1dCBkaXJlY3RvcnkgaW4gd29ya3N0YXRpb24uCi0gIHN0cmluZyBvdXRfZGlyID0gMzsKLSAgLy8gUmVwb3NpdG9yeSByZWxhdGl2ZSBwYXRoIHRvIGNvbXBpbGVfY29tbWFuZHMuanNvbiBpbiB3b3Jrc3RhdGlvbi4KLSAgc3RyaW5nIGNvbXBfZGJfcGF0aCA9IDQ7Ci19Ci0KLS8vIFByb3ZpZGVzIGFsbCB0aGUgdGFyZ2V0cyB0aGF0IGFyZSBwcmUtcmVxdWlzaXRpZXMgZm9yIHJ1bm5pbmcgbGFuZ3VhZ2UKLS8vIHNlcnZpY2VzIG9uIGFjdGl2ZV9maWxlX3BhdGhzLgotbWVzc2FnZSBEZXBzUmVzcG9uc2UgewotICAvLyBCdWlsZCBkZXBlbmRlbmNpZXMgb2YgYSBzb3VyY2UgZmlsZSBmb3IgcHJvdmlkaW5nIGxhbmd1YWdlIHNlcnZpY2VzLgotICBtZXNzYWdlIERlcHMgewotICAgIC8vIFJlbGF0aXZlIHRvIHJlcG9fZGlyLgotICAgIHN0cmluZyBzb3VyY2VfZmlsZSA9IDE7Ci0gICAgLy8gQnVpbGQgdGFyZ2V0IHRvIGV4ZWN1dGUgZm9yIGdlbmVyYXRpbmcgZGVwLgotICAgIHJlcGVhdGVkIHN0cmluZyBidWlsZF90YXJnZXQgPSAyOwotICAgIG9wdGlvbmFsIFN0YXR1cyBzdGF0dXMgPSAzOwotICB9Ci0gIHJlcGVhdGVkIERlcHMgZGVwcyA9IDE7Ci0gIG9wdGlvbmFsIFN0YXR1cyBzdGF0dXMgPSAyOwotfQotCi0vLyBSZXR1cm5zIGFsbCB0aGUgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IGZvciBwcm92aWRpbmcgbGFuZ3VhZ2Ugc2VydmljZXMgZm9yIHRoZQotLy8gYWN0aXZlIGZpbGVzLgogbWVzc2FnZSBHZW5lcmF0ZWRGaWxlIHsKLSAgLy8gUGF0aCB0byB0aGUgZmlsZSByZWxhdGl2ZSB0byBJZGVBbmFseXNpcy5idWlsZF9hcnRpZmFjdF9yb290LgorICAvLyBQYXRoIHRvIHRoZSBmaWxlIHJlbGF0aXZlIHRvIGJ1aWxkX291dF9kaXIuCiAgIHN0cmluZyBwYXRoID0gMTsKIAogICAvLyBUaGUgdGV4dCBvZiB0aGUgZ2VuZXJhdGVkIGZpbGUsIGlmIG5vdCBwcm92aWRlZCBjb250ZW50cyB3aWxsIGJlIHJlYWQKQEAgLTY4LDQ0ICsyOCwxMDAgQEAKICAgb3B0aW9uYWwgYnl0ZXMgY29udGVudHMgPSAyOwogfQogCi1tZXNzYWdlIFNvdXJjZUZpbGUgewotICAvLyBQYXRoIHRvIHRoZSBzb3VyY2UgZmlsZSByZWxhdGl2ZSB0byByZXBvc2l0b3J5IHJvb3QuCi0gIHN0cmluZyBwYXRoID0gMTsKLQotICAvLyBXb3JraW5nIGRpcmVjdG9yeSB1c2VkIGJ5IHRoZSBidWlsZCBzeXN0ZW0uIEFsbCB0aGUgcmVsYXRpdmUKLSAgLy8gcGF0aHMgaW4gY29tcGlsZXJfYXJndW1lbnRzIHNob3VsZCBiZSByZWxhdGl2ZSB0byB0aGlzIHBhdGguCi0gIC8vIFJlbGF0aXZlIHRvIHJlcG9zaXRvcnkgcm9vdC4KLSAgc3RyaW5nIHdvcmtpbmdfZGlyID0gMjsKLQotICAvLyBDb21waWxlciBhcmd1bWVudHMgdG8gY29tcGlsZSB0aGUgc291cmNlIGZpbGUuIElmIG11bHRpcGxlIHZhcmlhbnRzCi0gIC8vIG9mIHRoZSBtb2R1bGUgYmVpbmcgY29tcGlsZWQgYXJlIHBvc3NpYmxlLCB0aGUgcXVlcnkgc2NyaXB0IHdpbGwgY2hvb3NlCi0gIC8vIG9uZS4KLSAgcmVwZWF0ZWQgc3RyaW5nIGNvbXBpbGVyX2FyZ3VtZW50cyA9IDM7Ci0KLSAgLy8gQW55IGdlbmVyYXRlZCBmaWxlcyB0aGF0IGFyZSB1c2VkIGluIGNvbXBpbGluZyB0aGUgZmlsZS4KLSAgcmVwZWF0ZWQgR2VuZXJhdGVkRmlsZSBnZW5lcmF0ZWQgPSA0OwotCi0gIC8vIFBhdGhzIHRvIGFsbCBvZiB0aGUgc291cmNlcywgbGlrZSBidWlsZCBmaWxlcywgY29kZSBnZW5lcmF0b3JzLAotICAvLyBwcm90byBmaWxlcyBldGMuIHRoYXQgd2VyZSB1c2VkIGR1cmluZyBhbmFseXNpcy4gVXNlZCB0byBmaWd1cmUKLSAgLy8gb3V0IHdoZW4gYSBzZXQgb2YgYnVpbGQgYXJ0aWZhY3RzIGFyZSBzdGFsZSBhbmQgdGhlIHF1ZXJ5IHRvb2wKLSAgLy8gbXVzdCBiZSByZS1ydW4uCi0gIC8vIFJlbGF0aXZlIHRvIHJlcG9zaXRvcnkgcm9vdC4KLSAgcmVwZWF0ZWQgc3RyaW5nIGRlcHMgPSA1OwotCi0gIC8vIFJlcHJlc2VudHMgYW5hbHlzaXMgc3RhdHVzIGZvciB0aGlzIHBhcnRpY3VsYXIgZmlsZS4gZS5nLiBub3QgcGFydAotICAvLyBvZiB0aGUgYnVpbGQgZ3JhcGguCi0gIG9wdGlvbmFsIFN0YXR1cyBzdGF0dXMgPSA2OwotfQotCiBtZXNzYWdlIElkZUFuYWx5c2lzIHsKLSAgLy8gUGF0aCByZWxhdGl2ZSB0byByZXBvc2l0b3J5IHJvb3QsIGNvbnRhaW5pbmcgYWxsIHRoZSBhcnRpZmFjdHMKLSAgLy8gZ2VuZXJhdGVkIGJ5IHRoZSBidWlsZCBzeXN0ZW0uIEdlbmVyYXRlZEZpbGUucGF0aCBhcmUgYWx3YXlzCi0gIC8vIHJlbGF0aXZlIHRvIHRoaXMgZGlyZWN0b3J5LgotICBzdHJpbmcgYnVpbGRfYXJ0aWZhY3Rfcm9vdCA9IDE7CisgIC8vIERpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGJ1aWxkIG91dHB1dHMgZ2VuZXJhdGVkIGJ5IHRoZSBidWlsZCBzeXN0ZW0uCisgIC8vIFJlbGF0aXZlIHRvIHJlcG9zaXRvcnkgcm9vdC4KKyAgc3RyaW5nIGJ1aWxkX291dF9kaXIgPSAxOworICAvLyBXb3JraW5nIGRpcmVjdG9yeSB1c2VkIGJ5IHRoZSBidWlsZCBzeXN0ZW0uCisgIC8vIFJlbGF0aXZlIHRvIHJlcG9zaXRvcnkgcm9vdC4KKyAgc3RyaW5nIHdvcmtpbmdfZGlyID0gNDsKKyAgLy8gT25seSBzZXQgaWYgdGhlIHdob2xlIHF1ZXJ5IGZhaWxlZC4KKyAgb3B0aW9uYWwgQW5hbHlzaXNFcnJvciBlcnJvciA9IDU7CisgIC8vIExpc3Qgb2YgcmVzdWx0cywgb25lIHBlciBxdWVyaWVkIGZpbGUuCisgIHJlcGVhdGVkIEFuYWx5c2lzUmVzdWx0IHJlc3VsdHMgPSA2OworICAvLyBMaXN0IG9mIGJ1aWxkYWJsZSB1bml0cyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHJlZmVyZW5jZXMgYnkgdGhlIHJlc3VsdHMuCisgIHJlcGVhdGVkIEJ1aWxkYWJsZVVuaXQgdW5pdHMgPSA3OwogCi0gIHJlcGVhdGVkIFNvdXJjZUZpbGUgc291cmNlcyA9IDI7Ci0KLSAgLy8gU3RhdHVzIHJlcHJlc2VudGluZyBvdmVyYWxsIGFuYWx5c2lzLgotICAvLyBTaG91bGQgZmFpbCBvbmx5IHdoZW4gbm8gYW5hbHlzaXMgY2FuIGJlIHBlcmZvcm1lZC4KLSAgb3B0aW9uYWwgU3RhdHVzIHN0YXR1cyA9IDM7CisgIHJlc2VydmVkIDIsIDM7CiB9CisKK21lc3NhZ2UgQW5hbHlzaXNFcnJvciB7CisgIC8vIEh1bWFuIHJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuCisgIHN0cmluZyBlcnJvcl9tZXNzYWdlID0gMTsKK30KKworbWVzc2FnZSBBbmFseXNpc1Jlc3VsdCB7CisgIC8vIFBhdGggdG8gdGhlIHNvdXJjZSBmaWxlIHRoYXQgd2FzIHF1ZXJpZWQsIHJlbGF0aXZlIHRvIHJlcG9zaXRvcnkgcm9vdC4KKyAgc3RyaW5nIHNvdXJjZV9maWxlX3BhdGggPSAxOworICAvLyBJbmRpY2F0ZXMgdGhlIHN1Y2Nlc3MvZmFpbHVyZSBmb3IgdGhlIHF1ZXJ5LgorICBtZXNzYWdlIFN0YXR1cyB7CisgICAgZW51bSBDb2RlIHsKKyAgICAgIENPREVfVU5TUEVDSUZJRUQgPSAwOworICAgICAgQ09ERV9PSyA9IDE7CisgICAgICBDT0RFX05PVF9GT1VORCA9IDI7ICAvLyBubyB0YXJnZXQgb3IgbW9kdWxlIGZvdW5kIGZvciB0aGUgc291cmNlIGZpbGUuCisgICAgICBDT0RFX0JVSUxEX0ZBSUxFRCA9IDM7CisgICAgfQorICAgIENvZGUgY29kZSA9IDE7CisgICAgLy8gRGV0YWlscyBhYm91dCB0aGUgc3RhdHVzLCBtaWdodCBiZSBkaXNwbGF5ZWQgdG8gdXNlci4KKyAgICBvcHRpb25hbCBzdHJpbmcgc3RhdHVzX21lc3NhZ2UgPSAyOworICB9CisgIC8vIFJlcHJlc2VudHMgc3RhdHVzIGZvciB0aGlzIHJlc3VsdC4gZS5nLiBub3QgcGFydCBvZiB0aGUgYnVpbGQgZ3JhcGguCisgIFN0YXR1cyBzdGF0dXMgPSAyOworICAvLyBJRCBvZiBidWlsZGFibGUgdW5pdCB0aGF0IGNvbnRhaW5zIHRoZSBzb3VyY2UgZmlsZS4KKyAgLy8gVGhlIGlkZV9xdWVyeSBzY3JpcHQgY2FuIGNob29zZSB0aGUgbW9zdCByZWxldmFudCB1bml0IGZyb20gbXVsdGlwbGUKKyAgLy8gb3B0aW9ucy4KKyAgc3RyaW5nIHVuaXRfaWQgPSAzOworICAvLyBJbnZhbGlkYXRpb24gcnVsZSB0byBjaGVjayBpZiB0aGUgcmVzdWx0IGlzIHN0aWxsIHZhbGlkLgorICBJbnZhbGlkYXRpb24gaW52YWxpZGF0aW9uID0gNDsKK30KKworZW51bSBMYW5ndWFnZSB7CisgIExBTkdVQUdFX1VOU1BFQ0lGSUVEID0gMDsKKyAgTEFOR1VBR0VfSkFWQSA9IDE7ICAvLyBhbHNvIGluY2x1ZGVzIEtvdGxpbgorICBMQU5HVUFHRV9DUFAgPSAyOworfQorCittZXNzYWdlIEJ1aWxkYWJsZVVuaXQgeworICAvLyBVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgYnVpbGRhYmxlIHVuaXQuCisgIC8vCisgIC8vIEV4YW1wbGVzOgorICAvLyAgIC0gSmF2YTogbW9kdWxlIG9yIHRhcmdldCBuYW1lLCBlLmcuICJmcmFtZXdvcmstYmx1ZXRvb3RoIiBvcgorICAvLyAgICIvL3RoaXJkX3BhcnR5L2hhbWNyZXN0OmhhbWNyZXN0X2phdmEiCisgIC8vICAgLSBDKys6IHNvdXJjZSBmaWxlLCBlLmcuICJwYXRoL3RvL2ZpbGUuY2MiCisgIHN0cmluZyBpZCA9IDE7CisgIC8vIExhbmd1YWdlIG9mIHRoZSB1bml0LgorICAvLyBSZXF1aXJlZCBmb3IgYnVpbGRhYmxlIHVuaXRzIGRpcmVjdGx5IHJlZmVyZW5jZWQgYnkgdGhlIEFuYWx5c2lzUmVzdWx0LAorICAvLyBlLmcuIHRoZSB1bml0IGFzc29jaWF0ZWQgd2l0aCB0aGUgY29tcGlsYXRpb24gc3RhZ2UgZm9yIHRoZSBzb3VyY2UgZmlsZS4KKyAgTGFuZ3VhZ2UgbGFuZ3VhZ2UgPSAyOworICAvLyBTb3VyY2UgZmlsZXMgdGhhdCBhcmUgcGFydCBvZiB0aGlzIHVuaXQuCisgIC8vIFBhdGggdG8gdGhlIGZpbGUgcmVsYXRpdmUgdG8gd29ya2luZ19kaXIuCisgIHJlcGVhdGVkIHN0cmluZyBzb3VyY2VfZmlsZV9wYXRocyA9IDM7CisgIC8vIENvbXBpbGVyIGFyZ3VtZW50cyB0byBjb21waWxlIHRoZSBzb3VyY2UgZmlsZXMuCisgIHJlcGVhdGVkIHN0cmluZyBjb21waWxlcl9hcmd1bWVudHMgPSA0OworICAvLyBMaXN0IG9mIGdlbmVyYXRlZCBmaWxlcyBwcm9kdWNlZCBieSB0aGlzIHVuaXQuCisgIHJlcGVhdGVkIEdlbmVyYXRlZEZpbGUgZ2VuZXJhdGVkX2ZpbGVzID0gNTsKKyAgLy8gTGlzdCBvZiBvdGhlciBCdWlsZGFibGVVbml0cyB0aGlzIHVuaXQgZGVwZW5kIG9uLgorICByZXBlYXRlZCBzdHJpbmcgZGVwZW5kZW5jeV9pZHMgPSA2OworfQorCisvLyBJbnZhbGlkYXRpb24gcnVsZSB0byBjaGVjayBpZiB0aGUgcmVzdWx0IGlzIHN0aWxsIHZhbGlkLgorLy8gVGhpcyBzaG91bGQgY29udGFpbiBmaWxlcy9kaXJzIHRoYXQgYXJlIG5vdCBkaXJlY3RseSBwYXJ0IG9mIHRoZSBidWlsZCBncmFwaAorLy8gYnV0IHN0aWxsIGFmZmVjdCB0aGUgcmVzdWx0LiBGb3IgZXhhbXBsZSBCVUlMRCBmaWxlcywgZGlyZWN0b3J5IHRvIHRoZQorLy8gdG9vbGNoYWluIG9yIGNvbmZpZyBmaWxlcyBldGMuCittZXNzYWdlIEludmFsaWRhdGlvbiB7CisgIC8vIElmIGFueSBvZiB0aGVzZSBmaWxlcyBjaGFuZ2UgdGhlIHJlc3VsdCBtYXkgYmVjb21lIGludmFsaWQuCisgIC8vIFBhdGggdG8gdGhlIGZpbGUgcmVsYXRpdmUgdG8gcmVwb3NpdG9yeSByb290LgorICByZXBlYXRlZCBzdHJpbmcgZmlsZV9wYXRocyA9IDE7CisKKyAgbWVzc2FnZSBXaWxkY2FyZCB7CisgICAgLy8gUHJlZml4IG9mIHRoZSBmaWxlIHBhdGggKGUuZy4gInBhdGgvdG8vIikKKyAgICBvcHRpb25hbCBzdHJpbmcgcHJlZml4ID0gMTsKKyAgICAvLyBTdWZmaXggb2YgdGhlIGZpbGUgcGF0aCAoZS5nLiAiQW5kcm9pZC5icCIpCisgICAgb3B0aW9uYWwgc3RyaW5nIHN1ZmZpeCA9IDI7CisgICAgLy8gSWYgZmFsc2UsIHRoZSBwYXJ0IG9mIHRoZSBwYXRoIGJldHdlZW4gdGhlIGdpdmVuIGBwcmVmaXhgIGFuZCBgc3VmZml4YAorICAgIC8vIHNob3VsZCBub3QgY29udGFpbiBkaXJlY3Rvcnkgc2VwYXJhdG9ycyAoJy8nKS4KKyAgICBvcHRpb25hbCBib29sIGNhbl9jcm9zc19mb2xkZXIgPSAzOworICB9CisgIC8vIElmIGFueSBvZiB0aGVzZSBydWxlcyBtYXRjaCBhIGNoYW5nZWQgZmlsZSB0aGUgcmVzdWx0IG1heSBiZWNvbWUgaW52YWxpZC4KKyAgcmVwZWF0ZWQgV2lsZGNhcmQgd2lsZGNhcmRzID0gNDsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5X3Byb3RvL0FuZHJvaWQuYnAgYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL0FuZHJvaWQuYnAKc2ltaWxhcml0eSBpbmRleCA3NCUKY29weSBmcm9tIHRvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnlfcHJvdG8vQW5kcm9pZC5icApjb3B5IHRvIHRvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvQW5kcm9pZC5icAppbmRleCA3MGYxNWNkLi41MTkwMjEwIDEwMDY0NAotLS0gYS90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5X3Byb3RvL0FuZHJvaWQuYnAKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9BbmRyb2lkLmJwCkBAIC0xOCwxNiArMTgsMTQgQEAKICAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCiB9CiAKLWNjX2xpYnJhcnlfaG9zdF9zdGF0aWMgewotICAgIG5hbWU6ICJpZGVfcXVlcnlfcHJvdG8iLAorY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAiaWRlX3F1ZXJ5X3Byb2JlcnNjcmlwdF9jYyIsCiAgICAgc3JjczogWwotICAgICAgICAiaWRlX3F1ZXJ5LnByb3RvIiwKKyAgICAgICAgImdlbmVyYWwuY2MiLAorICAgICAgICAiZm9vLnByb3RvIiwKICAgICBdLAorICAgIGNmbGFnczogWyItV25vLXVudXNlZC1wYXJhbWV0ZXIiXSwKICAgICBwcm90bzogewotICAgICAgICBleHBvcnRfcHJvdG9faGVhZGVyczogdHJ1ZSwKLSAgICAgICAgdHlwZTogImZ1bGwiLAotICAgICAgICBjYW5vbmljYWxfcGF0aF9mcm9tX3Jvb3Q6IGZhbHNlLAorICAgICAgICB0eXBlOiAibGl0ZSIsCiAgICAgfSwKLSAgICBjb21waWxlX211bHRpbGliOiAiNjQiLAotICAgIHNoYXJlZF9saWJzOiBbImxpYnByb3RvYnVmLWNwcC1mdWxsIl0sCiB9CmRpZmYgLS1naXQgYS90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5X3Byb3RvL0FuZHJvaWQuYnAgYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2Zvby5wcm90bwpzaW1pbGFyaXR5IGluZGV4IDYyJQpjb3B5IGZyb20gdG9vbHMvaWRlX3F1ZXJ5L2lkZV9xdWVyeV9wcm90by9BbmRyb2lkLmJwCmNvcHkgdG8gdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9mb28ucHJvdG8KaW5kZXggNzBmMTVjZC4uNWE4NTE0NyAxMDA2NDQKLS0tIGEvdG9vbHMvaWRlX3F1ZXJ5L2lkZV9xdWVyeV9wcm90by9BbmRyb2lkLmJwCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvZm9vLnByb3RvCkBAIC0xNCwyMCArMTQsMTIgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgewotICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJBbmRyb2lkLUFwYWNoZS0yLjAiXSwKLX0KK3N5bnRheCA9ICJwcm90bzMiOwogCi1jY19saWJyYXJ5X2hvc3Rfc3RhdGljIHsKLSAgICBuYW1lOiAiaWRlX3F1ZXJ5X3Byb3RvIiwKLSAgICBzcmNzOiBbCi0gICAgICAgICJpZGVfcXVlcnkucHJvdG8iLAotICAgIF0sCi0gICAgcHJvdG86IHsKLSAgICAgICAgZXhwb3J0X3Byb3RvX2hlYWRlcnM6IHRydWUsCi0gICAgICAgIHR5cGU6ICJmdWxsIiwKLSAgICAgICAgY2Fub25pY2FsX3BhdGhfZnJvbV9yb290OiBmYWxzZSwKLSAgICB9LAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICI2NCIsCi0gICAgc2hhcmVkX2xpYnM6IFsibGlicHJvdG9idWYtY3BwLWZ1bGwiXSwKK3BhY2thZ2UgaWRlX3F1ZXJ5LnByb2Jlcl9zY3JpcHRzOworCittZXNzYWdlIFByb3RvTXNnIHsKKyAgLy8gVGVzdCBwcm90byBmaWVsZC4KKyAgaW50NjQgc29tZV9maWVsZCA9IDE7CisgIC8vICAgICAgICAgICAgICAgICAgIF4gc29tZV9maWVsZAogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9nZW5lcmFsLmNjIGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9nZW5lcmFsLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMDYzOWIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2dlbmVyYWwuY2MKQEAgLTAsMCArMSwxMTkgQEAKKy8vIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiZm9vLnBiLmgiCisKK3VzaW5nIGlkZV9xdWVyeTo6cHJvYmVyX3NjcmlwdHM6OlByb3RvTXNnOworCit2b2lkIEZvbyhpbnQgeCwgZG91YmxlIHkpIHt9CitmbG9hdCBGb28oZmxvYXQgeCwgZmxvYXQgeSkgeyByZXR1cm4gMC4wZjsgfQorCit2b2lkIFRlc3RDb21wbGV0aW9uKCkgeworICAvLyBUZXN0IGNvbXBsZXRpb24gb24gcHJvdG9zIGFuZCBmdXp6eSBtYXRjaGluZyBvZiBjb21wbGV0aW9uIHN1Z2dlc3Rpb25zLgorCisgIFByb3RvTXNnIGZvbzsKKworICAvLyBeCisKKyAgLy8gc3RlcAorICAvLyB3b3Jrc3BhY2Uud2FpdEZvclJlYWR5KCkKKyAgLy8gdHlwZSgiZiIpCisgIC8vIGNvbXBsZXRpb24udHJpZ2dlcigpCisgIC8vIGFzc2VydCBjb21wbGV0aW9uLml0ZW1zLmZpbHRlcihsYWJlbD0iZm9vIikKKyAgLy8gZGVsbGluZSgpCisgIC8vIHR5cGUoImZvby5zZiIpCisgIC8vIGNvbXBsZXRpb24udHJpZ2dlcigpCisgIC8vIGFzc2VydCBjb21wbGV0aW9uLml0ZW1zLmZpbHRlcigKKyAgLy8gIGxhYmVsPSJzb21lX2ZpZWxkLioiLAorICAvLyAgaW5zZXJ0VGV4dD0ic29tZV9maWVsZC4qIiwKKyAgLy8gKQorICAvLyBkZWxsaW5lKCkKKworICBzdGQ6OnZlY3RvcjxpbnQ+IHY7CisKKyAgLy8gXgorCisgIC8vIHN0ZXAKKyAgLy8gd29ya3NwYWNlLndhaXRGb3JSZWFkeSgpCisgIC8vIHR5cGUoInYucHVzaCIpCisgIC8vIGNvbXBsZXRpb24udHJpZ2dlcigpCisgIC8vIGFzc2VydCBjb21wbGV0aW9uLml0ZW1zLmZpbHRlcihsYWJlbD0icHVzaF9iYWNrLioiKQorICAvLyBkZWxsaW5lKCkKK30KKwordm9pZCBUZXN0TmF2aWdhdGlvbigpIHsKKyAgc3RkOjp2ZWN0b3I8aW50PiBpbnRzOworICAvLyAgICAgICAgICAgICAgIHwgICB8IGludHMKKyAgLy8gICAgICBeCisKKyAgLy8gc3RlcAorICAvLyA7IFRlc3QgbmF2aWdhdGlvbiB0byBkZWZpbml0aW9uIG9uIFNUTCB0eXBlcy4KKyAgLy8gd29ya3NwYWNlLndhaXRGb3JSZWFkeSgpCisgIC8vIG5hdmlnYXRpb24udHJpZ2dlcigpCisgIC8vIGFzc2VydCBuYXZpZ2F0aW9uLml0ZW1zLmZpbHRlcihwYXRoPSIuKi92ZWN0b3IiKQorCisgIGludHMucHVzaF9iYWNrKDApOworICAvLyBeCisKKyAgLy8gc3RlcAorICAvLyA7IFRlc3QgbmF2aWdhdGlvbiB0byBkZWZpbml0aW9uIG9uIGxvY2FsIHN5bWJvbHMuCisgIC8vIHdvcmtzcGFjZS53YWl0Rm9yUmVhZHkoKQorICAvLyBuYXZpZ2F0aW9uLnRyaWdnZXIoKQorICAvLyBhc3NlcnQgbmF2aWdhdGlvbi5pdGVtcy5maWx0ZXIocGF0aD0iLiovZ2VuZXJhbC5jYyIsIHJhbmdlPWludHMpCisKKyAgUHJvdG9Nc2cgbXNnOworICBtc2cuc2V0X3NvbWVfZmllbGQoMCk7CisgIC8vICAgICAgICAgIF4KKworICAvLyBzdGVwCisgIC8vIDsgVGVzdCBuYXZpZ2F0aW9uIHRvIGRlZmluaXRpb24gb24gcHJvdG8gZmllbGRzLiBXZSBkbyBub3QgY2hlY2sgZm9yIGEKKyAgLy8gOyBzcGVjaWZpYyB0YXJnZXQgYXMgaXQgY2FuIGJlIGluIGdlbmVyYXRlZCBjb2RlLgorICAvLyB3b3Jrc3BhY2Uud2FpdEZvclJlYWR5KCkKKyAgLy8gbmF2aWdhdGlvbi50cmlnZ2VyKCkKKyAgLy8gYXNzZXJ0IG5hdmlnYXRpb24uaXRlbXMKK30KKwordm9pZCBUZXN0UGFyYW1ldGVySW5mbygpIHsKKyAgc3RkOjp2ZWN0b3I8aW50PiB2OworICB2LnB1c2hfYmFjaygwKTsKKyAgLy8gICAgICAgICAgXgorCisgIC8vIHN0ZXAKKyAgLy8gOyBUZXN0IHRoZSBzaWduYXR1cmUgaGVscCBmb3IgU1RMIGZ1bmN0aW9ucy4gV2UgZG8gbm90IGNoZWNrIGZvciBhIHNwZWNpZmljCisgIC8vIDsgdGV4dCBhcyBpdCBjYW4gYmUgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50LgorICAvLyB3b3Jrc3BhY2Uud2FpdEZvclJlYWR5KCkKKyAgLy8gcGFyYW1pbmZvLnRyaWdnZXIoKQorICAvLyBhc3NlcnQgcGFyYW1pbmZvLml0ZW1zCisKKyAgRm9vKDAsIDAuMCk7CisgIC8vICAgICAgXgorCisgIC8vIHN0ZXAKKyAgLy8gOyBUZXN0IHRoZSBzaWduYXR1cmUgaGVscCBmb3IgdGhlIGZ1bmN0aW9uICdGb28nIGhhdmluZyB0d28gb3ZlcmxvYWRzLgorICAvLyB3b3Jrc3BhY2Uud2FpdEZvclJlYWR5KCkKKyAgLy8gcGFyYW1pbmZvLnRyaWdnZXIoKQorICAvLyBhc3NlcnQgcGFyYW1pbmZvLml0ZW1zLmZpbHRlcigKKyAgLy8gIGFjdGl2ZT10cnVlLAorICAvLyAgbGFiZWw9IkZvb1xcKGludCB4LCBkb3VibGUgeVxcKSAtPiB2b2lkIiwKKyAgLy8gIHNlbGVjdGlvbj0iZG91YmxlIHkiLAorICAvLyApCisgIC8vIGFzc2VydCBwYXJhbWluZm8uaXRlbXMuZmlsdGVyKAorICAvLyAgYWN0aXZlPWZhbHNlLAorICAvLyAgbGFiZWw9IkZvb1xcKGZsb2F0IHgsIGZsb2F0IHlcXCkgLT4gZmxvYXQiLAorICAvLyApCit9CisKK2ludCBtYWluKCkgeyByZXR1cm4gMDsgfQpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcF9zdWl0ZS50ZXh0cGIgYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwX3N1aXRlLnRleHRwYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mzc3MjY5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcF9zdWl0ZS50ZXh0cGIKQEAgLTAsMCArMSw1IEBACit0ZXN0czogeworICBuYW1lOiAiZ2VuZXJhbCIKKyAgc2NyaXB0czogImJ1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9nZW5lcmFsLmNjIgorICBzY3JpcHRzOiAiYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2Zvby5wcm90byIKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9pZGVfcXVlcnkub3V0IGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2lkZV9xdWVyeS5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q3Y2U2ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9pZGVfcXVlcnkub3V0CkBAIC0wLDAgKzEsMjM5IEBACisKKwNvdXQSlmEKKzhidWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvZ2VuZXJhbC5jYxo4cHJlYnVpbHRzL2NsYW5nL2hvc3QvbGludXgteDg2L2NsYW5nLXI1MjI4MTcvYmluL2NsYW5nKysaBy1tdGh1bWIaAy1PcxoULWZvbWl0LWZyYW1lLXBvaW50ZXIaBi1tbGx2bRoZLWVuYWJsZS1zaHJpbmstd3JhcD1mYWxzZRoDLU8yGgUtV2FsbBoHLVdleHRyYRoLLVdpbml0LXNlbGYaDy1XcG9pbnRlci1hcml0aBoYLVd1bmd1YXJkZWQtYXZhaWxhYmlsaXR5GhEtV2Vycm9yPWRhdGUtdGltZRoWLVdlcnJvcj1pbnQtY29udmVyc2lvbhoTLVdlcnJvcj1wcmFnbWEtcGFjaxomLVdlcnJvcj1wcmFnbWEtcGFjay1zdXNwaWNpb3VzLWluY2x1ZGUaGC1XZXJyb3I9c2l6ZW9mLWFycmF5LWRpdhoXLVdlcnJvcj1zdHJpbmctcGx1cy1pbnQaJy1XZXJyb3I9dW5yZWFjaGFibGUtY29kZS1sb29wLWluY3JlbWVudBoiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucxoTLVduby1jOTktZGVzaWduYXRvchoZLVduby1nbnUtZm9sZGluZy1jb25zdGFudBoiLVduby1pbmNvbnNpc3RlbnQtbWlzc2luZy1vdmVycmlkZRocLVduby1lcnJvcj1yZW9yZGVyLWluaXQtbGlzdBoWLVduby1yZW9yZGVyLWluaXQtbGlzdBoRLVduby1zaWduLWNvbXBhcmUaCy1Xbm8tdW51c2VkGgktREFORFJPSUQaCC1ETkRFQlVHGgctVURFQlVHGigtRF9fY29tcGlsZXJfb2Zmc2V0b2Y9X19idWlsdGluX29mZnNldG9mGiotRF9fQU5EUk9JRF9VTkFWQUlMQUJMRV9TWU1CT0xTX0FSRV9XRUFLX18aCS1mYWRkcnNpZxoZLWZkZWJ1Zy1kZWZhdWx0LXZlcnNpb249NRoTLWZjb2xvci1kaWFnbm9zdGljcxoRLWZmcC1jb250cmFjdD1vZmYaDy1mbm8tZXhjZXB0aW9ucxoULWZuby1zdHJpY3QtYWxpYXNpbmcaEi1mbWVzc2FnZS1sZW5ndGg9MBojLWZuby1yZWxheGVkLXRlbXBsYXRlLXRlbXBsYXRlLWFyZ3MaFy1nc2ltcGxlLXRlbXBsYXRlLW5hbWVzGggtZ3o9enN0ZBoWLW5vLWNhbm9uaWNhbC1wcmVmaXhlcxoRLVduby1lcnJvcj1mb3JtYXQaIi1mZGVidWctcHJlZml4LW1hcD0vcHJvYy9zZWxmL2N3ZD0aHC1mdHJpdmlhbC1hdXRvLXZhci1pbml0PXplcm8aAi1nGhMtZmZ1bmN0aW9uLXNlY3Rpb25zGg8tZmRhdGEtc2VjdGlvbnMaEC1mbm8tc2hvcnQtZW51bXMaDy1mdW53aW5kLXRhYmxlcxoYLWZzdGFjay1wcm90ZWN0b3Itc3Ryb25nGhEtV2EsLS1ub2V4ZWNzdGFjaxoTLURfRk9SVElGWV9TT1VSQ0U9MhoTLVdzdHJpY3QtYWxpYXNpbmc9MhoTLVdlcnJvcj1yZXR1cm4tdHlwZRoYLVdlcnJvcj1ub24tdmlydHVhbC1kdG9yGg8tV2Vycm9yPWFkZHJlc3MaFi1XZXJyb3I9c2VxdWVuY2UtcG9pbnQaFy1XZXJyb3I9Zm9ybWF0LXNlY3VyaXR5Ggwtbm9zdGRsaWJpbmMaGi1mZGVidWctaW5mby1mb3ItcHJvZmlsaW5nGgwtbXNvZnQtZmxvYXQaDi1tYXJjaD1hcm12Ny1hGhItbWZsb2F0LWFiaT1zb2Z0ZnAaCistbWZwdT1uZW9uGi8tSWJ1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcBqzAS1Jb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL2J1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9pZGVfcXVlcnlfcHJvYmVyc2NyaXB0X2NjL2FuZHJvaWRfYXJtX2FybXY3LWEtbmVvbi9nZW4vcHJvdG8vYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwGoUBLUlvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2lkZV9xdWVyeV9wcm9iZXJzY3JpcHRfY2MvYW5kcm9pZF9hcm1fYXJtdjctYS1uZW9uL2dlbi9wcm90bxoULURfX0xJQkNfQVBJX189MTAwMDAaFC1EX19MSUJNX0FQSV9fPTEwMDAwGhUtRF9fTElCRExfQVBJX189MTAwMDAaFy1JZXh0ZXJuYWwvcHJvdG9idWYvc3JjGlktSXByZWJ1aWx0cy9jbGFuZy9ob3N0L2xpbnV4LXg4Ni9jbGFuZy1yNTIyODE3L2FuZHJvaWRfbGliYysrL3BsYXRmb3JtL2FybS9pbmNsdWRlL2MrKy92MRo9LUlwcmVidWlsdHMvY2xhbmcvaG9zdC9saW51eC14ODYvY2xhbmctcjUyMjgxNy9pbmNsdWRlL2MrKy92MRogLUliaW9uaWMvbGliYy9hc3luY19zYWZlL2luY2x1ZGUaHy1Jc3lzdGVtL2xvZ2dpbmcvbGlibG9nL2luY2x1ZGUaJy1JYmlvbmljL2xpYmMvc3lzdGVtX3Byb3BlcnRpZXMvaW5jbHVkZRo8LUlzeXN0ZW0vY29yZS9wcm9wZXJ0eV9zZXJ2aWNlL2xpYnByb3BlcnR5aW5mb3BhcnNlci9pbmNsdWRlGggtaXN5c3RlbRoTYmlvbmljL2xpYmMvaW5jbHVkZRoILWlzeXN0ZW0aH2Jpb25pYy9saWJjL2tlcm5lbC91YXBpL2FzbS1hcm0aCC1pc3lzdGVtGhdiaW9uaWMvbGliYy9rZXJuZWwvdWFwaRoILWlzeXN0ZW0aH2Jpb25pYy9saWJjL2tlcm5lbC9hbmRyb2lkL3Njc2kaCC1pc3lzdGVtGh9iaW9uaWMvbGliYy9rZXJuZWwvYW5kcm9pZC91YXBpGgctdGFyZ2V0Gh1hcm12N2EtbGludXgtYW5kcm9pZGVhYmkxMDAwMBoQLURBTkRST0lEX1NUUklDVBoFLWZQSUUaBy1XZXJyb3IaFS1Xbm8tdW51c2VkLXBhcmFtZXRlchoZLURHT09HTEVfUFJPVE9CVUZfTk9fUlRUSRoWLVdpbXBsaWNpdC1mYWxsdGhyb3VnaBoqLURfTElCQ1BQX0VOQUJMRV9USFJFQURfU0FGRVRZX0FOTk9UQVRJT05TGhUtV25vLWdudS1pbmNsdWRlLW5leHQaGy1mdmlzaWJpbGl0eS1pbmxpbmVzLWhpZGRlbhoGLW1sbHZtGhktZW5hYmxlLXNocmluay13cmFwPWZhbHNlGgwtc3RkPWdudSsrMjAaCS1mbm8tcnR0aRoVLUlzeXN0ZW0vY29yZS9pbmNsdWRlGh8tSXN5c3RlbS9sb2dnaW5nL2xpYmxvZy9pbmNsdWRlGhwtSXN5c3RlbS9tZWRpYS9hdWRpby9pbmNsdWRlGh4tSWhhcmR3YXJlL2xpYmhhcmR3YXJlL2luY2x1ZGUaJS1JaGFyZHdhcmUvbGliaGFyZHdhcmVfbGVnYWN5L2luY2x1ZGUaFi1JaGFyZHdhcmUvcmlsL2luY2x1ZGUaGy1JZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZRoiLUlmcmFtZXdvcmtzL25hdGl2ZS9vcGVuZ2wvaW5jbHVkZRoXLUlmcmFtZXdvcmtzL2F2L2luY2x1ZGUaFi1XZXJyb3I9Ym9vbC1vcGVyYXRpb24aIC1XZXJyb3I9Zm9ybWF0LWluc3VmZmljaWVudC1hcmdzGiUtV2Vycm9yPWltcGxpY2l0LWludC1mbG9hdC1jb252ZXJzaW9uGhstV2Vycm9yPWludC1pbi1ib29sLWNvbnRleHQaGy1XZXJyb3I9aW50LXRvLXBvaW50ZXItY2FzdBobLVdlcnJvcj1wb2ludGVyLXRvLWludC1jYXN0GhctV2Vycm9yPXhvci11c2VkLWFzLXBvdxoeLVduby12b2lkLXBvaW50ZXItdG8tZW51bS1jYXN0Gh0tV25vLXZvaWQtcG9pbnRlci10by1pbnQtY2FzdBoYLVduby1wb2ludGVyLXRvLWludC1jYXN0GhYtV2Vycm9yPWZvcnRpZnktc291cmNlGhQtV25vLXVudXNlZC12YXJpYWJsZRofLVduby1taXNzaW5nLWZpZWxkLWluaXRpYWxpemVycxoTLVduby1wYWNrZWQtbm9uLXBvZBocLVdlcnJvcj1hZGRyZXNzLW9mLXRlbXBvcmFyeRorLVdlcnJvcj1pbmNvbXBhdGlibGUtZnVuY3Rpb24tcG9pbnRlci10eXBlcxoYLVdlcnJvcj1udWxsLWRlcmVmZXJlbmNlGhMtV2Vycm9yPXJldHVybi10eXBlGiItV25vLXRhdXRvbG9naWNhbC1jb25zdGFudC1jb21wYXJlGiQtV25vLXRhdXRvbG9naWNhbC10eXBlLWxpbWl0LWNvbXBhcmUaIi1Xbm8taW1wbGljaXQtaW50LWZsb2F0LWNvbnZlcnNpb24aIS1Xbm8tdGF1dG9sb2dpY2FsLW92ZXJsYXAtY29tcGFyZRoULVduby1kZXByZWNhdGVkLWNvcHkaGS1Xbm8tcmFuZ2UtbG9vcC1jb25zdHJ1Y3QaIi1Xbm8temVyby1hcy1udWxsLXBvaW50ZXItY29uc3RhbnQaKS1Xbm8tZGVwcmVjYXRlZC1hbm9uLWVudW0tZW51bS1jb252ZXJzaW9uGiQtV25vLWRlcHJlY2F0ZWQtZW51bS1lbnVtLWNvbnZlcnNpb24aFS1Xbm8tcGVzc2ltaXppbmctbW92ZRoeLVduby1ub24tYy10eXBlZGVmLWZvci1saW5rYWdlGhMtV25vLWFsaWduLW1pc21hdGNoGiItV25vLWVycm9yPXVudXNlZC1idXQtc2V0LXZhcmlhYmxlGiMtV25vLWVycm9yPXVudXNlZC1idXQtc2V0LXBhcmFtZXRlchoeLVduby1lcnJvcj1kZXByZWNhdGVkLWJ1aWx0aW5zGhUtV25vLWVycm9yPWRlcHJlY2F0ZWQaMi1Xbm8tZXJyb3I9c2luZ2xlLWJpdC1iaXRmaWVsZC1jb25zdGFudC1jb252ZXJzaW9uGiQtV25vLWVycm9yPWVudW0tY29uc3RleHByLWNvbnZlcnNpb24aGy1Xbm8tZXJyb3I9aW52YWxpZC1vZmZzZXRvZhomLVduby1kZXByZWNhdGVkLWR5bmFtaWMtZXhjZXB0aW9uLXNwZWMaOGJ1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9nZW5lcmFsLmNjItU/Ciu2AXNvb25nLy5pbnRlcm1lZGlhdGVzL2J1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9pZGVfcXVlcnlfcHJvYmVyc2NyaXB0X2NjL2FuZHJvaWRfYXJtX2FybXY3LWEtbmVvbi9nZW4vcHJvdG8vYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2Zvby5wYi5oEpk+Ly8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKKy8vIHNvdXJjZTogYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2Zvby5wcm90bworCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9JTkNMVURFRF9idWlsZF8yZm1ha2VfMmZ0b29sc18yZmlkZV81ZnF1ZXJ5XzJmcHJvYmVyXzVmc2NyaXB0c18yZmNwcF8yZmZvb18yZXByb3RvCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9JTkNMVURFRF9idWlsZF8yZm1ha2VfMmZ0b29sc18yZmlkZV81ZnF1ZXJ5XzJmcHJvYmVyXzVmc2NyaXB0c18yZmNwcF8yZmZvb18yZXByb3RvCisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorI2lmIFBST1RPQlVGX1ZFUlNJT04gPCAzMDIxMDAwCisjZXJyb3IgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgYSBuZXdlciB2ZXJzaW9uIG9mIHByb3RvYyB3aGljaCBpcworI2Vycm9yIGluY29tcGF0aWJsZSB3aXRoIHlvdXIgUHJvdG9jb2wgQnVmZmVyIGhlYWRlcnMuIFBsZWFzZSB1cGRhdGUKKyNlcnJvciB5b3VyIGhlYWRlcnMuCisjZW5kaWYKKyNpZiAzMDIxMDEyIDwgUFJPVE9CVUZfTUlOX1BST1RPQ19WRVJTSU9OCisjZXJyb3IgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgYW4gb2xkZXIgdmVyc2lvbiBvZiBwcm90b2Mgd2hpY2ggaXMKKyNlcnJvciBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIFByb3RvY29sIEJ1ZmZlciBoZWFkZXJzLiBQbGVhc2UKKyNlcnJvciByZWdlbmVyYXRlIHRoaXMgZmlsZSB3aXRoIGEgbmV3ZXIgdmVyc2lvbiBvZiBwcm90b2MuCisjZW5kaWYKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hc3RyaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWV0YWRhdGFfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4gIC8vIElXWVUgcHJhZ21hOiBleHBvcnQKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oPiAgLy8gSVdZVSBwcmFnbWE6IGV4cG9ydAorLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGluY2x1ZGVzKQorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisjZGVmaW5lIFBST1RPQlVGX0lOVEVSTkFMX0VYUE9SVF9idWlsZF8yZm1ha2VfMmZ0b29sc18yZmlkZV81ZnF1ZXJ5XzJmcHJvYmVyXzVmc2NyaXB0c18yZmNwcF8yZmZvb18yZXByb3RvCitQUk9UT0JVRl9OQU1FU1BBQ0VfT1BFTgorbmFtZXNwYWNlIGludGVybmFsIHsKK2NsYXNzIEFueU1ldGFkYXRhOworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCitQUk9UT0JVRl9OQU1FU1BBQ0VfQ0xPU0UKKworLy8gSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlsIC0tIGRvIG5vdCB1c2UgdGhlc2UgbWVtYmVycy4KK3N0cnVjdCBUYWJsZVN0cnVjdF9idWlsZF8yZm1ha2VfMmZ0b29sc18yZmlkZV81ZnF1ZXJ5XzJmcHJvYmVyXzVmc2NyaXB0c18yZmNwcF8yZmZvb18yZXByb3RvIHsKKyAgc3RhdGljIGNvbnN0IDo6dWludDMyX3Qgb2Zmc2V0c1tdOworfTsKK25hbWVzcGFjZSBpZGVfcXVlcnkgeworbmFtZXNwYWNlIHByb2Jlcl9zY3JpcHRzIHsKK2NsYXNzIFByb3RvTXNnOworc3RydWN0IFByb3RvTXNnRGVmYXVsdFR5cGVJbnRlcm5hbDsKK2V4dGVybiBQcm90b01zZ0RlZmF1bHRUeXBlSW50ZXJuYWwgX1Byb3RvTXNnX2RlZmF1bHRfaW5zdGFuY2VfOworfSAgLy8gbmFtZXNwYWNlIHByb2Jlcl9zY3JpcHRzCit9ICAvLyBuYW1lc3BhY2UgaWRlX3F1ZXJ5CitQUk9UT0JVRl9OQU1FU1BBQ0VfT1BFTgordGVtcGxhdGU8PiA6OmlkZV9xdWVyeTo6cHJvYmVyX3NjcmlwdHM6OlByb3RvTXNnKiBBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPDo6aWRlX3F1ZXJ5Ojpwcm9iZXJfc2NyaXB0czo6UHJvdG9Nc2c+KEFyZW5hKik7CitQUk9UT0JVRl9OQU1FU1BBQ0VfQ0xPU0UKK25hbWVzcGFjZSBpZGVfcXVlcnkgeworbmFtZXNwYWNlIHByb2Jlcl9zY3JpcHRzIHsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBQcm90b01zZyBmaW5hbCA6CisgICAgcHVibGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlTGl0ZSAvKiBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3NfZGVmaW5pdGlvbjppZGVfcXVlcnkucHJvYmVyX3NjcmlwdHMuUHJvdG9Nc2cpICovIHsKKyBwdWJsaWM6CisgIGlubGluZSBQcm90b01zZygpIDogUHJvdG9Nc2cobnVsbHB0cikge30KKyAgflByb3RvTXNnKCkgb3ZlcnJpZGU7CisgIGV4cGxpY2l0IFBST1RPQlVGX0NPTlNURVhQUiBQcm90b01zZyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOworCisgIFByb3RvTXNnKGNvbnN0IFByb3RvTXNnJiBmcm9tKTsKKyAgUHJvdG9Nc2coUHJvdG9Nc2cmJiBmcm9tKSBub2V4Y2VwdAorICAgIDogUHJvdG9Nc2coKSB7CisgICAgKnRoaXMgPSA6OnN0ZDo6bW92ZShmcm9tKTsKKyAgfQorCisgIGlubGluZSBQcm90b01zZyYgb3BlcmF0b3I9KGNvbnN0IFByb3RvTXNnJiBmcm9tKSB7CisgICAgaWYgKHRoaXMgPT0gJmZyb20pIHJldHVybiAqdGhpczsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgaW5saW5lIFByb3RvTXNnJiBvcGVyYXRvcj0oUHJvdG9Nc2cmJiBmcm9tKSBub2V4Y2VwdCB7CisgICAgaWYgKHRoaXMgPT0gJmZyb20pIHJldHVybiAqdGhpczsKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBmcm9tLkdldE93bmluZ0FyZW5hKCkKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICAgICAmJiBHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgKSB7CisgICAgICBJbnRlcm5hbFN3YXAoJmZyb20pOworICAgIH0gZWxzZSB7CisgICAgICBDb3B5RnJvbShmcm9tKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgc3RhdGljIGNvbnN0IFByb3RvTXNnJiBkZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiAqaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpOworICB9CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgUHJvdG9Nc2cqIGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUHJvdG9Nc2cqPigKKyAgICAgICAgICAgICAgICZfUHJvdG9Nc2dfZGVmYXVsdF9pbnN0YW5jZV8pOworICB9CisgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtJbmRleEluRmlsZU1lc3NhZ2VzID0KKyAgICAwOworCisgIGZyaWVuZCB2b2lkIHN3YXAoUHJvdG9Nc2cmIGEsIFByb3RvTXNnJiBiKSB7CisgICAgYS5Td2FwKCZiKTsKKyAgfQorICBpbmxpbmUgdm9pZCBTd2FwKFByb3RvTXNnKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyICYmCisgICAgICAgIEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgICNlbHNlICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICAgIEludGVybmFsU3dhcChvdGhlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6R2VuZXJpY1N3YXAodGhpcywgb3RoZXIpOworICAgIH0KKyAgfQorICB2b2lkIFVuc2FmZUFyZW5hU3dhcChQcm90b01zZyogb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICAgIEdPT0dMRV9EQ0hFQ0soR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSk7CisgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgfQorCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUHJvdG9Nc2cqIE5ldyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hKSBjb25zdCBmaW5hbCB7CisgICAgcmV0dXJuIENyZWF0ZU1heWJlTWVzc2FnZTxQcm90b01zZz4oYXJlbmEpOworICB9CisgIFByb3RvTXNnKiBOZXcoKSBjb25zdCB7CisgICAgcmV0dXJuIE5ldyhudWxscHRyKTsKKyAgfQorICB2b2lkIENoZWNrVHlwZUFuZE1lcmdlRnJvbShjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZUxpdGUmIGZyb20pICBmaW5hbDsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBQcm90b01zZyYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IFByb3RvTXNnJiBmcm9tKTsKKyAgUFJPVE9CVUZfQVRUUklCVVRFX1JFSU5JVElBTElaRVMgdm9pZCBDbGVhcigpIGZpbmFsOworICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdCBmaW5hbDsKKworICBzaXplX3QgQnl0ZVNpemVMb25nKCkgY29uc3QgZmluYWw7CisgIGNvbnN0IGNoYXIqIF9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0ciwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpQYXJzZUNvbnRleHQqIGN0eCkgZmluYWw7CisgIDo6dWludDhfdCogX0ludGVybmFsU2VyaWFsaXplKAorICAgICAgOjp1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCBmaW5hbDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCBmaW5hbCB7IHJldHVybiBfaW1wbF8uX2NhY2hlZF9zaXplXy5HZXQoKTsgfQorCisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3Rvcig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKKyAgdm9pZCBJbnRlcm5hbFN3YXAoUHJvdG9Nc2cqIG90aGVyKTsKKworICBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBbnlNZXRhZGF0YTsKKyAgc3RhdGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJpbmdQaWVjZSBGdWxsTWVzc2FnZU5hbWUoKSB7CisgICAgcmV0dXJuICJpZGVfcXVlcnkucHJvYmVyX3NjcmlwdHMuUHJvdG9Nc2ciOworICB9CisgIHByb3RlY3RlZDoKKyAgZXhwbGljaXQgUHJvdG9Nc2coOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkID0gZmFsc2UpOworICBwdWJsaWM6CisKKyAgc3RkOjpzdHJpbmcgR2V0VHlwZU5hbWUoKSBjb25zdCBmaW5hbDsKKworICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgZW51bSA6IGludCB7CisgICAga1NvbWVGaWVsZEZpZWxkTnVtYmVyID0gMSwKKyAgfTsKKyAgLy8gaW50NjQgc29tZV9maWVsZCA9IDE7CisgIHZvaWQgY2xlYXJfc29tZV9maWVsZCgpOworICA6OmludDY0X3Qgc29tZV9maWVsZCgpIGNvbnN0OworICB2b2lkIHNldF9zb21lX2ZpZWxkKDo6aW50NjRfdCB2YWx1ZSk7CisgIHByaXZhdGU6CisgIDo6aW50NjRfdCBfaW50ZXJuYWxfc29tZV9maWVsZCgpIGNvbnN0OworICB2b2lkIF9pbnRlcm5hbF9zZXRfc29tZV9maWVsZCg6OmludDY0X3QgdmFsdWUpOworICBwdWJsaWM6CisKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmlkZV9xdWVyeS5wcm9iZXJfc2NyaXB0cy5Qcm90b01zZykKKyBwcml2YXRlOgorICBjbGFzcyBfSW50ZXJuYWw7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmE6OkludGVybmFsSGVscGVyOworICB0eXBlZGVmIHZvaWQgSW50ZXJuYWxBcmVuYUNvbnN0cnVjdGFibGVfOworICB0eXBlZGVmIHZvaWQgRGVzdHJ1Y3RvclNraXBwYWJsZV87CisgIHN0cnVjdCBJbXBsXyB7CisgICAgOjppbnQ2NF90IHNvbWVfZmllbGRfOworICAgIG11dGFibGUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDYWNoZWRTaXplIF9jYWNoZWRfc2l6ZV87CisgIH07CisgIHVuaW9uIHsgSW1wbF8gX2ltcGxfOyB9OworICBmcmllbmQgc3RydWN0IDo6VGFibGVTdHJ1Y3RfYnVpbGRfMmZtYWtlXzJmdG9vbHNfMmZpZGVfNWZxdWVyeV8yZnByb2Jlcl81ZnNjcmlwdHNfMmZjcHBfMmZmb29fMmVwcm90bzsKK307CisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZkZWYgX19HTlVDX18KKyAgI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisgICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdzdHJpY3QtYWxpYXNpbmciCisjZW5kaWYgIC8vIF9fR05VQ19fCisvLyBQcm90b01zZworCisvLyBpbnQ2NCBzb21lX2ZpZWxkID0gMTsKK2lubGluZSB2b2lkIFByb3RvTXNnOjpjbGVhcl9zb21lX2ZpZWxkKCkgeworICBfaW1wbF8uc29tZV9maWVsZF8gPSA6OmludDY0X3R7MH07Cit9CitpbmxpbmUgOjppbnQ2NF90IFByb3RvTXNnOjpfaW50ZXJuYWxfc29tZV9maWVsZCgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5zb21lX2ZpZWxkXzsKK30KK2lubGluZSA6OmludDY0X3QgUHJvdG9Nc2c6OnNvbWVfZmllbGQoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6aWRlX3F1ZXJ5LnByb2Jlcl9zY3JpcHRzLlByb3RvTXNnLnNvbWVfZmllbGQpCisgIHJldHVybiBfaW50ZXJuYWxfc29tZV9maWVsZCgpOworfQoraW5saW5lIHZvaWQgUHJvdG9Nc2c6Ol9pbnRlcm5hbF9zZXRfc29tZV9maWVsZCg6OmludDY0X3QgdmFsdWUpIHsKKyAgCisgIF9pbXBsXy5zb21lX2ZpZWxkXyA9IHZhbHVlOworfQoraW5saW5lIHZvaWQgUHJvdG9Nc2c6OnNldF9zb21lX2ZpZWxkKDo6aW50NjRfdCB2YWx1ZSkgeworICBfaW50ZXJuYWxfc2V0X3NvbWVfZmllbGQodmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0OmlkZV9xdWVyeS5wcm9iZXJfc2NyaXB0cy5Qcm90b01zZy5zb21lX2ZpZWxkKQorfQorCisjaWZkZWYgX19HTlVDX18KKyAgI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZiAgLy8gX19HTlVDX18KKworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG5hbWVzcGFjZV9zY29wZSkKKworfSAgLy8gbmFtZXNwYWNlIHByb2Jlcl9zY3JpcHRzCit9ICAvLyBuYW1lc3BhY2UgaWRlX3F1ZXJ5CisKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnbG9iYWxfc2NvcGUpCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9JTkNMVURFRF9HT09HTEVfUFJPVE9CVUZfSU5DTFVERURfYnVpbGRfMmZtYWtlXzJmdG9vbHNfMmZpZGVfNWZxdWVyeV8yZnByb2Jlcl81ZnNjcmlwdHNfMmZjcHBfMmZmb29fMmVwcm90bwpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL3JlZ2VuLnNoIGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL3JlZ2VuLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJlZGZlNTMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvcmVnZW4uc2gKQEAgLTAsMCArMSwzMyBAQAorIyEvYmluL2Jhc2ggLWUKKworIyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBUaGlzIHNjcmlwdCBpcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBpZGVfcXVlcnkub3V0IGZpbGUuCisjCisjIFRoZSBpZGVfcXVlcnkub3V0IGZpbGUgaXMgYSBwcmUtY29tcHV0ZWQgcmVzdWx0IG9mIHJ1bm5pbmcgaWRlX3F1ZXJ5LnNoCisjIG9uIGEgc2V0IG9mIGZpbGVzLiBUaGlzIGFsbG93cyB0aGUgcHJvYmVyIHRvIHJ1biBpdHMgdGVzdHMgd2l0aG91dCBydW5uaW5nCisjIGlkZV9xdWVyeS5zaC4gVGhlIHByb2JlciBkb2Vzbid0IGNoZWNrLW91dCB0aGUgZnVsbCBzb3VyY2UgY29kZSwgc28gaXQKKyMgY2FuJ3QgcnVuIGlkZV9xdWVyeS5zaCBpdHNlbGYuCisKK2NkICQoZGlybmFtZSAkQkFTSF9TT1VSQ0UpCitzb3VyY2UgJChwd2QpLy4uLy4uLy4uL3NoZWxsX3V0aWxzLnNoCityZXF1aXJlX3RvcAorCitmaWxlc190b19idWlsZD0oCisgIGJ1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9nZW5lcmFsLmNjCispCisKK2NkICR7VE9QfQorYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5LnNoIC0tbHVuY2hfdGFyZ2V0PWFvc3BfYXJtLXRydW5rX3N0YWdpbmctZW5nICR7ZmlsZXNfdG9fYnVpbGRbQF19ID4gYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvaWRlX3F1ZXJ5Lm91dAo=