ZGlmZiAtLWdpdCBhL0FVVEhPUlMgYi9BVVRIT1JTCmluZGV4IDQxY2YzZmMuLmU4ZTJkYWYgMTAwNjQ0Ci0tLSBhL0FVVEhPUlMKKysrIGIvQVVUSE9SUwpAQCAtMTg1LDYgKzE4NSw3IEBACiBDbGVtZW50IFNjaGVlbGZlbGR0IFNrYXUgPGNsZW1lbnRza2F1QGdtYWlsLmNvbT4KIENsaW50b24gU3RhbGV5IDxjbGludHN0YWxleUBnbWFpbC5jb20+CiBDb25ub3IgUGVhcnNvbiA8Y2pwODIyQGdtYWlsLmNvbT4KK0NvbnJhZCBJcndpbiA8Y29ucmFkLmlyd2luQGdtYWlsLmNvbT4KIENyYWlnIFNjaGxlbnRlciA8Y3JhaWcuc2NobGVudGVyQGdtYWlsLmNvbT4KIENzYWJhIE9zenRyb2dvbsOhYyA8b3NzeS5zemVnZWRAZ21haWwuY29tPgogRGFlZ3l1IExlZSA8bmE3anVuOGdpQGdtYWlsLmNvbT4KZGlmZiAtLWdpdCBhL0JVSUxELmduIGIvQlVJTEQuZ24KaW5kZXggZjUyZGFhM2MuLmExMjQ5ZWQgMTAwNjQ0Ci0tLSBhL0JVSUxELmduCisrKyBiL0JVSUxELmduCkBAIC03MDYsNyArNzA2LDYgQEAKICAgICAgICIvL2NvbXBvbmVudHMvbWV0cmljczpzZXJpYWxpemF0aW9uIiwKICAgICAgICIvL2NvbXBvbmVudHMvcmFwcG9yOnVuaXRfdGVzdHMiLAogICAgICAgIi8vY29tcG9uZW50cy9zZXJ2aWNlcy9maWxlc3lzdGVtOmZpbGVzeXN0ZW1fc2VydmljZV91bml0dGVzdHMiLAotICAgICAgIi8vY29tcG9uZW50cy9zZXJ2aWNlcy9sZXZlbGRiOmxldmVsZGJfc2VydmljZV91bml0dGVzdHMiLAogICAgICAgIi8vY29tcG9uZW50cy9zZXNzaW9uczp1bml0X3Rlc3RzIiwKICAgICAgICIvL21lZGlhL2JsaW5rOm1lZGlhX2JsaW5rX3VuaXR0ZXN0cyIsCiAgICAgICAiLy9tZWRpYS9jYXN0OnVkcF9wcm94eSIsCmRpZmYgLS1naXQgYS9ERVBTIGIvREVQUwppbmRleCBhZGNhYzYwLi5hZGM3NTM5IDEwMDY0NAotLS0gYS9ERVBTCisrKyBiL0RFUFMKQEAgLTE2NywxMSArMTY3LDExIEBACiAgICMgVGhyZWUgbGluZXMgb2Ygbm9uLWNoYW5naW5nIGNvbW1lbnRzIHNvIHRoYXQKICAgIyB0aGUgY29tbWl0IHF1ZXVlIGNhbiBoYW5kbGUgQ0xzIHJvbGxpbmcgU2tpYQogICAjIGFuZCB3aGF0ZXZlciBlbHNlIHdpdGhvdXQgaW50ZXJmZXJlbmNlIGZyb20gZWFjaCBvdGhlci4KLSAgJ3NraWFfcmV2aXNpb24nOiAnZTI3YTUwM2EwYTIxYWYxNjdlNmExOWQyZTVjN2I3ZTEwMzk5NjRiZicsCisgICdza2lhX3JldmlzaW9uJzogJzBmYzliMzgyOWI0NzY3ODZmNGE1MGE4ZThlOTQ2OWNkMzA5YzE3ZWEnLAogICAjIFRocmVlIGxpbmVzIG9mIG5vbi1jaGFuZ2luZyBjb21tZW50cyBzbyB0aGF0CiAgICMgdGhlIGNvbW1pdCBxdWV1ZSBjYW4gaGFuZGxlIENMcyByb2xsaW5nIFY4CiAgICMgYW5kIHdoYXRldmVyIGVsc2Ugd2l0aG91dCBpbnRlcmZlcmVuY2UgZnJvbSBlYWNoIG90aGVyLgotICAndjhfcmV2aXNpb24nOiAnMGFmZjcxYzNlY2FhNDhkMzU5ODAxZTdmODg2NDc5M2YwNGFlZWUwNCcsCisgICd2OF9yZXZpc2lvbic6ICdkMGI4MTQwMWJhZmRmY2QyYzk2OTEzZTYzZmFhYTBjZTZiMzgyZmE4JywKICAgIyBUaHJlZSBsaW5lcyBvZiBub24tY2hhbmdpbmcgY29tbWVudHMgc28gdGhhdAogICAjIHRoZSBjb21taXQgcXVldWUgY2FuIGhhbmRsZSBDTHMgcm9sbGluZyBzd2FybWluZ19jbGllbnQKICAgIyBhbmQgd2hhdGV2ZXIgZWxzZSB3aXRob3V0IGludGVyZmVyZW5jZSBmcm9tIGVhY2ggb3RoZXIuCkBAIC0xNzksNyArMTc5LDcgQEAKICAgIyBUaHJlZSBsaW5lcyBvZiBub24tY2hhbmdpbmcgY29tbWVudHMgc28gdGhhdAogICAjIHRoZSBjb21taXQgcXVldWUgY2FuIGhhbmRsZSBDTHMgcm9sbGluZyBBTkdMRQogICAjIGFuZCB3aGF0ZXZlciBlbHNlIHdpdGhvdXQgaW50ZXJmZXJlbmNlIGZyb20gZWFjaCBvdGhlci4KLSAgJ2FuZ2xlX3JldmlzaW9uJzogJ2VmNGMyNWU3MWMzMjQ4N2ZlYWRlNWU5ZjhlNzljYjU2OTU0NWI4NDYnLAorICAnYW5nbGVfcmV2aXNpb24nOiAnYzVlMGFjNzU3YTExMmEyNGEwMTE4ZDQzNGU2NTJmZDdiNTU4ZTZhOCcsCiAgICMgVGhyZWUgbGluZXMgb2Ygbm9uLWNoYW5naW5nIGNvbW1lbnRzIHNvIHRoYXQKICAgIyB0aGUgY29tbWl0IHF1ZXVlIGNhbiBoYW5kbGUgQ0xzIHJvbGxpbmcgU3dpZnRTaGFkZXIKICAgIyBhbmQgd2hhdGV2ZXIgZWxzZSB3aXRob3V0IGludGVyZmVyZW5jZSBmcm9tIGVhY2ggb3RoZXIuCkBAIC0yMzAsNyArMjMwLDcgQEAKICAgIyBUaHJlZSBsaW5lcyBvZiBub24tY2hhbmdpbmcgY29tbWVudHMgc28gdGhhdAogICAjIHRoZSBjb21taXQgcXVldWUgY2FuIGhhbmRsZSBDTHMgcm9sbGluZyBjYXRhcHVsdAogICAjIGFuZCB3aGF0ZXZlciBlbHNlIHdpdGhvdXQgaW50ZXJmZXJlbmNlIGZyb20gZWFjaCBvdGhlci4KLSAgJ2NhdGFwdWx0X3JldmlzaW9uJzogJ2U3NGI1Yzk0NGVkYTg4NzdhZThkMTA1OGI0MjdmNjE2OTRiNTdmMjEnLAorICAnY2F0YXB1bHRfcmV2aXNpb24nOiAnZGYyNGI4YTM2MDk5NjJmYTJmNDkxZDUyYjhkNjhlY2U1YTU4NTcxNScsCiAgICMgVGhyZWUgbGluZXMgb2Ygbm9uLWNoYW5naW5nIGNvbW1lbnRzIHNvIHRoYXQKICAgIyB0aGUgY29tbWl0IHF1ZXVlIGNhbiBoYW5kbGUgQ0xzIHJvbGxpbmcgbGliRnV6emVyCiAgICMgYW5kIHdoYXRldmVyIGVsc2Ugd2l0aG91dCBpbnRlcmZlcmVuY2UgZnJvbSBlYWNoIG90aGVyLgpAQCAtMjk4LDExICsyOTgsMTEgQEAKICAgIyBUaHJlZSBsaW5lcyBvZiBub24tY2hhbmdpbmcgY29tbWVudHMgc28gdGhhdAogICAjIHRoZSBjb21taXQgcXVldWUgY2FuIGhhbmRsZSBDTHMgcm9sbGluZyBmZWVkCiAgICMgYW5kIHdoYXRldmVyIGVsc2Ugd2l0aG91dCBpbnRlcmZlcmVuY2UgZnJvbSBlYWNoIG90aGVyLgotICAnc2hhZGVyY19yZXZpc2lvbic6ICc2MjE2MDVjZTI2NDRkNTVhYjc0Y2IyN2E4YWZlZjk3ZGM0MGYxYjBmJywKKyAgJ3NoYWRlcmNfcmV2aXNpb24nOiAnNjVhZGNiNTA0ZDAyNGJiMjlmMGFkODI3OWI2YTIxNWQ1ZjY3OTgzMicsCiAgICMgVGhyZWUgbGluZXMgb2Ygbm9uLWNoYW5naW5nIGNvbW1lbnRzIHNvIHRoYXQKICAgIyB0aGUgY29tbWl0IHF1ZXVlIGNhbiBoYW5kbGUgQ0xzIHJvbGxpbmcgZmVlZAogICAjIGFuZCB3aGF0ZXZlciBlbHNlIHdpdGhvdXQgaW50ZXJmZXJlbmNlIGZyb20gZWFjaCBvdGhlci4KLSAgJ2Rhd25fcmV2aXNpb24nOiAnZTA5ODY5ZWQ1MjY4MThjYjAxYjRiZGJlNzI4ZmZlNjM4YWI1Zjg2MScsCisgICdkYXduX3JldmlzaW9uJzogJ2UxNmE5MDFmYjg1MzUxYTkzYjIyNGVhMWI3YjZkNjAzYTA3ZmQxY2MnLAogICAjIFRocmVlIGxpbmVzIG9mIG5vbi1jaGFuZ2luZyBjb21tZW50cyBzbyB0aGF0CiAgICMgdGhlIGNvbW1pdCBxdWV1ZSBjYW4gaGFuZGxlIENMcyByb2xsaW5nIGZlZWQKICAgIyBhbmQgd2hhdGV2ZXIgZWxzZSB3aXRob3V0IGludGVyZmVyZW5jZSBmcm9tIGVhY2ggb3RoZXIuCkBAIC01MTEsNyArNTExLDcgQEAKICAgfSwKIAogICAnc3JjL2lvcy90aGlyZF9wYXJ0eS9maXNoaG9vay9zcmMnOiB7Ci0gICAgICAndXJsJzogVmFyKCdjaHJvbWl1bV9naXQnKSArICcvZXh0ZXJuYWwvZ2l0aHViLmNvbS9mYWNlYm9vay9maXNoaG9vay5naXQnICsgJ0AnICsgJzgwZmU1OTM3MzZhYzIyMTYyZTc3Zjg5MWM3Y2JhNTA5NWNmMWNkNGUnLAorICAgICAgJ3VybCc6IFZhcignY2hyb21pdW1fZ2l0JykgKyAnL2V4dGVybmFsL2dpdGh1Yi5jb20vZmFjZWJvb2svZmlzaGhvb2suZ2l0JyArICdAJyArICc2NjMxNWE5YzI1MWVkZmU5MmY2NjlhZTJkZWVhYzBkNzUzNzRjOTQ4JywKICAgICAgICdjb25kaXRpb24nOiAnY2hlY2tvdXRfaW9zJywKICAgfSwKIApAQCAtODYyLDcgKzg2Miw3IEBACiAKICAgIyBCdWlsZCB0b29scyBmb3IgQ2hyb21lIE9TLiBOb3RlOiBUaGlzIGRlcGVuZHMgb24gdGhpcmRfcGFydHkvcHllbGZ0b29scy4KICAgJ3NyYy90aGlyZF9wYXJ0eS9jaHJvbWl0ZSc6IHsKLSAgICAgICd1cmwnOiBWYXIoJ2Nocm9taXVtX2dpdCcpICsgJy9jaHJvbWl1bW9zL2Nocm9taXRlLmdpdCcgKyAnQCcgKyAnZjg2Y2M2YmE2YTI5YTA1MzA0OTAxMjg2YmQ0NjFhMGM2ZDU5Mzg5YicsCisgICAgICAndXJsJzogVmFyKCdjaHJvbWl1bV9naXQnKSArICcvY2hyb21pdW1vcy9jaHJvbWl0ZS5naXQnICsgJ0AnICsgJ2E0NDE4MTVmNGRjMzdjMjE5NmE1YjIzMTgyMzAwYmQwMDk1Zjc2ZWUnLAogICAgICAgJ2NvbmRpdGlvbic6ICdjaGVja291dF9saW51eCcsCiAgIH0sCiAKQEAgLTg4Nyw3ICs4ODcsNyBAQAogICB9LAogCiAgICdzcmMvdGhpcmRfcGFydHkvZGVwb3RfdG9vbHMnOgotICAgIFZhcignY2hyb21pdW1fZ2l0JykgKyAnL2Nocm9taXVtL3Rvb2xzL2RlcG90X3Rvb2xzLmdpdCcgKyAnQCcgKyAnYmU4M2MzMTBlM2Q1NjAxYzQwMGQ4NTZhOTk2M2QxZjQxMzE4M2Q0MicsCisgICAgVmFyKCdjaHJvbWl1bV9naXQnKSArICcvY2hyb21pdW0vdG9vbHMvZGVwb3RfdG9vbHMuZ2l0JyArICdAJyArICczNDgxOTAyOTA0YTllMTAzZjgzOTFiYzVlMTczODVmNTM3Y2FkYmFiJywKIAogICAnc3JjL3RoaXJkX3BhcnR5L2RldnRvb2xzLW5vZGUtbW9kdWxlcyc6CiAgICAgVmFyKCdjaHJvbWl1bV9naXQnKSArICcvZXh0ZXJuYWwvZ2l0aHViLmNvbS9DaHJvbWVEZXZUb29scy9kZXZ0b29scy1ub2RlLW1vZHVsZXMnICsgJ0AnICsgVmFyKCdkZXZ0b29sc19ub2RlX21vZHVsZXNfcmV2aXNpb24nKSwKQEAgLTExNDYsNyArMTE0Niw3IEBACiAgIH0sCiAKICAgJ3NyYy90aGlyZF9wYXJ0eS9saWJqcGVnX3R1cmJvJzoKLSAgICBWYXIoJ2Nocm9taXVtX2dpdCcpICsgJy9jaHJvbWl1bS9kZXBzL2xpYmpwZWdfdHVyYm8uZ2l0JyArICdAJyArICczOGM2OTM1Njk0MjcxMjlmZDhjMjJmNGJiYTY3Njg1ZDdlMTc2MDk0JywKKyAgICBWYXIoJ2Nocm9taXVtX2dpdCcpICsgJy9jaHJvbWl1bS9kZXBzL2xpYmpwZWdfdHVyYm8uZ2l0JyArICdAJyArICc5ZDNiZjNlOTY4MDE1NmM0ODA0MWM4YjkwZmVjZTUwNGUzNTM5YTYxJywKIAogICAnc3JjL3RoaXJkX3BhcnR5L2xpYmxvdWlzL3NyYyc6IHsKICAgICAgICd1cmwnOiBWYXIoJ2Nocm9taXVtX2dpdCcpICsgJy9leHRlcm5hbC9saWJsb3Vpcy1naXRodWIuZ2l0JyArICdAJyArICc2N2FiOGU5NmNjMmY0ZGI3MGYyMjBmNzFjYmRlZTA5MDNlOGFiYWM2JywKQEAgLTEyODAsNyArMTI4MCw3IEBACiAgIH0sCiAKICAgJ3NyYy90aGlyZF9wYXJ0eS9wZXJmZXR0byc6Ci0gICAgVmFyKCdhbmRyb2lkX2dpdCcpICsgJy9wbGF0Zm9ybS9leHRlcm5hbC9wZXJmZXR0by5naXQnICsgJ0AnICsgJzgxNDI1ZGNhY2Y3NDE0ZjdlNWZkZDY2ZDI4MDIyNTZkMGM2MWFlZGYnLAorICAgIFZhcignYW5kcm9pZF9naXQnKSArICcvcGxhdGZvcm0vZXh0ZXJuYWwvcGVyZmV0dG8uZ2l0JyArICdAJyArICdhYTkxNzVkNjc2MWQ3ZmY3YTE3MmQ2MzdmZGE0YTE3ZGY2NDQ1M2I1JywKIAogICAnc3JjL3RoaXJkX3BhcnR5L3BlcmwnOiB7CiAgICAgICAndXJsJzogVmFyKCdjaHJvbWl1bV9naXQnKSArICcvY2hyb21pdW0vZGVwcy9wZXJsLmdpdCcgKyAnQCcgKyAnNmYzZTUwMjhlYjY1ZDBiNGM1ZmRkNzkyMTA2YWM0Yzg0ZWVlMWViMycsCkBAIC0xNDY3LDEwICsxNDY3LDEwIEBACiAgICAgVmFyKCdjaHJvbWl1bV9naXQnKSArICcvZXh0ZXJuYWwvZ2l0aHViLmNvbS9TZWxlbml1bUhRL3NlbGVuaXVtL3B5LmdpdCcgKyAnQCcgKyAnZDAwNDVlYzU3MGMxYTc3NjEyZGIzNWQxZTkyZjA1ZTFkMjdiNGQ1MycsCiAKICAgJ3NyYy90aGlyZF9wYXJ0eS93ZWJnbC9zcmMnOgotICAgIFZhcignY2hyb21pdW1fZ2l0JykgKyAnL2V4dGVybmFsL2tocm9ub3Nncm91cC93ZWJnbC5naXQnICsgJ0AnICsgJzdjNGU2N2ZmMTE3ZDZjNjQwZTZkZDE3OTg5YWZlMmZiN2RhN2VlY2InLAorICAgIFZhcignY2hyb21pdW1fZ2l0JykgKyAnL2V4dGVybmFsL2tocm9ub3Nncm91cC93ZWJnbC5naXQnICsgJ0AnICsgJzI3MDFjMTMwODM5ZWRiZWIyMjY3MzViMDc3NTk2NmI2NDIzZDllODMnLAogCiAgICdzcmMvdGhpcmRfcGFydHkvd2VicnRjJzoKLSAgICBWYXIoJ3dlYnJ0Y19naXQnKSArICcvc3JjLmdpdCcgKyAnQCcgKyAnOTU1ZjhmZDA0NzdlYTJkNDEzN2VmZjAzMjE4NGUwMmRlODUwODA0MycsCisgICAgVmFyKCd3ZWJydGNfZ2l0JykgKyAnL3NyYy5naXQnICsgJ0AnICsgJzA2NmMyYWI5MmY4MDM0ZWVhMzVmZmNlZDI4N2VjYWYwOGM5YmI1MDEnLAogCiAgICdzcmMvdGhpcmRfcGFydHkveGRnLXV0aWxzJzogewogICAgICAgJ3VybCc6IFZhcignY2hyb21pdW1fZ2l0JykgKyAnL2Nocm9taXVtL2RlcHMveGRnLXV0aWxzLmdpdCcgKyAnQCcgKyAnZDgwMjc0ZDU4NjliMTdiOGM5MDY3YTEwMjJlNDQxNmVlN2VkNWUwZCcsCkBAIC0xNTMyLDcgKzE1MzIsNyBAQAogICAgIFZhcignY2hyb21pdW1fZ2l0JykgKyAnL3Y4L3Y4LmdpdCcgKyAnQCcgKyAgVmFyKCd2OF9yZXZpc2lvbicpLAogCiAgICdzcmMtaW50ZXJuYWwnOiB7Ci0gICAgJ3VybCc6ICdodHRwczovL2Nocm9tZS1pbnRlcm5hbC5nb29nbGVzb3VyY2UuY29tL2Nocm9tZS9zcmMtaW50ZXJuYWwuZ2l0QGI5MTA2M2Q5OWM4OGI0N2Y3YzYwM2RhYTQyM2YyYTQ5OTEwNDQ1YmQnLAorICAgICd1cmwnOiAnaHR0cHM6Ly9jaHJvbWUtaW50ZXJuYWwuZ29vZ2xlc291cmNlLmNvbS9jaHJvbWUvc3JjLWludGVybmFsLmdpdEAwMWNmZGNiMjE3MzRmZjE1ZGZmNjk2NTUxYjdjZjRjNjcxNGUwOTU5JywKICAgICAnY29uZGl0aW9uJzogJ2NoZWNrb3V0X3NyY19pbnRlcm5hbCcsCiAgIH0sCiAKZGlmZiAtLWdpdCBhL2FuZHJvaWRfd2Vidmlldy9CVUlMRC5nbiBiL2FuZHJvaWRfd2Vidmlldy9CVUlMRC5nbgppbmRleCAyYmEyODNlZC4uMzhhMDQ4MDMgMTAwNjQ0Ci0tLSBhL2FuZHJvaWRfd2Vidmlldy9CVUlMRC5nbgorKysgYi9hbmRyb2lkX3dlYnZpZXcvQlVJTEQuZ24KQEAgLTU0NCw3ICs1NDQsNiBAQAogICAgICJqYXZhL3NyYy9vcmcvY2hyb21pdW0vYW5kcm9pZF93ZWJ2aWV3L0F3UXVvdGFNYW5hZ2VyQnJpZGdlLmphdmEiLAogICAgICJqYXZhL3NyYy9vcmcvY2hyb21pdW0vYW5kcm9pZF93ZWJ2aWV3L0F3UmVuZGVyUHJvY2Vzcy5qYXZhIiwKICAgICAiamF2YS9zcmMvb3JnL2Nocm9taXVtL2FuZHJvaWRfd2Vidmlldy9Bd1JlbmRlclByb2Nlc3NHb25lRGV0YWlsLmphdmEiLAotICAgICJqYXZhL3NyYy9vcmcvY2hyb21pdW0vYW5kcm9pZF93ZWJ2aWV3L0F3U2FmZUJyb3dzaW5nQ29uZmlnSGVscGVyLmphdmEiLAogICAgICJqYXZhL3NyYy9vcmcvY2hyb21pdW0vYW5kcm9pZF93ZWJ2aWV3L0F3U2Nyb2xsT2Zmc2V0TWFuYWdlci5qYXZhIiwKICAgICAiamF2YS9zcmMvb3JnL2Nocm9taXVtL2FuZHJvaWRfd2Vidmlldy9Bd1NlcnZpY2VXb3JrZXJDbGllbnQuamF2YSIsCiAgICAgImphdmEvc3JjL29yZy9jaHJvbWl1bS9hbmRyb2lkX3dlYnZpZXcvQXdTZXJ2aWNlV29ya2VyQ29udHJvbGxlci5qYXZhIiwKZGlmZiAtLWdpdCBhL2FuZHJvaWRfd2Vidmlldy9icm93c2VyL2F3X2Jyb3dzZXJfY29udGV4dF91bml0dGVzdC5jYyBiL2FuZHJvaWRfd2Vidmlldy9icm93c2VyL2F3X2Jyb3dzZXJfY29udGV4dF91bml0dGVzdC5jYwppbmRleCBhMjhhYzBmLi5iODg2OWQ0IDEwMDY0NAotLS0gYS9hbmRyb2lkX3dlYnZpZXcvYnJvd3Nlci9hd19icm93c2VyX2NvbnRleHRfdW5pdHRlc3QuY2MKKysrIGIvYW5kcm9pZF93ZWJ2aWV3L2Jyb3dzZXIvYXdfYnJvd3Nlcl9jb250ZXh0X3VuaXR0ZXN0LmNjCkBAIC01LDYgKzUsNyBAQAogI2luY2x1ZGUgImFuZHJvaWRfd2Vidmlldy9icm93c2VyL2F3X2Jyb3dzZXJfY29udGV4dC5oIgogI2luY2x1ZGUgImFuZHJvaWRfd2Vidmlldy9icm93c2VyL2F3X2Jyb3dzZXJfcHJvY2Vzcy5oIgogI2luY2x1ZGUgImFuZHJvaWRfd2Vidmlldy9icm93c2VyL2F3X2ZlYXR1cmVfbGlzdF9jcmVhdG9yLmgiCisjaW5jbHVkZSAiYmFzZS9ydW5fbG9vcC5oIgogI2luY2x1ZGUgImNvbnRlbnQvcHVibGljL2Jyb3dzZXIvYnJvd3Nlcl9jb250ZXh0LmgiCiAjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvdGVzdC9icm93c2VyX3Rhc2tfZW52aXJvbm1lbnQuaCIKICNpbmNsdWRlICJjb250ZW50L3B1YmxpYy90ZXN0L3Rlc3RfY29udGVudF9jbGllbnRfaW5pdGlhbGl6ZXIuaCIKQEAgLTI1LDcgKzI2LDE1IEBACiAgICAgYnJvd3Nlcl9wcm9jZXNzXyA9IG5ldyBBd0Jyb3dzZXJQcm9jZXNzKGF3X2ZlYXR1cmVfbGlzdF9jcmVhdG9yKTsKICAgfQogCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7IGRlbGV0ZSB0ZXN0X2NvbnRlbnRfY2xpZW50X2luaXRpYWxpemVyXzsgfQorICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgIC8vIERyYWluIHRoZSBtZXNzYWdlIHF1ZXVlIGJlZm9yZSBkZXN0cm95aW5nCisgICAgLy8gfHRlc3RfY29udGVudF9jbGllbnRfaW5pdGlhbGl6ZXJffCwgb3RoZXJ3aXNlIGEgcG9zdGVkIHRhc2sgbWF5IGNhbGwKKyAgICAvLyBjb250ZW50OjpHZXROZXR3b3JrQ29ubmVjdGlvblRyYWNrZXIoKSBhZnRlcgorICAgIC8vIFRlc3RDb250ZW50Q2xpZW50SW5pdGlhbGl6ZXIncyBkZXN0cnVjdG9yIHNldHMgaXQgdG8gbnVsbC4KKyAgICBiYXNlOjpSdW5Mb29wKCkuUnVuVW50aWxJZGxlKCk7CisgICAgZGVsZXRlIHRlc3RfY29udGVudF9jbGllbnRfaW5pdGlhbGl6ZXJfOworICAgIGRlbGV0ZSBicm93c2VyX3Byb2Nlc3NfOworICB9CiAKICAgLy8gQ3JlYXRlIHRoZSBUZXN0QnJvd3NlclRocmVhZHMuCiAgIGNvbnRlbnQ6OkJyb3dzZXJUYXNrRW52aXJvbm1lbnQgdGFza19lbnZpcm9ubWVudF87CmRpZmYgLS1naXQgYS9hbmRyb2lkX3dlYnZpZXcvamF2YS9zcmMvb3JnL2Nocm9taXVtL2FuZHJvaWRfd2Vidmlldy9Bd1NhZmVCcm93c2luZ0NvbmZpZ0hlbHBlci5qYXZhIGIvYW5kcm9pZF93ZWJ2aWV3L2phdmEvc3JjL29yZy9jaHJvbWl1bS9hbmRyb2lkX3dlYnZpZXcvQXdTYWZlQnJvd3NpbmdDb25maWdIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBkMjYwYmMuLjAwMDAwMDAKLS0tIGEvYW5kcm9pZF93ZWJ2aWV3L2phdmEvc3JjL29yZy9jaHJvbWl1bS9hbmRyb2lkX3dlYnZpZXcvQXdTYWZlQnJvd3NpbmdDb25maWdIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE5IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotcGFja2FnZSBvcmcuY2hyb21pdW0uYW5kcm9pZF93ZWJ2aWV3OwotCi0vKioKLSAqIFRlbXBvcmFyeSBhZGFwdGVyIHdoaWxlIGRvd25zdHJlYW0gZGVwZW5kcyBvbiB0aGlzIHBhY2thZ2UgbmFtZS4KLSAqLwotcHVibGljIGNsYXNzIEF3U2FmZUJyb3dzaW5nQ29uZmlnSGVscGVyIHsKLSAgICAvLyBEZXByZWNhdGVkOiByZW1vdmUgdGhpcyBvbmNlIGRvd25zdHJlYW0gbm8gbG9uZ2VyIGRlcGVuZHMgb24gQXdTYWZlQnJvd3NpbmdDb25maWdIZWxwZXIgaW4KLSAgICAvLyB0aGlzIHBhY2thZ2UgbmFtZS4KLSAgICBwdWJsaWMgc3RhdGljIEJvb2xlYW4gZ2V0U2FmZUJyb3dzaW5nVXNlck9wdEluKCkgewotICAgICAgICByZXR1cm4gb3JnLmNocm9taXVtLmFuZHJvaWRfd2Vidmlldy5zYWZlX2Jyb3dzaW5nLkF3U2FmZUJyb3dzaW5nQ29uZmlnSGVscGVyCi0gICAgICAgICAgICAgICAgLmdldFNhZmVCcm93c2luZ1VzZXJPcHRJbigpOwotICAgIH0KLQotICAgIC8vIE5vdCBtZWFudCB0byBiZSBpbnN0YW50aWF0ZWQuCi0gICAgcHJpdmF0ZSBBd1NhZmVCcm93c2luZ0NvbmZpZ0hlbHBlcigpIHt9Ci19CmRpZmYgLS1naXQgYS9hc2gvYXBwX2xpc3QvbW9kZWwvYXBwX2xpc3RfZm9sZGVyX2l0ZW0uaCBiL2FzaC9hcHBfbGlzdC9tb2RlbC9hcHBfbGlzdF9mb2xkZXJfaXRlbS5oCmluZGV4IDhhNDg2M2RlYy4uNGMxNDBkYyAxMDA2NDQKLS0tIGEvYXNoL2FwcF9saXN0L21vZGVsL2FwcF9saXN0X2ZvbGRlcl9pdGVtLmgKKysrIGIvYXNoL2FwcF9saXN0L21vZGVsL2FwcF9saXN0X2ZvbGRlcl9pdGVtLmgKQEAgLTExMiw3ICsxMTIsNyBAQAogCiAgIHN0ZDo6bWFwPGFzaDo6QXBwTGlzdENvbmZpZ1R5cGUsIHN0ZDo6dW5pcXVlX3B0cjxGb2xkZXJJbWFnZT4+IGZvbGRlcl9pbWFnZXNfOwogCi0gIFNjb3BlZE9ic2VydmVyPEFwcExpc3RDb25maWdQcm92aWRlciwgQXBwTGlzdEZvbGRlckl0ZW0+CisgIFNjb3BlZE9ic2VydmVyPEFwcExpc3RDb25maWdQcm92aWRlciwgQXBwTGlzdENvbmZpZ1Byb3ZpZGVyOjpPYnNlcnZlcj4KICAgICAgIGNvbmZpZ19wcm92aWRlcl9vYnNlcnZlcl97dGhpc307CiAKICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEFwcExpc3RGb2xkZXJJdGVtKTsKZGlmZiAtLWdpdCBhL2FzaC9hcHBfbGlzdC92aWV3cy9hcHBfbGlzdF9mb2xkZXJfdmlldy5jYyBiL2FzaC9hcHBfbGlzdC92aWV3cy9hcHBfbGlzdF9mb2xkZXJfdmlldy5jYwppbmRleCA1NTdjMjI3Li40Yzc5YjI2OCAxMDA2NDQKLS0tIGEvYXNoL2FwcF9saXN0L3ZpZXdzL2FwcF9saXN0X2ZvbGRlcl92aWV3LmNjCisrKyBiL2FzaC9hcHBfbGlzdC92aWV3cy9hcHBfbGlzdF9mb2xkZXJfdmlldy5jYwpAQCAtNzIxLDEwICs3MjEsMTMgQEAKICAgLy8gQ2FsY3VsYXRlIGJvdW5kcyBmb3IgcGFnZV9zd2l0Y2hlci4KICAgZ2Z4OjpSZWN0IHBhZ2Vfc3dpdGNoZXJfZnJhbWUocmVjdCk7CiAgIGdmeDo6U2l6ZSBwYWdlX3N3aXRjaGVyX3NpemUgPSBwYWdlX3N3aXRjaGVyXy0+R2V0UHJlZmVycmVkU2l6ZSgpOwotICBwYWdlX3N3aXRjaGVyX3NpemUuc2V0X2hlaWdodChHZXRBcHBMaXN0Q29uZmlnKCkuZm9sZGVyX2hlYWRlcl9oZWlnaHQoKSk7CiAgIHBhZ2Vfc3dpdGNoZXJfZnJhbWUuc2V0X3gocGFnZV9zd2l0Y2hlcl9mcmFtZS5yaWdodCgpIC0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlX3N3aXRjaGVyX3NpemUud2lkdGgoKSk7Ci0gIHBhZ2Vfc3dpdGNoZXJfZnJhbWUuc2V0X3koaGVhZGVyX2ZyYW1lLnkoKSk7CisgIC8vIFRoZSBwYWdlIHN3aXRjaGVyIGhhcyBhIGRpZmZlcmVudCBoZWlnaHQgdGhhbiB0aGUgZm9sZGVyIGhlYWRlciwgYnV0IGl0CisgIC8vIHN0aWxsIG5lZWRzIHRvIGJlIGFsaWduZWQgd2l0aCBpdC4KKyAgcGFnZV9zd2l0Y2hlcl9mcmFtZS5zZXRfeSgKKyAgICAgIGhlYWRlcl9mcmFtZS55KCkgLQorICAgICAgKHBhZ2Vfc3dpdGNoZXJfc2l6ZS5oZWlnaHQoKSAtIGhlYWRlcl9mcmFtZS5oZWlnaHQoKSkgLyAyKTsKICAgcGFnZV9zd2l0Y2hlcl9mcmFtZS5zZXRfc2l6ZShwYWdlX3N3aXRjaGVyX3NpemUpOwogICB2aWV3X21vZGVsXy0+c2V0X2lkZWFsX2JvdW5kcyhrSW5kZXhQYWdlU3dpdGNoZXIsIHBhZ2Vfc3dpdGNoZXJfZnJhbWUpOwogfQpkaWZmIC0tZ2l0IGEvYXNoL2FzaF9zdHJpbmdzLmdyZCBiL2FzaC9hc2hfc3RyaW5ncy5ncmQKaW5kZXggYTVlNDVmNi4uYjFiNzNmMDkgMTAwNjQ0Ci0tLSBhL2FzaC9hc2hfc3RyaW5ncy5ncmQKKysrIGIvYXNoL2FzaF9zdHJpbmdzLmdyZApAQCAtMTI5MSw2ICsxMjkxLDkgQEAKICAgICAgIDxtZXNzYWdlIG5hbWU9IklEU19BU0hfU1RBVFVTX1RSQVlfRVRIRVJORVRfQUREUkVTUyIgZGVzYz0iVGhlIGxhYmVsIGZvciB0aGUgbWFjIGFkZHJlc3Mgb2YgdGhlIGV0aGVybmV0IGRldmljZS4iPgogICAgICAgICBFdGhlcm5ldDogPHBoIG5hbWU9IkFERFJFU1MiPiQxPGV4PjAxOjIzOjQ1OjY3Ojg5OkFCPC9leD48L3BoPgogICAgICAgPC9tZXNzYWdlPgorICAgICAgPG1lc3NhZ2UgbmFtZT0iSURTX0FTSF9TVEFUVVNfVFJBWV9DRUxMVUxBUl9BRERSRVNTIiBkZXNjPSJUaGUgbGFiZWwgZm9yIHRoZSBtYWMgYWRkcmVzcyBvZiB0aGUgY2VsbHVsYXIgZGV2aWNlLiI+CisgICAgICAgIENlbGx1bGFyOiA8cGggbmFtZT0iQUREUkVTUyI+JDE8ZXg+MDE6MjM6NDU6Njc6ODk6QUI8L2V4PjwvcGg+CisgICAgICA8L21lc3NhZ2U+CiAgICAgICA8bWVzc2FnZSBuYW1lPSJJRFNfQVNIX1NUQVRVU19UUkFZX0lOSVRJQUxJWklOR19DRUxMVUxBUiIgZGVzYz0iTWVzc2FnZSBmb3IgdGhlIHN0YXR1cyBhcmVhIHdoZW4gaW5pdGlhbGl6aW5nIHRoZSBjZWxsdWxhciBkZXZpY2UuIj4KICAgICAgICAgSW5pdGlhbGl6aW5nLi4uCiAgICAgICA8L21lc3NhZ2U+CmRpZmYgLS1naXQgYS9hc2gvbG9naW4vdWkvbG9ja19zY3JlZW5fbWVkaWFfY29udHJvbHNfdmlldy5jYyBiL2FzaC9sb2dpbi91aS9sb2NrX3NjcmVlbl9tZWRpYV9jb250cm9sc192aWV3LmNjCmluZGV4IDJhZjQ4NDIuLjUzOTg2NWIgMTAwNjQ0Ci0tLSBhL2FzaC9sb2dpbi91aS9sb2NrX3NjcmVlbl9tZWRpYV9jb250cm9sc192aWV3LmNjCisrKyBiL2FzaC9sb2dpbi91aS9sb2NrX3NjcmVlbl9tZWRpYV9jb250cm9sc192aWV3LmNjCkBAIC01MzAsMTAgKzUzMCw4IEBACiAgIH0KIAogICAvLyBJZiB8bWVkaWFfc2Vzc2lvbl9pZF98IHJlc3VtZWQgd2hpbGUgd2FpdGluZywgZG9uJ3QgaGlkZSB0aGUgY29udHJvbHMuCi0gIGlmIChoaWRlX2NvbnRyb2xzX3RpbWVyXy0+SXNSdW5uaW5nKCkgJiYgcmVxdWVzdF9pZCA9PSBtZWRpYV9zZXNzaW9uX2lkXykgeworICBpZiAoaGlkZV9jb250cm9sc190aW1lcl8tPklzUnVubmluZygpICYmIHJlcXVlc3RfaWQgPT0gbWVkaWFfc2Vzc2lvbl9pZF8pCiAgICAgaGlkZV9jb250cm9sc190aW1lcl8tPlN0b3AoKTsKLSAgICBlbmFibGVkX2FjdGlvbnNfLmNsZWFyKCk7Ci0gIH0KIAogICAvLyBJZiB0aGlzIHNlc3Npb24gaXMgZGlmZmVyZW50IHRoYW4gdGhlIHByZXZpb3VzIG9uZSwgd2FpdCB0byBzZWUgaWYgdGhlCiAgIC8vIHByZXZpb3VzIG9uZSByZXN1bWVzIGJlZm9yZSBoaWRpbmcgdGhlIGNvbnRyb2xzLgpkaWZmIC0tZ2l0IGEvYXNoL2xvZ2luL3VpL21lZGlhX2NvbnRyb2xzX2hlYWRlcl92aWV3LmNjIGIvYXNoL2xvZ2luL3VpL21lZGlhX2NvbnRyb2xzX2hlYWRlcl92aWV3LmNjCmluZGV4IGM2NDdlMDQuLjg0NmQ4ZjUgMTAwNjQ0Ci0tLSBhL2FzaC9sb2dpbi91aS9tZWRpYV9jb250cm9sc19oZWFkZXJfdmlldy5jYworKysgYi9hc2gvbG9naW4vdWkvbWVkaWFfY29udHJvbHNfaGVhZGVyX3ZpZXcuY2MKQEAgLTI3LDEyICsyNywxMiBAQAogbmFtZXNwYWNlIHsKIAogY29uc3RleHByIGdmeDo6SW5zZXRzIGtIZWFkZXJWaWV3SW5zZXRzID0gZ2Z4OjpJbnNldHMoMCwgMCwgMTUsIDApOwotY29uc3RleHByIGludCBrSWNvblNpemUgPSAxODsKK2NvbnN0ZXhwciBpbnQga0ljb25WaWV3U2l6ZSA9IDE4OworY29uc3RleHByIGludCBrSWNvblNpemUgPSAxMjsKIGNvbnN0ZXhwciBpbnQga0hlYWRlclRleHRGb250U2l6ZSA9IDEyOwogY29uc3RleHByIGdmeDo6SW5zZXRzIGtJY29uUGFkZGluZyA9IGdmeDo6SW5zZXRzKDEsIDEsIDEsIDEpOwogY29uc3RleHByIGdmeDo6SW5zZXRzIGtBcHBOYW1lUGFkZGluZyA9IGdmeDo6SW5zZXRzKDAsIDEwLCAwLCAwKTsKIGNvbnN0ZXhwciBnZng6OlNpemUga0FwcE5hbWVQcmVmZXJyZWRTaXplID0gZ2Z4OjpTaXplKDIwMCwgMTApOwotY29uc3RleHByIGludCBrSWNvbkNvcm5lclJhZGl1cyA9IDE7CiBjb25zdGV4cHIgZ2Z4OjpTaXplIGtDbG9zZUJ1dHRvblNpemUgPSBnZng6OlNpemUoMjAsIDIwKTsKIGNvbnN0ZXhwciBpbnQga0Nsb3NlQnV0dG9uSWNvblNpemUgPSAxODsKIGNvbnN0ZXhwciBnZng6OlNpemUga1NwYWNlclByZWZlcnJlZFNpemUgPSBnZng6OlNpemUoNSwgNSk7CkBAIC01OCwxMiArNTgsMTIgQEAKICAgbGF5b3V0LT5TZXRJbnRlcmlvck1hcmdpbihrSGVhZGVyVmlld0luc2V0cyk7CiAKICAgYXV0byBhcHBfaWNvbl92aWV3ID0gc3RkOjptYWtlX3VuaXF1ZTx2aWV3czo6SW1hZ2VWaWV3PigpOworICBhcHBfaWNvbl92aWV3LT5TZXRQcmVmZXJyZWRTaXplKGdmeDo6U2l6ZShrSWNvblZpZXdTaXplLCBrSWNvblZpZXdTaXplKSk7CiAgIGFwcF9pY29uX3ZpZXctPlNldEltYWdlU2l6ZShnZng6OlNpemUoa0ljb25TaXplLCBrSWNvblNpemUpKTsKLSAgYXBwX2ljb25fdmlldy0+U2V0VmVydGljYWxBbGlnbm1lbnQodmlld3M6OkltYWdlVmlldzo6QWxpZ25tZW50OjprTGVhZGluZyk7Ci0gIGFwcF9pY29uX3ZpZXctPlNldEhvcml6b250YWxBbGlnbm1lbnQodmlld3M6OkltYWdlVmlldzo6QWxpZ25tZW50OjprTGVhZGluZyk7CiAgIGFwcF9pY29uX3ZpZXctPlNldEJvcmRlcih2aWV3czo6Q3JlYXRlRW1wdHlCb3JkZXIoa0ljb25QYWRkaW5nKSk7CiAgIGFwcF9pY29uX3ZpZXctPlNldEJhY2tncm91bmQoCi0gICAgICB2aWV3czo6Q3JlYXRlUm91bmRlZFJlY3RCYWNrZ3JvdW5kKFNLX0NvbG9yV0hJVEUsIGtJY29uQ29ybmVyUmFkaXVzKSk7CisgICAgICB2aWV3czo6Q3JlYXRlUm91bmRlZFJlY3RCYWNrZ3JvdW5kKFNLX0NvbG9yV0hJVEUsIGtJY29uVmlld1NpemUgLyAyKSk7CisKICAgYXBwX2ljb25fdmlld18gPSBBZGRDaGlsZFZpZXcoc3RkOjptb3ZlKGFwcF9pY29uX3ZpZXcpKTsKIAogICAvLyBGb250IGxpc3QgZm9yIHRleHQgdmlld3MuCmRpZmYgLS1naXQgYS9hc2gvcHVibGljL2NwcC9zaGVsZl9jb25maWcuaCBiL2FzaC9wdWJsaWMvY3BwL3NoZWxmX2NvbmZpZy5oCmluZGV4IDk5MDdhNzYuLmUzNmJjODZiNCAxMDA2NDQKLS0tIGEvYXNoL3B1YmxpYy9jcHAvc2hlbGZfY29uZmlnLmgKKysrIGIvYXNoL3B1YmxpYy9jcHAvc2hlbGZfY29uZmlnLmgKQEAgLTU4LDcgKzU4LDcgQEAKIAogICAvLyBPdmVydmlld09ic2VydmVyOgogICB2b2lkIE9uT3ZlcnZpZXdNb2RlU3RhcnRpbmdBbmltYXRpb25Db21wbGV0ZShib29sIGNhbmNlbGVkKSBvdmVycmlkZTsKLSAgdm9pZCBPbk92ZXJ2aWV3TW9kZUVuZGVkKCkgb3ZlcnJpZGU7CisgIHZvaWQgT25PdmVydmlld01vZGVFbmRpbmdBbmltYXRpb25Db21wbGV0ZShib29sIGNhbmNlbGVkKSBvdmVycmlkZTsKIAogICAvLyBTaXplIG9mIHRoZSBzaGVsZiB3aGVuIHZpc2libGUgKGhlaWdodCB3aGVuIHRoZSBzaGVsZiBpcyBob3Jpem9udGFsIGFuZAogICAvLyB3aWR0aCB3aGVuIHRoZSBzaGVsZiBpcyB2ZXJ0aWNhbCkuCmRpZmYgLS1naXQgYS9hc2gvc2hlbGYvc2hlbGZfY29uZmlnLmNjIGIvYXNoL3NoZWxmL3NoZWxmX2NvbmZpZy5jYwppbmRleCBlZDgxZjIwLi42ZTAyODRiIDEwMDY0NAotLS0gYS9hc2gvc2hlbGYvc2hlbGZfY29uZmlnLmNjCisrKyBiL2FzaC9zaGVsZi9zaGVsZl9jb25maWcuY2MKQEAgLTEyNiw3ICsxMjYsNyBAQAogICBPblNoZWxmQ29uZmlnVXBkYXRlZCgpOwogfQogCi12b2lkIFNoZWxmQ29uZmlnOjpPbk92ZXJ2aWV3TW9kZUVuZGVkKCkgewordm9pZCBTaGVsZkNvbmZpZzo6T25PdmVydmlld01vZGVFbmRpbmdBbmltYXRpb25Db21wbGV0ZShib29sIGNhbmNlbGVkKSB7CiAgIE9uU2hlbGZDb25maWdVcGRhdGVkKCk7CiB9CiAKQEAgLTIxMiw2ICsyMTIsNyBAQAogICBpZiAoIW92ZXJ2aWV3IHx8ICFzZXNzaW9uKQogICAgIHJldHVybiBmYWxzZTsKICAgcmV0dXJuICFvdmVydmlldy0+SW5PdmVydmlld1Nlc3Npb24oKSAmJgorICAgICAgICAgIW92ZXJ2aWV3LT5Jc0NvbXBsZXRpbmdTaHV0ZG93bkFuaW1hdGlvbnMoKSAmJgogICAgICAgICAgc2Vzc2lvbi0+R2V0U2Vzc2lvblN0YXRlKCkgPT0gc2Vzc2lvbl9tYW5hZ2VyOjpTZXNzaW9uU3RhdGU6OkFDVElWRSAmJgogICAgICAgICAgIWlzX2FwcF9saXN0X3Zpc2libGVfOwogfQpkaWZmIC0tZ2l0IGEvYXNoL3NoZWxmL3NoZWxmX2xheW91dF9tYW5hZ2VyLmNjIGIvYXNoL3NoZWxmL3NoZWxmX2xheW91dF9tYW5hZ2VyLmNjCmluZGV4IDJjNDU5ODUuLmUyZDQ5MGMgMTAwNjQ0Ci0tLSBhL2FzaC9zaGVsZi9zaGVsZl9sYXlvdXRfbWFuYWdlci5jYworKysgYi9hc2gvc2hlbGYvc2hlbGZfbGF5b3V0X21hbmFnZXIuY2MKQEAgLTcwNCw2ICs3MDQsMjEgQEAKICAgTWF5YmVVcGRhdGVTaGVsZkJhY2tncm91bmQoQW5pbWF0aW9uQ2hhbmdlVHlwZTo6QU5JTUFURSk7CiB9CiAKK3ZvaWQgU2hlbGZMYXlvdXRNYW5hZ2VyOjpPblNoZWxmSXRlbVNlbGVjdGVkKFNoZWxmQWN0aW9uIGFjdGlvbikgeworICBzd2l0Y2ggKGFjdGlvbikgeworICAgIGNhc2UgU0hFTEZfQUNUSU9OX05PTkU6CisgICAgY2FzZSBTSEVMRl9BQ1RJT05fQVBQX0xJU1RfU0hPV046CisgICAgY2FzZSBTSEVMRl9BQ1RJT05fQVBQX0xJU1RfRElTTUlTU0VEOgorICAgIGNhc2UgU0hFTEZfQUNUSU9OX1dJTkRPV19NSU5JTUlaRUQ6CisgICAgICBicmVhazsKKyAgICBjYXNlIFNIRUxGX0FDVElPTl9ORVdfV0lORE9XX0NSRUFURUQ6CisgICAgY2FzZSBTSEVMRl9BQ1RJT05fV0lORE9XX0FDVElWQVRFRDogeworICAgICAgYmFzZTo6QXV0b1Jlc2V0PGJvb2w+IHJlc2V0KCZzaG91bGRfaGlkZV9ob3RzZWF0XywgdHJ1ZSk7CisgICAgICBVcGRhdGVWaXNpYmlsaXR5U3RhdGUoKTsKKyAgICB9IGJyZWFrOworICB9Cit9CisKIHZvaWQgU2hlbGZMYXlvdXRNYW5hZ2VyOjpPbldpbmRvd1Jlc2l6ZWQoKSB7CiAgIExheW91dFNoZWxmKCk7CiB9CkBAIC0xMDQyLDcgKzEwNTcsOCBAQAogICAgICAgICAgICAgcmV0dXJuIEhvdHNlYXRTdGF0ZTo6a1Nob3duOwogICAgICAgICAgIH0KICAgICAgICAgICBpZiAodmlzaWJpbGl0eV9zdGF0ZSA9PSBTSEVMRl9BVVRPX0hJREUpIHsKLSAgICAgICAgICAgIGlmIChhdXRvX2hpZGVfc3RhdGUgPT0gU0hFTEZfQVVUT19ISURFX0hJRERFTikKKyAgICAgICAgICAgIGlmIChhdXRvX2hpZGVfc3RhdGUgPT0gU0hFTEZfQVVUT19ISURFX0hJRERFTiB8fAorICAgICAgICAgICAgICAgIHNob3VsZF9oaWRlX2hvdHNlYXRfKQogICAgICAgICAgICAgICByZXR1cm4gSG90c2VhdFN0YXRlOjprSGlkZGVuOwogICAgICAgICAgICAgcmV0dXJuIEhvdHNlYXRTdGF0ZTo6a0V4dGVuZGVkOwogICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2FzaC9zaGVsZi9zaGVsZl9sYXlvdXRfbWFuYWdlci5oIGIvYXNoL3NoZWxmL3NoZWxmX2xheW91dF9tYW5hZ2VyLmgKaW5kZXggZDVjZGMzNi4uNmFjYTgzMCAxMDA2NDQKLS0tIGEvYXNoL3NoZWxmL3NoZWxmX2xheW91dF9tYW5hZ2VyLmgKKysrIGIvYXNoL3NoZWxmL3NoZWxmX2xheW91dF9tYW5hZ2VyLmgKQEAgLTE2MSw2ICsxNjEsOSBAQAogICB2b2lkIFN1c3BlbmRWaXNpYmlsaXR5VXBkYXRlKCk7CiAgIHZvaWQgUmVzdW1lVmlzaWJsaXR5VXBkYXRlKCk7CiAKKyAgLy8gQ2FsbGVkIHdoZW4gU2hlbGZJdGVtcyBhcmUgaW50ZXJhY3RlZCB3aXRoIGluIHRoZSBzaGVsZi4KKyAgdm9pZCBPblNoZWxmSXRlbVNlbGVjdGVkKFNoZWxmQWN0aW9uIGFjdGlvbik7CisKICAgLy8gV21EZWZhdWx0TGF5b3V0TWFuYWdlcjoKICAgdm9pZCBPbldpbmRvd1Jlc2l6ZWQoKSBvdmVycmlkZTsKICAgdm9pZCBTZXRDaGlsZEJvdW5kcyhhdXJhOjpXaW5kb3cqIGNoaWxkLApkaWZmIC0tZ2l0IGEvYXNoL3NoZWxmL3NoZWxmX3ZpZXcuY2MgYi9hc2gvc2hlbGYvc2hlbGZfdmlldy5jYwppbmRleCBkOTU4NWJlZi4uZTI2ZmY1MSAxMDA2NDQKLS0tIGEvYXNoL3NoZWxmL3NoZWxmX3ZpZXcuY2MKKysrIGIvYXNoL3NoZWxmL3NoZWxmX3ZpZXcuY2MKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlICJhc2gvc2hlbGYvc2hlbGZfY29udGV4dF9tZW51X21vZGVsLmgiCiAjaW5jbHVkZSAiYXNoL3NoZWxmL3NoZWxmX2NvbnRyb2xsZXIuaCIKICNpbmNsdWRlICJhc2gvc2hlbGYvc2hlbGZfZm9jdXNfY3ljbGVyLmgiCisjaW5jbHVkZSAiYXNoL3NoZWxmL3NoZWxmX2xheW91dF9tYW5hZ2VyLmgiCiAjaW5jbHVkZSAiYXNoL3NoZWxmL3NoZWxmX21lbnVfbW9kZWxfYWRhcHRlci5oIgogI2luY2x1ZGUgImFzaC9zaGVsZi9zaGVsZl90b29sdGlwX21hbmFnZXIuaCIKICNpbmNsdWRlICJhc2gvc2hlbGYvc2hlbGZfd2lkZ2V0LmgiCkBAIC0zOTYsMTAgKzM5Nyw3IEBACiAgICAgcmV0dXJuIEdldE1pcnJvcmVkUmVjdChvdmVyZmxvd19idXR0b25fLT5ib3VuZHMoKSk7CiAKICAgY29uc3QgZ2Z4OjpSZWN0JiBpZGVhbF9ib3VuZHModmlld19tb2RlbF8tPmlkZWFsX2JvdW5kcyhpbmRleCkpOwotICB2aWV3czo6VmlldyogdmlldyA9IHZpZXdfbW9kZWxfLT52aWV3X2F0KGluZGV4KTsKLQotICBDSEVDS19FUShTaGVsZkFwcEJ1dHRvbjo6a1ZpZXdDbGFzc05hbWUsIHZpZXctPkdldENsYXNzTmFtZSgpKTsKLSAgU2hlbGZBcHBCdXR0b24qIGJ1dHRvbiA9IHN0YXRpY19jYXN0PFNoZWxmQXBwQnV0dG9uKj4odmlldyk7CisgIFNoZWxmQXBwQnV0dG9uKiBidXR0b24gPSBHZXRTaGVsZkFwcEJ1dHRvbihpZCk7CiAgIGdmeDo6UmVjdCBpY29uX2JvdW5kcyA9IGJ1dHRvbi0+R2V0SWNvbkJvdW5kcygpOwogICByZXR1cm4gZ2Z4OjpSZWN0KEdldE1pcnJvcmVkWFdpdGhXaWR0aEluVmlldygKICAgICAgICAgICAgICAgICAgICAgICAgaWRlYWxfYm91bmRzLngoKSArIGljb25fYm91bmRzLngoKSwgaWNvbl9ib3VuZHMud2lkdGgoKSksCkBAIC00NDksNiArNDQ3LDE2IEBACiAgICAgICAgICBvdmVyZmxvd19zaGVsZigpLT5TaG91bGRTaG93VG9vbHRpcEZvckNoaWxkVmlldyh2aWV3KTsKIH0KIAorU2hlbGZBcHBCdXR0b24qIFNoZWxmVmlldzo6R2V0U2hlbGZBcHBCdXR0b24oY29uc3QgU2hlbGZJRCYgaWQpIHsKKyAgY29uc3QgaW50IGluZGV4ID0gbW9kZWxfLT5JdGVtSW5kZXhCeUlEKGlkKTsKKyAgaWYgKGluZGV4IDwgMCkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICB2aWV3czo6VmlldyogY29uc3QgdmlldyA9IHZpZXdfbW9kZWxfLT52aWV3X2F0KGluZGV4KTsKKyAgRENIRUNLX0VRKFNoZWxmQXBwQnV0dG9uOjprVmlld0NsYXNzTmFtZSwgdmlldy0+R2V0Q2xhc3NOYW1lKCkpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8U2hlbGZBcHBCdXR0b24qPih2aWV3KTsKK30KKwogYm9vbCBTaGVsZlZpZXc6OlNob3VsZEhpZGVUb29sdGlwKGNvbnN0IGdmeDo6UG9pbnQmIGN1cnNvcl9sb2NhdGlvbikgY29uc3QgewogICAvLyBUaGVyZSBhcmUgdGhpbiBnYXBzIGJldHdlZW4gbGF1bmNoZXIgYnV0dG9ucyBidXQgdGhlIHRvb2x0aXAgc2hvdWxkbid0IGhpZGUKICAgLy8gaW4gdGhlIGdhcHMsIGJ1dCB0aGUgdG9vbHRpcCBzaG91bGQgaGlkZSBpZiB0aGUgbW91c2UgbW92ZWQgdG90YWxseSBvdXRzaWRlCkBAIC0yMjg0LDEwICsyMjkyLDcgQEAKICAgICByZXR1cm47CiAKICAgY29uc3QgU2hlbGZJdGVtIGl0ZW0gPSBtb2RlbF8tPml0ZW1zKClbaW5kZXhdOwotICB2aWV3czo6VmlldyogdmlldyA9IHZpZXdfbW9kZWxfLT52aWV3X2F0KGluZGV4KTsKLSAgQ0hFQ0tfRVEoU2hlbGZBcHBCdXR0b246OmtWaWV3Q2xhc3NOYW1lLCB2aWV3LT5HZXRDbGFzc05hbWUoKSk7Ci0gIC8vIFRPRE8obWFudWNvcm5ldCk6IEFkZCBhIGhlbHBlciB0byBnZXQgdGhlIGJ1dHRvbi4KLSAgU2hlbGZBcHBCdXR0b24qIGJ1dHRvbiA9IHN0YXRpY19jYXN0PFNoZWxmQXBwQnV0dG9uKj4odmlldyk7CisgIFNoZWxmQXBwQnV0dG9uKiBidXR0b24gPSBHZXRTaGVsZkFwcEJ1dHRvbihpZCk7CiAgIGJ1dHRvbi0+UmVmbGVjdEl0ZW1TdGF0dXMoaXRlbSk7CiAgIGJ1dHRvbi0+U2NoZWR1bGVQYWludCgpOwogfQpAQCAtMjM0Myw2ICsyMzQ4LDcgQEAKICAgICAgIGlua19kcm9wLT5BbmltYXRlVG9TdGF0ZSh2aWV3czo6SW5rRHJvcFN0YXRlOjpBQ1RJT05fVFJJR0dFUkVEKTsKICAgICB9CiAgIH0KKyAgc2hlbGZfLT5zaGVsZl9sYXlvdXRfbWFuYWdlcigpLT5PblNoZWxmSXRlbVNlbGVjdGVkKGFjdGlvbik7CiAgIHNjb3BlZF9yb290X3dpbmRvd19mb3JfbmV3X3dpbmRvd3NfLnJlc2V0KCk7CiB9CiAKZGlmZiAtLWdpdCBhL2FzaC9zaGVsZi9zaGVsZl92aWV3LmggYi9hc2gvc2hlbGYvc2hlbGZfdmlldy5oCmluZGV4IDNiMzUyZjNjLi5lMWMyZWZkIDEwMDY0NAotLS0gYS9hc2gvc2hlbGYvc2hlbGZfdmlldy5oCisrKyBiL2FzaC9zaGVsZi9zaGVsZl92aWV3LmgKQEAgLTI5MSw2ICsyOTEsOSBAQAogICAvLyBEaWZmZXJlbnQgZnJvbSBTaG91bGRTaG93VG9vbHRpcEZvclZpZXcsIHx2aWV3fCBoZXJlIG11c3QgYmUgYSBjaGlsZCB2aWV3LgogICBib29sIFNob3VsZFNob3dUb29sdGlwRm9yQ2hpbGRWaWV3KGNvbnN0IHZpZXdzOjpWaWV3KiBjaGlsZF92aWV3KSBjb25zdDsKIAorICAvLyBSZXR1cm5zIHRoZSBTaGVsZkFwcEJ1dHRvbiBhc3NvY2lhdGVkIHdpdGggfGlkfC4KKyAgU2hlbGZBcHBCdXR0b24qIEdldFNoZWxmQXBwQnV0dG9uKGNvbnN0IFNoZWxmSUQmIGlkKTsKKwogICAvLyBSZXR1cm4gdGhlIHZpZXcgbW9kZWwgZm9yIHRlc3QgcHVycG9zZXMuCiAgIGNvbnN0IHZpZXdzOjpWaWV3TW9kZWwqIHZpZXdfbW9kZWxfZm9yX3Rlc3QoKSBjb25zdCB7CiAgICAgcmV0dXJuIHZpZXdfbW9kZWxfLmdldCgpOwpkaWZmIC0tZ2l0IGEvYXNoL3N5c3RlbS9hY2Nlc3NpYmlsaXR5L2F1dG9jbGlja19zY3JvbGxfdmlldy5jYyBiL2FzaC9zeXN0ZW0vYWNjZXNzaWJpbGl0eS9hdXRvY2xpY2tfc2Nyb2xsX3ZpZXcuY2MKaW5kZXggM2RkNWFlMC4uYWI1YWFiNGEgMTAwNjQ0Ci0tLSBhL2FzaC9zeXN0ZW0vYWNjZXNzaWJpbGl0eS9hdXRvY2xpY2tfc2Nyb2xsX3ZpZXcuY2MKKysrIGIvYXNoL3N5c3RlbS9hY2Nlc3NpYmlsaXR5L2F1dG9jbGlja19zY3JvbGxfdmlldy5jYwpAQCAtMjMsNyArMjMsNiBAQAogI2luY2x1ZGUgInVpL3ZpZXdzL2FuaW1hdGlvbi9pbmtfZHJvcF9tYXNrLmgiCiAjaW5jbHVkZSAidWkvdmlld3MvbWFza2VkX3RhcmdldGVyX2RlbGVnYXRlLmgiCiAjaW5jbHVkZSAidWkvdmlld3Mvdmlldy5oIgotI2luY2x1ZGUgInVpL3ZpZXdzL3ZpZXdfY2xhc3NfcHJvcGVydGllcy5oIgogCiBuYW1lc3BhY2UgYXNoIHsKIApAQCAtMTU2LDEwICsxNTUsNiBAQAogICAgIH0KICAgICBTZXRQcmVmZXJyZWRTaXplKHNpemVfKTsKIAotICAgIGF1dG8gcGF0aCA9IHN0ZDo6bWFrZV91bmlxdWU8U2tQYXRoPigKLSAgICAgICAgQ3JlYXRlQ3VzdG9tU2hhcGVQYXRoKGdmeDo6UmVjdChHZXRQcmVmZXJyZWRTaXplKCkpKSk7Ci0gICAgU2V0UHJvcGVydHkodmlld3M6OmtIaWdobGlnaHRQYXRoS2V5LCBwYXRoLnJlbGVhc2UoKSk7Ci0KICAgICBzZXRfY2xpcF9wYXRoKENyZWF0ZUN1c3RvbVNoYXBlUGF0aChnZng6OlJlY3QoR2V0UHJlZmVycmVkU2l6ZSgpKSkpOwogICAgIFNldEV2ZW50VGFyZ2V0ZXIoc3RkOjptYWtlX3VuaXF1ZTx2aWV3czo6Vmlld1RhcmdldGVyPih0aGlzKSk7CiAgIH0KZGlmZiAtLWdpdCBhL2FzaC9zeXN0ZW0vbWVzc2FnZV9jZW50ZXIvc3RhY2tlZF9ub3RpZmljYXRpb25fYmFyLmNjIGIvYXNoL3N5c3RlbS9tZXNzYWdlX2NlbnRlci9zdGFja2VkX25vdGlmaWNhdGlvbl9iYXIuY2MKaW5kZXggMzZhM2NiMi4uYzcxNTRlMiAxMDA2NDQKLS0tIGEvYXNoL3N5c3RlbS9tZXNzYWdlX2NlbnRlci9zdGFja2VkX25vdGlmaWNhdGlvbl9iYXIuY2MKKysrIGIvYXNoL3N5c3RlbS9tZXNzYWdlX2NlbnRlci9zdGFja2VkX25vdGlmaWNhdGlvbl9iYXIuY2MKQEAgLTE4NiwxMyArMTg2LDYgQEAKIHZvaWQgU3RhY2tlZE5vdGlmaWNhdGlvbkJhcjo6QWRkTm90aWZpY2F0aW9uSWNvbigKICAgICBtZXNzYWdlX2NlbnRlcjo6Tm90aWZpY2F0aW9uKiBub3RpZmljYXRpb24sCiAgICAgYm9vbCBhdF9mcm9udCkgewotICBTa0NvbG9yIGFjY2VudF9jb2xvciA9IG5vdGlmaWNhdGlvbi0+YWNjZW50X2NvbG9yKCkgPT0gU0tfQ29sb3JUUkFOU1BBUkVOVAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG1lc3NhZ2VfY2VudGVyOjprTm90aWZpY2F0aW9uRGVmYXVsdEFjY2VudENvbG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbm90aWZpY2F0aW9uLT5hY2NlbnRfY29sb3IoKTsKLQotICBnZng6OkltYWdlIG1hc2tlZF9zbWFsbF9pY29uID0KLSAgICAgIG5vdGlmaWNhdGlvbi0+R2VuZXJhdGVNYXNrZWRTbWFsbEljb24oMTUsIGFjY2VudF9jb2xvcik7Ci0KICAgdmlld3M6OkltYWdlVmlldyogaWNvbl92aWV3XyA9IG5ldyB2aWV3czo6SW1hZ2VWaWV3KCk7CiAKICAgaWYgKGF0X2Zyb250KQpAQCAtMjAwLDEwICsxOTMsMTQgQEAKICAgZWxzZQogICAgIG5vdGlmaWNhdGlvbl9pY29uc19jb250YWluZXJfLT5BZGRDaGlsZFZpZXcoaWNvbl92aWV3Xyk7CiAKKyAgZ2Z4OjpJbWFnZSBtYXNrZWRfc21hbGxfaWNvbiA9IG5vdGlmaWNhdGlvbi0+R2VuZXJhdGVNYXNrZWRTbWFsbEljb24oCisgICAgICBrU3RhY2tlZE5vdGlmaWNhdGlvbkljb25TaXplLAorICAgICAgbWVzc2FnZV9jZW50ZXI6OmtOb3RpZmljYXRpb25EZWZhdWx0QWNjZW50Q29sb3IpOworCiAgIGlmIChtYXNrZWRfc21hbGxfaWNvbi5Jc0VtcHR5KCkpIHsKLSAgICBpY29uX3ZpZXdfLT5TZXRJbWFnZShnZng6OkNyZWF0ZVZlY3Rvckljb24obWVzc2FnZV9jZW50ZXI6OmtQcm9kdWN0SWNvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1N0YWNrZWROb3RpZmljYXRpb25JY29uU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZW50X2NvbG9yKSk7CisgICAgaWNvbl92aWV3Xy0+U2V0SW1hZ2UoZ2Z4OjpDcmVhdGVWZWN0b3JJY29uKAorICAgICAgICBtZXNzYWdlX2NlbnRlcjo6a1Byb2R1Y3RJY29uLCBrU3RhY2tlZE5vdGlmaWNhdGlvbkljb25TaXplLAorICAgICAgICBtZXNzYWdlX2NlbnRlcjo6a05vdGlmaWNhdGlvbkRlZmF1bHRBY2NlbnRDb2xvcikpOwogICB9IGVsc2UgewogICAgIGljb25fdmlld18tPlNldEltYWdlKG1hc2tlZF9zbWFsbF9pY29uLkFzSW1hZ2VTa2lhKCkpOwogICB9CmRpZmYgLS1naXQgYS9hc2gvc3lzdGVtL25ldHdvcmsvbmV0d29ya19zdGF0ZV9saXN0X2RldGFpbGVkX3ZpZXcuY2MgYi9hc2gvc3lzdGVtL25ldHdvcmsvbmV0d29ya19zdGF0ZV9saXN0X2RldGFpbGVkX3ZpZXcuY2MKaW5kZXggMTQ4Zjg2OC4uZGQ1NjA2MCAxMDA2NDQKLS0tIGEvYXNoL3N5c3RlbS9uZXR3b3JrL25ldHdvcmtfc3RhdGVfbGlzdF9kZXRhaWxlZF92aWV3LmNjCisrKyBiL2FzaC9zeXN0ZW0vbmV0d29yay9uZXR3b3JrX3N0YXRlX2xpc3RfZGV0YWlsZWRfdmlldy5jYwpAQCAtMzk4LDcgKzM5OCw3IEBACiAgICAgICBpcHY2X2FkZHJlc3MgPSBkZXZpY2UtPmlwdjZfYWRkcmVzcy0+VG9TdHJpbmcoKTsKICAgfQogCi0gIHN0ZDo6c3RyaW5nIGV0aGVybmV0X2FkZHJlc3MsIHdpZmlfYWRkcmVzczsKKyAgc3RkOjpzdHJpbmcgZXRoZXJuZXRfYWRkcmVzcywgd2lmaV9hZGRyZXNzLCBjZWxsdWxhcl9hZGRyZXNzOwogICBpZiAobGlzdF90eXBlXyA9PSBMSVNUX1RZUEVfTkVUV09SSykgewogICAgIGNvbnN0IERldmljZVN0YXRlUHJvcGVydGllcyogZXRoZXJuZXQgPQogICAgICAgICBtb2RlbF8tPkdldERldmljZShOZXR3b3JrVHlwZTo6a0V0aGVybmV0KTsKQEAgLTQwNywyMyArNDA3LDI5IEBACiAgICAgY29uc3QgRGV2aWNlU3RhdGVQcm9wZXJ0aWVzKiB3aWZpID0gbW9kZWxfLT5HZXREZXZpY2UoTmV0d29ya1R5cGU6OmtXaUZpKTsKICAgICBpZiAod2lmaSAmJiB3aWZpLT5tYWNfYWRkcmVzcykKICAgICAgIHdpZmlfYWRkcmVzcyA9ICp3aWZpLT5tYWNfYWRkcmVzczsKKyAgICBjb25zdCBEZXZpY2VTdGF0ZVByb3BlcnRpZXMqIGNlbGx1bGFyID0KKyAgICAgICAgbW9kZWxfLT5HZXREZXZpY2UoTmV0d29ya1R5cGU6OmtDZWxsdWxhcik7CisgICAgaWYgKGNlbGx1bGFyICYmIGNlbGx1bGFyLT5tYWNfYWRkcmVzcykKKyAgICAgIGNlbGx1bGFyX2FkZHJlc3MgPSAqY2VsbHVsYXItPm1hY19hZGRyZXNzOwogICB9CiAKICAgYmFzZTo6c3RyaW5nMTYgYnViYmxlX3RleHQ7Ci0gIGF1dG8gYWRkX2xpbmUgPSBbJmJ1YmJsZV90ZXh0XShjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcywgaW50IGlkcykgewotICAgIGlmICghYWRkcmVzcy5lbXB0eSgpKSB7Ci0gICAgICBpZiAoIWJ1YmJsZV90ZXh0LmVtcHR5KCkpCi0gICAgICAgIGJ1YmJsZV90ZXh0ICs9IGJhc2U6OkFTQ0lJVG9VVEYxNigiXG4iKTsKKyAgYXV0byBtYXliZV9hZGRfbWFjX2FkZHJlc3MgPSBbJmJ1YmJsZV90ZXh0XShjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWRzKSB7CisgICAgaWYgKGFkZHJlc3MuZW1wdHkoKSkKKyAgICAgIHJldHVybjsKIAotICAgICAgYnViYmxlX3RleHQgKz0KLSAgICAgICAgICBsMTBuX3V0aWw6OkdldFN0cmluZ0ZVVEYxNihpZHMsIGJhc2U6OlVURjhUb1VURjE2KGFkZHJlc3MpKTsKLSAgICB9CisgICAgaWYgKCFidWJibGVfdGV4dC5lbXB0eSgpKQorICAgICAgYnViYmxlX3RleHQgKz0gYmFzZTo6QVNDSUlUb1VURjE2KCJcbiIpOworCisgICAgYnViYmxlX3RleHQgKz0gbDEwbl91dGlsOjpHZXRTdHJpbmdGVVRGMTYoaWRzLCBiYXNlOjpVVEY4VG9VVEYxNihhZGRyZXNzKSk7CiAgIH07CiAKLSAgYWRkX2xpbmUoaXB2NF9hZGRyZXNzLCBJRFNfQVNIX1NUQVRVU19UUkFZX0lQX0FERFJFU1MpOwotICBhZGRfbGluZShpcHY2X2FkZHJlc3MsIElEU19BU0hfU1RBVFVTX1RSQVlfSVBWNl9BRERSRVNTKTsKLSAgYWRkX2xpbmUoZXRoZXJuZXRfYWRkcmVzcywgSURTX0FTSF9TVEFUVVNfVFJBWV9FVEhFUk5FVF9BRERSRVNTKTsKLSAgYWRkX2xpbmUod2lmaV9hZGRyZXNzLCBJRFNfQVNIX1NUQVRVU19UUkFZX1dJRklfQUREUkVTUyk7CisgIG1heWJlX2FkZF9tYWNfYWRkcmVzcyhpcHY0X2FkZHJlc3MsIElEU19BU0hfU1RBVFVTX1RSQVlfSVBfQUREUkVTUyk7CisgIG1heWJlX2FkZF9tYWNfYWRkcmVzcyhpcHY2X2FkZHJlc3MsIElEU19BU0hfU1RBVFVTX1RSQVlfSVBWNl9BRERSRVNTKTsKKyAgbWF5YmVfYWRkX21hY19hZGRyZXNzKGV0aGVybmV0X2FkZHJlc3MsIElEU19BU0hfU1RBVFVTX1RSQVlfRVRIRVJORVRfQUREUkVTUyk7CisgIG1heWJlX2FkZF9tYWNfYWRkcmVzcyh3aWZpX2FkZHJlc3MsIElEU19BU0hfU1RBVFVTX1RSQVlfV0lGSV9BRERSRVNTKTsKKyAgbWF5YmVfYWRkX21hY19hZGRyZXNzKGNlbGx1bGFyX2FkZHJlc3MsIElEU19BU0hfU1RBVFVTX1RSQVlfQ0VMTFVMQVJfQUREUkVTUyk7CiAKICAgLy8gQXZvaWQgYW4gZW1wdHkgYnViYmxlIGluIHRoZSB1bmxpa2VseSBldmVudCB0aGF0IHRoZXJlIGlzIG5vIG5ldHdvcmsKICAgLy8gaW5mb3JtYXRpb24gYXQgYWxsLgpkaWZmIC0tZ2l0IGEvYXNoL3N5c3RlbS90cmF5L2RldGFpbGVkX3ZpZXdfZGVsZWdhdGUuY2MgYi9hc2gvc3lzdGVtL3RyYXkvZGV0YWlsZWRfdmlld19kZWxlZ2F0ZS5jYwppbmRleCA5NjU0ZGI2Li5hZDY5NzRlIDEwMDY0NAotLS0gYS9hc2gvc3lzdGVtL3RyYXkvZGV0YWlsZWRfdmlld19kZWxlZ2F0ZS5jYworKysgYi9hc2gvc3lzdGVtL3RyYXkvZGV0YWlsZWRfdmlld19kZWxlZ2F0ZS5jYwpAQCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgInVpL3ZpZXdzL2NvbnRyb2xzL2xhYmVsLmgiCiAjaW5jbHVkZSAidWkvdmlld3MvY29udHJvbHMvc2VwYXJhdG9yLmgiCiAjaW5jbHVkZSAidWkvdmlld3MvbGF5b3V0L2JveF9sYXlvdXQuaCIKLSNpbmNsdWRlICJ1aS92aWV3cy92aWV3X2NsYXNzX3Byb3BlcnRpZXMuaCIKIAogbmFtZXNwYWNlIGFzaCB7CiAKQEAgLTc3LDEwICs3Niw2IEBACiAgICAgICAgIGwxMG5fdXRpbDo6R2V0U3RyaW5nVVRGMTYoSURTX0FTSF9TVEFUVVNfVFJBWV9QUkVWSU9VU19NRU5VKSk7CiAgICAgU2V0Qm9yZGVyKHZpZXdzOjpDcmVhdGVFbXB0eUJvcmRlcigKICAgICAgICAgZ2Z4OjpJbnNldHMoKGtUcmF5SXRlbVNpemUgLSBpbWFnZS53aWR0aCgpKSAvIDIpKSk7Ci0KLSAgICBhdXRvIHBhdGggPSBzdGQ6Om1ha2VfdW5pcXVlPFNrUGF0aD4oCi0gICAgICAgIENyZWF0ZUN1c3RvbVNoYXBlUGF0aChnZng6OlJlY3QoQ2FsY3VsYXRlUHJlZmVycmVkU2l6ZSgpKSkpOwotICAgIFNldFByb3BlcnR5KHZpZXdzOjprSGlnaGxpZ2h0UGF0aEtleSwgcGF0aC5yZWxlYXNlKCkpOwogICB9CiAKICAgfkJhY2tCdXR0b24oKSBvdmVycmlkZSA9IGRlZmF1bHQ7CmRpZmYgLS1naXQgYS9hc2gvc3lzdGVtL3VuaWZpZWQvY29sbGFwc2VfYnV0dG9uLmNjIGIvYXNoL3N5c3RlbS91bmlmaWVkL2NvbGxhcHNlX2J1dHRvbi5jYwppbmRleCA2OTljMjg0Li5jODEzNjkyYiAxMDA2NDQKLS0tIGEvYXNoL3N5c3RlbS91bmlmaWVkL2NvbGxhcHNlX2J1dHRvbi5jYworKysgYi9hc2gvc3lzdGVtL3VuaWZpZWQvY29sbGFwc2VfYnV0dG9uLmNjCkBAIC0xMSwxNiArMTEsMTIgQEAKICNpbmNsdWRlICJ1aS9iYXNlL2wxMG4vbDEwbl91dGlsLmgiCiAjaW5jbHVkZSAidWkvZ2Z4L3BhaW50X3ZlY3Rvcl9pY29uLmgiCiAjaW5jbHVkZSAidWkvZ2Z4L3Njb3BlZF9jYW52YXMuaCIKLSNpbmNsdWRlICJ1aS92aWV3cy92aWV3X2NsYXNzX3Byb3BlcnRpZXMuaCIKIAogbmFtZXNwYWNlIGFzaCB7CiAKIENvbGxhcHNlQnV0dG9uOjpDb2xsYXBzZUJ1dHRvbih2aWV3czo6QnV0dG9uTGlzdGVuZXIqIGxpc3RlbmVyKQogICAgIDogQ3VzdG9tU2hhcGVCdXR0b24obGlzdGVuZXIpIHsKICAgT25FbmFibGVkQ2hhbmdlZCgpOwotICBhdXRvIHBhdGggPSBzdGQ6Om1ha2VfdW5pcXVlPFNrUGF0aD4oCi0gICAgICBDcmVhdGVDdXN0b21TaGFwZVBhdGgoZ2Z4OjpSZWN0KENhbGN1bGF0ZVByZWZlcnJlZFNpemUoKSkpKTsKLSAgU2V0UHJvcGVydHkodmlld3M6OmtIaWdobGlnaHRQYXRoS2V5LCBwYXRoLnJlbGVhc2UoKSk7CiB9CiAKIENvbGxhcHNlQnV0dG9uOjp+Q29sbGFwc2VCdXR0b24oKSA9IGRlZmF1bHQ7CmRpZmYgLS1naXQgYS9hc2gvc3lzdGVtL3VuaWZpZWQvY3VzdG9tX3NoYXBlX2J1dHRvbi5jYyBiL2FzaC9zeXN0ZW0vdW5pZmllZC9jdXN0b21fc2hhcGVfYnV0dG9uLmNjCmluZGV4IDU4OTk5ZDcxMi4uZTg2YmZlNiAxMDA2NDQKLS0tIGEvYXNoL3N5c3RlbS91bmlmaWVkL2N1c3RvbV9zaGFwZV9idXR0b24uY2MKKysrIGIvYXNoL3N5c3RlbS91bmlmaWVkL2N1c3RvbV9zaGFwZV9idXR0b24uY2MKQEAgLTE2LDEyICsxNiwzMSBAQAogI2luY2x1ZGUgInVpL3ZpZXdzL2FuaW1hdGlvbi9pbmtfZHJvcF9pbXBsLmgiCiAjaW5jbHVkZSAidWkvdmlld3MvYW5pbWF0aW9uL2lua19kcm9wX21hc2suaCIKICNpbmNsdWRlICJ1aS92aWV3cy9ib3JkZXIuaCIKKyNpbmNsdWRlICJ1aS92aWV3cy9jb250cm9scy9oaWdobGlnaHRfcGF0aF9nZW5lcmF0b3IuaCIKKworbmFtZXNwYWNlIHsKK2NsYXNzIEN1c3RvbVNoYXBlQnV0dG9uSGlnaGxpZ2h0UGF0aEdlbmVyYXRvcgorICAgIDogcHVibGljIHZpZXdzOjpIaWdobGlnaHRQYXRoR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIEN1c3RvbVNoYXBlQnV0dG9uSGlnaGxpZ2h0UGF0aEdlbmVyYXRvcigpID0gZGVmYXVsdDsKKworICBTa1BhdGggR2V0SGlnaGxpZ2h0UGF0aChjb25zdCB2aWV3czo6Vmlldyogdmlldykgb3ZlcnJpZGUgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBhc2g6OkN1c3RvbVNoYXBlQnV0dG9uKj4odmlldykKKyAgICAgICAgLT5DcmVhdGVDdXN0b21TaGFwZVBhdGgodmlldy0+R2V0TG9jYWxCb3VuZHMoKSk7CisgIH0KKworIHByaXZhdGU6CisgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihDdXN0b21TaGFwZUJ1dHRvbkhpZ2hsaWdodFBhdGhHZW5lcmF0b3IpOworfTsKK30gIC8vIG5hbWVzcGFjZQogCiBuYW1lc3BhY2UgYXNoIHsKIAogQ3VzdG9tU2hhcGVCdXR0b246OkN1c3RvbVNoYXBlQnV0dG9uKHZpZXdzOjpCdXR0b25MaXN0ZW5lciogbGlzdGVuZXIpCiAgICAgOiBJbWFnZUJ1dHRvbihsaXN0ZW5lcikgewogICBUcmF5UG9wdXBVdGlsczo6Q29uZmlndXJlVHJheVBvcHVwQnV0dG9uKHRoaXMpOworICB2aWV3czo6SGlnaGxpZ2h0UGF0aEdlbmVyYXRvcjo6SW5zdGFsbCgKKyAgICAgIHRoaXMsIHN0ZDo6bWFrZV91bmlxdWU8Q3VzdG9tU2hhcGVCdXR0b25IaWdobGlnaHRQYXRoR2VuZXJhdG9yPigpKTsKIH0KIAogQ3VzdG9tU2hhcGVCdXR0b246On5DdXN0b21TaGFwZUJ1dHRvbigpID0gZGVmYXVsdDsKZGlmZiAtLWdpdCBhL2FzaC93bS9vdmVydmlldy9vdmVydmlld19jb250cm9sbGVyLmNjIGIvYXNoL3dtL292ZXJ2aWV3L292ZXJ2aWV3X2NvbnRyb2xsZXIuY2MKaW5kZXggZGU3YjhjNS4uNzZlOGY3NCAxMDA2NDQKLS0tIGEvYXNoL3dtL292ZXJ2aWV3L292ZXJ2aWV3X2NvbnRyb2xsZXIuY2MKKysrIGIvYXNoL3dtL292ZXJ2aWV3L292ZXJ2aWV3X2NvbnRyb2xsZXIuY2MKQEAgLTIzMSw3ICsyMzEsNyBAQAogICByZXR1cm4gIXN0YXJ0X2FuaW1hdGlvbnNfLmVtcHR5KCk7CiB9CiAKLWJvb2wgT3ZlcnZpZXdDb250cm9sbGVyOjpJc0NvbXBsZXRpbmdTaHV0ZG93bkFuaW1hdGlvbnMoKSB7Citib29sIE92ZXJ2aWV3Q29udHJvbGxlcjo6SXNDb21wbGV0aW5nU2h1dGRvd25BbmltYXRpb25zKCkgY29uc3QgewogICByZXR1cm4gIWRlbGF5ZWRfYW5pbWF0aW9uc18uZW1wdHkoKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXNoL3dtL292ZXJ2aWV3L292ZXJ2aWV3X2NvbnRyb2xsZXIuaCBiL2FzaC93bS9vdmVydmlldy9vdmVydmlld19jb250cm9sbGVyLmgKaW5kZXggNjQ1N2M4ZTAuLjc3MmVjYmY1ZCAxMDA2NDQKLS0tIGEvYXNoL3dtL292ZXJ2aWV3L292ZXJ2aWV3X2NvbnRyb2xsZXIuaAorKysgYi9hc2gvd20vb3ZlcnZpZXcvb3ZlcnZpZXdfY29udHJvbGxlci5oCkBAIC02MCw3ICs2MCw3IEBACiAKICAgLy8gUmV0dXJucyB0cnVlIGlmIG92ZXJ2aWV3IGhhcyBiZWVuIHNodXRkb3duLCBidXQgaXMgc3RpbGwgYW5pbWF0aW5nIHRvIHRoZQogICAvLyBlbmQgc3RhdGUgdWkuCi0gIGJvb2wgSXNDb21wbGV0aW5nU2h1dGRvd25BbmltYXRpb25zKCk7CisgIGJvb2wgSXNDb21wbGV0aW5nU2h1dGRvd25BbmltYXRpb25zKCkgY29uc3Q7CiAKICAgLy8gUGF1c2Ugb3IgdW5wYXVzZSB0aGUgb2NjbHVzaW9uIHRyYWNrZXIuIFJlc2V0cyB0aGUgdW5wYXVzZSBkZWxheSBpZiB3ZSB3ZXJlCiAgIC8vIGFscmVhZHkgaW4gdGhlIHByb2Nlc3Mgb2YgdW5wYXVzaW5nLgpkaWZmIC0tZ2l0IGEvYXNoL3dtL292ZXJ2aWV3L292ZXJ2aWV3X2l0ZW0uY2MgYi9hc2gvd20vb3ZlcnZpZXcvb3ZlcnZpZXdfaXRlbS5jYwppbmRleCAzZWJlOGE1Li4xNDkzMTNmIDEwMDY0NAotLS0gYS9hc2gvd20vb3ZlcnZpZXcvb3ZlcnZpZXdfaXRlbS5jYworKysgYi9hc2gvd20vb3ZlcnZpZXcvb3ZlcnZpZXdfaXRlbS5jYwpAQCAtNTg2LDYgKzU4NiwxMyBAQAogICBjYW5ub3Rfc25hcF93aWRnZXRfLT5TZXRCb3VuZHNDZW50ZXJlZEluKGJvdW5kcywgLyphbmltYXRlPSovZmFsc2UpOwogfQogCit2b2lkIE92ZXJ2aWV3SXRlbTo6SGlkZUNhbm5vdFNuYXBXYXJuaW5nKCkgeworICBpZiAoIWNhbm5vdF9zbmFwX3dpZGdldF8pCisgICAgcmV0dXJuOworICBEb1NwbGl0dmlld09wYWNpdHlBbmltYXRpb24oY2Fubm90X3NuYXBfd2lkZ2V0Xy0+R2V0TmF0aXZlV2luZG93KCktPmxheWVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUExJVFZJRVdfQU5JTUFUSU9OX09WRVJWSUVXX0lURU1fRkFERV9PVVQpOworfQorCiB2b2lkIE92ZXJ2aWV3SXRlbTo6T25TZWxlY3Rvckl0ZW1EcmFnU3RhcnRlZChPdmVydmlld0l0ZW0qIGl0ZW0pIHsKICAgaXNfYmVpbmdfZHJhZ2dlZF8gPSAoaXRlbSA9PSB0aGlzKTsKICAgY2FwdGlvbl9jb250YWluZXJfdmlld18tPlNldEhlYWRlclZpc2liaWxpdHkoCmRpZmYgLS1naXQgYS9hc2gvd20vb3ZlcnZpZXcvb3ZlcnZpZXdfaXRlbS5oIGIvYXNoL3dtL292ZXJ2aWV3L292ZXJ2aWV3X2l0ZW0uaAppbmRleCAwNmNkZGNmLi4wZDhhYTY3IDEwMDY0NAotLS0gYS9hc2gvd20vb3ZlcnZpZXcvb3ZlcnZpZXdfaXRlbS5oCisrKyBiL2FzaC93bS9vdmVydmlldy9vdmVydmlld19pdGVtLmgKQEAgLTEwOCw2ICsxMDgsMTAgQEAKICAgLy8gd2luZG93IGNhbm5vdCBiZSBzbmFwcGVkLgogICB2b2lkIFVwZGF0ZUNhbm5vdFNuYXBXYXJuaW5nVmlzaWJpbGl0eSgpOwogCisgIC8vIEhpZGVzIHRoZSBjYW5ub3Qgc25hcCB3YXJuaW5nIChpZiBpdCB3YXMgc2hvd2luZykgdW50aWwgdGhlIG5leHQgY2FsbCB0bworICAvLyB8VXBkYXRlQ2Fubm90U25hcFdhcm5pbmdWaXNpYmlsaXR5fC4KKyAgdm9pZCBIaWRlQ2Fubm90U25hcFdhcm5pbmcoKTsKKwogICAvLyBDYWxsZWQgd2hlbiBhIE92ZXJ2aWV3SXRlbSBvbiBhbnkgZ3JpZCBpcyBkcmFnZ2VkLiBIaWRlcyB0aGUgY2xvc2UgYnV0dG9uCiAgIC8vIHdoZW4gYSBkcmFnIGlzIHN0YXJ0ZWQsIGFuZCByZXNob3dzIGl0IHdoZW4gYSBkcmFnIGlzIGZpbmlzaGVkLgogICAvLyBBZGRpdGlvbmFsbHkgaGlkZXMgdGhlIHRpdGxlIGFuZCB3aW5kb3cgaWNvbiBpZiB8aXRlbXwgaXMgdGhpcy4KZGlmZiAtLWdpdCBhL2FzaC93bS9vdmVydmlldy9vdmVydmlld19zZXNzaW9uX3VuaXR0ZXN0LmNjIGIvYXNoL3dtL292ZXJ2aWV3L292ZXJ2aWV3X3Nlc3Npb25fdW5pdHRlc3QuY2MKaW5kZXggNjUyYmQwZS4uYzc4MzhjMDIgMTAwNjQ0Ci0tLSBhL2FzaC93bS9vdmVydmlldy9vdmVydmlld19zZXNzaW9uX3VuaXR0ZXN0LmNjCisrKyBiL2FzaC93bS9vdmVydmlldy9vdmVydmlld19zZXNzaW9uX3VuaXR0ZXN0LmNjCkBAIC03OCw2ICs3OCw3IEBACiAjaW5jbHVkZSAidWkvZGlzcGxheS9tYW5hZ2VyL2Rpc3BsYXlfbWFuYWdlci5oIgogI2luY2x1ZGUgInVpL2Rpc3BsYXkvdGVzdC9kaXNwbGF5X21hbmFnZXJfdGVzdF9hcGkuaCIKICNpbmNsdWRlICJ1aS9ldmVudHMvZXZlbnRfdXRpbHMuaCIKKyNpbmNsdWRlICJ1aS9ldmVudHMvZ2VzdHVyZV9kZXRlY3Rpb24vZ2VzdHVyZV9jb25maWd1cmF0aW9uLmgiCiAjaW5jbHVkZSAidWkvZXZlbnRzL3Rlc3QvZXZlbnRfZ2VuZXJhdG9yLmgiCiAjaW5jbHVkZSAidWkvZ2Z4L2dlb21ldHJ5L3BvaW50X2NvbnZlcnNpb25zLmgiCiAjaW5jbHVkZSAidWkvZ2Z4L3RyYW5zZm9ybS5oIgpAQCAtNDA4Niw2ICs0MDg3LDEwOCBAQAogICBFWFBFQ1RfRVEoMC5mLCB1bnNuYXBwYWJsZV9sYXllci0+b3BhY2l0eSgpKTsKIH0KIAorLy8gVmVyaWZ5IHRoYXQgZHVyaW5nICJub3JtYWwiIGRyYWdnaW5nIGZyb20gb3ZlcnZpZXcgKG5vdCBkcmFnLXRvLWNsb3NlKSwgdGhlCisvLyBkcmFnZ2VkIGl0ZW0ncyB1bnNuYXBwYWJsZSBpbmRpY2F0b3IgaXMgdGVtcG9yYXJpbHkgc3VwcHJlc3NlZC4KK1RFU1RfUChTcGxpdFZpZXdPdmVydmlld1Nlc3Npb25UZXN0LAorICAgICAgIE92ZXJ2aWV3VW5zbmFwcGFibGVJbmRpY2F0b3JWaXNpYmlsaXR5V2hpbGVEcmFnZ2luZykgeworICB1aTo6R2VzdHVyZUNvbmZpZ3VyYXRpb24qIGdlc3R1cmVfY29uZmlnID0KKyAgICAgIHVpOjpHZXN0dXJlQ29uZmlndXJhdGlvbjo6R2V0SW5zdGFuY2UoKTsKKyAgZ2VzdHVyZV9jb25maWctPnNldF9sb25nX3ByZXNzX3RpbWVfaW5fbXMoMSk7CisgIGdlc3R1cmVfY29uZmlnLT5zZXRfc2hvd19wcmVzc19kZWxheV9pbl9tcygxKTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8YXVyYTo6V2luZG93PiBzbmFwcGVkX3dpbmRvdyA9IENyZWF0ZVRlc3RXaW5kb3coKTsKKyAgc3RkOjp1bmlxdWVfcHRyPGF1cmE6OldpbmRvdz4gdW5zbmFwcGFibGVfd2luZG93ID0gQ3JlYXRlVW5zbmFwcGFibGVXaW5kb3coKTsKKyAgVG9nZ2xlT3ZlcnZpZXcoKTsKKyAgQVNTRVJUX1RSVUUob3ZlcnZpZXdfY29udHJvbGxlcigpLT5Jbk92ZXJ2aWV3U2Vzc2lvbigpKTsKKyAgc3BsaXRfdmlld19jb250cm9sbGVyKCktPlNuYXBXaW5kb3coc25hcHBlZF93aW5kb3cuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwbGl0Vmlld0NvbnRyb2xsZXI6OkxFRlQpOworICBBU1NFUlRfVFJVRShzcGxpdF92aWV3X2NvbnRyb2xsZXIoKS0+SW5TcGxpdFZpZXdNb2RlKCkpOworICBPdmVydmlld0l0ZW0qIHVuc25hcHBhYmxlX292ZXJ2aWV3X2l0ZW0gPQorICAgICAgR2V0T3ZlcnZpZXdJdGVtRm9yV2luZG93KHVuc25hcHBhYmxlX3dpbmRvdy5nZXQoKSk7CisgIEFTU0VSVF9UUlVFKHVuc25hcHBhYmxlX292ZXJ2aWV3X2l0ZW0tPmNhbm5vdF9zbmFwX3dpZGdldF9mb3JfdGVzdGluZygpKTsKKyAgdWk6OkxheWVyKiB1bnNuYXBwYWJsZV9sYXllciA9CisgICAgICB1bnNuYXBwYWJsZV9vdmVydmlld19pdGVtLT5jYW5ub3Rfc25hcF93aWRnZXRfZm9yX3Rlc3RpbmcoKQorICAgICAgICAgIC0+R2V0TmF0aXZlV2luZG93KCkKKyAgICAgICAgICAtPmxheWVyKCk7CisgIEFTU0VSVF9FUSgxLmYsIHVuc25hcHBhYmxlX2xheWVyLT5vcGFjaXR5KCkpOworCisgIC8vIFRlc3QgdGhhdCB0aGUgdW5zbmFwcGFibGUgbGFiZWwgaXMgdGVtcG9yYXJpbHkgc3VwcHJlc3NlZCBkdXJpbmcgbW91c2UKKyAgLy8gZHJhZ2dpbmcuCisgIHVpOjp0ZXN0OjpFdmVudEdlbmVyYXRvciogZ2VuZXJhdG9yID0gR2V0RXZlbnRHZW5lcmF0b3IoKTsKKyAgY29uc3QgZ2Z4OjpQb2ludCBkcmFnX3N0YXJ0aW5nX3BvaW50ID0gZ2Z4OjpUb1JvdW5kZWRQb2ludCgKKyAgICAgIHVuc25hcHBhYmxlX292ZXJ2aWV3X2l0ZW0tPnRhcmdldF9ib3VuZHMoKS5DZW50ZXJQb2ludCgpKTsKKyAgZ2VuZXJhdG9yLT5zZXRfY3VycmVudF9zY3JlZW5fbG9jYXRpb24oZHJhZ19zdGFydGluZ19wb2ludCk7CisgIGdlbmVyYXRvci0+UHJlc3NMZWZ0QnV0dG9uKCk7CisgIHVzaW5nIERyYWdCZWhhdmlvciA9IE92ZXJ2aWV3V2luZG93RHJhZ0NvbnRyb2xsZXI6OkRyYWdCZWhhdmlvcjsKKyAgRVhQRUNUX0VRKAorICAgICAgRHJhZ0JlaGF2aW9yOjprVW5kZWZpbmVkLAorICAgICAgb3ZlcnZpZXdfc2Vzc2lvbigpLT53aW5kb3dfZHJhZ19jb250cm9sbGVyKCktPmN1cnJlbnRfZHJhZ19iZWhhdmlvcigpKTsKKyAgRVhQRUNUX0VRKDEuZiwgdW5zbmFwcGFibGVfbGF5ZXItPm9wYWNpdHkoKSk7CisgIGdlbmVyYXRvci0+TW92ZU1vdXNlQnkoMCwgMjApOworICBFWFBFQ1RfRVEoCisgICAgICBEcmFnQmVoYXZpb3I6OmtOb3JtYWxEcmFnLAorICAgICAgb3ZlcnZpZXdfc2Vzc2lvbigpLT53aW5kb3dfZHJhZ19jb250cm9sbGVyKCktPmN1cnJlbnRfZHJhZ19iZWhhdmlvcigpKTsKKyAgRVhQRUNUX0VRKDAuZiwgdW5zbmFwcGFibGVfbGF5ZXItPm9wYWNpdHkoKSk7CisgIGdlbmVyYXRvci0+UmVsZWFzZUxlZnRCdXR0b24oKTsKKyAgRVhQRUNUX0VRKDEuZiwgdW5zbmFwcGFibGVfbGF5ZXItPm9wYWNpdHkoKSk7CisKKyAgLy8gVGVzdCB0aGF0IHRoZSB1bnNuYXBwYWJsZSBsYWJlbCBpcyB0ZW1wb3JhcmlseSBzdXBwcmVzc2VkIGR1cmluZyAibm9ybWFsIgorICAvLyB0b3VjaCBkcmFnZ2luZyAobm90IGRyYWctdG8tY2xvc2UpLgorICBnZW5lcmF0b3ItPnNldF9jdXJyZW50X3NjcmVlbl9sb2NhdGlvbihkcmFnX3N0YXJ0aW5nX3BvaW50KTsKKyAgZ2VuZXJhdG9yLT5QcmVzc1RvdWNoKCk7CisgIHsKKyAgICBiYXNlOjpSdW5Mb29wIHJ1bl9sb29wOworICAgIGJhc2U6OlRocmVhZFRhc2tSdW5uZXJIYW5kbGU6OkdldCgpLT5Qb3N0RGVsYXllZFRhc2soCisgICAgICAgIEZST01fSEVSRSwgcnVuX2xvb3AuUXVpdENsb3N1cmUoKSwKKyAgICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDIpKTsKKyAgICBydW5fbG9vcC5SdW4oKTsKKyAgfQorICBFWFBFQ1RfRVEoCisgICAgICBEcmFnQmVoYXZpb3I6OmtOb3JtYWxEcmFnLAorICAgICAgb3ZlcnZpZXdfc2Vzc2lvbigpLT53aW5kb3dfZHJhZ19jb250cm9sbGVyKCktPmN1cnJlbnRfZHJhZ19iZWhhdmlvcigpKTsKKyAgRVhQRUNUX0VRKDAuZiwgdW5zbmFwcGFibGVfbGF5ZXItPm9wYWNpdHkoKSk7CisgIGdlbmVyYXRvci0+TW92ZVRvdWNoQnkoMjAsIDApOworICBnZW5lcmF0b3ItPlJlbGVhc2VUb3VjaCgpOworICBFWFBFQ1RfRVEoMS5mLCB1bnNuYXBwYWJsZV9sYXllci0+b3BhY2l0eSgpKTsKKworICAvLyBUZXN0IHRoYXQgdGhlIHVuc25hcHBhYmxlIGxhYmVsIHJlYXBwZWFycyBpZiAibm9ybWFsIiB0b3VjaCBkcmFnZ2luZyAobm90CisgIC8vIGRyYWctdG8tY2xvc2UpIGVuZHMgd2hlbiB0aGUgaXRlbSBoYXMgbm90IGJlZW4gYWN0dWFsbHkgZHJhZ2dlZCBhbnl3aGVyZS4KKyAgLy8gVGhpcyBjYXNlIGltcHJvdmVzIHRlc3QgY292ZXJhZ2UgYmVjYXVzZSBpdCBpcyBoYW5kbGVkIGluCisgIC8vIHxPdmVydmlld1dpbmRvd0RyYWdDb250cm9sbGVyOjpSZXNldEdlc3R1cmV8IGluc3RlYWQgb2YKKyAgLy8gfE92ZXJ2aWV3V2luZG93RHJhZ0NvbnRyb2xsZXI6OkNvbXBsZXRlTm9ybWFsRHJhZ3wuCisgIGdlbmVyYXRvci0+c2V0X2N1cnJlbnRfc2NyZWVuX2xvY2F0aW9uKGRyYWdfc3RhcnRpbmdfcG9pbnQpOworICBnZW5lcmF0b3ItPlByZXNzVG91Y2goKTsKKyAgeworICAgIGJhc2U6OlJ1bkxvb3AgcnVuX2xvb3A7CisgICAgYmFzZTo6VGhyZWFkVGFza1J1bm5lckhhbmRsZTo6R2V0KCktPlBvc3REZWxheWVkVGFzaygKKyAgICAgICAgRlJPTV9IRVJFLCBydW5fbG9vcC5RdWl0Q2xvc3VyZSgpLAorICAgICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoMikpOworICAgIHJ1bl9sb29wLlJ1bigpOworICB9CisgIEVYUEVDVF9FUSgKKyAgICAgIERyYWdCZWhhdmlvcjo6a05vcm1hbERyYWcsCisgICAgICBvdmVydmlld19zZXNzaW9uKCktPndpbmRvd19kcmFnX2NvbnRyb2xsZXIoKS0+Y3VycmVudF9kcmFnX2JlaGF2aW9yKCkpOworICBFWFBFQ1RfRVEoMC5mLCB1bnNuYXBwYWJsZV9sYXllci0+b3BhY2l0eSgpKTsKKyAgZ2VuZXJhdG9yLT5SZWxlYXNlVG91Y2goKTsKKyAgRVhQRUNUX0VRKDEuZiwgdW5zbmFwcGFibGVfbGF5ZXItPm9wYWNpdHkoKSk7CisKKyAgLy8gVGVzdCB0aGF0IHRoZSB1bnNuYXBwYWJsZSBsYWJlbCBwZXJzaXN0cyBpbiBkcmFnLXRvLWNsb3NlIG1vZGUuCisgIGdlbmVyYXRvci0+c2V0X2N1cnJlbnRfc2NyZWVuX2xvY2F0aW9uKGRyYWdfc3RhcnRpbmdfcG9pbnQpOworICBnZW5lcmF0b3ItPlByZXNzVG91Y2goKTsKKyAgLy8gVXNlIHNtYWxsIGluY3JlbWVudHMgb3RoZXJ3aXNlIGEgZmxpbmcgZXZlbnQgd2lsbCBiZSBmaXJlZC4KKyAgZm9yIChpbnQgaiA9IDA7IGogPCAyMDsgKytqKQorICAgIGdlbmVyYXRvci0+TW92ZVRvdWNoQnkoMCwgMSk7CisgIEVYUEVDVF9FUSgKKyAgICAgIERyYWdCZWhhdmlvcjo6a0RyYWdUb0Nsb3NlLAorICAgICAgb3ZlcnZpZXdfc2Vzc2lvbigpLT53aW5kb3dfZHJhZ19jb250cm9sbGVyKCktPmN1cnJlbnRfZHJhZ19iZWhhdmlvcigpKTsKKyAgLy8gRHJhZy10by1jbG9zZSBtb2RlIGFmZmVjdHMgdGhlIG9wYWNpdHkgb2YgdGhlIHdob2xlIG92ZXJ2aWV3IGl0ZW0sCisgIC8vIGluY2x1ZGluZyB0aGUgdW5zbmFwcGFibGUgbGFiZWwuCisgIEVYUEVDVF9FUSh1bnNuYXBwYWJsZV9vdmVydmlld19pdGVtLT5HZXRXaW5kb3coKS0+bGF5ZXIoKS0+b3BhY2l0eSgpLAorICAgICAgICAgICAgdW5zbmFwcGFibGVfbGF5ZXItPm9wYWNpdHkoKSk7CisgIGdlbmVyYXRvci0+UmVsZWFzZVRvdWNoKCk7CisgIEVYUEVDVF9FUSgxLmYsIHVuc25hcHBhYmxlX2xheWVyLT5vcGFjaXR5KCkpOworfQorCiAvLyBUZXN0IHRoYXQgd2hlbiBzcGxpdHZpZXcgbW9kZSBhbmQgb3ZlcnZpZXcgbW9kZSBhcmUgYm90aCBhY3RpdmUgYXQgdGhlIHNhbWUKIC8vIHRpbWUsIGRyYWdnaW5nIGRpdmlkZXIgYmVoYXZpb3JzIGFyZSBjb3JyZWN0LgogVEVTVF9QKFNwbGl0Vmlld092ZXJ2aWV3U2Vzc2lvblRlc3QsIERyYWdEaXZpZGVyVG9FeGl0VGVzdCkgewpkaWZmIC0tZ2l0IGEvYXNoL3dtL292ZXJ2aWV3L292ZXJ2aWV3X3dpbmRvd19kcmFnX2NvbnRyb2xsZXIuY2MgYi9hc2gvd20vb3ZlcnZpZXcvb3ZlcnZpZXdfd2luZG93X2RyYWdfY29udHJvbGxlci5jYwppbmRleCBlZTljNWE1Li45NDYzZWQ0IDEwMDY0NAotLS0gYS9hc2gvd20vb3ZlcnZpZXcvb3ZlcnZpZXdfd2luZG93X2RyYWdfY29udHJvbGxlci5jYworKysgYi9hc2gvd20vb3ZlcnZpZXcvb3ZlcnZpZXdfd2luZG93X2RyYWdfY29udHJvbGxlci5jYwpAQCAtMjM5LDYgKzIzOSw3IEBACiAgICAgICAgIENhblNuYXBJblNwbGl0dmlldyhpdGVtXy0+R2V0V2luZG93KCkpID8gSW5kaWNhdG9yU3RhdGU6OmtEcmFnQXJlYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEluZGljYXRvclN0YXRlOjprQ2Fubm90U25hcCwKICAgICAgICAgZ2Z4OjpUb1JvdW5kZWRQb2ludChsb2NhdGlvbl9pbl9zY3JlZW4pKTsKKyAgICBpdGVtXy0+SGlkZUNhbm5vdFNuYXBXYXJuaW5nKCk7CiAKICAgICAvLyBVcGRhdGUgdGhlIHNwbGl0IHZpZXcgZGl2aWRlciBiYXIgc3RhdHVzIGlmIG5lY2Vzc2FyeS4gSWYgc3BsaXR2aWV3IGlzCiAgICAgLy8gYWN0aXZlIHdoZW4gZHJhZ2dpbmcgdGhlIG92ZXJ2aWV3IHdpbmRvdywgdGhlIHNwbGl0IGRpdmlkZXIgYmFyIHNob3VsZCBiZQpAQCAtMzI5LDYgKzMzMCw3IEBACiAgICAgaWYgKHNob3VsZF9hbGxvd19zcGxpdF92aWV3XykgewogICAgICAgb3ZlcnZpZXdfc2Vzc2lvbl8tPlNldFNwbGl0Vmlld0RyYWdJbmRpY2F0b3JzSW5kaWNhdG9yU3RhdGUoCiAgICAgICAgICAgSW5kaWNhdG9yU3RhdGU6OmtOb25lLCBnZng6OlBvaW50KCkpOworICAgICAgaXRlbV8tPlVwZGF0ZUNhbm5vdFNuYXBXYXJuaW5nVmlzaWJpbGl0eSgpOwogICAgIH0KICAgfQogICBvdmVydmlld19zZXNzaW9uXy0+UG9zaXRpb25XaW5kb3dzKC8qYW5pbWF0ZT0qL3RydWUpOwpAQCAtNTE0LDYgKzUxNiw3IEBACiAgICAgVXBkYXRlRHJhZ0luZGljYXRvcnNBbmRPdmVydmlld0dyaWQobG9jYXRpb25faW5fc2NyZWVuKTsKICAgICBvdmVydmlld19zZXNzaW9uXy0+U2V0U3BsaXRWaWV3RHJhZ0luZGljYXRvcnNJbmRpY2F0b3JTdGF0ZSgKICAgICAgICAgSW5kaWNhdG9yU3RhdGU6OmtOb25lLCByb3VuZGVkX3NjcmVlbl9wb2ludCk7CisgICAgaXRlbV8tPlVwZGF0ZUNhbm5vdFNuYXBXYXJuaW5nVmlzaWJpbGl0eSgpOwogICB9CiAKICAgLy8gVGhpcyBmdW5jdGlvbiBoYXMgbXVsdGlwbGUgZXhpdCBwb3NpdGlvbnMsIGF0IGVhY2ggd2UgbXVzdCB1cGRhdGUgdGhlIGRlc2tzCmRpZmYgLS1naXQgYS9iYXNlL2FsbG9jYXRvci9wYXJ0aXRpb25fYWxsb2NhdG9yL3BhcnRpdGlvbl9wYWdlLmggYi9iYXNlL2FsbG9jYXRvci9wYXJ0aXRpb25fYWxsb2NhdG9yL3BhcnRpdGlvbl9wYWdlLmgKaW5kZXggNWEwZTcwZjkuLjY5MjY1OTRmIDEwMDY0NAotLS0gYS9iYXNlL2FsbG9jYXRvci9wYXJ0aXRpb25fYWxsb2NhdG9yL3BhcnRpdGlvbl9wYWdlLmgKKysrIGIvYmFzZS9hbGxvY2F0b3IvcGFydGl0aW9uX2FsbG9jYXRvci9wYXJ0aXRpb25fcGFnZS5oCkBAIC0xMSw4ICsxMSwyNyBAQAogI2luY2x1ZGUgImJhc2UvYWxsb2NhdG9yL3BhcnRpdGlvbl9hbGxvY2F0b3IvcGFydGl0aW9uX2J1Y2tldC5oIgogI2luY2x1ZGUgImJhc2UvYWxsb2NhdG9yL3BhcnRpdGlvbl9hbGxvY2F0b3IvcGFydGl0aW9uX2Nvb2tpZS5oIgogI2luY2x1ZGUgImJhc2UvYWxsb2NhdG9yL3BhcnRpdGlvbl9hbGxvY2F0b3IvcGFydGl0aW9uX2ZyZWVsaXN0X2VudHJ5LmgiCisjaW5jbHVkZSAiYmFzZS9hbGxvY2F0b3IvcGFydGl0aW9uX2FsbG9jYXRvci9yYW5kb20uaCIKICNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKIAorbmFtZXNwYWNlIHsKKworLy8gUmV0dXJucyB0cnVlIGlmIHdlJ3ZlIGhpdCB0aGUgZW5kIG9mIGEgcmFuZG9tLWxlbmd0aCBwZXJpb2QuIFdlIGRvbid0IHdhbnQgdG8KKy8vIGludm9rZSBgUmFuZG9tVmFsdWVgIHRvbyBvZnRlbiwgYmVjYXVzZSB3ZSBjYWxsIHRoaXMgZnVuY3Rpb24gaW4gYSBob3Qgc3BvdAorLy8gKGBGcmVlYCksIGFuZCBgUmFuZG9tVmFsdWVgIGluY3VycyB0aGUgY29zdCBvZiBhdG9taWNzLgorI2lmICFEQ0hFQ0tfSVNfT04oKQorYm9vbCBSYW5kb21QZXJpb2QoKSB7CisgIHN0YXRpYyB0aHJlYWRfbG9jYWwgdWludDhfdCBjb3VudGVyID0gMDsKKyAgaWYgKFVOTElLRUxZKGNvdW50ZXIgPT0gMCkpIHsKKyAgICBjb3VudGVyID0gYmFzZTo6UmFuZG9tVmFsdWUoKTsKKyAgfQorICBjb3VudGVyLS07CisgIHJldHVybiBjb3VudGVyID09IDA7Cit9CisjZW5kaWYKKworfSAgLy8gbmFtZXNwYWNlCisKIG5hbWVzcGFjZSBiYXNlIHsKIG5hbWVzcGFjZSBpbnRlcm5hbCB7CiAKQEAgLTIwMSwyMyArMjIwLDI5IEBACiB9CiAKIEFMV0FZU19JTkxJTkUgdm9pZCBQYXJ0aXRpb25QYWdlOjpGcmVlKHZvaWQqIHB0cikgewotI2lmIERDSEVDS19JU19PTigpCiAgIHNpemVfdCBzbG90X3NpemUgPSB0aGlzLT5idWNrZXQtPnNsb3Rfc2l6ZTsKICAgY29uc3Qgc2l6ZV90IHJhd19zaXplID0gZ2V0X3Jhd19zaXplKCk7CiAgIGlmIChyYXdfc2l6ZSkgewogICAgIHNsb3Rfc2l6ZSA9IHJhd19zaXplOwogICB9CiAKKyNpZiBEQ0hFQ0tfSVNfT04oKQogICAvLyBJZiB0aGVzZSBhc3NlcnRzIGZpcmUsIHlvdSBwcm9iYWJseSBjb3JydXB0ZWQgbWVtb3J5LgogICBQYXJ0aXRpb25Db29raWVDaGVja1ZhbHVlKHB0cik7CiAgIFBhcnRpdGlvbkNvb2tpZUNoZWNrVmFsdWUocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4ocHRyKSArIHNsb3Rfc2l6ZSAtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0Nvb2tpZVNpemUpOwogCiAgIG1lbXNldChwdHIsIGtGcmVlZEJ5dGUsIHNsb3Rfc2l6ZSk7CisjZWxzZQorICAvLyBgbWVtc2V0YCBvbmx5IG9uY2UgaW4gYSB3aGlsZS4KKyAgaWYgKFVOTElLRUxZKFJhbmRvbVBlcmlvZCgpKSkgeworICAgIG1lbXNldChwdHIsIGtGcmVlZEJ5dGUsIHNsb3Rfc2l6ZSk7CisgIH0KICNlbmRpZgogCiAgIERDSEVDSyh0aGlzLT5udW1fYWxsb2NhdGVkX3Nsb3RzKTsKLSAgQ0hFQ0socHRyICE9IGZyZWVsaXN0X2hlYWQpOyAgLy8gQ2F0Y2hlcyBhbiBpbW1lZGlhdGUgZG91YmxlIGZyZWUuCisgIC8vIENhdGNoZXMgYW4gaW1tZWRpYXRlIGRvdWJsZSBmcmVlLgorICBDSEVDSyhwdHIgIT0gZnJlZWxpc3RfaGVhZCk7CiAgIC8vIExvb2sgZm9yIGRvdWJsZSBmcmVlIG9uZSBsZXZlbCBkZWVwZXIgaW4gZGVidWcuCiAgIERDSEVDSyghZnJlZWxpc3RfaGVhZCB8fCBwdHIgIT0gaW50ZXJuYWw6OlBhcnRpdGlvbkZyZWVsaXN0RW50cnk6OlRyYW5zZm9ybSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZWxpc3RfaGVhZC0+bmV4dCkpOwpkaWZmIC0tZ2l0IGEvYmFzZS9hbGxvY2F0b3IvcGFydGl0aW9uX2FsbG9jYXRvci9yYW5kb20uaCBiL2Jhc2UvYWxsb2NhdG9yL3BhcnRpdGlvbl9hbGxvY2F0b3IvcmFuZG9tLmgKaW5kZXggODVjYjY2ZC4uYTlhYWE3ZiAxMDA2NDQKLS0tIGEvYmFzZS9hbGxvY2F0b3IvcGFydGl0aW9uX2FsbG9jYXRvci9yYW5kb20uaAorKysgYi9iYXNlL2FsbG9jYXRvci9wYXJ0aXRpb25fYWxsb2NhdG9yL3JhbmRvbS5oCkBAIC0xNSw3ICsxNSw3IEBACiAvLyBgYmFzZTo6UmFuZFVpbnQ2NGAgd2hpY2ggaXMgdmVyeSB1bnByZWRpY3RhYmxlLCBidXQgd2hpY2ggaXMgZXhwZW5zaXZlIGR1ZSB0bwogLy8gdGhlIG5lZWQgdG8gY2FsbCBpbnRvIHRoZSBrZXJuZWwuIFRoZXJlZm9yZSB0aGlzIGdlbmVyYXRvciB1c2VzIGEgZmFzdCwKIC8vIGVudGlyZWx5IHVzZXItc3BhY2UgZnVuY3Rpb24gYWZ0ZXIgaW5pdGlhbGl6YXRpb24uCi11aW50MzJfdCBSYW5kb21WYWx1ZSgpOworQkFTRV9FWFBPUlQgdWludDMyX3QgUmFuZG9tVmFsdWUoKTsKIAogLy8gU2V0cyB0aGUgc2VlZCBmb3IgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHRvIGEga25vd24gdmFsdWUsIHRvIGNhdXNlIHRoZQogLy8gUk5HIHRvIGdlbmVyYXRlIGEgcHJlZGljdGFibGUgc2VxdWVuY2Ugb2Ygb3V0cHV0cy4gTWF5IGJlIGNhbGxlZCBtdWx0aXBsZQpkaWZmIC0tZ2l0IGEvYmFzZS90cmFjZV9ldmVudC9idWlsdGluX2NhdGVnb3JpZXMuaCBiL2Jhc2UvdHJhY2VfZXZlbnQvYnVpbHRpbl9jYXRlZ29yaWVzLmgKaW5kZXggZGNiMzJhNS4uOGNiYmM2MiAxMDA2NDQKLS0tIGEvYmFzZS90cmFjZV9ldmVudC9idWlsdGluX2NhdGVnb3JpZXMuaAorKysgYi9iYXNlL3RyYWNlX2V2ZW50L2J1aWx0aW5fY2F0ZWdvcmllcy5oCkBAIC0xNzgsNiArMTc4LDcgQEAKICAgWChUUkFDRV9ESVNBQkxFRF9CWV9ERUZBVUxUKCJncHUuZGV2aWNlIikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIFgoVFJBQ0VfRElTQUJMRURfQllfREVGQVVMVCgiZ3B1LnNlcnZpY2UiKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBYKFRSQUNFX0RJU0FCTEVEX0JZX0RFRkFVTFQoImlwYy5mbG93IikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgWChUUkFDRV9ESVNBQkxFRF9CWV9ERUZBVUxUKCJqYXZhLWhlYXAtcHJvZmlsZXIiKSkgICAgICAgICAgICAgICAgICAgICBcCiAgIFgoVFJBQ0VfRElTQUJMRURfQllfREVGQVVMVCgibGF5ZXItZWxlbWVudCIpKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBYKFRSQUNFX0RJU0FCTEVEX0JZX0RFRkFVTFQoImxpZmVjeWNsZXMiKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgWChUUkFDRV9ESVNBQkxFRF9CWV9ERUZBVUxUKCJsb2FkaW5nIikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9iYXNlL3RyYWNlX2V2ZW50L21hbGxvY19kdW1wX3Byb3ZpZGVyLmNjIGIvYmFzZS90cmFjZV9ldmVudC9tYWxsb2NfZHVtcF9wcm92aWRlci5jYwppbmRleCBlODk1OTdjLi43ZTQyY2ZjIDEwMDY0NAotLS0gYS9iYXNlL3RyYWNlX2V2ZW50L21hbGxvY19kdW1wX3Byb3ZpZGVyLmNjCisrKyBiL2Jhc2UvdHJhY2VfZXZlbnQvbWFsbG9jX2R1bXBfcHJvdmlkZXIuY2MKQEAgLTEzNCw3ICsxMzQsMTAgQEAKIC8vIFRPRE8oZnVjaHNpYSk6IFBvcnQsIHNlZSBodHRwczovL2NyYnVnLmNvbS83MDY1OTIuCiAjZWxzZQogICBzdHJ1Y3QgbWFsbGluZm8gaW5mbyA9IG1hbGxpbmZvKCk7Ci0gIERDSEVDS19HRShpbmZvLmFyZW5hICsgaW5mby5oYmxraGQsIGluZm8udW9yZGJsa3MpOworI2lmICFkZWZpbmVkKEFERFJFU1NfU0FOSVRJWkVSKSAmJiAhZGVmaW5lZChUSFJFQURfU0FOSVRJWkVSKQorICAvLyBTYW5pdGl6ZXJzIG92ZXJyaWRlIG1hbGxpbmZvLgorICBEQ0hFQ0tfR1Qoc3RhdGljX2Nhc3Q8aW50PihpbmZvLnVvcmRibGtzKSwgMCk7CisjZW5kaWYKIAogICAvLyBJbiBjYXNlIG9mIEFuZHJvaWQncyBqZW1hbGxvYyB8YXJlbmF8IGlzIDAgYW5kIHRoZSBvdXRlciBwYWdlcyBzaXplIGlzCiAgIC8vIHJlcG9ydGVkIGJ5IHxoYmxraGR8LiBJbiBjYXNlIG9mIGRsbWFsbG9jIHRoZSB0b3RhbCBpcyBnaXZlbiBieQpkaWZmIC0tZ2l0IGEvYnVpbGQvYW5kcm9pZC9ieXRlY29kZS9CVUlMRC5nbiBiL2J1aWxkL2FuZHJvaWQvYnl0ZWNvZGUvQlVJTEQuZ24KaW5kZXggZmE5MTFmNi4uODg1MTc1MyAxMDA2NDQKLS0tIGEvYnVpbGQvYW5kcm9pZC9ieXRlY29kZS9CVUlMRC5nbgorKysgYi9idWlsZC9hbmRyb2lkL2J5dGVjb2RlL0JVSUxELmduCkBAIC0xMSw3ICsxMSw2IEBACiAgICAgImphdmEvb3JnL2Nocm9taXVtL2J5dGVjb2RlL0Fzc2VydGlvbkVuYWJsZXJDbGFzc0FkYXB0ZXIuamF2YSIsCiAgICAgImphdmEvb3JnL2Nocm9taXVtL2J5dGVjb2RlL0J5dGVDb2RlUHJvY2Vzc29yLmphdmEiLAogICAgICJqYXZhL29yZy9jaHJvbWl1bS9ieXRlY29kZS9DbGFzc1BhdGhWYWxpZGF0b3IuamF2YSIsCi0gICAgImphdmEvb3JnL2Nocm9taXVtL2J5dGVjb2RlL0NvbnN0YW50UG9vbFJlZmVyZW5jZVJlYWRlci5qYXZhIiwKICAgICAiamF2YS9vcmcvY2hyb21pdW0vYnl0ZWNvZGUvQ3VzdG9tQ2xhc3NMb2FkZXJDbGFzc1dyaXRlci5qYXZhIiwKICAgICAiamF2YS9vcmcvY2hyb21pdW0vYnl0ZWNvZGUvQ3VzdG9tUmVzb3VyY2VzQ2xhc3NBZGFwdGVyLmphdmEiLAogICAgICJqYXZhL29yZy9jaHJvbWl1bS9ieXRlY29kZS9UaHJlYWRBc3NlcnRpb25DbGFzc0FkYXB0ZXIuamF2YSIsCmRpZmYgLS1naXQgYS9idWlsZC9hbmRyb2lkL2J5dGVjb2RlL2phdmEvb3JnL2Nocm9taXVtL2J5dGVjb2RlL0J5dGVDb2RlUHJvY2Vzc29yLmphdmEgYi9idWlsZC9hbmRyb2lkL2J5dGVjb2RlL2phdmEvb3JnL2Nocm9taXVtL2J5dGVjb2RlL0J5dGVDb2RlUHJvY2Vzc29yLmphdmEKaW5kZXggMmEwZWE1MDRmLi40YTU2MzMyIDEwMDY0NAotLS0gYS9idWlsZC9hbmRyb2lkL2J5dGVjb2RlL2phdmEvb3JnL2Nocm9taXVtL2J5dGVjb2RlL0J5dGVDb2RlUHJvY2Vzc29yLmphdmEKKysrIGIvYnVpbGQvYW5kcm9pZC9ieXRlY29kZS9qYXZhL29yZy9jaHJvbWl1bS9ieXRlY29kZS9CeXRlQ29kZVByb2Nlc3Nvci5qYXZhCkBAIC02Myw3ICs2Myw2IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NMb2FkZXIgc0RpcmVjdENsYXNzUGF0aENsYXNzTG9hZGVyOwogICAgIHByaXZhdGUgc3RhdGljIENsYXNzTG9hZGVyIHNGdWxsQ2xhc3NQYXRoQ2xhc3NMb2FkZXI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgU2V0PFN0cmluZz4gc0Z1bGxDbGFzc1BhdGhKYXJQYXRoczsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc0dlbmVyYXRlQ2xhc3NEZXBzUGF0aDsKICAgICBwcml2YXRlIHN0YXRpYyBDbGFzc1BhdGhWYWxpZGF0b3Igc1ZhbGlkYXRvcjsKIAogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEVudHJ5RGF0YVBhaXIgewpAQCAtMjU3LDcgKzI1Niw2IEBACiAgICAgICAgIHNTaG91bGRVc2VDdXN0b21SZXNvdXJjZXMgPSBhcmdzW2N1cnJJbmRleCsrXS5lcXVhbHMoIi0tZW5hYmxlLWN1c3RvbS1yZXNvdXJjZXMiKTsKICAgICAgICAgc1Nob3VsZFVzZVRocmVhZEFubm90YXRpb25zID0gYXJnc1tjdXJySW5kZXgrK10uZXF1YWxzKCItLWVuYWJsZS10aHJlYWQtYW5ub3RhdGlvbnMiKTsKICAgICAgICAgc1Nob3VsZENoZWNrQ2xhc3NQYXRoID0gYXJnc1tjdXJySW5kZXgrK10uZXF1YWxzKCItLWVuYWJsZS1jaGVjay1jbGFzcy1wYXRoIik7Ci0gICAgICAgIHNHZW5lcmF0ZUNsYXNzRGVwc1BhdGggPSBhcmdzW2N1cnJJbmRleCsrXTsKICAgICAgICAgaW50IHNka0phcnNMZW5ndGggPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbY3VyckluZGV4KytdKTsKICAgICAgICAgTGlzdDxTdHJpbmc+IHNka0phclBhdGhzID0KICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KEFycmF5cy5jb3B5T2ZSYW5nZShhcmdzLCBjdXJySW5kZXgsIGN1cnJJbmRleCArIHNka0phcnNMZW5ndGgpKTsKQEAgLTI4MCwxMyArMjc4LDYgQEAKICAgICAgICAgc0Z1bGxDbGFzc1BhdGhKYXJQYXRocy5hZGRBbGwoCiAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChBcnJheXMuY29weU9mUmFuZ2UoYXJncywgY3VyckluZGV4LCBhcmdzLmxlbmd0aCkpKTsKIAotICAgICAgICAvLyBXcml0ZSBsaXN0IG9mIHJlZmVyZW5jZXMgZnJvbSBKYXZhIGNsYXNzIGNvbnN0YW50IHBvb2xzIHRvIHNwZWNpZmllZCBvdXRwdXQgZmlsZQotICAgICAgICAvLyBzR2VuZXJhdGVDbGFzc0RlcHNQYXRoLiBUaGlzIGlzIG5lZWRlZCBmb3Iga2VlcCBydWxlIGdlbmVyYXRpb24gZm9yIGFzeW5jIERGTXMuCi0gICAgICAgIGlmICghc0dlbmVyYXRlQ2xhc3NEZXBzUGF0aC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIENvbnN0YW50UG9vbFJlZmVyZW5jZVJlYWRlci53cml0ZUNvbnN0YW50UG9vbFJlZnNUb0ZpbGUoCi0gICAgICAgICAgICAgICAgICAgIHNGdWxsQ2xhc3NQYXRoSmFyUGF0aHMsIHNHZW5lcmF0ZUNsYXNzRGVwc1BhdGgpOwotICAgICAgICB9Ci0KICAgICAgICAgc0Z1bGxDbGFzc1BhdGhDbGFzc0xvYWRlciA9IGxvYWRKYXJzKHNGdWxsQ2xhc3NQYXRoSmFyUGF0aHMpOwogICAgICAgICBzRnVsbENsYXNzUGF0aEphclBhdGhzLnJlbW92ZUFsbChkaXJlY3RDbGFzc1BhdGhKYXJQYXRocyk7CiAKZGlmZiAtLWdpdCBhL2J1aWxkL2FuZHJvaWQvYnl0ZWNvZGUvamF2YS9vcmcvY2hyb21pdW0vYnl0ZWNvZGUvQ29uc3RhbnRQb29sUmVmZXJlbmNlUmVhZGVyLmphdmEgYi9idWlsZC9hbmRyb2lkL2J5dGVjb2RlL2phdmEvb3JnL2Nocm9taXVtL2J5dGVjb2RlL0NvbnN0YW50UG9vbFJlZmVyZW5jZVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmNiZDM5Ny4uMDAwMDAwMAotLS0gYS9idWlsZC9hbmRyb2lkL2J5dGVjb2RlL2phdmEvb3JnL2Nocm9taXVtL2J5dGVjb2RlL0NvbnN0YW50UG9vbFJlZmVyZW5jZVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE5IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotcGFja2FnZSBvcmcuY2hyb21pdW0uYnl0ZWNvZGU7Ci0KLWltcG9ydCBvcmcub2JqZWN0d2ViLmFzbS5DbGFzc1JlYWRlcjsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBJbnB1dFN0cmVhbTsKLQotLyoqCi0gKiBDb21waWxlcyBsaXN0IG9mIHJlZmVyZW5jZXMgZnJvbSBhbGwgSmF2YSAuY2xhc3MgZmlsZXMgaW4gZ2l2ZW4gamFyIHBhdGhzIGJ5Ci0gKiByZWFkaW5nIGZyb20gdGhlIGNvbnN0YW50IHBvb2wsIGFuZCB3cml0ZXMgdGhpcyBsaXN0IHRvIGFuIG91dHB1dCBmaWxlLgotICogVGhpcyBsaXN0IGlzIHVzZWQgZm9yIGtlZXAgcnVsZSBnZW5lcmF0aW9uIGZvciBtYWludGFpbmluZyBjb21wYXRpYmlsaXR5IGJldHdlZW4KLSAqIGFzeW5jIERGTXMgYW5kIHN5bmNocm9ub3VzIG1vZHVsZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25zdGFudFBvb2xSZWZlcmVuY2VSZWFkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19GSUxFX1NVRkZJWCA9ICIuY2xhc3MiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDE2Mzg0OwotCi0gICAgLy8gQ29uc3RhbnRzIHJlcHJlc2VudGluZyBKYXZhIGNvbnN0YW50IHBvb2wgdGFncwotICAgIC8vIFNlZSBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2Uvc3BlY3MvanZtcy9zZTcvaHRtbC9qdm1zLTQuaHRtbCNqdm1zLTQuNAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGSUVMRF9SRUZfVEFHID0gOTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVUSE9EX1JFRl9UQUcgPSAxMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJGQUNFX01FVEhPRF9SRUZfVEFHID0gMTE7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gcmVhZEFsbEJ5dGVzKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmZmVyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBpbnQgbnVtUmVhZCA9IDA7Ci0gICAgICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbQlVGRkVSX1NJWkVdOwotICAgICAgICB3aGlsZSAoKG51bVJlYWQgPSBpbnB1dFN0cmVhbS5yZWFkKGRhdGEsIDAsIGRhdGEubGVuZ3RoKSkgIT0gLTEpIHsKLSAgICAgICAgICAgIGJ1ZmZlci53cml0ZShkYXRhLCAwLCBudW1SZWFkKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVmZmVyLnRvQnl0ZUFycmF5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2l2ZW4gYSBzZXQgb2YgcGF0aHMsIGdlbmVyYXRlcyByZWZlcmVuY2VzIHVzZWQgdG8gcHJvZHVjZSBQcm9ndWFyZCBrZWVwIHJ1bGVzCi0gICAgICogbmVjZXNzYXJ5IGZvciBhc3luY2hyb25vdXMgREZNcy4KLSAgICAgKiBJdCByZWFkcyBhbGwgcmVmZXJlbmNlcyBzdG9yZWQgaW4gY29uc3RhbnQgcG9vbHMgb2YgSmF2YSBjbGFzc2VzIGZyb20KLSAgICAgKiB0aGUgc3BlY2lmaWVkIGphciBwYXRocyBhbmQgd3JpdGVzIHRoZW0gdG8gYW4gb3V0cHV0IGZpbGUuCi0gICAgICogUmVmZXJlbmNlcyB3cml0dGVuIHRvIHRoZSBzcGVjaWZpZWQgZmlsZSBjYW4gYmUgY29udmVydGVkIHRvIGEKLSAgICAgKiBjb3JyZXNwb25kaW5nIHNldCBvZiBQcm9ndWFyZCBrZWVwIHJ1bGVzIHVzaW5nIHRoZQotICAgICAqIGNvbnN0YW50X3Bvb2xfcmVmc190b19rZWVwX3J1bGVzLnB5IHNjcmlwdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBqYXJQYXRocyBTZXQgb2YgcGF0aHMgc3BlY2lmeWluZyBKYXZhIGZpbGVzIHRvIHJlYWQgY29uc3RhbnQgcG9vbAotICAgICAqIHJlZmVyZW5jZXMgZnJvbS4KLSAgICAgKiBAcGFyYW0gb3V0cHV0RmlsZVBhdGggRmlsZSBwYXRoIHRvIHdyaXRlIG91dHB1dCB0by4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVDb25zdGFudFBvb2xSZWZzVG9GaWxlKFNldDxTdHJpbmc+IGphclBhdGhzLCBTdHJpbmcgb3V0cHV0RmlsZVBhdGgpIHsKLSAgICAgICAgSGFzaFNldDxTdHJpbmc+IGNsYXNzUmVmZXJlbmNlcyA9IG5ldyBIYXNoU2V0PD4oKTsKLQotICAgICAgICBmb3IgKFN0cmluZyBqYXJQYXRoIDogamFyUGF0aHMpIHsKLSAgICAgICAgICAgIHRyeSAoWmlwSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgWmlwSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShqYXJQYXRoKSkpKSB7Ci0gICAgICAgICAgICAgICAgWmlwRW50cnkgZW50cnk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKChlbnRyeSA9IGlucHV0U3RyZWFtLmdldE5leHRFbnRyeSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpIHx8ICFlbnRyeS5nZXROYW1lKCkuZW5kc1dpdGgoQ0xBU1NfRklMRV9TVUZGSVgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBieXRlW10gZGF0YSA9IHJlYWRBbGxCeXRlcyhpbnB1dFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzUmVhZGVyIHJlYWRlciA9IG5ldyBDbGFzc1JlYWRlcihkYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgY2xhc3NSZWZlcmVuY2VzLmFkZEFsbChjb2xsZWN0Q29uc3RhbnRQb29sQ2xhc3NSZWZlcmVuY2VzKHJlYWRlcikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBCdWZmZXJlZFdyaXRlciB3cml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIob3V0cHV0RmlsZVBhdGgpKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHJlZiA6IGNsYXNzUmVmZXJlbmNlcykgewotICAgICAgICAgICAgICAgIHdyaXRlci5hcHBlbmQocmVmKTsKLSAgICAgICAgICAgICAgICB3cml0ZXIuYXBwZW5kKCJcbiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2l2ZW4gYSBDbGFzc1JlYWRlciwgcmV0dXJuIGEgc2V0IG9mIGFsbCBzdXBlciBjbGFzc2VzLCBpbXBsZW1lbnRlZCBpbnRlcmZhY2VzIGFuZAotICAgICAqIG1lbWJlcnMgYnkgcmVhZGluZyBmcm9tIHRoZSBhc3NvY2lhdGVkIGNsYXNzJ3MgY29uc3RhbnQgcG9vbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjbGFzc1JlYWRlciAuY2xhc3MgZmlsZSBpbnRlcmZhY2UgZm9yIHJlYWRpbmcgdGhlIGNvbnN0YW50IHBvb2wuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2V0PFN0cmluZz4gY29sbGVjdENvbnN0YW50UG9vbENsYXNzUmVmZXJlbmNlcyhDbGFzc1JlYWRlciBjbGFzc1JlYWRlcikgewotICAgICAgICBjaGFyW10gY2hhckJ1ZmZlciA9IG5ldyBjaGFyW2NsYXNzUmVhZGVyLmdldE1heFN0cmluZ0xlbmd0aCgpXTsKLSAgICAgICAgSGFzaFNldDxTdHJpbmc+IGNsYXNzUmVmZXJlbmNlcyA9IG5ldyBIYXNoU2V0PD4oKTsKLQotICAgICAgICBjbGFzc1JlZmVyZW5jZXMuYWRkKGNsYXNzUmVhZGVyLmdldFN1cGVyTmFtZSgpKTsKLSAgICAgICAgY2xhc3NSZWZlcmVuY2VzLmFkZEFsbChBcnJheXMuYXNMaXN0KGNsYXNzUmVhZGVyLmdldEludGVyZmFjZXMoKSkpOwotCi0gICAgICAgIC8vIEFjY29yZGluZyB0byB0aGUgSmF2YSBzcGVjLCB0aGUgY29uc3RhbnQgcG9vbCBpcyBpbmRleGVkIGZyb20gMSB0byBjb25zdGFudF9wb29sX2NvdW50IC0KLSAgICAgICAgLy8gMS4gU2VlIGh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS9zcGVjcy9qdm1zL3NlNy9odG1sL2p2bXMtNC5odG1sI2p2bXMtNC40Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgcmVmSW5mb1N0cmluZyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgY2xhc3NSZWFkZXIuZ2V0SXRlbUNvdW50KCk7IGkrKykgewotICAgICAgICAgICAgaW50IG9mZnNldCA9IGNsYXNzUmVhZGVyLmdldEl0ZW0oaSk7Ci0gICAgICAgICAgICBpZiAob2Zmc2V0IDw9IDApIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBjb25zdGFudFR5cGUgPSBjbGFzc1JlYWRlci5yZWFkQnl0ZShvZmZzZXQgLSAxKTsKLSAgICAgICAgICAgIGlmIChvZmZzZXQgPiAwCi0gICAgICAgICAgICAgICAgICAgICYmIChjb25zdGFudFR5cGUgPT0gTUVUSE9EX1JFRl9UQUcgfHwgY29uc3RhbnRUeXBlID09IEZJRUxEX1JFRl9UQUcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBjb25zdGFudFR5cGUgPT0gSU5URVJGQUNFX01FVEhPRF9SRUZfVEFHKSkgewotICAgICAgICAgICAgICAgIC8vIFJlYWQgdGhlIGNvcnJlc3BvbmRpbmcgY2xhc3MgcmVmIGFuZCBtZW1iZXIgaW5mbyBmcm9tIHRoZSBjb25zdGFudCBwb29sLgotICAgICAgICAgICAgICAgIGludCBjbGFzc0luZGV4ID0gY2xhc3NSZWFkZXIucmVhZFVuc2lnbmVkU2hvcnQob2Zmc2V0KTsKLSAgICAgICAgICAgICAgICBpbnQgY2xhc3NTdGFydEluZGV4ID0gY2xhc3NSZWFkZXIuZ2V0SXRlbShjbGFzc0luZGV4KTsKLSAgICAgICAgICAgICAgICAvLyBDbGFzcyBpbmRleCBpcyBhIDItYnl0ZSBxdWFudGl0eSwgbmFtZUFuZFR5cGVJbmRleCBpcyBzdG9yZWQgc2VxdWVudGlhbGx5IGFmdGVyLgotICAgICAgICAgICAgICAgIGludCBuYW1lQW5kVHlwZUluZGV4ID0gY2xhc3NSZWFkZXIucmVhZFVuc2lnbmVkU2hvcnQob2Zmc2V0ICsgMik7Ci0gICAgICAgICAgICAgICAgaW50IG5hbWVBbmRUeXBlU3RhcnRJbmRleCA9IGNsYXNzUmVhZGVyLmdldEl0ZW0obmFtZUFuZFR5cGVJbmRleCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBHZXQgbWVtYmVyJ3MgY29udGFpbmluZyBjbGFzcydzIG5hbWUsIG1lbWJlcidzIG5hbWUsIGFuZCBtZW1iZXIncyBkZXRhaWxzICh0eXBlLAotICAgICAgICAgICAgICAgIC8vIHJldHVybiB0eXBlLCBhbmQgYXJndW1lbnQgdHlwZXMpLgotICAgICAgICAgICAgICAgIHJlZkluZm9TdHJpbmcuYXBwZW5kKGNsYXNzUmVhZGVyLnJlYWRVVEY4KGNsYXNzU3RhcnRJbmRleCwgY2hhckJ1ZmZlcikpOwotICAgICAgICAgICAgICAgIHJlZkluZm9TdHJpbmcuYXBwZW5kKCIsIik7Ci0gICAgICAgICAgICAgICAgcmVmSW5mb1N0cmluZy5hcHBlbmQoY2xhc3NSZWFkZXIucmVhZFVURjgobmFtZUFuZFR5cGVTdGFydEluZGV4LCBjaGFyQnVmZmVyKSk7Ci0gICAgICAgICAgICAgICAgcmVmSW5mb1N0cmluZy5hcHBlbmQoIiwiKTsKLSAgICAgICAgICAgICAgICByZWZJbmZvU3RyaW5nLmFwcGVuZChjbGFzc1JlYWRlci5yZWFkVVRGOChuYW1lQW5kVHlwZVN0YXJ0SW5kZXggKyAyLCBjaGFyQnVmZmVyKSk7Ci0KLSAgICAgICAgICAgICAgICBjbGFzc1JlZmVyZW5jZXMuYWRkKHJlZkluZm9TdHJpbmcudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgcmVmSW5mb1N0cmluZy5zZXRMZW5ndGgoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2xhc3NSZWZlcmVuY2VzOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idWlsZC9hbmRyb2lkL2NvbnN0YW50X3Bvb2xfcmVmc190b19rZWVwX3J1bGVzLnB5IGIvYnVpbGQvYW5kcm9pZC9jb25zdGFudF9wb29sX3JlZnNfdG9fa2VlcF9ydWxlcy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI0NTJkNy4uMDAwMDAwMAotLS0gYS9idWlsZC9hbmRyb2lkL2NvbnN0YW50X3Bvb2xfcmVmc190b19rZWVwX3J1bGVzLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMTkgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLSMgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotIiIiCi1UaGlzIHNjcmlwdCBpcyB1c2VkIHRvIGNvbnZlcnQgYSBsaXN0IG9mIHJlZmVyZW5jZXMgdG8gY29ycmVzcG9uZGluZyBQcm9HdWFyZAota2VlcCBydWxlcywgZm9yIHRoZSBwdXJwb3NlcyBvZiBtYWludGFpbmluZyBjb21wYXRpYmlsaXR5IGJldHdlZW4gYXN5bmMgREZNcwotYW5kIHN5bmNocm9ub3VzbHkgcHJvZ3VhcmRlZCBtb2R1bGVzLgotVGhpcyBzY3JpcHQgdGFrZSBhbiBpbnB1dCBmaWxlIGdlbmVyYXRlZCBmcm9tCi0vL2J1aWxkL2FuZHJvaWQvYnl0ZWNvZGUvamF2YS9vcmcvY2hyb21pdW0vYnl0ZWNvZGUvQnl0ZUNvZGVQcm9jZXNzb3IuamF2YQotZHVyaW5nIHRoZSBidWlsZCBwaGFzZSBvZiBhbiBhc3luYyBtb2R1bGUuCi0iIiIKLQotZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVmYXVsdGRpY3QKLWltcG9ydCBhcmdwYXJzZQotaW1wb3J0IHN5cwotCi0jIENsYXNzZXMgaW4gX0lHTk9SRURfUEFDS0FHRVMgZG8gbm90IG5lZWQgZXhwbGljaXQga2VlcCBydWxlcyBiZWNhdXNlIHRoZXkgYXJlCi0jIHN5c3RlbSBBUElzIGFuZCBhcmUgYWxyZWFkeSBpbmNsdWRlZCBpbiBQcm9HdWFyZCBjb25maWdzLgotX0lHTk9SRURfUEFDS0FHRVMgPSBbJ2phdmEnLCAnYW5kcm9pZCcsICdvcmcudzNjJywgJ29yZy54bWwnLCAnZGFsdmlrJ10KLQotIyBDbGFzc2VzIGluIF9XSElURUxJU1RfUEFDS0FHRVMgYXJlIHN1cHBvcnQgbGlicmFyaWVzIGNvbXBpbGVkIGludG8gY2hyb21lCi0jIHRoYXQgbXVzdCBieXBhc3MgdGhlIF9JR05PUkVEX1BBQ0tBR0VTLgotX1dISVRFTElTVF9QQUNLQUdFUyA9IFsnYW5kcm9pZC5zdXBwb3J0J10KLQotIyBUT0RPKGh0dHBzOi8vY3JidWcuY29tLzk2ODc2OSk6IEZpbHRlciBtYXkgYmUgdG9vIGJyb2FkLgotIyBDbGFzc2VzIGluIF9ERk1fRkVBVFVSRVMgd2lsbCBiZSBleGNsdWRlZCBmcm9tICJrZWVwIGFsbCBtZW1iZXJzIiBydWxlLgotX0RGTV9GRUFUVVJFUyA9IFsKLSAgICAnb3JnLmNocm9taXVtLmNocm9tZS5hdXRvZmlsbF9hc3Npc3RhbnQnLCAnb3JnLmNocm9taXVtLmNocm9tZS50YWJfdWknLAotICAgICdvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQnLCAnb3JnLmNocm9taXVtLmNocm9tZS52cicKLV0KLQotIyBNYXBwaW5nIGZvciB0cmFuc2xhdGluZyBKYXZhIGJ5dGVjb2RlIHR5cGUgaWRlbnRpZmllcnMgdG8gc291cmNlIGNvZGUgdHlwZQotIyBpZGVudGlmaWVycy4KLV9UWVBFX0lERU5USUZJRVJfTUFQID0gewotICAgICdWJzogJ3ZvaWQnLAotICAgICdaJzogJ2Jvb2xlYW4nLAotICAgICdCJzogJ2J5dGUnLAotICAgICdTJzogJ3Nob3J0JywKLSAgICAnQyc6ICdjaGFyJywKLSAgICAnSSc6ICdpbnQnLAotICAgICdKJzogJ2xvbmcnLAotICAgICdGJzogJ2Zsb2F0JywKLSAgICAnRCc6ICdkb3VibGUnLAotfQotCi0KLSMgVHJhbnNsYXRlcyBERVggVHlwZURlc2NyaXB0b3Igb2YgdGhlIGZpcnN0IHR5cGUgZm91bmQgaW4gYSBnaXZlbiBzdHJpbmcgdG8KLSMgaXRzIHNvdXJjZSBjb2RlIHR5cGUgaWRlbnRpZmllciwgYXMgZGVzY3JpYmVkIGluCi0jIGh0dHBzOi8vc291cmNlLmFuZHJvaWQuY29tL2RldmljZXMvdGVjaC9kYWx2aWsvZGV4LWZvcm1hdCN0eXBlZGVzY3JpcHRvciwKLSMgYW5kIHJldHVybnMgdGhlIHRyYW5zbGF0ZWQgdHlwZSBhbmQgdGhlIHN0YXJ0aW5nIGluZGV4IG9mIHRoZSBuZXh0IHR5cGUKLSMgKGlmIHByZXNlbnQpLgotZGVmIHRyYW5zbGF0ZV9zaW5nbGVfdHlwZSh0eXBlZGVzYyk6Ci0gIGFycmF5X2NvdW50ID0gMAotICB0cmFuc2xhdGVkID0gJycKLSAgbmV4dF9pbmRleCA9IDAKLQotICAjIEluIHRoZSBjb25zdGFudCBwb29sLCBmdWxseSBxdWFsaWZpZWQgbmFtZXMgKHByZWZpeGVkIGJ5ICdMJykgaGF2ZSBhCi0gICMgdHJhaWxpbmcgJzsnIGlmIHRoZXkgYXJlIGRlc2NyaWJpbmcgdGhlIHR5cGUvcmV0dXJuIHR5cGUgb2YgYSBzeW1ib2wsCi0gICMgb3IgdGhlIHR5cGUgb2YgYXJndW1lbnRzIHBhc3NlZCB0byBhIHN5bWJvbC4gVHlwZURlc2NyaXB0b3IgcmVwcmVzZW50aW5nCi0gICMgcHJpbWl0aXZlIHR5cGVzIGRvIG5vdCBoYXZlIHRyYWlsaW5nICc7J3MgaW4gYW55IGNpcmN1bXN0YW5jZXMuCi0gIGZvciBpLCBjIGluIGVudW1lcmF0ZSh0eXBlZGVzYyk6Ci0gICAgaWYgYyA9PSAnWyc6Ci0gICAgICBhcnJheV9jb3VudCArPSAxCi0gICAgICBjb250aW51ZQotICAgIGlmIGMgPT0gJ0wnOgotICAgICAgIyBGdWxseSBxdWFsaWZpZWQgbmFtZXMgaGF2ZSBubyB0cmFpbGluZyAnOycgaWYgdGhleSBhcmUgZGVzY3JpYmluZyB0aGUKLSAgICAgICMgY29udGFpbmluZyBjbGFzcyBvZiBhIHJlZmVyZW5jZS4KLSAgICAgIG5leHRfaW5kZXggPSB0eXBlZGVzYy5maW5kKCc7JykKLSAgICAgIGlmIG5leHRfaW5kZXggPT0gLTE6Ci0gICAgICAgIG5leHRfaW5kZXggPSBsZW4odHlwZWRlc2MpCi0gICAgICB0cmFuc2xhdGVkID0gdHlwZWRlc2NbaSArIDE6bmV4dF9pbmRleF0KLSAgICAgIGJyZWFrCi0gICAgZWxzZToKLSAgICAgIHRyYW5zbGF0ZWQgPSBfVFlQRV9JREVOVElGSUVSX01BUFtjXQotICAgICAgbmV4dF9pbmRleCA9IGkKLSAgICAgIGJyZWFrCi0KLSAgdHJhbnNsYXRlZCArPSAnW10nICogYXJyYXlfY291bnQKLSAgcmV0dXJuIHRyYW5zbGF0ZWQsIG5leHRfaW5kZXggKyAxCi0KLQotIyBDb252ZXJ0IHN0cmluZyBvZiBtZXRob2QgYXJndW1lbnQgdHlwZXMgcmVhZCBmcm9tIGNvbnN0YW50IHBvb2wgdG8KLSMgY29ycmVzcG9uZGluZyBsaXN0IG9mIHNyb3VjZSBjb2RlIHR5cGUgaWRlbnRpZmllcnMuCi1kZWYgcGFyc2VfYXJnc19saXN0KGFyZ3NfbGlzdCk6Ci0gIHBhcnNlZF9hcmdzID0gW10KLSAgc3RhcnRfaW5kZXggPSAwCi0KLSAgd2hpbGUgc3RhcnRfaW5kZXggPCBsZW4oYXJnc19saXN0KToKLSAgICBhcmdzX2xpc3QgPSBhcmdzX2xpc3Rbc3RhcnRfaW5kZXg6XQotICAgIHRyYW5zbGF0ZWRfYXJnLCBzdGFydF9pbmRleCA9IHRyYW5zbGF0ZV9zaW5nbGVfdHlwZShhcmdzX2xpc3QpCi0gICAgcGFyc2VkX2FyZ3MuYXBwZW5kKHRyYW5zbGF0ZWRfYXJnKQotCi0gIHJldHVybiBwYXJzZWRfYXJncwotCi0KLWRlZiBhZGRfdG9fcmVmcyhjbGFzc19uYW1lLCBrZWVwX2VudHJ5LCBkZXBfcmVmcyk6Ci0gICMgQWRkIGVudHJ5IHRvIGNsYXNzJ3Mga2VlcCBydWxlIGlmIGVudHJ5IGlzIG5vdCB0aGUgZW1wdHkgc3RyaW5nCi0gIGlmIGNsYXNzX25hbWUgaW4gZGVwX3JlZnMgYW5kIGtlZXBfZW50cnk6Ci0gICAgZGVwX3JlZnNbY2xhc3NfbmFtZV0uYXBwZW5kKGtlZXBfZW50cnkpCi0gIGVsc2U6Ci0gICAgZGVwX3JlZnNbY2xhc3NfbmFtZV0gPSBba2VlcF9lbnRyeV0KLQotCi1kZWYgc2hvdWxkX2luY2x1ZGVfY2xhc3NfcGF0aChjbGFzc19wYXRoKToKLSAgIiIiIENoZWNrIHdoZXRoZXIgYSBjbGFzc19wYXRoIHNob3VsZCBiZSBhZGRlZCBhcyBrZWVwIHJ1bGUuCi0gICAgICBDb25kaXRpb25zOgotICAgICAgICAtIENsYXNzIGlzIGF1dG8tZ2VuZXJhdGVkIChMYW1iZGFzL05lc3RlZCwgZm9yIGV4YW1wbGUgJCkKLSAgICAgICAgLSBDbGFzcyBpcyBub3QgaW4gYSBERk0gTW9kdWxlCi0gICAgICAgIC0gQ2xhc3MgaXMgbm90IGluIGEgYmxhY2svd2hpdGUgbGlzdGVkIHBhY2thZ2UKLSAgICAiIiIKLSAgbmVzdGVkX2NsYXNzID0gJyQnIGluIGNsYXNzX3BhdGgKLSAgbm90X2luX2RmbSA9IGFsbChub3QgY2xhc3NfcGF0aC5zdGFydHN3aXRoKGYpIGZvciBmIGluIF9ERk1fRkVBVFVSRVMpCi0gIGFsbG93ZWRfcGFja2FnZXMgPSBub3QgKGFueSgKLSAgICAgIGNsYXNzX3BhdGguc3RhcnRzd2l0aChwKQotICAgICAgZm9yIHAgaW4gX0lHTk9SRURfUEFDS0FHRVMpIGFuZCBhbGwobm90IGNsYXNzX3BhdGguc3RhcnRzd2l0aChwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHAgaW4gX1dISVRFTElTVF9QQUNLQUdFUykpCi0gIHJldHVybiBuZXN0ZWRfY2xhc3Mgb3IgKG5vdF9pbl9kZm0gYW5kIGFsbG93ZWRfcGFja2FnZXMpCi0KLQotZGVmIG1haW4oYXJndik6Ci0gIGRlcF9yZWZzID0gZGVmYXVsdGRpY3QobGlzdCkKLSAgZXh0ZW5kZWRfYW5kX2ltcGxlbWVudGVkX2NsYXNzZXMgPSBzZXQoKQotCi0gIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKLSAgcGFyc2VyLmFkZF9hcmd1bWVudCgKLSAgICAgICctLWlucHV0LWZpbGUnLAotICAgICAgcmVxdWlyZWQ9VHJ1ZSwKLSAgICAgIGhlbHA9J1BhdGggdG8gY29uc3RhbnQgcG9vbCByZWZlcmVuY2Ugb3V0cHV0LicpCi0gIHBhcnNlci5hZGRfYXJndW1lbnQoCi0gICAgICAnLS1vdXRwdXQtZmlsZScsCi0gICAgICByZXF1aXJlZD1UcnVlLAotICAgICAgaGVscD0nUGF0aCB0byB3cml0ZSBjb3JyZXNwb25kaW5nIGtlZXAgcnVsZXMgdG8nKQotICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoYXJndlsxOl0pCi0KLSAgd2l0aCBvcGVuKGFyZ3MuaW5wdXRfZmlsZSwgJ3InKSBhcyBjb25zdGFudF9wb29sX3JlZnM6Ci0gICAgZm9yIGxpbmUgaW4gY29uc3RhbnRfcG9vbF9yZWZzOgotICAgICAgbGluZSA9IGxpbmUucnN0cmlwKCkucmVwbGFjZSgnLycsICcuJykKLSAgICAgICMgSWdub3JlIGFueSByZWZlcmVuY2VzIHNwZWNpZmllZCBieSB0aGUgbGlzdCBvZgotICAgICAgIyBfSUdOT1JFRF9QQUNLQUdFUyBhbmQgbm90IGluIF9XSElURUxJU1RfUEFDS0FHRVMuCi0gICAgICBpZiAoYW55KGxpbmUuc3RhcnRzd2l0aChwKSBmb3IgcCBpbiBfSUdOT1JFRF9QQUNLQUdFUykKLSAgICAgICAgICBhbmQgYWxsKG5vdCBsaW5lLnN0YXJ0c3dpdGgocCkgZm9yIHAgaW4gX1dISVRFTElTVF9QQUNLQUdFUykpOgotICAgICAgICBjb250aW51ZQotCi0gICAgICByZWZsaXN0ID0gbGluZS5zcGxpdCgnLCcpCi0KLSAgICAgICMgTGluZXMgZGVub3Rpbmcgc3VwZXIgY2xhc3NlcyBhbmQgaW1wbGVtZW50ZWQgaW50ZXJmYWNlIHJlZmVyZW5jZXMgZG8KLSAgICAgICMgbm90IGNvbnRhaW4gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhbmQgdGh1cyBoYXZlIHJlZmxpc3Qgc2l6ZSAxLgotICAgICAgIyBTdG9yZSB0aGVzZSBhcyBhIHNlcGFyYXRlIHNldCBhcyB0aGV5IHJlcXVpcmUgZnVsbCBrZWVwIHJ1bGVzLgotICAgICAgaWYgbGVuKHJlZmxpc3QpID09IDE6Ci0gICAgICAgIGV4dGVuZGVkX2FuZF9pbXBsZW1lbnRlZF9jbGFzc2VzLmFkZChyZWZsaXN0WzBdKQotICAgICAgICBjb250aW51ZQotCi0gICAgICBjbGFzc19uYW1lID0gcmVmbGlzdFswXQotICAgICAgbWVtYmVyX25hbWUgPSByZWZsaXN0WzFdCi0gICAgICBtZW1iZXJfaW5mbyA9IHJlZmxpc3RbMl0KLSAgICAgIGtlZXBfZW50cnkgPSAnJwotCi0gICAgICAjIFdoZW4gdGVzdGluZyB3aXRoIHRoZSBWUiBtb2R1bGUsIGFsbCBjbGFzcyBuYW1lcyByZWFkIGZyb20gY29uc3RhbnQKLSAgICAgICMgcG9vbCBvdXRwdXQgdGhhdCB3ZXJlIHByZWZpeGVkIHdpdGggJ1snIG1hdGNoZWQgcmVmZXJlbmNlcyB0byB0aGUKLSAgICAgICMgb3ZlcnJpZGRlbiBjbG9uZSgpIG1ldGhvZCBvZiB0aGUgT2JqZWN0IGNsYXNzLiBUaGVzZSBzZWVtIHRvIGNvcnJlc3BvbmQKLSAgICAgICMgdG8gSmF2YSBlbnVtIHR5cGVzIGRlZmluZWQgd2l0aGluIGNsYXNzZXMuCi0gICAgICAjIEl0IGlzIG5vdCBlbnRpcmVseSBjbGVhciB3aGV0aGVyIG9yIG5vdCB0aGlzIGFsd2F5cyByZXByZXNlbnRzCi0gICAgICAjIGFuIGVudW0sIHdoeSBlbnVtcyB3b3VsZCBiZSByZXByZXNlbnRlZCBhcyBzdWNoIGluIHRoZSBjb25zdGFudCBwb29sLAotICAgICAgIyBvciBob3cgd2Ugc2hvdWxkIGdvIGFib3V0IGtlZXBpbmcgdGhlc2UgcmVmZXJlbmNlcy4gRm9yIHRoZSBtb21lbnQsCi0gICAgICAjIGlnbm9yaW5nIHRoZXNlIHJlZmVyZW5jZXMgZG9lcyBub3QgaW1wYWN0IGNvbXBhdGliaWxpdHkgYmV0d2VlbgotICAgICAgIyBtb2R1bGVzLgotICAgICAgaWYgY2xhc3NfbmFtZS5zdGFydHN3aXRoKCdbJyk6Ci0gICAgICAgIGNvbnRpbnVlCi0KLSAgICAgICMgSWdub3JlIFIoZXNvdXJjZXMpIGZpbGVzIHRoYXQgYXJlIGZyb20gdGhlIHNhbWUgbW9kdWxlLgotICAgICAgaWYgKCckJyBpbiBjbGFzc19uYW1lCi0gICAgICAgICAgYW5kIGFueShjbGFzc19uYW1lLnN0YXJ0c3dpdGgoZikgZm9yIGYgaW4gX0RGTV9GRUFUVVJFUykpOgotICAgICAgICBjb250aW51ZQotCi0gICAgICAjIElmIG1lbWJlcl9pbmZvIHN0YXJ0cyB3aXRoICcoJywgbWVtYmVyIGlzIGEgbWV0aG9kLCBvdGhlcndpc2UgbWVtYmVyCi0gICAgICAjIGlzIGEgZmllbGQuCi0gICAgICAjIEZvcm1hdCBrZWVwIGVudHJpZXMgYXMgcGVyIFByb0d1YXJkIGRvY3VtZW50YXRpb24KLSAgICAgICMgZ3VhcmRzcXVhcmUuY29tL2VuL3Byb2R1Y3RzL3Byb2d1YXJkL21hbnVhbC91c2FnZSNjbGFzc3NwZWNpZmljYXRpb24uCi0gICAgICBpZiBtZW1iZXJfaW5mby5zdGFydHN3aXRoKCcoJyk6Ci0gICAgICAgIGFyZ3NfbGlzdCwgcmV0dXJuX3R5cGUgPSBtZW1iZXJfaW5mby5zcGxpdCgnKScpCi0gICAgICAgIGFyZ3NfbGlzdCA9IHBhcnNlX2FyZ3NfbGlzdChhcmdzX2xpc3RbMTpdKQotICAgICAgICBpZiBtZW1iZXJfbmFtZSA9PSAnPGluaXQ+JzoKLSAgICAgICAgICAjIE5vIHJldHVybiB0eXBlIHNwZWNpZmllZCBmb3IgY29uc3RydWN0b3JzLgotICAgICAgICAgIHJldHVybl90eXBlID0gJycKLSAgICAgICAgZWxzZToKLSAgICAgICAgICByZXR1cm5fdHlwZSA9IHRyYW5zbGF0ZV9zaW5nbGVfdHlwZShyZXR1cm5fdHlwZSlbMF0KLQotICAgICAgICAjIEluY2x1ZGUgdHlwZXMgb2YgZnVuY3Rpb24gYXJndW1lbnRzLgotICAgICAgICBmb3IgYXJnX3R5cGUgaW4gYXJnc19saXN0OgotICAgICAgICAgIGlmIHNob3VsZF9pbmNsdWRlX2NsYXNzX3BhdGgoYXJnX3R5cGUpOgotICAgICAgICAgICAgZXh0ZW5kZWRfYW5kX2ltcGxlbWVudGVkX2NsYXNzZXMuYWRkKGFyZ190eXBlKQotCi0gICAgICAgICMgSW5jbHVkZSB0aGUgYWN0dWFsIGNsYXNzIHdoZW4gaXQncyBhIGNvbnN0cnVjdG9yLgotICAgICAgICBpZiBtZW1iZXJfbmFtZSA9PSAnPGluaXQ+JzoKLSAgICAgICAgICBpZiBzaG91bGRfaW5jbHVkZV9jbGFzc19wYXRoKGNsYXNzX25hbWUpOgotICAgICAgICAgICAgZXh0ZW5kZWRfYW5kX2ltcGxlbWVudGVkX2NsYXNzZXMuYWRkKGNsYXNzX25hbWUpCi0gICAgICAgICAgY29udGludWUKLQotICAgICAgICBrZWVwX2VudHJ5ID0gJyVzICVzKCVzKTsnICUgKHJldHVybl90eXBlLCBtZW1iZXJfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLCAnLmpvaW4oYXJnc19saXN0KSkKLSAgICAgIGVsc2U6Ci0gICAgICAgIGtlZXBfZW50cnkgPSAnJXMgJXM7JyAlICh0cmFuc2xhdGVfc2luZ2xlX3R5cGUobWVtYmVyX2luZm8pWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyX25hbWUpCi0KLSAgICAgIGRlcF9yZWZzW2NsYXNzX25hbWVdLmFwcGVuZChrZWVwX2VudHJ5KQotCi0gIHdpdGggb3BlbihhcmdzLm91dHB1dF9maWxlLCAndycpIGFzIGtlZXBfcnVsZXM6Ci0gICAgIyBXcml0ZSBzdXBlciBjbGFzc2VzIGFuZCBpbXBsZW1lbnRlZCBpbnRlcmZhY2VzIHRvIGtlZXAgcnVsZXMuCi0gICAgZm9yIHN1cGVyX2NsYXNzIGluIHNvcnRlZChleHRlbmRlZF9hbmRfaW1wbGVtZW50ZWRfY2xhc3Nlcyk6Ci0gICAgICBrZWVwX3J1bGVzLndyaXRlKCcta2VlcCBjbGFzcyAlcyB7ICo7IH1cbicgJSAoc3VwZXJfY2xhc3MucnN0cmlwKCkpKQotICAgICAga2VlcF9ydWxlcy53cml0ZSgnXG4nKQotICAgICMgV3JpdGUgYWxsIG90aGVyIGNsYXNzIHJlZmVyZW5jZXMgdG8ga2VlcCBydWxlcy4KLSAgICBmb3IgYyBpbiBzb3J0ZWQoZGVwX3JlZnMuaXRlcmtleXMoKSk6Ci0gICAgICBpZiBjIGluIGV4dGVuZGVkX2FuZF9pbXBsZW1lbnRlZF9jbGFzc2VzOgotICAgICAgICBjb250aW51ZQotICAgICAgY2xhc3Nfa2VlcHMgPSAnXG4gICcuam9pbihkZXBfcmVmc1tjXSkKLSAgICAgIGtlZXBfcnVsZXMud3JpdGUoJy1rZWVwIGNsYXNzICVzIHtcbiAgJXNcbn1cbicgJSAoYywgY2xhc3Nfa2VlcHMpKQotICAgICAga2VlcF9ydWxlcy53cml0ZSgnXG4nKQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gIG1haW4oc3lzLmFyZ3YpCmRpZmYgLS1naXQgYS9idWlsZC9hbmRyb2lkL2NvbnN0YW50X3Bvb2xfcmVmc190b19rZWVwX3J1bGVzX3Rlc3QucHkgYi9idWlsZC9hbmRyb2lkL2NvbnN0YW50X3Bvb2xfcmVmc190b19rZWVwX3J1bGVzX3Rlc3QucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMjgxZTIuLjAwMDAwMDAKLS0tIGEvYnVpbGQvYW5kcm9pZC9jb25zdGFudF9wb29sX3JlZnNfdG9fa2VlcF9ydWxlc190ZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAxOSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotIyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi1pbXBvcnQgdW5pdHRlc3QKLWltcG9ydCByZQotaW1wb3J0IG9zCi0KLQotY2xhc3MgVGVzdFByb2d1YXJkUnVsZUdlbmVyYXRpb24odW5pdHRlc3QuVGVzdENhc2UpOgotICAiIiIKLSAgVGhpcyBzY3JpcHQgaXMgdXNlZCB0byB0ZXN0IGEgUHJvR3VhcmQga2VlcCBydWxlcyBmb3IgdGhlIHB1cnBvc2VzCi0gIG9mIG1haW50YWluaW5nIGNvbXBhdGliaWxpdHkgYmV0d2VlbiBhc3luYyBERk1zIGFuZCBzeW5jaHJvbm91c2x5Ci0gIHByb2d1YXJkZWQgbW9kdWxlcy4KLQotICBUaGUgcnVsZXMgYXJlIG9mdGVuIGdlbmVyYXRlZCBieSBjb25zdGFudF9wb29sX3JlZnNfdG9fa2VlcF9ydWxlcy5weQotCi0gIFRoaXMgdGVzdCBjYW4gYmUgcnVuIG1hbnVhbGx5LiBFeGFtcGxlOgotICBweXRob24gYnVpbGQvYW5kcm9pZC9jb25zdGFudF9wb29sX3JlZnNfdG9fa2VlcF9ydWxlc190ZXN0LnB5IC12Ci0gICIiIgotCi0gICMgTWFrZSBzdXJlIHRoaXMgdmFyaWFibGUgaXMgc2V0IGFjY29yZGluZ2x5LgotICAjIEl0IHNob3VsZCBwb2ludCB0byBhIHByb2d1YXJkIGZpbGUuCi0gIFBST0dVQVJEX0ZJTEVfUEFUSCA9IG9zLnBhdGguam9pbigKLSAgICAgIG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksCi0gICAgICAiLi4vLi4vY2hyb21lL2FuZHJvaWQvZmVhdHVyZXMvdGFiX3VpL3Byb2d1YXJkX2FzeW5jLmZsYWdzIikKLQotICBkZWYgdGVzdF9UYWJVSV9IYXNSdWxlcyhzZWxmKToKLSAgICAiIiIKLSAgICBFbnN1cmVzIHRoYXQgYSBmZXcgb2YgdGhlIHJ1bGVzIHVzZWQgaW4gdGFic191aSBtb2R1bGUgYXJlIGluY2x1ZGVkLgotICAgIEFsdGhvdWdoIHRoaXMgaXMgZmFyIGZyb20gMTAwJSBkZXRlcm1pbmlzdGljLCB0aGVzZSBydWxlcyBhcmUKLSAgICBjcmVhdGVkIGJ5IGNvZGUgdGhhdCBleGVyY2lzZSBkaWZmZXJlbnQgcGFydHMgb2YgdGhlIHJ1bGUgZ2VuZXJhdGlvbiBjb2RlLgotICAgICIiIgotCi0gICAgcnVsZXMgPSBzZXQoKQotICAgIHdpdGggb3BlbihzZWxmLlBST0dVQVJEX0ZJTEVfUEFUSCwgJ3InKSBhcyBwcm9ndWFyZF9ydWxlczoKLSAgICAgIGZvciBsaW5lIGluIHByb2d1YXJkX3J1bGVzOgotICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJy1rZWVwJyk6Ci0gICAgICAgICAgcnVsZSA9IHJlLnNlYXJjaCgnY2xhc3MgKC4rPykgeycsIGxpbmUpLmdyb3VwKDEpCi0gICAgICAgICAgcnVsZXMuYWRkKHJ1bGUpCi0KLSAgICAjIFRoZSBmb2xsb3dpbmcgcnVsZXMgdGVzdCBtb3N0IG9mIHRoZSB1c2UgY2FzZXMgZm9yCi0gICAgIyBydWxlcyB0aGF0IGNhbiBiZSBhZGRlZCBhdXRvbWF0aWNhbGx5LgotICAgIHNlbGYuYXNzZXJ0SW4oJ29yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuUHJvcGVydHlNb2RlbCcsIHJ1bGVzKQotICAgIHNlbGYuYXNzZXJ0SW4oJ29yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuUHJvcGVydHlNb2RlbCcsIHJ1bGVzKQotICAgIHNlbGYuYXNzZXJ0SW4oJ29yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuUHJvcGVydHlLZXknLCBydWxlcykKLSAgICBzZWxmLmFzc2VydEluKCdvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudG9vbGJhci5Ub29sYmFyTWFuYWdlcicsIHJ1bGVzKQotICAgIHNlbGYuYXNzZXJ0SW4oJ29yZy5jaHJvbWl1bS5iYXNlLlN1cHBsaWVyJywgcnVsZXMpCi0gICAgc2VsZi5hc3NlcnRJbignYW5kcm9pZC5zdXBwb3J0LnY3LndpZGdldC5oZWxwZXIuSXRlbVRvdWNoSGVscGVyJywgcnVsZXMpCi0gICAgc2VsZi5hc3NlcnRJbigKLSAgICAgICAgJ2FuZHJvaWQuc3VwcG9ydC52Ny53aWRnZXQuaGVscGVyLkl0ZW1Ub3VjaEhlbHBlciRTaW1wbGVDYWxsYmFjaycsCi0gICAgICAgIHJ1bGVzKQotICAgIHNlbGYuYXNzZXJ0SW4oJ2FuZHJvaWQuc3VwcG9ydC52Ny53aWRnZXQuaGVscGVyLkl0ZW1Ub3VjaEhlbHBlciRDYWxsYmFjaycsCi0gICAgICAgICAgICAgICAgICBydWxlcykKLSAgICBzZWxmLmFzc2VydEluKCdhbmRyb2lkLnN1cHBvcnQudjQuY29udGVudC5Db250ZXh0Q29tcGF0JywgcnVsZXMpCi0gICAgc2VsZi5hc3NlcnRJbignYW5kcm9pZC5zdXBwb3J0LnY3LndpZGdldC5HcmlkTGF5b3V0TWFuYWdlcicsIHJ1bGVzKQotICAgIHNlbGYuYXNzZXJ0SW4oJ2FuZHJvaWQuc3VwcG9ydC52NC5jb250ZW50LnJlcy5SZXNvdXJjZXNDb21wYXQnLCBydWxlcykKLSAgICBzZWxmLmFzc2VydEluKAotICAgICAgICAnb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYmdyb3VwLlRhYkdyb3VwTW9kZWxGaWx0ZXInLCBydWxlcykKLSAgICBzZWxmLmFzc2VydEluKCdhbmRyb2lkLnN1cHBvcnQudjcud2lkZ2V0LlJlY3ljbGVyVmlldyRWaWV3SG9sZGVyJywgcnVsZXMpCi0gICAgc2VsZi5hc3NlcnRJbignYW5kcm9pZC5zdXBwb3J0LnY3LndpZGdldC5SZWN5Y2xlclZpZXcnLCBydWxlcykKLSAgICBzZWxmLmFzc2VydEluKCdvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlNpbXBsZVJlY3ljbGVyVmlld01jcEJhc2UnLCBydWxlcykKLSAgICBzZWxmLmFzc2VydEluKCdvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlJlY3ljbGVyVmlld0FkYXB0ZXInLCBydWxlcykKLQotICAgICMgVGhlIGZvbGxvd2luZyBydWxlcyBuZWVkIHRvIGJlIGFkZGVkIG1hbnVhbGx5LgotICAgIHNlbGYuYXNzZXJ0Tm90SW4oCi0gICAgICAgICdvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuZnVsbHNjcmVlbi5DaHJvbWVGdWxsc2NyZWVuTWFuYWdlcicgKwotICAgICAgICAnJEZ1bGxzY3JlZW5MaXN0ZW5lciQkQ0MnLCBydWxlcykKLSAgICBzZWxmLmFzc2VydE5vdEluKAotICAgICAgICAnb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLndpZGdldC5ib3R0b21zaGVldC5Cb3R0b21TaGVldCcgKwotICAgICAgICAnJEJvdHRvbVNoZWV0Q29udGVudCQkQ0MnLCBydWxlcykKLSAgICBzZWxmLmFzc2VydE5vdEluKCdvcmcuY2hyb21pdW0udWkud2lkZ2V0LlJvdW5kZWRDb3JuZXJJbWFnZVZpZXcnLCBydWxlcykKLSAgICBzZWxmLmFzc2VydE5vdEluKAotICAgICAgICAnYW5kcm9pZC5zdXBwb3J0LnY0LmdyYXBoaWNzLmRyYXdhYmxlLlJvdW5kZWRCaXRtYXBEcmF3YWJsZScsIHJ1bGVzKQotCi0gIGRlZiB0ZXN0X1RhYlVJX0hhc05vRHVwbGljYXRlUnVsZXMoc2VsZik6Ci0gICAgIiIiCi0gICAgRW5zdXJlcyB0aGF0IHRoZXJlIGFyZSBubyBkdXBsaWNhdGUga2VlcCBydWxlcwotICAgICIiIgotCi0gICAgcnVsZXMgPSBzZXQoKQotICAgIHdpdGggb3BlbihzZWxmLlBST0dVQVJEX0ZJTEVfUEFUSCwgJ3InKSBhcyBwcm9ndWFyZF9ydWxlczoKLSAgICAgIGZvciBsaW5lIGluIHByb2d1YXJkX3J1bGVzOgotICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJy1rZWVwJyk6Ci0gICAgICAgICAgcnVsZSA9IHJlLnNlYXJjaCgnY2xhc3MgKC4rPykgeycsIGxpbmUpLmdyb3VwKDEpCi0gICAgICAgICAgc2VsZi5hc3NlcnROb3RJbihydWxlLCBydWxlcykKLSAgICAgICAgICBydWxlcy5hZGQocnVsZSkKLQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2J1aWxkL2FuZHJvaWQvZ3lwL2J5dGVjb2RlX3Byb2Nlc3Nvci5weSBiL2J1aWxkL2FuZHJvaWQvZ3lwL2J5dGVjb2RlX3Byb2Nlc3Nvci5weQppbmRleCBlMWJmZWZjLi43Njc3NWQzIDEwMDc1NQotLS0gYS9idWlsZC9hbmRyb2lkL2d5cC9ieXRlY29kZV9wcm9jZXNzb3IucHkKKysrIGIvYnVpbGQvYW5kcm9pZC9neXAvYnl0ZWNvZGVfcHJvY2Vzc29yLnB5CkBAIC0zNiw3ICszNiw2IEBACiAgIF9BZGRTd2l0Y2gocGFyc2VyLCAnLS1lbmFibGUtYXNzZXJ0JykKICAgX0FkZFN3aXRjaChwYXJzZXIsICctLWVuYWJsZS10aHJlYWQtYW5ub3RhdGlvbnMnKQogICBfQWRkU3dpdGNoKHBhcnNlciwgJy0tZW5hYmxlLWNoZWNrLWNsYXNzLXBhdGgnKQotICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWVuYWJsZS1jbGFzcy1kZXBzLW91dHB1dCcsIGRlZmF1bHQ9JycpCiAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncyhhcmd2KQogCiAgIHNka19qYXJzID0gYnVpbGRfdXRpbHMuUGFyc2VHbkxpc3QoYXJncy5zZGtfY2xhc3NwYXRoX2phcnMpCkBAIC01OCw3ICs1Nyw2IEBACiAgICAgICBhcmdzLnNjcmlwdCwgYXJncy5pbnB1dF9qYXIsIGFyZ3Mub3V0cHV0X2phciwgdmVyYm9zZSwgYXJncy5pc19wcmVidWlsdCwKICAgICAgIGFyZ3MuZW5hYmxlX2Fzc2VydCwgYXJncy5lbmFibGVfY3VzdG9tX3Jlc291cmNlcywKICAgICAgIGFyZ3MuZW5hYmxlX3RocmVhZF9hbm5vdGF0aW9ucywgYXJncy5lbmFibGVfY2hlY2tfY2xhc3NfcGF0aCwKLSAgICAgIGFyZ3MuZW5hYmxlX2NsYXNzX2RlcHNfb3V0cHV0LAogICAgICAgc3RyKGxlbihzZGtfamFycykpCiAgIF0gKyBzZGtfamFycyArIFtzdHIobGVuKGRpcmVjdF9qYXJzKSldICsgZGlyZWN0X2phcnMgKyBleHRyYV9jbGFzc3BhdGhfamFycykKICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKGNtZCkKZGlmZiAtLWdpdCBhL2J1aWxkL2FuZHJvaWQvZ3lwL3Byb2d1YXJkLnB5IGIvYnVpbGQvYW5kcm9pZC9neXAvcHJvZ3VhcmQucHkKaW5kZXggNGY3Yjk5Mi4uMDkxZDdkNyAxMDA3NTUKLS0tIGEvYnVpbGQvYW5kcm9pZC9neXAvcHJvZ3VhcmQucHkKKysrIGIvYnVpbGQvYW5kcm9pZC9neXAvcHJvZ3VhcmQucHkKQEAgLTExMSw4ICsxMTEsNyBAQAogICBwYXJzZXIuYWRkX2FyZ3VtZW50KAogICAgICAgJy0tdmVyYm9zZScsICctdicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGhlbHA9J1ByaW50IGFsbCBQcm9HdWFyZCBvdXRwdXQnKQogICBwYXJzZXIuYWRkX2FyZ3VtZW50KAotICAgICAgJy0tcmVwYWNrYWdlLWNsYXNzZXMnLAotICAgICAgaGVscD0nVW5pcXVlIHBhY2thZ2UgbmFtZSBnaXZlbiB0byBhbiBhc3luY2hyb25vdXNseSBwcm9ndWFyZGVkIG1vZHVsZScpCisgICAgICAnLS1yZXBhY2thZ2UtY2xhc3NlcycsIGhlbHA9J1BhY2thZ2UgYWxsIG9wdGltaXplZCBjbGFzc2VzIGFyZSBwdXQgaW4uJykKICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKICAgICAgICctLWRpc2FibGUtb3V0bGluaW5nJywKICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCmRpZmYgLS1naXQgYS9idWlsZC9hbmRyb2lkL3B5bGliL2xvY2FsL2VtdWxhdG9yL2F2ZC5weSBiL2J1aWxkL2FuZHJvaWQvcHlsaWIvbG9jYWwvZW11bGF0b3IvYXZkLnB5CmluZGV4IGYzYWI0Zjk5Li5lMDhkOWE5IDEwMDY0NAotLS0gYS9idWlsZC9hbmRyb2lkL3B5bGliL2xvY2FsL2VtdWxhdG9yL2F2ZC5weQorKysgYi9idWlsZC9hbmRyb2lkL3B5bGliL2xvY2FsL2VtdWxhdG9yL2F2ZC5weQpAQCAtMjMxLDYgKzIzMSw5IEBACiAgICAgICAgIGNvbmZpZ19pbmlfZmlsZS53cml0ZSgKICAgICAgICAgICAgIHRleHR3cmFwLmRlZGVudCgiIiJcCiAgICAgICAgICAgICAgICAgZGlzay5kYXRhUGFydGl0aW9uLnNpemU9NEcKKyAgICAgICAgICAgICAgICBody5sY2QuZGVuc2l0eT0xNjAKKyAgICAgICAgICAgICAgICBody5sY2QuaGVpZ2h0PTk2MAorICAgICAgICAgICAgICAgIGh3LmxjZC53aWR0aD00ODAKICAgICAgICAgICAgICAgICAiIiIpKQogCiAgICAgICAjIFN0YXJ0ICYgc3RvcCB0aGUgQVZELgpkaWZmIC0tZ2l0IGEvYnVpbGQvY29uZmlnL2FuZHJvaWQvaW50ZXJuYWxfcnVsZXMuZ25pIGIvYnVpbGQvY29uZmlnL2FuZHJvaWQvaW50ZXJuYWxfcnVsZXMuZ25pCmluZGV4IGRmZjM0MzkuLmZiOTgwMTI4IDEwMDY0NAotLS0gYS9idWlsZC9jb25maWcvYW5kcm9pZC9pbnRlcm5hbF9ydWxlcy5nbmkKKysrIGIvYnVpbGQvY29uZmlnL2FuZHJvaWQvaW50ZXJuYWxfcnVsZXMuZ25pCkBAIC0xNTI5LDEwICsxNTI5LDggQEAKICAgICBfZGVzdWdhciA9IGRlZmluZWQoaW52b2tlci5zdXBwb3J0c19hbmRyb2lkKSAmJiBpbnZva2VyLnN1cHBvcnRzX2FuZHJvaWQKICAgICBfamFjb2NvX2luc3RydW1lbnQgPSBpbnZva2VyLmphY29jb19pbnN0cnVtZW50CiAKLSAgICBfZW5hYmxlX2NsYXNzX2RlcHNfb3V0cHV0ID0gZGVmaW5lZChpbnZva2VyLmVuYWJsZV9jbGFzc19kZXBzX291dHB1dCkKICAgICBfZW5hYmxlX2J5dGVjb2RlX3Jld3JpdGVyID0KLSAgICAgICAgX2VuYWJsZV9hc3NlcnQgfHwgX2VuYWJsZV9jdXN0b21fcmVzb3VyY2VzIHx8Ci0gICAgICAgIF9lbmFibGVfdGhyZWFkX2Fubm90YXRpb25zIHx8IF9lbmFibGVfY2xhc3NfZGVwc19vdXRwdXQKKyAgICAgICAgX2VuYWJsZV9hc3NlcnQgfHwgX2VuYWJsZV9jdXN0b21fcmVzb3VyY2VzIHx8IF9lbmFibGVfdGhyZWFkX2Fubm90YXRpb25zCiAgICAgX2lzX3ByZWJ1aWx0ID0gZGVmaW5lZChpbnZva2VyLmlzX3ByZWJ1aWx0KSAmJiBpbnZva2VyLmlzX3ByZWJ1aWx0CiAgICAgX2VuYWJsZV9ieXRlY29kZV9jaGVja3MgPSAhZGVmaW5lZChpbnZva2VyLmVuYWJsZV9ieXRlY29kZV9jaGVja3MpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZva2VyLmVuYWJsZV9ieXRlY29kZV9jaGVja3MKQEAgLTE1NDgsNyArMTU0Niw2IEBACiAgICAgaWYgKGRlZmluZWQoaW52b2tlci5lbmFibGVfYnl0ZWNvZGVfcmV3cml0ZXIpKSB7CiAgICAgICBub3RfbmVlZGVkKFsKICAgICAgICAgICAgICAgICAgICAiX2VuYWJsZV9hc3NlcnQiLAotICAgICAgICAgICAgICAgICAgICJfZW5hYmxlX2NsYXNzX2RlcHNfb3V0cHV0IiwKICAgICAgICAgICAgICAgICAgICAiX2VuYWJsZV9jdXN0b21fcmVzb3VyY2VzIiwKICAgICAgICAgICAgICAgICAgICAiX2VuYWJsZV90aHJlYWRfYW5ub3RhdGlvbnMiLAogICAgICAgICAgICAgICAgICBdKQpAQCAtMTYxNiwxMCArMTYxMyw2IEBACiAgICAgICAgIGlmIChfZW5hYmxlX2J5dGVjb2RlX2NoZWNrcykgewogICAgICAgICAgIGFyZ3MgKz0gWyAiLS1lbmFibGUtY2hlY2stY2xhc3MtcGF0aCIgXQogICAgICAgICB9Ci0gICAgICAgIGlmIChfZW5hYmxlX2NsYXNzX2RlcHNfb3V0cHV0KSB7Ci0gICAgICAgICAgYXJncyArPSBbICItLWVuYWJsZS1jbGFzcy1kZXBzLW91dHB1dCIgXSArCi0gICAgICAgICAgICAgICAgICBbIGludm9rZXIuZW5hYmxlX2NsYXNzX2RlcHNfb3V0cHV0IF0KLSAgICAgICAgfQogICAgICAgICBhcmdzICs9IFsKICAgICAgICAgICAiLS1kaXJlY3QtY2xhc3NwYXRoLWphcnMiLAogICAgICAgICAgICJARmlsZUFyZygkX3JlYmFzZWRfYnVpbGRfY29uZmlnOmphdmFjOmNsYXNzcGF0aCkiLApAQCAtMzYyOCw3ICszNjIxLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVuYWJsZV9ieXRlY29kZV9jaGVja3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5hYmxlX2J5dGVjb2RlX3Jld3JpdGVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVuYWJsZV9jbGFzc19kZXBzX291dHB1dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqYXJfZXhjbHVkZWRfcGF0dGVybnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiamFyX2luY2x1ZGVkX3BhdHRlcm5zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCmRpZmYgLS1naXQgYS9idWlsZC9jb25maWcvYW5kcm9pZC9ydWxlcy5nbmkgYi9idWlsZC9jb25maWcvYW5kcm9pZC9ydWxlcy5nbmkKaW5kZXggMTVmZTI3NC4uYWVmZjU3MTkgMTAwNjQ0Ci0tLSBhL2J1aWxkL2NvbmZpZy9hbmRyb2lkL3J1bGVzLmduaQorKysgYi9idWlsZC9jb25maWcvYW5kcm9pZC9ydWxlcy5nbmkKQEAgLTI3NzksNyArMjc3OSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2VfbW9kdWxlX3RhcmdldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNocm9taXVtX2NvZGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzc3BhdGhfZGVwcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVuYWJsZV9jbGFzc19kZXBzX291dHB1dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImphY29jb19uZXZlcl9pbnN0cnVtZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiamF2YV9maWxlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImphdmFjX2FyZ3MiLApAQCAtMzUwOCw3ICszNTA3LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YV9kZXBzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVuYWJsZV9jaHJvbWl1bV9saW5rZXJfdGVzdHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmFibGVfY2xhc3NfZGVwc19vdXRwdXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmFibGVfbXVsdGlkZXgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZW5lcmF0ZV9idWlsZGNvbmZpZ19qYXZhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2VuZXJhdGVfZmluYWxfam5pIiwKQEAgLTQzODcsMTMgKzQzODUsNiBAQAogICAjICAgICAgbW9kdWxlIG5hbWUgKHdoaWNoIGNhbm5vdCBiZSAnYmFzZScsIHNpbmNlIHRoaXMgaXMgcmVzZXJ2ZWQgZm9yIHRoZQogICAjICAgICAgYmFzZSBtb2R1bGUpLCBhbmQgYW4gJ2Fwa190YXJnZXQnIGZpZWxkIHRoYXQgc3BlY2lmaWVkIHRoZQogICAjICAgICAgY29ycmVzcG9uZGluZyBhbmRyb2lkX2FwayB0YXJnZXQgbmFtZSB0aGUgbW9kdWxlIGlzIG1vZGVsZWQgb24uCi0gICMgICAgICBBIHNjb3BlIG1heSBoYXZlIGFuIGFkZGl0aW9uYWwgZmllbGQsICdwcm9ndWFyZF9hc3luYycsIHRoYXQKLSAgIyAgICAgIHNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0aGUgbW9kdWxlIGlzIGFzeW5jaHJvbm91cy4gVGhpcyBmaWVsZCBzaG91bGQKLSAgIyAgICAgIGJlIHNldCB0byB0cnVlIGlmIHRoZSBtb2R1bGUgaXMgYXN5bmNocm9ub3VzLCBhbmQgc2V0IHRvIGZhbHNlIG9yIGxlZnQKLSAgIyAgICAgIHVuZGVmaW5lZCBvdGhlcndpc2UuCi0gICMgICAgICBBc3luYyBtb2R1bGVzIGFyZSB0aG9zZSB0aGF0IGFyZSBwcm9ndWFyZGVkIGluIGEgc2VwYXJhdGUgYnVpbGQgc3RlcC4KLSAgIyAgICAgIFRoaXMgZW5zdXJlcyB0aGF0IGNoYW5nZXMgdG8gdGhlc2UgbW9kdWxlcyBkbyBub3QgY2hhbmdlIHRoZSBiYXNlCi0gICMgICAgICBtb2R1bGUuCiAgICMKICAgIyAgICBlbmFibGVfbGFuZ3VhZ2Vfc3BsaXRzOiBPcHRpb25hbC4gSWYgdHJ1ZSwgZW5hYmxlIEFQSyBzcGxpdHMgYmFzZWQKICAgIyAgICAgIG9uIGxhbmd1YWdlcy4KQEAgLTQ0NzYsNyArNDQ2Nyw3IEBACiAgICAgX3JlYmFzZWRfYmFzZV9tb2R1bGVfYnVpbGRfY29uZmlnID0KICAgICAgICAgcmViYXNlX3BhdGgoX2Jhc2VfbW9kdWxlX2J1aWxkX2NvbmZpZywgcm9vdF9idWlsZF9kaXIpCiAKLSAgICBfc3luY19tb2R1bGVzID0gWworICAgIF9tb2R1bGVzID0gWwogICAgICAgewogICAgICAgICBuYW1lID0gImJhc2UiCiAgICAgICAgIG1vZHVsZV90YXJnZXQgPSBpbnZva2VyLmJhc2VfbW9kdWxlX3RhcmdldApAQCAtNDQ4NSw4ICs0NDc2LDYgQEAKICAgICAgIH0sCiAgICAgXQogCi0gICAgX2FzeW5jX21vZHVsZXMgPSBbXQotCiAgICAgX3Byb2d1YXJkX2VuYWJsZWQgPQogICAgICAgICBkZWZpbmVkKGludm9rZXIucHJvZ3VhcmRfZW5hYmxlZCkgJiYgaW52b2tlci5wcm9ndWFyZF9lbmFibGVkCiAgICAgX2VuYWJsZV9tdWx0aWRleCA9CkBAIC00NTA3LDEwICs0NDk2LDcgQEAKICAgICAgICAgX3N5bmNfZGV4X3RhcmdldCA9ICIke3RhcmdldF9uYW1lfV9fc3luY19kZXgiCiAgICAgICAgIF9zeW5jX2RleF90YXJnZXRfZGVwID0gIjokX3N5bmNfZGV4X3RhcmdldCIKICAgICAgIH0KLQotICAgICAgIyBUT0RPKGNyYnVnLmNvbS85Mzg2MzUpOiBDb21iaW5lIHN5bmNocm9ub3VzIHByb2d1YXJkIHJ1biBtYXBwaW5nIGZpbGUKLSAgICAgICMgYW5kIGFzeW5jaHJvbm91cyBwcm9ndWFyZCBydW4gbWFwcGluZyBmaWxlcyBpbnRvIHNpbmdsZSAubWFwcGluZy4KLSAgICAgIF9zeW5jX3Byb2d1YXJkX21hcHBpbmdfcGF0aCA9ICIke19idW5kbGVfcGF0aH0ubWFwcGluZyIKKyAgICAgIF9wcm9ndWFyZF9tYXBwaW5nX3BhdGggPSAiJHtfYnVuZGxlX3BhdGh9Lm1hcHBpbmciCiAgICAgfQogCiAgICAgYXNzZXJ0KF9wcm9ndWFyZF9lbmFibGVkIHx8ICFkZWZpbmVkKGludm9rZXIuZW5hYmxlX211bHRpZGV4KSwKQEAgLTQ1MjAsMTEgKzQ1MDYsNiBAQAogICAgICAgX21vZHVsZV9jb3VudCA9IDAKICAgICAgIG5vdF9uZWVkZWQoWyAiX21vZHVsZV9jb3VudCIgXSkKIAotICAgICAgIyBEZWZpbmUgdW5pcXVlIHBhY2thZ2UgZm9yIGVhY2ggYXN5bmMgcHJvZ3VhcmRpbmcgcnVuLgotICAgICAgX2FzeW5jX3BhY2thZ2VfbnVtYmVyID0gMQotCi0gICAgICBub3RfbmVlZGVkKFsgIl9hc3luY19wYWNrYWdlX251bWJlciIgXSkKLQogICAgICAgZm9yZWFjaChfbW9kdWxlLCBpbnZva2VyLmV4dHJhX21vZHVsZXMpIHsKICAgICAgICAgX21vZHVsZV9jb3VudCArPSAxCiAgICAgICAgIGFzc2VydChkZWZpbmVkKF9tb2R1bGUubmFtZSksCkBAIC00NTQyLDY4ICs0NTIzLDIzIEBACiAgICAgICAgICAgICAiJF9tb2R1bGVfdGFyZ2V0X2dlbl9kaXIvJHtfbW9kdWxlX3RhcmdldF9uYW1lfS5idWlsZF9jb25maWciCiAgICAgICAgIF9tb2R1bGUuYnVpbGRfY29uZmlnX3RhcmdldCA9CiAgICAgICAgICAgICAiJF9tb2R1bGVfdGFyZ2V0JGJ1aWxkX2NvbmZpZ190YXJnZXRfc3VmZml4IgotCi0gICAgICAgIGlmIChkZWZpbmVkKF9tb2R1bGUucHJvZ3VhcmRfYXN5bmMpICYmIF9tb2R1bGUucHJvZ3VhcmRfYXN5bmMpIHsKLSAgICAgICAgICBpZiAoX3Byb2d1YXJkX2VuYWJsZWQpIHsKLSAgICAgICAgICAgICMgVXNlIGFzeW5jaHJvbm91cyBwcm9ndWFyZGluZyBmb3IgYXN5bmMgbW9kdWxlcy4KLSAgICAgICAgICAgIF9hc3luY19wcm9ndWFyZF9tYXBwaW5nX3BhdGggPQotICAgICAgICAgICAgICAgICIke19idW5kbGVfcGF0aH1fJHtfbW9kdWxlLm5hbWV9Lm1hcHBpbmciCi0KLSAgICAgICAgICAgIF9kZXhfemlwID0gIiR7dGFyZ2V0X291dF9kaXJ9LyR7dGFyZ2V0X25hbWV9LyR7dGFyZ2V0X25hbWV9XyR7X21vZHVsZS5uYW1lfV9kZXguemlwIgotICAgICAgICAgICAgX21vZHVsZS5kZXhfcGF0aCA9IF9kZXhfemlwCi0KLSAgICAgICAgICAgICMgR2l2ZSB1bmlxdWUgbmFtZSB0byBlYWNoIGFzeW5jIGRleCB0YXJnZXQgdXNpbmcgbW9kdWxlIG5hbWUuCi0gICAgICAgICAgICBfYXN5bmNfZGV4X3RhcmdldCA9ICIke3RhcmdldF9uYW1lfV8ke19tb2R1bGUubmFtZX1fZGV4IgotCi0gICAgICAgICAgICBkZXgoX2FzeW5jX2RleF90YXJnZXQpIHsKLSAgICAgICAgICAgICAgZW5hYmxlX211bHRpZGV4ID0gX2VuYWJsZV9tdWx0aWRleAotICAgICAgICAgICAgICBwcm9ndWFyZF9lbmFibGVkID0gdHJ1ZQotICAgICAgICAgICAgICBwcm9ndWFyZF9tYXBwaW5nX3BhdGggPSBfYXN5bmNfcHJvZ3VhcmRfbWFwcGluZ19wYXRoCi0gICAgICAgICAgICAgIGZvcndhcmRfdmFyaWFibGVzX2Zyb20oaW52b2tlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvZ3VhcmRfamFyX3BhdGgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1pbl9zZGtfdmVyc2lvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKLSAgICAgICAgICAgICAgYnVpbGRfY29uZmlnID0gX21vZHVsZS5idWlsZF9jb25maWcKLSAgICAgICAgICAgICAgcmVwYWNrYWdlX2NsYXNzZXMgPSAiYXAke19hc3luY19wYWNrYWdlX251bWJlcn0iCi0KLSAgICAgICAgICAgICAgIyBUT0RPKGh0dHBzOi8vY3JidWcuY29tLzk1Mjg1OCk6IFI4IGN1cnJlbnRseSBkb2Vzbid0IGhhbmRsZQotICAgICAgICAgICAgICAjIGFwcGx5aW5nIG1hcHBpbmcgZmlsZXMuCi0gICAgICAgICAgICAgICMgUGFzcyBtYXBwaW5nIGZpbGUgb2Ygc3luY2hyb25vdXMgcHJvZ3VhcmRpbmcgcnVuIHRvIGFzeW5jCi0gICAgICAgICAgICAgICMgbW9kdWxlIHByb2d1YXJkaW5nIHJ1bnMgdG8gcHJlc2VydmUgY29tcGF0aWJpbGl0eS4KLSAgICAgICAgICAgICAgIyBhcHBseV9tYXBwaW5nID0gX3N5bmNfcHJvZ3VhcmRfbWFwcGluZ19wYXRoCi0KLSAgICAgICAgICAgICAgZGVwcyA9IFsKLSAgICAgICAgICAgICAgICBfbW9kdWxlLm1vZHVsZV90YXJnZXQsCi0gICAgICAgICAgICAgICAgX3N5bmNfZGV4X3RhcmdldF9kZXAsCi0gICAgICAgICAgICAgIF0KLQotICAgICAgICAgICAgICBvdXRwdXQgPSBfZGV4X3ppcAotICAgICAgICAgICAgfQotICAgICAgICAgICAgX21vZHVsZS5hc3luY19kZXhfdGFyZ2V0ID0gX2FzeW5jX2RleF90YXJnZXQKLSAgICAgICAgICAgIF9hc3luY19wYWNrYWdlX251bWJlciArPSAxCi0gICAgICAgICAgfQotCi0gICAgICAgICAgX2FzeW5jX21vZHVsZXMgKz0gWyBfbW9kdWxlIF0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBfc3luY19tb2R1bGVzICs9IFsgX21vZHVsZSBdCi0gICAgICAgIH0KKyAgICAgICAgX21vZHVsZXMgKz0gWyBfbW9kdWxlIF0KICAgICAgIH0KICAgICB9CiAKICAgICAjIE1ha2UgYnVpbGQgY29uZmlnLCB3aGljaCBpcyByZXF1aXJlZCBmb3Igc3luY2hyb25pemVkIHByb2d1YXJkaW5nLgotICAgIF9zeW5jX21vZHVsZV9qYXZhX3RhcmdldHMgPSBbXQotICAgIF9zeW5jX21vZHVsZV9idWlsZF9jb25maWdzID0gW10KLSAgICBfc3luY19tb2R1bGVfdGFyZ2V0cyA9IFtdCi0gICAgZm9yZWFjaChfbW9kdWxlLCBfc3luY19tb2R1bGVzKSB7Ci0gICAgICBfc3luY19tb2R1bGVfdGFyZ2V0cyArPSBbIF9tb2R1bGUubW9kdWxlX3RhcmdldCBdCi0gICAgICBfc3luY19tb2R1bGVfamF2YV90YXJnZXRzICs9IFsgIiR7X21vZHVsZS5tb2R1bGVfdGFyZ2V0fV9famF2YSIgXQotICAgICAgX3N5bmNfbW9kdWxlX2J1aWxkX2NvbmZpZ3MgKz0gWyBfbW9kdWxlLmJ1aWxkX2NvbmZpZyBdCisgICAgX21vZHVsZV9qYXZhX3RhcmdldHMgPSBbXQorICAgIF9tb2R1bGVfYnVpbGRfY29uZmlncyA9IFtdCisgICAgX21vZHVsZV90YXJnZXRzID0gW10KKyAgICBmb3JlYWNoKF9tb2R1bGUsIF9tb2R1bGVzKSB7CisgICAgICBfbW9kdWxlX3RhcmdldHMgKz0gWyBfbW9kdWxlLm1vZHVsZV90YXJnZXQgXQorICAgICAgX21vZHVsZV9qYXZhX3RhcmdldHMgKz0gWyAiJHtfbW9kdWxlLm1vZHVsZV90YXJnZXR9X19qYXZhIiBdCisgICAgICBfbW9kdWxlX2J1aWxkX2NvbmZpZ3MgKz0gWyBfbW9kdWxlLmJ1aWxkX2NvbmZpZyBdCiAgICAgfQogCiAgICAgIyBVc2VkIHRvIGV4cG9zZSB0aGUgbW9kdWxlIEphdmEgdGFyZ2V0cyBvZiB0aGUgYnVuZGxlLgogICAgIGdyb3VwKCIke3RhcmdldF9uYW1lfV9famF2YSIpIHsKLSAgICAgIGRlcHMgPSBfc3luY19tb2R1bGVfamF2YV90YXJnZXRzCisgICAgICBkZXBzID0gX21vZHVsZV9qYXZhX3RhcmdldHMKICAgICB9CiAgICAgZ3JvdXAoIiR7dGFyZ2V0X25hbWV9X19jb21waWxlX3Jlc291cmNlcyIpIHsKICAgICAgIGRlcHMgPSBbCkBAIC00NjI4LDE0ICs0NTY0LDExIEBACiAgICAgICAgICIke3RhcmdldF9nZW5fZGlyfS8ke3RhcmdldF9uYW1lfS8ke3RhcmdldF9uYW1lfV9fdW5zcGxpdF9kZXguemlwIgogCiAgICAgd3JpdGVfYnVpbGRfY29uZmlnKF9idWlsZF9jb25maWdfdGFyZ2V0KSB7Ci0gICAgICAjIFdlIGRvbid0IHdhbnQgYXN5bmMgbW9kdWxlcyB0byBiZSBwcm9ndWFyZGVkIHN5bmNocm9ub3VzbHksIHNvIHdlIGxlYXZlCi0gICAgICAjIHRoZW0gb3V0IG9mIHBvc3NpYmxlX2NvbmZpZ19kZXBzLgogICAgICAgdHlwZSA9ICJhbmRyb2lkX2FwcF9idW5kbGUiCi0gICAgICBwb3NzaWJsZV9jb25maWdfZGVwcyA9Ci0gICAgICAgICAgX3N5bmNfbW9kdWxlX3RhcmdldHMgKyBbIHByb2d1YXJkX2FuZHJvaWRfc2RrX2RlcF8gXQorICAgICAgcG9zc2libGVfY29uZmlnX2RlcHMgPSBfbW9kdWxlX3RhcmdldHMgKyBbIHByb2d1YXJkX2FuZHJvaWRfc2RrX2RlcF8gXQogICAgICAgYnVpbGRfY29uZmlnID0gX2J1aWxkX2NvbmZpZwogICAgICAgcHJvZ3VhcmRfZW5hYmxlZCA9IF9wcm9ndWFyZF9lbmFibGVkCi0gICAgICBtb2R1bGVfYnVpbGRfY29uZmlncyA9IF9zeW5jX21vZHVsZV9idWlsZF9jb25maWdzCisgICAgICBtb2R1bGVfYnVpbGRfY29uZmlncyA9IF9tb2R1bGVfYnVpbGRfY29uZmlncwogICAgICAgZmluYWxfZGV4X3BhdGggPSBfdW5zcGxpdF9kZXhfemlwCiAKICAgICAgIGlmIChfcHJvZ3VhcmRfZW5hYmxlZCkgewpAQCAtNDY3Niw3ICs0NjA5LDcgQEAKICAgICAgICAgICAgIHByb2d1YXJkX2V4cGVjdGF0aW9uc19maWxlID0gX3Byb2d1YXJkX2V4cGVjdGF0aW9uc19maWxlCiAgICAgICAgICAgfQogCi0gICAgICAgICAgZGVwcyA9IF9zeW5jX21vZHVsZV9qYXZhX3RhcmdldHMgKyBbICI6JF9idWlsZF9jb25maWdfdGFyZ2V0IiBdCisgICAgICAgICAgZGVwcyA9IF9tb2R1bGVfamF2YV90YXJnZXRzICsgWyAiOiRfYnVpbGRfY29uZmlnX3RhcmdldCIgXQogICAgICAgICAgIG91dHB1dCA9IF91bnNwbGl0X2RleF96aXAKICAgICAgICAgfQogICAgICAgfQpAQCAtNDY4NCwzMCArNDYxNywyNSBAQAogICAgICAgX2RleHNwbGl0dGVyX3RhcmdldCA9ICIke3RhcmdldF9uYW1lfV9fZGV4c3BsaXR0ZXIiCiAgICAgICBkZXhzcGxpdHRlcihfZGV4c3BsaXR0ZXJfdGFyZ2V0KSB7CiAgICAgICAgIGlucHV0X2RleF96aXAgPSBfdW5zcGxpdF9kZXhfemlwCi0gICAgICAgIHByb2d1YXJkX21hcHBpbmcgPSBfc3luY19wcm9ndWFyZF9tYXBwaW5nX3BhdGgKLSAgICAgICAgYWxsX21vZHVsZXMgPSBfc3luY19tb2R1bGVzCisgICAgICAgIHByb2d1YXJkX21hcHBpbmcgPSBfcHJvZ3VhcmRfbWFwcGluZ19wYXRoCisgICAgICAgIGFsbF9tb2R1bGVzID0gX21vZHVsZXMKICAgICAgICAgZGVwcyA9IFsKICAgICAgICAgICAgICAgICAgIjokX2J1aWxkX2NvbmZpZ190YXJnZXQiLAogICAgICAgICAgICAgICAgICBfc3luY19kZXhfdGFyZ2V0X2RlcCwKLSAgICAgICAgICAgICAgIF0gKyBfc3luY19tb2R1bGVfamF2YV90YXJnZXRzCisgICAgICAgICAgICAgICBdICsgX21vZHVsZV9qYXZhX3RhcmdldHMKICAgICAgIH0KICAgICB9CiAKLSAgICAjIE1lcmdlIGFzeW5jIGFuZCBzeW5jIG1vZHVsZSBzY29wZXMuCi0gICAgX2FsbF9tb2R1bGVzID0gX3N5bmNfbW9kdWxlcyArIF9hc3luY19tb2R1bGVzCi0KICAgICBfYWxsX2NyZWF0ZV9tb2R1bGVfdGFyZ2V0cyA9IFtdCiAgICAgX2FsbF9tb2R1bGVfemlwX3BhdGhzID0gW10KICAgICBfYWxsX21vZHVsZV9idWlsZF9jb25maWdzID0gW10KLSAgICBmb3JlYWNoKF9tb2R1bGUsIF9hbGxfbW9kdWxlcykgeworICAgIGZvcmVhY2goX21vZHVsZSwgX21vZHVsZXMpIHsKICAgICAgIF9tb2R1bGVfdGFyZ2V0ID0gX21vZHVsZS5tb2R1bGVfdGFyZ2V0CiAgICAgICBfbW9kdWxlX2J1aWxkX2NvbmZpZyA9IF9tb2R1bGUuYnVpbGRfY29uZmlnCiAgICAgICBfbW9kdWxlX2J1aWxkX2NvbmZpZ190YXJnZXQgPSBfbW9kdWxlLmJ1aWxkX2NvbmZpZ190YXJnZXQKIAogICAgICAgaWYgKCFfcHJvZ3VhcmRfZW5hYmxlZCkgewogICAgICAgICBfZGV4X3RhcmdldF9mb3JfbW9kdWxlID0gIiR7X21vZHVsZV90YXJnZXR9X19maW5hbF9kZXgiCi0gICAgICB9IGVsc2UgaWYgKGRlZmluZWQoX21vZHVsZS5kZXhfcGF0aCkpIHsKLSAgICAgICAgX2RleF90YXJnZXRfZm9yX21vZHVsZSA9ICI6JHtfbW9kdWxlLmFzeW5jX2RleF90YXJnZXR9IgogICAgICAgfSBlbHNlIHsKICAgICAgICAgX2RleF90YXJnZXRfZm9yX21vZHVsZSA9ICI6JF9kZXhzcGxpdHRlcl90YXJnZXQiCiAgICAgICB9CkBAIC00NzI0LDEyICs0NjUyLDYgQEAKICAgICAgICAgYnVpbGRfY29uZmlnID0gX21vZHVsZV9idWlsZF9jb25maWcKICAgICAgICAgbW9kdWxlX3ppcF9wYXRoID0gX21vZHVsZV96aXBfcGF0aAogCi0gICAgICAgICMgSWYgbW9kdWxlIGlzIGFzeW5jLCB1c2UgZGVmaW5lZCBkZXhfcGF0aCBkaXJlY3RseSByYXRoZXIgdGhhbgotICAgICAgICAjIGJ1aWxkIGNvbmZpZyBGaWxlQXJnLgotICAgICAgICBpZiAoZGVmaW5lZChfbW9kdWxlLmRleF9wYXRoKSkgewotICAgICAgICAgIGRleF9wYXRoID0gX21vZHVsZS5kZXhfcGF0aAotICAgICAgICB9Ci0KICAgICAgICAgZGVwcyA9IFsKICAgICAgICAgICBfZGV4X3RhcmdldF9mb3JfbW9kdWxlLAogICAgICAgICAgIF9tb2R1bGVfYnVpbGRfY29uZmlnX3RhcmdldCwKQEAgLTQ4MTgsNyArNDc0MCw3IEBACiAgICAgICAgIF0KICAgICAgIH0KIAotICAgICAgZm9yZWFjaChfbW9kdWxlLCBfYWxsX21vZHVsZXMpIHsKKyAgICAgIGZvcmVhY2goX21vZHVsZSwgX21vZHVsZXMpIHsKICAgICAgICAgX3JlYmFzZWRfYnVpbGRfY29uZmlnID0KICAgICAgICAgICAgIHJlYmFzZV9wYXRoKF9tb2R1bGUuYnVpbGRfY29uZmlnLCByb290X2J1aWxkX2RpcikKICAgICAgICAgYXJncyArPSBbCkBAIC00ODM3LDEwICs0NzU5LDcgQEAKICAgICAjIChoYXZlIHByb2d1YXJkIGVuYWJsZWQpLgogICAgIGlmIChfcHJvZ3VhcmRfZW5hYmxlZCkgewogICAgICAgIyBNZXJnZSBhbGwgbW9kdWxlIHRhcmdldHMgdG8gb2J0YWluIHNpemUgaW5mbyBmaWxlcyBmb3IgYWxsIHRhcmdldHMuCi0gICAgICBfYWxsX21vZHVsZV90YXJnZXRzID0gX3N5bmNfbW9kdWxlX3RhcmdldHMKLSAgICAgIGZvcmVhY2goX2FzeW5jX21vZHVsZSwgX2FzeW5jX21vZHVsZXMpIHsKLSAgICAgICAgX2FsbF9tb2R1bGVfdGFyZ2V0cyArPSBbIF9hc3luY19tb2R1bGUubW9kdWxlX3RhcmdldCBdCi0gICAgICB9CisgICAgICBfYWxsX21vZHVsZV90YXJnZXRzID0gX21vZHVsZV90YXJnZXRzCiAKICAgICAgIF9zaXplX2luZm9fdGFyZ2V0ID0gIiR7dGFyZ2V0X25hbWV9X19zaXplX2luZm8iCiAgICAgICBjcmVhdGVfc2l6ZV9pbmZvX2ZpbGVzKF9zaXplX2luZm9fdGFyZ2V0KSB7CkBAIC00OTExLDE0ICs0ODMwLDEzIEBACiAgICAgICAgIF0KICAgICAgIH0KIAotICAgICAgIyBUT0RPKGNyYnVnLmNvbS85Mzg2MzUpOiBDb21iaW5lIGFzeW5jIG1vZHVsZSBtYXBwaW5nIHBhdGhzIHdpdGggdGhlIHN5bmMgb25lLgogICAgICAgaWYgKF9wcm9ndWFyZF9lbmFibGVkKSB7CiAgICAgICAgIGFyZ3MgKz0gWwogICAgICAgICAgICItLXByb2d1YXJkLW1hcHBpbmctcGF0aCIsCi0gICAgICAgICAgcmViYXNlX3BhdGgoX3N5bmNfcHJvZ3VhcmRfbWFwcGluZ19wYXRoLCByb290X2J1aWxkX2RpciksCisgICAgICAgICAgcmViYXNlX3BhdGgoX3Byb2d1YXJkX21hcHBpbmdfcGF0aCwgcm9vdF9idWlsZF9kaXIpLAogICAgICAgICBdCiAgICAgICAgIGRhdGFfZGVwcyArPSBbICIvL2J1aWxkL2FuZHJvaWQvc3RhY2t0cmFjZTpqYXZhX2Rlb2JmdXNjYXRlIiBdCi0gICAgICAgIGRhdGEgKz0gWyBfc3luY19wcm9ndWFyZF9tYXBwaW5nX3BhdGggXQorICAgICAgICBkYXRhICs9IFsgX3Byb2d1YXJkX21hcHBpbmdfcGF0aCBdCiAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9idWlsZC9jb25maWcvY29tcGlsZXIvY29tcGlsZXIuZ25pIGIvYnVpbGQvY29uZmlnL2NvbXBpbGVyL2NvbXBpbGVyLmduaQppbmRleCA2MGZiZWJjLi4wOWY0ZjhlIDEwMDY0NAotLS0gYS9idWlsZC9jb25maWcvY29tcGlsZXIvY29tcGlsZXIuZ25pCisrKyBiL2J1aWxkL2NvbmZpZy9jb21waWxlci9jb21waWxlci5nbmkKQEAgLTIyMiwxNSArMjIyLDYgQEAKICAgICAjIFJlZHVjZSBzeW1ib2wgbGV2ZWwgd2hlbiBpdCB3aWxsIGNhdXNlIGludmFsaWQgZWxmIGZpbGVzIHRvIGJlIGNyZWF0ZWQKICAgICAjIChkdWUgdG8gZmlsZSBzaXplKS4gaHR0cHM6Ly9jcmJ1Zy5jb20vNjQ4OTQ4LgogICAgIHN5bWJvbF9sZXZlbCA9IDEKLSAgfSBlbHNlIGlmIChpc193aW4gJiYgdXNlX2dvbWEgJiYgIWlzX2NsYW5nKSB7Ci0gICAgIyBnb21hIGRvZXNuJ3Qgc3VwcG9ydCBQREIgZmlsZXMsIHNvIHdlIGRpc2FibGUgc3ltYm9scyBkdXJpbmcgZ29tYQotICAgICMgY29tcGlsYXRpb24gYmVjYXVzZSBvdGhlcndpc2UgdGhlIHJlZHVuZGFudCBkZWJ1ZyBpbmZvcm1hdGlvbiBnZW5lcmF0ZWQKLSAgICAjIGJ5IHZpc3VhbCBzdHVkaW8gKHJlcGVhdGVkIGluIGV2ZXJ5IC5vYmogZmlsZSkgbWFrZXMgbGlua2VyCi0gICAgIyBtZW1vcnkgY29uc3VtcHRpb24gYW5kIGxpbmsgdGltZXMgdW5zdXN0YWluYWJsZSAoY3JidWcuY29tLzYzMDA3NCkuCi0gICAgIyBDbGFuZyBvbiB3aW5kb3dzIGRvZXMgbm90IGhhdmUgdGhpcyBpc3N1ZS4KLSAgICAjIElmIHlvdSB1c2UgaXNfd2luX2Zhc3RsaW5rID0gdHJ1ZSBvciBsbGQgb3IgY2xhbmcgdGhlbiB5b3UgY2FuIHNldAotICAgICMgc3ltYm9sX2xldmVsID0gMiB3aGVuIHVzaW5nIGdvbWEuCi0gICAgc3ltYm9sX2xldmVsID0gMQogICB9IGVsc2UgaWYgKGlzX2Nyb3NfY2hyb21lX3NkaykgewogICAgICMgVXNlIGxvd2VyIHN5bWJvbCBsZXZlbCBpbiBTaW1wbGUgQ2hyb21lIGJ1aWxkIGZvciBmYXN0ZXIgbGluayB0aW1lLgogICAgICMgRm9yIFNpbXBsZSBDaHJvbWUsIHRoaXMgc2hvdWxkIHRha2UgcHJlY2VkZW5jZSBvdmVyIGlzX29mZmljaWFsX2J1aWxkLApkaWZmIC0tZ2l0IGEvYnVpbGQvZnVjaHNpYS9saW51eC5zZGsuc2hhMSBiL2J1aWxkL2Z1Y2hzaWEvbGludXguc2RrLnNoYTEKaW5kZXggNzVjNzI3MS4uYmM5ZjM2NCAxMDA2NDQKLS0tIGEvYnVpbGQvZnVjaHNpYS9saW51eC5zZGsuc2hhMQorKysgYi9idWlsZC9mdWNoc2lhL2xpbnV4LnNkay5zaGExCkBAIC0xICsxIEBACi04OTAwMDc1ODE0MDQzNjc3MTY4ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorODkwMDAxOTM2MzMwODUxMDE0NApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1aWxkL2Z1Y2hzaWEvbWFjLnNkay5zaGExIGIvYnVpbGQvZnVjaHNpYS9tYWMuc2RrLnNoYTEKaW5kZXggM2NiNmMyZS4uM2FlM2YxNyAxMDA2NDQKLS0tIGEvYnVpbGQvZnVjaHNpYS9tYWMuc2RrLnNoYTEKKysrIGIvYnVpbGQvZnVjaHNpYS9tYWMuc2RrLnNoYTEKQEAgLTEgKzEgQEAKLTg5MDAwNzg4MjI3Njg5Nzg0OTYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis4OTAwMDE5NTQzOTg2MDEzNTA0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVpbGQvdG9vbGNoYWluL2dvbWEuZ25pIGIvYnVpbGQvdG9vbGNoYWluL2dvbWEuZ25pCmluZGV4IDJmYmY1NzIuLmJhNTRjNGUgMTAwNjQ0Ci0tLSBhL2J1aWxkL3Rvb2xjaGFpbi9nb21hLmduaQorKysgYi9idWlsZC90b29sY2hhaW4vZ29tYS5nbmkKQEAgLTI3LDMgKzI3LDYgQEAKICAgICB9CiAgIH0KIH0KKworYXNzZXJ0KCFpc193aW4gfHwgIXVzZV9nb21hIHx8IGlzX2NsYW5nLAorICAgICAgICJjbC5leGUgZG9lcyBub3Qgd29yayBvbiBnb21hLCB1c2UgY2xhbmciKQpkaWZmIC0tZ2l0IGEvY2MvaW5wdXQvc2Nyb2xsYmFyX2NvbnRyb2xsZXIuY2MgYi9jYy9pbnB1dC9zY3JvbGxiYXJfY29udHJvbGxlci5jYwppbmRleCA0ZTU2YTRkLi4yZjQyMjFlIDEwMDY0NAotLS0gYS9jYy9pbnB1dC9zY3JvbGxiYXJfY29udHJvbGxlci5jYworKysgYi9jYy9pbnB1dC9zY3JvbGxiYXJfY29udHJvbGxlci5jYwpAQCAtMjU1LDkgKzI1NSwxNSBAQAogICBmbG9hdCBzY2FsZWRfc2Nyb2xsZXJfdG9fc2Nyb2xsYmFyX3JhdGlvID0gR2V0U2Nyb2xsZXJUb1Njcm9sbGJhclJhdGlvKCk7CiAgIGZsb2F0IGN1cnJlbnRfc2Nyb2xsX3Bvc2l0aW9uID0gY3VycmVudGx5X2NhcHR1cmVkX3Njcm9sbGJhcl8tPmN1cnJlbnRfcG9zKCk7CiAKLSAgLy8gVGh1bWIgcG9zaXRpb24gbmVlZHMgdG8gYmUgZmxvb3JlZCB0byBtYXRjaCBtYWluIHRocmVhZCBwZXIgcGl4ZWwgYmVoYXZpb3IKLSAgZmxvYXQgdGh1bWJfcG9zaXRpb24gPSBmbG9vcmYoc3RkOjptYXgoMC4wZiwgY3VycmVudF9zY3JvbGxfcG9zaXRpb24pIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVkX3Njcm9sbGVyX3RvX3Njcm9sbGJhcl9yYXRpbyk7CisgIC8vIFRodW1iIHBvc2l0aW9uIG5lZWRzIHRvIGJlIGZsb29yZWQgYW5kIFZhbHVlcyBiZXR3ZWVuIDAgYW5kIDEgYXJlIHJvdW5kZWQKKyAgLy8gdG8gb25lIHRvIG1hdGNoIG1haW4gdGhyZWFkIHBlciBwaXhlbCBiZWhhdmlvci4gQ29ycmVzcG9uZGluZyBtYWluIHRocmVhZAorICAvLyBjb2RlIGluIFNjcm9sbGJhclRoZW1lOjpUaHVtYlBvc2l0aW9uCisgIGZsb2F0IHRodW1iX3Bvc2l0aW9uID0gc3RkOjptYXgoMC4wZiwgY3VycmVudF9zY3JvbGxfcG9zaXRpb24pIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZWRfc2Nyb2xsZXJfdG9fc2Nyb2xsYmFyX3JhdGlvOworICB0aHVtYl9wb3NpdGlvbiA9ICh0aHVtYl9wb3NpdGlvbiA8IDEuMCAmJiB0aHVtYl9wb3NpdGlvbiA+IDAuMCkKKyAgICAgICAgICAgICAgICAgICAgICAgPyAxLjAKKyAgICAgICAgICAgICAgICAgICAgICAgOiBmbG9vcmYodGh1bWJfcG9zaXRpb24pOworCiAgIGZsb2F0IGRlbHRhX2luX29yaWVudGF0aW9uID0gb3JpZW50YXRpb24gPT0gU2Nyb2xsYmFyT3JpZW50YXRpb246OlZFUlRJQ0FMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcG9pbnRlcl9kZWx0YS55KCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBwb2ludGVyX2RlbHRhLngoKTsKZGlmZiAtLWdpdCBhL2NjL3BhaW50L3BhaW50X2ltYWdlLmNjIGIvY2MvcGFpbnQvcGFpbnRfaW1hZ2UuY2MKaW5kZXggMDMzMWJmYzEuLmM2MDFjMDEgMTAwNjQ0Ci0tLSBhL2NjL3BhaW50L3BhaW50X2ltYWdlLmNjCisrKyBiL2NjL3BhaW50L3BhaW50X2ltYWdlLmNjCkBAIC0yOCw2ICsyOCwxMyBAQAogY29uc3QgUGFpbnRJbWFnZTo6Q29udGVudElkIFBhaW50SW1hZ2U6OmtJbnZhbGlkQ29udGVudElkID0gLTE7CiBjb25zdCBQYWludEltYWdlOjpHZW5lcmF0b3JDbGllbnRJZCBQYWludEltYWdlOjprRGVmYXVsdEdlbmVyYXRvckNsaWVudElkID0gMDsKIAorSW1hZ2VIZWFkZXJNZXRhZGF0YTo6SW1hZ2VIZWFkZXJNZXRhZGF0YSgpID0gZGVmYXVsdDsKK0ltYWdlSGVhZGVyTWV0YWRhdGE6OkltYWdlSGVhZGVyTWV0YWRhdGEoY29uc3QgSW1hZ2VIZWFkZXJNZXRhZGF0YSYgb3RoZXIpID0KKyAgICBkZWZhdWx0OworSW1hZ2VIZWFkZXJNZXRhZGF0YSYgSW1hZ2VIZWFkZXJNZXRhZGF0YTo6b3BlcmF0b3I9KAorICAgIGNvbnN0IEltYWdlSGVhZGVyTWV0YWRhdGEmIG90aGVyKSA9IGRlZmF1bHQ7CitJbWFnZUhlYWRlck1ldGFkYXRhOjpJbWFnZUhlYWRlck1ldGFkYXRhOjp+SW1hZ2VIZWFkZXJNZXRhZGF0YSgpID0gZGVmYXVsdDsKKwogUGFpbnRJbWFnZTo6UGFpbnRJbWFnZSgpID0gZGVmYXVsdDsKIFBhaW50SW1hZ2U6OlBhaW50SW1hZ2UoY29uc3QgUGFpbnRJbWFnZSYgb3RoZXIpID0gZGVmYXVsdDsKIFBhaW50SW1hZ2U6OlBhaW50SW1hZ2UoUGFpbnRJbWFnZSYmIG90aGVyKSA9IGRlZmF1bHQ7CkBAIC0xNTMsMTMgKzE2MCw2IEBACiAgIH0KIH0KIAotYm9vbCBQYWludEltYWdlOjpJc0VsaWdpYmxlRm9yQWNjZWxlcmF0ZWREZWNvZGluZygpIGNvbnN0IHsKLSAgaWYgKCFDYW5EZWNvZGVGcm9tR2VuZXJhdG9yKCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBEQ0hFQ0socGFpbnRfaW1hZ2VfZ2VuZXJhdG9yXyk7Ci0gIHJldHVybiBwYWludF9pbWFnZV9nZW5lcmF0b3JfLT5Jc0VsaWdpYmxlRm9yQWNjZWxlcmF0ZWREZWNvZGluZygpOwotfQotCiBTa0lTaXplIFBhaW50SW1hZ2U6OkdldFN1cHBvcnRlZERlY29kZVNpemUoCiAgICAgY29uc3QgU2tJU2l6ZSYgcmVxdWVzdGVkX3NpemUpIGNvbnN0IHsKICAgLy8gVE9ETyh2bXBzdHIpOiBJbiBzb21lIGNhc2VzIHdlIGRvIG5vdCBzdXBwb3J0IGRlY29kaW5nIHRvIGFueSBvdGhlcgpAQCAtMjkyLDEwICsyOTIsMTAgQEAKICAgICAgICAgICAgICA6IEdldFNrSW1hZ2UoKS0+aGVpZ2h0KCk7CiB9CiAKLVBhaW50SW1hZ2U6OkltYWdlVHlwZSBQYWludEltYWdlOjpHZXRJbWFnZVR5cGUoKSBjb25zdCB7Citjb25zdCBJbWFnZUhlYWRlck1ldGFkYXRhKiBQYWludEltYWdlOjpHZXRJbWFnZUhlYWRlck1ldGFkYXRhKCkgY29uc3QgewogICBpZiAocGFpbnRfaW1hZ2VfZ2VuZXJhdG9yXykKLSAgICByZXR1cm4gcGFpbnRfaW1hZ2VfZ2VuZXJhdG9yXy0+R2V0SW1hZ2VUeXBlKCk7Ci0gIHJldHVybiBQYWludEltYWdlOjpJbWFnZVR5cGU6OmtJbnZhbGlkOworICAgIHJldHVybiBwYWludF9pbWFnZV9nZW5lcmF0b3JfLT5HZXRNZXRhZGF0YUZvckRlY29kZUFjY2VsZXJhdGlvbigpOworICByZXR1cm4gbnVsbHB0cjsKIH0KIAogYm9vbCBQYWludEltYWdlOjpJc1l1dihTa1lVVkFTaXplSW5mbyogeXV2YV9zaXplX2luZm8sCmRpZmYgLS1naXQgYS9jYy9wYWludC9wYWludF9pbWFnZS5oIGIvY2MvcGFpbnQvcGFpbnRfaW1hZ2UuaAppbmRleCAwOTY3ZmRlLi5kZjAxYzEwIDEwMDY0NAotLS0gYS9jYy9wYWludC9wYWludF9pbWFnZS5oCisrKyBiL2NjL3BhaW50L3BhaW50X2ltYWdlLmgKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlICJiYXNlL2d0ZXN0X3Byb2RfdXRpbC5oIgogI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgogI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9yZWZwdHIuaCIKKyNpbmNsdWRlICJiYXNlL29wdGlvbmFsLmgiCiAjaW5jbHVkZSAiY2MvcGFpbnQvZnJhbWVfbWV0YWRhdGEuaCIKICNpbmNsdWRlICJjYy9wYWludC9pbWFnZV9hbmltYXRpb25fY291bnQuaCIKICNpbmNsdWRlICJjYy9wYWludC9wYWludF9leHBvcnQuaCIKQEAgLTE3LDYgKzE4LDcgQEAKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9za2lhL2luY2x1ZGUvY29yZS9Ta1lVVkFJbmRleC5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L3NraWEvaW5jbHVkZS9jb3JlL1NrWVVWQVNpemVJbmZvLmgiCiAjaW5jbHVkZSAidWkvZ2Z4L2dlb21ldHJ5L3JlY3QuaCIKKyNpbmNsdWRlICJ1aS9nZngvZ2VvbWV0cnkvc2l6ZS5oIgogCiBuYW1lc3BhY2UgY2MgewogCkBAIC0yNSw2ICsyNyw0NiBAQAogY2xhc3MgUGFpbnRXb3JrbGV0SW5wdXQ7CiB1c2luZyBQYWludFJlY29yZCA9IFBhaW50T3BCdWZmZXI7CiAKK2VudW0gY2xhc3MgSW1hZ2VUeXBlIHsga1BORywga0pQRUcsIGtXRUJQLCBrR0lGLCBrSUNPLCBrQk1QLCBrSW52YWxpZCB9OworCitlbnVtIGNsYXNzIFlVVlN1YnNhbXBsaW5nIHsgazQxMCwgazQxMSwgazQyMCwgazQyMiwgazQ0MCwgazQ0NCwga1Vua25vd24gfTsKKworc3RydWN0IENDX1BBSU5UX0VYUE9SVCBJbWFnZUhlYWRlck1ldGFkYXRhIHsKKyBwdWJsaWM6CisgIEltYWdlSGVhZGVyTWV0YWRhdGEoKTsKKyAgSW1hZ2VIZWFkZXJNZXRhZGF0YShjb25zdCBJbWFnZUhlYWRlck1ldGFkYXRhJiBvdGhlcik7CisgIEltYWdlSGVhZGVyTWV0YWRhdGEmIG9wZXJhdG9yPShjb25zdCBJbWFnZUhlYWRlck1ldGFkYXRhJiBvdGhlcik7CisgIH5JbWFnZUhlYWRlck1ldGFkYXRhKCk7CisKKyAgLy8gVGhlIGltYWdlIHR5cGUsIGUuZy4sIEpQRUcgb3IgV2ViUC4KKyAgSW1hZ2VUeXBlIGltYWdlX3R5cGUgPSBJbWFnZVR5cGU6OmtJbnZhbGlkOworCisgIC8vIFRoZSBzdWJzYW1wbGluZyBmb3JtYXQgdXNlZCBmb3IgdGhlIGNocm9tYSBwbGFuZXMsIGUuZy4sIFlVViA0OjI6MC4KKyAgWVVWU3Vic2FtcGxpbmcgeXV2X3N1YnNhbXBsaW5nID0gWVVWU3Vic2FtcGxpbmc6OmtVbmtub3duOworCisgIC8vIFRoZSB2aXNpYmxlIHNpemUgb2YgdGhlIGltYWdlIChpLmUuLCB0aGUgYXJlYSB0aGF0IGNvbnRhaW5zIG1lYW5pbmdmdWwKKyAgLy8gcGl4ZWxzKS4KKyAgZ2Z4OjpTaXplIGltYWdlX3NpemU7CisKKyAgLy8gVGhlIHNpemUgb2YgdGhlIGFyZWEgY29udGFpbmluZyBjb2RlZCBkYXRhLCBpZiBrbm93bi4gRm9yIGV4YW1wbGUsIGlmIHRoZQorICAvLyB8aW1hZ2Vfc2l6ZXwgZm9yIGEgNDoyOjAgSlBFRyBpcyAxMngzMSwgaXRzIGNvZGVkIHNpemUgc2hvdWxkIGJlIDE2eDMyCisgIC8vIGJlY2F1c2UgdGhlIHNpemUgb2YgYSBtaW5pbXVtLWNvZGVkIHVuaXQgZm9yIDQ6MjowIGlzIDE2eDE2LgorICBiYXNlOjpPcHRpb25hbDxnZng6OlNpemU+IGNvZGVkX3NpemU7CisKKyAgLy8gV2hldGhlciB0aGUgaW1hZ2UgZW1iZWRzIGFuIElDQyBjb2xvciBwcm9maWxlLgorICBib29sIGhhc19lbWJlZGRlZF9jb2xvcl9wcm9maWxlID0gZmFsc2U7CisKKyAgLy8gV2hldGhlciBhbGwgdGhlIGRhdGEgd2FzIHJlY2VpdmVkIHByaW9yIHRvIHN0YXJ0aW5nIGRlY29kaW5nIHdvcmsuCisgIGJvb2wgYWxsX2RhdGFfcmVjZWl2ZWRfcHJpb3JfdG9fZGVjb2RlID0gZmFsc2U7CisKKyAgLy8gRm9yIEpQRUdzIG9ubHk6IHdoZXRoZXIgdGhlIGltYWdlIGlzIHByb2dyZXNzaXZlIChhcyBvcHBvc2VkIHRvIGJhc2VsaW5lKS4KKyAgYmFzZTo6T3B0aW9uYWw8Ym9vbD4ganBlZ19pc19wcm9ncmVzc2l2ZTsKKworICAvLyBGb3IgV2ViUHMgb25seTogd2hldGhlciB0aGlzIGlzIGEgc2ltcGxlLWZvcm1hdCBsb3NzeSBpbWFnZS4gU2VlCisgIC8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3NwZWVkL3dlYnAvZG9jcy9yaWZmX2NvbnRhaW5lciNzaW1wbGVfZmlsZV9mb3JtYXRfbG9zc3kuCisgIGJhc2U6Ok9wdGlvbmFsPGJvb2w+IHdlYnBfaXNfbm9uX2V4dGVuZGVkX2xvc3N5OworfTsKKwogLy8gQSByZXByZXNlbnRhdGlvbiBvZiBhbiBpbWFnZSBmb3IgdGhlIGNvbXBvc2l0b3IuICBUaGlzIGlzIHRoZSBtb3N0IGFic3RyYWN0CiAvLyBmb3JtIG9mIGltYWdlcywgYW5kIHJlcHJlc2VudHMgd2hhdCBpcyBrbm93biBhdCBwYWludCB0aW1lLiAgTm90ZSB0aGF0IGFzaWRlCiAvLyBmcm9tIGRlZmF1bHQgY29uc3RydWN0aW9uLCBpdCBjYW4gb25seSBiZSBjb25zdHJ1Y3RlZCB1c2luZyBhCkBAIC0xMTcsNyArMTU5LDYgQEAKICAgICAvLyBDaGVja2VySW1hZ2VUcmFja2VyIGZvciBhbGwgaGV1cmlzdGljcyB1c2VkLgogICAgIGtBc3luYwogICB9OwotICBlbnVtIGNsYXNzIEltYWdlVHlwZSB7IGtQTkcsIGtKUEVHLCBrV0VCUCwga0dJRiwga0lDTywga0JNUCwga0ludmFsaWQgfTsKIAogICAvLyBSZXR1cm5zIHRoZSBtb3JlIGNvbnNlcnZhdGl2ZSBtb2RlIG91dCBvZiB0aGUgdHdvIGdpdmVuIG9uZXMuCiAgIHN0YXRpYyBEZWNvZGluZ01vZGUgR2V0Q29uc2VydmF0aXZlKERlY29kaW5nTW9kZSBvbmUsIERlY29kaW5nTW9kZSB0d28pOwpAQCAtMTQxLDE4ICsxODIsNiBAQAogICBib29sIG9wZXJhdG9yPT0oY29uc3QgUGFpbnRJbWFnZSYgb3RoZXIpIGNvbnN0OwogICBib29sIG9wZXJhdG9yIT0oY29uc3QgUGFpbnRJbWFnZSYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CiAKLSAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBpbWFnZSBpcyBlbGlnaWJsZSBmb3IgZGVjb2RpbmcgdXNpbmcgYSBoYXJkd2FyZQotICAvLyBhY2NlbGVyYXRvciAod2hpY2ggd291bGQgcmVxdWlyZSBhdCBsZWFzdCB0aGF0IGFsbCB0aGUgZW5jb2RlZCBkYXRhIGhhcwotICAvLyBiZWVuIHJlY2VpdmVkKS4gUmV0dXJucyBmYWxzZSBvdGhlcndpc2Ugb3IgaWYgdGhlIGltYWdlIGNhbm5vdCBiZSBkZWNvZGVkCi0gIC8vIGZyb20gYSBQYWludEltYWdlR2VuZXJhdG9yLiBOb3RpY2UgdGhhdCBhIHJldHVybiB2YWx1ZSBvZiB0cnVlIGRvZXMgbm90Ci0gIC8vIGd1YXJhbnRlZSB0aGF0IHRoZSBoYXJkd2FyZSBhY2NlbGVyYXRvciBzdXBwb3J0cyB0aGUgaW1hZ2UuIEl0IG9ubHkKLSAgLy8gaW5kaWNhdGVzIHRoYXQgdGhlIHNvZnR3YXJlIGRlY29kZXIgaGFzbid0IGRvbmUgYW55IHdvcmsgd2l0aCB0aGUgaW1hZ2UsIHNvCi0gIC8vIHNlbmRpbmcgaXQgdG8gYSBoYXJkd2FyZSBkZWNvZGVyIGlzIGFwcHJvcHJpYXRlLgotICAvLwotICAvLyBUT0RPKGFuZHJlc2NqKTogY29uc2lkZXIgc3VwcG9ydGluZyB0aGUgbm9uLVBhaW50SW1hZ2VHZW5lcmF0b3IgcGF0aCB3aGljaAotICAvLyBpcyBleHBlY3RlZCB0byBiZSByYXJlLgotICBib29sIElzRWxpZ2libGVGb3JBY2NlbGVyYXRlZERlY29kaW5nKCkgY29uc3Q7Ci0KICAgLy8gUmV0dXJucyB0aGUgc21hbGxlc3Qgc2l6ZSB0aGF0IGlzIGF0IGxlYXN0IGFzIGJpZyBhcyB0aGUgcmVxdWVzdGVkX3NpemUKICAgLy8gc3VjaCB0aGF0IHdlIGNhbiBkZWNvZGUgdG8gZXhhY3RseSB0aGF0IHNjYWxlLiBJZiB0aGUgcmVxdWVzdGVkIHNpemUgaXMKICAgLy8gbGFyZ2VyIHRoYW4gdGhlIGltYWdlLCB0aGlzIHJldHVybnMgdGhlIGltYWdlIHNpemUuIEFueSByZXR1cm5lZCB2YWx1ZSBpcwpAQCAtMjI3LDYgKzI1Niw3IEBACiAgIFNrQ29sb3JTcGFjZSogY29sb3Jfc3BhY2UoKSBjb25zdCB7CiAgICAgcmV0dXJuIHBhaW50X3dvcmtsZXRfaW5wdXRfID8gbnVsbHB0ciA6IEdldFNrSW1hZ2UoKS0+Y29sb3JTcGFjZSgpOwogICB9CisgIGNvbnN0IGdmeDo6UmVjdCBzdWJzZXRfcmVjdCgpIGNvbnN0IHsgcmV0dXJuIHN1YnNldF9yZWN0XzsgfQogCiAgIC8vIFJldHVybnMgd2hldGhlciB0aGlzIGltYWdlIHdpbGwgYmUgZGVjb2RlZCBhbmQgcmVuZGVyZWQgZnJvbSBZVVYgZGF0YQogICAvLyBhbmQgZmlsbHMgb3V0IHBsYW5lIHNpemUgaW5mbywgcGxhbmUgaW5kZXggaW5mbywgYW5kIHRoZSBtYXRyaXggZm9yCkBAIC0yMzksOCArMjY5LDkgQEAKICAgLy8gUmV0dXJucyB0aGUgY29sb3IgdHlwZSBvZiB0aGlzIGltYWdlLgogICBTa0NvbG9yVHlwZSBHZXRDb2xvclR5cGUoKSBjb25zdDsKIAotICAvLyBSZXR1cm5zIHRoZSBpbWFnZSB0eXBlIChlLmcuIFBORywgV0VCUCkgb2YgdGhpcyBpbWFnZS4KLSAgSW1hZ2VUeXBlIEdldEltYWdlVHlwZSgpIGNvbnN0OworICAvLyBSZXR1cm5zIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVuZGVybHlpbmcgaW1hZ2UuIFJldHVybnMgbnVsbHB0ciBpZgorICAvLyB0aGVyZSBpcyBubyBhdmFpbGFibGUgfHBhaW50X2ltYWdlX2dlbmVyYXRvcl98LgorICBjb25zdCBJbWFnZUhlYWRlck1ldGFkYXRhKiBHZXRJbWFnZUhlYWRlck1ldGFkYXRhKCkgY29uc3Q7CiAKICAgLy8gUmV0dXJucyBhIHVuaXF1ZSBpZCBmb3IgdGhlIHBpeGVsIGRhdGEgZm9yIHRoZSBmcmFtZSBhdCB8ZnJhbWVfaW5kZXh8LgogICBGcmFtZUtleSBHZXRLZXlGb3JGcmFtZShzaXplX3QgZnJhbWVfaW5kZXgpIGNvbnN0OwpkaWZmIC0tZ2l0IGEvY2MvcGFpbnQvcGFpbnRfaW1hZ2VfZ2VuZXJhdG9yLmNjIGIvY2MvcGFpbnQvcGFpbnRfaW1hZ2VfZ2VuZXJhdG9yLmNjCmluZGV4IDQxNDgzZmEuLjc0MDgwOGUyIDEwMDY0NAotLS0gYS9jYy9wYWludC9wYWludF9pbWFnZV9nZW5lcmF0b3IuY2MKKysrIGIvY2MvcGFpbnQvcGFpbnRfaW1hZ2VfZ2VuZXJhdG9yLmNjCkBAIC0zMyw4ICszMyw5IEBACiAgIHJldHVybiBpbmZvXy5kaW1lbnNpb25zKCk7CiB9CiAKLVBhaW50SW1hZ2U6OkltYWdlVHlwZSBQYWludEltYWdlR2VuZXJhdG9yOjpHZXRJbWFnZVR5cGUoKSBjb25zdCB7Ci0gIHJldHVybiBQYWludEltYWdlOjpJbWFnZVR5cGU6OmtJbnZhbGlkOworY29uc3QgSW1hZ2VIZWFkZXJNZXRhZGF0YSoKK1BhaW50SW1hZ2VHZW5lcmF0b3I6OkdldE1ldGFkYXRhRm9yRGVjb2RlQWNjZWxlcmF0aW9uKCkgY29uc3QgeworICByZXR1cm4gbnVsbHB0cjsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGNjCmRpZmYgLS1naXQgYS9jYy9wYWludC9wYWludF9pbWFnZV9nZW5lcmF0b3IuaCBiL2NjL3BhaW50L3BhaW50X2ltYWdlX2dlbmVyYXRvci5oCmluZGV4IDFmZjc1MTUuLjY0ODFjN2EgMTAwNjQ0Ci0tLSBhL2NjL3BhaW50L3BhaW50X2ltYWdlX2dlbmVyYXRvci5oCisrKyBiL2NjL3BhaW50L3BhaW50X2ltYWdlX2dlbmVyYXRvci5oCkBAIC0yOSwxNCArMjksNiBAQAogCiAgIFBhaW50SW1hZ2VHZW5lcmF0b3ImIG9wZXJhdG9yPShjb25zdCBQYWludEltYWdlR2VuZXJhdG9yJikgPSBkZWxldGU7CiAKLSAgLy8gUmV0dXJucyB0cnVlIGlmIHdlIGNhbiBndWFyYW50ZWUgdGhhdCB0aGUgc29mdHdhcmUgZGVjb2RlciBoYXNuJ3QgZG9uZSB3b3JrCi0gIC8vIG9uIHRoZSBpbWFnZSwgc28gaXQncyBhcHByb3ByaWF0ZSB0byBzZW5kIHRoZSBlbmNvZGVkIGltYWdlIHRvIGEgaGFyZHdhcmUKLSAgLy8gYWNjZWxlcmF0b3IuIEZhbHNlIGlmIHdlIGNhbid0IGd1YXJhbnRlZSB0aGlzIG9yIGlmIG5vdCBhcHBsaWNhYmxlLiBGb3IKLSAgLy8gZXhhbXBsZSwgaWYgdGhlIGVuY29kZWQgZGF0YSBjb21lcyBpbmNyZW1lbnRhbGx5LCBhbmQgdGhlIHNvZnR3YXJlIGRlY29kZXIKLSAgLy8gc3RhcnRzIHdvcmtpbmcgd2l0aCBwYXJ0aWFsIGRhdGEsIHRoZSBpbWFnZSBzaG91bGRuJ3QgbGF0ZXIgYmUgc2VudCB0byBhCi0gIC8vIGhhcmR3YXJlIGRlY29kZXIuCi0gIHZpcnR1YWwgYm9vbCBJc0VsaWdpYmxlRm9yQWNjZWxlcmF0ZWREZWNvZGluZygpIGNvbnN0ID0gMDsKLQogICAvLyBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBlbmNvZGVkIGNvbnRlbnQgb2YgdGhpcyBpbWFnZS4KICAgdmlydHVhbCBza19zcDxTa0RhdGE+IEdldEVuY29kZWREYXRhKCkgY29uc3QgPSAwOwogCkBAIC04OCw3ICs4MCw5IEBACiAgIGNvbnN0IFNrSW1hZ2VJbmZvJiBHZXRTa0ltYWdlSW5mbygpIGNvbnN0IHsgcmV0dXJuIGluZm9fOyB9CiAgIGNvbnN0IHN0ZDo6dmVjdG9yPEZyYW1lTWV0YWRhdGE+JiBHZXRGcmFtZU1ldGFkYXRhKCkgY29uc3QgeyByZXR1cm4gZnJhbWVzXzsgfQogCi0gIHZpcnR1YWwgUGFpbnRJbWFnZTo6SW1hZ2VUeXBlIEdldEltYWdlVHlwZSgpIGNvbnN0OworICAvLyBSZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBkZWNpZGUgd2hldGhlciBvciBub3QgaGFyZHdhcmUKKyAgLy8gYWNjZWxlcmF0aW9uIGNhbiBiZSB1c2VkIHRvIGRlY29kZSB0aGlzIGltYWdlLgorICB2aXJ0dWFsIGNvbnN0IEltYWdlSGVhZGVyTWV0YWRhdGEqIEdldE1ldGFkYXRhRm9yRGVjb2RlQWNjZWxlcmF0aW9uKCkgY29uc3Q7CiAKICBwcm90ZWN0ZWQ6CiAgIC8vIHxpbmZvfCBpcyB0aGUgaW5mbyBmb3IgdGhpcyBwYWludCBpbWFnZSBnZW5lcmF0b3IuCmRpZmYgLS1naXQgYS9jYy90ZXN0L2Zha2VfcGFpbnRfaW1hZ2VfZ2VuZXJhdG9yLmNjIGIvY2MvdGVzdC9mYWtlX3BhaW50X2ltYWdlX2dlbmVyYXRvci5jYwppbmRleCAyOWYxOTkxLi43ZTI3ZTA5ODUgMTAwNjQ0Ci0tLSBhL2NjL3Rlc3QvZmFrZV9wYWludF9pbWFnZV9nZW5lcmF0b3IuY2MKKysrIGIvY2MvdGVzdC9mYWtlX3BhaW50X2ltYWdlX2dlbmVyYXRvci5jYwpAQCAtMzYsMTAgKzM2LDYgQEAKIAogRmFrZVBhaW50SW1hZ2VHZW5lcmF0b3I6On5GYWtlUGFpbnRJbWFnZUdlbmVyYXRvcigpID0gZGVmYXVsdDsKIAotYm9vbCBGYWtlUGFpbnRJbWFnZUdlbmVyYXRvcjo6SXNFbGlnaWJsZUZvckFjY2VsZXJhdGVkRGVjb2RpbmcoKSBjb25zdCB7Ci0gIHJldHVybiBpc19lbGlnaWJsZV9mb3JfYWNjZWxlcmF0ZWRfZGVjb2RlXzsKLX0KLQogc2tfc3A8U2tEYXRhPiBGYWtlUGFpbnRJbWFnZUdlbmVyYXRvcjo6R2V0RW5jb2RlZERhdGEoKSBjb25zdCB7CiAgIHJldHVybiBTa0RhdGE6Ok1ha2VFbXB0eSgpOwogfQpAQCAtMTEzLDggKzEwOSw5IEBACiAgIHJldHVybiBQYWludEltYWdlR2VuZXJhdG9yOjpHZXRTdXBwb3J0ZWREZWNvZGVTaXplKHJlcXVlc3RlZF9zaXplKTsKIH0KIAotUGFpbnRJbWFnZTo6SW1hZ2VUeXBlIEZha2VQYWludEltYWdlR2VuZXJhdG9yOjpHZXRJbWFnZVR5cGUoKSBjb25zdCB7Ci0gIHJldHVybiBpbWFnZV90eXBlXzsKK2NvbnN0IEltYWdlSGVhZGVyTWV0YWRhdGEqCitGYWtlUGFpbnRJbWFnZUdlbmVyYXRvcjo6R2V0TWV0YWRhdGFGb3JEZWNvZGVBY2NlbGVyYXRpb24oKSBjb25zdCB7CisgIHJldHVybiAmaW1hZ2VfbWV0YWRhdGFfOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgY2MKZGlmZiAtLWdpdCBhL2NjL3Rlc3QvZmFrZV9wYWludF9pbWFnZV9nZW5lcmF0b3IuaCBiL2NjL3Rlc3QvZmFrZV9wYWludF9pbWFnZV9nZW5lcmF0b3IuaAppbmRleCA2YTUxODM2Yy4uOGJjZGY1NiAxMDA2NDQKLS0tIGEvY2MvdGVzdC9mYWtlX3BhaW50X2ltYWdlX2dlbmVyYXRvci5oCisrKyBiL2NjL3Rlc3QvZmFrZV9wYWludF9pbWFnZV9nZW5lcmF0b3IuaApAQCAtMzMsNyArMzMsNiBAQAogICBGYWtlUGFpbnRJbWFnZUdlbmVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IEZha2VQYWludEltYWdlR2VuZXJhdG9yJikgPSBkZWxldGU7CiAKICAgLy8gUGFpbnRJbWFnZUdlbmVyYXRvciBpbXBsZW1lbnRhdGlvbi4KLSAgYm9vbCBJc0VsaWdpYmxlRm9yQWNjZWxlcmF0ZWREZWNvZGluZygpIGNvbnN0IG92ZXJyaWRlOwogICBza19zcDxTa0RhdGE+IEdldEVuY29kZWREYXRhKCkgY29uc3Qgb3ZlcnJpZGU7CiAgIGJvb2wgR2V0UGl4ZWxzKGNvbnN0IFNrSW1hZ2VJbmZvJiBpbmZvLAogICAgICAgICAgICAgICAgICB2b2lkKiBwaXhlbHMsCkBAIC01MCw3ICs0OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lX2luZGV4LAogICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxhenlfcGl4ZWxfcmVmKSBvdmVycmlkZTsKICAgU2tJU2l6ZSBHZXRTdXBwb3J0ZWREZWNvZGVTaXplKGNvbnN0IFNrSVNpemUmIHJlcXVlc3RlZF9zaXplKSBjb25zdCBvdmVycmlkZTsKLSAgUGFpbnRJbWFnZTo6SW1hZ2VUeXBlIEdldEltYWdlVHlwZSgpIGNvbnN0IG92ZXJyaWRlOworICBjb25zdCBJbWFnZUhlYWRlck1ldGFkYXRhKiBHZXRNZXRhZGF0YUZvckRlY29kZUFjY2VsZXJhdGlvbigpIGNvbnN0IG92ZXJyaWRlOwogCiAgIGNvbnN0IGJhc2U6OmZsYXRfbWFwPHNpemVfdCwgaW50PiYgZnJhbWVzX2RlY29kZWQoKSBjb25zdCB7CiAgICAgcmV0dXJuIGZyYW1lc19kZWNvZGVkX2NvdW50XzsKQEAgLTYxLDExICs2MCw4IEBACiAgIH0KICAgdm9pZCByZXNldF9mcmFtZXNfZGVjb2RlZCgpIHsgZnJhbWVzX2RlY29kZWRfY291bnRfLmNsZWFyKCk7IH0KICAgdm9pZCBTZXRFeHBlY3RGYWxsYmFja1RvUkdCKCkgeyBleHBlY3RfZmFsbGJhY2tfdG9fcmdiXyA9IHRydWU7IH0KLSAgdm9pZCBTZXRFbGlnaWJsZUZvckFjY2VsZXJhdGVkRGVjb2RpbmcoKSB7Ci0gICAgaXNfZWxpZ2libGVfZm9yX2FjY2VsZXJhdGVkX2RlY29kZV8gPSB0cnVlOwotICB9Ci0gIHZvaWQgU2V0SW1hZ2VUeXBlKFBhaW50SW1hZ2U6OkltYWdlVHlwZSBpbWFnZV90eXBlKSB7Ci0gICAgaW1hZ2VfdHlwZV8gPSBpbWFnZV90eXBlOworICB2b2lkIFNldEltYWdlSGVhZGVyTWV0YWRhdGEoY29uc3QgSW1hZ2VIZWFkZXJNZXRhZGF0YSYgaW1hZ2VfbWV0YWRhdGEpIHsKKyAgICBpbWFnZV9tZXRhZGF0YV8gPSBpbWFnZV9tZXRhZGF0YTsKICAgfQogCiAgcHJpdmF0ZToKQEAgLTczLDcgKzY5LDYgQEAKICAgU2tQaXhtYXAgaW1hZ2VfcGl4bWFwXzsKICAgYmFzZTo6ZmxhdF9tYXA8c2l6ZV90LCBpbnQ+IGZyYW1lc19kZWNvZGVkX2NvdW50XzsKICAgc3RkOjp2ZWN0b3I8U2tJU2l6ZT4gc3VwcG9ydGVkX3NpemVzXzsKLSAgUGFpbnRJbWFnZTo6SW1hZ2VUeXBlIGltYWdlX3R5cGVfID0gUGFpbnRJbWFnZTo6SW1hZ2VUeXBlOjprSW52YWxpZDsKICAgc3RkOjp2ZWN0b3I8U2tJbWFnZUluZm8+IGRlY29kZV9pbmZvc187CiAgIGJvb2wgaXNfeXV2XyA9IGZhbHNlOwogICBTa1lVVkFTaXplSW5mbyB5dXZhX3NpemVfaW5mb187CkBAIC04MSw3ICs3Niw3IEBACiAgIC8vIHBsYW5lcyBhbmQgYWZ0ZXIgQ2hyb21lIGltcGxlbWVudHMgaXQsIHdlIHNob3VsZCBubyBsb25nZXIgZXhwZWN0IFJHQgogICAvLyBmYWxsYmFjay4KICAgYm9vbCBleHBlY3RfZmFsbGJhY2tfdG9fcmdiXyA9IGZhbHNlOwotICBib29sIGlzX2VsaWdpYmxlX2Zvcl9hY2NlbGVyYXRlZF9kZWNvZGVfID0gZmFsc2U7CisgIEltYWdlSGVhZGVyTWV0YWRhdGEgaW1hZ2VfbWV0YWRhdGFfOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGNjCmRpZmYgLS1naXQgYS9jYy90ZXN0L3NraWFfY29tbW9uLmNjIGIvY2MvdGVzdC9za2lhX2NvbW1vbi5jYwppbmRleCA2Yzk0MGFiOS4uYzQ3MDY1ZSAxMDA2NDQKLS0tIGEvY2MvdGVzdC9za2lhX2NvbW1vbi5jYworKysgYi9jYy90ZXN0L3NraWFfY29tbW9uLmNjCkBAIC0xNDgsNyArMTQ4LDYgQEAKICAgICAgICAgaW5mbywgc3RkOjp2ZWN0b3I8RnJhbWVNZXRhZGF0YT57RnJhbWVNZXRhZGF0YSgpfSwKICAgICAgICAgYWxsb2NhdGVfZW5jb2RlZF9kYXRhKTsKICAgfQotICBnZW5lcmF0b3ItPlNldEVsaWdpYmxlRm9yQWNjZWxlcmF0ZWREZWNvZGluZygpOwogICBhdXRvIHBhaW50X2ltYWdlID0KICAgICAgIFBhaW50SW1hZ2VCdWlsZGVyOjpXaXRoRGVmYXVsdCgpCiAgICAgICAgICAgLnNldF9pZChpZCkKZGlmZiAtLWdpdCBhL2NjL3RpbGVzL2dwdV9pbWFnZV9kZWNvZGVfY2FjaGUuY2MgYi9jYy90aWxlcy9ncHVfaW1hZ2VfZGVjb2RlX2NhY2hlLmNjCmluZGV4IGQ4NzUwYTEuLmRhYmI5MzAgMTAwNjQ0Ci0tLSBhL2NjL3RpbGVzL2dwdV9pbWFnZV9kZWNvZGVfY2FjaGUuY2MKKysrIGIvY2MvdGlsZXMvZ3B1X2ltYWdlX2RlY29kZV9jYWNoZS5jYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgImdwdS9jb21tYW5kX2J1ZmZlci9jb21tb24vc3luY190b2tlbi5oIgogI2luY2x1ZGUgImdwdS9jb25maWcvZ3B1X2ZpbmNoX2ZlYXR1cmVzLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvc2tpYS9pbmNsdWRlL2NvcmUvU2tDYW52YXMuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9za2lhL2luY2x1ZGUvY29yZS9Ta0RhdGEuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9za2lhL2luY2x1ZGUvY29yZS9Ta1JlZkNudC5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L3NraWEvaW5jbHVkZS9jb3JlL1NrU3VyZmFjZS5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L3NraWEvaW5jbHVkZS9jb3JlL1NrWVVWQUluZGV4LmgiCkBAIC01NTcsMTIgKzU1OCwxNSBAQAogICAgIFRSQUNFX0VWRU5UMigiY2MiLCAiR3B1SW1hZ2VEZWNvZGVUYXNrSW1wbDo6UnVuT25Xb3JrZXJUaHJlYWQiLCAibW9kZSIsCiAgICAgICAgICAgICAgICAgICJncHUiLCAic291cmNlX3ByZXBhcmVfdGlsZXNfaWQiLAogICAgICAgICAgICAgICAgICB0cmFjaW5nX2luZm9fLnByZXBhcmVfdGlsZXNfaWQpOworCisgICAgY29uc3QgYXV0byogaW1hZ2VfbWV0YWRhdGEgPSBpbWFnZV8ucGFpbnRfaW1hZ2UoKS5HZXRJbWFnZUhlYWRlck1ldGFkYXRhKCk7CisgICAgY29uc3QgSW1hZ2VUeXBlIGltYWdlX3R5cGUgPQorICAgICAgICBpbWFnZV9tZXRhZGF0YSA/IGltYWdlX21ldGFkYXRhLT5pbWFnZV90eXBlIDogSW1hZ2VUeXBlOjprSW52YWxpZDsKICAgICBkZXZ0b29sc19pbnN0cnVtZW50YXRpb246OlNjb3BlZEltYWdlRGVjb2RlVGFzayBpbWFnZV9kZWNvZGVfdGFzaygKICAgICAgICAgJmltYWdlXy5wYWludF9pbWFnZSgpLAogICAgICAgICBkZXZ0b29sc19pbnN0cnVtZW50YXRpb246OlNjb3BlZEltYWdlRGVjb2RlVGFzazo6a0dwdSwKICAgICAgICAgSW1hZ2VEZWNvZGVDYWNoZTo6VG9TY29wZWRUYXNrVHlwZSh0cmFjaW5nX2luZm9fLnRhc2tfdHlwZSksCi0gICAgICAgIEltYWdlRGVjb2RlQ2FjaGU6OlRvU2NvcGVkSW1hZ2VUeXBlKAotICAgICAgICAgICAgaW1hZ2VfLnBhaW50X2ltYWdlKCkuR2V0SW1hZ2VUeXBlKCkpKTsKKyAgICAgICAgSW1hZ2VEZWNvZGVDYWNoZTo6VG9TY29wZWRJbWFnZVR5cGUoaW1hZ2VfdHlwZSkpOwogICAgIGNhY2hlXy0+RGVjb2RlSW1hZ2VJblRhc2soaW1hZ2VfLCB0cmFjaW5nX2luZm9fLnRhc2tfdHlwZSk7CiAgIH0KIApAQCAtNTg5LDEyICs1OTMsMTAgQEAKICAgSW1hZ2VVcGxvYWRUYXNrSW1wbChHcHVJbWFnZURlY29kZUNhY2hlKiBjYWNoZSwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEcmF3SW1hZ2UmIGRyYXdfaW1hZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkX3JlZnB0cjxUaWxlVGFzaz4gZGVjb2RlX2RlcGVuZGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgc2tfc3A8U2tEYXRhPiBlbmNvZGVkX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW1hZ2VEZWNvZGVDYWNoZTo6VHJhY2luZ0luZm8mIHRyYWNpbmdfaW5mbykKICAgICAgIDogVGlsZVRhc2soZmFsc2UpLAogICAgICAgICBjYWNoZV8oY2FjaGUpLAogICAgICAgICBpbWFnZV8oZHJhd19pbWFnZSksCi0gICAgICAgIGVuY29kZWRfZGF0YV8oc3RkOjptb3ZlKGVuY29kZWRfZGF0YSkpLAogICAgICAgICB0cmFjaW5nX2luZm9fKHRyYWNpbmdfaW5mbykgewogICAgIERDSEVDSyghU2tpcEltYWdlKGRyYXdfaW1hZ2UpKTsKICAgICAvLyBJZiBhbiBpbWFnZSBpcyBhbHJlYWR5IGRlY29kZWQgYW5kIGxvY2tlZCwgd2Ugd2lsbCBub3QgZ2VuZXJhdGUgYQpAQCAtNjEwLDcgKzYxMiw3IEBACiAgIHZvaWQgUnVuT25Xb3JrZXJUaHJlYWQoKSBvdmVycmlkZSB7CiAgICAgVFJBQ0VfRVZFTlQyKCJjYyIsICJJbWFnZVVwbG9hZFRhc2tJbXBsOjpSdW5PbldvcmtlclRocmVhZCIsICJtb2RlIiwgImdwdSIsCiAgICAgICAgICAgICAgICAgICJzb3VyY2VfcHJlcGFyZV90aWxlc19pZCIsIHRyYWNpbmdfaW5mb18ucHJlcGFyZV90aWxlc19pZCk7Ci0gICAgY2FjaGVfLT5VcGxvYWRJbWFnZUluVGFzayhpbWFnZV8sIHN0ZDo6bW92ZShlbmNvZGVkX2RhdGFfKSk7CisgICAgY2FjaGVfLT5VcGxvYWRJbWFnZUluVGFzayhpbWFnZV8pOwogICB9CiAKICAgLy8gT3ZlcnJpZGRlbiBmcm9tIFRpbGVUYXNrOgpAQCAtNjI0LDcgKzYyNiw2IEBACiAgcHJpdmF0ZToKICAgR3B1SW1hZ2VEZWNvZGVDYWNoZSogY2FjaGVfOwogICBEcmF3SW1hZ2UgaW1hZ2VfOwotICBza19zcDxTa0RhdGE+IGVuY29kZWRfZGF0YV87CiAgIGNvbnN0IEltYWdlRGVjb2RlQ2FjaGU6OlRyYWNpbmdJbmZvIHRyYWNpbmdfaW5mb187CiB9OwogCkBAIC0xMDI5LDcgKzEwMzAsNiBAQAogICBjb25zdCBJblVzZUNhY2hlS2V5IGNhY2hlX2tleSA9IEluVXNlQ2FjaGVLZXk6OkZyb21EcmF3SW1hZ2UoZHJhd19pbWFnZSk7CiAgIEltYWdlRGF0YSogaW1hZ2VfZGF0YSA9IEdldEltYWdlRGF0YUZvckRyYXdJbWFnZShkcmF3X2ltYWdlLCBjYWNoZV9rZXkpOwogICBzY29wZWRfcmVmcHRyPEltYWdlRGF0YT4gbmV3X2RhdGE7Ci0gIHNrX3NwPFNrRGF0YT4gZW5jb2RlZF9kYXRhOwogICBpZiAoIWltYWdlX2RhdGEpIHsKICAgICAvLyBXZSBuZWVkIGFuIEltYWdlRGF0YSwgY3JlYXRlIG9uZSBub3cuIE5vdGUgdGhhdCBoYXJkd2FyZSBkZWNvZGUKICAgICAvLyBhY2NlbGVyYXRpb24gaXMgYWxsb3dlZCBvbmx5IGluIHRoZSBEZWNvZGVUYXNrVHlwZTo6a1BhcnRPZlVwbG9hZFRhc2sKQEAgLTEwMzgsOCArMTAzOCw3IEBACiAgICAgbmV3X2RhdGEgPSBDcmVhdGVJbWFnZURhdGEoCiAgICAgICAgIGRyYXdfaW1hZ2UsCiAgICAgICAgIHRhc2tfdHlwZSA9PQotICAgICAgICAgICAgRGVjb2RlVGFza1R5cGU6OmtQYXJ0T2ZVcGxvYWRUYXNrIC8qIGFsbG93X2hhcmR3YXJlX2RlY29kZSAqLywKLSAgICAgICAgJmVuY29kZWRfZGF0YSk7CisgICAgICAgICAgICBEZWNvZGVUYXNrVHlwZTo6a1BhcnRPZlVwbG9hZFRhc2sgLyogYWxsb3dfaGFyZHdhcmVfZGVjb2RlICovKTsKICAgICBpbWFnZV9kYXRhID0gbmV3X2RhdGEuZ2V0KCk7CiAgIH0gZWxzZSBpZiAoaW1hZ2VfZGF0YS0+ZGVjb2RlLmRlY29kZV9mYWlsdXJlKSB7CiAgICAgLy8gV2UgaGF2ZSBhbHJlYWR5IHRyaWVkIGFuZCBmYWlsZWQgdG8gZGVjb2RlIHRoaXMgaW1hZ2UsIHNvIGp1c3QgcmV0dXJuLgpAQCAtMTA5MCw3ICsxMDg5LDcgQEAKICAgICB0YXNrID0gYmFzZTo6TWFrZVJlZkNvdW50ZWQ8SW1hZ2VVcGxvYWRUYXNrSW1wbD4oCiAgICAgICAgIHRoaXMsIGRyYXdfaW1hZ2UsCiAgICAgICAgIEdldEltYWdlRGVjb2RlVGFza0FuZFJlZihkcmF3X2ltYWdlLCB0cmFjaW5nX2luZm8sIHRhc2tfdHlwZSksCi0gICAgICAgIHN0ZDo6bW92ZShlbmNvZGVkX2RhdGEpLCB0cmFjaW5nX2luZm8pOworICAgICAgICB0cmFjaW5nX2luZm8pOwogICAgIGltYWdlX2RhdGEtPnVwbG9hZC50YXNrID0gdGFzazsKICAgfSBlbHNlIHsKICAgICB0YXNrID0gR2V0SW1hZ2VEZWNvZGVUYXNrQW5kUmVmKGRyYXdfaW1hZ2UsIHRyYWNpbmdfaW5mbywgdGFza190eXBlKTsKQEAgLTExMjksMTEgKzExMjgsOSBAQAogICBiYXNlOjpBdXRvTG9jayBsb2NrKGxvY2tfKTsKICAgY29uc3QgSW5Vc2VDYWNoZUtleSBjYWNoZV9rZXkgPSBJblVzZUNhY2hlS2V5OjpGcm9tRHJhd0ltYWdlKGRyYXdfaW1hZ2UpOwogICBJbWFnZURhdGEqIGltYWdlX2RhdGEgPSBHZXRJbWFnZURhdGFGb3JEcmF3SW1hZ2UoZHJhd19pbWFnZSwgY2FjaGVfa2V5KTsKLSAgc2tfc3A8U2tEYXRhPiBlbmNvZGVkX2RhdGE7CiAgIGlmICghaW1hZ2VfZGF0YSkgewogICAgIC8vIFdlIGRpZG4ndCBmaW5kIHRoZSBpbWFnZSwgY3JlYXRlIGEgbmV3IGVudHJ5LgotICAgIGF1dG8gZGF0YSA9IENyZWF0ZUltYWdlRGF0YShkcmF3X2ltYWdlLCB0cnVlIC8qIGFsbG93X2hhcmR3YXJlX2RlY29kZSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY29kZWRfZGF0YSk7CisgICAgYXV0byBkYXRhID0gQ3JlYXRlSW1hZ2VEYXRhKGRyYXdfaW1hZ2UsIHRydWUgLyogYWxsb3dfaGFyZHdhcmVfZGVjb2RlICovKTsKICAgICBpbWFnZV9kYXRhID0gZGF0YS5nZXQoKTsKICAgICBBZGRUb1BlcnNpc3RlbnRDYWNoZShkcmF3X2ltYWdlLCBzdGQ6Om1vdmUoZGF0YSkpOwogICB9CkBAIC0xMTQ4LDcgKzExNDUsNyBAQAogICAvLyBXZSBtYXkgb3IgbWF5IG5vdCBuZWVkIHRvIGRlY29kZSBhbmQgdXBsb2FkIHRoZSBpbWFnZSB3ZSd2ZSBmb3VuZCwgdGhlCiAgIC8vIGZvbGxvd2luZyBmdW5jdGlvbnMgZWFybHktb3V0IHRvIGlmIHdlIGFscmVhZHkgZGVjb2RlZC4KICAgRGVjb2RlSW1hZ2VJZk5lY2Vzc2FyeShkcmF3X2ltYWdlLCBpbWFnZV9kYXRhLCBUYXNrVHlwZTo6a0luUmFzdGVyKTsKLSAgVXBsb2FkSW1hZ2VJZk5lY2Vzc2FyeShkcmF3X2ltYWdlLCBpbWFnZV9kYXRhLCBzdGQ6Om1vdmUoZW5jb2RlZF9kYXRhKSk7CisgIFVwbG9hZEltYWdlSWZOZWNlc3NhcnkoZHJhd19pbWFnZSwgaW1hZ2VfZGF0YSk7CiAgIC8vIFVucmVmIHRoZSBpbWFnZSBkZWNvZGUsIGJ1dCBub3QgdGhlIGltYWdlLiBUaGUgaW1hZ2UgcmVmIHdpbGwgYmUgcmVsZWFzZWQKICAgLy8gaW4gRHJhd1dpdGhJbWFnZUZpbmlzaGVkLgogICBVbnJlZkltYWdlRGVjb2RlKGRyYXdfaW1hZ2UsIGNhY2hlX2tleSk7CkBAIC0xNDcyLDggKzE0NjksNyBAQAogICBEZWNvZGVJbWFnZUlmTmVjZXNzYXJ5KGRyYXdfaW1hZ2UsIGltYWdlX2RhdGEsIHRhc2tfdHlwZSk7CiB9CiAKLXZvaWQgR3B1SW1hZ2VEZWNvZGVDYWNoZTo6VXBsb2FkSW1hZ2VJblRhc2soY29uc3QgRHJhd0ltYWdlJiBkcmF3X2ltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza19zcDxTa0RhdGE+IGVuY29kZWRfZGF0YSkgewordm9pZCBHcHVJbWFnZURlY29kZUNhY2hlOjpVcGxvYWRJbWFnZUluVGFzayhjb25zdCBEcmF3SW1hZ2UmIGRyYXdfaW1hZ2UpIHsKICAgVFJBQ0VfRVZFTlQwKFRSQUNFX0RJU0FCTEVEX0JZX0RFRkFVTFQoImNjLmRlYnVnIiksCiAgICAgICAgICAgICAgICAiR3B1SW1hZ2VEZWNvZGVDYWNoZTo6VXBsb2FkSW1hZ2UiKTsKICAgYmFzZTo6T3B0aW9uYWw8dml6OjpSYXN0ZXJDb250ZXh0UHJvdmlkZXI6OlNjb3BlZFJhc3RlckNvbnRleHRMb2NrPgpAQCAtMTQ5Myw3ICsxNDg5LDcgQEAKIAogICBpZiAoaW1hZ2VfZGF0YS0+aXNfYml0bWFwX2JhY2tlZCkKICAgICBEZWNvZGVJbWFnZUlmTmVjZXNzYXJ5KGRyYXdfaW1hZ2UsIGltYWdlX2RhdGEsIFRhc2tUeXBlOjprSW5SYXN0ZXIpOwotICBVcGxvYWRJbWFnZUlmTmVjZXNzYXJ5KGRyYXdfaW1hZ2UsIGltYWdlX2RhdGEsIHN0ZDo6bW92ZShlbmNvZGVkX2RhdGEpKTsKKyAgVXBsb2FkSW1hZ2VJZk5lY2Vzc2FyeShkcmF3X2ltYWdlLCBpbWFnZV9kYXRhKTsKIH0KIAogdm9pZCBHcHVJbWFnZURlY29kZUNhY2hlOjpPbkltYWdlRGVjb2RlVGFza0NvbXBsZXRlZCgKQEAgLTE5NDksOCArMTk0NSw3IEBACiB9CiAKIHZvaWQgR3B1SW1hZ2VEZWNvZGVDYWNoZTo6VXBsb2FkSW1hZ2VJZk5lY2Vzc2FyeShjb25zdCBEcmF3SW1hZ2UmIGRyYXdfaW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1hZ2VEYXRhKiBpbWFnZV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrX3NwPFNrRGF0YT4gZW5jb2RlZF9kYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1hZ2VEYXRhKiBpbWFnZV9kYXRhKSB7CiAgIENoZWNrQ29udGV4dExvY2tBY3F1aXJlZElmTmVjZXNzYXJ5KCk7CiAgIGxvY2tfLkFzc2VydEFjcXVpcmVkKCk7CiAKQEAgLTIwMTIsMTQgKzIwMDcsMTEgQEAKICAgICAgIERDSEVDS19FUSgwLCBpbWFnZV9kYXRhLT51cGxvYWRfc2NhbGVfbWlwX2xldmVsKTsKICAgICAgIGNvbnN0IGdmeDo6U2l6ZSBvdXRwdXRfc2l6ZShkcmF3X2ltYWdlLnBhaW50X2ltYWdlKCkud2lkdGgoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3X2ltYWdlLnBhaW50X2ltYWdlKCkuaGVpZ2h0KCkpOwotICAgICAgLy8gVHJ5IHRvIGdldCB0aGUgZW5jb2RlZCBkYXRhIGlmIHdlIGRvbid0IGhhdmUgaXQgYWxyZWFkeTogdGhpcyBjYW4KLSAgICAgIC8vIGhhcHBlbiwgZS5nLiwgaWYgd2UgY3JlYXRlIGFuIHVwbG9hZCB0YXNrIHVzaW5nIGEgcHJlLWV4aXN0aW5nCi0gICAgICAvLyBJbWFnZURhdGEuIEluIHRoYXQgY2FzZSwgd2UgcHJldmlvdXNseSBkZWNpZGVkIHRvIGRvIGhhcmR3YXJlIGRlY29kZQotICAgICAgLy8gYWNjZWxlcmF0aW9uIGJ1dCB3ZSBkaWRuJ3QgY2FjaGUgdGhlIGVuY29kZWQgZGF0YS4KLSAgICAgIGlmICghZW5jb2RlZF9kYXRhKSB7Ci0gICAgICAgIGVuY29kZWRfZGF0YSA9IGRyYXdfaW1hZ2UucGFpbnRfaW1hZ2UoKS5HZXRTa0ltYWdlKCktPnJlZkVuY29kZWREYXRhKCk7Ci0gICAgICAgIERDSEVDSyhlbmNvZGVkX2RhdGEpOwotICAgICAgfQorCisgICAgICAvLyBHZXQgdGhlIGVuY29kZWQgZGF0YSBpbiBhIGNvbnRpZ3VvdXMgZm9ybS4KKyAgICAgIHNrX3NwPFNrRGF0YT4gZW5jb2RlZF9kYXRhID0KKyAgICAgICAgICBkcmF3X2ltYWdlLnBhaW50X2ltYWdlKCkuR2V0U2tJbWFnZSgpLT5yZWZFbmNvZGVkRGF0YSgpOworICAgICAgRENIRUNLKGVuY29kZWRfZGF0YSk7CiAgICAgICBjb25zdCB1aW50MzJfdCB0cmFuc2Zlcl9jYWNoZV9pZCA9CiAgICAgICAgICAgQ2xpZW50SW1hZ2VUcmFuc2ZlckNhY2hlRW50cnk6OkdldE5leHRJZCgpOwogICAgICAgY29uc3QgZ3B1OjpTeW5jVG9rZW4gZGVjb2RlX3N5bmNfdG9rZW4gPQpAQCAtMjIxNiw4ICsyMjA4LDcgQEAKIAogc2NvcGVkX3JlZnB0cjxHcHVJbWFnZURlY29kZUNhY2hlOjpJbWFnZURhdGE+CiBHcHVJbWFnZURlY29kZUNhY2hlOjpDcmVhdGVJbWFnZURhdGEoY29uc3QgRHJhd0ltYWdlJiBkcmF3X2ltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWxsb3dfaGFyZHdhcmVfZGVjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrX3NwPFNrRGF0YT4qIGVuY29kZWRfZGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWxsb3dfaGFyZHdhcmVfZGVjb2RlKSB7CiAgIFRSQUNFX0VWRU5UMChUUkFDRV9ESVNBQkxFRF9CWV9ERUZBVUxUKCJjYy5kZWJ1ZyIpLAogICAgICAgICAgICAgICAgIkdwdUltYWdlRGVjb2RlQ2FjaGU6OkNyZWF0ZUltYWdlRGF0YSIpOwogICBsb2NrXy5Bc3NlcnRBY3F1aXJlZCgpOwpAQCAtMjI2MywyMSArMjI1NCwxMiBAQAogICAvLyBGaWd1cmUgb3V0IGlmIHdlIHdpbGwgZG8gaGFyZHdhcmUgYWNjZWxlcmF0ZWQgZGVjb2RpbmcuIFRoZSBjcml0ZXJpYSBpcyBhcwogICAvLyBmb2xsb3dzOgogICAvLwotICAvLyAtIEVpdGhlciB0aGUga1ZhYXBpSnBlZ0ltYWdlRGVjb2RlQWNjZWxlcmF0aW9uIG9yCi0gIC8vICAga1ZhYXBpV2ViUEltYWdlRGVjb2RlQWNjZWxlcmF0aW9uIGZlYXR1cmVzIGFyZSBlbmFibGVkLgogICAvLyAtIFRoZSBjYWxsZXIgYWxsb3dzIGhhcmR3YXJlIGRlY29kZXMuCiAgIC8vIC0gV2UgYXJlIHVzaW5nIHRoZSB0cmFuc2ZlciBjYWNoZSAoT09QLVIpLgogICAvLyAtIFRoZSBpbWFnZSBkb2VzIG5vdCByZXF1aXJlIGRvd25zY2FsaW5nIGZvciB1cGxvYWRpbmcgKHNlZSBUT0RPIGJlbG93KS4KLSAgLy8gLSBBbGwgdGhlIGVuY29kZWQgZGF0YSB3YXMgcmVjZWl2ZWQgcHJpb3IgdG8gYW55IGRlY29kaW5nIHdvcmsuIE90aGVyd2lzZSwKLSAgLy8gICBpdCBtZWFucyB0aGF0IHRoZSBzb2Z0d2FyZSBkZWNvZGVyIGhhcyBhbHJlYWR5IHN0YXJ0ZWQgZGVjb2RpbmcgdGhlCi0gIC8vICAgaW1hZ2UsIHNvIHdlIGp1c3QgbGV0IGl0IGZpbmlzaC4KLSAgLy8gLSBUaGUgaW1hZ2UncyBjb2xvciBzcGFjZSBpcyBzUkdCLiBUaGlzIGlzIGJlY2F1c2Ugd2UgZG9uJ3QgY3VycmVudGx5Ci0gIC8vICAgc3VwcG9ydCBkZXRlY3RpbmcgZW1iZWRkZWQgY29sb3IgcHJvZmlsZXMuCisgIC8vIC0gVGhlIGltYWdlIGRvZXMgbm90IHJlcXVpcmUgc3Vic2V0dGluZy4KICAgLy8gLSBUaGUgaW1hZ2UgaXMgc3VwcG9ydGVkIGFjY29yZGluZyB0byB0aGUgcHJvZmlsZXMgYWR2ZXJ0aXNlZCBieSB0aGUgR1BVCi0gIC8vICAgc2VydmljZS4gQ2hlY2tpbmcgdGhpcyBpbnZvbHZlcyBvYnRhaW5pbmcgdGhlIGNvbnRpZ3VvdXMgZW5jb2RlZCBkYXRhCi0gIC8vICAgd2hpY2ggbWF5IHJlcXVpcmUgYSBjb3B5IGlmIHRoZSBkYXRhIGlzIG5vdCBhbHJlYWR5IGNvbnRpZ3VvdXMuIEJlY2F1c2UKLSAgLy8gICBvZiB0aGlzLCB3ZSByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBjb250aWd1b3VzIGRhdGEgKGFzIHxlbmNvZGVkX2RhdGF8KQotICAvLyAgIHNvIHRoYXQgd2UgY2FuIHJlLXVzZSBpdCBsYXRlciAod2hlbiByZXF1ZXN0aW5nIHRoZSBpbWFnZSBkZWNvZGUpLgorICAvLyAgIHNlcnZpY2UuCiAgIC8vCiAgIC8vIFRPRE8oY3JidWcuY29tLzk1MzM2Nyk6IGN1cnJlbnRseSwgd2UgZG9uJ3Qgc3VwcG9ydCBzY2FsaW5nIHdpdGggaGFyZHdhcmUKICAgLy8gZGVjb2RlIGFjY2VsZXJhdGlvbi4gTm90ZSB0aGF0IGl0J3Mgc3RpbGwgb2theSBmb3IgdGhlIGltYWdlIHRvIGJlCkBAIC0yMjg2LDQxICsyMjY4LDI4IEBACiAgIC8vIFRPRE8oY3JidWcuY29tLzk4MTIwOCk6IHxkYXRhX3NpemV8IG5lZWRzIHRvIGJlIHNldCB0byB0aGUgc2l6ZSBvZiB0aGUKICAgLy8gZGVjb2RlZCBkYXRhLCBidXQgZm9yIGFjY2VsZXJhdGVkIGRlY29kZXMgd2Ugd29uJ3Qga25vdyB1bnRpbCB0aGUgZHJpdmVyCiAgIC8vIGdpdmVzIHVzIHRoZSByZXN1bHQgaW4gdGhlIEdQVSBwcm9jZXNzLiBGaWd1cmUgb3V0IHdoYXQgdG8gZG8uCisgIGNvbnN0IEltYWdlSGVhZGVyTWV0YWRhdGEqIGltYWdlX21ldGFkYXRhID0KKyAgICAgIGRyYXdfaW1hZ2UucGFpbnRfaW1hZ2UoKS5HZXRJbWFnZUhlYWRlck1ldGFkYXRhKCk7CiAgIGJvb2wgZG9faGFyZHdhcmVfYWNjZWxlcmF0ZWRfZGVjb2RlID0gZmFsc2U7Ci0gIGlmICgoYWxsb3dfYWNjZWxlcmF0ZWRfanBlZ19kZWNvZGVzXyB8fCBhbGxvd19hY2NlbGVyYXRlZF93ZWJwX2RlY29kZXNfKSAmJgotICAgICAgYWxsb3dfaGFyZHdhcmVfZGVjb2RlICYmIHVwbG9hZF9zY2FsZV9taXBfbGV2ZWwgPT0gMCAmJgotICAgICAgZHJhd19pbWFnZS5wYWludF9pbWFnZSgpLklzRWxpZ2libGVGb3JBY2NlbGVyYXRlZERlY29kaW5nKCkgJiYKLSAgICAgIGRyYXdfaW1hZ2UucGFpbnRfaW1hZ2UoKS5jb2xvcl9zcGFjZSgpICYmCi0gICAgICBkcmF3X2ltYWdlLnBhaW50X2ltYWdlKCkuY29sb3Jfc3BhY2UoKS0+aXNTUkdCKCkpIHsKLSAgICBEQ0hFQ0tfRVEobW9kZSwgRGVjb2RlZERhdGFNb2RlOjprVHJhbnNmZXJDYWNoZSk7Ci0gICAgLy8gVE9ETyhjcmJ1Zy5jb20vOTk1MTQ5KTogd2Ugc2hvdWxkIG5vdCByZXF1aXJlIHRoZSBlbmNvZGVkIGRhdGEgdG8gZmlndXJlCi0gICAgLy8gb3V0IGlmIHRoZSBoYXJkd2FyZSBkZWNvZGVyIHN1cHBvcnRzIHRoZSBpbWFnZS4gSW5zdGVhZCwgd2Ugc2hvdWxkIHBhc3MKLSAgICAvLyBvbmx5IHRoZSBuZWNlc3NhcnkgYXR0cmlidXRlcyB0byBDYW5EZWNvZGVXaXRoSGFyZHdhcmVBY2NlbGVyYXRpb24oKS4KLSAgICAvLyBUaGlzIGlzIGltcG9ydGFudCBiZWNhdXNlIGV4dHJhY3RpbmcgdGhlIGVuY29kZWQgZGF0YSBtYXkgcmVxdWlyZSBhIGNvcHkKLSAgICAvLyBpZiB0aGUgZGF0YSBpcyBub3QgY29udGlndW91cy4KLSAgICBza19zcDxTa0RhdGE+IHRtcF9lbmNvZGVkX2RhdGEgPQotICAgICAgICBkcmF3X2ltYWdlLnBhaW50X2ltYWdlKCkuR2V0U2tJbWFnZSgpCi0gICAgICAgICAgICA/IGRyYXdfaW1hZ2UucGFpbnRfaW1hZ2UoKS5HZXRTa0ltYWdlKCktPnJlZkVuY29kZWREYXRhKCkKLSAgICAgICAgICAgIDogbnVsbHB0cjsKLSAgICBpZiAodG1wX2VuY29kZWRfZGF0YSAmJgotICAgICAgICBjb250ZXh0Xy0+Q29udGV4dFN1cHBvcnQoKS0+Q2FuRGVjb2RlV2l0aEhhcmR3YXJlQWNjZWxlcmF0aW9uKAotICAgICAgICAgICAgYmFzZTo6bWFrZV9zcGFuPGNvbnN0IHVpbnQ4X3Q+KHRtcF9lbmNvZGVkX2RhdGEtPmJ5dGVzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wX2VuY29kZWRfZGF0YS0+c2l6ZSgpKSkpIHsKLSAgICAgIGNvbnN0IGJvb2wgaXNfanBlZyA9IChkcmF3X2ltYWdlLnBhaW50X2ltYWdlKCkuR2V0SW1hZ2VUeXBlKCkgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludEltYWdlOjpJbWFnZVR5cGU6OmtKUEVHKTsKLSAgICAgIGNvbnN0IGJvb2wgaXNfd2VicCA9IChkcmF3X2ltYWdlLnBhaW50X2ltYWdlKCkuR2V0SW1hZ2VUeXBlKCkgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludEltYWdlOjpJbWFnZVR5cGU6OmtXRUJQKTsKLSAgICAgIGRvX2hhcmR3YXJlX2FjY2VsZXJhdGVkX2RlY29kZSA9Ci0gICAgICAgICAgKGlzX2pwZWcgJiYgYWxsb3dfYWNjZWxlcmF0ZWRfanBlZ19kZWNvZGVzXykgfHwKLSAgICAgICAgICAoaXNfd2VicCAmJiBhbGxvd19hY2NlbGVyYXRlZF93ZWJwX2RlY29kZXNfKTsKLSAgICAgIERDSEVDSyhlbmNvZGVkX2RhdGEpOwotICAgICAgKmVuY29kZWRfZGF0YSA9IHN0ZDo6bW92ZSh0bXBfZW5jb2RlZF9kYXRhKTsKLSAgICB9CisgIGlmIChhbGxvd19oYXJkd2FyZV9kZWNvZGUgJiYgbW9kZSA9PSBEZWNvZGVkRGF0YU1vZGU6OmtUcmFuc2ZlckNhY2hlICYmCisgICAgICB1cGxvYWRfc2NhbGVfbWlwX2xldmVsID09IDAgJiYKKyAgICAgIGRyYXdfaW1hZ2UucGFpbnRfaW1hZ2UoKS5zdWJzZXRfcmVjdCgpLklzRW1wdHkoKSAmJgorICAgICAgY29udGV4dF8tPkNvbnRleHRTdXBwb3J0KCktPkNhbkRlY29kZVdpdGhIYXJkd2FyZUFjY2VsZXJhdGlvbigKKyAgICAgICAgICBpbWFnZV9tZXRhZGF0YSkpIHsKKyAgICBEQ0hFQ0soaW1hZ2VfbWV0YWRhdGEpOworICAgIERDSEVDS19FUShpbWFnZV9tZXRhZGF0YS0+aW1hZ2Vfc2l6ZS53aWR0aCgpLAorICAgICAgICAgICAgICBkcmF3X2ltYWdlLnBhaW50X2ltYWdlKCkud2lkdGgoKSk7CisgICAgRENIRUNLX0VRKGltYWdlX21ldGFkYXRhLT5pbWFnZV9zaXplLmhlaWdodCgpLAorICAgICAgICAgICAgICBkcmF3X2ltYWdlLnBhaW50X2ltYWdlKCkuaGVpZ2h0KCkpOworCisgICAgY29uc3QgYm9vbCBpc19qcGVnID0gKGltYWdlX21ldGFkYXRhLT5pbWFnZV90eXBlID09IEltYWdlVHlwZTo6a0pQRUcpOworICAgIGNvbnN0IGJvb2wgaXNfd2VicCA9IChpbWFnZV9tZXRhZGF0YS0+aW1hZ2VfdHlwZSA9PSBJbWFnZVR5cGU6OmtXRUJQKTsKKyAgICBkb19oYXJkd2FyZV9hY2NlbGVyYXRlZF9kZWNvZGUgPQorICAgICAgICAoaXNfanBlZyAmJiBhbGxvd19hY2NlbGVyYXRlZF9qcGVnX2RlY29kZXNfKSB8fAorICAgICAgICAoaXNfd2VicCAmJiBhbGxvd19hY2NlbGVyYXRlZF93ZWJwX2RlY29kZXNfKTsKKyAgICBEQ0hFQ0soIWRvX2hhcmR3YXJlX2FjY2VsZXJhdGVkX2RlY29kZSB8fCAhaXNfYml0bWFwX2JhY2tlZCk7CiAgIH0KIAotICAvLyBJZiBkcmF3X2ltYWdlLnBhaW50X2ltYWdlKCkuSXNFbGlnaWJsZUZvckFjY2VsZXJhdGVkRGVjb2RpbmcoKSByZXR1cm5zCi0gIC8vIHRydWUsIHRoZSBpbWFnZSBzaG91bGQgbm90IGJlIGJhY2tlZCBieSBhIGJpdG1hcC4KLSAgRENIRUNLKCFkb19oYXJkd2FyZV9hY2NlbGVyYXRlZF9kZWNvZGUgfHwgIWlzX2JpdG1hcF9iYWNrZWQpOwogICBTa1lVVkFTaXplSW5mbyB0YXJnZXRfeXV2YV9zaXplX2luZm87CiAgIC8vIFdlIGZpbGwgb3V0IGEgZGVmYXVsdCB2YWx1ZSBmb3IgfHl1dl9jb2xvcl9zcGFjZXwgYnV0IG9ubHkgZmlsbCBvdXQgdGhlCiAgIC8vIGJhc2U6Ok9wdGlvbmFsIG1lbWJlciBpbiBJbWFnZURhdGEgaWYgaXQgaXMgWVVWLgpAQCAtMjY3OCw4ICsyNjQ3LDggQEAKIAogc2l6ZV90IEdwdUltYWdlRGVjb2RlQ2FjaGU6OkdldERyYXdJbWFnZVNpemVGb3JUZXN0aW5nKGNvbnN0IERyYXdJbWFnZSYgaW1hZ2UpIHsKICAgYmFzZTo6QXV0b0xvY2sgbG9jayhsb2NrXyk7Ci0gIHNjb3BlZF9yZWZwdHI8SW1hZ2VEYXRhPiBkYXRhID0gQ3JlYXRlSW1hZ2VEYXRhKAotICAgICAgaW1hZ2UsIGZhbHNlIC8qIGFsbG93X2hhcmR3YXJlX2RlY29kZSAqLywgbnVsbHB0ciAvKiBlbmNvZGVkX2RhdGEgKi8pOworICBzY29wZWRfcmVmcHRyPEltYWdlRGF0YT4gZGF0YSA9CisgICAgICBDcmVhdGVJbWFnZURhdGEoaW1hZ2UsIGZhbHNlIC8qIGFsbG93X2hhcmR3YXJlX2RlY29kZSAqLyk7CiAgIHJldHVybiBkYXRhLT5zaXplOwogfQogCmRpZmYgLS1naXQgYS9jYy90aWxlcy9ncHVfaW1hZ2VfZGVjb2RlX2NhY2hlLmggYi9jYy90aWxlcy9ncHVfaW1hZ2VfZGVjb2RlX2NhY2hlLmgKaW5kZXggMmY1MzUzNC4uZmRmZDExNCAxMDA2NDQKLS0tIGEvY2MvdGlsZXMvZ3B1X2ltYWdlX2RlY29kZV9jYWNoZS5oCisrKyBiL2NjL3RpbGVzL2dwdV9pbWFnZV9kZWNvZGVfY2FjaGUuaApAQCAtMTksNyArMTksNiBAQAogI2luY2x1ZGUgImNjL2NjX2V4cG9ydC5oIgogI2luY2x1ZGUgImNjL3BhaW50L2ltYWdlX3RyYW5zZmVyX2NhY2hlX2VudHJ5LmgiCiAjaW5jbHVkZSAiY2MvdGlsZXMvaW1hZ2VfZGVjb2RlX2NhY2hlLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvc2tpYS9pbmNsdWRlL2NvcmUvU2tEYXRhLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvc2tpYS9pbmNsdWRlL2NvcmUvU2tSZWZDbnQuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9za2lhL2luY2x1ZGUvY29yZS9Ta1lVVkFJbmRleC5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L3NraWEvaW5jbHVkZS9ncHUvZ2wvR3JHTFR5cGVzLmgiCkBAIC0xNzcsNyArMTc2LDcgQEAKIAogICAvLyBDYWxsZWQgYnkgRGVjb2RlIC8gVXBsb2FkIHRhc2tzLgogICB2b2lkIERlY29kZUltYWdlSW5UYXNrKGNvbnN0IERyYXdJbWFnZSYgaW1hZ2UsIFRhc2tUeXBlIHRhc2tfdHlwZSk7Ci0gIHZvaWQgVXBsb2FkSW1hZ2VJblRhc2soY29uc3QgRHJhd0ltYWdlJiBpbWFnZSwgc2tfc3A8U2tEYXRhPiBlbmNvZGVkX2RhdGEpOworICB2b2lkIFVwbG9hZEltYWdlSW5UYXNrKGNvbnN0IERyYXdJbWFnZSYgaW1hZ2UpOwogCiAgIC8vIENhbGxlZCBieSBEZWNvZGUgLyBVcGxvYWQgdGFza3Mgd2hlbiB0YXNrcyBhcmUgZmluaXNoZWQuCiAgIHZvaWQgT25JbWFnZURlY29kZVRhc2tDb21wbGV0ZWQoY29uc3QgRHJhd0ltYWdlJiBpbWFnZSwKQEAgLTYxMSw4ICs2MTAsNyBAQAogCiAgIHNjb3BlZF9yZWZwdHI8R3B1SW1hZ2VEZWNvZGVDYWNoZTo6SW1hZ2VEYXRhPiBDcmVhdGVJbWFnZURhdGEoCiAgICAgICBjb25zdCBEcmF3SW1hZ2UmIGltYWdlLAotICAgICAgYm9vbCBhbGxvd19oYXJkd2FyZV9kZWNvZGUsCi0gICAgICBza19zcDxTa0RhdGE+KiBlbmNvZGVkX2RhdGEpOworICAgICAgYm9vbCBhbGxvd19oYXJkd2FyZV9kZWNvZGUpOwogICB2b2lkIFdpbGxBZGRDYWNoZUVudHJ5KGNvbnN0IERyYXdJbWFnZSYgZHJhd19pbWFnZSk7CiAgIFNrSW1hZ2VJbmZvIENyZWF0ZUltYWdlSW5mb0ZvckRyYXdJbWFnZShjb25zdCBEcmF3SW1hZ2UmIGRyYXdfaW1hZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXBsb2FkX3NjYWxlX21pcF9sZXZlbCkgY29uc3Q7CkBAIC02NDYsOCArNjQ0LDcgQEAKIAogICAvLyBSZXF1aXJlcyB0aGF0IHRoZSB8Y29udGV4dF98IGxvY2sgYmUgaGVsZCB3aGVuIGNhbGxpbmcuCiAgIHZvaWQgVXBsb2FkSW1hZ2VJZk5lY2Vzc2FyeShjb25zdCBEcmF3SW1hZ2UmIGRyYXdfaW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZURhdGEqIGltYWdlX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza19zcDxTa0RhdGE+IGVuY29kZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZURhdGEqIGltYWdlX2RhdGEpOwogCiAgIC8vIEZsdXNoIHBlbmRpbmcgb3BlcmF0aW9ucyBvbiBjb250ZXh0Xy0+R3JDb250ZXh0KCkgZm9yIGVhY2ggZWxlbWVudCBvZgogICAvLyB8eXV2X2ltYWdlc3wgYW5kIHRoZW4gY2xlYXIgdGhlIHZlY3Rvci4KZGlmZiAtLWdpdCBhL2NjL3RpbGVzL2dwdV9pbWFnZV9kZWNvZGVfY2FjaGVfdW5pdHRlc3QuY2MgYi9jYy90aWxlcy9ncHVfaW1hZ2VfZGVjb2RlX2NhY2hlX3VuaXR0ZXN0LmNjCmluZGV4IGQ2MGIzYTMuLjMyOWVkZjkgMTAwNjQ0Ci0tLSBhL2NjL3RpbGVzL2dwdV9pbWFnZV9kZWNvZGVfY2FjaGVfdW5pdHRlc3QuY2MKKysrIGIvY2MvdGlsZXMvZ3B1X2ltYWdlX2RlY29kZV9jYWNoZV91bml0dGVzdC5jYwpAQCAtMTgzLDcgKzE4Myw3IEBACiAgIH0KIAogICBib29sIENhbkRlY29kZVdpdGhIYXJkd2FyZUFjY2VsZXJhdGlvbigKLSAgICAgIGJhc2U6OnNwYW48Y29uc3QgdWludDhfdD4gZW5jb2RlZF9kYXRhKSBjb25zdCBvdmVycmlkZSB7CisgICAgICBjb25zdCBJbWFnZUhlYWRlck1ldGFkYXRhKiBpbWFnZV9tZXRhZGF0YSkgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiBhZHZlcnRpc2VfYWNjZWxlcmF0ZWRfZGVjb2RpbmdfOwogICB9CiAKQEAgLTI5NTAsMjMgKzI5NTAsMjcgQEAKICAgICA6IHB1YmxpYyBHcHVJbWFnZURlY29kZUNhY2hlVGVzdCB7CiAgcHVibGljOgogICBQYWludEltYWdlIENyZWF0ZVBhaW50SW1hZ2VGb3JEZWNvZGVBY2NlbGVyYXRpb24oCi0gICAgICBjb25zdCBnZng6OlNpemUmIHNpemUsCi0gICAgICBza19zcDxTa0NvbG9yU3BhY2U+IGNvbG9yX3NwYWNlID0gbnVsbHB0ciwKLSAgICAgIGJvb2wgaXNfZWxpZ2libGVfZm9yX2FjY2VsZXJhdGVkX2RlY29kaW5nID0gdHJ1ZSwKLSAgICAgIFBhaW50SW1hZ2U6OkltYWdlVHlwZSBpbWFnZV90eXBlID0gUGFpbnRJbWFnZTo6SW1hZ2VUeXBlOjprSlBFRykgewotICAgIFNrSW1hZ2VJbmZvIGluZm8gPQotICAgICAgICBTa0ltYWdlSW5mbzo6TWFrZShzaXplLndpZHRoKCksIHNpemUuaGVpZ2h0KCksIGNvbG9yX3R5cGVfLAotICAgICAgICAgICAgICAgICAgICAgICAgICBrUHJlbXVsX1NrQWxwaGFUeXBlLCBjb2xvcl9zcGFjZSk7CisgICAgICBJbWFnZVR5cGUgaW1hZ2VfdHlwZSA9IEltYWdlVHlwZTo6a0pQRUcpIHsKKyAgICAvLyBDcmVhdGUgYSB2YWxpZCBpbWFnZSBtZXRhZGF0YSBmb3IgaGFyZHdhcmUgYWNjZWxlcmF0aW9uLgorICAgIEltYWdlSGVhZGVyTWV0YWRhdGEgaW1hZ2VfZGF0YXt9OworICAgIGltYWdlX2RhdGEuaW1hZ2Vfc2l6ZSA9IEdldE5vcm1hbEltYWdlU2l6ZSgpOworICAgIGltYWdlX2RhdGEuaW1hZ2VfdHlwZSA9IGltYWdlX3R5cGU7CisgICAgaW1hZ2VfZGF0YS5hbGxfZGF0YV9yZWNlaXZlZF9wcmlvcl90b19kZWNvZGUgPSB0cnVlOworICAgIGltYWdlX2RhdGEuaGFzX2VtYmVkZGVkX2NvbG9yX3Byb2ZpbGUgPSBmYWxzZTsKKyAgICBpbWFnZV9kYXRhLmpwZWdfaXNfcHJvZ3Jlc3NpdmUgPSBmYWxzZTsKKyAgICBpbWFnZV9kYXRhLndlYnBfaXNfbm9uX2V4dGVuZGVkX2xvc3N5ID0gdHJ1ZTsKKworICAgIFNrSW1hZ2VJbmZvIGluZm8gPSBTa0ltYWdlSW5mbzo6TWFrZSgKKyAgICAgICAgaW1hZ2VfZGF0YS5pbWFnZV9zaXplLndpZHRoKCksIGltYWdlX2RhdGEuaW1hZ2Vfc2l6ZS5oZWlnaHQoKSwKKyAgICAgICAgY29sb3JfdHlwZV8sIGtQcmVtdWxfU2tBbHBoYVR5cGUsIFNrQ29sb3JTcGFjZTo6TWFrZVNSR0IoKSk7CiAgICAgc2tfc3A8RmFrZVBhaW50SW1hZ2VHZW5lcmF0b3I+IGdlbmVyYXRvcjsKICAgICBpZiAoZG9feXV2X2RlY29kZV8pIHsKLSAgICAgIGdlbmVyYXRvciA9Ci0gICAgICAgICAgc2tfbWFrZV9zcDxGYWtlUGFpbnRJbWFnZUdlbmVyYXRvcj4oaW5mbywgR2V0WVVWNDIwU2l6ZUluZm8oc2l6ZSkpOworICAgICAgZ2VuZXJhdG9yID0gc2tfbWFrZV9zcDxGYWtlUGFpbnRJbWFnZUdlbmVyYXRvcj4oCisgICAgICAgICAgaW5mbywgR2V0WVVWNDIwU2l6ZUluZm8oaW1hZ2VfZGF0YS5pbWFnZV9zaXplKSk7CiAgICAgfSBlbHNlIHsKICAgICAgIGdlbmVyYXRvciA9IHNrX21ha2Vfc3A8RmFrZVBhaW50SW1hZ2VHZW5lcmF0b3I+KGluZm8pOwogICAgIH0KLSAgICBpZiAoaXNfZWxpZ2libGVfZm9yX2FjY2VsZXJhdGVkX2RlY29kaW5nKQotICAgICAgZ2VuZXJhdG9yLT5TZXRFbGlnaWJsZUZvckFjY2VsZXJhdGVkRGVjb2RpbmcoKTsKLSAgICBnZW5lcmF0b3ItPlNldEltYWdlVHlwZShpbWFnZV90eXBlKTsKKyAgICBnZW5lcmF0b3ItPlNldEltYWdlSGVhZGVyTWV0YWRhdGEoaW1hZ2VfZGF0YSk7CiAgICAgUGFpbnRJbWFnZSBpbWFnZSA9IFBhaW50SW1hZ2VCdWlsZGVyOjpXaXRoRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0X2lkKFBhaW50SW1hZ2U6OkdldE5leHRJZCgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldF9wYWludF9pbWFnZV9nZW5lcmF0b3IoZ2VuZXJhdG9yKQpAQCAtMjk4MywxMiArMjk4Nyw5IEBACiBURVNUX1AoR3B1SW1hZ2VEZWNvZGVDYWNoZVdpdGhBY2NlbGVyYXRlZERlY29kZXNUZXN0LAogICAgICAgIFJlcXVlc3RBY2NlbGVyYXRlZERlY29kZVN1Y2Nlc3NmdWxseSkgewogICBhdXRvIGNhY2hlID0gQ3JlYXRlQ2FjaGUoKTsKLSAgY29uc3QgZ2Z4OjpTaXplIGltYWdlX3NpemUgPSBHZXROb3JtYWxJbWFnZVNpemUoKTsKLSAgY29uc3Qgc2tfc3A8U2tDb2xvclNwYWNlPiBpbWFnZV9jb2xvcl9zcGFjZSA9IFNrQ29sb3JTcGFjZTo6TWFrZVNSR0IoKTsKLSAgY29uc3QgZ2Z4OjpDb2xvclNwYWNlIHRhcmdldF9jb2xvcl9zcGFjZSgqaW1hZ2VfY29sb3Jfc3BhY2UpOworICBjb25zdCBnZng6OkNvbG9yU3BhY2UgdGFyZ2V0X2NvbG9yX3NwYWNlID0gZ2Z4OjpDb2xvclNwYWNlOjpDcmVhdGVTUkdCKCk7CiAgIEFTU0VSVF9UUlVFKHRhcmdldF9jb2xvcl9zcGFjZS5Jc1ZhbGlkKCkpOwotICBjb25zdCBQYWludEltYWdlIGltYWdlID0KLSAgICAgIENyZWF0ZVBhaW50SW1hZ2VGb3JEZWNvZGVBY2NlbGVyYXRpb24oaW1hZ2Vfc2l6ZSwgaW1hZ2VfY29sb3Jfc3BhY2UpOworICBjb25zdCBQYWludEltYWdlIGltYWdlID0gQ3JlYXRlUGFpbnRJbWFnZUZvckRlY29kZUFjY2VsZXJhdGlvbigpOwogICBjb25zdCBTa0ZpbHRlclF1YWxpdHkgcXVhbGl0eSA9IGtIaWdoX1NrRmlsdGVyUXVhbGl0eTsKICAgRHJhd0ltYWdlIGRyYXdfaW1hZ2UoaW1hZ2UsIFNrSVJlY3Q6Ok1ha2VXSChpbWFnZS53aWR0aCgpLCBpbWFnZS5oZWlnaHQoKSksCiAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHksIENyZWF0ZU1hdHJpeChTa1NpemU6Ok1ha2UoMC43NWYsIDAuNzVmKSksCkBAIC0zMDAwLDggKzMwMDEsMTAgQEAKIAogICAvLyBBY2NlbGVyYXRlZCBkZWNvZGVzIHNob3VsZCBub3QgcHJvZHVjZSBkZWNvZGUgdGFza3MuCiAgIEFTU0VSVF9UUlVFKHJlc3VsdC50YXNrLT5kZXBlbmRlbmNpZXMoKS5lbXB0eSgpKTsKKyAgQVNTRVJUX1RSVUUoaW1hZ2UuR2V0SW1hZ2VIZWFkZXJNZXRhZGF0YSgpKTsKICAgRVhQRUNUX0NBTEwoKnJhc3Rlcl9pbXBsZW1lbnRhdGlvbigpLAotICAgICAgICAgICAgICBEb1NjaGVkdWxlSW1hZ2VEZWNvZGUoaW1hZ2Vfc2l6ZSwgXywgZ2Z4OjpDb2xvclNwYWNlKCksIF8pKQorICAgICAgICAgICAgICBEb1NjaGVkdWxlSW1hZ2VEZWNvZGUoaW1hZ2UuR2V0SW1hZ2VIZWFkZXJNZXRhZGF0YSgpLT5pbWFnZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXywgZ2Z4OjpDb2xvclNwYWNlKCksIF8pKQogICAgICAgLlRpbWVzKDEpOwogICBUZXN0VGlsZVRhc2tSdW5uZXI6OlByb2Nlc3NUYXNrKHJlc3VsdC50YXNrLmdldCgpKTsKIApAQCAtMzAxOCwxMiArMzAyMSw5IEBACiBURVNUX1AoR3B1SW1hZ2VEZWNvZGVDYWNoZVdpdGhBY2NlbGVyYXRlZERlY29kZXNUZXN0LAogICAgICAgIFJlcXVlc3RBY2NlbGVyYXRlZERlY29kZVN1Y2Nlc3NmdWxseVdpdGhDb2xvclNwYWNlQ29udmVyc2lvbikgewogICBhdXRvIGNhY2hlID0gQ3JlYXRlQ2FjaGUoKTsKLSAgY29uc3QgZ2Z4OjpTaXplIGltYWdlX3NpemUgPSBHZXROb3JtYWxJbWFnZVNpemUoKTsKLSAgY29uc3Qgc2tfc3A8U2tDb2xvclNwYWNlPiBpbWFnZV9jb2xvcl9zcGFjZSA9IFNrQ29sb3JTcGFjZTo6TWFrZVNSR0IoKTsKICAgY29uc3QgZ2Z4OjpDb2xvclNwYWNlIHRhcmdldF9jb2xvcl9zcGFjZSA9IGdmeDo6Q29sb3JTcGFjZTo6Q3JlYXRlWFlaRDUwKCk7CiAgIEFTU0VSVF9UUlVFKHRhcmdldF9jb2xvcl9zcGFjZS5Jc1ZhbGlkKCkpOwotICBjb25zdCBQYWludEltYWdlIGltYWdlID0KLSAgICAgIENyZWF0ZVBhaW50SW1hZ2VGb3JEZWNvZGVBY2NlbGVyYXRpb24oaW1hZ2Vfc2l6ZSwgaW1hZ2VfY29sb3Jfc3BhY2UpOworICBjb25zdCBQYWludEltYWdlIGltYWdlID0gQ3JlYXRlUGFpbnRJbWFnZUZvckRlY29kZUFjY2VsZXJhdGlvbigpOwogICBjb25zdCBTa0ZpbHRlclF1YWxpdHkgcXVhbGl0eSA9IGtIaWdoX1NrRmlsdGVyUXVhbGl0eTsKICAgRHJhd0ltYWdlIGRyYXdfaW1hZ2UoaW1hZ2UsIFNrSVJlY3Q6Ok1ha2VXSChpbWFnZS53aWR0aCgpLCBpbWFnZS5oZWlnaHQoKSksCiAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHksIENyZWF0ZU1hdHJpeChTa1NpemU6Ok1ha2UoMC43NWYsIDAuNzVmKSksCkBAIC0zMDM1LDEyICszMDM1LDEzIEBACiAKICAgLy8gQWNjZWxlcmF0ZWQgZGVjb2RlcyBzaG91bGQgbm90IHByb2R1Y2UgZGVjb2RlIHRhc2tzLgogICBBU1NFUlRfVFJVRShyZXN1bHQudGFzay0+ZGVwZW5kZW5jaWVzKCkuZW1wdHkoKSk7CisgIEFTU0VSVF9UUlVFKGltYWdlLkdldEltYWdlSGVhZGVyTWV0YWRhdGEoKSk7CiAgIEVYUEVDVF9DQUxMKCpyYXN0ZXJfaW1wbGVtZW50YXRpb24oKSwKLSAgICAgICAgICAgICAgRG9TY2hlZHVsZUltYWdlRGVjb2RlKGltYWdlX3NpemUsIF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS0+U3VwcG9ydHNDb2xvclNwYWNlQ29udmVyc2lvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0YXJnZXRfY29sb3Jfc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdmeDo6Q29sb3JTcGFjZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXykpCisgICAgICAgICAgICAgIERvU2NoZWR1bGVJbWFnZURlY29kZSgKKyAgICAgICAgICAgICAgICAgIGltYWdlLkdldEltYWdlSGVhZGVyTWV0YWRhdGEoKS0+aW1hZ2Vfc2l6ZSwgXywKKyAgICAgICAgICAgICAgICAgIGNhY2hlLT5TdXBwb3J0c0NvbG9yU3BhY2VDb252ZXJzaW9uKCkgPyB0YXJnZXRfY29sb3Jfc3BhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBnZng6OkNvbG9yU3BhY2UoKSwKKyAgICAgICAgICAgICAgICAgIF8pKQogICAgICAgLlRpbWVzKDEpOwogICBUZXN0VGlsZVRhc2tSdW5uZXI6OlByb2Nlc3NUYXNrKHJlc3VsdC50YXNrLmdldCgpKTsKIApAQCAtMzA1NywxMiArMzA1OCw5IEBACiBURVNUX1AoR3B1SW1hZ2VEZWNvZGVDYWNoZVdpdGhBY2NlbGVyYXRlZERlY29kZXNUZXN0LAogICAgICAgIEFjY2VsZXJhdGVkRGVjb2RlUmVxdWVzdEZhaWxzKSB7CiAgIGF1dG8gY2FjaGUgPSBDcmVhdGVDYWNoZSgpOwotICBjb25zdCBnZng6OlNpemUgaW1hZ2Vfc2l6ZSA9IEdldE5vcm1hbEltYWdlU2l6ZSgpOwotICBjb25zdCBza19zcDxTa0NvbG9yU3BhY2U+IGltYWdlX2NvbG9yX3NwYWNlID0gU2tDb2xvclNwYWNlOjpNYWtlU1JHQigpOwogICBjb25zdCBnZng6OkNvbG9yU3BhY2UgdGFyZ2V0X2NvbG9yX3NwYWNlID0gZ2Z4OjpDb2xvclNwYWNlOjpDcmVhdGVYWVpENTAoKTsKICAgQVNTRVJUX1RSVUUodGFyZ2V0X2NvbG9yX3NwYWNlLklzVmFsaWQoKSk7Ci0gIGNvbnN0IFBhaW50SW1hZ2UgaW1hZ2UgPQotICAgICAgQ3JlYXRlUGFpbnRJbWFnZUZvckRlY29kZUFjY2VsZXJhdGlvbihpbWFnZV9zaXplLCBpbWFnZV9jb2xvcl9zcGFjZSk7CisgIGNvbnN0IFBhaW50SW1hZ2UgaW1hZ2UgPSBDcmVhdGVQYWludEltYWdlRm9yRGVjb2RlQWNjZWxlcmF0aW9uKCk7CiAgIGNvbnN0IFNrRmlsdGVyUXVhbGl0eSBxdWFsaXR5ID0ga0hpZ2hfU2tGaWx0ZXJRdWFsaXR5OwogICBEcmF3SW1hZ2UgZHJhd19pbWFnZShpbWFnZSwgU2tJUmVjdDo6TWFrZVdIKGltYWdlLndpZHRoKCksIGltYWdlLmhlaWdodCgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eSwgQ3JlYXRlTWF0cml4KFNrU2l6ZTo6TWFrZSgwLjc1ZiwgMC43NWYpKSwKQEAgLTMwNzUsMTIgKzMwNzMsMTMgQEAKICAgLy8gQWNjZWxlcmF0ZWQgZGVjb2RlcyBzaG91bGQgbm90IHByb2R1Y2UgZGVjb2RlIHRhc2tzLgogICBBU1NFUlRfVFJVRShyZXN1bHQudGFzay0+ZGVwZW5kZW5jaWVzKCkuZW1wdHkoKSk7CiAgIHJhc3Rlcl9pbXBsZW1lbnRhdGlvbigpLT5TZXRBY2NlbGVyYXRlZERlY29kaW5nRmFpbGVkKCk7CisgIEFTU0VSVF9UUlVFKGltYWdlLkdldEltYWdlSGVhZGVyTWV0YWRhdGEoKSk7CiAgIEVYUEVDVF9DQUxMKCpyYXN0ZXJfaW1wbGVtZW50YXRpb24oKSwKLSAgICAgICAgICAgICAgRG9TY2hlZHVsZUltYWdlRGVjb2RlKGltYWdlX3NpemUsIF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS0+U3VwcG9ydHNDb2xvclNwYWNlQ29udmVyc2lvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0YXJnZXRfY29sb3Jfc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdmeDo6Q29sb3JTcGFjZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXykpCisgICAgICAgICAgICAgIERvU2NoZWR1bGVJbWFnZURlY29kZSgKKyAgICAgICAgICAgICAgICAgIGltYWdlLkdldEltYWdlSGVhZGVyTWV0YWRhdGEoKS0+aW1hZ2Vfc2l6ZSwgXywKKyAgICAgICAgICAgICAgICAgIGNhY2hlLT5TdXBwb3J0c0NvbG9yU3BhY2VDb252ZXJzaW9uKCkgPyB0YXJnZXRfY29sb3Jfc3BhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBnZng6OkNvbG9yU3BhY2UoKSwKKyAgICAgICAgICAgICAgICAgIF8pKQogICAgICAgLlRpbWVzKDEpOwogICBUZXN0VGlsZVRhc2tSdW5uZXI6OlByb2Nlc3NUYXNrKHJlc3VsdC50YXNrLmdldCgpKTsKIApAQCAtMzA5NywxMiArMzA5Niw5IEBACiBURVNUX1AoR3B1SW1hZ2VEZWNvZGVDYWNoZVdpdGhBY2NlbGVyYXRlZERlY29kZXNUZXN0LAogICAgICAgIENhbm5vdFJlcXVlc3RBY2NlbGVyYXRlZERlY29kZUJlY2F1c2VPZlN0YW5kQWxvbmVEZWNvZGUpIHsKICAgYXV0byBjYWNoZSA9IENyZWF0ZUNhY2hlKCk7Ci0gIGNvbnN0IGdmeDo6U2l6ZSBpbWFnZV9zaXplID0gR2V0Tm9ybWFsSW1hZ2VTaXplKCk7Ci0gIGNvbnN0IHNrX3NwPFNrQ29sb3JTcGFjZT4gaW1hZ2VfY29sb3Jfc3BhY2UgPSBTa0NvbG9yU3BhY2U6Ok1ha2VTUkdCKCk7Ci0gIGNvbnN0IGdmeDo6Q29sb3JTcGFjZSB0YXJnZXRfY29sb3Jfc3BhY2UoKmltYWdlX2NvbG9yX3NwYWNlKTsKKyAgY29uc3QgZ2Z4OjpDb2xvclNwYWNlIHRhcmdldF9jb2xvcl9zcGFjZSA9IGdmeDo6Q29sb3JTcGFjZTo6Q3JlYXRlU1JHQigpOwogICBBU1NFUlRfVFJVRSh0YXJnZXRfY29sb3Jfc3BhY2UuSXNWYWxpZCgpKTsKLSAgY29uc3QgUGFpbnRJbWFnZSBpbWFnZSA9Ci0gICAgICBDcmVhdGVQYWludEltYWdlRm9yRGVjb2RlQWNjZWxlcmF0aW9uKGltYWdlX3NpemUsIGltYWdlX2NvbG9yX3NwYWNlKTsKKyAgY29uc3QgUGFpbnRJbWFnZSBpbWFnZSA9IENyZWF0ZVBhaW50SW1hZ2VGb3JEZWNvZGVBY2NlbGVyYXRpb24oKTsKICAgY29uc3QgU2tGaWx0ZXJRdWFsaXR5IHF1YWxpdHkgPSBrSGlnaF9Ta0ZpbHRlclF1YWxpdHk7CiAgIERyYXdJbWFnZSBkcmF3X2ltYWdlKGltYWdlLCBTa0lSZWN0OjpNYWtlV0goaW1hZ2Uud2lkdGgoKSwgaW1hZ2UuaGVpZ2h0KCkpLAogICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5LCBDcmVhdGVNYXRyaXgoU2tTaXplOjpNYWtlKDEuMGYsIDEuMGYpKSwKQEAgLTMxMjEsMTIgKzMxMTcsOSBAQAogVEVTVF9QKEdwdUltYWdlRGVjb2RlQ2FjaGVXaXRoQWNjZWxlcmF0ZWREZWNvZGVzVGVzdCwKICAgICAgICBDYW5ub3RSZXF1ZXN0QWNjZWxlcmF0ZWREZWNvZGVCZWNhdXNlT2ZOb25aZXJvVXBsb2FkTWlwTGV2ZWwpIHsKICAgYXV0byBjYWNoZSA9IENyZWF0ZUNhY2hlKCk7Ci0gIGNvbnN0IGdmeDo6U2l6ZSBpbWFnZV9zaXplID0gR2V0Tm9ybWFsSW1hZ2VTaXplKCk7Ci0gIGNvbnN0IHNrX3NwPFNrQ29sb3JTcGFjZT4gaW1hZ2VfY29sb3Jfc3BhY2UgPSBTa0NvbG9yU3BhY2U6Ok1ha2VTUkdCKCk7Ci0gIGNvbnN0IGdmeDo6Q29sb3JTcGFjZSB0YXJnZXRfY29sb3Jfc3BhY2UoKmltYWdlX2NvbG9yX3NwYWNlKTsKKyAgY29uc3QgZ2Z4OjpDb2xvclNwYWNlIHRhcmdldF9jb2xvcl9zcGFjZSA9IGdmeDo6Q29sb3JTcGFjZTo6Q3JlYXRlU1JHQigpOwogICBBU1NFUlRfVFJVRSh0YXJnZXRfY29sb3Jfc3BhY2UuSXNWYWxpZCgpKTsKLSAgY29uc3QgUGFpbnRJbWFnZSBpbWFnZSA9Ci0gICAgICBDcmVhdGVQYWludEltYWdlRm9yRGVjb2RlQWNjZWxlcmF0aW9uKGltYWdlX3NpemUsIGltYWdlX2NvbG9yX3NwYWNlKTsKKyAgY29uc3QgUGFpbnRJbWFnZSBpbWFnZSA9IENyZWF0ZVBhaW50SW1hZ2VGb3JEZWNvZGVBY2NlbGVyYXRpb24oKTsKICAgY29uc3QgU2tGaWx0ZXJRdWFsaXR5IHF1YWxpdHkgPSBrSGlnaF9Ta0ZpbHRlclF1YWxpdHk7CiAgIERyYXdJbWFnZSBkcmF3X2ltYWdlKGltYWdlLCBTa0lSZWN0OjpNYWtlV0goaW1hZ2Uud2lkdGgoKSwgaW1hZ2UuaGVpZ2h0KCkpLAogICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5LCBDcmVhdGVNYXRyaXgoU2tTaXplOjpNYWtlKDAuNWYsIDAuNWYpKSwKQEAgLTMxNDUsNjggKzMxMzgsMTEgQEAKIH0KIAogVEVTVF9QKEdwdUltYWdlRGVjb2RlQ2FjaGVXaXRoQWNjZWxlcmF0ZWREZWNvZGVzVGVzdCwKLSAgICAgICBDYW5ub3RSZXF1ZXN0QWNjZWxlcmF0ZWREZWNvZGVCZWNhdXNlT2ZJbmVsaWdpYmxlUGFpbnRJbWFnZSkgewotICBhdXRvIGNhY2hlID0gQ3JlYXRlQ2FjaGUoKTsKLSAgY29uc3QgZ2Z4OjpTaXplIGltYWdlX3NpemUgPSBHZXROb3JtYWxJbWFnZVNpemUoKTsKLSAgY29uc3Qgc2tfc3A8U2tDb2xvclNwYWNlPiBpbWFnZV9jb2xvcl9zcGFjZSA9IFNrQ29sb3JTcGFjZTo6TWFrZVNSR0IoKTsKLSAgY29uc3QgZ2Z4OjpDb2xvclNwYWNlIHRhcmdldF9jb2xvcl9zcGFjZSgqaW1hZ2VfY29sb3Jfc3BhY2UpOwotICBBU1NFUlRfVFJVRSh0YXJnZXRfY29sb3Jfc3BhY2UuSXNWYWxpZCgpKTsKLSAgY29uc3QgUGFpbnRJbWFnZSBpbWFnZSA9IENyZWF0ZVBhaW50SW1hZ2VGb3JEZWNvZGVBY2NlbGVyYXRpb24oCi0gICAgICBpbWFnZV9zaXplLCBpbWFnZV9jb2xvcl9zcGFjZSwKLSAgICAgIGZhbHNlIC8qIGlzX2VsaWdpYmxlX2Zvcl9hY2NlbGVyYXRlZF9kZWNvZGluZyAqLyk7Ci0gIGNvbnN0IFNrRmlsdGVyUXVhbGl0eSBxdWFsaXR5ID0ga0hpZ2hfU2tGaWx0ZXJRdWFsaXR5OwotICBEcmF3SW1hZ2UgZHJhd19pbWFnZShpbWFnZSwgU2tJUmVjdDo6TWFrZVdIKGltYWdlLndpZHRoKCksIGltYWdlLmhlaWdodCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eSwgQ3JlYXRlTWF0cml4KFNrU2l6ZTo6TWFrZSgxLjBmLCAxLjBmKSksCi0gICAgICAgICAgICAgICAgICAgICAgIFBhaW50SW1hZ2U6OmtEZWZhdWx0RnJhbWVJbmRleCwgdGFyZ2V0X2NvbG9yX3NwYWNlKTsKLSAgSW1hZ2VEZWNvZGVDYWNoZTo6VGFza1Jlc3VsdCByZXN1bHQgPQotICAgICAgY2FjaGUtPkdldFRhc2tGb3JJbWFnZUFuZFJlZihkcmF3X2ltYWdlLCBJbWFnZURlY29kZUNhY2hlOjpUcmFjaW5nSW5mbygpKTsKLSAgRVhQRUNUX1RSVUUocmVzdWx0Lm5lZWRfdW5yZWYpOwotICBBU1NFUlRfVFJVRShyZXN1bHQudGFzayk7Ci0KLSAgLy8gQSBub24tYWNjZWxlcmF0ZWQgbm9ybWFsIGRlY29kZSBzaG91bGQgcHJvZHVjZSBhIGRlY29kZSBkZXBlbmRlbmN5LgotICBBU1NFUlRfRVEocmVzdWx0LnRhc2stPmRlcGVuZGVuY2llcygpLnNpemUoKSwgMXUpOwotICBBU1NFUlRfVFJVRShyZXN1bHQudGFzay0+ZGVwZW5kZW5jaWVzKClbMF0pOwotICBUZXN0VGlsZVRhc2tSdW5uZXI6OlByb2Nlc3NUYXNrKHJlc3VsdC50YXNrLT5kZXBlbmRlbmNpZXMoKVswXS5nZXQoKSk7Ci0gIFRlc3RUaWxlVGFza1J1bm5lcjo6UHJvY2Vzc1Rhc2socmVzdWx0LnRhc2suZ2V0KCkpOwotICBjYWNoZS0+VW5yZWZJbWFnZShkcmF3X2ltYWdlKTsKLX0KLQotVEVTVF9QKEdwdUltYWdlRGVjb2RlQ2FjaGVXaXRoQWNjZWxlcmF0ZWREZWNvZGVzVGVzdCwKLSAgICAgICBDYW5ub3RSZXF1ZXN0QWNjZWxlcmF0ZWREZWNvZGVCZWNhdXNlT2ZOb25TUkdCQ29sb3JTcGFjZSkgewotICBhdXRvIGNhY2hlID0gQ3JlYXRlQ2FjaGUoKTsKLSAgY29uc3QgZ2Z4OjpTaXplIGltYWdlX3NpemUgPSBHZXROb3JtYWxJbWFnZVNpemUoKTsKLSAgY29uc3Qgc2tfc3A8U2tDb2xvclNwYWNlPiBpbWFnZV9jb2xvcl9zcGFjZSA9Ci0gICAgICBTa0NvbG9yU3BhY2U6Ok1ha2VSR0IoU2tOYW1lZFRyYW5zZmVyRm46OmsyRG90MiwgU2tOYW1lZEdhbXV0OjprQWRvYmVSR0IpOwotICBjb25zdCBnZng6OkNvbG9yU3BhY2UgdGFyZ2V0X2NvbG9yX3NwYWNlKCppbWFnZV9jb2xvcl9zcGFjZSk7Ci0gIEFTU0VSVF9UUlVFKHRhcmdldF9jb2xvcl9zcGFjZS5Jc1ZhbGlkKCkpOwotICBjb25zdCBQYWludEltYWdlIGltYWdlID0KLSAgICAgIENyZWF0ZVBhaW50SW1hZ2VGb3JEZWNvZGVBY2NlbGVyYXRpb24oaW1hZ2Vfc2l6ZSwgaW1hZ2VfY29sb3Jfc3BhY2UpOwotICBjb25zdCBTa0ZpbHRlclF1YWxpdHkgcXVhbGl0eSA9IGtIaWdoX1NrRmlsdGVyUXVhbGl0eTsKLSAgRHJhd0ltYWdlIGRyYXdfaW1hZ2UoaW1hZ2UsIFNrSVJlY3Q6Ok1ha2VXSChpbWFnZS53aWR0aCgpLCBpbWFnZS5oZWlnaHQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHksIENyZWF0ZU1hdHJpeChTa1NpemU6Ok1ha2UoMS4wZiwgMS4wZikpLAotICAgICAgICAgICAgICAgICAgICAgICBQYWludEltYWdlOjprRGVmYXVsdEZyYW1lSW5kZXgsIHRhcmdldF9jb2xvcl9zcGFjZSk7Ci0gIEltYWdlRGVjb2RlQ2FjaGU6OlRhc2tSZXN1bHQgcmVzdWx0ID0KLSAgICAgIGNhY2hlLT5HZXRUYXNrRm9ySW1hZ2VBbmRSZWYoZHJhd19pbWFnZSwgSW1hZ2VEZWNvZGVDYWNoZTo6VHJhY2luZ0luZm8oKSk7Ci0gIEVYUEVDVF9UUlVFKHJlc3VsdC5uZWVkX3VucmVmKTsKLSAgQVNTRVJUX1RSVUUocmVzdWx0LnRhc2spOwotCi0gIC8vIEEgbm9uLWFjY2VsZXJhdGVkIG5vcm1hbCBkZWNvZGUgc2hvdWxkIHByb2R1Y2UgYSBkZWNvZGUgZGVwZW5kZW5jeS4KLSAgQVNTRVJUX0VRKHJlc3VsdC50YXNrLT5kZXBlbmRlbmNpZXMoKS5zaXplKCksIDF1KTsKLSAgQVNTRVJUX1RSVUUocmVzdWx0LnRhc2stPmRlcGVuZGVuY2llcygpWzBdKTsKLSAgVGVzdFRpbGVUYXNrUnVubmVyOjpQcm9jZXNzVGFzayhyZXN1bHQudGFzay0+ZGVwZW5kZW5jaWVzKClbMF0uZ2V0KCkpOwotICBUZXN0VGlsZVRhc2tSdW5uZXI6OlByb2Nlc3NUYXNrKHJlc3VsdC50YXNrLmdldCgpKTsKLSAgY2FjaGUtPlVucmVmSW1hZ2UoZHJhd19pbWFnZSk7Ci19Ci0KLVRFU1RfUChHcHVJbWFnZURlY29kZUNhY2hlV2l0aEFjY2VsZXJhdGVkRGVjb2Rlc1Rlc3QsCiAgICAgICAgUmVxdWVzdEFjY2VsZXJhdGVkRGVjb2RlU3VjY2Vzc2Z1bGx5QWZ0ZXJDYW5jZWxsYXRpb24pIHsKICAgYXV0byBjYWNoZSA9IENyZWF0ZUNhY2hlKCk7Ci0gIGNvbnN0IGdmeDo6U2l6ZSBpbWFnZV9zaXplID0gR2V0Tm9ybWFsSW1hZ2VTaXplKCk7Ci0gIGNvbnN0IHNrX3NwPFNrQ29sb3JTcGFjZT4gaW1hZ2VfY29sb3Jfc3BhY2UgPSBTa0NvbG9yU3BhY2U6Ok1ha2VTUkdCKCk7Ci0gIGNvbnN0IGdmeDo6Q29sb3JTcGFjZSB0YXJnZXRfY29sb3Jfc3BhY2UoKmltYWdlX2NvbG9yX3NwYWNlKTsKKyAgY29uc3QgZ2Z4OjpDb2xvclNwYWNlIHRhcmdldF9jb2xvcl9zcGFjZSA9IGdmeDo6Q29sb3JTcGFjZTo6Q3JlYXRlU1JHQigpOwogICBBU1NFUlRfVFJVRSh0YXJnZXRfY29sb3Jfc3BhY2UuSXNWYWxpZCgpKTsKLSAgY29uc3QgUGFpbnRJbWFnZSBpbWFnZSA9Ci0gICAgICBDcmVhdGVQYWludEltYWdlRm9yRGVjb2RlQWNjZWxlcmF0aW9uKGltYWdlX3NpemUsIGltYWdlX2NvbG9yX3NwYWNlKTsKKyAgY29uc3QgUGFpbnRJbWFnZSBpbWFnZSA9IENyZWF0ZVBhaW50SW1hZ2VGb3JEZWNvZGVBY2NlbGVyYXRpb24oKTsKICAgY29uc3QgU2tGaWx0ZXJRdWFsaXR5IHF1YWxpdHkgPSBrSGlnaF9Ta0ZpbHRlclF1YWxpdHk7CiAgIERyYXdJbWFnZSBkcmF3X2ltYWdlKGltYWdlLCBTa0lSZWN0OjpNYWtlV0goaW1hZ2Uud2lkdGgoKSwgaW1hZ2UuaGVpZ2h0KCkpLAogICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5LCBDcmVhdGVNYXRyaXgoU2tTaXplOjpNYWtlKDAuNzVmLCAwLjc1ZikpLApAQCAtMzIyOSw4ICszMTY1LDEwIEBACiAgIEVYUEVDVF9UUlVFKGFub3RoZXJfcmVzdWx0Lm5lZWRfdW5yZWYpOwogICBBU1NFUlRfVFJVRShhbm90aGVyX3Jlc3VsdC50YXNrKTsKICAgRVhQRUNUX0VRKGFub3RoZXJfcmVzdWx0LnRhc2stPmRlcGVuZGVuY2llcygpLnNpemUoKSwgMHUpOworICBBU1NFUlRfVFJVRShpbWFnZS5HZXRJbWFnZUhlYWRlck1ldGFkYXRhKCkpOwogICBFWFBFQ1RfQ0FMTCgqcmFzdGVyX2ltcGxlbWVudGF0aW9uKCksCi0gICAgICAgICAgICAgIERvU2NoZWR1bGVJbWFnZURlY29kZShpbWFnZV9zaXplLCBfLCBnZng6OkNvbG9yU3BhY2UoKSwgXykpCisgICAgICAgICAgICAgIERvU2NoZWR1bGVJbWFnZURlY29kZShpbWFnZS5HZXRJbWFnZUhlYWRlck1ldGFkYXRhKCktPmltYWdlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfLCBnZng6OkNvbG9yU3BhY2UoKSwgXykpCiAgICAgICAuVGltZXMoMSk7CiAgIFRlc3RUaWxlVGFza1J1bm5lcjo6UHJvY2Vzc1Rhc2soYW5vdGhlcl9yZXN1bHQudGFzay5nZXQoKSk7CiAKQEAgLTMyNjIsMTYgKzMyMDAsMTMgQEAKIFRFU1RfUChHcHVJbWFnZURlY29kZUNhY2hlV2l0aEFjY2VsZXJhdGVkRGVjb2Rlc0ZsYWdzVGVzdCwKICAgICAgICBSZXF1ZXN0QWNjZWxlcmF0ZWREZWNvZGVTdWNjZXNzZnVsbHkpIHsKICAgYXV0byBjYWNoZSA9IENyZWF0ZUNhY2hlKCk7Ci0gIGNvbnN0IGdmeDo6U2l6ZSBpbWFnZV9zaXplID0gR2V0Tm9ybWFsSW1hZ2VTaXplKCk7CiAgIGNvbnN0IFNrRmlsdGVyUXVhbGl0eSBxdWFsaXR5ID0ga0hpZ2hfU2tGaWx0ZXJRdWFsaXR5OwogICBjb25zdCBnZng6OkNvbG9yU3BhY2UgdGFyZ2V0X2NvbG9yX3NwYWNlID0gZ2Z4OjpDb2xvclNwYWNlOjpDcmVhdGVTUkdCKCk7CiAgIEFTU0VSVF9UUlVFKHRhcmdldF9jb2xvcl9zcGFjZS5Jc1ZhbGlkKCkpOwogCiAgIC8vIFRyeSBhIEpQRUcgaW1hZ2UuCi0gIGNvbnN0IFBhaW50SW1hZ2UganBlZ19pbWFnZSA9IENyZWF0ZVBhaW50SW1hZ2VGb3JEZWNvZGVBY2NlbGVyYXRpb24oCi0gICAgICBpbWFnZV9zaXplLCBTa0NvbG9yU3BhY2U6Ok1ha2VTUkdCKCksCi0gICAgICB0cnVlIC8qIGlzX2VsaWdpYmxlX2Zvcl9hY2NlbGVyYXRlZF9kZWNvZGluZyAqLywKLSAgICAgIFBhaW50SW1hZ2U6OkltYWdlVHlwZTo6a0pQRUcpOworICBjb25zdCBQYWludEltYWdlIGpwZWdfaW1hZ2UgPQorICAgICAgQ3JlYXRlUGFpbnRJbWFnZUZvckRlY29kZUFjY2VsZXJhdGlvbihJbWFnZVR5cGU6OmtKUEVHKTsKICAgRHJhd0ltYWdlIGpwZWdfZHJhd19pbWFnZSgKICAgICAgIGpwZWdfaW1hZ2UsIFNrSVJlY3Q6Ok1ha2VXSChqcGVnX2ltYWdlLndpZHRoKCksIGpwZWdfaW1hZ2UuaGVpZ2h0KCkpLAogICAgICAgcXVhbGl0eSwgQ3JlYXRlTWF0cml4KFNrU2l6ZTo6TWFrZSgwLjc1ZiwgMC43NWYpKSwKQEAgLTMyODksOCArMzIyNCwxMSBAQAogICAvLyBkZXBlbmRzIG9uIGEgZGVjb2RlIHRhc2sgdGhhdCBydW5zIGluIHRoZSByZW5kZXJlci4KICAgaWYgKGFkdmVydGlzZV9hY2NlbGVyYXRlZF9kZWNvZGluZ18gJiYgYWxsb3dfYWNjZWxlcmF0ZWRfanBlZ19kZWNvZGluZ18pIHsKICAgICBBU1NFUlRfVFJVRShqcGVnX3Rhc2sudGFzay0+ZGVwZW5kZW5jaWVzKCkuZW1wdHkoKSk7Ci0gICAgRVhQRUNUX0NBTEwoKnJhc3Rlcl9pbXBsZW1lbnRhdGlvbigpLAotICAgICAgICAgICAgICAgIERvU2NoZWR1bGVJbWFnZURlY29kZShpbWFnZV9zaXplLCBfLCBnZng6OkNvbG9yU3BhY2UoKSwgXykpCisgICAgQVNTRVJUX1RSVUUoanBlZ19pbWFnZS5HZXRJbWFnZUhlYWRlck1ldGFkYXRhKCkpOworICAgIEVYUEVDVF9DQUxMKAorICAgICAgICAqcmFzdGVyX2ltcGxlbWVudGF0aW9uKCksCisgICAgICAgIERvU2NoZWR1bGVJbWFnZURlY29kZShqcGVnX2ltYWdlLkdldEltYWdlSGVhZGVyTWV0YWRhdGEoKS0+aW1hZ2Vfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8sIGdmeDo6Q29sb3JTcGFjZSgpLCBfKSkKICAgICAgICAgLlRpbWVzKDEpOwogICB9IGVsc2UgewogICAgIEFTU0VSVF9FUShqcGVnX3Rhc2sudGFzay0+ZGVwZW5kZW5jaWVzKCkuc2l6ZSgpLCAxdSk7CkBAIC0zMzAyLDEwICszMjQwLDggQEAKICAgY2FjaGUtPlVucmVmSW1hZ2UoanBlZ19kcmF3X2ltYWdlKTsKIAogICAvLyBUcnkgYSBXZWJQIGltYWdlLgotICBjb25zdCBQYWludEltYWdlIHdlYnBfaW1hZ2UgPSBDcmVhdGVQYWludEltYWdlRm9yRGVjb2RlQWNjZWxlcmF0aW9uKAotICAgICAgaW1hZ2Vfc2l6ZSwgU2tDb2xvclNwYWNlOjpNYWtlU1JHQigpLAotICAgICAgdHJ1ZSAvKiBpc19lbGlnaWJsZV9mb3JfYWNjZWxlcmF0ZWRfZGVjb2RpbmcgKi8sCi0gICAgICBQYWludEltYWdlOjpJbWFnZVR5cGU6OmtXRUJQKTsKKyAgY29uc3QgUGFpbnRJbWFnZSB3ZWJwX2ltYWdlID0KKyAgICAgIENyZWF0ZVBhaW50SW1hZ2VGb3JEZWNvZGVBY2NlbGVyYXRpb24oSW1hZ2VUeXBlOjprV0VCUCk7CiAgIERyYXdJbWFnZSB3ZWJwX2RyYXdfaW1hZ2UoCiAgICAgICB3ZWJwX2ltYWdlLCBTa0lSZWN0OjpNYWtlV0god2VicF9pbWFnZS53aWR0aCgpLCB3ZWJwX2ltYWdlLmhlaWdodCgpKSwKICAgICAgIHF1YWxpdHksIENyZWF0ZU1hdHJpeChTa1NpemU6Ok1ha2UoMC43NWYsIDAuNzVmKSksCkBAIC0zMzE2LDggKzMyNTIsMTEgQEAKICAgQVNTRVJUX1RSVUUod2VicF90YXNrLnRhc2spOwogICBpZiAoYWR2ZXJ0aXNlX2FjY2VsZXJhdGVkX2RlY29kaW5nXyAmJiBhbGxvd19hY2NlbGVyYXRlZF93ZWJwX2RlY29kaW5nXykgewogICAgIEFTU0VSVF9UUlVFKHdlYnBfdGFzay50YXNrLT5kZXBlbmRlbmNpZXMoKS5lbXB0eSgpKTsKLSAgICBFWFBFQ1RfQ0FMTCgqcmFzdGVyX2ltcGxlbWVudGF0aW9uKCksCi0gICAgICAgICAgICAgICAgRG9TY2hlZHVsZUltYWdlRGVjb2RlKGltYWdlX3NpemUsIF8sIGdmeDo6Q29sb3JTcGFjZSgpLCBfKSkKKyAgICBBU1NFUlRfVFJVRSh3ZWJwX2ltYWdlLkdldEltYWdlSGVhZGVyTWV0YWRhdGEoKSk7CisgICAgRVhQRUNUX0NBTEwoCisgICAgICAgICpyYXN0ZXJfaW1wbGVtZW50YXRpb24oKSwKKyAgICAgICAgRG9TY2hlZHVsZUltYWdlRGVjb2RlKHdlYnBfaW1hZ2UuR2V0SW1hZ2VIZWFkZXJNZXRhZGF0YSgpLT5pbWFnZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXywgZ2Z4OjpDb2xvclNwYWNlKCksIF8pKQogICAgICAgICAuVGltZXMoMSk7CiAgIH0gZWxzZSB7CiAgICAgQVNTRVJUX0VRKHdlYnBfdGFzay50YXNrLT5kZXBlbmRlbmNpZXMoKS5zaXplKCksIDF1KTsKQEAgLTMzMjksMTAgKzMyNjgsOCBAQAogICBjYWNoZS0+VW5yZWZJbWFnZSh3ZWJwX2RyYXdfaW1hZ2UpOwogCiAgIC8vIFRyeSBhIFBORyBpbWFnZSAod2hpY2ggc2hvdWxkIG5vdCBiZSBoYXJkd2FyZSBhY2NlbGVyYXRlZCkuCi0gIGNvbnN0IFBhaW50SW1hZ2UgcG5nX2ltYWdlID0gQ3JlYXRlUGFpbnRJbWFnZUZvckRlY29kZUFjY2VsZXJhdGlvbigKLSAgICAgIGltYWdlX3NpemUsIFNrQ29sb3JTcGFjZTo6TWFrZVNSR0IoKSwKLSAgICAgIHRydWUgLyogaXNfZWxpZ2libGVfZm9yX2FjY2VsZXJhdGVkX2RlY29kaW5nICovLAotICAgICAgUGFpbnRJbWFnZTo6SW1hZ2VUeXBlOjprUE5HKTsKKyAgY29uc3QgUGFpbnRJbWFnZSBwbmdfaW1hZ2UgPQorICAgICAgQ3JlYXRlUGFpbnRJbWFnZUZvckRlY29kZUFjY2VsZXJhdGlvbihJbWFnZVR5cGU6OmtQTkcpOwogICBEcmF3SW1hZ2UgcG5nX2RyYXdfaW1hZ2UoCiAgICAgICBwbmdfaW1hZ2UsIFNrSVJlY3Q6Ok1ha2VXSChqcGVnX2ltYWdlLndpZHRoKCksIGpwZWdfaW1hZ2UuaGVpZ2h0KCkpLAogICAgICAgcXVhbGl0eSwgQ3JlYXRlTWF0cml4KFNrU2l6ZTo6TWFrZSgwLjc1ZiwgMC43NWYpKSwKZGlmZiAtLWdpdCBhL2NjL3RpbGVzL2ltYWdlX2RlY29kZV9jYWNoZS5oIGIvY2MvdGlsZXMvaW1hZ2VfZGVjb2RlX2NhY2hlLmgKaW5kZXggNTRiMTMxNi4uZjI0NTFjYSAxMDA2NDQKLS0tIGEvY2MvdGlsZXMvaW1hZ2VfZGVjb2RlX2NhY2hlLmgKKysrIGIvY2MvdGlsZXMvaW1hZ2VfZGVjb2RlX2NhY2hlLmgKQEAgLTc0LDEyICs3NCwxMiBAQAogICB9CiAKICAgc3RhdGljIGRldnRvb2xzX2luc3RydW1lbnRhdGlvbjo6U2NvcGVkSW1hZ2VEZWNvZGVUYXNrOjpJbWFnZVR5cGUKLSAgVG9TY29wZWRJbWFnZVR5cGUoUGFpbnRJbWFnZTo6SW1hZ2VUeXBlIGltYWdlX3R5cGUpIHsKKyAgVG9TY29wZWRJbWFnZVR5cGUoSW1hZ2VUeXBlIGltYWdlX3R5cGUpIHsKICAgICB1c2luZyBTY29wZWRJbWFnZVR5cGUgPQogICAgICAgICBkZXZ0b29sc19pbnN0cnVtZW50YXRpb246OlNjb3BlZEltYWdlRGVjb2RlVGFzazo6SW1hZ2VUeXBlOwotICAgIGlmIChpbWFnZV90eXBlID09IFBhaW50SW1hZ2U6OkltYWdlVHlwZTo6a1dFQlApCisgICAgaWYgKGltYWdlX3R5cGUgPT0gSW1hZ2VUeXBlOjprV0VCUCkKICAgICAgIHJldHVybiBTY29wZWRJbWFnZVR5cGU6OmtXZWJQOwotICAgIGlmIChpbWFnZV90eXBlID09IFBhaW50SW1hZ2U6OkltYWdlVHlwZTo6a0pQRUcpCisgICAgaWYgKGltYWdlX3R5cGUgPT0gSW1hZ2VUeXBlOjprSlBFRykKICAgICAgIHJldHVybiBTY29wZWRJbWFnZVR5cGU6OmtKcGVnOwogICAgIHJldHVybiBTY29wZWRJbWFnZVR5cGU6OmtPdGhlcjsKICAgfQpkaWZmIC0tZ2l0IGEvY2MvdGlsZXMvc29mdHdhcmVfaW1hZ2VfZGVjb2RlX2NhY2hlLmNjIGIvY2MvdGlsZXMvc29mdHdhcmVfaW1hZ2VfZGVjb2RlX2NhY2hlLmNjCmluZGV4IDlhMmE4ZTkuLmNiZTg1MTEgMTAwNjQ0Ci0tLSBhL2NjL3RpbGVzL3NvZnR3YXJlX2ltYWdlX2RlY29kZV9jYWNoZS5jYworKysgYi9jYy90aWxlcy9zb2Z0d2FyZV9pbWFnZV9kZWNvZGVfY2FjaGUuY2MKQEAgLTcyLDExICs3MiwxNSBAQAogICAgIFRSQUNFX0VWRU5UMigiY2MiLCAiU29mdHdhcmVJbWFnZURlY29kZVRhc2tJbXBsOjpSdW5PbldvcmtlclRocmVhZCIsICJtb2RlIiwKICAgICAgICAgICAgICAgICAgInNvZnR3YXJlIiwgInNvdXJjZV9wcmVwYXJlX3RpbGVzX2lkIiwKICAgICAgICAgICAgICAgICAgdHJhY2luZ19pbmZvXy5wcmVwYXJlX3RpbGVzX2lkKTsKKworICAgIGNvbnN0IGF1dG8qIGltYWdlX21ldGFkYXRhID0gcGFpbnRfaW1hZ2VfLkdldEltYWdlSGVhZGVyTWV0YWRhdGEoKTsKKyAgICBjb25zdCBJbWFnZVR5cGUgaW1hZ2VfdHlwZSA9CisgICAgICAgIGltYWdlX21ldGFkYXRhID8gaW1hZ2VfbWV0YWRhdGEtPmltYWdlX3R5cGUgOiBJbWFnZVR5cGU6OmtJbnZhbGlkOwogICAgIGRldnRvb2xzX2luc3RydW1lbnRhdGlvbjo6U2NvcGVkSW1hZ2VEZWNvZGVUYXNrIGltYWdlX2RlY29kZV90YXNrKAogICAgICAgICBwYWludF9pbWFnZV8uR2V0U2tJbWFnZSgpLmdldCgpLAogICAgICAgICBkZXZ0b29sc19pbnN0cnVtZW50YXRpb246OlNjb3BlZEltYWdlRGVjb2RlVGFzazo6a1NvZnR3YXJlLAogICAgICAgICBJbWFnZURlY29kZUNhY2hlOjpUb1Njb3BlZFRhc2tUeXBlKHRyYWNpbmdfaW5mb18udGFza190eXBlKSwKLSAgICAgICAgSW1hZ2VEZWNvZGVDYWNoZTo6VG9TY29wZWRJbWFnZVR5cGUocGFpbnRfaW1hZ2VfLkdldEltYWdlVHlwZSgpKSk7CisgICAgICAgIEltYWdlRGVjb2RlQ2FjaGU6OlRvU2NvcGVkSW1hZ2VUeXBlKGltYWdlX3R5cGUpKTsKICAgICBTb2Z0d2FyZUltYWdlRGVjb2RlQ2FjaGU6OlRhc2tQcm9jZXNzaW5nUmVzdWx0IHJlc3VsdCA9CiAgICAgICAgIGNhY2hlXy0+RGVjb2RlSW1hZ2VJblRhc2soaW1hZ2Vfa2V5XywgcGFpbnRfaW1hZ2VfLCB0YXNrX3R5cGVfKTsKIApkaWZmIC0tZ2l0IGEvY2hyb21lL1ZFUlNJT04gYi9jaHJvbWUvVkVSU0lPTgppbmRleCA1OTNiYTUwLi43MTg5ZTE1IDEwMDY0NAotLS0gYS9jaHJvbWUvVkVSU0lPTgorKysgYi9jaHJvbWUvVkVSU0lPTgpAQCAtMSw0ICsxLDQgQEAKIE1BSk9SPTc5CiBNSU5PUj0wCi1CVUlMRD0zOTM4CitCVUlMRD0zOTM5CiBQQVRDSD0wCmRpZmYgLS1naXQgYS9jaHJvbWUvYW5kcm9pZC9CVUlMRC5nbiBiL2Nocm9tZS9hbmRyb2lkL0JVSUxELmduCmluZGV4IDljMDJiZDM2Li4wNWUzOGE5IDEwMDY0NAotLS0gYS9jaHJvbWUvYW5kcm9pZC9CVUlMRC5nbgorKysgYi9jaHJvbWUvYW5kcm9pZC9CVUlMRC5nbgpAQCAtNDc1LDIzICs0NzUsNiBAQAogICAgICIvL2NvbXBvbmVudHMvbW9kdWxlX2luc3RhbGxlci9hbmRyb2lkOm1vZHVsZV9pbnRlcmZhY2VfcHJvY2Vzc29yIiwKICAgXQogCi0gIHByb2d1YXJkX2NvbmZpZ3MgPSBbXQotICBpZiAoYXN5bmNfYXIpIHsKLSAgICBwcm9ndWFyZF9jb25maWdzICs9IFsgIi8vY2hyb21lL2FuZHJvaWQvZmVhdHVyZXMvYXIvcHJvZ3VhcmRfYXN5bmMuZmxhZ3MiIF0KLSAgfQotICBpZiAoYXN5bmNfdnIpIHsKLSAgICBwcm9ndWFyZF9jb25maWdzICs9IFsKLSAgICAgICIvL2Nocm9tZS9hbmRyb2lkL2ZlYXR1cmVzL3ZyL3Byb2d1YXJkX2FzeW5jLmZsYWdzIiwKLSAgICAgICIvL2Nocm9tZS9hbmRyb2lkL2ZlYXR1cmVzL3ZyL3Byb2d1YXJkX2FzeW5jX21hbnVhbC5mbGFncyIsCi0gICAgXQotICB9Ci0gIGlmIChhc3luY190YWJfdWkpIHsKLSAgICBwcm9ndWFyZF9jb25maWdzICs9IFsKLSAgICAgICIvL2Nocm9tZS9hbmRyb2lkL2ZlYXR1cmVzL3RhYl91aS9wcm9ndWFyZF9hc3luYy5mbGFncyIsCi0gICAgICAiLy9jaHJvbWUvYW5kcm9pZC9mZWF0dXJlcy90YWJfdWkvcHJvZ3VhcmRfYXN5bmNfbWFudWFsLmZsYWdzIiwKLSAgICBdCi0gIH0KLQogICBwcm9jZXNzb3JfYXJnc19qYXZhYyA9IFsgImRhZ2dlci5mYXN0SW5pdD1lbmFibGVkIiBdCiB9CiAKZGlmZiAtLWdpdCBhL2Nocm9tZS9hbmRyb2lkL2Nocm9tZV9qYXZhX3NvdXJjZXMuZ25pIGIvY2hyb21lL2FuZHJvaWQvY2hyb21lX2phdmFfc291cmNlcy5nbmkKaW5kZXggYjIxZjg4NTguLmI0NDU3MGYgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9hbmRyb2lkL2Nocm9tZV9qYXZhX3NvdXJjZXMuZ25pCisrKyBiL2Nocm9tZS9hbmRyb2lkL2Nocm9tZV9qYXZhX3NvdXJjZXMuZ25pCkBAIC01LDggKzUsNiBAQAogY2hyb21lX2phdmFfc291cmNlcyA9IFsKICAgImphdmEvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC9hcHBzL2Nocm9tZS9hcHB3aWRnZXQvYm9va21hcmtzL0Jvb2ttYXJrVGh1bWJuYWlsV2lkZ2V0UHJvdmlkZXIuamF2YSIsCiAgICJqYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvQWN0aXZpdHlUYWJQcm92aWRlci5qYXZhIiwKLSAgImphdmEvc3JjL29yZy9jaHJvbWl1bS9jaHJvbWUvYnJvd3Nlci9BY3Rpdml0eVRhYlRhc2tEZXNjcmlwdGlvbkhlbHBlci5qYXZhIiwKLSAgImphdmEvc3JjL29yZy9jaHJvbWl1bS9jaHJvbWUvYnJvd3Nlci9BY3Rpdml0eVRhc2tEZXNjcmlwdGlvbkljb25HZW5lcmF0b3IuamF2YSIsCiAgICJqYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvQWZ0ZXJTdGFydHVwVGFza1V0aWxzLmphdmEiLAogICAiamF2YS9zcmMvb3JnL2Nocm9taXVtL2Nocm9tZS9icm93c2VyL0FwcEhvb2tzLmphdmEiLAogICAiamF2YS9zcmMvb3JnL2Nocm9taXVtL2Nocm9tZS9icm93c2VyL0FwcEhvb2tzTW9kdWxlLmphdmEiLApAQCAtMzkzLDYgKzM5MSw4IEBACiAgICJqYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvY3VzdG9tdGFicy9DdXN0b21UYWJPYnNlcnZlci5qYXZhIiwKICAgImphdmEvc3JjL29yZy9jaHJvbWl1bS9jaHJvbWUvYnJvd3Nlci9jdXN0b210YWJzL0N1c3RvbVRhYlNlc3Npb25IYW5kbGVyLmphdmEiLAogICAiamF2YS9zcmMvb3JnL2Nocm9taXVtL2Nocm9tZS9icm93c2VyL2N1c3RvbXRhYnMvQ3VzdG9tVGFiVGFiUGVyc2lzdGVuY2VQb2xpY3kuamF2YSIsCisgICJqYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvY3VzdG9tdGFicy9DdXN0b21UYWJUYXNrRGVzY3JpcHRpb25IZWxwZXIuamF2YSIsCisgICJqYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvY3VzdG9tdGFicy9DdXN0b21UYWJUYXNrRGVzY3JpcHRpb25JY29uR2VuZXJhdG9yLmphdmEiLAogICAiamF2YS9zcmMvb3JnL2Nocm9taXVtL2Nocm9tZS9icm93c2VyL2N1c3RvbXRhYnMvQ3VzdG9tVGFiVG9wQmFyRGVsZWdhdGUuamF2YSIsCiAgICJqYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvY3VzdG9tdGFicy9DdXN0b21UYWJzQ2xpZW50RmlsZVByb2Nlc3Nvci5qYXZhIiwKICAgImphdmEvc3JjL29yZy9jaHJvbWl1bS9jaHJvbWUvYnJvd3Nlci9jdXN0b210YWJzL0N1c3RvbVRhYnNDb25uZWN0aW9uLmphdmEiLApAQCAtODMxLDcgKzgzMSw2IEBACiAgICJqYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvaW5pdC9DaHJvbWVMaWZldGltZUNvbnRyb2xsZXIuamF2YSIsCiAgICJqYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvaW5pdC9FbXB0eUJyb3dzZXJQYXJ0cy5qYXZhIiwKICAgImphdmEvc3JjL29yZy9jaHJvbWl1bS9jaHJvbWUvYnJvd3Nlci9pbml0L0ZpcnN0RHJhd0RldGVjdG9yLmphdmEiLAotICAiamF2YS9zcmMvb3JnL2Nocm9taXVtL2Nocm9tZS9icm93c2VyL2luaXQvSW52YWxpZFN0YXJ0dXBEaWFsb2cuamF2YSIsCiAgICJqYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvaW5pdC9OYXRpdmVJbml0aWFsaXphdGlvbkNvbnRyb2xsZXIuamF2YSIsCiAgICJqYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvaW5pdC9OYXRpdmVTdGFydHVwQnJpZGdlLmphdmEiLAogICAiamF2YS9zcmMvb3JnL2Nocm9taXVtL2Nocm9tZS9icm93c2VyL2luaXQvUHJvY2Vzc0luaXRpYWxpemF0aW9uSGFuZGxlci5qYXZhIiwKZGlmZiAtLWdpdCBhL2Nocm9tZS9hbmRyb2lkL2ZlYXR1cmVzL2FyL2FyX21vZHVsZS5nbmkgYi9jaHJvbWUvYW5kcm9pZC9mZWF0dXJlcy9hci9hcl9tb2R1bGUuZ25pCmluZGV4IDU5ZTVjMjExLi42NTI2NmRlOSAxMDA2NDQKLS0tIGEvY2hyb21lL2FuZHJvaWQvZmVhdHVyZXMvYXIvYXJfbW9kdWxlLmduaQorKysgYi9jaHJvbWUvYW5kcm9pZC9mZWF0dXJlcy9hci9hcl9tb2R1bGUuZ25pCkBAIC0xOSw1ICsxOSw0IEBACiAgIGFuZHJvaWRfbWFuaWZlc3QgPSAiLy9jaHJvbWUvYW5kcm9pZC9mZWF0dXJlcy9hci9BbmRyb2lkTWFuaWZlc3QueG1sIgogICBsb2FkYWJsZV9tb2R1bGVzXzMyX2JpdCA9IFsgIiRfbGliYXJjb3JlX2Rpci9hcm1lYWJpLXY3YS9saWJhcmNvcmVfc2RrX2Muc28iIF0KICAgbG9hZGFibGVfbW9kdWxlc182NF9iaXQgPSBbICIkX2xpYmFyY29yZV9kaXIvYXJtNjQtdjhhL2xpYmFyY29yZV9zZGtfYy5zbyIgXQotICBwcm9ndWFyZF9hc3luYyA9IGFzeW5jX2FyCiB9CmRpZmYgLS1naXQgYS9jaHJvbWUvYW5kcm9pZC9mZWF0dXJlcy9hci9wcm9ndWFyZF9hc3luYy5mbGFncyBiL2Nocm9tZS9hbmRyb2lkL2ZlYXR1cmVzL2FyL3Byb2d1YXJkX2FzeW5jLmZsYWdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODJkYjFlMS4uMDAwMDAwMAotLS0gYS9jaHJvbWUvYW5kcm9pZC9mZWF0dXJlcy9hci9wcm9ndWFyZF9hc3luYy5mbGFncworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIyBFeHBsaWNpdGx5IGtlZXAgdGhlIEFyQ29yZVNoaW0gaW50ZXJmYWNlLiBCZWNhdXNlIEFyQ29yZVNoaW0KLSMgaXMgaW4gYmFzZSwgYW5kIGl0cyBpbXBsZW1lbnRpbmcgY2xhc3MgQXJDb3JlU2hpbUltcGwgaXMgaW4gQVIsCi0jIGFzeW5jaHJvbm91cyBwcm9ndWFyZGluZyBvZiBBUiB3aWxsIGNhdXNlIEFyQ29yZVNoaW0gdG8gYmUgcmVtb3ZlZAotIyBkdXJpbmcgc3luY2hyb25vdXMgcHJvZ3VhcmRpbmcsIHdoaWNoIGNhdXNlcyBBUiBvbiBDaHJvbWUgdG8gY3Jhc2guCi0ta2VlcCBpbnRlcmZhY2Ugb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLkFyQ29yZVNoaW0gewotICAqOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Nocm9tZS9hbmRyb2lkL2ZlYXR1cmVzL3RhYl91aS9CVUlMRC5nbiBiL2Nocm9tZS9hbmRyb2lkL2ZlYXR1cmVzL3RhYl91aS9CVUlMRC5nbgppbmRleCA3NTBkMmI0Li44ZDg0ODlmIDEwMDY0NAotLS0gYS9jaHJvbWUvYW5kcm9pZC9mZWF0dXJlcy90YWJfdWkvQlVJTEQuZ24KKysrIGIvY2hyb21lL2FuZHJvaWQvZmVhdHVyZXMvdGFiX3VpL0JVSUxELmduCkBAIC0xNzUsOCArMTc1LDQgQEAKICAgICAiLy90aGlyZF9wYXJ0eS9hbmRyb2lkX2RlcHM6Y29tX2FuZHJvaWRfc3VwcG9ydF9zdXBwb3J0X3YxM19qYXZhIiwKICAgICAiLy91aS9hbmRyb2lkOnVpX2phdmEiLAogICBdCi0KLSAgaWYgKGFzeW5jX3RhYl91aSkgewotICAgIHByb2d1YXJkX2NvbmZpZ3MgPSBbICIvL2Jhc2UvYW5kcm9pZC9wcm9ndWFyZC9jaHJvbWl1bV9jb2RlLmZsYWdzIiBdCi0gIH0KIH0KZGlmZiAtLWdpdCBhL2Nocm9tZS9hbmRyb2lkL2ZlYXR1cmVzL3RhYl91aS9idWlsZGZsYWdzLmduaSBiL2Nocm9tZS9hbmRyb2lkL2ZlYXR1cmVzL3RhYl91aS9idWlsZGZsYWdzLmduaQppbmRleCAwNjM3Njk5Li5lMTVjOWFlM2UgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9hbmRyb2lkL2ZlYXR1cmVzL3RhYl91aS9idWlsZGZsYWdzLmduaQorKysgYi9jaHJvbWUvYW5kcm9pZC9mZWF0dXJlcy90YWJfdWkvYnVpbGRmbGFncy5nbmkKQEAgLTUsNyArNSw0IEBACiBkZWNsYXJlX2FyZ3MoKSB7CiAgICMgQ29udHJvbHMgdGhlIGZlYXR1cmUgYmVpbmcgYSBERk0gb3Igbm90LgogICBkaXNhYmxlX3RhYl91aV9kZm0gPSB0cnVlCi0KLSAgIyBXaGV0aGVyIHRvIGNyZWF0ZSB0YWJfdWkgbW9kdWxlIGFzIGFuIGFzeW5jaHJvbm91cyBERk0uCi0gIGFzeW5jX3RhYl91aSA9IGZhbHNlCiB9CmRpZmYgLS1naXQgYS9jaHJvbWUvYW5kcm9pZC9mZWF0dXJlcy90YWJfdWkvamF2YS9zcmMvb3JnL2Nocm9taXVtL2Nocm9tZS9icm93c2VyL3Rhc2tzL3RhYl9tYW5hZ2VtZW50L1RhYkxpc3RGYXZpY29uUHJvdmlkZXIuamF2YSBiL2Nocm9tZS9hbmRyb2lkL2ZlYXR1cmVzL3RhYl91aS9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvdGFza3MvdGFiX21hbmFnZW1lbnQvVGFiTGlzdEZhdmljb25Qcm92aWRlci5qYXZhCmluZGV4IDIzMGZlNmYuLjkwNTQxNjYgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9hbmRyb2lkL2ZlYXR1cmVzL3RhYl91aS9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvdGFza3MvdGFiX21hbmFnZW1lbnQvVGFiTGlzdEZhdmljb25Qcm92aWRlci5qYXZhCisrKyBiL2Nocm9tZS9hbmRyb2lkL2ZlYXR1cmVzL3RhYl91aS9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvdGFza3MvdGFiX21hbmFnZW1lbnQvVGFiTGlzdEZhdmljb25Qcm92aWRlci5qYXZhCkBAIC01OCw3ICs1OCw3IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKHNSb3VuZGVkQ2hyb21lRHJhd2FibGUgPT0gbnVsbCkgewogICAgICAgICAgICAgQml0bWFwIGNocm9tZUJpdG1hcCA9Ci0gICAgICAgICAgICAgICAgICAgIEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoY29udGV4dC5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5jaHJvbWVsb2dvMTYpOworICAgICAgICAgICAgICAgICAgICBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKG1Db250ZXh0LmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLmNocm9tZWxvZ28xNik7CiAgICAgICAgICAgICBzUm91bmRlZENocm9tZURyYXdhYmxlID0gcHJvY2Vzc0JpdG1hcChjaHJvbWVCaXRtYXApOwogICAgICAgICB9CiAgICAgICAgIG1EZWZhdWx0SWNvbkNvbG9yID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0Q29sb3IoUi5jb2xvci5kZWZhdWx0X2ljb25fY29sb3IpOwpAQCAtNjYsNyArNjYsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgRHJhd2FibGUgcHJvY2Vzc0JpdG1hcChCaXRtYXAgYml0bWFwKSB7Ci0gICAgICAgIHJldHVybiBGYXZpY29uVXRpbHMuY3JlYXRlUm91bmRlZEJpdG1hcERyYXdhYmxlKAorICAgICAgICByZXR1cm4gRmF2aWNvblV0aWxzLmNyZWF0ZVJvdW5kZWRCaXRtYXBEcmF3YWJsZShtQ29udGV4dC5nZXRSZXNvdXJjZXMoKSwKICAgICAgICAgICAgICAgICBCaXRtYXAuY3JlYXRlU2NhbGVkQml0bWFwKGJpdG1hcCwgbUZhdmljb25TaXplLCBtRmF2aWNvblNpemUsIHRydWUpKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2Nocm9tZS9hbmRyb2lkL2ZlYXR1cmVzL3RhYl91aS9wcm9ndWFyZF9hc3luYy5mbGFncyBiL2Nocm9tZS9hbmRyb2lkL2ZlYXR1cmVzL3RhYl91aS9wcm9ndWFyZF9hc3luYy5mbGFncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVjNDJjZS4uMDAwMDAwMAotLS0gYS9jaHJvbWUvYW5kcm9pZC9mZWF0dXJlcy90YWJfdWkvcHJvZ3VhcmRfYXN5bmMuZmxhZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDM0ICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMTkgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLSMgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLWtlZXAgY2xhc3MgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMkVGhlbWUgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIGFuZHJvaWQuc3VwcG9ydC52Ny53aWRnZXQuR3JpZExheW91dE1hbmFnZXIgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIGFuZHJvaWQuc3VwcG9ydC52Ny53aWRnZXQuTGluZWFyTGF5b3V0TWFuYWdlciB7ICo7IH0KLQotLWtlZXAgY2xhc3MgYW5kcm9pZC5zdXBwb3J0LnY3LndpZGdldC5SZWN5Y2xlclZpZXcgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIGFuZHJvaWQuc3VwcG9ydC52Ny53aWRnZXQuUmVjeWNsZXJWaWV3JEFkYXB0ZXIgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIGFuZHJvaWQuc3VwcG9ydC52Ny53aWRnZXQuUmVjeWNsZXJWaWV3JExheW91dE1hbmFnZXIgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIGFuZHJvaWQuc3VwcG9ydC52Ny53aWRnZXQuUmVjeWNsZXJWaWV3JFZpZXdIb2xkZXIgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIGFuZHJvaWQuc3VwcG9ydC52Ny53aWRnZXQuaGVscGVyLkl0ZW1Ub3VjaEhlbHBlciB7ICo7IH0KLQotLWtlZXAgY2xhc3MgYW5kcm9pZC5zdXBwb3J0LnY3LndpZGdldC5oZWxwZXIuSXRlbVRvdWNoSGVscGVyJENhbGxiYWNrIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBhbmRyb2lkLnN1cHBvcnQudjcud2lkZ2V0LmhlbHBlci5JdGVtVG91Y2hIZWxwZXIkU2ltcGxlQ2FsbGJhY2sgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIGFuZHJvaWQudmlldy5WaWV3JE9uQ2xpY2tMaXN0ZW5lciB7ICo7IH0KLQotLWtlZXAgY2xhc3MgYW5kcm9pZC53aWRnZXQuUG9wdXBXaW5kb3ckT25EaXNtaXNzTGlzdGVuZXIgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIGJvb2xlYW4geyAqOyB9Ci0KLS1rZWVwIGNsYXNzIGZsb2F0IHsgKjsgfQotCi0ta2VlcCBjbGFzcyBnZW4uX2Nocm9tZS5fYW5kcm9pZC5fZmVhdHVyZXMuX3RhYl91aS5famF2YV9yZXNvdXJjZXMuc3JjamFyLlIkYW5pbSB7ICo7IH0KLQotLWtlZXAgY2xhc3MgZ2VuLl9jaHJvbWUuX2FuZHJvaWQuX2ZlYXR1cmVzLl90YWJfdWkuX2phdmFfcmVzb3VyY2VzLnNyY2phci5SJGFuaW1hdG9yIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBnZW4uX2Nocm9tZS5fYW5kcm9pZC5fZmVhdHVyZXMuX3RhYl91aS5famF2YV9yZXNvdXJjZXMuc3JjamFyLlIkYXJyYXkgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIGdlbi5fY2hyb21lLl9hbmRyb2lkLl9mZWF0dXJlcy5fdGFiX3VpLl9qYXZhX3Jlc291cmNlcy5zcmNqYXIuUiRhdHRyIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBnZW4uX2Nocm9tZS5fYW5kcm9pZC5fZmVhdHVyZXMuX3RhYl91aS5famF2YV9yZXNvdXJjZXMuc3JjamFyLlIkYm9vbCB7ICo7IH0KLQotLWtlZXAgY2xhc3MgZ2VuLl9jaHJvbWUuX2FuZHJvaWQuX2ZlYXR1cmVzLl90YWJfdWkuX2phdmFfcmVzb3VyY2VzLnNyY2phci5SJGNvbG9yIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBnZW4uX2Nocm9tZS5fYW5kcm9pZC5fZmVhdHVyZXMuX3RhYl91aS5famF2YV9yZXNvdXJjZXMuc3JjamFyLlIkZGltZW4geyAqOyB9Ci0KLS1rZWVwIGNsYXNzIGdlbi5fY2hyb21lLl9hbmRyb2lkLl9mZWF0dXJlcy5fdGFiX3VpLl9qYXZhX3Jlc291cmNlcy5zcmNqYXIuUiRkcmF3YWJsZSB7ICo7IH0KLQotLWtlZXAgY2xhc3MgZ2VuLl9jaHJvbWUuX2FuZHJvaWQuX2ZlYXR1cmVzLl90YWJfdWkuX2phdmFfcmVzb3VyY2VzLnNyY2phci5SJGZvbnQgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIGdlbi5fY2hyb21lLl9hbmRyb2lkLl9mZWF0dXJlcy5fdGFiX3VpLl9qYXZhX3Jlc291cmNlcy5zcmNqYXIuUiRmcmFjdGlvbiB7ICo7IH0KLQotLWtlZXAgY2xhc3MgZ2VuLl9jaHJvbWUuX2FuZHJvaWQuX2ZlYXR1cmVzLl90YWJfdWkuX2phdmFfcmVzb3VyY2VzLnNyY2phci5SJGlkIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBnZW4uX2Nocm9tZS5fYW5kcm9pZC5fZmVhdHVyZXMuX3RhYl91aS5famF2YV9yZXNvdXJjZXMuc3JjamFyLlIkaW50ZWdlciB7ICo7IH0KLQotLWtlZXAgY2xhc3MgZ2VuLl9jaHJvbWUuX2FuZHJvaWQuX2ZlYXR1cmVzLl90YWJfdWkuX2phdmFfcmVzb3VyY2VzLnNyY2phci5SJGxheW91dCB7ICo7IH0KLQotLWtlZXAgY2xhc3MgZ2VuLl9jaHJvbWUuX2FuZHJvaWQuX2ZlYXR1cmVzLl90YWJfdWkuX2phdmFfcmVzb3VyY2VzLnNyY2phci5SJG1lbnUgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIGdlbi5fY2hyb21lLl9hbmRyb2lkLl9mZWF0dXJlcy5fdGFiX3VpLl9qYXZhX3Jlc291cmNlcy5zcmNqYXIuUiRtaXBtYXAgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIGdlbi5fY2hyb21lLl9hbmRyb2lkLl9mZWF0dXJlcy5fdGFiX3VpLl9qYXZhX3Jlc291cmNlcy5zcmNqYXIuUiRwbHVyYWxzIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBnZW4uX2Nocm9tZS5fYW5kcm9pZC5fZmVhdHVyZXMuX3RhYl91aS5famF2YV9yZXNvdXJjZXMuc3JjamFyLlIkc3RyaW5nIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBnZW4uX2Nocm9tZS5fYW5kcm9pZC5fZmVhdHVyZXMuX3RhYl91aS5famF2YV9yZXNvdXJjZXMuc3JjamFyLlIkc3R5bGUgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIGdlbi5fY2hyb21lLl9hbmRyb2lkLl9mZWF0dXJlcy5fdGFiX3VpLl9qYXZhX3Jlc291cmNlcy5zcmNqYXIuUiRzdHlsZWFibGUgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIGdlbi5fY2hyb21lLl9hbmRyb2lkLl9mZWF0dXJlcy5fdGFiX3VpLl9qYXZhX3Jlc291cmNlcy5zcmNqYXIuUiR0cmFuc2l0aW9uIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBnZW4uX2Nocm9tZS5fYW5kcm9pZC5fZmVhdHVyZXMuX3RhYl91aS5famF2YV9yZXNvdXJjZXMuc3JjamFyLlIkeG1sIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBnZW4uX2Nocm9tZS5fYW5kcm9pZC5fbW9ub2Nocm9tZV9wdWJsaWNfYnVuZGxlX190YWJfdWlfYnVuZGxlX21vZHVsZV9fY29tcGlsZV9yZXNvdXJjZXMuc3JjamFyLlIkZGltZW4geyAqOyB9Ci0KLS1rZWVwIGNsYXNzIGdlbi5fY2hyb21lLl9hbmRyb2lkLl9tb25vY2hyb21lX3B1YmxpY19idW5kbGVfX3RhYl91aV9idW5kbGVfbW9kdWxlX19jb21waWxlX3Jlc291cmNlcy5zcmNqYXIuUiRkcmF3YWJsZSB7ICo7IH0KLQotLWtlZXAgY2xhc3MgZ2VuLl9jaHJvbWUuX2FuZHJvaWQuX21vbm9jaHJvbWVfcHVibGljX2J1bmRsZV9fdGFiX3VpX2J1bmRsZV9tb2R1bGVfX2NvbXBpbGVfcmVzb3VyY2VzLnNyY2phci5SJGlkIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBnZW4uX2Nocm9tZS5fYW5kcm9pZC5fbW9ub2Nocm9tZV9wdWJsaWNfYnVuZGxlX190YWJfdWlfYnVuZGxlX21vZHVsZV9fY29tcGlsZV9yZXNvdXJjZXMuc3JjamFyLlIkbGF5b3V0IHsgKjsgfQotCi0ta2VlcCBjbGFzcyBpbnQgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIGludFtdIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBsb25nIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBudWxsIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuY29ubi5zY2hlbWUuTGF5ZXJlZFNvY2tldEZhY3RvcnkgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5jb25uLnNjaGVtZS5Tb2NrZXRGYWN0b3J5IHsgKjsgfQotCi0ta2VlcCBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuY29ubi5zc2wuQWJzdHJhY3RWZXJpZmllciB7ICo7IH0KLQotLWtlZXAgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNvbm4uc3NsLlg1MDlIb3N0bmFtZVZlcmlmaWVyIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkNvcmVDb25uZWN0aW9uUE5hbWVzIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uYmFzZS5DYWxsYmFjayB7ICo7IH0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmJhc2UuT2JzZXJ2ZXJMaXN0IHsgKjsgfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uYmFzZS5TdXBwbGllciB7ICo7IH0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmJhc2UudGFzay5UYXNrVHJhaXRzIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuVGhlbWVDb2xvclByb3ZpZGVyIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuVGhlbWVDb2xvclByb3ZpZGVyJFRoZW1lQ29sb3JPYnNlcnZlciB7ICo7IH0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLlRoZW1lQ29sb3JQcm92aWRlciRUaW50T2JzZXJ2ZXIgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5jb21wb3NpdG9yLkNvbXBvc2l0b3JWaWV3SG9sZGVyIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuY29tcG9zaXRvci5sYXlvdXRzLkVtcHR5T3ZlcnZpZXdNb2RlT2JzZXJ2ZXIgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5jb21wb3NpdG9yLmxheW91dHMuT3ZlcnZpZXdNb2RlQmVoYXZpb3IgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5jb21wb3NpdG9yLmxheW91dHMuT3ZlcnZpZXdNb2RlQmVoYXZpb3IkT3ZlcnZpZXdNb2RlT2JzZXJ2ZXIgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5jb21wb3NpdG9yLmxheW91dHMuY29udGVudC5UYWJDb250ZW50TWFuYWdlciB7ICo7IH0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLmZhdmljb24uRmF2aWNvbkhlbHBlciB7ICo7IH0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLmZhdmljb24uRmF2aWNvbkhlbHBlciRGYXZpY29uSW1hZ2VDYWxsYmFjayB7ICo7IH0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLmZ1bGxzY3JlZW4uQ2hyb21lRnVsbHNjcmVlbk1hbmFnZXIgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5mdWxsc2NyZWVuLkNocm9tZUZ1bGxzY3JlZW5NYW5hZ2VyJEZ1bGxzY3JlZW5MaXN0ZW5lciB7ICo7IH0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLmdlc3R1cmVuYXYuSGlzdG9yeU5hdmlnYXRpb25EZWxlZ2F0ZSB7ICo7IH0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLmxpZmVjeWNsZS5BY3Rpdml0eUxpZmVjeWNsZURpc3BhdGNoZXIgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5saWZlY3ljbGUuRGVzdHJveWFibGUgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5saWZlY3ljbGUuTGlmZWN5Y2xlT2JzZXJ2ZXIgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5saWZlY3ljbGUuUGF1c2VSZXN1bWVXaXRoTmF0aXZlT2JzZXJ2ZXIgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5wcm9maWxlcy5Qcm9maWxlIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFiLkVtcHR5VGFiT2JzZXJ2ZXIgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWIuVGFiIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFiLlRhYk9ic2VydmVyIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFibW9kZWwuRW1wdHlUYWJNb2RlbE9ic2VydmVyIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFibW9kZWwuRW1wdHlUYWJNb2RlbFNlbGVjdG9yT2JzZXJ2ZXIgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWJtb2RlbC5UYWJDcmVhdG9yTWFuYWdlciB7ICo7IH0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYm1vZGVsLlRhYkxpc3QgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWJtb2RlbC5UYWJNb2RlbCB7ICo7IH0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYm1vZGVsLlRhYk1vZGVsT2JzZXJ2ZXIgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWJtb2RlbC5UYWJNb2RlbFNlbGVjdG9yIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFibW9kZWwuVGFiTW9kZWxTZWxlY3Rvck9ic2VydmVyIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFibW9kZWwuVGFiTW9kZWxTZWxlY3RvclRhYk9ic2VydmVyIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX2dyb3Vwcy5UYWJHcm91cFV0aWxzJDEgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5HcmlkVGFiU3dpdGNoZXIgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5HcmlkVGFiU3dpdGNoZXIkR3JpZENvbnRyb2xsZXIgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5HcmlkVGFiU3dpdGNoZXJNZWRpYXRvciRSZXNldEhhbmRsZXIgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJHcmlkRGlhbG9nTWVkaWF0b3IkUmVzZXRIYW5kbGVyIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiR3JpZFNoZWV0TWVkaWF0b3IkUmVzZXRIYW5kbGVyIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiR3JpZFNoZWV0Vmlld0JpbmRlciRWaWV3SG9sZGVyIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiR3JvdXBVaSB7ICo7IH0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkdyb3VwVWlNZWRpYXRvciRSZXNldEhhbmRsZXIgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJMaXN0TWVkaWF0b3IkQ3JlYXRlR3JvdXBCdXR0b25Qcm92aWRlciB7ICo7IH0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkxpc3RNZWRpYXRvciRHcmlkQ2FyZE9uQ2xpY2tMaXN0ZW5lclByb3ZpZGVyIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiTGlzdE1lZGlhdG9yJElwaFByb3ZpZGVyIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiTGlzdE1lZGlhdG9yJFRhYkFjdGlvbkxpc3RlbmVyIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiTGlzdE1lZGlhdG9yJFRodW1ibmFpbFByb3ZpZGVyIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiTGlzdE1lZGlhdG9yJFRpdGxlUHJvdmlkZXIgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJMaXN0UmVjeWNsZXJWaWV3JFZpc2liaWxpdHlMaXN0ZW5lciB7ICo7IH0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYk1hbmFnZW1lbnREZWxlZ2F0ZSB7ICo7IH0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRvb2xiYXIuVG9vbGJhck1hbmFnZXIgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50b29sYmFyLmJvdHRvbS5Cb3R0b21Db250cm9sc0Nvb3JkaW5hdG9yJEJvdHRvbUNvbnRyb2xzVmlzaWJpbGl0eUNvbnRyb2xsZXIgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci53aWRnZXQuU2NyaW1WaWV3IHsgKjsgfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIud2lkZ2V0LlNjcmltVmlldyRTY3JpbU9ic2VydmVyIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIud2lkZ2V0LlNjcmltVmlldyRTY3JpbVBhcmFtcyB7ICo7IH0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLndpZGdldC5TY3JpbVZpZXckU3RhdHVzQmFyU2NyaW1EZWxlZ2F0ZSB7ICo7IH0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLndpZGdldC5ib3R0b21zaGVldC5Cb3R0b21TaGVldCRCb3R0b21TaGVldENvbnRlbnQgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci53aWRnZXQuYm90dG9tc2hlZXQuQm90dG9tU2hlZXRDb250cm9sbGVyIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIud2lkZ2V0LmJvdHRvbXNoZWV0LkJvdHRvbVNoZWV0T2JzZXJ2ZXIgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci53aWRnZXQuYm90dG9tc2hlZXQuRW1wdHlCb3R0b21TaGVldE9ic2VydmVyIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIud2lkZ2V0LnRleHRidWJibGUuVGV4dEJ1YmJsZSB7ICo7IH0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmNvbXBvbmVudHMuZmVhdHVyZV9lbmdhZ2VtZW50LlRyYWNrZXIgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jb250ZW50X3B1YmxpYy5icm93c2VyLkxvYWRVcmxQYXJhbXMgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuTGlzdE1vZGVsQmFzZSB7ICo7IH0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLnVpLm1vZGVsdXRpbC5Qcm9wZXJ0eUtleSB7ICo7IH0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLnVpLm1vZGVsdXRpbC5Qcm9wZXJ0eUtleVtdIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5TGlzdE1vZGVsIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5TW9kZWwgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuUHJvcGVydHlNb2RlbCRCdWlsZGVyIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5TW9kZWwkUmVhZGFibGVCb29sZWFuUHJvcGVydHlLZXkgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuUHJvcGVydHlNb2RlbCRSZWFkYWJsZUZsb2F0UHJvcGVydHlLZXkgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuUHJvcGVydHlNb2RlbCRSZWFkYWJsZUludFByb3BlcnR5S2V5IHsgKjsgfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5TW9kZWwkUmVhZGFibGVPYmplY3RQcm9wZXJ0eUtleSB7ICo7IH0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLnVpLm1vZGVsdXRpbC5Qcm9wZXJ0eU1vZGVsJFdyaXRhYmxlQm9vbGVhblByb3BlcnR5S2V5IHsgKjsgfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5TW9kZWwkV3JpdGFibGVGbG9hdFByb3BlcnR5S2V5IHsgKjsgfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5TW9kZWwkV3JpdGFibGVJbnRQcm9wZXJ0eUtleSB7ICo7IH0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLnVpLm1vZGVsdXRpbC5Qcm9wZXJ0eU1vZGVsJFdyaXRhYmxlT2JqZWN0UHJvcGVydHlLZXkgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuUHJvcGVydHlNb2RlbENoYW5nZVByb2Nlc3NvciRWaWV3QmluZGVyIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5T2JzZXJ2YWJsZSB7ICo7IH0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLnVpLm1vZGVsdXRpbC5SZWN5Y2xlclZpZXdBZGFwdGVyIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlJlY3ljbGVyVmlld0FkYXB0ZXIkRGVsZWdhdGUgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuUmVjeWNsZXJWaWV3QWRhcHRlciRWaWV3SG9sZGVyRmFjdG9yeSB7ICo7IH0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLnVpLm1vZGVsdXRpbC5TaW1wbGVSZWN5Y2xlclZpZXdNY3BCYXNlIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlNpbXBsZVJlY3ljbGVyVmlld01jcEJhc2UkSXRlbVZpZXdUeXBlQ2FsbGJhY2sgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuU2ltcGxlUmVjeWNsZXJWaWV3TWNwQmFzZSRWaWV3QmluZGVyIHsgKjsgfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0udWkucmVzb3VyY2VzLmR5bmFtaWNzLkR5bmFtaWNSZXNvdXJjZSB7ICo7IH0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLnVpLnJlc291cmNlcy5keW5hbWljcy5EeW5hbWljUmVzb3VyY2VMb2FkZXIgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS51aS5yZXNvdXJjZXMuZHluYW1pY3MuVmlld1Jlc291cmNlQWRhcHRlciB7ICo7IH0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLnVpLndpZGdldC5SZWN0UHJvdmlkZXIgeyAqOyB9Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS51aS53aWRnZXQuVmlld1JlY3RQcm92aWRlciB7ICo7IH0KLQotLWtlZXAgY2xhc3MgYW5kcm9pZC5zdXBwb3J0LnY0LmNvbnRlbnQuQ29udGV4dENvbXBhdCB7Ci0gIGludCBnZXRDb2xvcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50KTsKLX0KLQotLWtlZXAgY2xhc3MgYW5kcm9pZC5zdXBwb3J0LnY0LmNvbnRlbnQucmVzLlJlc291cmNlc0NvbXBhdCB7Ci0gIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgZ2V0RHJhd2FibGUoYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMsIGludCwgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMkVGhlbWUpOwotfQotCi0ta2VlcCBjbGFzcyBhbmRyb2lkLnN1cHBvcnQudjcuY29udGVudC5yZXMuQXBwQ29tcGF0UmVzb3VyY2VzIHsKLSAgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBnZXREcmF3YWJsZShhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50KTsKLX0KLQotLWtlZXAgY2xhc3MgYW5kcm9pZC5zdXBwb3J0LnY3LndpZGdldC5SZWN5Y2xlclZpZXckSXRlbUFuaW1hdG9yIHsKLSAgdm9pZCBzZXRBZGREdXJhdGlvbihsb25nKTsKLSAgbG9uZyBnZXRBZGREdXJhdGlvbigpOwotfQotCi0ta2VlcCBjbGFzcyBnZW4uX2Nocm9tZS5fYW5kcm9pZC5fZmVhdHVyZXMuX3RhYl91aS5famF2YV9yZXNvdXJjZXMuc3JjamFyLlIgewotICB2b2lkIG9uUmVzb3VyY2VzTG9hZGVkKGludCk7Ci0gIHZvaWQgb25SZXNvdXJjZXNMb2FkZWRTdHJpbmcoaW50KTsKLSAgdm9pZCBvblJlc291cmNlc0xvYWRlZERyYXdhYmxlKGludCk7Ci0gIHZvaWQgb25SZXNvdXJjZXNMb2FkZWRNaXBtYXAoaW50KTsKLSAgdm9pZCBvblJlc291cmNlc0xvYWRlZFN0eWxlYWJsZShpbnQpOwotICB2b2lkIG9uUmVzb3VyY2VzTG9hZGVkSW50ZWdlcihpbnQpOwotICB2b2lkIG9uUmVzb3VyY2VzTG9hZGVkQ29sb3IoaW50KTsKLSAgYm9vbGVhbiBzUmVzb3VyY2VzRGlkTG9hZDsKLSAgdm9pZCBvblJlc291cmNlc0xvYWRlZE1lbnUoaW50KTsKLSAgdm9pZCBvblJlc291cmNlc0xvYWRlZERpbWVuKGludCk7Ci0gIHZvaWQgb25SZXNvdXJjZXNMb2FkZWRYbWwoaW50KTsKLSAgdm9pZCBvblJlc291cmNlc0xvYWRlZExheW91dChpbnQpOwotICB2b2lkIG9uUmVzb3VyY2VzTG9hZGVkVHJhbnNpdGlvbihpbnQpOwotICB2b2lkIG9uUmVzb3VyY2VzTG9hZGVkQm9vbChpbnQpOwotICB2b2lkIG9uUmVzb3VyY2VzTG9hZGVkRm9udChpbnQpOwotICB2b2lkIG9uUmVzb3VyY2VzTG9hZGVkQW5pbShpbnQpOwotICB2b2lkIG9uUmVzb3VyY2VzTG9hZGVkQW5pbWF0b3IoaW50KTsKLSAgdm9pZCBvblJlc291cmNlc0xvYWRlZEFycmF5KGludCk7Ci0gIHZvaWQgb25SZXNvdXJjZXNMb2FkZWRTdHlsZShpbnQpOwotICB2b2lkIG9uUmVzb3VyY2VzTG9hZGVkRnJhY3Rpb24oaW50KTsKLSAgdm9pZCBvblJlc291cmNlc0xvYWRlZEF0dHIoaW50KTsKLSAgdm9pZCBvblJlc291cmNlc0xvYWRlZElkKGludCk7Ci0gIHZvaWQgb25SZXNvdXJjZXNMb2FkZWRQbHVyYWxzKGludCk7Ci19Ci0KLS1rZWVwIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5jb25uLnNzbC5TU0xTb2NrZXRGYWN0b3J5IHsKLSAgb3JnLmFwYWNoZS5odHRwLmNvbm4uc3NsLlg1MDlIb3N0bmFtZVZlcmlmaWVyIEFMTE9XX0FMTF9IT1NUTkFNRV9WRVJJRklFUjsKLSAgb3JnLmFwYWNoZS5odHRwLmNvbm4uc3NsLlg1MDlIb3N0bmFtZVZlcmlmaWVyIFNUUklDVF9IT1NUTkFNRV9WRVJJRklFUjsKLSAgb3JnLmFwYWNoZS5odHRwLmNvbm4uc3NsLlg1MDlIb3N0bmFtZVZlcmlmaWVyIEJST1dTRVJfQ09NUEFUSUJMRV9IT1NUTkFNRV9WRVJJRklFUjsKLX0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmJhc2UuQXBpQ29tcGF0aWJpbGl0eVV0aWxzIHsKLSAgdm9pZCBzZXRJbWFnZVRpbnRMaXN0KGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldywgYW5kcm9pZC5jb250ZW50LnJlcy5Db2xvclN0YXRlTGlzdCk7Ci0gIGludCBnZXRDb2xvcihhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcywgaW50KTsKLX0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmJhc2UuQXBwbGljYXRpb25TdGF0dXMgewotICBhbmRyb2lkLmFwcC5BY3Rpdml0eSBnZXRMYXN0VHJhY2tlZEZvY3VzZWRBY3Rpdml0eSgpOwotfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uYmFzZS5Db250ZXh0VXRpbHMgewotICBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBnZXRBcHBsaWNhdGlvbkNvbnRleHQoKTsKLX0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmJhc2UuTG9nIHsKLSAgdm9pZCB3KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3RbXSk7Ci19Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5iYXNlLm1ldHJpY3MuUmVjb3JkSGlzdG9ncmFtIHsKLSAgdm9pZCByZWNvcmRTcGFyc2VIaXN0b2dyYW0oamF2YS5sYW5nLlN0cmluZywgaW50KTsKLSAgdm9pZCByZWNvcmRDb3VudEhpc3RvZ3JhbShqYXZhLmxhbmcuU3RyaW5nLCBpbnQpOwotfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uYmFzZS5tZXRyaWNzLlJlY29yZFVzZXJBY3Rpb24gewotICB2b2lkIHJlY29yZChqYXZhLmxhbmcuU3RyaW5nKTsKLX0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmJhc2UudGFzay5Qb3N0VGFzayB7Ci0gIHZvaWQgcG9zdFRhc2sob3JnLmNocm9taXVtLmJhc2UudGFzay5UYXNrVHJhaXRzLCBqYXZhLmxhbmcuUnVubmFibGUpOwotfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLlIkY29sb3IgewotICBpbnQgbW9kZXJuX2dyZXlfMTAwOwotICBpbnQgbW9kZXJuX2dyZXlfODAwX2FscGhhXzM4OwotICBpbnQgbW9kZXJuX3ByaW1hcnlfY29sb3I7Ci0gIGludCBkZWZhdWx0X3RleHRfY29sb3JfZGFyazsKLSAgaW50IG1vZGVybl9ncmV5XzMwMDsKLX0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5SJGRpbWVuIHsKLSAgaW50IHRvb2xiYXJfaGVpZ2h0X25vX3NoYWRvdzsKLSAgaW50IGNvbnRyb2xfY29udGFpbmVyX2hlaWdodDsKLSAgaW50IGNvbXBvc2l0b3JfdGFiX3RpdGxlX3RleHRfc2l6ZTsKLSAgaW50IGRlZmF1bHRfZmF2aWNvbl9zaXplOwotfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLlIkZHJhd2FibGUgewotICBpbnQgYnRuX2Nsb3NlOwotICBpbnQgaWNfZ2xvYmVfMjRkcDsKLSAgaW50IGNocm9tZWxvZ28xNjsKLX0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5SJHBsdXJhbHMgewotICBpbnQgYm90dG9tX3RhYl9ncmlkX3RpdGxlX3BsYWNlaG9sZGVyOwotfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLlIkc3RyaW5nIHsKLSAgaW50IGlwaF90YWJfZ3JvdXBzX3lvdXJfdGFic190b2dldGhlcl90ZXh0OwotICBpbnQgYm90dG9tX3RhYl9ncmlkX29wZW5lZF9mdWxsOwotICBpbnQgYWNjZXNzaWJpbGl0eV90YWJzdHJpcF90YWI7Ci0gIGludCBpcGhfdGFiX2dyb3Vwc19xdWlja2x5X2NvbXBhcmVfcGFnZXNfdGV4dDsKLSAgaW50IGlwaF90YWJfZ3JvdXBzX3RhcF90b19zZWVfYW5vdGhlcl90YWJfdGV4dDsKLSAgaW50IGJvdHRvbV90YWJfZ3JpZF9vcGVuZWRfaGFsZjsKLSAgaW50IGlwaF90YWJfZ3JvdXBzX3RhcF90b19zZWVfYW5vdGhlcl90YWJfYWNjZXNzaWJpbGl0eV90ZXh0OwotICBpbnQgYWNjZXNzaWJpbGl0eV90YWJzdHJpcF9idG5fY2xvc2VfdGFiOwotICBpbnQgYm90dG9tX3RhYl9ncmlkX2Rlc2NyaXB0aW9uOwotICBpbnQgYm90dG9tX3RhYl9ncmlkX2Nsb3NlZDsKLX0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLkNocm9tZUFjdGl2aXR5IHsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLmxpZmVjeWNsZS5BY3Rpdml0eUxpZmVjeWNsZURpc3BhdGNoZXIgZ2V0TGlmZWN5Y2xlRGlzcGF0Y2hlcigpOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuY29tcG9zaXRvci5sYXlvdXRzLk92ZXJ2aWV3TW9kZUJlaGF2aW9yIGdldE92ZXJ2aWV3TW9kZUJlaGF2aW9yKCk7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50b29sYmFyLlRvb2xiYXJNYW5hZ2VyIGdldFRvb2xiYXJNYW5hZ2VyKCk7Ci0gIHZvaWQgb25CYWNrUHJlc3NlZCgpOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuY29tcG9zaXRvci5sYXlvdXRzLmNvbnRlbnQuVGFiQ29udGVudE1hbmFnZXIgZ2V0VGFiQ29udGVudE1hbmFnZXIoKTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLmZ1bGxzY3JlZW4uQ2hyb21lRnVsbHNjcmVlbk1hbmFnZXIgZ2V0RnVsbHNjcmVlbk1hbmFnZXIoKTsKLSAgYm9vbGVhbiBpc1dhcm1PblJlc3VtZSgpOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFibW9kZWwuVGFiTW9kZWxTZWxlY3RvciBnZXRUYWJNb2RlbFNlbGVjdG9yKCk7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci53aWRnZXQuYm90dG9tc2hlZXQuQm90dG9tU2hlZXRDb250cm9sbGVyIGdldEJvdHRvbVNoZWV0Q29udHJvbGxlcigpOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuY29tcG9zaXRvci5Db21wb3NpdG9yVmlld0hvbGRlciBnZXRDb21wb3NpdG9yVmlld0hvbGRlcigpOwotfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuQ2hyb21lRmVhdHVyZUxpc3QgewotICBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKTsKLSAgYm9vbGVhbiBpc0VuYWJsZWQoamF2YS5sYW5nLlN0cmluZyk7Ci19Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5DaHJvbWVUYWJiZWRBY3Rpdml0eSB7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWJtb2RlbC5UYWJNb2RlbFNlbGVjdG9yIGdldFRhYk1vZGVsU2VsZWN0b3IoKTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLmNvbXBvc2l0b3IubGF5b3V0cy5PdmVydmlld01vZGVCZWhhdmlvciBnZXRPdmVydmlld01vZGVCZWhhdmlvcigpOwotfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuZmVhdHVyZV9lbmdhZ2VtZW50LlRyYWNrZXJGYWN0b3J5IHsKLSAgb3JnLmNocm9taXVtLmNvbXBvbmVudHMuZmVhdHVyZV9lbmdhZ2VtZW50LlRyYWNrZXIgZ2V0VHJhY2tlckZvclByb2ZpbGUob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnByb2ZpbGVzLlByb2ZpbGUpOwotfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuZ2VzdHVyZW5hdi5IaXN0b3J5TmF2aWdhdGlvbkxheW91dCB7Ci0gIHZvaWQgc2V0TmF2aWdhdGlvbkRlbGVnYXRlKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5nZXN0dXJlbmF2Lkhpc3RvcnlOYXZpZ2F0aW9uRGVsZWdhdGUpOwotfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIubWV0cmljcy5VbWFTZXNzaW9uU3RhdHMgewotICB2b2lkIHJlZ2lzdGVyU3ludGhldGljRmllbGRUcmlhbChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKTsKLX0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLm5hdGl2ZV9wYWdlLk5hdGl2ZVBhZ2VGYWN0b3J5IHsKLSAgYm9vbGVhbiBpc05hdGl2ZVBhZ2VVcmwoamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbik7Ci19Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWJtb2RlbC5UYWJDcmVhdG9yTWFuYWdlciRUYWJDcmVhdG9yIHsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYi5UYWIgY3JlYXRlTmV3VGFiKG9yZy5jaHJvbWl1bS5jb250ZW50X3B1YmxpYy5icm93c2VyLkxvYWRVcmxQYXJhbXMsIGludCwgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYi5UYWIpOwotfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFibW9kZWwuVGFiTW9kZWxGaWx0ZXIgewotICBpbnQgaW5kZXgoKTsKLSAgaW50IGluZGV4T2Yob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYi5UYWIpOwotICBib29sZWFuIGlzSW5jb2duaXRvKCk7Ci0gIGphdmEudXRpbC5MaXN0IGdldFJlbGF0ZWRUYWJMaXN0KGludCk7Ci19Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWJtb2RlbC5UYWJNb2RlbEZpbHRlclByb3ZpZGVyIHsKLSAgdm9pZCByZW1vdmVUYWJNb2RlbEZpbHRlck9ic2VydmVyKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWJtb2RlbC5UYWJNb2RlbE9ic2VydmVyKTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYm1vZGVsLlRhYk1vZGVsRmlsdGVyIGdldFRhYk1vZGVsRmlsdGVyKGJvb2xlYW4pOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFibW9kZWwuVGFiTW9kZWxGaWx0ZXIgZ2V0Q3VycmVudFRhYk1vZGVsRmlsdGVyKCk7Ci0gIHZvaWQgYWRkVGFiTW9kZWxGaWx0ZXJPYnNlcnZlcihvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFibW9kZWwuVGFiTW9kZWxPYnNlcnZlcik7Ci19Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWJtb2RlbC5UYWJNb2RlbFV0aWxzIHsKLSAgaW50IGdldFRhYkluZGV4QnlJZChvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFibW9kZWwuVGFiTGlzdCwgaW50KTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYi5UYWIgZ2V0VGFiQnlJZChvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFibW9kZWwuVGFiTGlzdCwgaW50KTsKLX0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLlJldHVyblRvQ2hyb21lRXhwZXJpbWVudHNVdGlsIHsKLSAgYm9vbGVhbiBzaG91bGRTaG93T21uaWJveE9uVGFiU3dpdGNoZXIoKTsKLX0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9ncm91cHMuVGFiR3JvdXBVdGlscyB7Ci0gIGJvb2xlYW4gaXNNb3ZlSW5TYW1lR3JvdXAob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYm1vZGVsLlRhYk1vZGVsLCBpbnQsIGludCk7Ci0gIGJvb2xlYW4gJGFzc2VydGlvbnNEaXNhYmxlZDsKLSAgdm9pZCBsYW1iZGEkbWF5YmVTaG93SVBIJDAob3JnLmNocm9taXVtLmNvbXBvbmVudHMuZmVhdHVyZV9lbmdhZ2VtZW50LlRyYWNrZXIsIGphdmEubGFuZy5TdHJpbmcpOwotICB2b2lkIHN0YXJ0T2JzZXJ2aW5nRm9yVGFiR3JvdXBzSVBIKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWJtb2RlbC5UYWJNb2RlbFNlbGVjdG9yKTsKLSAgdm9pZCBtYXliZVNob3dJUEgoamF2YS5sYW5nLlN0cmluZywgYW5kcm9pZC52aWV3LlZpZXcpOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFibW9kZWwuVGFiTW9kZWxTZWxlY3RvclRhYk9ic2VydmVyIGFjY2VzcyQwMDAoKTsKLSAgaW50IGdldExhc3RUYWJNb2RlbEluZGV4Rm9yTGlzdChvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFibW9kZWwuVGFiTW9kZWxTZWxlY3RvciwgamF2YS51dGlsLkxpc3QpOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFibW9kZWwuVGFiTW9kZWxTZWxlY3RvclRhYk9ic2VydmVyIHNUYWJNb2RlbFNlbGVjdG9yVGFiT2JzZXJ2ZXI7Ci0gIGludCBnZXRGaXJzdFRhYk1vZGVsSW5kZXhGb3JMaXN0KG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWJtb2RlbC5UYWJNb2RlbFNlbGVjdG9yLCBqYXZhLnV0aWwuTGlzdCk7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWIuVGFiIGdldFNlbGVjdGVkVGFiSW5Hcm91cEZvclRhYihvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFibW9kZWwuVGFiTW9kZWxTZWxlY3Rvciwgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYi5UYWIpOwotfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuR3JpZFRhYlN3aXRjaGVyQ29vcmRpbmF0b3IgewotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiTGlzdENvb3JkaW5hdG9yIG1UYWJHcmlkQ29vcmRpbmF0b3I7Ci0gIGphdmEubGFuZy5TdHJpbmcgbGFtYmRhJG5ldyQwKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWJtb2RlbC5UYWJNb2RlbFNlbGVjdG9yLCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYi5UYWIpOwotICBvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5TW9kZWxDaGFuZ2VQcm9jZXNzb3IgbUNvbnRhaW5lclZpZXdDaGFuZ2VQcm9jZXNzb3I7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJHcmlkRGlhbG9nQ29vcmRpbmF0b3IgbVRhYkdyaWREaWFsb2dDb29yZGluYXRvcjsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLmxpZmVjeWNsZS5BY3Rpdml0eUxpZmVjeWNsZURpc3BhdGNoZXIgbUxpZmVjeWNsZURpc3BhdGNoZXI7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5HcmlkVGFiU3dpdGNoZXJNZWRpYXRvciBtTWVkaWF0b3I7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5NdWx0aVRodW1ibmFpbENhcmRQcm92aWRlciBtTXVsdGlUaHVtYm5haWxDYXJkUHJvdmlkZXI7Ci19Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5HcmlkVGFiU3dpdGNoZXJNZWRpYXRvciB7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJMaXN0TWVkaWF0b3IkVGFiQWN0aW9uTGlzdGVuZXIgZ2V0R3JpZENhcmRPbkNsaWNrTGlzdGVuZXIob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYi5UYWIpOwotICBqYXZhLnV0aWwuTGlzdCBnZXRSZWxhdGVkVGFicyhpbnQpOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuR3JpZFRhYlN3aXRjaGVyTWVkaWF0b3IkUmVzZXRIYW5kbGVyIGFjY2VzcyQzMDAob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LkdyaWRUYWJTd2l0Y2hlck1lZGlhdG9yKTsKLSAgYm9vbGVhbiBtU2hvdWxkSWdub3JlTmV4dFNlbGVjdDsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLmZ1bGxzY3JlZW4uQ2hyb21lRnVsbHNjcmVlbk1hbmFnZXIkRnVsbHNjcmVlbkxpc3RlbmVyIG1GdWxsc2NyZWVuTGlzdGVuZXI7Ci0gIHZvaWQgbGFtYmRhJGdldENyZWF0ZUdyb3VwQnV0dG9uT25DbGlja0xpc3RlbmVyJDEoaW50KTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkdyaWREaWFsb2dNZWRpYXRvciRSZXNldEhhbmRsZXIgbVRhYkdyaWREaWFsb2dSZXNldEhhbmRsZXI7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWJtb2RlbC5UYWJNb2RlbFNlbGVjdG9yIG1UYWJNb2RlbFNlbGVjdG9yOwotICB2b2lkIHByZXBhcmVPdmVydmlldygpOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFibW9kZWwuVGFiTW9kZWxPYnNlcnZlciBtVGFiTW9kZWxPYnNlcnZlcjsKLSAgYm9vbGVhbiBhYmxlVG9DcmVhdGVHcm91cChvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFiLlRhYik7Ci0gIHZvaWQgc2V0Q29udGVudE92ZXJsYXlWaXNpYmlsaXR5KGJvb2xlYW4pOwotICBvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5TW9kZWwgYWNjZXNzJDAwMChvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuR3JpZFRhYlN3aXRjaGVyTWVkaWF0b3IpOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuZnVsbHNjcmVlbi5DaHJvbWVGdWxsc2NyZWVuTWFuYWdlciBtRnVsbHNjcmVlbk1hbmFnZXI7Ci0gIGJvb2xlYW4gYWNjZXNzJDEwMihvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuR3JpZFRhYlN3aXRjaGVyTWVkaWF0b3IsIGJvb2xlYW4pOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuR3JpZFRhYlN3aXRjaGVyTWVkaWF0b3IkUmVzZXRIYW5kbGVyIG1SZXNldEhhbmRsZXI7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJMaXN0TWVkaWF0b3IkVGFiQWN0aW9uTGlzdGVuZXIgZ2V0Q3JlYXRlR3JvdXBCdXR0b25PbkNsaWNrTGlzdGVuZXIob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYi5UYWIpOwotICB2b2lkIGRlc3Ryb3koKTsKLSAgb3JnLmNocm9taXVtLmJhc2UuT2JzZXJ2ZXJMaXN0IG1PYnNlcnZlcnM7Ci0gIGJvb2xlYW4gYWNjZXNzJDEwMChvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuR3JpZFRhYlN3aXRjaGVyTWVkaWF0b3IpOwotICB2b2lkIHNldFZpc2liaWxpdHkoYm9vbGVhbik7Ci0gIGJvb2xlYW4gYWJsZVRvT3BlbkRpYWxvZyhvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFiLlRhYik7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWJtb2RlbC5UYWJNb2RlbFNlbGVjdG9yT2JzZXJ2ZXIgbVRhYk1vZGVsU2VsZWN0b3JPYnNlcnZlcjsKLSAgdm9pZCBhY2Nlc3MkNDAwKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5HcmlkVGFiU3dpdGNoZXJNZWRpYXRvciwgYm9vbGVhbik7Ci0gIHZvaWQgbGFtYmRhJGdldEdyaWRDYXJkT25DbGlja0xpc3RlbmVyJDAoaW50KTsKLSAgb3JnLmNocm9taXVtLnVpLm1vZGVsdXRpbC5Qcm9wZXJ0eU1vZGVsIG1Db250YWluZXJWaWV3TW9kZWw7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5jb21wb3NpdG9yLkNvbXBvc2l0b3JWaWV3SG9sZGVyIG1Db21wb3NpdG9yVmlld0hvbGRlcjsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYm1vZGVsLlRhYk1vZGVsU2VsZWN0b3IgYWNjZXNzJDIwMChvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuR3JpZFRhYlN3aXRjaGVyTWVkaWF0b3IpOwotfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuTXVsdGlUaHVtYm5haWxDYXJkUHJvdmlkZXIgewotICBhbmRyb2lkLmdyYXBoaWNzLlBhaW50IGFjY2VzcyQxMDAwKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5NdWx0aVRodW1ibmFpbENhcmRQcm92aWRlcik7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJMaXN0RmF2aWNvblByb3ZpZGVyIGFjY2VzcyQxMjAwKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5NdWx0aVRodW1ibmFpbENhcmRQcm92aWRlcik7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJMaXN0RmF2aWNvblByb3ZpZGVyIG1UYWJMaXN0RmF2aWNvblByb3ZpZGVyOwotICBqYXZhLnV0aWwuTGlzdCBtVGh1bWJuYWlsUmVjdHM7Ci0gIGZsb2F0IGFjY2VzcyQ5MDAob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50Lk11bHRpVGh1bWJuYWlsQ2FyZFByb3ZpZGVyKTsKLSAgYW5kcm9pZC5ncmFwaGljcy5QYWludCBtVGV4dFBhaW50OwotICBqYXZhLnV0aWwuTGlzdCBhY2Nlc3MkODAwKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5NdWx0aVRodW1ibmFpbENhcmRQcm92aWRlcik7Ci0gIGphdmEudXRpbC5MaXN0IG1GYXZpY29uUmVjdHM7Ci0gIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQgbUVtcHR5VGh1bWJuYWlsUGFpbnQ7Ci0gIGphdmEudXRpbC5MaXN0IGFjY2VzcyQxMTAwKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5NdWx0aVRodW1ibmFpbENhcmRQcm92aWRlcik7Ci0gIGZsb2F0IGFjY2VzcyQ1MDAob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50Lk11bHRpVGh1bWJuYWlsQ2FyZFByb3ZpZGVyKTsKLSAgamF2YS51dGlsLkxpc3QgbUZhdmljb25CYWNrZ3JvdW5kUmVjdHM7Ci0gIGludCBtU2l6ZTsKLSAgYW5kcm9pZC5ncmFwaGljcy5QYWludCBhY2Nlc3MkNzAwKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5NdWx0aVRodW1ibmFpbENhcmRQcm92aWRlcik7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWJtb2RlbC5UYWJNb2RlbFNlbGVjdG9yIGFjY2VzcyQxMDAob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50Lk11bHRpVGh1bWJuYWlsQ2FyZFByb3ZpZGVyKTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYm1vZGVsLlRhYk1vZGVsU2VsZWN0b3IgbVRhYk1vZGVsU2VsZWN0b3I7Ci0gIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQgbVRodW1ibmFpbEZyYW1lUGFpbnQ7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5jb21wb3NpdG9yLmxheW91dHMuY29udGVudC5UYWJDb250ZW50TWFuYWdlciBhY2Nlc3MkMjAwKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5NdWx0aVRodW1ibmFpbENhcmRQcm92aWRlcik7Ci0gIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQgYWNjZXNzJDQwMChvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuTXVsdGlUaHVtYm5haWxDYXJkUHJvdmlkZXIpOwotICBqYXZhLnV0aWwuTGlzdCBhY2Nlc3MkMzAwKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5NdWx0aVRodW1ibmFpbENhcmRQcm92aWRlcik7Ci0gIGZsb2F0IG1SYWRpdXM7Ci0gIGZsb2F0IG1GYXZpY29uQ2lyY2xlUGFkZGluZzsKLSAgYW5kcm9pZC5ncmFwaGljcy5QYWludCBtRmF2aWNvbkJhY2tncm91bmRQYWludDsKLSAgYW5kcm9pZC5ncmFwaGljcy5QYWludCBhY2Nlc3MkNjAwKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5NdWx0aVRodW1ibmFpbENhcmRQcm92aWRlcik7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5jb21wb3NpdG9yLmxheW91dHMuY29udGVudC5UYWJDb250ZW50TWFuYWdlciBtVGFiQ29udGVudE1hbmFnZXI7Ci0gIGludCBhY2Nlc3MkMDAwKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5NdWx0aVRodW1ibmFpbENhcmRQcm92aWRlcik7Ci19Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJHcmlkQ29udGFpbmVyVmlld0JpbmRlciB7Ci0gIHZvaWQgYmluZChvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5TW9kZWwsIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJMaXN0UmVjeWNsZXJWaWV3LCBvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5S2V5KTsKLX0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkdyaWREaWFsb2dDb29yZGluYXRvciB7Ci0gIG9yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuUHJvcGVydHlNb2RlbCBtVG9vbGJhclByb3BlcnR5TW9kZWw7Ci0gIGFuZHJvaWQuY29udGVudC5Db250ZXh0IG1Db250ZXh0OwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiR3JpZERpYWxvZ01lZGlhdG9yIG1NZWRpYXRvcjsKLSAgdm9pZCB1cGRhdGVEaWFsb2dDb250ZW50KGphdmEudXRpbC5MaXN0KTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkdyaWRTaGVldFRvb2xiYXJDb29yZGluYXRvciBtVG9vbGJhckNvb3JkaW5hdG9yOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiR3JpZERpYWxvZ01lZGlhdG9yJFJlc2V0SGFuZGxlciBnZXRSZXNldEhhbmRsZXIoKTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkxpc3RDb29yZGluYXRvciBtVGFiTGlzdENvb3JkaW5hdG9yOwotICB2b2lkIHJlc2V0V2l0aExpc3RPZlRhYnMoamF2YS51dGlsLkxpc3QpOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiR3JpZERpYWxvZ1BhcmVudCBtUGFyZW50TGF5b3V0OwotfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiR3JpZERpYWxvZ01lZGlhdG9yIHsKLSAgdm9pZCBzZXR1cFRvb2xiYXJDbGlja0hhbmRsZXJzKCk7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWJtb2RlbC5UYWJNb2RlbFNlbGVjdG9yIG1UYWJNb2RlbFNlbGVjdG9yOwotICB2b2lkIG9uUmVzZXQoamF2YS5sYW5nLkludGVnZXIpOwotICBhbmRyb2lkLnZpZXcuVmlldyRPbkNsaWNrTGlzdGVuZXIgZ2V0Q29sbGFwc2VCdXR0b25DbGlja0xpc3RlbmVyKCk7Ci0gIGphdmEudXRpbC5MaXN0IGdldFJlbGF0ZWRUYWJzKGludCk7Ci0gIHZvaWQgdXBkYXRlR3JpZFRhYlN3aXRjaGVyKCk7Ci0gIG9yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuUHJvcGVydHlNb2RlbCBtTW9kZWw7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWJtb2RlbC5UYWJNb2RlbE9ic2VydmVyIG1UYWJNb2RlbE9ic2VydmVyOwotICB2b2lkIGxhbWJkYSRnZXRBZGRCdXR0b25DbGlja0xpc3RlbmVyJDEoYW5kcm9pZC52aWV3LlZpZXcpOwotICB2b2lkIHNldHVwU2NyaW1WaWV3T2JzZXJ2ZXIoKTsKLSAgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbUNvbnRleHQ7Ci0gIHZvaWQgdXBkYXRlRGlhbG9nKCk7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJHcmlkRGlhbG9nTWVkaWF0b3IkUmVzZXRIYW5kbGVyIG1EaWFsb2dSZXNldEhhbmRsZXI7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWJtb2RlbC5UYWJDcmVhdG9yTWFuYWdlciBtVGFiQ3JlYXRvck1hbmFnZXI7Ci0gIGJvb2xlYW4gJGFzc2VydGlvbnNEaXNhYmxlZDsKLSAgdm9pZCBhY2Nlc3MkMTAwKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJHcmlkRGlhbG9nTWVkaWF0b3IpOwotICBpbnQgYWNjZXNzJDQwMChvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiR3JpZERpYWxvZ01lZGlhdG9yKTsKLSAgaW50IGFjY2VzcyQ0MDIob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkdyaWREaWFsb2dNZWRpYXRvciwgaW50KTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LkdyaWRUYWJTd2l0Y2hlck1lZGlhdG9yJFJlc2V0SGFuZGxlciBtR3JpZFRhYlN3aXRjaGVyUmVzZXRIYW5kbGVyOwotICBqYXZhLnV0aWwuTGlzdCBhY2Nlc3MkMzAwKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJHcmlkRGlhbG9nTWVkaWF0b3IsIGludCk7Ci0gIG9yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuUHJvcGVydHlNb2RlbCBhY2Nlc3MkMjAwKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJHcmlkRGlhbG9nTWVkaWF0b3IpOwotICB2b2lkIGxhbWJkYSRnZXRDb2xsYXBzZUJ1dHRvbkNsaWNrTGlzdGVuZXIkMChhbmRyb2lkLnZpZXcuVmlldyk7Ci0gIGFuZHJvaWQudmlldy5WaWV3JE9uQ2xpY2tMaXN0ZW5lciBnZXRBZGRCdXR0b25DbGlja0xpc3RlbmVyKCk7Ci0gIHZvaWQgYWNjZXNzJDAwMChvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiR3JpZERpYWxvZ01lZGlhdG9yKTsKLSAgaW50IG1DdXJyZW50VGFiSWQ7Ci0gIHZvaWQgZGVzdHJveSgpOwotfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiR3JpZERpYWxvZ1BhcmVudCB7Ci0gIHZvaWQgc2hvd0RpYWxvZygpOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIud2lkZ2V0LlNjcmltVmlldyRTY3JpbVBhcmFtcyBtU2NyaW1QYXJhbXM7Ci0gIGFuZHJvaWQud2lkZ2V0LlBvcHVwV2luZG93IG1Qb3B1cFdpbmRvdzsKLSAgdm9pZCBzZXR1cERpYWxvZ0FuaW1hdGlvbigpOwotICB2b2lkIGRlc3Ryb3koKTsKLSAgaW50IG1TaWRlTWFyZ2luOwotICB2b2lkIHVwZGF0ZURpYWxvZ1dpdGhPcmllbnRhdGlvbihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50KTsKLSAgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudENhbGxiYWNrcyBtQ29tcG9uZW50Q2FsbGJhY2tzOwotICBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQgbURpYWxvZ0NvbnRhaW5lclZpZXc7Ci0gIHZvaWQgYWNjZXNzJDAwMChvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiR3JpZERpYWxvZ1BhcmVudCwgYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCk7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci53aWRnZXQuU2NyaW1WaWV3IG1TY3JpbVZpZXc7Ci0gIGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yIGFjY2VzcyQxMDIob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkdyaWREaWFsb2dQYXJlbnQsIGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yKTsKLSAgdm9pZCBoaWRlRGlhbG9nKCk7Ci0gIGFuZHJvaWQuYW5pbWF0aW9uLlZhbHVlQW5pbWF0b3IgbURpYWxvZ0ZhZGVPdXQ7Ci0gIGFuZHJvaWQudmlldy5WaWV3R3JvdXAgbVBhcmVudDsKLSAgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IgbUN1cnJlbnRBbmltYXRvcjsKLSAgaW50IG1Ub3BNYXJnaW47Ci0gIHZvaWQgc2V0dXBEaWFsb2dDb250ZW50KGFuZHJvaWQuY29udGVudC5Db250ZXh0KTsKLSAgdm9pZCByZXNldERpYWxvZyhhbmRyb2lkLnZpZXcuVmlldywgYW5kcm9pZC52aWV3LlZpZXcpOwotICBhbmRyb2lkLndpZGdldC5Qb3B1cFdpbmRvdyBhY2Nlc3MkMjAwKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJHcmlkRGlhbG9nUGFyZW50KTsKLSAgYW5kcm9pZC5hbmltYXRpb24uVmFsdWVBbmltYXRvciBtRGlhbG9nRmFkZUluOwotICBpbnQgbVN0YXR1c0JhckhlaWdodDsKLSAgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQkTGF5b3V0UGFyYW1zIG1Db250YWluZXJQYXJhbXM7Ci0gIHZvaWQgc2V0U2NyaW1WaWV3T2JzZXJ2ZXIob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLndpZGdldC5TY3JpbVZpZXckU2NyaW1PYnNlcnZlcik7Ci19Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJHcmlkU2hlZXRDb250ZW50IHsKLSAgYW5kcm9pZC52aWV3LlZpZXcgbVRvb2xiYXJWaWV3OwotICB2b2lkIGRlc3Ryb3koKTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkxpc3RSZWN5Y2xlclZpZXcgbVJlY3ljbGVyVmlldzsKLX0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkdyaWRTaGVldENvb3JkaW5hdG9yIHsKLSAgdm9pZCB1cGRhdGVCb3R0b21TaGVldENvbnRlbnQoamF2YS51dGlsLkxpc3QpOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiR3JpZFNoZWV0VG9vbGJhckNvb3JkaW5hdG9yIG1Ub29sYmFyQ29vcmRpbmF0b3I7Ci0gIG9yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuUHJvcGVydHlNb2RlbCBtVG9vbGJhclByb3BlcnR5TW9kZWw7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJHcmlkU2hlZXRDb250ZW50IG1Cb3R0b21TaGVldENvbnRlbnQ7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJHcmlkU2hlZXRNZWRpYXRvciBtTWVkaWF0b3I7Ci0gIHZvaWQgZGVzdHJveSgpOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiTGlzdENvb3JkaW5hdG9yIG1UYWJHcmlkQ29vcmRpbmF0b3I7Ci0gIHZvaWQgcmVzZXRXaXRoTGlzdE9mVGFicyhqYXZhLnV0aWwuTGlzdCk7Ci0gIGFuZHJvaWQuY29udGVudC5Db250ZXh0IG1Db250ZXh0OwotICB2b2lkIHN0YXJ0T2JzZXJ2aW5nRm9yQ3JlYXRpb25JUEgoKTsKLX0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkdyaWRTaGVldE1lZGlhdG9yIHsKLSAgYW5kcm9pZC52aWV3LlZpZXckT25DbGlja0xpc3RlbmVyIGdldEFkZEJ1dHRvbkNsaWNrTGlzdGVuZXIoKTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYm1vZGVsLlRhYkNyZWF0b3JNYW5hZ2VyIG1UYWJDcmVhdG9yTWFuYWdlcjsKLSAgdm9pZCBsYW1iZGEkZ2V0QWRkQnV0dG9uQ2xpY2tMaXN0ZW5lciQzKGFuZHJvaWQudmlldy5WaWV3KTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkdyaWRTaGVldE1lZGlhdG9yJFJlc2V0SGFuZGxlciBtUmVzZXRIYW5kbGVyOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFibW9kZWwuVGFiTW9kZWxPYnNlcnZlciBtVGFiTW9kZWxPYnNlcnZlcjsKLSAgdm9pZCBsYW1iZGEkbmV3JDEoYW5kcm9pZC5jb250ZW50LnJlcy5Db2xvclN0YXRlTGlzdCwgYm9vbGVhbik7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5UaGVtZUNvbG9yUHJvdmlkZXIkVGhlbWVDb2xvck9ic2VydmVyIG1UaGVtZUNvbG9yT2JzZXJ2ZXI7Ci0gIHZvaWQgbGFtYmRhJG5ldyQwKGludCwgYm9vbGVhbik7Ci0gIHZvaWQgb25SZXNldChvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiR3JpZFNoZWV0Q29udGVudCk7Ci0gIHZvaWQgbGFtYmRhJGdldENvbGxhcHNlQnV0dG9uQ2xpY2tMaXN0ZW5lciQyKGFuZHJvaWQudmlldy5WaWV3KTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLndpZGdldC5ib3R0b21zaGVldC5Cb3R0b21TaGVldCRCb3R0b21TaGVldENvbnRlbnQgZ2V0Q3VycmVudFNoZWV0Q29udGVudCgpOwotICBib29sZWFuICRhc3NlcnRpb25zRGlzYWJsZWQ7Ci0gIHZvaWQgc2V0dXBUb29sYmFyQ2xpY2tIYW5kbGVycygpOwotICBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBtQ29udGV4dDsKLSAgYW5kcm9pZC52aWV3LlZpZXckT25DbGlja0xpc3RlbmVyIGdldENvbGxhcHNlQnV0dG9uQ2xpY2tMaXN0ZW5lcigpOwotICB2b2lkIGRlc3Ryb3koKTsKLSAgdm9pZCBzaG93VGFiR3JpZFNoZWV0KG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJHcmlkU2hlZXRDb250ZW50KTsKLSAgdm9pZCB1cGRhdGVCb3R0b21TaGVldCgpOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIud2lkZ2V0LmJvdHRvbXNoZWV0LkJvdHRvbVNoZWV0Q29udHJvbGxlciBtQm90dG9tU2hlZXRDb250cm9sbGVyOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuVGhlbWVDb2xvclByb3ZpZGVyIG1UaGVtZUNvbG9yUHJvdmlkZXI7Ci0gIHZvaWQgYWNjZXNzJDAwMChvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiR3JpZFNoZWV0TWVkaWF0b3IpOwotICBvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5TW9kZWwgbU1vZGVsOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIud2lkZ2V0LmJvdHRvbXNoZWV0LkJvdHRvbVNoZWV0T2JzZXJ2ZXIgbVNoZWV0T2JzZXJ2ZXI7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5UaGVtZUNvbG9yUHJvdmlkZXIkVGludE9ic2VydmVyIG1UaW50T2JzZXJ2ZXI7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWJtb2RlbC5UYWJNb2RlbFNlbGVjdG9yIG1UYWJNb2RlbFNlbGVjdG9yOwotICB2b2lkIGhpZGVUYWJHcmlkU2hlZXQoKTsKLX0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkdyaWRTaGVldFByb3BlcnRpZXMgewotICBvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5TW9kZWwkV3JpdGFibGVPYmplY3RQcm9wZXJ0eUtleSBTQ1JJTVZJRVdfT0JTRVJWRVI7Ci0gIG9yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuUHJvcGVydHlNb2RlbCRXcml0YWJsZUludFByb3BlcnR5S2V5IFBSSU1BUllfQ09MT1I7Ci0gIG9yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuUHJvcGVydHlNb2RlbCRXcml0YWJsZU9iamVjdFByb3BlcnR5S2V5IFRJTlQ7Ci0gIG9yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuUHJvcGVydHlNb2RlbCRXcml0YWJsZU9iamVjdFByb3BlcnR5S2V5IEFERF9DTElDS19MSVNURU5FUjsKLSAgb3JnLmNocm9taXVtLnVpLm1vZGVsdXRpbC5Qcm9wZXJ0eU1vZGVsJFdyaXRhYmxlSW50UHJvcGVydHlLZXkgQ09OVEVOVF9UT1BfTUFSR0lOOwotICBvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5TW9kZWwkV3JpdGFibGVCb29sZWFuUHJvcGVydHlLZXkgSVNfRElBTE9HX1ZJU0lCTEU7Ci0gIG9yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuUHJvcGVydHlLZXlbXSBBTExfS0VZUzsKLSAgb3JnLmNocm9taXVtLnVpLm1vZGVsdXRpbC5Qcm9wZXJ0eU1vZGVsJFdyaXRhYmxlT2JqZWN0UHJvcGVydHlLZXkgQ09MTEFQU0VfQ0xJQ0tfTElTVEVORVI7Ci0gIG9yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuUHJvcGVydHlNb2RlbCRXcml0YWJsZU9iamVjdFByb3BlcnR5S2V5IEhFQURFUl9USVRMRTsKLX0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkdyaWRTaGVldFRvb2xiYXJDb29yZGluYXRvciB7Ci0gIGFuZHJvaWQudmlldy5WaWV3IGdldFZpZXcoKTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkdyb3VwVWlUb29sYmFyVmlldyBtVG9vbGJhclZpZXc7Ci0gIG9yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuUHJvcGVydHlNb2RlbENoYW5nZVByb2Nlc3NvciBtTW9kZWxDaGFuZ2VQcm9jZXNzb3I7Ci0gIHZvaWQgZGVzdHJveSgpOwotfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiR3JpZFNoZWV0Vmlld0JpbmRlciB7Ci0gIHZvaWQgYmluZChvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5TW9kZWwsIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJHcmlkU2hlZXRWaWV3QmluZGVyJFZpZXdIb2xkZXIsIG9yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuUHJvcGVydHlLZXkpOwotfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiR3JpZFZpZXdCaW5kZXIgewotICB2b2lkIGxhbWJkYSRvbkJpbmRWaWV3SG9sZGVyJDMob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkxpc3RNZWRpYXRvciRUYWJBY3Rpb25MaXN0ZW5lciwgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkdyaWRWaWV3SG9sZGVyLCBhbmRyb2lkLnZpZXcuVmlldyk7Ci0gIHZvaWQgbGFtYmRhJG9uQmluZFZpZXdIb2xkZXIkMihvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiR3JpZFZpZXdIb2xkZXIsIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwKTsKLSAgdm9pZCBsYW1iZGEkb25CaW5kVmlld0hvbGRlciQwKG9yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuUHJvcGVydHlNb2RlbCwgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkdyaWRWaWV3SG9sZGVyLCBhbmRyb2lkLnZpZXcuVmlldyk7Ci0gIHZvaWQgbGFtYmRhJG9uQmluZFZpZXdIb2xkZXIkMShvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5TW9kZWwsIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJHcmlkVmlld0hvbGRlciwgYW5kcm9pZC52aWV3LlZpZXcpOwotICB2b2lkIG9uQmluZFZpZXdIb2xkZXIob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkdyaWRWaWV3SG9sZGVyLCBvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5TW9kZWwpOwotICB2b2lkIG9uQmluZFZpZXdIb2xkZXIob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkdyaWRWaWV3SG9sZGVyLCBvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5TW9kZWwsIG9yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuUHJvcGVydHlLZXkpOwotfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiR3JpZFZpZXdIb2xkZXIgewotICBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXcgZmF2aWNvbjsKLSAgaW50IGdldFRhYklkKCk7Ci0gIG9yZy5jaHJvbWl1bS51aS53aWRnZXQuQnV0dG9uQ29tcGF0IGNyZWF0ZUdyb3VwQnV0dG9uOwotICBhbmRyb2lkLndpZGdldC5UZXh0VmlldyB0aXRsZTsKLSAgYW5kcm9pZC52aWV3LlZpZXcgYmFja2dyb3VuZFZpZXc7Ci0gIGFuZHJvaWQudmlldy5WaWV3IGl0ZW1WaWV3OwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiR3JpZFZpZXdIb2xkZXIgY3JlYXRlKGFuZHJvaWQudmlldy5WaWV3R3JvdXAsIGludCk7Ci0gIHZvaWQgc2V0VGFiSWQoaW50KTsKLSAgaW50IG1UYWJJZDsKLSAgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlIHNDbG9zZUJ1dHRvbkJpdG1hcFdlYWtSZWY7Ci0gIHZvaWQgcmVzZXRUaHVtYm5haWwoKTsKLSAgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3IHRodW1ibmFpbDsKLSAgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3IGNsb3NlQnV0dG9uOwotfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiR3JvdXBVaUNvb3JkaW5hdG9yIHsKLSAgb3JnLmNocm9taXVtLnVpLm1vZGVsdXRpbC5Qcm9wZXJ0eU1vZGVsIG1UYWJTdHJpcFRvb2xiYXJNb2RlbDsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLlRoZW1lQ29sb3JQcm92aWRlciBtVGhlbWVDb2xvclByb3ZpZGVyOwotICBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBtQ29udGV4dDsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkdyb3VwVWlNZWRpYXRvciBtTWVkaWF0b3I7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5DaHJvbWVBY3Rpdml0eSBtQWN0aXZpdHk7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJHcmlkU2hlZXRDb29yZGluYXRvciBtVGFiR3JpZFNoZWV0Q29vcmRpbmF0b3I7Ci0gIHZvaWQgcmVjb3JkU2Vzc2lvbkNvdW50KCk7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5saWZlY3ljbGUuQWN0aXZpdHlMaWZlY3ljbGVEaXNwYXRjaGVyIG1BY3Rpdml0eUxpZmVjeWNsZURpc3BhdGNoZXI7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJMaXN0Q29vcmRpbmF0b3IgbVRhYlN0cmlwQ29vcmRpbmF0b3I7Ci0gIGJvb2xlYW4gJGFzc2VydGlvbnNEaXNhYmxlZDsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYlN0cmlwVG9vbGJhckNvb3JkaW5hdG9yIG1UYWJTdHJpcFRvb2xiYXJDb29yZGluYXRvcjsKLX0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkdyb3VwVWlNZWRpYXRvciB7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5jb21wb3NpdG9yLmxheW91dHMuT3ZlcnZpZXdNb2RlQmVoYXZpb3IgbU92ZXJ2aWV3TW9kZUJlaGF2aW9yOwotICBib29sZWFuIG1Jc1RhYkdyb3VwVWlWaXNpYmxlOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFibW9kZWwuVGFiTW9kZWxTZWxlY3RvclRhYk9ic2VydmVyIG1UYWJNb2RlbFNlbGVjdG9yVGFiT2JzZXJ2ZXI7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWJtb2RlbC5UYWJNb2RlbFNlbGVjdG9yIGFjY2VzcyQ0MDAob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkdyb3VwVWlNZWRpYXRvcik7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJHcm91cFVpTWVkaWF0b3IkUmVzZXRIYW5kbGVyIGFjY2VzcyQ1MDAob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkdyb3VwVWlNZWRpYXRvcik7Ci0gIGphdmEudXRpbC5MaXN0IGdldFJlbGF0ZWRUYWJzRm9ySWQoaW50KTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLmNvbXBvc2l0b3IubGF5b3V0cy5PdmVydmlld01vZGVCZWhhdmlvciRPdmVydmlld01vZGVPYnNlcnZlciBtT3ZlcnZpZXdNb2RlT2JzZXJ2ZXI7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWJtb2RlbC5UYWJNb2RlbFNlbGVjdG9yT2JzZXJ2ZXIgbVRhYk1vZGVsU2VsZWN0b3JPYnNlcnZlcjsKLSAgYm9vbGVhbiBhY2Nlc3MkMTAwKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJHcm91cFVpTWVkaWF0b3IpOwotICBvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5TW9kZWwgbVRvb2xiYXJQcm9wZXJ0eU1vZGVsOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuVGhlbWVDb2xvclByb3ZpZGVyJFRoZW1lQ29sb3JPYnNlcnZlciBtVGhlbWVDb2xvck9ic2VydmVyOwotICB2b2lkIGxhbWJkYSRzZXR1cFRvb2xiYXJDbGlja0hhbmRsZXJzJDMoYW5kcm9pZC52aWV3LlZpZXcpOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuVGhlbWVDb2xvclByb3ZpZGVyIG1UaGVtZUNvbG9yUHJvdmlkZXI7Ci0gIHZvaWQgbGFtYmRhJHNldHVwVG9vbGJhckNsaWNrSGFuZGxlcnMkMihhbmRyb2lkLnZpZXcuVmlldyk7Ci0gIHZvaWQgc2V0dXBUb29sYmFyQ2xpY2tIYW5kbGVycygpOwotICB2b2lkIGxhbWJkYSRuZXckMShhbmRyb2lkLmNvbnRlbnQucmVzLkNvbG9yU3RhdGVMaXN0LCBib29sZWFuKTsKLSAgdm9pZCByZXNldFRhYlN0cmlwV2l0aFJlbGF0ZWRUYWJzRm9ySWQoaW50KTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRvb2xiYXIuYm90dG9tLkJvdHRvbUNvbnRyb2xzQ29vcmRpbmF0b3IkQm90dG9tQ29udHJvbHNWaXNpYmlsaXR5Q29udHJvbGxlciBtVmlzaWJpbGl0eUNvbnRyb2xsZXI7Ci0gIHZvaWQgZGVzdHJveSgpOwotICBib29sZWFuICRhc3NlcnRpb25zRGlzYWJsZWQ7Ci0gIHZvaWQgbGFtYmRhJG5ldyQwKGludCwgYm9vbGVhbik7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWJtb2RlbC5UYWJNb2RlbE9ic2VydmVyIG1UYWJNb2RlbE9ic2VydmVyOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuVGhlbWVDb2xvclByb3ZpZGVyJFRpbnRPYnNlcnZlciBtVGludE9ic2VydmVyOwotICB2b2lkIGFjY2VzcyQzMDAob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkdyb3VwVWlNZWRpYXRvciwgaW50KTsKLSAgYm9vbGVhbiBtSXNDbG9zaW5nQUdyb3VwOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFibW9kZWwuVGFiQ3JlYXRvck1hbmFnZXIgbVRhYkNyZWF0b3JNYW5hZ2VyOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiR3JvdXBVaU1lZGlhdG9yJFJlc2V0SGFuZGxlciBtUmVzZXRIYW5kbGVyOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFibW9kZWwuVGFiTW9kZWxTZWxlY3RvciBtVGFiTW9kZWxTZWxlY3RvcjsKLSAgYm9vbGVhbiBhY2Nlc3MkMTAyKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJHcm91cFVpTWVkaWF0b3IsIGJvb2xlYW4pOwotICBqYXZhLnV0aWwuTGlzdCBhY2Nlc3MkMjAwKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJHcm91cFVpTWVkaWF0b3IsIGludCk7Ci0gIGJvb2xlYW4gYWNjZXNzJDAwMChvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiR3JvdXBVaU1lZGlhdG9yKTsKLX0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkdyb3VwVWlUb29sYmFyVmlldyB7Ci0gIGFuZHJvaWQudmlldy5WaWV3IG1NYWluQ29udGVudDsKLSAgdm9pZCBzZXRUaW50KGFuZHJvaWQuY29udGVudC5yZXMuQ29sb3JTdGF0ZUxpc3QpOwotICBhbmRyb2lkLnZpZXcuVmlld0dyb3VwIG1Db250YWluZXJWaWV3OwotICBvcmcuY2hyb21pdW0udWkud2lkZ2V0LkNocm9tZUltYWdlVmlldyBtTGVmdEJ1dHRvbjsKLSAgdm9pZCBzZXRNYWluQ29udGVudFZpc2liaWxpdHkoYm9vbGVhbik7Ci0gIHZvaWQgc2V0VGl0bGUoamF2YS5sYW5nLlN0cmluZyk7Ci0gIG9yZy5jaHJvbWl1bS51aS53aWRnZXQuQ2hyb21lSW1hZ2VWaWV3IG1SaWdodEJ1dHRvbjsKLSAgYW5kcm9pZC52aWV3LlZpZXcgZmluZFZpZXdCeUlkKGludCk7Ci0gIGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3IG1UaXRsZVRleHRWaWV3OwotICB2b2lkIHNldExlZnRCdXR0b25PbkNsaWNrTGlzdGVuZXIoYW5kcm9pZC52aWV3LlZpZXckT25DbGlja0xpc3RlbmVyKTsKLSAgYW5kcm9pZC52aWV3LlZpZXdHcm91cCBnZXRWaWV3Q29udGFpbmVyKCk7Ci0gIHZvaWQgc2V0UmlnaHRCdXR0b25PbkNsaWNrTGlzdGVuZXIoYW5kcm9pZC52aWV3LlZpZXckT25DbGlja0xpc3RlbmVyKTsKLSAgdm9pZCBzZXRQcmltYXJ5Q29sb3IoaW50KTsKLX0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkdyb3VwVWlUb29sYmFyVmlld0JpbmRlciB7Ci0gIHZvaWQgYmluZChvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5TW9kZWwsIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJHcm91cFVpVG9vbGJhclZpZXcsIG9yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuUHJvcGVydHlLZXkpOwotfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiTGlzdENvbnRhaW5lclByb3BlcnRpZXMgewotICBvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5TW9kZWwkV3JpdGFibGVJbnRQcm9wZXJ0eUtleSBUT1BfUEFERElORzsKLSAgb3JnLmNocm9taXVtLnVpLm1vZGVsdXRpbC5Qcm9wZXJ0eU1vZGVsJFdyaXRhYmxlT2JqZWN0UHJvcGVydHlLZXkgVklTSUJJTElUWV9MSVNURU5FUjsKLSAgb3JnLmNocm9taXVtLnVpLm1vZGVsdXRpbC5Qcm9wZXJ0eU1vZGVsJFdyaXRhYmxlSW50UHJvcGVydHlLZXkgSU5JVElBTF9TQ1JPTExfSU5ERVg7Ci0gIG9yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuUHJvcGVydHlNb2RlbCRXcml0YWJsZUJvb2xlYW5Qcm9wZXJ0eUtleSBBTklNQVRFX1ZJU0lCSUxJVFlfQ0hBTkdFUzsKLSAgb3JnLmNocm9taXVtLnVpLm1vZGVsdXRpbC5Qcm9wZXJ0eUtleVtdIEFMTF9LRVlTOwotICBvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5TW9kZWwkV3JpdGFibGVJbnRQcm9wZXJ0eUtleSBCT1RUT01fQ09OVFJPTFNfSEVJR0hUOwotICBvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5TW9kZWwkV3JpdGFibGVCb29sZWFuUHJvcGVydHlLZXkgSVNfSU5DT0dOSVRPOwotICBvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5TW9kZWwkV3JpdGFibGVCb29sZWFuUHJvcGVydHlLZXkgSVNfVklTSUJMRTsKLSAgb3JnLmNocm9taXVtLnVpLm1vZGVsdXRpbC5Qcm9wZXJ0eU1vZGVsJFdyaXRhYmxlSW50UHJvcGVydHlLZXkgVE9QX0NPTlRST0xTX0hFSUdIVDsKLX0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkxpc3RDb29yZGluYXRvciB7Ci0gIHZvaWQgdXBkYXRlVGh1bWJuYWlsTG9jYXRpb24oKTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYm1vZGVsLlRhYk1vZGVsU2VsZWN0b3IgbVRhYk1vZGVsU2VsZWN0b3I7Ci0gIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCBtVGh1bWJuYWlsTG9jYXRpb25PZkN1cnJlbnRUYWI7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJMaXN0TWVkaWF0b3IgbU1lZGlhdG9yOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiTGlzdFJlY3ljbGVyVmlldyBtUmVjeWNsZXJWaWV3OwotICBpbnQgZ2V0UmVzb3VyY2VJZCgpOwotICBhbmRyb2lkLmdyYXBoaWNzLlJlY3QgZ2V0VGh1bWJuYWlsTG9jYXRpb25PZkN1cnJlbnRUYWIoKTsKLSAgaW50IG1Nb2RlOwotICB2b2lkIGRlc3Ryb3koKTsKLSAgb3JnLmNocm9taXVtLnVpLm1vZGVsdXRpbC5TaW1wbGVSZWN5Y2xlclZpZXdNY3BCYXNlIG1Nb2RlbENoYW5nZVByb2Nlc3NvcjsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkxpc3RSZWN5Y2xlclZpZXcgZ2V0Q29udGFpbmVyVmlldygpOwotICB2b2lkIHJlc2V0V2l0aExpc3RPZlRhYnMoamF2YS51dGlsLkxpc3QpOwotICB2b2lkIHByZXBhcmVPdmVydmlldygpOwotfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiTGlzdEZhdmljb25Qcm92aWRlciB7Ci0gIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgZ2V0RGVmYXVsdEZhdmljb25EcmF3YWJsZSgpOwotICBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIGdldEZhdmljb25Gb3JVcmxTeW5jKGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4sIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwKTsKLSAgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBzUm91bmRlZEdsb2JlRHJhd2FibGU7Ci0gIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgcHJvY2Vzc0JpdG1hcChhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCk7Ci0gIGludCBtRmF2aWNvblNpemU7Ci0gIHZvaWQgbGFtYmRhJGdldEZhdmljb25Gb3JVcmxBc3luYyQwKG9yZy5jaHJvbWl1bS5iYXNlLkNhbGxiYWNrLCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCwgamF2YS5sYW5nLlN0cmluZyk7Ci0gIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgc1JvdW5kZWRDaHJvbWVEcmF3YWJsZTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnByb2ZpbGVzLlByb2ZpbGUgbVByb2ZpbGU7Ci0gIHZvaWQgZ2V0RmF2aWNvbkZvclVybEFzeW5jKGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4sIG9yZy5jaHJvbWl1bS5iYXNlLkNhbGxiYWNrKTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLmZhdmljb24uRmF2aWNvbkhlbHBlciBtRmF2aWNvbkhlbHBlcjsKLX0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkxpc3RNZWRpYXRvciB7Ci0gIHZvaWQgYWRkVGFiSW5mb1RvTW9kZWwob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYi5UYWIsIGludCwgYm9vbGVhbik7Ci0gIGJvb2xlYW4gaXNWYWxpZE1vdmVQb3NpdGlvbihpbnQpOwotICBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50Q2FsbGJhY2tzIG1Db21wb25lbnRDYWxsYmFja3M7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJMaXN0RmF2aWNvblByb3ZpZGVyIG1UYWJMaXN0RmF2aWNvblByb3ZpZGVyOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiTGlzdE1lZGlhdG9yJEdyaWRDYXJkT25DbGlja0xpc3RlbmVyUHJvdmlkZXIgbUdyaWRDYXJkT25DbGlja0xpc3RlbmVyUHJvdmlkZXI7Ci0gIGJvb2xlYW4gbVNob3duSVBIOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiTGlzdE1lZGlhdG9yJFRhYkFjdGlvbkxpc3RlbmVyIGFjY2VzcyQxMzAwKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJMaXN0TWVkaWF0b3IpOwotICBqYXZhLnV0aWwuTWFwIGFjY2VzcyQ4MDAoKTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYm1vZGVsLlRhYk1vZGVsU2VsZWN0b3IgYWNjZXNzJDEwMChvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiTGlzdE1lZGlhdG9yKTsKLSAgYm9vbGVhbiBhY2Nlc3MkNjAwKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJMaXN0TWVkaWF0b3IpOwotICBqYXZhLnV0aWwuTGlzdCBhY2Nlc3MkMTAwMChvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiTGlzdE1lZGlhdG9yLCBpbnQpOwotICB2b2lkIGFjY2VzcyQ5MDAob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkxpc3RNZWRpYXRvciwgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYi5UYWIsIGludCwgaW50KTsKLSAgdm9pZCByZWdpc3Rlck9yaWVudGF0aW9uTGlzdGVuZXIoYW5kcm9pZC5zdXBwb3J0LnY3LndpZGdldC5HcmlkTGF5b3V0TWFuYWdlcik7Ci0gIGphdmEubGFuZy5TdHJpbmcgbUNvbXBvbmVudE5hbWU7Ci0gIGJvb2xlYW4gbUNsb3NlQWxsUmVsYXRlZFRhYnM7Ci0gIGphdmEubGFuZy5TdHJpbmcgYWNjZXNzJDIwMChvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiTGlzdE1lZGlhdG9yKTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkxpc3RNZWRpYXRvciRUaXRsZVByb3ZpZGVyIG1UaXRsZVByb3ZpZGVyOwotICBhbmRyb2lkLnN1cHBvcnQudjcud2lkZ2V0LmhlbHBlci5JdGVtVG91Y2hIZWxwZXIkU2ltcGxlQ2FsbGJhY2sgZ2V0SXRlbVRvdWNoSGVscGVyQ2FsbGJhY2soZmxvYXQpOwotICB2b2lkIGFjY2VzcyQ3MDAob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkxpc3RNZWRpYXRvciwgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYi5UYWIsIGJvb2xlYW4pOwotICB2b2lkIG9uVGFiQ2xvc2VkRnJvbShpbnQsIGphdmEubGFuZy5TdHJpbmcpOwotICBib29sZWFuIGFjY2VzcyQwMDIob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkxpc3RNZWRpYXRvciwgYm9vbGVhbik7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJMaXN0TWVkaWF0b3IkSXBoUHJvdmlkZXIgbUlwaFByb3ZpZGVyOwotICBqYXZhLnV0aWwuTWFwIHNUYWJDbG9zZWRGcm9tTWFwVGFiQ2xvc2VkRnJvbU1hcDsKLSAgdm9pZCBvblRhYkFkZGVkKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWIuVGFiLCBib29sZWFuKTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYi5UYWJPYnNlcnZlciBtVGFiT2JzZXJ2ZXI7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJMaXN0TWVkaWF0b3IkQ3JlYXRlR3JvdXBCdXR0b25Qcm92aWRlciBtQ3JlYXRlR3JvdXBCdXR0b25Qcm92aWRlcjsKLSAgamF2YS51dGlsLkxpc3QgZ2V0UmVsYXRlZFRhYnNGb3JJZChpbnQpOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiTGlzdEZhdmljb25Qcm92aWRlciBhY2Nlc3MkNDAwKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJMaXN0TWVkaWF0b3IpOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiTGlzdE1lZGlhdG9yJFRhYkFjdGlvbkxpc3RlbmVyIG1UYWJTZWxlY3RlZExpc3RlbmVyOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiTGlzdE1lZGlhdG9yJFRhYkFjdGlvbkxpc3RlbmVyIG1UYWJDbG9zZWRMaXN0ZW5lcjsKLSAgdm9pZCByZXNldFdpdGhMaXN0T2ZUYWJzKGphdmEudXRpbC5MaXN0KTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYm1vZGVsLlRhYk1vZGVsU2VsZWN0b3IgbVRhYk1vZGVsU2VsZWN0b3I7Ci0gIGJvb2xlYW4gYWNjZXNzJDAwMChvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiTGlzdE1lZGlhdG9yKTsKLSAgdm9pZCBsYW1iZGEkYWRkVGFiSW5mb1RvTW9kZWwkMChvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFiLlRhYiwgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSk7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJMaXN0TWVkaWF0b3IkVGh1bWJuYWlsUHJvdmlkZXIgbVRodW1ibmFpbFByb3ZpZGVyOwotICB2b2lkIG9uR3JvdXBDbG9zZWRGcm9tKGludCk7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJMaXN0TW9kZWwgbU1vZGVsOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFibW9kZWwuVGFiTW9kZWxPYnNlcnZlciBtVGFiTW9kZWxPYnNlcnZlcjsKLSAgdm9pZCBvblRhYk1vdmVkKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWIuVGFiLCBpbnQsIGludCk7Ci0gIHZvaWQgYWNjZXNzJDEyMDAob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkxpc3RNZWRpYXRvciwgaW50LCBqYXZhLmxhbmcuU3RyaW5nKTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkxpc3RNb2RlbCBhY2Nlc3MkMzAwKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJMaXN0TWVkaWF0b3IpOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiTGlzdE1lZGlhdG9yJFRpdGxlUHJvdmlkZXIgYWNjZXNzJDUwMChvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiTGlzdE1lZGlhdG9yKTsKLSAgdm9pZCBhY2Nlc3MkMTEwMChvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiTGlzdE1lZGlhdG9yLCBpbnQpOwotICB2b2lkIGRlc3Ryb3koKTsKLX0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkxpc3RNb2RlbCB7Ci0gIHZvaWQgYWRkKGludCwgb3JnLmNocm9taXVtLnVpLm1vZGVsdXRpbC5Qcm9wZXJ0eU9ic2VydmFibGUpOwotICBpbnQgc2l6ZSgpOwotICB2b2lkIGFkZChvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5T2JzZXJ2YWJsZSk7Ci0gIGphdmEubGFuZy5PYmplY3QgZ2V0KGludCk7Ci0gIG9yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuUHJvcGVydHlPYnNlcnZhYmxlIHJlbW92ZUF0KGludCk7Ci0gIHZvaWQgc2V0KGphdmEudXRpbC5Db2xsZWN0aW9uKTsKLSAgaW50IGluZGV4RnJvbUlkKGludCk7Ci0gIHZvaWQgbW92ZShpbnQsIGludCk7Ci19Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJMaXN0UmVjeWNsZXJWaWV3IHsKLSAgaW50IGdldElkKCk7Ci0gIGxvbmcgYWNjZXNzJDIwMChvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiTGlzdFJlY3ljbGVyVmlldyk7Ci0gIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCBnZXRSZWN0T2ZDdXJyZW50VGh1bWJuYWlsKGludCk7Ci0gIHZvaWQgc2V0SGFzRml4ZWRTaXplKGJvb2xlYW4pOwotICBhbmRyb2lkLmFuaW1hdGlvbi5WYWx1ZUFuaW1hdG9yIG1GYWRlSW5BbmltYXRvcjsKLSAgaW50IGdldFBhZGRpbmdMZWZ0KCk7Ci0gIGludCBnZXRQYWRkaW5nQm90dG9tKCk7Ci0gIHZvaWQgZW5kQWxsQW5pbWF0aW9ucygpOwotICBsb25nIG1PcmlnaW5hbEFkZER1cmF0aW9uOwotICBpbnQgZ2V0UmVzb3VyY2VJZCgpOwotICBvcmcuY2hyb21pdW0udWkucmVzb3VyY2VzLmR5bmFtaWNzLlZpZXdSZXNvdXJjZUFkYXB0ZXIgYWNjZXNzJDMwMChvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiTGlzdFJlY3ljbGVyVmlldyk7Ci0gIG9yZy5jaHJvbWl1bS51aS5yZXNvdXJjZXMuZHluYW1pY3MuVmlld1Jlc291cmNlQWRhcHRlciBtRHluYW1pY1ZpZXc7Ci0gIGludCBjb21wdXRlVmVydGljYWxTY3JvbGxPZmZzZXQoKTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkxpc3RSZWN5Y2xlclZpZXckVmlzaWJpbGl0eUxpc3RlbmVyIG1MaXN0ZW5lcjsKLSAgdm9pZCBzdGFydFNob3dpbmcoYm9vbGVhbik7Ci0gIGFuZHJvaWQuYW5pbWF0aW9uLlZhbHVlQW5pbWF0b3IgYWNjZXNzJDAwMihvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiTGlzdFJlY3ljbGVyVmlldywgYW5kcm9pZC5hbmltYXRpb24uVmFsdWVBbmltYXRvcik7Ci0gIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKGludCk7Ci0gIHZvaWQgc2V0QWxwaGEoZmxvYXQpOwotICB2b2lkIHNldFZpc2liaWxpdHlMaXN0ZW5lcihvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiTGlzdFJlY3ljbGVyVmlldyRWaXNpYmlsaXR5TGlzdGVuZXIpOwotICBhbmRyb2lkLmFuaW1hdGlvbi5WYWx1ZUFuaW1hdG9yIG1GYWRlT3V0QW5pbWF0b3I7Ci0gIHZvaWQgc2V0VmlzaWJpbGl0eShpbnQpOwotICBhbmRyb2lkLnZpZXcuVmlld1RyZWVPYnNlcnZlciBnZXRWaWV3VHJlZU9ic2VydmVyKCk7Ci0gIHZvaWQgc2V0UGFkZGluZyhpbnQsIGludCwgaW50LCBpbnQpOwotICBhbmRyb2lkLnN1cHBvcnQudjcud2lkZ2V0LlJlY3ljbGVyVmlldyRMYXlvdXRNYW5hZ2VyIGdldExheW91dE1hbmFnZXIoKTsKLSAgYm9vbGVhbiAkYXNzZXJ0aW9uc0Rpc2FibGVkOwotICB2b2lkIGNyZWF0ZUR5bmFtaWNWaWV3KG9yZy5jaHJvbWl1bS51aS5yZXNvdXJjZXMuZHluYW1pY3MuRHluYW1pY1Jlc291cmNlTG9hZGVyKTsKLSAgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMgZ2V0UmVzb3VyY2VzKCk7Ci0gIGFuZHJvaWQuYW5pbWF0aW9uLlZhbHVlQW5pbWF0b3IgYWNjZXNzJDQwMihvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiTGlzdFJlY3ljbGVyVmlldywgYW5kcm9pZC5hbmltYXRpb24uVmFsdWVBbmltYXRvcik7Ci0gIHZvaWQgcHJlcGFyZU92ZXJ2aWV3KCk7Ci0gIHZvaWQgc2V0QWRhcHRlcihhbmRyb2lkLnN1cHBvcnQudjcud2lkZ2V0LlJlY3ljbGVyVmlldyRBZGFwdGVyKTsKLSAgYW5kcm9pZC5zdXBwb3J0LnY3LndpZGdldC5SZWN5Y2xlclZpZXckSXRlbUFuaW1hdG9yIGdldEl0ZW1BbmltYXRvcigpOwotICB2b2lkIHJlcXVlc3RMYXlvdXQoKTsKLSAgYW5kcm9pZC52aWV3LlZpZXdHcm91cCRMYXlvdXRQYXJhbXMgZ2V0TGF5b3V0UGFyYW1zKCk7Ci0gIGFuZHJvaWQuc3VwcG9ydC52Ny53aWRnZXQuUmVjeWNsZXJWaWV3JFZpZXdIb2xkZXIgZmluZFZpZXdIb2xkZXJGb3JBZGFwdGVyUG9zaXRpb24oaW50KTsKLSAgdm9pZCBzZXRMYXlvdXRNYW5hZ2VyKGFuZHJvaWQuc3VwcG9ydC52Ny53aWRnZXQuUmVjeWNsZXJWaWV3JExheW91dE1hbmFnZXIpOwotICB2b2lkIGdldExvY2F0aW9uSW5XaW5kb3coaW50W10pOwotICB2b2lkIHN0YXJ0SGlkaW5nKGJvb2xlYW4pOwotICBpbnQgZ2V0UGFkZGluZ1JpZ2h0KCk7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJMaXN0UmVjeWNsZXJWaWV3JFZpc2liaWxpdHlMaXN0ZW5lciBhY2Nlc3MkMTAwKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJMaXN0UmVjeWNsZXJWaWV3KTsKLX0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYlByb3BlcnRpZXMgewotICBvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5TW9kZWwkUmVhZGFibGVJbnRQcm9wZXJ0eUtleSBUQUJfSUQ7Ci0gIG9yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuUHJvcGVydHlNb2RlbCRXcml0YWJsZU9iamVjdFByb3BlcnR5S2V5IElQSF9QUk9WSURFUjsKLSAgb3JnLmNocm9taXVtLnVpLm1vZGVsdXRpbC5Qcm9wZXJ0eU1vZGVsJFdyaXRhYmxlT2JqZWN0UHJvcGVydHlLZXkgQ1JFQVRFX0dST1VQX0xJU1RFTkVSOwotICBvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5TW9kZWwkV3JpdGFibGVPYmplY3RQcm9wZXJ0eUtleSBUQUJfU0VMRUNURURfTElTVEVORVI7Ci0gIG9yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuUHJvcGVydHlLZXlbXSBBTExfS0VZU19UQUJfR1JJRDsKLSAgb3JnLmNocm9taXVtLnVpLm1vZGVsdXRpbC5Qcm9wZXJ0eUtleVtdIEFMTF9LRVlTX1RBQl9TVFJJUDsKLSAgb3JnLmNocm9taXVtLnVpLm1vZGVsdXRpbC5Qcm9wZXJ0eU1vZGVsJFdyaXRhYmxlT2JqZWN0UHJvcGVydHlLZXkgRkFWSUNPTjsKLSAgb3JnLmNocm9taXVtLnVpLm1vZGVsdXRpbC5Qcm9wZXJ0eU1vZGVsJFdyaXRhYmxlQm9vbGVhblByb3BlcnR5S2V5IElTX1NFTEVDVEVEOwotICBvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5TW9kZWwkV3JpdGFibGVPYmplY3RQcm9wZXJ0eUtleSBUSVRMRTsKLSAgb3JnLmNocm9taXVtLnVpLm1vZGVsdXRpbC5Qcm9wZXJ0eU1vZGVsJFdyaXRhYmxlT2JqZWN0UHJvcGVydHlLZXkgVEFCX0NMT1NFRF9MSVNURU5FUjsKLSAgb3JnLmNocm9taXVtLnVpLm1vZGVsdXRpbC5Qcm9wZXJ0eU1vZGVsJFdyaXRhYmxlT2JqZWN0UHJvcGVydHlLZXkgVEhVTUJOQUlMX0ZFVENIRVI7Ci0gIG9yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuUHJvcGVydHlNb2RlbCRXcml0YWJsZUZsb2F0UHJvcGVydHlLZXkgQUxQSEE7Ci19Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJTdHJpcFRvb2xiYXJDb29yZGluYXRvciB7Ci0gIGFuZHJvaWQudmlldy5WaWV3R3JvdXAgZ2V0VGFiTGlzdENvbnRhaW5lclZpZXcoKTsKLSAgb3JnLmNocm9taXVtLnVpLm1vZGVsdXRpbC5Qcm9wZXJ0eU1vZGVsIG1Nb2RlbDsKLSAgb3JnLmNocm9taXVtLnVpLm1vZGVsdXRpbC5Qcm9wZXJ0eU1vZGVsQ2hhbmdlUHJvY2Vzc29yIG1Nb2RlbENoYW5nZVByb2Nlc3NvcjsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYkdyb3VwVWlUb29sYmFyVmlldyBtVG9vbGJhclZpZXc7Ci19Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJTdHJpcFRvb2xiYXJWaWV3UHJvcGVydGllcyB7Ci0gIG9yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuUHJvcGVydHlNb2RlbCRXcml0YWJsZUludFByb3BlcnR5S2V5IFBSSU1BUllfQ09MT1I7Ci0gIG9yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuUHJvcGVydHlNb2RlbCRXcml0YWJsZU9iamVjdFByb3BlcnR5S2V5IEFERF9DTElDS19MSVNURU5FUjsKLSAgb3JnLmNocm9taXVtLnVpLm1vZGVsdXRpbC5Qcm9wZXJ0eU1vZGVsJFdyaXRhYmxlT2JqZWN0UHJvcGVydHlLZXkgVElOVDsKLSAgb3JnLmNocm9taXVtLnVpLm1vZGVsdXRpbC5Qcm9wZXJ0eUtleVtdIEFMTF9LRVlTOwotICBvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5TW9kZWwkV3JpdGFibGVPYmplY3RQcm9wZXJ0eUtleSBFWFBBTkRfQ0xJQ0tfTElTVEVORVI7Ci0gIG9yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuUHJvcGVydHlNb2RlbCRXcml0YWJsZUJvb2xlYW5Qcm9wZXJ0eUtleSBJU19NQUlOX0NPTlRFTlRfVklTSUJMRTsKLX0KLQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYlN0cmlwVmlld0JpbmRlciB7Ci0gIHZvaWQgbGFtYmRhJG9uQmluZFZpZXdIb2xkZXIkMShvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5TW9kZWwsIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJTdHJpcFZpZXdIb2xkZXIsIGFuZHJvaWQudmlldy5WaWV3KTsKLSAgdm9pZCBsYW1iZGEkb25CaW5kVmlld0hvbGRlciQwKG9yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuUHJvcGVydHlNb2RlbCwgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYlN0cmlwVmlld0hvbGRlciwgYW5kcm9pZC52aWV3LlZpZXcpOwotICB2b2lkIG9uQmluZFZpZXdIb2xkZXIob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhc2tzLnRhYl9tYW5hZ2VtZW50LlRhYlN0cmlwVmlld0hvbGRlciwgb3JnLmNocm9taXVtLnVpLm1vZGVsdXRpbC5Qcm9wZXJ0eU1vZGVsLCBvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5S2V5KTsKLSAgdm9pZCBvbkJpbmRWaWV3SG9sZGVyKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJTdHJpcFZpZXdIb2xkZXIsIG9yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuUHJvcGVydHlNb2RlbCk7Ci19Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YXNrcy50YWJfbWFuYWdlbWVudC5UYWJTdHJpcFZpZXdIb2xkZXIgewotICBhbmRyb2lkLndpZGdldC5JbWFnZUJ1dHRvbiBidXR0b247Ci0gIGludCBtVGFiSWQ7Ci0gIGFuZHJvaWQudmlldy5WaWV3IGl0ZW1WaWV3OwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiX21hbmFnZW1lbnQuVGFiU3RyaXBWaWV3SG9sZGVyIGNyZWF0ZShhbmRyb2lkLnZpZXcuVmlld0dyb3VwLCBpbnQpOwotICB2b2lkIHNldFRhYklkKGludCk7Ci0gIGludCBnZXRUYWJJZCgpOwotfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFza3MudGFiZ3JvdXAuVGFiR3JvdXBNb2RlbEZpbHRlciB7Ci0gIGludCBpbmRleE9mKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWIuVGFiKTsKLSAgaW50IGdldFRhYkdyb3VwQ291bnQoKTsKLSAgdm9pZCByZWNvcmRTZXNzaW9uc0NvdW50KG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWIuVGFiKTsKLSAgdm9pZCBtb3ZlUmVsYXRlZFRhYnMoaW50LCBpbnQpOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFiLlRhYiBnZXRUYWJBdChpbnQpOwotfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudXRpbC5Db2xvclV0aWxzIHsKLSAgaW50IGdldFByaW1hcnlCYWNrZ3JvdW5kQ29sb3IoYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMsIGJvb2xlYW4pOwotfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudXRpbC5GZWF0dXJlVXRpbGl0aWVzIHsKLSAgYm9vbGVhbiBpc1RhYkdyb3Vwc0FuZHJvaWRFbmFibGVkKCk7Ci0gIGJvb2xlYW4gaXNUYWJHcm91cHNBbmRyb2lkVWlJbXByb3ZlbWVudHNFbmFibGVkKCk7Ci19Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci51dGlsLlZpZXdVdGlscyB7Ci0gIGFuZHJvaWQuc3VwcG9ydC52NC5ncmFwaGljcy5kcmF3YWJsZS5Sb3VuZGVkQml0bWFwRHJhd2FibGUgY3JlYXRlUm91bmRlZEJpdG1hcERyYXdhYmxlKGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwLCBpbnQpOwotICBpbnQgREVGQVVMVF9GQVZJQ09OX0NPUk5FUl9SQURJVVM7Ci19Ci0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci53aWRnZXQuYm90dG9tc2hlZXQuQm90dG9tU2hlZXQgewotICB2b2lkIGFkZE9ic2VydmVyKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci53aWRnZXQuYm90dG9tc2hlZXQuQm90dG9tU2hlZXRPYnNlcnZlcik7Ci0gIHZvaWQgcmVtb3ZlT2JzZXJ2ZXIob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLndpZGdldC5ib3R0b21zaGVldC5Cb3R0b21TaGVldE9ic2VydmVyKTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLndpZGdldC5ib3R0b21zaGVldC5Cb3R0b21TaGVldCRCb3R0b21TaGVldENvbnRlbnQgZ2V0Q3VycmVudFNoZWV0Q29udGVudCgpOwotfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY29udGVudF9wdWJsaWMuYnJvd3Nlci5OYXZpZ2F0aW9uSGFuZGxlIHsKLSAgYm9vbGVhbiBpc1NhbWVEb2N1bWVudCgpOwotICBib29sZWFuIGlzVmFsaWRTZWFyY2hGb3JtVXJsKCk7Ci0gIGJvb2xlYW4gaXNJbk1haW5GcmFtZSgpOwotICBqYXZhLmxhbmcuSW50ZWdlciBwYWdlVHJhbnNpdGlvbigpOwotfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0uY29udGVudF9wdWJsaWMuYnJvd3Nlci5VaVRocmVhZFRhc2tUcmFpdHMgewotICBvcmcuY2hyb21pdW0uYmFzZS50YXNrLlRhc2tUcmFpdHMgVVNFUl9WSVNJQkxFOwotfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0udWkuaW50ZXJwb2xhdG9ycy5CYWtlZEJlemllckludGVycG9sYXRvciB7Ci0gIG9yZy5jaHJvbWl1bS51aS5pbnRlcnBvbGF0b3JzLkJha2VkQmV6aWVySW50ZXJwb2xhdG9yIEZBREVfSU5fQ1VSVkU7Ci0gIG9yZy5jaHJvbWl1bS51aS5pbnRlcnBvbGF0b3JzLkJha2VkQmV6aWVySW50ZXJwb2xhdG9yIEZBREVfT1VUX0NVUlZFOwotfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5TW9kZWxDaGFuZ2VQcm9jZXNzb3IgewotICB2b2lkIGRlc3Ryb3koKTsKLSAgb3JnLmNocm9taXVtLnVpLm1vZGVsdXRpbC5Qcm9wZXJ0eU1vZGVsQ2hhbmdlUHJvY2Vzc29yIGNyZWF0ZShvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5T2JzZXJ2YWJsZSwgamF2YS5sYW5nLk9iamVjdCwgb3JnLmNocm9taXVtLnVpLm1vZGVsdXRpbC5Qcm9wZXJ0eU1vZGVsQ2hhbmdlUHJvY2Vzc29yJFZpZXdCaW5kZXIpOwotfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0udWkud2lkZ2V0LkJ1dHRvbkNvbXBhdCB7Ci0gIHZvaWQgc2V0VmlzaWJpbGl0eShpbnQpOwotICB2b2lkIHNldE9uQ2xpY2tMaXN0ZW5lcihhbmRyb2lkLnZpZXcuVmlldyRPbkNsaWNrTGlzdGVuZXIpOwotfQotCi0ta2VlcCBjbGFzcyBvcmcuY2hyb21pdW0udWkud2lkZ2V0LkNocm9tZUltYWdlVmlldyB7Ci0gIHZvaWQgc2V0T25DbGlja0xpc3RlbmVyKGFuZHJvaWQudmlldy5WaWV3JE9uQ2xpY2tMaXN0ZW5lcik7Ci19Ci0KLS1rZWVwIGNsYXNzIG9yZy5qc29uLkpTT05PYmplY3QgewotICBqYXZhLmxhbmcuT2JqZWN0IE5VTEw7Ci19Ci0KZGlmZiAtLWdpdCBhL2Nocm9tZS9hbmRyb2lkL2ZlYXR1cmVzL3RhYl91aS9wcm9ndWFyZF9hc3luY19tYW51YWwuZmxhZ3MgYi9jaHJvbWUvYW5kcm9pZC9mZWF0dXJlcy90YWJfdWkvcHJvZ3VhcmRfYXN5bmNfbWFudWFsLmZsYWdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTRlZTY1Li4wMDAwMDAwCi0tLSBhL2Nocm9tZS9hbmRyb2lkL2ZlYXR1cmVzL3RhYl91aS9wcm9ndWFyZF9hc3luY19tYW51YWwuZmxhZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIENvcHlyaWdodCAyMDE5IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0jIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSMgUnVsZXMgYWRkZWQgbWFudWFsbHkgZHVlIHRvIHR5cGVzCi0jICAgMSkgdXNlZCBhbmQgaW5jbHVkZWQgaW4gWE1MIGZpbGVzIChpZS4gbGF5b3V0KSwKLSMgICAyKSBkeW5hbWljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyIChpZS4gbGFtYmRhKSwgYW5kCi0jICAgMykgdHlwZXMgbm90IGN1cnJlbnRseSBiZWluZyBpbmNsdWRlZCBpbiBvdXIgY29uc3RhbnQgcG9vbCBkZXBzLgotCi0ta2VlcCBjbGFzcyBhbmRyb2lkLnN1cHBvcnQudjQuZ3JhcGhpY3MuZHJhd2FibGUuUm91bmRlZEJpdG1hcERyYXdhYmxlIHsgKjsgfQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLnVpLndpZGdldC5Sb3VuZGVkQ29ybmVySW1hZ2VWaWV3IHsgKjsgfQotLWtlZXAgY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLmZ1bGxzY3JlZW4uQ2hyb21lRnVsbHNjcmVlbk1hbmFnZXIkRnVsbHNjcmVlbkxpc3RlbmVyJCRDQyB7ICo7IH0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci53aWRnZXQuYm90dG9tc2hlZXQuQm90dG9tU2hlZXQkQm90dG9tU2hlZXRDb250ZW50JCRDQyB7ICo7IH0KLS1rZWVwIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5jb21wb3NpdG9yLmxheW91dHMuT3ZlcnZpZXdNb2RlQ29udHJvbGxlciB7ICo7IH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jaHJvbWUvYW5kcm9pZC9mZWF0dXJlcy90YWJfdWkvdGFiX3VpX21vZHVsZS5nbmkgYi9jaHJvbWUvYW5kcm9pZC9mZWF0dXJlcy90YWJfdWkvdGFiX3VpX21vZHVsZS5nbmkKaW5kZXggYzNiNjFlZC4uZTE1MzIzNCAxMDA2NDQKLS0tIGEvY2hyb21lL2FuZHJvaWQvZmVhdHVyZXMvdGFiX3VpL3RhYl91aV9tb2R1bGUuZ25pCisrKyBiL2Nocm9tZS9hbmRyb2lkL2ZlYXR1cmVzL3RhYl91aS90YWJfdWlfbW9kdWxlLmduaQpAQCAtOCw1ICs4LDQgQEAKICAgbmFtZSA9ICJ0YWJfdWkiCiAgIGphdmFfZGVwcyA9IFsgIi8vY2hyb21lL2FuZHJvaWQvZmVhdHVyZXMvdGFiX3VpOmphdmEiIF0KICAgYW5kcm9pZF9tYW5pZmVzdCA9ICIvL2Nocm9tZS9hbmRyb2lkL2ZlYXR1cmVzL3RhYl91aS9BbmRyb2lkTWFuaWZlc3QueG1sIgotICBwcm9ndWFyZF9hc3luYyA9IGFzeW5jX3RhYl91aQogfQpkaWZmIC0tZ2l0IGEvY2hyb21lL2FuZHJvaWQvZmVhdHVyZXMvdnIvQlVJTEQuZ24gYi9jaHJvbWUvYW5kcm9pZC9mZWF0dXJlcy92ci9CVUlMRC5nbgppbmRleCBjMzhjYmMyLi5mZWFiYjQzNCAxMDA2NDQKLS0tIGEvY2hyb21lL2FuZHJvaWQvZmVhdHVyZXMvdnIvQlVJTEQuZ24KKysrIGIvY2hyb21lL2FuZHJvaWQvZmVhdHVyZXMvdnIvQlVJTEQuZ24KQEAgLTEzNCw5ICsxMzQsNiBAQAogICAgICIvL3VpL2FuZHJvaWQ6dWlfdXRpbHNfamF2YSIsCiAgIF0KIAotICBpZiAoYXN5bmNfdnIpIHsKLSAgICBwcm9ndWFyZF9jb25maWdzID0gWyAiLy9iYXNlL2FuZHJvaWQvcHJvZ3VhcmQvY2hyb21pdW1fY29kZS5mbGFncyIgXQotICB9CiAgIGFubm90YXRpb25fcHJvY2Vzc29yX2RlcHMgPSBbICIvL2Jhc2UvYW5kcm9pZC9qbmlfZ2VuZXJhdG9yOmpuaV9wcm9jZXNzb3IiIF0KIH0KIApkaWZmIC0tZ2l0IGEvY2hyb21lL2FuZHJvaWQvZmVhdHVyZXMvdnIvcHJvZ3VhcmRfYXN5bmMuZmxhZ3MgYi9jaHJvbWUvYW5kcm9pZC9mZWF0dXJlcy92ci9wcm9ndWFyZF9hc3luYy5mbGFncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTliNWZhMS4uMDAwMDAwMAotLS0gYS9jaHJvbWUvYW5kcm9pZC9mZWF0dXJlcy92ci9wcm9ndWFyZF9hc3luYy5mbGFncworKysgL2Rldi9udWxsCkBAIC0xLDY4MTMgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAxOSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotIyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jIENvbnRhaW5zIGZsYWdzIG5lY2Vzc2FyeSB0byBrZWVwIHRoZSBWUiBtb2R1bGUgY29tcGF0aWJsZSB3aXRoIGJhc2Ugd2hlbiBWUgotIyBpcyBzcGVjaWZpZWQgYXMgYW4gYXN5bmMgREZNICh3aGVuIHRoZSBWUiBtb2R1bGUgaXMgcHJvZ3VhcmRlZCBzZXBhcmF0ZWx5KS4KLSMgVGhpcyBmbGFncyBmaWxlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZGVwZW5kZW5jaWVzIG9mIEphdmEgY2xhc3NlcyBpbgotIyB0aGUgVlIgbW9kdWxlLCBwcm9kdWNlZCBieSByZWFkaW5nIGZyb20gdGhlaXIgY29uc3RhbnQgcG9vbHMuIEl0Ci0jIGludGVudGlvbmFsbHkga2VlcHMgYWxsIG1lbWJlcnMgZnJvbSB0aGVzZSBkZXBlbmRlbmNpZXMgdG8gZW5zdXJlCi0jIGNvbXBhdGliaWxpdHkgYmV0d2VlbiB0aGUgYXN5bmMgVlIgbW9kdWxlIGFuZCBiYXNlLgotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUuZGV2dG9vbHMuYnVpbGQuYW5kcm9pZC5kZXN1Z2FyLnJ1bnRpbWUuVGhyb3dhYmxlRXh0ZW5zaW9uJEFic3RyYWN0RGVzdWdhcmluZ1N0cmF0ZWd5IHsgKjsgfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5FeHRlbmRhYmxlTWVzc2FnZU5hbm8geyAqOyB9Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkV4dGVuc2lvbiB7ICo7IH0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uTWVzc2FnZU5hbm8geyAqOyB9Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuRGlzcGxheVN5bmNocm9uaXplciB7ICo7IH0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5FZ2xSZWFkeUxpc3RlbmVyJEV2ZW50TGlzdGVuZXIgeyAqOyB9Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuRXh0ZXJuYWxTdXJmYWNlTWFuYWdlciRFeHRlcm5hbFN1cmZhY2VDYWxsYmFjayB7ICo7IH0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5FeHRlcm5hbFN1cmZhY2VNYW5hZ2VyJFVwZGF0ZVN1cmZhY2VDYWxsYmFjayB7ICo7IH0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5WclBhcmFtc1Byb3ZpZGVyIHsgKjsgfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIuaW50ZXJuYWwuY29udHJvbGxlci5Db250cm9sbGVyU2VydmljZUJyaWRnZSRDYWxsYmFja3MgeyAqOyB9Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5rZXlib2FyZC5JR3ZyS2V5Ym9hcmRMb2FkZXIgeyAqOyB9Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5BYnN0cmFjdERheWRyZWFtVG91Y2hMaXN0ZW5lciB7ICo7IH0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2ckFwaSRJZGxlTGlzdGVuZXIgeyAqOyB9Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJMYXlvdXQgeyAqOyB9Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJTdXJmYWNlVmlldyB7ICo7IH0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2clN1cmZhY2VWaWV3JEJhc2VDb25maWdDaG9vc2VyIHsgKjsgfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyU3VyZmFjZVZpZXckQ29tcG9uZW50U2l6ZUNob29zZXIgeyAqOyB9Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5zZGsuY29tbW9uLmRlcHMuYSB7ICo7IH0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnNkay5jb21tb24uZGVwcy5iIHsgKjsgfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLmJhc2UuYXBpLlBhcmNlbGFibGVQcm90byB7ICo7IH0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb21tb24uYXBpLklEYXlkcmVhbUxpc3RlbmVyIHsgKjsgfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbW1vbi5hcGkuSURheWRyZWFtTGlzdGVuZXIkU3R1YiB7ICo7IH0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb21tb24uYXBpLklEYXlkcmVhbU1hbmFnZXIgeyAqOyB9Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci52cmNvcmUuY29tbW9uLmFwaS5JVHJhbnNpdGlvbkNhbGxiYWNrcyB7ICo7IH0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb21tb24uYXBpLklUcmFuc2l0aW9uQ2FsbGJhY2tzJFN0dWIgeyAqOyB9Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci52cmNvcmUuY29tbW9uLmFwaS5JVnJDb3JlU2RrU2VydmljZSB7ICo7IH0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5Db250cm9sbGVyRXZlbnQgeyAqOyB9Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuQ29udHJvbGxlckV2ZW50UGFja2V0IHsgKjsgfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLklDb250cm9sbGVyTGlzdGVuZXIgeyAqOyB9Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuSUNvbnRyb2xsZXJMaXN0ZW5lciRTdHViIHsgKjsgfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLklDb250cm9sbGVyU2VydmljZSB7ICo7IH0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5JQ29udHJvbGxlclNlcnZpY2VMaXN0ZW5lciB7ICo7IH0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5JQ29udHJvbGxlclNlcnZpY2VMaXN0ZW5lciRTdHViIHsgKjsgfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLmxpYnJhcnkuYXBpLklHdnJMYXlvdXQgeyAqOyB9Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci52cmNvcmUubGlicmFyeS5hcGkuSUd2ckxheW91dCRTdHViIHsgKjsgfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLmxpYnJhcnkuYXBpLklHdnJVaUxheW91dCB7ICo7IH0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnZyY29yZS5saWJyYXJ5LmFwaS5JR3ZyVWlMYXlvdXQkU3R1YiB7ICo7IH0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnZyY29yZS5saWJyYXJ5LmFwaS5JT2JqZWN0V3JhcHBlciB7ICo7IH0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnZyY29yZS5saWJyYXJ5LmFwaS5JT2JqZWN0V3JhcHBlciRTdHViIHsgKjsgfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLmxpYnJhcnkuYXBpLklWckNyZWF0b3IgeyAqOyB9Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci52cmNvcmUubGlicmFyeS5hcGkuSVZyTmF0aXZlTGlicmFyeUxvYWRlciB7ICo7IH0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnZyY29yZS5sb2dnaW5nLmFwaS5JVnJDb3JlTG9nZ2luZ1NlcnZpY2UgeyAqOyB9Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci52cmNvcmUucGVyZm9ybWFuY2UuYXBpLklQZXJmb3JtYW5jZVNlcnZpY2UgeyAqOyB9Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci52cmNvcmUucGVyZm9ybWFuY2UuYXBpLklUaHJvdHRsaW5nVHJpZ2dlckNhbGxiYWNrIHsgKjsgfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLnBlcmZvcm1hbmNlLmFwaS5JVGhyb3R0bGluZ1RyaWdnZXJDYWxsYmFjayRTdHViIHsgKjsgfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5jb25uLnNjaGVtZS5MYXllcmVkU29ja2V0RmFjdG9yeSB7ICo7IH0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuY29ubi5zY2hlbWUuU29ja2V0RmFjdG9yeSB7ICo7IH0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuY29ubi5zc2wuQWJzdHJhY3RWZXJpZmllciB7ICo7IH0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuY29ubi5zc2wuWDUwOUhvc3RuYW1lVmVyaWZpZXIgeyAqOyB9Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5Db3JlQ29ubmVjdGlvblBOYW1lcyB7ICo7IH0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uYmFzZS5BcHBsaWNhdGlvblN0YXR1cyRBY3Rpdml0eVN0YXRlTGlzdGVuZXIgeyAqOyB9Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmJhc2UudGFzay5Bc3luY1Rhc2sgeyAqOyB9Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmJ1aWxkLkJ1aWxkSG9va3NBbmRyb2lkIHsgKjsgfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5jb21wb3NpdG9yLkNvbXBvc2l0b3JTdXJmYWNlTWFuYWdlciB7ICo7IH0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuaW5mb2Jhci5TaW1wbGVDb25maXJtSW5mb0JhckJ1aWxkZXIkTGlzdGVuZXIgeyAqOyB9Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYi5FbXB0eVRhYk9ic2VydmVyIHsgKjsgfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWIuVGFiUmVkaXJlY3RIYW5kbGVyIHsgKjsgfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWJtb2RlbC5FbXB0eVRhYk1vZGVsU2VsZWN0b3JPYnNlcnZlciB7ICo7IH0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFibW9kZWwuVGFiTW9kZWxTZWxlY3RvclRhYk9ic2VydmVyIHsgKjsgfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5FbXB0eVNuaWZmaW5nVnJWaWV3Q29udGFpbmVyJEVtcHR5TGlzdGVuZXIgeyAqOyB9Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLk5vb3BDYW52YXMkTm9vcEV4Y2VwdGlvbiB7ICo7IH0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuT25FeGl0VnJSZXF1ZXN0TGlzdGVuZXIgeyAqOyB9Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyRGVsZWdhdGUgeyAqOyB9Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyRGVsZWdhdGVQcm92aWRlciB7ICo7IH0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJEaWFsb2dNYW5hZ2VyIHsgKjsgfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WckludGVudERlbGVnYXRlIHsgKjsgfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WclRvYXN0TWFuYWdlciB7ICo7IH0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJWaWV3Q29udGFpbmVyIHsgKjsgfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5rZXlib2FyZC5WcklucHV0TWV0aG9kTWFuYWdlcldyYXBwZXIkQnJvd3NlcktleWJvYXJkSW50ZXJmYWNlIHsgKjsgfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jb250ZW50X3B1YmxpYy5icm93c2VyLklucHV0TWV0aG9kTWFuYWdlcldyYXBwZXIgeyAqOyB9Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNvbnRlbnRfcHVibGljLmJyb3dzZXIuU2NyZWVuT3JpZW50YXRpb25EZWxlZ2F0ZSB7ICo7IH0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0udWkuYmFzZS5BbmRyb2lkUGVybWlzc2lvbkRlbGVnYXRlIHsgKjsgfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS51aS5iYXNlLlBlcm1pc3Npb25DYWxsYmFjayB7ICo7IH0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0udWkuYmFzZS5XaW5kb3dBbmRyb2lkIHsgKjsgfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS51aS5tb2RhbGRpYWxvZy5Nb2RhbERpYWxvZ01hbmFnZXIkUHJlc2VudGVyIHsgKjsgfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS51aS5tb2RhbGRpYWxvZy5Nb2RhbERpYWxvZ1Byb3BlcnRpZXMkQ29udHJvbGxlciB7ICo7IH0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0udWkud2lkZ2V0LlVpV2lkZ2V0RmFjdG9yeSB7ICo7IH0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCB7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEV2YSBldmE7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEVhcnRoVnIgZWFydGhWcjsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRXhwZWRpdGlvbnMgZXhwZWRpdGlvbnM7Ci0gIGphdmEubGFuZy5Mb25nIGR1cmF0aW9uTXM7Ci0gIGludCBjaGVja0V2ZW50U291cmNlT3JUaHJvdyhpbnQpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGJvb2xlYW4gc3RvcmVVbmtub3duRmllbGQoY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubywgaW50KTsKLSAgaW50IGNhY2hlZFNpemU7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFZyQ29yZSB2ckNvcmU7Ci0gICA8aW5pdD4oKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkVnJIb21lIHZySG9tZTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkTGF1bmNoZXIgbGF1bmNoZXI7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFJlbmRlcmVyIHJlbmRlcmVyOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRDeWNsb3BzIGN5Y2xvcHM7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFN0YW5kYWxvbmVIZWFkc2V0IHN0YW5kYWxvbmVIZWFkc2V0OwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRKdW1wSW5zcGVjdG9yIGp1bXBJbnNwZWN0b3I7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEdDb25maWdVcGRhdGUgZ0NvbmZpZ1VwZGF0ZTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkUGhvdG9zIHBob3RvczsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyQmFzZU91dGVyQ2xhc3MkVnJCYXNlJEhlYWRNb3VudCBoZWFkTW91bnQ7Ci0gIGludCBjaGVja0J1Y2tldE9yVGhyb3coaW50KTsKLSAgYnl0ZVtdIHRvQnl0ZUFycmF5KGNvbS5nb29nbGUucHJvdG9idWYubmFuby5NZXNzYWdlTmFubyk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEhlYWRUcmFja2luZyBoZWFkVHJhY2tpbmc7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFBob25lQWxpZ25tZW50IHBob25lQWxpZ25tZW50OwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbjsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkUXJDb2RlU2NhbiBxckNvZGVTY2FuOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRTdHJlZXRWaWV3IHN0cmVldFZpZXc7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFNka0NvbmZpZ3VyYXRpb25QYXJhbXMgc2RrQ29uZmlndXJhdGlvbjsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkTHVsbGFieSBsdWxsYWJ5OwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCBjbGVhcigpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRWclN0cmVhbWluZyB2clN0cmVhbWluZzsKLSAgamF2YS5sYW5nLkludGVnZXIgZXZlbnRTb3VyY2U7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEVtYmVkVnJXaWRnZXQgZW1iZWRWcldpZGdldDsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkQXVkaW9TdGF0cyBhdWRpb1N0YXRzOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCBjbG9uZSgpOwotICBqYXZhLmxhbmcuU3RyaW5nIGNvaG9ydDsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkU2Vuc29yU3RhdHMgc2Vuc29yU3RhdHM7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50IHBhcnNlRnJvbShieXRlW10pOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRBcHBsaWNhdGlvbltdIGluc3RhbGxlZFZyQXBwbGljYXRpb25zOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRLZXlib2FyZCBrZXlib2FyZDsKLSAgamF2YS5sYW5nLkludGVnZXIgbGlmZXRpbWVDb3VudEJ1Y2tldDsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkUGVyZm9ybWFuY2VTdGF0cyBwZXJmb3JtYW5jZVN0YXRzOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEFwcGxpY2F0aW9uIHsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkQXBwbGljYXRpb25bXSBlbXB0eUFycmF5KCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEFwcGxpY2F0aW9uIGNsZWFyKCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEFwcGxpY2F0aW9uIGNsb25lKCk7Ci0gIGphdmEubGFuZy5TdHJpbmcgcGFja2FnZU5hbWU7Ci0gIGphdmEubGFuZy5TdHJpbmcgdmVyc2lvbjsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkQXBwbGljYXRpb25bXSBfZW1wdHlBcnJheTsKLSAgIDxpbml0PigpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRBcHBsaWNhdGlvbiBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGludCBjYWNoZWRTaXplOwotICBqYXZhLmxhbmcuU3RyaW5nIG5hbWU7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkQXVkaW9TdGF0cyB7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEF1ZGlvU3RhdHMgY2xvbmUoKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkQXVkaW9TdGF0cyBjbGVhcigpOwotICBqYXZhLmxhbmcuSW50ZWdlciBmcmFtZXNQZXJCdWZmZXI7Ci0gIGludCBjaGVja1JlbmRlcmluZ01vZGVPclRocm93KGludCk7Ci0gICA8aW5pdD4oKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkQXVkaW9TdGF0cyBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIHJlbmRlcmluZ01vZGU7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEhpc3RvZ3JhbUJ1Y2tldFtdIG51bWJlck9mU2ltdWx0YW5lb3VzU291bmRGaWVsZHM7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEhpc3RvZ3JhbUJ1Y2tldFtdIGNwdU1lYXN1cmVtZW50c1BlcmNlbnQ7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEhpc3RvZ3JhbUJ1Y2tldFtdIG51bWJlck9mU2ltdWx0YW5lb3VzU291bmRPYmplY3RzOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRIaXN0b2dyYW1CdWNrZXRbXSByZW5kZXJpbmdUaW1lUGVyQnVmZmVyTWlsbGlzZWNvbmRzOwotICBqYXZhLmxhbmcuSW50ZWdlciBzYW1wbGVSYXRlOwotICBpbnQgY2FjaGVkU2l6ZTsKLSAgYm9vbGVhbiBzdG9yZVVua25vd25GaWVsZChjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vLCBpbnQpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEN5Y2xvcHMgewotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRDeWNsb3BzIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkQ3ljbG9wcyRTaGFyZSBzaGFyZTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkQ3ljbG9wcyBjbGVhcigpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRDeWNsb3BzIGNsb25lKCk7Ci0gICA8aW5pdD4oKTsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkQ3ljbG9wcyRWaWV3IHZpZXc7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEN5Y2xvcHMkQ2FwdHVyZSBjYXB0dXJlOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRDeWNsb3BzJFNoYXJlU3RhcnQgc2hhcmVTdGFydDsKLSAgaW50IGNhY2hlZFNpemU7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkQ3ljbG9wcyRDYXB0dXJlIHsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkQ3ljbG9wcyRDYXB0dXJlIGNsZWFyKCk7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIG91dGNvbWU7Ci0gIGphdmEubGFuZy5Mb25nIGNvbXBvc2l0aW9uVGltZU1zOwotICBqYXZhLmxhbmcuQm9vbGVhbiBjYXB0dXJlV2FybmluZ3M7Ci0gIGludCBjYWNoZWRTaXplOwotICAgPGluaXQ+KCk7Ci0gIGludCBjaGVja091dGNvbWVPclRocm93KGludCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEN5Y2xvcHMkQ2FwdHVyZSBjbG9uZSgpOwotICBqYXZhLmxhbmcuTG9uZyBjYXB0dXJlVGltZU1zOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRDeWNsb3BzJENhcHR1cmUgbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICBqYXZhLmxhbmcuQm9vbGVhbiB3aXRoU291bmQ7Ci0gIGJvb2xlYW4gc3RvcmVVbmtub3duRmllbGQoY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubywgaW50KTsKLSAgamF2YS5sYW5nLkZsb2F0IGFuZ2xlRGVncmVlczsKLSAgamF2YS5sYW5nLkxvbmcgcHJvY2Vzc2luZ1RpbWVNczsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRDeWNsb3BzJFNoYXJlIHsKLSAgaW50IGNoZWNrVHlwZU9yVGhyb3coaW50KTsKLSAgIDxpbml0PigpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRDeWNsb3BzJFNoYXJlIGNsb25lKCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEN5Y2xvcHMkU2hhcmUgY2xlYXIoKTsKLSAgYm9vbGVhbiBzdG9yZVVua25vd25GaWVsZChjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vLCBpbnQpOwotICBqYXZhLmxhbmcuSW50ZWdlciBudW1QaG90b3M7Ci0gIGphdmEubGFuZy5Cb29sZWFuIHdpdGhTb3VuZDsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkQ3ljbG9wcyRTaGFyZSBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGludCBjYWNoZWRTaXplOwotICBqYXZhLmxhbmcuSW50ZWdlciB0eXBlOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEN5Y2xvcHMkU2hhcmVTdGFydCB7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIG9yaWdpblNjcmVlbjsKLSAgIDxpbml0PigpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRDeWNsb3BzJFNoYXJlU3RhcnQgbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRDeWNsb3BzJFNoYXJlU3RhcnQgY2xvbmUoKTsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgaW50IGNhY2hlZFNpemU7Ci0gIGJvb2xlYW4gc3RvcmVVbmtub3duRmllbGQoY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubywgaW50KTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkQ3ljbG9wcyRTaGFyZVN0YXJ0IGNsZWFyKCk7Ci0gIGludCBjaGVja09yaWdpblNjcmVlbk9yVGhyb3coaW50KTsKLSAgamF2YS5sYW5nLkludGVnZXIgbnVtUGhvdG9zOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEN5Y2xvcHMkVmlldyB7Ci0gIGludCBjYWNoZWRTaXplOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRDeWNsb3BzJFZpZXcgY2xlYXIoKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkQ3ljbG9wcyRWaWV3IGNsb25lKCk7Ci0gIGphdmEubGFuZy5Cb29sZWFuIGludGVyYWN0aW9uOwotICBib29sZWFuIHN0b3JlVW5rbm93bkZpZWxkKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8sIGludCk7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIG9yaWVudGF0aW9uOwotICAgPGluaXQ+KCk7Ci0gIGludCBjaGVja09yaWVudGF0aW9uT3JUaHJvdyhpbnQpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRDeWNsb3BzJFZpZXcgbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICBqYXZhLmxhbmcuQm9vbGVhbiB3aXRoU291bmQ7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIG51bVBhbm9zOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JERvdWJsZVByZWNpc2lvblRyYW5zZm9ybSB7Ci0gIGphdmEubGFuZy5Eb3VibGUgdHJhbnNsYXRpb25ZOwotICBqYXZhLmxhbmcuRG91YmxlIHJvdGF0aW9uUXo7Ci0gICA8aW5pdD4oKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRG91YmxlUHJlY2lzaW9uVHJhbnNmb3JtIGNsb25lKCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JERvdWJsZVByZWNpc2lvblRyYW5zZm9ybSBjbGVhcigpOwotICBqYXZhLmxhbmcuRG91YmxlIHJvdGF0aW9uUXg7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JERvdWJsZVByZWNpc2lvblRyYW5zZm9ybSBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGludCBjYWNoZWRTaXplOwotICBqYXZhLmxhbmcuRG91YmxlIHJvdGF0aW9uUXk7Ci0gIGphdmEubGFuZy5Eb3VibGUgdHJhbnNsYXRpb25YOwotICBqYXZhLmxhbmcuRG91YmxlIHRyYW5zbGF0aW9uWjsKLSAgamF2YS5sYW5nLkRvdWJsZSBzY2FsZTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFYXJ0aFZyIHsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRG91YmxlUHJlY2lzaW9uVHJhbnNmb3JtIHN0YXJ0RnJvbUtleWhvbGVUcmFuc2Zvcm07Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEVhcnRoVnIkU3RyZWV0VmlldyBzdHJlZXRWaWV3OwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFYXJ0aFZyJFNlYXJjaCBzZWFyY2g7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEVhcnRoVnIkRW52aXJvbm1lbnQgZW52aXJvbm1lbnQ7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEVhcnRoVnIgY2xvbmUoKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRWFydGhWciRWclNka0Vycm9yW10gZXJyb3JzOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFYXJ0aFZyIGNsZWFyKCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEVhcnRoVnIkVG91ciB0b3VyOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFYXJ0aFZyJFByZWZlcmVuY2VzIHByZWZlcmVuY2VzOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFYXJ0aFZyJFByZWZlcmVuY2VzIHByZWZlcmVuY2VzRGVsdGE7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFRyYW5zZm9ybSBzdGFydEZyb21IZWFkVHJhbnNmb3JtOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFYXJ0aFZyJFR1dG9yaWFsIHR1dG9yaWFsOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFYXJ0aFZyJEFjdG9yW10gYWN0b3JzOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFYXJ0aFZyJENvbnRyb2xsZXJTdGF0ZVtdIGNvbnRyb2xsZXJTdGF0ZXM7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEVhcnRoVnIkU3BsYXNoU2NyZWVuIHNwbGFzaFNjcmVlbjsKLSAgIDxpbml0PigpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFYXJ0aFZyJEFjdGlvbk9yYiBhY3Rpb25PcmI7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEVhcnRoVnIkVmlldyB2aWV3OwotICBpbnQgY2FjaGVkU2l6ZTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRWFydGhWciRBcHBTdGF0ZSBhcHBTdGF0ZTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRWFydGhWciBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEVhcnRoVnIkTWVudSBtZW51OwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEVhcnRoVnIkQWN0aW9uT3JiIHsKLSAgamF2YS5sYW5nLkludGVnZXIgZGlzcGxheU1vZGU7Ci0gICA8aW5pdD4oKTsKLSAgaW50IGNoZWNrRXhwYW5zaW9uU3RhdGVPclRocm93KGludCk7Ci0gIGJvb2xlYW4gc3RvcmVVbmtub3duRmllbGQoY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubywgaW50KTsKLSAgamF2YS5sYW5nLkludGVnZXIgcHJldmlvdXNEaXNwbGF5TW9kZTsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRWFydGhWciRBY3Rpb25PcmIgY2xvbmUoKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRWFydGhWciRBY3Rpb25PcmIgY2xlYXIoKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRWFydGhWciRBY3Rpb25PcmIgbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICBqYXZhLmxhbmcuSW50ZWdlciBwcmV2aW91c0V4cGFuc2lvblN0YXRlOwotICBpbnQgY2FjaGVkU2l6ZTsKLSAgaW50IGNoZWNrRGlzcGxheU1vZGVPclRocm93KGludCk7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIGV4cGFuc2lvblN0YXRlOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEVhcnRoVnIkQWN0b3IgewotICBqYXZhLmxhbmcuSW50ZWdlciB2clNkazsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRWFydGhWciRBY3RvcltdIGVtcHR5QXJyYXkoKTsKLSAgIDxpbml0PigpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFYXJ0aFZyJEFjdG9yIGNsZWFyKCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFRyYW5zZm9ybSBzdGFydEZyb21IZWFkVHJhbnNmb3JtOwotICBpbnQgY2hlY2tWclN5c3RlbVR5cGVPclRocm93KGludCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEVhcnRoVnIkQWN0b3IgbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICBpbnQgY2hlY2tWclNka09yVGhyb3coaW50KTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRWFydGhWciRBY3RvciBjbG9uZSgpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFYXJ0aFZyJEFjdG9yJENvbnRyb2xsZXJTdGF0ZVtdIGNvbnRyb2xsZXJTdGF0ZXM7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIHZyU3lzdGVtVHlwZTsKLSAgYm9vbGVhbiBzdG9yZVVua25vd25GaWVsZChjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vLCBpbnQpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFYXJ0aFZyJEFjdG9yW10gX2VtcHR5QXJyYXk7Ci0gIGludCBjYWNoZWRTaXplOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEVhcnRoVnIkQWN0b3IkQ29udHJvbGxlclN0YXRlIHsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRWFydGhWciRBY3RvciRDb250cm9sbGVyU3RhdGUgY2xlYXIoKTsKLSAgaW50IGNhY2hlZFNpemU7Ci0gIGJvb2xlYW4gc3RvcmVVbmtub3duRmllbGQoY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubywgaW50KTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkVHJhbnNmb3JtIHN0YXJ0RnJvbUNvbnRyb2xsZXJUcmFuc2Zvcm07Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEVhcnRoVnIkQWN0b3IkQ29udHJvbGxlclN0YXRlIGNsb25lKCk7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIHR5cGU7Ci0gIGludCBjaGVja1JvbGVPclRocm93KGludCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEVhcnRoVnIkQWN0b3IkQ29udHJvbGxlclN0YXRlW10gZW1wdHlBcnJheSgpOwotICAgPGluaXQ+KCk7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIHJvbGU7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEVhcnRoVnIkQWN0b3IkQ29udHJvbGxlclN0YXRlW10gX2VtcHR5QXJyYXk7Ci0gIGludCBjaGVja1R5cGVPclRocm93KGludCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEVhcnRoVnIkQWN0b3IkQ29udHJvbGxlclN0YXRlIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFYXJ0aFZyJEFwcFN0YXRlIHsKLSAgaW50IGNhY2hlZFNpemU7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEVhcnRoVnIkQXBwU3RhdGUgY2xlYXIoKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRWFydGhWciRBcHBTdGF0ZSBjbG9uZSgpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFYXJ0aFZyJEFwcFN0YXRlIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgamF2YS5sYW5nLkxvbmcgYXBwTW9kZUlkOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGRBcnJheSB1bmtub3duRmllbGREYXRhOwotICAgPGluaXQ+KCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRWFydGhWciRDb250cm9sbGVyU3RhdGUgewotICAgPGluaXQ+KCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFRyYW5zZm9ybSBzdGFydEZyb21Db250cm9sbGVyVHJhbnNmb3JtOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFYXJ0aFZyJENvbnRyb2xsZXJTdGF0ZSBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGludCBjYWNoZWRTaXplOwotICBib29sZWFuIHN0b3JlVW5rbm93bkZpZWxkKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8sIGludCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEVhcnRoVnIkQ29udHJvbGxlclN0YXRlIGNsb25lKCk7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIHJvbGU7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEVhcnRoVnIkQ29udHJvbGxlclN0YXRlIGNsZWFyKCk7Ci0gIGludCBjaGVja1JvbGVPclRocm93KGludCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEVhcnRoVnIkQ29udHJvbGxlclN0YXRlW10gZW1wdHlBcnJheSgpOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGRBcnJheSB1bmtub3duRmllbGREYXRhOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFYXJ0aFZyJENvbnRyb2xsZXJTdGF0ZVtdIF9lbXB0eUFycmF5OwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEVhcnRoVnIkRW52aXJvbm1lbnQgewotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFYXJ0aFZyJEVudmlyb25tZW50IG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgaW50IGNhY2hlZFNpemU7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEVhcnRoVnIkRW52aXJvbm1lbnQgY2xlYXIoKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkVHJhbnNmb3JtIHN0YXJ0RnJvbUVudmlyb25tZW50VHJhbnNmb3JtOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGRBcnJheSB1bmtub3duRmllbGREYXRhOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFYXJ0aFZyJEVudmlyb25tZW50IGNsb25lKCk7Ci0gICA8aW5pdD4oKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFYXJ0aFZyJEdlb0xvY2F0aW9uIHsKLSAgamF2YS5sYW5nLkRvdWJsZSBhbHRpdHVkZU1ldGVyczsKLSAgIDxpbml0PigpOwotICBqYXZhLmxhbmcuRG91YmxlIGxhdGl0dWRlRGVncmVlczsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRWFydGhWciRHZW9Mb2NhdGlvbiBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGludCBjYWNoZWRTaXplOwotICBqYXZhLmxhbmcuRG91YmxlIGxvbmdpdHVkZURlZ3JlZXM7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEVhcnRoVnIkR2VvTG9jYXRpb24gY2xvbmUoKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRWFydGhWciRHZW9Mb2NhdGlvbiBjbGVhcigpOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGRBcnJheSB1bmtub3duRmllbGREYXRhOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEVhcnRoVnIkTWVudSB7Ci0gICA8aW5pdD4oKTsKLSAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50S2V5OwotICBqYXZhLmxhbmcuSW50ZWdlciBwYWdlSW5kZXg7Ci0gIGludCBjYWNoZWRTaXplOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGRBcnJheSB1bmtub3duRmllbGREYXRhOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFYXJ0aFZyJE1lbnUgY2xvbmUoKTsKLSAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50TmFtZTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRWFydGhWciRNZW51IGNsZWFyKCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEVhcnRoVnIkTWVudSBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGphdmEubGFuZy5TdHJpbmcgY2F0ZWdvcnlOYW1lOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEVhcnRoVnIkUHJlZmVyZW5jZXMgewotICBqYXZhLmxhbmcuSW50ZWdlciBodW1hblNjYWxlTW9kZTsKLSAgamF2YS5sYW5nLkludGVnZXIgY29tZm9ydE1vZGVTdGF0ZTsKLSAgaW50IGNoZWNrU3RhcnRDb25maWd1cmF0aW9uT3JUaHJvdyhpbnQpOwotICBqYXZhLmxhbmcuSW50ZWdlciBzdGFydENvbmZpZ3VyYXRpb247Ci0gICA8aW5pdD4oKTsKLSAgaW50IGNhY2hlZFNpemU7Ci0gIGludCBjaGVja0NvbWZvcnRNb2RlU3RhdGVPclRocm93KGludCk7Ci0gIGludCBjaGVja0xhYmVsc1N0YXRlT3JUaHJvdyhpbnQpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFYXJ0aFZyJFByZWZlcmVuY2VzIGNsZWFyKCk7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIGxhYmVsc1N0YXRlOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGRBcnJheSB1bmtub3duRmllbGREYXRhOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFYXJ0aFZyJFByZWZlcmVuY2VzIGNsb25lKCk7Ci0gIGludCBjaGVja0d1ZXN0TW9kZU9yVGhyb3coaW50KTsKLSAgaW50IGNoZWNrSHVtYW5TY2FsZU1vZGVPclRocm93KGludCk7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIGd1ZXN0TW9kZTsKLSAgYm9vbGVhbiBzdG9yZVVua25vd25GaWVsZChjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vLCBpbnQpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFYXJ0aFZyJFByZWZlcmVuY2VzIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFYXJ0aFZyJFNlYXJjaCB7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGphdmEubGFuZy5TdHJpbmcgdHlwZWRRdWVyeTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRWFydGhWciRTZWFyY2ggY2xvbmUoKTsKLSAgaW50IGNhY2hlZFNpemU7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEVhcnRoVnIkU2VhcmNoIGNsZWFyKCk7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIHNlbGVjdGVkRW50aXR5SW5kZXg7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEVhcnRoVnIkU2VhcmNoIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRWFydGhWciRWaWV3IHNlbGVjdGVkRW50aXR5VmlldzsKLSAgIDxpbml0PigpOwotICBqYXZhLmxhbmcuU3RyaW5nIHNlYXJjaFF1ZXJ5OwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEVhcnRoVnIkU3BsYXNoU2NyZWVuIHsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgamF2YS5sYW5nLkxvbmcgbnVtYmVyT2ZWaWV3UHJlbG9hZHNTdWNjZWVkZWQ7Ci0gIGludCBjYWNoZWRTaXplOwotICBqYXZhLmxhbmcuTG9uZyB2aWV3UHJlbG9hZER1cmF0aW9uTXM7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEVhcnRoVnIkU3BsYXNoU2NyZWVuIGNsZWFyKCk7Ci0gIGphdmEubGFuZy5Mb25nIG51bWJlck9mVmlld1ByZWxvYWRzQXR0ZW1wdGVkOwotICBib29sZWFuIHN0b3JlVW5rbm93bkZpZWxkKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8sIGludCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEVhcnRoVnIkU3BsYXNoU2NyZWVuIGNsb25lKCk7Ci0gIGludCBjaGVja0V4aXRUeXBlT3JUaHJvdyhpbnQpOwotICBqYXZhLmxhbmcuSW50ZWdlciBleGl0VHlwZTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRWFydGhWciRTcGxhc2hTY3JlZW4gbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICAgPGluaXQ+KCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRWFydGhWciRTdHJlZXRWaWV3IHsKLSAgIDxpbml0PigpOwotICBib29sZWFuIHN0b3JlVW5rbm93bkZpZWxkKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8sIGludCk7Ci0gIGludCBjaGVja1N0YXRlT3JUaHJvdyhpbnQpOwotICBpbnQgY2hlY2tQYW5vVHlwZU9yVGhyb3coaW50KTsKLSAgaW50IGNhY2hlZFNpemU7Ci0gIGphdmEubGFuZy5TdHJpbmcgcGFub0lkOwotICBqYXZhLmxhbmcuSW50ZWdlciBwYW5vVHlwZTsKLSAgamF2YS5sYW5nLkludGVnZXIgcGFub0Zyb250ZW5kOwotICBqYXZhLmxhbmcuSW50ZWdlciBwYW5vTmVpZ2hib3JDb3VudDsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRWFydGhWciRTdHJlZXRWaWV3IG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgamF2YS5sYW5nLkJvb2xlYW4gaGFzVXNlckRpc2NvdmVyZWROZWlnaGJvcjsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRWFydGhWciRTdHJlZXRWaWV3IGNsb25lKCk7Ci0gIGludCBjaGVja1Bhbm9Gcm9udGVuZE9yVGhyb3coaW50KTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRWFydGhWciRTdHJlZXRWaWV3IGNsZWFyKCk7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIHByZXZpb3VzU3RhdGU7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIHN0YXRlOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFYXJ0aFZyJEdlb0xvY2F0aW9uIHBhbm9Mb2NhdGlvbjsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFYXJ0aFZyJFRvdXIgewotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFYXJ0aFZyJFRvdXIgY2xvbmUoKTsKLSAgamF2YS5sYW5nLkxvbmcgcGxheWJhY2tNczsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRWFydGhWciRUb3VyIGNsZWFyKCk7Ci0gIGphdmEubGFuZy5TdHJpbmcgbmFtZTsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgaW50IGNhY2hlZFNpemU7Ci0gICA8aW5pdD4oKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRWFydGhWciRUb3VyIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFYXJ0aFZyJFR1dG9yaWFsIHsKLSAgIDxpbml0PigpOwotICBqYXZhLmxhbmcuU3RyaW5nIHN0YWdlTmFtZTsKLSAgamF2YS5sYW5nLkludGVnZXIgc3RhZ2U7Ci0gIGludCBjYWNoZWRTaXplOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGRBcnJheSB1bmtub3duRmllbGREYXRhOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFYXJ0aFZyJFR1dG9yaWFsIGNsb25lKCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEVhcnRoVnIkVHV0b3JpYWwgY2xlYXIoKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRWFydGhWciRUdXRvcmlhbCBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRWFydGhWciRWaWV3IHsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgamF2YS5sYW5nLkxvbmcgc2ltdWxhdGlvblNlY29uZHNTaW5jZUVwb2NoOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFYXJ0aFZyJFZpZXcgbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICBqYXZhLmxhbmcuSW50ZWdlciBtb2RlOwotICBpbnQgY2FjaGVkU2l6ZTsKLSAgamF2YS5sYW5nLkludGVnZXIgZm9yY2VIdW1hblNjYWxlOwotICBqYXZhLmxhbmcuRG91YmxlIGxvZ2ljYWxWaWV3ZXJTY2FsZTsKLSAgaW50IGNoZWNrTW9kZU9yVGhyb3coaW50KTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRG91YmxlUHJlY2lzaW9uVHJhbnNmb3JtIHN0YXJ0RnJvbUtleWhvbGVUcmFuc2Zvcm07Ci0gICA8aW5pdD4oKTsKLSAgaW50IGNoZWNrRm9yY2VIdW1hblNjYWxlT3JUaHJvdyhpbnQpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFYXJ0aFZyJFZpZXcgY2xlYXIoKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRWFydGhWciRWaWV3IGNsb25lKCk7Ci0gIGJvb2xlYW4gc3RvcmVVbmtub3duRmllbGQoY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubywgaW50KTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFYXJ0aFZyJFZyU2RrRXJyb3IgewotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFYXJ0aFZyJFZyU2RrRXJyb3JbXSBfZW1wdHlBcnJheTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRWFydGhWciRWclNka0Vycm9yIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgamF2YS5sYW5nLkludGVnZXIgc2RrRXJyb3JDb2RlOwotICBqYXZhLmxhbmcuSW50ZWdlciBzaHV0ZG93blJlYXNvbjsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRWFydGhWciRWclNka0Vycm9yIGNsZWFyKCk7Ci0gIGludCBjaGVja1NodXRkb3duUmVhc29uT3JUaHJvdyhpbnQpOwotICBqYXZhLmxhbmcuU3RyaW5nIHNka0Z1bmN0aW9uOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFYXJ0aFZyJFZyU2RrRXJyb3JbXSBlbXB0eUFycmF5KCk7Ci0gICA8aW5pdD4oKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRWFydGhWciRWclNka0Vycm9yIGNsb25lKCk7Ci0gIGJvb2xlYW4gc3RvcmVVbmtub3duRmllbGQoY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubywgaW50KTsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgaW50IGNhY2hlZFNpemU7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRW1iZWRWcldpZGdldCB7Ci0gICA8aW5pdD4oKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRW1iZWRWcldpZGdldCRWaWRlbyB2aWRlbzsKLSAgaW50IGNoZWNrU3RlcmVvRm9ybWF0T3JUaHJvdyhpbnQpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFbWJlZFZyV2lkZ2V0JFBhbm8gcGFubzsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRW1iZWRWcldpZGdldCBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIHZpZXdNb2RlOwotICBpbnQgY2FjaGVkU2l6ZTsKLSAgYm9vbGVhbiBzdG9yZVVua25vd25GaWVsZChjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vLCBpbnQpOwotICBpbnQgY2hlY2tWaWV3TW9kZU9yVGhyb3coaW50KTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRW1iZWRWcldpZGdldCBjbG9uZSgpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFbWJlZFZyV2lkZ2V0IGNsZWFyKCk7Ci0gIGphdmEubGFuZy5TdHJpbmcgZXJyb3JNc2c7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRW1iZWRWcldpZGdldCRQYW5vIHsKLSAgamF2YS5sYW5nLkludGVnZXIgd2lkdGhQaXhlbHM7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIHN0ZXJlb0Zvcm1hdDsKLSAgaW50IGNhY2hlZFNpemU7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIGhlaWdodFBpeGVsczsKLSAgIDxpbml0PigpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFbWJlZFZyV2lkZ2V0JFBhbm8gY2xvbmUoKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRW1iZWRWcldpZGdldCRQYW5vIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgYm9vbGVhbiBzdG9yZVVua25vd25GaWVsZChjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vLCBpbnQpOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGRBcnJheSB1bmtub3duRmllbGREYXRhOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFbWJlZFZyV2lkZ2V0JFBhbm8gY2xlYXIoKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFbWJlZFZyV2lkZ2V0JFZpZGVvIHsKLSAgamF2YS5sYW5nLkludGVnZXIgaGVpZ2h0UGl4ZWxzOwotICBqYXZhLmxhbmcuSW50ZWdlciBzdGVyZW9Gb3JtYXQ7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEVtYmVkVnJXaWRnZXQkVmlkZW8gbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGRBcnJheSB1bmtub3duRmllbGREYXRhOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFbWJlZFZyV2lkZ2V0JFZpZGVvIGNsZWFyKCk7Ci0gIGJvb2xlYW4gc3RvcmVVbmtub3duRmllbGQoY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubywgaW50KTsKLSAgaW50IGNhY2hlZFNpemU7Ci0gICA8aW5pdD4oKTsKLSAgamF2YS5sYW5nLkludGVnZXIgd2lkdGhQaXhlbHM7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEVtYmVkVnJXaWRnZXQkVmlkZW8gY2xvbmUoKTsKLSAgamF2YS5sYW5nLkludGVnZXIgdmlkZW9EdXJhdGlvbk1zOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEV2YSB7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEV2YSRDYW1lcmFTdGF0dXMgY2FtZXJhU3RhdHVzOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGRBcnJheSB1bmtub3duRmllbGREYXRhOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFdmEkVmlldyB2aWV3OwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFdmEkQmx1ZXRvb3RoU2Vzc2lvbiBibHVldG9vdGhTZXNzaW9uOwotICBpbnQgY2FjaGVkU2l6ZTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRXZhJEZpbGVUcmFuc2ZlciBmaWxlVHJhbnNmZXI7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEV2YSBjbG9uZSgpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFdmEkQ2FwdHVyZSBjYXB0dXJlOwotICAgPGluaXQ+KCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEV2YSBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEV2YSRDYW1lcmFJbmZvIGNhbWVyYVR5cGU7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEV2YSRQYWlyaW5nIHBhaXJpbmc7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEV2YSBjbGVhcigpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEV2YSRCbHVldG9vdGhTZXNzaW9uIHsKLSAgamF2YS5sYW5nLkludGVnZXIgZmFpbGVkUmVxdWVzdENvdW50OwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFdmEkQmx1ZXRvb3RoU2Vzc2lvbiBjbGVhcigpOwotICBqYXZhLmxhbmcuSW50ZWdlciByZXF1ZXN0Q291bnQ7Ci0gIGphdmEubGFuZy5Mb25nIHJlY2VpdmVkQnl0ZXM7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEV2YSRCbHVldG9vdGhTZXNzaW9uIGNsb25lKCk7Ci0gICA8aW5pdD4oKTsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgamF2YS5sYW5nLkludGVnZXIgc3RhdHVzVXBkYXRlTm90aWZpY2F0aW9uQ291bnQ7Ci0gIGludCBjYWNoZWRTaXplOwotICBqYXZhLmxhbmcuTG9uZyBzZW50Qnl0ZXM7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEV2YSRCbHVldG9vdGhTZXNzaW9uIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgamF2YS5sYW5nLkxvbmcgdG90YWxMYXRlbmN5TXM7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRXZhJENhbWVyYUluZm8gewotICBib29sZWFuIHN0b3JlVW5rbm93bkZpZWxkKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8sIGludCk7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIGNhbWVyYVR5cGU7Ci0gIGphdmEubGFuZy5TdHJpbmcgZmlybXdhcmVWZXJzaW9uOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFdmEkQ2FtZXJhSW5mbyBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGludCBjaGVja0NhbWVyYVR5cGVPclRocm93KGludCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEV2YSRDYW1lcmFJbmZvIGNsZWFyKCk7Ci0gIGludCBjYWNoZWRTaXplOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFdmEkQ2FtZXJhSW5mbyBjbG9uZSgpOwotICAgPGluaXQ+KCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRXZhJENhbWVyYVN0YXR1cyB7Ci0gIGphdmEubGFuZy5Cb29sZWFuIGJhdHRlcnlDaGFyZ2luZzsKLSAgamF2YS5sYW5nLkludGVnZXIgZGV2aWNlVGVtcGVyYXR1cmU7Ci0gIGphdmEubGFuZy5Mb25nIGZyZWVTdG9yYWdlOwotICBqYXZhLmxhbmcuQm9vbGVhbiBwaG9uZVRvQ2FtZXJhV2lmaTsKLSAgaW50IGNhY2hlZFNpemU7Ci0gIGphdmEubGFuZy5Cb29sZWFuIHJlY29yZGluZzsKLSAgIDxpbml0PigpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFdmEkQ2FtZXJhU3RhdHVzIGNsZWFyKCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEV2YSRDYW1lcmFTdGF0dXMgbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGRBcnJheSB1bmtub3duRmllbGREYXRhOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFdmEkQ2FtZXJhU3RhdHVzIGNsb25lKCk7Ci0gIGphdmEubGFuZy5Mb25nIHRvdGFsU3RvcmFnZTsKLSAgamF2YS5sYW5nLkJvb2xlYW4gY29ubmVjdGVkVG9XaWZpOwotICBqYXZhLmxhbmcuSW50ZWdlciBiYXR0ZXJ5UGVyY2VudGFnZTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFdmEkQ2FwdHVyZSB7Ci0gIGJvb2xlYW4gc3RvcmVVbmtub3duRmllbGQoY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubywgaW50KTsKLSAgaW50IGNoZWNrQ2FwdHVyZVR5cGVPclRocm93KGludCk7Ci0gIGludCBjYWNoZWRTaXplOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFdmEkQ2FwdHVyZSBjbG9uZSgpOwotICBqYXZhLmxhbmcuSW50ZWdlciBjYXB0dXJlVHlwZTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRXZhJFJlc29sdXRpb24gcmVzb2x1dGlvbjsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRXZhJENhcHR1cmUgbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFdmEkVmlkZW9JbmZvIHZpZGVvSW5mbzsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRXZhJENhcHR1cmUgY2xlYXIoKTsKLSAgIDxpbml0PigpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEV2YSRGaWxlVHJhbnNmZXIgewotICBqYXZhLmxhbmcuSW50ZWdlciBvdXRjb21lOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFdmEkUmVzb2x1dGlvbiByZXNvbHV0aW9uOwotICBqYXZhLmxhbmcuSW50ZWdlciBmaWxlVHlwZTsKLSAgaW50IGNhY2hlZFNpemU7Ci0gICA8aW5pdD4oKTsKLSAgaW50IGNoZWNrRmlsZVR5cGVPclRocm93KGludCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEV2YSRGaWxlVHJhbnNmZXIgY2xlYXIoKTsKLSAgamF2YS5sYW5nLkludGVnZXIgdHJhbnNmZXJJbnRlcmZhY2U7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEV2YSRWaWRlb0luZm8gdmlkZW9JbmZvOwotICBqYXZhLmxhbmcuTG9uZyB0cmFuc2ZlclRpbWVNczsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRXZhJEZpbGVUcmFuc2ZlciBjbG9uZSgpOwotICBpbnQgY2hlY2tPdXRjb21lT3JUaHJvdyhpbnQpOwotICBpbnQgY2hlY2tUcmFuc2ZlckludGVyZmFjZU9yVGhyb3coaW50KTsKLSAgamF2YS5sYW5nLkxvbmcgZmlsZVNpemU7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEV2YSRGaWxlVHJhbnNmZXIgbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICBib29sZWFuIHN0b3JlVW5rbm93bkZpZWxkKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8sIGludCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRXZhJFBhaXJpbmcgewotICBqYXZhLmxhbmcuTG9uZyBibHVldG9vdGhQYWlyaW5nVGltZU1zOwotICBqYXZhLmxhbmcuTG9uZyBwYWlyaW5nRmxvd1RpbWVNczsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgaW50IGNhY2hlZFNpemU7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIG91dGNvbWU7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEV2YSRQYWlyaW5nIGNsb25lKCk7Ci0gICA8aW5pdD4oKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRXZhJFBhaXJpbmcgbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFdmEkUGFpcmluZyBjbGVhcigpOwotICBpbnQgY2hlY2tPdXRjb21lT3JUaHJvdyhpbnQpOwotICBib29sZWFuIHN0b3JlVW5rbm93bkZpZWxkKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8sIGludCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRXZhJFJlc29sdXRpb24gewotICAgPGluaXQ+KCk7Ci0gIGludCBjYWNoZWRTaXplOwotICBqYXZhLmxhbmcuSW50ZWdlciBoZWlnaHQ7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEV2YSRSZXNvbHV0aW9uIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRXZhJFJlc29sdXRpb24gY2xvbmUoKTsKLSAgamF2YS5sYW5nLkludGVnZXIgd2lkdGg7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEV2YSRSZXNvbHV0aW9uIGNsZWFyKCk7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRXZhJFZpZGVvSW5mbyB7Ci0gICA8aW5pdD4oKTsKLSAgaW50IGNhY2hlZFNpemU7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEV2YSRWaWRlb0luZm8gY2xvbmUoKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRXZhJFZpZGVvSW5mbyBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGphdmEubGFuZy5Mb25nIGR1cmF0aW9uTXM7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIGNvZGVjOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGRBcnJheSB1bmtub3duRmllbGREYXRhOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFdmEkVmlkZW9JbmZvIGNsZWFyKCk7Ci0gIGludCBjaGVja0NvZGVjT3JUaHJvdyhpbnQpOwotICBib29sZWFuIHN0b3JlVW5rbm93bkZpZWxkKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8sIGludCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRXZhJFZpZXcgewotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFdmEkVmlldyBjbG9uZSgpOwotICBpbnQgY2FjaGVkU2l6ZTsKLSAgamF2YS5sYW5nLkludGVnZXIgdmlld1R5cGU7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIG1lZGlhVHlwZTsKLSAgamF2YS5sYW5nLkludGVnZXIgdmlld1NvdXJjZTsKLSAgaW50IGNoZWNrVmlld1NvdXJjZU9yVGhyb3coaW50KTsKLSAgaW50IGNoZWNrTWVkaWFUeXBlT3JUaHJvdyhpbnQpOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGRBcnJheSB1bmtub3duRmllbGREYXRhOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFdmEkVmlldyBjbGVhcigpOwotICBqYXZhLmxhbmcuTG9uZyBsb2FkaW5nVGltZU1zOwotICBpbnQgY2hlY2tWaWV3VHlwZU9yVGhyb3coaW50KTsKLSAgamF2YS5sYW5nLkxvbmcgdmlld2luZ0R1cmF0aW9uTXM7Ci0gICA8aW5pdD4oKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRXZhJFZpZXcgbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICBib29sZWFuIHN0b3JlVW5rbm93bkZpZWxkKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8sIGludCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkRXhwZWRpdGlvbnMgewotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFeHBlZGl0aW9ucyBjbGVhcigpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFeHBlZGl0aW9ucyBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gICA8aW5pdD4oKTsKLSAgaW50IGNhY2hlZFNpemU7Ci0gIGphdmEubGFuZy5TdHJpbmcgY29udGVudElkOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRFeHBlZGl0aW9ucyBjbG9uZSgpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEdDb25maWdVcGRhdGUgewotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRHQ29uZmlnVXBkYXRlIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkR0NvbmZpZ1VwZGF0ZSBjbG9uZSgpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRHQ29uZmlnVXBkYXRlIGNsZWFyKCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEdDb25maWdVcGRhdGUkR0NvbmZpZ1ZhbHVlW10gZ0NvbmZpZ1ZhbHVlOwotICBpbnQgY2FjaGVkU2l6ZTsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgIDxpbml0PigpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEdDb25maWdVcGRhdGUkR0NvbmZpZ1ZhbHVlIHsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkR0NvbmZpZ1VwZGF0ZSRHQ29uZmlnVmFsdWVbXSBfZW1wdHlBcnJheTsKLSAgamF2YS5sYW5nLlN0cmluZyBnQ29uZmlnS2V5OwotICBqYXZhLmxhbmcuU3RyaW5nIHN0cmluZ1ZhbHVlOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRHQ29uZmlnVXBkYXRlJEdDb25maWdWYWx1ZSBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEdDb25maWdVcGRhdGUkR0NvbmZpZ1ZhbHVlIGNsZWFyKCk7Ci0gIGludCBjYWNoZWRTaXplOwotICAgPGluaXQ+KCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEdDb25maWdVcGRhdGUkR0NvbmZpZ1ZhbHVlW10gZW1wdHlBcnJheSgpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRHQ29uZmlnVXBkYXRlJEdDb25maWdWYWx1ZSBjbG9uZSgpOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGRBcnJheSB1bmtub3duRmllbGREYXRhOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEhlYWRUcmFja2luZyB7Ci0gIGphdmEubGFuZy5Mb25nIHNpeERvZkZhbGxiYWNrVGltZXN0YW1wOwotICBpbnQgb25lb2Zfc2FmZXR5X2NvbmZpZ187Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGludCBjYWNoZWRTaXplOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRIZWFkVHJhY2tpbmcgY2xlYXIoKTsKLSAgIDxpbml0PigpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRIZWFkVHJhY2tpbmckU2FmZXR5Q3lsaW5kZXJDb25maWcgc2FmZXR5Q3lsaW5kZXJDb25maWc7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEhlYWRUcmFja2luZyRQZXJpb2RpY1JlcG9ydCBwZXJpb2RpY1JlcG9ydDsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkSGVhZFRyYWNraW5nIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgamF2YS5sYW5nLkludGVnZXIgc2l4RG9mRmFsbGJhY2tSZWFzb247Ci0gIGludCBjaGVja0ZhbGxCYWNrUmVhc29uT3JUaHJvdyhpbnQpOwotICBib29sZWFuIHN0b3JlVW5rbm93bkZpZWxkKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8sIGludCk7Ci0gIGphdmEubGFuZy5GbG9hdCBmbG9vckhlaWdodDsKLSAgamF2YS5sYW5nLkxvbmcgaGVhZFRyYWNraW5nVGltZXN0YW1wOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRIZWFkVHJhY2tpbmcgY2xvbmUoKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRIZWFkVHJhY2tpbmckUGVyaW9kaWNSZXBvcnQgewotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRIZWFkVHJhY2tpbmckUGVyaW9kaWNSZXBvcnQgY2xlYXIoKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkSGVhZFRyYWNraW5nJFBlcmlvZGljUmVwb3J0JFNhZmVSZWdpb25FdmVudFtdIHNhZmVSZWdpb25FdmVudDsKLSAgaW50IGNhY2hlZFNpemU7Ci0gIGphdmEubGFuZy5Mb25nIGVuZFRpbWVzdGFtcE1zOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRIZWFkVHJhY2tpbmckUGVyaW9kaWNSZXBvcnQkUmVjZW50ZXJFdmVudFtdIHJlY2VudGVyRXZlbnQ7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEhlYWRUcmFja2luZyRQZXJpb2RpY1JlcG9ydCBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gICA8aW5pdD4oKTsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgamF2YS5sYW5nLkxvbmcgc3RhcnRUaW1lc3RhbXBNczsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkSGVhZFRyYWNraW5nJFBlcmlvZGljUmVwb3J0IGNsb25lKCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkSGVhZFRyYWNraW5nJFBlcmlvZGljUmVwb3J0JFJlY2VudGVyRXZlbnQgewotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRIZWFkVHJhY2tpbmckUGVyaW9kaWNSZXBvcnQkUmVjZW50ZXJFdmVudFtdIF9lbXB0eUFycmF5OwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRIZWFkVHJhY2tpbmckUGVyaW9kaWNSZXBvcnQkUmVjZW50ZXJFdmVudFtdIGVtcHR5QXJyYXkoKTsKLSAgIDxpbml0PigpOwotICBpbnQgY2FjaGVkU2l6ZTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkSGVhZFRyYWNraW5nJFBlcmlvZGljUmVwb3J0JFJlY2VudGVyRXZlbnQgY2xlYXIoKTsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgamF2YS5sYW5nLkludGVnZXIgdHlwZTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkSGVhZFRyYWNraW5nJFBlcmlvZGljUmVwb3J0JFJlY2VudGVyRXZlbnQgY2xvbmUoKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkSGVhZFRyYWNraW5nJFBlcmlvZGljUmVwb3J0JFJlY2VudGVyRXZlbnQgbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICBqYXZhLmxhbmcuTG9uZyB0aW1lc3RhbXBNczsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRIZWFkVHJhY2tpbmckUGVyaW9kaWNSZXBvcnQkU2FmZVJlZ2lvbkV2ZW50IHsKLSAgIDxpbml0PigpOwotICBmbG9hdFtdIGhyc1F1YXQ7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGludCBjYWNoZWRTaXplOwotICBqYXZhLmxhbmcuTG9uZyB0aW1lc3RhbXBNczsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkSGVhZFRyYWNraW5nJFBlcmlvZGljUmVwb3J0JFNhZmVSZWdpb25FdmVudFtdIGVtcHR5QXJyYXkoKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkSGVhZFRyYWNraW5nJFBlcmlvZGljUmVwb3J0JFNhZmVSZWdpb25FdmVudCBjbGVhcigpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRIZWFkVHJhY2tpbmckUGVyaW9kaWNSZXBvcnQkU2FmZVJlZ2lvbkV2ZW50IGNsb25lKCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEhlYWRUcmFja2luZyRQZXJpb2RpY1JlcG9ydCRTYWZlUmVnaW9uRXZlbnRbXSBfZW1wdHlBcnJheTsKLSAgZmxvYXRbXSBocnNQb3NpdGlvbjsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkSGVhZFRyYWNraW5nJFBlcmlvZGljUmVwb3J0JFNhZmVSZWdpb25FdmVudCBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGphdmEubGFuZy5Cb29sZWFuIGVudGVyZWQ7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkSGVhZFRyYWNraW5nJFNhZmV0eUN5bGluZGVyQ29uZmlnIHsKLSAgamF2YS5sYW5nLkZsb2F0IGV4aXRFdmVudFJhZGl1czsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkSGVhZFRyYWNraW5nJFNhZmV0eUN5bGluZGVyQ29uZmlnIGNsZWFyKCk7Ci0gIGphdmEubGFuZy5GbG9hdCBvdXRlclJhZGl1czsKLSAgaW50IGNhY2hlZFNpemU7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gICA8aW5pdD4oKTsKLSAgZmxvYXRbXSBpbm5lckZvZ0NvbG9yOwotICBqYXZhLmxhbmcuRmxvYXQgY29sbGlzaW9uU3BoZXJlUmFkaXVzOwotICBmbG9hdFtdIG91dGVyRm9nQ29sb3I7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEhlYWRUcmFja2luZyRTYWZldHlDeWxpbmRlckNvbmZpZyBjbG9uZSgpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRIZWFkVHJhY2tpbmckU2FmZXR5Q3lsaW5kZXJDb25maWcgbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICBqYXZhLmxhbmcuRmxvYXQgYW5jaG9yV2FybmluZ0Rpc3RhbmNlOwotICBqYXZhLmxhbmcuRmxvYXQgZW50ZXJFdmVudFJhZGl1czsKLSAgamF2YS5sYW5nLkZsb2F0IGlubmVyUmFkaXVzOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEhpc3RvZ3JhbUJ1Y2tldCB7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEhpc3RvZ3JhbUJ1Y2tldFtdIF9lbXB0eUFycmF5OwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRIaXN0b2dyYW1CdWNrZXQgbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICAgPGluaXQ+KCk7Ci0gIGludCBjYWNoZWRTaXplOwotICBqYXZhLmxhbmcuSW50ZWdlciBjb3VudDsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkSGlzdG9ncmFtQnVja2V0W10gZW1wdHlBcnJheSgpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRIaXN0b2dyYW1CdWNrZXQgY2xlYXIoKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkSGlzdG9ncmFtQnVja2V0IGNsb25lKCk7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIG1pbmltdW1WYWx1ZTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRKdW1wSW5zcGVjdG9yIHsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkSnVtcEluc3BlY3RvciRQbGF5YmFja0RldGFpbHMgcGxheWJhY2tEZXRhaWxzOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRKdW1wSW5zcGVjdG9yJFBpY2tlckRldGFpbHMgcGlja2VyRXZlbnQ7Ci0gIGludCBjYWNoZWRTaXplOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGRBcnJheSB1bmtub3duRmllbGREYXRhOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRKdW1wSW5zcGVjdG9yJE1lZGlhRGV0YWlscyBtZWRpYURldGFpbHM7Ci0gICA8aW5pdD4oKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkSnVtcEluc3BlY3RvciBjbG9uZSgpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRKdW1wSW5zcGVjdG9yIGNsZWFyKCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEp1bXBJbnNwZWN0b3IgbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEp1bXBJbnNwZWN0b3IkQXVkaW9EZXRhaWxzIHsKLSAgamF2YS5sYW5nLkxvbmcgbWVkaWFMZW5ndGhTZWNvbmRzOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRKdW1wSW5zcGVjdG9yJEF1ZGlvRGV0YWlscyBjbGVhcigpOwotICBqYXZhLmxhbmcuSW50ZWdlciBhdWRpb0JpdFJhdGU7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIGF1ZGlvQ29kZWM7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIHNhbXBsZVJhdGU7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGludCBjYWNoZWRTaXplOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRKdW1wSW5zcGVjdG9yJEF1ZGlvRGV0YWlscyBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIGF1ZGlvQ2hhbm5lbENvdW50OwotICBib29sZWFuIHN0b3JlVW5rbm93bkZpZWxkKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8sIGludCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEp1bXBJbnNwZWN0b3IkQXVkaW9EZXRhaWxzIGNsb25lKCk7Ci0gICA8aW5pdD4oKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRKdW1wSW5zcGVjdG9yJEltYWdlRGV0YWlscyB7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEp1bXBJbnNwZWN0b3IkSW1hZ2VEZXRhaWxzIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkSnVtcEluc3BlY3RvciRJbWFnZURldGFpbHMgY2xvbmUoKTsKLSAgaW50IGNhY2hlZFNpemU7Ci0gIGphdmEubGFuZy5Cb29sZWFuIHVzZWRNb25vRmlsZW5hbWU7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEp1bXBJbnNwZWN0b3IkUmVzb2x1dGlvbiByZXNvbHV0aW9uOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRKdW1wSW5zcGVjdG9yJEltYWdlRGV0YWlscyBjbGVhcigpOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGRBcnJheSB1bmtub3duRmllbGREYXRhOwotICAgPGluaXQ+KCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkSnVtcEluc3BlY3RvciRJbWFnZVBsYXliYWNrRGV0YWlscyB7Ci0gIGludCBjYWNoZWRTaXplOwotICBqYXZhLmxhbmcuSW50ZWdlciBwbGF5YmFja01vZGU7Ci0gICA8aW5pdD4oKTsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkSnVtcEluc3BlY3RvciRJbWFnZVBsYXliYWNrRGV0YWlscyBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEp1bXBJbnNwZWN0b3IkSW1hZ2VQbGF5YmFja0RldGFpbHMgY2xlYXIoKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkSnVtcEluc3BlY3RvciRJbWFnZVBsYXliYWNrRGV0YWlscyBjbG9uZSgpOwotICBib29sZWFuIHN0b3JlVW5rbm93bkZpZWxkKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8sIGludCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkSnVtcEluc3BlY3RvciRNZWRpYURldGFpbHMgewotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRKdW1wSW5zcGVjdG9yJE1lZGlhRGV0YWlscyBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGludCBjaGVja0F1ZGlvQ29kZWNPclRocm93KGludCk7Ci0gIGludCBjaGVja1ZpZGVvQ29kZWNPclRocm93KGludCk7Ci0gIGludCBjYWNoZWRTaXplOwotICBqYXZhLmxhbmcuU3RyaW5nIGZpbGVFeHRlbnNpb247Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEp1bXBJbnNwZWN0b3IkSW1hZ2VEZXRhaWxzIGltYWdlRGV0YWlsczsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkSnVtcEluc3BlY3RvciRNZWRpYURldGFpbHMgY2xlYXIoKTsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgIDxpbml0PigpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRKdW1wSW5zcGVjdG9yJFZpZGVvRGV0YWlscyB2aWRlb0RldGFpbHM7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEp1bXBJbnNwZWN0b3IkTWVkaWFEZXRhaWxzIGNsb25lKCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEp1bXBJbnNwZWN0b3IkQXVkaW9EZXRhaWxzIGF1ZGlvRGV0YWlsczsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRKdW1wSW5zcGVjdG9yJFBpY2tlckRldGFpbHMgewotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRKdW1wSW5zcGVjdG9yJFBpY2tlckRldGFpbHMgbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICBpbnQgY2FjaGVkU2l6ZTsKLSAgamF2YS5sYW5nLkludGVnZXIgbnVtYmVyT2ZGaWxlczsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkSnVtcEluc3BlY3RvciRQaWNrZXJEZXRhaWxzIGNsZWFyKCk7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIG51bWJlck9mRm9sZGVyczsKLSAgIDxpbml0PigpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRKdW1wSW5zcGVjdG9yJFBpY2tlckRldGFpbHMgY2xvbmUoKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRKdW1wSW5zcGVjdG9yJFBsYXliYWNrRGV0YWlscyB7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEp1bXBJbnNwZWN0b3IkUGxheWJhY2tEZXRhaWxzIGNsb25lKCk7Ci0gIGludCBjaGVja1BsYXliYWNrTW9kZU9yVGhyb3coaW50KTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkSnVtcEluc3BlY3RvciRQbGF5YmFja0RldGFpbHMgbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRKdW1wSW5zcGVjdG9yJEltYWdlUGxheWJhY2tEZXRhaWxzIGltYWdlUGxheWJhY2s7Ci0gIGludCBjaGVja1BsYXliYWNrRW5naW5lT3JUaHJvdyhpbnQpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRKdW1wSW5zcGVjdG9yJFBsYXliYWNrRGV0YWlscyBjbGVhcigpOwotICBqYXZhLmxhbmcuTG9uZyBwbGF5YmFja0R1cmF0aW9uU2Vjb25kczsKLSAgaW50IGNhY2hlZFNpemU7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIHBsYXliYWNrRW5naW5lOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRKdW1wSW5zcGVjdG9yJFZpZGVvUGxheWJhY2tEZXRhaWxzIHZpZGVvUGxheWJhY2s7Ci0gIGludCBjaGVja1BsYXliYWNrU3RhdGVPclRocm93KGludCk7Ci0gICA8aW5pdD4oKTsKLSAgamF2YS5sYW5nLkludGVnZXIgcGxheWJhY2tTdGF0ZTsKLSAgYm9vbGVhbiBzdG9yZVVua25vd25GaWVsZChjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vLCBpbnQpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEp1bXBJbnNwZWN0b3IkUmVzb2x1dGlvbiB7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEp1bXBJbnNwZWN0b3IkUmVzb2x1dGlvbiBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGludCBjYWNoZWRTaXplOwotICAgPGluaXQ+KCk7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIHdpZHRoOwotICBqYXZhLmxhbmcuSW50ZWdlciBoZWlnaHQ7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEp1bXBJbnNwZWN0b3IkUmVzb2x1dGlvbiBjbGVhcigpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRKdW1wSW5zcGVjdG9yJFJlc29sdXRpb24gY2xvbmUoKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRKdW1wSW5zcGVjdG9yJFNwaGVyaWNhbE1ldGFkYXRhIHsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkSnVtcEluc3BlY3RvciRTcGhlcmljYWxNZXRhZGF0YSBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGludCBjYWNoZWRTaXplOwotICBpbnQgY2hlY2tQcm9qZWN0aW9uVHlwZU9yVGhyb3coaW50KTsKLSAgamF2YS5sYW5nLkludGVnZXIgbWV0YWRhdGFWZXJzaW9uOwotICBib29sZWFuIHN0b3JlVW5rbm93bkZpZWxkKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8sIGludCk7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIG1lc2hDcmM7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEp1bXBJbnNwZWN0b3IkU3BoZXJpY2FsTWV0YWRhdGEgY2xvbmUoKTsKLSAgIDxpbml0PigpOwotICBqYXZhLmxhbmcuSW50ZWdlciBwcm9qZWN0aW9uVHlwZTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkSnVtcEluc3BlY3RvciRTcGhlcmljYWxNZXRhZGF0YSBjbGVhcigpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEp1bXBJbnNwZWN0b3IkVmlkZW9EZXRhaWxzIHsKLSAgamF2YS5sYW5nLkJvb2xlYW4gdXNlZFdhbGx5RmlsZW5hbWU7Ci0gIGphdmEubGFuZy5Cb29sZWFuIHVzZWRNb25vRmlsZW5hbWU7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIGF1ZGlvQml0UmF0ZTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkSnVtcEluc3BlY3RvciRTcGhlcmljYWxNZXRhZGF0YSBzcGhlcmljYWxNZXRhZGF0YTsKLSAgamF2YS5sYW5nLkludGVnZXIgdmlkZW9Db2RlYzsKLSAgamF2YS5sYW5nLkJvb2xlYW4gdXNlZFdhbGxlRmlsZW5hbWU7Ci0gIGJvb2xlYW4gc3RvcmVVbmtub3duRmllbGQoY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubywgaW50KTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkSnVtcEluc3BlY3RvciRSZXNvbHV0aW9uIHJlc29sdXRpb247Ci0gIGphdmEubGFuZy5JbnRlZ2VyIGF1ZGlvQ2hhbm5lbENvdW50OwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRKdW1wSW5zcGVjdG9yJFZpZGVvRGV0YWlscyBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEp1bXBJbnNwZWN0b3IkVmlkZW9EZXRhaWxzIGNsZWFyKCk7Ci0gICA8aW5pdD4oKTsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgamF2YS5sYW5nLkxvbmcgbWVkaWFMZW5ndGhTZWNvbmRzOwotICBqYXZhLmxhbmcuRG91YmxlIGZyYW1lc1BlclNlY29uZDsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkSnVtcEluc3BlY3RvciRWaWRlb0RldGFpbHMgY2xvbmUoKTsKLSAgamF2YS5sYW5nLkludGVnZXIgc2FtcGxlUmF0ZTsKLSAgaW50IGNhY2hlZFNpemU7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIGF1ZGlvQ29kZWM7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIHZpZGVvQml0UmF0ZTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRKdW1wSW5zcGVjdG9yJFZpZGVvUGxheWJhY2tEZXRhaWxzIHsKLSAgYm9vbGVhbiBzdG9yZVVua25vd25GaWVsZChjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vLCBpbnQpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRKdW1wSW5zcGVjdG9yJFZpZGVvUGxheWJhY2tEZXRhaWxzIGNsZWFyKCk7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIHBsYXliYWNrTW9kZTsKLSAgamF2YS5sYW5nLkJvb2xlYW4gdXNlZEV4dGVybmFsU3luYzsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkSnVtcEluc3BlY3RvciRWaWRlb1BsYXliYWNrRGV0YWlscyBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGludCBjYWNoZWRTaXplOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRKdW1wSW5zcGVjdG9yJFZpZGVvUGxheWJhY2tEZXRhaWxzIGNsb25lKCk7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIGRyb3BwZWRGcmFtZXNDb3VudDsKLSAgIDxpbml0PigpOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGRBcnJheSB1bmtub3duRmllbGREYXRhOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEtleWJvYXJkIHsKLSAgIDxpbml0PigpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRLZXlib2FyZCRLZXlib2FyZEV2ZW50W10ga2V5Ym9hcmRFdmVudHM7Ci0gIGludCBjaGVja0tleWJvYXJkRXZlbnRUeXBlT3JUaHJvdyhpbnQpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRLZXlib2FyZCBjbGVhcigpOwotICBpbnQgY2hlY2tLZXlib2FyZFRleHRUeXBlT3JUaHJvdyhpbnQpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRLZXlib2FyZCBjbG9uZSgpOwotICBpbnQgY2hlY2tLZXlib2FyZElucHV0VHlwZU9yVGhyb3coaW50KTsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgaW50IGNhY2hlZFNpemU7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEtleWJvYXJkIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRLZXlib2FyZCRLZXlib2FyZEV2ZW50IHsKLSAgYm9vbGVhbiBzdG9yZVVua25vd25GaWVsZChjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vLCBpbnQpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRBcHBsaWNhdGlvbiBrZXlib2FyZFNlcnZpY2U7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEtleWJvYXJkJEtleWJvYXJkRXZlbnQgbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRLZXlib2FyZCRLZXlib2FyZEV2ZW50W10gX2VtcHR5QXJyYXk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEtleWJvYXJkJEtleWJvYXJkRXZlbnRbXSBlbXB0eUFycmF5KCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEtleWJvYXJkJEtleWJvYXJkRXZlbnQgY2xvbmUoKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkS2V5Ym9hcmQkS2V5Ym9hcmRFdmVudCBjbGVhcigpOwotICBqYXZhLmxhbmcuTG9uZyBjbGllbnRUaW1lc3RhbXA7Ci0gIGludCBjYWNoZWRTaXplOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRLZXlib2FyZCRLZXlib2FyZFRleHRFbnRyeSB0ZXh0RW50cnk7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGphdmEubGFuZy5TdHJpbmdbXSBlbmFibGVkTGFuZ3VhZ2VzOwotICBqYXZhLmxhbmcuU3RyaW5nW10gdm9pY2VJbnB1dExhbmd1YWdlczsKLSAgamF2YS5sYW5nLkludGVnZXIgc3VnZ2VzdGlvbkNvdW50OwotICBqYXZhLmxhbmcuU3RyaW5nIGxheW91dDsKLSAgamF2YS5sYW5nLkludGVnZXIgaW5wdXRUeXBlOwotICAgPGluaXQ+KCk7Ci0gIGphdmEubGFuZy5TdHJpbmdbXSBzeXN0ZW1MYW5ndWFnZXM7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIGV2ZW50VHlwZTsKLSAgamF2YS5sYW5nLlN0cmluZyBsYW5ndWFnZTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRLZXlib2FyZCRLZXlib2FyZFRleHRFbnRyeSB7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEtleWJvYXJkJEtleWJvYXJkVGV4dEVudHJ5IGNsb25lKCk7Ci0gIGphdmEubGFuZy5TdHJpbmcgbGF5b3V0OwotICBpbnQgY2FjaGVkU2l6ZTsKLSAgYm9vbGVhbiBzdG9yZVVua25vd25GaWVsZChjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vLCBpbnQpOwotICBqYXZhLmxhbmcuSW50ZWdlciBsZW5ndGg7Ci0gIGphdmEubGFuZy5TdHJpbmcgbGFuZ3VhZ2U7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIHR5cGU7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEtleWJvYXJkJEtleWJvYXJkVGV4dEVudHJ5IG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgIDxpbml0PigpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRLZXlib2FyZCRLZXlib2FyZFRleHRFbnRyeSBjbGVhcigpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JExhdW5jaGVyIHsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkTGF1bmNoZXIgbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICBpbnQgY2hlY2tOYXZJdGVtT3JUaHJvdyhpbnQpOwotICBqYXZhLmxhbmcuSW50ZWdlciBuYXZJdGVtOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRMYXVuY2hlciBjbG9uZSgpOwotICBib29sZWFuIHN0b3JlVW5rbm93bkZpZWxkKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8sIGludCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JExhdW5jaGVyIGNsZWFyKCk7Ci0gIGludCBjYWNoZWRTaXplOwotICAgPGluaXQ+KCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkTHVsbGFieSB7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEx1bGxhYnkgY2xvbmUoKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkTHVsbGFieSBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGJvb2xlYW4gc3RvcmVVbmtub3duRmllbGQoY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubywgaW50KTsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkTHVsbGFieSBjbGVhcigpOwotICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnRJZDsKLSAgaW50IGNhY2hlZFNpemU7Ci0gIGludCBjaGVja1VpRWxlbWVudE9yVGhyb3coaW50KTsKLSAgamF2YS5sYW5nLkludGVnZXIgdWlFbGVtZW50OwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRMdWxsYWJ5JExvYWRUaW1lIGxvYWRUaW1lOwotICBqYXZhLmxhbmcuSW50ZWdlciBpbmRleDsKLSAgIDxpbml0PigpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEx1bGxhYnkkTG9hZFRpbWUgewotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRMdWxsYWJ5JExvYWRUaW1lIGNsb25lKCk7Ci0gIGludCBjYWNoZWRTaXplOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRMdWxsYWJ5JExvYWRUaW1lIGNsZWFyKCk7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIGFzc2V0VHlwZTsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgaW50IGNoZWNrQXNzZXRUeXBlT3JUaHJvdyhpbnQpOwotICAgPGluaXQ+KCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEx1bGxhYnkkTG9hZFRpbWUgbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICBib29sZWFuIHN0b3JlVW5rbm93bkZpZWxkKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8sIGludCk7Ci0gIGphdmEubGFuZy5Mb25nIGxvYWRUaW1lTXM7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkUGVyZm9ybWFuY2VTdGF0cyB7Ci0gIGludCBjYWNoZWRTaXplOwotICAgPGluaXQ+KCk7Ci0gIGZsb2F0W10gZ3B1VGhyb3R0bGluZ1RlbXBlcmF0dXJlOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRIaXN0b2dyYW1CdWNrZXRbXSBzY2FubGluZVJhY2luZ1ZzeW5jT3ZlcnNob290VXM7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFBlcmZvcm1hbmNlU3RhdHMgbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICBqYXZhLmxhbmcuRmxvYXQgc2h1dGRvd25Ta2luVGVtcGVyYXR1cmVDZWxzaXVzOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRIaXN0b2dyYW1CdWNrZXRbXSB0b3RhbFJlbmRlclRpbWU7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEhpc3RvZ3JhbUJ1Y2tldFtdIHByZXNlbnRUaW1lOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGRBcnJheSB1bmtub3duRmllbGREYXRhOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRIaXN0b2dyYW1CdWNrZXRbXSBhcHBSZW5kZXJUaW1lOwotICBmbG9hdFtdIGNwdVRocm90dGxpbmdUZW1wZXJhdHVyZTsKLSAgamF2YS5sYW5nLkludGVnZXIgYXZlcmFnZUZwczsKLSAgamF2YS5sYW5nLkZsb2F0IGF2ZXJhZ2VBcHBGcHM7Ci0gIGphdmEubGFuZy5GbG9hdCB0aHJvdHRsZVNraW5UZW1wZXJhdHVyZUNlbHNpdXM7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFRpbWVTZXJpZXNEYXRhIHRpbWVTZXJpZXNEYXRhOwotICBqYXZhLmxhbmcuRmxvYXQgdnJNYXhTa2luVGVtcGVyYXR1cmVDZWxzaXVzOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRIaXN0b2dyYW1CdWNrZXRbXSBmcmFtZVRpbWU7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFBlcmZvcm1hbmNlU3RhdHMgY2xvbmUoKTsKLSAgamF2YS5sYW5nLkludGVnZXIgbWVtb3J5Q29uc3VtcHRpb25LaWxvYnl0ZXM7Ci0gIGZsb2F0W10gZ3B1U2h1dGRvd25UZW1wZXJhdHVyZTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkUGVyZm9ybWFuY2VTdGF0cyBjbGVhcigpOwotICBqYXZhLmxhbmcuSW50ZWdlciB0aGVybWFsRXZlbnRGbGFnczsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkSGlzdG9ncmFtQnVja2V0W10gcG9zdEZyYW1lVGltZTsKLSAgamF2YS5sYW5nLkZsb2F0IGVkc0ZwczsKLSAgZmxvYXRbXSBjcHVTaHV0ZG93blRlbXBlcmF0dXJlOwotICBmbG9hdFtdIGJhdHRlcnlUaHJvdHRsaW5nVGVtcGVyYXR1cmU7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEhpc3RvZ3JhbUJ1Y2tldFtdIGNvbnNlY3V0aXZlRHJvcHBlZEZyYW1lczsKLSAgZmxvYXRbXSBiYXR0ZXJ5U2h1dGRvd25UZW1wZXJhdHVyZTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRQaG9uZUFsaWdubWVudCB7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFBob25lQWxpZ25tZW50IGNsb25lKCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFBob25lQWxpZ25tZW50IG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkVmVjdG9yMiBsZW5zT2Zmc2V0OwotICBqYXZhLmxhbmcuRmxvYXQgYW5nbGVEZWdyZWVzOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGRBcnJheSB1bmtub3duRmllbGREYXRhOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRWZWN0b3IyW10gdG91Y2hMb2NhdGlvbnM7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFBob25lQWxpZ25tZW50IGNsZWFyKCk7Ci0gIGludCBjYWNoZWRTaXplOwotICAgPGluaXQ+KCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkUGhvdG9zIHsKLSAgaW50IGNhY2hlZFNpemU7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFBob3RvcyBjbG9uZSgpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRQaG90b3MgY2xlYXIoKTsKLSAgamF2YS5sYW5nLkludGVnZXIgbnVtUGhvdG9zOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRQaG90b3MgbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRQaG90b3MkT3Blbk1lZGlhIG9wZW5NZWRpYTsKLSAgIDxpbml0PigpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRQaG90b3MkV2FybVdlbGNvbWUgd2FybVdlbGNvbWU7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkUGhvdG9zJE9wZW5NZWRpYSB7Ci0gIGludCBjaGVja01lZGlhU291cmNlT3JUaHJvdyhpbnQpOwotICBqYXZhLmxhbmcuSW50ZWdlciB0eXBlOwotICAgPGluaXQ+KCk7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIHNvdXJjZTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkUGhvdG9zJE9wZW5NZWRpYSBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGphdmEubGFuZy5Cb29sZWFuIGlzU2FtcGxlOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRQaG90b3MkT3Blbk1lZGlhIGNsb25lKCk7Ci0gIGludCBjYWNoZWRTaXplOwotICBib29sZWFuIHN0b3JlVW5rbm93bkZpZWxkKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8sIGludCk7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFBob3RvcyRPcGVuTWVkaWEgY2xlYXIoKTsKLSAgaW50IGNoZWNrTWVkaWFUeXBlT3JUaHJvdyhpbnQpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFBob3RvcyRXYXJtV2VsY29tZSB7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFBob3RvcyRXYXJtV2VsY29tZSBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFBob3RvcyRXYXJtV2VsY29tZSBjbG9uZSgpOwotICBqYXZhLmxhbmcuRmxvYXQgZXhpdFByb2dyZXNzOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGRBcnJheSB1bmtub3duRmllbGREYXRhOwotICBpbnQgY2FjaGVkU2l6ZTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkUGhvdG9zJFdhcm1XZWxjb21lIGNsZWFyKCk7Ci0gICA8aW5pdD4oKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRRckNvZGVTY2FuIHsKLSAgaW50IGNhY2hlZFNpemU7Ci0gIGJvb2xlYW4gc3RvcmVVbmtub3duRmllbGQoY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubywgaW50KTsKLSAgaW50IGNoZWNrU3RhdHVzT3JUaHJvdyhpbnQpOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGRBcnJheSB1bmtub3duRmllbGREYXRhOwotICAgPGluaXQ+KCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFFyQ29kZVNjYW4gY2xlYXIoKTsKLSAgamF2YS5sYW5nLkludGVnZXIgc3RhdHVzOwotICBqYXZhLmxhbmcuU3RyaW5nIGhlYWRNb3VudENvbmZpZ1VybDsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkUXJDb2RlU2NhbiBjbG9uZSgpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRRckNvZGVTY2FuIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRSZW5kZXJlciB7Ci0gIGphdmEubGFuZy5TdHJpbmcgZ2xSZW5kZXJlcjsKLSAgaW50IGNhY2hlZFNpemU7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFJlbmRlcmVyIGNsb25lKCk7Ci0gIGphdmEubGFuZy5TdHJpbmcgZ2xWZXJzaW9uOwotICAgPGluaXQ+KCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFJlbmRlcmVyIGNsZWFyKCk7Ci0gIGphdmEubGFuZy5TdHJpbmcgZ2xWZW5kb3I7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFJlbmRlcmVyIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRTZGtDb25maWd1cmF0aW9uUGFyYW1zIHsKLSAgamF2YS5sYW5nLkJvb2xlYW4gZGlzYWxsb3dNdWx0aXZpZXc7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFNka0NvbmZpZ3VyYXRpb25QYXJhbXMgbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICBib29sZWFuIHN0b3JlVW5rbm93bkZpZWxkKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8sIGludCk7Ci0gIGphdmEubGFuZy5Cb29sZWFuIHRvdWNoT3ZlcmxheUVuYWJsZWQ7Ci0gIGphdmEubGFuZy5Cb29sZWFuIHVzZU9ubGluZU1hZ25ldG9tZXRlckNhbGlicmF0aW9uOwotICAgPGluaXQ+KCk7Ci0gIGphdmEubGFuZy5Cb29sZWFuIHVzZVN5c3RlbUNsb2NrRm9yU2Vuc29yVGltZXN0YW1wczsKLSAgamF2YS5sYW5nLkJvb2xlYW4gYWxsb3dEeW5hbWljTGlicmFyeUxvYWRpbmc7Ci0gIGphdmEubGFuZy5Cb29sZWFuIGVuYWJsZUZvcmNlZFRyYWNraW5nQ29tcGF0OwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGRBcnJheSB1bmtub3duRmllbGREYXRhOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRTZGtDb25maWd1cmF0aW9uUGFyYW1zJFNjcmVlbkNhcHR1cmVDb25maWcgc2NyZWVuQ2FwdHVyZUNvbmZpZzsKLSAgamF2YS5sYW5nLkJvb2xlYW4gdXNlRGV2aWNlSWRsZURldGVjdGlvbjsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkU2RrQ29uZmlndXJhdGlvblBhcmFtcyRBc3luY1JlcHJvamVjdGlvbkNvbmZpZyBhc3luY1JlcHJvamVjdGlvbkNvbmZpZzsKLSAgamF2YS5sYW5nLkludGVnZXIgZGF5ZHJlYW1JbWFnZUFsaWdubWVudDsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkU2RrQ29uZmlndXJhdGlvblBhcmFtcyRQZXJmb3JtYW5jZU92ZXJsYXlJbmZvIHBlcmZvcm1hbmNlT3ZlcmxheUluZm87Ci0gIGphdmEubGFuZy5Cb29sZWFuIGRheWRyZWFtSW1hZ2VBbGlnbm1lbnRFbmFibGVkOwotICBqYXZhLmxhbmcuQm9vbGVhbiB1c2VNYWduZXRvbWV0ZXJJblNlbnNvckZ1c2lvbjsKLSAgamF2YS5sYW5nLkJvb2xlYW4gdXNlRGlyZWN0TW9kZVNlbnNvcnM7Ci0gIGphdmEubGFuZy5Cb29sZWFuIHVzZVN0YXRpb25hcnlCaWFzQ29ycmVjdGlvbjsKLSAgamF2YS5sYW5nLkJvb2xlYW4gY3B1TGF0ZUxhdGNoaW5nRW5hYmxlZDsKLSAgamF2YS5sYW5nLkJvb2xlYW4gYWxsb3dWcmNvcmVIZWFkVHJhY2tpbmc7Ci0gIGludCBjaGVja0RheWRyZWFtSW1hZ2VBbGlnbm1lbnRPclRocm93KGludCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFNka0NvbmZpZ3VyYXRpb25QYXJhbXMgY2xlYXIoKTsKLSAgaW50IGNhY2hlZFNpemU7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFNka0NvbmZpZ3VyYXRpb25QYXJhbXMgY2xvbmUoKTsKLSAgamF2YS5sYW5nLkJvb2xlYW4gYWxsb3dEeW5hbWljSmF2YUxpYnJhcnlMb2FkaW5nOwotICBqYXZhLmxhbmcuQm9vbGVhbiBhbGxvd1ZyY29yZUNvbXBvc2l0aW5nOwotICBqYXZhLmxhbmcuQm9vbGVhbiBkaW1VaUxheWVyOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFNka0NvbmZpZ3VyYXRpb25QYXJhbXMkQXN5bmNSZXByb2plY3Rpb25Db25maWcgewotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGRBcnJheSB1bmtub3duRmllbGREYXRhOwotICBqYXZhLmxhbmcuTG9uZyBzdHJpcHNQZXJGcmFtZTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkU2RrQ29uZmlndXJhdGlvblBhcmFtcyRBc3luY1JlcHJvamVjdGlvbkNvbmZpZyBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFNka0NvbmZpZ3VyYXRpb25QYXJhbXMkQXN5bmNSZXByb2plY3Rpb25Db25maWcgY2xvbmUoKTsKLSAgaW50IGNhY2hlZFNpemU7Ci0gIGphdmEubGFuZy5Mb25nIGZsYWdzOwotICBqYXZhLmxhbmcuTG9uZyBibGFja0Jvb3N0OwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRTZGtDb25maWd1cmF0aW9uUGFyYW1zJEFzeW5jUmVwcm9qZWN0aW9uQ29uZmlnIGNsZWFyKCk7Ci0gICA8aW5pdD4oKTsKLSAgamF2YS5sYW5nLkxvbmcgdnN5bmNHcmFjZVBlcmlvZE1pY3JvczsKLSAgamF2YS5sYW5nLkxvbmcgZGlzcGxheUxhdGVuY3lNaWNyb3M7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkU2RrQ29uZmlndXJhdGlvblBhcmFtcyRQZXJmb3JtYW5jZU92ZXJsYXlJbmZvIHsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkU2RrQ29uZmlndXJhdGlvblBhcmFtcyRQZXJmb3JtYW5jZU92ZXJsYXlJbmZvIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgaW50IGNhY2hlZFNpemU7Ci0gICA8aW5pdD4oKTsKLSAgamF2YS5sYW5nLlN0cmluZyB2ZXJzaW9uOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGRBcnJheSB1bmtub3duRmllbGREYXRhOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRTZGtDb25maWd1cmF0aW9uUGFyYW1zJFBlcmZvcm1hbmNlT3ZlcmxheUluZm8gY2xlYXIoKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkU2RrQ29uZmlndXJhdGlvblBhcmFtcyRQZXJmb3JtYW5jZU92ZXJsYXlJbmZvIGNsb25lKCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkU2RrQ29uZmlndXJhdGlvblBhcmFtcyRTY3JlZW5DYXB0dXJlQ29uZmlnIHsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkU2RrQ29uZmlndXJhdGlvblBhcmFtcyRTY3JlZW5DYXB0dXJlQ29uZmlnIGNsb25lKCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFNka0NvbmZpZ3VyYXRpb25QYXJhbXMkU2NyZWVuQ2FwdHVyZUNvbmZpZyBjbGVhcigpOwotICBqYXZhLmxhbmcuQm9vbGVhbiBhbGxvd1NjcmVlblJlY29yZDsKLSAgIDxpbml0PigpOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGRBcnJheSB1bmtub3duRmllbGREYXRhOwotICBpbnQgY2FjaGVkU2l6ZTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkU2RrQ29uZmlndXJhdGlvblBhcmFtcyRTY3JlZW5DYXB0dXJlQ29uZmlnIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgamF2YS5sYW5nLkJvb2xlYW4gYWxsb3dDYXN0aW5nOwotICBqYXZhLmxhbmcuQm9vbGVhbiBhbGxvd1NjcmVlbnNob3Q7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkU2Vuc29yU3RhdHMgewotICBpbnQgY2FjaGVkU2l6ZTsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkU2Vuc29yU3RhdHMgY2xlYXIoKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkU2Vuc29yU3RhdHMgY2xvbmUoKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkU2Vuc29yU3RhdHMgbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRTZW5zb3JTdGF0cyRHeXJvc2NvcGVTdGF0cyBneXJvc2NvcGVTdGF0czsKLSAgIDxpbml0PigpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFNlbnNvclN0YXRzJEd5cm9zY29wZVN0YXRzIHsKLSAgaW50IGNhY2hlZFNpemU7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFNlbnNvclN0YXRzJFZlY3RvcjMgYmlhczsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkU2Vuc29yU3RhdHMkVmVjdG9yMyBsb3dlckJvdW5kOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRTZW5zb3JTdGF0cyRHeXJvc2NvcGVTdGF0cyBjbGVhcigpOwotICAgPGluaXQ+KCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFNlbnNvclN0YXRzJEd5cm9zY29wZVN0YXRzIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkU2Vuc29yU3RhdHMkVmVjdG9yMyBzdGFuZGFyZERldmlhdGlvbjsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkU2Vuc29yU3RhdHMkVmVjdG9yMyB1cHBlckJvdW5kOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRTZW5zb3JTdGF0cyRHeXJvc2NvcGVTdGF0cyBjbG9uZSgpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFNlbnNvclN0YXRzJFZlY3RvcjMgewotICBpbnQgY2FjaGVkU2l6ZTsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgamF2YS5sYW5nLkZsb2F0IHo7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFNlbnNvclN0YXRzJFZlY3RvcjMgbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRTZW5zb3JTdGF0cyRWZWN0b3IzIGNsb25lKCk7Ci0gIGphdmEubGFuZy5GbG9hdCB5OwotICBqYXZhLmxhbmcuRmxvYXQgeDsKLSAgIDxpbml0PigpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRTZW5zb3JTdGF0cyRWZWN0b3IzIGNsZWFyKCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkU3RhbmRhbG9uZUhlYWRzZXQgewotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGRBcnJheSB1bmtub3duRmllbGREYXRhOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRTdGFuZGFsb25lSGVhZHNldCRIZWFkU2V0T25PZmZTdGF0cyBvbk9mZlN0YXRzOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRTdGFuZGFsb25lSGVhZHNldCRQb3dlclN0YXRlIHBvd2VyU3RhdGU7Ci0gIGludCBjYWNoZWRTaXplOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRTdGFuZGFsb25lSGVhZHNldCBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFN0YW5kYWxvbmVIZWFkc2V0IGNsZWFyKCk7Ci0gICA8aW5pdD4oKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkU3RhbmRhbG9uZUhlYWRzZXQgY2xvbmUoKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkU3RhbmRhbG9uZUhlYWRzZXQkTWVtb3J5U3RhdHMgbWVtb3J5U3RhdHM7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkU3RhbmRhbG9uZUhlYWRzZXQkSGVhZFNldE9uT2ZmU3RhdHMgewotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRTdGFuZGFsb25lSGVhZHNldCRIZWFkU2V0T25PZmZTdGF0cyBjbG9uZSgpOwotICAgPGluaXQ+KCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFN0YW5kYWxvbmVIZWFkc2V0JEhlYWRTZXRPbk9mZlN0YXRzIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgamF2YS5sYW5nLkxvbmcgb25PZmZDb3VudDsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgaW50IGNhY2hlZFNpemU7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFN0YW5kYWxvbmVIZWFkc2V0JEhlYWRTZXRPbk9mZlN0YXRzIGNsZWFyKCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkU3RhbmRhbG9uZUhlYWRzZXQkTWVtb3J5U3RhdHMgewotICBqYXZhLmxhbmcuTG9uZyB0aW1lU2luY2VCb290TnM7Ci0gIGludCBjYWNoZWRTaXplOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRTdGFuZGFsb25lSGVhZHNldCRNZW1vcnlTdGF0cyBjbGVhcigpOwotICAgPGluaXQ+KCk7Ci0gIGphdmEubGFuZy5Mb25nIHRvdGFsTWVtb3J5S2I7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFN0YW5kYWxvbmVIZWFkc2V0JE1lbW9yeVN0YXRzIGNsb25lKCk7Ci0gIGphdmEubGFuZy5Mb25nIGF2YWlsYWJsZU1lbW9yeUtiOwotICBqYXZhLmxhbmcuTG9uZyBmcmVlTWVtb3J5S2I7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFN0YW5kYWxvbmVIZWFkc2V0JE1lbW9yeVN0YXRzIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRTdGFuZGFsb25lSGVhZHNldCRQb3dlclN0YXRlIHsKLSAgYm9vbGVhbiBzdG9yZVVua25vd25GaWVsZChjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vLCBpbnQpOwotICBpbnQgY2hlY2tQb3dlclN0YXRlc09yVGhyb3coaW50KTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkU3RhbmRhbG9uZUhlYWRzZXQkUG93ZXJTdGF0ZSBjbGVhcigpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRTdGFuZGFsb25lSGVhZHNldCRQb3dlclN0YXRlIGNsb25lKCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFN0YW5kYWxvbmVIZWFkc2V0JFBvd2VyU3RhdGUgbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICBqYXZhLmxhbmcuSW50ZWdlciBwb3dlclN0YXRlczsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgaW50IGNhY2hlZFNpemU7Ci0gICA8aW5pdD4oKTsKLSAgamF2YS5sYW5nLkxvbmcgcG93ZXJTdGF0ZUR1cmF0aW9uTnM7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkU3RyZWV0VmlldyB7Ci0gICA8aW5pdD4oKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkU3RyZWV0VmlldyRUdXRvcmlhbFNlc3Npb24gdHV0b3JpYWxTZXNzaW9uOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRTdHJlZXRWaWV3IGNsZWFyKCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFN0cmVldFZpZXckUGFub1Nlc3Npb24gcGFub1Nlc3Npb247Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGludCBjYWNoZWRTaXplOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRTdHJlZXRWaWV3IG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkU3RyZWV0VmlldyBjbG9uZSgpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFN0cmVldFZpZXckUGFub1Nlc3Npb24gewotICBqYXZhLmxhbmcuSW50ZWdlciBwbGF5UGF1c2VDbGlja3M7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFN0cmVldFZpZXckUGFub1Nlc3Npb24gY2xlYXIoKTsKLSAgamF2YS5sYW5nLkludGVnZXIgaW5mb0NsaWNrczsKLSAgaW50IGNhY2hlZFNpemU7Ci0gIGludCBjaGVja1NvdXJjZU9yVGhyb3coaW50KTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkU3RyZWV0VmlldyRQYW5vU2Vzc2lvbiBjbG9uZSgpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRTdHJlZXRWaWV3JFBhbm9TZXNzaW9uIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgamF2YS5sYW5nLkludGVnZXIgbm9kZXNOYXZpZ2F0ZWQ7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIHBhbm9zQXZhaWxhYmxlOwotICBqYXZhLmxhbmcuSW50ZWdlciBzb3VyY2U7Ci0gIGJvb2xlYW4gc3RvcmVVbmtub3duRmllbGQoY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubywgaW50KTsKLSAgamF2YS5sYW5nLkludGVnZXIgbmV4dENsaWNrczsKLSAgamF2YS5sYW5nLkludGVnZXIgcGFub3NWaWV3ZWQ7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIHByZXZDbGlja3M7Ci0gICA8aW5pdD4oKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRTdHJlZXRWaWV3JFR1dG9yaWFsU2Vzc2lvbiB7Ci0gIGJvb2xlYW4gc3RvcmVVbmtub3duRmllbGQoY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubywgaW50KTsKLSAgaW50IGNoZWNrVHV0b3JpYWxPclRocm93KGludCk7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIHR1dG9yaWFsOwotICBqYXZhLmxhbmcuQm9vbGVhbiBjb21wbGV0ZWQ7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFN0cmVldFZpZXckVHV0b3JpYWxTZXNzaW9uIGNsZWFyKCk7Ci0gIGludCBjYWNoZWRTaXplOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRTdHJlZXRWaWV3JFR1dG9yaWFsU2Vzc2lvbiBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gICA8aW5pdD4oKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkU3RyZWV0VmlldyRUdXRvcmlhbFNlc3Npb24gY2xvbmUoKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRUaW1lU2VyaWVzRGF0YSB7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFRpbWVTZXJpZXNEYXRhIGNsb25lKCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFRpbWVTZXJpZXNEYXRhIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgamF2YS5sYW5nLkludGVnZXIgdGltZUludGVydmFsU2Vjb25kczsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgIDxpbml0PigpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRUaW1lU2VyaWVzRGF0YSBjbGVhcigpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRUaW1lU2VyaWVzRGF0YSRUaW1lSW50ZXJ2YWxEYXRhW10gdGltZUludGVydmFsRGF0YTsKLSAgaW50IGNhY2hlZFNpemU7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkVGltZVNlcmllc0RhdGEkVGltZUludGVydmFsRGF0YSB7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFRpbWVTZXJpZXNEYXRhJFRpbWVJbnRlcnZhbERhdGFbXSBlbXB0eUFycmF5KCk7Ci0gIGZsb2F0W10gY3B1VGVtcGVyYXR1cmU7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFRpbWVTZXJpZXNEYXRhJFRpbWVJbnRlcnZhbERhdGFbXSBfZW1wdHlBcnJheTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkVGltZVNlcmllc0RhdGEkVGltZUludGVydmFsRGF0YSBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFRpbWVTZXJpZXNEYXRhJFRpbWVJbnRlcnZhbERhdGEgY2xvbmUoKTsKLSAgaW50IGNhY2hlZFNpemU7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIHRoZXJtYWxXYXJuaW5nc1Nob3duOwotICBqYXZhLmxhbmcuSW50ZWdlciBiYXR0ZXJ5TGV2ZWw7Ci0gIGZsb2F0W10gYmF0dGVyeVRlbXBlcmF0dXJlOwotICBqYXZhLmxhbmcuSW50ZWdlciBlZHNUaHJlYWRGcmFtZURyb3BDb3VudDsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkVGltZVNlcmllc0RhdGEkVGltZUludGVydmFsRGF0YSBjbGVhcigpOwotICAgPGluaXQ+KCk7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIGJhdHRlcnlMZXZlbERlbHRhOwotICBqYXZhLmxhbmcuRmxvYXQgc2tpblRlbXBlcmF0dXJlOwotICBmbG9hdFtdIGdwdVRlbXBlcmF0dXJlOwotICBqYXZhLmxhbmcuSW50ZWdlciBpbnRlcnZhbFN0YXJ0VGltZVNlY29uZHM7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkVHJhbnNmb3JtIHsKLSAgamF2YS5sYW5nLkZsb2F0IHRyYW5zbGF0aW9uWDsKLSAgamF2YS5sYW5nLkZsb2F0IHJvdGF0aW9uUXk7Ci0gICA8aW5pdD4oKTsKLSAgamF2YS5sYW5nLkZsb2F0IHJvdGF0aW9uUXg7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGphdmEubGFuZy5GbG9hdCB0cmFuc2xhdGlvblo7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFRyYW5zZm9ybSBjbG9uZSgpOwotICBqYXZhLmxhbmcuRmxvYXQgcm90YXRpb25RejsKLSAgamF2YS5sYW5nLkZsb2F0IHRyYW5zbGF0aW9uWTsKLSAgaW50IGNhY2hlZFNpemU7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFRyYW5zZm9ybSBjbGVhcigpOwotICBqYXZhLmxhbmcuRmxvYXQgc2NhbGU7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFRyYW5zZm9ybSBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkVmVjdG9yMiB7Ci0gICA8aW5pdD4oKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkVmVjdG9yMiBjbG9uZSgpOwotICBqYXZhLmxhbmcuRmxvYXQgeDsKLSAgaW50IGNhY2hlZFNpemU7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFZlY3RvcjIgY2xlYXIoKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkVmVjdG9yMiBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGphdmEubGFuZy5GbG9hdCB5OwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRWZWN0b3IyW10gX2VtcHR5QXJyYXk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFZlY3RvcjJbXSBlbXB0eUFycmF5KCk7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkVnJDb3JlIHsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkVnJDb3JlJENvbnRyb2xsZXIgY29udHJvbGxlcjsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkVnJDb3JlIGNsb25lKCk7Ci0gIGludCBjaGVja1Blcm1pc3Npb25PclRocm93KGludCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFZyQ29yZSRMb2NrU2NyZWVuRXZlbnQgbG9ja1NjcmVlbkV2ZW50OwotICBqYXZhLmxhbmcuSW50ZWdlciBwZXJtaXNzaW9uOwotICBqYXZhLmxhbmcuSW50ZWdlciBjbGllbnRBcGlWZXJzaW9uOwotICBib29sZWFuIHN0b3JlVW5rbm93bkZpZWxkKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8sIGludCk7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFZyQ29yZSREYXNoYm9hcmRFdmVudCBkYXNoYm9hcmRFdmVudDsKLSAgaW50IGNhY2hlZFNpemU7Ci0gICA8aW5pdD4oKTsKLSAgamF2YS5sYW5nLkludGVnZXIgY29udHJvbGxlckhhbmRlZG5lc3M7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFZyQ29yZSBjbGVhcigpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRWckNvcmUkQ2FwdHVyZUV2ZW50IGNhcHR1cmVFdmVudDsKLSAgamF2YS5sYW5nLkxvbmcgdnJTZXNzaW9uSWQ7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFZyQ29yZSBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JEFwcGxpY2F0aW9uIGZvcmVncm91bmRBcHBsaWNhdGlvbjsKLSAgamF2YS5sYW5nLkJvb2xlYW4gaXNJbkRlbW9Nb2RlOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRBcHBsaWNhdGlvbiBwcmV2aW91c0ZvcmVncm91bmRBcHBsaWNhdGlvbjsKLSAgamF2YS5sYW5nLkludGVnZXIgZXJyb3JDb2RlOwotICBpbnQgY2hlY2tFcnJvckNvZGVPclRocm93KGludCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkVnJDb3JlJENhcHR1cmVFdmVudCB7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFZyQ29yZSRDYXB0dXJlRXZlbnQgbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICBqYXZhLmxhbmcuQm9vbGVhbiBpbml0aWF0ZWRCeUNvbnRyb2xsZXI7Ci0gIGludCBjYWNoZWRTaXplOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRWckNvcmUkQ2FwdHVyZUV2ZW50IGNsb25lKCk7Ci0gICA8aW5pdD4oKTsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkVnJDb3JlJENhcHR1cmVFdmVudCBjbGVhcigpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFZyQ29yZSRDb250cm9sbGVyIHsKLSAgamF2YS5sYW5nLlN0cmluZyBzb2Z0d2FyZVJldmlzaW9uOwotICBpbnQgY2hlY2tTZW5zb3JUeXBlT3JUaHJvdyhpbnQpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRWckNvcmUkQ29udHJvbGxlciBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIGF4aXM7Ci0gIGphdmEubGFuZy5TdHJpbmcgaGFyZHdhcmVSZXZpc2lvbjsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgaW50IGNhY2hlZFNpemU7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFZyQ29yZSRDb250cm9sbGVyIGNsb25lKCk7Ci0gIGphdmEubGFuZy5TdHJpbmcgbWFudWZhY3R1cmVyOwotICBib29sZWFuIHN0b3JlVW5rbm93bkZpZWxkKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8sIGludCk7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIHNhbXBsZUNvdW50OwotICBqYXZhLmxhbmcuU3RyaW5nIG1vZGVsOwotICBqYXZhLmxhbmcuSW50ZWdlciBvdGFSZXRyaWVzOwotICBqYXZhLmxhbmcuSW50ZWdlciB4UmFpbENvdW50OwotICBqYXZhLmxhbmcuSW50ZWdlciBiYXR0ZXJ5TGV2ZWw7Ci0gIGphdmEubGFuZy5TdHJpbmcgZmlybXdhcmU7Ci0gIGphdmEubGFuZy5Cb29sZWFuIGlzQ29ubmVjdGVkOwotICBqYXZhLmxhbmcuSW50ZWdlciB5UmFpbENvdW50OwotICAgPGluaXQ+KCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFZyQ29yZSRDb250cm9sbGVyIGNsZWFyKCk7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIHN0YXR1czsKLSAgaW50IGNoZWNrQ29udHJvbGxlckF4aXNPclRocm93KGludCk7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIHpSYWlsQ291bnQ7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIHNlbnNvclR5cGU7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIHRvdGFsQ29udHJvbGxlckxhZ0NvdW50OwotICBqYXZhLmxhbmcuU3RyaW5nIGF2YWlsYWJsZUZpcm13YXJlOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFZyQ29yZSREYXNoYm9hcmRFdmVudCB7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFZyQ29yZSREYXNoYm9hcmRFdmVudCBjbGVhcigpOwotICBpbnQgY2FjaGVkU2l6ZTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkQXBwbGljYXRpb24gd29ybGRBcHA7Ci0gIGxvZ3MucHJvdG8ud2lyZWxlc3MucGVyZm9ybWFuY2UubW9iaWxlLm5hbm8uTWVtb3J5TWV0cmljJEFuZHJvaWRNZW1vcnlTdGF0cyB3b3JsZEFwcE1lbW9yeVN0YXRzOwotICBib29sZWFuIHN0b3JlVW5rbm93bkZpZWxkKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8sIGludCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFZyQ29yZSREYXNoYm9hcmRFdmVudCREYXNoYm9hcmREaXNtaXNzRGV0YWlscyBkaXNtaXNzRGV0YWlsczsKLSAgaW50IGNoZWNrRGFzaGJvYXJkRXZlbnRUeXBlT3JUaHJvdyhpbnQpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRWckNvcmUkRGFzaGJvYXJkRXZlbnQgY2xvbmUoKTsKLSAgamF2YS5sYW5nLkludGVnZXIgZXZlbnRUeXBlOwotICBqYXZhLmxhbmcuTG9uZyBjbGllbnRUaW1lc3RhbXA7Ci0gIGphdmEubGFuZy5TdHJpbmcgc2Vzc2lvbklkOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRWckNvcmUkRGFzaGJvYXJkRXZlbnQgbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICAgPGluaXQ+KCk7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkVnJDb3JlJERhc2hib2FyZEV2ZW50JERhc2hib2FyZERpc21pc3NEZXRhaWxzIHsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkVnJDb3JlJERhc2hib2FyZEV2ZW50JERhc2hib2FyZERpc21pc3NEZXRhaWxzIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgamF2YS5sYW5nLkJvb2xlYW4gd29ybGRBcHBEaWVkOwotICBib29sZWFuIHN0b3JlVW5rbm93bkZpZWxkKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8sIGludCk7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIGRpc21pc3NSZWFzb247Ci0gIGludCBjaGVja0Rhc2hib2FyZERpc21pc3NSZWFzb25PclRocm93KGludCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFZyQ29yZSREYXNoYm9hcmRFdmVudCREYXNoYm9hcmREaXNtaXNzRGV0YWlscyBjbGVhcigpOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGRBcnJheSB1bmtub3duRmllbGREYXRhOwotICAgPGluaXQ+KCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFZyQ29yZSREYXNoYm9hcmRFdmVudCREYXNoYm9hcmREaXNtaXNzRGV0YWlscyBjbG9uZSgpOwotICBpbnQgY2FjaGVkU2l6ZTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRWckNvcmUkTG9ja1NjcmVlbkV2ZW50IHsKLSAgaW50IGNoZWNrTG9ja1NjcmVlbkV2ZW50VHlwZU9yVGhyb3coaW50KTsKLSAgaW50IGNhY2hlZFNpemU7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFZyQ29yZSRMb2NrU2NyZWVuRXZlbnQgbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRWckNvcmUkTG9ja1NjcmVlbkV2ZW50IGNsb25lKCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFZyQ29yZSRMb2NrU2NyZWVuRXZlbnQgY2xlYXIoKTsKLSAgIDxpbml0PigpOwotICBib29sZWFuIHN0b3JlVW5rbm93bkZpZWxkKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8sIGludCk7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIGV2ZW50VHlwZTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRWckhvbWUgewotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGRBcnJheSB1bmtub3duRmllbGREYXRhOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRWckhvbWUkRGlhbG9nQWN0aW9uIGRpYWxvZ0FjdGlvbjsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkVnJIb21lIGNsb25lKCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFZySG9tZSRTZXR1cCBzZXR1cDsKLSAgIDxpbml0PigpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRWckhvbWUgY2xlYXIoKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkR0NvbmZpZ1VwZGF0ZSBnQ29uZmlnVXBkYXRlOwotICBpbnQgY2FjaGVkU2l6ZTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkVnJIb21lIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkVnJIb21lJEdldFZpZXdlckNsaWNrIGdldFZpZXdlckNsaWNrOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFZySG9tZSREaWFsb2dBY3Rpb24gewotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRWckhvbWUkRGlhbG9nQWN0aW9uIGNsZWFyKCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFZySG9tZSREaWFsb2dBY3Rpb24gbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGRBcnJheSB1bmtub3duRmllbGREYXRhOwotICBqYXZhLmxhbmcuSW50ZWdlciBhY3Rpb25UeXBlOwotICAgPGluaXQ+KCk7Ci0gIGludCBjYWNoZWRTaXplOwotICBib29sZWFuIHN0b3JlVW5rbm93bkZpZWxkKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8sIGludCk7Ci0gIGludCBjaGVja0RpYWxvZ1R5cGVPclRocm93KGludCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFZySG9tZSREaWFsb2dBY3Rpb24gY2xvbmUoKTsKLSAgamF2YS5sYW5nLkludGVnZXIgdHlwZTsKLSAgaW50IGNoZWNrRGlhbG9nQWN0aW9uVHlwZU9yVGhyb3coaW50KTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRWckhvbWUkR2V0Vmlld2VyQ2xpY2sgewotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRWckhvbWUkR2V0Vmlld2VyQ2xpY2sgY2xvbmUoKTsKLSAgaW50IGNhY2hlZFNpemU7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFZySG9tZSRHZXRWaWV3ZXJDbGljayBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gICA8aW5pdD4oKTsKLSAgamF2YS5sYW5nLlN0cmluZyB1cmw7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFZySG9tZSRHZXRWaWV3ZXJDbGljayBjbGVhcigpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFZySG9tZSRTZXR1cCB7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFZySG9tZSRTZXR1cCRWaWV3IHZpZXc7Ci0gIGludCBjaGVja1N0ZXBPclRocm93KGludCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFZySG9tZSRTZXR1cCBjbG9uZSgpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRWckhvbWUkU2V0dXAgbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICBpbnQgY2FjaGVkU2l6ZTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkVnJIb21lJFNldHVwJFN0ZXBTdGF0ZUNoYW5nZSBzdGVwU3RhdGVDaGFuZ2U7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFZySG9tZSRTZXR1cCBjbGVhcigpOwotICAgPGluaXQ+KCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkVnJIb21lJFNldHVwJFN0ZXBTdGF0ZUNoYW5nZSB7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIG5ld1N0ZXBTdGF0ZTsKLSAgaW50IGNoZWNrU3RlcFN0YXRlT3JUaHJvdyhpbnQpOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGRBcnJheSB1bmtub3duRmllbGREYXRhOwotICBib29sZWFuIHN0b3JlVW5rbm93bkZpZWxkKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8sIGludCk7Ci0gICA8aW5pdD4oKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkVnJIb21lJFNldHVwJFN0ZXBTdGF0ZUNoYW5nZSBjbG9uZSgpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRWckhvbWUkU2V0dXAkU3RlcFN0YXRlQ2hhbmdlIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkVnJIb21lJFNldHVwJFN0ZXBTdGF0ZUNoYW5nZSBjbGVhcigpOwotICBqYXZhLmxhbmcuSW50ZWdlciBzdGVwOwotICBqYXZhLmxhbmcuSW50ZWdlciBwcmV2aW91c1N0ZXBTdGF0ZTsKLSAgaW50IGNhY2hlZFNpemU7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkVnJIb21lJFNldHVwJFZpZXcgewotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRWckhvbWUkU2V0dXAkVmlldyBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gICA8aW5pdD4oKTsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgamF2YS5sYW5nLkludGVnZXIgc3RlcDsKLSAgYm9vbGVhbiBzdG9yZVVua25vd25GaWVsZChjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vLCBpbnQpOwotICBqYXZhLmxhbmcuSW50ZWdlciBwYWdlOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRWckhvbWUkU2V0dXAkVmlldyBjbGVhcigpOwotICBpbnQgY2FjaGVkU2l6ZTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkVnJIb21lJFNldHVwJFZpZXcgY2xvbmUoKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRWclN0cmVhbWluZyB7Ci0gIGludCBjYWNoZWRTaXplOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRWclN0cmVhbWluZyRGcmFtZVtdIGZyYW1lOwotICAgPGluaXQ+KCk7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFZyU3RyZWFtaW5nIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkVnJTdHJlYW1pbmcgY2xlYXIoKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkVnJTdHJlYW1pbmcgY2xvbmUoKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkVnJTdHJlYW1pbmckU2Vzc2lvbkluZm8gc2Vzc2lvbkluZm87Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkVnJTdHJlYW1pbmckRnJhbWUgewotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRWclN0cmVhbWluZyRGcmFtZSBjbGVhcigpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRWclN0cmVhbWluZyRGcmFtZVtdIGVtcHR5QXJyYXkoKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkVnJTdHJlYW1pbmckRnJhbWVbXSBfZW1wdHlBcnJheTsKLSAgamF2YS5sYW5nLkxvbmcgcG9zZVNlbmRUaW1lVXNlYzsKLSAgamF2YS5sYW5nLkxvbmcgZGVjb2RlU3RhcnRUaW1lVXNlYzsKLSAgamF2YS5sYW5nLkludGVnZXIgcG9zZUlkOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRWclN0cmVhbWluZyRGcmFtZSBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGphdmEubGFuZy5Mb25nIGRlY29kZUVuZFRpbWVVc2VjOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRWclN0cmVhbWluZyRGcmFtZSBjbG9uZSgpOwotICAgPGluaXQ+KCk7Ci0gIGludCBjYWNoZWRTaXplOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGRBcnJheSB1bmtub3duRmllbGREYXRhOwotICBqYXZhLmxhbmcuTG9uZyBmcmFtZVByZXNlbnRUaW1lVXNlYzsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRWclN0cmVhbWluZyRTZXNzaW9uSW5mbyB7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gICA8aW5pdD4oKTsKLSAgamF2YS5sYW5nLlN0cmluZyBzZXNzaW9uSWQ7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFZyU3RyZWFtaW5nJFNlc3Npb25JbmZvIGNsZWFyKCk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFZyU3RyZWFtaW5nJFNlc3Npb25JbmZvIGNsb25lKCk7Ci0gIGludCBjYWNoZWRTaXplOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRWclN0cmVhbWluZyRTZXNzaW9uSW5mbyBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyQmFzZU91dGVyQ2xhc3MkVnJCYXNlIHsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyQmFzZU91dGVyQ2xhc3MkVnJCYXNlIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyQmFzZU91dGVyQ2xhc3MkVnJCYXNlIGNsb25lKCk7Ci0gIGludCBjYWNoZWRTaXplOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnJCYXNlT3V0ZXJDbGFzcyRWckJhc2UgY2xlYXIoKTsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnJCYXNlT3V0ZXJDbGFzcyRWckJhc2UkSGVhZE1vdW50IHsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyQmFzZU91dGVyQ2xhc3MkVnJCYXNlJEhlYWRNb3VudCBjbG9uZSgpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnJCYXNlT3V0ZXJDbGFzcyRWckJhc2UkSGVhZE1vdW50IG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgaW50IGNhY2hlZFNpemU7Ci0gICA8aW5pdD4oKTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyQmFzZU91dGVyQ2xhc3MkVnJCYXNlJEhlYWRNb3VudCBjbGVhcigpOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGRBcnJheSB1bmtub3duRmllbGREYXRhOwotICBqYXZhLmxhbmcuU3RyaW5nIG1vZGVsOwotICBqYXZhLmxhbmcuU3RyaW5nIHZlbmRvcjsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLmRldnRvb2xzLmJ1aWxkLmFuZHJvaWQuZGVzdWdhci5ydW50aW1lLlRocm93YWJsZUV4dGVuc2lvbiB7Ci0gIGJvb2xlYW4gdXNlTWltaWNTdHJhdGVneSgpOwotICBjb20uZ29vZ2xlLmRldnRvb2xzLmJ1aWxkLmFuZHJvaWQuZGVzdWdhci5ydW50aW1lLlRocm93YWJsZUV4dGVuc2lvbiRBYnN0cmFjdERlc3VnYXJpbmdTdHJhdGVneSBTVFJBVEVHWTsKLSAgdm9pZCBhZGRTdXBwcmVzc2VkKGphdmEubGFuZy5UaHJvd2FibGUsIGphdmEubGFuZy5UaHJvd2FibGUpOwotICBpbnQgQVBJX0xFVkVMOwotICBqYXZhLmxhbmcuSW50ZWdlciByZWFkQXBpTGV2ZWxGcm9tQnVpbGRWZXJzaW9uKCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5kZXZ0b29scy5idWlsZC5hbmRyb2lkLmRlc3VnYXIucnVudGltZS5UaHJvd2FibGVFeHRlbnNpb24kQWJzdHJhY3REZXN1Z2FyaW5nU3RyYXRlZ3kgewotICB2b2lkIHByaW50U3RhY2tUcmFjZShqYXZhLmxhbmcuVGhyb3dhYmxlLCBqYXZhLmlvLlByaW50U3RyZWFtKTsKLSAgdm9pZCBhZGRTdXBwcmVzc2VkKGphdmEubGFuZy5UaHJvd2FibGUsIGphdmEubGFuZy5UaHJvd2FibGUpOwotICB2b2lkIHByaW50U3RhY2tUcmFjZShqYXZhLmxhbmcuVGhyb3dhYmxlLCBqYXZhLmlvLlByaW50V3JpdGVyKTsKLSAgdm9pZCBwcmludFN0YWNrVHJhY2UoamF2YS5sYW5nLlRocm93YWJsZSk7Ci0gIGphdmEubGFuZy5UaHJvd2FibGVbXSBnZXRTdXBwcmVzc2VkKGphdmEubGFuZy5UaHJvd2FibGUpOwotICBqYXZhLmxhbmcuVGhyb3dhYmxlW10gRU1QVFlfVEhST1dBQkxFX0FSUkFZOwotICAgPGluaXQ+KCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5kZXZ0b29scy5idWlsZC5hbmRyb2lkLmRlc3VnYXIucnVudGltZS5UaHJvd2FibGVFeHRlbnNpb24kQ29uY3VycmVudFdlYWtJZGVudGl0eUhhc2hNYXAgewotICBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZVF1ZXVlIHJlZmVyZW5jZVF1ZXVlOwotICB2b2lkIGRlbGV0ZUVtcHR5S2V5cygpOwotICAgPGluaXQ+KCk7Ci0gIGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwIG1hcDsKLSAgamF2YS51dGlsLkxpc3QgZ2V0KGphdmEubGFuZy5UaHJvd2FibGUsIGJvb2xlYW4pOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUuZGV2dG9vbHMuYnVpbGQuYW5kcm9pZC5kZXN1Z2FyLnJ1bnRpbWUuVGhyb3dhYmxlRXh0ZW5zaW9uJENvbmN1cnJlbnRXZWFrSWRlbnRpdHlIYXNoTWFwJFdlYWtLZXkgewotICBqYXZhLmxhbmcuT2JqZWN0IGdldCgpOwotICBpbnQgaGFzaDsKLSAgIDxpbml0PihqYXZhLmxhbmcuVGhyb3dhYmxlLCBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZVF1ZXVlKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLmRldnRvb2xzLmJ1aWxkLmFuZHJvaWQuZGVzdWdhci5ydW50aW1lLlRocm93YWJsZUV4dGVuc2lvbiRNaW1pY0Rlc3VnYXJpbmdTdHJhdGVneSB7Ci0gIGphdmEubGFuZy5UaHJvd2FibGVbXSBFTVBUWV9USFJPV0FCTEVfQVJSQVk7Ci0gICA8aW5pdD4oKTsKLSAgY29tLmdvb2dsZS5kZXZ0b29scy5idWlsZC5hbmRyb2lkLmRlc3VnYXIucnVudGltZS5UaHJvd2FibGVFeHRlbnNpb24kQ29uY3VycmVudFdlYWtJZGVudGl0eUhhc2hNYXAgbWFwOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUuZGV2dG9vbHMuYnVpbGQuYW5kcm9pZC5kZXN1Z2FyLnJ1bnRpbWUuVGhyb3dhYmxlRXh0ZW5zaW9uJE51bGxEZXN1Z2FyaW5nU3RyYXRlZ3kgewotICAgPGluaXQ+KCk7Ci0gIGphdmEubGFuZy5UaHJvd2FibGVbXSBFTVBUWV9USFJPV0FCTEVfQVJSQVk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5kZXZ0b29scy5idWlsZC5hbmRyb2lkLmRlc3VnYXIucnVudGltZS5UaHJvd2FibGVFeHRlbnNpb24kUmV1c2VEZXN1Z2FyaW5nU3RyYXRlZ3kgewotICAgPGluaXQ+KCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyB7Ci0gIGJvb2xlYW4gcmVhZEJvb2woKTsKLSAgbG9uZyByZWFkUmF3TGl0dGxlRW5kaWFuNjQoKTsKLSAgYnl0ZVtdIGdldERhdGEoaW50LCBpbnQpOwotICBsb25nIHJlYWRVSW50NjQoKTsKLSAgdm9pZCBwb3BMaW1pdChpbnQpOwotICB2b2lkIHNraXBSYXdCeXRlcyhpbnQpOwotICB2b2lkIHNraXBNZXNzYWdlKCk7Ci0gIGxvbmcgcmVhZFNGaXhlZDY0KCk7Ci0gIGJvb2xlYW4gc2tpcEZpZWxkKGludCk7Ci0gIGxvbmcgcmVhZFNJbnQ2NCgpOwotICBpbnQgcmVhZEludDMyKCk7Ci0gIGludCBsYXN0VGFnOwotICBieXRlIHJlYWRSYXdCeXRlKCk7Ci0gIGxvbmcgcmVhZFJhd1ZhcmludDY0KCk7Ci0gIGludCBnZXRCeXRlc1VudGlsTGltaXQoKTsKLSAgYm9vbGVhbiBpc0F0RW5kKCk7Ci0gIGZsb2F0IHJlYWRGbG9hdCgpOwotICB2b2lkIGNoZWNrTGFzdFRhZ1dhcyhpbnQpOwotICBpbnQgcmVjdXJzaW9uTGltaXQ7Ci0gIGludCBidWZmZXJTaXplQWZ0ZXJMaW1pdDsKLSAgaW50IGJ1ZmZlclNpemU7Ci0gIGJ5dGVbXSBidWZmZXI7Ci0gIGludCByZWFkRW51bSgpOwotICBpbnQgYnVmZmVyU3RhcnQ7Ci0gIGludCBzaXplTGltaXQ7Ci0gIGphdmEubGFuZy5TdHJpbmcgcmVhZFN0cmluZygpOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vIG5ld0luc3RhbmNlKGJ5dGVbXSk7Ci0gIGludCByZWFkUmF3VmFyaW50MzIoKTsKLSAgdm9pZCByZXdpbmRUb1Bvc2l0aW9uKGludCk7Ci0gICA8aW5pdD4oYnl0ZVtdLCBpbnQsIGludCk7Ci0gIGludCBnZXRQb3NpdGlvbigpOwotICB2b2lkIHJlYWRHcm91cChjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uTWVzc2FnZU5hbm8sIGludCk7Ci0gIGludCByZWN1cnNpb25EZXB0aDsKLSAgdm9pZCByZWFkTWVzc2FnZShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uTWVzc2FnZU5hbm8pOwotICBsb25nIHJlYWRJbnQ2NCgpOwotICBpbnQgcmVhZFNGaXhlZDMyKCk7Ci0gIGludCByZWFkU0ludDMyKCk7Ci0gIGludCByZWFkVUludDMyKCk7Ci0gIGludCByZWFkUmF3TGl0dGxlRW5kaWFuMzIoKTsKLSAgbG9uZyBkZWNvZGVaaWdaYWc2NChsb25nKTsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyBuZXdJbnN0YW5jZShieXRlW10sIGludCwgaW50KTsKLSAgaW50IGJ1ZmZlclBvczsKLSAgZG91YmxlIHJlYWREb3VibGUoKTsKLSAgaW50IGN1cnJlbnRMaW1pdDsKLSAgaW50IGRlY29kZVppZ1phZzMyKGludCk7Ci0gIGxvbmcgcmVhZEZpeGVkNjQoKTsKLSAgYnl0ZVtdIHJlYWRCeXRlcygpOwotICBpbnQgcHVzaExpbWl0KGludCk7Ci0gIHZvaWQgcmVjb21wdXRlQnVmZmVyU2l6ZUFmdGVyTGltaXQoKTsKLSAgaW50IHJlYWRGaXhlZDMyKCk7Ci0gIGludCByZWFkVGFnKCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkT3V0cHV0Qnl0ZUJ1ZmZlck5hbm8gewotICBpbnQgY29tcHV0ZUludDY0U2l6ZU5vVGFnKGxvbmcpOwotICBpbnQgY29tcHV0ZVNJbnQ2NFNpemVOb1RhZyhsb25nKTsKLSAgdm9pZCB3cml0ZURvdWJsZU5vVGFnKGRvdWJsZSk7Ci0gIHZvaWQgd3JpdGVTRml4ZWQ2NE5vVGFnKGxvbmcpOwotICB2b2lkIHdyaXRlTWVzc2FnZShpbnQsIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5NZXNzYWdlTmFubyk7Ci0gIGludCBjb21wdXRlU0ZpeGVkNjRTaXplTm9UYWcobG9uZyk7Ci0gIGludCBlbmNvZGVkTGVuZ3RoR2VuZXJhbChqYXZhLmxhbmcuQ2hhclNlcXVlbmNlLCBpbnQpOwotICBpbnQgY29tcHV0ZVNGaXhlZDMyU2l6ZShpbnQsIGludCk7Ci0gIGludCBjb21wdXRlVUludDMyU2l6ZU5vVGFnKGludCk7Ci0gIHZvaWQgd3JpdGVGaXhlZDY0Tm9UYWcobG9uZyk7Ci0gIHZvaWQgd3JpdGVVSW50NjQoaW50LCBsb25nKTsKLSAgdm9pZCB3cml0ZUludDMyTm9UYWcoaW50KTsKLSAgdm9pZCB3cml0ZVJhd0J5dGUoaW50KTsKLSAgdm9pZCB3cml0ZUZsb2F0Tm9UYWcoZmxvYXQpOwotICBpbnQgY29tcHV0ZU1lc3NhZ2VTaXplTm9UYWcoY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLk1lc3NhZ2VOYW5vKTsKLSAgaW50IGNvbXB1dGVJbnQzMlNpemUoaW50LCBpbnQpOwotICBpbnQgY29tcHV0ZVVJbnQ2NFNpemUoaW50LCBsb25nKTsKLSAgdm9pZCB3cml0ZVJhd1ZhcmludDY0KGxvbmcpOwotICBpbnQgY29tcHV0ZVNJbnQ2NFNpemUoaW50LCBsb25nKTsKLSAgaW50IGVuY29kZWRMZW5ndGgoamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSk7Ci0gIHZvaWQgd3JpdGVJbnQ2NE5vVGFnKGxvbmcpOwotICBpbnQgY29tcHV0ZUZsb2F0U2l6ZU5vVGFnKGZsb2F0KTsKLSAgdm9pZCB3cml0ZVVJbnQzMk5vVGFnKGludCk7Ci0gIHZvaWQgd3JpdGVGbG9hdChpbnQsIGZsb2F0KTsKLSAgaW50IGNvbXB1dGVCeXRlc1NpemUoaW50LCBieXRlW10pOwotICB2b2lkIHdyaXRlR3JvdXBOb1RhZyhjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uTWVzc2FnZU5hbm8pOwotICBpbnQgY29tcHV0ZUVudW1TaXplTm9UYWcoaW50KTsKLSAgaW50IGNvbXB1dGVNZXNzYWdlU2l6ZShpbnQsIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5NZXNzYWdlTmFubyk7Ci0gIGludCBjb21wdXRlU3RyaW5nU2l6ZShpbnQsIGphdmEubGFuZy5TdHJpbmcpOwotICB2b2lkIGVuY29kZURpcmVjdChqYXZhLmxhbmcuQ2hhclNlcXVlbmNlLCBqYXZhLm5pby5CeXRlQnVmZmVyKTsKLSAgaW50IGNvbXB1dGVFbnVtU2l6ZShpbnQsIGludCk7Ci0gICA8aW5pdD4oamF2YS5uaW8uQnl0ZUJ1ZmZlcik7Ci0gIGludCBjb21wdXRlRml4ZWQ2NFNpemUoaW50LCBsb25nKTsKLSAgdm9pZCBlbmNvZGUoamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSwgamF2YS5uaW8uQnl0ZUJ1ZmZlcik7Ci0gIHZvaWQgd3JpdGVJbnQ2NChpbnQsIGxvbmcpOwotICB2b2lkIHdyaXRlU0ludDMyTm9UYWcoaW50KTsKLSAgdm9pZCB3cml0ZVNGaXhlZDMyTm9UYWcoaW50KTsKLSAgaW50IGNvbXB1dGVTSW50MzJTaXplTm9UYWcoaW50KTsKLSAgdm9pZCBjaGVja05vU3BhY2VMZWZ0KCk7Ci0gIGludCBjb21wdXRlVUludDY0U2l6ZU5vVGFnKGxvbmcpOwotICB2b2lkIHdyaXRlQm9vbE5vVGFnKGJvb2xlYW4pOwotICB2b2lkIHdyaXRlRml4ZWQzMk5vVGFnKGludCk7Ci0gIHZvaWQgd3JpdGVTdHJpbmdOb1RhZyhqYXZhLmxhbmcuU3RyaW5nKTsKLSAgaW50IGNvbXB1dGVCb29sU2l6ZU5vVGFnKGJvb2xlYW4pOwotICBpbnQgY29tcHV0ZUJ5dGVzU2l6ZU5vVGFnKGJ5dGVbXSk7Ci0gICA8aW5pdD4oYnl0ZVtdLCBpbnQsIGludCk7Ci0gIGludCBjb21wdXRlU3RyaW5nU2l6ZU5vVGFnKGphdmEubGFuZy5TdHJpbmcpOwotICBpbnQgY29tcHV0ZURvdWJsZVNpemVOb1RhZyhkb3VibGUpOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRPdXRwdXRCeXRlQnVmZmVyTmFubyBuZXdJbnN0YW5jZShieXRlW10sIGludCwgaW50KTsKLSAgaW50IGNvbXB1dGVHcm91cFNpemUoaW50LCBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uTWVzc2FnZU5hbm8pOwotICBpbnQgY29tcHV0ZVVJbnQzMlNpemUoaW50LCBpbnQpOwotICBpbnQgZW5jb2RlWmlnWmFnMzIoaW50KTsKLSAgbG9uZyBlbmNvZGVaaWdaYWc2NChsb25nKTsKLSAgdm9pZCB3cml0ZVJhd0J5dGVzKGJ5dGVbXSk7Ci0gIGludCBjb21wdXRlUmF3VmFyaW50MzJTaXplKGludCk7Ci0gIGludCBjb21wdXRlU0ZpeGVkMzJTaXplTm9UYWcoaW50KTsKLSAgaW50IGNvbXB1dGVTRml4ZWQ2NFNpemUoaW50LCBsb25nKTsKLSAgdm9pZCB3cml0ZVJhd0J5dGUoYnl0ZSk7Ci0gIHZvaWQgd3JpdGVSYXdMaXR0bGVFbmRpYW42NChsb25nKTsKLSAgdm9pZCB3cml0ZUJvb2woaW50LCBib29sZWFuKTsKLSAgaW50IGNvbXB1dGVTSW50MzJTaXplKGludCwgaW50KTsKLSAgamF2YS5uaW8uQnl0ZUJ1ZmZlciBidWZmZXI7Ci0gIGludCBlbmNvZGUoamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSwgYnl0ZVtdLCBpbnQsIGludCk7Ci0gIGludCBjb21wdXRlVGFnU2l6ZShpbnQpOwotICBpbnQgY29tcHV0ZUZpeGVkMzJTaXplTm9UYWcoaW50KTsKLSAgaW50IGNvbXB1dGVHcm91cFNpemVOb1RhZyhjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uTWVzc2FnZU5hbm8pOwotICBpbnQgY29tcHV0ZUZpeGVkMzJTaXplKGludCwgaW50KTsKLSAgdm9pZCB3cml0ZVJhd0xpdHRsZUVuZGlhbjMyKGludCk7Ci0gIHZvaWQgd3JpdGVCeXRlc05vVGFnKGJ5dGVbXSwgaW50LCBpbnQpOwotICB2b2lkIHdyaXRlTWVzc2FnZU5vVGFnKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5NZXNzYWdlTmFubyk7Ci0gIGludCBzcGFjZUxlZnQoKTsKLSAgdm9pZCB3cml0ZVN0cmluZyhpbnQsIGphdmEubGFuZy5TdHJpbmcpOwotICBpbnQgY29tcHV0ZUJ5dGVzU2l6ZU5vVGFnKGludCk7Ci0gIHZvaWQgd3JpdGVTSW50NjROb1RhZyhsb25nKTsKLSAgdm9pZCB3cml0ZVJhd0J5dGVzKGJ5dGVbXSwgaW50LCBpbnQpOwotICBpbnQgY29tcHV0ZURvdWJsZVNpemUoaW50LCBkb3VibGUpOwotICB2b2lkIHdyaXRlSW50MzIoaW50LCBpbnQpOwotICB2b2lkIHdyaXRlUmF3VmFyaW50MzIoaW50KTsKLSAgdm9pZCB3cml0ZURvdWJsZShpbnQsIGRvdWJsZSk7Ci0gIGludCBjb21wdXRlSW50NjRTaXplKGludCwgbG9uZyk7Ci0gIGludCBjb21wdXRlRmxvYXRTaXplKGludCwgZmxvYXQpOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRPdXRwdXRCeXRlQnVmZmVyTmFubyBuZXdJbnN0YW5jZShieXRlW10pOwotICB2b2lkIHdyaXRlVGFnKGludCwgaW50KTsKLSAgaW50IGNvbXB1dGVCb29sU2l6ZShpbnQsIGJvb2xlYW4pOwotICB2b2lkIHdyaXRlVUludDY0Tm9UYWcobG9uZyk7Ci0gIGludCBjb21wdXRlSW50MzJTaXplTm9UYWcoaW50KTsKLSAgdm9pZCB3cml0ZUJ5dGVzTm9UYWcoYnl0ZVtdKTsKLSAgdm9pZCB3cml0ZUVudW1Ob1RhZyhpbnQpOwotICBpbnQgY29tcHV0ZUZpeGVkNjRTaXplTm9UYWcobG9uZyk7Ci0gIGludCBjb21wdXRlUmF3VmFyaW50NjRTaXplKGxvbmcpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZE91dHB1dEJ5dGVCdWZmZXJOYW5vJE91dE9mU3BhY2VFeGNlcHRpb24gewotICAgPGluaXQ+KGludCwgaW50KTsKLSAgamF2YS5sYW5nLlRocm93YWJsZSBpbml0Q2F1c2UoamF2YS5sYW5nLlRocm93YWJsZSk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkV4dGVuZGFibGVNZXNzYWdlTmFubyB7Ci0gIGludCBjb21wdXRlU2VyaWFsaXplZFNpemUoKTsKLSAgYm9vbGVhbiBzdG9yZVVua25vd25GaWVsZChjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vLCBpbnQpOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRXh0ZW5kYWJsZU1lc3NhZ2VOYW5vIGNsb25lKCk7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gICA8aW5pdD4oKTsKLSAgdm9pZCB3cml0ZVRvKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZE91dHB1dEJ5dGVCdWZmZXJOYW5vKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRXh0ZW5zaW9uIHsKLSAgamF2YS5sYW5nLk9iamVjdCBnZXRSZXBlYXRlZFZhbHVlRnJvbShqYXZhLnV0aWwuTGlzdCk7Ci0gIHZvaWQgd3JpdGVUbyhqYXZhLmxhbmcuT2JqZWN0LCBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRPdXRwdXRCeXRlQnVmZmVyTmFubyk7Ci0gIHZvaWQgcmVhZERhdGFJbnRvKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Vbmtub3duRmllbGREYXRhLCBqYXZhLnV0aWwuTGlzdCk7Ci0gIGludCB0eXBlOwotICBib29sZWFuIHJlcGVhdGVkOwotICBpbnQgY29tcHV0ZVNlcmlhbGl6ZWRTaXplKGphdmEubGFuZy5PYmplY3QpOwotICBpbnQgY29tcHV0ZVJlcGVhdGVkU2VyaWFsaXplZFNpemUoamF2YS5sYW5nLk9iamVjdCk7Ci0gIGphdmEubGFuZy5PYmplY3QgZ2V0U2luZ3VsYXJWYWx1ZUZyb20oamF2YS51dGlsLkxpc3QpOwotICBqYXZhLmxhbmcuQ2xhc3MgY2xheno7Ci0gIHZvaWQgd3JpdGVSZXBlYXRlZERhdGEoamF2YS5sYW5nLk9iamVjdCwgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkT3V0cHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICAgPGluaXQ+KGludCwgamF2YS5sYW5nLkNsYXNzLCBpbnQsIGJvb2xlYW4pOwotICBpbnQgY29tcHV0ZVNpbmd1bGFyU2VyaWFsaXplZFNpemUoamF2YS5sYW5nLk9iamVjdCk7Ci0gIHZvaWQgd3JpdGVTaW5ndWxhckRhdGEoamF2YS5sYW5nLk9iamVjdCwgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkT3V0cHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICBqYXZhLmxhbmcuT2JqZWN0IHJlYWREYXRhKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICBpbnQgdGFnOwotICAgPGluaXQ+KGludCwgamF2YS5sYW5nLkNsYXNzLCBpbnQsIGJvb2xlYW4sIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5FeHRlbnNpb24kMSk7Ci0gIGphdmEubGFuZy5PYmplY3QgZ2V0VmFsdWVGcm9tKGphdmEudXRpbC5MaXN0KTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRXh0ZW5zaW9uJFByaW1pdGl2ZUV4dGVuc2lvbiB7Ci0gIGludCB0eXBlOwotICBqYXZhLmxhbmcuT2JqZWN0IHJlYWREYXRhKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICBpbnQgbm9uUGFja2VkVGFnOwotICBpbnQgdGFnOwotICAgPGluaXQ+KGludCwgamF2YS5sYW5nLkNsYXNzLCBpbnQsIGJvb2xlYW4sIGludCwgaW50KTsKLSAgaW50IHBhY2tlZFRhZzsKLSAgaW50IGNvbXB1dGVQYWNrZWREYXRhU2l6ZShqYXZhLmxhbmcuT2JqZWN0KTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGRBcnJheSB7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZERhdGEgZGF0YUF0KGludCk7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZERhdGEgREVMRVRFRDsKLSAgIDxpbml0PihpbnQpOwotICB2b2lkIHJlbW92ZShpbnQpOwotICBib29sZWFuIG1HYXJiYWdlOwotICBpbnQgbVNpemU7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IGNsb25lKCk7Ci0gIGludFtdIG1GaWVsZE51bWJlcnM7Ci0gIGludCBpZGVhbEJ5dGVBcnJheVNpemUoaW50KTsKLSAgdm9pZCBwdXQoaW50LCBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGREYXRhKTsKLSAgaW50IGlkZWFsSW50QXJyYXlTaXplKGludCk7Ci0gIGJvb2xlYW4gYXJyYXlFcXVhbHMoY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkRGF0YVtdLCBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGREYXRhW10sIGludCk7Ci0gIGJvb2xlYW4gaXNFbXB0eSgpOwotICBpbnQgc2l6ZSgpOwotICAgPGluaXQ+KCk7Ci0gIGludCBiaW5hcnlTZWFyY2goaW50KTsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkRGF0YVtdIG1EYXRhOwotICB2b2lkIGdjKCk7Ci0gIGJvb2xlYW4gYXJyYXlFcXVhbHMoaW50W10sIGludFtdLCBpbnQpOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGREYXRhIGdldChpbnQpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZERhdGEgewotICBieXRlW10gdG9CeXRlQXJyYXkoKTsKLSAgYm9vbGVhbiBlcXVhbHMoamF2YS5sYW5nLk9iamVjdCk7Ci0gIHZvaWQgYWRkVW5rbm93bkZpZWxkKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Vbmtub3duRmllbGREYXRhKTsKLSAgamF2YS5sYW5nLk9iamVjdCB2YWx1ZTsKLSAgdm9pZCB3cml0ZVRvKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZE91dHB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgdm9pZCBzZXRWYWx1ZShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRXh0ZW5zaW9uLCBqYXZhLmxhbmcuT2JqZWN0KTsKLSAgaW50IGNvbXB1dGVTZXJpYWxpemVkU2l6ZSgpOwotICAgPGluaXQ+KGNvbS5nb29nbGUucHJvdG9idWYubmFuby5FeHRlbnNpb24sIGphdmEubGFuZy5PYmplY3QpOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGREYXRhIGNsb25lKCk7Ci0gIGludCBoYXNoQ29kZSgpOwotICBqYXZhLnV0aWwuTGlzdCB1bmtub3duRmllbGREYXRhOwotICBqYXZhLmxhbmcuT2JqZWN0IGdldFZhbHVlKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5FeHRlbnNpb24pOwotICAgPGluaXQ+KCk7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5FeHRlbnNpb24gY2FjaGVkRXh0ZW5zaW9uOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5JbnRlcm5hbE5hbm8gewotICBqYXZhLmxhbmcuT2JqZWN0IExBWllfSU5JVF9MT0NLOwotICB2b2lkIGNsb25lVW5rbm93bkZpZWxkRGF0YShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRXh0ZW5kYWJsZU1lc3NhZ2VOYW5vLCBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRXh0ZW5kYWJsZU1lc3NhZ2VOYW5vKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uSW52YWxpZFByb3RvY29sQnVmZmVyTmFub0V4Y2VwdGlvbiB7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5JbnZhbGlkUHJvdG9jb2xCdWZmZXJOYW5vRXhjZXB0aW9uIG1hbGZvcm1lZFZhcmludCgpOwotICAgPGluaXQ+KGphdmEubGFuZy5TdHJpbmcpOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uSW52YWxpZFByb3RvY29sQnVmZmVyTmFub0V4Y2VwdGlvbiByZWN1cnNpb25MaW1pdEV4Y2VlZGVkKCk7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5JbnZhbGlkUHJvdG9jb2xCdWZmZXJOYW5vRXhjZXB0aW9uIGludmFsaWRXaXJlVHlwZSgpOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uSW52YWxpZFByb3RvY29sQnVmZmVyTmFub0V4Y2VwdGlvbiBuZWdhdGl2ZVNpemUoKTsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkludmFsaWRQcm90b2NvbEJ1ZmZlck5hbm9FeGNlcHRpb24gaW52YWxpZFRhZygpOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uSW52YWxpZFByb3RvY29sQnVmZmVyTmFub0V4Y2VwdGlvbiBpbnZhbGlkRW5kVGFnKCk7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5JbnZhbGlkUHJvdG9jb2xCdWZmZXJOYW5vRXhjZXB0aW9uIHRydW5jYXRlZE1lc3NhZ2UoKTsKLSAgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5NZXNzYWdlTmFubyB7Ci0gICA8aW5pdD4oKTsKLSAgdm9pZCB0b0J5dGVBcnJheShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uTWVzc2FnZU5hbm8sIGJ5dGVbXSwgaW50LCBpbnQpOwotICBieXRlW10gdG9CeXRlQXJyYXkoY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLk1lc3NhZ2VOYW5vKTsKLSAgdm9pZCB3cml0ZVRvKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZE91dHB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLk1lc3NhZ2VOYW5vIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uTWVzc2FnZU5hbm8sIGJ5dGVbXSwgaW50LCBpbnQpOwotICBpbnQgY29tcHV0ZVNlcmlhbGl6ZWRTaXplKCk7Ci0gIGJvb2xlYW4gbWVzc2FnZU5hbm9FcXVhbHMoY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLk1lc3NhZ2VOYW5vLCBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uTWVzc2FnZU5hbm8pOwotICBpbnQgZ2V0Q2FjaGVkU2l6ZSgpOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uTWVzc2FnZU5hbm8gbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICBpbnQgY2FjaGVkU2l6ZTsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLk1lc3NhZ2VOYW5vIGNsb25lKCk7Ci0gIGludCBnZXRTZXJpYWxpemVkU2l6ZSgpOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uTWVzc2FnZU5hbm8gbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5NZXNzYWdlTmFubywgYnl0ZVtdKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uTWVzc2FnZU5hbm9QcmludGVyIHsKLSAgamF2YS5sYW5nLlN0cmluZyBkZUNhbWVsQ2FzZWlmeShqYXZhLmxhbmcuU3RyaW5nKTsKLSAgamF2YS5sYW5nLlN0cmluZyBzYW5pdGl6ZVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nKTsKLSAgdm9pZCBwcmludChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLCBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKTsKLSAgamF2YS5sYW5nLlN0cmluZyBlc2NhcGVTdHJpbmcoamF2YS5sYW5nLlN0cmluZyk7Ci0gIGphdmEubGFuZy5TdHJpbmcgcHJpbnQoY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLk1lc3NhZ2VOYW5vKTsKLSAgdm9pZCBhcHBlbmRRdW90ZWRCeXRlcyhieXRlW10sIGphdmEubGFuZy5TdHJpbmdCdWZmZXIpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Vbmtub3duRmllbGREYXRhIHsKLSAgYnl0ZVtdIGJ5dGVzOwotICB2b2lkIHdyaXRlVG8oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkT3V0cHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICBpbnQgdGFnOwotICAgPGluaXQ+KGludCwgYnl0ZVtdKTsKLSAgaW50IGNvbXB1dGVTZXJpYWxpemVkU2l6ZSgpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5XaXJlRm9ybWF0TmFubyB7Ci0gIGludCBnZXRSZXBlYXRlZEZpZWxkQXJyYXlMZW5ndGgoY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubywgaW50KTsKLSAgZmxvYXRbXSBFTVBUWV9GTE9BVF9BUlJBWTsKLSAgYnl0ZVtdIEVNUFRZX0JZVEVTOwotICBkb3VibGVbXSBFTVBUWV9ET1VCTEVfQVJSQVk7Ci0gIGJvb2xlYW5bXSBFTVBUWV9CT09MRUFOX0FSUkFZOwotICBpbnQgZ2V0VGFnRmllbGROdW1iZXIoaW50KTsKLSAgamF2YS5sYW5nLlN0cmluZ1tdIEVNUFRZX1NUUklOR19BUlJBWTsKLSAgaW50IGdldFRhZ1dpcmVUeXBlKGludCk7Ci0gIGxvbmdbXSBFTVBUWV9MT05HX0FSUkFZOwotICBpbnRbXSBFTVBUWV9JTlRfQVJSQVk7Ci0gIGludCBtYWtlVGFnKGludCwgaW50KTsKLSAgYnl0ZVtdW10gRU1QVFlfQllURVNfQVJSQVk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLmFuZHJvaWQuUGFyY2VsYWJsZU1lc3NhZ2VOYW5vQ3JlYXRvciB7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5NZXNzYWdlTmFub1tdIG5ld0FycmF5KGludCk7Ci0gIHZvaWQgd3JpdGVUb1BhcmNlbChqYXZhLmxhbmcuQ2xhc3MsIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5NZXNzYWdlTmFubywgYW5kcm9pZC5vcy5QYXJjZWwpOwotICBqYXZhLmxhbmcuQ2xhc3MgbUNsYXp6OwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uTWVzc2FnZU5hbm8gY3JlYXRlRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5hdWRpby5EZXZpY2VJbmZvIHsKLSAgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgY29udGV4dDsKLSAgdm9pZCBuYXRpdmVVcGRhdGVIZWFkcGhvbmVTdGF0ZUNoYW5nZShsb25nLCBpbnQpOwotICBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXIgaGVhZHBob25lU3RhdGVSZWNlaXZlcjsKLSAgbG9uZyBhY2Nlc3MkMDAwKGNvbS5nb29nbGUudnIuYXVkaW8uRGV2aWNlSW5mbyk7Ci0gIHZvaWQgYWNjZXNzJDEwMChjb20uZ29vZ2xlLnZyLmF1ZGlvLkRldmljZUluZm8sIGxvbmcsIGludCk7Ci0gIGxvbmcgbmF0aXZlT2JqZWN0OwotICAgPGluaXQ+KGxvbmcsIGFuZHJvaWQuY29udGVudC5Db250ZXh0KTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmF1ZGlvLkRldmljZUluZm8kMSB7Ci0gICA8aW5pdD4oY29tLmdvb2dsZS52ci5hdWRpby5EZXZpY2VJbmZvKTsKLSAgY29tLmdvb2dsZS52ci5hdWRpby5EZXZpY2VJbmZvIHRoaXMkMDsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5BbmRyb2lkTkNvbXBhdCB7Ci0gIHZvaWQgc2V0VnJUaHJlYWQoaW50KTsKLSAgYm9vbGVhbiBoYW5kbGVWckNvcmVBYnNlbmNlKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQpOwotICBqYXZhLmxhbmcuU3RyaW5nIFRBRzsKLSAgaW50IGNoZWNrRm9yVnJDb3JlUHJlc2VuY2UoYW5kcm9pZC5jb250ZW50LkNvbnRleHQpOwotICBib29sZWFuIHNldFZyTW9kZUVuYWJsZWQoYW5kcm9pZC5hcHAuQWN0aXZpdHksIGJvb2xlYW4pOwotICBib29sZWFuIGlzVnJNb2RlU3VwcG9ydGVkKGFuZHJvaWQuY29udGVudC5Db250ZXh0KTsKLSAgdm9pZCBzaG93V2FybmluZ0RpYWxvZyhhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50LCBpbnQsIGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UkT25DbGlja0xpc3RlbmVyKTsKLSAgYm9vbGVhbiBzZXRTdXN0YWluZWRQZXJmb3JtYW5jZU1vZGUoYW5kcm9pZC5hcHAuQWN0aXZpdHksIGJvb2xlYW4pOwotICBib29sZWFuIGlzVnJNb2RlSGlnaFBlcmZvcm1hbmNlU3VwcG9ydGVkKGFuZHJvaWQuY29udGVudC5Db250ZXh0KTsKLSAgYm9vbGVhbiBzZXRWck1vZGVFbmFibGVkKGFuZHJvaWQuYXBwLkFjdGl2aXR5LCBib29sZWFuLCBpbnQpOwotICBib29sZWFuIGlzQXRMZWFzdE5NUjEoKTsKLSAgamF2YS5sYW5nLlN0cmluZyBhY2Nlc3MkMDAwKCk7Ci0gIGJvb2xlYW4gaXNBdExlYXN0TigpOwotICBpbnQgc1Nka0xldmVsT3ZlcnJpZGU7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuQW5kcm9pZE5Db21wYXQkMSB7Ci0gICA8aW5pdD4oYW5kcm9pZC5jb250ZW50LkNvbnRleHQpOwotICBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCB2YWwkY29udGV4dDsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5BbmRyb2lkTkNvbXBhdCQyIHsKLSAgIDxpbml0PihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCk7Ci0gIGFuZHJvaWQuY29udGVudC5Db250ZXh0IHZhbCRjb250ZXh0OwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLkFuZHJvaWROQ29tcGF0JDMgewotICAgPGluaXQ+KCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuQ2FyZGJvYXJkR0xTdXJmYWNlVmlldyB7Ci0gIGphdmEudXRpbC5BcnJheUxpc3QgZXZlbnRRdWV1ZVdoaWxlRGV0YWNoZWQ7Ci0gIGJvb2xlYW4gaXNSZW5kZXJlclNldDsKLSAgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuQ2FyZGJvYXJkR0xTdXJmYWNlVmlldyREZXRhY2hMaXN0ZW5lciBsaXN0ZW5lcjsKLSAgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuRWdsRmFjdG9yeSBlZ2xGYWN0b3J5OwotICB2b2lkIHNldEVHTFdpbmRvd1N1cmZhY2VGYWN0b3J5KGFuZHJvaWQub3BlbmdsLkdMU3VyZmFjZVZpZXckRUdMV2luZG93U3VyZmFjZUZhY3RvcnkpOwotICB2b2lkIHNldEVHTENvbnRleHRGYWN0b3J5KGFuZHJvaWQub3BlbmdsLkdMU3VyZmFjZVZpZXckRUdMQ29udGV4dEZhY3RvcnkpOwotICBib29sZWFuIGlzRGV0YWNoZWQ7Ci0gIGphdmEubGFuZy5TdHJpbmcgVEFHOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLkNhcmRib2FyZEdMU3VyZmFjZVZpZXckRGV0YWNoTGlzdGVuZXIgewotICB2b2lkIG9uU3VyZmFjZVZpZXdEZXRhY2hlZEZyb21XaW5kb3coKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5Db25maWdVdGlscyB7Ci0gIGJvb2xlYW4gcmVtb3ZlRGV2aWNlUGFyYW1zRnJvbUV4dGVybmFsU3RvcmFnZSgpOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uTWVzc2FnZU5hbm8gcmVhZEZyb21JbnB1dFN0cmVhbShqYXZhLmxhbmcuQ2xhc3MsIGphdmEuaW8uSW5wdXRTdHJlYW0sIGludCk7Ci0gIGphdmEubGFuZy5TdHJpbmcgVEFHOwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLkNhcmRib2FyZERldmljZSREZXZpY2VQYXJhbXMgcmVhZERldmljZVBhcmFtc0Zyb21FeHRlcm5hbFN0b3JhZ2UoKTsKLSAgYm9vbGVhbiB3cml0ZVRvT3V0cHV0U3RyZWFtKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5NZXNzYWdlTmFubywgamF2YS5pby5PdXRwdXRTdHJlYW0sIGludCk7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5NZXNzYWdlTmFubyByZWFkRnJvbUV4dGVybmFsU3RvcmFnZShqYXZhLmxhbmcuQ2xhc3MsIGphdmEubGFuZy5TdHJpbmcsIGludCwgYm9vbGVhbik7Ci0gIGJvb2xlYW4gd3JpdGVUb0V4dGVybmFsU3RvcmFnZShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uTWVzc2FnZU5hbm8sIGphdmEubGFuZy5TdHJpbmcsIGludCk7Ci0gIGJvb2xlYW4gd3JpdGVEaXNwbGF5UGFyYW1zVG9FeHRlcm5hbFN0b3JhZ2UoY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5EaXNwbGF5JERpc3BsYXlQYXJhbXMpOwotICBib29sZWFuIHdyaXRlRGV2aWNlUGFyYW1zVG9FeHRlcm5hbFN0b3JhZ2UoY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5DYXJkYm9hcmREZXZpY2UkRGV2aWNlUGFyYW1zKTsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5EaXNwbGF5JERpc3BsYXlQYXJhbXMgcmVhZERpc3BsYXlQYXJhbXNGcm9tRXh0ZXJuYWxTdG9yYWdlKCk7Ci0gIGphdmEuaW8uRmlsZSBnZXRDb25maWdGaWxlKGphdmEubGFuZy5TdHJpbmcpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLkNvbnRlbnRQcm92aWRlclZyUGFyYW1zUHJvdmlkZXIgewotICBhbmRyb2lkLm5ldC5Vcmkgc2RrQ29uZmlndXJhdGlvblBhcmFtc1NldHRpbmdVcmk7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5NZXNzYWdlTmFubyByZWFkUGFyYW1zKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5NZXNzYWdlTmFubywgYW5kcm9pZC5uZXQuVXJpLCBqYXZhLmxhbmcuU3RyaW5nKTsKLSAgYm9vbGVhbiB3cml0ZVBhcmFtcyhjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uTWVzc2FnZU5hbm8sIGFuZHJvaWQubmV0LlVyaSk7Ci0gIGFuZHJvaWQubmV0LlVyaSBkaXNwbGF5UGFyYW1zU2V0dGluZ1VyaTsKLSAgamF2YS5sYW5nLlN0cmluZyBUQUc7Ci0gIGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXJDbGllbnQgY2xpZW50OwotICBhbmRyb2lkLm5ldC5VcmkgdXNlclByZWZzVXJpOwotICAgPGluaXQ+KGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXJDbGllbnQsIGphdmEubGFuZy5TdHJpbmcpOwotICBhbmRyb2lkLm5ldC5VcmkgZGV2aWNlUGFyYW1zU2V0dGluZ1VyaTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5Db250ZXh0VXRpbHMgewotICBhbmRyb2lkLmFwcC5BY3Rpdml0eSBnZXRBY3Rpdml0eShhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCk7Ci0gIGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIGdldENvbXBvbmVudE5hbWUoYW5kcm9pZC5jb250ZW50LkNvbnRleHQpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLkRpc3BsYXlTeW5jaHJvbml6ZXIgewotICBhbmRyb2lkLnZpZXcuRGlzcGxheSBnZXREaXNwbGF5KCk7Ci0gIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlZCgpOwotICBhbmRyb2lkLnZpZXcuRGlzcGxheSBkaXNwbGF5OwotICBsb25nIGxhc3REaXNwbGF5Um90YXRpb25VcGRhdGVUaW1lTmFub3M7Ci0gIHZvaWQgc2h1dGRvd24oKTsKLSAgdm9pZCBzZXREaXNwbGF5KGFuZHJvaWQudmlldy5EaXNwbGF5KTsKLSAgbG9uZyBuYXRpdmVDcmVhdGUoamF2YS5sYW5nLkNsYXNzTG9hZGVyLCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCk7Ci0gIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLkZyYW1lTW9uaXRvciBmcmFtZU1vbml0b3I7Ci0gIHZvaWQgaW52YWxpZGF0ZURpc3BsYXlQcm9wZXJ0aWVzKCk7Ci0gIHZvaWQgbmF0aXZlVXBkYXRlKGxvbmcsIGxvbmcsIGludCk7Ci0gIHZvaWQgbmF0aXZlT25NZXRyaWNzQ2hhbmdlZChsb25nKTsKLSAgdm9pZCBuYXRpdmVEZXN0cm95KGxvbmcpOwotICBsb25nIERJU1BMQVlfUk9UQVRJT05fUkVGUkVTSF9JTlRFUlZBTF9OQU5PUzsKLSAgbG9uZyBnZXROYXRpdmVEaXNwbGF5U3luY2hyb25pemVyKCk7Ci0gIHZvaWQgb25SZXN1bWUoKTsKLSAgbG9uZyBuYXRpdmVEaXNwbGF5U3luY2hyb25pemVyOwotICB2b2lkIGNoZWNrTmF0aXZlRGlzcGxheVN5bmNocm9uaXplcigpOwotICAgPGluaXQ+KGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBhbmRyb2lkLnZpZXcuRGlzcGxheSk7Ci0gIGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljcyBkaXNwbGF5TWV0cmljczsKLSAgaW50IGRpc3BsYXlSb3RhdGlvbkRlZ3JlZXM7Ci0gIHZvaWQgb25QYXVzZSgpOwotICB2b2lkIG5hdGl2ZVJlc2V0KGxvbmcsIGxvbmcsIGxvbmcpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLkRpc3BsYXlVdGlscyB7Ci0gIGFuZHJvaWQudmlldy5EaXNwbGF5IGdldERlZmF1bHREaXNwbGF5KGFuZHJvaWQuY29udGVudC5Db250ZXh0KTsKLSAgYm9vbGVhbiBpc1NhbWVEaXNwbGF5KGFuZHJvaWQudmlldy5EaXNwbGF5LCBhbmRyb2lkLnZpZXcuRGlzcGxheSk7Ci0gIGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljcyBnZXREaXNwbGF5TWV0cmljc0xhbmRzY2FwZShhbmRyb2lkLnZpZXcuRGlzcGxheSk7Ci0gIGZsb2F0IGdldE1ldGVyc1BlclBpeGVsRnJvbURvdHNQZXJJbmNoKGZsb2F0KTsKLSAgamF2YS5sYW5nLlN0cmluZyBnZXRFeHRlcm5hbERpc3BsYXlOYW1lKGFuZHJvaWQuY29udGVudC5Db250ZXh0KTsKLSAgZmxvYXQgZ2V0Qm9yZGVyU2l6ZU1ldGVycyhjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLkRpc3BsYXkkRGlzcGxheVBhcmFtcyk7Ci0gIGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljcyBnZXREaXNwbGF5TWV0cmljc0xhbmRzY2FwZVdpdGhPdmVycmlkZShhbmRyb2lkLnZpZXcuRGlzcGxheSwgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5EaXNwbGF5JERpc3BsYXlQYXJhbXMpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLkVnbEZhY3RvcnkgewotICB2b2lkIHNldEVHTENvbnRleHRDbGllbnRWZXJzaW9uKGludCk7Ci0gIGJvb2xlYW4gdXNlRGVidWc7Ci0gICA8aW5pdD4oKTsKLSAgdm9pZCBzZXRVc2VQcmlvcml0eUNvbnRleHQoYm9vbGVhbik7Ci0gIGJvb2xlYW4gdXNlUHJvdGVjdGVkOwotICBpbnQgZWdsQ29udGV4dENsaWVudFZlcnNpb247Ci0gIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb250ZXh0IHNoYXJlZENvbnRleHQ7Ci0gIHZvaWQgc2V0RXJyb3JSZXBvcnRpbmdFbmFibGVkKGJvb2xlYW4pOwotICBib29sZWFuIHVzZVByaW9yaXR5OwotICB2b2lkIHNldFVzZURlYnVnKGJvb2xlYW4pOwotICB2b2lkIHNldFNoYXJlZENvbnRleHQoamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbnRleHQpOwotICBib29sZWFuIGVycm9yUmVwb3J0aW5nRW5hYmxlZDsKLSAgYm9vbGVhbiBzdXBwb3J0c1Byb3RlY3RlZENvbnRlbnQoamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTDEwLCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheSk7Ci0gIHZvaWQgc2V0VXNlUHJvdGVjdGVkQnVmZmVycyhib29sZWFuKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5FZ2xSZWFkeUxpc3RlbmVyIHsKLSAgaW50IGdsVmVyc2lvbjsKLSAgdm9pZCBjbGVhckNvbnRleHQoKTsKLSAgaW50IGdldEdMVmVyc2lvbigpOwotICBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29udGV4dCBnZXRFR0xDb250ZXh0KCk7Ci0gIGphdmEubGFuZy5PYmplY3QgbGlzdGVuZXJMb2NrOwotICBpbnQgcGFyc2VWZXJzaW9uU3RyaW5nKGphdmEubGFuZy5TdHJpbmcpOwotICBpbnQgZWdsQ29udGV4dEZsYWdzOwotICB2b2lkIHJlbGVhc2VFdmVudExpc3RlbmVyKCk7Ci0gIGphdmEubGFuZy5PYmplY3QgY29udGV4dEluZm9Mb2NrOwotICAgPGluaXQ+KCk7Ci0gIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLkVnbFJlYWR5TGlzdGVuZXIkRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcjsKLSAgaW50IGdldEVHTENvbnRleHRGbGFncygpOwotICB2b2lkIHNldEV2ZW50TGlzdGVuZXIoY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuRWdsUmVhZHlMaXN0ZW5lciRFdmVudExpc3RlbmVyKTsKLSAgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbnRleHQgZWdsQ29udGV4dDsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5FZ2xSZWFkeUxpc3RlbmVyJEV2ZW50TGlzdGVuZXIgewotICB2b2lkIG9uRWdsUmVhZHkoKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5FeHRlcm5hbFN1cmZhY2VNYW5hZ2VyIHsKLSAgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuRXh0ZXJuYWxTdXJmYWNlTWFuYWdlciRFeHRlcm5hbFN1cmZhY2VEYXRhIHN1cmZhY2VEYXRhOwotICBib29sZWFuIGlzQXR0YWNoZWRUb0dsQ29udGV4dDsKLSAgaW50IG5leHRJRDsKLSAgdm9pZCBuYXRpdmVVcGRhdGVTdXJmYWNlKGxvbmcsIGludCwgaW50LCBsb25nLCBmbG9hdFtdKTsKLSAgIDxpbml0Pihjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5FeHRlcm5hbFN1cmZhY2VNYW5hZ2VyJFVwZGF0ZVN1cmZhY2VDYWxsYmFjayk7Ci0gIGphdmEubGFuZy5PYmplY3Qgc3VyZmFjZURhdGFVcGRhdGVMb2NrOwotICBpbnQgY3JlYXRlRXh0ZXJuYWxTdXJmYWNlSW1wbChpbnQsIGludCwgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuRXh0ZXJuYWxTdXJmYWNlTWFuYWdlciRFeHRlcm5hbFN1cmZhY2VDYWxsYmFjayk7Ci0gIGphdmEubGFuZy5TdHJpbmcgVEFHOwotICBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5FeHRlcm5hbFN1cmZhY2VNYW5hZ2VyJFVwZGF0ZVN1cmZhY2VDYWxsYmFjayB1cGRhdGVTdXJmYWNlQ2FsbGJhY2s7Ci0gIHZvaWQgbmF0aXZlQ2FsbGJhY2sobG9uZyk7Ci0gIHZvaWQgYWNjZXNzJDAwMChsb25nLCBpbnQsIGludCwgbG9uZywgZmxvYXRbXSk7Ci0gIHZvaWQgYWNjZXNzJDIwMChsb25nKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5FeHRlcm5hbFN1cmZhY2VNYW5hZ2VyJDEgewotICAgPGluaXQ+KGxvbmcpOwotICBsb25nIHZhbCRuYXRpdmVTdXJmYWNlTWFuYWdlcjsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5FeHRlcm5hbFN1cmZhY2VNYW5hZ2VyJEFuZHJvaWRIYW5kbGVyQ2FsbGJhY2sgewotICAgPGluaXQ+KGphdmEubGFuZy5SdW5uYWJsZSwgamF2YS5sYW5nLlJ1bm5hYmxlLCBhbmRyb2lkLm9zLkhhbmRsZXIpOwotICBqYXZhLmxhbmcuUnVubmFibGUgc3VyZmFjZUxpc3RlbmVyOwotICBqYXZhLmxhbmcuUnVubmFibGUgZnJhbWVMaXN0ZW5lcjsKLSAgYW5kcm9pZC5vcy5IYW5kbGVyIGhhbmRsZXI7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuRXh0ZXJuYWxTdXJmYWNlTWFuYWdlciRFeHRlcm5hbFN1cmZhY2UgewotICAgPGluaXQ+KGludCwgaW50LCBpbnQsIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLkV4dGVybmFsU3VyZmFjZU1hbmFnZXIkRXh0ZXJuYWxTdXJmYWNlQ2FsbGJhY2spOwotICBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbiBoYXNOZXdGcmFtZTsKLSAgdm9pZCBtYXliZURldGFjaEZyb21DdXJyZW50R0xDb250ZXh0KCk7Ci0gIGludCBzdXJmYWNlVGV4dHVyZVdpZHRoOwotICBib29sZWFuIGlzQXR0YWNoZWQ7Ci0gIHZvaWQgbWF5YmVBdHRhY2hUb0N1cnJlbnRHTENvbnRleHQoaW50KTsKLSAgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW4gcmVsZWFzZWQ7Ci0gIGphdmEubGFuZy5PYmplY3QgYWNjZXNzJDQwMChjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5FeHRlcm5hbFN1cmZhY2VNYW5hZ2VyJEV4dGVybmFsU3VyZmFjZSk7Ci0gIGludCBzdXJmYWNlVGV4dHVyZUhlaWdodDsKLSAgamF2YS5sYW5nLk9iamVjdCBvbkZyYW1lQXZhaWxhYmxlU2h1dGRvd25Mb2NrOwotICB2b2lkIHNodXRkb3duKGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLkV4dGVybmFsU3VyZmFjZU1hbmFnZXIkVXBkYXRlU3VyZmFjZUNhbGxiYWNrKTsKLSAgYW5kcm9pZC52aWV3LlN1cmZhY2UgZ2V0U3VyZmFjZSgpOwotICBmbG9hdFtdIHRyYW5zZm9ybU1hdHJpeDsKLSAgYm9vbGVhbiBhY2Nlc3MkNTAwKGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLkV4dGVybmFsU3VyZmFjZU1hbmFnZXIkRXh0ZXJuYWxTdXJmYWNlKTsKLSAgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW4gYWNjZXNzJDEwMChjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5FeHRlcm5hbFN1cmZhY2VNYW5hZ2VyJEV4dGVybmFsU3VyZmFjZSk7Ci0gIHZvaWQgbWF5YmVBdHRhY2hUb0N1cnJlbnRHTENvbnRleHQoKTsKLSAgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuRXh0ZXJuYWxTdXJmYWNlTWFuYWdlciRFeHRlcm5hbFN1cmZhY2VDYWxsYmFjayBjYWxsYmFjazsKLSAgdm9pZCB1cGRhdGVTdXJmYWNlVGV4dHVyZShjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5FeHRlcm5hbFN1cmZhY2VNYW5hZ2VyJFVwZGF0ZVN1cmZhY2VDYWxsYmFjayk7Ci0gIGludCBpZDsKLSAgYW5kcm9pZC5ncmFwaGljcy5TdXJmYWNlVGV4dHVyZSBzdXJmYWNlVGV4dHVyZTsKLSAgaW50W10gZ2xUZXh0dXJlSWQ7Ci0gIGJvb2xlYW4gaXNTaHV0ZG93bjsKLSAgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW4gYWNjZXNzJDMwMChjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5FeHRlcm5hbFN1cmZhY2VNYW5hZ2VyJEV4dGVybmFsU3VyZmFjZSk7Ci0gIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLkV4dGVybmFsU3VyZmFjZU1hbmFnZXIkRXh0ZXJuYWxTdXJmYWNlQ2FsbGJhY2sgYWNjZXNzJDYwMChjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5FeHRlcm5hbFN1cmZhY2VNYW5hZ2VyJEV4dGVybmFsU3VyZmFjZSk7Ci0gIGFuZHJvaWQudmlldy5TdXJmYWNlIHN1cmZhY2U7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuRXh0ZXJuYWxTdXJmYWNlTWFuYWdlciRFeHRlcm5hbFN1cmZhY2UkMSB7Ci0gIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLkV4dGVybmFsU3VyZmFjZU1hbmFnZXIkRXh0ZXJuYWxTdXJmYWNlIHRoaXMkMDsKLSAgIDxpbml0Pihjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5FeHRlcm5hbFN1cmZhY2VNYW5hZ2VyJEV4dGVybmFsU3VyZmFjZSk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuRXh0ZXJuYWxTdXJmYWNlTWFuYWdlciRFeHRlcm5hbFN1cmZhY2VDYWxsYmFjayB7Ci0gIHZvaWQgY2FuY2VsUG9zdHMoKTsKLSAgdm9pZCBvblN1cmZhY2VBdmFpbGFibGUoKTsKLSAgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuRXh0ZXJuYWxTdXJmYWNlTWFuYWdlciRFeHRlcm5hbFN1cmZhY2VEYXRhIHsKLSAgamF2YS51dGlsLkhhc2hNYXAgc3VyZmFjZXNUb1JlbGVhc2U7Ci0gICA8aW5pdD4oKTsKLSAgIDxpbml0Pihjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5FeHRlcm5hbFN1cmZhY2VNYW5hZ2VyJEV4dGVybmFsU3VyZmFjZURhdGEpOwotICBqYXZhLnV0aWwuSGFzaE1hcCBzdXJmYWNlczsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5FeHRlcm5hbFN1cmZhY2VNYW5hZ2VyJE5hdGl2ZUNhbGxiYWNrIHsKLSAgYW5kcm9pZC5vcy5IYW5kbGVyIHN1cmZhY2VNYWluSGFuZGxlcjsKLSAgbG9uZyBuYXRpdmVGcmFtZUNhbGxiYWNrUHRyOwotICAgPGluaXQ+KGxvbmcsIGxvbmcpOwotICB2b2lkIGxhbWJkYSRuZXckMCRFeHRlcm5hbFN1cmZhY2VNYW5hZ2VyJE5hdGl2ZUNhbGxiYWNrKGxvbmcpOwotICBqYXZhLmxhbmcuUnVubmFibGUgc3VyZmFjZUxpc3RlbmVyOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLkV4dGVybmFsU3VyZmFjZU1hbmFnZXIkTmF0aXZlQ2FsbGJhY2skJExhbWJkYSQwIHsKLSAgbG9uZyBhcmckMTsKLSAgIDxpbml0Pihsb25nKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5FeHRlcm5hbFN1cmZhY2VNYW5hZ2VyJFVwZGF0ZVN1cmZhY2VDYWxsYmFjayB7Ci0gIHZvaWQgdXBkYXRlU3VyZmFjZShpbnQsIGludCwgbG9uZywgZmxvYXRbXSk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuRnJhbWVNb25pdG9yIHsKLSAgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkIGNob3Jlb2dyYXBoZXJPd25lclRocmVhZDsKLSAgdm9pZCBzaHV0ZG93bigpOwotICAgPGluaXQ+KGFuZHJvaWQudmlldy5DaG9yZW9ncmFwaGVyJEZyYW1lQ2FsbGJhY2spOwotICB2b2lkIGluaXQoKTsKLSAgdm9pZCBvblJlc3VtZSgpOwotICBhbmRyb2lkLnZpZXcuQ2hvcmVvZ3JhcGhlciRGcmFtZUNhbGxiYWNrIGNhbGxiYWNrOwotICBqYXZhLmxhbmcuU3RyaW5nIFRBRzsKLSAgYW5kcm9pZC5vcy5IYW5kbGVyIGhhbmRsZXI7Ci0gIHZvaWQgb25QYXVzZSgpOwotICAgPGluaXQ+KGFuZHJvaWQudmlldy5DaG9yZW9ncmFwaGVyLCBhbmRyb2lkLnZpZXcuQ2hvcmVvZ3JhcGhlciRGcmFtZUNhbGxiYWNrKTsKLSAgYW5kcm9pZC52aWV3LkNob3Jlb2dyYXBoZXIgY2hvcmVvZ3JhcGhlcjsKLSAgYm9vbGVhbiBpc1Jlc3VtZWQ7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuRnVsbHNjcmVlbk1vZGUgewotICB2b2lkIGFjY2VzcyQwMDAoY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuRnVsbHNjcmVlbk1vZGUpOwotICBhbmRyb2lkLnZpZXcuV2luZG93IHdpbmRvdzsKLSAgdm9pZCBzZXRJbW1lcnNpdmVTdGlja3lNb2RlQ29tcGF0KCk7Ci0gIHZvaWQgc2V0RnVsbHNjcmVlbk1vZGVGbGFncygpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLkZ1bGxzY3JlZW5Nb2RlJDEgewotICBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5GdWxsc2NyZWVuTW9kZSB0aGlzJDA7Ci0gIGFuZHJvaWQub3MuSGFuZGxlciB2YWwkaGFuZGxlcjsKLSAgIDxpbml0Pihjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5GdWxsc2NyZWVuTW9kZSwgYW5kcm9pZC5vcy5IYW5kbGVyKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5GdWxsc2NyZWVuTW9kZSQxJDEgewotICBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5GdWxsc2NyZWVuTW9kZSQxIHRoaXMkMTsKLSAgIDxpbml0Pihjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5GdWxsc2NyZWVuTW9kZSQxKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5Jc0VtdWxhdG9yIHsKLSAgYm9vbGVhbiBpc0VtdWxhdG9yKCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuTGVnYWN5VnJQYXJhbXNQcm92aWRlciB7Ci0gIGphdmEubGFuZy5TdHJpbmcgVEFHOwotICBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBjb250ZXh0OwotICAgPGluaXQ+KGFuZHJvaWQuY29udGVudC5Db250ZXh0KTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5NdXRhYmxlRWdsQ29uZmlnQ2hvb3NlciB7Ci0gIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb25maWcgY2hvb3NlQ29uZmlnKGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0wxMCwgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTERpc3BsYXksIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb25maWdbXSwgYm9vbGVhbik7Ci0gIGludCBmaW5kQ29uZmlnQXR0cmliKGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0wxMCwgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTERpc3BsYXksIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb25maWcsIGludCwgaW50KTsKLSAgIDxpbml0PigpOwotICBib29sZWFuIGZvcmNlTXV0YWJsZUJ1ZmZlcjsKLSAgYm9vbGVhbiBJU19FTVVMQVRPUjsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5ORkNVdGlscyB7Ci0gIGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlciBuZmNCcm9hZGNhc3RSZWNlaXZlcjsKLSAgdm9pZCBvbk5GQ1RhZ0RldGVjdGVkKGFuZHJvaWQubmZjLlRhZyk7Ci0gIGJvb2xlYW4gaXNORkNFbmFibGVkKCk7Ci0gIGFuZHJvaWQuY29udGVudC5Db250ZXh0IGNvbnRleHQ7Ci0gIGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXIgY3JlYXRlTmZjSW50ZW50RmlsdGVyKCk7Ci0gIGphdmEubGFuZy5TdHJpbmcgYWNjZXNzJDAwMCgpOwotICBqYXZhLmxhbmcuU3RyaW5nIFRBRzsKLSAgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcltdIG5mY0ludGVudEZpbHRlcnM7Ci0gIGFuZHJvaWQubmZjLk5mY0FkYXB0ZXIgbmZjQWRhcHRlcjsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5ORkNVdGlscyQxIHsKLSAgIDxpbml0Pihjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5ORkNVdGlscyk7Ci0gIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLk5GQ1V0aWxzIHRoaXMkMDsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5QYWNrYWdlVXRpbHMgewotICBib29sZWFuIGlzU3lzdGVtUGFja2FnZShhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgamF2YS5sYW5nLlN0cmluZyk7Ci0gIGJvb2xlYW4gaXNHb29nbGVQYWNrYWdlKGphdmEubGFuZy5TdHJpbmcpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlBwaU92ZXJyaWRlcyB7Ci0gIGphdmEudXRpbC5MaXN0IFBQSV9PVkVSUklERVM7Ci0gIGphdmEudXRpbC5BcnJheUxpc3Qgc3VwcG9ydGVkRGlzcGxheVNpemVzOwotICBib29sZWFuIGdldFBwaU92ZXJyaWRlKGphdmEudXRpbC5MaXN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLkRpc3BsYXkkRGlzcGxheVBhcmFtcyk7Ci0gIHZvaWQgcmVnaXN0ZXJPdmVycmlkZXNJbnRlcm5hbChqYXZhLnV0aWwuTGlzdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZyk7Ci0gIGphdmEubGFuZy5TdHJpbmcgVEFHOwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLkRpc3BsYXkkRGlzcGxheVBhcmFtcyBnZXRQcGlPdmVycmlkZShhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCk7Ci0gIGphdmEudXRpbC5BcnJheUxpc3QgZ2V0U3VwcG9ydGVkRGlzcGxheVNpemVzKGFuZHJvaWQudmlldy5EaXNwbGF5KTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5QcGlPdmVycmlkZXMkUHBpT3ZlcnJpZGUgewotICBmbG9hdCB4UHBpOwotICBmbG9hdCB5UHBpOwotICBqYXZhLmxhbmcuU3RyaW5nIG1hbnVmYWN0dXJlcjsKLSAgamF2YS5sYW5nLlN0cmluZyBoYXJkd2FyZTsKLSAgIDxpbml0PihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBmbG9hdCwgZmxvYXQpOwotICBib29sZWFuIGlzTWF0Y2hpbmcoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZyk7Ci0gIGphdmEubGFuZy5TdHJpbmcgZGV2aWNlOwotICBqYXZhLmxhbmcuU3RyaW5nIG1vZGVsOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlIgewotICBib29sZWFuIHNSZXNvdXJjZXNEaWRMb2FkOwotICB2b2lkIG9uUmVzb3VyY2VzTG9hZGVkU3RyaW5nKGludCk7Ci0gIHZvaWQgb25SZXNvdXJjZXNMb2FkZWRTdHlsZShpbnQpOwotICBib29sZWFuICRhc3NlcnRpb25zRGlzYWJsZWQ7Ci0gIHZvaWQgb25SZXNvdXJjZXNMb2FkZWREcmF3YWJsZShpbnQpOwotICB2b2lkIG9uUmVzb3VyY2VzTG9hZGVkQ29sb3IoaW50KTsKLSAgdm9pZCBvblJlc291cmNlc0xvYWRlZElkKGludCk7Ci0gIHZvaWQgb25SZXNvdXJjZXNMb2FkZWREaW1lbihpbnQpOwotICB2b2lkIG9uUmVzb3VyY2VzTG9hZGVkTGF5b3V0KGludCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuUiRjb2xvciB7Ci0gIGludCB3aGl0ZV90cmFuc3BhcmVudDsKLSAgaW50IGFsaWdubWVudF9tYXJrZXJfY29sb3I7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuUiRkaW1lbiB7Ci0gIGludCBhbGlnbm1lbnRfbWFya2VyX2hlaWdodDsKLSAgaW50IGFsaWdubWVudF9tYXJrZXJfdGhpY2tuZXNzOwotICBpbnQgdHJhbnNpdGlvbl9ib3R0b21fYmFyX2hlaWdodDsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5SJGRyYXdhYmxlIHsKLSAgaW50IHF1YW50dW1faWNfY2xvc2Vfd2hpdGVfMjQ7Ci0gIGludCB0cmFuc2l0aW9uOwotICBpbnQgcmlwcGxlYWJsZTsKLSAgaW50IHF1YW50dW1faWNfc2V0dGluZ3Nfd2hpdGVfMjQ7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuUiRpZCB7Ci0gIGludCB0cmFuc2l0aW9uX2ljb247Ci0gIGludCB1aV9zZXR0aW5nc19idXR0b247Ci0gIGludCB0cmFuc2l0aW9uX3RleHQ7Ci0gIGludCB0cmFuc2l0aW9uX2ZyYW1lOwotICBpbnQgdWlfYmFja19idXR0b247Ci0gIGludCBiYWNrX2J1dHRvbjsKLSAgaW50IHVpX2FsaWdubWVudF9tYXJrZXI7Ci0gIGludCB0cmFuc2l0aW9uX3F1ZXN0aW9uX3RleHQ7Ci0gIGludCB0cmFuc2l0aW9uX3RvcF9mcmFtZTsKLSAgaW50IHVpX3NldHRpbmdzX2J1dHRvbl9ob2xkZXI7Ci0gIGludCB0cmFuc2l0aW9uX2JvdHRvbV9mcmFtZTsKLSAgaW50IHVpX2JhY2tfYnV0dG9uX2hvbGRlcjsKLSAgaW50IGRpdmlkZXI7Ci0gIGludCB0cmFuc2l0aW9uX3N3aXRjaF9hY3Rpb247Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuUiRsYXlvdXQgewotICBpbnQgdWlfbGF5ZXJfd2l0aF9wb3J0cmFpdF9zdXBwb3J0OwotICBpbnQgc2V0dGluZ3NfYnV0dG9uOwotICBpbnQgYmFja19idXR0b247Ci0gIGludCB1aV9sYXllcjsKLSAgaW50IHRyYW5zaXRpb25fdmlldzsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5SJHN0cmluZyB7Ci0gIGludCBkaWFsb2dfYnV0dG9uX29wZW5faGVscF9jZW50ZXI7Ci0gIGludCBzd2l0Y2hfdmlld2VyX3Byb21wdDsKLSAgaW50IGRpYWxvZ190aXRsZV92cl9jb3JlX25vdF9lbmFibGVkOwotICBpbnQgZGlhbG9nX3RpdGxlOwotICBpbnQgZGlhbG9nX21lc3NhZ2Vfbm9fY2FyZGJvYXJkOwotICBpbnQgZGlhbG9nX3RpdGxlX2luY29tcGF0aWJsZV9waG9uZTsKLSAgaW50IHBsYWNlX3lvdXJfcGhvbmVfaW50b19jYXJkYm9hcmQ7Ci0gIGludCBkaWFsb2dfdnJfY29yZV9ub3RfaW5zdGFsbGVkOwotICBpbnQgc2V0dXBfYnV0dG9uOwotICBpbnQgZGlhbG9nX3RpdGxlX3dhcm5pbmc7Ci0gIGludCBzZXR0aW5nc19idXR0b25fY29udGVudF9kZXNjcmlwdGlvbjsKLSAgaW50IGdvX3RvX3ZyX2xpc3RlbmVyc19zZXR0aW5nc19idXR0b247Ci0gIGludCBkaWFsb2dfdnJfY29yZV9ub3RfZW5hYmxlZDsKLSAgaW50IG5vX2Jyb3dzZXJfdGV4dDsKLSAgaW50IGRpYWxvZ190aXRsZV92cl9jb3JlX25vdF9pbnN0YWxsZWQ7Ci0gIGludCBiYWNrX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uOwotICBpbnQgZGlhbG9nX21lc3NhZ2VfaW5jb21wYXRpYmxlX3Bob25lOwotICBpbnQgcGxhY2VfeW91cl92aWV3ZXJfaW50b192aWV3ZXJfZm9ybWF0OwotICBpbnQgZGlhbG9nX2J1dHRvbl9nb3RfaXQ7Ci0gIGludCBnb190b19wbGF5c3RvcmVfYnV0dG9uOwotICBpbnQgZ3ZyX3ZyX21vZGVfY29tcG9uZW50OwotICBpbnQgc3dpdGNoX3ZpZXdlcl9hY3Rpb247Ci0gIGludCBjYW5jZWxfYnV0dG9uOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlIkc3R5bGUgewotICBpbnQgTm9TeXN0ZW1VSTsKLSAgaW50IFVpQnV0dG9uOwotICBpbnQgVnJBY3Rpdml0eVRoZW1lOwotICBpbnQgR3ZyRGlhbG9nVGhlbWU7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuU2NhbmxpbmVSYWNpbmdSZW5kZXJlciB7Ci0gIGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyU3VyZmFjZVZpZXcgYWNjZXNzJDAwMChjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5TY2FubGluZVJhY2luZ1JlbmRlcmVyKTsKLSAgdm9pZCBzZXRTdXJmYWNlU2l6ZShpbnQsIGludCk7Ci0gIHZvaWQgc2V0U3VyZmFjZVZpZXcoY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJTdXJmYWNlVmlldyk7Ci0gICA8aW5pdD4oY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJBcGkpOwotICB2b2lkIG9uU3VyZmFjZURlc3Ryb3llZCgpOwotICB2b2lkIG9uUGF1c2UoKTsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJBcGkgZ3ZyQXBpOwotICBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2clN1cmZhY2VWaWV3IGd2clN1cmZhY2VWaWV3OwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlNjYW5saW5lUmFjaW5nUmVuZGVyZXIkMSB7Ci0gICA8aW5pdD4oY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuU2NhbmxpbmVSYWNpbmdSZW5kZXJlciwgaW50LCBpbnQpOwotICBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5TY2FubGluZVJhY2luZ1JlbmRlcmVyIHRoaXMkMDsKLSAgaW50IHZhbCRzdXJmYWNlV2lkdGhQaXhlbHM7Ci0gIGludCB2YWwkc3VyZmFjZUhlaWdodFBpeGVsczsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5TY3JlZW5PcmllbnRhdGlvbkRldGVjdG9yIHsKLSAgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuU2NyZWVuT3JpZW50YXRpb25EZXRlY3RvciRMaXN0ZW5lciBjbGllbnRMaXN0ZW5lcjsKLSAgaW50IHBvcnRyYWl0VG9sZXJhbmNlRGVncmVlczsKLSAgaW50IGN1cnJlbnRTY3JlZW5PcmllbnRhdGlvbjsKLSAgaW50IGxhbmRzY2FwZVRvbGVyYW5jZURlZ3JlZXM7Ci0gIGludCBkZXRlcm1pbmVTY3JlZW5PcmllbnRhdGlvbihpbnQpOwotICAgPGluaXQ+KGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5TY3JlZW5PcmllbnRhdGlvbkRldGVjdG9yJExpc3RlbmVyLCBpbnQsIGludCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuU2NyZWVuT3JpZW50YXRpb25EZXRlY3RvciRMaXN0ZW5lciB7Ci0gIHZvaWQgb25TY3JlZW5PcmllbnRhdGlvbkNoYW5nZWQoaW50KTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5TdG9yYWdlUGVybWlzc2lvblV0aWxzIHsKLSAgamF2YS5sYW5nLlN0cmluZyBUQUc7Ci0gICA8aW5pdD4oKTsKLSAgdm9pZCByZXF1ZXN0U3RvcmFnZVBlcm1pc3Npb24oYW5kcm9pZC5jb250ZW50LkNvbnRleHQpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlN1cmZhY2VDcmVhdGVSZWNvcmQgewotICBqYXZhLmxhbmcuUnVubmFibGUgc3VyZmFjZUxpc3RlbmVyOwotICBpbnQgd2lkdGg7Ci0gIGphdmEubGFuZy5SdW5uYWJsZSBmcmFtZUxpc3RlbmVyOwotICBpbnQgaGVpZ2h0OwotICBhbmRyb2lkLm9zLkhhbmRsZXIgaGFuZGxlcjsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5UaHJlYWRVdGlscyB7Ci0gIGJvb2xlYW4gcnVubmluZ09uVWlUaHJlYWQoKTsKLSAgdm9pZCBydW5PblVpVGhyZWFkKGphdmEubGFuZy5SdW5uYWJsZSk7Ci0gIGFuZHJvaWQub3MuSGFuZGxlciB1aUhhbmRsZXI7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuVHJhbnNpdGlvblZpZXcgewotICBpbnQgZ2V0V2lkdGgoKTsKLSAgIDxpbml0PihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCk7Ci0gIGludCBnZXRWaXNpYmlsaXR5KCk7Ci0gIGJvb2xlYW4gaXNMYW5kc2NhcGVSaWdodChpbnQpOwotICB2b2lkIHNldFZpZXdlck5hbWUoamF2YS5sYW5nLlN0cmluZyk7Ci0gIHZvaWQgcm90YXRlVmlld0lmTmVlZGVkKCk7Ci0gIGphdmEubGFuZy5SdW5uYWJsZSBhY2Nlc3MkNjAwKGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlRyYW5zaXRpb25WaWV3KTsKLSAgaW50IG9yaWVudGF0aW9uOwotICBpbnQgYWNjZXNzJDEwMihjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5UcmFuc2l0aW9uVmlldywgaW50KTsKLSAgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMgZ2V0UmVzb3VyY2VzKCk7Ci0gIHZvaWQgc3RvcE9yaWVudGF0aW9uTW9uaXRvcigpOwotICBib29sZWFuIGlzUG9ydHJhaXQoaW50KTsKLSAgdm9pZCBzdGFydE9yaWVudGF0aW9uTW9uaXRvcigpOwotICBhbmRyb2lkLnZpZXcuT3JpZW50YXRpb25FdmVudExpc3RlbmVyIG9yaWVudGF0aW9uRXZlbnRMaXN0ZW5lcjsKLSAgamF2YS5sYW5nLlJ1bm5hYmxlIHRyYW5zaXRpb25MaXN0ZW5lcjsKLSAgdm9pZCB1cGRhdGVCYWNrQnV0dG9uVmlzaWJpbGl0eSgpOwotICBhbmRyb2lkLndpZGdldC5JbWFnZUJ1dHRvbiBiYWNrQnV0dG9uOwotICBhbmRyb2lkLnZpZXcuVmlld1BhcmVudCBnZXRQYXJlbnQoKTsKLSAgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgZ2V0Q29udGV4dCgpOwotICBpbnQgZ2V0SGVpZ2h0KCk7Ci0gIHZvaWQgYWNjZXNzJDMwMChjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5UcmFuc2l0aW9uVmlldyk7Ci0gIHZvaWQgZmFkZU91dEFuZFJlbW92ZShib29sZWFuKTsKLSAgdm9pZCBzZXRUcmFuc2l0aW9uTGlzdGVuZXIoamF2YS5sYW5nLlJ1bm5hYmxlKTsKLSAgdm9pZCBzZXRCYWNrQnV0dG9uTGlzdGVuZXIoamF2YS5sYW5nLlJ1bm5hYmxlKTsKLSAgdm9pZCBzZXRCYWNrZ3JvdW5kKGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUpOwotICBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbiBnZXRBbmltYXRpb24oKTsKLSAgdm9pZCBzZXRWaXNpYmlsaXR5KGludCk7Ci0gIGJvb2xlYW4gcm90YXRpb25DaGVja2VkOwotICB2b2lkIGFjY2VzcyQwMDAoY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuVHJhbnNpdGlvblZpZXcsIGJvb2xlYW4pOwotICB2b2lkIHNldExheW91dFBhcmFtcyhhbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcyk7Ci0gIGFuZHJvaWQudmlldy5WaWV3IGZpbmRWaWV3QnlJZChpbnQpOwotICB2b2lkIHJlbW92ZUFsbFZpZXdzKCk7Ci0gIHZvaWQgaW5mbGF0ZUNvbnRlbnRWaWV3KGludCk7Ci0gIHZvaWQgY2xlYXJBbmltYXRpb24oKTsKLSAgYm9vbGVhbiBhY2Nlc3MkNDAwKGludCk7Ci0gIHZvaWQgc2V0T25Ub3VjaExpc3RlbmVyKGFuZHJvaWQudmlldy5WaWV3JE9uVG91Y2hMaXN0ZW5lcik7Ci0gIGJvb2xlYW4gYWNjZXNzJDUwMChpbnQpOwotICB2b2lkIHN0YXJ0QW5pbWF0aW9uKGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uKTsKLSAgYm9vbGVhbiBhY2Nlc3MkMjAwKGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlRyYW5zaXRpb25WaWV3KTsKLSAgYm9vbGVhbiBpc0xhbmRzY2FwZUxlZnQoaW50KTsKLSAgaW50IGdldExheW91dERpcmVjdGlvbigpOwotICBqYXZhLmxhbmcuUnVubmFibGUgYmFja0J1dHRvbkxpc3RlbmVyOwotICBqYXZhLmxhbmcuUnVubmFibGUgYWNjZXNzJDcwMChjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5UcmFuc2l0aW9uVmlldyk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuVHJhbnNpdGlvblZpZXckMSB7Ci0gIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlRyYW5zaXRpb25WaWV3IHRoaXMkMDsKLSAgIDxpbml0Pihjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5UcmFuc2l0aW9uVmlldyk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuVHJhbnNpdGlvblZpZXckMiB7Ci0gICA8aW5pdD4oY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuVHJhbnNpdGlvblZpZXcpOwotICBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5UcmFuc2l0aW9uVmlldyB0aGlzJDA7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuVHJhbnNpdGlvblZpZXckMyB7Ci0gIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlRyYW5zaXRpb25WaWV3IHRoaXMkMDsKLSAgIDxpbml0Pihjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5UcmFuc2l0aW9uVmlldywgYW5kcm9pZC5jb250ZW50LkNvbnRleHQpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlRyYW5zaXRpb25WaWV3JDQgewotICAgPGluaXQ+KGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlRyYW5zaXRpb25WaWV3KTsKLSAgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuVHJhbnNpdGlvblZpZXcgdGhpcyQwOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlRyYW5zaXRpb25WaWV3JDUgewotICBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5UcmFuc2l0aW9uVmlldyB0aGlzJDA7Ci0gICA8aW5pdD4oY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuVHJhbnNpdGlvblZpZXcpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlVpTGF5ZXIgewotICBqYXZhLmxhbmcuU3RyaW5nIHZpZXdlck5hbWU7Ci0gIGFuZHJvaWQudmlldy5WaWV3IGFjY2VzcyQ3MDAoY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuVWlMYXllcik7Ci0gIGJvb2xlYW4gaXNBbGlnbm1lbnRNYXJrZXJFbmFibGVkOwotICBhbmRyb2lkLnZpZXcuVmlldyBiYWNrQnV0dG9uSG9sZGVyOwotICB2b2lkIHNldEJhY2tCdXR0b25MaXN0ZW5lcihqYXZhLmxhbmcuUnVubmFibGUpOwotICBib29sZWFuIGlzU2V0dGluZ3NCdXR0b25FbmFibGVkOwotICBpbnQgYWNjZXNzJDEzMDAoY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuVWlMYXllcik7Ci0gIGFuZHJvaWQud2lkZ2V0LlJlbGF0aXZlTGF5b3V0IHJvb3RJbm5lckxheW91dDsKLSAgYm9vbGVhbiB0cmFuc2l0aW9uVmlld0VuYWJsZWQ7Ci0gIGJvb2xlYW4gZ2V0QWxpZ25tZW50TWFya2VyRW5hYmxlZCgpOwotICBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBhY2Nlc3MkMDAwKGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlVpTGF5ZXIpOwotICBqYXZhLmxhbmcuUnVubmFibGUgYnV0dG9uQ2xpY2tDYWxsYmFja092ZXJyaWRlOwotICBhbmRyb2lkLndpZGdldC5SZWxhdGl2ZUxheW91dCBhbGlnbm1lbnRNYXJrZXI7Ci0gICA8aW5pdD4oYW5kcm9pZC5jb250ZW50LkNvbnRleHQpOwotICBpbnQgY29tcHV0ZVZpc2liaWxpdHkoYm9vbGVhbik7Ci0gIGJvb2xlYW4gZ2V0QmFja0J1dHRvbkVuYWJsZWQoKTsKLSAgYW5kcm9pZC53aWRnZXQuUmVsYXRpdmVMYXlvdXQgYWNjZXNzJDExMDAoY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuVWlMYXllcik7Ci0gIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlRyYW5zaXRpb25WaWV3IGFjY2VzcyQxMjAwKGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlVpTGF5ZXIpOwotICBhbmRyb2lkLnZpZXcuVmlldyBhY2Nlc3MkOTAwKGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlVpTGF5ZXIpOwotICB2b2lkIHNjYWxlQWxpZ25tZW50TWFya2VyTGF5b3V0UGFyYW1zKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBmbG9hdCwgYW5kcm9pZC53aWRnZXQuUmVsYXRpdmVMYXlvdXQkTGF5b3V0UGFyYW1zKTsKLSAgdm9pZCBzZXRWaWV3ZXJOYW1lKGphdmEubGFuZy5TdHJpbmcpOwotICB2b2lkIHNldFNldHRpbmdzQnV0dG9uRW5hYmxlZChib29sZWFuKTsKLSAgYm9vbGVhbiBpc0VuYWJsZWQ7Ci0gIGphdmEubGFuZy5SdW5uYWJsZSBiYWNrQnV0dG9uTGlzdGVuZXI7Ci0gIGJvb2xlYW4gaXNFbmFibGVkKCk7Ci0gIHZvaWQgc2V0VHJhbnNpdGlvblZpZXdMaXN0ZW5lcihqYXZhLmxhbmcuUnVubmFibGUpOwotICB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbik7Ci0gIGphdmEubGFuZy5SdW5uYWJsZSBhY2Nlc3MkMzAwKGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlVpTGF5ZXIpOwotICBqYXZhLmxhbmcuUnVubmFibGUgYWNjZXNzJDEwMChjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5VaUxheWVyKTsKLSAgYW5kcm9pZC53aWRnZXQuSW1hZ2VCdXR0b24gc2V0dGluZ3NCdXR0b247Ci0gIGZsb2F0IGFsaWdubWVudE1hcmtlclNjYWxlOwotICB2b2lkIHNldFRyYW5zaXRpb25WaWV3RW5hYmxlZChib29sZWFuKTsKLSAgamF2YS5sYW5nLlJ1bm5hYmxlIHNldHRpbmdzQnV0dG9uTGlzdGVuZXI7Ci0gIHZvaWQgc2V0U2V0dGluZ3NCdXR0b25MaXN0ZW5lcihqYXZhLmxhbmcuUnVubmFibGUpOwotICBhbmRyb2lkLnZpZXcuVmlld0dyb3VwIGdldFZpZXcoKTsKLSAgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgY29udGV4dDsKLSAgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuVHJhbnNpdGlvblZpZXcgZ2V0VHJhbnNpdGlvblZpZXcoKTsKLSAgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuVHJhbnNpdGlvblZpZXcgdHJhbnNpdGlvblZpZXc7Ci0gIGFuZHJvaWQud2lkZ2V0LkltYWdlQnV0dG9uIGJhY2tCdXR0b247Ci0gIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlRyYW5zaXRpb25WaWV3IGFjY2VzcyQxMDAwKGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlVpTGF5ZXIpOwotICBib29sZWFuIGlzVHJhbnNpdGlvblZpZXdWaXNpYmxlKCk7Ci0gIGFuZHJvaWQudmlldy5WaWV3IHNldHRpbmdzQnV0dG9uSG9sZGVyOwotICBqYXZhLmxhbmcuUnVubmFibGUgdHJhbnNpdGlvbkxpc3RlbmVyOwotICBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dCByb290T3V0ZXJMYXlvdXQ7Ci0gIGludCBjdXJyZW50TGF5b3V0SWQ7Ci0gIHZvaWQgYWNjZXNzJDE0MDAoY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuVWlMYXllciwgaW50KTsKLSAgYW5kcm9pZC53aWRnZXQuSW1hZ2VCdXR0b24gYWNjZXNzJDgwMChjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5VaUxheWVyKTsKLSAgYW5kcm9pZC53aWRnZXQuSW1hZ2VCdXR0b24gYWNjZXNzJDYwMChjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5VaUxheWVyKTsKLSAgdm9pZCBpbmZsYXRlVmlld3NXaXRoTGF5b3V0SWQoaW50KTsKLSAgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQgYWNjZXNzJDUwMChjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5VaUxheWVyKTsKLSAgdm9pZCBzZXRCdXR0b25DbGlja0NhbGxiYWNrT3ZlcnJpZGUoamF2YS5sYW5nLlJ1bm5hYmxlKTsKLSAgaW50IGFjY2VzcyQ0MDAoYm9vbGVhbik7Ci0gIHZvaWQgc2V0QWxpZ25tZW50TWFya2VyU2NhbGUoZmxvYXQpOwotICBqYXZhLmxhbmcuUnVubmFibGUgYWNjZXNzJDIwMChjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5VaUxheWVyKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5VaUxheWVyJDEgewotICAgPGluaXQ+KGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlVpTGF5ZXIpOwotICBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5VaUxheWVyIHRoaXMkMDsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5VaUxheWVyJDEwIHsKLSAgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuVWlMYXllciB0aGlzJDA7Ci0gICA8aW5pdD4oY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuVWlMYXllciwgZmxvYXQpOwotICBmbG9hdCB2YWwkc2NhbGU7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuVWlMYXllciQxMSB7Ci0gICA8aW5pdD4oY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuVWlMYXllciwgYm9vbGVhbik7Ci0gIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlVpTGF5ZXIgdGhpcyQwOwotICBib29sZWFuIHZhbCRlbmFibGVkOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlVpTGF5ZXIkMTIgewotICBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5VaUxheWVyIHRoaXMkMDsKLSAgIDxpbml0Pihjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5VaUxheWVyLCBqYXZhLmxhbmcuUnVubmFibGUpOwotICBqYXZhLmxhbmcuUnVubmFibGUgdmFsJGxpc3RlbmVyOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlVpTGF5ZXIkMTMgewotICBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5VaUxheWVyIHRoaXMkMDsKLSAgIDxpbml0Pihjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5VaUxheWVyLCBqYXZhLmxhbmcuU3RyaW5nKTsKLSAgamF2YS5sYW5nLlN0cmluZyB2YWwkdmlld2VyTmFtZTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5VaUxheWVyJDIgewotICAgPGluaXQ+KGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlVpTGF5ZXIpOwotICBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5VaUxheWVyIHRoaXMkMDsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5VaUxheWVyJDMgewotICAgPGluaXQ+KGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlVpTGF5ZXIpOwotICBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5VaUxheWVyIHRoaXMkMDsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5VaUxheWVyJDQgewotICBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5VaUxheWVyIHRoaXMkMDsKLSAgIDxpbml0Pihjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5VaUxheWVyKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5VaUxheWVyJDUgewotICAgPGluaXQ+KGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlVpTGF5ZXIpOwotICBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5VaUxheWVyIHRoaXMkMDsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5VaUxheWVyJDYgewotICAgPGluaXQ+KGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlVpTGF5ZXIsIGJvb2xlYW4pOwotICBib29sZWFuIHZhbCRlbmFibGVkOwotICBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5VaUxheWVyIHRoaXMkMDsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5VaUxheWVyJDcgewotICBib29sZWFuIHZhbCRlbmFibGVkOwotICAgPGluaXQ+KGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlVpTGF5ZXIsIGJvb2xlYW4pOwotICBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5VaUxheWVyIHRoaXMkMDsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5VaUxheWVyJDggewotICBqYXZhLmxhbmcuUnVubmFibGUgdmFsJGxpc3RlbmVyOwotICAgPGluaXQ+KGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlVpTGF5ZXIsIGphdmEubGFuZy5SdW5uYWJsZSk7Ci0gIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlVpTGF5ZXIgdGhpcyQwOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlVpTGF5ZXIkOSB7Ci0gIGJvb2xlYW4gdmFsJGVuYWJsZWQ7Ci0gIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlVpTGF5ZXIgdGhpcyQwOwotICAgPGluaXQ+KGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlVpTGF5ZXIsIGJvb2xlYW4pOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlVpTGF5ZXIkUm9vdE91dGVyTGF5b3V0IHsKLSAgIDxpbml0Pihjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5VaUxheWVyLCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCk7Ci0gIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlVpTGF5ZXIgdGhpcyQwOwotICB2b2lkIGhhbmRsZVBvdGVudGlhbENvbmZpZ3VyYXRpb25DaGFuZ2UoYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uKTsKLSAgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uIGN1cnJlbnRDb25maWc7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuVWlVdGlscyB7Ci0gIGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nJEJ1aWxkZXIgZGlhbG9nQnVpbGRlckZvclRlc3Rpbmc7Ci0gIGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nJEJ1aWxkZXIgY3JlYXRlQWxlcnREaWFsb2dCdWlsZGVyKGFuZHJvaWQuY29udGVudC5Db250ZXh0KTsKLSAgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuU3RvcmFnZVBlcm1pc3Npb25VdGlscyBwZXJtaXNzaW9uVXRpbHM7Ci0gIHZvaWQgc2hvd0luc3RhbGxEaWFsb2coYW5kcm9pZC5jb250ZW50LkNvbnRleHQpOwotICBhbmRyb2lkLmFwcC5BbGVydERpYWxvZyBzaG93RGF5ZHJlYW1IZWxwQ2VudGVyRGlhbG9nKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQsIGludCwgamF2YS5sYW5nLlJ1bm5hYmxlKTsKLSAgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2cgc2hvd0ltbWVyc2l2ZURpYWxvZyhhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2cpOwotICB2b2lkIGxhdW5jaE9ySW5zdGFsbENhcmRib2FyZChhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuVWlVdGlscyQxIHsKLSAgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgdmFsJGNvbnRleHQ7Ci0gICA8aW5pdD4oYW5kcm9pZC5jb250ZW50LkNvbnRleHQpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlVpVXRpbHMkMiB7Ci0gICA8aW5pdD4oKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5VaVV0aWxzJDMgewotICAgPGluaXQ+KGphdmEubGFuZy5SdW5uYWJsZSk7Ci0gIGphdmEubGFuZy5SdW5uYWJsZSB2YWwkb25DYW5jZWxsZWRDYWxsYmFjazsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5VaVV0aWxzJDQgewotICBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCB2YWwkY29udGV4dDsKLSAgIDxpbml0PihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuVnJDb250ZXh0V3JhcHBlciB7Ci0gIGJvb2xlYW4gYXV0b0ZhZGVFbmFibGVkKCk7Ci0gIGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIGdldFZyQ29tcG9uZW50KCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuVnJDb3JlTGlicmFyeUxvYWRlciB7Ci0gIHZvaWQgY2hlY2tWckNvcmVHdnJMaWJyYXJ5QXZhaWxhYmxlKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLlZlcnNpb24pOwotICBsb25nIGxvYWROYXRpdmVHdnJMaWJyYXJ5KGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLlZlcnNpb24sIGNvbS5nb29nbGUudnIubmRrLmJhc2UuVmVyc2lvbik7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuVnJQYXJhbXNQcm92aWRlciB7Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uQ2FyZGJvYXJkRGV2aWNlJERldmljZVBhcmFtcyByZWFkRGV2aWNlUGFyYW1zKCk7Ci0gIHZvaWQgY2xvc2UoKTsKLSAgYm9vbGVhbiB3cml0ZURldmljZVBhcmFtcyhjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLkNhcmRib2FyZERldmljZSREZXZpY2VQYXJhbXMpOwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLkRpc3BsYXkkRGlzcGxheVBhcmFtcyByZWFkRGlzcGxheVBhcmFtcygpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRTZGtDb25maWd1cmF0aW9uUGFyYW1zIHJlYWRTZGtDb25maWd1cmF0aW9uUGFyYW1zKGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uU2RrQ29uZmlndXJhdGlvbiRTZGtDb25maWd1cmF0aW9uUmVxdWVzdCk7Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uUHJlZmVyZW5jZXMkVXNlclByZWZzIHJlYWRVc2VyUHJlZnMoKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5WclBhcmFtc1Byb3ZpZGVyRmFjdG9yeSB7Ci0gIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlZyUGFyYW1zUHJvdmlkZXJGYWN0b3J5JENvbnRlbnRQcm92aWRlckNsaWVudEhhbmRsZSB0cnlUb0dldENvbnRlbnRQcm92aWRlckNsaWVudEhhbmRsZShhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCk7Ci0gIGJvb2xlYW4gaXNDb250ZW50UHJvdmlkZXJBdmFpbGFibGUoYW5kcm9pZC5jb250ZW50LkNvbnRleHQpOwotICBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5WclBhcmFtc1Byb3ZpZGVyIGNyZWF0ZShhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCk7Ci0gIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlZyUGFyYW1zUHJvdmlkZXIgcHJvdmlkZXJGb3JUZXN0aW5nOwotICBqYXZhLnV0aWwuTGlzdCBnZXRWYWxpZENvbnRlbnRQcm92aWRlckF1dGhvcml0aWVzKGFuZHJvaWQuY29udGVudC5Db250ZXh0KTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5WclBhcmFtc1Byb3ZpZGVyRmFjdG9yeSRDb250ZW50UHJvdmlkZXJDbGllbnRIYW5kbGUgewotICAgPGluaXQ+KGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXJDbGllbnQsIGphdmEubGFuZy5TdHJpbmcpOwotICBqYXZhLmxhbmcuU3RyaW5nIGF1dGhvcml0eTsKLSAgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlckNsaWVudCBjbGllbnQ7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuVnJQYXJhbXNQcm92aWRlckpuaSB7Ci0gIHZvaWQgdXBkYXRlTmF0aXZlUGhvbmVQYXJhbXNQb2ludGVyKGxvbmcsIGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljcywgZmxvYXQpOwotICBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3MgZGlzcGxheU1ldHJpY3NPdmVycmlkZTsKLSAgdm9pZCBuYXRpdmVVcGRhdGVOYXRpdmVQaG9uZVBhcmFtc1BvaW50ZXIobG9uZywgaW50LCBpbnQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpOwotICBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3MgZ2V0RGlzcGxheU1ldHJpY3MoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uRGlzcGxheSREaXNwbGF5UGFyYW1zKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5WclNldHRpbmdzUHJvdmlkZXJDb250cmFjdCB7Ci0gIGFuZHJvaWQubmV0LlVyaSBjcmVhdGVVcmkoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZyk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5pbnRlcm5hbC5jb250cm9sbGVyLkNvbnRyb2xsZXJTZXJ2aWNlQnJpZGdlIHsKLSAgdm9pZCBhY2Nlc3MkMTAwKGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLkNvbnRyb2xsZXJFdmVudFBhY2tldDIpOwotICBpbnQgdnJjb3JlQXBpVmVyc2lvbjsKLSAgamF2YS5sYW5nLlN0cmluZyBjcmVhdGVMaXN0ZW5lcktleSgpOwotICB2b2lkIGVuc3VyZU9uTWFpblRocmVhZCgpOwotICB2b2lkIGFjY2VzcyQwMDAoY29tLmdvb2dsZS52ci5pbnRlcm5hbC5jb250cm9sbGVyLkNvbnRyb2xsZXJTZXJ2aWNlQnJpZGdlLCBpbnQpOwotICB2b2lkIHZpYnJhdGVDb250cm9sbGVySW50ZXJuYWwoaW50LCBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5Db250cm9sbGVyUmVxdWVzdCk7Ci0gIHZvaWQgY2xlYXJDb250cm9sbGVycygpOwotICBib29sZWFuIHJlZ2lzdGVyTGlzdGVuZXIoaW50LCBjb20uZ29vZ2xlLnZyLmludGVybmFsLmNvbnRyb2xsZXIuQ29udHJvbGxlclNlcnZpY2VCcmlkZ2UkTG9jYWxDb250cm9sbGVyTGlzdGVuZXIpOwotICBib29sZWFuIGNyZWF0ZUFuZENvbm5lY3RDb250cm9sbGVySW50ZXJuYWwoaW50LCBjb20uZ29vZ2xlLnZyLmludGVybmFsLmNvbnRyb2xsZXIuQ29udHJvbGxlclNlcnZpY2VCcmlkZ2UkQ2FsbGJhY2tzLCBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5Db250cm9sbGVyTGlzdGVuZXJPcHRpb25zKTsKLSAgdm9pZCByZXF1ZXN0QmluZCgpOwotICB2b2lkIGxhbWJkYSR2aWJyYXRlQ29udHJvbGxlciQwJENvbnRyb2xsZXJTZXJ2aWNlQnJpZGdlKGludCwgY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuQ29udHJvbGxlclJlcXVlc3QpOwotICB2b2lkIGluaXRpYWxpemVEZWZhdWx0TGlzdGVuZXIoY29tLmdvb2dsZS52ci5pbnRlcm5hbC5jb250cm9sbGVyLkNvbnRyb2xsZXJTZXJ2aWNlQnJpZGdlJENhbGxiYWNrcywgY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuQ29udHJvbGxlckxpc3RlbmVyT3B0aW9ucyk7Ci0gIGNvbS5nb29nbGUudnIuaW50ZXJuYWwuY29udHJvbGxlci5Db250cm9sbGVyU2VydmljZUJyaWRnZSRMb2NhbENvbnRyb2xsZXJMaXN0ZW5lciBkZWZhdWx0TGlzdGVuZXI7Ci0gIHZvaWQgZG9CaW5kKCk7Ci0gIGphdmEubGFuZy5TdHJpbmcgbGlzdGVuZXJLZXk7Ci0gIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLklDb250cm9sbGVyU2VydmljZSBzZXJ2aWNlOwotICBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBjb250ZXh0OwotICB2b2lkIGhhbmRsZUF2YWlsYWJsZUNvbnRyb2xsZXJzQ2hhbmdlZCgpOwotICBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlciBVTklRVUVfSU5UOwotICB2b2lkIHNldHVwQW5kQmluZERlZmF1bHRDb250cm9sbGVyTGlzdGVuZXIoKTsKLSAgIDxpbml0PihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgY29tLmdvb2dsZS52ci5pbnRlcm5hbC5jb250cm9sbGVyLkNvbnRyb2xsZXJTZXJ2aWNlQnJpZGdlJENhbGxiYWNrcywgaW50KTsKLSAgYW5kcm9pZC5vcy5IYW5kbGVyIG1haW5UaHJlYWRIYW5kbGVyOwotICBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXkgY29udHJvbGxlckxpc3RlbmVyTWFwOwotICB2b2lkIHJlcXVlc3RVbmJpbmQoKTsKLSAgY29tLmdvb2dsZS52ci5pbnRlcm5hbC5jb250cm9sbGVyLkNvbnRyb2xsZXJTZXJ2aWNlQnJpZGdlJENvbnRyb2xsZXJTZXJ2aWNlTGlzdGVuZXIgZGVmYXVsdFNlcnZpY2VMaXN0ZW5lcjsKLSAgdm9pZCBsb2dJZkNvbnRyb2xsZXJQYWNrZXRMYWdzKGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLkNvbnRyb2xsZXJFdmVudFBhY2tldDIpOwotICB2b2lkIHVucmVnaXN0ZXJMaXN0ZW5lcnMoKTsKLSAgIDxpbml0PihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgY29tLmdvb2dsZS52ci5pbnRlcm5hbC5jb250cm9sbGVyLkNvbnRyb2xsZXJTZXJ2aWNlQnJpZGdlJENhbGxiYWNrcywgY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuQ29udHJvbGxlckxpc3RlbmVyT3B0aW9ucyk7Ci0gIGludCBnZXROdW1PZkNvbnRyb2xsZXJzKCk7Ci0gIGJvb2xlYW4gaXNCb3VuZDsKLSAgaW50IGdldFZyQ29yZUFwaVZlcnNpb24oYW5kcm9pZC5jb250ZW50LkNvbnRleHQpOwotICB2b2lkIGhhbmRsZVNlcnZpY2VFdmVudChpbnQpOwotICB2b2lkIGJyaWRnZSRsYW1iZGEkMCRDb250cm9sbGVyU2VydmljZUJyaWRnZSgpOwotICB2b2lkIGRvVW5iaW5kKCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5pbnRlcm5hbC5jb250cm9sbGVyLkNvbnRyb2xsZXJTZXJ2aWNlQnJpZGdlJCRMYW1iZGEkMCB7Ci0gIGNvbS5nb29nbGUudnIuaW50ZXJuYWwuY29udHJvbGxlci5Db250cm9sbGVyU2VydmljZUJyaWRnZSBhcmckMTsKLSAgIDxpbml0Pihjb20uZ29vZ2xlLnZyLmludGVybmFsLmNvbnRyb2xsZXIuQ29udHJvbGxlclNlcnZpY2VCcmlkZ2UpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIuaW50ZXJuYWwuY29udHJvbGxlci5Db250cm9sbGVyU2VydmljZUJyaWRnZSQkTGFtYmRhJDEgewotICAgPGluaXQ+KGNvbS5nb29nbGUudnIuaW50ZXJuYWwuY29udHJvbGxlci5Db250cm9sbGVyU2VydmljZUJyaWRnZSk7Ci0gIGNvbS5nb29nbGUudnIuaW50ZXJuYWwuY29udHJvbGxlci5Db250cm9sbGVyU2VydmljZUJyaWRnZSBhcmckMTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmludGVybmFsLmNvbnRyb2xsZXIuQ29udHJvbGxlclNlcnZpY2VCcmlkZ2UkJExhbWJkYSQyIHsKLSAgY29tLmdvb2dsZS52ci5pbnRlcm5hbC5jb250cm9sbGVyLkNvbnRyb2xsZXJTZXJ2aWNlQnJpZGdlIGFyZyQxOwotICBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5Db250cm9sbGVyUmVxdWVzdCBhcmckMzsKLSAgIDxpbml0Pihjb20uZ29vZ2xlLnZyLmludGVybmFsLmNvbnRyb2xsZXIuQ29udHJvbGxlclNlcnZpY2VCcmlkZ2UsIGludCwgY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuQ29udHJvbGxlclJlcXVlc3QpOwotICBpbnQgYXJnJDI7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5pbnRlcm5hbC5jb250cm9sbGVyLkNvbnRyb2xsZXJTZXJ2aWNlQnJpZGdlJCRMYW1iZGEkMyB7Ci0gIGNvbS5nb29nbGUudnIuaW50ZXJuYWwuY29udHJvbGxlci5Db250cm9sbGVyU2VydmljZUJyaWRnZSBhcmckMTsKLSAgIDxpbml0Pihjb20uZ29vZ2xlLnZyLmludGVybmFsLmNvbnRyb2xsZXIuQ29udHJvbGxlclNlcnZpY2VCcmlkZ2UpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIuaW50ZXJuYWwuY29udHJvbGxlci5Db250cm9sbGVyU2VydmljZUJyaWRnZSRDYWxsYmFja3MgewotICB2b2lkIG9uU2VydmljZUZhaWxlZCgpOwotICB2b2lkIG9uU2VydmljZUNvbm5lY3RlZChpbnQpOwotICB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZCgpOwotICB2b2lkIG9uQ29udHJvbGxlckV2ZW50UGFja2V0Mihjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5Db250cm9sbGVyRXZlbnRQYWNrZXQyKTsKLSAgdm9pZCBvbkNvbnRyb2xsZXJFdmVudFBhY2tldChjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5Db250cm9sbGVyRXZlbnRQYWNrZXQpOwotICB2b2lkIG9uU2VydmljZUluaXRGYWlsZWQoaW50KTsKLSAgdm9pZCBvblNlcnZpY2VVbmF2YWlsYWJsZSgpOwotICB2b2lkIG9uQ29udHJvbGxlclJlY2VudGVyZWQoY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuQ29udHJvbGxlck9yaWVudGF0aW9uRXZlbnQpOwotICB2b2lkIG9uQ29udHJvbGxlclN0YXRlQ2hhbmdlZChpbnQsIGludCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5pbnRlcm5hbC5jb250cm9sbGVyLkNvbnRyb2xsZXJTZXJ2aWNlQnJpZGdlJENvbnRyb2xsZXJMaXN0ZW5lciB7Ci0gIGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZSBsaXN0ZW5lcjsKLSAgIDxpbml0Pihjb20uZ29vZ2xlLnZyLmludGVybmFsLmNvbnRyb2xsZXIuQ29udHJvbGxlclNlcnZpY2VCcmlkZ2UkTG9jYWxDb250cm9sbGVyTGlzdGVuZXIpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIuaW50ZXJuYWwuY29udHJvbGxlci5Db250cm9sbGVyU2VydmljZUJyaWRnZSRDb250cm9sbGVyU2VydmljZUxpc3RlbmVyIHsKLSAgIDxpbml0Pihjb20uZ29vZ2xlLnZyLmludGVybmFsLmNvbnRyb2xsZXIuQ29udHJvbGxlclNlcnZpY2VCcmlkZ2UpOwotICBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2Ugc2VydmljZUJyaWRnZTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLmludGVybmFsLmNvbnRyb2xsZXIuQ29udHJvbGxlclNlcnZpY2VCcmlkZ2UkTG9jYWxDb250cm9sbGVyTGlzdGVuZXIgewotICBpbnQgY29udHJvbGxlckluZGV4OwotICBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5Db250cm9sbGVyTGlzdGVuZXJPcHRpb25zIG9wdGlvbnM7Ci0gIGNvbS5nb29nbGUudnIuaW50ZXJuYWwuY29udHJvbGxlci5Db250cm9sbGVyU2VydmljZUJyaWRnZSRDYWxsYmFja3MgY2FsbGJhY2tzOwotICAgPGluaXQ+KGNvbS5nb29nbGUudnIuaW50ZXJuYWwuY29udHJvbGxlci5Db250cm9sbGVyU2VydmljZUJyaWRnZSRDYWxsYmFja3MsIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLkNvbnRyb2xsZXJMaXN0ZW5lck9wdGlvbnMsIGludCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5pbnRlcm5hbC5jb250cm9sbGVyLk5hdGl2ZUNhbGxiYWNrcyB7Ci0gIHZvaWQgaGFuZGxlQnV0dG9uRXZlbnQobG9uZywgaW50LCBsb25nLCBpbnQsIGJvb2xlYW4pOwotICB2b2lkIGhhbmRsZUV2ZW50c0NvbXBhdGliaWxpdHlMb2NrZWQoY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuQ29udHJvbGxlckV2ZW50UGFja2V0KTsKLSAgdm9pZCBoYW5kbGVBY2NlbEV2ZW50KGxvbmcsIGludCwgbG9uZywgZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci0gIHZvaWQgaGFuZGxlR3lyb0V2ZW50KGxvbmcsIGludCwgbG9uZywgZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci0gIHZvaWQgaGFuZGxlU2VydmljZVVuYXZhaWxhYmxlKGxvbmcpOwotICB2b2lkIGhhbmRsZVRvdWNoRXZlbnQobG9uZywgaW50LCBsb25nLCBpbnQsIGZsb2F0LCBmbG9hdCk7Ci0gIGJvb2xlYW4gY2xvc2VkOwotICB2b2lkIGhhbmRsZU9yaWVudGF0aW9uRXZlbnQobG9uZywgaW50LCBsb25nLCBmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci0gIHZvaWQgaGFuZGxlQmF0dGVyeUV2ZW50KGxvbmcsIGludCwgbG9uZywgYm9vbGVhbiwgaW50KTsKLSAgdm9pZCBoYW5kbGVTZXJ2aWNlSW5pdEZhaWxlZChsb25nLCBpbnQpOwotICB2b2lkIGhhbmRsZVNlcnZpY2VEaXNjb25uZWN0ZWQobG9uZyk7Ci0gIHZvaWQgaGFuZGxlU2VydmljZUNvbm5lY3RlZChsb25nLCBpbnQpOwotICBsb25nIHVzZXJEYXRhOwotICB2b2lkIGhhbmRsZVN0YXRlQ2hhbmdlZChsb25nLCBpbnQsIGludCk7Ci0gIHZvaWQgaGFuZGxlU2VydmljZUZhaWxlZChsb25nKTsKLSAgdm9pZCBoYW5kbGVQb3NpdGlvbkV2ZW50KGxvbmcsIGludCwgbG9uZywgZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci0gIHZvaWQgaGFuZGxlQ29udHJvbGxlclJlY2VudGVyZWQobG9uZywgaW50LCBsb25nLCBmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5rZXlib2FyZC5JR3ZyS2V5Ym9hcmRMb2FkZXIgewotICB2b2lkIGNsb3NlR3ZyS2V5Ym9hcmQobG9uZyk7Ci0gIGxvbmcgbG9hZEd2cktleWJvYXJkKGxvbmcpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIua2V5Ym9hcmQuSUd2cktleWJvYXJkTG9hZGVyJFN0dWIgewotICBsb25nIGxvYWRHdnJLZXlib2FyZChsb25nKTsKLSAgdm9pZCBhdHRhY2hJbnRlcmZhY2UoYW5kcm9pZC5vcy5JSW50ZXJmYWNlLCBqYXZhLmxhbmcuU3RyaW5nKTsKLSAgdm9pZCBjbG9zZUd2cktleWJvYXJkKGxvbmcpOwotICBjb20uZ29vZ2xlLnZyLmtleWJvYXJkLklHdnJLZXlib2FyZExvYWRlciBhc0ludGVyZmFjZShhbmRyb2lkLm9zLklCaW5kZXIpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIua2V5Ym9hcmQuSUd2cktleWJvYXJkTG9hZGVyJFN0dWIkUHJveHkgewotICBhbmRyb2lkLm9zLklCaW5kZXIgbVJlbW90ZTsKLSAgIDxpbml0PihhbmRyb2lkLm9zLklCaW5kZXIpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuQWJzdHJhY3REYXlkcmVhbVRvdWNoTGlzdGVuZXIgewotICBmbG9hdFtdIHRyYW5zbGF0aW9uOwotICAgPGluaXQ+KCk7Ci0gIGZsb2F0W10gbGFzdFRyYW5zbGF0aW9uOwotICBib29sZWFuIHZpZXdlck5lZWRzVG91Y2hQcm9jZXNzaW5nKCk7Ci0gIGJvb2xlYW4gcHJvY2Vzc01vdGlvbkV2ZW50KGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCwgZmxvYXQsIGZsb2F0KTsKLSAgZmxvYXRbXVtdIG1hcmtlcnNJblBpeGVsczsKLSAgaW50IG1vc3RUb3VjaGVzU2VlbjsKLSAgdm9pZCBzZXRMZW5zT2Zmc2V0KGZsb2F0LCBmbG9hdCwgZmxvYXQpOwotICBib29sZWFuIGlzRGF5ZHJlYW1JbWFnZUFsaWdubWVudEVuYWJsZWQoKTsKLSAgZmxvYXQgcm90YXRpb247Ci0gIGZsb2F0IHhNZXRlcnNQZXJQaXhlbDsKLSAgaW50W10gbWFya2VyQmVzdFRvdWNoOwotICB2b2lkIGxvZ0V2ZW50KGludCwgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQpOwotICBqYXZhLmxhbmcuU3RyaW5nIGxvZ1RhZzsKLSAgYm9vbGVhbiB1c2VSb3RhdGlvbmFsQWxpZ25tZW50Q29ycmVjdGlvbjsKLSAgdm9pZCBsb2dQaG9uZUFsaWdubWVudChhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQsIGZsb2F0LCBmbG9hdCk7Ci0gIGRvdWJsZVtdIGN1cnJlbnRNYXJrZXJCZXN0RGlzdHM7Ci0gIGZsb2F0W10gcGl4ZWxUcmFuc2xhdGlvbjsKLSAgdm9pZCBnZXRUcmFuc2xhdGlvbkluU2NyZWVuU3BhY2UoZmxvYXRbXSk7Ci0gIGZsb2F0IHlNZXRlcnNQZXJQaXhlbDsKLSAgaW50W10gdG91Y2hCZXN0TWFya2VyOwotICBib29sZWFuIGxhc3RNb3Rpb25FdmVudEluSGVhZHNldDsKLSAgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzIGRpc3BsYXlNZXRyaWNzOwotICBpbnQgYW5nbGVTYW1wbGVzUmVjZWl2ZWQ7Ci0gIGZsb2F0IGJvcmRlclNpemVNZXRlcnM7Ci0gIHZvaWQgcmVzZXRUcmFja2luZ1N0YXRlKCk7Ci0gIGZsb2F0IGdldFJvdGF0aW9uUmFkaWFucyhhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQpOwotICBib29sZWFuIGVuYWJsZWQ7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5BbmRyb2lkQ29tcGF0IHsKLSAgdm9pZCBzZXRTdXN0YWluZWRQZXJmb3JtYW5jZU1vZGUoYW5kcm9pZC5hcHAuQWN0aXZpdHksIGJvb2xlYW4pOwotICBib29sZWFuIHNldFZyTW9kZUVuYWJsZWQoYW5kcm9pZC5hcHAuQWN0aXZpdHksIGJvb2xlYW4pOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuQnVmZmVyU3BlYyB7Ci0gIHZvaWQgc2h1dGRvd24oKTsKLSAgYm9vbGVhbiBpc1ZhbGlkRGVwdGhTdGVuY2lsRm9ybWF0KGludCk7Ci0gICA8aW5pdD4obG9uZyk7Ci0gIGJvb2xlYW4gaXNWYWxpZENvbG9yRm9ybWF0KGludCk7Ci0gIGxvbmcgbmF0aXZlQnVmZmVyU3BlYzsKLSAgamF2YS5sYW5nLlN0cmluZyBUQUc7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5CdWZmZXJWaWV3cG9ydCB7Ci0gIHZvaWQgc2h1dGRvd24oKTsKLSAgamF2YS5sYW5nLlN0cmluZyBUQUc7Ci0gICA8aW5pdD4obG9uZyk7Ci0gIGxvbmcgbmF0aXZlQnVmZmVyVmlld3BvcnQ7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5CdWZmZXJWaWV3cG9ydExpc3QgewotICB2b2lkIHNodXRkb3duKCk7Ci0gICA8aW5pdD4obG9uZyk7Ci0gIGxvbmcgbmF0aXZlQnVmZmVyVmlld3BvcnRMaXN0OwotICBqYXZhLmxhbmcuU3RyaW5nIFRBRzsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkNhcmRib2FyZEVtdWxhdG9yIHsKLSAgY29tLmdvb2dsZS52ci5pbnRlcm5hbC5jb250cm9sbGVyLkNvbnRyb2xsZXJTZXJ2aWNlQnJpZGdlIGNvbnRyb2xsZXJTZXJ2aWNlQnJpZGdlOwotICBib29sZWFuIHJlc3VtZWQ7Ci0gIHZvaWQgb25QYXVzZSgpOwotICB2b2lkIG9uUmVzdW1lKCk7Ci0gICA8aW5pdD4oYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGphdmEubGFuZy5SdW5uYWJsZSk7Ci0gIGNvbS5nb29nbGUudnIuaW50ZXJuYWwuY29udHJvbGxlci5Db250cm9sbGVyU2VydmljZUJyaWRnZSBjcmVhdGVTZXJ2aWNlQnJpZGdlKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBjb20uZ29vZ2xlLnZyLmludGVybmFsLmNvbnRyb2xsZXIuQ29udHJvbGxlclNlcnZpY2VCcmlkZ2UkQ2FsbGJhY2tzKTsKLSAgamF2YS5sYW5nLlN0cmluZyBUQUc7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5DYXJkYm9hcmRFbXVsYXRvciRDb250cm9sbGVyQ2FsbGJhY2tzIHsKLSAgamF2YS5sYW5nLlJ1bm5hYmxlIGNhcmRib2FyZFRyaWdnZXJDYWxsYmFjazsKLSAgdm9pZCBvbkNvbnRyb2xsZXJFdmVudFBhY2tldChjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5Db250cm9sbGVyRXZlbnRQYWNrZXQpOwotICAgPGluaXQ+KGphdmEubGFuZy5SdW5uYWJsZSk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5EYXlkcmVhbUFwaSB7Ci0gIGNvbS5nb29nbGUudnIubmRrLmJhc2UuRGF5ZHJlYW1BcGkgY3JlYXRlKGFuZHJvaWQuY29udGVudC5Db250ZXh0KTsKLSAgYW5kcm9pZC5jb250ZW50LkludGVudCBjcmVhdGVWckludGVudChhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSk7Ci0gIHZvaWQgbGF1bmNoSW5WcihhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50LCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSk7Ci0gIGFuZHJvaWQuY29udGVudC5TZXJ2aWNlQ29ubmVjdGlvbiBjb25uZWN0aW9uOwotICB2b2lkIGxhdW5jaEluVnIoYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudCk7Ci0gIGphdmEubGFuZy5TdHJpbmcgYWNjZXNzJDIwMCgpOwotICBpbnQgdnJDb3JlQXBpVmVyc2lvbjsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUuY29tbW9uLmFwaS5JVnJDb3JlU2RrU2VydmljZSBhY2Nlc3MkMDAyKGNvbS5nb29nbGUudnIubmRrLmJhc2UuRGF5ZHJlYW1BcGksIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbW1vbi5hcGkuSVZyQ29yZVNka1NlcnZpY2UpOwotICB2b2lkIGxhdW5jaFZySG9tZXNjcmVlbigpOwotICBib29sZWFuIGlzRGF5ZHJlYW1SZWFkeVBsYXRmb3JtKGFuZHJvaWQuY29udGVudC5Db250ZXh0KTsKLSAgYW5kcm9pZC5jb250ZW50LkludGVudCBzZXR1cFZySW50ZW50KGFuZHJvaWQuY29udGVudC5JbnRlbnQpOwotICB2b2lkIGxhdW5jaEluVnIoYW5kcm9pZC5jb250ZW50LkludGVudCk7Ci0gIHZvaWQgY2xvc2UoKTsKLSAgYW5kcm9pZC5jb250ZW50LlNlcnZpY2VDb25uZWN0aW9uIGFjY2VzcyQ1MDAoY29tLmdvb2dsZS52ci5uZGsuYmFzZS5EYXlkcmVhbUFwaSk7Ci0gIGFuZHJvaWQuY29udGVudC5Db250ZXh0IGFjY2VzcyQ2MDAoY29tLmdvb2dsZS52ci5uZGsuYmFzZS5EYXlkcmVhbUFwaSk7Ci0gIGludCBhY2Nlc3MkNDAwKGNvbS5nb29nbGUudnIubmRrLmJhc2UuRGF5ZHJlYW1BcGkpOwotICB2b2lkIHJ1bldoZW5TZXJ2aWNlQ29ubmVjdGVkKGphdmEubGFuZy5SdW5uYWJsZSk7Ci0gIGJvb2xlYW4gc3VwcG9ydHMyZEluVnIoYW5kcm9pZC5jb250ZW50LkNvbnRleHQpOwotICBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb21tb24uYXBpLklWckNvcmVTZGtTZXJ2aWNlIHZyQ29yZVNka1NlcnZpY2U7Ci0gIGphdmEudXRpbC5BcnJheUxpc3QgcXVldWVkUnVubmFibGVzOwotICB2b2lkIGNoZWNrSW50ZW50KGFuZHJvaWQuY29udGVudC5JbnRlbnQpOwotICBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBjb250ZXh0OwotICBib29sZWFuIGdldEJvb2xlYW5TZXR0aW5nKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKTsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUuY29tbW9uLmFwaS5JRGF5ZHJlYW1NYW5hZ2VyIGRheWRyZWFtTWFuYWdlcjsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUuY29tbW9uLmFwaS5JRGF5ZHJlYW1NYW5hZ2VyIGFjY2VzcyQxMDAoY29tLmdvb2dsZS52ci5uZGsuYmFzZS5EYXlkcmVhbUFwaSk7Ci0gIHZvaWQgcmVnaXN0ZXJEYXlkcmVhbUludGVudChhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50KTsKLSAgdm9pZCB1bnJlZ2lzdGVyRGF5ZHJlYW1JbnRlbnQoKTsKLSAgamF2YS5sYW5nLlN0cmluZyBUQUc7Ci0gIHZvaWQgY2hlY2tOb3RDbG9zZWQoKTsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUuY29tbW9uLmFwaS5JRGF5ZHJlYW1NYW5hZ2VyIGFjY2VzcyQxMDIoY29tLmdvb2dsZS52ci5uZGsuYmFzZS5EYXlkcmVhbUFwaSwgY29tLmdvb2dsZS52ci52cmNvcmUuY29tbW9uLmFwaS5JRGF5ZHJlYW1NYW5hZ2VyKTsKLSAgYm9vbGVhbiBjbG9zZWQ7Ci0gIGludCBnZXRDdXJyZW50Vmlld2VyVHlwZSgpOwotICB2b2lkIGxhdW5jaFRyYW5zaXRpb25DYWxsYmFja0luVnIoY29tLmdvb2dsZS52ci52cmNvcmUuY29tbW9uLmFwaS5JVHJhbnNpdGlvbkNhbGxiYWNrcyk7Ci0gIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbW1vbi5hcGkuSVZyQ29yZVNka1NlcnZpY2UgYWNjZXNzJDAwMChjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkRheWRyZWFtQXBpKTsKLSAgYm9vbGVhbiBpc0luVnJTZXNzaW9uKGFuZHJvaWQuY29udGVudC5Db250ZXh0KTsKLSAgYm9vbGVhbiBpbml0KCk7Ci0gIGphdmEudXRpbC5BcnJheUxpc3QgYWNjZXNzJDMwMChjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkRheWRyZWFtQXBpKTsKLSAgdm9pZCBleGl0RnJvbVZyKGFuZHJvaWQuYXBwLkFjdGl2aXR5LCBpbnQsIGFuZHJvaWQuY29udGVudC5JbnRlbnQpOwotICAgPGluaXQ+KGFuZHJvaWQuY29udGVudC5Db250ZXh0KTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkRheWRyZWFtQXBpJDEgewotICAgPGluaXQ+KGNvbS5nb29nbGUudnIubmRrLmJhc2UuRGF5ZHJlYW1BcGkpOwotICBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkRheWRyZWFtQXBpIHRoaXMkMDsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkRheWRyZWFtQXBpJDEwIHsKLSAgIDxpbml0Pihjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkRheWRyZWFtQXBpLCBieXRlW10pOwotICBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkRheWRyZWFtQXBpIHRoaXMkMDsKLSAgYnl0ZVtdIHZhbCRkZXZpY2VQYXJhbXM7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5EYXlkcmVhbUFwaSQxMSB7Ci0gIGNvbS5nb29nbGUudnIubmRrLmJhc2UuRGF5ZHJlYW1BcGkgdGhpcyQwOwotICAgPGluaXQ+KGNvbS5nb29nbGUudnIubmRrLmJhc2UuRGF5ZHJlYW1BcGkpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuRGF5ZHJlYW1BcGkkMTIgewotICAgPGluaXQ+KGNvbS5nb29nbGUudnIubmRrLmJhc2UuRGF5ZHJlYW1BcGkpOwotICBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkRheWRyZWFtQXBpIHRoaXMkMDsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkRheWRyZWFtQXBpJDIgewotICBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkRheWRyZWFtQXBpIHRoaXMkMDsKLSAgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudCB2YWwkaW50ZW50OwotICAgPGluaXQ+KGNvbS5nb29nbGUudnIubmRrLmJhc2UuRGF5ZHJlYW1BcGksIGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuRGF5ZHJlYW1BcGkkMyB7Ci0gICA8aW5pdD4oY29tLmdvb2dsZS52ci5uZGsuYmFzZS5EYXlkcmVhbUFwaSwgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudCwgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUpOwotICBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkRheWRyZWFtQXBpIHRoaXMkMDsKLSAgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUgdmFsJGNvbXBvbmVudDsKLSAgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudCB2YWwkcGVuZGluZ0ludGVudDsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkRheWRyZWFtQXBpJDQgewotICBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb21tb24uYXBpLklUcmFuc2l0aW9uQ2FsbGJhY2tzIHZhbCRjYWxsYmFja3M7Ci0gICA8aW5pdD4oY29tLmdvb2dsZS52ci5uZGsuYmFzZS5EYXlkcmVhbUFwaSwgY29tLmdvb2dsZS52ci52cmNvcmUuY29tbW9uLmFwaS5JVHJhbnNpdGlvbkNhbGxiYWNrcyk7Ci0gIGNvbS5nb29nbGUudnIubmRrLmJhc2UuRGF5ZHJlYW1BcGkgdGhpcyQwOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuRGF5ZHJlYW1BcGkkNSB7Ci0gICA8aW5pdD4oY29tLmdvb2dsZS52ci5uZGsuYmFzZS5EYXlkcmVhbUFwaSk7Ci0gIGNvbS5nb29nbGUudnIubmRrLmJhc2UuRGF5ZHJlYW1BcGkgdGhpcyQwOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuRGF5ZHJlYW1BcGkkNiB7Ci0gIGFuZHJvaWQuYXBwLkFjdGl2aXR5IHZhbCRhY3Rpdml0eTsKLSAgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudCB2YWwkcGVuZGluZ0ludGVudDsKLSAgIDxpbml0Pihjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkRheWRyZWFtQXBpLCBhbmRyb2lkLmFwcC5BY3Rpdml0eSwgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudCwgaW50KTsKLSAgaW50IHZhbCRyZXF1ZXN0Q29kZTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkRheWRyZWFtQXBpJDYkMSB7Ci0gICA8aW5pdD4oY29tLmdvb2dsZS52ci5uZGsuYmFzZS5EYXlkcmVhbUFwaSQ2KTsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5EYXlkcmVhbUFwaSQ2IHRoaXMkMTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkRheWRyZWFtQXBpJDcgewotICBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50IHZhbCRwZW5kaW5nVnJFeGl0SW50ZW50OwotICAgPGluaXQ+KGNvbS5nb29nbGUudnIubmRrLmJhc2UuRGF5ZHJlYW1BcGksIGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuRGF5ZHJlYW1BcGkkOCB7Ci0gIGphdmEubGFuZy5SdW5uYWJsZSB2YWwkb25GYWlsdXJlUnVubmFibGU7Ci0gIGNvbS5nb29nbGUudnIubmRrLmJhc2UuRGF5ZHJlYW1BcGkgdGhpcyQwOwotICBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50IHZhbCRwZW5kaW5nVnJFeGl0SW50ZW50OwotICAgPGluaXQ+KGNvbS5nb29nbGUudnIubmRrLmJhc2UuRGF5ZHJlYW1BcGksIGphdmEubGFuZy5SdW5uYWJsZSwgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5EYXlkcmVhbUFwaSQ5IHsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5EYXlkcmVhbUFwaSB0aGlzJDA7Ci0gICA8aW5pdD4oY29tLmdvb2dsZS52ci5uZGsuYmFzZS5EYXlkcmVhbUFwaSwgYm9vbGVhbiwgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUpOwotICBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSB2YWwkY29tcG9uZW50TmFtZTsKLSAgYm9vbGVhbiB2YWwkc2hvdWxkSW5oaWJpdDsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkRheWRyZWFtQ29tcGF0aWJpbGl0eSB7Ci0gICA8aW5pdD4oKTsKLSAgaW50IGdldFN1cHBvcnRlZEhlYWRzZXRzKCk7Ci0gIGJvb2xlYW4gcmVxdWlyZXNEYXlkcmVhbSgpOwotICAgPGluaXQ+KGludCk7Ci0gIGJvb2xlYW4gc3VwcG9ydHNEYXlkcmVhbSgpOwotICBib29sZWFuIHN1cHBvcnRzQ2FyZGJvYXJkKCk7Ci0gIGludCBzdXBwb3J0ZWRIZWFkc2V0czsKLSAgaW50IHRvRGVwcmVjYXRlZCgpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuRGF5ZHJlYW1VdGlscyB7Ci0gIGNvbS5nb29nbGUudnIubmRrLmJhc2UuRGF5ZHJlYW1Db21wYXRpYmlsaXR5IGdldENvbXBvbmVudERheWRyZWFtQ29tcGF0aWJpbGl0eShhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUpOwotICBib29sZWFuIGNoZWNrSGVhZHNldENvbXBhdGliaWxpdHkoYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSwgamF2YS5sYW5nLlN0cmluZyk7Ci0gIGphdmEubGFuZy5TdHJpbmcgZ2V0RGV2aWNlUGFyYW1zRGlzcGxheWVkTmFtZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKTsKLSAgYm9vbGVhbiBzRGF5ZHJlYW1QaG9uZU92ZXJyaWRlRm9yVGVzdGluZzsKLSAgYm9vbGVhbiBpc0RheWRyZWFtUGhvbmUoYW5kcm9pZC5jb250ZW50LkNvbnRleHQpOwotICBib29sZWFuIGNhblJlc29sdmVJbnRlbnQoYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSwgYW5kcm9pZC5jb250ZW50LkludGVudCk7Ci0gIGNvbS5nb29nbGUudnIubmRrLmJhc2UuRGF5ZHJlYW1Db21wYXRpYmlsaXR5IGdldENvbXBvbmVudERheWRyZWFtQ29tcGF0aWJpbGl0eShhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIsIGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lKTsKLSAgYm9vbGVhbiBpc0RheWRyZWFtVmlld2VyKGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uQ2FyZGJvYXJkRGV2aWNlJERldmljZVBhcmFtcyk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5EYXlkcmVhbVV0aWxzV3JhcHBlciB7Ci0gIGJvb2xlYW4gaXNEYXlkcmVhbUFjdGl2aXR5KGFuZHJvaWQuYXBwLkFjdGl2aXR5KTsKLSAgYm9vbGVhbiBpc0RheWRyZWFtQ29tcG9uZW50KGFuZHJvaWQuY29udGVudC5Db250ZXh0KTsKLSAgYm9vbGVhbiBpc0RheWRyZWFtUGhvbmUoYW5kcm9pZC5jb250ZW50LkNvbnRleHQpOwotICBib29sZWFuIGlzRGF5ZHJlYW1SZXF1aXJlZENvbXBvbmVudChhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCk7Ci0gIGNvbS5nb29nbGUudnIubmRrLmJhc2UuRGF5ZHJlYW1Db21wYXRpYmlsaXR5IGdldENvbXBvbmVudERheWRyZWFtQ29tcGF0aWJpbGl0eShhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCk7Ci0gICA8aW5pdD4oKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkRlZmF1bHROYXRpdmVMaWJyYXJ5TG9hZGVyIHsKLSAgYm9vbGVhbiBzaG91bGRJZ25vcmVEZWZhdWx0TGlicmFyeTsKLSAgdm9pZCBtYXliZUxvYWREZWZhdWx0TGlicmFyeSgpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuRXZlbnQgewotICB2b2lkIGNsb3NlKCk7Ci0gIGxvbmcgbmF0aXZlRXZlbnQ7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5FeHRlbnNpb25NYW5hZ2VyIHsKLSAgdm9pZCBzaHV0ZG93bigpOwotICB2b2lkIG9uUmVzdW1lKCk7Ci0gIHZvaWQgb25QYXVzZSgpOwotICB2b2lkIHJlcG9ydFRlbGVtZXRyeShjb20uZ29vZ2xlLnZyLnZyY29yZS5sb2dnaW5nLmFwaS5JVnJDb3JlTG9nZ2luZ1NlcnZpY2UpOwotICBib29sZWFuIGJvb3RzVG9WcigpOwotICB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbik7Ci0gIHZvaWQgaW5pdGlhbGl6ZShhbmRyb2lkLnZpZXcuVmlld0dyb3VwLCBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2ckFwaSk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5FeHRlcm5hbFN1cmZhY2UgewotICAgPGluaXQ+KGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyQXBpLCBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2ckxheW91dCRFeHRlcm5hbFN1cmZhY2VMaXN0ZW5lciwgYW5kcm9pZC5vcy5IYW5kbGVyKTsKLSAgdm9pZCBzaHV0ZG93bigpOwotICBqYXZhLmxhbmcuU3RyaW5nIFRBRzsKLSAgbG9uZyBuYXRpdmVFeHRlcm5hbFN1cmZhY2U7Ci0gIGludCBnZXRJZCgpOwotICBhbmRyb2lkLnZpZXcuU3VyZmFjZSBnZXRTdXJmYWNlKCk7Ci0gIGphdmEubGFuZy5TdHJpbmcgYWNjZXNzJDAwMCgpOwotICBsb25nIGdldE5hdGl2ZUV4dGVybmFsU3VyZmFjZSgpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuRXh0ZXJuYWxTdXJmYWNlJDEgewotICBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2ckxheW91dCRFeHRlcm5hbFN1cmZhY2VMaXN0ZW5lciB2YWwkbGlzdGVuZXI7Ci0gIGNvbS5nb29nbGUudnIubmRrLmJhc2UuRXh0ZXJuYWxTdXJmYWNlIHRoaXMkMDsKLSAgIDxpbml0Pihjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkV4dGVybmFsU3VyZmFjZSwgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJMYXlvdXQkRXh0ZXJuYWxTdXJmYWNlTGlzdGVuZXIpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuRXh0ZXJuYWxTdXJmYWNlJDIgewotICAgPGluaXQ+KGNvbS5nb29nbGUudnIubmRrLmJhc2UuRXh0ZXJuYWxTdXJmYWNlLCBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2ckxheW91dCRFeHRlcm5hbFN1cmZhY2VMaXN0ZW5lcik7Ci0gIGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyTGF5b3V0JEV4dGVybmFsU3VyZmFjZUxpc3RlbmVyIHZhbCRsaXN0ZW5lcjsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkZhZGVPdmVybGF5VmlldyB7Ci0gIHZvaWQgYWNjZXNzJDAwMChjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkZhZGVPdmVybGF5Vmlldyk7Ci0gICA8aW5pdD4oYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGJvb2xlYW4pOwotICBqYXZhLmxhbmcuUnVubmFibGUgZmFkZVVwZGF0ZVJ1bm5hYmxlOwotICB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbik7Ci0gIGJvb2xlYW4gZmx1c2hBdXRvRmFkZU9uVmlzaWJsZTsKLSAgdm9pZCBwb3N0T25BbmltYXRpb24oamF2YS5sYW5nLlJ1bm5hYmxlKTsKLSAgaW50IGdldFZpc2liaWxpdHkoKTsKLSAgYm9vbGVhbiByZW1vdmVDYWxsYmFja3MoamF2YS5sYW5nLlJ1bm5hYmxlKTsKLSAgaW50IGZhZGVUeXBlOwotICBib29sZWFuIHBvc3QoamF2YS5sYW5nLlJ1bm5hYmxlKTsKLSAgdm9pZCBmbHVzaEF1dG9GYWRlKCk7Ci0gIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKGludCk7Ci0gIHZvaWQgc2V0QWxwaGEoZmxvYXQpOwotICBsb25nIGZhZGVEdXJhdGlvbk1pbGxpczsKLSAgbG9uZyBmYWRlU3RhcnRUaW1lTWlsbGlzOwotICB2b2lkIHVwZGF0ZUZhZGUoKTsKLSAgYm9vbGVhbiBpc0VuYWJsZWQoKTsKLSAgdm9pZCBzdGFydEZhZGUoaW50LCBsb25nLCBpbnQpOwotICBib29sZWFuIGF1dG9GYWRlRW5hYmxlZDsKLSAgdm9pZCBvbkludmlzaWJsZSgpOwotICBib29sZWFuIHZpc2libGU7Ci0gIHZvaWQgZW5kRmFkZSgpOwotICBhbmRyb2lkLm9zLkhhbmRsZXIgYXV0b0ZhZGVIYW5kbGVyOwotICBmbG9hdCBmYWRlU3RhcnRPcGFjaXR5OwotICB2b2lkIG9uVmlzaWJsZSgpOwotICBmbG9hdCBnZXRBbHBoYSgpOwotICB2b2lkIHNldFZpc2liaWxpdHkoaW50KTsKLSAgdm9pZCByZW1vdmVGYWRlQ2FsbGJhY2tzKCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5GYWRlT3ZlcmxheVZpZXckMSB7Ci0gICA8aW5pdD4oY29tLmdvb2dsZS52ci5uZGsuYmFzZS5GYWRlT3ZlcmxheVZpZXcpOwotICBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkZhZGVPdmVybGF5VmlldyB0aGlzJDA7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5GYWRlT3ZlcmxheVZpZXckMiB7Ci0gICA8aW5pdD4oY29tLmdvb2dsZS52ci5uZGsuYmFzZS5GYWRlT3ZlcmxheVZpZXcsIGFuZHJvaWQub3MuTG9vcGVyKTsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5GYWRlT3ZlcmxheVZpZXcgdGhpcyQwOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuRnJhbWUgewotICAgPGluaXQ+KCk7Ci0gIGxvbmcgZ2V0TmF0aXZlRnJhbWUoKTsKLSAgdm9pZCBjaGVja0FjY2VzcygpOwotICBqYXZhLmxhbmcuU3RyaW5nIFRBRzsKLSAgbG9uZyBuYXRpdmVGcmFtZTsKLSAgdm9pZCBzZXROYXRpdmVGcmFtZShsb25nKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2ckFwaSB7Ci0gIGludFtdIG5hdGl2ZUdldFdpbmRvd0JvdW5kcyhsb25nKTsKLSAgbG9uZyBuYXRpdmVHdnJDb250ZXh0OwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRTZGtDb25maWd1cmF0aW9uUGFyYW1zIGdldFNka0NvbmZpZ3VyYXRpb25QYXJhbXMoKTsKLSAgaW50IG5hdGl2ZUdldFZpZXdlclR5cGUobG9uZyk7Ci0gIGludCBuYXRpdmVFeHRlcm5hbFN1cmZhY2VHZXRJZChsb25nKTsKLSAgdm9pZCBuYXRpdmVTZXRBcHBsaWNhdGlvblN0YXRlKGphdmEubGFuZy5DbGFzc0xvYWRlciwgYW5kcm9pZC5jb250ZW50LkNvbnRleHQpOwotICBib29sZWFuIElTX1JPQk9MRUNUUklDX0JVSUxEOwotICBib29sZWFuIGdldEFzeW5jUmVwcm9qZWN0aW9uRW5hYmxlZCgpOwotICBmbG9hdCBuYXRpdmVHZXRCb3JkZXJTaXplTWV0ZXJzKGxvbmcpOwotICB2b2lkIG5hdGl2ZUdldEhlYWRTcGFjZUZyb21TdGFydFNwYWNlVHJhbnNmb3JtKGxvbmcsIGZsb2F0W10sIGxvbmcpOwotICB2b2lkIG5hdGl2ZUdldEhlYWRTcGFjZUZyb21TdGFydFNwYWNlUm90YXRpb24obG9uZywgZmxvYXRbXSwgbG9uZyk7Ci0gIHZvaWQgbmF0aXZlQnVmZmVyVmlld3BvcnRHZXRTb3VyY2VVdihsb25nLCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGKTsKLSAgamF2YS51dGlsLkFycmF5TGlzdCBzd2FwQ2hhaW5SZWZzOwotICB2b2lkIG5hdGl2ZUJ1ZmZlclZpZXdwb3J0U2V0UmVwcm9qZWN0aW9uKGxvbmcsIGludCk7Ci0gIHZvaWQgbmF0aXZlUmVzZXRUcmFja2luZyhsb25nKTsKLSAgdm9pZCBuYXRpdmVSZWxlYXNlR3ZyQ29udGV4dChsb25nKTsKLSAgdm9pZCBuYXRpdmVHZXRTY3JlZW5UYXJnZXRTaXplKGxvbmcsIGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQpOwotICBib29sZWFuIG5hdGl2ZVNldEFzeW5jUmVwcm9qZWN0aW9uRW5hYmxlZChsb25nLCBib29sZWFuKTsKLSAgdm9pZCBuYXRpdmVTd2FwQ2hhaW5HZXRCdWZmZXJTaXplKGxvbmcsIGludCwgYW5kcm9pZC5ncmFwaGljcy5Qb2ludCk7Ci0gIGludCBuYXRpdmVVc2VyUHJlZnNHZXRDb250cm9sbGVySGFuZGVkbmVzcyhsb25nKTsKLSAgdm9pZCBuYXRpdmVCdWZmZXJWaWV3cG9ydEdldFRyYW5zZm9ybShsb25nLCBmbG9hdFtdKTsKLSAgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgY29udGV4dDsKLSAgbG9uZyBuYXRpdmVCdWZmZXJWaWV3cG9ydENyZWF0ZShsb25nKTsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5FeHRlcm5hbFN1cmZhY2UgY3JlYXRlRXh0ZXJuYWxTdXJmYWNlKGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyTGF5b3V0JEV4dGVybmFsU3VyZmFjZUxpc3RlbmVyLCBhbmRyb2lkLm9zLkhhbmRsZXIpOwotICBib29sZWFuIG5hdGl2ZUlzRmVhdHVyZVN1cHBvcnRlZChsb25nLCBpbnQpOwotICB2b2lkIHJlc3VtZVRyYWNraW5nU2V0U3RhdGUoYnl0ZVtdKTsKLSAgbG9uZyBuYXRpdmVWYWx1ZUdldEZsYWdzKGxvbmcpOwotICBib29sZWFuIG5hdGl2ZVNldERlZmF1bHRWaWV3ZXJQcm9maWxlKGxvbmcsIGphdmEubGFuZy5TdHJpbmcpOwotICB2b2lkIG5hdGl2ZVJlc3VtZShsb25nKTsKLSAgdm9pZCByZWZyZXNoRGlzcGxheU1ldHJpY3MoKTsKLSAgdm9pZCBvblN1cmZhY2VDcmVhdGVkUmVwcm9qZWN0aW9uVGhyZWFkKCk7Ci0gIHZvaWQgbmF0aXZlU2V0RGlzcGxheU1ldHJpY3MobG9uZywgaW50LCBpbnQsIGZsb2F0LCBmbG9hdCk7Ci0gIGJ5dGVbXSBwYXVzZVRyYWNraW5nR2V0U3RhdGUoKTsKLSAgdm9pZCByZXF1ZXN0Q29udGV4dFNoYXJpbmcoY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuRWdsUmVhZHlMaXN0ZW5lcik7Ci0gIGxvbmcgbmF0aXZlR2V0RXZlbnRGbGFncyhsb25nKTsKLSAgamF2YS5sYW5nLlN0cmluZyBuYXRpdmVHZXRFcnJvclN0cmluZyhpbnQpOwotICBqYXZhLmxhbmcuU3RyaW5nIG5hdGl2ZUdldFZpZXdlck1vZGVsKGxvbmcpOwotICBib29sZWFuIHVzaW5nRHluYW1pY0xpYnJhcnkoYW5kcm9pZC5jb250ZW50LkNvbnRleHQpOwotICB2b2lkIG5hdGl2ZVBhdXNlVHJhY2tpbmcobG9uZyk7Ci0gIGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQgcmVuZGVyUmVwcm9qZWN0aW9uVGhyZWFkKCk7Ci0gIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLkRpc3BsYXlTeW5jaHJvbml6ZXIgZGlzcGxheVN5bmNocm9uaXplcjsKLSAgdm9pZCBuYXRpdmVTZXRTdXJmYWNlU2l6ZShsb25nLCBpbnQsIGludCk7Ci0gIHZvaWQgcmVjZW50ZXJUcmFja2luZygpOwotICBpbnQgbmF0aXZlRnJhbWVHZXRGcmFtZWJ1ZmZlck9iamVjdChsb25nLCBpbnQpOwotICBpbnQgbmF0aXZlVmFsdWVBc0ludChsb25nKTsKLSAgYm9vbGVhbiBuYXRpdmVHZXRBc3luY1JlcHJvamVjdGlvbkVuYWJsZWQobG9uZyk7Ci0gIHZvaWQgZHVtcERlYnVnRGF0YSgpOwotICBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5EaXNwbGF5U3luY2hyb25pemVyIGNyZWF0ZURlZmF1bHREaXNwbGF5U3luY2hyb25pemVyKGFuZHJvaWQuY29udGVudC5Db250ZXh0KTsKLSAgbG9uZyBuYXRpdmVWYWx1ZUFzRmxhZ3MobG9uZyk7Ci0gIHZvaWQgbmF0aXZlQnVmZmVyVmlld3BvcnRTZXRTb3VyY2VCdWZmZXJJbmRleChsb25nLCBpbnQpOwotICB2b2lkIG5hdGl2ZVZhbHVlQXNNYXQ0Zihsb25nLCBmbG9hdFtdKTsKLSAgYW5kcm9pZC52aWV3LlN1cmZhY2UgbmF0aXZlRXh0ZXJuYWxTdXJmYWNlR2V0U3VyZmFjZShsb25nKTsKLSAgdm9pZCBuYXRpdmVCdWZmZXJWaWV3cG9ydExpc3RTZXRJdGVtKGxvbmcsIGludCwgbG9uZyk7Ci0gIHZvaWQgbmF0aXZlU2V0RGVmYXVsdEZyYW1lYnVmZmVyQWN0aXZlKGxvbmcpOwotICBpbnQgbmF0aXZlR2V0RXZlbnRUeXBlKGxvbmcpOwotICB2b2lkIG5hdGl2ZUJ1ZmZlclZpZXdwb3J0U2V0VHJhbnNmb3JtKGxvbmcsIGZsb2F0W10pOwotICB2b2lkIG5hdGl2ZUJ1ZmZlclNwZWNTZXRTYW1wbGVzKGxvbmcsIGludCk7Ci0gIGludCBuYXRpdmVCdWZmZXJWaWV3cG9ydExpc3RHZXRTaXplKGxvbmcpOwotICB2b2lkIG9uUGF1c2VSZXByb2plY3Rpb25UaHJlYWQoKTsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5Qcm9wZXJ0aWVzIHByb3BlcnRpZXM7Ci0gIGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljcyBjb21wdXRlQ3VycmVudERpc3BsYXlNZXRyaWNzKGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uRGlzcGxheSREaXNwbGF5UGFyYW1zKTsKLSAgbG9uZyBuYXRpdmVCdWZmZXJTcGVjQ3JlYXRlKGxvbmcpOwotICB2b2lkIHNodXRkb3duKCk7Ci0gIHZvaWQgbmF0aXZlSW5pdGlhbGl6ZUdsKGxvbmcpOwotICBsb25nIG5hdGl2ZUdldEN1cnJlbnRQcm9wZXJ0aWVzKGxvbmcpOwotICB2b2lkIG5hdGl2ZUJ1ZmZlclZpZXdwb3J0R2V0U291cmNlRm92KGxvbmcsIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdEYpOwotICB2b2lkIG5hdGl2ZVBhdXNlKGxvbmcpOwotICB2b2lkIG5hdGl2ZVN3YXBDaGFpblJlc2l6ZUJ1ZmZlcihsb25nLCBpbnQsIGludCwgaW50KTsKLSAgYm9vbGVhbiBuYXRpdmVTZXRWaWV3ZXJQYXJhbXMobG9uZywgYnl0ZVtdKTsKLSAgbG9uZyBuYXRpdmVDcmVhdGVFdmVudCgpOwotICB2b2lkIHNldFN1cmZhY2VTaXplKGludCwgaW50KTsKLSAgdm9pZCBuYXRpdmVGcmFtZUdldEJ1ZmZlclNpemUobG9uZywgaW50LCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50KTsKLSAgdm9pZCBuYXRpdmVCdWZmZXJWaWV3cG9ydERlc3Ryb3kobG9uZyk7Ci0gIHZvaWQgbmF0aXZlRnJhbWVTdWJtaXQobG9uZywgbG9uZywgZmxvYXRbXSk7Ci0gIGludCBuYXRpdmVCdWZmZXJTcGVjR2V0U2FtcGxlcyhsb25nKTsKLSAgdm9pZCBzZXRBcHBsaWNhdGlvblN0YXRlKGFuZHJvaWQuY29udGVudC5Db250ZXh0KTsKLSAgaW50IG5hdGl2ZUJ1ZmZlclZpZXdwb3J0R2V0RXh0ZXJuYWxTdXJmYWNlSWQobG9uZyk7Ci0gIGJvb2xlYW4gbmF0aXZlVXNpbmdEeW5hbWljTGlicmFyeSgpOwotICB2b2lkIG5hdGl2ZUZyYW1lVW5iaW5kKGxvbmcpOwotICB2b2lkIG5hdGl2ZUJ1ZmZlclNwZWNTZXREZXB0aFN0ZW5jaWxGb3JtYXQobG9uZywgaW50KTsKLSAgdm9pZCBzZXRJZGxlTGlzdGVuZXIoY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJBcGkkSWRsZUxpc3RlbmVyKTsKLSAgdm9pZCBuYXRpdmVHZXRSZWNlbnRlckV2ZW50U3RhcnRTcGFjZUZyb21UcmFja2luZ1NwYWNlVHJhbnNmb3JtKGxvbmcsIGZsb2F0W10pOwotICB2b2lkIG5hdGl2ZVNldExlbnNPZmZzZXQobG9uZywgZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci0gIGxvbmcgbmF0aXZlR2V0UmVjZW50ZXJFdmVudEZsYWdzKGxvbmcpOwotICBpbnQgbmF0aXZlR2V0RXJyb3IobG9uZyk7Ci0gIGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQgbmF0aXZlUmVuZGVyUmVwcm9qZWN0aW9uVGhyZWFkKGxvbmcpOwotICB2b2lkIG5hdGl2ZVNldElkbGVMaXN0ZW5lcihsb25nLCBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2ckFwaSRJZGxlTGlzdGVuZXIpOwotICAgPGluaXQ+KGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBsb25nKTsKLSAgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuVnJQYXJhbXNQcm92aWRlciB2clBhcmFtc1Byb3ZpZGVyOwotICB2b2lkIG5hdGl2ZUJ1ZmZlclZpZXdwb3J0U2V0U291cmNlTGF5ZXIobG9uZywgaW50KTsKLSAgdm9pZCBzZXRMZW5zT2Zmc2V0KGZsb2F0LCBmbG9hdCwgZmxvYXQpOwotICB2b2lkIG5hdGl2ZU9uUGF1c2VSZXByb2plY3Rpb25UaHJlYWQobG9uZyk7Ci0gICA8aW5pdD4oYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLkRpc3BsYXlTeW5jaHJvbml6ZXIpOwotICB2b2lkIG5hdGl2ZUJ1ZmZlclZpZXdwb3J0U2V0VGFyZ2V0RXllKGxvbmcsIGludCk7Ci0gIHZvaWQgbmF0aXZlUmVzdW1lVHJhY2tpbmcobG9uZyk7Ci0gIHZvaWQgbmF0aXZlU2V0SWdub3JlTWFudWFsUGF1c2VSZXN1bWVUcmFja2VyKGxvbmcsIGJvb2xlYW4pOwotICBpbnQgbmF0aXZlQnVmZmVyVmlld3BvcnRHZXRTb3VyY2VCdWZmZXJJbmRleChsb25nKTsKLSAgdm9pZCBuYXRpdmVHZXRFeWVGcm9tSGVhZE1hdHJpeChsb25nLCBpbnQsIGZsb2F0W10pOwotICBib29sZWFuIGlzRmVhdHVyZVN1cHBvcnRlZChpbnQpOwotICB2b2lkIG5hdGl2ZURlc3Ryb3lFdmVudChsb25nKTsKLSAgYm9vbGVhbiBuYXRpdmVHZXRQcm9wZXJ0eShsb25nLCBpbnQsIGxvbmcpOwotICBpbnQgbmF0aXZlU3dhcENoYWluR2V0QnVmZmVyQ291bnQobG9uZyk7Ci0gIHZvaWQgcmVzdW1lKCk7Ci0gIGxvbmcgbmF0aXZlR2V0VXNlclByZWZzKGxvbmcpOwotICBsb25nIGdldE5hdGl2ZUd2ckNvbnRleHQoKTsKLSAgdm9pZCBuYXRpdmVCdWZmZXJTcGVjU2V0U2l6ZShsb25nLCBpbnQsIGludCk7Ci0gIGxvbmcgbmF0aXZlU3dhcENoYWluQ3JlYXRlKGxvbmcsIGxvbmdbXSk7Ci0gIHZvaWQgbmF0aXZlR2V0TWF4aW11bUVmZmVjdGl2ZVJlbmRlclRhcmdldFNpemUobG9uZywgYW5kcm9pZC5ncmFwaGljcy5Qb2ludCk7Ci0gIHZvaWQgbmF0aXZlQnVmZmVyVmlld3BvcnRTZXRPcGFjaXR5KGxvbmcsIGZsb2F0KTsKLSAgZmxvYXQgbmF0aXZlQnVmZmVyVmlld3BvcnRHZXRPcGFjaXR5KGxvbmcpOwotICB2b2lkIG5hdGl2ZVN3YXBDaGFpbkRlc3Ryb3kobG9uZyk7Ci0gIHZvaWQgc2V0RGlzcGxheU1ldHJpY3MoYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzKTsKLSAgYnl0ZVtdIG5hdGl2ZVBhdXNlVHJhY2tpbmdHZXRTdGF0ZShsb25nKTsKLSAgYm9vbGVhbiBzZXRBc3luY1JlcHJvamVjdGlvbkVuYWJsZWQoYm9vbGVhbik7Ci0gIHZvaWQgbmF0aXZlQnVmZmVyVmlld3BvcnRMaXN0RGVzdHJveShsb25nKTsKLSAgdm9pZCBuYXRpdmVSZXF1ZXN0Q29udGV4dFNoYXJpbmcobG9uZywgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuRWdsUmVhZHlMaXN0ZW5lcik7Ci0gIGJvb2xlYW4gbmF0aXZlVXNpbmdTaGltTGlicmFyeSgpOwotICB2b2lkIG5hdGl2ZUJ1ZmZlclZpZXdwb3J0U2V0U291cmNlVXYobG9uZywgZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpOwotICB2b2lkIG5hdGl2ZUJ1ZmZlclNwZWNTZXRNdWx0aXZpZXdMYXllcnMobG9uZywgaW50KTsKLSAgYm9vbGVhbiBuYXRpdmVVc2luZ1ZyRGlzcGxheVNlcnZpY2UobG9uZyk7Ci0gIHZvaWQgbmF0aXZlRHVtcERlYnVnRGF0YShsb25nKTsKLSAgamF2YS5sYW5nLlN0cmluZyBuYXRpdmVHZXRWaWV3ZXJWZW5kb3IobG9uZyk7Ci0gIGxvbmcgbmF0aXZlRXh0ZXJuYWxTdXJmYWNlQ3JlYXRlV2l0aExpc3RlbmVycyhsb25nLCBqYXZhLmxhbmcuUnVubmFibGUsIGphdmEubGFuZy5SdW5uYWJsZSwgYW5kcm9pZC5vcy5IYW5kbGVyKTsKLSAgdm9pZCBuYXRpdmVCdWZmZXJWaWV3cG9ydFNldFNvdXJjZUZvdihsb25nLCBmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci0gIHZvaWQgbmF0aXZlRnJhbWVCaW5kQnVmZmVyKGxvbmcsIGludCk7Ci0gIGxvbmcgbmF0aXZlQ3JlYXRlVmFsdWUoKTsKLSAgdm9pZCBuYXRpdmVSZXN1bWVUcmFja2luZ1NldFN0YXRlKGxvbmcsIGJ5dGVbXSk7Ci0gIGludCBuYXRpdmVDbGVhckVycm9yKGxvbmcpOwotICBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2ckFwaSRQb3NlVHJhY2tlciBzUG9zZVRyYWNrZXJGb3JUZXN0aW5nOwotICB2b2lkIG5hdGl2ZUJ1ZmZlclZpZXdwb3J0TGlzdEdldEl0ZW0obG9uZywgaW50LCBsb25nKTsKLSAgbG9uZyBuYXRpdmVDcmVhdGUoamF2YS5sYW5nLkNsYXNzTG9hZGVyLCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgbG9uZywgaW50LCBpbnQsIGZsb2F0LCBmbG9hdCwgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJBcGkkUG9zZVRyYWNrZXIpOwotICB2b2lkIG5hdGl2ZVJlY2VudGVyVHJhY2tpbmcobG9uZyk7Ci0gIGZsb2F0IG5hdGl2ZVZhbHVlQXNGbG9hdChsb25nKTsKLSAgYm9vbGVhbiBuYXRpdmVQb2xsRXZlbnQobG9uZywgbG9uZyk7Ci0gIGNvbS5nb29nbGUudnIubmRrLmJhc2UuVXNlclByZWZzIHVzZXJQcmVmczsKLSAgdm9pZCBnZXRFeWVGcm9tSGVhZE1hdHJpeChpbnQsIGZsb2F0W10pOwotICBib29sZWFuIHVzaW5nU2hpbUxpYnJhcnkoKTsKLSAgdm9pZCBuYXRpdmVPblN1cmZhY2VDaGFuZ2VkUmVwcm9qZWN0aW9uVGhyZWFkKGxvbmcpOwotICBsb25nIG5hdGl2ZUJ1ZmZlclZpZXdwb3J0TGlzdENyZWF0ZShsb25nKTsKLSAgdm9pZCBvblN1cmZhY2VDaGFuZ2VkUmVwcm9qZWN0aW9uVGhyZWFkKCk7Ci0gIHZvaWQgbmF0aXZlU2V0RHluYW1pY0xpYnJhcnlMb2FkaW5nRW5hYmxlZChib29sZWFuKTsKLSAgdm9pZCBuYXRpdmVCdWZmZXJTcGVjR2V0U2l6ZShsb25nLCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50KTsKLSAgdm9pZCBzZXRJZ25vcmVNYW51YWxUcmFja2VyUGF1c2VSZXN1bWUoYm9vbGVhbik7Ci0gIGJvb2xlYW4gdXNpbmdWckRpc3BsYXlTZXJ2aWNlKCk7Ci0gIGludCBuYXRpdmVCdWZmZXJWaWV3cG9ydEdldFJlcHJvamVjdGlvbihsb25nKTsKLSAgdm9pZCBuYXRpdmVEZXN0cm95VmFsdWUobG9uZyk7Ci0gIGludCBnZXRWaWV3ZXJUeXBlKCk7Ci0gIGludCBuYXRpdmVHZXRSZWNlbnRlckV2ZW50VHlwZShsb25nKTsKLSAgdm9pZCBuYXRpdmVEaXN0b3J0VG9TY3JlZW4obG9uZywgaW50LCBsb25nLCBmbG9hdFtdLCBsb25nKTsKLSAgdm9pZCBuYXRpdmVCdWZmZXJWaWV3cG9ydFNldEV4dGVybmFsU3VyZmFjZUlkKGxvbmcsIGludCk7Ci0gIGJvb2xlYW4gc2V0Vmlld2VyUGFyYW1zKGJ5dGVbXSk7Ci0gIHZvaWQgbmF0aXZlRXh0ZXJuYWxTdXJmYWNlRGVzdHJveShsb25nKTsKLSAgYm9vbGVhbiBuYXRpdmVCdWZmZXJWaWV3cG9ydEVxdWFsKGxvbmcsIGxvbmcpOwotICBmbG9hdFtdIG5hdGl2ZUNvbXB1dGVEaXN0b3J0ZWRQb2ludChsb25nLCBpbnQsIGZsb2F0W10pOwotICB2b2lkIG5hdGl2ZUJ1ZmZlclNwZWNTZXRDb2xvckZvcm1hdChsb25nLCBpbnQpOwotICBsb25nIG5hdGl2ZUdldEV2ZW50VGltZXN0YW1wKGxvbmcpOwotICB2b2lkIG5hdGl2ZUdldFJlY29tbWVuZGVkQnVmZmVyVmlld3BvcnRzKGxvbmcsIGxvbmcpOwotICBib29sZWFuIG93bnNOYXRpdmVHdnJDb250ZXh0OwotICB2b2lkIHBhdXNlKCk7Ci0gIHZvaWQgbmF0aXZlR2V0U2NyZWVuQnVmZmVyVmlld3BvcnRzKGxvbmcsIGxvbmcpOwotICB2b2lkIG5hdGl2ZUJ1ZmZlclNwZWNEZXN0cm95KGxvbmcpOwotICBib29sZWFuIGlzT3BlbkdMS0hSRGVidWdFbmFibGVkKCk7Ci0gIHZvaWQgbmF0aXZlT25TdXJmYWNlQ3JlYXRlZFJlcHJvamVjdGlvblRocmVhZChsb25nKTsKLSAgbG9uZyBuYXRpdmVTd2FwQ2hhaW5BY3F1aXJlRnJhbWUobG9uZyk7Ci0gIHZvaWQgbmF0aXZlUmVjb25uZWN0U2Vuc29ycyhsb25nKTsKLSAgaW50IG5hdGl2ZUJ1ZmZlclZpZXdwb3J0R2V0VGFyZ2V0RXllKGxvbmcpOwotICB2b2lkIG5hdGl2ZUJ1ZmZlclZpZXdwb3J0U2V0RXh0ZXJuYWxTdXJmYWNlKGxvbmcsIGxvbmcpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyTGF5b3V0IHsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJBcGkgZ2V0R3ZyQXBpKCk7Ci0gIHZvaWQgYWRkVmlldyhhbmRyb2lkLnZpZXcuVmlldyk7Ci0gICA8aW5pdD4oYW5kcm9pZC5jb250ZW50LkNvbnRleHQpOwotICB2b2lkIG9uUGF1c2UoKTsKLSAgYm9vbGVhbiBkaXNwYXRjaFRvdWNoRXZlbnQoYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50KTsKLSAgdm9pZCBvblNpemVDaGFuZ2VkKGludCwgaW50LCBpbnQsIGludCk7Ci0gIHZvaWQgb25SZXN1bWUoKTsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUubGlicmFyeS5hcGkuSUd2ckxheW91dCBpbXBsOwotICBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkV4dGVybmFsU3VyZmFjZSB2aWRlb1N1cmZhY2U7Ci0gIHZvaWQgc2h1dGRvd24oKTsKLSAgdm9pZCBpbml0KCk7Ci0gIGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyVWlMYXlvdXQgdWlMYXlvdXQ7Ci0gIGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyQXBpIGd2ckFwaTsKLSAgYm9vbGVhbiBvbkdlbmVyaWNNb3Rpb25FdmVudChhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQpOwotICBib29sZWFuIGRpc3BhdGNoS2V5RXZlbnQoYW5kcm9pZC52aWV3LktleUV2ZW50KTsKLSAgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgZ2V0Q29udGV4dCgpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyTGF5b3V0JEV4dGVybmFsU3VyZmFjZUxpc3RlbmVyIHsKLSAgdm9pZCBvblN1cmZhY2VBdmFpbGFibGUoYW5kcm9pZC52aWV3LlN1cmZhY2UpOwotICB2b2lkIG9uRnJhbWVBdmFpbGFibGUoKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2ckxheW91dEZhY3RvcnkgewotICBjb20uZ29vZ2xlLnZyLnZyY29yZS5saWJyYXJ5LmFwaS5JR3ZyTGF5b3V0IGNyZWF0ZShhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCk7Ci0gIGNvbS5nb29nbGUudnIudnJjb3JlLmxpYnJhcnkuYXBpLklHdnJMYXlvdXQgdHJ5Q3JlYXRlRnJvbVZyQ29yZVBhY2thZ2UoYW5kcm9pZC5jb250ZW50LkNvbnRleHQpOwotICBjb20uZ29vZ2xlLnZyLnZyY29yZS5saWJyYXJ5LmFwaS5JR3ZyTGF5b3V0IGNyZWF0ZUZyb21DdXJyZW50UGFja2FnZShhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJMYXlvdXRJbXBsIHsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJMYXlvdXRJbXBsJFByZXNlbnRhdGlvbkhlbHBlciBwcmVzZW50YXRpb25IZWxwZXI7Ci0gIGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyTGF5b3V0SW1wbCRQcmVzZW50YXRpb25IZWxwZXIgdHJ5Q3JlYXRlUHJlc2VudGF0aW9uSGVscGVyKCk7Ci0gIGJvb2xlYW4gaXNQcmVzZW50aW5nKCk7Ci0gIGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyTGF5b3V0SW1wbCRGcmFtZUZsdXNoV29ya2Fyb3VuZCBmcmFtZUZsdXNoV29ya2Fyb3VuZDsKLSAgdm9pZCBvblBhdXNlKCk7Ci0gIHZvaWQgdXBkYXRlVWlMYXlvdXQoKTsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJMYXlvdXRJbXBsJFNjcmVlbk9uTWFuYWdlciBzY3JlZW5Pbk1hbmFnZXI7Ci0gIGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyVWlMYXlvdXRJbXBsIHVpTGF5b3V0OwotICBib29sZWFuIGlzQ29udGV4dFNoYXJpbmdFbmFibGVkKCk7Ci0gIGJvb2xlYW4gaXNSZXN1bWVkOwotICBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5TY2FubGluZVJhY2luZ1JlbmRlcmVyIGFjY2VzcyQyMDAoY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJMYXlvdXRJbXBsKTsKLSAgYW5kcm9pZC52aWV3LlZpZXcgcHJlc2VudGF0aW9uVmlldzsKLSAgdm9pZCBhZGRWaWV3KGFuZHJvaWQudmlldy5WaWV3LCBpbnQpOwotICAgPGluaXQ+KGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkV4dGVuc2lvbk1hbmFnZXIpOwotICBpbnQgYXN5bmNSZXByb2plY3Rpb25GbGFnczsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5WckNvcmVTZGtDbGllbnQgZ2V0VnJDb3JlU2RrQ2xpZW50KCk7Ci0gIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLkVnbFJlYWR5TGlzdGVuZXIgZWdsUmVhZHlMaXN0ZW5lcjsKLSAgIDxpbml0PihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCk7Ci0gIGNvbS5nb29nbGUudnIubmRrLmJhc2UuVnJDb3JlU2RrQ2xpZW50IGFjY2VzcyQxMDAoY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJMYXlvdXRJbXBsKTsKLSAgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuRWdsRmFjdG9yeSBlZ2xGYWN0b3J5OwotICBib29sZWFuIGF0dGFjaGVkVG9XaW5kb3c7Ci0gIGNvbS5nb29nbGUudnIubmRrLmJhc2UuRmFkZU92ZXJsYXlWaWV3IGZhZGVPdmVybGF5VmlldzsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJVaUxheW91dEltcGwgYWNjZXNzJDMwMChjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2ckxheW91dEltcGwpOwotICBib29sZWFuIHJlbW92ZUNhbGxiYWNrcyhqYXZhLmxhbmcuUnVubmFibGUpOwotICBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2ckxheW91dEltcGwkQXN5bmNSZXByb2plY3Rpb25TdXJmYWNlVmlldyBzY2FubGluZVJhY2luZ1ZpZXc7Ci0gIGNvbS5nb29nbGUudnIubmRrLmJhc2UuVnJDb3JlU2RrQ2xpZW50IGNyZWF0ZVZyQ29yZVNka0NsaWVudChhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJBcGksIGNvbS5nb29nbGUudnIubmRrLmJhc2UuRGF5ZHJlYW1VdGlsc1dyYXBwZXIsIGNvbS5nb29nbGUudnIubmRrLmJhc2UuRmFkZU92ZXJsYXlWaWV3KTsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJMYXlvdXRJbXBsJFByZXNlbnRhdGlvbkZhY3RvcnkgYWNjZXNzJDUwMCgpOwotICBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkV4dGVuc2lvbk1hbmFnZXIgZXh0ZW5zaW9uTWFuYWdlcjsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5FeHRlcm5hbFN1cmZhY2UgdmlkZW9TdXJmYWNlOwotICBib29sZWFuIGVuYWJsZUNhcmRib2FyZFRyaWdnZXJFbXVsYXRpb24oamF2YS5sYW5nLlJ1bm5hYmxlKTsKLSAgaW50IGdldFdpbmRvd1Zpc2liaWxpdHkoKTsKLSAgYm9vbGVhbiBhdXRvRmFkZUVuYWJsZWQ7Ci0gIGJvb2xlYW4gcG9zdERlbGF5ZWQoamF2YS5sYW5nLlJ1bm5hYmxlLCBsb25nKTsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJBcGkgZ3ZyQXBpOwotICBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLlNka0RheWRyZWFtVG91Y2hMaXN0ZW5lciBkYXlkcmVhbVRvdWNoTGlzdGVuZXI7Ci0gIHZvaWQgb25SZXN1bWUoKTsKLSAgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgZ2V0Q29udGV4dCgpOwotICBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dCBwcmVzZW50YXRpb25MYXlvdXQ7Ci0gIGNvbS5nb29nbGUudnIubmRrLmJhc2UuQ2FyZGJvYXJkRW11bGF0b3IgY2FyZGJvYXJkRW11bGF0b3I7Ci0gIGNvbS5nb29nbGUudnIubmRrLmJhc2UuU2RrRGF5ZHJlYW1Ub3VjaExpc3RlbmVyIGNyZWF0ZURheWRyZWFtVG91Y2hMaXN0ZW5lcigpOwotICB2b2lkIGluaXRXaXRoSW5qZWN0ZWRPYmplY3RzKGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyQXBpLCBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5EaXNwbGF5U3luY2hyb25pemVyLCBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5FZ2xSZWFkeUxpc3RlbmVyLCBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkZhZGVPdmVybGF5VmlldywgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5EYXlkcmVhbVV0aWxzV3JhcHBlciwgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5FeHRlbnNpb25NYW5hZ2VyLCBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2clVpTGF5b3V0SW1wbCk7Ci0gIHZvaWQgYWRkU2NhbmxpbmVSYWNpbmdWaWV3KCk7Ci0gIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlNjYW5saW5lUmFjaW5nUmVuZGVyZXIgc2NhbmxpbmVSYWNpbmdSZW5kZXJlcjsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJBcGkgZ2V0R3ZyQXBpKCk7Ci0gIHZvaWQgcmVtb3ZlVmlldyhhbmRyb2lkLnZpZXcuVmlldyk7Ci0gIHZvaWQgYWNjZXNzJDAwMChjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2ckxheW91dEltcGwsIGludCk7Ci0gIHZvaWQgc2V0UHJlc2VudGF0aW9uVmlldyhhbmRyb2lkLnZpZXcuVmlldyk7Ci0gIHZvaWQgc2V0U3RlcmVvTW9kZUVuYWJsZWQoYm9vbGVhbik7Ci0gIGJvb2xlYW4gaXNEZXZpY2VEZXRlY3Rpb25FbmFibGVkKCk7Ci0gIGJvb2xlYW4gZW5hYmxlQXN5bmNSZXByb2plY3Rpb24oaW50KTsKLSAgamF2YS5sYW5nLlJ1bm5hYmxlIHNob3dSZW5kZXJpbmdWaWV3c1J1bm5hYmxlOwotICB2b2lkIHVwZGF0ZUZhZGVWaXNpYmlsaXR5KCk7Ci0gIGJvb2xlYW4gc3RlcmVvTW9kZUVuYWJsZWQ7Ci0gIGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyTGF5b3V0SW1wbCRQcmVzZW50YXRpb25GYWN0b3J5IHNPcHRpb25hbFByZXNlbnRhdGlvbkZhY3Rvcnk7Ci0gIHZvaWQgaW5pdChjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkV4dGVuc2lvbk1hbmFnZXIpOwotICBib29sZWFuIGlzRGltVWlFbmFibGVkKCk7Ci0gIHZvaWQgc2V0UmVlbnRyeUludGVudChhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50KTsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJVaUxheW91dEltcGwgZ2V0VWlMYXlvdXRJbXBsKCk7Ci0gIHZvaWQgb25CYWNrUHJlc3NlZCgpOwotICB2b2lkIHNldFN0ZXJlb01vZGVFbmFibGVkSW1wbChib29sZWFuKTsKLSAgdm9pZCBzaHV0ZG93bigpOwotICBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5EaXNwbGF5U3luY2hyb25pemVyIGRpc3BsYXlTeW5jaHJvbml6ZXI7Ci0gIGJvb2xlYW4gc2V0T25Eb25Ob3ROZWVkZWRMaXN0ZW5lcihqYXZhLmxhbmcuUnVubmFibGUpOwotICB2b2lkIGxhbWJkYSRzZXRTdGVyZW9Nb2RlRW5hYmxlZCQwJEd2ckxheW91dEltcGwoYm9vbGVhbik7Ci0gIHZvaWQgdXBkYXRlUmVuZGVyaW5nVmlld3NWaXNpYmlsaXR5KGludCk7Ci0gIGNvbS5nb29nbGUudnIubmRrLmJhc2UuVnJDb3JlU2RrQ2xpZW50IHZyQ29yZVNka0NsaWVudDsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5EYXlkcmVhbVV0aWxzV3JhcHBlciBkYXlkcmVhbVV0aWxzOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyTGF5b3V0SW1wbCQkTGFtYmRhJDAgewotICBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2ckxheW91dEltcGwgYXJnJDE7Ci0gIGJvb2xlYW4gYXJnJDI7Ci0gICA8aW5pdD4oY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJMYXlvdXRJbXBsLCBib29sZWFuKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2ckxheW91dEltcGwkMSB7Ci0gIGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyTGF5b3V0SW1wbCB0aGlzJDA7Ci0gICA8aW5pdD4oY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJMYXlvdXRJbXBsKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2ckxheW91dEltcGwkMiB7Ci0gIGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyTGF5b3V0SW1wbCB0aGlzJDA7Ci0gICA8aW5pdD4oY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJMYXlvdXRJbXBsKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2ckxheW91dEltcGwkMyB7Ci0gICA8aW5pdD4oY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJMYXlvdXRJbXBsKTsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJMYXlvdXRJbXBsIHRoaXMkMDsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2ckxheW91dEltcGwkNCB7Ci0gICA8aW5pdD4oY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJMYXlvdXRJbXBsKTsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJMYXlvdXRJbXBsIHRoaXMkMDsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2ckxheW91dEltcGwkQXN5bmNSZXByb2plY3Rpb25TdXJmYWNlVmlldyB7Ci0gIHZvaWQgc2V0RUdMV2luZG93U3VyZmFjZUZhY3RvcnkoYW5kcm9pZC5vcGVuZ2wuR0xTdXJmYWNlVmlldyRFR0xXaW5kb3dTdXJmYWNlRmFjdG9yeSk7Ci0gICA8aW5pdD4oYW5kcm9pZC5jb250ZW50LkNvbnRleHQpOwotICB2b2lkIHNldEVHTENvbmZpZ0Nob29zZXIoYW5kcm9pZC5vcGVuZ2wuR0xTdXJmYWNlVmlldyRFR0xDb25maWdDaG9vc2VyKTsKLSAgdm9pZCBzZXRWaXNpYmlsaXR5KGludCk7Ci0gIHZvaWQgc2V0U3dhcE1vZGUoaW50KTsKLSAgdm9pZCBzZXRSZW5kZXJlcihjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5TY2FubGluZVJhY2luZ1JlbmRlcmVyKTsKLSAgYm9vbGVhbiBpc0RldGFjaGVkRnJvbVdpbmRvdygpOwotICB2b2lkIG9uU3VyZmFjZURlc3Ryb3llZChqYXZhLmxhbmcuUnVubmFibGUpOwotICB2b2lkIHNldEVHTENvbnRleHRGYWN0b3J5KGFuZHJvaWQub3BlbmdsLkdMU3VyZmFjZVZpZXckRUdMQ29udGV4dEZhY3RvcnkpOwotICB2b2lkIG9uUmVzdW1lKCk7Ci0gIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlNjYW5saW5lUmFjaW5nUmVuZGVyZXIgYWNjZXNzJDQwMChjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2ckxheW91dEltcGwkQXN5bmNSZXByb2plY3Rpb25TdXJmYWNlVmlldyk7Ci0gIHZvaWQgc2V0RWdsUmVhZHlMaXN0ZW5lcihjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5FZ2xSZWFkeUxpc3RlbmVyKTsKLSAgdm9pZCBvblBhdXNlKGphdmEubGFuZy5SdW5uYWJsZSk7Ci0gIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlNjYW5saW5lUmFjaW5nUmVuZGVyZXIgc2NhbmxpbmVSYWNpbmdSZW5kZXJlcjsKLSAgdm9pZCBvblBhdXNlKCk7Ci0gIHZvaWQgc2V0Wk9yZGVyTWVkaWFPdmVybGF5KGJvb2xlYW4pOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyTGF5b3V0SW1wbCRBc3luY1JlcHJvamVjdGlvblN1cmZhY2VWaWV3JDEgewotICAgPGluaXQ+KGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyTGF5b3V0SW1wbCRBc3luY1JlcHJvamVjdGlvblN1cmZhY2VWaWV3KTsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJMYXlvdXRJbXBsJEFzeW5jUmVwcm9qZWN0aW9uU3VyZmFjZVZpZXcgdGhpcyQwOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyTGF5b3V0SW1wbCRGcmFtZUZsdXNoV29ya2Fyb3VuZCB7Ci0gIGFuZHJvaWQudmlldy5DaG9yZW9ncmFwaGVyIGNob3Jlb2dyYXBoZXI7Ci0gIGludCBmcmFtZXNSZW1haW5pbmc7Ci0gICA8aW5pdD4oKTsKLSAgdm9pZCBvblJlc3VtZSgpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyTGF5b3V0SW1wbCRQcmVzZW50YXRpb25GYWN0b3J5IHsKLSAgYW5kcm9pZC5hcHAuUHJlc2VudGF0aW9uIGNyZWF0ZShhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgYW5kcm9pZC52aWV3LkRpc3BsYXkpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyTGF5b3V0SW1wbCRQcmVzZW50YXRpb25IZWxwZXIgewotICBhbmRyb2lkLmhhcmR3YXJlLmRpc3BsYXkuRGlzcGxheU1hbmFnZXIgZGlzcGxheU1hbmFnZXI7Ci0gICA8aW5pdD4oYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0LCBhbmRyb2lkLnZpZXcuVmlldywgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuRGlzcGxheVN5bmNocm9uaXplciwgamF2YS5sYW5nLlN0cmluZyk7Ci0gIGFuZHJvaWQud2lkZ2V0LlJlbGF0aXZlTGF5b3V0JExheW91dFBhcmFtcyBsYXlvdXQ7Ci0gIGFuZHJvaWQudmlldy5WaWV3IHZpZXc7Ci0gIGJvb2xlYW4gaGFzQ3VycmVudFByZXNlbnRhdGlvbkV4cGlyZWQoKTsKLSAgdm9pZCBzaHV0ZG93bigpOwotICB2b2lkIHNldERpc3BsYXkoYW5kcm9pZC52aWV3LkRpc3BsYXkpOwotICB2b2lkIGFkZExpc3RlbmVyKGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyTGF5b3V0SW1wbCRQcmVzZW50YXRpb25MaXN0ZW5lcik7Ci0gIGFuZHJvaWQuYXBwLlByZXNlbnRhdGlvbiBwcmVzZW50YXRpb247Ci0gIGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLkRpc3BsYXlTeW5jaHJvbml6ZXIgZGlzcGxheVN5bmNocm9uaXplcjsKLSAgdm9pZCBvblJlc3VtZSgpOwotICB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCk7Ci0gIGJvb2xlYW4gaXNQcmVzZW50aW5nKCk7Ci0gIGJvb2xlYW4gaXNWYWxpZEV4dGVybmFsRGlzcGxheShhbmRyb2lkLnZpZXcuRGlzcGxheSk7Ci0gIHZvaWQgZGV0YWNoVmlld0Zyb21QYXJlbnQoYW5kcm9pZC52aWV3LlZpZXcpOwotICB2b2lkIG9uUGF1c2UoKTsKLSAgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQgb3JpZ2luYWxQYXJlbnQ7Ci0gIGFuZHJvaWQuY29udGVudC5Db250ZXh0IGNvbnRleHQ7Ci0gIGphdmEubGFuZy5TdHJpbmcgZXh0ZXJuYWxEaXNwbGF5TmFtZTsKLSAgamF2YS51dGlsLkxpc3QgbGlzdGVuZXJzOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyTGF5b3V0SW1wbCRQcmVzZW50YXRpb25MaXN0ZW5lciB7Ci0gIHZvaWQgb25QcmVzZW50YXRpb25TdGFydGVkKGFuZHJvaWQudmlldy5EaXNwbGF5KTsKLSAgdm9pZCBvblByZXNlbnRhdGlvblN0b3BwZWQoKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2ckxheW91dEltcGwkU2NyZWVuT25NYW5hZ2VyIHsKLSAgbG9uZyBhY2Nlc3MkODAwKGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyTGF5b3V0SW1wbCRTY3JlZW5Pbk1hbmFnZXIpOwotICBsb25nIFFVSUVUX1BFUklPRF9BRlRFUl9SRVNVTUVfTUlMTElTOwotICBib29sZWFuIGlzSWRsZTsKLSAgbG9uZyBhY2Nlc3MkOTAwKCk7Ci0gIGFuZHJvaWQudmlldy5WaWV3IHBhcmVudFZpZXc7Ci0gIGJvb2xlYW4gYWNjZXNzJDYwMChjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2ckxheW91dEltcGwkU2NyZWVuT25NYW5hZ2VyKTsKLSAgYm9vbGVhbiBhY2Nlc3MkMTAwMChjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2ckxheW91dEltcGwkU2NyZWVuT25NYW5hZ2VyKTsKLSAgIDxpbml0PihhbmRyb2lkLnZpZXcuVmlldyk7Ci0gIHZvaWQgb25QYXVzZSgpOwotICBib29sZWFuIGlzUmVzdW1lZDsKLSAgYm9vbGVhbiBhY2Nlc3MkNjAyKGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyTGF5b3V0SW1wbCRTY3JlZW5Pbk1hbmFnZXIsIGJvb2xlYW4pOwotICB2b2lkIG9uUmVzdW1lKCk7Ci0gIHZvaWQgYWNjZXNzJDcwMChjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2ckxheW91dEltcGwkU2NyZWVuT25NYW5hZ2VyKTsKLSAgYm9vbGVhbiBhY2Nlc3MkMTAwMihjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2ckxheW91dEltcGwkU2NyZWVuT25NYW5hZ2VyLCBib29sZWFuKTsKLSAgdm9pZCB1cGRhdGVTZXRTY3JlZW5PbigpOwotICBsb25nIGxhc3RSZXN1bWVUaW1lTWlsbGlzOwotICB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbik7Ci0gIGJvb2xlYW4gaXNFbmFibGVkOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyTGF5b3V0SW1wbCRTY3JlZW5Pbk1hbmFnZXIkMSB7Ci0gICA8aW5pdD4oY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJMYXlvdXRJbXBsJFNjcmVlbk9uTWFuYWdlciwgYm9vbGVhbik7Ci0gIGJvb2xlYW4gdmFsJG5ld0lzRW5hYmxlZDsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJMYXlvdXRJbXBsJFNjcmVlbk9uTWFuYWdlciB0aGlzJDA7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJMYXlvdXRJbXBsJFNjcmVlbk9uTWFuYWdlciQyIHsKLSAgIDxpbml0Pihjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2ckxheW91dEltcGwkU2NyZWVuT25NYW5hZ2VyLCBib29sZWFuKTsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJMYXlvdXRJbXBsJFNjcmVlbk9uTWFuYWdlciB0aGlzJDA7Ci0gIGJvb2xlYW4gdmFsJG5ld0lzSWRsZTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2ckxheW91dEltcGxXcmFwcGVyIHsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJMYXlvdXRJbXBsIGltcGw7Ci0gICA8aW5pdD4oY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJMYXlvdXRJbXBsKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2clN1cmZhY2VWaWV3IHsKLSAgaW50IG1FR0xDb250ZXh0Q2xpZW50VmVyc2lvbjsKLSAgYW5kcm9pZC5vcGVuZ2wuR0xTdXJmYWNlVmlldyRFR0xDb25maWdDaG9vc2VyIGFjY2VzcyQ1MDAoY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJTdXJmYWNlVmlldyk7Ci0gIHZvaWQgc2V0RUdMQ29uZmlnQ2hvb3NlcihhbmRyb2lkLm9wZW5nbC5HTFN1cmZhY2VWaWV3JEVHTENvbmZpZ0Nob29zZXIpOwotICBhbmRyb2lkLm9wZW5nbC5HTFN1cmZhY2VWaWV3JFJlbmRlcmVyIGFjY2VzcyQxMDAwKGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyU3VyZmFjZVZpZXcpOwotICBib29sZWFuIG1QcmVzZXJ2ZUVHTENvbnRleHRPblBhdXNlOwotICB2b2lkIG9uUGF1c2UoKTsKLSAgIDxpbml0PihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCk7Ci0gIHZvaWQgaW5pdCgpOwotICBhbmRyb2lkLm9wZW5nbC5HTFN1cmZhY2VWaWV3JEVHTFdpbmRvd1N1cmZhY2VGYWN0b3J5IG1FR0xXaW5kb3dTdXJmYWNlRmFjdG9yeTsKLSAgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuRWdsUmVhZHlMaXN0ZW5lciBhY2Nlc3MkMzAwKGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyU3VyZmFjZVZpZXcpOwotICBib29sZWFuIG1EZXRhY2hlZDsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJTdXJmYWNlVmlldyRHTFdyYXBwZXIgbUdMV3JhcHBlcjsKLSAgYW5kcm9pZC5vcGVuZ2wuR0xTdXJmYWNlVmlldyRFR0xDb250ZXh0RmFjdG9yeSBtRUdMQ29udGV4dEZhY3Rvcnk7Ci0gIHZvaWQgb25TdXJmYWNlRGVzdHJveWVkKGphdmEubGFuZy5SdW5uYWJsZSk7Ci0gIHZvaWQgcXVldWVFdmVudChqYXZhLmxhbmcuUnVubmFibGUpOwotICB2b2lkIG9uUmVzdW1lKCk7Ci0gIGludCBhY2Nlc3MkODAwKGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyU3VyZmFjZVZpZXcpOwotICBhbmRyb2lkLm9wZW5nbC5HTFN1cmZhY2VWaWV3JEVHTFdpbmRvd1N1cmZhY2VGYWN0b3J5IGFjY2VzcyQ2MDAoY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJTdXJmYWNlVmlldyk7Ci0gIHZvaWQgc2V0RUdMQ29udGV4dENsaWVudFZlcnNpb24oaW50KTsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJTdXJmYWNlVmlldyRHTFRocmVhZCBtR0xUaHJlYWQ7Ci0gIGFuZHJvaWQub3BlbmdsLkdMU3VyZmFjZVZpZXckUmVuZGVyZXIgbVJlbmRlcmVyOwotICBpbnQgYWNjZXNzJDIwMChjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2clN1cmZhY2VWaWV3KTsKLSAgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuRWdsUmVhZHlMaXN0ZW5lciBtQXBwQ29udGV4dExpc3RlbmVyOwotICB2b2lkIHNldFJlbmRlcmVyKGFuZHJvaWQub3BlbmdsLkdMU3VyZmFjZVZpZXckUmVuZGVyZXIpOwotICAgPGluaXQ+KGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KTsKLSAgdm9pZCBvbkF0dGFjaGVkVG9XaW5kb3coKTsKLSAgdm9pZCBjaGVja1JlbmRlclRocmVhZFN0YXRlKCk7Ci0gIGFuZHJvaWQub3BlbmdsLkdMU3VyZmFjZVZpZXckRUdMQ29uZmlnQ2hvb3NlciBtRUdMQ29uZmlnQ2hvb3NlcjsKLSAgaW50IG1EZWJ1Z0ZsYWdzOwotICB2b2lkIHJlcXVlc3RFeGl0QW5kV2FpdCgpOwotICBib29sZWFuIGFjY2VzcyQ5MDAoY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJTdXJmYWNlVmlldyk7Ci0gIGJvb2xlYW4gbVByZXNlcnZlR2xUaHJlYWRPbkRldGFjaGVkRnJvbVdpbmRvdzsKLSAgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlIG1UaGlzV2Vha1JlZjsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJTdXJmYWNlVmlldyRHTFdyYXBwZXIgYWNjZXNzJDcwMChjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2clN1cmZhY2VWaWV3KTsKLSAgYW5kcm9pZC5vcGVuZ2wuR0xTdXJmYWNlVmlldyRFR0xDb250ZXh0RmFjdG9yeSBhY2Nlc3MkNDAwKGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyU3VyZmFjZVZpZXcpOwotICB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCk7Ci0gIGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyIGdldEhvbGRlcigpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyU3VyZmFjZVZpZXckQmFzZUNvbmZpZ0Nob29zZXIgewotICBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2clN1cmZhY2VWaWV3IHRoaXMkMDsKLSAgaW50W10gbUNvbmZpZ1NwZWM7Ci0gIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb25maWcgY2hvb3NlQ29uZmlnKGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0wxMCwgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTERpc3BsYXksIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb25maWdbXSk7Ci0gICA8aW5pdD4oY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJTdXJmYWNlVmlldywgaW50W10pOwotICBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29uZmlnIGNob29zZUNvbmZpZyhqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMMTAsIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xEaXNwbGF5KTsKLSAgaW50W10gZmlsdGVyQ29uZmlnU3BlYyhpbnRbXSk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJTdXJmYWNlVmlldyRDb21wb25lbnRTaXplQ2hvb3NlciB7Ci0gIGludCBtR3JlZW5TaXplOwotICBpbnQgbUFscGhhU2l6ZTsKLSAgaW50IG1CbHVlU2l6ZTsKLSAgaW50IG1SZWRTaXplOwotICBpbnQgZmluZENvbmZpZ0F0dHJpYihqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMMTAsIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xEaXNwbGF5LCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29uZmlnLCBpbnQsIGludCk7Ci0gIGludCBtRGVwdGhTaXplOwotICBpbnQgbVN0ZW5jaWxTaXplOwotICAgPGluaXQ+KGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyU3VyZmFjZVZpZXcsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpOwotICBpbnRbXSBtVmFsdWU7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJTdXJmYWNlVmlldyREZWZhdWx0Q29udGV4dEZhY3RvcnkgewotICAgPGluaXQ+KGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyU3VyZmFjZVZpZXcpOwotICAgPGluaXQ+KGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyU3VyZmFjZVZpZXcsIGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyU3VyZmFjZVZpZXckMSk7Ci0gIGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyU3VyZmFjZVZpZXcgdGhpcyQwOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyU3VyZmFjZVZpZXckRGVmYXVsdFdpbmRvd1N1cmZhY2VGYWN0b3J5IHsKLSAgIDxpbml0PigpOwotICAgPGluaXQ+KGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyU3VyZmFjZVZpZXckMSk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJTdXJmYWNlVmlldyRFZ2xIZWxwZXIgewotICB2b2lkIGluaXRpYWxpemUoKTsKLSAgaW50IHN3YXAoKTsKLSAgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wgY3JlYXRlR0woKTsKLSAgdm9pZCBzdGFydCgpOwotICB2b2lkIGZpbmlzaCgpOwotICBqYXZhLmxhbmcuU3RyaW5nIGdldEhleChpbnQpOwotICBqYXZhLmxhbmcuU3RyaW5nIGdldEVycm9yU3RyaW5nKGludCk7Ci0gIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb250ZXh0IG1FZ2xDb250ZXh0OwotICBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMU3VyZmFjZSBtRWdsU3VyZmFjZTsKLSAgdm9pZCBzZXRFZ2xTdXJmYWNlQXR0cmliKGludCwgaW50KTsKLSAgdm9pZCBkZXN0cm95U3VyZmFjZUltcCgpOwotICB2b2lkIGxvZ0VnbEVycm9yQXNXYXJuaW5nKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGludCk7Ci0gIHZvaWQgY3JlYXRlUGVuZGluZ0VnbENvbnRleHQoKTsKLSAgdm9pZCBkZXN0cm95U3VyZmFjZSgpOwotICB2b2lkIHRocm93RWdsRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcpOwotICB2b2lkIHRocm93RWdsRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcsIGludCk7Ci0gIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb25maWcgbUVnbENvbmZpZzsKLSAgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTERpc3BsYXkgbVBlbmRpbmdFZ2xEaXNwbGF5OwotICAgPGluaXQ+KGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZSk7Ci0gIGJvb2xlYW4gY3JlYXRlU3VyZmFjZSgpOwotICBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2UgbUd2clN1cmZhY2VWaWV3V2Vha1JlZjsKLSAgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbnRleHQgbVBlbmRpbmdFZ2xDb250ZXh0OwotICBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMMTAgbUVnbDsKLSAgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTERpc3BsYXkgbUVnbERpc3BsYXk7Ci0gIGphdmEubGFuZy5TdHJpbmcgZm9ybWF0RWdsRXJyb3IoamF2YS5sYW5nLlN0cmluZywgaW50KTsKLSAgdm9pZCByZW5ld1BlbmRpbmdFZ2xDb250ZXh0KCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJTdXJmYWNlVmlldyRHTFRocmVhZCB7Ci0gIHZvaWQgc2V0TmFtZShqYXZhLmxhbmcuU3RyaW5nKTsKLSAgdm9pZCBndWFyZGVkUnVuKCk7Ci0gIGJvb2xlYW4gbVBhdXNlZDsKLSAgdm9pZCBvbldpbmRvd1Jlc2l6ZShpbnQsIGludCk7Ci0gIGJvb2xlYW4gYWJsZVRvRHJhdygpOwotICBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2clN1cmZhY2VWaWV3JEdMVGhyZWFkJEdMVGhyZWFkTWFuYWdlciBtR0xUaHJlYWRNYW5hZ2VyOwotICBib29sZWFuIG1TaXplQ2hhbmdlZDsKLSAgdm9pZCBzZXRSZW5kZXJNb2RlKGludCk7Ci0gIHZvaWQgc2V0U3dhcE1vZGUoaW50KTsKLSAgYm9vbGVhbiBtUmVuZGVyQ29tcGxldGU7Ci0gIGJvb2xlYW4gbUhhdmVFZ2xTdXJmYWNlOwotICBib29sZWFuIG1TaG91bGRFeGl0OwotICBpbnQgbVJlbmRlck1vZGU7Ci0gIGJvb2xlYW4gbUhhc1N1cmZhY2U7Ci0gIGJvb2xlYW4gbVN1cmZhY2VJc0JhZDsKLSAgYm9vbGVhbiByZWFkeVRvRHJhdygpOwotICB2b2lkIG9uUGF1c2UoamF2YS5sYW5nLlJ1bm5hYmxlKTsKLSAgYm9vbGVhbiBtV2FpdGluZ0ZvclN1cmZhY2U7Ci0gIHZvaWQgcmVxdWVzdFJlbmRlcigpOwotICB2b2lkIG9uUmVzdW1lKCk7Ci0gIHZvaWQgc3RhcnQoKTsKLSAgaW50IGdldFJlbmRlck1vZGUoKTsKLSAgaW50IG1IZWlnaHQ7Ci0gIGJvb2xlYW4gbVJlcXVlc3RSZW5kZXI7Ci0gIGJvb2xlYW4gbUZpbmlzaGVkQ3JlYXRpbmdFZ2xTdXJmYWNlOwotICBpbnQgZ2V0U3dhcE1vZGUoKTsKLSAgaW50IG1XaWR0aDsKLSAgaW50IG1SZXF1ZXN0ZWRTd2FwTW9kZTsKLSAgdm9pZCBzdG9wRWdsU3VyZmFjZUxvY2tlZCgpOwotICBib29sZWFuIG1TaG91bGRSZWxlYXNlRWdsQ29udGV4dDsKLSAgdm9pZCBzdG9wRWdsQ29udGV4dExvY2tlZCgpOwotICBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2UgbUd2clN1cmZhY2VWaWV3V2Vha1JlZjsKLSAgYm9vbGVhbiBhY2Nlc3MkMTEwMihjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2clN1cmZhY2VWaWV3JEdMVGhyZWFkLCBib29sZWFuKTsKLSAgdm9pZCBzdXJmYWNlRGVzdHJveWVkKGphdmEubGFuZy5SdW5uYWJsZSk7Ci0gIGJvb2xlYW4gbUhhdmVFZ2xDb250ZXh0OwotICB2b2lkIHJlcXVlc3RFeGl0QW5kV2FpdCgpOwotICB2b2lkIHN1cmZhY2VDcmVhdGVkKCk7Ci0gICA8aW5pdD4oamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlKTsKLSAgbG9uZyBnZXRJZCgpOwotICBqYXZhLnV0aWwuQXJyYXlMaXN0IG1FdmVudFF1ZXVlOwotICBib29sZWFuIG1SZXF1ZXN0UGF1c2VkOwotICB2b2lkIHJlcXVlc3RSZW5kZXJBbmRXYWl0KCk7Ci0gIHZvaWQgcXVldWVFdmVudChqYXZhLmxhbmcuUnVubmFibGUpOwotICBib29sZWFuIG1FeGl0ZWQ7Ci0gIGJvb2xlYW4gbVdhbnRSZW5kZXJOb3RpZmljYXRpb247Ci0gIGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyU3VyZmFjZVZpZXckRWdsSGVscGVyIG1FZ2xIZWxwZXI7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJTdXJmYWNlVmlldyRHTFRocmVhZCRHTFRocmVhZE1hbmFnZXIgewotICB2b2lkIHJlbGVhc2VFZ2xDb250ZXh0TG9ja2VkKGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyU3VyZmFjZVZpZXckR0xUaHJlYWQpOwotICAgPGluaXQ+KGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyU3VyZmFjZVZpZXckMSk7Ci0gIHZvaWQgdGhyZWFkRXhpdGluZyhjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2clN1cmZhY2VWaWV3JEdMVGhyZWFkKTsKLSAgIDxpbml0PigpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyU3VyZmFjZVZpZXckR0xXcmFwcGVyIHsKLSAgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wgd3JhcChqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJTdXJmYWNlVmlldyRMb2dXcml0ZXIgewotICBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlciBtQnVpbGRlcjsKLSAgdm9pZCBmbHVzaEJ1aWxkZXIoKTsKLSAgIDxpbml0PigpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyU3VyZmFjZVZpZXckU2ltcGxlRUdMQ29uZmlnQ2hvb3NlciB7Ci0gICA8aW5pdD4oY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJTdXJmYWNlVmlldywgYm9vbGVhbik7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJVaUxheW91dCB7Ci0gIHZvaWQgc2V0U2V0dGluZ3NCdXR0b25MaXN0ZW5lcihqYXZhLmxhbmcuUnVubmFibGUpOwotICBjb20uZ29vZ2xlLnZyLnZyY29yZS5saWJyYXJ5LmFwaS5JR3ZyVWlMYXlvdXQgaW1wbDsKLSAgIDxpbml0Pihjb20uZ29vZ2xlLnZyLnZyY29yZS5saWJyYXJ5LmFwaS5JR3ZyVWlMYXlvdXQpOwotICB2b2lkIHNldENsb3NlQnV0dG9uTGlzdGVuZXIoamF2YS5sYW5nLlJ1bm5hYmxlKTsKLSAgdm9pZCBsYXVuY2hPckluc3RhbGxHdnJBcHAoYW5kcm9pZC5hcHAuQWN0aXZpdHkpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyVWlMYXlvdXRJbXBsIHsKLSAgYW5kcm9pZC5hbmltYXRpb24uT2JqZWN0QW5pbWF0b3IgdWlMYXllckRpbW1pbmdBbmltYXRpb247Ci0gIHZvaWQgY2FuY2VsRGltbWluZ1VpTGF5ZXIoKTsKLSAgdm9pZCBzZXREaW1tZWRVaVRvdWNoT3ZlcnJpZGUoKTsKLSAgdm9pZCBkZWxheURpbW1pbmdVaUxheWVyKGxvbmcpOwotICBhbmRyb2lkLnZpZXcuVmlld0dyb3VwIGdldFJvb3QoKTsKLSAgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4pOwotICAgPGluaXQ+KGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBqYXZhLmxhbmcuUnVubmFibGUsIGNvbS5nb29nbGUudnIubmRrLmJhc2UuRGF5ZHJlYW1VdGlsc1dyYXBwZXIpOwotICB2b2lkIGxhbWJkYSRzZXREaW1tZWRVaVRvdWNoT3ZlcnJpZGUkMCRHdnJVaUxheW91dEltcGwoKTsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJVaUxheW91dEltcGwkQ2xvc2VCdXR0b25MaXN0ZW5lcldyYXBwZXIgY2xvc2VCdXR0b25MaXN0ZW5lcjsKLSAgY29tLmdvb2dsZS52ci5jYXJkYm9hcmQuVWlMYXllciB1aUxheWVyOwotICBqYXZhLmxhbmcuUnVubmFibGUgYWNjZXNzJDAwMChhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5EYXlkcmVhbVV0aWxzV3JhcHBlcik7Ci0gIGphdmEubGFuZy5SdW5uYWJsZSBjcmVhdGVEZWZhdWx0Q2xvc2VCdXR0b25MaXN0ZW5lcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5EYXlkcmVhbVV0aWxzV3JhcHBlcik7Ci0gIHZvaWQgaW52b2tlQ2xvc2VCdXR0b25MaXN0ZW5lcigpOwotICB2b2lkIGJlZ2luRGltbWluZ1VpTGF5ZXIoKTsKLSAgdm9pZCBkZWxheURpbW1pbmdVaUxheWVyQWZ0ZXJWaXNpYmxlKCk7Ci0gIGJvb2xlYW4gZGF5ZHJlYW1Nb2RlRW5hYmxlZDsKLSAgdm9pZCBicmlkZ2UkbGFtYmRhJDAkR3ZyVWlMYXlvdXRJbXBsKCk7Ci0gIGphdmEubGFuZy5SdW5uYWJsZSBiZWdpbkRpbW1pbmdVaUxheWVyUnVubmFibGU7Ci0gIGphdmEubGFuZy5SdW5uYWJsZSBkZWxheURpbW1pbmdVaUxheWVyQWZ0ZXJWaXNpYmxlUnVubmFibGU7Ci0gIHZvaWQgc2V0RGF5ZHJlYW1Nb2RlRW5hYmxlZChib29sZWFuKTsKLSAgIDxpbml0PihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgamF2YS5sYW5nLlJ1bm5hYmxlKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2clVpTGF5b3V0SW1wbCQkTGFtYmRhJDAgewotICBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2clVpTGF5b3V0SW1wbCBhcmckMTsKLSAgIDxpbml0Pihjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2clVpTGF5b3V0SW1wbCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJVaUxheW91dEltcGwkJExhbWJkYSQxIHsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJVaUxheW91dEltcGwgYXJnJDE7Ci0gICA8aW5pdD4oY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJVaUxheW91dEltcGwpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyVWlMYXlvdXRJbXBsJCRMYW1iZGEkMiB7Ci0gICA8aW5pdD4oY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJVaUxheW91dEltcGwpOwotICBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2clVpTGF5b3V0SW1wbCBhcmckMTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2clVpTGF5b3V0SW1wbCQxIHsKLSAgYW5kcm9pZC5jb250ZW50LkludGVudCB2YWwkaG9tZUludGVudDsKLSAgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgdmFsJGNvbnRleHQ7Ci0gICA8aW5pdD4oYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGFuZHJvaWQuY29udGVudC5JbnRlbnQpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyVWlMYXlvdXRJbXBsJDIgewotICBhbmRyb2lkLmFwcC5BY3Rpdml0eSB2YWwkYWN0aXZpdHk7Ci0gIGFuZHJvaWQuY29udGVudC5JbnRlbnQgdmFsJGhvbWVJbnRlbnQ7Ci0gICA8aW5pdD4oYW5kcm9pZC5hcHAuQWN0aXZpdHksIGFuZHJvaWQuY29udGVudC5JbnRlbnQpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyVWlMYXlvdXRJbXBsJDMgewotICAgPGluaXQ+KGFuZHJvaWQuYXBwLkFjdGl2aXR5KTsKLSAgYW5kcm9pZC5hcHAuQWN0aXZpdHkgdmFsJGFjdGl2aXR5OwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyVWlMYXlvdXRJbXBsJENsb3NlQnV0dG9uTGlzdGVuZXJXcmFwcGVyIHsKLSAgdm9pZCBydW4oKTsKLSAgdm9pZCBzZXRDbGllbnRDbG9zZUJ1dHRvbkxpc3RlbmVyKGphdmEubGFuZy5SdW5uYWJsZSk7Ci0gIGphdmEubGFuZy5SdW5uYWJsZSBkZWZhdWx0Q2xvc2VCdXR0b25MaXN0ZW5lcjsKLSAgIDxpbml0PihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgamF2YS5sYW5nLlJ1bm5hYmxlLCBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkRheWRyZWFtVXRpbHNXcmFwcGVyKTsKLSAgYm9vbGVhbiBpbnZva2luZ0Nsb3NlQnV0dG9uOwotICBqYXZhLmxhbmcuUnVubmFibGUgYWN0aXZlQ2xvc2VCdXR0b25MaXN0ZW5lcjsKLSAgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgY29udGV4dDsKLSAgamF2YS5sYW5nLlJ1bm5hYmxlIHBhc3NpdmVDbG9zZUJ1dHRvbkxpc3RlbmVyOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuUHJvcGVydGllcyB7Ci0gICA8aW5pdD4obG9uZyk7Ci0gIGxvbmcgbmF0aXZlUHJvcGVydGllczsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLlNka0NvbmZpZ3VyYXRpb25SZWFkZXIgewotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRTZGtDb25maWd1cmF0aW9uUGFyYW1zIHNQYXJhbXM7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFNka0NvbmZpZ3VyYXRpb25QYXJhbXMgZ2V0UGFyYW1zKGFuZHJvaWQuY29udGVudC5Db250ZXh0KTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQkU2RrQ29uZmlndXJhdGlvblBhcmFtcyByZWFkUGFyYW1zRnJvbVByb3ZpZGVyKGNvbS5nb29nbGUudnIuY2FyZGJvYXJkLlZyUGFyYW1zUHJvdmlkZXIpOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRTZGtDb25maWd1cmF0aW9uUGFyYW1zIERFRkFVTFRfUEFSQU1TOwotICBjb20uZ29vZ2xlLmNvbW1vbi5sb2dnaW5nLm5hbm8uVnIkVlJFdmVudCRTZGtDb25maWd1cmF0aW9uUGFyYW1zIFJFUVVFU1RFRF9QQVJBTVM7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5TZGtEYXlkcmVhbVRvdWNoTGlzdGVuZXIgewotICAgPGluaXQ+KGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyTGF5b3V0SW1wbCk7Ci0gIGJvb2xlYW4gaXNEYXlkcmVhbUltYWdlQWxpZ25tZW50RW5hYmxlZDsKLSAgdm9pZCBzZXREZXZpY2VQYXJhbXMoY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5DYXJkYm9hcmREZXZpY2UkRGV2aWNlUGFyYW1zKTsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJBcGkgZ3ZyQXBpOwotICBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5WclBhcmFtc1Byb3ZpZGVyIHZyUGFyYW1zUHJvdmlkZXI7Ci0gIGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyTGF5b3V0SW1wbCBndnJMYXlvdXQ7Ci0gIHZvaWQgaW5pdFdpdGhEaXNwbGF5UGFyYW1zKGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljcywgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5EaXNwbGF5JERpc3BsYXlQYXJhbXMpOwotICB2b2lkIHNodXRkb3duKCk7Ci0gIHZvaWQgcmVmcmVzaFZpZXdlclByb2ZpbGUoKTsKLSAgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4pOwotICB2b2lkIGFjY2VzcyQzMDAoY29tLmdvb2dsZS52ci5uZGsuYmFzZS5TZGtEYXlkcmVhbVRvdWNoTGlzdGVuZXIsIGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljcywgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5EaXNwbGF5JERpc3BsYXlQYXJhbXMpOwotICBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5WclBhcmFtc1Byb3ZpZGVyIGFjY2VzcyQyMDAoY29tLmdvb2dsZS52ci5uZGsuYmFzZS5TZGtEYXlkcmVhbVRvdWNoTGlzdGVuZXIpOwotICBib29sZWFuIGhhbmRsZVRvdWNoKGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCwgZmxvYXQsIGZsb2F0KTsKLSAgdm9pZCBpbml0KGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljcywgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5EaXNwbGF5JERpc3BsYXlQYXJhbXMpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuU2RrRGF5ZHJlYW1Ub3VjaExpc3RlbmVyJEZpbmlzaEluaXRpbGl6YXRpb25UYXNrIHsKLSAgYW5kcm9pZC5vcy5Bc3luY1Rhc2sgZXhlY3V0ZShqYXZhLmxhbmcuT2JqZWN0W10pOwotICAgPGluaXQ+KGNvbS5nb29nbGUudnIubmRrLmJhc2UuU2RrRGF5ZHJlYW1Ub3VjaExpc3RlbmVyLCBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLlNka0RheWRyZWFtVG91Y2hMaXN0ZW5lciQxKTsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5EaXNwbGF5JERpc3BsYXlQYXJhbXMgZG9JbkJhY2tncm91bmQoamF2YS5sYW5nLlZvaWRbXSk7Ci0gICA8aW5pdD4oY29tLmdvb2dsZS52ci5uZGsuYmFzZS5TZGtEYXlkcmVhbVRvdWNoTGlzdGVuZXIpOwotICBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLlNka0RheWRyZWFtVG91Y2hMaXN0ZW5lciB0aGlzJDA7Ci0gIHZvaWQgb25Qcm9ncmVzc1VwZGF0ZShqYXZhLmxhbmcuVm9pZFtdKTsKLSAgYW5kcm9pZC52aWV3LkRpc3BsYXkgZGlzcGxheTsKLSAgdm9pZCBvblBvc3RFeGVjdXRlKGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uRGlzcGxheSREaXNwbGF5UGFyYW1zKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLlNka0RheWRyZWFtVG91Y2hMaXN0ZW5lciRSZWZyZXNoVmlld2VyUHJvZmlsZVRhc2sgewotICB2b2lkIG9uUHJvZ3Jlc3NVcGRhdGUoamF2YS5sYW5nLlZvaWRbXSk7Ci0gICA8aW5pdD4oY29tLmdvb2dsZS52ci5uZGsuYmFzZS5TZGtEYXlkcmVhbVRvdWNoTGlzdGVuZXIpOwotICB2b2lkIG9uUG9zdEV4ZWN1dGUoY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5DYXJkYm9hcmREZXZpY2UkRGV2aWNlUGFyYW1zKTsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5DYXJkYm9hcmREZXZpY2UkRGV2aWNlUGFyYW1zIGRvSW5CYWNrZ3JvdW5kKGphdmEubGFuZy5Wb2lkW10pOwotICBhbmRyb2lkLm9zLkFzeW5jVGFzayBleGVjdXRlKGphdmEubGFuZy5PYmplY3RbXSk7Ci0gIGNvbS5nb29nbGUudnIubmRrLmJhc2UuU2RrRGF5ZHJlYW1Ub3VjaExpc3RlbmVyIHRoaXMkMDsKLSAgIDxpbml0Pihjb20uZ29vZ2xlLnZyLm5kay5iYXNlLlNka0RheWRyZWFtVG91Y2hMaXN0ZW5lciwgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5TZGtEYXlkcmVhbVRvdWNoTGlzdGVuZXIkMSk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5Td2FwQ2hhaW4gewotICB2b2lkIHNodXRkb3duKCk7Ci0gICA8aW5pdD4obG9uZyk7Ci0gIGludCBjdXJyZW50RnJhbWU7Ci0gIGNvbS5nb29nbGUudnIubmRrLmJhc2UuRnJhbWVbXSBmcmFtZXM7Ci0gIGxvbmcgbmF0aXZlU3dhcENoYWluOwotICBqYXZhLmxhbmcuU3RyaW5nIFRBRzsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLlRocm90dGxpbmdNb25pdG9yIHsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUucGVyZm9ybWFuY2UuYXBpLklQZXJmb3JtYW5jZVNlcnZpY2UgcGVyZlNlcnZpY2U7Ci0gIGFuZHJvaWQub3MuSGFuZGxlciBtYWluSGFuZGxlcjsKLSAgamF2YS5sYW5nLk9iamVjdCBhY2Nlc3MkMDAwKGNvbS5nb29nbGUudnIubmRrLmJhc2UuVGhyb3R0bGluZ01vbml0b3IpOwotICBqYXZhLmxhbmcuT2JqZWN0IGxvY2s7Ci0gIGFuZHJvaWQuY29udGVudC5Db250ZXh0IGNvbnRleHQ7Ci0gIGludCBhZGRUcmlnZ2VySW50ZXJuYWwoYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUsIGludCwgZmxvYXQsIGNvbS5nb29nbGUudnIubmRrLmJhc2UuVGhyb3R0bGluZ01vbml0b3IkVGVtcGVyYXR1cmVUcmlnZ2VyLCBsb25nLCBhbmRyb2lkLm9zLkhhbmRsZXIpOwotICBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb24gY29ubmVjdGlvbjsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUucGVyZm9ybWFuY2UuYXBpLklQZXJmb3JtYW5jZVNlcnZpY2UgYWNjZXNzJDEwMihjb20uZ29vZ2xlLnZyLm5kay5iYXNlLlRocm90dGxpbmdNb25pdG9yLCBjb20uZ29vZ2xlLnZyLnZyY29yZS5wZXJmb3JtYW5jZS5hcGkuSVBlcmZvcm1hbmNlU2VydmljZSk7Ci0gIGphdmEudXRpbC5BcnJheUxpc3QgYWNjZXNzJDIwMChjb20uZ29vZ2xlLnZyLm5kay5iYXNlLlRocm90dGxpbmdNb25pdG9yKTsKLSAgamF2YS51dGlsLkFycmF5TGlzdCBzZXR1cENhbGxiYWNrczsKLSAgIDxpbml0PihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5UaHJvdHRsaW5nTW9uaXRvciQxIHsKLSAgIDxpbml0Pihjb20uZ29vZ2xlLnZyLm5kay5iYXNlLlRocm90dGxpbmdNb25pdG9yKTsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5UaHJvdHRsaW5nTW9uaXRvciB0aGlzJDA7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5UaHJvdHRsaW5nTW9uaXRvciQyIHsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5UaHJvdHRsaW5nTW9uaXRvciRTZXR1cENhbGxiYWNrIHZhbCRjYWxsYmFjazsKLSAgIDxpbml0Pihjb20uZ29vZ2xlLnZyLm5kay5iYXNlLlRocm90dGxpbmdNb25pdG9yLCBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLlRocm90dGxpbmdNb25pdG9yJFNldHVwQ2FsbGJhY2spOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuVGhyb3R0bGluZ01vbml0b3IkU2V0dXBDYWxsYmFjayB7Ci0gIHZvaWQgb25Jbml0aWFsaXplZCgpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuVGhyb3R0bGluZ01vbml0b3IkVGVtcGVyYXR1cmVUcmlnZ2VyIHsKLSAgdm9pZCBvblRlbXBlcmF0dXJlRXZlbnQoZmxvYXQsIGxvbmcpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuVGhyb3R0bGluZ01vbml0b3IkVGhyb3R0bGluZ1RyaWdnZXJDYWxsYmFjayB7Ci0gIGNvbS5nb29nbGUudnIubmRrLmJhc2UuVGhyb3R0bGluZ01vbml0b3IkVGVtcGVyYXR1cmVUcmlnZ2VyIHRyaWdnZXI7Ci0gIGNvbS5nb29nbGUudnIubmRrLmJhc2UuVGhyb3R0bGluZ01vbml0b3IkVGVtcGVyYXR1cmVUcmlnZ2VyIGFjY2VzcyQzMDAoY29tLmdvb2dsZS52ci5uZGsuYmFzZS5UaHJvdHRsaW5nTW9uaXRvciRUaHJvdHRsaW5nVHJpZ2dlckNhbGxiYWNrKTsKLSAgIDxpbml0Pihjb20uZ29vZ2xlLnZyLm5kay5iYXNlLlRocm90dGxpbmdNb25pdG9yJFRlbXBlcmF0dXJlVHJpZ2dlciwgYW5kcm9pZC5vcy5IYW5kbGVyKTsKLSAgYW5kcm9pZC5vcy5IYW5kbGVyIGhhbmRsZXI7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5UaHJvdHRsaW5nTW9uaXRvciRUaHJvdHRsaW5nVHJpZ2dlckNhbGxiYWNrJDEgewotICAgPGluaXQ+KGNvbS5nb29nbGUudnIubmRrLmJhc2UuVGhyb3R0bGluZ01vbml0b3IkVGhyb3R0bGluZ1RyaWdnZXJDYWxsYmFjaywgZmxvYXQsIGxvbmcpOwotICBmbG9hdCB2YWwkdGVtcGVyYXR1cmU7Ci0gIGxvbmcgdmFsJHRpbWVSZW1haW5pbmc7Ci0gIGNvbS5nb29nbGUudnIubmRrLmJhc2UuVGhyb3R0bGluZ01vbml0b3IkVGhyb3R0bGluZ1RyaWdnZXJDYWxsYmFjayB0aGlzJDA7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5UcmFjZUNvbXBhdCB7Ci0gIHZvaWQgZW5kU2VjdGlvbigpOwotICB2b2lkIGJlZ2luU2VjdGlvbihqYXZhLmxhbmcuU3RyaW5nKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLlVzZXJQcmVmcyB7Ci0gICA8aW5pdD4obG9uZyk7Ci0gIGxvbmcgbmF0aXZlVXNlclByZWZzOwotICBqYXZhLmxhbmcuU3RyaW5nIFRBRzsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLlZhbHVlIHsKLSAgdm9pZCBjbG9zZSgpOwotICBsb25nIG5hdGl2ZVZhbHVlOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuVmVyc2lvbiB7Ci0gICA8aW5pdD4oaW50LCBpbnQsIGludCk7Ci0gIGNvbS5nb29nbGUudnIubmRrLmJhc2UuVmVyc2lvbiBwYXJzZShqYXZhLmxhbmcuU3RyaW5nKTsKLSAgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpOwotICBpbnQgbWlub3JWZXJzaW9uOwotICBib29sZWFuIGlzQXRMZWFzdChjb20uZ29vZ2xlLnZyLm5kay5iYXNlLlZlcnNpb24pOwotICBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLlZlcnNpb24gQ1VSUkVOVDsKLSAgaW50IHBhdGNoVmVyc2lvbjsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5WZXJzaW9uIE1JTjsKLSAgaW50IG1ham9yVmVyc2lvbjsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLlZyQ29yZVNka0NsaWVudCB7Ci0gIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbW1vbi5hcGkuSURheWRyZWFtTWFuYWdlciBhY2Nlc3MkMjAwKGNvbS5nb29nbGUudnIubmRrLmJhc2UuVnJDb3JlU2RrQ2xpZW50KTsKLSAgYm9vbGVhbiBhY2Nlc3MkOTAwKGNvbS5nb29nbGUudnIubmRrLmJhc2UuVnJDb3JlU2RrQ2xpZW50KTsKLSAgdm9pZCBvblBhdXNlKCk7Ci0gIHZvaWQgaGFuZGxlTm9EYXlkcmVhbU1hbmFnZXIoKTsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUubG9nZ2luZy5hcGkuSVZyQ29yZUxvZ2dpbmdTZXJ2aWNlIGFjY2VzcyQxMTAyKGNvbS5nb29nbGUudnIubmRrLmJhc2UuVnJDb3JlU2RrQ2xpZW50LCBjb20uZ29vZ2xlLnZyLnZyY29yZS5sb2dnaW5nLmFwaS5JVnJDb3JlTG9nZ2luZ1NlcnZpY2UpOwotICB2b2lkIHJlc3VtZVRyYWNraW5nKGNvbS5nb29nbGUudnIubmRrLmJhc2UuR3ZyQXBpLCBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb21tb24uYXBpLkhlYWRUcmFja2luZ1N0YXRlKTsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUuY29tbW9uLmFwaS5JVnJDb3JlU2RrU2VydmljZSBhY2Nlc3MkMTAyKGNvbS5nb29nbGUudnIubmRrLmJhc2UuVnJDb3JlU2RrQ2xpZW50LCBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb21tb24uYXBpLklWckNvcmVTZGtTZXJ2aWNlKTsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5GYWRlT3ZlcmxheVZpZXcgZmFkZU92ZXJsYXlWaWV3OwotICBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBjb250ZXh0OwotICB2b2lkIHNldFJlZW50cnlJbnRlbnQoYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudCk7Ci0gIGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nIGhlbHBDZW50ZXJEaWFsb2c7Ci0gIHZvaWQgd2FybklmSW5jb21wYXRpYmxlQ2xpZW50KCk7Ci0gIHZvaWQgYWNjZXNzJDE0MDAoY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJBcGksIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbW1vbi5hcGkuSGVhZFRyYWNraW5nU3RhdGUpOwotICB2b2lkIGFjY2VzcyQwMDAoY29tLmdvb2dsZS52ci5uZGsuYmFzZS5WckNvcmVTZGtDbGllbnQpOwotICBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSBhY2Nlc3MkNDAwKGNvbS5nb29nbGUudnIubmRrLmJhc2UuVnJDb3JlU2RrQ2xpZW50KTsKLSAgdm9pZCBzZXRPbkRvbk5vdE5lZWRlZExpc3RlbmVyKGphdmEubGFuZy5SdW5uYWJsZSk7Ci0gIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbW1vbi5hcGkuSVZyQ29yZVNka1NlcnZpY2UgYWNjZXNzJDEwMChjb20uZ29vZ2xlLnZyLm5kay5iYXNlLlZyQ29yZVNka0NsaWVudCk7Ci0gIGludCBwcmVwYXJlVnIoY29tLmdvb2dsZS52ci52cmNvcmUuY29tbW9uLmFwaS5IZWFkVHJhY2tpbmdTdGF0ZSk7Ci0gIGphdmEubGFuZy5SdW5uYWJsZSBhY2Nlc3MkNzAwKGNvbS5nb29nbGUudnIubmRrLmJhc2UuVnJDb3JlU2RrQ2xpZW50KTsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5EYXlkcmVhbVV0aWxzV3JhcHBlciBkYXlkcmVhbVV0aWxzOwotICBpbnQgYWNjZXNzJDYwMChjb20uZ29vZ2xlLnZyLm5kay5iYXNlLlZyQ29yZVNka0NsaWVudCwgY29tLmdvb2dsZS52ci52cmNvcmUuY29tbW9uLmFwaS5IZWFkVHJhY2tpbmdTdGF0ZSk7Ci0gIHZvaWQgaGFuZGxlQmluZEZhaWxlZCgpOwotICBqYXZhLmxhbmcuUnVubmFibGUgb25Eb25Ob3ROZWVkZWRMaXN0ZW5lcjsKLSAgYm9vbGVhbiBpc0VuYWJsZWQ7Ci0gIGludCB2ckNvcmVDbGllbnRBcGlWZXJzaW9uOwotICB2b2lkIHJlc3VtZVRyYWNraW5nKGNvbS5nb29nbGUudnIudnJjb3JlLmNvbW1vbi5hcGkuSGVhZFRyYWNraW5nU3RhdGUpOwotICBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb24gc2VydmljZUNvbm5lY3Rpb247Ci0gIGNvbS5nb29nbGUudnIudnJjb3JlLmxvZ2dpbmcuYXBpLklWckNvcmVMb2dnaW5nU2VydmljZSBsb2dnaW5nU2VydmljZTsKLSAgIDxpbml0PihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJBcGksIGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lLCBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkRheWRyZWFtVXRpbHNXcmFwcGVyLCBqYXZhLmxhbmcuUnVubmFibGUsIGNvbS5nb29nbGUudnIubmRrLmJhc2UuRmFkZU92ZXJsYXlWaWV3KTsKLSAgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudCBvcHRpb25hbFJlZW50cnlJbnRlbnQ7Ci0gIGNvbS5nb29nbGUudnIubmRrLmJhc2UuVnJDb3JlU2RrQ2xpZW50JERheWRyZWFtTGlzdGVuZXJJbXBsIGRheWRyZWFtTGlzdGVuZXI7Ci0gIGJvb2xlYW4gb25SZXN1bWUoKTsKLSAgdm9pZCBoYW5kbGVQcmVwYXJlVnJGYWlsZWQoKTsKLSAgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUgY29tcG9uZW50TmFtZTsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUuY29tbW9uLmFwaS5JVnJDb3JlU2RrU2VydmljZSB2ckNvcmVTZGtTZXJ2aWNlOwotICBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLlZyQ29yZVNka0NsaWVudCREYXlkcmVhbUxpc3RlbmVySW1wbCBhY2Nlc3MkNTAwKGNvbS5nb29nbGUudnIubmRrLmJhc2UuVnJDb3JlU2RrQ2xpZW50KTsKLSAgYm9vbGVhbiBkb0JpbmQoKTsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUubG9nZ2luZy5hcGkuSVZyQ29yZUxvZ2dpbmdTZXJ2aWNlIGdldExvZ2dpbmdTZXJ2aWNlKCk7Ci0gIGJvb2xlYW4gaGFzQ29tcGF0aWJsZVNka1NlcnZpY2UoYW5kcm9pZC5jb250ZW50LkNvbnRleHQpOwotICBib29sZWFuIGlzUmVzdW1lZDsKLSAgYm9vbGVhbiBzaG91bGRCaW5kOwotICB2b2lkIGFjY2VzcyQ4MDAoY29tLmdvb2dsZS52ci5uZGsuYmFzZS5WckNvcmVTZGtDbGllbnQpOwotICBib29sZWFuIGlzQm91bmQ7Ci0gIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbW1vbi5hcGkuSGVhZFRyYWNraW5nU3RhdGUgZ2V0SGVhZFRyYWNraW5nU3RhdGUoKTsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJBcGkgZ3ZyQXBpOwotICBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb21tb24uYXBpLklEYXlkcmVhbU1hbmFnZXIgZGF5ZHJlYW1NYW5hZ2VyOwotICBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb21tb24uYXBpLklEYXlkcmVhbU1hbmFnZXIgYWNjZXNzJDIwMihjb20uZ29vZ2xlLnZyLm5kay5iYXNlLlZyQ29yZVNka0NsaWVudCwgY29tLmdvb2dsZS52ci52cmNvcmUuY29tbW9uLmFwaS5JRGF5ZHJlYW1NYW5hZ2VyKTsKLSAgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4pOwotICB2b2lkIG9uRXhpdGluZ0Zyb21WcigpOwotICBqYXZhLmxhbmcuUnVubmFibGUgY2xvc2VWclJ1bm5hYmxlOwotICB2b2lkIGFjY2VzcyQxMDAwKGNvbS5nb29nbGUudnIubmRrLmJhc2UuVnJDb3JlU2RrQ2xpZW50LCBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb21tb24uYXBpLkhlYWRUcmFja2luZ1N0YXRlKTsKLSAgdm9pZCBhY2Nlc3MkMzAwKGNvbS5nb29nbGUudnIubmRrLmJhc2UuVnJDb3JlU2RrQ2xpZW50KTsKLSAgdm9pZCBkb1VuYmluZCgpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuVnJDb3JlU2RrQ2xpZW50JDEgewotICAgPGluaXQ+KGNvbS5nb29nbGUudnIubmRrLmJhc2UuVnJDb3JlU2RrQ2xpZW50KTsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5WckNvcmVTZGtDbGllbnQgdGhpcyQwOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIubmRrLmJhc2UuVnJDb3JlU2RrQ2xpZW50JERheWRyZWFtTGlzdGVuZXJJbXBsIHsKLSAgdm9pZCBjYW5jZWxTYWZlZ3VhcmQoaW50KTsKLSAgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlIGNsb3NlVnJSdW5uYWJsZVdlYWs7Ci0gIHZvaWQgcmVzZXRTYWZlZ3VhcmRzKCk7Ci0gICA8aW5pdD4oY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJBcGksIGNvbS5nb29nbGUudnIubmRrLmJhc2UuRmFkZU92ZXJsYXlWaWV3LCBqYXZhLmxhbmcuUnVubmFibGUpOwotICB2b2lkIGFjY2VzcyQxMjAwKGNvbS5nb29nbGUudnIubmRrLmJhc2UuVnJDb3JlU2RrQ2xpZW50JERheWRyZWFtTGlzdGVuZXJJbXBsLCBpbnQsIGxvbmcsIGludCk7Ci0gIGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZSBmYWRlT3ZlcmxheVZpZXdXZWFrOwotICB2b2lkIHJlc2NoZWR1bGVTYWZlZ3VhcmQoaW50LCBsb25nKTsKLSAgdm9pZCBhcHBseUNvbG9yZnVsRmFkZUltcGwoaW50LCBsb25nLCBpbnQpOwotICBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2UgZ3ZyQXBpV2VhazsKLSAgdm9pZCBhY2Nlc3MkMTMwMChjb20uZ29vZ2xlLnZyLm5kay5iYXNlLlZyQ29yZVNka0NsaWVudCREYXlkcmVhbUxpc3RlbmVySW1wbCwgY29tLmdvb2dsZS52ci52cmNvcmUuY29tbW9uLmFwaS5IZWFkVHJhY2tpbmdTdGF0ZSk7Ci0gIGFuZHJvaWQub3MuSGFuZGxlciBzYWZlZ3VhcmRIYW5kbGVyOwotICB2b2lkIHJlc3VtZUhlYWRUcmFja2luZ0ltcGwoY29tLmdvb2dsZS52ci52cmNvcmUuY29tbW9uLmFwaS5IZWFkVHJhY2tpbmdTdGF0ZSk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5WckNvcmVTZGtDbGllbnQkRGF5ZHJlYW1MaXN0ZW5lckltcGwkMSB7Ci0gICA8aW5pdD4oY29tLmdvb2dsZS52ci5uZGsuYmFzZS5WckNvcmVTZGtDbGllbnQkRGF5ZHJlYW1MaXN0ZW5lckltcGwpOwotICBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLlZyQ29yZVNka0NsaWVudCREYXlkcmVhbUxpc3RlbmVySW1wbCB0aGlzJDA7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5WckNvcmVTZGtDbGllbnQkRGF5ZHJlYW1MaXN0ZW5lckltcGwkMiB7Ci0gIGludCB2YWwkY29sb3I7Ci0gIGxvbmcgdmFsJGR1cmF0aW9uTWlsbGlzOwotICAgPGluaXQ+KGNvbS5nb29nbGUudnIubmRrLmJhc2UuVnJDb3JlU2RrQ2xpZW50JERheWRyZWFtTGlzdGVuZXJJbXBsLCBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkZhZGVPdmVybGF5VmlldywgaW50LCBsb25nLCBpbnQpOwotICBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkZhZGVPdmVybGF5VmlldyB2YWwkZmFkZU92ZXJsYXlWaWV3OwotICBpbnQgdmFsJGZhZGVUeXBlOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIuc2RrLmNvbW1vbi5kZXBzLmEgewotICBqYXZhLmxhbmcuU3RyaW5nIG1EZXNjcmlwdG9yOwotICBhbmRyb2lkLm9zLklCaW5kZXIgbVJlbW90ZTsKLSAgIDxpbml0PihhbmRyb2lkLm9zLklCaW5kZXIsIGphdmEubGFuZy5TdHJpbmcpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIuc2RrLmNvbW1vbi5kZXBzLmIgewotICAgPGluaXQ+KCk7Ci0gIGphdmEubGFuZy5TdHJpbmcgZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIuc2RrLmNvbW1vbi5kZXBzLmMgewotICB2b2lkIGEoYW5kcm9pZC5vcy5QYXJjZWwsIGFuZHJvaWQub3MuUGFyY2VsYWJsZSk7Ci0gIGJvb2xlYW4gYShhbmRyb2lkLm9zLlBhcmNlbCk7Ci0gIGFuZHJvaWQub3MuUGFyY2VsYWJsZSBhKGFuZHJvaWQub3MuUGFyY2VsLCBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvcik7Ci0gIHZvaWQgYShhbmRyb2lkLm9zLlBhcmNlbCwgYW5kcm9pZC5vcy5JSW50ZXJmYWNlKTsKLSAgdm9pZCBiKGFuZHJvaWQub3MuUGFyY2VsLCBhbmRyb2lkLm9zLlBhcmNlbGFibGUpOwotICB2b2lkIGEoYW5kcm9pZC5vcy5QYXJjZWwsIGJvb2xlYW4pOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uQW5hbHl0aWNzJEFuYWx5dGljc1JlcXVlc3QgewotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLkFuYWx5dGljcyRBbmFseXRpY3NSZXF1ZXN0IGNsZWFyKCk7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGludCBjYWNoZWRTaXplOwotICAgPGluaXQ+KCk7Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uQW5hbHl0aWNzJEFuYWx5dGljc1JlcXVlc3RbXSBfZW1wdHlBcnJheTsKLSAgaW50IGJpdEZpZWxkMF87Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uQW5hbHl0aWNzJEFuYWx5dGljc1JlcXVlc3QgY2xvbmUoKTsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5BbmFseXRpY3MkQW5hbHl0aWNzUmVxdWVzdCBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGxvbmcgcHJldlNhbXBsZVRpbWVzdGFtcE5hbm9zZWNvbmRzXzsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLkFuYWx5dGljcyRBbmFseXRpY3NTYW1wbGUgewotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLkFuYWx5dGljcyRBbmFseXRpY3NTYW1wbGVbXSBfZW1wdHlBcnJheTsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5BbmFseXRpY3MkQW5hbHl0aWNzU2FtcGxlIGNsb25lKCk7Ci0gIGxvbmcgdGltZXN0YW1wTmFub3NlY29uZHNfOwotICBpbnQgY2FjaGVkU2l6ZTsKLSAgaW50IGJpdEZpZWxkMF87Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uQW5hbHl0aWNzJEFwcEFuYWx5dGljcyBhcHBBbmFseXRpY3M7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uQW5hbHl0aWNzJEFzeW5jUmVwcm9qZWN0aW9uQW5hbHl0aWNzIGFzeW5jUmVwcm9qZWN0aW9uQW5hbHl0aWNzOwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLkFuYWx5dGljcyRBbmFseXRpY3NTYW1wbGUgbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICAgPGluaXQ+KCk7Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uQW5hbHl0aWNzJEFuYWx5dGljc1NhbXBsZSBjbGVhcigpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uQW5hbHl0aWNzJEFwcEFuYWx5dGljcyB7Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uQW5hbHl0aWNzJEFwcEFuYWx5dGljcyBjbG9uZSgpOwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLkFuYWx5dGljcyRBcHBBbmFseXRpY3MkU3VibWl0U3RhdHVzW10gc3VibWl0U3RhdHVzOwotICBmbG9hdCBmcHNfOwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLkFuYWx5dGljcyRBcHBBbmFseXRpY3NbXSBfZW1wdHlBcnJheTsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgaW50IGNhY2hlZFNpemU7Ci0gICA8aW5pdD4oKTsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5BbmFseXRpY3MkQXBwQW5hbHl0aWNzIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgaW50IGJpdEZpZWxkMF87Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uQW5hbHl0aWNzJEFwcEFuYWx5dGljcyBjbGVhcigpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uQW5hbHl0aWNzJEFwcEFuYWx5dGljcyRTdWJtaXRTdGF0dXMgewotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLkFuYWx5dGljcyRBcHBBbmFseXRpY3MkU3VibWl0U3RhdHVzW10gX2VtcHR5QXJyYXk7Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uQW5hbHl0aWNzJEFwcEFuYWx5dGljcyRTdWJtaXRTdGF0dXMgY2xlYXIoKTsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5BbmFseXRpY3MkQXBwQW5hbHl0aWNzJFN1Ym1pdFN0YXR1cyBjbG9uZSgpOwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLkFuYWx5dGljcyRBcHBBbmFseXRpY3MkU3VibWl0U3RhdHVzW10gZW1wdHlBcnJheSgpOwotICBsb25nIHRpbWVzdGFtcE5hbm9zZWNvbmRzXzsKLSAgaW50IGJpdEZpZWxkMF87Ci0gIGJvb2xlYW4gd2FzQmxvY2tlZE9uR3B1XzsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgaW50IGNhY2hlZFNpemU7Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uQW5hbHl0aWNzJEFwcEFuYWx5dGljcyRTdWJtaXRTdGF0dXMgbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICAgPGluaXQ+KCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5BbmFseXRpY3MkQXN5bmNSZXByb2plY3Rpb25BbmFseXRpY3MgewotICBpbnQgYml0RmllbGQwXzsKLSAgIDxpbml0PigpOwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLkFuYWx5dGljcyRBc3luY1JlcHJvamVjdGlvbkFuYWx5dGljcyBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uQW5hbHl0aWNzJEFzeW5jUmVwcm9qZWN0aW9uQW5hbHl0aWNzJFZzeW5jU3RhdHVzW10gdnN5bmNTdGF0dXM7Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uQW5hbHl0aWNzJEFzeW5jUmVwcm9qZWN0aW9uQW5hbHl0aWNzW10gX2VtcHR5QXJyYXk7Ci0gIGZsb2F0IGZwc187Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uQW5hbHl0aWNzJEFzeW5jUmVwcm9qZWN0aW9uQW5hbHl0aWNzIGNsb25lKCk7Ci0gIGludCB0b3RhbE1pc3NlZFZzeW5jc187Ci0gIGludCBjYWNoZWRTaXplOwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLkFuYWx5dGljcyRBc3luY1JlcHJvamVjdGlvbkFuYWx5dGljcyBjbGVhcigpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uQW5hbHl0aWNzJEFzeW5jUmVwcm9qZWN0aW9uQW5hbHl0aWNzJFZzeW5jU3RhdHVzIHsKLSAgaW50IG9uZW9mX1N0YXR1c187Ci0gICA8aW5pdD4oKTsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5BbmFseXRpY3MkQXN5bmNSZXByb2plY3Rpb25BbmFseXRpY3MkVnN5bmNTdGF0dXMkTmV3QXBwRnJhbWUgbmV3QXBwRnJhbWU7Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uQW5hbHl0aWNzJEFzeW5jUmVwcm9qZWN0aW9uQW5hbHl0aWNzJFZzeW5jU3RhdHVzW10gX2VtcHR5QXJyYXk7Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uQW5hbHl0aWNzJEFzeW5jUmVwcm9qZWN0aW9uQW5hbHl0aWNzJFZzeW5jU3RhdHVzIGNsb25lKCk7Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uQW5hbHl0aWNzJEFzeW5jUmVwcm9qZWN0aW9uQW5hbHl0aWNzJFZzeW5jU3RhdHVzJE1pc3NlZFZzeW5jIG1pc3NlZFZzeW5jOwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLkFuYWx5dGljcyRBc3luY1JlcHJvamVjdGlvbkFuYWx5dGljcyRWc3luY1N0YXR1cyBjbGVhcigpOwotICBpbnQgYml0RmllbGQwXzsKLSAgbG9uZyB0aW1lc3RhbXBOYW5vc2Vjb25kc187Ci0gIGludCBjYWNoZWRTaXplOwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLkFuYWx5dGljcyRBc3luY1JlcHJvamVjdGlvbkFuYWx5dGljcyRWc3luY1N0YXR1cyBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uQW5hbHl0aWNzJEFzeW5jUmVwcm9qZWN0aW9uQW5hbHl0aWNzJFZzeW5jU3RhdHVzJFJldXNlZEFwcEZyYW1lIHJldXNlZEFwcEZyYW1lOwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLkFuYWx5dGljcyRBc3luY1JlcHJvamVjdGlvbkFuYWx5dGljcyRWc3luY1N0YXR1c1tdIGVtcHR5QXJyYXkoKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLkFuYWx5dGljcyRBc3luY1JlcHJvamVjdGlvbkFuYWx5dGljcyRWc3luY1N0YXR1cyRNaXNzZWRWc3luYyB7Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uQW5hbHl0aWNzJEFzeW5jUmVwcm9qZWN0aW9uQW5hbHl0aWNzJFZzeW5jU3RhdHVzJE1pc3NlZFZzeW5jIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5BbmFseXRpY3MkQXN5bmNSZXByb2plY3Rpb25BbmFseXRpY3MkVnN5bmNTdGF0dXMkTWlzc2VkVnN5bmMgY2xvbmUoKTsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5BbmFseXRpY3MkQXN5bmNSZXByb2plY3Rpb25BbmFseXRpY3MkVnN5bmNTdGF0dXMkTWlzc2VkVnN5bmNbXSBfZW1wdHlBcnJheTsKLSAgIDxpbml0PigpOwotICBpbnQgY2FjaGVkU2l6ZTsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5BbmFseXRpY3MkQXN5bmNSZXByb2plY3Rpb25BbmFseXRpY3MkVnN5bmNTdGF0dXMkTWlzc2VkVnN5bmMgY2xlYXIoKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLkFuYWx5dGljcyRBc3luY1JlcHJvamVjdGlvbkFuYWx5dGljcyRWc3luY1N0YXR1cyROZXdBcHBGcmFtZSB7Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uQW5hbHl0aWNzJEFzeW5jUmVwcm9qZWN0aW9uQW5hbHl0aWNzJFZzeW5jU3RhdHVzJE5ld0FwcEZyYW1lIGNsZWFyKCk7Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uQW5hbHl0aWNzJEFzeW5jUmVwcm9qZWN0aW9uQW5hbHl0aWNzJFZzeW5jU3RhdHVzJE5ld0FwcEZyYW1lIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgbG9uZyBzaW5jZVN1Ym1pdE5hbm9zZWNvbmRzXzsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5BbmFseXRpY3MkQXN5bmNSZXByb2plY3Rpb25BbmFseXRpY3MkVnN5bmNTdGF0dXMkTmV3QXBwRnJhbWVbXSBfZW1wdHlBcnJheTsKLSAgaW50IG51bVNraXBwZWRBcHBGcmFtZXNfOwotICBpbnQgYml0RmllbGQwXzsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5BbmFseXRpY3MkQXN5bmNSZXByb2plY3Rpb25BbmFseXRpY3MkVnN5bmNTdGF0dXMkTmV3QXBwRnJhbWUgY2xvbmUoKTsKLSAgaW50IGNhY2hlZFNpemU7Ci0gICA8aW5pdD4oKTsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLkFuYWx5dGljcyRBc3luY1JlcHJvamVjdGlvbkFuYWx5dGljcyRWc3luY1N0YXR1cyRSZXVzZWRBcHBGcmFtZSB7Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uQW5hbHl0aWNzJEFzeW5jUmVwcm9qZWN0aW9uQW5hbHl0aWNzJFZzeW5jU3RhdHVzJFJldXNlZEFwcEZyYW1lIGNsb25lKCk7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uQW5hbHl0aWNzJEFzeW5jUmVwcm9qZWN0aW9uQW5hbHl0aWNzJFZzeW5jU3RhdHVzJFJldXNlZEFwcEZyYW1lIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgIDxpbml0PigpOwotICBsb25nIHNpbmNlU3VibWl0TmFub3NlY29uZHNfOwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLkFuYWx5dGljcyRBc3luY1JlcHJvamVjdGlvbkFuYWx5dGljcyRWc3luY1N0YXR1cyRSZXVzZWRBcHBGcmFtZVtdIF9lbXB0eUFycmF5OwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLkFuYWx5dGljcyRBc3luY1JlcHJvamVjdGlvbkFuYWx5dGljcyRWc3luY1N0YXR1cyRSZXVzZWRBcHBGcmFtZSBjbGVhcigpOwotICBpbnQgYml0RmllbGQwXzsKLSAgaW50IGNhY2hlZFNpemU7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5DYXJkYm9hcmREZXZpY2UkQ2FyZGJvYXJkSW50ZXJuYWxQYXJhbXMgewotICBpbnQgY2hlY2tPcmllbnRhdGlvblR5cGVPclRocm93KGludCk7Ci0gIGJvb2xlYW4gc3RvcmVVbmtub3duRmllbGQoY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubywgaW50KTsKLSAgamF2YS5sYW5nLlN0cmluZyBneXJvc2NvcGVfOwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLkNhcmRib2FyZERldmljZSRDYXJkYm9hcmRJbnRlcm5hbFBhcmFtcyBjbG9uZSgpOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGRBcnJheSB1bmtub3duRmllbGREYXRhOwotICBqYXZhLmxhbmcuU3RyaW5nIGFjY2VsZXJvbWV0ZXJfOwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLkNhcmRib2FyZERldmljZSRDYXJkYm9hcmRJbnRlcm5hbFBhcmFtcyBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gICA8aW5pdD4oKTsKLSAgZmxvYXQgeVBwaU92ZXJyaWRlXzsKLSAgaW50W10gZXllT3JpZW50YXRpb25zOwotICBmbG9hdCBzY3JlZW5DZW50ZXJUb0xlbnNEaXN0YW5jZV87Ci0gIGludCBiaXRGaWVsZDBfOwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLkNhcmRib2FyZERldmljZSRDYXJkYm9hcmRJbnRlcm5hbFBhcmFtc1tdIF9lbXB0eUFycmF5OwotICBmbG9hdCB4UHBpT3ZlcnJpZGVfOwotICBpbnQgY2FjaGVkU2l6ZTsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5DYXJkYm9hcmREZXZpY2UkQ2FyZGJvYXJkSW50ZXJuYWxQYXJhbXMgY2xlYXIoKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLkNhcmRib2FyZERldmljZSREYXlkcmVhbUludGVybmFsUGFyYW1zIHsKLSAgaW50IGRpc3RvcnRpb25NZXNoUmVzb2x1dGlvbl87Ci0gIGJvb2xlYW4gc2Vuc29yT3JpZW50YXRpb25JbmRlcGVuZGVudE9mRGlzcGxheV87Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uQ2FyZGJvYXJkRGV2aWNlJERheWRyZWFtSW50ZXJuYWxQYXJhbXMgY2xvbmUoKTsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5DYXJkYm9hcmREZXZpY2UkRGF5ZHJlYW1JbnRlcm5hbFBhcmFtcyBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGludCB2ZXJzaW9uXzsKLSAgIDxpbml0PigpOwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLkNhcmRib2FyZERldmljZSREYXlkcmVhbUludGVybmFsUGFyYW1zW10gX2VtcHR5QXJyYXk7Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uQ2FyZGJvYXJkRGV2aWNlJFZpZ25ldHRlUGFyYW1zIHZpZ25ldHRlUGFyYW1zOwotICBpbnQgY2FjaGVkU2l6ZTsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5DYXJkYm9hcmREZXZpY2UkU2NyZWVuQWxpZ25tZW50TWFya2VyW10gYWxpZ25tZW50TWFya2VyczsKLSAgaW50IGJpdEZpZWxkMF87Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uQ2FyZGJvYXJkRGV2aWNlJERheWRyZWFtSW50ZXJuYWxQYXJhbXMgY2xlYXIoKTsKLSAgYm9vbGVhbiBjbGlwRmllbGRPZlZpZXdUb0Rpc3BsYXlfOwotICBib29sZWFuIGdldFVzZVJvdGF0aW9uYWxBbGlnbm1lbnRDb3JyZWN0aW9uKCk7Ci0gIGJvb2xlYW4gdXNlUm90YXRpb25hbEFsaWdubWVudENvcnJlY3Rpb25fOwotICBib29sZWFuIGNsYW1wRGlzdG9ydGlvblRvTWF4aW11bUZpZWxkT2ZWaWV3XzsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLkNhcmRib2FyZERldmljZSREZXZpY2VQYXJhbXMgewotICAgPGluaXQ+KCk7Ci0gIGludCBwcmltYXJ5QnV0dG9uXzsKLSAgYm9vbGVhbiBoYXNNYWduZXRfOwotICBqYXZhLmxhbmcuU3RyaW5nIGdldFZlbmRvcigpOwotICBpbnQgY2FjaGVkU2l6ZTsKLSAgZmxvYXQgdHJheVRvTGVuc0Rpc3RhbmNlXzsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5DYXJkYm9hcmREZXZpY2UkRGF5ZHJlYW1JbnRlcm5hbFBhcmFtcyBkYXlkcmVhbUludGVybmFsOwotICBmbG9hdFtdIGRpc3RvcnRpb25Db2VmZmljaWVudHM7Ci0gIGphdmEubGFuZy5TdHJpbmcgdmVuZG9yXzsKLSAgamF2YS5sYW5nLlN0cmluZyBtb2RlbF87Ci0gIGZsb2F0W10gZ3JlZW5EaXN0b3J0aW9uQ29lZmZpY2llbnRzOwotICBpbnQgYml0RmllbGQwXzsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5DYXJkYm9hcmREZXZpY2UkRGV2aWNlUGFyYW1zIGNsZWFyKCk7Ci0gIGludCB2ZXJ0aWNhbEFsaWdubWVudF87Ci0gIGZsb2F0IGdldFRyYXlUb0xlbnNEaXN0YW5jZSgpOwotICBmbG9hdFtdIGxlZnRFeWVGaWVsZE9mVmlld0FuZ2xlczsKLSAgYm9vbGVhbiBzdG9yZVVua25vd25GaWVsZChjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vLCBpbnQpOwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLkNhcmRib2FyZERldmljZSREZXZpY2VQYXJhbXNbXSBfZW1wdHlBcnJheTsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5DYXJkYm9hcmREZXZpY2UkRGV2aWNlUGFyYW1zIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgaW50IGNoZWNrVmVydGljYWxBbGlnbm1lbnRUeXBlT3JUaHJvdyhpbnQpOwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLkNhcmRib2FyZERldmljZSREZXZpY2VQYXJhbXMgY2xvbmUoKTsKLSAgZmxvYXRbXSBibHVlRGlzdG9ydGlvbkNvZWZmaWNpZW50czsKLSAgZmxvYXQgc2NyZWVuVG9MZW5zRGlzdGFuY2VfOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGRBcnJheSB1bmtub3duRmllbGREYXRhOwotICBmbG9hdCBpbnRlckxlbnNEaXN0YW5jZV87Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uQ2FyZGJvYXJkRGV2aWNlJENhcmRib2FyZEludGVybmFsUGFyYW1zIGludGVybmFsOwotICBqYXZhLmxhbmcuU3RyaW5nIGdldE1vZGVsKCk7Ci0gIGludCBjaGVja0J1dHRvblR5cGVPclRocm93KGludCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5DYXJkYm9hcmREZXZpY2UkU2NyZWVuQWxpZ25tZW50TWFya2VyIHsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5DYXJkYm9hcmREZXZpY2UkU2NyZWVuQWxpZ25tZW50TWFya2VyIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgZmxvYXQgZ2V0VmVydGljYWwoKTsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5DYXJkYm9hcmREZXZpY2UkU2NyZWVuQWxpZ25tZW50TWFya2VyIGNsb25lKCk7Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uQ2FyZGJvYXJkRGV2aWNlJFNjcmVlbkFsaWdubWVudE1hcmtlciBjbGVhcigpOwotICAgPGluaXQ+KCk7Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uQ2FyZGJvYXJkRGV2aWNlJFNjcmVlbkFsaWdubWVudE1hcmtlcltdIGVtcHR5QXJyYXkoKTsKLSAgZmxvYXQgdmVydGljYWxfOwotICBmbG9hdCBnZXRIb3Jpem9udGFsKCk7Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uQ2FyZGJvYXJkRGV2aWNlJFNjcmVlbkFsaWdubWVudE1hcmtlcltdIF9lbXB0eUFycmF5OwotICBpbnQgY2FjaGVkU2l6ZTsKLSAgZmxvYXQgaG9yaXpvbnRhbF87Ci0gIGludCBiaXRGaWVsZDBfOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uQ2FyZGJvYXJkRGV2aWNlJFZpZ25ldHRlUGFyYW1zIHsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5DYXJkYm9hcmREZXZpY2UkVmlnbmV0dGVQYXJhbXMgY2xlYXIoKTsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5DYXJkYm9hcmREZXZpY2UkVmlnbmV0dGVQYXJhbXMgbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICAgPGluaXQ+KCk7Ci0gIGludCBjb25kaXRpb25fOwotICBmbG9hdCB2YWx1ZV87Ci0gIGJvb2xlYW4gc3RvcmVVbmtub3duRmllbGQoY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubywgaW50KTsKLSAgaW50IGNoZWNrVmlnbmV0dGVQYXJhbXNDb25kaXRpb25PclRocm93KGludCk7Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uQ2FyZGJvYXJkRGV2aWNlJFZpZ25ldHRlUGFyYW1zIGNsb25lKCk7Ci0gIGludCBjYWNoZWRTaXplOwotICBpbnQgYml0RmllbGQwXzsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5DYXJkYm9hcmREZXZpY2UkVmlnbmV0dGVQYXJhbXNbXSBfZW1wdHlBcnJheTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLkRpc3BsYXkkRGlzcGxheVBhcmFtcyB7Ci0gIGZsb2F0IGJvdHRvbUJlemVsSGVpZ2h0XzsKLSAgZmxvYXQgeFBwaV87Ci0gIGZsb2F0IHlQcGlfOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGRBcnJheSB1bmtub3duRmllbGREYXRhOwotICBpbnQgYml0RmllbGQwXzsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5EaXNwbGF5JERpc3BsYXlQYXJhbXNbXSBfZW1wdHlBcnJheTsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5EaXNwbGF5JERpc3BsYXlQYXJhbXMgY2xvbmUoKTsKLSAgIDxpbml0PigpOwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLkRpc3BsYXkkRGlzcGxheVBhcmFtcyBjbGVhcigpOwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLkRpc3BsYXkkRGlzcGxheVBhcmFtcyBzZXRYUHBpKGZsb2F0KTsKLSAgYm9vbGVhbiBoYXNYUHBpKCk7Ci0gIGZsb2F0W10gZEVQUkVDQVRFREd5cm9CaWFzOwotICBmbG9hdCBnZXRZUHBpKCk7Ci0gIGludCBjYWNoZWRTaXplOwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLkRpc3BsYXkkRGlzcGxheVBhcmFtcyBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGZsb2F0IGdldFhQcGkoKTsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5EaXNwbGF5JERpc3BsYXlQYXJhbXMgc2V0WVBwaShmbG9hdCk7Ci0gIGJvb2xlYW4gaGFzQm90dG9tQmV6ZWxIZWlnaHQoKTsKLSAgZmxvYXQgZ2V0Qm90dG9tQmV6ZWxIZWlnaHQoKTsKLSAgYm9vbGVhbiBoYXNZUHBpKCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5QcmVmZXJlbmNlcyREZXZlbG9wZXJQcmVmcyB7Ci0gIGJvb2xlYW4gc3RvcmVVbmtub3duRmllbGQoY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubywgaW50KTsKLSAgYm9vbGVhbiBnZXRPcGVuZ2xLaHJEZWJ1Z0VuYWJsZWQoKTsKLSAgaW50IGNoZWNrTW90b3Bob1BhdGNoTW9kZU9yVGhyb3coaW50KTsKLSAgYm9vbGVhbiBkZXZlbG9wZXJMb2dnaW5nRW5hYmxlZF87Ci0gIGJvb2xlYW4gZEVQUkVDQVRFREhlYWRUcmFja2luZ1NlcnZpY2VFbmFibGVkXzsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5QcmVmZXJlbmNlcyREZXZlbG9wZXJQcmVmc1tdIF9lbXB0eUFycmF5OwotICBpbnQgbW90b3Bob1BhdGNoTW9kZV87Ci0gIGJvb2xlYW4gY2FwdHVyZUVuYWJsZWRfOwotICBib29sZWFuIGRFUFJFQ0FURURHdnJQbGF0Zm9ybUxpYnJhcnlFbmFibGVkXzsKLSAgYm9vbGVhbiBzZW5zb3JMb2dnaW5nRW5hYmxlZF87Ci0gIGludCBjYWNoZWRTaXplOwotICBib29sZWFuIHBlcmZvcm1hbmNlTW9uaXRvcmluZ0VuYWJsZWRfOwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLlByZWZlcmVuY2VzJERldmVsb3BlclByZWZzIGNsZWFyKCk7Ci0gICA8aW5pdD4oKTsKLSAgYm9vbGVhbiBvcGVuZ2xLaHJEZWJ1Z0VuYWJsZWRfOwotICBib29sZWFuIGZvcmNlVW5kaXN0b3J0ZWRSZW5kZXJpbmdfOwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLlByZWZlcmVuY2VzJERldmVsb3BlclByZWZzIGNsb25lKCk7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGludCBiaXRGaWVsZDBfOwotICBib29sZWFuIGRFUFJFQ0FURURNb3RvcGhvUGF0Y2hFbmFibGVkXzsKLSAgYm9vbGVhbiBwZXJmb3JtYW5jZUxvZ2dpbmdBY3RpdmF0ZWRfOwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLlByZWZlcmVuY2VzJERldmVsb3BlclByZWZzIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgYm9vbGVhbiBwZXJmb3JtYW5jZUh1ZEVuYWJsZWRfOwotICBib29sZWFuIGZyYW1lVHJhY2tlckVuYWJsZWRfOwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLlByZWZlcmVuY2VzJFNhZmV0eUN5bGluZGVyUGFyYW1zIHNhZmV0eUN5bGluZGVyUGFyYW1zOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uUHJlZmVyZW5jZXMkRnJhbWVSZXVzZU1vbml0b3JpbmdQYXJhbXMgewotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLlByZWZlcmVuY2VzJEZyYW1lUmV1c2VNb25pdG9yaW5nUGFyYW1zIGNsZWFyKCk7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGxvbmcgZnJhbWVXaW5kb3dNc187Ci0gIGZsb2F0IGZhaWx1cmVQcm9wb3J0aW9uXzsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5QcmVmZXJlbmNlcyRGcmFtZVJldXNlTW9uaXRvcmluZ1BhcmFtc1tdIF9lbXB0eUFycmF5OwotICBpbnQgYml0RmllbGQwXzsKLSAgaW50IGNhY2hlZFNpemU7Ci0gIGZsb2F0IHJlY292ZXJ5UHJvcG9ydGlvbl87Ci0gIGxvbmcgZmFkZUluRHVyYXRpb25Nc187Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uUHJlZmVyZW5jZXMkRnJhbWVSZXVzZU1vbml0b3JpbmdQYXJhbXMgY2xvbmUoKTsKLSAgIDxpbml0PigpOwotICBsb25nIHByb21wdFVzZXJUb0tpbGxEZWxheU1zXzsKLSAgbG9uZyBmYWRlT3V0RHVyYXRpb25Nc187Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uUHJlZmVyZW5jZXMkRnJhbWVSZXVzZU1vbml0b3JpbmdQYXJhbXMgbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uUHJlZmVyZW5jZXMkU2FmZXR5Q3lsaW5kZXJQYXJhbXMgewotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLlByZWZlcmVuY2VzJFNhZmV0eUN5bGluZGVyUGFyYW1zIGNsb25lKCk7Ci0gIGZsb2F0IGFuY2hvcldhcm5pbmdEaXN0YW5jZV87Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uUHJlZmVyZW5jZXMkU2FmZXR5Q3lsaW5kZXJQYXJhbXMgbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICBib29sZWFuIGdyYXBoaWNzRW5hYmxlZF87Ci0gIGZsb2F0W10gb3V0ZXJGb2dDb2xvcjsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgZmxvYXQgY29sbGlzaW9uU3BoZXJlUmFkaXVzXzsKLSAgaW50IGJpdEZpZWxkMF87Ci0gIGZsb2F0IGlubmVyUmFkaXVzXzsKLSAgZmxvYXQgb3V0ZXJSYWRpdXNfOwotICBpbnQgY2FjaGVkU2l6ZTsKLSAgZmxvYXQgZW50ZXJFdmVudFJhZGl1c187Ci0gICA8aW5pdD4oKTsKLSAgZmxvYXRbXSBpbm5lckZvZ0NvbG9yOwotICBmbG9hdCBleGl0RXZlbnRSYWRpdXNfOwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLlByZWZlcmVuY2VzJFNhZmV0eUN5bGluZGVyUGFyYW1zW10gX2VtcHR5QXJyYXk7Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uUHJlZmVyZW5jZXMkU2FmZXR5Q3lsaW5kZXJQYXJhbXMgY2xlYXIoKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLlByZWZlcmVuY2VzJFVzZXJQcmVmcyB7Ci0gIGludCBjb250cm9sbGVySGFuZGVkbmVzc187Ci0gIGludCBiaXRGaWVsZDBfOwotICBib29sZWFuIHN0b3JlVW5rbm93bkZpZWxkKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8sIGludCk7Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uUHJlZmVyZW5jZXMkVXNlclByZWZzIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5QcmVmZXJlbmNlcyRVc2VyUHJlZnNbXSBfZW1wdHlBcnJheTsKLSAgIDxpbml0PigpOwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLlByZWZlcmVuY2VzJFVzZXJQcmVmcyBjbG9uZSgpOwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLlByZWZlcmVuY2VzJFVzZXJQcmVmcyBjbGVhcigpOwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLlByZWZlcmVuY2VzJERldmVsb3BlclByZWZzIGRldmVsb3BlclByZWZzOwotICBpbnQgY2FjaGVkU2l6ZTsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgaW50IGNoZWNrSGFuZGVkbmVzc09yVGhyb3coaW50KTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLlNka0NvbmZpZ3VyYXRpb24kU2RrQ29uZmlndXJhdGlvblJlcXVlc3QgewotICAgPGluaXQ+KCk7Ci0gIGludCBjYWNoZWRTaXplOwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLlNka0NvbmZpZ3VyYXRpb24kU2RrQ29uZmlndXJhdGlvblJlcXVlc3QgY2xlYXIoKTsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5TZGtDb25maWd1cmF0aW9uJFNka0NvbmZpZ3VyYXRpb25SZXF1ZXN0W10gX2VtcHR5QXJyYXk7Ci0gIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50JFNka0NvbmZpZ3VyYXRpb25QYXJhbXMgcmVxdWVzdGVkUGFyYW1zOwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLlNka0NvbmZpZ3VyYXRpb24kU2RrQ29uZmlndXJhdGlvblJlcXVlc3QgbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICBqYXZhLmxhbmcuU3RyaW5nIHNka1ZlcnNpb247Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uU2RrQ29uZmlndXJhdGlvbiRTZGtDb25maWd1cmF0aW9uUmVxdWVzdCBjbG9uZSgpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uU2Vzc2lvbiRIZWFkVHJhY2tpbmdTZXJ2aWNlU3RhdGUgewotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLlNlc3Npb24kSGVhZFRyYWNraW5nU2VydmljZVN0YXRlIGNsb25lKCk7Ci0gIGludCBiaXRGaWVsZDBfOwotICBpbnQgY2FjaGVkU2l6ZTsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5TZXNzaW9uJEhlYWRUcmFja2luZ1NlcnZpY2VTdGF0ZSBjbGVhcigpOwotICAgPGluaXQ+KCk7Ci0gIGJvb2xlYW4gYXBwbHlEaXNwbGF5RnJvbVNlbnNvclJvdGF0aW9uXzsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5TZXNzaW9uJFJlY2VudGVyZWRTdGF0ZSByZWNlbnRlcmVkU3RhdGU7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uU2Vzc2lvbiRIZWFkVHJhY2tpbmdTZXJ2aWNlU3RhdGUgbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLlNlc3Npb24kU2FmZVJlZ2lvblN0YXRlIHNhZmVSZWdpb25TdGF0ZTsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5TZXNzaW9uJEhlYWRUcmFja2luZ1NlcnZpY2VTdGF0ZVtdIF9lbXB0eUFycmF5OwotICBmbG9hdCBkZWZhdWx0Rmxvb3JIZWlnaHRfOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uU2Vzc2lvbiRQb3NlIHsKLSAgZmxvYXRbXSBwOwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLlNlc3Npb24kUG9zZSBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gICA8aW5pdD4oKTsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5TZXNzaW9uJFBvc2UgY2xvbmUoKTsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5TZXNzaW9uJFBvc2UgY2xlYXIoKTsKLSAgZmxvYXRbXSBxOwotICBpbnQgY2FjaGVkU2l6ZTsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5TZXNzaW9uJFBvc2VbXSBfZW1wdHlBcnJheTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLlNlc3Npb24kUmVjZW50ZXJlZFN0YXRlIHsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5TZXNzaW9uJFJlY2VudGVyZWRTdGF0ZVtdIF9lbXB0eUFycmF5OwotICBib29sZWFuIHN0b3JlVW5rbm93bkZpZWxkKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8sIGludCk7Ci0gICA8aW5pdD4oKTsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5TZXNzaW9uJFBvc2UgaGVhZFJlY2VudGVyUG9zZUluVHJhY2tpbmdTcGFjZTsKLSAgaW50IGNhY2hlZFNpemU7Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uU2Vzc2lvbiRSZWNlbnRlcmVkU3RhdGUgY2xlYXIoKTsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgYm9vbGVhbiBhcHBseURpc3BsYXlGcm9tU2Vuc29yUm90YXRpb25fOwotICBpbnQgYml0RmllbGQwXzsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5TZXNzaW9uJFJlY2VudGVyZWRTdGF0ZSBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uU2Vzc2lvbiRSZWNlbnRlcmVkU3RhdGUgY2xvbmUoKTsKLSAgaW50IGNoZWNrVHlwZU9yVGhyb3coaW50KTsKLSAgbG9uZyB0aW1lc3RhbXBOc187Ci0gIGludCB0eXBlXzsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLlNlc3Npb24kU2FmZVJlZ2lvblN0YXRlIHsKLSAgYm9vbGVhbiBpbnNpZGVfOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGRBcnJheSB1bmtub3duRmllbGREYXRhOwotICBpbnQgY2FjaGVkU2l6ZTsKLSAgbG9uZyBjb3VudGVyXzsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5TZXNzaW9uJFNhZmVSZWdpb25TdGF0ZSBjbG9uZSgpOwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLlNlc3Npb24kU2FmZVJlZ2lvblN0YXRlIGNsZWFyKCk7Ci0gIGludCBiaXRGaWVsZDBfOwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLlNlc3Npb24kU2FmZVJlZ2lvblN0YXRlW10gX2VtcHR5QXJyYXk7Ci0gICA8aW5pdD4oKTsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5TZXNzaW9uJFNhZmVSZWdpb25TdGF0ZSBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkNvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5TZXNzaW9uJFRyYWNrZXJTdGF0ZSB7Ci0gIGRvdWJsZVtdIG1hZ25ldG9tZXRlckJpYXM7Ci0gIGNvbS5nb29nbGUudnIuc2RrLnByb3RvLm5hbm8uU2Vzc2lvbiRUcmFja2VyU3RhdGVbXSBfZW1wdHlBcnJheTsKLSAgbG9uZyB0aW1lU2luY2VFcG9jaFNlY29uZHNfOwotICBsb25nIG1hZ0NhbGlicmF0aW9uVGltZVNpbmNlRXBvY2hTZWNvbmRzXzsKLSAgIDxpbml0PigpOwotICBib29sZWFuIHRyYWNraW5nSW5WcmNvcmVfOwotICBkb3VibGVbXSBneXJvc2NvcGVCaWFzOwotICBmbG9hdFtdIGxlbnNPZmZzZXQ7Ci0gIGZsb2F0W10gcmlnaHRMZW5zT2Zmc2V0OwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLlNlc3Npb24kVHJhY2tlclN0YXRlIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgY29tLmdvb2dsZS52ci5zZGsucHJvdG8ubmFuby5TZXNzaW9uJFRyYWNrZXJTdGF0ZSBjbG9uZSgpOwotICBkb3VibGVbXSBsYXN0R3lyb3Njb3BlU2FtcGxlOwotICBjb20uZ29vZ2xlLnZyLnNkay5wcm90by5uYW5vLlNlc3Npb24kVHJhY2tlclN0YXRlIGNsZWFyKCk7Ci0gIGRvdWJsZVtdIHE7Ci0gIGRvdWJsZSBtYWduZXRpY0ZpZWxkU3RyZW5ndGhfOwotICBkb3VibGUgbGFzdEd5cm9zY29wZVRpbWVzdGFtcF87Ci0gIGludCBiaXRGaWVsZDBfOwotICBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uRmllbGRBcnJheSB1bmtub3duRmllbGREYXRhOwotICBpbnQgY2FjaGVkU2l6ZTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnZyY29yZS5iYXNlLmFwaS5CdWlsZFV0aWxzIHsKLSAgamF2YS5sYW5nLkJvb2xlYW4gaXNEZWJ1ZzsKLSAgYm9vbGVhbiBpc0RlYnVnQnVpbGQoYW5kcm9pZC5jb250ZW50LkNvbnRleHQpOwotICBib29sZWFuIGNvbXB1dGVJc0RlYnVnQnVpbGQoYW5kcm9pZC5jb250ZW50LkNvbnRleHQpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLmJhc2UuYXBpLlBhcmNlbGFibGVQcm90byB7Ci0gIGJvb2xlYW4gc2hvdWxkU2VyaWFsaXplRW1wdHlJbnN0ZWFkT2ZOdWxsQnVmZmVyKCk7Ci0gICA8aW5pdD4oYnl0ZVtdKTsKLSAgYm9vbGVhbiBpc0VtcHR5KCk7Ci0gIGJ5dGVbXSBkYXRhOwotICB2b2lkIHJlYWRGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsKTsKLSAgaW50IGdldFNpemVCeXRlcygpOwotICAgPGluaXQ+KCk7Ci0gIGphdmEubGFuZy5TdHJpbmcgVEFHOwotICB2b2lkIHNldEZyb21Qcm90byhjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uTWVzc2FnZU5hbm8pOwotICB2b2lkIGNsZWFyKCk7Ci0gIHZvaWQgc2V0RGF0YShieXRlW10pOwotICBib29sZWFuIHNob3VsZFNlcmlhbGl6ZURhdGFMZW5ndGgoKTsKLSAgIDxpbml0PihhbmRyb2lkLm9zLlBhcmNlbCk7Ci0gICA8aW5pdD4oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLk1lc3NhZ2VOYW5vKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnZyY29yZS5iYXNlLmFwaS5TaWduYXR1cmVVdGlscyB7Ci0gIGFuZHJvaWQuY29udGVudC5wbS5TaWduYXR1cmUgVlJDT1JFX0RFQlVHX1NJR05BVFVSRTsKLSAgYW5kcm9pZC5jb250ZW50LnBtLlNpZ25hdHVyZSBWUkNPUkVfUkVMRUFTRV9TSUdOQVRVUkU7Ci0gIGFuZHJvaWQuY29udGVudC5wbS5TaWduYXR1cmUgS0VZQk9BUkRfUkVMRUFTRV9TSUdOQVRVUkU7Ci0gIGFuZHJvaWQuY29udGVudC5wbS5TaWduYXR1cmUgS0VZQk9BUkRfREVCVUdfU0lHTkFUVVJFOwotICBhbmRyb2lkLmNvbnRlbnQucG0uU2lnbmF0dXJlIEJMQVpFX0RFQlVHX1NJR05BVFVSRTsKLSAgYW5kcm9pZC5jb250ZW50LnBtLlNpZ25hdHVyZSBzaWduYXR1cmVGcm9tQmFzZTY0KGphdmEubGFuZy5TdHJpbmcpOwotICBhbmRyb2lkLmNvbnRlbnQucG0uU2lnbmF0dXJlIEFORFJPSURfREVCVUdfU0lHTkFUVVJFOwotICBib29sZWFuIHZlcmlmeVNpZ25hdHVyZShhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm8sIGFuZHJvaWQuY29udGVudC5wbS5TaWduYXR1cmVbXSk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci52cmNvcmUuYmFzZS5hcGkuVnJDb3JlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgaW50IGVycm9yQ29kZTsKLSAgIDxpbml0PihpbnQpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLmJhc2UuYXBpLlZyQ29yZVV0aWxzIHsKLSAgaW50IGdldFZyQ29yZUNsaWVudEFwaVZlcnNpb24oYW5kcm9pZC5jb250ZW50LkNvbnRleHQpOwotICBqYXZhLmxhbmcuU3RyaW5nIGdldENvbm5lY3Rpb25SZXN1bHRTdHJpbmcoaW50KTsKLSAgamF2YS5sYW5nLlN0cmluZyBnZXRWckNvcmVTZGtMaWJyYXJ5VmVyc2lvbihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCk7Ci0gIGludCBjaGVja1ZyQ29yZUF2YWlsYWJpbGl0eShhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCk7Ci0gIGJvb2xlYW4gaXNWckNvcmVQYWNrYWdlKGphdmEubGFuZy5TdHJpbmcpOwotICBpbnQgY2hlY2tWckNvcmVBdmFpbGFiaWxpdHlJbXBsKGFuZHJvaWQuY29udGVudC5Db250ZXh0KTsKLSAgYm9vbGVhbiB2ZXJpZnlSZW1vdGVQYWNrYWdlU2lnbmF0dXJlKGFuZHJvaWQuY29udGVudC5Db250ZXh0KTsKLSAgamF2YS5sYW5nLlN0cmluZyBUQUc7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci52cmNvcmUuY29tbW9uLmFwaS5IZWFkVHJhY2tpbmdTZXJ2aWNlU3RhdGUgewotICAgPGluaXQ+KGFuZHJvaWQub3MuUGFyY2VsLCBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb21tb24uYXBpLkhlYWRUcmFja2luZ1NlcnZpY2VTdGF0ZSQxKTsKLSAgYnl0ZVtdIGdldERhdGEoKTsKLSAgIDxpbml0PihhbmRyb2lkLm9zLlBhcmNlbCk7Ci0gIGludCBnZXRTaXplQnl0ZXMoKTsKLSAgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUjsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb21tb24uYXBpLkhlYWRUcmFja2luZ1NlcnZpY2VTdGF0ZSQxIHsKLSAgIDxpbml0PigpOwotICBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb21tb24uYXBpLkhlYWRUcmFja2luZ1NlcnZpY2VTdGF0ZSBjcmVhdGVGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsKTsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUuY29tbW9uLmFwaS5IZWFkVHJhY2tpbmdTZXJ2aWNlU3RhdGVbXSBuZXdBcnJheShpbnQpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbW1vbi5hcGkuSGVhZFRyYWNraW5nU3RhdGUgewotICBieXRlW10gZ2V0RGF0YSgpOwotICAgPGluaXQ+KCk7Ci0gICA8aW5pdD4oYW5kcm9pZC5vcy5QYXJjZWwpOwotICBib29sZWFuIGlzRW1wdHkoKTsKLSAgaW50IGdldFNpemVCeXRlcygpOwotICAgPGluaXQ+KGJ5dGVbXSk7Ci0gIHZvaWQgcmVhZEZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwpOwotICAgPGluaXQ+KGFuZHJvaWQub3MuUGFyY2VsLCBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb21tb24uYXBpLkhlYWRUcmFja2luZ1N0YXRlJDEpOwotICBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvciBDUkVBVE9SOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbW1vbi5hcGkuSGVhZFRyYWNraW5nU3RhdGUkMSB7Ci0gICA8aW5pdD4oKTsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUuY29tbW9uLmFwaS5IZWFkVHJhY2tpbmdTdGF0ZSBjcmVhdGVGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsKTsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUuY29tbW9uLmFwaS5IZWFkVHJhY2tpbmdTdGF0ZVtdIG5ld0FycmF5KGludCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci52cmNvcmUuY29tbW9uLmFwaS5JRGF5ZHJlYW1MaXN0ZW5lciRTdHViIHsKLSAgdm9pZCBzZXRMZW5zT2Zmc2V0KGZsb2F0LCBmbG9hdCwgZmxvYXQpOwotICB2b2lkIGFwcGx5RmFkZShpbnQsIGxvbmcpOwotICB2b2lkIHJlY2VudGVySGVhZFRyYWNraW5nKCk7Ci0gICA8aW5pdD4oKTsKLSAgYm9vbGVhbiByb3V0ZVRvU3VwZXJPckVuZm9yY2VJbnRlcmZhY2UoaW50LCBhbmRyb2lkLm9zLlBhcmNlbCwgYW5kcm9pZC5vcy5QYXJjZWwsIGludCk7Ci0gIGludCBnZXRUYXJnZXRBcGlWZXJzaW9uKCk7Ci0gIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbW1vbi5hcGkuSURheWRyZWFtTGlzdGVuZXIgYXNJbnRlcmZhY2UoYW5kcm9pZC5vcy5JQmluZGVyKTsKLSAgdm9pZCByZXN1bWVIZWFkVHJhY2tpbmcoY29tLmdvb2dsZS52ci52cmNvcmUuY29tbW9uLmFwaS5IZWFkVHJhY2tpbmdTdGF0ZSk7Ci0gIHZvaWQgYXBwbHlDb2xvcmZ1bEZhZGUoaW50LCBsb25nLCBpbnQpOwotICB2b2lkIGludm9rZUNsb3NlQWN0aW9uKCk7Ci0gIHZvaWQgZGVwcmVjYXRlZF9zZXRMZW5zT2Zmc2V0cyhmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci0gIHZvaWQgYXR0YWNoSW50ZXJmYWNlKGFuZHJvaWQub3MuSUludGVyZmFjZSwgamF2YS5sYW5nLlN0cmluZyk7Ci0gIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbW1vbi5hcGkuSGVhZFRyYWNraW5nU3RhdGUgcmVxdWVzdFN0b3BUcmFja2luZygpOwotICB2b2lkIGR1bXBEZWJ1Z0RhdGEoKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb21tb24uYXBpLklEYXlkcmVhbUxpc3RlbmVyJFN0dWIkUHJveHkgewotICBhbmRyb2lkLm9zLlBhcmNlbCBvYnRhaW5BbmRXcml0ZUludGVyZmFjZVRva2VuKCk7Ci0gIGFuZHJvaWQub3MuUGFyY2VsIHRyYW5zYWN0QW5kUmVhZEV4Y2VwdGlvbihpbnQsIGFuZHJvaWQub3MuUGFyY2VsKTsKLSAgdm9pZCB0cmFuc2FjdE9uZXdheShpbnQsIGFuZHJvaWQub3MuUGFyY2VsKTsKLSAgIDxpbml0PihhbmRyb2lkLm9zLklCaW5kZXIpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbW1vbi5hcGkuSURheWRyZWFtTWFuYWdlciB7Ci0gIHZvaWQgaGFuZGxlSW5zZXJ0aW9uSW50b0hlYWRzZXQoYnl0ZVtdKTsKLSAgaW50IHByZXBhcmVWcihhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSwgY29tLmdvb2dsZS52ci52cmNvcmUuY29tbW9uLmFwaS5IZWFkVHJhY2tpbmdTdGF0ZSk7Ci0gIHZvaWQgaGFuZGxlUmVtb3ZhbEZyb21IZWFkc2V0KCk7Ci0gIGJvb2xlYW4gbGF1bmNoVnJUcmFuc2l0aW9uKGNvbS5nb29nbGUudnIudnJjb3JlLmNvbW1vbi5hcGkuSVRyYW5zaXRpb25DYWxsYmFja3MpOwotICBpbnQgcHJlcGFyZVZyMihhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSwgaW50LCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50LCBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb21tb24uYXBpLkhlYWRUcmFja2luZ1N0YXRlKTsKLSAgYm9vbGVhbiBsYXVuY2hJblZyKGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQsIGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lKTsKLSAgYm9vbGVhbiB1bnJlZ2lzdGVyTGlzdGVuZXIoYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUpOwotICBib29sZWFuIGxhdW5jaFZySG9tZSgpOwotICB2b2lkIG9uRXhpdGluZ0Zyb21WcigpOwotICB2b2lkIHVucmVnaXN0ZXJEYXlkcmVhbUludGVudCgpOwotICB2b2lkIHJlZ2lzdGVyRGF5ZHJlYW1JbnRlbnQoYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudCk7Ci0gIGludCBwcmVwYXJlVnIzKGFuZHJvaWQub3MuQnVuZGxlLCBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb21tb24uYXBpLkhlYWRUcmFja2luZ1N0YXRlKTsKLSAgYm9vbGVhbiByZWdpc3Rlckxpc3RlbmVyKGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lLCBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb21tb24uYXBpLklEYXlkcmVhbUxpc3RlbmVyKTsKLSAgYm9vbGVhbiBleGl0RnJvbVZyKGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbW1vbi5hcGkuSURheWRyZWFtTWFuYWdlciRTdHViIHsKLSAgYm9vbGVhbiByZWdpc3Rlckxpc3RlbmVyKGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lLCBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb21tb24uYXBpLklEYXlkcmVhbUxpc3RlbmVyKTsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUuY29tbW9uLmFwaS5JRGF5ZHJlYW1NYW5hZ2VyIGFzSW50ZXJmYWNlKGFuZHJvaWQub3MuSUJpbmRlcik7Ci0gIGJvb2xlYW4gbGF1bmNoVnJUcmFuc2l0aW9uKGNvbS5nb29nbGUudnIudnJjb3JlLmNvbW1vbi5hcGkuSVRyYW5zaXRpb25DYWxsYmFja3MpOwotICBpbnQgcHJlcGFyZVZyKGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lLCBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb21tb24uYXBpLkhlYWRUcmFja2luZ1N0YXRlKTsKLSAgdm9pZCBhdHRhY2hJbnRlcmZhY2UoYW5kcm9pZC5vcy5JSW50ZXJmYWNlLCBqYXZhLmxhbmcuU3RyaW5nKTsKLSAgYm9vbGVhbiBsYXVuY2hJblZyKGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQsIGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lKTsKLSAgYm9vbGVhbiByb3V0ZVRvU3VwZXJPckVuZm9yY2VJbnRlcmZhY2UoaW50LCBhbmRyb2lkLm9zLlBhcmNlbCwgYW5kcm9pZC5vcy5QYXJjZWwsIGludCk7Ci0gIGJvb2xlYW4gdW5yZWdpc3Rlckxpc3RlbmVyKGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lKTsKLSAgaW50IHByZXBhcmVWcjIoYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUsIGludCwgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudCwgY29tLmdvb2dsZS52ci52cmNvcmUuY29tbW9uLmFwaS5IZWFkVHJhY2tpbmdTdGF0ZSk7Ci0gIGJvb2xlYW4gbGF1bmNoVnJIb21lKCk7Ci0gIGludCBwcmVwYXJlVnIzKGFuZHJvaWQub3MuQnVuZGxlLCBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb21tb24uYXBpLkhlYWRUcmFja2luZ1N0YXRlKTsKLSAgYm9vbGVhbiBleGl0RnJvbVZyKGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQpOwotICB2b2lkIG9uRXhpdGluZ0Zyb21WcigpOwotICB2b2lkIGxhdW5jaFZyVHJhbnNpdGlvbjIoYW5kcm9pZC5vcy5CdW5kbGUpOwotICB2b2lkIHJlZ2lzdGVyRGF5ZHJlYW1JbnRlbnQoYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudCk7Ci0gIGJvb2xlYW4gZGVwcmVjYXRlZExhdW5jaEluVnIoYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudCk7Ci0gIHZvaWQgaGFuZGxlUmVtb3ZhbEZyb21IZWFkc2V0KCk7Ci0gIHZvaWQgaGFuZGxlSW5zZXJ0aW9uSW50b0hlYWRzZXQoYnl0ZVtdKTsKLSAgdm9pZCB1bnJlZ2lzdGVyRGF5ZHJlYW1JbnRlbnQoKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb21tb24uYXBpLklEYXlkcmVhbU1hbmFnZXIkU3R1YiRQcm94eSB7Ci0gIGFuZHJvaWQub3MuUGFyY2VsIHRyYW5zYWN0QW5kUmVhZEV4Y2VwdGlvbihpbnQsIGFuZHJvaWQub3MuUGFyY2VsKTsKLSAgIDxpbml0PihhbmRyb2lkLm9zLklCaW5kZXIpOwotICB2b2lkIHRyYW5zYWN0T25ld2F5KGludCwgYW5kcm9pZC5vcy5QYXJjZWwpOwotICBhbmRyb2lkLm9zLlBhcmNlbCBvYnRhaW5BbmRXcml0ZUludGVyZmFjZVRva2VuKCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci52cmNvcmUuY29tbW9uLmFwaS5JVHJhbnNpdGlvbkNhbGxiYWNrcyB7Ci0gIHZvaWQgb25UcmFuc2l0aW9uQ29tcGxldGUoKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb21tb24uYXBpLklUcmFuc2l0aW9uQ2FsbGJhY2tzJFN0dWIgewotICB2b2lkIGF0dGFjaEludGVyZmFjZShhbmRyb2lkLm9zLklJbnRlcmZhY2UsIGphdmEubGFuZy5TdHJpbmcpOwotICBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb21tb24uYXBpLklUcmFuc2l0aW9uQ2FsbGJhY2tzIGFzSW50ZXJmYWNlKGFuZHJvaWQub3MuSUJpbmRlcik7Ci0gIGJvb2xlYW4gcm91dGVUb1N1cGVyT3JFbmZvcmNlSW50ZXJmYWNlKGludCwgYW5kcm9pZC5vcy5QYXJjZWwsIGFuZHJvaWQub3MuUGFyY2VsLCBpbnQpOwotICAgPGluaXQ+KCk7Ci0gIHZvaWQgb25UcmFuc2l0aW9uQ29tcGxldGUoKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb21tb24uYXBpLklUcmFuc2l0aW9uQ2FsbGJhY2tzJFN0dWIkUHJveHkgewotICBhbmRyb2lkLm9zLlBhcmNlbCBvYnRhaW5BbmRXcml0ZUludGVyZmFjZVRva2VuKCk7Ci0gIHZvaWQgdHJhbnNhY3RPbmV3YXkoaW50LCBhbmRyb2lkLm9zLlBhcmNlbCk7Ci0gICA8aW5pdD4oYW5kcm9pZC5vcy5JQmluZGVyKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb21tb24uYXBpLklWckNvcmVTZGtTZXJ2aWNlIHsKLSAgYm9vbGVhbiBzZXRDbGllbnRPcHRpb25zKGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lLCBhbmRyb2lkLm9zLkJ1bmRsZSk7Ci0gIGJvb2xlYW4gaW5pdGlhbGl6ZShpbnQpOwotICBjb20uZ29vZ2xlLnZyLnZyY29yZS5sb2dnaW5nLmFwaS5JVnJDb3JlTG9nZ2luZ1NlcnZpY2UgZ2V0TG9nZ2luZ1NlcnZpY2UoKTsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUuY29tbW9uLmFwaS5JRGF5ZHJlYW1NYW5hZ2VyIGdldERheWRyZWFtTWFuYWdlcigpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbW1vbi5hcGkuSVZyQ29yZVNka1NlcnZpY2UkU3R1YiB7Ci0gIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbW1vbi5hcGkuSVZyQ29yZVNka1NlcnZpY2UgYXNJbnRlcmZhY2UoYW5kcm9pZC5vcy5JQmluZGVyKTsKLSAgYm9vbGVhbiBpbml0aWFsaXplKGludCk7Ci0gIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbW1vbi5hcGkuSURheWRyZWFtTWFuYWdlciBnZXREYXlkcmVhbU1hbmFnZXIoKTsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUubG9nZ2luZy5hcGkuSVZyQ29yZUxvZ2dpbmdTZXJ2aWNlIGdldExvZ2dpbmdTZXJ2aWNlKCk7Ci0gIHZvaWQgYXR0YWNoSW50ZXJmYWNlKGFuZHJvaWQub3MuSUludGVyZmFjZSwgamF2YS5sYW5nLlN0cmluZyk7Ci0gIGJvb2xlYW4gcm91dGVUb1N1cGVyT3JFbmZvcmNlSW50ZXJmYWNlKGludCwgYW5kcm9pZC5vcy5QYXJjZWwsIGFuZHJvaWQub3MuUGFyY2VsLCBpbnQpOwotICBib29sZWFuIHNldENsaWVudE9wdGlvbnMoYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUsIGFuZHJvaWQub3MuQnVuZGxlKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb21tb24uYXBpLklWckNvcmVTZGtTZXJ2aWNlJFN0dWIkUHJveHkgewotICBhbmRyb2lkLm9zLlBhcmNlbCB0cmFuc2FjdEFuZFJlYWRFeGNlcHRpb24oaW50LCBhbmRyb2lkLm9zLlBhcmNlbCk7Ci0gIGFuZHJvaWQub3MuUGFyY2VsIG9idGFpbkFuZFdyaXRlSW50ZXJmYWNlVG9rZW4oKTsKLSAgIDxpbml0PihhbmRyb2lkLm9zLklCaW5kZXIpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLkNvbnRyb2xsZXJBY2NlbEV2ZW50IHsKLSAgaW50IGdldEJ5dGVTaXplKCk7Ci0gICA8aW5pdD4oKTsKLSAgdm9pZCB3cml0ZVRvUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsLCBpbnQpOwotICBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvciBDUkVBVE9SOwotICBpbnQgY29udHJvbGxlcklkOwotICBmbG9hdCB5OwotICBmbG9hdCB4OwotICB2b2lkIHJlYWRGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsKTsKLSAgZmxvYXQgejsKLSAgbG9uZyB0aW1lc3RhbXBOYW5vczsKLSAgIDxpbml0PihhbmRyb2lkLm9zLlBhcmNlbCk7Ci0gIHZvaWQgY29weUZyb20oY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuQ29udHJvbGxlckV2ZW50KTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5Db250cm9sbGVyQWNjZWxFdmVudCQxIHsKLSAgIDxpbml0PigpOwotICBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5Db250cm9sbGVyQWNjZWxFdmVudCBjcmVhdGVGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsKTsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuQ29udHJvbGxlckFjY2VsRXZlbnRbXSBuZXdBcnJheShpbnQpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLkNvbnRyb2xsZXJCYXR0ZXJ5RXZlbnQgewotICAgPGluaXQ+KCk7Ci0gICA8aW5pdD4oYW5kcm9pZC5vcy5QYXJjZWwpOwotICB2b2lkIHdyaXRlVG9QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwsIGludCk7Ci0gIHZvaWQgY29weUZyb20oY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuQ29udHJvbGxlckV2ZW50KTsKLSAgdm9pZCByZWFkRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCk7Ci0gIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yIENSRUFUT1I7Ci0gIGxvbmcgdGltZXN0YW1wTmFub3M7Ci0gIGludCBnZXRCeXRlU2l6ZSgpOwotICBpbnQgY29udHJvbGxlcklkOwotICBib29sZWFuIGNoYXJnaW5nOwotICBpbnQgYmF0dGVyeUxldmVsQnVja2V0OwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLkNvbnRyb2xsZXJCYXR0ZXJ5RXZlbnQkMSB7Ci0gICA8aW5pdD4oKTsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuQ29udHJvbGxlckJhdHRlcnlFdmVudCBjcmVhdGVGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsKTsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuQ29udHJvbGxlckJhdHRlcnlFdmVudFtdIG5ld0FycmF5KGludCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuQ29udHJvbGxlckJ1dHRvbkV2ZW50IHsKLSAgaW50IGNvbnRyb2xsZXJJZDsKLSAgbG9uZyB0aW1lc3RhbXBOYW5vczsKLSAgYm9vbGVhbiBkb3duOwotICBpbnQgZ2V0Qnl0ZVNpemUoKTsKLSAgaW50W10gQUxMX0JVVFRPTlM7Ci0gICA8aW5pdD4oYW5kcm9pZC5vcy5QYXJjZWwpOwotICB2b2lkIHdyaXRlVG9QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwsIGludCk7Ci0gICA8aW5pdD4oKTsKLSAgdm9pZCByZWFkRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCk7Ci0gIGludCBidXR0b247Ci0gIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yIENSRUFUT1I7Ci0gIHZvaWQgY29weUZyb20oY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuQ29udHJvbGxlckV2ZW50KTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5Db250cm9sbGVyQnV0dG9uRXZlbnQkMSB7Ci0gICA8aW5pdD4oKTsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuQ29udHJvbGxlckJ1dHRvbkV2ZW50IGNyZWF0ZUZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwpOwotICBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5Db250cm9sbGVyQnV0dG9uRXZlbnRbXSBuZXdBcnJheShpbnQpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLkNvbnRyb2xsZXJFdmVudCB7Ci0gICA8aW5pdD4oKTsKLSAgdm9pZCBjb3B5RnJvbShjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5Db250cm9sbGVyRXZlbnQpOwotICBpbnQgY29udHJvbGxlcklkOwotICB2b2lkIHdyaXRlVG9QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwsIGludCk7Ci0gIHZvaWQgcmVhZEZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwpOwotICBsb25nIHRpbWVzdGFtcE5hbm9zOwotICBpbnQgZ2V0Qnl0ZVNpemUoKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5Db250cm9sbGVyRXZlbnRQYWNrZXQgewotICB2b2lkIHJlYWRGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsKTsKLSAgamF2YS5sYW5nLk9iamVjdCBwb29sTG9jazsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuQ29udHJvbGxlckJ1dHRvbkV2ZW50W10gYnV0dG9uRXZlbnRzOwotICB2b2lkIHJlY3ljbGUoKTsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuQ29udHJvbGxlck9yaWVudGF0aW9uRXZlbnQgZ2V0T3JpZW50YXRpb25FdmVudChpbnQpOwotICBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5Db250cm9sbGVyVG91Y2hFdmVudCBnZXRUb3VjaEV2ZW50KGludCk7Ci0gIGludCB0b3VjaEV2ZW50Q291bnQ7Ci0gIHZvaWQgY2xlYXIoKTsKLSAgaW50IGJ1dHRvbkV2ZW50Q291bnQ7Ci0gIGludCBnZXRHeXJvRXZlbnRDb3VudCgpOwotICBpbnQgZ2V0QWNjZWxFdmVudENvdW50KCk7Ci0gIHZvaWQgc2V0RXZlbnRzQ29udHJvbGxlckluZGV4KGludCk7Ci0gIHZvaWQgd3JpdGVUb1BhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCwgaW50KTsKLSAgaW50IGNhbGN1bGF0ZVBhcmNlbEJ5dGVMZW5ndGgoKTsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuQ29udHJvbGxlckd5cm9FdmVudFtdIGd5cm9FdmVudHM7Ci0gIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLkNvbnRyb2xsZXJPcmllbnRhdGlvbkV2ZW50W10gb3JpZW50YXRpb25FdmVudHM7Ci0gIGludCBneXJvRXZlbnRDb3VudDsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuQ29udHJvbGxlclRvdWNoRXZlbnRbXSB0b3VjaEV2ZW50czsKLSAgaW50IG9yaWVudGF0aW9uRXZlbnRDb3VudDsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuQ29udHJvbGxlckFjY2VsRXZlbnRbXSBhY2NlbEV2ZW50czsKLSAgamF2YS51dGlsLkFycmF5RGVxdWUgcG9vbDsKLSAgaW50IGdldFRvdWNoRXZlbnRDb3VudCgpOwotICBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvciBDUkVBVE9SOwotICAgPGluaXQ+KCk7Ci0gIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLkNvbnRyb2xsZXJHeXJvRXZlbnQgZ2V0R3lyb0V2ZW50KGludCk7Ci0gIHZvaWQgc2V0Q29udHJvbGxlckluZGV4KGludCwgaW50LCBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5Db250cm9sbGVyRXZlbnRbXSk7Ci0gIGludCBhY2NlbEV2ZW50Q291bnQ7Ci0gIHZvaWQgY29weUZyb20oY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuQ29udHJvbGxlckV2ZW50UGFja2V0KTsKLSAgaW50IGdldEJ1dHRvbkV2ZW50Q291bnQoKTsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuQ29udHJvbGxlckJ1dHRvbkV2ZW50IGdldEJ1dHRvbkV2ZW50KGludCk7Ci0gIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLkNvbnRyb2xsZXJFdmVudFBhY2tldCBvYnRhaW4oKTsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuQ29udHJvbGxlckFjY2VsRXZlbnQgZ2V0QWNjZWxFdmVudChpbnQpOwotICB2b2lkIGNoZWNrSXNWYWxpZEV2ZW50Q291bnQoaW50KTsKLSAgaW50IGdldE9yaWVudGF0aW9uRXZlbnRDb3VudCgpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLkNvbnRyb2xsZXJFdmVudFBhY2tldCQxIHsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuQ29udHJvbGxlckV2ZW50UGFja2V0W10gbmV3QXJyYXkoaW50KTsKLSAgIDxpbml0PigpOwotICBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5Db250cm9sbGVyRXZlbnRQYWNrZXQgY3JlYXRlRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuQ29udHJvbGxlckV2ZW50UGFja2V0MiB7Ci0gIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLkNvbnRyb2xsZXJFdmVudFBhY2tldDIgb2J0YWluKCk7Ci0gIHZvaWQgc2V0Q29udHJvbGxlckluZGV4KGludCwgaW50LCBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5Db250cm9sbGVyRXZlbnRbXSk7Ci0gICA8aW5pdD4oKTsKLSAgdm9pZCByZWFkRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCk7Ci0gIGludCBnZXRQb3NpdGlvbkV2ZW50Q291bnQoKTsKLSAgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUjsKLSAgamF2YS5sYW5nLk9iamVjdCBwb29sTG9jazsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuQ29udHJvbGxlclBvc2l0aW9uRXZlbnQgZ2V0UG9zaXRpb25FdmVudChpbnQpOwotICBib29sZWFuIGhhc0JhdHRlcnlFdmVudDsKLSAgbG9uZyBnZXRTeXN0ZW1UaW1lTWlsbGlzKCk7Ci0gIGJvb2xlYW4gaGFzQmF0dGVyeUV2ZW50KCk7Ci0gIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLkNvbnRyb2xsZXJQb3NpdGlvbkV2ZW50W10gcG9zaXRpb25FdmVudHM7Ci0gIGludCBwb3NpdGlvbkV2ZW50Q291bnQ7Ci0gIHZvaWQgcmVjeWNsZSgpOwotICBpbnQgY2FsY3VsYXRlUGFyY2VsQnl0ZUxlbmd0aCgpOwotICB2b2lkIHNldEV2ZW50c0NvbnRyb2xsZXJJbmRleChpbnQpOwotICBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5Db250cm9sbGVyQmF0dGVyeUV2ZW50IGJhdHRlcnlFdmVudDsKLSAgdm9pZCBjaGVja0lzVmFsaWRFdmVudENvdW50KGludCk7Ci0gIGphdmEudXRpbC5BcnJheURlcXVlIHBvb2w7Ci0gIGxvbmcgdGltZXN0YW1wTWlsbGlzOwotICBsb25nIGdldFRpbWVzdGFtcE1pbGxpcygpOwotICBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5Db250cm9sbGVyQmF0dGVyeUV2ZW50IGdldEJhdHRlcnlFdmVudCgpOwotICB2b2lkIGNsZWFyKCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuQ29udHJvbGxlckV2ZW50UGFja2V0MiQxIHsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuQ29udHJvbGxlckV2ZW50UGFja2V0MiBjcmVhdGVGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsKTsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuQ29udHJvbGxlckV2ZW50UGFja2V0MltdIG5ld0FycmF5KGludCk7Ci0gICA8aW5pdD4oKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5Db250cm9sbGVyR3lyb0V2ZW50IHsKLSAgdm9pZCByZWFkRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCk7Ci0gIGludCBnZXRCeXRlU2l6ZSgpOwotICBsb25nIHRpbWVzdGFtcE5hbm9zOwotICB2b2lkIHdyaXRlVG9QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwsIGludCk7Ci0gIHZvaWQgY29weUZyb20oY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuQ29udHJvbGxlckV2ZW50KTsKLSAgZmxvYXQgeDsKLSAgaW50IGNvbnRyb2xsZXJJZDsKLSAgZmxvYXQgeTsKLSAgIDxpbml0PigpOwotICBmbG9hdCB6OwotICAgPGluaXQ+KGFuZHJvaWQub3MuUGFyY2VsKTsKLSAgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUjsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5Db250cm9sbGVyR3lyb0V2ZW50JDEgewotICAgPGluaXQ+KCk7Ci0gIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLkNvbnRyb2xsZXJHeXJvRXZlbnQgY3JlYXRlRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCk7Ci0gIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLkNvbnRyb2xsZXJHeXJvRXZlbnRbXSBuZXdBcnJheShpbnQpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLkNvbnRyb2xsZXJJbml0UmVzdWx0cyB7Ci0gIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoaW50KTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5Db250cm9sbGVyTGlzdGVuZXJPcHRpb25zIHsKLSAgYm9vbGVhbiBlbmFibGVHZXN0dXJlczsKLSAgYm9vbGVhbiBlbmFibGVPcmllbnRhdGlvbjsKLSAgIDxpbml0PihhbmRyb2lkLm9zLlBhcmNlbCk7Ci0gIGJvb2xlYW4gZW5hYmxlQWNjZWw7Ci0gIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yIENSRUFUT1I7Ci0gICA8aW5pdD4oaW50KTsKLSAgYm9vbGVhbiBlbmFibGVHeXJvOwotICAgPGluaXQ+KCk7Ci0gIGJvb2xlYW4gZW5hYmxlVG91Y2g7Ci0gIHZvaWQgcmVhZEZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLkNvbnRyb2xsZXJMaXN0ZW5lck9wdGlvbnMkMSB7Ci0gIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLkNvbnRyb2xsZXJMaXN0ZW5lck9wdGlvbnMgY3JlYXRlRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCk7Ci0gICA8aW5pdD4oKTsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuQ29udHJvbGxlckxpc3RlbmVyT3B0aW9uc1tdIG5ld0FycmF5KGludCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuQ29udHJvbGxlck9yaWVudGF0aW9uRXZlbnQgewotICBpbnQgZ2V0Qnl0ZVNpemUoKTsKLSAgdm9pZCByZWFkRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCk7Ci0gICA8aW5pdD4oYW5kcm9pZC5vcy5QYXJjZWwpOwotICBmbG9hdCBxeTsKLSAgZmxvYXQgcXg7Ci0gIGZsb2F0IHF3OwotICBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvciBDUkVBVE9SOwotICB2b2lkIGNvcHlGcm9tKGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLkNvbnRyb2xsZXJFdmVudCk7Ci0gIGludCBjb250cm9sbGVySWQ7Ci0gIHZvaWQgd3JpdGVUb1BhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCwgaW50KTsKLSAgbG9uZyB0aW1lc3RhbXBOYW5vczsKLSAgZmxvYXQgcXo7Ci0gICA8aW5pdD4oKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5Db250cm9sbGVyT3JpZW50YXRpb25FdmVudCQxIHsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuQ29udHJvbGxlck9yaWVudGF0aW9uRXZlbnRbXSBuZXdBcnJheShpbnQpOwotICBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5Db250cm9sbGVyT3JpZW50YXRpb25FdmVudCBjcmVhdGVGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsKTsKLSAgIDxpbml0PigpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLkNvbnRyb2xsZXJQb3NpdGlvbkV2ZW50IHsKLSAgdm9pZCBjb3B5RnJvbShjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5Db250cm9sbGVyRXZlbnQpOwotICAgPGluaXQ+KGFuZHJvaWQub3MuUGFyY2VsKTsKLSAgZmxvYXQgeDsKLSAgaW50IGNvbnRyb2xsZXJJZDsKLSAgdm9pZCByZWFkRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCk7Ci0gIHZvaWQgd3JpdGVUb1BhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCwgaW50KTsKLSAgbG9uZyB0aW1lc3RhbXBOYW5vczsKLSAgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUjsKLSAgIDxpbml0PigpOwotICBmbG9hdCB6OwotICBmbG9hdCB5OwotICBpbnQgZ2V0Qnl0ZVNpemUoKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5Db250cm9sbGVyUG9zaXRpb25FdmVudCQxIHsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuQ29udHJvbGxlclBvc2l0aW9uRXZlbnRbXSBuZXdBcnJheShpbnQpOwotICAgPGluaXQ+KCk7Ci0gIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLkNvbnRyb2xsZXJQb3NpdGlvbkV2ZW50IGNyZWF0ZUZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLkNvbnRyb2xsZXJSZXF1ZXN0IHsKLSAgIDxpbml0PigpOwotICAgPGluaXQ+KGFuZHJvaWQub3MuUGFyY2VsKTsKLSAgdm9pZCBzZXRGcm9tUHJvdG8oY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLk1lc3NhZ2VOYW5vKTsKLSAgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUjsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLk1lc3NhZ2VOYW5vIHBhcnNlVG9Qcm90byhqYXZhLmxhbmcuQ2xhc3MpOwotICB2b2lkIGNoZWNrQXJndW1lbnQoYm9vbGVhbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdFtdKTsKLSAgYnl0ZVtdIGdldERhdGEoKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5Db250cm9sbGVyUmVxdWVzdCQxIHsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuQ29udHJvbGxlclJlcXVlc3RbXSBuZXdBcnJheShpbnQpOwotICAgPGluaXQ+KCk7Ci0gIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLkNvbnRyb2xsZXJSZXF1ZXN0IGNyZWF0ZUZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLkNvbnRyb2xsZXJUb3VjaEV2ZW50IHsKLSAgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUjsKLSAgaW50IGFjdGlvbjsKLSAgZmxvYXQgeDsKLSAgZmxvYXQgeTsKLSAgaW50IGdldEJ5dGVTaXplKCk7Ci0gIGludCBmaW5nZXJJZDsKLSAgdm9pZCBjb3B5RnJvbShjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5Db250cm9sbGVyRXZlbnQpOwotICBpbnQgY29udHJvbGxlcklkOwotICAgPGluaXQ+KCk7Ci0gIGxvbmcgdGltZXN0YW1wTmFub3M7Ci0gIHZvaWQgcmVhZEZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwpOwotICB2b2lkIHdyaXRlVG9QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwsIGludCk7Ci0gICA8aW5pdD4oYW5kcm9pZC5vcy5QYXJjZWwpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLkNvbnRyb2xsZXJUb3VjaEV2ZW50JDEgewotICAgPGluaXQ+KCk7Ci0gIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLkNvbnRyb2xsZXJUb3VjaEV2ZW50IGNyZWF0ZUZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwpOwotICBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5Db250cm9sbGVyVG91Y2hFdmVudFtdIG5ld0FycmF5KGludCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuSUNvbnRyb2xsZXJMaXN0ZW5lciRTdHViIHsKLSAgaW50IGdldEFwaVZlcnNpb24oKTsKLSAgYm9vbGVhbiByb3V0ZVRvU3VwZXJPckVuZm9yY2VJbnRlcmZhY2UoaW50LCBhbmRyb2lkLm9zLlBhcmNlbCwgYW5kcm9pZC5vcy5QYXJjZWwsIGludCk7Ci0gIHZvaWQgb25Db250cm9sbGVyRXZlbnRQYWNrZXQoY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuQ29udHJvbGxlckV2ZW50UGFja2V0KTsKLSAgdm9pZCBhdHRhY2hJbnRlcmZhY2UoYW5kcm9pZC5vcy5JSW50ZXJmYWNlLCBqYXZhLmxhbmcuU3RyaW5nKTsKLSAgdm9pZCBvbkNvbnRyb2xsZXJSZWNlbnRlcmVkKGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLkNvbnRyb2xsZXJPcmllbnRhdGlvbkV2ZW50KTsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuQ29udHJvbGxlckxpc3RlbmVyT3B0aW9ucyBnZXRPcHRpb25zKCk7Ci0gIHZvaWQgb25Db250cm9sbGVyU3RhdGVDaGFuZ2VkKGludCwgaW50KTsKLSAgdm9pZCBvbkNvbnRyb2xsZXJFdmVudFBhY2tldDIoY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuQ29udHJvbGxlckV2ZW50UGFja2V0Mik7Ci0gIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLklDb250cm9sbGVyTGlzdGVuZXIgYXNJbnRlcmZhY2UoYW5kcm9pZC5vcy5JQmluZGVyKTsKLSAgIDxpbml0PigpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLklDb250cm9sbGVyTGlzdGVuZXIkU3R1YiRQcm94eSB7Ci0gICA8aW5pdD4oYW5kcm9pZC5vcy5JQmluZGVyKTsKLSAgYW5kcm9pZC5vcy5QYXJjZWwgdHJhbnNhY3RBbmRSZWFkRXhjZXB0aW9uKGludCwgYW5kcm9pZC5vcy5QYXJjZWwpOwotICB2b2lkIHRyYW5zYWN0T25ld2F5KGludCwgYW5kcm9pZC5vcy5QYXJjZWwpOwotICBhbmRyb2lkLm9zLlBhcmNlbCBvYnRhaW5BbmRXcml0ZUludGVyZmFjZVRva2VuKCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuSUNvbnRyb2xsZXJTZXJ2aWNlIHsKLSAgYm9vbGVhbiB1bnJlZ2lzdGVyU2VydmljZUxpc3RlbmVyKGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLklDb250cm9sbGVyU2VydmljZUxpc3RlbmVyKTsKLSAgYm9vbGVhbiByZWdpc3RlclNlcnZpY2VMaXN0ZW5lcihjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5JQ29udHJvbGxlclNlcnZpY2VMaXN0ZW5lcik7Ci0gIHZvaWQgcmVxdWVzdChpbnQsIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLkNvbnRyb2xsZXJSZXF1ZXN0KTsKLSAgaW50IGluaXRpYWxpemUoaW50KTsKLSAgaW50IGdldE51bWJlck9mQ29udHJvbGxlcnMoKTsKLSAgYm9vbGVhbiByZWdpc3Rlckxpc3RlbmVyKGludCwgamF2YS5sYW5nLlN0cmluZywgY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuSUNvbnRyb2xsZXJMaXN0ZW5lcik7Ci0gIGJvb2xlYW4gdW5yZWdpc3Rlckxpc3RlbmVyKGphdmEubGFuZy5TdHJpbmcpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLklDb250cm9sbGVyU2VydmljZSRTdHViIHsKLSAgaW50IGdldE51bWJlck9mQ29udHJvbGxlcnMoKTsKLSAgdm9pZCBvbkhlYWRUcmFja2luZ1JlY2VudGVyZWQoZmxvYXRbXSwgZmxvYXRbXSk7Ci0gIGludCBpbml0aWFsaXplKGludCk7Ci0gIGJvb2xlYW4gcmVnaXN0ZXJMaXN0ZW5lcihpbnQsIGphdmEubGFuZy5TdHJpbmcsIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLklDb250cm9sbGVyTGlzdGVuZXIpOwotICBib29sZWFuIHVucmVnaXN0ZXJMaXN0ZW5lcihqYXZhLmxhbmcuU3RyaW5nKTsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuSUNvbnRyb2xsZXJTZXJ2aWNlIGFzSW50ZXJmYWNlKGFuZHJvaWQub3MuSUJpbmRlcik7Ci0gIGJvb2xlYW4gdW5yZWdpc3RlclNlcnZpY2VMaXN0ZW5lcihjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5JQ29udHJvbGxlclNlcnZpY2VMaXN0ZW5lcik7Ci0gIHZvaWQgcmVxdWVzdChpbnQsIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLkNvbnRyb2xsZXJSZXF1ZXN0KTsKLSAgYm9vbGVhbiByb3V0ZVRvU3VwZXJPckVuZm9yY2VJbnRlcmZhY2UoaW50LCBhbmRyb2lkLm9zLlBhcmNlbCwgYW5kcm9pZC5vcy5QYXJjZWwsIGludCk7Ci0gIGJvb2xlYW4gcmVnaXN0ZXJTZXJ2aWNlTGlzdGVuZXIoY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkuSUNvbnRyb2xsZXJTZXJ2aWNlTGlzdGVuZXIpOwotICB2b2lkIGF0dGFjaEludGVyZmFjZShhbmRyb2lkLm9zLklJbnRlcmZhY2UsIGphdmEubGFuZy5TdHJpbmcpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLklDb250cm9sbGVyU2VydmljZSRTdHViJFByb3h5IHsKLSAgYW5kcm9pZC5vcy5QYXJjZWwgb2J0YWluQW5kV3JpdGVJbnRlcmZhY2VUb2tlbigpOwotICB2b2lkIHRyYW5zYWN0QW5kUmVhZEV4Y2VwdGlvblJldHVyblZvaWQoaW50LCBhbmRyb2lkLm9zLlBhcmNlbCk7Ci0gIGFuZHJvaWQub3MuUGFyY2VsIHRyYW5zYWN0QW5kUmVhZEV4Y2VwdGlvbihpbnQsIGFuZHJvaWQub3MuUGFyY2VsKTsKLSAgIDxpbml0PihhbmRyb2lkLm9zLklCaW5kZXIpOwotICB2b2lkIHRyYW5zYWN0T25ld2F5KGludCwgYW5kcm9pZC5vcy5QYXJjZWwpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLklDb250cm9sbGVyU2VydmljZUxpc3RlbmVyJFN0dWIgewotICAgPGluaXQ+KCk7Ci0gIHZvaWQgb25Db250cm9sbGVyU2VydmljZUV2ZW50KGludCk7Ci0gIHZvaWQgYXR0YWNoSW50ZXJmYWNlKGFuZHJvaWQub3MuSUludGVyZmFjZSwgamF2YS5sYW5nLlN0cmluZyk7Ci0gIGludCBnZXRBcGlWZXJzaW9uKCk7Ci0gIGJvb2xlYW4gcm91dGVUb1N1cGVyT3JFbmZvcmNlSW50ZXJmYWNlKGludCwgYW5kcm9pZC5vcy5QYXJjZWwsIGFuZHJvaWQub3MuUGFyY2VsLCBpbnQpOwotICBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5JQ29udHJvbGxlclNlcnZpY2VMaXN0ZW5lciBhc0ludGVyZmFjZShhbmRyb2lkLm9zLklCaW5kZXIpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLklDb250cm9sbGVyU2VydmljZUxpc3RlbmVyJFN0dWIkUHJveHkgewotICBhbmRyb2lkLm9zLlBhcmNlbCBvYnRhaW5BbmRXcml0ZUludGVyZmFjZVRva2VuKCk7Ci0gICA8aW5pdD4oYW5kcm9pZC5vcy5JQmluZGVyKTsKLSAgYW5kcm9pZC5vcy5QYXJjZWwgdHJhbnNhY3RBbmRSZWFkRXhjZXB0aW9uKGludCwgYW5kcm9pZC5vcy5QYXJjZWwpOwotICB2b2lkIHRyYW5zYWN0T25ld2F5KGludCwgYW5kcm9pZC5vcy5QYXJjZWwpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLm5hbm8uUHJvdG8kUmVxdWVzdCB7Ci0gIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLm5hbm8uUHJvdG8kUmVxdWVzdCBjbGVhcigpOwotICBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5uYW5vLlByb3RvJFJlcXVlc3RbXSBfZW1wdHlBcnJheTsKLSAgIDxpbml0PigpOwotICBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5uYW5vLlByb3RvJFJlcXVlc3QgY2xvbmUoKTsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkubmFuby5Qcm90byRSZXF1ZXN0IG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgaW50IGNhY2hlZFNpemU7Ci0gIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLm5hbm8uUHJvdG8kUmVxdWVzdCRWaWJyYXRpb24gdmlicmF0aW9uOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLm5hbm8uUHJvdG8kUmVxdWVzdCRWaWJyYXRpb24gewotICBpbnQgY2FjaGVkU2l6ZTsKLSAgaW50IHZvbHVtZVBlcmNlbnRhZ2VfOwotICBpbnQgZ2V0RnJlcXVlbmN5SHooKTsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkubmFuby5Qcm90byRSZXF1ZXN0JFZpYnJhdGlvbiBzZXREdXJhdGlvbk1zKGludCk7Ci0gIGludCBmcmVxdWVuY3lIel87Ci0gIGludCBiaXRGaWVsZDBfOwotICBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5uYW5vLlByb3RvJFJlcXVlc3QkVmlicmF0aW9uIGNsb25lKCk7Ci0gIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLm5hbm8uUHJvdG8kUmVxdWVzdCRWaWJyYXRpb24gY2xlYXIoKTsKLSAgIDxpbml0PigpOwotICBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5uYW5vLlByb3RvJFJlcXVlc3QkVmlicmF0aW9uIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKTsKLSAgaW50IGR1cmF0aW9uTXNfOwotICBjb20uZ29vZ2xlLnZyLnZyY29yZS5jb250cm9sbGVyLmFwaS5uYW5vLlByb3RvJFJlcXVlc3QkVmlicmF0aW9uIHNldEZyZXF1ZW5jeUh6KGludCk7Ci0gIGNvbS5nb29nbGUucHJvdG9idWYubmFuby5GaWVsZEFycmF5IHVua25vd25GaWVsZERhdGE7Ci0gIGludCBnZXRWb2x1bWVQZXJjZW50YWdlKCk7Ci0gIGNvbS5nb29nbGUudnIudnJjb3JlLmNvbnRyb2xsZXIuYXBpLm5hbm8uUHJvdG8kUmVxdWVzdCRWaWJyYXRpb25bXSBfZW1wdHlBcnJheTsKLSAgaW50IGdldER1cmF0aW9uTXMoKTsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUuY29udHJvbGxlci5hcGkubmFuby5Qcm90byRSZXF1ZXN0JFZpYnJhdGlvbiBzZXRWb2x1bWVQZXJjZW50YWdlKGludCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci52cmNvcmUubGlicmFyeS5hcGkuSUd2ckxheW91dCB7Ci0gIGJvb2xlYW4gZW5hYmxlQXN5bmNSZXByb2plY3Rpb24oaW50KTsKLSAgdm9pZCBvbkJhY2tQcmVzc2VkKCk7Ci0gIHZvaWQgb25QYXVzZSgpOwotICB2b2lkIHNldFN0ZXJlb01vZGVFbmFibGVkKGJvb2xlYW4pOwotICBjb20uZ29vZ2xlLnZyLnZyY29yZS5saWJyYXJ5LmFwaS5JT2JqZWN0V3JhcHBlciBnZXRSb290VmlldygpOwotICBjb20uZ29vZ2xlLnZyLnZyY29yZS5saWJyYXJ5LmFwaS5JR3ZyVWlMYXlvdXQgZ2V0VWlMYXlvdXQoKTsKLSAgbG9uZyBnZXROYXRpdmVHdnJDb250ZXh0KCk7Ci0gIHZvaWQgb25SZXN1bWUoKTsKLSAgYm9vbGVhbiBlbmFibGVDYXJkYm9hcmRUcmlnZ2VyRW11bGF0aW9uKGNvbS5nb29nbGUudnIudnJjb3JlLmxpYnJhcnkuYXBpLklPYmplY3RXcmFwcGVyKTsKLSAgYm9vbGVhbiBzZXRPbkRvbk5vdE5lZWRlZExpc3RlbmVyKGNvbS5nb29nbGUudnIudnJjb3JlLmxpYnJhcnkuYXBpLklPYmplY3RXcmFwcGVyKTsKLSAgdm9pZCBzaHV0ZG93bigpOwotICB2b2lkIHNldFJlZW50cnlJbnRlbnQoY29tLmdvb2dsZS52ci52cmNvcmUubGlicmFyeS5hcGkuSU9iamVjdFdyYXBwZXIpOwotICB2b2lkIHNldFByZXNlbnRhdGlvblZpZXcoY29tLmdvb2dsZS52ci52cmNvcmUubGlicmFyeS5hcGkuSU9iamVjdFdyYXBwZXIpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLmxpYnJhcnkuYXBpLklHdnJMYXlvdXQkU3R1YiB7Ci0gIHZvaWQgb25SZXN1bWUoKTsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUubGlicmFyeS5hcGkuSU9iamVjdFdyYXBwZXIgZ2V0Um9vdFZpZXcoKTsKLSAgdm9pZCBhdHRhY2hJbnRlcmZhY2UoYW5kcm9pZC5vcy5JSW50ZXJmYWNlLCBqYXZhLmxhbmcuU3RyaW5nKTsKLSAgdm9pZCBzZXRSZWVudHJ5SW50ZW50KGNvbS5nb29nbGUudnIudnJjb3JlLmxpYnJhcnkuYXBpLklPYmplY3RXcmFwcGVyKTsKLSAgIDxpbml0PigpOwotICBjb20uZ29vZ2xlLnZyLnZyY29yZS5saWJyYXJ5LmFwaS5JR3ZyVWlMYXlvdXQgZ2V0VWlMYXlvdXQoKTsKLSAgYm9vbGVhbiBlbmFibGVDYXJkYm9hcmRUcmlnZ2VyRW11bGF0aW9uKGNvbS5nb29nbGUudnIudnJjb3JlLmxpYnJhcnkuYXBpLklPYmplY3RXcmFwcGVyKTsKLSAgYm9vbGVhbiBzZXRPbkRvbk5vdE5lZWRlZExpc3RlbmVyKGNvbS5nb29nbGUudnIudnJjb3JlLmxpYnJhcnkuYXBpLklPYmplY3RXcmFwcGVyKTsKLSAgdm9pZCBzZXRQcmVzZW50YXRpb25WaWV3KGNvbS5nb29nbGUudnIudnJjb3JlLmxpYnJhcnkuYXBpLklPYmplY3RXcmFwcGVyKTsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUubGlicmFyeS5hcGkuSUd2ckxheW91dCBhc0ludGVyZmFjZShhbmRyb2lkLm9zLklCaW5kZXIpOwotICB2b2lkIG9uUGF1c2UoKTsKLSAgbG9uZyBnZXROYXRpdmVHdnJDb250ZXh0KCk7Ci0gIHZvaWQgc2h1dGRvd24oKTsKLSAgYm9vbGVhbiBlbmFibGVBc3luY1JlcHJvamVjdGlvbihpbnQpOwotICB2b2lkIHNldFN0ZXJlb01vZGVFbmFibGVkKGJvb2xlYW4pOwotICBib29sZWFuIHJvdXRlVG9TdXBlck9yRW5mb3JjZUludGVyZmFjZShpbnQsIGFuZHJvaWQub3MuUGFyY2VsLCBhbmRyb2lkLm9zLlBhcmNlbCwgaW50KTsKLSAgdm9pZCBvbkJhY2tQcmVzc2VkKCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci52cmNvcmUubGlicmFyeS5hcGkuSUd2ckxheW91dCRTdHViJFByb3h5IHsKLSAgYW5kcm9pZC5vcy5QYXJjZWwgb2J0YWluQW5kV3JpdGVJbnRlcmZhY2VUb2tlbigpOwotICB2b2lkIHRyYW5zYWN0QW5kUmVhZEV4Y2VwdGlvblJldHVyblZvaWQoaW50LCBhbmRyb2lkLm9zLlBhcmNlbCk7Ci0gIGFuZHJvaWQub3MuUGFyY2VsIHRyYW5zYWN0QW5kUmVhZEV4Y2VwdGlvbihpbnQsIGFuZHJvaWQub3MuUGFyY2VsKTsKLSAgIDxpbml0PihhbmRyb2lkLm9zLklCaW5kZXIpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLmxpYnJhcnkuYXBpLklHdnJVaUxheW91dCB7Ci0gIHZvaWQgc2V0RW5hYmxlZChib29sZWFuKTsKLSAgdm9pZCBzZXRTZXR0aW5nc0J1dHRvbkxpc3RlbmVyKGNvbS5nb29nbGUudnIudnJjb3JlLmxpYnJhcnkuYXBpLklPYmplY3RXcmFwcGVyKTsKLSAgdm9pZCBzZXRUcmFuc2l0aW9uVmlld0VuYWJsZWQoYm9vbGVhbik7Ci0gIHZvaWQgc2V0U2V0dGluZ3NCdXR0b25FbmFibGVkKGJvb2xlYW4pOwotICB2b2lkIHNldFZpZXdlck5hbWUoamF2YS5sYW5nLlN0cmluZyk7Ci0gIHZvaWQgc2V0VHJhbnNpdGlvblZpZXdMaXN0ZW5lcihjb20uZ29vZ2xlLnZyLnZyY29yZS5saWJyYXJ5LmFwaS5JT2JqZWN0V3JhcHBlcik7Ci0gIHZvaWQgc2V0Q2xvc2VCdXR0b25MaXN0ZW5lcihjb20uZ29vZ2xlLnZyLnZyY29yZS5saWJyYXJ5LmFwaS5JT2JqZWN0V3JhcHBlcik7Ci0gIGJvb2xlYW4gaXNFbmFibGVkKCk7Ci0gIGNvbS5nb29nbGUudnIudnJjb3JlLmxpYnJhcnkuYXBpLklPYmplY3RXcmFwcGVyIGdldFJvb3RWaWV3KCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci52cmNvcmUubGlicmFyeS5hcGkuSUd2clVpTGF5b3V0JFN0dWIgewotICB2b2lkIHNldFRyYW5zaXRpb25WaWV3TGlzdGVuZXIoY29tLmdvb2dsZS52ci52cmNvcmUubGlicmFyeS5hcGkuSU9iamVjdFdyYXBwZXIpOwotICBjb20uZ29vZ2xlLnZyLnZyY29yZS5saWJyYXJ5LmFwaS5JR3ZyVWlMYXlvdXQgYXNJbnRlcmZhY2UoYW5kcm9pZC5vcy5JQmluZGVyKTsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUubGlicmFyeS5hcGkuSU9iamVjdFdyYXBwZXIgZ2V0Um9vdFZpZXcoKTsKLSAgdm9pZCBzZXRTZXR0aW5nc0J1dHRvbkVuYWJsZWQoYm9vbGVhbik7Ci0gIHZvaWQgc2V0U2V0dGluZ3NCdXR0b25MaXN0ZW5lcihjb20uZ29vZ2xlLnZyLnZyY29yZS5saWJyYXJ5LmFwaS5JT2JqZWN0V3JhcHBlcik7Ci0gIHZvaWQgYXR0YWNoSW50ZXJmYWNlKGFuZHJvaWQub3MuSUludGVyZmFjZSwgamF2YS5sYW5nLlN0cmluZyk7Ci0gIHZvaWQgc2V0RW5hYmxlZChib29sZWFuKTsKLSAgdm9pZCBzZXRDbG9zZUJ1dHRvbkxpc3RlbmVyKGNvbS5nb29nbGUudnIudnJjb3JlLmxpYnJhcnkuYXBpLklPYmplY3RXcmFwcGVyKTsKLSAgYm9vbGVhbiBpc0VuYWJsZWQoKTsKLSAgdm9pZCBzZXRUcmFuc2l0aW9uVmlld0VuYWJsZWQoYm9vbGVhbik7Ci0gICA8aW5pdD4oKTsKLSAgdm9pZCBzZXRWaWV3ZXJOYW1lKGphdmEubGFuZy5TdHJpbmcpOwotICBib29sZWFuIHJvdXRlVG9TdXBlck9yRW5mb3JjZUludGVyZmFjZShpbnQsIGFuZHJvaWQub3MuUGFyY2VsLCBhbmRyb2lkLm9zLlBhcmNlbCwgaW50KTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnZyY29yZS5saWJyYXJ5LmFwaS5JR3ZyVWlMYXlvdXQkU3R1YiRQcm94eSB7Ci0gIHZvaWQgdHJhbnNhY3RBbmRSZWFkRXhjZXB0aW9uUmV0dXJuVm9pZChpbnQsIGFuZHJvaWQub3MuUGFyY2VsKTsKLSAgYW5kcm9pZC5vcy5QYXJjZWwgb2J0YWluQW5kV3JpdGVJbnRlcmZhY2VUb2tlbigpOwotICBhbmRyb2lkLm9zLlBhcmNlbCB0cmFuc2FjdEFuZFJlYWRFeGNlcHRpb24oaW50LCBhbmRyb2lkLm9zLlBhcmNlbCk7Ci0gICA8aW5pdD4oYW5kcm9pZC5vcy5JQmluZGVyKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnZyY29yZS5saWJyYXJ5LmFwaS5JT2JqZWN0V3JhcHBlciB7Ci0gIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLmxpYnJhcnkuYXBpLklPYmplY3RXcmFwcGVyJFN0dWIgewotICB2b2lkIGF0dGFjaEludGVyZmFjZShhbmRyb2lkLm9zLklJbnRlcmZhY2UsIGphdmEubGFuZy5TdHJpbmcpOwotICAgPGluaXQ+KCk7Ci0gIGNvbS5nb29nbGUudnIudnJjb3JlLmxpYnJhcnkuYXBpLklPYmplY3RXcmFwcGVyIGFzSW50ZXJmYWNlKGFuZHJvaWQub3MuSUJpbmRlcik7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci52cmNvcmUubGlicmFyeS5hcGkuSU9iamVjdFdyYXBwZXIkU3R1YiRQcm94eSB7Ci0gICA8aW5pdD4oYW5kcm9pZC5vcy5JQmluZGVyKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnZyY29yZS5saWJyYXJ5LmFwaS5JVnJDcmVhdG9yIHsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUubGlicmFyeS5hcGkuSVZyTmF0aXZlTGlicmFyeUxvYWRlciBuZXdOYXRpdmVMaWJyYXJ5TG9hZGVyKGNvbS5nb29nbGUudnIudnJjb3JlLmxpYnJhcnkuYXBpLklPYmplY3RXcmFwcGVyLCBjb20uZ29vZ2xlLnZyLnZyY29yZS5saWJyYXJ5LmFwaS5JT2JqZWN0V3JhcHBlcik7Ci0gIGNvbS5nb29nbGUudnIudnJjb3JlLmxpYnJhcnkuYXBpLklHdnJMYXlvdXQgbmV3R3ZyTGF5b3V0KGNvbS5nb29nbGUudnIudnJjb3JlLmxpYnJhcnkuYXBpLklPYmplY3RXcmFwcGVyLCBjb20uZ29vZ2xlLnZyLnZyY29yZS5saWJyYXJ5LmFwaS5JT2JqZWN0V3JhcHBlcik7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci52cmNvcmUubGlicmFyeS5hcGkuSVZyQ3JlYXRvciRTdHViIHsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUubGlicmFyeS5hcGkuSVZyQ3JlYXRvciBhc0ludGVyZmFjZShhbmRyb2lkLm9zLklCaW5kZXIpOwotICBjb20uZ29vZ2xlLnZyLnZyY29yZS5saWJyYXJ5LmFwaS5JVnJOYXRpdmVMaWJyYXJ5TG9hZGVyIERFUFJFQ0FURURfbmV3TmF0aXZlTGlicmFyeUxvYWRlcihjb20uZ29vZ2xlLnZyLnZyY29yZS5saWJyYXJ5LmFwaS5JT2JqZWN0V3JhcHBlcik7Ci0gIGNvbS5nb29nbGUudnIudnJjb3JlLmxpYnJhcnkuYXBpLklHdnJMYXlvdXQgbmV3R3ZyTGF5b3V0KGNvbS5nb29nbGUudnIudnJjb3JlLmxpYnJhcnkuYXBpLklPYmplY3RXcmFwcGVyLCBjb20uZ29vZ2xlLnZyLnZyY29yZS5saWJyYXJ5LmFwaS5JT2JqZWN0V3JhcHBlcik7Ci0gIHZvaWQgYXR0YWNoSW50ZXJmYWNlKGFuZHJvaWQub3MuSUludGVyZmFjZSwgamF2YS5sYW5nLlN0cmluZyk7Ci0gIGJvb2xlYW4gcm91dGVUb1N1cGVyT3JFbmZvcmNlSW50ZXJmYWNlKGludCwgYW5kcm9pZC5vcy5QYXJjZWwsIGFuZHJvaWQub3MuUGFyY2VsLCBpbnQpOwotICBjb20uZ29vZ2xlLnZyLnZyY29yZS5saWJyYXJ5LmFwaS5JVnJOYXRpdmVMaWJyYXJ5TG9hZGVyIG5ld05hdGl2ZUxpYnJhcnlMb2FkZXIoY29tLmdvb2dsZS52ci52cmNvcmUubGlicmFyeS5hcGkuSU9iamVjdFdyYXBwZXIsIGNvbS5nb29nbGUudnIudnJjb3JlLmxpYnJhcnkuYXBpLklPYmplY3RXcmFwcGVyKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnZyY29yZS5saWJyYXJ5LmFwaS5JVnJDcmVhdG9yJFN0dWIkUHJveHkgewotICAgPGluaXQ+KGFuZHJvaWQub3MuSUJpbmRlcik7Ci0gIGFuZHJvaWQub3MuUGFyY2VsIHRyYW5zYWN0QW5kUmVhZEV4Y2VwdGlvbihpbnQsIGFuZHJvaWQub3MuUGFyY2VsKTsKLSAgYW5kcm9pZC5vcy5QYXJjZWwgb2J0YWluQW5kV3JpdGVJbnRlcmZhY2VUb2tlbigpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLmxpYnJhcnkuYXBpLklWck5hdGl2ZUxpYnJhcnlMb2FkZXIgewotICBsb25nIGxvYWROYXRpdmVHdnJMaWJyYXJ5KGludCwgaW50LCBpbnQpOwotICBsb25nIGxvYWROYXRpdmVHdnJMaWJyYXJ5V2l0aE1pblZlcnNpb24oamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZyk7Ci0gIGxvbmcgbG9hZE5hdGl2ZURsc3ltTWV0aG9kKCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci52cmNvcmUubGlicmFyeS5hcGkuSVZyTmF0aXZlTGlicmFyeUxvYWRlciRTdHViIHsKLSAgdm9pZCBjbG9zZU5hdGl2ZUd2ckxpYnJhcnkobG9uZyk7Ci0gIGxvbmcgbG9hZE5hdGl2ZUd2ckxpYnJhcnlXaXRoTWluVmVyc2lvbihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKTsKLSAgbG9uZyBsb2FkTmF0aXZlRGxzeW1NZXRob2QoKTsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUubGlicmFyeS5hcGkuSVZyTmF0aXZlTGlicmFyeUxvYWRlciBhc0ludGVyZmFjZShhbmRyb2lkLm9zLklCaW5kZXIpOwotICBsb25nIGxvYWROYXRpdmVHdnJMaWJyYXJ5KGludCwgaW50LCBpbnQpOwotICB2b2lkIGF0dGFjaEludGVyZmFjZShhbmRyb2lkLm9zLklJbnRlcmZhY2UsIGphdmEubGFuZy5TdHJpbmcpOwotICBib29sZWFuIHJvdXRlVG9TdXBlck9yRW5mb3JjZUludGVyZmFjZShpbnQsIGFuZHJvaWQub3MuUGFyY2VsLCBhbmRyb2lkLm9zLlBhcmNlbCwgaW50KTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnZyY29yZS5saWJyYXJ5LmFwaS5JVnJOYXRpdmVMaWJyYXJ5TG9hZGVyJFN0dWIkUHJveHkgewotICBhbmRyb2lkLm9zLlBhcmNlbCBvYnRhaW5BbmRXcml0ZUludGVyZmFjZVRva2VuKCk7Ci0gIHZvaWQgdHJhbnNhY3RBbmRSZWFkRXhjZXB0aW9uUmV0dXJuVm9pZChpbnQsIGFuZHJvaWQub3MuUGFyY2VsKTsKLSAgYW5kcm9pZC5vcy5QYXJjZWwgdHJhbnNhY3RBbmRSZWFkRXhjZXB0aW9uKGludCwgYW5kcm9pZC5vcy5QYXJjZWwpOwotICAgPGluaXQ+KGFuZHJvaWQub3MuSUJpbmRlcik7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci52cmNvcmUubGlicmFyeS5hcGkuT2JqZWN0V3JhcHBlciB7Ci0gIGphdmEubGFuZy5PYmplY3Qgd3JhcHBlZE9iamVjdDsKLSAgamF2YS5sYW5nLk9iamVjdCB1bndyYXAoY29tLmdvb2dsZS52ci52cmNvcmUubGlicmFyeS5hcGkuSU9iamVjdFdyYXBwZXIsIGphdmEubGFuZy5DbGFzcyk7Ci0gICA8aW5pdD4oamF2YS5sYW5nLk9iamVjdCk7Ci0gIGNvbS5nb29nbGUudnIudnJjb3JlLmxpYnJhcnkuYXBpLklPYmplY3RXcmFwcGVyIHdyYXAoamF2YS5sYW5nLk9iamVjdCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci52cmNvcmUubGlicmFyeS5hcGkuVnJDb3JlTG9hZGVyIHsKLSAgamF2YS5sYW5nLlN0cmluZyBUQUc7Ci0gIGludCBnZXRSZW1vdGVDb250ZXh0Q2xpZW50QXBpVmVyc2lvbihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCk7Ci0gIGNvbS5nb29nbGUudnIudnJjb3JlLmxpYnJhcnkuYXBpLklWckNyZWF0b3IgZ2V0UmVtb3RlQ3JlYXRvcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCk7Ci0gIGNvbS5nb29nbGUudnIudnJjb3JlLmxpYnJhcnkuYXBpLklWckNyZWF0b3Igc0NyZWF0b3I7Ci0gIGludCBzUmVtb3RlQ29udGV4dEFwaVZlcnNpb247Ci0gIGFuZHJvaWQuY29udGVudC5Db250ZXh0IHNSZW1vdGVDb250ZXh0OwotICBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBnZXRSZW1vdGVDb250ZXh0KGFuZHJvaWQuY29udGVudC5Db250ZXh0KTsKLSAgYW5kcm9pZC5vcy5JQmluZGVyIG5ld0JpbmRlckluc3RhbmNlKGphdmEubGFuZy5DbGFzc0xvYWRlciwgamF2YS5sYW5nLlN0cmluZyk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci52cmNvcmUubG9nZ2luZy5hcGkuSVZyQ29yZUxvZ2dpbmdTZXJ2aWNlIHsKLSAgdm9pZCBsb2coY29tLmdvb2dsZS52ci52cmNvcmUubG9nZ2luZy5hcGkuVlJFdmVudFBhcmNlbGFibGUpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLmxvZ2dpbmcuYXBpLklWckNvcmVMb2dnaW5nU2VydmljZSRTdHViIHsKLSAgdm9pZCBsb2dCYXRjaGVkKGNvbS5nb29nbGUudnIudnJjb3JlLmxvZ2dpbmcuYXBpLlZSRXZlbnRQYXJjZWxhYmxlW10pOwotICB2b2lkIGF0dGFjaEludGVyZmFjZShhbmRyb2lkLm9zLklJbnRlcmZhY2UsIGphdmEubGFuZy5TdHJpbmcpOwotICBjb20uZ29vZ2xlLnZyLnZyY29yZS5sb2dnaW5nLmFwaS5JVnJDb3JlTG9nZ2luZ1NlcnZpY2UgYXNJbnRlcmZhY2UoYW5kcm9pZC5vcy5JQmluZGVyKTsKLSAgdm9pZCBsb2coY29tLmdvb2dsZS52ci52cmNvcmUubG9nZ2luZy5hcGkuVlJFdmVudFBhcmNlbGFibGUpOwotICBib29sZWFuIHJvdXRlVG9TdXBlck9yRW5mb3JjZUludGVyZmFjZShpbnQsIGFuZHJvaWQub3MuUGFyY2VsLCBhbmRyb2lkLm9zLlBhcmNlbCwgaW50KTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnZyY29yZS5sb2dnaW5nLmFwaS5JVnJDb3JlTG9nZ2luZ1NlcnZpY2UkU3R1YiRQcm94eSB7Ci0gIHZvaWQgdHJhbnNhY3RPbmV3YXkoaW50LCBhbmRyb2lkLm9zLlBhcmNlbCk7Ci0gIGFuZHJvaWQub3MuUGFyY2VsIG9idGFpbkFuZFdyaXRlSW50ZXJmYWNlVG9rZW4oKTsKLSAgIDxpbml0PihhbmRyb2lkLm9zLklCaW5kZXIpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLmxvZ2dpbmcuYXBpLlZSRXZlbnRQYXJjZWxhYmxlIHsKLSAgIDxpbml0PihpbnQsIGNvbS5nb29nbGUuY29tbW9uLmxvZ2dpbmcubmFuby5WciRWUkV2ZW50KTsKLSAgY29tLmdvb2dsZS5jb21tb24ubG9nZ2luZy5uYW5vLlZyJFZSRXZlbnQgZXZlbnQ7Ci0gIGludCBldmVudENvZGU7Ci0gICA8aW5pdD4oYW5kcm9pZC5vcy5QYXJjZWwpOwotICBqYXZhLmxhbmcuU3RyaW5nIFRBRzsKLSAgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUjsKLSAgIDxpbml0PihhbmRyb2lkLm9zLlBhcmNlbCwgY29tLmdvb2dsZS52ci52cmNvcmUubG9nZ2luZy5hcGkuVlJFdmVudFBhcmNlbGFibGUkMSk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci52cmNvcmUubG9nZ2luZy5hcGkuVlJFdmVudFBhcmNlbGFibGUkMSB7Ci0gIGNvbS5nb29nbGUudnIudnJjb3JlLmxvZ2dpbmcuYXBpLlZSRXZlbnRQYXJjZWxhYmxlW10gbmV3QXJyYXkoaW50KTsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUubG9nZ2luZy5hcGkuVlJFdmVudFBhcmNlbGFibGUgY3JlYXRlRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCk7Ci0gICA8aW5pdD4oKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnZyY29yZS5wZXJmb3JtYW5jZS5hcGkuSVBlcmZvcm1hbmNlU2VydmljZSB7Ci0gIHZvaWQgYWRkVHJpZ2dlcihhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSwgY29tLmdvb2dsZS52ci52cmNvcmUucGVyZm9ybWFuY2UuYXBpLklUaHJvdHRsaW5nVHJpZ2dlckNhbGxiYWNrLCBsb25nLCBmbG9hdCwgaW50KTsKLSAgbG9uZyBnZXRDdXJyZW50RXN0aW1hdGVkVGhyb3R0bGVXYXJuaW5nVGltZSgpOwotICB2b2lkIGdldEN1cnJlbnRUaHJvdHRsaW5nUmVsYXRpdmVUZW1wZXJhdHVyZShjb20uZ29vZ2xlLnZyLnZyY29yZS5wZXJmb3JtYW5jZS5hcGkuVGltZXN0YW1wZWRUZW1wZXJhdHVyZSk7Ci0gIHZvaWQgcmVtb3ZlQWxsVHJpZ2dlcnMoYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnIudnJjb3JlLnBlcmZvcm1hbmNlLmFwaS5JUGVyZm9ybWFuY2VTZXJ2aWNlJFN0dWIgewotICB2b2lkIGdldEN1cnJlbnRUaHJvdHRsaW5nUmVsYXRpdmVUZW1wZXJhdHVyZShjb20uZ29vZ2xlLnZyLnZyY29yZS5wZXJmb3JtYW5jZS5hcGkuVGltZXN0YW1wZWRUZW1wZXJhdHVyZSk7Ci0gIGNvbS5nb29nbGUudnIudnJjb3JlLnBlcmZvcm1hbmNlLmFwaS5JUGVyZm9ybWFuY2VTZXJ2aWNlIGFzSW50ZXJmYWNlKGFuZHJvaWQub3MuSUJpbmRlcik7Ci0gIHZvaWQgYWRkVHJpZ2dlcihhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSwgY29tLmdvb2dsZS52ci52cmNvcmUucGVyZm9ybWFuY2UuYXBpLklUaHJvdHRsaW5nVHJpZ2dlckNhbGxiYWNrLCBsb25nLCBmbG9hdCwgaW50KTsKLSAgbG9uZyBnZXRDdXJyZW50RXN0aW1hdGVkVGhyb3R0bGVXYXJuaW5nVGltZSgpOwotICBib29sZWFuIHJvdXRlVG9TdXBlck9yRW5mb3JjZUludGVyZmFjZShpbnQsIGFuZHJvaWQub3MuUGFyY2VsLCBhbmRyb2lkLm9zLlBhcmNlbCwgaW50KTsKLSAgdm9pZCByZW1vdmVBbGxUcmlnZ2VycyhhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSk7Ci0gIHZvaWQgYXR0YWNoSW50ZXJmYWNlKGFuZHJvaWQub3MuSUludGVyZmFjZSwgamF2YS5sYW5nLlN0cmluZyk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci52cmNvcmUucGVyZm9ybWFuY2UuYXBpLklQZXJmb3JtYW5jZVNlcnZpY2UkU3R1YiRQcm94eSB7Ci0gIHZvaWQgdHJhbnNhY3RBbmRSZWFkRXhjZXB0aW9uUmV0dXJuVm9pZChpbnQsIGFuZHJvaWQub3MuUGFyY2VsKTsKLSAgIDxpbml0PihhbmRyb2lkLm9zLklCaW5kZXIpOwotICBhbmRyb2lkLm9zLlBhcmNlbCBvYnRhaW5BbmRXcml0ZUludGVyZmFjZVRva2VuKCk7Ci0gIGFuZHJvaWQub3MuUGFyY2VsIHRyYW5zYWN0QW5kUmVhZEV4Y2VwdGlvbihpbnQsIGFuZHJvaWQub3MuUGFyY2VsKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnZyY29yZS5wZXJmb3JtYW5jZS5hcGkuSVRocm90dGxpbmdUcmlnZ2VyQ2FsbGJhY2skU3R1YiB7Ci0gIHZvaWQgb25UcmlnZ2VyQWN0aXZhdGVkKGZsb2F0LCBsb25nKTsKLSAgIDxpbml0PigpOwotICBjb20uZ29vZ2xlLnZyLnZyY29yZS5wZXJmb3JtYW5jZS5hcGkuSVRocm90dGxpbmdUcmlnZ2VyQ2FsbGJhY2sgYXNJbnRlcmZhY2UoYW5kcm9pZC5vcy5JQmluZGVyKTsKLSAgYm9vbGVhbiByb3V0ZVRvU3VwZXJPckVuZm9yY2VJbnRlcmZhY2UoaW50LCBhbmRyb2lkLm9zLlBhcmNlbCwgYW5kcm9pZC5vcy5QYXJjZWwsIGludCk7Ci0gIHZvaWQgYXR0YWNoSW50ZXJmYWNlKGFuZHJvaWQub3MuSUludGVyZmFjZSwgamF2YS5sYW5nLlN0cmluZyk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgY29tLmdvb2dsZS52ci52cmNvcmUucGVyZm9ybWFuY2UuYXBpLklUaHJvdHRsaW5nVHJpZ2dlckNhbGxiYWNrJFN0dWIkUHJveHkgewotICB2b2lkIHRyYW5zYWN0T25ld2F5KGludCwgYW5kcm9pZC5vcy5QYXJjZWwpOwotICBhbmRyb2lkLm9zLlBhcmNlbCBvYnRhaW5BbmRXcml0ZUludGVyZmFjZVRva2VuKCk7Ci0gICA8aW5pdD4oYW5kcm9pZC5vcy5JQmluZGVyKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnZyY29yZS5wZXJmb3JtYW5jZS5hcGkuVGltZXN0YW1wZWRUZW1wZXJhdHVyZSB7Ci0gICA8aW5pdD4oKTsKLSAgZmxvYXQgdGVtcGVyYXR1cmU7Ci0gIHZvaWQgc2V0KGxvbmcsIGZsb2F0KTsKLSAgdm9pZCByZWFkRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCk7Ci0gIGxvbmcgdGltZXN0YW1wOwotICAgPGluaXQ+KGFuZHJvaWQub3MuUGFyY2VsKTsKLSAgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUjsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZyLnZyY29yZS5wZXJmb3JtYW5jZS5hcGkuVGltZXN0YW1wZWRUZW1wZXJhdHVyZSQxIHsKLSAgY29tLmdvb2dsZS52ci52cmNvcmUucGVyZm9ybWFuY2UuYXBpLlRpbWVzdGFtcGVkVGVtcGVyYXR1cmUgY3JlYXRlRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCk7Ci0gIGNvbS5nb29nbGUudnIudnJjb3JlLnBlcmZvcm1hbmNlLmFwaS5UaW1lc3RhbXBlZFRlbXBlcmF0dXJlW10gbmV3QXJyYXkoaW50KTsKLSAgIDxpbml0PigpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGNvbS5nb29nbGUudnJ0b29sa2l0LmNhcmRib2FyZC5TY3JlZW5PbkZsYWdIZWxwZXIgewotICBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvciBzZW5zb3I7Ci0gIGJvb2xlYW4gc2NyZWVuQWx3YXlzT247Ci0gIGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yTWFuYWdlciBzZW5zb3JNYW5hZ2VyOwotICBhbmRyb2lkLmFwcC5BY3Rpdml0eSBhY3Rpdml0eTsKLSAgY29tLmdvb2dsZS52cnRvb2xraXQuY2FyZGJvYXJkLlNlbnNvclJlYWRpbmdTdGF0cyBzZW5zb3JTdGF0czsKLSAgbG9uZyBsYXN0U2FtcGxlVGltZXN0YW1wOwotICB2b2lkIHNldEtlZXBTY3JlZW5PbkZsYWcoYm9vbGVhbik7Ci0gIHZvaWQgdXBkYXRlRmxhZygpOwotICBib29sZWFuIGlzRmxhZ1NldDsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBjb20uZ29vZ2xlLnZydG9vbGtpdC5jYXJkYm9hcmQuU2Vuc29yUmVhZGluZ1N0YXRzIHsKLSAgdm9pZCByZXNldCgpOwotICBib29sZWFuIHN0YXRzQXZhaWxhYmxlKCk7Ci0gIGludCB3cml0ZVBvczsKLSAgZmxvYXRbXVtdIHNhbXBsZUJ1ZjsKLSAgaW50IG51bUF4ZXM7Ci0gIGludCBzYW1wbGVzQWRkZWQ7Ci0gICA8aW5pdD4oaW50LCBpbnQpOwotICB2b2lkIGFkZFNhbXBsZShmbG9hdFtdKTsKLSAgZmxvYXQgZ2V0TWF4QWJzb2x1dGVEZXZpYXRpb24oKTsKLSAgaW50IHNhbXBsZUJ1ZlNpemU7Ci0gIGZsb2F0IGdldEF2ZXJhZ2UoaW50KTsKLSAgamF2YS5sYW5nLlN0cmluZyBUQUc7Ci0gIGZsb2F0IGdldE1heEFic29sdXRlRGV2aWF0aW9uKGludCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgbG9ncy5wcm90by53aXJlbGVzcy5wZXJmb3JtYW5jZS5tb2JpbGUubmFuby5NZW1vcnlNZXRyaWMkQW5kcm9pZE1lbW9yeVN0YXRzIHsKLSAgamF2YS5sYW5nLkludGVnZXIgbmF0aXZlUHNzS2I7Ci0gICA8aW5pdD4oKTsKLSAgamF2YS5sYW5nLkludGVnZXIgZGFsdmlrUHNzS2I7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIHRvdGFsU3dhcHBhYmxlUHNzS2I7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIHN1bW1hcnlDb2RlS2I7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIHRvdGFsTWVtb3J5TWI7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIHN1bW1hcnlTeXN0ZW1LYjsKLSAgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkZpZWxkQXJyYXkgdW5rbm93bkZpZWxkRGF0YTsKLSAgamF2YS5sYW5nLkludGVnZXIgb3RoZXJHcmFwaGljc1Bzc0tiOwotICBqYXZhLmxhbmcuSW50ZWdlciBhdmFpbGFibGVNZW1vcnlLYjsKLSAgamF2YS5sYW5nLkludGVnZXIgbmF0aXZlUHJpdmF0ZURpcnR5S2I7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIHN1bW1hcnlQcml2YXRlT3RoZXJLYjsKLSAgamF2YS5sYW5nLkludGVnZXIgc3VtbWFyeVN0YWNrS2I7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIHRvdGFsUHJpdmF0ZUNsZWFuS2I7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIHRvdGFsU2hhcmVkRGlydHlLYjsKLSAgbG9ncy5wcm90by53aXJlbGVzcy5wZXJmb3JtYW5jZS5tb2JpbGUubmFuby5NZW1vcnlNZXRyaWMkQW5kcm9pZE1lbW9yeVN0YXRzIGNsZWFyKCk7Ci0gIGxvZ3MucHJvdG8ud2lyZWxlc3MucGVyZm9ybWFuY2UubW9iaWxlLm5hbm8uTWVtb3J5TWV0cmljJEFuZHJvaWRNZW1vcnlTdGF0cyBjbG9uZSgpOwotICBsb2dzLnByb3RvLndpcmVsZXNzLnBlcmZvcm1hbmNlLm1vYmlsZS5uYW5vLk1lbW9yeU1ldHJpYyRBbmRyb2lkTWVtb3J5U3RhdHMgbWVyZ2VGcm9tKGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8pOwotICBpbnQgY2FjaGVkU2l6ZTsKLSAgamF2YS5sYW5nLkludGVnZXIgb3RoZXJQc3NLYjsKLSAgamF2YS5sYW5nLkludGVnZXIgc3VtbWFyeUdyYXBoaWNzS2I7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIGRhbHZpa1ByaXZhdGVEaXJ0eUtiOwotICBqYXZhLmxhbmcuSW50ZWdlciBzdW1tYXJ5SmF2YUhlYXBLYjsKLSAgamF2YS5sYW5nLkludGVnZXIgb3RoZXJQcml2YXRlRGlydHlLYjsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuY29ubi5zc2wuQWJzdHJhY3RWZXJpZmllciB7Ci0gICA8aW5pdD4oKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuY29ubi5zc2wuU1NMU29ja2V0RmFjdG9yeSB7Ci0gIG9yZy5hcGFjaGUuaHR0cC5jb25uLnNzbC5YNTA5SG9zdG5hbWVWZXJpZmllciBTVFJJQ1RfSE9TVE5BTUVfVkVSSUZJRVI7Ci0gIG9yZy5hcGFjaGUuaHR0cC5jb25uLnNzbC5YNTA5SG9zdG5hbWVWZXJpZmllciBCUk9XU0VSX0NPTVBBVElCTEVfSE9TVE5BTUVfVkVSSUZJRVI7Ci0gIG9yZy5hcGFjaGUuaHR0cC5jb25uLnNzbC5YNTA5SG9zdG5hbWVWZXJpZmllciBBTExPV19BTExfSE9TVE5BTUVfVkVSSUZJRVI7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmJhc2UuQXBpQ29tcGF0aWJpbGl0eVV0aWxzIHsKLSAgaW50IGNoZWNrUGVybWlzc2lvbihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgamF2YS5sYW5nLlN0cmluZywgaW50LCBpbnQpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5iYXNlLkFwcGxpY2F0aW9uU3RhdHVzIHsKLSAgYW5kcm9pZC5hcHAuQWN0aXZpdHkgZ2V0TGFzdFRyYWNrZWRGb2N1c2VkQWN0aXZpdHkoKTsKLSAgdm9pZCByZWdpc3RlclN0YXRlTGlzdGVuZXJGb3JBbGxBY3Rpdml0aWVzKG9yZy5jaHJvbWl1bS5iYXNlLkFwcGxpY2F0aW9uU3RhdHVzJEFjdGl2aXR5U3RhdGVMaXN0ZW5lcik7Ci0gIGludCBnZXRTdGF0ZUZvckFjdGl2aXR5KGFuZHJvaWQuYXBwLkFjdGl2aXR5KTsKLSAgdm9pZCByZWdpc3RlclN0YXRlTGlzdGVuZXJGb3JBY3Rpdml0eShvcmcuY2hyb21pdW0uYmFzZS5BcHBsaWNhdGlvblN0YXR1cyRBY3Rpdml0eVN0YXRlTGlzdGVuZXIsIGFuZHJvaWQuYXBwLkFjdGl2aXR5KTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uYmFzZS5Db250ZXh0VXRpbHMgewotICBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBnZXRBcHBsaWNhdGlvbkNvbnRleHQoKTsKLSAgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzIGdldEFwcFNoYXJlZFByZWZlcmVuY2VzKCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmJhc2UuTG9nIHsKLSAgdm9pZCBpKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3RbXSk7Ci0gIHZvaWQgZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0W10pOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5iYXNlLlBhY2thZ2VVdGlscyB7Ci0gIGludCBnZXRQYWNrYWdlVmVyc2lvbihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgamF2YS5sYW5nLlN0cmluZyk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmJhc2UuU3RyaWN0TW9kZUNvbnRleHQgewotICB2b2lkIGNsb3NlKCk7Ci0gIG9yZy5jaHJvbWl1bS5iYXNlLlN0cmljdE1vZGVDb250ZXh0IGFsbG93RGlza1dyaXRlcygpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5iYXNlLlRocmVhZFV0aWxzIHsKLSAgdm9pZCBhc3NlcnRPblVpVGhyZWFkKCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmJhc2UuVHJhY2VFdmVudCB7Ci0gIHZvaWQgY2xvc2UoKTsKLSAgb3JnLmNocm9taXVtLmJhc2UuVHJhY2VFdmVudCBzY29wZWQoamF2YS5sYW5nLlN0cmluZyk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmJhc2UubGlicmFyeV9sb2FkZXIuTGlicmFyeUxvYWRlciB7Ci0gIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpOwotICBvcmcuY2hyb21pdW0uYmFzZS5saWJyYXJ5X2xvYWRlci5MaWJyYXJ5TG9hZGVyIGdldEluc3RhbmNlKCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmJhc2UubWV0cmljcy5DYWNoZWRNZXRyaWNzJEJvb2xlYW5IaXN0b2dyYW1TYW1wbGUgewotICB2b2lkIHJlY29yZChib29sZWFuKTsKLSAgIDxpbml0PihqYXZhLmxhbmcuU3RyaW5nKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uYmFzZS5tZXRyaWNzLlJlY29yZFVzZXJBY3Rpb24gewotICB2b2lkIHJlY29yZChqYXZhLmxhbmcuU3RyaW5nKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uYmFzZS50YXNrLkFzeW5jVGFzayB7Ci0gIGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yIFRIUkVBRF9QT09MX0VYRUNVVE9SOwotICAgPGluaXQ+KCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmJhc2UudGFzay5Qb3N0VGFzayB7Ci0gIGphdmEubGFuZy5PYmplY3QgcnVuU3luY2hyb25vdXNseShvcmcuY2hyb21pdW0uYmFzZS50YXNrLlRhc2tUcmFpdHMsIGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlKTsKLSAgdm9pZCBydW5TeW5jaHJvbm91c2x5KG9yZy5jaHJvbWl1bS5iYXNlLnRhc2suVGFza1RyYWl0cywgamF2YS5sYW5nLlJ1bm5hYmxlKTsKLSAgdm9pZCBwb3N0VGFzayhvcmcuY2hyb21pdW0uYmFzZS50YXNrLlRhc2tUcmFpdHMsIGphdmEubGFuZy5SdW5uYWJsZSk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmJ1aWxkLkJ1aWxkSG9va3NBbmRyb2lkIHsKLSAgYm9vbGVhbiBpc0VuYWJsZWRJbXBsKCk7Ci0gIHZvaWQgaW5pdEN1c3RvbVJlc291cmNlc0ltcGwoYW5kcm9pZC5jb250ZW50LkNvbnRleHQpOwotICBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBjcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEltcGwoYW5kcm9pZC5jb250ZW50LkNvbnRleHQpOwotICB2b2lkIG1heWJlUmVjb3JkUmVzb3VyY2VNZXRyaWNzSW1wbCgpOwotICBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcyBnZXRSZXNvdXJjZXNJbXBsKGFuZHJvaWQuY29udGVudC5Db250ZXh0KTsKLSAgb3JnLmNocm9taXVtLmJ1aWxkLkJ1aWxkSG9va3NBbmRyb2lkIGdldCgpOwotICBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcyRUaGVtZSBnZXRUaGVtZUltcGwoYW5kcm9pZC5jb250ZW50LkNvbnRleHQpOwotICBpbnQgZ2V0SWRlbnRpZmllckltcGwoYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpOwotICBvcmcuY2hyb21pdW0uYnVpbGQuQnVpbGRIb29rc0FuZHJvaWQgc0luc3RhbmNlOwotICBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlciBnZXRBc3NldHNJbXBsKGFuZHJvaWQuY29udGVudC5Db250ZXh0KTsKLSAgb3JnLmNocm9taXVtLmJ1aWxkLkJ1aWxkSG9va3NBbmRyb2lkIGNvbnN0cnVjdEJ1aWxkSG9va3NBbmRyb2lkSW1wbCgpOwotICB2b2lkIHNldFRoZW1lSW1wbChhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50KTsKLSAgIDxpbml0PigpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuUiRhbmltIHsKLSAgaW50IHN0YXlfaGlkZGVuOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuUiRpZCB7Ci0gIGludCBuZXdfdGFiX2J1dHRvbjsKLSAgaW50IHJlY2VudF90YWJzX21lbnVfaWQ7Ci0gIGludCB2cl9vdmVybGF5X3ZpZXc7Ci0gIGludCBoZWxwX2lkOwotICBpbnQgb3Blbl9oaXN0b3J5X21lbnVfaWQ7Ci0gIGludCBzaGFyZV9tZW51X2lkOwotICBpbnQgZG93bmxvYWRzX21lbnVfaWQ7Ci0gIGludCBhbGxfYm9va21hcmtzX21lbnVfaWQ7Ci0gIGludCBwcmVmZXJlbmNlc19pZDsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLlIkbGF5b3V0IHsKLSAgaW50IG1vZGFsX2RpYWxvZ192aWV3OwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuUiRzdHJpbmcgewotICBpbnQgbm9fdGhhbmtzOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuUiRzdHlsZSB7Ci0gIGludCBUaGVtZV9DaHJvbWl1bV9Nb2RhbERpYWxvZzsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuQXBwbGljYXRpb25MaWZldGltZSB7Ci0gIHZvaWQgdGVybWluYXRlKGJvb2xlYW4pOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5DaHJvbWVBY3Rpdml0eSB7Ci0gIGJvb2xlYW4gb25NZW51T3JLZXlib2FyZEFjdGlvbihpbnQsIGJvb2xlYW4pOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudG9vbGJhci5Ub29sYmFyTWFuYWdlciBnZXRUb29sYmFyTWFuYWdlcigpOwotICBib29sZWFuIGlzSW5PdmVydmlld01vZGUoKTsKLSAgdm9pZCBvbkV4aXRWcigpOwotICBib29sZWFuIGhhc1dpbmRvd0ZvY3VzKCk7Ci0gIHZvaWQgcmVjcmVhdGUoKTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYm1vZGVsLlRhYkNyZWF0b3JNYW5hZ2VyJFRhYkNyZWF0b3IgZ2V0VGFiQ3JlYXRvcihib29sZWFuKTsKLSAgYm9vbGVhbiBpc0FjdGl2aXR5RmluaXNoaW5nT3JEZXN0cm95ZWQoKTsKLSAgdm9pZCB1bnJlZ2lzdGVyUmVjZWl2ZXIoYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyKTsKLSAgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMgZ2V0UmVzb3VyY2VzKCk7Ci0gIHZvaWQgb3ZlcnJpZGVNb2RhbERpYWxvZ01hbmFnZXIob3JnLmNocm9taXVtLnVpLm1vZGFsZGlhbG9nLk1vZGFsRGlhbG9nTWFuYWdlcik7Ci0gIGludCBnZXRSZXF1ZXN0ZWRPcmllbnRhdGlvbigpOwotICBvcmcuY2hyb21pdW0udWkubW9kYWxkaWFsb2cuTW9kYWxEaWFsb2dNYW5hZ2VyIGdldE1vZGFsRGlhbG9nTWFuYWdlcigpOwotICBpbnQgZ2V0VGFza0lkKCk7Ci0gIHZvaWQgc2V0UmVxdWVzdGVkT3JpZW50YXRpb24oaW50KTsKLSAgYW5kcm9pZC5jb250ZW50LkludGVudCByZWdpc3RlclJlY2VpdmVyKGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlciwgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcik7Ci0gIGJvb2xlYW4gaXNGaW5pc2hpbmcoKTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLmZ1bGxzY3JlZW4uQ2hyb21lRnVsbHNjcmVlbk1hbmFnZXIgZ2V0RnVsbHNjcmVlbk1hbmFnZXIoKTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYm1vZGVsLlRhYk1vZGVsU2VsZWN0b3IgZ2V0VGFiTW9kZWxTZWxlY3RvcigpOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIud2lkZ2V0LmZpbmRpbnBhZ2UuRmluZFRvb2xiYXJNYW5hZ2VyIGdldEZpbmRUb29sYmFyTWFuYWdlcigpOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFiLlRhYiBnZXRBY3Rpdml0eVRhYigpOwotICBhbmRyb2lkLnZpZXcuVmlldyBmaW5kVmlld0J5SWQoaW50KTsKLSAgdm9pZCBzdGFydEFjdGl2aXR5KGFuZHJvaWQuY29udGVudC5JbnRlbnQsIGFuZHJvaWQub3MuQnVuZGxlKTsKLSAgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIgZ2V0V2luZG93TWFuYWdlcigpOwotICBqYXZhLmxhbmcuU3RyaW5nIGdldFBhY2thZ2VOYW1lKCk7Ci0gIGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIgZ2V0Q29udGVudFJlc29sdmVyKCk7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWJtb2RlbC5UYWJDcmVhdG9yTWFuYWdlciRUYWJDcmVhdG9yIGdldEN1cnJlbnRUYWJDcmVhdG9yKCk7Ci0gIGFuZHJvaWQudmlldy5XaW5kb3cgZ2V0V2luZG93KCk7Ci0gIG9yZy5jaHJvbWl1bS51aS5iYXNlLkFjdGl2aXR5V2luZG93QW5kcm9pZCBnZXRXaW5kb3dBbmRyb2lkKCk7Ci0gIHZvaWQgc3RhcnRBY3Rpdml0eUZvclJlc3VsdChhbmRyb2lkLmNvbnRlbnQuSW50ZW50LCBpbnQpOwotICB2b2lkIG9uRW50ZXJWcigpOwotICBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZyhpbnQpOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuY29tcG9zaXRvci5Db21wb3NpdG9yVmlld0hvbGRlciBnZXRDb21wb3NpdG9yVmlld0hvbGRlcigpOwotICBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IGdldEludGVudCgpOwotICBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBnZXRBcHBsaWNhdGlvbkNvbnRleHQoKTsKLSAgamF2YS5sYW5nLk9iamVjdCBnZXRTeXN0ZW1TZXJ2aWNlKGphdmEubGFuZy5TdHJpbmcpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5DaHJvbWVGZWF0dXJlTGlzdCB7Ci0gIGludCBnZXRGaWVsZFRyaWFsUGFyYW1CeUZlYXR1cmVBc0ludChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQpOwotICBib29sZWFuIGlzRW5hYmxlZChqYXZhLmxhbmcuU3RyaW5nKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuQ2hyb21lVGFiYmVkQWN0aXZpdHkgewotICBib29sZWFuIGhhbmRsZUJhY2tQcmVzc2VkKCk7Ci0gIGJvb2xlYW4gYmFja1Nob3VsZENsb3NlVGFiKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWIuVGFiKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuY29tcG9zaXRvci5Db21wb3NpdG9yU3VyZmFjZU1hbmFnZXIkU3VyZmFjZU1hbmFnZXJDYWxsYmFja1RhcmdldCB7Ci0gIHZvaWQgc3VyZmFjZURlc3Ryb3llZChhbmRyb2lkLnZpZXcuU3VyZmFjZSk7Ci0gIHZvaWQgc3VyZmFjZUNoYW5nZWQoYW5kcm9pZC52aWV3LlN1cmZhY2UsIGludCwgaW50LCBpbnQpOwotICB2b2lkIHN1cmZhY2VDcmVhdGVkKGFuZHJvaWQudmlldy5TdXJmYWNlKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuY29tcG9zaXRvci5Db21wb3NpdG9yVmlldyB7Ci0gIHZvaWQgcmVwbGFjZVN1cmZhY2VNYW5hZ2VyRm9yVnIob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLmNvbXBvc2l0b3IuQ29tcG9zaXRvclN1cmZhY2VNYW5hZ2VyLCBvcmcuY2hyb21pdW0udWkuYmFzZS5XaW5kb3dBbmRyb2lkKTsKLSAgdm9pZCBzdXJmYWNlUmVkcmF3TmVlZGVkQXN5bmMoamF2YS5sYW5nLlJ1bm5hYmxlKTsKLSAgdm9pZCBvbkV4aXRWcihvcmcuY2hyb21pdW0udWkuYmFzZS5XaW5kb3dBbmRyb2lkKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuY29tcG9zaXRvci5Db21wb3NpdG9yVmlld0hvbGRlciB7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5jb21wb3NpdG9yLkNvbXBvc2l0b3JWaWV3IGdldENvbXBvc2l0b3JWaWV3KCk7Ci0gIHZvaWQgb25FbnRlclZyKCk7Ci0gIGJvb2xlYW4gcmVxdWVzdEZvY3VzKCk7Ci0gIHZvaWQgb25FeGl0VnIoKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuZnVsbHNjcmVlbi5DaHJvbWVGdWxsc2NyZWVuTWFuYWdlciB7Ci0gIGludCBnZXRDb250ZW50T2Zmc2V0KCk7Ci0gIHZvaWQgZXhpdFBlcnNpc3RlbnRGdWxsc2NyZWVuTW9kZSgpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5oZWxwLkhlbHBBbmRGZWVkYmFjayB7Ci0gIHZvaWQgc2hvd0ZlZWRiYWNrKGFuZHJvaWQuYXBwLkFjdGl2aXR5LCBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIucHJvZmlsZXMuUHJvZmlsZSwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZyk7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5oZWxwLkhlbHBBbmRGZWVkYmFjayBnZXRJbnN0YW5jZShhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLmluZm9iYXIuU2ltcGxlQ29uZmlybUluZm9CYXJCdWlsZGVyIHsKLSAgdm9pZCBjcmVhdGUob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYi5UYWIsIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5pbmZvYmFyLlNpbXBsZUNvbmZpcm1JbmZvQmFyQnVpbGRlciRMaXN0ZW5lciwgaW50LCBpbnQsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4pOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5tb2RhbGRpYWxvZy5Nb2RhbERpYWxvZ1ZpZXdCaW5kZXIgewotICAgPGluaXQ+KCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnBhZ2VfaW5mby5QYWdlSW5mb0NvbnRyb2xsZXIgewotICB2b2lkIHNob3coYW5kcm9pZC5hcHAuQWN0aXZpdHksIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWIuVGFiLCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5wcmVmZXJlbmNlcy5DaHJvbWVQcmVmZXJlbmNlTWFuYWdlciB7Ci0gIHZvaWQgd3JpdGVCb29sZWFuKGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4pOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIucHJlZmVyZW5jZXMuQ2hyb21lUHJlZmVyZW5jZU1hbmFnZXIgZ2V0SW5zdGFuY2UoKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFiLkVtcHR5VGFiT2JzZXJ2ZXIgewotICAgPGluaXQ+KCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYi5UYWIgewotICBvcmcuY2hyb21pdW0udWkuYmFzZS5XaW5kb3dBbmRyb2lkIGdldFdpbmRvd0FuZHJvaWQoKTsKLSAgamF2YS5sYW5nLlN0cmluZyBnZXRUaXRsZSgpOwotICB2b2lkIHJlbW92ZU9ic2VydmVyKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWIuVGFiT2JzZXJ2ZXIpOwotICBib29sZWFuIGlzSW5jb2duaXRvKCk7Ci0gIGludCBnZXRJZCgpOwotICBhbmRyb2lkLnZpZXcuVmlld0dyb3VwIGdldENvbnRlbnRWaWV3KCk7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5wcm9maWxlcy5Qcm9maWxlIGdldFByb2ZpbGUoKTsKLSAgYm9vbGVhbiBjYW5Hb0ZvcndhcmQoKTsKLSAgb3JnLmNocm9taXVtLmNvbnRlbnRfcHVibGljLmJyb3dzZXIuV2ViQ29udGVudHMgZ2V0V2ViQ29udGVudHMoKTsKLSAgdm9pZCByZWxvYWQoKTsKLSAgdm9pZCBhZGRPYnNlcnZlcihvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFiLlRhYk9ic2VydmVyKTsKLSAgYm9vbGVhbiBjYW5Hb0JhY2soKTsKLSAgamF2YS5sYW5nLlN0cmluZyBnZXRVcmwoKTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLkNocm9tZUFjdGl2aXR5IGdldEFjdGl2aXR5KCk7Ci0gIHZvaWQgdXBkYXRlV2luZG93QW5kcm9pZChvcmcuY2hyb21pdW0udWkuYmFzZS5XaW5kb3dBbmRyb2lkKTsKLSAgaW50IGxvYWRVcmwob3JnLmNocm9taXVtLmNvbnRlbnRfcHVibGljLmJyb3dzZXIuTG9hZFVybFBhcmFtcyk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYi5UYWJBc3NvY2lhdGVkQXBwIHsKLSAgYm9vbGVhbiBpc09wZW5lZEZyb21FeHRlcm5hbEFwcChvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFiLlRhYik7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYi5UYWJCcm93c2VyQ29udHJvbHNTdGF0ZSB7Ci0gIHZvaWQgdXBkYXRlKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWIuVGFiLCBpbnQsIGJvb2xlYW4pOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWIuVGFiT2JzZXJ2ZXIgewotICB2b2lkIG9uQ29udGVudENoYW5nZWQob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYi5UYWIpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWIuVGFiUmVkaXJlY3RIYW5kbGVyIHsKLSAgIDxpbml0PihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCk7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWIuVGFiUmVkaXJlY3RIYW5kbGVyIHN3YXBGb3Iob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYi5UYWIsIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWIuVGFiUmVkaXJlY3RIYW5kbGVyKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFibW9kZWwuQ2hyb21lVGFiQ3JlYXRvciB7Ci0gIHZvaWQgc2V0V2luZG93QW5kcm9pZChvcmcuY2hyb21pdW0udWkuYmFzZS5XaW5kb3dBbmRyb2lkKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFibW9kZWwuRW1wdHlUYWJNb2RlbFNlbGVjdG9yT2JzZXJ2ZXIgewotICAgPGluaXQ+KCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYm1vZGVsLlRhYkNyZWF0b3JNYW5hZ2VyJFRhYkNyZWF0b3IgewotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFiLlRhYiBjcmVhdGVOZXdUYWIob3JnLmNocm9taXVtLmNvbnRlbnRfcHVibGljLmJyb3dzZXIuTG9hZFVybFBhcmFtcywgaW50LCBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFiLlRhYik7Ci0gIHZvaWQgbGF1bmNoTlRQKCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYm1vZGVsLlRhYk1vZGVsIHsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYi5UYWIgZ2V0VGFiQXQoaW50KTsKLSAgdm9pZCBjbG9zZUFsbFRhYnMoKTsKLSAgaW50IGdldENvdW50KCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYm1vZGVsLlRhYk1vZGVsU2VsZWN0b3IgewotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFibW9kZWwuVGFiTW9kZWwgZ2V0TW9kZWwoYm9vbGVhbik7Ci0gIHZvaWQgcmVtb3ZlT2JzZXJ2ZXIob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYm1vZGVsLlRhYk1vZGVsU2VsZWN0b3JPYnNlcnZlcik7Ci0gIGphdmEudXRpbC5MaXN0IGdldE1vZGVscygpOwotICBpbnQgZ2V0VG90YWxUYWJDb3VudCgpOwotICB2b2lkIGFkZE9ic2VydmVyKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWJtb2RlbC5UYWJNb2RlbFNlbGVjdG9yT2JzZXJ2ZXIpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWJtb2RlbC5UYWJNb2RlbFNlbGVjdG9yVGFiT2JzZXJ2ZXIgewotICB2b2lkIGRlc3Ryb3koKTsKLSAgIDxpbml0PihvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFibW9kZWwuVGFiTW9kZWxTZWxlY3Rvcik7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRvb2xiYXIuTmV3VGFiQnV0dG9uIHsKLSAgYm9vbGVhbiBjYWxsT25DbGljaygpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50b29sYmFyLlRvb2xiYXJNYW5hZ2VyIHsKLSAgYm9vbGVhbiBiYWNrKCk7Ci0gIGJvb2xlYW4gZm9yd2FyZCgpOwotICB2b2lkIHNldFByb2dyZXNzQmFyRW5hYmxlZChib29sZWFuKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudXRpbC5GZWF0dXJlVXRpbGl0aWVzIHsKLSAgYm9vbGVhbiBpc1JlY29nbml0aW9uSW50ZW50UHJlc2VudChhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgYm9vbGVhbik7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnV0aWwuSW50ZW50VXRpbHMgewotICBhbmRyb2lkLm9zLlBhcmNlbGFibGUgc2FmZUdldFBhcmNlbGFibGVFeHRyYShhbmRyb2lkLmNvbnRlbnQuSW50ZW50LCBqYXZhLmxhbmcuU3RyaW5nKTsKLSAgYm9vbGVhbiBzYWZlU3RhcnRBY3Rpdml0eShhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgYW5kcm9pZC5jb250ZW50LkludGVudCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLkFuZHJvaWRVaUdlc3R1cmVUYXJnZXQgewotICBsb25nIGFjY2VzcyQwMDIob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLkFuZHJvaWRVaUdlc3R1cmVUYXJnZXQsIGxvbmcpOwotICAgPGluaXQ+KGFuZHJvaWQudmlldy5WaWV3LCBmbG9hdCwgZmxvYXQsIGludCk7Ci0gIGxvbmcgbU5hdGl2ZVBvaW50ZXI7Ci0gIG9yZy5jaHJvbWl1bS5jb250ZW50X3B1YmxpYy5icm93c2VyLk1vdGlvbkV2ZW50U3ludGhlc2l6ZXIgbU1vdGlvbkV2ZW50U3ludGhlc2l6ZXI7Ci0gIGxvbmcgbUxhc3RUaW1lc3RhbXBNczsKLSAgbG9uZyBhY2Nlc3MkMDAwKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5BbmRyb2lkVWlHZXN0dXJlVGFyZ2V0KTsKLSAgbG9uZyBuYXRpdmVJbml0KGZsb2F0LCBmbG9hdCwgaW50KTsKLSAgb3JnLmNocm9taXVtLmNvbnRlbnRfcHVibGljLmJyb3dzZXIuTW90aW9uRXZlbnRTeW50aGVzaXplciBhY2Nlc3MkMTAwKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5BbmRyb2lkVWlHZXN0dXJlVGFyZ2V0KTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuQW5kcm9pZFVpR2VzdHVyZVRhcmdldCQxIHsKLSAgaW50IHZhbCR4OwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuQW5kcm9pZFVpR2VzdHVyZVRhcmdldCB0aGlzJDA7Ci0gIGludCB2YWwkYWN0aW9uOwotICBsb25nIHZhbCR0aW1lSW5NczsKLSAgaW50IHZhbCRkZWxheU1zOwotICBpbnQgdmFsJHk7Ci0gICA8aW5pdD4ob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLkFuZHJvaWRVaUdlc3R1cmVUYXJnZXQsIGxvbmcsIGludCwgaW50LCBpbnQsIGludCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLkFuZHJvaWRWU3luY0hlbHBlciB7Ci0gICA8aW5pdD4obG9uZyk7Ci0gIGFuZHJvaWQudmlldy5DaG9yZW9ncmFwaGVyJEZyYW1lQ2FsbGJhY2sgbUNhbGxiYWNrOwotICBsb25nIG1OYXRpdmVBbmRyb2lkVlN5bmNIZWxwZXI7Ci0gIGxvbmcgYWNjZXNzJDAwMChvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuQW5kcm9pZFZTeW5jSGVscGVyKTsKLSAgdm9pZCBhY2Nlc3MkMTAwKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5BbmRyb2lkVlN5bmNIZWxwZXIsIGxvbmcsIGxvbmcpOwotICB2b2lkIG5hdGl2ZU9uVlN5bmMobG9uZywgbG9uZyk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLkFuZHJvaWRWU3luY0hlbHBlciQxIHsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLkFuZHJvaWRWU3luY0hlbHBlciB0aGlzJDA7Ci0gICA8aW5pdD4ob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLkFuZHJvaWRWU3luY0hlbHBlcik7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLkVtcHR5U25pZmZpbmdWclZpZXdDb250YWluZXIgewotICBhbmRyb2lkLnZpZXcuVmlldyBnZXRDaGlsZEF0KGludCk7Ci0gIGphdmEubGFuZy5Cb29sZWFuIG1FbXB0eTsKLSAgdm9pZCBvbkVtcHR5KCk7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5Ob29wQ2FudmFzIG1Ob29wQ2FudmFzOwotICB2b2lkIHJlc2l6ZShpbnQsIGludCk7Ci0gICA8aW5pdD4oYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5FbXB0eVNuaWZmaW5nVnJWaWV3Q29udGFpbmVyJEVtcHR5TGlzdGVuZXIpOwotICB2b2lkIG9uTm9uRW1wdHkoKTsKLSAgaW50IGdldENoaWxkQ291bnQoKTsKLSAgdm9pZCBwb3N0SW52YWxpZGF0ZSgpOwotICB2b2lkIHJlbW92ZUFsbFZpZXdzKCk7Ci0gIHZvaWQgZGVzdHJveSgpOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuRW1wdHlTbmlmZmluZ1ZyVmlld0NvbnRhaW5lciRFbXB0eUxpc3RlbmVyIG1MaXN0ZW5lcjsKLSAgYW5kcm9pZC52aWV3LlZpZXdQYXJlbnQgZ2V0UGFyZW50KCk7Ci0gIGFuZHJvaWQudmlldy5WaWV3IGdldElucHV0VGFyZ2V0KCk7Ci0gIHZvaWQgYWRkVmlldyhhbmRyb2lkLnZpZXcuVmlldyk7Ci0gIHZvaWQgc2V0U3VyZmFjZShhbmRyb2lkLnZpZXcuU3VyZmFjZSk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLkVtcHR5U25pZmZpbmdWclZpZXdDb250YWluZXIkRW1wdHlMaXN0ZW5lciB7Ci0gIHZvaWQgb25WclZpZXdFbXB0eSgpOwotICB2b2lkIG9uVnJWaWV3Tm9uRW1wdHkoKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuTm9vcENhbnZhcyB7Ci0gIHZvaWQgcmVzdG9yZVRvQ291bnQoaW50KTsKLSAgIDxpbml0PihhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCwgYm9vbGVhbik7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5Ob29wQ2FudmFzJE5vb3BFeGNlcHRpb24gbUV4Y2VwdGlvbjsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuTm9vcENhbnZhcyQxIHsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLk5vb3BDYW52YXMgdGhpcyQwOwotICAgPGluaXQ+KG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5Ob29wQ2FudmFzKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuTm9vcENhbnZhcyROb29wRXhjZXB0aW9uIHsKLSAgIDxpbml0PigpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5PbkRpc3BhdGNoVG91Y2hFdmVudENhbGxiYWNrIHsKLSAgdm9pZCBvbkRpc3BhdGNoVG91Y2hFdmVudChib29sZWFuKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuT25FeGl0VnJSZXF1ZXN0TGlzdGVuZXIgewotICB2b2lkIG9uRGVuaWVkKCk7Ci0gIHZvaWQgb25TdWNjZWVkZWQoKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJBbGVydERpYWxvZyB7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WckFsZXJ0RGlhbG9nJERpYWxvZ0J1dHRvbiBhY2Nlc3MkMDAwKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WckFsZXJ0RGlhbG9nKTsKLSAgb3JnLmNocm9taXVtLnVpLm1vZGVsdXRpbC5Qcm9wZXJ0eU1vZGVsIG1Nb2RhbERpYWxvZ01vZGVsOwotICBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIG1NZXNzYWdlOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJBbGVydERpYWxvZyREaWFsb2dCdXR0b24gYWNjZXNzJDEwMChvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJBbGVydERpYWxvZyk7Ci0gIGFuZHJvaWQudmlldy5WaWV3IG1WaWV3OwotICAgPGluaXQ+KGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBvcmcuY2hyb21pdW0udWkubW9kYWxkaWFsb2cuTW9kYWxEaWFsb2dNYW5hZ2VyKTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyQWxlcnREaWFsb2ckRGlhbG9nQnV0dG9uIG1CdXR0b25Qb3NpdGl2ZTsKLSAgb3JnLmNocm9taXVtLnVpLm1vZGFsZGlhbG9nLk1vZGFsRGlhbG9nTWFuYWdlciBtTW9kYWxEaWFsb2dNYW5hZ2VyOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJBbGVydERpYWxvZyREaWFsb2dCdXR0b24gbUJ1dHRvbk5lZ2F0aXZlOwotICBib29sZWFuICRhc3NlcnRpb25zRGlzYWJsZWQ7Ci0gIHZvaWQgZGlzbWlzcygpOwotICBvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5TW9kZWwgY3JlYXRlRGlhbG9nTW9kZWwoKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJBbGVydERpYWxvZyQxIHsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyQWxlcnREaWFsb2cgdGhpcyQwOwotICAgPGluaXQ+KG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WckFsZXJ0RGlhbG9nKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJBbGVydERpYWxvZyREaWFsb2dCdXR0b24gewotICBpbnQgZ2V0SWQoKTsKLSAgamF2YS5sYW5nLlN0cmluZyBtVGV4dDsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyQWxlcnREaWFsb2cgdGhpcyQwOwotICBqYXZhLmxhbmcuU3RyaW5nIGdldFRleHQoKTsKLSAgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZSRPbkNsaWNrTGlzdGVuZXIgZ2V0TGlzdGVuZXIoKTsKLSAgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZSRPbkNsaWNrTGlzdGVuZXIgbUxpc3RlbmVyOwotICBpbnQgbUlkOwotICAgPGluaXQ+KG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WckFsZXJ0RGlhbG9nLCBpbnQsIGphdmEubGFuZy5TdHJpbmcsIGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UkT25DbGlja0xpc3RlbmVyKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJDYW5jZWxBbmltYXRpb25BY3Rpdml0eSB7Ci0gIHZvaWQgb3ZlcnJpZGVQZW5kaW5nVHJhbnNpdGlvbihpbnQsIGludCk7Ci0gIHZvaWQgZmluaXNoKCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyQ29tcG9zaXRvclN1cmZhY2VNYW5hZ2VyIHsKLSAgaW50IG1Gb3JtYXQ7Ci0gIHZvaWQgc3VyZmFjZVJlc2l6ZWQoaW50LCBpbnQpOwotICB2b2lkIHNldFN1cmZhY2UoYW5kcm9pZC52aWV3LlN1cmZhY2UsIGludCwgaW50LCBpbnQpOwotICB2b2lkIHNodXREb3duKCk7Ci0gICA8aW5pdD4ob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLmNvbXBvc2l0b3IuQ29tcG9zaXRvclN1cmZhY2VNYW5hZ2VyJFN1cmZhY2VNYW5hZ2VyQ2FsbGJhY2tUYXJnZXQpOwotICB2b2lkIHN1cmZhY2VEZXN0cm95ZWQoKTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLmNvbXBvc2l0b3IuQ29tcG9zaXRvclN1cmZhY2VNYW5hZ2VyJFN1cmZhY2VNYW5hZ2VyQ2FsbGJhY2tUYXJnZXQgbUNsaWVudDsKLSAgaW50IG1IZWlnaHQ7Ci0gIGludCBtV2lkdGg7Ci0gIGFuZHJvaWQudmlldy5TdXJmYWNlIG1TdXJmYWNlOwotICBib29sZWFuICRhc3NlcnRpb25zRGlzYWJsZWQ7Ci0gIGludCBtU3VyZmFjZVN0YXRlOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WckNvcmVJbmZvIHsKLSAgIDxpbml0PihvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJDb3JlSW5mbyRHdnJWZXJzaW9uLCBpbnQpOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJDb3JlSW5mbyRHdnJWZXJzaW9uIGd2clZlcnNpb247Ci0gIGludCBjb21wYXRpYmlsaXR5OwotICBsb25nIG5hdGl2ZUluaXQoaW50LCBpbnQsIGludCwgaW50KTsKLSAgbG9uZyBtYWtlTmF0aXZlVnJDb3JlSW5mbygpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WckNvcmVJbmZvJEd2clZlcnNpb24gewotICAgPGluaXQ+KGludCwgaW50LCBpbnQpOwotICBpbnQgbWFqb3JWZXJzaW9uOwotICBpbnQgcGF0Y2hWZXJzaW9uOwotICBpbnQgbWlub3JWZXJzaW9uOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WckNvcmVWZXJzaW9uQ2hlY2tlciB7Ci0gIGludCBnZXRWckNvcmVDb21wYXRpYmlsaXR5KCk7Ci0gIGxvbmcgbWFrZU5hdGl2ZVZyQ29yZUluZm8oKTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyQ29yZUluZm8gZ2V0VnJDb3JlSW5mbygpOwotICAgPGluaXQ+KCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyRGF5ZHJlYW1BcGkgewotICBib29sZWFuIGxhdW5jaEluVnIoYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudCk7Ci0gIGJvb2xlYW4gcmVnaXN0ZXJEYXlkcmVhbUludGVudChhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50KTsKLSAgYm9vbGVhbiB1bnJlZ2lzdGVyRGF5ZHJlYW1JbnRlbnQoKTsKLSAgYm9vbGVhbiBleGl0RnJvbVZyKGFuZHJvaWQuYXBwLkFjdGl2aXR5LCBpbnQsIGFuZHJvaWQuY29udGVudC5JbnRlbnQpOwotICBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkRheWRyZWFtQXBpIG1EYXlkcmVhbUFwaTsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5EYXlkcmVhbUFwaSBnZXREYXlkcmVhbUFwaSgpOwotICBib29sZWFuIGlzRGF5ZHJlYW1DdXJyZW50Vmlld2VyKCk7Ci0gIGJvb2xlYW4gbGF1bmNoVnJIb21lc2NyZWVuKCk7Ci0gICA8aW5pdD4oKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJEZWxlZ2F0ZSB7Ci0gICA8aW5pdD4oKTsKLSAgYm9vbGVhbiByZWxhdW5jaE9uTWFpbkRpc3BsYXlJZk5lY2Vzc2FyeShhbmRyb2lkLmFwcC5BY3Rpdml0eSwgYW5kcm9pZC5jb250ZW50LkludGVudCk7Ci0gIHZvaWQgcmVtb3ZlQmxhY2tPdmVybGF5VmlldyhhbmRyb2lkLmFwcC5BY3Rpdml0eSwgYm9vbGVhbik7Ci0gIGJvb2xlYW4gYm9vdHNUb1ZyKCk7Ci0gIGJvb2xlYW4gd2lsbENoYW5nZURlbnNpdHlJblZyKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5DaHJvbWVBY3Rpdml0eSk7Ci0gIGJvb2xlYW4gYWN0aXZpdHlTdXBwb3J0c1ZyQnJvd3NpbmcoYW5kcm9pZC5hcHAuQWN0aXZpdHkpOwotICB2b2lkIGFkZEJsYWNrT3ZlcmxheVZpZXdGb3JBY3Rpdml0eShvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuQ2hyb21lQWN0aXZpdHkpOwotICB2b2lkIHNldFN5c3RlbVVpVmlzaWJpbGl0eUZvclZyKGFuZHJvaWQuYXBwLkFjdGl2aXR5KTsKLSAgYm9vbGVhbiBVU0VfSElERV9BTklNQVRJT047Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyRGVsZWdhdGVJbXBsIHsKLSAgIDxpbml0PigpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WckRlbGVnYXRlUHJvdmlkZXJJbXBsIHsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZySW50ZW50RGVsZWdhdGVJbXBsIG1JbnRlbnREZWxlZ2F0ZTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyRGVsZWdhdGVJbXBsIG1EZWxlZ2F0ZTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJEaWFsb2cgewotICB2b2lkIHNldEJhY2tncm91bmRDb2xvcihpbnQpOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJEaWFsb2dNYW5hZ2VyIGFjY2VzcyQwMDAob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyRGlhbG9nKTsKLSAgdm9pZCBhZGRWaWV3KGFuZHJvaWQudmlldy5WaWV3LCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcyk7Ci0gICA8aW5pdD4oYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WckRpYWxvZ01hbmFnZXIpOwotICBpbnQgZ2V0V2lkdGgoKTsKLSAgdm9pZCBzZXRMYXlvdXRQYXJhbXMoYW5kcm9pZC52aWV3LlZpZXdHcm91cCRMYXlvdXRQYXJhbXMpOwotICB2b2lkIGRpc21pc3MoKTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyRGlhbG9nTWFuYWdlciBtVnJEaWFsb2dNYW5hZ2VyOwotICB2b2lkIGFkZE9uTGF5b3V0Q2hhbmdlTGlzdGVuZXIoYW5kcm9pZC52aWV3LlZpZXckT25MYXlvdXRDaGFuZ2VMaXN0ZW5lcik7Ci0gIHZvaWQgaW5pdFZyRGlhbG9nKCk7Ci0gIHZvaWQgZGlzYWJsZVNvZnRLZXlib2FyZChhbmRyb2lkLnZpZXcuVmlld0dyb3VwKTsKLSAgaW50IGdldEhlaWdodCgpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WckRpYWxvZyQxIHsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyRGlhbG9nIHRoaXMkMDsKLSAgIDxpbml0PihvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJEaWFsb2cpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WckRpYWxvZ01hbmFnZXIgewotICB2b2lkIHNldERpYWxvZ1ZpZXcoYW5kcm9pZC52aWV3LlZpZXcpOwotICB2b2lkIHNldERpYWxvZ0Zsb2F0aW5nKGJvb2xlYW4pOwotICB2b2lkIHNldERpYWxvZ1NpemUoaW50LCBpbnQpOwotICB2b2lkIHNldERpYWxvZ0xvY2F0aW9uKGludCwgaW50KTsKLSAgdm9pZCBpbml0VnJEaWFsb2coaW50LCBpbnQpOwotICB2b2lkIGNsb3NlVnJEaWFsb2coKTsKLSAgdm9pZCBzZXRWckRpYWxvZ0Rpc21pc3NIYW5kbGVyKGphdmEubGFuZy5SdW5uYWJsZSk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyRmVlZGJhY2tTdGF0dXMgewotICB2b2lkIHNldEZlZWRiYWNrT3B0T3V0KGJvb2xlYW4pOwotICBib29sZWFuIGdldEZlZWRiYWNrT3B0T3V0KCk7Ci0gIGludCBnZXRGZWVkYmFja0ZyZXF1ZW5jeSgpOwotICB2b2lkIHNldFVzZXJFeGl0ZWRBbmRFbnRlcmVkMkRDb3VudChpbnQpOwotICBpbnQgZ2V0VXNlckV4aXRlZEFuZEVudGVyZWQyRENvdW50KCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyRmlyc3RSdW5BY3Rpdml0eSB7Ci0gIG9yZy5jaHJvbWl1bS5iYXNlLm1ldHJpY3MuQ2FjaGVkTWV0cmljcyRCb29sZWFuSGlzdG9ncmFtU2FtcGxlIHNGcmVOb3RDb21wbGV0ZUJyb3dzZXJIaXN0b2dyYW07Ci0gIHZvaWQgcmVjb3JkRnJlSGlzdG9ncmFtKCk7Ci0gIHZvaWQgc2hvd0ZyZSgpOwotICBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IGdldEludGVudCgpOwotICB2b2lkIGZpbmlzaCgpOwotICBib29sZWFuICRhc3NlcnRpb25zRGlzYWJsZWQ7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyRmlyc3RSdW5BY3Rpdml0eSQxIHsKLSAgIDxpbml0PihvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJGaXJzdFJ1bkFjdGl2aXR5LCBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJEYXlkcmVhbUFwaSk7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WckZpcnN0UnVuQWN0aXZpdHkgdGhpcyQwOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJEYXlkcmVhbUFwaSB2YWwkZGF5ZHJlYW1BcGk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZySW5wdXRDb25uZWN0aW9uIHsKLSAgb3JnLmNocm9taXVtLmNvbnRlbnRfcHVibGljLmJyb3dzZXIuSW1lQWRhcHRlciBtSW1lQWRhcHRlcjsKLSAgdm9pZCBhY2Nlc3MkMTAwKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WcklucHV0Q29ubmVjdGlvbiwgbG9uZywgamF2YS5sYW5nLlN0cmluZyk7Ci0gIGxvbmcgbU5hdGl2ZVZySW5wdXRDb25uZWN0aW9uOwotICAgPGluaXQ+KGxvbmcsIG9yZy5jaHJvbWl1bS5jb250ZW50X3B1YmxpYy5icm93c2VyLldlYkNvbnRlbnRzKTsKLSAgYW5kcm9pZC5vcy5IYW5kbGVyIG1JbWVUaHJlYWRSZXNwb25zZUhhbmRsZXI7Ci0gIGFuZHJvaWQub3MuSGFuZGxlciBhY2Nlc3MkMjAwKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WcklucHV0Q29ubmVjdGlvbik7Ci0gIGJvb2xlYW4gJGFzc2VydGlvbnNEaXNhYmxlZDsKLSAgdm9pZCBuYXRpdmVVcGRhdGVUZXh0U3RhdGUobG9uZywgamF2YS5sYW5nLlN0cmluZyk7Ci0gIGxvbmcgYWNjZXNzJDAwMChvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJJbnB1dENvbm5lY3Rpb24pOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WcklucHV0Q29ubmVjdGlvbiQxIHsKLSAgIDxpbml0PihvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJJbnB1dENvbm5lY3Rpb24sIGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dENvbm5lY3Rpb24pOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJJbnB1dENvbm5lY3Rpb24gdGhpcyQwOwotICBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRDb25uZWN0aW9uIHZhbCRpYzsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJJbnB1dENvbm5lY3Rpb24kMSQxIHsKLSAgIDxpbml0PihvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJJbnB1dENvbm5lY3Rpb24kMSwgamF2YS5sYW5nLlN0cmluZyk7Ci0gIGphdmEubGFuZy5TdHJpbmcgdmFsJHRleHRTdGF0ZTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZySW5wdXRDb25uZWN0aW9uJDEgdGhpcyQxOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WcklucHV0Q29ubmVjdGlvbiQyIHsKLSAgYm9vbGVhbiAkYXNzZXJ0aW9uc0Rpc2FibGVkOwotICAgPGluaXQ+KG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WcklucHV0Q29ubmVjdGlvbiwgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0Q29ubmVjdGlvbiwgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLmtleWJvYXJkLlRleHRFZGl0QWN0aW9uW10pOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIua2V5Ym9hcmQuVGV4dEVkaXRBY3Rpb25bXSB2YWwkZWRpdHM7Ci0gIGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dENvbm5lY3Rpb24gdmFsJGljOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJJbnB1dENvbm5lY3Rpb24gdGhpcyQwOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WcklucHV0Q29ubmVjdGlvbiQzIHsKLSAgIDxpbml0PihvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJJbnB1dENvbm5lY3Rpb24sIGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dENvbm5lY3Rpb24pOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJJbnB1dENvbm5lY3Rpb24gdGhpcyQwOwotICBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRDb25uZWN0aW9uIHZhbCRpYzsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJJbnRlbnREZWxlZ2F0ZSB7Ci0gICA8aW5pdD4oKTsKLSAgYm9vbGVhbiBpc0xhdW5jaGluZ0ludG9WcihhbmRyb2lkLmFwcC5BY3Rpdml0eSwgYW5kcm9pZC5jb250ZW50LkludGVudCk7Ci0gIGJvb2xlYW4gaXNWckludGVudChhbmRyb2lkLmNvbnRlbnQuSW50ZW50KTsKLSAgYW5kcm9pZC5jb250ZW50LkludGVudCBzZXR1cFZySW50ZW50KGFuZHJvaWQuY29udGVudC5JbnRlbnQpOwotICB2b2lkIHJlbW92ZVZyRXh0cmFzKGFuZHJvaWQuY29udGVudC5JbnRlbnQpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WckludGVudERlbGVnYXRlSW1wbCB7Ci0gIGJvb2xlYW4gaXNWckludGVudChhbmRyb2lkLmNvbnRlbnQuSW50ZW50KTsKLSAgIDxpbml0PigpOwotICBib29sZWFuICRhc3NlcnRpb25zRGlzYWJsZWQ7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyTW9kYWxQcmVzZW50ZXIgewotICBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBtQ29udGV4dDsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyRGlhbG9nIG1WckRpYWxvZzsKLSAgdm9pZCBkaXNtaXNzQ3VycmVudERpYWxvZyhpbnQpOwotICBvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5TW9kZWxDaGFuZ2VQcm9jZXNzb3IgbU1vZGVsQ2hhbmdlUHJvY2Vzc29yOwotICB2b2lkIGNsb3NlQ3VycmVudERpYWxvZygpOwotICAgPGluaXQ+KGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJEaWFsb2dNYW5hZ2VyKTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyRGlhbG9nTWFuYWdlciBtVnJEaWFsb2dNYW5hZ2VyOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5Wck1vZHVsZVByb3ZpZGVyIHsKLSAgdm9pZCBvbkV4aXRWcigpOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJEZWxlZ2F0ZSBnZXREZWxlZ2F0ZSgpOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJJbnRlbnREZWxlZ2F0ZSBnZXRJbnRlbnREZWxlZ2F0ZSgpOwotICB2b2lkIHJlZ2lzdGVySm5pKCk7Ci0gIHZvaWQgb25FbnRlclZyKCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyUG9wdXBXaW5kb3cgewotICBpbnQgbUhlaWdodDsKLSAgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBnZXRCYWNrZ3JvdW5kKCk7Ci0gIHZvaWQgZGlzbWlzcygpOwotICBhbmRyb2lkLndpZGdldC5Qb3B1cFdpbmRvdyRPbkRpc21pc3NMaXN0ZW5lciBtT25EaXNtaXNzTGlzdGVuZXI7Ci0gIGFuZHJvaWQuY29udGVudC5Db250ZXh0IG1Db250ZXh0OwotICB2b2lkIHNob3dBdExvY2F0aW9uKGFuZHJvaWQudmlldy5WaWV3LCBpbnQsIGludCwgaW50KTsKLSAgYW5kcm9pZC52aWV3LlZpZXcgZ2V0Q29udGVudFZpZXcoKTsKLSAgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQgbVZyUG9wdXBDb250YWluZXI7Ci0gICA8aW5pdD4oYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WckRpYWxvZ01hbmFnZXIpOwotICBpbnQgbVdpZHRoOwotICBib29sZWFuIGlzU2hvd2luZygpOwotICBib29sZWFuIG1Jc1Nob3dpbmc7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WckRpYWxvZ01hbmFnZXIgbVZyRGlhbG9nTWFuYWdlcjsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJQb3B1cFdpbmRvdyQxIHsKLSAgIDxpbml0PihvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJQb3B1cFdpbmRvdyk7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WclBvcHVwV2luZG93IHRoaXMkMDsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbCB7Ci0gIHZvaWQgbmF0aXZlT25UcmlnZ2VyRXZlbnQobG9uZywgYm9vbGVhbik7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WclNoZWxsRGVsZWdhdGUgYWNjZXNzJDE0MDAob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyU2hlbGwpOwotICB2b2lkIG9uUGF1c2UoKTsKLSAgdm9pZCByZXN0b3JlVGFiRnJvbVZSKCk7Ci0gIGJvb2xlYW4gbVJlcHJvamVjdGVkUmVuZGVyaW5nOwotICB2b2lkIG5hdGl2ZVNldERpYWxvZ0xvY2F0aW9uKGxvbmcsIGZsb2F0LCBmbG9hdCk7Ci0gIHZvaWQgbmF0aXZlV2F0Y2hFbGVtZW50Rm9yVmlzaWJpbGl0eVN0YXR1c0ZvclRlc3RpbmcobG9uZywgaW50LCBpbnQsIGJvb2xlYW4pOwotICB2b2lkIG5hdGl2ZU9uVGFiTGlzdENyZWF0ZWQobG9uZywgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYi5UYWJbXSwgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYi5UYWJbXSk7Ci0gIHZvaWQgYXR0YWNoVGFiTW9kZWxTZWxlY3RvclRhYk9ic2VydmVyKCk7Ci0gIHZvaWQgbmF0aXZlT25UYWJVcGRhdGVkKGxvbmcsIGJvb2xlYW4sIGludCwgamF2YS5sYW5nLlN0cmluZyk7Ci0gICA8aW5pdD4ob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLkNocm9tZUFjdGl2aXR5LCBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbERlbGVnYXRlLCBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFibW9kZWwuVGFiTW9kZWxTZWxlY3Rvcik7Ci0gIHZvaWQgc2V0V2ViVnJNb2RlRW5hYmxlZChib29sZWFuKTsKLSAgdm9pZCBuYXRpdmVPblJlc3VtZShsb25nKTsKLSAgdm9pZCBzZXRDb250ZW50Q3NzU2l6ZShmbG9hdCwgZmxvYXQsIGZsb2F0KTsKLSAgdm9pZCBzd2FwVG9Gb3JlZ3JvdW5kVGFiKCk7Ci0gIG9yZy5jaHJvbWl1bS51aS5tb2RhbGRpYWxvZy5Nb2RhbERpYWxvZ01hbmFnZXIgbU5vblZyTW9kYWxEaWFsb2dNYW5hZ2VyOwotICB2b2lkIGNvbmZpZ1dlYkNvbnRlbnRzSW1lRm9yVnIob3JnLmNocm9taXVtLmNvbnRlbnRfcHVibGljLmJyb3dzZXIuV2ViQ29udGVudHMpOwotICB2b2lkIG5hdGl2ZURlc3Ryb3kobG9uZyk7Ci0gIHZvaWQgbmF0aXZlU2V0VWlFeHBlY3RpbmdBY3Rpdml0eUZvclRlc3RpbmcobG9uZywgaW50KTsKLSAgdm9pZCByZXF1ZXN0VG9FeGl0VnIoaW50LCBib29sZWFuKTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYm1vZGVsLlRhYk1vZGVsU2VsZWN0b3JUYWJPYnNlcnZlciBtVGFiTW9kZWxTZWxlY3RvclRhYk9ic2VydmVyOwotICB2b2lkIG5hdGl2ZUFjY2VwdERvZmZQcm9tcHRGb3JUZXN0aW5nKGxvbmcpOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuRW1wdHlTbmlmZmluZ1ZyVmlld0NvbnRhaW5lciBtTm9uVnJWaWV3czsKLSAgYm9vbGVhbiBuYXRpdmVHZXRXZWJWck1vZGUobG9uZyk7Ci0gIGZsb2F0IG1MYXN0Q29udGVudEhlaWdodDsKLSAgdm9pZCBhY2Nlc3MkOTAwKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WclNoZWxsKTsKLSAgdm9pZCBuYXRpdmVTZXRBbGVydERpYWxvZ1NpemUobG9uZywgZmxvYXQsIGZsb2F0KTsKLSAgdm9pZCByZXN0b3JlV2ViQ29udGVudHNJbWVGcm9tVnIob3JnLmNocm9taXVtLmNvbnRlbnRfcHVibGljLmJyb3dzZXIuV2ViQ29udGVudHMpOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJNb2RhbFByZXNlbnRlciBtVnJNb2RhbFByZXNlbnRlcjsKLSAgdm9pZCBsYXVuY2hOVFAoKTsKLSAgbG9uZyBhY2Nlc3MkMTAwKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WclNoZWxsKTsKLSAgdm9pZCBuYXRpdmVTd2FwQ29udGVudHMobG9uZywgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYi5UYWIpOwotICB2b2lkIG5hdGl2ZVNldFN1cmZhY2UobG9uZywgYW5kcm9pZC52aWV3LlN1cmZhY2UpOwotICBpbnQgZ2V0VG91Y2hTbG9wKCk7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WcldpbmRvd0FuZHJvaWQgbUNvbnRlbnRWcldpbmRvd0FuZHJvaWQ7Ci0gIHZvaWQgbmF0aXZlQ2FuY2VsVG9hc3QobG9uZyk7Ci0gIHZvaWQgbGFtYmRhJHNldFdlYlZyTW9kZUVuYWJsZWQkMCgpOwotICB2b2lkIGluamVjdFZySG9zdGVkVWlWaWV3KCk7Ci0gIGphdmEubGFuZy5SdW5uYWJsZSBtVnJEaWFsb2dEaXNtaXNzSGFuZGxlcjsKLSAgdm9pZCBuYXRpdmVTYXZlTmV4dEZyYW1lQnVmZmVyVG9EaXNrRm9yVGVzdGluZyhsb25nLCBqYXZhLmxhbmcuU3RyaW5nKTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyVmlld0NvbnRhaW5lciBtVnJVaVZpZXdDb250YWluZXI7Ci0gIHZvaWQgbmF0aXZlU2V0V2ViVnJNb2RlKGxvbmcsIGJvb2xlYW4pOwotICBmbG9hdCBtTGFzdENvbnRlbnREcHI7Ci0gIHZvaWQgYWNjZXNzJDEwMDAob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyU2hlbGwsIGxvbmcsIGJvb2xlYW4sIGludCwgamF2YS5sYW5nLlN0cmluZyk7Ci0gIHZvaWQgbmF0aXZlQnVmZmVyQm91bmRzQ2hhbmdlZChsb25nLCBpbnQsIGludCwgaW50LCBpbnQpOwotICBvcmcuY2hyb21pdW0uY29udGVudF9wdWJsaWMuYnJvd3Nlci5WaWV3RXZlbnRTaW5rIGFjY2VzcyQwMDAob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyU2hlbGwpOwotICB2b2lkIGFjY2VzcyQ3MDAob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyU2hlbGwsIG9yZy5jaHJvbWl1bS5jb250ZW50X3B1YmxpYy5icm93c2VyLldlYkNvbnRlbnRzKTsKLSAgdm9pZCBzd2FwVG9UYWIob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYi5UYWIpOwotICB2b2lkIHNodXRkb3duKCk7Ci0gIGJvb2xlYW4gJGFzc2VydGlvbnNEaXNhYmxlZDsKLSAgdm9pZCBwYXVzZSgpOwotICB2b2lkIG5hdGl2ZVNldEFuZHJvaWRHZXN0dXJlVGFyZ2V0KGxvbmcsIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5BbmRyb2lkVWlHZXN0dXJlVGFyZ2V0KTsKLSAgdm9pZCBzZXRWaXNpYmlsaXR5KGludCk7Ci0gIGZsb2F0IGFjY2VzcyQzMDAob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyU2hlbGwpOwotICBqYXZhLmxhbmcuQm9vbGVhbiBsYW1iZGEkaXNEaXNwbGF5aW5nVXJsRm9yVGVzdGluZyQxKCk7Ci0gIGFuZHJvaWQudmlldy5WaWV3JE9uVG91Y2hMaXN0ZW5lciBtVG91Y2hMaXN0ZW5lcjsKLSAgdm9pZCBuYXRpdmVPbkxvYWRQcm9ncmVzc0NoYW5nZWQobG9uZywgZG91YmxlKTsKLSAgdm9pZCBhY2Nlc3MkMTUwMChvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbCwgbG9uZywgYm9vbGVhbiwgaW50KTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyQ29tcG9zaXRvclN1cmZhY2VNYW5hZ2VyIG1WckNvbXBvc2l0b3JTdXJmYWNlTWFuYWdlcjsKLSAgdm9pZCBuYXRpdmVVcGRhdGVXZWJJbnB1dEluZGljZXMobG9uZywgaW50LCBpbnQsIGludCwgaW50KTsKLSAgYm9vbGVhbiBnZXRXZWJWck1vZGVFbmFibGVkKCk7Ci0gIGphdmEudXRpbC5BcnJheUxpc3QgbVVpT3BlcmF0aW9uUmVzdWx0Q2FsbGJhY2tzOwotICBhbmRyb2lkLnZpZXcuU3VyZmFjZSBtQ29udGVudFN1cmZhY2U7Ci0gIHZvaWQgbmF0aXZlQ2xvc2VBbGVydERpYWxvZyhsb25nKTsKLSAgbG9uZyBuYXRpdmVJbml0KG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WclNoZWxsRGVsZWdhdGUsIGJvb2xlYW4sIGJvb2xlYW4sIGJvb2xlYW4sIGxvbmcsIGJvb2xlYW4sIGZsb2F0LCBmbG9hdCwgaW50LCBpbnQsIGJvb2xlYW4sIGJvb2xlYW4sIGJvb2xlYW4pOwotICBib29sZWFuIG5hdGl2ZUhhc1VpRmluaXNoZWRMb2FkaW5nKGxvbmcpOwotICB2b2lkIG5hdGl2ZVNldEFsZXJ0RGlhbG9nKGxvbmcsIGZsb2F0LCBmbG9hdCk7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5BbmRyb2lkVWlHZXN0dXJlVGFyZ2V0IG1BbmRyb2lkRGlhbG9nR2VzdHVyZVRhcmdldDsKLSAgYm9vbGVhbiBtUGVuZGluZ1ZTeW5jUGF1c2U7Ci0gIHZvaWQgbmF0aXZlT25UYWJSZW1vdmVkKGxvbmcsIGJvb2xlYW4sIGludCk7Ci0gIGphdmEubGFuZy5Cb29sZWFuIG1QYXVzZWQ7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWIuVGFiUmVkaXJlY3RIYW5kbGVyIG1Ob25WclRhYlJlZGlyZWN0SGFuZGxlcjsKLSAgdm9pZCBhY2Nlc3MkMTEwMChvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbCwgbG9uZywgYm9vbGVhbik7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5PbkRpc3BhdGNoVG91Y2hFdmVudENhbGxiYWNrIG1PbkRpc3BhdGNoVG91Y2hFdmVudEZvclRlc3Rpbmc7Ci0gIHZvaWQgbmF0aXZlU2V0SGlzdG9yeUJ1dHRvbnNFbmFibGVkKGxvbmcsIGJvb2xlYW4sIGJvb2xlYW4pOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuY29tcG9zaXRvci5Db21wb3NpdG9yVmlldyBtQ29tcG9zaXRvclZpZXc7Ci0gIGphdmEubGFuZy5SdW5uYWJsZSBtT25WU3luY1BhdXNlZEZvclRlc3Rpbmc7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5BbmRyb2lkVWlHZXN0dXJlVGFyZ2V0IG1BbmRyb2lkVWlHZXN0dXJlVGFyZ2V0OwotICBhbmRyb2lkLnZpZXcuVmlldyBtUHJlc2VudGF0aW9uVmlldzsKLSAgdm9pZCBhY2Nlc3MkMTIwMChvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbCwgbG9uZywgYm9vbGVhbik7Ci0gIHZvaWQgYWNjZXNzJDgwMChvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbCwgbG9uZywgZG91YmxlKTsKLSAgdm9pZCB0ZWFyZG93bigpOwotICBqYXZhLnV0aWwuQXJyYXlMaXN0IG1VaU9wZXJhdGlvblJlc3VsdHM7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWIuVGFiT2JzZXJ2ZXIgbVRhYk9ic2VydmVyOwotICBmbG9hdCBnZXROYXRpdmVQYWdlU2Nyb2xsUmF0aW8oKTsKLSAgdm9pZCBsYW1iZGEkcmF3VG9wQ29udGVudE9mZnNldENoYW5nZWQkMigpOwotICB2b2lkIG5hdGl2ZVNob3dUb2FzdChsb25nLCBqYXZhLmxhbmcuU3RyaW5nKTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZySW5wdXRDb25uZWN0aW9uIG5hdGl2ZUdldFZySW5wdXRDb25uZWN0aW9uRm9yVGVzdGluZyhsb25nKTsKLSAgZmxvYXQgYWNjZXNzJDIwMChvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbCk7Ci0gIGphdmEubGFuZy5Cb29sZWFuIG1DYW5Hb0JhY2s7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWJtb2RlbC5UYWJNb2RlbFNlbGVjdG9yIG1UYWJNb2RlbFNlbGVjdG9yOwotICB2b2lkIG5hdGl2ZVJlcXVlc3RUb0V4aXRWcihsb25nLCBpbnQpOwotICB2b2lkIGNyZWF0ZVRhYkxpc3QoKTsKLSAgdm9pZCByZXN1bWUoKTsKLSAgdm9pZCBzZXRSZWVudHJ5SW50ZW50KGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQpOwotICB2b2lkIG5hdGl2ZVJlcXVlc3RSZWNvcmRBdWRpb1Blcm1pc3Npb25SZXN1bHQobG9uZywgYm9vbGVhbik7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWIuVGFiUmVkaXJlY3RIYW5kbGVyIG1UYWJSZWRpcmVjdEhhbmRsZXI7Ci0gIHZvaWQgbGFtYmRhJHBlcmZvcm1LZXlib2FyZElucHV0Rm9yVGVzdGluZyQzKGludCwgamF2YS5sYW5nLlN0cmluZyk7Ci0gIG9yZy5jaHJvbWl1bS5jb250ZW50X3B1YmxpYy5icm93c2VyLlZpZXdFdmVudFNpbmsgbVZpZXdFdmVudFNpbms7Ci0gIG9yZy5jaHJvbWl1bS51aS5tb2RhbGRpYWxvZy5Nb2RhbERpYWxvZ01hbmFnZXIgbVZyTW9kYWxEaWFsb2dNYW5hZ2VyOwotICB2b2lkIGluaXRpYWxpemVOYXRpdmUoYm9vbGVhbiwgYm9vbGVhbik7Ci0gIHZvaWQgbmF0aXZlT25QYXVzZShsb25nKTsKLSAgdm9pZCBvblJlc3VtZSgpOwotICBvcmcuY2hyb21pdW0udWkud2lkZ2V0LlVpV2lkZ2V0RmFjdG9yeSBtTm9uVnJVaVdpZGdldEZhY3Rvcnk7Ci0gIHZvaWQgb3Blbk5ld1RhYihib29sZWFuKTsKLSAgb3JnLmNocm9taXVtLmNvbnRlbnRfcHVibGljLmJyb3dzZXIuVmlld0V2ZW50U2luayBhY2Nlc3MkMDAyKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WclNoZWxsLCBvcmcuY2hyb21pdW0uY29udGVudF9wdWJsaWMuYnJvd3Nlci5WaWV3RXZlbnRTaW5rKTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLkNocm9tZUFjdGl2aXR5IG1BY3Rpdml0eTsKLSAgdm9pZCBuYXRpdmVTZXREaWFsb2dHZXN0dXJlVGFyZ2V0KGxvbmcsIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5BbmRyb2lkVWlHZXN0dXJlVGFyZ2V0KTsKLSAgb3JnLmNocm9taXVtLnVpLmRpc3BsYXkuVmlydHVhbERpc3BsYXlBbmRyb2lkIG1Db250ZW50VmlydHVhbERpc3BsYXk7Ci0gIGJvb2xlYW4gaGFzUmVjb3JkQXVkaW9QZXJtaXNzaW9uKCk7Ci0gIHZvaWQgbmF0aXZlTG9nVW5zdXBwb3J0ZWRNb2RlVXNlck1ldHJpYyhsb25nLCBpbnQpOwotICBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dCBnZXRDb250YWluZXIoKTsKLSAgdm9pZCByYXdUb3BDb250ZW50T2Zmc2V0Q2hhbmdlZChmbG9hdCk7Ci0gIGphdmEubGFuZy5Cb29sZWFuIG1DYW5Hb0ZvcndhcmQ7Ci0gIGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0IG1VaVZpZXc7Ci0gIHZvaWQgbmF0aXZlUmVzdW1lQ29udGVudFJlbmRlcmluZyhsb25nKTsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJVaUxheW91dCBnZXRVaUxheW91dCgpOwotICB2b2lkIGluaXRpYWxpemVUYWJGb3JWUigpOwotICBib29sZWFuIG5hdGl2ZUlzRGlzcGxheWluZ1VybEZvclRlc3RpbmcobG9uZyk7Ci0gIGJvb2xlYW4gbVZyQnJvd3NpbmdFbmFibGVkOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIua2V5Ym9hcmQuVnJJbnB1dE1ldGhvZE1hbmFnZXJXcmFwcGVyIG1JbnB1dE1ldGhvZE1hbmFnZXJXcmFwcGVyOwotICB2b2lkIGFjY2VzcyQ1MDAob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyU2hlbGwsIGxvbmcsIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWIuVGFiKTsKLSAgbG9uZyBtTmF0aXZlVnJTaGVsbDsKLSAgdm9pZCB1cGRhdGVIaXN0b3J5QnV0dG9uc1Zpc2liaWxpdHkoKTsKLSAgYm9vbGVhbiBzZXRBc3luY1JlcHJvamVjdGlvbkVuYWJsZWQoYm9vbGVhbik7Ci0gIGJvb2xlYW4gY2FuUmVxdWVzdFJlY29yZEF1ZGlvUGVybWlzc2lvbigpOwotICB2b2lkIG5hdGl2ZVNldERpYWxvZ0Zsb2F0aW5nKGxvbmcsIGJvb2xlYW4pOwotICB2b2lkIG5hdGl2ZVNob3dTb2Z0SW5wdXQobG9uZywgYm9vbGVhbik7Ci0gIHZvaWQgc2V0UHJlc2VudGF0aW9uVmlldyhhbmRyb2lkLnZpZXcuVmlldyk7Ci0gIHZvaWQgcmVtb3ZlVnJSb290VmlldygpOwotICB2b2lkIGluamVjdFZyUm9vdFZpZXcoKTsKLSAgdm9pZCBhY2Nlc3MkNjAwKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WclNoZWxsKTsKLSAgdm9pZCBuYXRpdmVTZXREaWFsb2dCdWZmZXJTaXplKGxvbmcsIGludCwgaW50KTsKLSAgY29tLmdvb2dsZS52ci5uZGsuYmFzZS5HdnJBcGkgZ2V0R3ZyQXBpKCk7Ci0gIHZvaWQgbmF0aXZlT25PdmVybGF5VGV4dHVyZUVtcHR5Q2hhbmdlZChsb25nLCBib29sZWFuKTsKLSAgYm9vbGVhbiBoYXNVaUZpbmlzaGVkTG9hZGluZygpOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFibW9kZWwuVGFiTW9kZWxTZWxlY3Rvck9ic2VydmVyIG1UYWJNb2RlbFNlbGVjdG9yT2JzZXJ2ZXI7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5DaHJvbWVBY3Rpdml0eSBhY2Nlc3MkMTMwMChvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbCk7Ci0gIHZvaWQgcmVwYXJlbnRBbGxUYWJzKG9yZy5jaHJvbWl1bS51aS5iYXNlLldpbmRvd0FuZHJvaWQpOwotICB2b2lkIG5hdGl2ZVBlcmZvcm1Db250cm9sbGVyQWN0aW9uRm9yVGVzdGluZyhsb25nLCBpbnQsIGludCwgZmxvYXQsIGZsb2F0KTsKLSAgZmxvYXQgbUxhc3RDb250ZW50V2lkdGg7Ci0gIHZvaWQgbmF0aXZlUGVyZm9ybUtleWJvYXJkSW5wdXRGb3JUZXN0aW5nKGxvbmcsIGludCwgamF2YS5sYW5nLlN0cmluZyk7Ci0gIGZsb2F0IGFjY2VzcyQ0MDAob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyU2hlbGwpOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbERlbGVnYXRlIG1EZWxlZ2F0ZTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYi5UYWIgbVRhYjsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbCQxIHsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyU2hlbGwgdGhpcyQwOwotICAgPGluaXQ+KG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WclNoZWxsLCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyU2hlbGwkMiB7Ci0gIHZvaWQgb25Db250ZW50Q2hhbmdlZChvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFiLlRhYik7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WclNoZWxsIHRoaXMkMDsKLSAgIDxpbml0PihvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyU2hlbGwkMyB7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WclNoZWxsIHRoaXMkMDsKLSAgIDxpbml0PihvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyU2hlbGwkNCB7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WclNoZWxsIHRoaXMkMDsKLSAgIDxpbml0PihvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyU2hlbGwkNSB7Ci0gICA8aW5pdD4ob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyU2hlbGwpOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbCB0aGlzJDA7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyU2hlbGwkNSQxIHsKLSAgIDxpbml0PihvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbCQ1KTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyU2hlbGwkNSB0aGlzJDE7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyU2hlbGwkNSQxJDEgewotICBpbnRbXSB2YWwkZ3JhbnRSZXN1bHRzOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbCQ1JDEgdGhpcyQyOwotICAgPGluaXQ+KG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WclNoZWxsJDUkMSwgaW50W10pOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WclNoZWxsJDYgewotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbCB0aGlzJDA7Ci0gICA8aW5pdD4ob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyU2hlbGwpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WclNoZWxsJDcgewotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbCB0aGlzJDA7Ci0gICA8aW5pdD4ob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyU2hlbGwsIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWJtb2RlbC5UYWJNb2RlbFNlbGVjdG9yKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbCRVaU9wZXJhdGlvbkRhdGEgewotICBib29sZWFuIHZpc2liaWxpdHk7Ci0gIGludCBlbGVtZW50TmFtZTsKLSAgamF2YS5sYW5nLlJ1bm5hYmxlIHJlc3VsdENhbGxiYWNrOwotICBpbnQgdGltZW91dE1zOwotICBpbnQgYWN0aW9uVHlwZTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbERlbGVnYXRlIHsKLSAgdm9pZCByZXF1ZXN0VG9FeGl0VnJGb3JTZWFyY2hFbmdpbmVQcm9tb0RpYWxvZyhvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuT25FeGl0VnJSZXF1ZXN0TGlzdGVuZXIsIGFuZHJvaWQuYXBwLkFjdGl2aXR5KTsKLSAgdm9pZCBtYXliZVVucmVnaXN0ZXJWckVudHJ5SG9vaygpOwotICBib29sZWFuIG1FeGl0ZWREdWVUb1Vuc3VwcG9ydGVkTW9kZTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyU2hlbGxEZWxlZ2F0ZSBhY2Nlc3MkMjAwKCk7Ci0gIGphdmEubGFuZy5Cb29sZWFuIG1Jc0RheWRyZWFtQ3VycmVudFZpZXdlcjsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyQ29yZVZlcnNpb25DaGVja2VyIHNWckNvcmVWZXJzaW9uQ2hlY2tlcjsKLSAgYm9vbGVhbiBhY2Nlc3MkMTMwMihvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbERlbGVnYXRlLCBib29sZWFuKTsKLSAgdm9pZCBvblZySW50ZW50VW5zdXBwb3J0ZWQoKTsKLSAgYm9vbGVhbiBtUGF1c2VkOwotICBib29sZWFuIHN1cHBvcnRzMmRJblZyKCk7Ci0gIHZvaWQgbmF0aXZlT25MaWJyYXJ5QXZhaWxhYmxlKCk7Ci0gIGJvb2xlYW4gaXNWckJyb3dzaW5nRW5hYmxlZCgpOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuQ2hyb21lQWN0aXZpdHkgbUFjdGl2aXR5OwotICBib29sZWFuIHNSZWdpc3RlcmVkRGF5ZHJlYW1Ib29rOwotICB2b2lkIHJlc3RvcmVXaW5kb3dNb2RlKCk7Ci0gIHZvaWQgc3dhcEhvc3RBY3Rpdml0eShvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuQ2hyb21lQWN0aXZpdHksIGJvb2xlYW4pOwotICBib29sZWFuIG9uRGVuc2l0eUNoYW5nZWQoaW50LCBpbnQpOwotICB2b2lkIHVucmVnaXN0ZXJEYXlkcmVhbUludGVudCgpOwotICBpbnQgbUNhY2hlZEd2cktleWJvYXJkUGFja2FnZVZlcnNpb247Ci0gIGJvb2xlYW4gZXhwZWN0ZWREZW5zaXR5Q2hhbmdlKCk7Ci0gIHZvaWQgYWNjZXNzJDIyMDAob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLkNocm9tZUFjdGl2aXR5KTsKLSAgdm9pZCBuYXRpdmVEaXNwbGF5QWN0aXZhdGUobG9uZyk7Ci0gIHZvaWQgb25OYXRpdmVMaWJyYXJ5QXZhaWxhYmxlKCk7Ci0gIGJvb2xlYW4gYWNjZXNzJDE3MDIob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyU2hlbGxEZWxlZ2F0ZSwgYm9vbGVhbik7Ci0gIGJvb2xlYW4gb25CYWNrUHJlc3NlZCgpOwotICB2b2lkIG9uRXhpdFZyUmVzdWx0KGJvb2xlYW4pOwotICB2b2lkIGxhbWJkYSRyZXF1ZXN0VG9FeGl0VnJGb3JTZWFyY2hFbmdpbmVQcm9tb0RpYWxvZyQwKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5PbkV4aXRWclJlcXVlc3RMaXN0ZW5lcik7Ci0gIGludCBtRXhwZWN0ZWREZW5zaXR5Q2hhbmdlOwotICB2b2lkIG9uUGF1c2UoKTsKLSAgYm9vbGVhbiBpc0RheWRyZWFtUmVhZHlEZXZpY2UoKTsKLSAgdm9pZCByZXF1ZXN0VG9FeGl0VnJBbmRSdW5PblN1Y2Nlc3MoamF2YS5sYW5nLlJ1bm5hYmxlLCBpbnQpOwotICB2b2lkIGV4aXRXZWJWUkFuZENsZWFyU3RhdGUoKTsKLSAgdm9pZCBkb1ByZUluZmxhdGlvblN0YXJ0dXAob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLkNocm9tZUFjdGl2aXR5LCBhbmRyb2lkLm9zLkJ1bmRsZSk7Ci0gIGJvb2xlYW4gbVZpc2libGU7Ci0gIHZvaWQgb25TdGFydCgpOwotICBib29sZWFuIGNhbmNlbFN0YXJ0dXBBbmltYXRpb25JZk5lZWRlZCgpOwotICBqYXZhLmxhbmcuUnVubmFibGUgZ2V0VnJTZXR0aW5nc0J1dHRvbkxpc3RlbmVyKCk7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIHNWclN1cHBvcnRMZXZlbDsKLSAgYm9vbGVhbiBtSW50ZXJuYWxJbnRlbnRVc2VkVG9TdGFydFZyOwotICB2b2lkIGFjY2VzcyQyMTAwKGJvb2xlYW4pOwotICB2b2lkIG5hdGl2ZVJlZ2lzdGVyVnJBc3NldHNDb21wb25lbnQoKTsKLSAgYm9vbGVhbiBtUHJvYmFibHlJbkRvbjsKLSAgYm9vbGVhbiBoYXNEYXlkcmVhbVN1cHBvcnQoKTsKLSAgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudCBnZXRFbnRlclZyUGVuZGluZ0ludGVudChvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuQ2hyb21lQWN0aXZpdHkpOwotICBib29sZWFuIG1NYXliZUFjdGl2YXRlQWZ0ZXJIZWFkc2V0SW5zZXJ0aW9uOwotICBib29sZWFuIG1UZXN0V29ya2Fyb3VuZERvbnRDYW5jZWxWckVudHJ5T25SZXN1bWU7Ci0gIGJvb2xlYW4gbVJlcXVlc3RlZFdlYlZyOwotICB2b2lkIGVuc3VyZUxpZmVjeWNsZU9ic2VydmVySW5pdGlhbGl6ZWQoKTsKLSAgYm9vbGVhbiBhY2Nlc3MkNjAyKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WclNoZWxsRGVsZWdhdGUsIGJvb2xlYW4pOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbERlbGVnYXRlIHNJbnN0YW5jZTsKLSAgYm9vbGVhbiBtQWN0aXZhdGVGcm9tSGVhZHNldEluc2VydGlvbjsKLSAgdm9pZCBuYXRpdmVTZXRQcmVzZW50UmVzdWx0KGxvbmcsIGJvb2xlYW4pOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbCBnZXRWclNoZWxsKCk7Ci0gIHZvaWQgc2h1dGRvd25Wcihib29sZWFuLCBib29sZWFuKTsKLSAgYm9vbGVhbiBpc0luVnJTZXNzaW9uKCk7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WclNoZWxsRGVsZWdhdGUkVnJCcm9hZGNhc3RSZWNlaXZlciBzVnJCcm9hZGNhc3RSZWNlaXZlcjsKLSAgdm9pZCBpbml0QWZ0ZXJNb2R1bGVJbnN0YWxsKCk7Ci0gIHZvaWQgcHJvbXB0Rm9yRmVlZGJhY2sob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYi5UYWIpOwotICBpbnQgZ2V0VnJTdXBwb3J0TGV2ZWwoKTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyU2hlbGxEZWxlZ2F0ZSRWckxpZmVjeWNsZU9ic2VydmVyIHNWckxpZmVjeWNsZU9ic2VydmVyOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbERlbGVnYXRlJFZyQnJvYWRjYXN0UmVjZWl2ZXIgYWNjZXNzJDAwMCgpOwotICB2b2lkIG9uQWN0aXZpdHlIaWRkZW4oKTsKLSAgdm9pZCBleGl0V2ViVlJQcmVzZW50KCk7Ci0gIHZvaWQgYWNjZXNzJDMwMCgpOwotICBpbnQgZW50ZXJWckludGVybmFsKCk7Ci0gIHZvaWQgb25BY3Rpdml0eUhpZGRlbihvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuQ2hyb21lQWN0aXZpdHkpOwotICB2b2lkIG9uTXVsdGlXaW5kb3dNb2RlQ2hhbmdlZChib29sZWFuKTsKLSAgYm9vbGVhbiBtTGlzdGVuaW5nRm9yV2ViVnJBY3RpdmF0ZTsKLSAgdm9pZCBvblNhdmVJbnN0YW5jZVN0YXRlKGFuZHJvaWQub3MuQnVuZGxlKTsKLSAgYm9vbGVhbiBhY2Nlc3MkOTAwKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WclNoZWxsRGVsZWdhdGUpOwotICBib29sZWFuIGFjY2VzcyQ4MDAob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyU2hlbGxEZWxlZ2F0ZSk7Ci0gIGJvb2xlYW4gYWNjZXNzJDE2MDIob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyU2hlbGxEZWxlZ2F0ZSwgYm9vbGVhbik7Ci0gIHZvaWQgbmF0aXZlT25QYXVzZShsb25nKTsKLSAgYm9vbGVhbiBtRG9uU3VjY2VlZGVkOwotICB2b2lkIGRlc3Ryb3lWclNoZWxsKCk7Ci0gIGludCBtRmVlZGJhY2tGcmVxdWVuY3k7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WckNvcmVWZXJzaW9uQ2hlY2tlciBnZXRWckNvcmVWZXJzaW9uQ2hlY2tlcigpOwotICB2b2lkIG5hdGl2ZURlc3Ryb3kobG9uZyk7Ci0gIGludCBhY2Nlc3MkMTkwMCgpOwotICBib29sZWFuIGNyZWF0ZVZyU2hlbGwoKTsKLSAgdm9pZCBwcm9tcHRGb3JLZXlib2FyZFVwZGF0ZSgpOwotICBsb25nIG1OYXRpdmVWclNoZWxsRGVsZWdhdGU7Ci0gIHZvaWQgb25BY3Rpdml0eVNob3duKCk7Ci0gIGphdmEubGFuZy5SdW5uYWJsZSBnZXRWckNsb3NlQnV0dG9uTGlzdGVuZXIoKTsKLSAgdm9pZCByZXF1ZXN0VG9FeGl0VnIob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLk9uRXhpdFZyUmVxdWVzdExpc3RlbmVyLCBpbnQpOwotICBib29sZWFuIGNhbkVudGVyVnIoKTsKLSAgYm9vbGVhbiBpc1ZyQnJvd3NpbmdTdXBwb3J0ZWQob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLkNocm9tZUFjdGl2aXR5KTsKLSAgYm9vbGVhbiBzVGVzdFZyU2hlbGxEZWxlZ2F0ZU9uU3RhcnR1cDsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyU2hlbGxEZWxlZ2F0ZSBhY2Nlc3MkNDAwKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5DaHJvbWVBY3Rpdml0eSk7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WclNoZWxsRGVsZWdhdGUgZ2V0SW5zdGFuY2UoKTsKLSAgdm9pZCByZWdpc3RlckRheWRyZWFtSW50ZW50KG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5DaHJvbWVBY3Rpdml0eSk7Ci0gIGJvb2xlYW4gYWNjZXNzJDE1MDAob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyU2hlbGxEZWxlZ2F0ZSk7Ci0gIGJvb2xlYW4gc1JlZ2lzdGVyZWRWckFzc2V0c0NvbXBvbmVudDsKLSAgYm9vbGVhbiBpc1ZyQnJvd3NpbmdFbmFibGVkKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5DaHJvbWVBY3Rpdml0eSwgaW50KTsKLSAgYm9vbGVhbiBhY2Nlc3MkNTAyKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WclNoZWxsRGVsZWdhdGUsIGJvb2xlYW4pOwotICBib29sZWFuIGFjY2VzcyQyNjAwKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WclNoZWxsRGVsZWdhdGUpOwotICB2b2lkIGxhbWJkYSRzZXRMaXN0ZW5pbmdGb3JXZWJWckFjdGl2YXRlJDEoKTsKLSAgaW50IG1DYWNoZWRWckNvcmVQYWNrYWdlVmVyc2lvbjsKLSAgdm9pZCBuYXRpdmVPblJlc3VtZShsb25nKTsKLSAgdm9pZCBtYXliZVNldFByZXNlbnRSZXN1bHQoYm9vbGVhbik7Ci0gIGJvb2xlYW4gbVNob3dpbmdEb2ZmRm9yR3ZyVXBkYXRlOwotICB2b2lkIG9uQnJvYWRjYXN0UmVjZWl2ZWQoKTsKLSAgdm9pZCBhY2Nlc3MkMTgwMChvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbERlbGVnYXRlKTsKLSAgYm9vbGVhbiBvbkJhY2tQcmVzc2VkSW50ZXJuYWwoKTsKLSAgdm9pZCBtYXliZVVwZGF0ZVZyU3VwcG9ydExldmVsKCk7Ci0gIHZvaWQgc2V0VnJNb2RlRW5hYmxlZChhbmRyb2lkLmFwcC5BY3Rpdml0eSwgYm9vbGVhbik7Ci0gIHZvaWQgb25SZXN1bWUoKTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyU2hlbGxEZWxlZ2F0ZSBnZXRJbnN0YW5jZShvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuQ2hyb21lQWN0aXZpdHkpOwotICBqYXZhLmxhbmcuUnVubmFibGUgbVNldHRpbmdzQnV0dG9uTGlzdGVuZXI7Ci0gIHZvaWQgcmVnaXN0ZXJWckFzc2V0c0NvbXBvbmVudElmRGF5ZHJlYW1Vc2VyKGJvb2xlYW4pOwotICBib29sZWFuIGFjdGl2aXR5U3VwcG9ydHNQcmVzZW50YXRpb24oYW5kcm9pZC5hcHAuQWN0aXZpdHkpOwotICB2b2lkIGNhbGxPbkV4aXRWclJlcXVlc3RMaXN0ZW5lcihib29sZWFuKTsKLSAgYm9vbGVhbiBtU3RhcnRlZEZyb21WckludGVudDsKLSAgdm9pZCBvblZyU2VydmljZXNNYXliZVVwZGF0ZWQoKTsKLSAgYm9vbGVhbiBjYW5MYXVuY2gyREludGVudHNJbnRlcm5hbCgpOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuT25FeGl0VnJSZXF1ZXN0TGlzdGVuZXIgbU9uRXhpdFZyUmVxdWVzdExpc3RlbmVyOwotICB2b2lkIG1heWJlUmVnaXN0ZXJWckVudHJ5SG9vayhvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuQ2hyb21lQWN0aXZpdHkpOwotICBib29sZWFuIGhhc1JlY29yZEF1ZGlvUGVybWlzc2lvbigpOwotICBib29sZWFuIG9uQWN0aXZpdHlSZXN1bHRXaXRoTmF0aXZlKGludCwgaW50KTsKLSAgaW50IGdldEd2cktleWJvYXJkUGFja2FnZVZlcnNpb24oKTsKLSAgamF2YS51dGlsLlNldCBzVnJNb2RlRW5hYmxlZEFjdGl2aXR5czsKLSAgYm9vbGVhbiBpc1ZyQ29yZUNvbXBhdGlibGUoKTsKLSAgYm9vbGVhbiBpc0RheWRyZWFtQ3VycmVudFZpZXdlckludGVybmFsKCk7Ci0gIGphdmEubGFuZy5SdW5uYWJsZSBtQ2xvc2VCdXR0b25MaXN0ZW5lcjsKLSAgdm9pZCByZXF1ZXN0VG9FeGl0VnJBbmRSdW5PblN1Y2Nlc3MoamF2YS5sYW5nLlJ1bm5hYmxlKTsKLSAgdm9pZCBuYXRpdmVSZWNvcmRWclN0YXJ0QWN0aW9uKGxvbmcsIGludCk7Ci0gIHZvaWQgcmVtb3ZlVnJWaWV3cygpOwotICBib29sZWFuIGlzSW5WcigpOwotICBib29sZWFuIG1SZXN0b3JlU3lzdGVtVWlWaXNpYmlsaXR5OwotICB2b2lkIHJlcXVlc3RUb0V4aXRWcihvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuT25FeGl0VnJSZXF1ZXN0TGlzdGVuZXIpOwotICBib29sZWFuIGVudGVyVnJBZnRlckRvbigpOwotICBib29sZWFuIGVudGVyVnJJZk5lY2Vzc2FyeSgpOwotICB2b2lkIGZvcmNlRXhpdFZySW1tZWRpYXRlbHkoKTsKLSAgdm9pZCBlbnRlclZyKGJvb2xlYW4pOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbCBtVnJTaGVsbDsKLSAgYW5kcm9pZC5vcy5IYW5kbGVyIG1DbGVhck1heWJlQWN0aXZhdGVIYW5kbGVyOwotICB2b2lkIG9uRXhpdFZyUmVxdWVzdFJlc3VsdChib29sZWFuKTsKLSAgdm9pZCBzZXRFeHBlY3RpbmdJbnRlbnQoYm9vbGVhbik7Ci0gIGphdmEubGFuZy5Cb29sZWFuIG1TaG93VnJTZXJ2aWNlc1VwZGF0ZVByb21wdDsKLSAgYm9vbGVhbiBzaG93RG9mZihib29sZWFuKTsKLSAgYm9vbGVhbiBpc1dpbmRvd01vZGVDb3JyZWN0Rm9yVnIoKTsKLSAgdm9pZCByYXdUb3BDb250ZW50T2Zmc2V0Q2hhbmdlZChmbG9hdCk7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WclNoZWxsRGVsZWdhdGUkVnJCcm9hZGNhc3RSZWNlaXZlciBhY2Nlc3MkMDAyKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WclNoZWxsRGVsZWdhdGUkVnJCcm9hZGNhc3RSZWNlaXZlcik7Ci0gIGJvb2xlYW4gYWNjZXNzJDI1MDAob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyU2hlbGxEZWxlZ2F0ZSk7Ci0gIHZvaWQgcHJvbXB0Rm9yRmVlZGJhY2tJZk5lZWRlZChib29sZWFuKTsKLSAgdm9pZCBvbkd2cktleWJvYXJkTWF5YmVVcGRhdGVkKCk7Ci0gIHZvaWQgYWNjZXNzJDI3MDAob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyU2hlbGxEZWxlZ2F0ZSwgYm9vbGVhbiwgYm9vbGVhbik7Ci0gIGJvb2xlYW4gJGFzc2VydGlvbnNEaXNhYmxlZDsKLSAgYm9vbGVhbiBtU2hvd2luZ0RheWRyZWFtRG9mZjsKLSAgaW50IGdldFZyQ29yZVBhY2thZ2VWZXJzaW9uKCk7Ci0gIHZvaWQgaGFuZGxlRG9uRmxvd1N1Y2Nlc3MoKTsKLSAgdm9pZCBhZGRWclZpZXdzKCk7Ci0gIGJvb2xlYW4gYWNjZXNzJDE0MDAob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyU2hlbGxEZWxlZ2F0ZSk7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5DaHJvbWVBY3Rpdml0eSBhY2Nlc3MkNzAwKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WclNoZWxsRGVsZWdhdGUpOwotICB2b2lkIG9uQWN0aXZpdHlTdGF0ZUNoYW5nZShhbmRyb2lkLmFwcC5BY3Rpdml0eSwgaW50KTsKLSAgamF2YS5sYW5nLlJ1bm5hYmxlIG1QZW5kaW5nRXhpdFZyUmVxdWVzdDsKLSAgYm9vbGVhbiBtTmVlZHNBbmltYXRpb25DYW5jZWw7Ci0gIHZvaWQgcHJvbXB0VG9VcGRhdGVWclNlcnZpY2VzKCk7Ci0gIGphdmEubGFuZy5JbnRlZ2VyIG1SZXN0b3JlT3JpZW50YXRpb247Ci0gIHZvaWQgZGVzdHJveSgpOwotICB2b2lkIHN0YXJ0RmVlZGJhY2sob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYi5UYWIpOwotICB2b2lkIG9uU3RvcCgpOwotICB2b2lkIG1heWJlSGFuZGxlVnJJbnRlbnRQcmVOYXRpdmUob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLkNocm9tZUFjdGl2aXR5LCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50KTsKLSAgIDxpbml0PihvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuQ2hyb21lQWN0aXZpdHkpOwotICBib29sZWFuIG1DYW5jZWxsaW5nRW50cnlBbmltYXRpb247Ci0gIHZvaWQgb25OZXdWckludGVudCgpOwotICBib29sZWFuIG1heWJlRXhpdFZyVG9VcGRhdGVWclNlcnZpY2VzKCk7Ci0gIHZvaWQgYWNjZXNzJDExMDAob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyU2hlbGxEZWxlZ2F0ZSwgbG9uZywgaW50KTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyRGF5ZHJlYW1BcGkgZ2V0VnJEYXlkcmVhbUFwaSgpOwotICB2b2lkIG9uQWN0aXZpdHlTaG93bihvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuQ2hyb21lQWN0aXZpdHkpOwotICBib29sZWFuIGlzRGF5ZHJlYW1DdXJyZW50Vmlld2VyKCk7Ci0gIGxvbmcgbmF0aXZlSW5pdCgpOwotICB2b2lkIHNldFdpbmRvd01vZGVGb3JWcigpOwotICB2b2lkIGFjY2VzcyQyMzAwKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWIuVGFiKTsKLSAgamF2YS51dGlsLlNldCBhY2Nlc3MkMTAwKCk7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WckRheWRyZWFtQXBpIHNWckRheWRyZWFtQXBpOwotICBib29sZWFuIGFjdGl2aXR5U3VwcG9ydHNFeGl0RmVlZGJhY2soYW5kcm9pZC5hcHAuQWN0aXZpdHkpOwotICB2b2lkIHJlcXVlc3RUb0V4aXRWckludGVybmFsKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5PbkV4aXRWclJlcXVlc3RMaXN0ZW5lciwgaW50LCBib29sZWFuKTsKLSAgdm9pZCBjYW5jZWxQZW5kaW5nVnJFbnRyeSgpOwotICBib29sZWFuIG1TaG93aW5nRXhpdFZyUHJvbXB0OwotICBib29sZWFuIGNhblJlcXVlc3RSZWNvcmRBdWRpb1Blcm1pc3Npb24oKTsKLSAgYm9vbGVhbiBhY2Nlc3MkMTIwMChvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbERlbGVnYXRlKTsKLSAgYm9vbGVhbiBtSW5WcjsKLSAgYm9vbGVhbiBtVnJCcm93c2VyVXNlZDsKLSAgdm9pZCB1cGRhdGVWclN1cHBvcnRMZXZlbChqYXZhLmxhbmcuSW50ZWdlcik7Ci0gIHZvaWQgcnVuUGVuZGluZ0V4aXRWclRhc2soKTsKLSAgYm9vbGVhbiBtRG9mZk9wdGlvbmFsOwotICBib29sZWFuIGFjY2VzcyQyMDAwKCk7Ci0gIHZvaWQgb25OZXdJbnRlbnRXaXRoTmF0aXZlKG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5DaHJvbWVBY3Rpdml0eSwgYW5kcm9pZC5jb250ZW50LkludGVudCk7Ci0gIGJvb2xlYW4gY2FuTGF1bmNoMkRJbnRlbnRzKCk7Ci0gIGxvbmcgYWNjZXNzJDEwMDAob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyU2hlbGxEZWxlZ2F0ZSk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyU2hlbGxEZWxlZ2F0ZSQxIHsKLSAgamF2YS5sYW5nLkludGVnZXIgZG9JbkJhY2tncm91bmQoKTsKLSAgIDxpbml0PihvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuQ2hyb21lQWN0aXZpdHkpOwotICB2b2lkIG9uUG9zdEV4ZWN1dGUoamF2YS5sYW5nLkludGVnZXIpOwotICBvcmcuY2hyb21pdW0uYmFzZS50YXNrLkFzeW5jVGFzayBleGVjdXRlT25FeGVjdXRvcihqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcik7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5DaHJvbWVBY3Rpdml0eSB2YWwkYWN0aXZpdHk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyU2hlbGxEZWxlZ2F0ZSQyIHsKLSAgamF2YS5sYW5nLlJ1bm5hYmxlIHZhbCRvblN1Y2Nlc3M7Ci0gICA8aW5pdD4oamF2YS5sYW5nLlJ1bm5hYmxlKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbERlbGVnYXRlJDMgewotICAgPGluaXQ+KG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci50YWIuVGFiKTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYi5UYWIgdmFsJHRhYjsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbERlbGVnYXRlJDQgewotICAgPGluaXQ+KG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WclNoZWxsRGVsZWdhdGUpOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbERlbGVnYXRlIHRoaXMkMDsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbERlbGVnYXRlJDUgewotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbERlbGVnYXRlIHRoaXMkMDsKLSAgIDxpbml0PihvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbERlbGVnYXRlKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbERlbGVnYXRlJDYgewotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbERlbGVnYXRlIHRoaXMkMDsKLSAgIDxpbml0PihvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbERlbGVnYXRlKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbERlbGVnYXRlJDcgewotICAgPGluaXQ+KG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WclNoZWxsRGVsZWdhdGUpOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbERlbGVnYXRlIHRoaXMkMDsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbERlbGVnYXRlJDggewotICAgPGluaXQ+KG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WclNoZWxsRGVsZWdhdGUpOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbERlbGVnYXRlIHRoaXMkMDsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJTaGVsbERlbGVnYXRlJFZyQnJvYWRjYXN0UmVjZWl2ZXIgewotICBib29sZWFuICRhc3NlcnRpb25zRGlzYWJsZWQ7Ci0gIGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZSB0YXJnZXRBY3Rpdml0eSgpOwotICAgPGluaXQ+KG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5DaHJvbWVBY3Rpdml0eSk7Ci0gIGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZSBtVGFyZ2V0QWN0aXZpdHk7Ci0gIHZvaWQgdW5yZWdpc3RlcigpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WclNoZWxsRGVsZWdhdGUkVnJMaWZlY3ljbGVPYnNlcnZlciB7Ci0gICA8aW5pdD4ob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyU2hlbGxEZWxlZ2F0ZSQxKTsKLSAgIDxpbml0PigpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WclNoZWxsRGVsZWdhdGUkVnJVbnN1cHBvcnRlZEV4Y2VwdGlvbiB7Ci0gICA8aW5pdD4oKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJUb2FzdCB7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WclRvYXN0TWFuYWdlciBtVnJUb2FzdE1hbmFnZXI7Ci0gIGJvb2xlYW4gJGFzc2VydGlvbnNEaXNhYmxlZDsKLSAgIDxpbml0PihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyVG9hc3RNYW5hZ2VyKTsKLSAgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcgZmluZFRleHRWaWV3UmVjdXJzaXZlKGFuZHJvaWQudmlldy5WaWV3KTsKLSAgYW5kcm9pZC52aWV3LlZpZXcgZ2V0VmlldygpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WclRvYXN0TWFuYWdlciB7Ci0gIHZvaWQgc2hvd1RvYXN0KGphdmEubGFuZy5DaGFyU2VxdWVuY2UpOwotICB2b2lkIGNhbmNlbFRvYXN0KCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyVWlXaWRnZXRGYWN0b3J5IHsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyU2hlbGwgbVZyU2hlbGw7Ci0gICA8aW5pdD4ob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyU2hlbGwsIG9yZy5jaHJvbWl1bS51aS5tb2RhbGRpYWxvZy5Nb2RhbERpYWxvZ01hbmFnZXIpOwotICBvcmcuY2hyb21pdW0udWkubW9kYWxkaWFsb2cuTW9kYWxEaWFsb2dNYW5hZ2VyIG1Nb2RhbERpYWxvZ01hbmFnZXI7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyVmlld0NvbnRhaW5lciB7Ci0gIGFuZHJvaWQudmlldy5WaWV3IGdldElucHV0VGFyZ2V0KCk7Ci0gIHZvaWQgcmVtb3ZlQWxsVmlld3MoKTsKLSAgdm9pZCBzZXRMYXlvdXRQYXJhbXMoYW5kcm9pZC52aWV3LlZpZXdHcm91cCRMYXlvdXRQYXJhbXMpOwotICBhbmRyb2lkLnZpZXcuVmlld1RyZWVPYnNlcnZlciBnZXRWaWV3VHJlZU9ic2VydmVyKCk7Ci0gIGJvb2xlYW4gJGFzc2VydGlvbnNEaXNhYmxlZDsKLSAgdm9pZCBzZXRTdXJmYWNlKGFuZHJvaWQudmlldy5TdXJmYWNlKTsKLSAgdm9pZCByZXNpemUoaW50LCBpbnQpOwotICBhbmRyb2lkLnZpZXcuU3VyZmFjZSBtU3VyZmFjZTsKLSAgdm9pZCBkcmF3U3VwZXIoYW5kcm9pZC5ncmFwaGljcy5DYW52YXMpOwotICBib29sZWFuIGlzRGlydHkoKTsKLSAgdm9pZCBpbnZhbGlkYXRlKCk7Ci0gIHZvaWQgZGVzdHJveSgpOwotICBpbnQgZ2V0Q2hpbGRDb3VudCgpOwotICB2b2lkIGFkZFZpZXcoYW5kcm9pZC52aWV3LlZpZXcpOwotICB2b2lkIHNldEJhY2tncm91bmRDb2xvcihpbnQpOwotICBhbmRyb2lkLnZpZXcuVmlld1RyZWVPYnNlcnZlciRPblByZURyYXdMaXN0ZW5lciBtUHJlZHJhd0xpc3RlbmVyOwotICBhbmRyb2lkLnZpZXcuVmlldyBnZXRDaGlsZEF0KGludCk7Ci0gICA8aW5pdD4oYW5kcm9pZC5jb250ZW50LkNvbnRleHQpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WclZpZXdDb250YWluZXIkMSB7Ci0gICA8aW5pdD4ob3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyVmlld0NvbnRhaW5lcik7Ci0gIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WclZpZXdDb250YWluZXIgdGhpcyQwOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WcldpbmRvd0FuZHJvaWQgewotICBvcmcuY2hyb21pdW0udWkuZGlzcGxheS5EaXNwbGF5QW5kcm9pZCBnZXREaXNwbGF5KCk7Ci0gIHZvaWQgb25BY3Rpdml0eVN0YXJ0ZWQoKTsKLSAgYW5kcm9pZC5hcHAuQWN0aXZpdHkgYWN0aXZpdHlGcm9tQ29udGV4dChhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCk7Ci0gIHZvaWQgb25BY3Rpdml0eVN0b3BwZWQoKTsKLSAgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlIGdldENvbnRleHQoKTsKLSAgdm9pZCBzZXRBbmRyb2lkUGVybWlzc2lvbkRlbGVnYXRlKG9yZy5jaHJvbWl1bS51aS5iYXNlLkFuZHJvaWRQZXJtaXNzaW9uRGVsZWdhdGUpOwotICB2b2lkIHNldFZTeW5jUGF1c2VkKGJvb2xlYW4pOwotICAgPGluaXQ+KGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBvcmcuY2hyb21pdW0udWkuZGlzcGxheS5EaXNwbGF5QW5kcm9pZCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLlZyV2luZG93QW5kcm9pZCRBY3Rpdml0eUFuZHJvaWRQZXJtaXNzaW9uRGVsZWdhdGUgewotICAgPGluaXQ+KG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5WcldpbmRvd0FuZHJvaWQpOwotICBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJXaW5kb3dBbmRyb2lkIHRoaXMkMDsKLSAgIDxpbml0PihvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJXaW5kb3dBbmRyb2lkLCBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIuVnJXaW5kb3dBbmRyb2lkJDEpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5rZXlib2FyZC5HdnJLZXlib2FyZExvYWRlckNsaWVudCB7Ci0gIGJvb2xlYW4gc0ZhaWxMb2FkRm9yVGVzdGluZzsKLSAgY29tLmdvb2dsZS52ci5rZXlib2FyZC5JR3ZyS2V5Ym9hcmRMb2FkZXIgc0xvYWRlcjsKLSAgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgZ2V0UmVtb3RlQ29udGV4dChhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCk7Ci0gIGphdmEubGFuZy5PYmplY3QgZ2V0UmVtb3RlQ2xhc3NMb2FkZXIoKTsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLmtleWJvYXJkLkd2cktleWJvYXJkTG9hZGVyQ2xpZW50JEtleWJvYXJkQ29udGV4dFdyYXBwZXIgc0NvbnRleHRXcmFwcGVyOwotICBjb20uZ29vZ2xlLnZyLmtleWJvYXJkLklHdnJLZXlib2FyZExvYWRlciBnZXRMb2FkZXIoKTsKLSAgYW5kcm9pZC5vcy5JQmluZGVyIG5ld0JpbmRlcihqYXZhLmxhbmcuQ2xhc3NMb2FkZXIsIGphdmEubGFuZy5TdHJpbmcpOwotICBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgc1JlbW90ZUNsYXNzTG9hZGVyOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5rZXlib2FyZC5HdnJLZXlib2FyZExvYWRlckNsaWVudCRLZXlib2FyZENvbnRleHRXcmFwcGVyIHsKLSAgIDxpbml0PihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgYW5kcm9pZC5jb250ZW50LkNvbnRleHQpOwotICAgPGluaXQ+KGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLmtleWJvYXJkLkd2cktleWJvYXJkTG9hZGVyQ2xpZW50JDEpOwotICBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBtS2V5Ym9hcmRDb250ZXh0OwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci52ci5rZXlib2FyZC5UZXh0RWRpdEFjdGlvbiB7Ci0gIGludCBtVHlwZTsKLSAgamF2YS5sYW5nLlN0cmluZyBtVGV4dDsKLSAgaW50IG1OZXdDdXJzb3JQb3NpdGlvbjsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIua2V5Ym9hcmQuVnJJbnB1dE1ldGhvZE1hbmFnZXJXcmFwcGVyIHsKLSAgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnZyLmtleWJvYXJkLlZySW5wdXRNZXRob2RNYW5hZ2VyV3JhcHBlciRCcm93c2VyS2V5Ym9hcmRJbnRlcmZhY2UgbUtleWJvYXJkOwotICAgPGluaXQ+KGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIua2V5Ym9hcmQuVnJJbnB1dE1ldGhvZE1hbmFnZXJXcmFwcGVyJEJyb3dzZXJLZXlib2FyZEludGVyZmFjZSk7Ci0gIGFuZHJvaWQudmlldy5WaWV3IG1WaWV3OwotICBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBtQ29udGV4dDsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudnIua2V5Ym9hcmQuVnJJbnB1dE1ldGhvZE1hbmFnZXJXcmFwcGVyJEJyb3dzZXJLZXlib2FyZEludGVyZmFjZSB7Ci0gIHZvaWQgdXBkYXRlSW5kaWNlcyhpbnQsIGludCwgaW50LCBpbnQpOwotICB2b2lkIHNob3dTb2Z0SW5wdXQoYm9vbGVhbik7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLndpZGdldC5maW5kaW5wYWdlLkZpbmRUb29sYmFyTWFuYWdlciB7Ci0gIHZvaWQgaGlkZVRvb2xiYXIoKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY2hyb21lLnZyLlIgewotICB2b2lkIG9uUmVzb3VyY2VzTG9hZGVkU3RyaW5nKGludCk7Ci0gIGJvb2xlYW4gc1Jlc291cmNlc0RpZExvYWQ7Ci0gIHZvaWQgb25SZXNvdXJjZXNMb2FkZWREcmF3YWJsZShpbnQpOwotICBib29sZWFuICRhc3NlcnRpb25zRGlzYWJsZWQ7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmNocm9tZS52ci5SJGRyYXdhYmxlIHsKLSAgaW50IHZyX3NlcnZpY2VzOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jaHJvbWUudnIuUiRzdHJpbmcgewotICBpbnQgdnJfc2hlbGxfZmVlZGJhY2tfaW5mb2Jhcl9kZXNjcmlwdGlvbjsKLSAgaW50IHZyX3NlcnZpY2VzX2NoZWNrX2luZm9iYXJfdXBkYXRlX2J1dHRvbjsKLSAgaW50IHZyX3NlcnZpY2VzX2NoZWNrX2luZm9iYXJfdXBkYXRlX3RleHQ7Ci0gIGludCB2cl9zZXJ2aWNlc19jaGVja19pbmZvYmFyX2luc3RhbGxfdGV4dDsKLSAgaW50IHZyX3NlcnZpY2VzX2NoZWNrX2luZm9iYXJfaW5zdGFsbF9idXR0b247Ci0gIGludCB2cl9zaGVsbF9mZWVkYmFja19pbmZvYmFyX2ZlZWRiYWNrX2J1dHRvbjsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY29udGVudF9wdWJsaWMuYnJvd3Nlci5JbWVBZGFwdGVyIHsKLSAgdm9pZCBzZXRJbnB1dE1ldGhvZE1hbmFnZXJXcmFwcGVyKG9yZy5jaHJvbWl1bS5jb250ZW50X3B1YmxpYy5icm93c2VyLklucHV0TWV0aG9kTWFuYWdlcldyYXBwZXIpOwotICBvcmcuY2hyb21pdW0uY29udGVudF9wdWJsaWMuYnJvd3Nlci5JbnB1dE1ldGhvZE1hbmFnZXJXcmFwcGVyIGNyZWF0ZURlZmF1bHRJbnB1dE1ldGhvZE1hbmFnZXJXcmFwcGVyKGFuZHJvaWQuY29udGVudC5Db250ZXh0KTsKLSAgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0Q29ubmVjdGlvbiBnZXRBY3RpdmVJbnB1dENvbm5lY3Rpb24oKTsKLSAgb3JnLmNocm9taXVtLmNvbnRlbnRfcHVibGljLmJyb3dzZXIuSW1lQWRhcHRlciBmcm9tV2ViQ29udGVudHMob3JnLmNocm9taXVtLmNvbnRlbnRfcHVibGljLmJyb3dzZXIuV2ViQ29udGVudHMpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jb250ZW50X3B1YmxpYy5icm93c2VyLkxvYWRVcmxQYXJhbXMgewotICAgPGluaXQ+KGphdmEubGFuZy5TdHJpbmcpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jb250ZW50X3B1YmxpYy5icm93c2VyLk1vdGlvbkV2ZW50U3ludGhlc2l6ZXIgewotICBvcmcuY2hyb21pdW0uY29udGVudF9wdWJsaWMuYnJvd3Nlci5Nb3Rpb25FdmVudFN5bnRoZXNpemVyIGNyZWF0ZShhbmRyb2lkLnZpZXcuVmlldyk7Ci0gIHZvaWQgc2V0UG9pbnRlcihpbnQsIGludCwgaW50LCBpbnQsIGludCk7Ci0gIHZvaWQgaW5qZWN0KGludCwgaW50LCBsb25nKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uY29udGVudF9wdWJsaWMuYnJvd3Nlci5TY3JlZW5PcmllbnRhdGlvblByb3ZpZGVyIHsKLSAgdm9pZCBzZXRPcmllbnRhdGlvbkRlbGVnYXRlKG9yZy5jaHJvbWl1bS5jb250ZW50X3B1YmxpYy5icm93c2VyLlNjcmVlbk9yaWVudGF0aW9uRGVsZWdhdGUpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jb250ZW50X3B1YmxpYy5icm93c2VyLlVpVGhyZWFkVGFza1RyYWl0cyB7Ci0gIG9yZy5jaHJvbWl1bS5iYXNlLnRhc2suVGFza1RyYWl0cyBERUZBVUxUOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jb250ZW50X3B1YmxpYy5icm93c2VyLlZpZXdFdmVudFNpbmsgewotICB2b2lkIG9uV2luZG93Rm9jdXNDaGFuZ2VkKGJvb2xlYW4pOwotICBvcmcuY2hyb21pdW0uY29udGVudF9wdWJsaWMuYnJvd3Nlci5WaWV3RXZlbnRTaW5rIGZyb20ob3JnLmNocm9taXVtLmNvbnRlbnRfcHVibGljLmJyb3dzZXIuV2ViQ29udGVudHMpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS5jb250ZW50X3B1YmxpYy5icm93c2VyLldlYkNvbnRlbnRzIHsKLSAgb3JnLmNocm9taXVtLnVpLmJhc2UuRXZlbnRGb3J3YXJkZXIgZ2V0RXZlbnRGb3J3YXJkZXIoKTsKLSAgdm9pZCBzZXRTaXplKGludCwgaW50KTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0uZGV2aWNlLnZyLk5vblByZXNlbnRpbmdHdnJDb250ZXh0IHsKLSAgbG9uZyBtTmF0aXZlR3ZyRGV2aWNlOwotICAgPGluaXQ+KGxvbmcpOwotICBjb20uZ29vZ2xlLnZyLm5kay5iYXNlLkd2ckFwaSBtR3ZyQXBpOwotICB2b2lkIHJlc3VtZSgpOwotICBib29sZWFuIG1SZXN1bWVkOwotICBjb20uZ29vZ2xlLnZyLmNhcmRib2FyZC5EaXNwbGF5U3luY2hyb25pemVyIG1EaXNwbGF5U3luY2hyb25pemVyOwotICB2b2lkIG9uRGlzcGxheUNvbmZpZ3VyYXRpb25DaGFuZ2VkKCk7Ci0gIHZvaWQgbmF0aXZlT25EaXNwbGF5Q29uZmlndXJhdGlvbkNoYW5nZWQobG9uZyk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLmRldmljZS52ci5Ob25QcmVzZW50aW5nR3ZyQ29udGV4dCQxIHsKLSAgIDxpbml0PihvcmcuY2hyb21pdW0uZGV2aWNlLnZyLk5vblByZXNlbnRpbmdHdnJDb250ZXh0LCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgYW5kcm9pZC52aWV3LkRpc3BsYXkpOwotICBvcmcuY2hyb21pdW0uZGV2aWNlLnZyLk5vblByZXNlbnRpbmdHdnJDb250ZXh0IHRoaXMkMDsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0udWkuVWlVdGlscyB7Ci0gIHZvaWQgcmVtb3ZlVmlld0Zyb21QYXJlbnQoYW5kcm9pZC52aWV3LlZpZXcpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS51aS5iYXNlLkFjdGl2aXR5V2luZG93QW5kcm9pZCB7Ci0gIGJvb2xlYW4gY2FuUmVxdWVzdFBlcm1pc3Npb24oamF2YS5sYW5nLlN0cmluZyk7Ci0gIHZvaWQgcmVxdWVzdFBlcm1pc3Npb25zKGphdmEubGFuZy5TdHJpbmdbXSwgb3JnLmNocm9taXVtLnVpLmJhc2UuUGVybWlzc2lvbkNhbGxiYWNrKTsKLSAgYm9vbGVhbiBoYXNQZXJtaXNzaW9uKGphdmEubGFuZy5TdHJpbmcpOwotICBvcmcuY2hyb21pdW0udWkuZGlzcGxheS5EaXNwbGF5QW5kcm9pZCBnZXREaXNwbGF5KCk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLnVpLmJhc2UuRXZlbnRGb3J3YXJkZXIgewotICBib29sZWFuIG9uR2VuZXJpY01vdGlvbkV2ZW50KGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCk7Ci0gIGJvb2xlYW4gZGlzcGF0Y2hLZXlFdmVudChhbmRyb2lkLnZpZXcuS2V5RXZlbnQpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS51aS5iYXNlLlBlcm1pc3Npb25DYWxsYmFjayB7Ci0gIHZvaWQgb25SZXF1ZXN0UGVybWlzc2lvbnNSZXN1bHQoamF2YS5sYW5nLlN0cmluZ1tdLCBpbnRbXSk7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLnVpLmJhc2UuV2luZG93QW5kcm9pZCB7Ci0gICA8aW5pdD4oYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIG9yZy5jaHJvbWl1bS51aS5kaXNwbGF5LkRpc3BsYXlBbmRyb2lkKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0udWkuZGlzcGxheS5EaXNwbGF5QW5kcm9pZCB7Ci0gIGZsb2F0IGdldERpcFNjYWxlKCk7Ci0gIG9yZy5jaHJvbWl1bS51aS5kaXNwbGF5LkRpc3BsYXlBbmRyb2lkIGdldE5vbk11bHRpRGlzcGxheShhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCk7Ci0gIGZsb2F0IGdldEFuZHJvaWRVSVNjYWxpbmcoKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0udWkuZGlzcGxheS5WaXJ0dWFsRGlzcGxheUFuZHJvaWQgewotICB2b2lkIHVwZGF0ZShhbmRyb2lkLmdyYXBoaWNzLlBvaW50LCBqYXZhLmxhbmcuRmxvYXQsIGphdmEubGFuZy5GbG9hdCwgamF2YS5sYW5nLkludGVnZXIsIGphdmEubGFuZy5JbnRlZ2VyLCBqYXZhLmxhbmcuSW50ZWdlciwgamF2YS5sYW5nLkJvb2xlYW4sIGphdmEubGFuZy5Cb29sZWFuLCBqYXZhLmxhbmcuRmxvYXQsIGFuZHJvaWQudmlldy5EaXNwbGF5JE1vZGUsIGphdmEudXRpbC5MaXN0KTsKLSAgdm9pZCBzZXRUbyhvcmcuY2hyb21pdW0udWkuZGlzcGxheS5EaXNwbGF5QW5kcm9pZCk7Ci0gIHZvaWQgZGVzdHJveSgpOwotICBvcmcuY2hyb21pdW0udWkuZGlzcGxheS5WaXJ0dWFsRGlzcGxheUFuZHJvaWQgY3JlYXRlVmlydHVhbERpc3BsYXkoKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0udWkubW9kYWxkaWFsb2cuTW9kYWxEaWFsb2dNYW5hZ2VyIHsKLSAgdm9pZCBkaXNtaXNzRGlhbG9nKG9yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuUHJvcGVydHlNb2RlbCwgaW50KTsKLSAgdm9pZCBzaG93RGlhbG9nKG9yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuUHJvcGVydHlNb2RlbCwgaW50KTsKLSAgdm9pZCBkaXNtaXNzQWxsRGlhbG9ncyhpbnQpOwotICAgPGluaXQ+KG9yZy5jaHJvbWl1bS51aS5tb2RhbGRpYWxvZy5Nb2RhbERpYWxvZ01hbmFnZXIkUHJlc2VudGVyLCBpbnQpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS51aS5tb2RhbGRpYWxvZy5Nb2RhbERpYWxvZ01hbmFnZXIkUHJlc2VudGVyIHsKLSAgIDxpbml0PigpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS51aS5tb2RhbGRpYWxvZy5Nb2RhbERpYWxvZ1Byb3BlcnRpZXMgewotICBvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5S2V5W10gQUxMX0tFWVM7Ci0gIG9yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuUHJvcGVydHlNb2RlbCRSZWFkYWJsZU9iamVjdFByb3BlcnR5S2V5IENPTlRST0xMRVI7Ci0gIG9yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuUHJvcGVydHlNb2RlbCRXcml0YWJsZU9iamVjdFByb3BlcnR5S2V5IENVU1RPTV9WSUVXOwotICBvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5TW9kZWwkV3JpdGFibGVPYmplY3RQcm9wZXJ0eUtleSBORUdBVElWRV9CVVRUT05fVEVYVDsKLSAgb3JnLmNocm9taXVtLnVpLm1vZGVsdXRpbC5Qcm9wZXJ0eU1vZGVsJFdyaXRhYmxlT2JqZWN0UHJvcGVydHlLZXkgTUVTU0FHRTsKLSAgb3JnLmNocm9taXVtLnVpLm1vZGVsdXRpbC5Qcm9wZXJ0eU1vZGVsJFdyaXRhYmxlT2JqZWN0UHJvcGVydHlLZXkgUE9TSVRJVkVfQlVUVE9OX1RFWFQ7Ci19Ci0KLS1rZWVwLGFsbG93b2JmdXNjYXRpb24gY2xhc3Mgb3JnLmNocm9taXVtLnVpLm1vZGVsdXRpbC5Qcm9wZXJ0eU1vZGVsJEJ1aWxkZXIgewotICBvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5TW9kZWwkQnVpbGRlciB3aXRoKG9yZy5jaHJvbWl1bS51aS5tb2RlbHV0aWwuUHJvcGVydHlNb2RlbCRSZWFkYWJsZU9iamVjdFByb3BlcnR5S2V5LCBqYXZhLmxhbmcuT2JqZWN0KTsKLSAgb3JnLmNocm9taXVtLnVpLm1vZGVsdXRpbC5Qcm9wZXJ0eU1vZGVsIGJ1aWxkKCk7Ci0gICA8aW5pdD4ob3JnLmNocm9taXVtLnVpLm1vZGVsdXRpbC5Qcm9wZXJ0eUtleVtdKTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5TW9kZWxDaGFuZ2VQcm9jZXNzb3IgewotICB2b2lkIGRlc3Ryb3koKTsKLSAgb3JnLmNocm9taXVtLnVpLm1vZGVsdXRpbC5Qcm9wZXJ0eU1vZGVsQ2hhbmdlUHJvY2Vzc29yIGNyZWF0ZShvcmcuY2hyb21pdW0udWkubW9kZWx1dGlsLlByb3BlcnR5T2JzZXJ2YWJsZSwgamF2YS5sYW5nLk9iamVjdCwgb3JnLmNocm9taXVtLnVpLm1vZGVsdXRpbC5Qcm9wZXJ0eU1vZGVsQ2hhbmdlUHJvY2Vzc29yJFZpZXdCaW5kZXIpOwotfQotCi0ta2VlcCxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIG9yZy5jaHJvbWl1bS51aS53aWRnZXQuVWlXaWRnZXRGYWN0b3J5IHsKLSAgb3JnLmNocm9taXVtLnVpLndpZGdldC5VaVdpZGdldEZhY3RvcnkgZ2V0SW5zdGFuY2UoKTsKLSAgIDxpbml0PigpOwotICB2b2lkIHNldEluc3RhbmNlKG9yZy5jaHJvbWl1bS51aS53aWRnZXQuVWlXaWRnZXRGYWN0b3J5KTsKLX0KLQotLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBvcmcuanNvbi5KU09OT2JqZWN0IHsKLSAgamF2YS5sYW5nLk9iamVjdCBOVUxMOwotfQpkaWZmIC0tZ2l0IGEvY2hyb21lL2FuZHJvaWQvZmVhdHVyZXMvdnIvdnJfbW9kdWxlLmduaSBiL2Nocm9tZS9hbmRyb2lkL2ZlYXR1cmVzL3ZyL3ZyX21vZHVsZS5nbmkKaW5kZXggMGUyMGYzNC4uNTU0ODY0MCAxMDA2NDQKLS0tIGEvY2hyb21lL2FuZHJvaWQvZmVhdHVyZXMvdnIvdnJfbW9kdWxlLmduaQorKysgYi9jaHJvbWUvYW5kcm9pZC9mZWF0dXJlcy92ci92cl9tb2R1bGUuZ25pCkBAIC0xMSw3ICsxMSw2IEBACiAgIG5hbWUgPSAidnIiCiAgIGphdmFfZGVwcyA9IFsgIi8vY2hyb21lL2FuZHJvaWQvZmVhdHVyZXMvdnI6amF2YSIgXQogICBhbmRyb2lkX21hbmlmZXN0ID0gIi8vY2hyb21lL2FuZHJvaWQvZmVhdHVyZXMvdnIvamF2YS9BbmRyb2lkTWFuaWZlc3QueG1sIgotICBwcm9ndWFyZF9hc3luYyA9IGFzeW5jX3ZyCiAgIGlmICh1c2VfbmF0aXZlX3BhcnRpdGlvbnMpIHsKICAgICBuYXRpdmVfZGVwcyA9IFsgIi8vY2hyb21lL2Jyb3dzZXIvdnI6dnJfdWkiIF0KICAgICBuYXRpdmVfZW50cnlwb2ludHMgPSAiLy9jaHJvbWUvYnJvd3Nlci92ci9tb2R1bGVfZXhwb3J0cy5sc3QiCmRpZmYgLS1naXQgYS9jaHJvbWUvYW5kcm9pZC9qYXZhL3Jlcy9kcmF3YWJsZS9oYWlybGluZV9ib3JkZXJfY2FyZF9iYWNrZ3JvdW5kX3dpdGhfaW5zZXQueG1sIGIvY2hyb21lL2FuZHJvaWQvZmVlZC9jb3JlL2phdmEvcmVzL2RyYXdhYmxlL2hhaXJsaW5lX2JvcmRlcl9jYXJkX2JhY2tncm91bmRfd2l0aF9pbnNldC54bWwKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gY2hyb21lL2FuZHJvaWQvamF2YS9yZXMvZHJhd2FibGUvaGFpcmxpbmVfYm9yZGVyX2NhcmRfYmFja2dyb3VuZF93aXRoX2luc2V0LnhtbApyZW5hbWUgdG8gY2hyb21lL2FuZHJvaWQvZmVlZC9jb3JlL2phdmEvcmVzL2RyYXdhYmxlL2hhaXJsaW5lX2JvcmRlcl9jYXJkX2JhY2tncm91bmRfd2l0aF9pbnNldC54bWwKaW5kZXggMGI0YzYyYi4uMTdjYjcwMCAxMDA2NDQKLS0tIGEvY2hyb21lL2FuZHJvaWQvamF2YS9yZXMvZHJhd2FibGUvaGFpcmxpbmVfYm9yZGVyX2NhcmRfYmFja2dyb3VuZF93aXRoX2luc2V0LnhtbAorKysgYi9jaHJvbWUvYW5kcm9pZC9mZWVkL2NvcmUvamF2YS9yZXMvZHJhd2FibGUvaGFpcmxpbmVfYm9yZGVyX2NhcmRfYmFja2dyb3VuZF93aXRoX2luc2V0LnhtbApAQCAtNyw3ICs3LDYgQEAKIDxzaGFwZQogICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICB4bWxuczp0b29scz0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vdG9vbHMiCi0gICAgdG9vbHM6aWdub3JlPSJVbnVzZWRSZXNvdXJjZXMiCiAgICAgYW5kcm9pZDpzaGFwZT0icmVjdGFuZ2xlIiA+CiAgICAgPHNvbGlkIGFuZHJvaWQ6Y29sb3I9IkBjb2xvci9tb2Rlcm5fcHJpbWFyeV9jb2xvciIgLz4KICAgICA8c3Ryb2tlIGFuZHJvaWQ6d2lkdGg9IjFkcCIgYW5kcm9pZDpjb2xvcj0iQGNvbG9yL2hhaXJsaW5lX3N0cm9rZV9jb2xvciIvPgpkaWZmIC0tZ2l0IGEvY2hyb21lL2FuZHJvaWQvZmVlZC9jb3JlL2phdmEvc3JjL29yZy9jaHJvbWl1bS9jaHJvbWUvYnJvd3Nlci9mZWVkL0ZlZWRTdXJmYWNlQ29vcmRpbmF0b3IuamF2YSBiL2Nocm9tZS9hbmRyb2lkL2ZlZWQvY29yZS9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvZmVlZC9GZWVkU3VyZmFjZUNvb3JkaW5hdG9yLmphdmEKaW5kZXggM2M0NWVmYy4uZjNjYWM4MiAxMDA2NDQKLS0tIGEvY2hyb21lL2FuZHJvaWQvZmVlZC9jb3JlL2phdmEvc3JjL29yZy9jaHJvbWl1bS9jaHJvbWUvYnJvd3Nlci9mZWVkL0ZlZWRTdXJmYWNlQ29vcmRpbmF0b3IuamF2YQorKysgYi9jaHJvbWUvYW5kcm9pZC9mZWVkL2NvcmUvamF2YS9zcmMvb3JnL2Nocm9taXVtL2Nocm9tZS9icm93c2VyL2ZlZWQvRmVlZFN1cmZhY2VDb29yZGluYXRvci5qYXZhCkBAIC0zMyw3ICszMyw2IEBACiAKIGltcG9ydCBvcmcuY2hyb21pdW0uYmFzZS5BcGlDb21wYXRpYmlsaXR5VXRpbHM7CiBpbXBvcnQgb3JnLmNocm9taXVtLmJhc2UuVmlzaWJsZUZvclRlc3Rpbmc7Ci1pbXBvcnQgb3JnLmNocm9taXVtLmNocm9tZS5SOwogaW1wb3J0IG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5DaHJvbWVBY3Rpdml0eTsKIGltcG9ydCBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuR2xvYmFsRGlzY2FyZGFibGVSZWZlcmVuY2VQb29sOwogaW1wb3J0IG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5mZWVkLnRvb2x0aXAuQmFzaWNUb29sdGlwQXBpOwpAQCAtNDksNiArNDgsNyBAQAogaW1wb3J0IG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci51aS53aWRnZXQuZGlzcGxheXN0eWxlLlVpQ29uZmlnOwogaW1wb3J0IG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci51aS53aWRnZXQuZGlzcGxheXN0eWxlLlZpZXdSZXNpemVyOwogaW1wb3J0IG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci51dGlsLlZpZXdVdGlsczsKK2ltcG9ydCBvcmcuY2hyb21pdW0uY2hyb21lLmZlZWQuUjsKIGltcG9ydCBvcmcuY2hyb21pdW0udWkuVWlVdGlsczsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CmRpZmYgLS1naXQgYS9jaHJvbWUvYW5kcm9pZC9qYXZhL3NyYy9QUkVTVUJNSVQucHkgYi9jaHJvbWUvYW5kcm9pZC9qYXZhL3NyYy9QUkVTVUJNSVQucHkKaW5kZXggYjMxMjViOC4uYThhM2Q2NiAxMDA2NDQKLS0tIGEvY2hyb21lL2FuZHJvaWQvamF2YS9zcmMvUFJFU1VCTUlULnB5CisrKyBiL2Nocm9tZS9hbmRyb2lkL2phdmEvc3JjL1BSRVNVQk1JVC5weQpAQCAtNzksNyArNzksNiBAQAogICAjIGdlbmVyYWwsIHByZWZlcmVuY2UgYW5kIEZSRSByZWxhdGVkIFVJcyBhcmUgbm90IHJlbGV2YW50IHRvIFZSIG1vZGUuCiAgIGJsYWNrbGlzdCA9ICgKICAgICAgIEJST1dTRVJfUk9PVCArICdicm93c2Vyc2VydmljZXMvQ2xlYXJEYXRhRGlhbG9nQWN0aXZpdHkuamF2YScsCi0gICAgICBCUk9XU0VSX1JPT1QgKyAnaW5pdC9JbnZhbGlkU3RhcnR1cERpYWxvZy5qYXZhJywKICAgICAgIEJST1dTRVJfUk9PVCArICdwYXNzd29yZF9tYW5hZ2VyL0FjY291bnRDaG9vc2VyRGlhbG9nLmphdmEnLAogICAgICAgQlJPV1NFUl9ST09UICsgJ3Bhc3N3b3JkX21hbmFnZXIvQXV0b1NpZ25pbkZpcnN0UnVuRGlhbG9nLmphdmEnLAogICAgICAgQlJPV1NFUl9ST09UICsgcidwcmVmZXJlbmNlc1tcXFwvXS4qJywKZGlmZiAtLWdpdCBhL2Nocm9tZS9hbmRyb2lkL2phdmEvc3JjL29yZy9jaHJvbWl1bS9jaHJvbWUvYnJvd3Nlci9DaHJvbWVBcHBsaWNhdGlvbi5qYXZhIGIvY2hyb21lL2FuZHJvaWQvamF2YS9zcmMvb3JnL2Nocm9taXVtL2Nocm9tZS9icm93c2VyL0Nocm9tZUFwcGxpY2F0aW9uLmphdmEKaW5kZXggMTQ3OTc2My4uYjNmYjk5MiAxMDA2NDQKLS0tIGEvY2hyb21lL2FuZHJvaWQvamF2YS9zcmMvb3JnL2Nocm9taXVtL2Nocm9tZS9icm93c2VyL0Nocm9tZUFwcGxpY2F0aW9uLmphdmEKKysrIGIvY2hyb21lL2FuZHJvaWQvamF2YS9zcmMvb3JnL2Nocm9taXVtL2Nocm9tZS9icm93c2VyL0Nocm9tZUFwcGxpY2F0aW9uLmphdmEKQEAgLTQsNyArNCw2IEBACiAKIHBhY2thZ2Ugb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyOwogCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5hcHAuQXBwbGljYXRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKQEAgLTEzLDcgKzEyLDYgQEAKIAogaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTnVsbGFibGU7CiAKLWltcG9ydCBvcmcuY2hyb21pdW0uYmFzZS5BY3Rpdml0eVN0YXRlOwogaW1wb3J0IG9yZy5jaHJvbWl1bS5iYXNlLkFwcGxpY2F0aW9uU3RhdGU7CiBpbXBvcnQgb3JnLmNocm9taXVtLmJhc2UuQXBwbGljYXRpb25TdGF0dXM7CiBpbXBvcnQgb3JnLmNocm9taXVtLmJhc2UuQnVpbGRDb25maWc7CkBAIC0yNSw3ICsyMyw2IEBACiBpbXBvcnQgb3JnLmNocm9taXVtLmJhc2UuUGF0aFV0aWxzOwogaW1wb3J0IG9yZy5jaHJvbWl1bS5iYXNlLlRyYWNlRXZlbnQ7CiBpbXBvcnQgb3JnLmNocm9taXVtLmJhc2UuYW5ub3RhdGlvbnMuTWFpbkRleDsKLWltcG9ydCBvcmcuY2hyb21pdW0uYmFzZS5saWJyYXJ5X2xvYWRlci5Qcm9jZXNzSW5pdEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuY2hyb21pdW0uYmFzZS5tZW1vcnkuTWVtb3J5UHJlc3N1cmVNb25pdG9yOwogaW1wb3J0IG9yZy5jaHJvbWl1bS5iYXNlLm11bHRpZGV4LkNocm9taXVtTXVsdGlEZXhJbnN0YWxsZXI7CiBpbXBvcnQgb3JnLmNocm9taXVtLmJhc2UudGFzay5Bc3luY1Rhc2s7CkBAIC00Miw3ICszOSw2IEBACiBpbXBvcnQgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLmRlcGVuZGVuY3lfaW5qZWN0aW9uLkNocm9tZUFwcE1vZHVsZTsKIGltcG9ydCBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuZGVwZW5kZW5jeV9pbmplY3Rpb24uRGFnZ2VyQ2hyb21lQXBwQ29tcG9uZW50OwogaW1wb3J0IG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5kZXBlbmRlbmN5X2luamVjdGlvbi5Nb2R1bGVGYWN0b3J5T3ZlcnJpZGVzOwotaW1wb3J0IG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5pbml0LkludmFsaWRTdGFydHVwRGlhbG9nOwogaW1wb3J0IG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5tZXRyaWNzLlVtYVV0aWxzOwogaW1wb3J0IG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5uaWdodF9tb2RlLlN5c3RlbU5pZ2h0TW9kZU1vbml0b3I7CiBpbXBvcnQgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnByZWZlcmVuY2VzLkNocm9tZVByZWZlcmVuY2VNYW5hZ2VyOwpAQCAtMjAyLDE4ICsxOTgsNiBAQAogICAgICAgICAgICAgICAgIHx8IGxldmVsID49IFRSSU1fTUVNT1JZX01PREVSQVRFOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFNob3dzIGFuIGVycm9yIGRpYWxvZyBmb2xsb3dpbmcgYSBzdGFydHVwIGVycm9yLCBhbmQgdGhlbiBleGl0cyB0aGUgYXBwbGljYXRpb24uCi0gICAgICogQHBhcmFtIGUgVGhlIGV4Y2VwdGlvbiByZXBvcnRlZCBieSBDaHJvbWUgaW5pdGlhbGl6YXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcG9ydFN0YXJ0dXBFcnJvckFuZEV4aXQoZmluYWwgUHJvY2Vzc0luaXRFeGNlcHRpb24gZSkgewotICAgICAgICBBY3Rpdml0eSBhY3Rpdml0eSA9IEFwcGxpY2F0aW9uU3RhdHVzLmdldExhc3RUcmFja2VkRm9jdXNlZEFjdGl2aXR5KCk7Ci0gICAgICAgIGlmIChBcHBsaWNhdGlvblN0YXR1cy5nZXRTdGF0ZUZvckFjdGl2aXR5KGFjdGl2aXR5KSA9PSBBY3Rpdml0eVN0YXRlLkRFU1RST1lFRCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIEludmFsaWRTdGFydHVwRGlhbG9nLnNob3coYWN0aXZpdHksIGUuZ2V0RXJyb3JDb2RlKCkpOwotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHN0YXJ0QWN0aXZpdHkoSW50ZW50IGludGVudCkgewogICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCwgbnVsbCk7CmRpZmYgLS1naXQgYS9jaHJvbWUvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvYm9va21hcmtzL0Jvb2ttYXJrSXRlbVJvdy5qYXZhIGIvY2hyb21lL2FuZHJvaWQvamF2YS9zcmMvb3JnL2Nocm9taXVtL2Nocm9tZS9icm93c2VyL2Jvb2ttYXJrcy9Cb29rbWFya0l0ZW1Sb3cuamF2YQppbmRleCBmN2VkMGQyYS4uMjcyOTdlMyAxMDA2NDQKLS0tIGEvY2hyb21lL2FuZHJvaWQvamF2YS9zcmMvb3JnL2Nocm9taXVtL2Nocm9tZS9icm93c2VyL2Jvb2ttYXJrcy9Cb29rbWFya0l0ZW1Sb3cuamF2YQorKysgYi9jaHJvbWUvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvYm9va21hcmtzL0Jvb2ttYXJrSXRlbVJvdy5qYXZhCkBAIC04MSw4ICs4MSw5IEBACiAgICAgICAgICAgICBpY29uID0gbUljb25HZW5lcmF0b3IuZ2VuZXJhdGVJY29uRm9yVXJsKG1VcmwpOwogICAgICAgICAgICAgc2V0SWNvbkRyYXdhYmxlKG5ldyBCaXRtYXBEcmF3YWJsZShnZXRSZXNvdXJjZXMoKSwgaWNvbikpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2V0SWNvbkRyYXdhYmxlKEZhdmljb25VdGlscy5jcmVhdGVSb3VuZGVkQml0bWFwRHJhd2FibGUoQml0bWFwLmNyZWF0ZVNjYWxlZEJpdG1hcCgKLSAgICAgICAgICAgICAgICAgICAgaWNvbiwgbURpc3BsYXllZEljb25TaXplLCBtRGlzcGxheWVkSWNvblNpemUsIGZhbHNlKSkpOworICAgICAgICAgICAgc2V0SWNvbkRyYXdhYmxlKEZhdmljb25VdGlscy5jcmVhdGVSb3VuZGVkQml0bWFwRHJhd2FibGUoZ2V0UmVzb3VyY2VzKCksCisgICAgICAgICAgICAgICAgICAgIEJpdG1hcC5jcmVhdGVTY2FsZWRCaXRtYXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbiwgbURpc3BsYXllZEljb25TaXplLCBtRGlzcGxheWVkSWNvblNpemUsIGZhbHNlKSkpOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY2hyb21lL2FuZHJvaWQvamF2YS9zcmMvb3JnL2Nocm9taXVtL2Nocm9tZS9icm93c2VyL2NvbXBvc2l0b3IvYm90dG9tYmFyL2VwaGVtZXJhbHRhYi9FcGhlbWVyYWxUYWJDb29yZGluYXRvci5qYXZhIGIvY2hyb21lL2FuZHJvaWQvamF2YS9zcmMvb3JnL2Nocm9taXVtL2Nocm9tZS9icm93c2VyL2NvbXBvc2l0b3IvYm90dG9tYmFyL2VwaGVtZXJhbHRhYi9FcGhlbWVyYWxUYWJDb29yZGluYXRvci5qYXZhCmluZGV4IDcxODU0YTEuLjliNGJjNmMgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9hbmRyb2lkL2phdmEvc3JjL29yZy9jaHJvbWl1bS9jaHJvbWUvYnJvd3Nlci9jb21wb3NpdG9yL2JvdHRvbWJhci9lcGhlbWVyYWx0YWIvRXBoZW1lcmFsVGFiQ29vcmRpbmF0b3IuamF2YQorKysgYi9jaHJvbWUvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvY29tcG9zaXRvci9ib3R0b21iYXIvZXBoZW1lcmFsdGFiL0VwaGVtZXJhbFRhYkNvb3JkaW5hdG9yLmphdmEKQEAgLTIzOCw3ICsyMzgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgQml0bWFwLmNyZWF0ZVNjYWxlZEJpdG1hcChpbWFnZSwgbUZhdmljb25TaXplLCBtRmF2aWNvblNpemUsIHRydWUpKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgcmV0dXJuIEZhdmljb25VdGlscy5jcmVhdGVSb3VuZGVkQml0bWFwRHJhd2FibGUoCisgICAgICAgICAgICByZXR1cm4gRmF2aWNvblV0aWxzLmNyZWF0ZVJvdW5kZWRCaXRtYXBEcmF3YWJsZShtQ29udGV4dC5nZXRSZXNvdXJjZXMoKSwKICAgICAgICAgICAgICAgICAgICAgQml0bWFwLmNyZWF0ZVNjYWxlZEJpdG1hcChpbWFnZSwgbUZhdmljb25TaXplLCBtRmF2aWNvblNpemUsIHRydWUpKTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2Nocm9tZS9hbmRyb2lkL2phdmEvc3JjL29yZy9jaHJvbWl1bS9jaHJvbWUvYnJvd3Nlci9jdXN0b210YWJzL0N1c3RvbVRhYkFjdGl2aXR5LmphdmEgYi9jaHJvbWUvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvY3VzdG9tdGFicy9DdXN0b21UYWJBY3Rpdml0eS5qYXZhCmluZGV4IDFlOTU4OWYyOS4uZjE0MjRkNzEgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9hbmRyb2lkL2phdmEvc3JjL29yZy9jaHJvbWl1bS9jaHJvbWUvYnJvd3Nlci9jdXN0b210YWJzL0N1c3RvbVRhYkFjdGl2aXR5LmphdmEKKysrIGIvY2hyb21lL2FuZHJvaWQvamF2YS9zcmMvb3JnL2Nocm9taXVtL2Nocm9tZS9icm93c2VyL2N1c3RvbXRhYnMvQ3VzdG9tVGFiQWN0aXZpdHkuamF2YQpAQCAtMzMsNyArMzMsNiBAQAogaW1wb3J0IG9yZy5jaHJvbWl1bS5iYXNlLm1ldHJpY3MuUmVjb3JkSGlzdG9ncmFtOwogaW1wb3J0IG9yZy5jaHJvbWl1bS5iYXNlLm1ldHJpY3MuUmVjb3JkVXNlckFjdGlvbjsKIGltcG9ydCBvcmcuY2hyb21pdW0uY2hyb21lLlI7Ci1pbXBvcnQgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLkFjdGl2aXR5VGFiVGFza0Rlc2NyaXB0aW9uSGVscGVyOwogaW1wb3J0IG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5DaHJvbWVBY3Rpdml0eTsKIGltcG9ydCBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuQ2hyb21lQXBwbGljYXRpb247CiBpbXBvcnQgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLkNocm9tZUZlYXR1cmVMaXN0OwpAQCAtOTgsNyArOTcsNyBAQAogICAgIEBOdWxsYWJsZQogICAgIHByaXZhdGUgRHluYW1pY01vZHVsZUNvb3JkaW5hdG9yIG1EeW5hbWljTW9kdWxlQ29vcmRpbmF0b3I7CiAKLSAgICBwcml2YXRlIEFjdGl2aXR5VGFiVGFza0Rlc2NyaXB0aW9uSGVscGVyIG1UYXNrRGVzY3JpcHRpb25IZWxwZXI7CisgICAgcHJpdmF0ZSBDdXN0b21UYWJUYXNrRGVzY3JpcHRpb25IZWxwZXIgbVRhc2tEZXNjcmlwdGlvbkhlbHBlcjsKIAogICAgIHByaXZhdGUgQ3VzdG9tVGFiTmlnaHRNb2RlU3RhdGVDb250cm9sbGVyIG1OaWdodE1vZGVTdGF0ZUNvbnRyb2xsZXI7CiAKQEAgLTI0Myw3ICsyNDIsNyBAQAogICAgICAgICBtQ29ubmVjdGlvbi5zaG93U2lnbkluVG9hc3RJZk5lY2Vzc2FyeShtU2Vzc2lvbiwgZ2V0SW50ZW50KCkpOwogCiAgICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gQnVpbGQuVkVSU0lPTl9DT0RFUy5MT0xMSVBPUCAmJiB1c2VTZXBhcmF0ZVRhc2soKSkgewotICAgICAgICAgICAgbVRhc2tEZXNjcmlwdGlvbkhlbHBlciA9IG5ldyBBY3Rpdml0eVRhYlRhc2tEZXNjcmlwdGlvbkhlbHBlcih0aGlzLAorICAgICAgICAgICAgbVRhc2tEZXNjcmlwdGlvbkhlbHBlciA9IG5ldyBDdXN0b21UYWJUYXNrRGVzY3JpcHRpb25IZWxwZXIodGhpcywKICAgICAgICAgICAgICAgICAgICAgQXBpQ29tcGF0aWJpbGl0eVV0aWxzLmdldENvbG9yKGdldFJlc291cmNlcygpLCBSLmNvbG9yLmRlZmF1bHRfcHJpbWFyeV9jb2xvcikpOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL2Nocm9tZS9hbmRyb2lkL2phdmEvc3JjL29yZy9jaHJvbWl1bS9jaHJvbWUvYnJvd3Nlci9BY3Rpdml0eVRhYlRhc2tEZXNjcmlwdGlvbkhlbHBlci5qYXZhIGIvY2hyb21lL2FuZHJvaWQvamF2YS9zcmMvb3JnL2Nocm9taXVtL2Nocm9tZS9icm93c2VyL2N1c3RvbXRhYnMvQ3VzdG9tVGFiVGFza0Rlc2NyaXB0aW9uSGVscGVyLmphdmEKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gY2hyb21lL2FuZHJvaWQvamF2YS9zcmMvb3JnL2Nocm9taXVtL2Nocm9tZS9icm93c2VyL0FjdGl2aXR5VGFiVGFza0Rlc2NyaXB0aW9uSGVscGVyLmphdmEKcmVuYW1lIHRvIGNocm9tZS9hbmRyb2lkL2phdmEvc3JjL29yZy9jaHJvbWl1bS9jaHJvbWUvYnJvd3Nlci9jdXN0b210YWJzL0N1c3RvbVRhYlRhc2tEZXNjcmlwdGlvbkhlbHBlci5qYXZhCmluZGV4IDUwZDI3ODMuLjhlZjkzMzIgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9hbmRyb2lkL2phdmEvc3JjL29yZy9jaHJvbWl1bS9jaHJvbWUvYnJvd3Nlci9BY3Rpdml0eVRhYlRhc2tEZXNjcmlwdGlvbkhlbHBlci5qYXZhCisrKyBiL2Nocm9tZS9hbmRyb2lkL2phdmEvc3JjL29yZy9jaHJvbWl1bS9jaHJvbWUvYnJvd3Nlci9jdXN0b210YWJzL0N1c3RvbVRhYlRhc2tEZXNjcmlwdGlvbkhlbHBlci5qYXZhCkBAIC0yLDEyICsyLDEzIEBACiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCi1wYWNrYWdlIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3NlcjsKK3BhY2thZ2Ugb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLmN1c3RvbXRhYnM7CiAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogCiBpbXBvcnQgb3JnLmNocm9taXVtLmJhc2UuQXBpQ29tcGF0aWJpbGl0eVV0aWxzOworaW1wb3J0IG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5DaHJvbWVBY3Rpdml0eTsKIGltcG9ydCBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuZmF2aWNvbi5GYXZpY29uSGVscGVyOwogaW1wb3J0IG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5udHAuTmV3VGFiUGFnZTsKIGltcG9ydCBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFiLkVtcHR5VGFiT2JzZXJ2ZXI7CkBAIC0zMiwxMiArMzMsMTIgQEAKICAqIDxwPgogICogVGhlIHRhc2sgZGVzY3JpcHRpb24gaXMgd2hhdCBpcyBzaG93biBpbiBBbmRyb2lkJ3MgT3ZlcnZpZXcvUmVjZW50cyBzY3JlZW4gZm9yIGVhY2ggZW50cnkuCiAgKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVRhYlRhc2tEZXNjcmlwdGlvbkhlbHBlciB7CitwdWJsaWMgY2xhc3MgQ3VzdG9tVGFiVGFza0Rlc2NyaXB0aW9uSGVscGVyIHsKICAgICBwcml2YXRlIGZpbmFsIGludCBtRGVmYXVsdFRoZW1lQ29sb3I7CiAgICAgcHJpdmF0ZSBmaW5hbCBDaHJvbWVBY3Rpdml0eSBtQWN0aXZpdHk7CiAgICAgcHJpdmF0ZSBmaW5hbCBUYWJNb2RlbFNlbGVjdG9yIG1UYWJNb2RlbFNlbGVjdG9yOwogCi0gICAgcHJpdmF0ZSBmaW5hbCBBY3Rpdml0eVRhc2tEZXNjcmlwdGlvbkljb25HZW5lcmF0b3IgbUljb25HZW5lcmF0b3I7CisgICAgcHJpdmF0ZSBmaW5hbCBDdXN0b21UYWJUYXNrRGVzY3JpcHRpb25JY29uR2VuZXJhdG9yIG1JY29uR2VuZXJhdG9yOwogICAgIHByaXZhdGUgZmluYWwgRmF2aWNvbkhlbHBlciBtRmF2aWNvbkhlbHBlcjsKIAogICAgIHByaXZhdGUgZmluYWwgVGFiTW9kZWxTZWxlY3Rvck9ic2VydmVyIG1UYWJNb2RlbFNlbGVjdG9yT2JzZXJ2ZXI7CkBAIC01MywxMyArNTQsMTMgQEAKICAgICAgKiBAcGFyYW0gYWN0aXZpdHkgVGhlIGFjdGl2aXR5IHdob3NlIGRlc2NyaXB0aW9ucyBzaG91bGQgYmUgdXBkYXRlZC4KICAgICAgKiBAcGFyYW0gZGVmYXVsdFRoZW1lQ29sb3IgVGhlIGRlZmF1bHQgdGhlbWUgY29sb3IgdG8gYmUgdXNlZCBpZiB0aGUgdGFiIGRvZXMgbm90IG92ZXJyaWRlIGl0LgogICAgICAqLwotICAgIHB1YmxpYyBBY3Rpdml0eVRhYlRhc2tEZXNjcmlwdGlvbkhlbHBlcihDaHJvbWVBY3Rpdml0eSBhY3Rpdml0eSwgaW50IGRlZmF1bHRUaGVtZUNvbG9yKSB7CisgICAgcHVibGljIEN1c3RvbVRhYlRhc2tEZXNjcmlwdGlvbkhlbHBlcihDaHJvbWVBY3Rpdml0eSBhY3Rpdml0eSwgaW50IGRlZmF1bHRUaGVtZUNvbG9yKSB7CiAgICAgICAgIG1BY3Rpdml0eSA9IGFjdGl2aXR5OwogICAgICAgICBtRGVmYXVsdFRoZW1lQ29sb3IgPSBkZWZhdWx0VGhlbWVDb2xvcjsKIAogICAgICAgICBtVGFiTW9kZWxTZWxlY3RvciA9IG1BY3Rpdml0eS5nZXRUYWJNb2RlbFNlbGVjdG9yKCk7CiAKLSAgICAgICAgbUljb25HZW5lcmF0b3IgPSBuZXcgQWN0aXZpdHlUYXNrRGVzY3JpcHRpb25JY29uR2VuZXJhdG9yKGFjdGl2aXR5KTsKKyAgICAgICAgbUljb25HZW5lcmF0b3IgPSBuZXcgQ3VzdG9tVGFiVGFza0Rlc2NyaXB0aW9uSWNvbkdlbmVyYXRvcihhY3Rpdml0eSk7CiAgICAgICAgIG1GYXZpY29uSGVscGVyID0gbmV3IEZhdmljb25IZWxwZXIoKTsKIAogICAgICAgICBtVGFiT2JzZXJ2ZXIgPSBuZXcgRW1wdHlUYWJPYnNlcnZlcigpIHsKQEAgLTI0NCw4ICsyNDUsNyBAQAogCiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY3VycmVudFVybCA9IG1DdXJyZW50VGFiLmdldFVybCgpOwogICAgICAgICAgICAgbUZhdmljb25IZWxwZXIuZ2V0TG9jYWxGYXZpY29uSW1hZ2VGb3JVUkwoCi0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VGFiLmdldFByb2ZpbGUoKSwgbUN1cnJlbnRUYWIuZ2V0VXJsKCksIDAsCi0gICAgICAgICAgICAgICAgICAgIChpbWFnZSwgaWNvblVybCkgLT4geworICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRhYi5nZXRQcm9maWxlKCksIG1DdXJyZW50VGFiLmdldFVybCgpLCAwLCAoaW1hZ2UsIGljb25VcmwpIC0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudFRhYiA9PSBudWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFUZXh0VXRpbHMuZXF1YWxzKGN1cnJlbnRVcmwsIG1DdXJyZW50VGFiLmdldFVybCgpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL2Nocm9tZS9hbmRyb2lkL2phdmEvc3JjL29yZy9jaHJvbWl1bS9jaHJvbWUvYnJvd3Nlci9BY3Rpdml0eVRhc2tEZXNjcmlwdGlvbkljb25HZW5lcmF0b3IuamF2YSBiL2Nocm9tZS9hbmRyb2lkL2phdmEvc3JjL29yZy9jaHJvbWl1bS9jaHJvbWUvYnJvd3Nlci9jdXN0b210YWJzL0N1c3RvbVRhYlRhc2tEZXNjcmlwdGlvbkljb25HZW5lcmF0b3IuamF2YQpzaW1pbGFyaXR5IGluZGV4IDkwJQpyZW5hbWUgZnJvbSBjaHJvbWUvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvQWN0aXZpdHlUYXNrRGVzY3JpcHRpb25JY29uR2VuZXJhdG9yLmphdmEKcmVuYW1lIHRvIGNocm9tZS9hbmRyb2lkL2phdmEvc3JjL29yZy9jaHJvbWl1bS9jaHJvbWUvYnJvd3Nlci9jdXN0b210YWJzL0N1c3RvbVRhYlRhc2tEZXNjcmlwdGlvbkljb25HZW5lcmF0b3IuamF2YQppbmRleCA3ZmE3ZGFkLi44ZWZhYmVkIDEwMDY0NAotLS0gYS9jaHJvbWUvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvQWN0aXZpdHlUYXNrRGVzY3JpcHRpb25JY29uR2VuZXJhdG9yLmphdmEKKysrIGIvY2hyb21lL2FuZHJvaWQvamF2YS9zcmMvb3JnL2Nocm9taXVtL2Nocm9tZS9icm93c2VyL2N1c3RvbXRhYnMvQ3VzdG9tVGFiVGFza0Rlc2NyaXB0aW9uSWNvbkdlbmVyYXRvci5qYXZhCkBAIC0yLDcgKzIsNyBAQAogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAotcGFja2FnZSBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXI7CitwYWNrYWdlIG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5jdXN0b210YWJzOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CkBAIC0xMSw5ICsxMSw5IEBACiBpbXBvcnQgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnVpLndpZGdldC5Sb3VuZGVkSWNvbkdlbmVyYXRvcjsKIAogLyoqCi0gKiBHZW5lcmF0ZXMgaWNvbnMgc3VpdGFibGUgZm9yIEFjdGl2aXRpZXMgaW4gdGhlIHJlY2VudCB0YXNrcyBsaXN0LgorICogR2VuZXJhdGVzIGljb25zIHN1aXRhYmxlIGZvciBDdXN0b20gVGFicyBpbiB0aGUgcmVjZW50IHRhc2tzIGxpc3QuCiAgKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVRhc2tEZXNjcmlwdGlvbkljb25HZW5lcmF0b3IgeworcHVibGljIGNsYXNzIEN1c3RvbVRhYlRhc2tEZXNjcmlwdGlvbkljb25HZW5lcmF0b3IgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBUFBfSUNPTl9NSU5fU0laRV9EUCA9IDMyOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBUFBfSUNPTl9TSVpFX0RQID0gNjQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFQUF9JQ09OX0NPUk5FUl9SQURJVVNfRFAgPSAzOwpAQCAtMzgsNyArMzgsNyBAQAogICAgICAqLwogICAgIHByaXZhdGUgUm91bmRlZEljb25HZW5lcmF0b3IgbUdlbmVyYXRvcjsKIAotICAgIHB1YmxpYyBBY3Rpdml0eVRhc2tEZXNjcmlwdGlvbkljb25HZW5lcmF0b3IoQ29udGV4dCBjb250ZXh0KSB7CisgICAgcHVibGljIEN1c3RvbVRhYlRhc2tEZXNjcmlwdGlvbkljb25HZW5lcmF0b3IoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbU1pblNpemVQeCA9CiAgICAgICAgICAgICAgICAgKGludCkgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKS5kZW5zaXR5ICogQVBQX0lDT05fTUlOX1NJWkVfRFA7CmRpZmYgLS1naXQgYS9jaHJvbWUvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvZXhwbG9yZV9zaXRlcy9FeHBlcmltZW50YWxFeHBsb3JlU2l0ZXNDYXRlZ29yeVRpbGVWaWV3LmphdmEgYi9jaHJvbWUvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvZXhwbG9yZV9zaXRlcy9FeHBlcmltZW50YWxFeHBsb3JlU2l0ZXNDYXRlZ29yeVRpbGVWaWV3LmphdmEKaW5kZXggNDdhYmVjNi4uMDAyNDA0NCAxMDA2NDQKLS0tIGEvY2hyb21lL2FuZHJvaWQvamF2YS9zcmMvb3JnL2Nocm9taXVtL2Nocm9tZS9icm93c2VyL2V4cGxvcmVfc2l0ZXMvRXhwZXJpbWVudGFsRXhwbG9yZVNpdGVzQ2F0ZWdvcnlUaWxlVmlldy5qYXZhCisrKyBiL2Nocm9tZS9hbmRyb2lkL2phdmEvc3JjL29yZy9jaHJvbWl1bS9jaHJvbWUvYnJvd3Nlci9leHBsb3JlX3NpdGVzL0V4cGVyaW1lbnRhbEV4cGxvcmVTaXRlc0NhdGVnb3J5VGlsZVZpZXcuamF2YQpAQCAtNzEsNyArNzEsNyBAQAogICAgICAgICAgICAgZHJhd2FibGUgPSBuZXcgQml0bWFwRHJhd2FibGUobVJlc291cmNlcywKICAgICAgICAgICAgICAgICAgICAgbUljb25HZW5lcmF0b3IuZ2VuZXJhdGVJY29uRm9yVGV4dChtQ2F0ZWdvcnlEYXRhLmdldENhdGVnb3J5TmFtZSgpKSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkcmF3YWJsZSA9IFZpZXdVdGlscy5jcmVhdGVSb3VuZGVkQml0bWFwRHJhd2FibGUoCisgICAgICAgICAgICBkcmF3YWJsZSA9IFZpZXdVdGlscy5jcmVhdGVSb3VuZGVkQml0bWFwRHJhd2FibGUobVJlc291cmNlcywKICAgICAgICAgICAgICAgICAgICAgQml0bWFwLmNyZWF0ZVNjYWxlZEJpdG1hcChiaXRtYXAsIG1JY29uV2lkdGhQeCwgbUljb25IZWlnaHRQeCwgZmFsc2UpLAogICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLmV4cGVyaW1lbnRhbF9leHBsb3JlX3NpdGVzX3JhZGl1cykpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9jaHJvbWUvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvZXhwbG9yZV9zaXRlcy9FeHBsb3JlU2l0ZXNTZWN0aW9uLmphdmEgYi9jaHJvbWUvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvZXhwbG9yZV9zaXRlcy9FeHBsb3JlU2l0ZXNTZWN0aW9uLmphdmEKaW5kZXggNmIwM2Y0YS4uNTZiYmY0OSAxMDA2NDQKLS0tIGEvY2hyb21lL2FuZHJvaWQvamF2YS9zcmMvb3JnL2Nocm9taXVtL2Nocm9tZS9icm93c2VyL2V4cGxvcmVfc2l0ZXMvRXhwbG9yZVNpdGVzU2VjdGlvbi5qYXZhCisrKyBiL2Nocm9tZS9hbmRyb2lkL2phdmEvc3JjL29yZy9jaHJvbWl1bS9jaHJvbWUvYnJvd3Nlci9leHBsb3JlX3NpdGVzL0V4cGxvcmVTaXRlc1NlY3Rpb24uamF2YQpAQCAtMTc1LDcgKzE3NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBtUHJvZmlsZSwgY2F0ZWdvcnkuZ2V0SWQoKSwgaWNvblNpemVQeCwgKEJpdG1hcCBpbWFnZSkgLT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbWFnZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5LnNldERyYXdhYmxlKFZpZXdVdGlscy5jcmVhdGVSb3VuZGVkQml0bWFwRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsIGljb25TaXplUHggLyAyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5nZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCksIGltYWdlLCBpY29uU2l6ZVB4IC8gMikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LnJlbmRlckljb24oY2F0ZWdvcnkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwpkaWZmIC0tZ2l0IGEvY2hyb21lL2FuZHJvaWQvamF2YS9zcmMvb3JnL2Nocm9taXVtL2Nocm9tZS9icm93c2VyL2Zhdmljb24vRmF2aWNvblV0aWxzLmphdmEgYi9jaHJvbWUvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvZmF2aWNvbi9GYXZpY29uVXRpbHMuamF2YQppbmRleCA3MGUzNGJhLi4zNWY5M2Q4IDEwMDY0NAotLS0gYS9jaHJvbWUvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvZmF2aWNvbi9GYXZpY29uVXRpbHMuamF2YQorKysgYi9jaHJvbWUvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvZmF2aWNvbi9GYXZpY29uVXRpbHMuamF2YQpAQCAtOSw3ICs5LDYgQEAKIGltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuZ3JhcGhpY3MuZHJhd2FibGUuUm91bmRlZEJpdG1hcERyYXdhYmxlOwogCiBpbXBvcnQgb3JnLmNocm9taXVtLmJhc2UuQXBpQ29tcGF0aWJpbGl0eVV0aWxzOwotaW1wb3J0IG9yZy5jaHJvbWl1bS5iYXNlLkNvbnRleHRVdGlsczsKIGltcG9ydCBvcmcuY2hyb21pdW0uY2hyb21lLlI7CiBpbXBvcnQgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnVpLndpZGdldC5Sb3VuZGVkSWNvbkdlbmVyYXRvcjsKIGltcG9ydCBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudXRpbC5WaWV3VXRpbHM7CkBAIC01MCwxMyArNDksMTQgQEAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIGEge0BsaW5rIFJvdW5kZWRCaXRtYXBEcmF3YWJsZX0gdXNpbmcgdGhlIHByb3ZpZGVkIHtAbGluayBCaXRtYXB9IGFuZCBhIGRlZmF1bHQKICAgICAgKiBmYXZpY29uIGNvcm5lciByYWRpdXMuCisgICAgICogQHBhcmFtIHJlc291cmNlcyBUaGUge0BsaW5rIFJlc291cmNlc30uCiAgICAgICogQHBhcmFtIGljb24gVGhlIHtAbGluayBCaXRtYXB9IHRvIHJvdW5kLgogICAgICAqIEByZXR1cm4gQSB7QGxpbmsgUm91bmRlZEJpdG1hcERyYXdhYmxlfSBmb3IgdGhlIHByb3ZpZGVkIHtAbGluayBCaXRtYXB9LgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUm91bmRlZEJpdG1hcERyYXdhYmxlIGNyZWF0ZVJvdW5kZWRCaXRtYXBEcmF3YWJsZShCaXRtYXAgaWNvbikgewotICAgICAgICBSZXNvdXJjZXMgcmVzb3VyY2VzID0gQ29udGV4dFV0aWxzLmdldEFwcGxpY2F0aW9uQ29udGV4dCgpLmdldFJlc291cmNlcygpOwotICAgICAgICByZXR1cm4gVmlld1V0aWxzLmNyZWF0ZVJvdW5kZWRCaXRtYXBEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICBpY29uLCByZXNvdXJjZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuZGltZW4uZGVmYXVsdF9mYXZpY29uX2Nvcm5lcl9yYWRpdXMpKTsKKyAgICBwdWJsaWMgc3RhdGljIFJvdW5kZWRCaXRtYXBEcmF3YWJsZSBjcmVhdGVSb3VuZGVkQml0bWFwRHJhd2FibGUoCisgICAgICAgICAgICBSZXNvdXJjZXMgcmVzb3VyY2VzLCBCaXRtYXAgaWNvbikgeworICAgICAgICByZXR1cm4gVmlld1V0aWxzLmNyZWF0ZVJvdW5kZWRCaXRtYXBEcmF3YWJsZShyZXNvdXJjZXMsIGljb24sCisgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLmRlZmF1bHRfZmF2aWNvbl9jb3JuZXJfcmFkaXVzKSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldEljb25Db2xvcihSZXNvdXJjZXMgcmVzb3VyY2VzKSB7CmRpZmYgLS1naXQgYS9jaHJvbWUvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvZ2VzdHVyZW5hdi9OYXZpZ2F0aW9uU2hlZXQuamF2YSBiL2Nocm9tZS9hbmRyb2lkL2phdmEvc3JjL29yZy9jaHJvbWl1bS9jaHJvbWUvYnJvd3Nlci9nZXN0dXJlbmF2L05hdmlnYXRpb25TaGVldC5qYXZhCmluZGV4IGU2ZGYwM2E3Li5iMWE5MmEyIDEwMDY0NAotLS0gYS9jaHJvbWUvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvZ2VzdHVyZW5hdi9OYXZpZ2F0aW9uU2hlZXQuamF2YQorKysgYi9jaHJvbWUvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvZ2VzdHVyZW5hdi9OYXZpZ2F0aW9uU2hlZXQuamF2YQpAQCAtMzMsNiArMzMsMTIgQEAKICAgICAgICAgICogTmF2aWdhdGVzIHRvIHRoZSBwYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gaW5kZXguCiAgICAgICAgICAqLwogICAgICAgICB2b2lkIG5hdmlnYXRlVG9JbmRleChpbnQgaW5kZXgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIGEgcnVubmFibGUgdG8gZXhlY3V0ZSB3aGVuIHRoZSBhc3NvY2lhdGVkIFRhYiBpcyBjbG9zZWQuCisgICAgICAgICAqIEBwYXJhbSBydW5uYWJsZSBSdW5uYWJsZSB0byBleGVjdXRlLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBzZXRUYWJDbG9zZVJ1bm5hYmxlKFJ1bm5hYmxlIHJ1bm5hYmxlKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2Nocm9tZS9hbmRyb2lkL2phdmEvc3JjL29yZy9jaHJvbWl1bS9jaHJvbWUvYnJvd3Nlci9nZXN0dXJlbmF2L05hdmlnYXRpb25TaGVldENvb3JkaW5hdG9yLmphdmEgYi9jaHJvbWUvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvZ2VzdHVyZW5hdi9OYXZpZ2F0aW9uU2hlZXRDb29yZGluYXRvci5qYXZhCmluZGV4IDk3NzE2MDkuLjZjNjhhNmI2IDEwMDY0NAotLS0gYS9jaHJvbWUvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvZ2VzdHVyZW5hdi9OYXZpZ2F0aW9uU2hlZXRDb29yZGluYXRvci5qYXZhCisrKyBiL2Nocm9tZS9hbmRyb2lkL2phdmEvc3JjL29yZy9jaHJvbWl1bS9jaHJvbWUvYnJvd3Nlci9nZXN0dXJlbmF2L05hdmlnYXRpb25TaGVldENvb3JkaW5hdG9yLmphdmEKQEAgLTgyLDYgKzgyLDggQEAKICAgICBwcml2YXRlIGZpbmFsIGludCBtQ29udGVudFBhZGRpbmc7CiAgICAgcHJpdmF0ZSBmaW5hbCBWaWV3IG1QYXJlbnRWaWV3OwogCisgICAgcHJpdmF0ZSBmaW5hbCBSdW5uYWJsZSBtQ2xvc2VSdW5uYWJsZSA9ICgpIC0+IGNsb3NlKHRydWUpOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTmF2aWdhdGlvbkl0ZW1WaWV3QmluZGVyIHsKICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIGJpbmQoUHJvcGVydHlNb2RlbCBtb2RlbCwgVmlldyB2aWV3LCBQcm9wZXJ0eUtleSBwcm9wZXJ0eUtleSkgewogICAgICAgICAgICAgaWYgKEl0ZW1Qcm9wZXJ0aWVzLklDT04gPT0gcHJvcGVydHlLZXkpIHsKQEAgLTE2Niw2ICsxNjgsNyBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIGV4cGFuZFNoZWV0KCkgewogICAgICAgICBtQm90dG9tU2hlZXRDb250cm9sbGVyLmdldCgpLmV4cGFuZFNoZWV0KCk7CisgICAgICAgIG1EZWxlZ2F0ZS5zZXRUYWJDbG9zZVJ1bm5hYmxlKG1DbG9zZVJ1bm5hYmxlKTsKICAgICAgICAgR2VzdHVyZU5hdk1ldHJpY3MucmVjb3JkSGlzdG9ncmFtKCJHZXN0dXJlTmF2aWdhdGlvbi5TaGVldC5WaWV3ZWQiLCBtRm9yd2FyZCk7CiAgICAgfQogCkBAIC0yMjYsNiArMjI5LDcgQEAKICAgICBwcml2YXRlIHZvaWQgY2xvc2UoYm9vbGVhbiBhbmltYXRlKSB7CiAgICAgICAgIGlmICghaXNIaWRkZW4oKSkgbUJvdHRvbVNoZWV0Q29udHJvbGxlci5nZXQoKS5oaWRlQ29udGVudCh0aGlzLCBhbmltYXRlKTsKICAgICAgICAgbUJvdHRvbVNoZWV0Q29udHJvbGxlci5nZXQoKS5nZXRCb3R0b21TaGVldCgpLnJlbW92ZU9ic2VydmVyKG1TaGVldE9ic2VydmVyKTsKKyAgICAgICAgbURlbGVnYXRlLnNldFRhYkNsb3NlUnVubmFibGUobnVsbCk7CiAgICAgICAgIG1NZWRpYXRvci5jbGVhcigpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvY2hyb21lL2FuZHJvaWQvamF2YS9zcmMvb3JnL2Nocm9taXVtL2Nocm9tZS9icm93c2VyL2dlc3R1cmVuYXYvVGFiYmVkU2hlZXREZWxlZ2F0ZS5qYXZhIGIvY2hyb21lL2FuZHJvaWQvamF2YS9zcmMvb3JnL2Nocm9taXVtL2Nocm9tZS9icm93c2VyL2dlc3R1cmVuYXYvVGFiYmVkU2hlZXREZWxlZ2F0ZS5qYXZhCmluZGV4IGFmMjJjMWEuLjYxOTk5MGMgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9hbmRyb2lkL2phdmEvc3JjL29yZy9jaHJvbWl1bS9jaHJvbWUvYnJvd3Nlci9nZXN0dXJlbmF2L1RhYmJlZFNoZWV0RGVsZWdhdGUuamF2YQorKysgYi9jaHJvbWUvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvZ2VzdHVyZW5hdi9UYWJiZWRTaGVldERlbGVnYXRlLmphdmEKQEAgLTYsNiArNiw3IEBACiAKIGltcG9ydCBvcmcuY2hyb21pdW0uY2hyb21lLlI7CiBpbXBvcnQgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLmhpc3RvcnkuSGlzdG9yeU1hbmFnZXJVdGlsczsKK2ltcG9ydCBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFiLkVtcHR5VGFiT2JzZXJ2ZXI7CiBpbXBvcnQgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYi5UYWI7CiBpbXBvcnQgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnV0aWwuVXJsQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5jaHJvbWl1bS5jb250ZW50X3B1YmxpYy5icm93c2VyLk5hdmlnYXRpb25FbnRyeTsKQEAgLTIyLDYgKzIzLDI1IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBUYWIgbVRhYjsKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtRnVsbEhpc3RvcnlNZW51OwogCisgICAgLy8gVGFiT2JzZXJ2ZXIgdGhhdCBtb25pdG9ycyB0YWIgY2xvc2luZyBldmVudCB0byBjbG9zZSB0aGUgbmF2aWdhdGlvbiBzaGVldAorICAgIC8vIHRvZ2V0aGVyIGlmIG9wZW4uIEZvciBub3cgdGhpcyBpcyBuZWNlc3Nhcnkgd2hlbiBjbG9zaW5nIGFsbCBpbmNvZ25pdG8gdGFicworICAgIC8vIHRocm91Z2ggQW5kcm9pZCBub3RpZmljYXRpb24uCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2xvc2VUYWJPYnNlcnZlciBleHRlbmRzIEVtcHR5VGFiT2JzZXJ2ZXIgeworICAgICAgICBwcml2YXRlIFJ1bm5hYmxlIG1DbG9zZVJ1bm5hYmxlOworCisgICAgICAgIHB1YmxpYyB2b2lkIHNldENsb3NlUnVubmFibGUoUnVubmFibGUgcnVubmFibGUpIHsKKyAgICAgICAgICAgIG1DbG9zZVJ1bm5hYmxlID0gcnVubmFibGU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25EZXN0cm95ZWQoVGFiIHRhYikgeworICAgICAgICAgICAgbUNsb3NlUnVubmFibGUucnVuKCk7CisgICAgICAgICAgICB0YWIucmVtb3ZlT2JzZXJ2ZXIodGhpcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIENsb3NlVGFiT2JzZXJ2ZXIgbUNsb3NlVGFiT2JzZXJ2ZXIgPSBuZXcgQ2xvc2VUYWJPYnNlcnZlcigpOworCiAgICAgcHVibGljIFRhYmJlZFNoZWV0RGVsZWdhdGUoVGFiIHRhYikgewogICAgICAgICBtVGFiID0gdGFiOwogICAgICAgICBtRnVsbEhpc3RvcnlNZW51ID0gdGFiLmdldEFjdGl2aXR5KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nKFIuc3RyaW5nLnNob3dfZnVsbF9oaXN0b3J5KTsKQEAgLTQ1LDQgKzY1LDE0IEBACiAgICAgICAgICAgICBtVGFiLmdldFdlYkNvbnRlbnRzKCkuZ2V0TmF2aWdhdGlvbkNvbnRyb2xsZXIoKS5nb1RvTmF2aWdhdGlvbkluZGV4KGluZGV4KTsKICAgICAgICAgfQogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFRhYkNsb3NlUnVubmFibGUoUnVubmFibGUgcnVubmFibGUpIHsKKyAgICAgICAgaWYgKHJ1bm5hYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1DbG9zZVRhYk9ic2VydmVyLnNldENsb3NlUnVubmFibGUocnVubmFibGUpOworICAgICAgICAgICAgbVRhYi5hZGRPYnNlcnZlcihtQ2xvc2VUYWJPYnNlcnZlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtVGFiLnJlbW92ZU9ic2VydmVyKG1DbG9zZVRhYk9ic2VydmVyKTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2Nocm9tZS9hbmRyb2lkL2phdmEvc3JjL29yZy9jaHJvbWl1bS9jaHJvbWUvYnJvd3Nlci9oaXN0b3J5L0hpc3RvcnlJdGVtVmlldy5qYXZhIGIvY2hyb21lL2FuZHJvaWQvamF2YS9zcmMvb3JnL2Nocm9taXVtL2Nocm9tZS9icm93c2VyL2hpc3RvcnkvSGlzdG9yeUl0ZW1WaWV3LmphdmEKaW5kZXggOWQzMTBiNi4uMmQ3NWVhYzggMTAwNjQ0Ci0tLSBhL2Nocm9tZS9hbmRyb2lkL2phdmEvc3JjL29yZy9jaHJvbWl1bS9jaHJvbWUvYnJvd3Nlci9oaXN0b3J5L0hpc3RvcnlJdGVtVmlldy5qYXZhCisrKyBiL2Nocm9tZS9hbmRyb2lkL2phdmEvc3JjL29yZy9jaHJvbWl1bS9jaHJvbWUvYnJvd3Nlci9oaXN0b3J5L0hpc3RvcnlJdGVtVmlldy5qYXZhCkBAIC0xNjksOCArMTY5LDkgQEAKICAgICAgICAgICAgIGljb24gPSBtSWNvbkdlbmVyYXRvci5nZW5lcmF0ZUljb25Gb3JVcmwoZ2V0SXRlbSgpLmdldFVybCgpKTsKICAgICAgICAgICAgIHNldEljb25EcmF3YWJsZShuZXcgQml0bWFwRHJhd2FibGUoZ2V0UmVzb3VyY2VzKCksIGljb24pKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldEljb25EcmF3YWJsZShGYXZpY29uVXRpbHMuY3JlYXRlUm91bmRlZEJpdG1hcERyYXdhYmxlKEJpdG1hcC5jcmVhdGVTY2FsZWRCaXRtYXAoCi0gICAgICAgICAgICAgICAgICAgIGljb24sIG1EaXNwbGF5ZWRJY29uU2l6ZSwgbURpc3BsYXllZEljb25TaXplLCBmYWxzZSkpKTsKKyAgICAgICAgICAgIHNldEljb25EcmF3YWJsZShGYXZpY29uVXRpbHMuY3JlYXRlUm91bmRlZEJpdG1hcERyYXdhYmxlKGdldFJlc291cmNlcygpLAorICAgICAgICAgICAgICAgICAgICBCaXRtYXAuY3JlYXRlU2NhbGVkQml0bWFwKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb24sIG1EaXNwbGF5ZWRJY29uU2l6ZSwgbURpc3BsYXllZEljb25TaXplLCBmYWxzZSkpKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvY2hyb21lL2FuZHJvaWQvamF2YS9zcmMvb3JnL2Nocm9taXVtL2Nocm9tZS9icm93c2VyL2luaXQvQXN5bmNJbml0aWFsaXphdGlvbkFjdGl2aXR5LmphdmEgYi9jaHJvbWUvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvaW5pdC9Bc3luY0luaXRpYWxpemF0aW9uQWN0aXZpdHkuamF2YQppbmRleCBkOTU1MDdjNy4uMDgwMDgwYSAxMDA2NDQKLS0tIGEvY2hyb21lL2FuZHJvaWQvamF2YS9zcmMvb3JnL2Nocm9taXVtL2Nocm9tZS9icm93c2VyL2luaXQvQXN5bmNJbml0aWFsaXphdGlvbkFjdGl2aXR5LmphdmEKKysrIGIvY2hyb21lL2FuZHJvaWQvamF2YS9zcmMvb3JnL2Nocm9taXVtL2Nocm9tZS9icm93c2VyL2luaXQvQXN5bmNJbml0aWFsaXphdGlvbkFjdGl2aXR5LmphdmEKQEAgLTMzLDcgKzMzLDYgQEAKIGltcG9ydCBvcmcuY2hyb21pdW0uYmFzZS5saWJyYXJ5X2xvYWRlci5Mb2FkZXJFcnJvcnM7CiBpbXBvcnQgb3JnLmNocm9taXVtLmJhc2UubGlicmFyeV9sb2FkZXIuUHJvY2Vzc0luaXRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmNocm9taXVtLmNocm9tZS5SOwotaW1wb3J0IG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5DaHJvbWVBcHBsaWNhdGlvbjsKIGltcG9ydCBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuQ2hyb21lQmFzZUFwcENvbXBhdEFjdGl2aXR5OwogaW1wb3J0IG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5JbnRlbnRIYW5kbGVyOwogaW1wb3J0IG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5MYXVuY2hJbnRlbnREaXNwYXRjaGVyOwpAQCAtMjQ5LDkgKzI0OCw3IEBACiAgICAgQENhbGxTdXBlcgogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uU3RhcnR1cEZhaWx1cmUoKSB7Ci0gICAgICAgIFByb2Nlc3NJbml0RXhjZXB0aW9uIGUgPQotICAgICAgICAgICAgICAgIG5ldyBQcm9jZXNzSW5pdEV4Y2VwdGlvbihMb2FkZXJFcnJvcnMuTE9BREVSX0VSUk9SX05BVElWRV9TVEFSVFVQX0ZBSUxFRCk7Ci0gICAgICAgIENocm9tZUFwcGxpY2F0aW9uLnJlcG9ydFN0YXJ0dXBFcnJvckFuZEV4aXQoZSk7CisgICAgICAgIHRocm93IG5ldyBQcm9jZXNzSW5pdEV4Y2VwdGlvbihMb2FkZXJFcnJvcnMuTE9BREVSX0VSUk9SX05BVElWRV9TVEFSVFVQX0ZBSUxFRCk7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9jaHJvbWUvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvaW5pdC9JbnZhbGlkU3RhcnR1cERpYWxvZy5qYXZhIGIvY2hyb21lL2FuZHJvaWQvamF2YS9zcmMvb3JnL2Nocm9taXVtL2Nocm9tZS9icm93c2VyL2luaXQvSW52YWxpZFN0YXJ0dXBEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM0NTExMjguLjAwMDAwMDAKLS0tIGEvY2hyb21lL2FuZHJvaWQvamF2YS9zcmMvb3JnL2Nocm9taXVtL2Nocm9tZS9icm93c2VyL2luaXQvSW52YWxpZFN0YXJ0dXBEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE1IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotcGFja2FnZSBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuaW5pdDsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQuYXBwLkRpYWxvZzsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5hcHAuRGlhbG9nRnJhZ21lbnQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmFwcC5GcmFnbWVudEFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52Ny5hcHAuQWxlcnREaWFsb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IG9yZy5jaHJvbWl1bS5iYXNlLmxpYnJhcnlfbG9hZGVyLkxvYWRlckVycm9yczsKLWltcG9ydCBvcmcuY2hyb21pdW0uY2hyb21lLlI7Ci0KLS8qKgotICogRGlhbG9nIHNob3duIHdoZW4gc3RhcnR1cCBmYWlscy4KLSAqIDxicj4KLSAqIEZyYWdtZW50cyBhcmUgcmVxdWlyZWQgdG8gYmUgcHVibGljIHdpdGggYSBwdWJsaWMgZW1wdHkgY29uc3RydWN0b3IsIGhlbmNlIHRoZSB2aXNpYmlsaXR5LgotICovCi1wdWJsaWMgY2xhc3MgSW52YWxpZFN0YXJ0dXBEaWFsb2cgZXh0ZW5kcyBEaWFsb2dGcmFnbWVudCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJJbnZhbGlkU3RhcnR1cERpYWxvZyI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9LRVkgPSAiSW52YWxpZFN0YXJ0dXBFcnJvcktleSI7Ci0KLSAgICAvKioKLSAgICAgKiBTaG93cyB0aGUgaW52YWxpZCBzdGFydHVwIGRpYWxvZyBmb3IgYSBnaXZlbiBlcnJvciBjb2RlLgotICAgICAqCi0gICAgICogQHBhcmFtIGFjdGl2aXR5IFRoZSBhY3Rpdml0eSBzaG93aW5nIHRoZSBkaWFsb2cuCi0gICAgICogQHBhcmFtIGVycm9yQ29kZSBUaGUgZXJyb3IgY29kZSB0aGF0IHRyaWdnZXJlZCB0aGUgZmFpbHVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2hvdyhBY3Rpdml0eSBhY3Rpdml0eSwgaW50IGVycm9yQ29kZSkgewotICAgICAgICBpbnQgbXNnOwotICAgICAgICBzd2l0Y2ggKGVycm9yQ29kZSkgewotICAgICAgICAgICAgY2FzZSBMb2FkZXJFcnJvcnMuTE9BREVSX0VSUk9SX05BVElWRV9MSUJSQVJZX0xPQURfRkFJTEVEOgotICAgICAgICAgICAgICAgIG1zZyA9IFIuc3RyaW5nLm9zX3ZlcnNpb25fbWlzc2luZ19mZWF0dXJlczsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTG9hZGVyRXJyb3JzLkxPQURFUl9FUlJPUl9OQVRJVkVfTElCUkFSWV9XUk9OR19WRVJTSU9OOgotICAgICAgICAgICAgICAgIG1zZyA9IFIuc3RyaW5nLmluY29tcGF0aWJsZV9saWJyYXJpZXM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIG1zZyA9IFIuc3RyaW5nLm5hdGl2ZV9zdGFydHVwX2ZhaWxlZDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9IGFjdGl2aXR5LmdldFJlc291cmNlcygpLmdldFN0cmluZyhtc2cpOwotCi0gICAgICAgIGlmICghKGFjdGl2aXR5IGluc3RhbmNlb2YgRnJhZ21lbnRBY3Rpdml0eSkpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIlVuYWJsZSB0byBzdGFydCBjaHJvbWUgZHVlIHRvOiAiICsgbXNnKTsKLSAgICAgICAgICAgIFN5c3RlbS5leGl0KC0xKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEJ1bmRsZSBkaWFsb2dBcmdzID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICBkaWFsb2dBcmdzLnB1dFN0cmluZyhNRVNTQUdFX0tFWSwgbWVzc2FnZSk7Ci0KLSAgICAgICAgSW52YWxpZFN0YXJ0dXBEaWFsb2cgZGlhbG9nID0gbmV3IEludmFsaWRTdGFydHVwRGlhbG9nKCk7Ci0gICAgICAgIGRpYWxvZy5zZXRBcmd1bWVudHMoZGlhbG9nQXJncyk7Ci0gICAgICAgIGRpYWxvZy5zaG93KCgoRnJhZ21lbnRBY3Rpdml0eSkgYWN0aXZpdHkpLmdldFN1cHBvcnRGcmFnbWVudE1hbmFnZXIoKSwKLSAgICAgICAgICAgICAgICAiSW52YWxpZFN0YXJ0dXBEaWFsb2ciKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRGlhbG9nIG9uQ3JlYXRlRGlhbG9nKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgQnVuZGxlIGFyZ3VtZW50cyA9IGdldEFyZ3VtZW50cygpOwotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IGFyZ3VtZW50cy5nZXRTdHJpbmcoTUVTU0FHRV9LRVksICJGYWlsZWQgdG8gc3RhcnQiKTsKLQotICAgICAgICBBbGVydERpYWxvZy5CdWlsZGVyIGJ1aWxkZXIgPQotICAgICAgICAgICAgICAgIG5ldyBBbGVydERpYWxvZy5CdWlsZGVyKGdldEFjdGl2aXR5KCksIFIuc3R5bGUuVGhlbWVfQ2hyb21pdW1fQWxlcnREaWFsb2cpOwotICAgICAgICBidWlsZGVyLnNldE1lc3NhZ2UobWVzc2FnZSkKLSAgICAgICAgICAgICAgICAuc2V0Q2FuY2VsYWJsZSh0cnVlKQotICAgICAgICAgICAgICAgIC5zZXRQb3NpdGl2ZUJ1dHRvbihnZXRSZXNvdXJjZXMoKS5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0cmluZy5vayksIG51bGwpOwotICAgICAgICByZXR1cm4gYnVpbGRlci5jcmVhdGUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRpc21pc3MoRGlhbG9nSW50ZXJmYWNlIGRpYWxvZykgewotICAgICAgICBzdXBlci5vbkRpc21pc3MoZGlhbG9nKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoLTEpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jaHJvbWUvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvbnRwL1JlY2VudFRhYnNSb3dBZGFwdGVyLmphdmEgYi9jaHJvbWUvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvbnRwL1JlY2VudFRhYnNSb3dBZGFwdGVyLmphdmEKaW5kZXggNzM1YzJmYi4uOTFmYThkNzUgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9hbmRyb2lkL2phdmEvc3JjL29yZy9jaHJvbWl1bS9jaHJvbWUvYnJvd3Nlci9udHAvUmVjZW50VGFic1Jvd0FkYXB0ZXIuamF2YQorKysgYi9jaHJvbWUvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvbnRwL1JlY2VudFRhYnNSb3dBZGFwdGVyLmphdmEKQEAgLTcxNSw3ICs3MTUsNyBAQAogICAgICAgICAvLyBUT0RPKGluamFlKTogTW92ZSBzaGFyZWQgY29kZSBiZXR3ZWVuIEJvb2ttYXJrcy9IaXN0b3J5L0Rvd25sb2Fkcy9oZXJlIHRvIFZpZXdVdGlscy5qYXZhLgogICAgICAgICAvLyBBbHNvIGFwcGxpZXMgdG8gUm91bmRlZEljb25HZW5lcmF0b3IuIGNyYnVnLmNvbS84Mjk1NTAKICAgICAgICAgcmV0dXJuIEZhdmljb25VdGlscy5jcmVhdGVSb3VuZGVkQml0bWFwRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgQml0bWFwLmNyZWF0ZVNjYWxlZEJpdG1hcChpbWFnZSwgc2l6ZSwgc2l6ZSwgdHJ1ZSkpOworICAgICAgICAgICAgICAgIG1BY3Rpdml0eS5nZXRSZXNvdXJjZXMoKSwgQml0bWFwLmNyZWF0ZVNjYWxlZEJpdG1hcChpbWFnZSwgc2l6ZSwgc2l6ZSwgdHJ1ZSkpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBsb2FkRm9yZWlnbkZhdmljb24oZmluYWwgVmlld0hvbGRlciB2aWV3SG9sZGVyLCBmaW5hbCBTdHJpbmcgdXJsKSB7CmRpZmYgLS1naXQgYS9jaHJvbWUvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvcHJlZmVyZW5jZXMvcHJpdmFjeS9Db25maXJtSW1wb3J0YW50U2l0ZXNEaWFsb2dGcmFnbWVudC5qYXZhIGIvY2hyb21lL2FuZHJvaWQvamF2YS9zcmMvb3JnL2Nocm9taXVtL2Nocm9tZS9icm93c2VyL3ByZWZlcmVuY2VzL3ByaXZhY3kvQ29uZmlybUltcG9ydGFudFNpdGVzRGlhbG9nRnJhZ21lbnQuamF2YQppbmRleCA5MjcyYmI1Li5jNDE4YTQyZCAxMDA2NDQKLS0tIGEvY2hyb21lL2FuZHJvaWQvamF2YS9zcmMvb3JnL2Nocm9taXVtL2Nocm9tZS9icm93c2VyL3ByZWZlcmVuY2VzL3ByaXZhY3kvQ29uZmlybUltcG9ydGFudFNpdGVzRGlhbG9nRnJhZ21lbnQuamF2YQorKysgYi9jaHJvbWUvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvcHJlZmVyZW5jZXMvcHJpdmFjeS9Db25maXJtSW1wb3J0YW50U2l0ZXNEaWFsb2dGcmFnbWVudC5qYXZhCkBAIC0xMzAsNyArMTMwLDcgQEAKICAgICAgICAgICAgICAgICBpY29uID0gbUljb25HZW5lcmF0b3IuZ2VuZXJhdGVJY29uRm9yVXJsKHVybCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCaXRtYXBEcmF3YWJsZShnZXRSZXNvdXJjZXMoKSwgaWNvbik7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBGYXZpY29uVXRpbHMuY3JlYXRlUm91bmRlZEJpdG1hcERyYXdhYmxlKAorICAgICAgICAgICAgICAgIHJldHVybiBGYXZpY29uVXRpbHMuY3JlYXRlUm91bmRlZEJpdG1hcERyYXdhYmxlKGdldFJlc291cmNlcygpLAogICAgICAgICAgICAgICAgICAgICAgICAgQml0bWFwLmNyZWF0ZVNjYWxlZEJpdG1hcChpY29uLCBtRmF2aWNvblNpemUsIG1GYXZpY29uU2l6ZSwgZmFsc2UpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY2hyb21lL2FuZHJvaWQvamF2YS9zcmMvb3JnL2Nocm9taXVtL2Nocm9tZS9icm93c2VyL3N1Z2dlc3Rpb25zL3RpbGUvVGlsZVJlbmRlcmVyLmphdmEgYi9jaHJvbWUvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvc3VnZ2VzdGlvbnMvdGlsZS9UaWxlUmVuZGVyZXIuamF2YQppbmRleCA0MzdiYTYyLi45NmU5M2IwYyAxMDA2NDQKLS0tIGEvY2hyb21lL2FuZHJvaWQvamF2YS9zcmMvb3JnL2Nocm9taXVtL2Nocm9tZS9icm93c2VyL3N1Z2dlc3Rpb25zL3RpbGUvVGlsZVJlbmRlcmVyLmphdmEKKysrIGIvY2hyb21lL2FuZHJvaWQvamF2YS9zcmMvb3JnL2Nocm9taXVtL2Nocm9tZS9icm93c2VyL3N1Z2dlc3Rpb25zL3RpbGUvVGlsZVJlbmRlcmVyLmphdmEKQEAgLTIzOSw3ICsyMzksOCBAQAogICAgICAgICBpZiAodGlsZS5nZXRTb3VyY2UoKSA9PSBUaWxlU291cmNlLkVYUExPUkUpIHsKICAgICAgICAgICAgIHJhZGl1cyA9IG1EZXNpcmVkSWNvblNpemUgLyAyOwogICAgICAgICB9Ci0gICAgICAgIFJvdW5kZWRCaXRtYXBEcmF3YWJsZSByb3VuZGVkSWNvbiA9IFZpZXdVdGlscy5jcmVhdGVSb3VuZGVkQml0bWFwRHJhd2FibGUoaWNvbiwgcmFkaXVzKTsKKyAgICAgICAgUm91bmRlZEJpdG1hcERyYXdhYmxlIHJvdW5kZWRJY29uID0KKyAgICAgICAgICAgICAgICBWaWV3VXRpbHMuY3JlYXRlUm91bmRlZEJpdG1hcERyYXdhYmxlKG1SZXNvdXJjZXMsIGljb24sIHJhZGl1cyk7CiAgICAgICAgIHJvdW5kZWRJY29uLnNldEFudGlBbGlhcyh0cnVlKTsKICAgICAgICAgcm91bmRlZEljb24uc2V0RmlsdGVyQml0bWFwKHRydWUpOwogCmRpZmYgLS1naXQgYS9jaHJvbWUvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvdGFiL1RhYi5qYXZhIGIvY2hyb21lL2FuZHJvaWQvamF2YS9zcmMvb3JnL2Nocm9taXVtL2Nocm9tZS9icm93c2VyL3RhYi9UYWIuamF2YQppbmRleCA3ZTMwNTk1Li4xMjJhN2I5IDEwMDY0NAotLS0gYS9jaHJvbWUvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvdGFiL1RhYi5qYXZhCisrKyBiL2Nocm9tZS9hbmRyb2lkL2phdmEvc3JjL29yZy9jaHJvbWl1bS9jaHJvbWUvYnJvd3Nlci90YWIvVGFiLmphdmEKQEAgLTE3MjcsMTkgKzE3MjcsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlc3RvcmVzIGEgdGFiIGVpdGhlciBmcm96ZW4gb3IgZnJvbSBzdGF0ZS4KLSAgICAgKiBUT0RPKGF1cmltYXMpOiBpbnZlc3RpZ2F0ZSByZWR1Y2luZyB0aGUgdmlzaWJpbGl0eSBvZiB0aGlzIG1ldGhvZCBhZnRlciBUYWJNb2RlbCByZWZhY3RvcmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVIaXN0b3JpY2FsVGFiKCkgewotICAgICAgICBpZiAoIWlzRnJvemVuKCkpIHsKLSAgICAgICAgICAgIGFzc2VydCBtTmF0aXZlVGFiQW5kcm9pZCAhPSAwOwotICAgICAgICAgICAgVGFiSm5pLmdldCgpLmNyZWF0ZUhpc3RvcmljYWxUYWIobU5hdGl2ZVRhYkFuZHJvaWQsIFRhYi50aGlzKTsKLSAgICAgICAgfSBlbHNlIGlmIChtRnJvemVuQ29udGVudHNTdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRnJvemVuQ29udGVudHNTdGF0ZS5jcmVhdGVIaXN0b3JpY2FsVGFiKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBEZWxldGUgbmF2aWdhdGlvbiBlbnRyaWVzIGZyb20gZnJvemVuIHN0YXRlIG1hdGNoaW5nIHRoZSBwcmVkaWNhdGUuCiAgICAgICogQHBhcmFtIHByZWRpY2F0ZSBIYW5kbGUgZm9yIGEgZGVsZXRpb24gcHJlZGljYXRlIGludGVycHJldGVkIGJ5IG5hdGl2ZSBjb2RlLgogICAgICAqICAgICAgICAgICAgICAgICAgT25seSB2YWxpZCBkdXJpbmcgdGhpcyBjYWxsIGZyYW1lLgpAQCAtMTg5Nyw3ICsxODg0LDYgQEAKICAgICAgICAgICAgICAgICBsb25nIGludGVudFJlY2VpdmVkVGltZXN0YW1wKTsKICAgICAgICAgdm9pZCBzZXRBY3RpdmVOYXZpZ2F0aW9uRW50cnlUaXRsZUZvclVybCgKICAgICAgICAgICAgICAgICBsb25nIG5hdGl2ZVRhYkFuZHJvaWQsIFRhYiBjYWxsZXIsIFN0cmluZyB1cmwsIFN0cmluZyB0aXRsZSk7Ci0gICAgICAgIHZvaWQgY3JlYXRlSGlzdG9yaWNhbFRhYihsb25nIG5hdGl2ZVRhYkFuZHJvaWQsIFRhYiBjYWxsZXIpOwogICAgICAgICB2b2lkIGxvYWRPcmlnaW5hbEltYWdlKGxvbmcgbmF0aXZlVGFiQW5kcm9pZCwgVGFiIGNhbGxlcik7CiAgICAgICAgIHZvaWQgYXR0YWNoRGV0YWNoZWRUYWIobG9uZyBuYXRpdmVUYWJBbmRyb2lkLCBUYWIgY2FsbGVyKTsKICAgICB9CmRpZmYgLS1naXQgYS9jaHJvbWUvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvdGFiL1RhYlN0YXRlLmphdmEgYi9jaHJvbWUvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvdGFiL1RhYlN0YXRlLmphdmEKaW5kZXggYzU5MmU0ZmIuLjkyOGM4OTYgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9hbmRyb2lkL2phdmEvc3JjL29yZy9jaHJvbWl1bS9jaHJvbWUvYnJvd3Nlci90YWIvVGFiU3RhdGUuamF2YQorKysgYi9jaHJvbWUvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvdGFiL1RhYlN0YXRlLmphdmEKQEAgLTEzMSwxNCArMTMxLDYgQEAKICAgICAgICAgICAgIG5ld1N0YXRlLnNldFZlcnNpb24oVGFiU3RhdGUuQ09OVEVOVFNfU1RBVEVfQ1VSUkVOVF9WRVJTSU9OKTsKICAgICAgICAgICAgIHJldHVybiBuZXdTdGF0ZTsKICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGEgV2ViQ29udGVudHMgZm9yIHRoZSBDb250ZW50c1N0YXRlIGFuZCBhZGRzIGl0IGFzIGFuIGhpc3RvcmljYWwgdGFiLCB0aGVuCi0gICAgICAgICAqIGRlbGV0ZXMgdGhlIFdlYkNvbnRlbnRzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgY3JlYXRlSGlzdG9yaWNhbFRhYigpIHsKLSAgICAgICAgICAgIFRhYlN0YXRlSm5pLmdldCgpLmNyZWF0ZUhpc3RvcmljYWxUYWIobUJ1ZmZlciwgbVZlcnNpb24pOwotICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqIE5hdmlnYXRpb24gaGlzdG9yeSBvZiB0aGUgV2ViQ29udGVudHMuICovCkBAIC02MDUsNiArNTk3LDIwIEBACiAgICAgICAgIHNDaGFubmVsTmFtZU92ZXJyaWRlRm9yVGVzdCA9IG5hbWU7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGhpc3RvcmljYWwgdGFiIGZyb20gYSB0YWIgYmVpbmcgY2xvc2VkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVIaXN0b3JpY2FsVGFiKFRhYiB0YWIpIHsKKyAgICAgICAgaWYgKCF0YWIuaXNGcm96ZW4oKSkgeworICAgICAgICAgICAgVGFiU3RhdGVKbmkuZ2V0KCkuY3JlYXRlSGlzdG9yaWNhbFRhYkZyb21Db250ZW50cyh0YWIuZ2V0V2ViQ29udGVudHMoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBXZWJDb250ZW50c1N0YXRlIHN0YXRlID0gdGFiLmdldEZyb3plbkNvbnRlbnRzU3RhdGUoKTsKKyAgICAgICAgICAgIGlmIChzdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgVGFiU3RhdGVKbmkuZ2V0KCkuY3JlYXRlSGlzdG9yaWNhbFRhYihzdGF0ZS5idWZmZXIoKSwgc3RhdGUudmVyc2lvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIEBOYXRpdmVNZXRob2RzCiAgICAgaW50ZXJmYWNlIE5hdGl2ZXMgewogICAgICAgICBXZWJDb250ZW50cyByZXN0b3JlQ29udGVudHNGcm9tQnl0ZUJ1ZmZlcigKQEAgLTYxNiw1ICs2MjIsNiBAQAogICAgICAgICBTdHJpbmcgZ2V0RGlzcGxheVRpdGxlRnJvbUJ5dGVCdWZmZXIoQnl0ZUJ1ZmZlciBzdGF0ZSwgaW50IHNhdmVkU3RhdGVWZXJzaW9uKTsKICAgICAgICAgU3RyaW5nIGdldFZpcnR1YWxVcmxGcm9tQnl0ZUJ1ZmZlcihCeXRlQnVmZmVyIHN0YXRlLCBpbnQgc2F2ZWRTdGF0ZVZlcnNpb24pOwogICAgICAgICB2b2lkIGNyZWF0ZUhpc3RvcmljYWxUYWIoQnl0ZUJ1ZmZlciBzdGF0ZSwgaW50IHNhdmVkU3RhdGVWZXJzaW9uKTsKKyAgICAgICAgdm9pZCBjcmVhdGVIaXN0b3JpY2FsVGFiRnJvbUNvbnRlbnRzKFdlYkNvbnRlbnRzIHdlYkNvbnRlbnRzKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9jaHJvbWUvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvdGFibW9kZWwvVGFiTW9kZWxJbXBsLmphdmEgYi9jaHJvbWUvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvdGFibW9kZWwvVGFiTW9kZWxJbXBsLmphdmEKaW5kZXggMGUwMzc2OTAuLmMwOTkzMTYgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9hbmRyb2lkL2phdmEvc3JjL29yZy9jaHJvbWl1bS9jaHJvbWUvYnJvd3Nlci90YWJtb2RlbC9UYWJNb2RlbEltcGwuamF2YQorKysgYi9jaHJvbWUvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvdGFibW9kZWwvVGFiTW9kZWxJbXBsLmphdmEKQEAgLTEyLDYgKzEyLDcgQEAKIGltcG9ydCBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIucGFydG5lcmN1c3RvbWl6YXRpb25zLkhvbWVwYWdlTWFuYWdlcjsKIGltcG9ydCBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFiLkludGVyY2VwdE5hdmlnYXRpb25EZWxlZ2F0ZUltcGw7CiBpbXBvcnQgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYi5UYWI7CitpbXBvcnQgb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLnRhYi5UYWJTdGF0ZTsKIGltcG9ydCBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudGFibW9kZWwuVGFiQ3JlYXRvck1hbmFnZXIuVGFiQ3JlYXRvcjsKIGltcG9ydCBvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIudXRpbC5GZWF0dXJlVXRpbGl0aWVzOwogaW1wb3J0IG9yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci51dGlsLk1hdGhVdGlsczsKQEAgLTQ2MSw4ICs0NjIsOSBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKCF1cG9uRXhpdCAmJiBjYW5VbmRvICYmIHN1cHBvcnRzUGVuZGluZ0Nsb3N1cmVzKCkpIHsKLSAgICAgICAgICAgIGZvciAoVGFiTW9kZWxPYnNlcnZlciBvYnMgOiBtT2JzZXJ2ZXJzKQorICAgICAgICAgICAgZm9yIChUYWJNb2RlbE9ic2VydmVyIG9icyA6IG1PYnNlcnZlcnMpIHsKICAgICAgICAgICAgICAgICBvYnMubXVsdGlwbGVUYWJzUGVuZGluZ0Nsb3N1cmUoY2xvc2VkVGFicywgdHJ1ZSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTYyNCw3ICs2MjYsNyBAQAogICAgICAgICBpZiAobVRhYkNvbnRlbnRNYW5hZ2VyICE9IG51bGwpIG1UYWJDb250ZW50TWFuYWdlci5yZW1vdmVUYWJUaHVtYm5haWwodGFiLmdldElkKCkpOwogICAgICAgICBtVGFiU2F2ZXIucmVtb3ZlVGFiRnJvbVF1ZXVlcyh0YWIpOwogCi0gICAgICAgIGlmICghaXNJbmNvZ25pdG8oKSkgdGFiLmNyZWF0ZUhpc3RvcmljYWxUYWIoKTsKKyAgICAgICAgaWYgKCFpc0luY29nbml0bygpKSBUYWJTdGF0ZS5jcmVhdGVIaXN0b3JpY2FsVGFiKHRhYik7CiAKICAgICAgICAgZm9yIChUYWJNb2RlbE9ic2VydmVyIG9icyA6IG1PYnNlcnZlcnMpIG9icy5kaWRDbG9zZVRhYih0YWIuZ2V0SWQoKSwgdGFiLmlzSW5jb2duaXRvKCkpOwogICAgICAgICBpZiAobm90aWZ5VGFiQ2xvc3VyZUNvbW1pdHRlZCkgewpkaWZmIC0tZ2l0IGEvY2hyb21lL2FuZHJvaWQvamF2YS9zdHJpbmdzL2FuZHJvaWRfY2hyb21lX3N0cmluZ3MuZ3JkIGIvY2hyb21lL2FuZHJvaWQvamF2YS9zdHJpbmdzL2FuZHJvaWRfY2hyb21lX3N0cmluZ3MuZ3JkCmluZGV4IGE2YmNkYmIuLmE0ZTdlZTUgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9hbmRyb2lkL2phdmEvc3RyaW5ncy9hbmRyb2lkX2Nocm9tZV9zdHJpbmdzLmdyZAorKysgYi9jaHJvbWUvYW5kcm9pZC9qYXZhL3N0cmluZ3MvYW5kcm9pZF9jaHJvbWVfc3RyaW5ncy5ncmQKQEAgLTI1NzcsMTcgKzI1NzcsNiBAQAogICAgICAgICBZWQogICAgICAgPC9tZXNzYWdlPgogCi0gICAgICA8IS0tIFN0YXJ0dXAgZXJyb3JzIC0tPgotICAgICAgPG1lc3NhZ2UgbmFtZT0iSURTX09TX1ZFUlNJT05fTUlTU0lOR19GRUFUVVJFUyIgZGVzYz0iRXJyb3IgbWVzc2FnZSBzaG93biB3aGVuIENocm9tZSBmYWlscyB0byBydW4gZHVlIHRvIGFuIGluY29tcGxldGUgdmVyc2lvbiBvZiBBbmRyb2lkLiI+Ci0gICAgICAgIENyaXRpY2FsIGZ1bmN0aW9uYWxpdHkgcmVxdWlyZWQgdG8gcnVuIENocm9tZSBpcyBtaXNzaW5nOyBlaXRoZXIgeW91ciBDaHJvbWUgaW5zdGFsbGF0aW9uIGlzIGluY29tcGxldGUsIG9yIG5vdCBjb21wYXRpYmxlIHdpdGggdGhpcyB2ZXJzaW9uIG9mIEFuZHJvaWQuCi0gICAgICA8L21lc3NhZ2U+Ci0gICAgICA8bWVzc2FnZSBuYW1lPSJJRFNfSU5DT01QQVRJQkxFX0xJQlJBUklFUyIgZGVzYz0iRXJyb3IgbWVzc2FnZSBzaG93biB3aGVuIENocm9tZSBmYWlscyB0byBzdGFydCBkdWUgdG8gaGF2aW5nIHRoZSB3cm9uZyB2ZXJzaW9uIG9mIHRoZSBuYXRpdmUgbGlicmFyeSI+Ci0gICAgICAgIENocm9tZeKAmXMgY29tcG9uZW50cyBhcmUgaW5jb21wYXRpYmxlIHdpdGggb25lIGFub3RoZXIuIENocm9tZSBtYXkgYmUgdXBncmFkaW5nLCBwbGVhc2UgdHJ5IGFnYWluIGluIGEgZmV3IG1pbnV0ZXMuIElmIHRoZSBwcm9ibGVtIGNvbnRpbnVlcywgdHJ5IHVuaW5zdGFsbGluZyBhbmQgcmUtaW5zdGFsbGluZyBDaHJvbWUuCi0gICAgICA8L21lc3NhZ2U+Ci0gICAgICA8bWVzc2FnZSBuYW1lPSJJRFNfTkFUSVZFX1NUQVJUVVBfRkFJTEVEIiBkZXNjPSJFcnJvciBtZXNzYWdlIHNob3duIHdoZW4gQ2hyb21lIGZhaWxzIHRvIHN0YXJ0IGZvciBvdGhlciAodW5rbm93bikgcmVhc29ucyI+Ci0gICAgICAgIENocm9tZSBmYWlsZWQgZHVyaW5nIHN0YXJ0dXAgd2l0aCBhbiB1bmV4cGVjdGVkIGVycm9yLgotICAgICAgPC9tZXNzYWdlPgotCiAgICAgICA8IS0tIEZpcnN0IFJ1biBzdHJpbmdzIC0tPgogICAgICAgPG1lc3NhZ2UgbmFtZT0iSURTX0ZSRV9BQ1RJVklUWV9MQUJFTCIgZGVzYz0iTGFiZWwgZm9yIGZpcnN0IHJ1biBkaWFsb2cgaW4gQW5kcm9pZCBSZWNlbnRzLiI+CiAgICAgICAgIENocm9tZSBGaXJzdCBSdW4gRXhwZXJpZW5jZQpkaWZmIC0tZ2l0IGEvY2hyb21lL2FuZHJvaWQvamF2YXRlc3RzL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvZ2VzdHVyZW5hdi9OYXZpZ2F0aW9uU2hlZXRUZXN0LmphdmEgYi9jaHJvbWUvYW5kcm9pZC9qYXZhdGVzdHMvc3JjL29yZy9jaHJvbWl1bS9jaHJvbWUvYnJvd3Nlci9nZXN0dXJlbmF2L05hdmlnYXRpb25TaGVldFRlc3QuamF2YQppbmRleCA4NTZmN2E3Li42NDQ0YzczNiAxMDA2NDQKLS0tIGEvY2hyb21lL2FuZHJvaWQvamF2YXRlc3RzL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvZ2VzdHVyZW5hdi9OYXZpZ2F0aW9uU2hlZXRUZXN0LmphdmEKKysrIGIvY2hyb21lL2FuZHJvaWQvamF2YXRlc3RzL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvZ2VzdHVyZW5hdi9OYXZpZ2F0aW9uU2hlZXRUZXN0LmphdmEKQEAgLTEwNyw2ICsxMDcsOSBAQAogICAgICAgICBwdWJsaWMgdm9pZCBuYXZpZ2F0ZVRvSW5kZXgoaW50IGluZGV4KSB7CiAgICAgICAgICAgICBtTmF2aWdhdGlvbkNvbnRyb2xsZXIuZ29Ub05hdmlnYXRpb25JbmRleChpbmRleCk7CiAgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VGFiQ2xvc2VSdW5uYWJsZShSdW5uYWJsZSBydW5uYWJsZSkge30KICAgICB9CiAKICAgICBAVGVzdApkaWZmIC0tZ2l0IGEvY2hyb21lL2FuZHJvaWQvbW9kdWxlcy9jaHJvbWVfZmVhdHVyZV9tb2R1bGVfdG1wbC5nbmkgYi9jaHJvbWUvYW5kcm9pZC9tb2R1bGVzL2Nocm9tZV9mZWF0dXJlX21vZHVsZV90bXBsLmduaQppbmRleCA2YWMxZDBkLi5jZmMyMDg1OSAxMDA2NDQKLS0tIGEvY2hyb21lL2FuZHJvaWQvbW9kdWxlcy9jaHJvbWVfZmVhdHVyZV9tb2R1bGVfdG1wbC5nbmkKKysrIGIvY2hyb21lL2FuZHJvaWQvbW9kdWxlcy9jaHJvbWVfZmVhdHVyZV9tb2R1bGVfdG1wbC5nbmkKQEAgLTQ1LDEwICs0NSw2IEBACiAgICAgICBkZXBzICs9IF9tb2R1bGVfZGVzYy5qYXZhX2RlcHMKICAgICB9CiAKLSAgICBpZiAoZGVmaW5lZChfbW9kdWxlX2Rlc2MucHJvZ3VhcmRfYXN5bmMpICYmIF9tb2R1bGVfZGVzYy5wcm9ndWFyZF9hc3luYykgewotICAgICAgZW5hYmxlX2NsYXNzX2RlcHNfb3V0cHV0ID0gIiR7X21vZHVsZV9kZXNjLm5hbWV9X2NvbnN0YW50X3Bvb2xfZGVwcy50eHQiCi0gICAgfQotCiAgICAgIyBEb24ndCBlbWJlZCBtb3JlIHRyYW5zbGF0aW9ucyB0aGFuIHJlcXVpcmVkIChodHRwOi8vY3JidWcuY29tLzkzMjAxNykuCiAgICAgYWFwdF9sb2NhbGVfd2hpdGVsaXN0ID0gbG9jYWxlcwogCmRpZmYgLS1naXQgYS9jaHJvbWUvYW5kcm9pZC9tb2R1bGVzL2Nocm9tZV9mZWF0dXJlX21vZHVsZXMuZ25pIGIvY2hyb21lL2FuZHJvaWQvbW9kdWxlcy9jaHJvbWVfZmVhdHVyZV9tb2R1bGVzLmduaQppbmRleCBiODE1ZjEyLi4wNWI2MTdkNCAxMDA2NDQKLS0tIGEvY2hyb21lL2FuZHJvaWQvbW9kdWxlcy9jaHJvbWVfZmVhdHVyZV9tb2R1bGVzLmduaQorKysgYi9jaHJvbWUvYW5kcm9pZC9tb2R1bGVzL2Nocm9tZV9mZWF0dXJlX21vZHVsZXMuZ25pCkBAIC0yOCw3ICsyOCw2IEBACiAjICAgbmF0aXZlX2RlcHM6IChPcHRpb25hbCkgTmF0aXZlIGNvZGUgZ29pbmcgaW50byBtb2R1bGUuCiAjICAgbmF0aXZlX2VudHJ5cG9pbnRzOiAoT3B0aW9uYWwpIEZpbGUgd2l0aCBsaXN0IG9mIGV4cG9zZWQgc3ltYm9scyBmcm9tIG5hdGl2ZQogIyAgICAgZmVhdHVyZSBtb2R1bGUgbGlicmFyeS4KLSMgICBwcm9ndWFyZF9hc3luYzogKE9wdGlvbmFsKSBXaGV0aGVyIHRvIHByb2d1YXJkIHRoZSBtb2R1bGUgYXN5bmNocm9ub3VzbHkuCiAjICAgbG9hZGFibGVfbW9kdWxlc18zMl9iaXQ6IChPcHRpb25hbCkgTGlzdCBvZiBhZGRpdGlvbmFsIDMyLWJpdCBzaGFyZWQKICMgICAgIGxpYnJhcnkgZmlsZXMgZ29pbmcgaW50byBtb2R1bGUgaWYgdGhlIG1vZHVsZSBpcyBleGVjdXRlZCBpbiAzMiBiaXQuCiAjICAgbG9hZGFibGVfbW9kdWxlc182NF9iaXQ6IChPcHRpb25hbCkgTGlzdCBvZiBhZGRpdGlvbmFsIDY0LWJpdCBzaGFyZWQKZGlmZiAtLWdpdCBhL2Nocm9tZS9hcHAvYXBwX21hbmFnZW1lbnRfc3RyaW5ncy5ncmRwIGIvY2hyb21lL2FwcC9hcHBfbWFuYWdlbWVudF9zdHJpbmdzLmdyZHAKaW5kZXggYzkzMzY3YS4uZDhlNWI2ODQgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9hcHAvYXBwX21hbmFnZW1lbnRfc3RyaW5ncy5ncmRwCisrKyBiL2Nocm9tZS9hcHAvYXBwX21hbmFnZW1lbnRfc3RyaW5ncy5ncmRwCkBAIC04NSw5ICs4NSw2IEBACiAgIDxtZXNzYWdlIG5hbWU9IklEU19BUFBfTUFOQUdFTUVOVF9TVE9SQUdFIiBkZXNjPSJMYWJlbCBmb3IgdGhlIEFuZHJvaWQgc3RvcmFnZSBwZXJtaXNzaW9uIHRvZ2dsZS4iPgogICAgIFN0b3JhZ2UKICAgPC9tZXNzYWdlPgotICA8bWVzc2FnZSBuYW1lPSJJRFNfQVBQX01BTkFHRU1FTlRfU1lTVEVNX0FQUF9QT0xJQ1lfU1RSSU5HIiBkZXNjPSJUb29sdGlwIGxhYmVsIGV4cGxhaW5pbmcgdGhhdCBhbiBhcHAgY2Fubm90IGJlIHVuaW5zdGFsbGVkIGFzIGl0IGlzIGEgcGFydCBvZiBDaHJvbWUgT1MgKHRoZSBvcGVyYXRpbmcgc3lzdGVtKS4iPgotICAgIFRoaXMgYXBwIGNhbm5vdCBiZSB1bmluc3RhbGxlZCBhcyBpdCBpcyBwYXJ0IG9mIENocm9tZSBPUy4KLSAgPC9tZXNzYWdlPgogICA8bWVzc2FnZSBuYW1lPSJJRFNfQVBQX01BTkFHRU1FTlRfUE9MSUNZX0FQUF9QT0xJQ1lfU1RSSU5HIiBkZXNjPSJUb29sdGlwIGxhYmVsIGV4cGxhaW5pbmcgdGhhdCBhbiBhcHAgY2Fubm90IGJlIHVuaW5zdGFsbGVkIGFzIGl0IGhhcyBiZWVuIGluc3RhbGxlZCBieSBhbiBhZG1pbnN0cmF0b3IuIj4KICAgICBUaGlzIGFwcCBoYXMgYmVlbiBpbnN0YWxsZWQgYnkgeW91ciBhZG1pbmlzdHJhdG9yLgogICA8L21lc3NhZ2U+CmRpZmYgLS1naXQgYS9jaHJvbWUvYXBwL2Nocm9tZW9zX3N0cmluZ3MuZ3JkcCBiL2Nocm9tZS9hcHAvY2hyb21lb3Nfc3RyaW5ncy5ncmRwCmluZGV4IDNjZmMyMGQ2Li5mZWJjYjlkIDEwMDY0NAotLS0gYS9jaHJvbWUvYXBwL2Nocm9tZW9zX3N0cmluZ3MuZ3JkcAorKysgYi9jaHJvbWUvYXBwL2Nocm9tZW9zX3N0cmluZ3MuZ3JkcApAQCAtMTYxMCw5ICsxNjEwLDYgQEAKICAgPG1lc3NhZ2UgbmFtZT0iSURTX0NPTlRST0xMRURfU0VUVElOR19QQVJFTlQiIGRlc2M9IlRleHQgZGlzcGxheWVkIGluIHRoZSBjb250cm9sbGVkIHNldHRpbmdzIGJ1YmJsZSB3aGVuIGEgc2V0dGluZydzIHZhbHVlIGlzIGNvbnRyb2xsZWQgYnkgdXNlcidzIHBhcmVudC4iPgogICAgIFRoaXMgc2V0dGluZyBpcyBtYW5hZ2VkIGJ5IGEgcGFyZW50LgogICA8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIG5hbWU9IklEU19DT05UUk9MTEVEX1NFVFRJTkdfQ0hJTERfUkVTVFJJQ1RJT04iIGRlc2M9IlRleHQgZGlzcGxheWVkIGluIHRoZSBjb250cm9sbGVkIHNldHRpbmdzIGJ1YmJsZSB3aGVuIGEgc2V0dGluZydzIHZhbHVlIGlzIHByZS1zZXQgYmVjYXVzZSB0aGUgdXNlciBpcyBhIGNoaWxkLiI+Ci0gICAgVGhpcyBzZXR0aW5nIGNhbid0IGJlIGNoYW5nZWQgYnkgYSBjaGlsZCB1c2VyLgotICA8L21lc3NhZ2U+CiAgIDxtZXNzYWdlIG5hbWU9IklEU19TVEFUVVNCQVJfRElTQUJMRV9TUE9LRU5fRkVFREJBQ0siIGRlc2M9IlRoZSBtZW51IG9wdGlvbiB0byBkaXNhYmxlIHNwb2tlbiBmZWVkYmFjayBhY2Nlc3NpYmlsaXR5IGZlYXR1cmUuIj4KICAgICBEaXNhYmxlIENocm9tZVZveCAoc3Bva2VuIGZlZWRiYWNrKQogICA8L21lc3NhZ2U+CmRpZmYgLS1naXQgYS9jaHJvbWUvYXBwL2dlbmVyYXRlZF9yZXNvdXJjZXMuZ3JkIGIvY2hyb21lL2FwcC9nZW5lcmF0ZWRfcmVzb3VyY2VzLmdyZAppbmRleCA2N2FlNDI3Li44OTE2NjFhIDEwMDY0NAotLS0gYS9jaHJvbWUvYXBwL2dlbmVyYXRlZF9yZXNvdXJjZXMuZ3JkCisrKyBiL2Nocm9tZS9hcHAvZ2VuZXJhdGVkX3Jlc291cmNlcy5ncmQKQEAgLTY0NTksNyArNjQ1OSw5IEBACiAgICAgICAgIDxtZXNzYWdlIG5hbWU9IklEU19DT05UUk9MTEVEX1NFVFRJTkdfSEFTX1JFQ09NTUVOREFUSU9OIiBkZXNjPSJUZXh0IGRpc3BsYXllZCBpbiB0aGUgY29udHJvbGxlZCBzZXR0aW5ncyBidWJibGUgd2hlbiBhIHZhbHVlIGlzIHJlY29tbWVuZGVkIGZvciBhIHNldHRpbmcgdGhyb3VnaCBwb2xpY3kgYnV0IGlzIGN1cnJlbnRseSBvdmVycmlkZGVuIGJ5IGEgdXNlci1zdXBwbGllZCB2YWx1ZS4iPgogICAgICAgICAgIFlvdXIgYWRtaW5pc3RyYXRvciByZWNvbW1lbmRzIGEgc3BlY2lmaWMgdmFsdWUgZm9yIHRoaXMgc2V0dGluZy4KICAgICAgICAgPC9tZXNzYWdlPgotCisgICAgICAgIDxtZXNzYWdlIG5hbWU9IklEU19DT05UUk9MTEVEX1NFVFRJTkdfQ0hJTERfUkVTVFJJQ1RJT04iIGRlc2M9IlRleHQgZGlzcGxheWVkIGluIHRoZSBjb250cm9sbGVkIHNldHRpbmdzIGJ1YmJsZSB3aGVuIGEgc2V0dGluZydzIHZhbHVlIGlzIHByZS1zZXQgYmVjYXVzZSB0aGUgdXNlciBpcyBhIGNoaWxkLiI+CisgICAgICAgICAgVGhpcyBzZXR0aW5nIGNhbid0IGJlIGNoYW5nZWQgYnkgYSBjaGlsZCB1c2VyLgorICAgICAgICA8L21lc3NhZ2U+CiAgICAgICAgIDwhLS0gRXh0ZW5zaW9uIGluc3RhbGwgbG9jYXRpb24gc3RyaW5ncyAtLT4KICAgICAgICAgPG1lc3NhZ2UgbmFtZT0iSURTX0VYVEVOU0lPTlNfSU5TVEFMTF9MT0NBVElPTl9VTktOT1dOIiBkZXNjPSJUaGUgdGV4dCBleHBsYWluaW5nIHRoZSB0aGUgaW5zdGFsbGF0aW9uIGxvY2F0aW9uIGlzIHVua25vd24uIj4KICAgICAgICAgICBOb3QgZnJvbSBDaHJvbWUgV2ViIFN0b3JlLgpkaWZmIC0tZ2l0IGEvY2hyb21lL2FwcC9zZXR0aW5nc19jaHJvbWl1bV9zdHJpbmdzLmdyZHAgYi9jaHJvbWUvYXBwL3NldHRpbmdzX2Nocm9taXVtX3N0cmluZ3MuZ3JkcAppbmRleCAyMjNkNDNlLi4yNjJkYTVkIDEwMDY0NAotLS0gYS9jaHJvbWUvYXBwL3NldHRpbmdzX2Nocm9taXVtX3N0cmluZ3MuZ3JkcAorKysgYi9jaHJvbWUvYXBwL3NldHRpbmdzX2Nocm9taXVtX3N0cmluZ3MuZ3JkcApAQCAtMjYsNiArMjYsOSBAQAogICAgIDxtZXNzYWdlIG5hbWU9IklEU19TRVRUSU5HU19BQk9VVF9PUyIgZGVzYz0iTWVudSB0aXRsZSBmb3IgdGhlIEFib3V0IENocm9taXVtIE9TIHBhZ2UuIj4KICAgICAgIEFib3V0IENocm9taXVtIE9TCiAgICAgPC9tZXNzYWdlPgorICAgIDxtZXNzYWdlIG5hbWU9IklEU19TRVRUSU5HU19BQk9VVF9TRUVfT1NfU0VUVElOR1NfRk9SX1VQREFURV9NRVNTQUdFIiBkZXNjPSJNZXNzYWdlIHNob3duIHRvIHVzZXJzIG9uIENocm9taXVtIGJyb3dzZXIgc2V0dGluZ3Mgd2hpY2ggYWxlcnRzIHRoZSB1c2VyIHRoYXQgT1MgdXBkYXRlcyBhcmUgc2hvd24gaW4gQ2hyb21pdW0gT1Mgc2V0dGluZ3MuIj4KKyAgICAgIFRvIHNlZSBpZiB5b3VyIGRldmljZSBpcyB1cCB0byBkYXRlLCBnbyB0byA8cGggbmFtZT0iTElOS19CRUdJTiI+Jmx0O2EgaHJlZj0iY2hyb21lOi8vb3Mtc2V0dGluZ3MvaGVscCImZ3Q7PC9waD5DaHJvbWl1bSBPUyBTZXR0aW5nczxwaCBuYW1lPSJMSU5LX0VORCI+Jmx0Oy9hJmd0OzwvcGg+CisgICAgPC9tZXNzYWdlPgogICAgIDxtZXNzYWdlIG5hbWU9IklEU19TRVRUSU5HU19HRVRfSEVMUF9VU0lOR19DSFJPTUVfT1MiIGRlc2M9IlRleHQgb2YgdGhlIGJ1dHRvbiB3aGljaCB0YWtlcyB0aGUgdXNlciB0byB0aGUgQ2hyb21lIGhlbHAgcGFnZS4iPgogICAgICAgR2V0IGhlbHAgd2l0aCBDaHJvbWl1bSBPUwogICAgIDwvbWVzc2FnZT4KZGlmZiAtLWdpdCBhL2Nocm9tZS9hcHAvc2V0dGluZ3NfZ29vZ2xlX2Nocm9tZV9zdHJpbmdzLmdyZHAgYi9jaHJvbWUvYXBwL3NldHRpbmdzX2dvb2dsZV9jaHJvbWVfc3RyaW5ncy5ncmRwCmluZGV4IDI0NzRhMjEuLmM2M2M1YjMgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9hcHAvc2V0dGluZ3NfZ29vZ2xlX2Nocm9tZV9zdHJpbmdzLmdyZHAKKysrIGIvY2hyb21lL2FwcC9zZXR0aW5nc19nb29nbGVfY2hyb21lX3N0cmluZ3MuZ3JkcApAQCAtMjYsNiArMjYsOSBAQAogICAgIDxtZXNzYWdlIG5hbWU9IklEU19TRVRUSU5HU19BQk9VVF9PUyIgZGVzYz0iTWVudSB0aXRsZSBmb3IgdGhlIEFib3V0IENocm9tZSBPUyBwYWdlLiI+CiAgICAgICBBYm91dCBDaHJvbWUgT1MKICAgICA8L21lc3NhZ2U+CisgICAgPG1lc3NhZ2UgbmFtZT0iSURTX1NFVFRJTkdTX0FCT1VUX1NFRV9PU19TRVRUSU5HU19GT1JfVVBEQVRFX01FU1NBR0UiIGRlc2M9Ik1lc3NhZ2Ugc2hvd24gdG8gdXNlcnMgb24gQ2hyb21lIGJyb3dzZXIgc2V0dGluZ3Mgd2hpY2ggYWxlcnRzIHRoZSB1c2VyIHRoYXQgT1MgdXBkYXRlcyBhcmUgc2hvd24gaW4gQ2hyb21lIE9TIHNldHRpbmdzLiI+CisgICAgICBUbyBzZWUgaWYgeW91ciBkZXZpY2UgaXMgdXAgdG8gZGF0ZSwgZ28gdG8gPHBoIG5hbWU9IkxJTktfQkVHSU4iPiZsdDthIGhyZWY9ImNocm9tZTovL29zLXNldHRpbmdzL2hlbHAiJmd0OzwvcGg+Q2hyb21lIE9TIFNldHRpbmdzPHBoIG5hbWU9IkxJTktfRU5EIj4mbHQ7L2EmZ3Q7PC9waD4KKyAgICA8L21lc3NhZ2U+CiAgICAgPG1lc3NhZ2UgbmFtZT0iSURTX1NFVFRJTkdTX0dFVF9IRUxQX1VTSU5HX0NIUk9NRV9PUyIgZGVzYz0iVGV4dCBvZiB0aGUgYnV0dG9uIHdoaWNoIHRha2VzIHRoZSB1c2VyIHRvIHRoZSBDaHJvbWUgaGVscCBwYWdlLiI+CiAgICAgICBHZXQgaGVscCB3aXRoIENocm9tZSBPUwogICAgIDwvbWVzc2FnZT4KZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL0JVSUxELmduIGIvY2hyb21lL2Jyb3dzZXIvQlVJTEQuZ24KaW5kZXggNzQ0NGE5NGIuLjY0ZGVlZTQgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL0JVSUxELmduCisrKyBiL2Nocm9tZS9icm93c2VyL0JVSUxELmduCkBAIC0zOTEwLDYgKzM5MTAsNyBAQAogICBpZiAoaXNfZGVza3RvcF9saW51eCkgewogICAgICMgRGVza3RvcCBsaW51eCwgZG9lc24ndCBjb3VudCBDaHJvbWVPUy4KICAgICBzb3VyY2VzICs9IFsKKyAgICAgICJkb3dubG9hZC9kb3dubG9hZF9zdGF0dXNfdXBkYXRlcl9saW51eC5jYyIsCiAgICAgICAiZmlyc3RfcnVuL3VwZ3JhZGVfdXRpbF9saW51eC5jYyIsCiAgICAgICAiZmlyc3RfcnVuL3VwZ3JhZGVfdXRpbF9saW51eC5oIiwKICAgICAgICJpY29uX2xvYWRlcl9hdXJhbGludXguY2MiLApkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvREVQUyBiL2Nocm9tZS9icm93c2VyL0RFUFMKaW5kZXggNzZlNDNiNmEuLjZhYjg0MjUgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL0RFUFMKKysrIGIvY2hyb21lL2Jyb3dzZXIvREVQUwpAQCAtNDUxLDEwICs0NTEsNiBAQAogICAiYnJvd3Nlcl9wcm9jZXNzX2ltcGwuY2MiOiBbCiAgICAgIit1aS9tZXNzYWdlX2NlbnRlci9tZXNzYWdlX2NlbnRlci5oIiwKICAgXSwKLSAgIyBUbyBzaGFyZSB2YWx1ZXMgb2YgVU1BIGVudW1zIGJldHdlZW4gcHJvZHVjdCBjb2RlIGFuZCB0ZXN0cy4KLSAgInRyYW5zbGF0ZV9tYW5hZ2VyX2Jyb3dzZXJ0ZXN0LmNjIjogWwotICAgICIrc2VydmljZXMvbmV0d29yay9pbml0aWF0b3JfbG9ja19jb21wYXRpYmlsaXR5LmgiLAotICBdLAogICAiaW5wdXRfbWV0aG9kX21hbmFnZXJfaW1wbC5jYyI6IFsKICAgICAiK2FzaC9rZXlib2FyZC91aS9rZXlib2FyZF91aV9jb250cm9sbGVyLmgiLAogICBdLApkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvYWJvdXRfZmxhZ3MuY2MgYi9jaHJvbWUvYnJvd3Nlci9hYm91dF9mbGFncy5jYwppbmRleCAzMDAzZWZmLi5kNTRhNzM1IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9hYm91dF9mbGFncy5jYworKysgYi9jaHJvbWUvYnJvd3Nlci9hYm91dF9mbGFncy5jYwpAQCAtNjIzLDEzICs2MjMsNiBAQAogICAgICBzd2l0Y2hlczo6a0Rpc2FibGVTaXRlSXNvbGF0aW9uLCAiIn0sCiB9OwogCi1jb25zdCBGZWF0dXJlRW50cnk6OkZlYXR1cmVQYXJhbSBrRW5mb3JjZVRMUzEzRG93bmdyYWRlS25vd25Pbmx5W10gPSB7Ci0gICAgeyJrbm93bl9yb290c19vbmx5IiwgInRydWUifX07Ci0KLWNvbnN0IEZlYXR1cmVFbnRyeTo6RmVhdHVyZVZhcmlhdGlvbiBrRW5mb3JjZVRMUzEzRG93bmdyYWRlRmVhdHVyZVZhcmlhdGlvbnNbXSA9Ci0gICAge3siKEtub3duIFJvb3QgT25seSkiLCBrRW5mb3JjZVRMUzEzRG93bmdyYWRlS25vd25Pbmx5LAotICAgICAgYmFzZTo6c2l6ZShrRW5mb3JjZVRMUzEzRG93bmdyYWRlS25vd25Pbmx5KSwgbnVsbHB0cn19OwotCiBjb25zdCBGZWF0dXJlRW50cnk6OkNob2ljZSBrRm9yY2VDb2xvclByb2ZpbGVDaG9pY2VzW10gPSB7CiAgICAge2ZsYWdzX3VpOjprR2VuZXJpY0V4cGVyaW1lbnRDaG9pY2VEZWZhdWx0LCAiIiwgIiJ9LAogICAgIHtmbGFnX2Rlc2NyaXB0aW9uczo6a0ZvcmNlQ29sb3JQcm9maWxlU1JHQiwKQEAgLTIzODcsMTEgKzIzODAsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwczovL3BsYXkuZ29vZ2xlLmNvbS9zdG9yZS9hcHBzLyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXRhaWxzP2lkPWNvbS5hbmRyb2lkLmNocm9tZSIpfSwKICNlbmRpZiAgLy8gT1NfQU5EUk9JRAotICAgIHsiZW5mb3JjZS10bHMxMy1kb3duZ3JhZGUiLCBmbGFnX2Rlc2NyaXB0aW9uczo6a0VuZm9yY2VUTFMxM0Rvd25ncmFkZU5hbWUsCi0gICAgIGZsYWdfZGVzY3JpcHRpb25zOjprRW5mb3JjZVRMUzEzRG93bmdyYWRlRGVzY3JpcHRpb24sIGtPc0FsbCwKLSAgICAgRkVBVFVSRV9XSVRIX1BBUkFNU19WQUxVRV9UWVBFKG5ldDo6ZmVhdHVyZXM6OmtFbmZvcmNlVExTMTNEb3duZ3JhZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRW5mb3JjZVRMUzEzRG93bmdyYWRlRmVhdHVyZVZhcmlhdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW5mb3JjZVRMUzEzRG93bmdyYWRlIil9LAorICAgIHsidGxzMTMtaGFyZGVuaW5nLWZvci1sb2NhbC1hbmNob3JzIiwKKyAgICAgZmxhZ19kZXNjcmlwdGlvbnM6OmtUTFMxM0hhcmRlbmluZ0ZvckxvY2FsQW5jaG9yc05hbWUsCisgICAgIGZsYWdfZGVzY3JpcHRpb25zOjprVExTMTNIYXJkZW5pbmdGb3JMb2NhbEFuY2hvcnNEZXNjcmlwdGlvbiwga09zQWxsLAorICAgICBGRUFUVVJFX1ZBTFVFX1RZUEUoZmVhdHVyZXM6OmtUTFMxM0hhcmRlbmluZ0ZvckxvY2FsQW5jaG9ycyl9LAogICAgIHsiZW5hYmxlLXRsczEzLWVhcmx5LWRhdGEiLCBmbGFnX2Rlc2NyaXB0aW9uczo6a0VuYWJsZVRMUzEzRWFybHlEYXRhTmFtZSwKICAgICAgZmxhZ19kZXNjcmlwdGlvbnM6OmtFbmFibGVUTFMxM0Vhcmx5RGF0YURlc2NyaXB0aW9uLCBrT3NBbGwsCiAgICAgIEZFQVRVUkVfVkFMVUVfVFlQRShuZXQ6OmZlYXR1cmVzOjprRW5hYmxlVExTMTNFYXJseURhdGEpfSwKQEAgLTM4NTEsNiArMzg0MywxMSBAQAogICAgICBmbGFnX2Rlc2NyaXB0aW9uczo6a0VuYWJsZUltcGxpY2l0Um9vdFNjcm9sbGVyRGVzY3JpcHRpb24sIGtPc0FsbCwKICAgICAgRkVBVFVSRV9WQUxVRV9UWVBFKGJsaW5rOjpmZWF0dXJlczo6a0ltcGxpY2l0Um9vdFNjcm9sbGVyKX0sCiAKKyAgICB7ImVuYWJsZS1jc3NvbS12aWV3LXNjcm9sbC1jb29yZGluYXRlcyIsCisgICAgIGZsYWdfZGVzY3JpcHRpb25zOjprRW5hYmxlQ1NTT01WaWV3U2Nyb2xsQ29vcmRpbmF0ZXNOYW1lLAorICAgICBmbGFnX2Rlc2NyaXB0aW9uczo6a0VuYWJsZUNTU09NVmlld1Njcm9sbENvb3JkaW5hdGVzRGVzY3JpcHRpb24sIGtPc0FsbCwKKyAgICAgRkVBVFVSRV9WQUxVRV9UWVBFKGJsaW5rOjpmZWF0dXJlczo6a0NTU09NVmlld1Njcm9sbENvb3JkaW5hdGVzKX0sCisKICAgICB7ImVuYWJsZS10ZXh0LWZyYWdtZW50LWFuY2hvciIsCiAgICAgIGZsYWdfZGVzY3JpcHRpb25zOjprRW5hYmxlVGV4dEZyYWdtZW50QW5jaG9yTmFtZSwKICAgICAgZmxhZ19kZXNjcmlwdGlvbnM6OmtFbmFibGVUZXh0RnJhZ21lbnRBbmNob3JEZXNjcmlwdGlvbiwga09zQWxsLApAQCAtNDIyMSwxNCArNDIxOCwxMiBAQAogICAgICBmbGFnX2Rlc2NyaXB0aW9uczo6a0F1dG9maWxsUHJ1bmVTdWdnZXN0aW9uc0Rlc2NyaXB0aW9uLCBrT3NBbGwsCiAgICAgIEZFQVRVUkVfVkFMVUVfVFlQRShhdXRvZmlsbDo6ZmVhdHVyZXM6OmtBdXRvZmlsbFBydW5lU3VnZ2VzdGlvbnMpfSwKIAotLy8gVE9ETyhodHRwczovL2NyYnVnLmNvbS8xMDEwNTA5KTogUmUtZW5hYmxlIHRoaXMgaW4gQ2hyb21lIDgwLgotI2lmIDAKICAgICB7ImFsbG93LXBvcHVwcy1kdXJpbmctcGFnZS11bmxvYWQiLAogICAgICBmbGFnX2Rlc2NyaXB0aW9uczo6a0FsbG93UG9wdXBzRHVyaW5nUGFnZVVubG9hZE5hbWUsCiAgICAgIGZsYWdfZGVzY3JpcHRpb25zOjprQWxsb3dQb3B1cHNEdXJpbmdQYWdlVW5sb2FkRGVzY3JpcHRpb24sCiAgICAgIGtPc0FsbCB8IGtEZXByZWNhdGVkLAotICAgICBTSU5HTEVfVkFMVUVfVFlQRShzd2l0Y2hlczo6a0FsbG93UG9wdXBzRHVyaW5nUGFnZVVubG9hZCl9LAotI2VuZGlmCisgICAgIEZFQVRVUkVfVkFMVUVfVFlQRShmZWF0dXJlczo6a0FsbG93UG9wdXBzRHVyaW5nUGFnZVVubG9hZCl9LAorCiAjaWYgZGVmaW5lZChPU19DSFJPTUVPUykKICAgICB7ImVuYWJsZS1hZHZhbmNlZC1wcGQtYXR0cmlidXRlcyIsCiAgICAgIGZsYWdfZGVzY3JpcHRpb25zOjprRW5hYmxlQWR2YW5jZWRQcGRBdHRyaWJ1dGVzTmFtZSwKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL2FuZHJvaWQvY2hyb21lX2ZlYXR1cmVfbGlzdC5jYyBiL2Nocm9tZS9icm93c2VyL2FuZHJvaWQvY2hyb21lX2ZlYXR1cmVfbGlzdC5jYwppbmRleCBiNmI4MGU4Li5lZTEyMTk0MiAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvYW5kcm9pZC9jaHJvbWVfZmVhdHVyZV9saXN0LmNjCisrKyBiL2Nocm9tZS9icm93c2VyL2FuZHJvaWQvY2hyb21lX2ZlYXR1cmVfbGlzdC5jYwpAQCAtNTQ3LDggKzU0Nyw4IEBACiBjb25zdCBiYXNlOjpGZWF0dXJlIGtUYWJSZXBhcmVudGluZ3siVGFiUmVwYXJlbnRpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6RkVBVFVSRV9FTkFCTEVEX0JZX0RFRkFVTFR9OwogCi1jb25zdCBiYXNlOjpGZWF0dXJlIGtUYWJTd2l0Y2hlckxvbmdwcmVzc01lbnV7Ci0gICAgIlRhYlN3aXRjaGVyTG9uZ3ByZXNzTWVudSIsIGJhc2U6OkZFQVRVUkVfRElTQUJMRURfQllfREVGQVVMVH07Citjb25zdCBiYXNlOjpGZWF0dXJlIGtUYWJTd2l0Y2hlckxvbmdwcmVzc01lbnV7IlRhYlN3aXRjaGVyTG9uZ3ByZXNzTWVudSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6RkVBVFVSRV9FTkFCTEVEX0JZX0RFRkFVTFR9OwogCiBjb25zdCBiYXNlOjpGZWF0dXJlIGtUYWJTd2l0Y2hlck9uUmV0dXJueyJUYWJTd2l0Y2hlck9uUmV0dXJuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6RkVBVFVSRV9ESVNBQkxFRF9CWV9ERUZBVUxUfTsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL2FuZHJvaWQvdGFiX2FuZHJvaWQuY2MgYi9jaHJvbWUvYnJvd3Nlci9hbmRyb2lkL3RhYl9hbmRyb2lkLmNjCmluZGV4IGFhYjVhZjVjLi44N2JhNjVkIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9hbmRyb2lkL3RhYl9hbmRyb2lkLmNjCisrKyBiL2Nocm9tZS9icm93c2VyL2FuZHJvaWQvdGFiX2FuZHJvaWQuY2MKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9wcm9maWxlcy9wcm9maWxlX2FuZHJvaWQuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9wcm9maWxlcy9wcm9maWxlX21hbmFnZXIuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9zZXNzaW9ucy9zZXNzaW9uX3RhYl9oZWxwZXIuaCIKLSNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9zZXNzaW9ucy90YWJfcmVzdG9yZV9zZXJ2aWNlX2ZhY3RvcnkuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9zeW5jL2dsdWUvc3luY2VkX3RhYl9kZWxlZ2F0ZV9hbmRyb2lkLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdGFiX2NvbnRlbnRzL3RhYl91dGlsLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvYW5kcm9pZC9jb250ZXh0X21lbnVfaGVscGVyLmgiCkBAIC00MCw4ICszOSw2IEBACiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvdGFiX2NvbnRlbnRzL2NvcmVfdGFiX2hlbHBlci5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL3RhYl9oZWxwZXJzLmgiCiAjaW5jbHVkZSAiY2hyb21lL2NvbW1vbi91cmxfY29uc3RhbnRzLmgiCi0jaW5jbHVkZSAiY29tcG9uZW50cy9zZXNzaW9ucy9jb250ZW50L2NvbnRlbnRfbGl2ZV90YWIuaCIKLSNpbmNsdWRlICJjb21wb25lbnRzL3Nlc3Npb25zL2NvcmUvdGFiX3Jlc3RvcmVfc2VydmljZS5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvdXJsX2Zvcm1hdHRlci91cmxfZml4ZXIuaCIKICNpbmNsdWRlICJjb250ZW50L3B1YmxpYy9icm93c2VyL2Jyb3dzZXJfdGhyZWFkLmgiCiAjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvYnJvd3Nlci9kZXZ0b29sc19hZ2VudF9ob3N0LmgiCkBAIC00MjksMzQgKzQyNiw2IEBACiAgICAgZW50cnktPlNldFRpdGxlKHRpdGxlKTsKIH0KIAotLy8gc3RhdGljCi12b2lkIFRhYkFuZHJvaWQ6OkNyZWF0ZUhpc3RvcmljYWxUYWJGcm9tQ29udGVudHMoV2ViQ29udGVudHMqIHdlYl9jb250ZW50cykgewotICBEQ0hFQ0sod2ViX2NvbnRlbnRzKTsKLQotICBzZXNzaW9uczo6VGFiUmVzdG9yZVNlcnZpY2UqIHNlcnZpY2UgPQotICAgICAgVGFiUmVzdG9yZVNlcnZpY2VGYWN0b3J5OjpHZXRGb3JQcm9maWxlKAotICAgICAgICAgIFByb2ZpbGU6OkZyb21Ccm93c2VyQ29udGV4dCh3ZWJfY29udGVudHMtPkdldEJyb3dzZXJDb250ZXh0KCkpKTsKLSAgaWYgKCFzZXJ2aWNlKQotICAgIHJldHVybjsKLQotICAvLyBFeGNsdWRlIGludGVybmFsIHBhZ2VzIGZyb20gYmVpbmcgbWFya2VkIGFzIHJlY2VudCB3aGVuIHRoZXkgYXJlIGNsb3NlZC4KLSAgY29uc3QgR1VSTCYgdGFiX3VybCA9IHdlYl9jb250ZW50cy0+R2V0VVJMKCk7Ci0gIGlmICh0YWJfdXJsLlNjaGVtZUlzKGNvbnRlbnQ6OmtDaHJvbWVVSVNjaGVtZSkgfHwKLSAgICAgIHRhYl91cmwuU2NoZW1lSXMoY2hyb21lOjprQ2hyb21lTmF0aXZlU2NoZW1lKSB8fAotICAgICAgdGFiX3VybC5TY2hlbWVJcyh1cmw6OmtBYm91dFNjaGVtZSkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBUT0RPKGpjaXZlbGxpKTogaXMgdGhlIGluZGV4IGltcG9ydGFudD8KLSAgc2VydmljZS0+Q3JlYXRlSGlzdG9yaWNhbFRhYigKLSAgICAgIHNlc3Npb25zOjpDb250ZW50TGl2ZVRhYjo6R2V0Rm9yV2ViQ29udGVudHMod2ViX2NvbnRlbnRzKSwgLTEpOwotfQotCi12b2lkIFRhYkFuZHJvaWQ6OkNyZWF0ZUhpc3RvcmljYWxUYWIoSk5JRW52KiBlbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSmF2YVBhcmFtUmVmPGpvYmplY3Q+JiBvYmopIHsKLSAgVGFiQW5kcm9pZDo6Q3JlYXRlSGlzdG9yaWNhbFRhYkZyb21Db250ZW50cyh3ZWJfY29udGVudHMoKSk7Ci19Ci0KIHZvaWQgVGFiQW5kcm9pZDo6TG9hZE9yaWdpbmFsSW1hZ2UoSk5JRW52KiBlbnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEphdmFQYXJhbVJlZjxqb2JqZWN0PiYgb2JqKSB7CiAgIGNvbnRlbnQ6OlJlbmRlckZyYW1lSG9zdCogcmVuZGVyX2ZyYW1lX2hvc3QgPQpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvYW5kcm9pZC90YWJfYW5kcm9pZC5oIGIvY2hyb21lL2Jyb3dzZXIvYW5kcm9pZC90YWJfYW5kcm9pZC5oCmluZGV4IDJjYmJlZTYuLjFiZGRlMzIgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL2FuZHJvaWQvdGFiX2FuZHJvaWQuaAorKysgYi9jaHJvbWUvYnJvd3Nlci9hbmRyb2lkL3RhYl9hbmRyb2lkLmgKQEAgLTE2MSwxMiArMTYxLDYgQEAKICAgICAgIEpOSUVudiogZW52LAogICAgICAgY29uc3QgYmFzZTo6YW5kcm9pZDo6SmF2YVBhcmFtUmVmPGpvYmplY3Q+JiBvYmopOwogCi0gIHZvaWQgQ3JlYXRlSGlzdG9yaWNhbFRhYihKTklFbnYqIGVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OmFuZHJvaWQ6OkphdmFQYXJhbVJlZjxqb2JqZWN0PiYgb2JqKTsKLQotICBzdGF0aWMgdm9pZCBDcmVhdGVIaXN0b3JpY2FsVGFiRnJvbUNvbnRlbnRzKAotICAgICAgY29udGVudDo6V2ViQ29udGVudHMqIHdlYl9jb250ZW50cyk7Ci0KICAgdm9pZCBMb2FkT3JpZ2luYWxJbWFnZShKTklFbnYqIGVudiwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjphbmRyb2lkOjpKYXZhUGFyYW1SZWY8am9iamVjdD4mIG9iaik7CiAKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL2FuZHJvaWQvdGFiX3N0YXRlLmNjIGIvY2hyb21lL2Jyb3dzZXIvYW5kcm9pZC90YWJfc3RhdGUuY2MKaW5kZXggMzZiZThjYy4uMmIwMmM1NzcgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL2FuZHJvaWQvdGFiX3N0YXRlLmNjCisrKyBiL2Nocm9tZS9icm93c2VyL2FuZHJvaWQvdGFiX3N0YXRlLmNjCkBAIC0xOSw5ICsxOSwxMyBAQAogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL2FuZHJvaWQvdGFiX2FuZHJvaWQuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9wcm9maWxlcy9wcm9maWxlLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvcHJvZmlsZXMvcHJvZmlsZV9tYW5hZ2VyLmgiCisjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvc2Vzc2lvbnMvdGFiX3Jlc3RvcmVfc2VydmljZV9mYWN0b3J5LmgiCisjaW5jbHVkZSAiY2hyb21lL2NvbW1vbi91cmxfY29uc3RhbnRzLmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9zZXNzaW9ucy9jb250ZW50L2NvbnRlbnRfbGl2ZV90YWIuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL3Nlc3Npb25zL2NvbnRlbnQvY29udGVudF9zZXJpYWxpemVkX25hdmlnYXRpb25fYnVpbGRlci5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvc2Vzc2lvbnMvY29yZS9zZXJpYWxpemVkX25hdmlnYXRpb25fZW50cnkuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL3Nlc3Npb25zL2NvcmUvc2Vzc2lvbl9jb21tYW5kLmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9zZXNzaW9ucy9jb3JlL3RhYl9yZXN0b3JlX3NlcnZpY2UuaCIKICNpbmNsdWRlICJjb250ZW50L3B1YmxpYy9icm93c2VyL25hdmlnYXRpb25fY29udHJvbGxlci5oIgogI2luY2x1ZGUgImNvbnRlbnQvcHVibGljL2Jyb3dzZXIvbmF2aWdhdGlvbl9lbnRyeS5oIgogI2luY2x1ZGUgImNvbnRlbnQvcHVibGljL2Jyb3dzZXIvcmVzdG9yZV90eXBlLmgiCkBAIC0zNzQsNiArMzc4LDI3IEBACiAgIHJldHVybiB3ZWJfY29udGVudHMucmVsZWFzZSgpOwogfQogCit2b2lkIENyZWF0ZUhpc3RvcmljYWxUYWIoY29udGVudDo6V2ViQ29udGVudHMqIHdlYl9jb250ZW50cykgeworICBEQ0hFQ0sod2ViX2NvbnRlbnRzKTsKKworICBzZXNzaW9uczo6VGFiUmVzdG9yZVNlcnZpY2UqIHNlcnZpY2UgPQorICAgICAgVGFiUmVzdG9yZVNlcnZpY2VGYWN0b3J5OjpHZXRGb3JQcm9maWxlKAorICAgICAgICAgIFByb2ZpbGU6OkZyb21Ccm93c2VyQ29udGV4dCh3ZWJfY29udGVudHMtPkdldEJyb3dzZXJDb250ZXh0KCkpKTsKKyAgaWYgKCFzZXJ2aWNlKQorICAgIHJldHVybjsKKworICAvLyBFeGNsdWRlIGludGVybmFsIHBhZ2VzIGZyb20gYmVpbmcgbWFya2VkIGFzIHJlY2VudCB3aGVuIHRoZXkgYXJlIGNsb3NlZC4KKyAgY29uc3QgR1VSTCYgdGFiX3VybCA9IHdlYl9jb250ZW50cy0+R2V0VVJMKCk7CisgIGlmICh0YWJfdXJsLlNjaGVtZUlzKGNvbnRlbnQ6OmtDaHJvbWVVSVNjaGVtZSkgfHwKKyAgICAgIHRhYl91cmwuU2NoZW1lSXMoY2hyb21lOjprQ2hyb21lTmF0aXZlU2NoZW1lKSB8fAorICAgICAgdGFiX3VybC5TY2hlbWVJcyh1cmw6OmtBYm91dFNjaGVtZSkpIHsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBUT0RPKGpjaXZlbGxpKTogaXMgdGhlIGluZGV4IGltcG9ydGFudD8KKyAgc2VydmljZS0+Q3JlYXRlSGlzdG9yaWNhbFRhYigKKyAgICAgIHNlc3Npb25zOjpDb250ZW50TGl2ZVRhYjo6R2V0Rm9yV2ViQ29udGVudHMod2ViX2NvbnRlbnRzKSwgLTEpOworfQogfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQogCiBTY29wZWRKYXZhTG9jYWxSZWY8am9iamVjdD4gV2ViQ29udGVudHNTdGF0ZTo6R2V0Q29udGVudHNTdGF0ZUFzQnl0ZUJ1ZmZlcigKQEAgLTYxMiw1ICs2MzcsMTQgQEAKICAgICAgIFdlYkNvbnRlbnRzU3RhdGU6OlJlc3RvcmVDb250ZW50c0Zyb21CeXRlQnVmZmVyKAogICAgICAgICAgIGVudiwgc3RhdGUsIHNhdmVkX3N0YXRlX3ZlcnNpb24sIHRydWUpKSk7CiAgIGlmICh3ZWJfY29udGVudHMuZ2V0KCkpCi0gICAgVGFiQW5kcm9pZDo6Q3JlYXRlSGlzdG9yaWNhbFRhYkZyb21Db250ZW50cyh3ZWJfY29udGVudHMuZ2V0KCkpOworICAgIENyZWF0ZUhpc3RvcmljYWxUYWIod2ViX2NvbnRlbnRzLmdldCgpKTsKK30KKworLy8gc3RhdGljCitzdGF0aWMgdm9pZCBKTklfVGFiU3RhdGVfQ3JlYXRlSGlzdG9yaWNhbFRhYkZyb21Db250ZW50cygKKyAgICBKTklFbnYqIGVudiwKKyAgICBjb25zdCBKYXZhUGFyYW1SZWY8am9iamVjdD4mIGp3ZWJfY29udGVudHMpIHsKKyAgYXV0byogd2ViX2NvbnRlbnRzID0gY29udGVudDo6V2ViQ29udGVudHM6OkZyb21KYXZhV2ViQ29udGVudHMoandlYl9jb250ZW50cyk7CisgIGlmICh3ZWJfY29udGVudHMpCisgICAgQ3JlYXRlSGlzdG9yaWNhbFRhYih3ZWJfY29udGVudHMpOwogfQpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvYW5kcm9pZC92ci9CVUlMRC5nbiBiL2Nocm9tZS9icm93c2VyL2FuZHJvaWQvdnIvQlVJTEQuZ24KaW5kZXggNDk3ZDkyYi4uYWFiMmUwNTggMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL2FuZHJvaWQvdnIvQlVJTEQuZ24KKysrIGIvY2hyb21lL2Jyb3dzZXIvYW5kcm9pZC92ci9CVUlMRC5nbgpAQCAtMjA3LDE0ICsyMDcsNiBAQAogICBdCiAKICAgamF2YV9maWxlcyA9IFsgIi8vY2hyb21lL2FuZHJvaWQvamF2YS9zcmMvb3JnL2Nocm9taXVtL2Nocm9tZS9icm93c2VyL3ZyL0FyQ29yZVNoaW1JbXBsLmphdmEiIF0KLQotICAjIFRPRE8oY3JidWcuY29tLzkzODkwOSk6IGNocm9taXVtX2NvZGUuZmxhZ3MgaXMgbm90IHVzZWQgYXMgYSBwcm9ndWFyZAotICAjIGNvbmZpZyB3aGVuIHByb2d1YXJkaW5nIGFzeW5jaHJvbm91c2x5LiBUaGlzIHJlc3VsdHMgaW4gQVIgY3Jhc2hpbmcKLSAgIyBjaHJvbWUgd2hlbiBBUiBpcyBhbiBhc3luYyBERk0uIFNob3VsZCBpbXBsZW1lbnQgYSBtb3JlIHNjYWxhYmxlCi0gICMgc29sdXRpb24gdG8gaW5jbHVkaW5nIGNocm9taXVtX2NvZGUuZmxhZ3Mgd2l0aCBhbGwgYXN5bmMgREZNcy4KLSAgaWYgKGFzeW5jX2FyKSB7Ci0gICAgcHJvZ3VhcmRfY29uZmlncyA9IFsgIi8vYmFzZS9hbmRyb2lkL3Byb2d1YXJkL2Nocm9taXVtX2NvZGUuZmxhZ3MiIF0KLSAgfQogfQogCiBpZiAoZW5hYmxlX2FyY29yZSkgewpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvYXBwcy9hcHBfc2VydmljZS9hcHBfc2VydmljZV9tZXRyaWNzLmNjIGIvY2hyb21lL2Jyb3dzZXIvYXBwcy9hcHBfc2VydmljZS9hcHBfc2VydmljZV9tZXRyaWNzLmNjCmluZGV4IGZkMWJkY2E2Li4xZjQzYzQyIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9hcHBzL2FwcF9zZXJ2aWNlL2FwcF9zZXJ2aWNlX21ldHJpY3MuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvYXBwcy9hcHBfc2VydmljZS9hcHBfc2VydmljZV9tZXRyaWNzLmNjCkBAIC0xNDgsNCArMTQ4LDI2IEBACiAgICAgUmVjb3JkQnVpbHRJbkFwcExhdW5jaChCdWlsdEluQXBwTmFtZTo6a1BsdWdpblZtLCBsYXVuY2hfc291cmNlKTsKIH0KIAordm9pZCBSZWNvcmRCdWlsdEluQXBwU2VhcmNoUmVzdWx0KGNvbnN0IHN0ZDo6c3RyaW5nJiBhcHBfaWQpIHsKKyAgaWYgKGFwcF9pZCA9PSBhc2g6OmtJbnRlcm5hbEFwcElkS2V5Ym9hcmRTaG9ydGN1dFZpZXdlcikgeworICAgIFVNQV9ISVNUT0dSQU1fRU5VTUVSQVRJT04oIkFwcHMuQXBwTGlzdFNlYXJjaFJlc3VsdEludGVybmFsQXBwLlNob3ciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbHRJbkFwcE5hbWU6OmtLZXlib2FyZFNob3J0Y3V0Vmlld2VyKTsKKyAgfSBlbHNlIGlmIChhcHBfaWQgPT0gYXNoOjprUmVsZWFzZU5vdGVzQXBwSWQpIHsKKyAgICBVTUFfSElTVE9HUkFNX0VOVU1FUkFUSU9OKCJBcHBzLkFwcExpc3RTZWFyY2hSZXN1bHRJbnRlcm5hbEFwcC5TaG93IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWx0SW5BcHBOYW1lOjprUmVsZWFzZU5vdGVzKTsKKyAgfSBlbHNlIGlmIChhcHBfaWQgPT0gYXNoOjprSW50ZXJuYWxBcHBJZENhbWVyYSkgeworICAgIFVNQV9ISVNUT0dSQU1fRU5VTUVSQVRJT04oIkFwcHMuQXBwTGlzdFNlYXJjaFJlc3VsdEludGVybmFsQXBwLlNob3ciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbHRJbkFwcE5hbWU6OmtDYW1lcmEpOworICB9IGVsc2UgaWYgKGFwcF9pZCA9PSBhc2g6OmtJbnRlcm5hbEFwcElkRGlzY292ZXIpIHsKKyAgICBVTUFfSElTVE9HUkFNX0VOVU1FUkFUSU9OKCJBcHBzLkFwcExpc3RTZWFyY2hSZXN1bHRJbnRlcm5hbEFwcC5TaG93IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWx0SW5BcHBOYW1lOjprRGlzY292ZXIpOworICB9IGVsc2UgaWYgKGFwcF9pZCA9PSBhc2g6OmtJbnRlcm5hbEFwcElkU2V0dGluZ3MpIHsKKyAgICBVTUFfSElTVE9HUkFNX0VOVU1FUkFUSU9OKCJBcHBzLkFwcExpc3RTZWFyY2hSZXN1bHRJbnRlcm5hbEFwcC5TaG93IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWx0SW5BcHBOYW1lOjprU2V0dGluZ3MpOworICB9IGVsc2UgaWYgKGFwcF9pZCA9PSBwbHVnaW5fdm06OmtQbHVnaW5WbUFwcElkKSB7CisgICAgVU1BX0hJU1RPR1JBTV9FTlVNRVJBVElPTigiQXBwcy5BcHBMaXN0U2VhcmNoUmVzdWx0SW50ZXJuYWxBcHAuU2hvdyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsdEluQXBwTmFtZTo6a1BsdWdpblZtKTsKKyAgfQorfQorCiB9ICAvLyBuYW1lc3BhY2UgYXBwcwpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvYXBwcy9hcHBfc2VydmljZS9hcHBfc2VydmljZV9tZXRyaWNzLmggYi9jaHJvbWUvYnJvd3Nlci9hcHBzL2FwcF9zZXJ2aWNlL2FwcF9zZXJ2aWNlX21ldHJpY3MuaAppbmRleCA5MGM0ZmE3Li44NTM3ODU4IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9hcHBzL2FwcF9zZXJ2aWNlL2FwcF9zZXJ2aWNlX21ldHJpY3MuaAorKysgYi9jaHJvbWUvYnJvd3Nlci9hcHBzL2FwcF9zZXJ2aWNlL2FwcF9zZXJ2aWNlX21ldHJpY3MuaApAQCAtMTUsNiArMTUsOCBAQAogdm9pZCBSZWNvcmRBcHBMYXVuY2goY29uc3Qgc3RkOjpzdHJpbmcmIGFwcF9pZCwKICAgICAgICAgICAgICAgICAgICAgIGFwcHM6Om1vam9tOjpMYXVuY2hTb3VyY2UgbGF1bmNoX3NvdXJjZSk7CiAKK3ZvaWQgUmVjb3JkQnVpbHRJbkFwcFNlYXJjaFJlc3VsdChjb25zdCBzdGQ6OnN0cmluZyYgYXBwX2lkKTsKKwogfSAgLy8gbmFtZXNwYWNlIGFwcHMKIAogI2VuZGlmICAvLyBDSFJPTUVfQlJPV1NFUl9BUFBTX0FQUF9TRVJWSUNFX0FQUF9TRVJWSUNFX01FVFJJQ1NfSF8KZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL2FwcHMvYXBwX3NlcnZpY2UvYXJjX2FwcHMuY2MgYi9jaHJvbWUvYnJvd3Nlci9hcHBzL2FwcF9zZXJ2aWNlL2FyY19hcHBzLmNjCmluZGV4IGYxMDkyZTkuLjY4NWRlNTMgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL2FwcHMvYXBwX3NlcnZpY2UvYXJjX2FwcHMuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvYXBwcy9hcHBfc2VydmljZS9hcmNfYXBwcy5jYwpAQCAtMjMsNyArMjMsNiBAQAogI2luY2x1ZGUgImNocm9tZS9zZXJ2aWNlcy9hcHBfc2VydmljZS9wdWJsaWMvY3BwL2ludGVudF9maWx0ZXJfdXRpbC5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvYXJjL2FwcF9wZXJtaXNzaW9ucy9hcmNfYXBwX3Blcm1pc3Npb25zX2JyaWRnZS5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvYXJjL2FyY19zZXJ2aWNlX21hbmFnZXIuaCIKLSNpbmNsdWRlICJjb21wb25lbnRzL2FyYy9pbnRlbnRfaGVscGVyL2FyY19pbnRlbnRfaGVscGVyX2JyaWRnZS5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvYXJjL21vam9tL2FwcF9wZXJtaXNzaW9ucy5tb2pvbS5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvYXJjL3Nlc3Npb24vYXJjX2JyaWRnZV9zZXJ2aWNlLmgiCiAjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvYnJvd3Nlci9zeXN0ZW1fY29ubmVjdG9yLmgiCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9hcHBzL2FwcF9zZXJ2aWNlL2FyY19hcHBzLmggYi9jaHJvbWUvYnJvd3Nlci9hcHBzL2FwcF9zZXJ2aWNlL2FyY19hcHBzLmgKaW5kZXggZjJlMzBlMi4uNDljNjlmODNkIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9hcHBzL2FwcF9zZXJ2aWNlL2FyY19hcHBzLmgKKysrIGIvY2hyb21lL2Jyb3dzZXIvYXBwcy9hcHBfc2VydmljZS9hcmNfYXBwcy5oCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvYXBwcy9hcHBfc2VydmljZS9pY29uX2tleV91dGlsLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvYXBwX2xpc3QvYXJjL2FyY19hcHBfbGlzdF9wcmVmcy5oIgogI2luY2x1ZGUgImNocm9tZS9zZXJ2aWNlcy9hcHBfc2VydmljZS9wdWJsaWMvbW9qb20vYXBwX3NlcnZpY2UubW9qb20uaCIKKyNpbmNsdWRlICJjb21wb25lbnRzL2FyYy9pbnRlbnRfaGVscGVyL2FyY19pbnRlbnRfaGVscGVyX2JyaWRnZS5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvYXJjL2ludGVudF9oZWxwZXIvYXJjX2ludGVudF9oZWxwZXJfb2JzZXJ2ZXIuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL2tleWVkX3NlcnZpY2UvY29yZS9rZXllZF9zZXJ2aWNlLmgiCiAjaW5jbHVkZSAibW9qby9wdWJsaWMvY3BwL2JpbmRpbmdzL3BlbmRpbmdfcmVtb3RlLmgiCkBAIC0yNiwxMCArMjcsNiBAQAogCiBjbGFzcyBQcm9maWxlOwogCi1uYW1lc3BhY2UgYXJjIHsKLWNsYXNzIEFyY0ludGVudEhlbHBlckJyaWRnZTsKLX0KLQogbmFtZXNwYWNlIGFwcHMgewogCiBjbGFzcyBBcHBTZXJ2aWNlUHJveHk7CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9hcHBzL2FwcF9zZXJ2aWNlL2V4dGVuc2lvbl9hcHBzLmNjIGIvY2hyb21lL2Jyb3dzZXIvYXBwcy9hcHBfc2VydmljZS9leHRlbnNpb25fYXBwcy5jYwppbmRleCA3NjY1M2NjLi4wNGQ3ZmNmMCAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvYXBwcy9hcHBfc2VydmljZS9leHRlbnNpb25fYXBwcy5jYworKysgYi9jaHJvbWUvYnJvd3Nlci9hcHBzL2FwcF9zZXJ2aWNlL2V4dGVuc2lvbl9hcHBzLmNjCkBAIC00MCwxMiArNDAsOSBAQAogI2luY2x1ZGUgImNocm9tZS9zZXJ2aWNlcy9hcHBfc2VydmljZS9wdWJsaWMvY3BwL2ludGVudF9maWx0ZXJfdXRpbC5oIgogI2luY2x1ZGUgImNocm9tZS9zZXJ2aWNlcy9hcHBfc2VydmljZS9wdWJsaWMvbW9qb20vdHlwZXMubW9qb20uaCIKICNpbmNsdWRlICJjb21wb25lbnRzL2FyYy9hcmNfc2VydmljZV9tYW5hZ2VyLmgiCi0jaW5jbHVkZSAiY29tcG9uZW50cy9jb250ZW50X3NldHRpbmdzL2NvcmUvYnJvd3Nlci9ob3N0X2NvbnRlbnRfc2V0dGluZ3NfbWFwLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9jb250ZW50X3NldHRpbmdzL2NvcmUvY29tbW9uL2NvbnRlbnRfc2V0dGluZ3MuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL2NvbnRlbnRfc2V0dGluZ3MvY29yZS9jb21tb24vY29udGVudF9zZXR0aW5nc19wYXR0ZXJuLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9jb250ZW50X3NldHRpbmdzL2NvcmUvY29tbW9uL2NvbnRlbnRfc2V0dGluZ3NfdHlwZXMuaCIKLSNpbmNsdWRlICJleHRlbnNpb25zL2Jyb3dzZXIvZXh0ZW5zaW9uX3ByZWZzLmgiCi0jaW5jbHVkZSAiZXh0ZW5zaW9ucy9icm93c2VyL2V4dGVuc2lvbl9yZWdpc3RyeS5oIgogI2luY2x1ZGUgImV4dGVuc2lvbnMvYnJvd3Nlci9leHRlbnNpb25fc3lzdGVtLmgiCiAjaW5jbHVkZSAiZXh0ZW5zaW9ucy9jb21tb24vY29uc3RhbnRzLmgiCiAjaW5jbHVkZSAiZXh0ZW5zaW9ucy9jb21tb24vc3dpdGNoZXMuaCIKQEAgLTE1MywxMiArMTUwLDcgQEAKICAgICBjb25zdCBtb2pvOjpSZW1vdGU8YXBwczo6bW9qb206OkFwcFNlcnZpY2U+JiBhcHBfc2VydmljZSwKICAgICBQcm9maWxlKiBwcm9maWxlLAogICAgIGFwcHM6Om1vam9tOjpBcHBUeXBlIGFwcF90eXBlKQotICAgIDogcHJvZmlsZV8ocHJvZmlsZSksCi0gICAgICBwcmVmc19vYnNlcnZlcl8odGhpcyksCi0gICAgICByZWdpc3RyeV9vYnNlcnZlcl8odGhpcyksCi0gICAgICBjb250ZW50X3NldHRpbmdzX29ic2VydmVyXyh0aGlzKSwKLSAgICAgIGFwcF90eXBlXyhhcHBfdHlwZSksCi0gICAgICBhcmNfcHJlZnNfKG51bGxwdHIpIHsKKyAgICA6IHByb2ZpbGVfKHByb2ZpbGUpLCBhcHBfdHlwZV8oYXBwX3R5cGUpIHsKICAgSW5pdGlhbGl6ZShhcHBfc2VydmljZSk7CiB9CiAKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL2FwcHMvYXBwX3NlcnZpY2UvZXh0ZW5zaW9uX2FwcHMuaCBiL2Nocm9tZS9icm93c2VyL2FwcHMvYXBwX3NlcnZpY2UvZXh0ZW5zaW9uX2FwcHMuaAppbmRleCAzY2VhYThiNS4uNTg1MmM0YiAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvYXBwcy9hcHBfc2VydmljZS9leHRlbnNpb25fYXBwcy5oCisrKyBiL2Nocm9tZS9icm93c2VyL2FwcHMvYXBwX3NlcnZpY2UvZXh0ZW5zaW9uX2FwcHMuaApAQCAtMTYsNyArMTYsOSBAQAogI2luY2x1ZGUgImNocm9tZS9zZXJ2aWNlcy9hcHBfc2VydmljZS9wdWJsaWMvbW9qb20vYXBwX3NlcnZpY2UubW9qb20uaCIKICNpbmNsdWRlICJjb21wb25lbnRzL2NvbnRlbnRfc2V0dGluZ3MvY29yZS9icm93c2VyL2NvbnRlbnRfc2V0dGluZ3Nfb2JzZXJ2ZXIuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL2NvbnRlbnRfc2V0dGluZ3MvY29yZS9icm93c2VyL2hvc3RfY29udGVudF9zZXR0aW5nc19tYXAuaCIKKyNpbmNsdWRlICJleHRlbnNpb25zL2Jyb3dzZXIvZXh0ZW5zaW9uX3ByZWZzLmgiCiAjaW5jbHVkZSAiZXh0ZW5zaW9ucy9icm93c2VyL2V4dGVuc2lvbl9wcmVmc19vYnNlcnZlci5oIgorI2luY2x1ZGUgImV4dGVuc2lvbnMvYnJvd3Nlci9leHRlbnNpb25fcmVnaXN0cnkuaCIKICNpbmNsdWRlICJleHRlbnNpb25zL2Jyb3dzZXIvZXh0ZW5zaW9uX3JlZ2lzdHJ5X29ic2VydmVyLmgiCiAjaW5jbHVkZSAibW9qby9wdWJsaWMvY3BwL2JpbmRpbmdzL3BlbmRpbmdfcmVtb3RlLmgiCiAjaW5jbHVkZSAibW9qby9wdWJsaWMvY3BwL2JpbmRpbmdzL3JlY2VpdmVyLmgiCkBAIC0xNTcsMTIgKzE1OSwxMiBAQAogICBQcm9maWxlKiBwcm9maWxlXzsKIAogICBTY29wZWRPYnNlcnZlcjxleHRlbnNpb25zOjpFeHRlbnNpb25QcmVmcywgZXh0ZW5zaW9uczo6RXh0ZW5zaW9uUHJlZnNPYnNlcnZlcj4KLSAgICAgIHByZWZzX29ic2VydmVyXzsKKyAgICAgIHByZWZzX29ic2VydmVyX3t0aGlzfTsKICAgU2NvcGVkT2JzZXJ2ZXI8ZXh0ZW5zaW9uczo6RXh0ZW5zaW9uUmVnaXN0cnksCiAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnM6OkV4dGVuc2lvblJlZ2lzdHJ5T2JzZXJ2ZXI+Ci0gICAgICByZWdpc3RyeV9vYnNlcnZlcl87CisgICAgICByZWdpc3RyeV9vYnNlcnZlcl97dGhpc307CiAgIFNjb3BlZE9ic2VydmVyPEhvc3RDb250ZW50U2V0dGluZ3NNYXAsIGNvbnRlbnRfc2V0dGluZ3M6Ok9ic2VydmVyPgotICAgICAgY29udGVudF9zZXR0aW5nc19vYnNlcnZlcl87CisgICAgICBjb250ZW50X3NldHRpbmdzX29ic2VydmVyX3t0aGlzfTsKIAogICBhcHBzX3V0aWw6OkluY3JlbWVudGluZ0ljb25LZXlGYWN0b3J5IGljb25fa2V5X2ZhY3RvcnlfOwogCkBAIC0xNzEsNyArMTczLDcgQEAKICAgdXNpbmcgRW5hYmxlRmxvd1B0ciA9IHN0ZDo6dW5pcXVlX3B0cjxFeHRlbnNpb25BcHBzRW5hYmxlRmxvdz47CiAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBFbmFibGVGbG93UHRyPiBlbmFibGVfZmxvd19tYXBfOwogCi0gIEFyY0FwcExpc3RQcmVmcyogYXJjX3ByZWZzXzsKKyAgQXJjQXBwTGlzdFByZWZzKiBhcmNfcHJlZnNfID0gbnVsbHB0cjsKIAogICBiYXNlOjpXZWFrUHRyRmFjdG9yeTxFeHRlbnNpb25BcHBzPiB3ZWFrX2ZhY3Rvcnlfe3RoaXN9OwogCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9hcHBzL3BsYXRmb3JtX2FwcHMvYXBpL2FyY19hcHBzX3ByaXZhdGUvYXJjX2FwcHNfcHJpdmF0ZV9hcGkuY2MgYi9jaHJvbWUvYnJvd3Nlci9hcHBzL3BsYXRmb3JtX2FwcHMvYXBpL2FyY19hcHBzX3ByaXZhdGUvYXJjX2FwcHNfcHJpdmF0ZV9hcGkuY2MKaW5kZXggYTRmMWY5Yy4uNmNjODYyNzQgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL2FwcHMvcGxhdGZvcm1fYXBwcy9hcGkvYXJjX2FwcHNfcHJpdmF0ZS9hcmNfYXBwc19wcml2YXRlX2FwaS5jYworKysgYi9jaHJvbWUvYnJvd3Nlci9hcHBzL3BsYXRmb3JtX2FwcHMvYXBpL2FyY19hcHBzX3ByaXZhdGUvYXJjX2FwcHNfcHJpdmF0ZV9hcGkuY2MKQEAgLTI4LDcgKzI4LDcgQEAKIH0KIAogQXJjQXBwc1ByaXZhdGVBUEk6OkFyY0FwcHNQcml2YXRlQVBJKGNvbnRlbnQ6OkJyb3dzZXJDb250ZXh0KiBjb250ZXh0KQotICAgIDogY29udGV4dF8oY29udGV4dCksIHNjb3BlZF9wcmVmc19vYnNlcnZlcl8odGhpcykgeworICAgIDogY29udGV4dF8oY29udGV4dCkgewogICBleHRlbnNpb25zOjpFdmVudFJvdXRlcjo6R2V0KGNvbnRleHRfKS0+UmVnaXN0ZXJPYnNlcnZlcigKICAgICAgIHRoaXMsIGFwaTo6YXJjX2FwcHNfcHJpdmF0ZTo6T25JbnN0YWxsZWQ6OmtFdmVudE5hbWUpOwogfQpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvYXBwcy9wbGF0Zm9ybV9hcHBzL2FwaS9hcmNfYXBwc19wcml2YXRlL2FyY19hcHBzX3ByaXZhdGVfYXBpLmggYi9jaHJvbWUvYnJvd3Nlci9hcHBzL3BsYXRmb3JtX2FwcHMvYXBpL2FyY19hcHBzX3ByaXZhdGUvYXJjX2FwcHNfcHJpdmF0ZV9hcGkuaAppbmRleCA2MWE3YmFlLi5iZjk2ZTZhIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9hcHBzL3BsYXRmb3JtX2FwcHMvYXBpL2FyY19hcHBzX3ByaXZhdGUvYXJjX2FwcHNfcHJpdmF0ZV9hcGkuaAorKysgYi9jaHJvbWUvYnJvd3Nlci9hcHBzL3BsYXRmb3JtX2FwcHMvYXBpL2FyY19hcHBzX3ByaXZhdGUvYXJjX2FwcHNfcHJpdmF0ZV9hcGkuaApAQCAtNDcsNyArNDcsOCBAQAogCiAgIGNvbnRlbnQ6OkJyb3dzZXJDb250ZXh0KiBjb25zdCBjb250ZXh0XzsKIAotICBTY29wZWRPYnNlcnZlcjxBcmNBcHBMaXN0UHJlZnMsIEFyY0FwcHNQcml2YXRlQVBJPiBzY29wZWRfcHJlZnNfb2JzZXJ2ZXJfOworICBTY29wZWRPYnNlcnZlcjxBcmNBcHBMaXN0UHJlZnMsIEFyY0FwcExpc3RQcmVmczo6T2JzZXJ2ZXI+CisgICAgICBzY29wZWRfcHJlZnNfb2JzZXJ2ZXJfe3RoaXN9OwogCiAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBcmNBcHBzUHJpdmF0ZUFQSSk7CiB9OwpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvYXZhaWxhYmlsaXR5L2F2YWlsYWJpbGl0eV9wcm9iZXIuY2MgYi9jaHJvbWUvYnJvd3Nlci9hdmFpbGFiaWxpdHkvYXZhaWxhYmlsaXR5X3Byb2Jlci5jYwppbmRleCBiNzU4YzMyLi4yZDI0OWMxZiAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvYXZhaWxhYmlsaXR5L2F2YWlsYWJpbGl0eV9wcm9iZXIuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvYXZhaWxhYmlsaXR5L2F2YWlsYWJpbGl0eV9wcm9iZXIuY2MKQEAgLTQzLDYgKzQzLDggQEAKIGNvbnN0IGNoYXIga0NhY2hlUHJlZktleVByZWZpeFtdID0gIkF2YWlsYWJpbGl0eS5Qcm9iZXIuY2FjaGUiOwogCiBjb25zdCBjaGFyIGtTdWNjZXNzSGlzdG9ncmFtW10gPSAiQXZhaWxhYmlsaXR5LlByb2Jlci5EaWRTdWNjZWVkIjsKK2NvbnN0IGNoYXIga1N1Y2Nlc3NBZnRlclJlcG9ydGVkRmFpbHVyZVtdID0KKyAgICAiQXZhaWxhYmlsaXR5LlByb2Jlci5EaWRTdWNjZWVkLkFmdGVyUmVwb3J0ZWRGYWlsdXJlIjsKIGNvbnN0IGNoYXIga0ZpbmFsUmVzdWx0SGlzdG9ncmFtW10gPSAiQXZhaWxhYmlsaXR5LlByb2Jlci5GaW5hbFN0YXRlIjsKIGNvbnN0IGNoYXIga1RpbWVVbnRpbFN1Y2Nlc3NbXSA9ICJBdmFpbGFiaWxpdHkuUHJvYmVyLlRpbWVVbnRpbFN1Y2Nlc3MiOwogY29uc3QgY2hhciBrVGltZVVudGlsRmFpbHVyZVtdID0gIkF2YWlsYWJpbGl0eS5Qcm9iZXIuVGltZVVudGlsRmFpbHVyZSI7CkBAIC0yNzksNiArMjgxLDcgQEAKICAgICAgIG5ldHdvcmtfY29ubmVjdGlvbl90cmFja2VyXyhudWxscHRyKSwKICAgICAgIHByZWZfc2VydmljZV8ocHJlZl9zZXJ2aWNlKSwKICAgICAgIHVybF9sb2FkZXJfZmFjdG9yeV8odXJsX2xvYWRlcl9mYWN0b3J5KSwKKyAgICAgIHJlcG9ydGVkX2V4dGVybmFsX2ZhaWx1cmVfKGZhbHNlKSwKICAgICAgIHdlYWtfZmFjdG9yeV8odGhpcykgewogICBEQ0hFQ0soZGVsZWdhdGVfKTsKIApAQCAtMzU2LDYgKzM1OSw3IEBACiAgIHJldHJ5X3RpbWVyXy5yZXNldCgpOwogICB0aW1lb3V0X3RpbWVyXy5yZXNldCgpOwogICB1cmxfbG9hZGVyXy5yZXNldCgpOworICByZXBvcnRlZF9leHRlcm5hbF9mYWlsdXJlXyA9IGZhbHNlOwogI2lmIGRlZmluZWQoT1NfQU5EUk9JRCkKICAgYXBwbGljYXRpb25fc3RhdHVzX2xpc3RlbmVyXy5yZXNldCgpOwogI2VuZGlmCkBAIC02MTUsNiArNjE5LDEzIEBACiAgIHJldHVybiBlbnRyeS52YWx1ZSgpLmlzX3N1Y2Nlc3MoKTsKIH0KIAordm9pZCBBdmFpbGFiaWxpdHlQcm9iZXI6OlJlcG9ydEV4dGVybmFsRmFpbHVyZUFuZFJldHJ5KCkgeworICBEQ0hFQ0tfQ0FMTEVEX09OX1ZBTElEX1NFUVVFTkNFKHNlcXVlbmNlX2NoZWNrZXJfKTsKKyAgUmVjb3JkUHJvYmVSZXN1bHQoZmFsc2UpOworICByZXBvcnRlZF9leHRlcm5hbF9mYWlsdXJlXyA9IHRydWU7CisgIFNlbmROb3dJZkluYWN0aXZlKGZhbHNlKTsKK30KKwogdm9pZCBBdmFpbGFiaWxpdHlQcm9iZXI6OlNldE9uQ29tcGxldGVDYWxsYmFjaygKICAgICBBdmFpbGFiaWxpdHlQcm9iZXJPbkNvbXBsZXRlQ2FsbGJhY2sgY2FsbGJhY2spIHsKICAgRENIRUNLX0NBTExFRF9PTl9WQUxJRF9TRVFVRU5DRShzZXF1ZW5jZV9jaGVja2VyXyk7CkBAIC02NTQsNiArNjY1LDEzIEBACiAgICAgICBiYXNlOjpIaXN0b2dyYW1CYXNlOjprVW1hVGFyZ2V0ZWRIaXN0b2dyYW1GbGFnKQogICAgICAgLT5BZGQoc3VjY2Vzcyk7CiAKKyAgaWYgKHJlcG9ydGVkX2V4dGVybmFsX2ZhaWx1cmVfKSB7CisgICAgYmFzZTo6Qm9vbGVhbkhpc3RvZ3JhbTo6RmFjdG9yeUdldCgKKyAgICAgICAgQXBwZW5kTmFtZVRvSGlzdG9ncmFtKGtTdWNjZXNzQWZ0ZXJSZXBvcnRlZEZhaWx1cmUpLAorICAgICAgICBiYXNlOjpIaXN0b2dyYW1CYXNlOjprVW1hVGFyZ2V0ZWRIaXN0b2dyYW1GbGFnKQorICAgICAgICAtPkFkZChzdWNjZXNzKTsKKyAgfQorCiAgIC8vIFRoZSBjYWxsYmFjayBtYXkgZGVsZXRlIHx0aGlzfCBzbyBydW4gaXQgaW4gYSBwb3N0IHRhc2suCiAgIGlmIChvbl9jb21wbGV0ZV9jYWxsYmFja18pIHsKICAgICBiYXNlOjpQb3N0VGFzayhGUk9NX0hFUkUsIHtjb250ZW50OjpCcm93c2VyVGhyZWFkOjpVSX0sCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9hdmFpbGFiaWxpdHkvYXZhaWxhYmlsaXR5X3Byb2Jlci5oIGIvY2hyb21lL2Jyb3dzZXIvYXZhaWxhYmlsaXR5L2F2YWlsYWJpbGl0eV9wcm9iZXIuaAppbmRleCAzNjRiYWNmLi4wMjU4YzAwIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9hdmFpbGFiaWxpdHkvYXZhaWxhYmlsaXR5X3Byb2Jlci5oCisrKyBiL2Nocm9tZS9icm93c2VyL2F2YWlsYWJpbGl0eS9hdmFpbGFiaWxpdHlfcHJvYmVyLmgKQEAgLTE4Miw2ICsxODIsMTEgQEAKICAgLy8gaXQgd2FzIHN1Y2Nlc3NmdWwuIEl0IGlzIHNhZmUgdG8gZGVsZXRlIHx0aGlzfCBkdXJpbmcgdGhlIGNhbGxiYWNrLgogICB2b2lkIFNldE9uQ29tcGxldGVDYWxsYmFjayhBdmFpbGFiaWxpdHlQcm9iZXJPbkNvbXBsZXRlQ2FsbGJhY2sgY2FsbGJhY2spOwogCisgIC8vIENhbGxlZCB3aGVuIHNvbWUgb3RoZXIgbmV0d29yayByZXF1ZXN0IHRvIHRoZSBzYW1lIGVuZHBvaW50IGhhcyBmYWlsZWQgYW5kCisgIC8vIHRoZSBwcm9iZSBzaG91bGQgYmUgcmVhdHRlbXB0ZWQuIEFsc28gcmVjb3JkcyB0aGlzIGV2ZW50IGFzIGEgcHJvYmUKKyAgLy8gZmFpbHVyZS4KKyAgdm9pZCBSZXBvcnRFeHRlcm5hbEZhaWx1cmVBbmRSZXRyeSgpOworCiAgcHJvdGVjdGVkOgogICAvLyBFeHBvc2VzIHx0aWNrX2Nsb2NrfCBhbmQgfGNsb2NrfCBmb3IgdGVzdGluZy4KICAgQXZhaWxhYmlsaXR5UHJvYmVyKApAQCAtMzE1LDYgKzMyMCwxMSBAQAogICAvLyBib29sIHRvIGluZGljYXRlIHN1Y2Nlc3Mgb2YgdGhlIGNvbXBsZXRlZCBwcm9iZS4KICAgQXZhaWxhYmlsaXR5UHJvYmVyT25Db21wbGV0ZUNhbGxiYWNrIG9uX2NvbXBsZXRlX2NhbGxiYWNrXzsKIAorICAvLyBUaGlzIGlzIHNldCBhZnRlciBhIGNhbGwgdG8gfFJlcG9ydEV4dGVybmFsRmFpbHVyZUFuZFJldHJ5fCBhbmQgY2xlYXJlZAorICAvLyB3aGVuIHRoZSBuZXh0IHByb2JlIGNvbXBsZXRlcy4gVGhpcyBzdGF0ZSBpcyBrZXB0IGZvciBoaXN0b2dyYW0gcmVjb3JkaW5nCisgIC8vIG9mIHN1Y2Nlc3MgYWZ0ZXIgYSByZXBvcnRlZCBmYWlsdXJlLgorICBib29sIHJlcG9ydGVkX2V4dGVybmFsX2ZhaWx1cmVfOworCiAgIFNFUVVFTkNFX0NIRUNLRVIoc2VxdWVuY2VfY2hlY2tlcl8pOwogCiAgIGJhc2U6OldlYWtQdHJGYWN0b3J5PEF2YWlsYWJpbGl0eVByb2Jlcj4gd2Vha19mYWN0b3J5X3t0aGlzfTsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL2F2YWlsYWJpbGl0eS9hdmFpbGFiaWxpdHlfcHJvYmVyX3VuaXR0ZXN0LmNjIGIvY2hyb21lL2Jyb3dzZXIvYXZhaWxhYmlsaXR5L2F2YWlsYWJpbGl0eV9wcm9iZXJfdW5pdHRlc3QuY2MKaW5kZXggOTkwNDBlNC4uZDk0ODE5NiAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvYXZhaWxhYmlsaXR5L2F2YWlsYWJpbGl0eV9wcm9iZXJfdW5pdHRlc3QuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvYXZhaWxhYmlsaXR5L2F2YWlsYWJpbGl0eV9wcm9iZXJfdW5pdHRlc3QuY2MKQEAgLTkwOCwzICs5MDgsNTQgQEAKICAgRVhQRUNUX1RSVUUocHJvYmVyLT5MYXN0UHJvYmVXYXNTdWNjZXNzZnVsKCkudmFsdWUoKSk7CiAgIEVYUEVDVF9GQUxTRShwcm9iZXItPmlzX2FjdGl2ZSgpKTsKIH0KKworVEVTVF9GKEF2YWlsYWJpbGl0eVByb2JlclRlc3QsIFJlcG9ydEV4dGVybmFsRmFpbHVyZV9XaGlsZUlkbGUpIHsKKyAgYmFzZTo6SGlzdG9ncmFtVGVzdGVyIGhpc3RvZ3JhbV90ZXN0ZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxBdmFpbGFiaWxpdHlQcm9iZXI+IHByb2JlciA9IE5ld1Byb2JlcigpOworICBFWFBFQ1RfRVEocHJvYmVyLT5MYXN0UHJvYmVXYXNTdWNjZXNzZnVsKCksIGJhc2U6Om51bGxvcHQpOworICBFWFBFQ1RfRkFMU0UocHJvYmVyLT5pc19hY3RpdmUoKSk7CisKKyAgcHJvYmVyLT5SZXBvcnRFeHRlcm5hbEZhaWx1cmVBbmRSZXRyeSgpOworICBFWFBFQ1RfRkFMU0UocHJvYmVyLT5MYXN0UHJvYmVXYXNTdWNjZXNzZnVsKCkudmFsdWUoKSk7CisgIEVYUEVDVF9UUlVFKHByb2Jlci0+aXNfYWN0aXZlKCkpOworCisgIFZlcmlmeVJlcXVlc3QoKTsKKyAgTWFrZVJlc3BvbnNlQW5kV2FpdChuZXQ6OkhUVFBfT0ssIG5ldDo6T0spOworICBFWFBFQ1RfVFJVRShwcm9iZXItPkxhc3RQcm9iZVdhc1N1Y2Nlc3NmdWwoKS52YWx1ZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKHByb2Jlci0+aXNfYWN0aXZlKCkpOworCisgIGhpc3RvZ3JhbV90ZXN0ZXIuRXhwZWN0QnVja2V0Q291bnQoIkF2YWlsYWJpbGl0eS5Qcm9iZXIuRGlkU3VjY2VlZC5MaXRlcGFnZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIDEpOworICBoaXN0b2dyYW1fdGVzdGVyLkV4cGVjdEJ1Y2tldENvdW50KCJBdmFpbGFiaWxpdHkuUHJvYmVyLkRpZFN1Y2NlZWQuTGl0ZXBhZ2VzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgMSk7CisgIGhpc3RvZ3JhbV90ZXN0ZXIuRXhwZWN0VW5pcXVlU2FtcGxlKAorICAgICAgIkF2YWlsYWJpbGl0eS5Qcm9iZXIuRGlkU3VjY2VlZC5BZnRlclJlcG9ydGVkRmFpbHVyZS5MaXRlcGFnZXMiLCB0cnVlLCAxKTsKK30KKworVEVTVF9GKEF2YWlsYWJpbGl0eVByb2JlclRlc3QsIFJlcG9ydEV4dGVybmFsRmFpbHVyZV9XaGlsZUFjdGl2ZSkgeworICBiYXNlOjpIaXN0b2dyYW1UZXN0ZXIgaGlzdG9ncmFtX3Rlc3RlcjsKKyAgc3RkOjp1bmlxdWVfcHRyPEF2YWlsYWJpbGl0eVByb2Jlcj4gcHJvYmVyID0gTmV3UHJvYmVyKCk7CisgIEVYUEVDVF9FUShwcm9iZXItPkxhc3RQcm9iZVdhc1N1Y2Nlc3NmdWwoKSwgYmFzZTo6bnVsbG9wdCk7CisgIEVYUEVDVF9GQUxTRShwcm9iZXItPmlzX2FjdGl2ZSgpKTsKKworICBwcm9iZXItPlNlbmROb3dJZkluYWN0aXZlKGZhbHNlKTsKKyAgRVhQRUNUX0VRKHByb2Jlci0+TGFzdFByb2JlV2FzU3VjY2Vzc2Z1bCgpLCBiYXNlOjpudWxsb3B0KTsKKyAgRVhQRUNUX1RSVUUocHJvYmVyLT5pc19hY3RpdmUoKSk7CisgIFZlcmlmeVJlcXVlc3QoKTsKKworICBwcm9iZXItPlJlcG9ydEV4dGVybmFsRmFpbHVyZUFuZFJldHJ5KCk7CisgIEVYUEVDVF9GQUxTRShwcm9iZXItPkxhc3RQcm9iZVdhc1N1Y2Nlc3NmdWwoKS52YWx1ZSgpKTsKKyAgRVhQRUNUX1RSVUUocHJvYmVyLT5pc19hY3RpdmUoKSk7CisgIFZlcmlmeVJlcXVlc3QoKTsKKworICBNYWtlUmVzcG9uc2VBbmRXYWl0KG5ldDo6SFRUUF9PSywgbmV0OjpPSyk7CisgIEVYUEVDVF9UUlVFKHByb2Jlci0+TGFzdFByb2JlV2FzU3VjY2Vzc2Z1bCgpLnZhbHVlKCkpOworICBFWFBFQ1RfRkFMU0UocHJvYmVyLT5pc19hY3RpdmUoKSk7CisKKyAgaGlzdG9ncmFtX3Rlc3Rlci5FeHBlY3RCdWNrZXRDb3VudCgiQXZhaWxhYmlsaXR5LlByb2Jlci5EaWRTdWNjZWVkLkxpdGVwYWdlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgMSk7CisgIGhpc3RvZ3JhbV90ZXN0ZXIuRXhwZWN0QnVja2V0Q291bnQoIkF2YWlsYWJpbGl0eS5Qcm9iZXIuRGlkU3VjY2VlZC5MaXRlcGFnZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAxKTsKKyAgaGlzdG9ncmFtX3Rlc3Rlci5FeHBlY3RVbmlxdWVTYW1wbGUoCisgICAgICAiQXZhaWxhYmlsaXR5LlByb2Jlci5EaWRTdWNjZWVkLkFmdGVyUmVwb3J0ZWRGYWlsdXJlLkxpdGVwYWdlcyIsIHRydWUsIDEpOworfQpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvYmFja2dyb3VuZF9zeW5jL2JhY2tncm91bmRfc3luY19jb250cm9sbGVyX2ltcGwuY2MgYi9jaHJvbWUvYnJvd3Nlci9iYWNrZ3JvdW5kX3N5bmMvYmFja2dyb3VuZF9zeW5jX2NvbnRyb2xsZXJfaW1wbC5jYwppbmRleCAxN2FiZmI5Yi4uZjIyMWQ2OCAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvYmFja2dyb3VuZF9zeW5jL2JhY2tncm91bmRfc3luY19jb250cm9sbGVyX2ltcGwuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvYmFja2dyb3VuZF9zeW5jL2JhY2tncm91bmRfc3luY19jb250cm9sbGVyX2ltcGwuY2MKQEAgLTM1LDYgKzM1LDggQEAKIGNvbnN0IGNoYXIgQmFja2dyb3VuZFN5bmNDb250cm9sbGVySW1wbDo6a1JlbHlPbkFuZHJvaWROZXR3b3JrRGV0ZWN0aW9uW10gPQogICAgICJyZWx5X29uX2FuZHJvaWRfbmV0d29ya19kZXRlY3Rpb24iOwogI2VuZGlmCitjb25zdCBjaGFyIEJhY2tncm91bmRTeW5jQ29udHJvbGxlckltcGw6OmtLZWVwQnJvd3NlckF3YWtlUGFyYW1ldGVyTmFtZVtdID0KKyAgICAia2VlcF9icm93c2VyX2F3YWtlX3RpbGxfZXZlbnRzX2NvbXBsZXRlIjsKIGNvbnN0IGNoYXIgQmFja2dyb3VuZFN5bmNDb250cm9sbGVySW1wbDo6a01heEF0dGVtcHRzUGFyYW1ldGVyTmFtZVtdID0KICAgICAibWF4X3N5bmNfYXR0ZW1wdHMiOwogY29uc3QgY2hhciBCYWNrZ3JvdW5kU3luY0NvbnRyb2xsZXJJbXBsOjoKQEAgLTExMiw2ICsxMTQsMTEgQEAKICAgICBwYXJhbWV0ZXJzLT5kaXNhYmxlID0gdHJ1ZTsKICAgfQogCisgIGlmIChiYXNlOjpMb3dlckNhc2VFcXVhbHNBU0NJSShmaWVsZF9wYXJhbXNba0tlZXBCcm93c2VyQXdha2VQYXJhbWV0ZXJOYW1lXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cnVlIikpIHsKKyAgICBwYXJhbWV0ZXJzLT5rZWVwX2Jyb3dzZXJfYXdha2VfdGlsbF9ldmVudHNfY29tcGxldGUgPSB0cnVlOworICB9CisKICAgaWYgKGJhc2U6OkNvbnRhaW5zKGZpZWxkX3BhcmFtcywKICAgICAgICAgICAgICAgICAgICAgIGtNYXhBdHRlbXB0c1dpdGhOb3RpZmljYXRpb25QZXJtaXNzaW9uUGFyYW1ldGVyTmFtZSkpIHsKICAgICBpbnQgbWF4X2F0dGVtcHRzOwpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvYmFja2dyb3VuZF9zeW5jL2JhY2tncm91bmRfc3luY19jb250cm9sbGVyX2ltcGwuaCBiL2Nocm9tZS9icm93c2VyL2JhY2tncm91bmRfc3luYy9iYWNrZ3JvdW5kX3N5bmNfY29udHJvbGxlcl9pbXBsLmgKaW5kZXggYTgyN2YzMC4uZTI1ZDBlZSAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvYmFja2dyb3VuZF9zeW5jL2JhY2tncm91bmRfc3luY19jb250cm9sbGVyX2ltcGwuaAorKysgYi9jaHJvbWUvYnJvd3Nlci9iYWNrZ3JvdW5kX3N5bmMvYmFja2dyb3VuZF9zeW5jX2NvbnRyb2xsZXJfaW1wbC5oCkBAIC00Miw2ICs0Miw3IEBACiAgcHVibGljOgogICBzdGF0aWMgY29uc3QgY2hhciBrRmllbGRUcmlhbE5hbWVbXTsKICAgc3RhdGljIGNvbnN0IGNoYXIga0Rpc2FibGVkUGFyYW1ldGVyTmFtZVtdOworICBzdGF0aWMgY29uc3QgY2hhciBrS2VlcEJyb3dzZXJBd2FrZVBhcmFtZXRlck5hbWVbXTsKICAgc3RhdGljIGNvbnN0IGNoYXIga01heEF0dGVtcHRzUGFyYW1ldGVyTmFtZVtdOwogICBzdGF0aWMgY29uc3QgY2hhciBrUmVseU9uQW5kcm9pZE5ldHdvcmtEZXRlY3Rpb25bXTsKICAgc3RhdGljIGNvbnN0IGNoYXIga01heEF0dGVtcHRzV2l0aE5vdGlmaWNhdGlvblBlcm1pc3Npb25QYXJhbWV0ZXJOYW1lW107CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9iYW5uZXJzL2FwcF9iYW5uZXJfbWV0cmljcy5oIGIvY2hyb21lL2Jyb3dzZXIvYmFubmVycy9hcHBfYmFubmVyX21ldHJpY3MuaAppbmRleCBlY2Y0YjVmMTIuLjMyMzUyNjMgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL2Jhbm5lcnMvYXBwX2Jhbm5lcl9tZXRyaWNzLmgKKysrIGIvY2hyb21lL2Jyb3dzZXIvYmFubmVycy9hcHBfYmFubmVyX21ldHJpY3MuaApAQCAtMzIsOCArMzIsOCBAQAogZW51bSBJbnN0YWxsRXZlbnQgewogICBJTlNUQUxMX0VWRU5UX01JTiA9IDIwLAogICBJTlNUQUxMX0VWRU5UX05BVElWRV9BUFBfSU5TVEFMTF9UUklHR0VSRUQgPSAyMSwKLSAgSU5TVEFMTF9FVkVOVF9OQVRJVkVfQVBQX0lOU1RBTExfU1RBUlRFRCA9IDIyLAotICBJTlNUQUxMX0VWRU5UX05BVElWRV9BUFBfSU5TVEFMTF9DT01QTEVURUQgPSAyMywKKyAgLy8gRGVwcmVjYXRlZDogSU5TVEFMTF9FVkVOVF9OQVRJVkVfQVBQX0lOU1RBTExfU1RBUlRFRCA9IDIyLAorICAvLyBEZXByZWNhdGVkOiBJTlNUQUxMX0VWRU5UX05BVElWRV9BUFBfSU5TVEFMTF9DT01QTEVURUQgPSAyMywKICAgSU5TVEFMTF9FVkVOVF9XRUJfQVBQX0lOU1RBTExFRCA9IDI0LAogICBJTlNUQUxMX0VWRU5UX01BWCA9IDI1LAogfTsKQEAgLTQ2LDcgKzQ2LDcgQEAKICAgRElTTUlTU19FVkVOVF9CQU5ORVJfQ0xJQ0sgPSA0MywKICAgRElTTUlTU19FVkVOVF9CQU5ORVJfU1dJUEUgPSA0NCwKICAgRElTTUlTU19FVkVOVF9DTE9TRV9CVVRUT04gPSA0NSwKLSAgRElTTUlTU19FVkVOVF9JTlNUQUxMX1RJTUVPVVQgPSA0NiwKKyAgLy8gRGVwcmVjYXRlZDogRElTTUlTU19FVkVOVF9JTlNUQUxMX1RJTUVPVVQgPSA0NiwKICAgRElTTUlTU19FVkVOVF9ESVNNSVNTRUQgPSA0NywKICAgRElTTUlTU19FVkVOVF9BTUJJRU5UX0lORk9CQVJfRElTTUlTU0VEID0gNDgsCiAgIERJU01JU1NfRVZFTlRfTUFYID0gNDksCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9iYW5uZXJzL2FwcF9iYW5uZXJfdWlfZGVsZWdhdGVfYW5kcm9pZC5jYyBiL2Nocm9tZS9icm93c2VyL2Jhbm5lcnMvYXBwX2Jhbm5lcl91aV9kZWxlZ2F0ZV9hbmRyb2lkLmNjCmluZGV4IGE3MzNiMGMuLmU0MmU0NTAgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL2Jhbm5lcnMvYXBwX2Jhbm5lcl91aV9kZWxlZ2F0ZV9hbmRyb2lkLmNjCisrKyBiL2Nocm9tZS9icm93c2VyL2Jhbm5lcnMvYXBwX2Jhbm5lcl91aV9kZWxlZ2F0ZV9hbmRyb2lkLmNjCkBAIC0xOCw4ICsxOCw2IEBACiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvYmFubmVycy9hcHBfYmFubmVyX21ldHJpY3MuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9iYW5uZXJzL2FwcF9iYW5uZXJfc2V0dGluZ3NfaGVscGVyLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvYnJvd3Nlcl9wcm9jZXNzLmgiCi0jaW5jbHVkZSAiY29tcG9uZW50cy9yYXBwb3IvcHVibGljL3JhcHBvcl91dGlscy5oIgotI2luY2x1ZGUgImNvbXBvbmVudHMvcmFwcG9yL3JhcHBvcl9zZXJ2aWNlX2ltcGwuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL3VybF9mb3JtYXR0ZXIvZWxpZGVfdXJsLmgiCiAjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvYnJvd3Nlci93ZWJfY29udGVudHMuaCIKICNpbmNsdWRlICJ1aS9nZngvYW5kcm9pZC9qYXZhX2JpdG1hcC5oIgpAQCAtMTMzLDI2ICsxMzEsNiBAQAogICByZXR1cm4gc2hvdWxkX2Nsb3NlX2Jhbm5lcjsKIH0KIAotdm9pZCBBcHBCYW5uZXJVaURlbGVnYXRlQW5kcm9pZDo6T25OYXRpdmVBcHBJbnN0YWxsU3RhcnRlZCgKLSAgICBjb250ZW50OjpXZWJDb250ZW50cyogd2ViX2NvbnRlbnRzKSB7Ci0gIEFwcEJhbm5lclNldHRpbmdzSGVscGVyOjpSZWNvcmRCYW5uZXJFdmVudCgKLSAgICAgIHdlYl9jb250ZW50cywgd2ViX2NvbnRlbnRzLT5HZXRWaXNpYmxlVVJMKCksIHBhY2thZ2VfbmFtZV8sCi0gICAgICBBcHBCYW5uZXJTZXR0aW5nc0hlbHBlcjo6QVBQX0JBTk5FUl9FVkVOVF9ESURfQUREX1RPX0hPTUVTQ1JFRU4sCi0gICAgICBBcHBCYW5uZXJNYW5hZ2VyOjpHZXRDdXJyZW50VGltZSgpKTsKLQotICBUcmFja0luc3RhbGxFdmVudChJTlNUQUxMX0VWRU5UX05BVElWRV9BUFBfSU5TVEFMTF9TVEFSVEVEKTsKLSAgcmFwcG9yOjpTYW1wbGVEb21haW5BbmRSZWdpc3RyeUZyb21HVVJMKGdfYnJvd3Nlcl9wcm9jZXNzLT5yYXBwb3Jfc2VydmljZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFwcEJhbm5lci5OYXRpdmVBcHAuSW5zdGFsbGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYl9jb250ZW50cy0+R2V0VVJMKCkpOwotfQotCi12b2lkIEFwcEJhbm5lclVpRGVsZWdhdGVBbmRyb2lkOjpPbk5hdGl2ZUFwcEluc3RhbGxGaW5pc2hlZChib29sIHN1Y2Nlc3MpIHsKLSAgaWYgKHN1Y2Nlc3MpCi0gICAgVHJhY2tJbnN0YWxsRXZlbnQoSU5TVEFMTF9FVkVOVF9OQVRJVkVfQVBQX0lOU1RBTExfQ09NUExFVEVEKTsKLSAgZWxzZQotICAgIFRyYWNrRGlzbWlzc0V2ZW50KERJU01JU1NfRVZFTlRfSU5TVEFMTF9USU1FT1VUKTsKLX0KLQogdm9pZCBBcHBCYW5uZXJVaURlbGVnYXRlQW5kcm9pZDo6T25VaUNhbmNlbGxlZCgKICAgICBKTklFbnYqIGVudiwKICAgICBjb25zdCBiYXNlOjphbmRyb2lkOjpKYXZhUGFyYW1SZWY8am9iamVjdD4mIG9iaikgewpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvYmFubmVycy9hcHBfYmFubmVyX3VpX2RlbGVnYXRlX2FuZHJvaWQuaCBiL2Nocm9tZS9icm93c2VyL2Jhbm5lcnMvYXBwX2Jhbm5lcl91aV9kZWxlZ2F0ZV9hbmRyb2lkLmgKaW5kZXggZTcwN2Q1MC4uZTI4NDgzMTMgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL2Jhbm5lcnMvYXBwX2Jhbm5lcl91aV9kZWxlZ2F0ZV9hbmRyb2lkLmgKKysrIGIvY2hyb21lL2Jyb3dzZXIvYmFubmVycy9hcHBfYmFubmVyX3VpX2RlbGVnYXRlX2FuZHJvaWQuaApAQCAtNzQsMTQgKzc0LDYgQEAKICAgLy8gdGhlIGluc3RhbGxhdGlvbiBVSSBzaG91bGQgYmUgZGlzbWlzc2VkLgogICBib29sIEluc3RhbGxBcHAoY29udGVudDo6V2ViQ29udGVudHMqIHdlYl9jb250ZW50cyk7CiAKLSAgLy8gQ2FsbGVkIGJ5IHRoZSBVSSBsYXllciB0byBpbmRpY2F0ZSB0aGF0IGEgbmF0aXZlIGFwcCBoYXMgYmVndW4KLSAgLy8gaW5zdGFsbGF0aW9uLgotICB2b2lkIE9uTmF0aXZlQXBwSW5zdGFsbFN0YXJ0ZWQoY29udGVudDo6V2ViQ29udGVudHMqIHdlYl9jb250ZW50cyk7Ci0KLSAgLy8gQ2FsbGVkIGJ5IHRoZSBVSSBsYXllciB0byBpbmRpY2F0ZSB0aGF0IGEgbmF0aXZlIGFwcCBoYXMgZmluaXNoZWQKLSAgLy8gaW5zdGFsbGF0aW9uLgotICB2b2lkIE9uTmF0aXZlQXBwSW5zdGFsbEZpbmlzaGVkKGJvb2wgc3VjY2Vzcyk7Ci0KICAgLy8gQ2FsbGVkIHRocm91Z2ggdGhlIEpOSSB0byBpbmRpY2F0ZSB0aGF0IHRoZSB1c2VyIGhhcyBkaXNtaXNzZWQgdGhlCiAgIC8vIGluc3RhbGxhdGlvbiBVSS4KICAgdm9pZCBPblVpQ2FuY2VsbGVkKEpOSUVudiogZW52LApkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvYnJvd3NpbmdfZGF0YS9jaHJvbWVfYnJvd3NpbmdfZGF0YV9yZW1vdmVyX2RlbGVnYXRlX3VuaXR0ZXN0LmNjIGIvY2hyb21lL2Jyb3dzZXIvYnJvd3NpbmdfZGF0YS9jaHJvbWVfYnJvd3NpbmdfZGF0YV9yZW1vdmVyX2RlbGVnYXRlX3VuaXR0ZXN0LmNjCmluZGV4IDZmZDRiZjEuLmRjM2E0MzYgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL2Jyb3dzaW5nX2RhdGEvY2hyb21lX2Jyb3dzaW5nX2RhdGFfcmVtb3Zlcl9kZWxlZ2F0ZV91bml0dGVzdC5jYworKysgYi9jaHJvbWUvYnJvd3Nlci9icm93c2luZ19kYXRhL2Nocm9tZV9icm93c2luZ19kYXRhX3JlbW92ZXJfZGVsZWdhdGVfdW5pdHRlc3QuY2MKQEAgLTI4NDAsMTMgKzI4NDAsMTEgQEAKICAgYXV0byogY29udGVudF9zZXR0aW5nX3JlZ2lzdHJ5ID0KICAgICAgIGNvbnRlbnRfc2V0dGluZ3M6OkNvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5OjpHZXRJbnN0YW5jZSgpOwogCi0jaWYgIWRlZmluZWQoT1NfQU5EUk9JRCkKICAgYXV0byogaGlzdG9yeV9zZXJ2aWNlID0KICAgICAgIEhpc3RvcnlTZXJ2aWNlRmFjdG9yeTo6R2V0Rm9yUHJvZmlsZVdpdGhvdXRDcmVhdGluZyhwcm9maWxlKTsKICAgLy8gQ3JlYXRlIGEgc2FmZV9icm93c2luZzo6VmVyZGljdENhY2hlTWFuYWdlciB0aGF0IHdpbGwgaGFuZGxlIGRlbGV0aW9uIG9mCiAgIC8vIENPTlRFTlRfU0VUVElOR1NfVFlQRV9QQVNTV09SRF9QUk9URUNUSU9OIGVudHJpZXMuCiAgIHNhZmVfYnJvd3Npbmc6OlZlcmRpY3RDYWNoZU1hbmFnZXIgc2JfY2FjaGVfbWFuYWdlcihoaXN0b3J5X3NlcnZpY2UsIG1hcCk7Ci0jZW5kaWYgIC8vICFkZWZpbmVkKE9TX0FORFJPSUQpCiAKICAgR1VSTCB1cmwoImh0dHBzOi8vZXhhbXBsZS5jb20iKTsKIApkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvY2FwdGl2ZV9wb3J0YWwvY2FwdGl2ZV9wb3J0YWxfdGFiX2hlbHBlcl91bml0dGVzdC5jYyBiL2Nocm9tZS9icm93c2VyL2NhcHRpdmVfcG9ydGFsL2NhcHRpdmVfcG9ydGFsX3RhYl9oZWxwZXJfdW5pdHRlc3QuY2MKaW5kZXggMTg3Zjk5MC4uOWZiZWJmYyAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvY2FwdGl2ZV9wb3J0YWwvY2FwdGl2ZV9wb3J0YWxfdGFiX2hlbHBlcl91bml0dGVzdC5jYworKysgYi9jaHJvbWUvYnJvd3Nlci9jYXB0aXZlX3BvcnRhbC9jYXB0aXZlX3BvcnRhbF90YWJfaGVscGVyX3VuaXR0ZXN0LmNjCkBAIC03Niw5ICs3Niw2IEBACiAgICAgY29udGVudDo6V2ViQ29udGVudHNUZXN0ZXIqIHdlYl9jb250ZW50c190ZXN0ZXIgPQogICAgICAgICBjb250ZW50OjpXZWJDb250ZW50c1Rlc3Rlcjo6Rm9yKHdlYl9jb250ZW50cygpKTsKICAgICB3ZWJfY29udGVudHNfdGVzdGVyLT5OYXZpZ2F0ZUFuZENvbW1pdChHVVJMKGtTdGFydFVybCkpOwotICAgIGNvbnRlbnQ6OlJlbmRlckZyYW1lSG9zdFRlc3RlciogcmZoX3Rlc3RlciA9Ci0gICAgICAgIGNvbnRlbnQ6OlJlbmRlckZyYW1lSG9zdFRlc3Rlcjo6Rm9yKG1haW5fcmZoKCkpOwotICAgIHJmaF90ZXN0ZXItPlNpbXVsYXRlTmF2aWdhdGlvblN0b3AoKTsKIAogICAgIHRhYl9oZWxwZXJfLnJlc2V0KG5ldyBDYXB0aXZlUG9ydGFsVGFiSGVscGVyKHdlYl9jb250ZW50cygpKSk7CiAgICAgdGFiX2hlbHBlcl8tPnByb2ZpbGVfID0gbnVsbHB0cjsKQEAgLTEzOSw4ICsxMzYsNiBAQAogICAgIEVYUEVDVF9DQUxMKG1vY2tfcmVsb2FkZXIoKSwgT25BYm9ydCgpKS5UaW1lcygxKTsKICAgICBuYXZpZ2F0aW9uLT5GYWlsKG5ldDo6RVJSX1RJTUVEX09VVCk7CiAgICAgbmF2aWdhdGlvbi0+QWJvcnRDb21taXQoKTsKLSAgICBjb250ZW50OjpSZW5kZXJGcmFtZUhvc3RUZXN0ZXI6OkZvcihuYXZpZ2F0aW9uLT5HZXRGaW5hbFJlbmRlckZyYW1lSG9zdCgpKQotICAgICAgICAtPlNpbXVsYXRlTmF2aWdhdGlvblN0b3AoKTsKIAogICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGFib3ZlIGNhbGwgcmVzdWx0ZWQgaW4gYWJvcnQsIGZvciB0ZXN0cyB0aGF0IGNvbnRpbnVlCiAgICAgLy8gYWZ0ZXIgdGhlIGFib3J0LgpAQCAtMTgwLDE3ICsxNzUsMTQgQEAKIAogVEVTVF9GKENhcHRpdmVQb3J0YWxUYWJIZWxwZXJUZXN0LCBIdHRwU3VjY2VzcykgewogICBTaW11bGF0ZVN1Y2Nlc3MoR1VSTChrSHR0cFVybCkpOwotICBjb250ZW50OjpSZW5kZXJGcmFtZUhvc3RUZXN0ZXI6OkZvcihtYWluX3JmaCgpKS0+U2ltdWxhdGVOYXZpZ2F0aW9uU3RvcCgpOwogfQogCiBURVNUX0YoQ2FwdGl2ZVBvcnRhbFRhYkhlbHBlclRlc3QsIEh0dHBUaW1lb3V0KSB7CiAgIFNpbXVsYXRlVGltZW91dChHVVJMKGtIdHRwVXJsKSk7Ci0gIGNvbnRlbnQ6OlJlbmRlckZyYW1lSG9zdFRlc3Rlcjo6Rm9yKG1haW5fcmZoKCkpLT5TaW11bGF0ZU5hdmlnYXRpb25TdG9wKCk7CiB9CiAKIFRFU1RfRihDYXB0aXZlUG9ydGFsVGFiSGVscGVyVGVzdCwgSHR0cHNTdWNjZXNzKSB7CiAgIFNpbXVsYXRlU3VjY2VzcyhHVVJMKGtIdHRwc1VybCkpOwotICBjb250ZW50OjpSZW5kZXJGcmFtZUhvc3RUZXN0ZXI6OkZvcihtYWluX3JmaCgpKS0+U2ltdWxhdGVOYXZpZ2F0aW9uU3RvcCgpOwogICBFWFBFQ1RfRkFMU0UodGFiX2hlbHBlcigpLT5Jc0xvZ2luVGFiKCkpOwogfQogCkBAIC0yMzcsNyArMjI5LDYgQEAKIC8vIGEgY3Jvc3MtcHJvY2VzcyBvbmUuCiBURVNUX0YoQ2FwdGl2ZVBvcnRhbFRhYkhlbHBlclRlc3QsIEh0dHBzQWJvcnRUaW1lb3V0Rm9yQ3Jvc3NQcm9jZXNzKSB7CiAgIFNpbXVsYXRlU3VjY2VzcyhHVVJMKGtIdHRwc1VybCkpOwotICBjb250ZW50OjpSZW5kZXJGcmFtZUhvc3RUZXN0ZXI6OkZvcihtYWluX3JmaCgpKS0+U2ltdWxhdGVOYXZpZ2F0aW9uU3RvcCgpOwogCiAgIFNpbXVsYXRlQWJvcnRUaW1lb3V0KEdVUkwoa0h0dHBzVXJsKSk7CiAgIC8vIE1ha2Ugc3VyZSBubyBzdGF0ZSB3YXMgY2FycmllZCBvdmVyIGZyb20gdGhlIHRpbWVvdXQgb3IgdGhlIGFib3J0LgpAQCAtMjcyLDExICsyNjMsNiBAQAogICAvLyBUaGUgY3Jvc3MtcHJvY2VzcyBuYXZpZ2F0aW9uIGZhaWxzLgogICBjcm9zc19wcm9jZXNzX25hdmlnYXRpb24tPkZhaWwobmV0OjpFUlJfRkFJTEVEKTsKIAotICAvLyBUaGUgc2FtZS1zaXRlIG5hdmlnYXRpb24gZmluYWxseSBzdG9wcy4KLSAgY29udGVudDo6UmVuZGVyRnJhbWVIb3N0VGVzdGVyOjpGb3IoCi0gICAgICBzYW1lX3NpdGVfbmF2aWdhdGlvbi0+R2V0RmluYWxSZW5kZXJGcmFtZUhvc3QoKSkKLSAgICAgIC0+U2ltdWxhdGVOYXZpZ2F0aW9uU3RvcCgpOwotCiAgIEVYUEVDVF9DQUxMKG1vY2tfcmVsb2FkZXIoKSwgT25Mb2FkQ29tbWl0dGVkKG5ldDo6RVJSX0ZBSUxFRCkpLlRpbWVzKDEpOwogICBjcm9zc19wcm9jZXNzX25hdmlnYXRpb24tPkNvbW1pdEVycm9yUGFnZSgpOwogfQpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lX2NvbnRlbnRfYnJvd3Nlcl9jbGllbnQuY2MgYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVfY29udGVudF9icm93c2VyX2NsaWVudC5jYwppbmRleCBmNDkxOTM0Li5jMTYyZDg0MCAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lX2NvbnRlbnRfYnJvd3Nlcl9jbGllbnQuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lX2NvbnRlbnRfYnJvd3Nlcl9jbGllbnQuY2MKQEAgLTE2ODAsMTIgKzE2ODAsNiBAQAogICAgICpyZWZlcnJlciA9IGNvbnRlbnQ6OlJlZmVycmVyKCk7CiAgICAgKmluaXRpYXRvcl9vcmlnaW4gPSBiYXNlOjpudWxsb3B0OwogICB9Ci0KLSNpZiBCVUlMREZMQUcoRU5BQkxFX0VYVEVOU0lPTlMpCi0gIENocm9tZUNvbnRlbnRCcm93c2VyQ2xpZW50RXh0ZW5zaW9uc1BhcnQ6Ok92ZXJyaWRlTmF2aWdhdGlvblBhcmFtcygKLSAgICAgIHNpdGVfaW5zdGFuY2UsIHRyYW5zaXRpb24sIGlzX3JlbmRlcmVyX2luaXRpYXRlZCwgcmVmZXJyZXIsCi0gICAgICBpbml0aWF0b3Jfb3JpZ2luKTsKLSNlbmRpZgogfQogCiBib29sIENocm9tZUNvbnRlbnRCcm93c2VyQ2xpZW50OjpTaG91bGRTdGF5SW5QYXJlbnRQcm9jZXNzRm9yTlRQKApAQCAtMTg1NywzMCArMTg1MSw3IEBACiB9CiAKIGJvb2wgQ2hyb21lQ29udGVudEJyb3dzZXJDbGllbnQ6OlNob3VsZERpc2FibGVTaXRlSXNvbGF0aW9uKCkgewotICAvLyBVc2luZyAxMDc3IHJhdGhlciB0aGFuIDEwMjQgYmVjYXVzZSAxKSBpdCBoZWxwcyBlbnN1cmUgdGhhdCBkZXZpY2VzIHdpdGgKLSAgLy8gZXhhY3RseSAxR0Igb2YgUkFNIHdvbid0IGdldCBpbmNsdWRlZCBiZWNhdXNlIG9mIGluYWNjdXJhY2llcyBvciBvZmYtYnktb25lCi0gIC8vIGVycm9ycyBhbmQgMikgdGhpcyBpcyB0aGUgYnVja2V0IGJvdW5kYXJ5IGluIE1lbW9yeS5TdGF0cy5XaW4uVG90YWxQaHlzMi4KLSAgLy8gU2VlIGFsc28gaHR0cHM6Ly9jcmJ1Zy5jb20vODQ0MTE4LgotICBjb25zdGV4cHIgaW50IGtEZWZhdWx0TWVtb3J5VGhyZXNob2xkTWIgPSAxMDc3OwotCi0gIC8vIFRPRE8oYWNvbHdlbGwpOiBSZW5hbWUgZmVhdHVyZSBzaW5jZSBpdCBub3cgYWZmZWN0cyBtb3JlIHRoYW4ganVzdCB0aGUKLSAgLy8gc2l0ZS1wZXItcHJvY2VzcyBjYXNlLgotICBpZiAoYmFzZTo6RmVhdHVyZUxpc3Q6OklzRW5hYmxlZCgKLSAgICAgICAgICBmZWF0dXJlczo6a1NpdGVQZXJQcm9jZXNzT25seUZvckhpZ2hNZW1vcnlDbGllbnRzKSkgewotICAgIGludCBtZW1vcnlfdGhyZXNob2xkX21iID0gYmFzZTo6R2V0RmllbGRUcmlhbFBhcmFtQnlGZWF0dXJlQXNJbnQoCi0gICAgICAgIGZlYXR1cmVzOjprU2l0ZVBlclByb2Nlc3NPbmx5Rm9ySGlnaE1lbW9yeUNsaWVudHMsCi0gICAgICAgIGZlYXR1cmVzOjprU2l0ZVBlclByb2Nlc3NPbmx5Rm9ySGlnaE1lbW9yeUNsaWVudHNQYXJhbU5hbWUsCi0gICAgICAgIGtEZWZhdWx0TWVtb3J5VGhyZXNob2xkTWIpOwotICAgIHJldHVybiBiYXNlOjpTeXNJbmZvOjpBbW91bnRPZlBoeXNpY2FsTWVtb3J5TUIoKSA8PSBtZW1vcnlfdGhyZXNob2xkX21iOwotICB9Ci0KLSNpZiBkZWZpbmVkKE9TX0FORFJPSUQpCi0gIGlmIChiYXNlOjpTeXNJbmZvOjpBbW91bnRPZlBoeXNpY2FsTWVtb3J5TUIoKSA8PSBrRGVmYXVsdE1lbW9yeVRocmVzaG9sZE1iKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSNlbmRpZgotCi0gIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIFNpdGVJc29sYXRpb25Qb2xpY3k6OlNob3VsZERpc2FibGVTaXRlSXNvbGF0aW9uRHVlVG9NZW1vcnlUaHJlc2hvbGQoKTsKIH0KIAogc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9jaHJvbWVfY29udGVudF9icm93c2VyX2NsaWVudF9icm93c2VydGVzdC5jYyBiL2Nocm9tZS9icm93c2VyL2Nocm9tZV9jb250ZW50X2Jyb3dzZXJfY2xpZW50X2Jyb3dzZXJ0ZXN0LmNjCmluZGV4IDM3NGQ2ODI1Li4wZjRjZjVmNSAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lX2NvbnRlbnRfYnJvd3Nlcl9jbGllbnRfYnJvd3NlcnRlc3QuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lX2NvbnRlbnRfYnJvd3Nlcl9jbGllbnRfYnJvd3NlcnRlc3QuY2MKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlICJiYXNlL3N0cmluZ3Mvc3RyaW5ncHJpbnRmLmgiCiAjaW5jbHVkZSAiYmFzZS9zdHJpbmdzL3V0Zl9zdHJpbmdfY29udmVyc2lvbnMuaCIKICNpbmNsdWRlICJiYXNlL3N5c3RlbS9zeXNfaW5mby5oIgorI2luY2x1ZGUgImJhc2UvdGVzdC9tb2NrX2VudHJvcHlfcHJvdmlkZXIuaCIKICNpbmNsdWRlICJiYXNlL3Rlc3Qvc2NvcGVkX2ZlYXR1cmVfbGlzdC5oIgogI2luY2x1ZGUgImJ1aWxkL2J1aWxkX2NvbmZpZy5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL2N1c3RvbV9oYW5kbGVycy9wcm90b2NvbF9oYW5kbGVyX3JlZ2lzdHJ5LmgiCkBAIC0yMiw2ICsyMyw3IEBACiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvc2VhcmNoL2luc3RhbnRfc2VydmljZS5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3NlYXJjaC9pbnN0YW50X3NlcnZpY2VfZmFjdG9yeS5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3NlYXJjaC9zZWFyY2guaCIKKyNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9zaXRlX2lzb2xhdGlvbi9zaXRlX2lzb2xhdGlvbl9wb2xpY3kuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS9icm93c2VyLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvc2VhcmNoL2luc3RhbnRfdGVzdF9iYXNlLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvdGFicy90YWJfc3RyaXBfbW9kZWwuaCIKQEAgLTM1LDYgKzM3LDcgQEAKICNpbmNsdWRlICJjb21wb25lbnRzL25ldHdvcmtfc2Vzc2lvbl9jb25maWd1cmF0b3IvY29tbW9uL25ldHdvcmtfc3dpdGNoZXMuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL3BvbGljeS9jb3JlL2NvbW1vbi9jbG91ZC9jbG91ZF9wb2xpY3lfY29uc3RhbnRzLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9wcmVmcy9wcmVmX3NlcnZpY2UuaCIKKyNpbmNsdWRlICJjb21wb25lbnRzL3ZhcmlhdGlvbnMvdmFyaWF0aW9uc19zd2l0Y2hlcy5oIgogI2luY2x1ZGUgImNvbnRlbnQvcHVibGljL2Jyb3dzZXIvY2hpbGRfcHJvY2Vzc19zZWN1cml0eV9wb2xpY3kuaCIKICNpbmNsdWRlICJjb250ZW50L3B1YmxpYy9icm93c2VyL25hdmlnYXRpb25fY29udHJvbGxlci5oIgogI2luY2x1ZGUgImNvbnRlbnQvcHVibGljL2Jyb3dzZXIvbmF2aWdhdGlvbl9lbnRyeS5oIgpAQCAtNTAzLDYgKzUwNiwzMjIgQEAKICAgfQogfQogCisvLyBIZWxwZXIgY2xhc3MgdG8gcnVuIHRlc3RzIHdpdGggcGFzc3dvcmQtdHJpZ2dlcmVkIHNpdGUgaXNvbGF0aW9uIGluaXRpYWxpemVkCisvLyB2aWEgYSByZWd1bGFyIGZpZWxkIHRyaWFsIGFuZCAqbm90KiB2aWEgYSBjb21tYW5kLWxpbmUgb3ZlcnJpZGUuICBJdAorLy8gY3JlYXRlcyBhIG5ldyBmaWVsZCB0cmlhbCAod2l0aCAxMDAlIHByb2JhYmlsaXR5IG9mIGJlaW5nIGluIHRoZSBncm91cCksIGFuZAorLy8gaW5pdGlhbGl6ZXMgdGhlIHRlc3QgY2xhc3MncyBTY29wZWRGZWF0dXJlTGlzdCB1c2luZyBpdC4gIFR3byBkZXJpdmVkCisvLyBjbGFzc2VzIGJlbG93IGNvbnRyb2wgYXJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmVhdHVyZSB0byBlaXRoZXIgZW5hYmxlZAorLy8gb3IgZGlzYWJsZWQgc3RhdGUuCitjbGFzcyBQYXNzd29yZFNpdGVJc29sYXRpb25GaWVsZFRyaWFsVGVzdAorICAgIDogcHVibGljIFNpdGVQZXJQcm9jZXNzTWVtb3J5VGhyZXNob2xkQnJvd3NlclRlc3QgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgUGFzc3dvcmRTaXRlSXNvbGF0aW9uRmllbGRUcmlhbFRlc3QoYm9vbCBzaG91bGRfZW5hYmxlKQorICAgICAgOiBmaWVsZF90cmlhbF9saXN0XyhzdGQ6Om1ha2VfdW5pcXVlPGJhc2U6Ok1vY2tFbnRyb3B5UHJvdmlkZXI+KCkpIHsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBrVHJpYWxOYW1lID0gIlBhc3N3b3JkU2l0ZUlzb2xhdGlvbiI7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcga0dyb3VwTmFtZSA9ICJGb29Hcm91cCI7ICAvLyB1bnVzZWQKKyAgICBzY29wZWRfcmVmcHRyPGJhc2U6OkZpZWxkVHJpYWw+IHRyaWFsID0KKyAgICAgICAgYmFzZTo6RmllbGRUcmlhbExpc3Q6OkNyZWF0ZUZpZWxkVHJpYWwoa1RyaWFsTmFtZSwga0dyb3VwTmFtZSk7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8YmFzZTo6RmVhdHVyZUxpc3Q+IGZlYXR1cmVfbGlzdChuZXcgYmFzZTo6RmVhdHVyZUxpc3QpOworICAgIGZlYXR1cmVfbGlzdC0+UmVnaXN0ZXJGaWVsZFRyaWFsT3ZlcnJpZGUoCisgICAgICAgIGZlYXR1cmVzOjprU2l0ZUlzb2xhdGlvbkZvclBhc3N3b3JkU2l0ZXMubmFtZSwKKyAgICAgICAgc2hvdWxkX2VuYWJsZQorICAgICAgICAgICAgPyBiYXNlOjpGZWF0dXJlTGlzdDo6T3ZlcnJpZGVTdGF0ZTo6T1ZFUlJJREVfRU5BQkxFX0ZFQVRVUkUKKyAgICAgICAgICAgIDogYmFzZTo6RmVhdHVyZUxpc3Q6Ok92ZXJyaWRlU3RhdGU6Ok9WRVJSSURFX0RJU0FCTEVfRkVBVFVSRSwKKyAgICAgICAgdHJpYWwuZ2V0KCkpOworCisgICAgZmVhdHVyZV9saXN0Xy5Jbml0V2l0aEZlYXR1cmVMaXN0KHN0ZDo6bW92ZShmZWF0dXJlX2xpc3QpKTsKKyAgfQorCisgIHZvaWQgU2V0VXBDb21tYW5kTGluZShiYXNlOjpDb21tYW5kTGluZSogY29tbWFuZF9saW5lKSBvdmVycmlkZSB7CisgICAgLy8gVGhpcyB0ZXN0IGNyZWF0ZXMgYW5kIHRlc3RzIGl0cyBvd24gZmllbGQgdHJpYWwgZ3JvdXAsIHNvIGl0IG5lZWRzIHRvCisgICAgLy8gZGlzYWJsZSB0aGUgZmllbGQgdHJpYWwgdGVzdGluZyBjb25maWcsIHdoaWNoIG1pZ2h0IGRlZmluZSBhbgorICAgIC8vIGluY29tcGF0aWJsZSB0cmlhbCBuYW1lL2dyb3VwLgorICAgIGNvbW1hbmRfbGluZS0+QXBwZW5kU3dpdGNoKAorICAgICAgICB2YXJpYXRpb25zOjpzd2l0Y2hlczo6a0Rpc2FibGVGaWVsZFRyaWFsVGVzdGluZ0NvbmZpZyk7CisgICAgU2l0ZVBlclByb2Nlc3NNZW1vcnlUaHJlc2hvbGRCcm93c2VyVGVzdDo6U2V0VXBDb21tYW5kTGluZShjb21tYW5kX2xpbmUpOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIGJhc2U6OnRlc3Q6OlNjb3BlZEZlYXR1cmVMaXN0IGZlYXR1cmVfbGlzdF87CisgIGJhc2U6OkZpZWxkVHJpYWxMaXN0IGZpZWxkX3RyaWFsX2xpc3RfOworCisgcHJpdmF0ZToKKyAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFBhc3N3b3JkU2l0ZUlzb2xhdGlvbkZpZWxkVHJpYWxUZXN0KTsKK307CisKK2NsYXNzIEVuYWJsZWRQYXNzd29yZFNpdGVJc29sYXRpb25GaWVsZFRyaWFsVGVzdAorICAgIDogcHVibGljIFBhc3N3b3JkU2l0ZUlzb2xhdGlvbkZpZWxkVHJpYWxUZXN0IHsKKyBwdWJsaWM6CisgIEVuYWJsZWRQYXNzd29yZFNpdGVJc29sYXRpb25GaWVsZFRyaWFsVGVzdCgpCisgICAgICA6IFBhc3N3b3JkU2l0ZUlzb2xhdGlvbkZpZWxkVHJpYWxUZXN0KHRydWUgLyogc2hvdWxkX2VuYWJsZSAqLykge30KKworIHByaXZhdGU6CisgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihFbmFibGVkUGFzc3dvcmRTaXRlSXNvbGF0aW9uRmllbGRUcmlhbFRlc3QpOworfTsKKworY2xhc3MgRGlzYWJsZWRQYXNzd29yZFNpdGVJc29sYXRpb25GaWVsZFRyaWFsVGVzdAorICAgIDogcHVibGljIFBhc3N3b3JkU2l0ZUlzb2xhdGlvbkZpZWxkVHJpYWxUZXN0IHsKKyBwdWJsaWM6CisgIERpc2FibGVkUGFzc3dvcmRTaXRlSXNvbGF0aW9uRmllbGRUcmlhbFRlc3QoKQorICAgICAgOiBQYXNzd29yZFNpdGVJc29sYXRpb25GaWVsZFRyaWFsVGVzdChmYWxzZSAvKiBzaG91bGRfZW5hYmxlICovKSB7fQorCisgcHJpdmF0ZToKKyAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKERpc2FibGVkUGFzc3dvcmRTaXRlSXNvbGF0aW9uRmllbGRUcmlhbFRlc3QpOworfTsKKworSU5fUFJPQ19CUk9XU0VSX1RFU1RfRihFbmFibGVkUGFzc3dvcmRTaXRlSXNvbGF0aW9uRmllbGRUcmlhbFRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgIEJlbG93VGhyZXNob2xkKSB7CisgIGlmIChTaG91bGRTa2lwQmVjYXVzZU9mQ29uZmxpY3RpbmdDb21tYW5kTGluZVN3aXRjaGVzKCkpCisgICAgcmV0dXJuOworCisgIC8vIElmIG5vIG1lbW9yeSB0aHJlc2hvbGQgaXMgZGVmaW5lZCwgcGFzc3dvcmQgc2l0ZSBpc29sYXRpb24gc2hvdWxkIGJlCisgIC8vIGVuYWJsZWQuCisgIEVYUEVDVF9UUlVFKDo6U2l0ZUlzb2xhdGlvblBvbGljeTo6SXNJc29sYXRpb25Gb3JQYXNzd29yZFNpdGVzRW5hYmxlZCgpKTsKKworICAvLyBEZWZpbmUgYSBtZW1vcnkgdGhyZXNob2xkIGF0IDc2OE1CLiAgU2luY2UgdGhpcyBpcyBhYm92ZSB0aGUgNTEyTUIgb2YKKyAgLy8gcGh5c2ljYWwgbWVtb3J5IHRoYXQgdGhpcyB0ZXN0IHNpbXVsYXRlcywgcGFzc3dvcmQgc2l0ZSBpc29sYXRpb24gc2hvdWxkCisgIC8vIG5vdyBiZSBkaXNhYmxlZC4KKyAgYmFzZTo6dGVzdDo6U2NvcGVkRmVhdHVyZUxpc3QgbWVtb3J5X2ZlYXR1cmU7CisgIG1lbW9yeV9mZWF0dXJlLkluaXRBbmRFbmFibGVGZWF0dXJlV2l0aFBhcmFtZXRlcnMoCisgICAgICBmZWF0dXJlczo6a1NpdGVQZXJQcm9jZXNzT25seUZvckhpZ2hNZW1vcnlDbGllbnRzLAorICAgICAge3tmZWF0dXJlczo6a1NpdGVQZXJQcm9jZXNzT25seUZvckhpZ2hNZW1vcnlDbGllbnRzUGFyYW1OYW1lLCAiNzY4In19KTsKKworICBFWFBFQ1RfRkFMU0UoOjpTaXRlSXNvbGF0aW9uUG9saWN5OjpJc0lzb2xhdGlvbkZvclBhc3N3b3JkU2l0ZXNFbmFibGVkKCkpOworCisgIC8vIFNpbXVsYXRlIGVuYWJsaW5nIHBhc3N3b3JkIHNpdGUgaXNvbGF0aW9uIGZyb20gY29tbWFuZCBsaW5lLiAgKE5vdGUgdGhhdAorICAvLyBJbml0QW5kRW5hYmxlRmVhdHVyZSB1c2VzIFNjb3BlZEZlYXR1cmVMaXN0OjpJbml0RnJvbUNvbW1hbmRMaW5lCisgIC8vIGludGVybmFsbHksIGFuZCB0aGF0IHRyaWdnZXJpbmcgdGhlIGZlYXR1cmUgdmlhIGNocm9tZTovL2ZsYWdzIGZvbGxvd3MgdGhlCisgIC8vIHNhbWUgb3ZlcnJpZGUgcGF0aCBhcyB3ZWxsLikKKyAgYmFzZTo6dGVzdDo6U2NvcGVkRmVhdHVyZUxpc3QgcGFzc3dvcmRfc2l0ZV9pc29sYXRpb25fZmVhdHVyZTsKKyAgcGFzc3dvcmRfc2l0ZV9pc29sYXRpb25fZmVhdHVyZS5Jbml0QW5kRW5hYmxlRmVhdHVyZSgKKyAgICAgIGZlYXR1cmVzOjprU2l0ZUlzb2xhdGlvbkZvclBhc3N3b3JkU2l0ZXMpOworCisgIC8vIFRoaXMgc2hvdWxkIG92ZXJyaWRlIHRoZSBtZW1vcnkgdGhyZXNob2xkIGFuZCBlbmFibGUgcGFzc3dvcmQgc2l0ZQorICAvLyBpc29sYXRpb24uCisgIEVYUEVDVF9UUlVFKDo6U2l0ZUlzb2xhdGlvblBvbGljeTo6SXNJc29sYXRpb25Gb3JQYXNzd29yZFNpdGVzRW5hYmxlZCgpKTsKK30KKworSU5fUFJPQ19CUk9XU0VSX1RFU1RfRihFbmFibGVkUGFzc3dvcmRTaXRlSXNvbGF0aW9uRmllbGRUcmlhbFRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgIEFib3ZlVGhyZXNob2xkKSB7CisgIGlmIChTaG91bGRTa2lwQmVjYXVzZU9mQ29uZmxpY3RpbmdDb21tYW5kTGluZVN3aXRjaGVzKCkpCisgICAgcmV0dXJuOworCisgIC8vIElmIG5vIG1lbW9yeSB0aHJlc2hvbGQgaXMgZGVmaW5lZCwgcGFzc3dvcmQgc2l0ZSBpc29sYXRpb24gc2hvdWxkIGJlCisgIC8vIGVuYWJsZWQuCisgIEVYUEVDVF9UUlVFKDo6U2l0ZUlzb2xhdGlvblBvbGljeTo6SXNJc29sYXRpb25Gb3JQYXNzd29yZFNpdGVzRW5hYmxlZCgpKTsKKworICAvLyBEZWZpbmUgYSBtZW1vcnkgdGhyZXNob2xkIGF0IDEyOE1CLiAgU2luY2UgdGhpcyBpcyBiZWxvdyB0aGUgNTEyTUIgb2YKKyAgLy8gcGh5c2ljYWwgbWVtb3J5IHRoYXQgdGhpcyB0ZXN0IHNpbXVsYXRlcywgcGFzc3dvcmQgc2l0ZSBpc29sYXRpb24gc2hvdWxkCisgIC8vIHN0aWxsIGJlIGVuYWJsZWQuCisgIGJhc2U6OnRlc3Q6OlNjb3BlZEZlYXR1cmVMaXN0IG1lbW9yeV9mZWF0dXJlOworICBtZW1vcnlfZmVhdHVyZS5Jbml0QW5kRW5hYmxlRmVhdHVyZVdpdGhQYXJhbWV0ZXJzKAorICAgICAgZmVhdHVyZXM6OmtTaXRlUGVyUHJvY2Vzc09ubHlGb3JIaWdoTWVtb3J5Q2xpZW50cywKKyAgICAgIHt7ZmVhdHVyZXM6OmtTaXRlUGVyUHJvY2Vzc09ubHlGb3JIaWdoTWVtb3J5Q2xpZW50c1BhcmFtTmFtZSwgIjEyOCJ9fSk7CisKKyAgRVhQRUNUX1RSVUUoOjpTaXRlSXNvbGF0aW9uUG9saWN5OjpJc0lzb2xhdGlvbkZvclBhc3N3b3JkU2l0ZXNFbmFibGVkKCkpOworCisgIC8vIFNpbXVsYXRlIGRpc2FibGluZyBwYXNzd29yZCBzaXRlIGlzb2xhdGlvbiBmcm9tIGNvbW1hbmQgbGluZS4gIChOb3RlIHRoYXQKKyAgLy8gSW5pdEFuZEVuYWJsZUZlYXR1cmUgdXNlcyBTY29wZWRGZWF0dXJlTGlzdDo6SW5pdEZyb21Db21tYW5kTGluZQorICAvLyBpbnRlcm5hbGx5LCBhbmQgdGhhdCB0cmlnZ2VyaW5nIHRoZSBmZWF0dXJlIHZpYSBjaHJvbWU6Ly9mbGFncyBmb2xsb3dzIHRoZQorICAvLyBzYW1lIG92ZXJyaWRlIHBhdGggYXMgd2VsbC4pICBUaGlzIHNob3VsZCB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGUgcmVndWxhcgorICAvLyBmaWVsZCB0cmlhbCBiZWhhdmlvci4KKyAgYmFzZTo6dGVzdDo6U2NvcGVkRmVhdHVyZUxpc3QgcGFzc3dvcmRfc2l0ZV9pc29sYXRpb25fZmVhdHVyZTsKKyAgcGFzc3dvcmRfc2l0ZV9pc29sYXRpb25fZmVhdHVyZS5Jbml0QW5kRGlzYWJsZUZlYXR1cmUoCisgICAgICBmZWF0dXJlczo6a1NpdGVJc29sYXRpb25Gb3JQYXNzd29yZFNpdGVzKTsKKyAgRVhQRUNUX0ZBTFNFKDo6U2l0ZUlzb2xhdGlvblBvbGljeTo6SXNJc29sYXRpb25Gb3JQYXNzd29yZFNpdGVzRW5hYmxlZCgpKTsKK30KKworLy8gVGhpcyB0ZXN0IHZlcmlmaWVzIHRoYXQgd2hlbiBwYXNzd29yZC10cmlnZ2VyZWQgc2l0ZSBpc29sYXRpb24gaXMgZGlzYWJsZWQKKy8vIHZpYSBmaWVsZCB0cmlhbHMgYnV0IGZvcmNlLWVuYWJsZWQgdmlhIGNvbW1hbmQgbGluZSwgaXQgdGFrZXMgZWZmZWN0IGV2ZW4KKy8vIHdoZW4gYmVsb3cgdGhlIG1lbW9yeSB0aHJlc2hvbGQuICBTZWUgaHR0cHM6Ly9jcmJ1Zy5jb20vMTAwOTgyOC4KK0lOX1BST0NfQlJPV1NFUl9URVNUX0YoRGlzYWJsZWRQYXNzd29yZFNpdGVJc29sYXRpb25GaWVsZFRyaWFsVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPdmVycmlkZV9CZWxvd1RocmVzaG9sZCkgeworICBpZiAoU2hvdWxkU2tpcEJlY2F1c2VPZkNvbmZsaWN0aW5nQ29tbWFuZExpbmVTd2l0Y2hlcygpKQorICAgIHJldHVybjsKKworICAvLyBQYXNzd29yZCBzaXRlIGlzb2xhdGlvbiBzaG91bGQgYmUgZGlzYWJsZWQgYXQgdGhpcyBwb2ludC4KKyAgRVhQRUNUX0ZBTFNFKDo6U2l0ZUlzb2xhdGlvblBvbGljeTo6SXNJc29sYXRpb25Gb3JQYXNzd29yZFNpdGVzRW5hYmxlZCgpKTsKKworICAvLyBTaW11bGF0ZSBlbmFibGluZyBwYXNzd29yZCBzaXRlIGlzb2xhdGlvbiBmcm9tIGNvbW1hbmQgbGluZS4gIChOb3RlIHRoYXQKKyAgLy8gSW5pdEFuZEVuYWJsZUZlYXR1cmUgdXNlcyBTY29wZWRGZWF0dXJlTGlzdDo6SW5pdEZyb21Db21tYW5kTGluZQorICAvLyBpbnRlcm5hbGx5LCBhbmQgdGhhdCB0cmlnZ2VyaW5nIHRoZSBmZWF0dXJlIHZpYSBjaHJvbWU6Ly9mbGFncyBmb2xsb3dzIHRoZQorICAvLyBzYW1lIG92ZXJyaWRlIHBhdGggYXMgd2VsbC4pCisgIGJhc2U6OnRlc3Q6OlNjb3BlZEZlYXR1cmVMaXN0IHBhc3N3b3JkX3NpdGVfaXNvbGF0aW9uX2ZlYXR1cmU7CisgIHBhc3N3b3JkX3NpdGVfaXNvbGF0aW9uX2ZlYXR1cmUuSW5pdEFuZEVuYWJsZUZlYXR1cmUoCisgICAgICBmZWF0dXJlczo6a1NpdGVJc29sYXRpb25Gb3JQYXNzd29yZFNpdGVzKTsKKworICAvLyBJZiBubyBtZW1vcnkgdGhyZXNob2xkIGlzIGRlZmluZWQsIHBhc3N3b3JkIHNpdGUgaXNvbGF0aW9uIHNob3VsZCBiZQorICAvLyBlbmFibGVkLgorICBFWFBFQ1RfVFJVRSg6OlNpdGVJc29sYXRpb25Qb2xpY3k6OklzSXNvbGF0aW9uRm9yUGFzc3dvcmRTaXRlc0VuYWJsZWQoKSk7CisKKyAgLy8gRGVmaW5lIGEgbWVtb3J5IHRocmVzaG9sZCBhdCA3NjhNQi4gIFRoaXMgaXMgYWJvdmUgdGhlIDUxMk1CIG9mIHBoeXNpY2FsCisgIC8vIG1lbW9yeSB0aGF0IHRoaXMgdGVzdCBzaW11bGF0ZXMsIGJ1dCBwYXNzd29yZCBzaXRlIGlzb2xhdGlvbiBzaG91bGQgc3RpbGwKKyAgLy8gYmUgZW5hYmxlZCwgYmVjYXVzZSB0aGUgdGVzdCBoYXMgc2ltdWxhdGVkIHRoZSB1c2VyIG1hbnVhbGx5IG92ZXJyaWRpbmcKKyAgLy8gdGhpcyBmZWF0dXJlIHZpYSBjb21tYW5kIGxpbmUuCisgIGJhc2U6OnRlc3Q6OlNjb3BlZEZlYXR1cmVMaXN0IG1lbW9yeV9mZWF0dXJlOworICBtZW1vcnlfZmVhdHVyZS5Jbml0QW5kRW5hYmxlRmVhdHVyZVdpdGhQYXJhbWV0ZXJzKAorICAgICAgZmVhdHVyZXM6OmtTaXRlUGVyUHJvY2Vzc09ubHlGb3JIaWdoTWVtb3J5Q2xpZW50cywKKyAgICAgIHt7ZmVhdHVyZXM6OmtTaXRlUGVyUHJvY2Vzc09ubHlGb3JIaWdoTWVtb3J5Q2xpZW50c1BhcmFtTmFtZSwgIjc2OCJ9fSk7CisKKyAgRVhQRUNUX1RSVUUoOjpTaXRlSXNvbGF0aW9uUG9saWN5OjpJc0lzb2xhdGlvbkZvclBhc3N3b3JkU2l0ZXNFbmFibGVkKCkpOworfQorCisvLyBTaW1pbGFyIHRvIHRoZSB0ZXN0IGFib3ZlLCBidXQgd2l0aCBkZXZpY2UgbWVtb3J5IGJlaW5nIGFib3ZlIG1lbW9yeQorLy8gdGhyZXNob2xkLgorSU5fUFJPQ19CUk9XU0VSX1RFU1RfRihEaXNhYmxlZFBhc3N3b3JkU2l0ZUlzb2xhdGlvbkZpZWxkVHJpYWxUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU92ZXJyaWRlX0Fib3ZlVGhyZXNob2xkKSB7CisgIGlmIChTaG91bGRTa2lwQmVjYXVzZU9mQ29uZmxpY3RpbmdDb21tYW5kTGluZVN3aXRjaGVzKCkpCisgICAgcmV0dXJuOworCisgIEVYUEVDVF9GQUxTRSg6OlNpdGVJc29sYXRpb25Qb2xpY3k6OklzSXNvbGF0aW9uRm9yUGFzc3dvcmRTaXRlc0VuYWJsZWQoKSk7CisKKyAgYmFzZTo6dGVzdDo6U2NvcGVkRmVhdHVyZUxpc3QgcGFzc3dvcmRfc2l0ZV9pc29sYXRpb25fZmVhdHVyZTsKKyAgcGFzc3dvcmRfc2l0ZV9pc29sYXRpb25fZmVhdHVyZS5Jbml0QW5kRW5hYmxlRmVhdHVyZSgKKyAgICAgIGZlYXR1cmVzOjprU2l0ZUlzb2xhdGlvbkZvclBhc3N3b3JkU2l0ZXMpOworCisgIC8vIElmIG5vIG1lbW9yeSB0aHJlc2hvbGQgaXMgZGVmaW5lZCwgcGFzc3dvcmQgc2l0ZSBpc29sYXRpb24gc2hvdWxkIGJlCisgIC8vIGVuYWJsZWQuCisgIEVYUEVDVF9UUlVFKDo6U2l0ZUlzb2xhdGlvblBvbGljeTo6SXNJc29sYXRpb25Gb3JQYXNzd29yZFNpdGVzRW5hYmxlZCgpKTsKKworICBiYXNlOjp0ZXN0OjpTY29wZWRGZWF0dXJlTGlzdCBtZW1vcnlfZmVhdHVyZTsKKyAgbWVtb3J5X2ZlYXR1cmUuSW5pdEFuZEVuYWJsZUZlYXR1cmVXaXRoUGFyYW1ldGVycygKKyAgICAgIGZlYXR1cmVzOjprU2l0ZVBlclByb2Nlc3NPbmx5Rm9ySGlnaE1lbW9yeUNsaWVudHMsCisgICAgICB7e2ZlYXR1cmVzOjprU2l0ZVBlclByb2Nlc3NPbmx5Rm9ySGlnaE1lbW9yeUNsaWVudHNQYXJhbU5hbWUsICIxMjgifX0pOworCisgIEVYUEVDVF9UUlVFKDo6U2l0ZUlzb2xhdGlvblBvbGljeTo6SXNJc29sYXRpb25Gb3JQYXNzd29yZFNpdGVzRW5hYmxlZCgpKTsKK30KKworLy8gSGVscGVyIGNsYXNzIHRvIHJ1biB0ZXN0cyB3aXRoIHN0cmljdCBvcmlnaW4gaXNvbGF0aW9uIGluaXRpYWxpemVkIHZpYQorLy8gYSByZWd1bGFyIGZpZWxkIHRyaWFsIGFuZCAqbm90KiB2aWEgYSBjb21tYW5kLWxpbmUgb3ZlcnJpZGUuICBJdCBjcmVhdGVzIGEKKy8vIG5ldyBmaWVsZCB0cmlhbCAod2l0aCAxMDAlIHByb2JhYmlsaXR5IG9mIGJlaW5nIGluIHRoZSBncm91cCksIGFuZAorLy8gaW5pdGlhbGl6ZXMgdGhlIHRlc3QgY2xhc3MncyBTY29wZWRGZWF0dXJlTGlzdCB1c2luZyBpdC4gIFR3byBkZXJpdmVkCisvLyBjbGFzc2VzIGJlbG93IGNvbnRyb2wgYXJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmVhdHVyZSB0byBlaXRoZXIgZW5hYmxlZAorLy8gb3IgZGlzYWJsZWQgc3RhdGUuCitjbGFzcyBTdHJpY3RPcmlnaW5Jc29sYXRpb25GaWVsZFRyaWFsVGVzdAorICAgIDogcHVibGljIFNpdGVQZXJQcm9jZXNzTWVtb3J5VGhyZXNob2xkQnJvd3NlclRlc3QgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgU3RyaWN0T3JpZ2luSXNvbGF0aW9uRmllbGRUcmlhbFRlc3QoYm9vbCBzaG91bGRfZW5hYmxlKQorICAgICAgOiBmaWVsZF90cmlhbF9saXN0XyhzdGQ6Om1ha2VfdW5pcXVlPGJhc2U6Ok1vY2tFbnRyb3B5UHJvdmlkZXI+KCkpIHsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBrVHJpYWxOYW1lID0gIlN0cmljdE9yaWdpbklzb2xhdGlvbiI7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcga0dyb3VwTmFtZSA9ICJGb29Hcm91cCI7ICAvLyB1bnVzZWQKKyAgICBzY29wZWRfcmVmcHRyPGJhc2U6OkZpZWxkVHJpYWw+IHRyaWFsID0KKyAgICAgICAgYmFzZTo6RmllbGRUcmlhbExpc3Q6OkNyZWF0ZUZpZWxkVHJpYWwoa1RyaWFsTmFtZSwga0dyb3VwTmFtZSk7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8YmFzZTo6RmVhdHVyZUxpc3Q+IGZlYXR1cmVfbGlzdChuZXcgYmFzZTo6RmVhdHVyZUxpc3QpOworICAgIGZlYXR1cmVfbGlzdC0+UmVnaXN0ZXJGaWVsZFRyaWFsT3ZlcnJpZGUoCisgICAgICAgIGZlYXR1cmVzOjprU3RyaWN0T3JpZ2luSXNvbGF0aW9uLm5hbWUsCisgICAgICAgIHNob3VsZF9lbmFibGUKKyAgICAgICAgICAgID8gYmFzZTo6RmVhdHVyZUxpc3Q6Ok92ZXJyaWRlU3RhdGU6Ok9WRVJSSURFX0VOQUJMRV9GRUFUVVJFCisgICAgICAgICAgICA6IGJhc2U6OkZlYXR1cmVMaXN0OjpPdmVycmlkZVN0YXRlOjpPVkVSUklERV9ESVNBQkxFX0ZFQVRVUkUsCisgICAgICAgIHRyaWFsLmdldCgpKTsKKworICAgIGZlYXR1cmVfbGlzdF8uSW5pdFdpdGhGZWF0dXJlTGlzdChzdGQ6Om1vdmUoZmVhdHVyZV9saXN0KSk7CisgIH0KKworICB2b2lkIFNldFVwQ29tbWFuZExpbmUoYmFzZTo6Q29tbWFuZExpbmUqIGNvbW1hbmRfbGluZSkgb3ZlcnJpZGUgeworICAgIC8vIFRoaXMgdGVzdCBjcmVhdGVzIGFuZCB0ZXN0cyBpdHMgb3duIGZpZWxkIHRyaWFsIGdyb3VwLCBzbyBpdCBuZWVkcyB0bworICAgIC8vIGRpc2FibGUgdGhlIGZpZWxkIHRyaWFsIHRlc3RpbmcgY29uZmlnLCB3aGljaCBtaWdodCBkZWZpbmUgYW4KKyAgICAvLyBpbmNvbXBhdGlibGUgdHJpYWwgbmFtZS9ncm91cC4KKyAgICBjb21tYW5kX2xpbmUtPkFwcGVuZFN3aXRjaCgKKyAgICAgICAgdmFyaWF0aW9uczo6c3dpdGNoZXM6OmtEaXNhYmxlRmllbGRUcmlhbFRlc3RpbmdDb25maWcpOworICAgIFNpdGVQZXJQcm9jZXNzTWVtb3J5VGhyZXNob2xkQnJvd3NlclRlc3Q6OlNldFVwQ29tbWFuZExpbmUoY29tbWFuZF9saW5lKTsKKyAgfQorCisgcHJvdGVjdGVkOgorICBiYXNlOjp0ZXN0OjpTY29wZWRGZWF0dXJlTGlzdCBmZWF0dXJlX2xpc3RfOworICBiYXNlOjpGaWVsZFRyaWFsTGlzdCBmaWVsZF90cmlhbF9saXN0XzsKKworIHByaXZhdGU6CisgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTdHJpY3RPcmlnaW5Jc29sYXRpb25GaWVsZFRyaWFsVGVzdCk7Cit9OworCitjbGFzcyBFbmFibGVkU3RyaWN0T3JpZ2luSXNvbGF0aW9uRmllbGRUcmlhbFRlc3QKKyAgICA6IHB1YmxpYyBTdHJpY3RPcmlnaW5Jc29sYXRpb25GaWVsZFRyaWFsVGVzdCB7CisgcHVibGljOgorICBFbmFibGVkU3RyaWN0T3JpZ2luSXNvbGF0aW9uRmllbGRUcmlhbFRlc3QoKQorICAgICAgOiBTdHJpY3RPcmlnaW5Jc29sYXRpb25GaWVsZFRyaWFsVGVzdCh0cnVlIC8qIHNob3VsZF9lbmFibGUgKi8pIHt9CisKKyBwcml2YXRlOgorICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRW5hYmxlZFN0cmljdE9yaWdpbklzb2xhdGlvbkZpZWxkVHJpYWxUZXN0KTsKK307CisKK2NsYXNzIERpc2FibGVkU3RyaWN0T3JpZ2luSXNvbGF0aW9uRmllbGRUcmlhbFRlc3QKKyAgICA6IHB1YmxpYyBTdHJpY3RPcmlnaW5Jc29sYXRpb25GaWVsZFRyaWFsVGVzdCB7CisgcHVibGljOgorICBEaXNhYmxlZFN0cmljdE9yaWdpbklzb2xhdGlvbkZpZWxkVHJpYWxUZXN0KCkKKyAgICAgIDogU3RyaWN0T3JpZ2luSXNvbGF0aW9uRmllbGRUcmlhbFRlc3QoZmFsc2UgLyogc2hvdWxkX2VuYWJsZSAqLykge30KKworIHByaXZhdGU6CisgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihEaXNhYmxlZFN0cmljdE9yaWdpbklzb2xhdGlvbkZpZWxkVHJpYWxUZXN0KTsKK307CisKKy8vIENoZWNrIHRoYXQgd2hlbiBzdHJpY3Qgb3JpZ2luIGlzb2xhdGlvbiBpcyBlbmFibGVkIHZpYSBhIGZpZWxkIHRyaWFsLCBhbmQKKy8vIHRoZSBkZXZpY2UgaXMgYWJvdmUgdGhlIG1lbW9yeSB0aHJlc2hvbGQsIGRpc2FibGluZyBpdCB2aWEgdGhlIGNvbW1hbmQgbGluZQorLy8gdGFrZXMgcHJlY2VkZW5jZS4KK0lOX1BST0NfQlJPV1NFUl9URVNUX0YoRW5hYmxlZFN0cmljdE9yaWdpbklzb2xhdGlvbkZpZWxkVHJpYWxUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICBEaXNhYmxlZFZpYUNvbW1hbmRMaW5lT3ZlcnJpZGUpIHsKKyAgaWYgKFNob3VsZFNraXBCZWNhdXNlT2ZDb25mbGljdGluZ0NvbW1hbmRMaW5lU3dpdGNoZXMoKSkKKyAgICByZXR1cm47CisKKyAgLy8gSWYgbm8gbWVtb3J5IHRocmVzaG9sZCBpcyBkZWZpbmVkLCBzdHJpY3Qgb3JpZ2luIGlzb2xhdGlvbiBzaG91bGQgYmUKKyAgLy8gZW5hYmxlZC4KKyAgRVhQRUNUX1RSVUUoU2l0ZUlzb2xhdGlvblBvbGljeTo6SXNTdHJpY3RPcmlnaW5Jc29sYXRpb25FbmFibGVkKCkpOworCisgIC8vIERlZmluZSBhIG1lbW9yeSB0aHJlc2hvbGQgYXQgMTI4TUIuICBTaW5jZSB0aGlzIGlzIGJlbG93IHRoZSA1MTJNQiBvZgorICAvLyBwaHlzaWNhbCBtZW1vcnkgdGhhdCB0aGlzIHRlc3Qgc2ltdWxhdGVzLCBzdHJpY3Qgb3JpZ2luIGlzb2xhdGlvbiBzaG91bGQKKyAgLy8gc3RpbGwgYmUgZW5hYmxlZC4KKyAgYmFzZTo6dGVzdDo6U2NvcGVkRmVhdHVyZUxpc3QgbWVtb3J5X2ZlYXR1cmU7CisgIG1lbW9yeV9mZWF0dXJlLkluaXRBbmRFbmFibGVGZWF0dXJlV2l0aFBhcmFtZXRlcnMoCisgICAgICBmZWF0dXJlczo6a1NpdGVQZXJQcm9jZXNzT25seUZvckhpZ2hNZW1vcnlDbGllbnRzLAorICAgICAge3tmZWF0dXJlczo6a1NpdGVQZXJQcm9jZXNzT25seUZvckhpZ2hNZW1vcnlDbGllbnRzUGFyYW1OYW1lLCAiMTI4In19KTsKKyAgRVhQRUNUX1RSVUUoU2l0ZUlzb2xhdGlvblBvbGljeTo6SXNTdHJpY3RPcmlnaW5Jc29sYXRpb25FbmFibGVkKCkpOworCisgIC8vIFNpbXVsYXRlIGRpc2FibGluZyBzdHJpY3Qgb3JpZ2luIGlzb2xhdGlvbiBmcm9tIGNvbW1hbmQgbGluZS4gIChOb3RlIHRoYXQKKyAgLy8gSW5pdEFuZEVuYWJsZUZlYXR1cmUgdXNlcyBTY29wZWRGZWF0dXJlTGlzdDo6SW5pdEZyb21Db21tYW5kTGluZQorICAvLyBpbnRlcm5hbGx5LCBhbmQgdGhhdCBkaXNhYmxpbmcgdGhlIGZlYXR1cmUgdmlhIGNocm9tZTovL2ZsYWdzIGZvbGxvd3MgdGhlCisgIC8vIHNhbWUgb3ZlcnJpZGUgcGF0aCBhcyB3ZWxsLikKKyAgYmFzZTo6dGVzdDo6U2NvcGVkRmVhdHVyZUxpc3Qgc3RyaWN0X29yaWdpbl9pc29sYXRpb25fZmVhdHVyZTsKKyAgc3RyaWN0X29yaWdpbl9pc29sYXRpb25fZmVhdHVyZS5Jbml0QW5kRGlzYWJsZUZlYXR1cmUoCisgICAgICBmZWF0dXJlczo6a1N0cmljdE9yaWdpbklzb2xhdGlvbik7CisgIEVYUEVDVF9GQUxTRShTaXRlSXNvbGF0aW9uUG9saWN5OjpJc1N0cmljdE9yaWdpbklzb2xhdGlvbkVuYWJsZWQoKSk7Cit9CisKKy8vIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGF0IHdoZW4gc3RyaWN0IG9yaWdpbiBpc29sYXRpb24gaXMgZGlzYWJsZWQKKy8vIHZpYSBmaWVsZCB0cmlhbHMgYnV0IGZvcmNlLWVuYWJsZWQgdmlhIGNvbW1hbmQgbGluZSwgaXQgdGFrZXMgZWZmZWN0IGV2ZW4KKy8vIHdoZW4gYmVsb3cgdGhlIG1lbW9yeSB0aHJlc2hvbGQuICBTZWUgaHR0cHM6Ly9jcmJ1Zy5jb20vMTAwOTgyOC4KK0lOX1BST0NfQlJPV1NFUl9URVNUX0YoRGlzYWJsZWRTdHJpY3RPcmlnaW5Jc29sYXRpb25GaWVsZFRyaWFsVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgRW5hYmxlZFZpYUNvbW1hbmRMaW5lT3ZlcnJpZGVfQmVsb3dUaHJlc2hvbGQpIHsKKyAgaWYgKFNob3VsZFNraXBCZWNhdXNlT2ZDb25mbGljdGluZ0NvbW1hbmRMaW5lU3dpdGNoZXMoKSkKKyAgICByZXR1cm47CisKKyAgLy8gU3RyaWN0IG9yaWdpbiBpc29sYXRpb24gc2hvdWxkIGJlIGRpc2FibGVkIGF0IHRoaXMgcG9pbnQuCisgIEVYUEVDVF9GQUxTRShjb250ZW50OjpTaXRlSXNvbGF0aW9uUG9saWN5OjpJc1N0cmljdE9yaWdpbklzb2xhdGlvbkVuYWJsZWQoKSk7CisKKyAgLy8gU2ltdWxhdGUgZW5hYmxpbmcgc3RyaWN0IG9yaWdpbiBpc29sYXRpb24gZnJvbSBjb21tYW5kIGxpbmUuICAoTm90ZSB0aGF0CisgIC8vIEluaXRBbmRFbmFibGVGZWF0dXJlIHVzZXMgU2NvcGVkRmVhdHVyZUxpc3Q6OkluaXRGcm9tQ29tbWFuZExpbmUKKyAgLy8gaW50ZXJuYWxseSwgYW5kIHRoYXQgdHJpZ2dlcmluZyB0aGUgZmVhdHVyZSB2aWEgY2hyb21lOi8vZmxhZ3MgZm9sbG93cyB0aGUKKyAgLy8gc2FtZSBvdmVycmlkZSBwYXRoIGFzIHdlbGwuKQorICBiYXNlOjp0ZXN0OjpTY29wZWRGZWF0dXJlTGlzdCBzdHJpY3Rfb3JpZ2luX2lzb2xhdGlvbl9mZWF0dXJlOworICBzdHJpY3Rfb3JpZ2luX2lzb2xhdGlvbl9mZWF0dXJlLkluaXRBbmRFbmFibGVGZWF0dXJlKAorICAgICAgZmVhdHVyZXM6OmtTdHJpY3RPcmlnaW5Jc29sYXRpb24pOworCisgIC8vIElmIG5vIG1lbW9yeSB0aHJlc2hvbGQgaXMgZGVmaW5lZCwgc3RyaWN0IG9yaWdpbiBpc29sYXRpb24gc2hvdWxkIGJlCisgIC8vIGVuYWJsZWQuCisgIEVYUEVDVF9UUlVFKFNpdGVJc29sYXRpb25Qb2xpY3k6OklzU3RyaWN0T3JpZ2luSXNvbGF0aW9uRW5hYmxlZCgpKTsKKworICAvLyBEZWZpbmUgYSBtZW1vcnkgdGhyZXNob2xkIGF0IDc2OE1CLiAgVGhpcyBpcyBhYm92ZSB0aGUgNTEyTUIgb2YgcGh5c2ljYWwKKyAgLy8gbWVtb3J5IHRoYXQgdGhpcyB0ZXN0IHNpbXVsYXRlcywgYnV0IHN0cmljdCBvcmlnaW4gaXNvbGF0aW9uIHNob3VsZCBzdGlsbAorICAvLyBiZSBlbmFibGVkLCBiZWNhdXNlIHRoZSB0ZXN0IGhhcyBzaW11bGF0ZWQgdGhlIHVzZXIgbWFudWFsbHkgb3ZlcnJpZGluZworICAvLyB0aGlzIGZlYXR1cmUgdmlhIGNvbW1hbmQgbGluZS4KKyAgYmFzZTo6dGVzdDo6U2NvcGVkRmVhdHVyZUxpc3QgbWVtb3J5X2ZlYXR1cmU7CisgIG1lbW9yeV9mZWF0dXJlLkluaXRBbmRFbmFibGVGZWF0dXJlV2l0aFBhcmFtZXRlcnMoCisgICAgICBmZWF0dXJlczo6a1NpdGVQZXJQcm9jZXNzT25seUZvckhpZ2hNZW1vcnlDbGllbnRzLAorICAgICAge3tmZWF0dXJlczo6a1NpdGVQZXJQcm9jZXNzT25seUZvckhpZ2hNZW1vcnlDbGllbnRzUGFyYW1OYW1lLCAiNzY4In19KTsKKworICBFWFBFQ1RfVFJVRShTaXRlSXNvbGF0aW9uUG9saWN5OjpJc1N0cmljdE9yaWdpbklzb2xhdGlvbkVuYWJsZWQoKSk7Cit9CisKIC8vIEhlbHBlciBjbGFzcyB0byB0ZXN0IHdpbmRvdyBjcmVhdGlvbiBmcm9tIE5UUC4KIGNsYXNzIE9wZW5XaW5kb3dGcm9tTlRQQnJvd3NlclRlc3QgOiBwdWJsaWMgSW5Qcm9jZXNzQnJvd3NlclRlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIEluc3RhbnRUZXN0QmFzZSB7CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9CVUlMRC5nbiBiL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL0JVSUxELmduCmluZGV4IDA5MTZhNjcuLjgyMjg5NDA4IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9CVUlMRC5nbgorKysgYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9CVUlMRC5nbgpAQCAtNDU1LDYgKzQ1NSw4IEBACiAgICAgImFyYy9hcmNfb3B0aW5fdW1hLmgiLAogICAgICJhcmMvYXJjX3N1cHBvcnRfaG9zdC5jYyIsCiAgICAgImFyYy9hcmNfc3VwcG9ydF9ob3N0LmgiLAorICAgICJhcmMvYXJjX3VpX2F2YWlsYWJpbGl0eV9yZXBvcnRlci5jYyIsCisgICAgImFyYy9hcmNfdWlfYXZhaWxhYmlsaXR5X3JlcG9ydGVyLmgiLAogICAgICJhcmMvYXJjX3V0aWwuY2MiLAogICAgICJhcmMvYXJjX3V0aWwuaCIsCiAgICAgImFyYy9hcmNfd2ViX2NvbnRlbnRzX2RhdGEuY2MiLApAQCAtMjQ0Nyw2ICsyNDQ5LDcgQEAKICAgICAiYXJjL2FwcF9zaG9ydGN1dHMvYXJjX2FwcF9zaG9ydGN1dHNfcmVxdWVzdF91bml0dGVzdC5jYyIsCiAgICAgImFyYy9hcmNfbWlncmF0aW9uX2d1aWRlX25vdGlmaWNhdGlvbl91bml0dGVzdC5jYyIsCiAgICAgImFyYy9hcmNfc3VwcG9ydF9ob3N0X3VuaXR0ZXN0LmNjIiwKKyAgICAiYXJjL2FyY191aV9hdmFpbGFiaWxpdHlfcmVwb3J0ZXJfdW5pdHRlc3QuY2MiLAogICAgICJhcmMvYXJjX3V0aWxfdW5pdHRlc3QuY2MiLAogICAgICJhcmMvYmx1ZXRvb3RoL2FyY19ibHVldG9vdGhfYnJpZGdlX3VuaXR0ZXN0LmNjIiwKICAgICAiYXJjL2JsdWV0b290aC9hcmNfYmx1ZXRvb3RoX3Rhc2tfcXVldWVfdW5pdHRlc3QuY2MiLApkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvYWNjZXNzaWJpbGl0eS9zcG9rZW5fZmVlZGJhY2tfYnJvd3NlcnRlc3QuY2MgYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9hY2Nlc3NpYmlsaXR5L3Nwb2tlbl9mZWVkYmFja19icm93c2VydGVzdC5jYwppbmRleCAwN2M3OWY0ZC4uNDhhYmVhNyAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvYWNjZXNzaWJpbGl0eS9zcG9rZW5fZmVlZGJhY2tfYnJvd3NlcnRlc3QuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvYWNjZXNzaWJpbGl0eS9zcG9rZW5fZmVlZGJhY2tfYnJvd3NlcnRlc3QuY2MKQEAgLTgzMiw2ICs4MzIsMzMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb21ibyBib3ggKiBvZiAqIikpOwogfQogCitJTl9QUk9DX0JST1dTRVJfVEVTVF9GKE9vYmVTcG9rZW5GZWVkYmFja1Rlc3QsIENocm9tZVZveFBhbmVsVGFic01lbnVFbXB0eSkgeworICAvLyBUaGUgQ2hyb21lVm94IHBhbmVsIHNob3VsZCBub3QgcG9wdWxhdGUgdGhlIHRhYnMgbWVudSBpZiB3ZSBhcmUgaW4gdGhlCisgIC8vIE9PQkUuCisgIEFTU0VSVF9GQUxTRShBY2Nlc3NpYmlsaXR5TWFuYWdlcjo6R2V0KCktPklzU3Bva2VuRmVlZGJhY2tFbmFibGVkKCkpOworICBBY2Nlc3NpYmlsaXR5TWFuYWdlcjo6R2V0KCktPkVuYWJsZVNwb2tlbkZlZWRiYWNrKHRydWUpOworICAvLyBJbmNsdWRlZCB0byByZWR1Y2UgZmxha2luZXNzLgorICB3aGlsZSAoc3BlZWNoX21vbml0b3JfLkdldE5leHRVdHRlcmFuY2UoKSAhPQorICAgICAgICAgIlByZXNzIFNlYXJjaCBwbHVzIFNwYWNlIHRvIGFjdGl2YXRlLiIpIHsKKyAgfQorICAvLyBQcmVzcyBbc2VhcmNoICsgLl0gdG8gb3BlbiBDaHJvbWVWb3ggUGFuZWwKKyAgQVNTRVJUX1RSVUUodWlfdGVzdF91dGlsczo6U2VuZEtleVByZXNzVG9XaW5kb3dTeW5jKAorICAgICAgbnVsbHB0ciwgdWk6OlZLRVlfT0VNX1BFUklPRCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpOworICB3aGlsZSAoc3BlZWNoX21vbml0b3JfLkdldE5leHRVdHRlcmFuY2UoKSAhPSAiQ2hyb21lVm94IFBhbmVsIikgeworICB9CisgIC8vIEdvIHRvIHRhYnMgbWVudSBhbmQgdmVyaWZ5IHRoYXQgaXQgaGFzIG5vIGl0ZW1zLgorICBBU1NFUlRfVFJVRSh1aV90ZXN0X3V0aWxzOjpTZW5kS2V5UHJlc3NUb1dpbmRvd1N5bmMoCisgICAgICBudWxscHRyLCB1aTo6VktFWV9SSUdIVCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpKTsKKyAgd2hpbGUgKHNwZWVjaF9tb25pdG9yXy5HZXROZXh0VXR0ZXJhbmNlKCkgIT0gIlNwZWVjaCIpIHsKKyAgfQorICBBU1NFUlRfVFJVRSh1aV90ZXN0X3V0aWxzOjpTZW5kS2V5UHJlc3NUb1dpbmRvd1N5bmMoCisgICAgICBudWxscHRyLCB1aTo6VktFWV9SSUdIVCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpKTsKKyAgd2hpbGUgKHNwZWVjaF9tb25pdG9yXy5HZXROZXh0VXR0ZXJhbmNlKCkgIT0gIlRhYnMiKSB7CisgIH0KKyAgRVhQRUNUX0VRKCJNZW51Iiwgc3BlZWNoX21vbml0b3JfLkdldE5leHRVdHRlcmFuY2UoKSk7CisgIEVYUEVDVF9FUSgiTm8gaXRlbXMuIiwgc3BlZWNoX21vbml0b3JfLkdldE5leHRVdHRlcmFuY2UoKSk7Cit9CisKIElOX1BST0NfQlJPV1NFUl9URVNUX1AoU3Bva2VuRmVlZGJhY2tUZXN0LAogICAgICAgICAgICAgICAgICAgICAgICBNb3ZlQnlDaGFyYWN0ZXJQaG9uZXRpY1NwZWVjaEFuZEhpbnRzKSB7CiAgIEVuYWJsZUNocm9tZVZveCgpOwpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvYXBwX21vZGUvc3RhcnR1cF9hcHBfbGF1bmNoZXIuY2MgYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9hcHBfbW9kZS9zdGFydHVwX2FwcF9sYXVuY2hlci5jYwppbmRleCA3MGM1ZDJkLi40YWMwOTNiIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9hcHBfbW9kZS9zdGFydHVwX2FwcF9sYXVuY2hlci5jYworKysgYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9hcHBfbW9kZS9zdGFydHVwX2FwcF9sYXVuY2hlci5jYwpAQCAtMjAsNyArMjAsNiBAQAogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL2Nocm9tZW9zL2FwcF9tb2RlL3N0YXJ0dXBfYXBwX2xhdW5jaGVyX3VwZGF0ZV9jaGVja2VyLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbmV0L2RlbGF5X25ldHdvcmtfY2FsbC5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL2V4dGVuc2lvbnMvZXh0ZW5zaW9uX3NlcnZpY2UuaCIKLSNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9leHRlbnNpb25zL2luc3RhbGxfdHJhY2tlci5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL2V4dGVuc2lvbnMvaW5zdGFsbF90cmFja2VyX2ZhY3RvcnkuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9saWZldGltZS9hcHBsaWNhdGlvbl9saWZldGltZS5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3Byb2ZpbGVzL3Byb2ZpbGUuaCIKQEAgLTU1LDkgKzU0LDcgQEAKICAgICA6IHByb2ZpbGVfKHByb2ZpbGUpLAogICAgICAgYXBwX2lkXyhhcHBfaWQpLAogICAgICAgZGlhZ25vc3RpY19tb2RlXyhkaWFnbm9zdGljX21vZGUpLAotICAgICAgZGVsZWdhdGVfKGRlbGVnYXRlKSwKLSAgICAgIGtpb3NrX2FwcF9tYW5hZ2VyX29ic2VydmVyXyh0aGlzKSwKLSAgICAgIGluc3RhbGxfb2JzZXJ2ZXJfKHRoaXMpIHsKKyAgICAgIGRlbGVnYXRlXyhkZWxlZ2F0ZSkgewogICBEQ0hFQ0socHJvZmlsZV8pOwogICBEQ0hFQ0soY3J4X2ZpbGU6OmlkX3V0aWw6OklkSXNWYWxpZChhcHBfaWRfKSk7CiAgIGtpb3NrX2FwcF9tYW5hZ2VyX29ic2VydmVyXy5BZGQoS2lvc2tBcHBNYW5hZ2VyOjpHZXQoKSk7CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9hcHBfbW9kZS9zdGFydHVwX2FwcF9sYXVuY2hlci5oIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvYXBwX21vZGUvc3RhcnR1cF9hcHBfbGF1bmNoZXIuaAppbmRleCBmMWE2NzdmLi5kYzk3ZTUyZSAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvYXBwX21vZGUvc3RhcnR1cF9hcHBfbGF1bmNoZXIuaAorKysgYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9hcHBfbW9kZS9zdGFydHVwX2FwcF9sYXVuY2hlci5oCkBAIC0xMywxOCArMTMsMTUgQEAKICNpbmNsdWRlICJiYXNlL21lbW9yeS93ZWFrX3B0ci5oIgogI2luY2x1ZGUgImJhc2Uvc2NvcGVkX29ic2VydmVyLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvYXBwX21vZGUva2lvc2tfYXBwX2xhdW5jaF9lcnJvci5oIgorI2luY2x1ZGUgImNocm9tZS9icm93c2VyL2Nocm9tZW9zL2FwcF9tb2RlL2tpb3NrX2FwcF9tYW5hZ2VyLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvYXBwX21vZGUva2lvc2tfYXBwX21hbmFnZXJfb2JzZXJ2ZXIuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9leHRlbnNpb25zL2luc3RhbGxfb2JzZXJ2ZXIuaCIKKyNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9leHRlbnNpb25zL2luc3RhbGxfdHJhY2tlci5oIgogCiBjbGFzcyBQcm9maWxlOwogCi1uYW1lc3BhY2UgZXh0ZW5zaW9ucyB7Ci1jbGFzcyBJbnN0YWxsVHJhY2tlcjsKLX0KLQogbmFtZXNwYWNlIGNocm9tZW9zIHsKIAotY2xhc3MgS2lvc2tBcHBNYW5hZ2VyOwogY2xhc3MgU3RhcnR1cEFwcExhdW5jaGVyVXBkYXRlQ2hlY2tlcjsKIAogLy8gTGF1bmNoZXMgdGhlIGFwcCBhdCBzdGFydHVwLiBUaGUgZmxvdyByb3VnaGx5IGxvb2tzIGxpa2UgdGhpczoKQEAgLTEzOSwxMCArMTM2LDEwIEBACiAgIHN0ZDo6dW5pcXVlX3B0cjxTdGFydHVwQXBwTGF1bmNoZXJVcGRhdGVDaGVja2VyPiB1cGRhdGVfY2hlY2tlcl87CiAKICAgU2NvcGVkT2JzZXJ2ZXI8S2lvc2tBcHBNYW5hZ2VyLCBLaW9za0FwcE1hbmFnZXJPYnNlcnZlcj4KLSAgICAgIGtpb3NrX2FwcF9tYW5hZ2VyX29ic2VydmVyXzsKKyAgICAgIGtpb3NrX2FwcF9tYW5hZ2VyX29ic2VydmVyX3t0aGlzfTsKIAogICBTY29wZWRPYnNlcnZlcjxleHRlbnNpb25zOjpJbnN0YWxsVHJhY2tlciwgZXh0ZW5zaW9uczo6SW5zdGFsbE9ic2VydmVyPgotICAgICAgaW5zdGFsbF9vYnNlcnZlcl87CisgICAgICBpbnN0YWxsX29ic2VydmVyX3t0aGlzfTsKIAogICBiYXNlOjpXZWFrUHRyRmFjdG9yeTxTdGFydHVwQXBwTGF1bmNoZXI+IHdlYWtfcHRyX2ZhY3Rvcnlfe3RoaXN9OwogCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9hcHBzL2Fwa193ZWJfYXBwX3NlcnZpY2UuY2MgYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9hcHBzL2Fwa193ZWJfYXBwX3NlcnZpY2UuY2MKaW5kZXggN2I1OTU2MWIuLjQ0ZGY4YzgxIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9hcHBzL2Fwa193ZWJfYXBwX3NlcnZpY2UuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvYXBwcy9hcGtfd2ViX2FwcF9zZXJ2aWNlLmNjCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSAiY29tcG9uZW50cy9hcmMvc2Vzc2lvbi9jb25uZWN0aW9uX2hvbGRlci5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvcHJlZl9yZWdpc3RyeS9wcmVmX3JlZ2lzdHJ5X3N5bmNhYmxlLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9wcmVmcy9zY29wZWRfdXNlcl9wcmVmX3VwZGF0ZS5oIgotI2luY2x1ZGUgImV4dGVuc2lvbnMvYnJvd3Nlci9leHRlbnNpb25fcmVnaXN0cnkuaCIKICNpbmNsdWRlICJleHRlbnNpb25zL2Jyb3dzZXIvZXh0ZW5zaW9uX3N5c3RlbS5oIgogI2luY2x1ZGUgImV4dGVuc2lvbnMvYnJvd3Nlci91bmluc3RhbGxfcmVhc29uLmgiCiAjaW5jbHVkZSAiZXh0ZW5zaW9ucy9jb21tb24vZXh0ZW5zaW9uLmgiCkBAIC03MCw5ICs2OSw3IEBACiB9CiAKIEFwa1dlYkFwcFNlcnZpY2U6OkFwa1dlYkFwcFNlcnZpY2UoUHJvZmlsZSogcHJvZmlsZSkKLSAgICA6IHByb2ZpbGVfKHByb2ZpbGUpLAotICAgICAgYXJjX2FwcF9saXN0X3ByZWZzXyhBcmNBcHBMaXN0UHJlZnM6OkdldChwcm9maWxlKSksCi0gICAgICBvYnNlcnZlcl8odGhpcykgeworICAgIDogcHJvZmlsZV8ocHJvZmlsZSksIGFyY19hcHBfbGlzdF9wcmVmc18oQXJjQXBwTGlzdFByZWZzOjpHZXQocHJvZmlsZSkpIHsKICAgLy8gQ2FuIGJlIG51bGwgaW4gdGVzdHMuCiAgIGlmIChhcmNfYXBwX2xpc3RfcHJlZnNfKQogICAgIGFyY19hcHBfbGlzdF9wcmVmc18tPkFkZE9ic2VydmVyKHRoaXMpOwpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvYXBwcy9hcGtfd2ViX2FwcF9zZXJ2aWNlLmggYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9hcHBzL2Fwa193ZWJfYXBwX3NlcnZpY2UuaAppbmRleCA2OTVmYTI1Li5hNzRkODY5IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9hcHBzL2Fwa193ZWJfYXBwX3NlcnZpY2UuaAorKysgYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9hcHBzL2Fwa193ZWJfYXBwX3NlcnZpY2UuaApAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL2FwcF9saXN0L2FyYy9hcmNfYXBwX2xpc3RfcHJlZnMuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL2NvbXBvbmVudHMvd2ViX2FwcF9oZWxwZXJzLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9rZXllZF9zZXJ2aWNlL2NvcmUva2V5ZWRfc2VydmljZS5oIgorI2luY2x1ZGUgImV4dGVuc2lvbnMvYnJvd3Nlci9leHRlbnNpb25fcmVnaXN0cnkuaCIKICNpbmNsdWRlICJleHRlbnNpb25zL2Jyb3dzZXIvZXh0ZW5zaW9uX3JlZ2lzdHJ5X29ic2VydmVyLmgiCiAKIGNsYXNzIEFyY0FwcExpc3RQcmVmczsKQEAgLTk2LDcgKzk3LDcgQEAKIAogICBTY29wZWRPYnNlcnZlcjxleHRlbnNpb25zOjpFeHRlbnNpb25SZWdpc3RyeSwKICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uczo6RXh0ZW5zaW9uUmVnaXN0cnlPYnNlcnZlcj4KLSAgICAgIG9ic2VydmVyXzsKKyAgICAgIG9ic2VydmVyX3t0aGlzfTsKIAogICAvLyBNdXN0IGdvIGxhc3QuCiAgIGJhc2U6OldlYWtQdHJGYWN0b3J5PEFwa1dlYkFwcFNlcnZpY2U+IHdlYWtfcHRyX2ZhY3Rvcnlfe3RoaXN9OwpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvYXJjL2FyY19vcHRpbl91bWEuY2MgYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9hcmMvYXJjX29wdGluX3VtYS5jYwppbmRleCAxNDA1MDZjLi40NDY1NjA0NCAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvYXJjL2FyY19vcHRpbl91bWEuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvYXJjL2FyY19vcHRpbl91bWEuY2MKQEAgLTExOSw4ICsxMTksMjQgQEAKICAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbnV0ZXMoMTApLCA1MCk7CiB9CiAKLXZvaWQgVXBkYXRlUGxheVN0b3JlU2hvd1RpbWUoY29uc3QgYmFzZTo6VGltZURlbHRhJiBlbGFwc2VkX3RpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByb2ZpbGUqIHByb2ZpbGUpIHsKK3ZvaWQgVXBkYXRlQXJjVWlBdmFpbGFibGVUaW1lKGNvbnN0IGJhc2U6OlRpbWVEZWx0YSYgZWxhcHNlZF90aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcm9maWxlKiBwcm9maWxlKSB7CisgIGJhc2U6OlVtYUhpc3RvZ3JhbUN1c3RvbVRpbWVzKAorICAgICAgR2V0SGlzdG9ncmFtTmFtZUJ5VXNlclR5cGUoIkFyYy5VaUF2YWlsYWJsZS4iICsgbW9kZSArICIuVGltZURlbHRhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUpLAorICAgICAgZWxhcHNlZF90aW1lLCBiYXNlOjpUaW1lRGVsdGE6OkZyb21TZWNvbmRzKDEpLAorICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tTWludXRlcyg1KSwgNTApOworfQorCit2b2lkIFVwZGF0ZVBsYXlTdG9yZUxhdW5jaFRpbWUoY29uc3QgYmFzZTo6VGltZURlbHRhJiBlbGFwc2VkX3RpbWUpIHsKKyAgYmFzZTo6VW1hSGlzdG9ncmFtQ3VzdG9tVGltZXMoIkFyYy5QbGF5U3RvcmVMYXVuY2guVGltZURlbHRhIiwgZWxhcHNlZF90aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoMTApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21TZWNvbmRzKDIwKSwgNTApOworfQorCit2b2lkIFVwZGF0ZVBsYXlTdG9yZVNob3duVGltZURlcHJlY2F0ZWQoY29uc3QgYmFzZTo6VGltZURlbHRhJiBlbGFwc2VkX3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJvZmlsZSogcHJvZmlsZSkgewogICBiYXNlOjpVbWFIaXN0b2dyYW1DdXN0b21UaW1lcygKICAgICAgIEdldEhpc3RvZ3JhbU5hbWVCeVVzZXJUeXBlKCJBcmMuUGxheVN0b3JlU2hvd24uVGltZURlbHRhIiwgcHJvZmlsZSksCiAgICAgICBlbGFwc2VkX3RpbWUsIGJhc2U6OlRpbWVEZWx0YTo6RnJvbVNlY29uZHMoMSksCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9hcmMvYXJjX29wdGluX3VtYS5oIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvYXJjL2FyY19vcHRpbl91bWEuaAppbmRleCA5OTFlMzJlYS4uYmYwYTAyZiAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvYXJjL2FyY19vcHRpbl91bWEuaAorKysgYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9hcmMvYXJjX29wdGluX3VtYS5oCkBAIC0yMzgsOCArMjM4LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcm9maWxlKiBwcm9maWxlKTsKIHZvaWQgVXBkYXRlUGxheUF1dG9JbnN0YWxsUmVxdWVzdFRpbWUoY29uc3QgYmFzZTo6VGltZURlbHRhJiBlbGFwc2VkX3RpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByb2ZpbGUqIHByb2ZpbGUpOwotdm9pZCBVcGRhdGVQbGF5U3RvcmVTaG93VGltZShjb25zdCBiYXNlOjpUaW1lRGVsdGEmIGVsYXBzZWRfdGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJvZmlsZSogcHJvZmlsZSk7Cit2b2lkIFVwZGF0ZUFyY1VpQXZhaWxhYmxlVGltZShjb25zdCBiYXNlOjpUaW1lRGVsdGEmIGVsYXBzZWRfdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJvZmlsZSogcHJvZmlsZSk7Cit2b2lkIFVwZGF0ZVBsYXlTdG9yZUxhdW5jaFRpbWUoY29uc3QgYmFzZTo6VGltZURlbHRhJiBlbGFwc2VkX3RpbWUpOworLy8gVE9ETyhraG1lbCk6IFJlbW92ZSB0aGlzIGluIGZhdm9yIG9mIFVwZGF0ZUFyY1VpQXZhaWxhYmxlVGltZSBvbmNlIGl0IGlzCisvLyByb2xsZWQgYW5kIGhhcyBjb25maXJtZWQgdXNhYmlsaXR5Lgordm9pZCBVcGRhdGVQbGF5U3RvcmVTaG93blRpbWVEZXByZWNhdGVkKGNvbnN0IGJhc2U6OlRpbWVEZWx0YSYgZWxhcHNlZF90aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByb2ZpbGUqIHByb2ZpbGUpOwogdm9pZCBVcGRhdGVTaWxlbnRBdXRoQ29kZVVNQShPcHRJblNpbGVudEF1dGhDb2RlIHN0YXRlKTsKIHZvaWQgVXBkYXRlU3VwZXJ2aXNpb25UcmFuc2l0aW9uUmVzdWx0VU1BKAogICAgIG1vam9tOjpTdXBlcnZpc2lvbkNoYW5nZVN0YXR1cyByZXN1bHQpOwpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvYXJjL2FyY191aV9hdmFpbGFiaWxpdHlfcmVwb3J0ZXIuY2MgYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9hcmMvYXJjX3VpX2F2YWlsYWJpbGl0eV9yZXBvcnRlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGI1MmYwNwotLS0gL2Rldi9udWxsCisrKyBiL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2FyYy9hcmNfdWlfYXZhaWxhYmlsaXR5X3JlcG9ydGVyLmNjCkBAIC0wLDAgKzEsMTI2IEBACisvLyBDb3B5cmlnaHQgMjAxOSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9hcmMvYXJjX3VpX2F2YWlsYWJpbGl0eV9yZXBvcnRlci5oIgorCisjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvYXJjL2FyY19vcHRpbl91bWEuaCIKKyNpbmNsdWRlICJjb21wb25lbnRzL2FyYy9hcmNfc2VydmljZV9tYW5hZ2VyLmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9hcmMvc2Vzc2lvbi9hcmNfYnJpZGdlX3NlcnZpY2UuaCIKKworbmFtZXNwYWNlIGFyYyB7CisKK2NsYXNzIEFyY1VpQXZhaWxhYmlsaXR5UmVwb3J0ZXI6OkNvbm5lY3Rpb25Ob3RpZmllckJhc2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+Q29ubmVjdGlvbk5vdGlmaWVyQmFzZSgpID0gZGVmYXVsdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWYgY29ubmVjdGlvbiBpcyByZWFkeS4KKyAgdmlydHVhbCBib29sIElzQ29ubmVjdGVkKCkgPSAwOworCisgcHJvdGVjdGVkOgorICBleHBsaWNpdCBDb25uZWN0aW9uTm90aWZpZXJCYXNlKEFyY1VpQXZhaWxhYmlsaXR5UmVwb3J0ZXIqIG93bmVyKQorICAgICAgOiBvd25lcl8ob3duZXIpIHt9CisKKyAgQXJjVWlBdmFpbGFiaWxpdHlSZXBvcnRlciogb3duZXIoKSB7IHJldHVybiBvd25lcl87IH0KKworIHByaXZhdGU6CisgIEFyY1VpQXZhaWxhYmlsaXR5UmVwb3J0ZXIqIGNvbnN0IG93bmVyXzsKKworICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQ29ubmVjdGlvbk5vdGlmaWVyQmFzZSk7Cit9OworCituYW1lc3BhY2UgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5zdGFuY2VUeXBlLCB0eXBlbmFtZSBIb3N0VHlwZT4KK2NsYXNzIENvbm5lY3Rpb25Ob3RpZmllcgorICAgIDogcHVibGljIEFyY1VpQXZhaWxhYmlsaXR5UmVwb3J0ZXI6OkNvbm5lY3Rpb25Ob3RpZmllckJhc2UsCisgICAgICBwdWJsaWMgQ29ubmVjdGlvbk9ic2VydmVyPEluc3RhbmNlVHlwZT4geworIHB1YmxpYzoKKyAgLy8gfG93bmVyX3wgb3ducyB0aGlzIG9iamVjdCBhbmQgfENvbm5lY3Rpb25Ob3RpZmllcnwgaXMgZGVzdHJveWVkIGluIGNhc2UKKyAgLy8gc3RhdGlzdGljcyBpcyByZXBvcnRlZCBvciBBUkMgc2Vzc2lvbiBpcyB0ZXJtaW5hdGVkIG9uIHVzZXIgbG9nLW91dCBhbmQKKyAgLy8gdGhpcyBhdXRvbWF0aWNhbGx5IGRlc3Ryb3lzIHRoaXMgb2JqZWN0IGF0IHRpbWUgb2YgZGVzdHJveWluZyB8b3duZXJffC4KKyAgLy8gfGhvbGRlcl98IGlzIG93bmVkIGJ5IEFyY0JyaWRnZVNlcnZpY2UgdGhpcyBsaXZlcyBsb25nZXIgdGhhbgorICAvLyB8QXJjVWlBdmFpbGFiaWxpdHlSZXBvcnRlcnwuCisgIENvbm5lY3Rpb25Ob3RpZmllcihBcmNVaUF2YWlsYWJpbGl0eVJlcG9ydGVyKiBvd25lciwKKyAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25Ib2xkZXI8SW5zdGFuY2VUeXBlLCBIb3N0VHlwZT4qIGhvbGRlcikKKyAgICAgIDogQXJjVWlBdmFpbGFiaWxpdHlSZXBvcnRlcjo6Q29ubmVjdGlvbk5vdGlmaWVyQmFzZShvd25lciksCisgICAgICAgIGhvbGRlcl8oaG9sZGVyKSB7CisgICAgRENIRUNLKCFob2xkZXJfLT5Jc0Nvbm5lY3RlZCgpKTsKKyAgICBob2xkZXJfLT5BZGRPYnNlcnZlcih0aGlzKTsKKyAgfQorCisgIH5Db25uZWN0aW9uTm90aWZpZXIoKSBvdmVycmlkZSB7IGhvbGRlcl8tPlJlbW92ZU9ic2VydmVyKHRoaXMpOyB9CisKKyAgLy8gQXJjVWlBdmFpbGFiaWxpdHlSZXBvcnRlcjo6Q29ubmVjdGlvbk5vdGlmaWVyQmFzZToKKyAgYm9vbCBJc0Nvbm5lY3RlZCgpIG92ZXJyaWRlIHsgcmV0dXJuIGhvbGRlcl8tPklzQ29ubmVjdGVkKCk7IH0KKworICAvLyBDb25uZWN0aW9uT2JzZXJ2ZXI8SW5zdGFuY2VUeXBlPjoKKyAgdm9pZCBPbkNvbm5lY3Rpb25SZWFkeSgpIG92ZXJyaWRlIHsgb3duZXIoKS0+TWF5YmVSZXBvcnQoKTsgfQorCisgcHJpdmF0ZToKKyAgQ29ubmVjdGlvbkhvbGRlcjxJbnN0YW5jZVR5cGUsIEhvc3RUeXBlPiogY29uc3QgaG9sZGVyXzsKKworICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQ29ubmVjdGlvbk5vdGlmaWVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZQorCitBcmNVaUF2YWlsYWJpbGl0eVJlcG9ydGVyOjpBcmNVaUF2YWlsYWJpbGl0eVJlcG9ydGVyKFByb2ZpbGUqIHByb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGUgbW9kZSkKKyAgICA6IHByb2ZpbGVfKHByb2ZpbGUpLCBtb2RlXyhtb2RlKSwgc3RhcnRfdGlja3NfKGJhc2U6OlRpbWVUaWNrczo6Tm93KCkpIHsKKyAgRENIRUNLKHByb2ZpbGUpOworICAvLyBTb21lIHVuaXQgdGVzdHMgbWF5IG5vdCBoYXZlIHxBcmNTZXJ2aWNlTWFuYWdlcnwgc2V0LgorICBBcmNTZXJ2aWNlTWFuYWdlciogY29uc3Qgc2VydmljZV9tYW5hZ2VyID0gQXJjU2VydmljZU1hbmFnZXI6OkdldCgpOworICBpZiAoIXNlcnZpY2VfbWFuYWdlcikKKyAgICByZXR1cm47CisgIC8vIHxpbml0aWF0ZWRfZnJvbV9vb2JlfCBtdXN0IGJlIHNldCBvbmx5IGlmIHxpbml0aWFsX3N0YXJ0fCBpcyBzZXQuCisgIGF1dG8qIGNvbnN0IGFyY19icmlkZ2UgPSBBcmNTZXJ2aWNlTWFuYWdlcjo6R2V0KCktPmFyY19icmlkZ2Vfc2VydmljZSgpOworICAvLyBOb3QgZXhwZWN0ZWQgaW5zdGFuY2VzIGFyZSBjb25uZWN0ZWQgYXQgdGhlIHRpbWUgb2YgY3JlYXRpb24sIGhvd2V2ZXIgdGhpcworICAvLyBpcyBub3QgYWx3YXlzIHByZXNlcnZlZCBpbiB0ZXN0cy4KKyAgaWYgKGFyY19icmlkZ2UtPmFwcCgpLT5Jc0Nvbm5lY3RlZCgpIHx8CisgICAgICBhcmNfYnJpZGdlLT5pbnRlbnRfaGVscGVyKCktPklzQ29ubmVjdGVkKCkpIHsKKyAgICBMT0coRVJST1IpIDw8ICJBcHAgYW5kL29yIGludGVudF9oZWxwZXIgaW5zdGFuY2VzIGFyZSBhbHJlYWR5IGNvbm5lY3RlZC4gIgorICAgICAgICAgICAgICAgPDwgIlRoaXMgaXMgbm90IGV4cGVjdGVkIGluIHByb2R1Y3Rpb24uIjsKKyAgICByZXR1cm47CisgIH0KKworICBjb25uZWN0aW9uX25vdGlmaWVyc18uZW1wbGFjZV9iYWNrKAorICAgICAgc3RkOjptYWtlX3VuaXF1ZTxDb25uZWN0aW9uTm90aWZpZXI8bW9qb206OkFwcEluc3RhbmNlLCBtb2pvbTo6QXBwSG9zdD4+KAorICAgICAgICAgIHRoaXMsIGFyY19icmlkZ2UtPmFwcCgpKSk7CisgIGNvbm5lY3Rpb25fbm90aWZpZXJzXy5lbXBsYWNlX2JhY2soCisgICAgICBzdGQ6Om1ha2VfdW5pcXVlPENvbm5lY3Rpb25Ob3RpZmllcjxtb2pvbTo6SW50ZW50SGVscGVySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2pvbTo6SW50ZW50SGVscGVySG9zdD4+KAorICAgICAgICAgIHRoaXMsIGFyY19icmlkZ2UtPmludGVudF9oZWxwZXIoKSkpOworfQorCitBcmNVaUF2YWlsYWJpbGl0eVJlcG9ydGVyOjp+QXJjVWlBdmFpbGFiaWxpdHlSZXBvcnRlcigpID0gZGVmYXVsdDsKKworLy8gc3RhdGljCitzdGQ6OnN0cmluZyBBcmNVaUF2YWlsYWJpbGl0eVJlcG9ydGVyOjpHZXRIaXN0b2dyYW1OYW1lRm9yTW9kZShNb2RlIG1vZGUpIHsKKyAgc3dpdGNoIChtb2RlKSB7CisgICAgY2FzZSBNb2RlOjprT29iZVByb3Zpc2lvbmluZzoKKyAgICAgIHJldHVybiAiT29iZVByb3Zpc2lvbmluZyI7CisgICAgY2FzZSBNb2RlOjprSW5TZXNzaW9uUHJvdmlzaW9uaW5nOgorICAgICAgcmV0dXJuICJJblNlc3Npb25Qcm92aXNpb25pbmciOworICAgIGNhc2UgTW9kZTo6a0FscmVhZHlQcm92aXNpb25lZDoKKyAgICAgIHJldHVybiAiQWxyZWFkeVByb3Zpc2lvbmVkIjsKKyAgfQorfQorCit2b2lkIEFyY1VpQXZhaWxhYmlsaXR5UmVwb3J0ZXI6Ok1heWJlUmVwb3J0KCkgeworICBEQ0hFQ0soIWNvbm5lY3Rpb25fbm90aWZpZXJzXy5lbXB0eSgpKTsKKworICAvLyBDaGVjayB0aGF0IGFsbCB0cmFja2VkIGluc3RhbmNlIGFyZSBjb25uZWN0ZWQuCisgIGZvciAoY29uc3QgYXV0byYgY29ubmVjdGlvbl9ub3RpZmllciA6IGNvbm5lY3Rpb25fbm90aWZpZXJzXykgeworICAgIGlmICghY29ubmVjdGlvbl9ub3RpZmllci0+SXNDb25uZWN0ZWQoKSkKKyAgICAgIHJldHVybjsKKyAgfQorCisgIFVwZGF0ZUFyY1VpQXZhaWxhYmxlVGltZShiYXNlOjpUaW1lVGlja3M6Ok5vdygpIC0gc3RhcnRfdGlja3NfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0SGlzdG9ncmFtTmFtZUZvck1vZGUobW9kZV8pLCBwcm9maWxlXyk7CisKKyAgLy8gTm8gbW9yZSByZXBvcnRpbmcgaXMgZXhwZWN0ZWQuCisgIGNvbm5lY3Rpb25fbm90aWZpZXJzXy5jbGVhcigpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYXJjCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9hcmMvYXJjX3VpX2F2YWlsYWJpbGl0eV9yZXBvcnRlci5oIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvYXJjL2FyY191aV9hdmFpbGFiaWxpdHlfcmVwb3J0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWQ3M2VhMwotLS0gL2Rldi9udWxsCisrKyBiL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2FyYy9hcmNfdWlfYXZhaWxhYmlsaXR5X3JlcG9ydGVyLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTkgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaWZuZGVmIENIUk9NRV9CUk9XU0VSX0NIUk9NRU9TX0FSQ19BUkNfVUlfQVZBSUxBQklMSVRZX1JFUE9SVEVSX0hfCisjZGVmaW5lIENIUk9NRV9CUk9XU0VSX0NIUk9NRU9TX0FSQ19BUkNfVUlfQVZBSUxBQklMSVRZX1JFUE9SVEVSX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImJhc2UvbWFjcm9zLmgiCisjaW5jbHVkZSAiYmFzZS90aW1lL3RpbWUuaCIKKworY2xhc3MgUHJvZmlsZTsKKworbmFtZXNwYWNlIGFyYyB7CisKKy8vIEhlbHBlciBjbGFzcyB0aGF0IHJlcG9ydHMgQVJDIFVJIGF2YWlsYWJpbGl0eSB0byBVTUEuIEl0IG9ic2VydmVzIG1ham9yIFVJCisvLyBpbnN0YW5jZXMgYXJlIGFsbCBjb25uZWN0ZWQuCitjbGFzcyBBcmNVaUF2YWlsYWJpbGl0eVJlcG9ydGVyIHsKKyBwdWJsaWM6CisgIC8vIEhlbHBlciB0aGF0IG5vdGlmaWVzIHxBcmNVaUF2YWlsYWJpbGl0eVJlcG9ydGVyfCB0aGF0IGNvbm5lY3Rpb24gaXMgcmVhZHkuCisgIGNsYXNzIENvbm5lY3Rpb25Ob3RpZmllckJhc2U7CisKKyAgZW51bSBjbGFzcyBNb2RlIHsKKyAgICBrT29iZVByb3Zpc2lvbmluZywKKyAgICBrSW5TZXNzaW9uUHJvdmlzaW9uaW5nLAorICAgIGtBbHJlYWR5UHJvdmlzaW9uZWQKKyAgfTsKKworICBBcmNVaUF2YWlsYWJpbGl0eVJlcG9ydGVyKFByb2ZpbGUqIHByb2ZpbGUsIE1vZGUgbW9kZSk7CisgIH5BcmNVaUF2YWlsYWJpbGl0eVJlcG9ydGVyKCk7CisKKyAgc3RhdGljIHN0ZDo6c3RyaW5nIEdldEhpc3RvZ3JhbU5hbWVGb3JNb2RlKE1vZGUgbW9kZSk7CisKKyAgLy8gQ2FsbGVkIHdoZW4gYW55IHRyYWNrZWQgaW5zdGFuY2UgaXMgY29ubmVjdGVkLgorICB2b2lkIE1heWJlUmVwb3J0KCk7CisKKyBwcml2YXRlOgorICBQcm9maWxlKiBjb25zdCBwcm9maWxlXzsKKyAgY29uc3QgTW9kZSBtb2RlXzsKKyAgY29uc3QgYmFzZTo6VGltZVRpY2tzIHN0YXJ0X3RpY2tzXzsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q29ubmVjdGlvbk5vdGlmaWVyQmFzZT4+IGNvbm5lY3Rpb25fbm90aWZpZXJzXzsKKworICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQXJjVWlBdmFpbGFiaWxpdHlSZXBvcnRlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYXJjCisKKyNlbmRpZiAgLy8gQ0hST01FX0JST1dTRVJfQ0hST01FT1NfQVJDX0FSQ19VSV9BVkFJTEFCSUxJVFlfUkVQT1JURVJfSF8KZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2FyYy9hcmNfdWlfYXZhaWxhYmlsaXR5X3JlcG9ydGVyX3VuaXR0ZXN0LmNjIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvYXJjL2FyY191aV9hdmFpbGFiaWxpdHlfcmVwb3J0ZXJfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBlMzU3MQotLS0gL2Rldi9udWxsCisrKyBiL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2FyYy9hcmNfdWlfYXZhaWxhYmlsaXR5X3JlcG9ydGVyX3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsMTM5IEBACisvLyBDb3B5cmlnaHQgMjAxOSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9hcmMvYXJjX3VpX2F2YWlsYWJpbGl0eV9yZXBvcnRlci5oIgorI2luY2x1ZGUgImJhc2UvbWV0cmljcy9oaXN0b2dyYW1fc2FtcGxlcy5oIgorI2luY2x1ZGUgImJhc2UvbWV0cmljcy9zdGF0aXN0aWNzX3JlY29yZGVyLmgiCisjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvYXBwX2xpc3QvYXJjL2FyY19hcHBfbGlzdF9wcmVmcy5oIgorI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL2FwcF9saXN0L2FyYy9hcmNfYXBwX3Rlc3QuaCIKKyNpbmNsdWRlICJjaHJvbWUvdGVzdC9iYXNlL3Rlc3RpbmdfcHJvZmlsZS5oIgorI2luY2x1ZGUgImNvbXBvbmVudHMvYXJjL2FyY19zZXJ2aWNlX21hbmFnZXIuaCIKKyNpbmNsdWRlICJjb21wb25lbnRzL2FyYy9hcmNfdXRpbC5oIgorI2luY2x1ZGUgImNvbXBvbmVudHMvYXJjL2ludGVudF9oZWxwZXIvYXJjX2ludGVudF9oZWxwZXJfYnJpZGdlLmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9hcmMvc2Vzc2lvbi9hcmNfYnJpZGdlX3NlcnZpY2UuaCIKKyNpbmNsdWRlICJjb21wb25lbnRzL2FyYy90ZXN0L2Zha2VfYXBwX2luc3RhbmNlLmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9hcmMvdGVzdC9mYWtlX2ludGVudF9oZWxwZXJfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb250ZW50L3B1YmxpYy90ZXN0L2Jyb3dzZXJfdGFza19lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgYXJjIHsKKworbmFtZXNwYWNlIHsKKwordXNpbmcgTW9kZSA9IEFyY1VpQXZhaWxhYmlsaXR5UmVwb3J0ZXI6Ok1vZGU7CisKK2NvbnN0IGJhc2U6Okhpc3RvZ3JhbUJhc2UqIEdldEhpc3RvZ3JhbShNb2RlIG1vZGUpIHsKKyAgcmV0dXJuIGJhc2U6OlN0YXRpc3RpY3NSZWNvcmRlcjo6RmluZEhpc3RvZ3JhbSgKKyAgICAgICJBcmMuVWlBdmFpbGFibGUuIiArCisgICAgICBBcmNVaUF2YWlsYWJpbGl0eVJlcG9ydGVyOjpHZXRIaXN0b2dyYW1OYW1lRm9yTW9kZShtb2RlKSArCisgICAgICAiLlRpbWVEZWx0YS5Vbm1hbmFnZWQiKTsKK30KKworaW50NjRfdCBSZWFkU2luZ2xlU3RhdGlzdGljcyhNb2RlIG1vZGUpIHsKKyAgY29uc3QgYmFzZTo6SGlzdG9ncmFtQmFzZSogaGlzdG9ncmFtID0gR2V0SGlzdG9ncmFtKG1vZGUpOworICBEQ0hFQ0soaGlzdG9ncmFtKTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8YmFzZTo6SGlzdG9ncmFtU2FtcGxlcz4gc2FtcGxlcyA9CisgICAgICBoaXN0b2dyYW0tPlNuYXBzaG90RmluYWxEZWx0YSgpOworICBEQ0hFQ0soc2FtcGxlcy5nZXQoKSk7CisgIC8vIEV4cGVjdGVkIHJlcG9ydGVkIG9ubHkgb25jZS4KKyAgRENIRUNLX0VRKDEsIHNhbXBsZXMtPlRvdGFsQ291bnQoKSk7CisgIHJldHVybiBzYW1wbGVzLT5zdW0oKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK2NsYXNzIEFyY1VpQXZhaWxhYmlsaXR5UmVwb3J0ZXJUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgQXJjVWlBdmFpbGFiaWxpdHlSZXBvcnRlclRlc3QoKSB7fQorICB+QXJjVWlBdmFpbGFiaWxpdHlSZXBvcnRlclRlc3QoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICB0ZXN0aW5nOjpUZXN0OjpTZXRVcCgpOworICAgIGFyYzo6U2V0QXJjQXZhaWxhYmxlQ29tbWFuZExpbmVGb3JUZXN0aW5nKAorICAgICAgICBiYXNlOjpDb21tYW5kTGluZTo6Rm9yQ3VycmVudFByb2Nlc3MoKSk7CisgICAgLy8gYXJjX3NlcnZpY2VfbWFuYWdlcl8gPSBzdGQ6Om1ha2VfdW5pcXVlPGFyYzo6QXJjU2VydmljZU1hbmFnZXI+KCk7CisgICAgcHJvZmlsZV8gPSBUZXN0aW5nUHJvZmlsZTo6QnVpbGRlcigpLkJ1aWxkKCk7CisKKyAgICAvLyBVc2UgQXJjQXBwVGVzdCB0byBpbml0aWFsaXplIGluZnJhc3RydWN0dXJlLgorICAgIGFyY19hcHBfdGVzdF8uc2V0X2FjdGl2YXRlX2FyY19vbl9zdGFydChmYWxzZSk7CisgICAgYXJjX2FwcF90ZXN0Xy5TZXRVcChwcm9maWxlKCkpOworICAgIGFwcF9pbnN0YW5jZV8gPSBzdGQ6Om1ha2VfdW5pcXVlPEZha2VBcHBJbnN0YW5jZT4oCisgICAgICAgIGFyY19hcHBfdGVzdF8uYXJjX2FwcF9saXN0X3ByZWZzKCkgLyogYXBwX2hvc3QgKi8pOworICAgIGludGVudF9oZWxwZXJfaW5zdGFuY2VfID0gc3RkOjptYWtlX3VuaXF1ZTxGYWtlSW50ZW50SGVscGVySW5zdGFuY2U+KCk7CisgICAgYXJjX2ludGVudF9oZWxwZXJfYnJpZGdlXyA9IHN0ZDo6bWFrZV91bmlxdWU8QXJjSW50ZW50SGVscGVyQnJpZGdlPigKKyAgICAgICAgcHJvZmlsZSgpLCBhcmNfYnJpZGdlX3NlcnZpY2UoKSk7CisgIH0KKworICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgIGFyY19pbnRlbnRfaGVscGVyX2JyaWRnZV8ucmVzZXQoKTsKKyAgICBpbnRlbnRfaGVscGVyX2luc3RhbmNlXy5yZXNldCgpOworICAgIGFwcF9pbnN0YW5jZV8ucmVzZXQoKTsKKyAgICBhcmNfYXBwX3Rlc3RfLlRlYXJEb3duKCk7CisgICAgcHJvZmlsZV8ucmVzZXQoKTsKKyAgICAvLyBhcmNfc2VydmljZV9tYW5hZ2VyXy5yZXNldCgpOworICAgIHRlc3Rpbmc6OlRlc3Q6OlRlYXJEb3duKCk7CisgIH0KKworICBUZXN0aW5nUHJvZmlsZSogcHJvZmlsZSgpIHsgcmV0dXJuIHByb2ZpbGVfLmdldCgpOyB9CisKKyAgQXJjQnJpZGdlU2VydmljZSogYXJjX2JyaWRnZV9zZXJ2aWNlKCkgeworICAgIHJldHVybiBBcmNTZXJ2aWNlTWFuYWdlcjo6R2V0KCktPmFyY19icmlkZ2Vfc2VydmljZSgpOworICB9CisKKyAgRmFrZUFwcEluc3RhbmNlKiBhcHBfaW5zdGFuY2UoKSB7IHJldHVybiBhcHBfaW5zdGFuY2VfLmdldCgpOyB9CisKKyAgRmFrZUludGVudEhlbHBlckluc3RhbmNlKiBpbnRlbnRfaGVscGVyX2luc3RhbmNlKCkgeworICAgIHJldHVybiBpbnRlbnRfaGVscGVyX2luc3RhbmNlXy5nZXQoKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY29udGVudDo6QnJvd3NlclRhc2tFbnZpcm9ubWVudCB0YXNrX2Vudmlyb25tZW50XzsKKyAgLy8gc3RkOjp1bmlxdWVfcHRyPGFyYzo6QXJjU2VydmljZU1hbmFnZXI+IGFyY19zZXJ2aWNlX21hbmFnZXJfOworICBzdGQ6OnVuaXF1ZV9wdHI8VGVzdGluZ1Byb2ZpbGU+IHByb2ZpbGVfOworICBBcmNBcHBUZXN0IGFyY19hcHBfdGVzdF87CisgIHN0ZDo6dW5pcXVlX3B0cjxBcmNJbnRlbnRIZWxwZXJCcmlkZ2U+IGFyY19pbnRlbnRfaGVscGVyX2JyaWRnZV87CisgIHN0ZDo6dW5pcXVlX3B0cjxGYWtlQXBwSW5zdGFuY2U+IGFwcF9pbnN0YW5jZV87CisgIHN0ZDo6dW5pcXVlX3B0cjxGYWtlSW50ZW50SGVscGVySW5zdGFuY2U+IGludGVudF9oZWxwZXJfaW5zdGFuY2VfOworCisgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBcmNVaUF2YWlsYWJpbGl0eVJlcG9ydGVyVGVzdCk7Cit9OworCisvLyBSZXBvcnRpbmcgaXMgdHJpZ2dlcmVkIGluIGNhc2UgYm90aCBpbnN0YW5jZXMgYXJlIGNvbm5lY3RlZC4KK1RFU1RfRihBcmNVaUF2YWlsYWJpbGl0eVJlcG9ydGVyVGVzdCwgQmFzaWMpIHsKKyAgQXJjVWlBdmFpbGFiaWxpdHlSZXBvcnRlciByZXBvcnRlcihwcm9maWxlKCksIE1vZGU6OmtPb2JlUHJvdmlzaW9uaW5nKTsKKyAgLy8gTm8gcmVwb3J0aW5nIGF0IHRoaXMgdGltZS4KKyAgRVhQRUNUX0ZBTFNFKEdldEhpc3RvZ3JhbShNb2RlOjprT29iZVByb3Zpc2lvbmluZykpOworICBhcmNfYnJpZGdlX3NlcnZpY2UoKS0+YXBwKCktPlNldEluc3RhbmNlKGFwcF9pbnN0YW5jZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKEdldEhpc3RvZ3JhbShNb2RlOjprT29iZVByb3Zpc2lvbmluZykpOworICBhcmNfYnJpZGdlX3NlcnZpY2UoKS0+aW50ZW50X2hlbHBlcigpLT5TZXRJbnN0YW5jZShpbnRlbnRfaGVscGVyX2luc3RhbmNlKCkpOworICBFWFBFQ1RfR0UoUmVhZFNpbmdsZVN0YXRpc3RpY3MoTW9kZTo6a09vYmVQcm92aXNpb25pbmcpLCAwKTsKKyAgRVhQRUNUX0ZBTFNFKEdldEhpc3RvZ3JhbShNb2RlOjprSW5TZXNzaW9uUHJvdmlzaW9uaW5nKSk7CisgIEVYUEVDVF9GQUxTRShHZXRIaXN0b2dyYW0oTW9kZTo6a0FscmVhZHlQcm92aXNpb25lZCkpOworfQorCisvLyBSZXBvcnRpbmcgaXMgdHJpZ2dlcmVkIG9ubHkgb25jZSwgZXZlbiBpZiBpbnN0YW5jZXMgYXJlIHJlY29ubmVjdGVkLgorVEVTVF9GKEFyY1VpQXZhaWxhYmlsaXR5UmVwb3J0ZXJUZXN0LCBUcmlnZ2VyZWRPbmNlKSB7CisgIEFyY1VpQXZhaWxhYmlsaXR5UmVwb3J0ZXIgcmVwb3J0ZXIocHJvZmlsZSgpLCBNb2RlOjprQWxyZWFkeVByb3Zpc2lvbmVkKTsKKyAgYXJjX2JyaWRnZV9zZXJ2aWNlKCktPmFwcCgpLT5TZXRJbnN0YW5jZShhcHBfaW5zdGFuY2UoKSk7CisgIGFyY19icmlkZ2Vfc2VydmljZSgpLT5pbnRlbnRfaGVscGVyKCktPlNldEluc3RhbmNlKGludGVudF9oZWxwZXJfaW5zdGFuY2UoKSk7CisgIGFyY19icmlkZ2Vfc2VydmljZSgpLT5hcHAoKS0+Q2xvc2VJbnN0YW5jZShhcHBfaW5zdGFuY2UoKSk7CisgIGFyY19icmlkZ2Vfc2VydmljZSgpLT5pbnRlbnRfaGVscGVyKCktPkNsb3NlSW5zdGFuY2UoCisgICAgICBpbnRlbnRfaGVscGVyX2luc3RhbmNlKCkpOworICBhcmNfYnJpZGdlX3NlcnZpY2UoKS0+YXBwKCktPlNldEluc3RhbmNlKGFwcF9pbnN0YW5jZSgpKTsKKyAgYXJjX2JyaWRnZV9zZXJ2aWNlKCktPmludGVudF9oZWxwZXIoKS0+U2V0SW5zdGFuY2UoaW50ZW50X2hlbHBlcl9pbnN0YW5jZSgpKTsKKyAgRVhQRUNUX0dFKFJlYWRTaW5nbGVTdGF0aXN0aWNzKE1vZGU6OmtBbHJlYWR5UHJvdmlzaW9uZWQpLCAwKTsKK30KKworLy8gUmVwb3J0aW5nIGlzIHRyaWdnZXJlZCBldmVuIGlmIGluc3RhbmNlIHJlc3RhcnQgaGFwcGVuZWQuCitURVNUX0YoQXJjVWlBdmFpbGFiaWxpdHlSZXBvcnRlclRlc3QsIEluc3RhbmNlUmVzdGFydEFsbG93ZWQpIHsKKyAgQXJjVWlBdmFpbGFiaWxpdHlSZXBvcnRlciByZXBvcnRlcihwcm9maWxlKCksIE1vZGU6OmtJblNlc3Npb25Qcm92aXNpb25pbmcpOworICBhcmNfYnJpZGdlX3NlcnZpY2UoKS0+YXBwKCktPlNldEluc3RhbmNlKGFwcF9pbnN0YW5jZSgpKTsKKyAgYXJjX2JyaWRnZV9zZXJ2aWNlKCktPmFwcCgpLT5DbG9zZUluc3RhbmNlKGFwcF9pbnN0YW5jZSgpKTsKKyAgYXJjX2JyaWRnZV9zZXJ2aWNlKCktPmludGVudF9oZWxwZXIoKS0+U2V0SW5zdGFuY2UoaW50ZW50X2hlbHBlcl9pbnN0YW5jZSgpKTsKKyAgYXJjX2JyaWRnZV9zZXJ2aWNlKCktPmFwcCgpLT5TZXRJbnN0YW5jZShhcHBfaW5zdGFuY2UoKSk7CisgIEVYUEVDVF9HRShSZWFkU2luZ2xlU3RhdGlzdGljcyhNb2RlOjprSW5TZXNzaW9uUHJvdmlzaW9uaW5nKSwgMCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhcmMKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2FyYy9zZXNzaW9uL2FyY19zZXNzaW9uX21hbmFnZXIuY2MgYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9hcmMvc2Vzc2lvbi9hcmNfc2Vzc2lvbl9tYW5hZ2VyLmNjCmluZGV4IDI3NDIyNzEuLjI2NWE5YTggMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2FyYy9zZXNzaW9uL2FyY19zZXNzaW9uX21hbmFnZXIuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvYXJjL3Nlc3Npb24vYXJjX3Nlc3Npb25fbWFuYWdlci5jYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL2Nocm9tZW9zL2FyYy9hcmNfbWlncmF0aW9uX2d1aWRlX25vdGlmaWNhdGlvbi5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL2Nocm9tZW9zL2FyYy9hcmNfb3B0aW5fdW1hLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvYXJjL2FyY19zdXBwb3J0X2hvc3QuaCIKKyNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9hcmMvYXJjX3VpX2F2YWlsYWJpbGl0eV9yZXBvcnRlci5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL2Nocm9tZW9zL2FyYy9hcmNfdXRpbC5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL2Nocm9tZW9zL2FyYy9hdXRoL2FyY19hdXRoX3NlcnZpY2UuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9hcmMvb3B0aW4vYXJjX3Rlcm1zX29mX3NlcnZpY2VfZGVmYXVsdF9uZWdvdGlhdG9yLmgiCkBAIC01MjAsNiArNTIxLDcgQEAKICAgfQogICBwYWlfc3RhcnRlcl8ucmVzZXQoKTsKICAgZmFzdF9hcHBfcmVpbnN0YWxsX3N0YXJ0ZXJfLnJlc2V0KCk7CisgIGFyY191aV9hdmFpbGFiaWxpdHlfcmVwb3J0ZXJfLnJlc2V0KCk7CiAgIHByb2ZpbGVfID0gbnVsbHB0cjsKICAgc3RhdGVfID0gU3RhdGU6Ok5PVF9JTklUSUFMSVpFRDsKICAgaWYgKHNjb3BlZF9vcHRfaW5fdHJhY2tlcl8pIHsKQEAgLTY3OSw3ICs2ODEsOSBAQAogICAvLyB0aGUgaW5pdGlhbCByZXF1ZXN0LgogICAvLyB8cHJlZnM6OmtBcmNQcm92aXNpb25pbmdJbml0aWF0ZWRGcm9tT29iZXwgaXMgcmVzZXQgd2hlbiBwcm92aXNpb25pbmcgaXMKICAgLy8gZG9uZSBvciBBUkMgaXMgb3B0ZWQgb3V0LgotICBpZiAoSXNBcmNPb2JlT3B0SW5BY3RpdmUoKSkKKyAgY29uc3QgYm9vbCBvcHRfaW5fc3RhcnQgPSBJc0FyY09vYmVPcHRJbkFjdGl2ZSgpOworICBjb25zdCBib29sIHNpZ25lZF9pbiA9IHByZWZzLT5HZXRCb29sZWFuKHByZWZzOjprQXJjU2lnbmVkSW4pOworICBpZiAob3B0X2luX3N0YXJ0KQogICAgIHByZWZzLT5TZXRCb29sZWFuKHByZWZzOjprQXJjUHJvdmlzaW9uaW5nSW5pdGlhdGVkRnJvbU9vYmUsIHRydWUpOwogCiAgIC8vIElmIGl0IGlzIG1hcmtlZCB0aGF0IHNpZ24gaW4gaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGRvbmUgb3IgaWYgUGxheSBTdG9yZSBpcwpAQCAtNjg5LDkgKzY5Myw5IEBACiAgIC8vIEluIFB1YmxpYyBTZXNzaW9uIG1vZGUgQVJDIHNob3VsZCBiZSBzdGFydGVkIHNpbGVudGx5IHdpdGhvdXQgdXNlcgogICAvLyBpbnRlcmFjdGlvbi4gSWYgb3B0LWluIHZlcmlmaWNhdGlvbiBpcyBkaXNhYmxlZCwgc2tpcCBuZWdvdGlhdGlvbiwgdG9vLgogICAvLyBUaGlzIGlzIGZvciB0ZXN0aW5nIHB1cnBvc2UuCi0gIGNvbnN0IGJvb2wgc3RhcnRfYXJjX2RpcmVjdGx5ID0KLSAgICAgIHByZWZzLT5HZXRCb29sZWFuKHByZWZzOjprQXJjU2lnbmVkSW4pIHx8IFNob3VsZEFyY0Fsd2F5c1N0YXJ0KCkgfHwKLSAgICAgIElzUm9ib3RPck9mZmxpbmVEZW1vQWNjb3VudE1vZGUoKSB8fCBJc0FyY09wdEluVmVyaWZpY2F0aW9uRGlzYWJsZWQoKTsKKyAgY29uc3QgYm9vbCBzdGFydF9hcmNfZGlyZWN0bHkgPSBzaWduZWRfaW4gfHwgU2hvdWxkQXJjQWx3YXlzU3RhcnQoKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzUm9ib3RPck9mZmxpbmVEZW1vQWNjb3VudE1vZGUoKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzQXJjT3B0SW5WZXJpZmljYXRpb25EaXNhYmxlZCgpOwogCiAgIC8vIFdoZW4gQVJDIGlzIGJsb2NrZWQgYmVjYXVzZSBvZiBmaWxlc3lzdGVtIGNvbXBhdGliaWxpdHksIGRvIG5vdCBwcm9jZWVkCiAgIC8vIHRvIHN0YXJ0aW5nIEFSQyBub3IgZm9sbG93IGZ1cnRoZXIgc3RhdGUgdHJhbnNpdGlvbnMuCkBAIC03MDMsNiArNzA3LDE4IEBACiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKKyAgLy8gQVJDIG1pZ2h0IGJlIHJlLWVuYWJsZWQgYW5kIGluIHRoaXMgY2FzZSB8YXJjX3VpX2F2YWlsYWJpbGl0eV9yZXBvcnRlcl98IGlzCisgIC8vIGFscmVhZHkgc2V0LgorICBpZiAoIWFyY191aV9hdmFpbGFiaWxpdHlfcmVwb3J0ZXJfKSB7CisgICAgYXJjX3VpX2F2YWlsYWJpbGl0eV9yZXBvcnRlcl8gPSBzdGQ6Om1ha2VfdW5pcXVlPEFyY1VpQXZhaWxhYmlsaXR5UmVwb3J0ZXI+KAorICAgICAgICBwcm9maWxlXywKKyAgICAgICAgb3B0X2luX3N0YXJ0CisgICAgICAgICAgICA/IEFyY1VpQXZhaWxhYmlsaXR5UmVwb3J0ZXI6Ok1vZGU6OmtPb2JlUHJvdmlzaW9uaW5nCisgICAgICAgICAgICA6IHNpZ25lZF9pbgorICAgICAgICAgICAgICAgICAgPyBBcmNVaUF2YWlsYWJpbGl0eVJlcG9ydGVyOjpNb2RlOjprQWxyZWFkeVByb3Zpc2lvbmVkCisgICAgICAgICAgICAgICAgICA6IEFyY1VpQXZhaWxhYmlsaXR5UmVwb3J0ZXI6Ok1vZGU6OmtJblNlc3Npb25Qcm92aXNpb25pbmcpOworICB9CisKICAgaWYgKCFwYWlfc3RhcnRlcl8gJiYgSXNQbGF5U3RvcmVBdmFpbGFibGUoKSkKICAgICBwYWlfc3RhcnRlcl8gPSBBcmNQYWlTdGFydGVyOjpDcmVhdGVJZk5lZWRlZChwcm9maWxlXyk7CiAKQEAgLTc1Miw2ICs3NjgsNyBAQAogICBzY29wZWRfb3B0X2luX3RyYWNrZXJfLnJlc2V0KCk7CiAgIHBhaV9zdGFydGVyXy5yZXNldCgpOwogICBmYXN0X2FwcF9yZWluc3RhbGxfc3RhcnRlcl8ucmVzZXQoKTsKKyAgYXJjX3VpX2F2YWlsYWJpbGl0eV9yZXBvcnRlcl8ucmVzZXQoKTsKIAogICAvLyBSZXNldCBhbnkgcGVuZGluZyByZXF1ZXN0IHRvIHJlLWVuYWJsZSBBUkMuCiAgIHJlZW5hYmxlX2FyY18gPSBmYWxzZTsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2FyYy9zZXNzaW9uL2FyY19zZXNzaW9uX21hbmFnZXIuaCBiL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2FyYy9zZXNzaW9uL2FyY19zZXNzaW9uX21hbmFnZXIuaAppbmRleCA1YWQ5ZWIwLi40YmQxYWNjYiAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvYXJjL3Nlc3Npb24vYXJjX3Nlc3Npb25fbWFuYWdlci5oCisrKyBiL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2FyYy9zZXNzaW9uL2FyY19zZXNzaW9uX21hbmFnZXIuaApAQCAtMjksNiArMjksOCBAQAogY2xhc3MgQXJjRmFzdEFwcFJlaW5zdGFsbFN0YXJ0ZXI7CiBjbGFzcyBBcmNQYWlTdGFydGVyOwogY2xhc3MgQXJjVGVybXNPZlNlcnZpY2VOZWdvdGlhdG9yOworY2xhc3MgQXJjVWlBdmFpbGFiaWxpdHlSZXBvcnRlcjsKKwogZW51bSBjbGFzcyBQcm92aXNpb25pbmdSZXN1bHQgOiBpbnQ7CiAKIC8vIFRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIGhhbmRpbmcgc3RhZ2VzIG9mIEFSQyBsaWZlLWN5Y2xlLgpAQCAtMzc1LDYgKzM3Nyw3IEBACiAgIHN0ZDo6dW5pcXVlX3B0cjxTY29wZWRPcHRJbkZsb3dUcmFja2VyPiBzY29wZWRfb3B0X2luX3RyYWNrZXJfOwogICBzdGQ6OnVuaXF1ZV9wdHI8QXJjUGFpU3RhcnRlcj4gcGFpX3N0YXJ0ZXJfOwogICBzdGQ6OnVuaXF1ZV9wdHI8QXJjRmFzdEFwcFJlaW5zdGFsbFN0YXJ0ZXI+IGZhc3RfYXBwX3JlaW5zdGFsbF9zdGFydGVyXzsKKyAgc3RkOjp1bmlxdWVfcHRyPEFyY1VpQXZhaWxhYmlsaXR5UmVwb3J0ZXI+IGFyY191aV9hdmFpbGFiaWxpdHlfcmVwb3J0ZXJfOwogCiAgIC8vIFRoZSB0aW1lIHdoZW4gdGhlIHNpZ24gaW4gcHJvY2VzcyBzdGFydGVkLgogICBiYXNlOjpUaW1lVGlja3Mgc2lnbl9pbl9zdGFydF90aW1lXzsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2RyaXZlL2RyaXZlX2ludGVncmF0aW9uX3NlcnZpY2UuaCBiL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2RyaXZlL2RyaXZlX2ludGVncmF0aW9uX3NlcnZpY2UuaAppbmRleCA0NWFhNGNkLi43NjA4NTBmZSAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvZHJpdmUvZHJpdmVfaW50ZWdyYXRpb25fc2VydmljZS5oCisrKyBiL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2RyaXZlL2RyaXZlX2ludGVncmF0aW9uX3NlcnZpY2UuaApAQCAtMzA1LDggKzMwNSw5IEBACiAKICAgYmFzZTo6VGltZVRpY2tzIG1vdW50X3N0YXJ0XzsKIAotICBTY29wZWRPYnNlcnZlcjxjaHJvbWVvczo6UG93ZXJNYW5hZ2VyQ2xpZW50LCBEcml2ZUludGVncmF0aW9uU2VydmljZT4KLSAgICAgIHBvd2VyX21hbmFnZXJfb2JzZXJ2ZXJfOworICBTY29wZWRPYnNlcnZlcjxjaHJvbWVvczo6UG93ZXJNYW5hZ2VyQ2xpZW50LAorICAgICAgICAgICAgICAgICBjaHJvbWVvczo6UG93ZXJNYW5hZ2VyQ2xpZW50OjpPYnNlcnZlcj4KKyAgICAgIHBvd2VyX21hbmFnZXJfb2JzZXJ2ZXJfe3RoaXN9OwogCiAgIC8vIE5vdGU6IFRoaXMgc2hvdWxkIHJlbWFpbiB0aGUgbGFzdCBtZW1iZXIgc28gaXQnbGwgYmUgZGVzdHJveWVkIGFuZAogICAvLyBpbnZhbGlkYXRlIGl0cyB3ZWFrIHBvaW50ZXJzIGJlZm9yZSBhbnkgb3RoZXIgbWVtYmVycyBhcmUgZGVzdHJveWVkLgpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvZXh0ZW5zaW9ucy9sb2dpbl9zY3JlZW4vbG9naW5fc2NyZWVuX3VpL2xvZ2luX3NjcmVlbl9leHRlbnNpb25fdWlfaGFuZGxlci5jYyBiL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2V4dGVuc2lvbnMvbG9naW5fc2NyZWVuL2xvZ2luX3NjcmVlbl91aS9sb2dpbl9zY3JlZW5fZXh0ZW5zaW9uX3VpX2hhbmRsZXIuY2MKaW5kZXggZTNlYTA0MTMuLjRlMDdlMDcgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2V4dGVuc2lvbnMvbG9naW5fc2NyZWVuL2xvZ2luX3NjcmVlbl91aS9sb2dpbl9zY3JlZW5fZXh0ZW5zaW9uX3VpX2hhbmRsZXIuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvZXh0ZW5zaW9ucy9sb2dpbl9zY3JlZW4vbG9naW5fc2NyZWVuX3VpL2xvZ2luX3NjcmVlbl9leHRlbnNpb25fdWlfaGFuZGxlci5jYwpAQCAtMTUsNyArMTUsNiBAQAogI2luY2x1ZGUgImNocm9tZW9zL3RwbS9pbnN0YWxsX2F0dHJpYnV0ZXMuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL3Nlc3Npb25fbWFuYWdlci9jb3JlL3Nlc3Npb25fbWFuYWdlci5oIgogI2luY2x1ZGUgImNvbnRlbnQvcHVibGljL2Jyb3dzZXIvYnJvd3Nlcl90aHJlYWQuaCIKLSNpbmNsdWRlICJleHRlbnNpb25zL2Jyb3dzZXIvZXh0ZW5zaW9uX3JlZ2lzdHJ5LmgiCiAjaW5jbHVkZSAiZXh0ZW5zaW9ucy9jb21tb24vY29uc3RhbnRzLmgiCiAjaW5jbHVkZSAiZXh0ZW5zaW9ucy9jb21tb24vZXh0ZW5zaW9uLmgiCiAjaW5jbHVkZSAiZXh0ZW5zaW9ucy9jb21tb24vcGVybWlzc2lvbnMvcGVybWlzc2lvbnNfZGF0YS5oIgpAQCAtOTQsOSArOTMsNyBAQAogCiBMb2dpblNjcmVlbkV4dGVuc2lvblVpSGFuZGxlcjo6TG9naW5TY3JlZW5FeHRlbnNpb25VaUhhbmRsZXIoCiAgICAgc3RkOjp1bmlxdWVfcHRyPExvZ2luU2NyZWVuRXh0ZW5zaW9uVWlXaW5kb3dGYWN0b3J5PiB3aW5kb3dfZmFjdG9yeSkKLSAgICA6IHdpbmRvd19mYWN0b3J5XyhzdGQ6Om1vdmUod2luZG93X2ZhY3RvcnkpKSwKLSAgICAgIHNlc3Npb25fbWFuYWdlcl9vYnNlcnZlcl8odGhpcyksCi0gICAgICBleHRlbnNpb25fcmVnaXN0cnlfb2JzZXJ2ZXJfKHRoaXMpIHsKKyAgICA6IHdpbmRvd19mYWN0b3J5XyhzdGQ6Om1vdmUod2luZG93X2ZhY3RvcnkpKSB7CiAgIFVwZGF0ZVNlc3Npb25TdGF0ZSgpOwogICBzZXNzaW9uX21hbmFnZXJfb2JzZXJ2ZXJfLkFkZChzZXNzaW9uX21hbmFnZXI6OlNlc3Npb25NYW5hZ2VyOjpHZXQoKSk7CiAgIGV4dGVuc2lvbl9yZWdpc3RyeV9vYnNlcnZlcl8uQWRkKApkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvZXh0ZW5zaW9ucy9sb2dpbl9zY3JlZW4vbG9naW5fc2NyZWVuX3VpL2xvZ2luX3NjcmVlbl9leHRlbnNpb25fdWlfaGFuZGxlci5oIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvZXh0ZW5zaW9ucy9sb2dpbl9zY3JlZW4vbG9naW5fc2NyZWVuX3VpL2xvZ2luX3NjcmVlbl9leHRlbnNpb25fdWlfaGFuZGxlci5oCmluZGV4IGU4NDdmMWYuLjg5OTI5ZGExIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9leHRlbnNpb25zL2xvZ2luX3NjcmVlbi9sb2dpbl9zY3JlZW5fdWkvbG9naW5fc2NyZWVuX2V4dGVuc2lvbl91aV9oYW5kbGVyLmgKKysrIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvZXh0ZW5zaW9ucy9sb2dpbl9zY3JlZW4vbG9naW5fc2NyZWVuX3VpL2xvZ2luX3NjcmVlbl9leHRlbnNpb25fdWlfaGFuZGxlci5oCkBAIC0xMCwxOCArMTAsMTUgQEAKIAogI2luY2x1ZGUgImJhc2UvbWVtb3J5L3dlYWtfcHRyLmgiCiAjaW5jbHVkZSAiYmFzZS9zY29wZWRfb2JzZXJ2ZXIuaCIKKyNpbmNsdWRlICJjb21wb25lbnRzL3Nlc3Npb25fbWFuYWdlci9jb3JlL3Nlc3Npb25fbWFuYWdlci5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvc2Vzc2lvbl9tYW5hZ2VyL2NvcmUvc2Vzc2lvbl9tYW5hZ2VyX29ic2VydmVyLmgiCisjaW5jbHVkZSAiZXh0ZW5zaW9ucy9icm93c2VyL2V4dGVuc2lvbl9yZWdpc3RyeS5oIgogI2luY2x1ZGUgImV4dGVuc2lvbnMvYnJvd3Nlci9leHRlbnNpb25fcmVnaXN0cnlfb2JzZXJ2ZXIuaCIKIAogbmFtZXNwYWNlIGV4dGVuc2lvbnMgewogY2xhc3MgRXh0ZW5zaW9uOwotY2xhc3MgRXh0ZW5zaW9uUmVnaXN0cnk7CiB9ICAvLyBuYW1lc3BhY2UgZXh0ZW5zaW9ucwogCi1uYW1lc3BhY2Ugc2Vzc2lvbl9tYW5hZ2VyIHsKLWNsYXNzIFNlc3Npb25NYW5hZ2VyOwotfQotCiBuYW1lc3BhY2UgY2hyb21lb3MgewogCiBjbGFzcyBMb2dpblNjcmVlbkV4dGVuc2lvblVpV2luZG93OwpAQCAtOTUsMTAgKzkyLDEwIEBACiAKICAgU2NvcGVkT2JzZXJ2ZXI8c2Vzc2lvbl9tYW5hZ2VyOjpTZXNzaW9uTWFuYWdlciwKICAgICAgICAgICAgICAgICAgc2Vzc2lvbl9tYW5hZ2VyOjpTZXNzaW9uTWFuYWdlck9ic2VydmVyPgotICAgICAgc2Vzc2lvbl9tYW5hZ2VyX29ic2VydmVyXzsKKyAgICAgIHNlc3Npb25fbWFuYWdlcl9vYnNlcnZlcl97dGhpc307CiAgIFNjb3BlZE9ic2VydmVyPGV4dGVuc2lvbnM6OkV4dGVuc2lvblJlZ2lzdHJ5LAogICAgICAgICAgICAgICAgICBleHRlbnNpb25zOjpFeHRlbnNpb25SZWdpc3RyeU9ic2VydmVyPgotICAgICAgZXh0ZW5zaW9uX3JlZ2lzdHJ5X29ic2VydmVyXzsKKyAgICAgIGV4dGVuc2lvbl9yZWdpc3RyeV9vYnNlcnZlcl97dGhpc307CiAKICAgYmFzZTo6V2Vha1B0ckZhY3Rvcnk8TG9naW5TY3JlZW5FeHRlbnNpb25VaUhhbmRsZXI+IHdlYWtfcHRyX2ZhY3Rvcnlfe3RoaXN9OwogCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9maWxlX21hbmFnZXIvZmlsZV9tYW5hZ2VyX2pzdGVzdC5jYyBiL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2ZpbGVfbWFuYWdlci9maWxlX21hbmFnZXJfanN0ZXN0LmNjCmluZGV4IDMyOTMzYzQuLmZjOWVkYmM2MSAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvZmlsZV9tYW5hZ2VyL2ZpbGVfbWFuYWdlcl9qc3Rlc3QuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvZmlsZV9tYW5hZ2VyL2ZpbGVfbWFuYWdlcl9qc3Rlc3QuY2MKQEAgLTE5MSw2ICsxOTEsMTAgQEAKICAgUnVuVGVzdFVSTCgiZm9yZWdyb3VuZC9qcy91aS9maWxlX2xpc3Rfc2VsZWN0aW9uX21vZGVsX3VuaXR0ZXN0X2dlbi5odG1sIik7CiB9CiAKK0lOX1BST0NfQlJPV1NFUl9URVNUX0YoRmlsZU1hbmFnZXJKc1Rlc3QsIEZpbGVNYW5hZ2VyRGlhbG9nQmFzZVRlc3QpIHsKKyAgUnVuVGVzdFVSTCgiZm9yZWdyb3VuZC9qcy91aS9maWxlX21hbmFnZXJfZGlhbG9nX2Jhc2VfdW5pdHRlc3RfZ2VuLmh0bWwiKTsKK30KKwogSU5fUFJPQ19CUk9XU0VSX1RFU1RfRihGaWxlTWFuYWdlckpzVGVzdCwgTXVsdGlNZW51KSB7CiAgIFJ1blRlc3RVUkwoImZvcmVncm91bmQvanMvdWkvbXVsdGlfbWVudV91bml0dGVzdF9nZW4uaHRtbCIpOwogfQpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3Mva2VyYmVyb3Mva2VyYmVyb3NfY3JlZGVudGlhbHNfbWFuYWdlci5jYyBiL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2tlcmJlcm9zL2tlcmJlcm9zX2NyZWRlbnRpYWxzX21hbmFnZXIuY2MKaW5kZXggN2RjOGEwNC4uYTAzYzBkOCAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3Mva2VyYmVyb3Mva2VyYmVyb3NfY3JlZGVudGlhbHNfbWFuYWdlci5jYworKysgYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9rZXJiZXJvcy9rZXJiZXJvc19jcmVkZW50aWFsc19tYW5hZ2VyLmNjCkBAIC00MTksNyArNDE5LDcgQEAKICAgb2JzZXJ2ZXJzXy5BZGRPYnNlcnZlcihvYnNlcnZlcik7CiB9CiAKLXZvaWQgS2VyYmVyb3NDcmVkZW50aWFsc01hbmFnZXI6OlJlbW92ZU9ic2VydmVyKGNvbnN0IE9ic2VydmVyKiBvYnNlcnZlcikgewordm9pZCBLZXJiZXJvc0NyZWRlbnRpYWxzTWFuYWdlcjo6UmVtb3ZlT2JzZXJ2ZXIoT2JzZXJ2ZXIqIG9ic2VydmVyKSB7CiAgIG9ic2VydmVyc18uUmVtb3ZlT2JzZXJ2ZXIob2JzZXJ2ZXIpOwogfQogCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9rZXJiZXJvcy9rZXJiZXJvc19jcmVkZW50aWFsc19tYW5hZ2VyLmggYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9rZXJiZXJvcy9rZXJiZXJvc19jcmVkZW50aWFsc19tYW5hZ2VyLmgKaW5kZXggMGUxOWI4Zi4uMjg2OTcyNyAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3Mva2VyYmVyb3Mva2VyYmVyb3NfY3JlZGVudGlhbHNfbWFuYWdlci5oCisrKyBiL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2tlcmJlcm9zL2tlcmJlcm9zX2NyZWRlbnRpYWxzX21hbmFnZXIuaApAQCAtODgsNyArODgsNyBAQAogICB2b2lkIEFkZE9ic2VydmVyKE9ic2VydmVyKiBvYnNlcnZlcik7CiAKICAgLy8gU3RvcCBvYnNlcnZpbmcgdGhpcyBvYmplY3QuIHxvYnNlcnZlcnwgaXMgbm90IG93bmVkLgotICB2b2lkIFJlbW92ZU9ic2VydmVyKGNvbnN0IE9ic2VydmVyKiBvYnNlcnZlcik7CisgIHZvaWQgUmVtb3ZlT2JzZXJ2ZXIoT2JzZXJ2ZXIqIG9ic2VydmVyKTsKIAogICAvLyBBZGRzIGFuIGFjY291bnQgZm9yIHRoZSBnaXZlbiB8cHJpbmNpcGFsX25hbWV8ICh1c2VyQGV4YW1wbGUuY29tKS4gSWYKICAgLy8gfGlzX21hbmFnZWR8IGlzIHRydWUsIHRoZSBhY2NvdW50IGlzIGFzc3VtZWQgdG8gYmUgbWFuYWdlZCBieSBhbiBhZG1pbiBhbmQKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2xvY2tfc2NyZWVuX2FwcHMvZmlyc3RfYXBwX3J1bl90b2FzdF9tYW5hZ2VyLmNjIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9ja19zY3JlZW5fYXBwcy9maXJzdF9hcHBfcnVuX3RvYXN0X21hbmFnZXIuY2MKaW5kZXggMjYzODFiOC4uMjk0YjJjNiAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9ja19zY3JlZW5fYXBwcy9maXJzdF9hcHBfcnVuX3RvYXN0X21hbmFnZXIuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9ja19zY3JlZW5fYXBwcy9maXJzdF9hcHBfcnVuX3RvYXN0X21hbmFnZXIuY2MKQEAgLTE5LDcgKzE5LDYgQEAKICNpbmNsdWRlICJ1aS9nZngvZ2VvbWV0cnkvcG9pbnQuaCIKICNpbmNsdWRlICJ1aS9nZngvZ2VvbWV0cnkvcmVjdC5oIgogI2luY2x1ZGUgInVpL2dmeC9nZW9tZXRyeS9zaXplLmgiCi0jaW5jbHVkZSAidWkvdmlld3Mvd2lkZ2V0L3dpZGdldC5oIgogCiBuYW1lc3BhY2UgbG9ja19zY3JlZW5fYXBwcyB7CiAKQEAgLTYzLDkgKzYyLDcgQEAKIH07CiAKIEZpcnN0QXBwUnVuVG9hc3RNYW5hZ2VyOjpGaXJzdEFwcFJ1blRvYXN0TWFuYWdlcihQcm9maWxlKiBwcm9maWxlKQotICAgIDogcHJvZmlsZV8ocHJvZmlsZSksCi0gICAgICB0b2FzdF93aWRnZXRfb2JzZXJ2ZXJfKHRoaXMpLAotICAgICAgYXBwX3dpbmRvd19vYnNlcnZlcl8odGhpcykge30KKyAgICA6IHByb2ZpbGVfKHByb2ZpbGUpIHt9CiAKIEZpcnN0QXBwUnVuVG9hc3RNYW5hZ2VyOjp+Rmlyc3RBcHBSdW5Ub2FzdE1hbmFnZXIoKSB7CiAgIFJlc2V0KCk7CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2NrX3NjcmVlbl9hcHBzL2ZpcnN0X2FwcF9ydW5fdG9hc3RfbWFuYWdlci5oIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9ja19zY3JlZW5fYXBwcy9maXJzdF9hcHBfcnVuX3RvYXN0X21hbmFnZXIuaAppbmRleCA0ZTdlYzg2Yy4uNzkxMGU3NyAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9ja19zY3JlZW5fYXBwcy9maXJzdF9hcHBfcnVuX3RvYXN0X21hbmFnZXIuaAorKysgYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2NrX3NjcmVlbl9hcHBzL2ZpcnN0X2FwcF9ydW5fdG9hc3RfbWFuYWdlci5oCkBAIC05LDE1ICs5LDExIEBACiAjaW5jbHVkZSAiYmFzZS9tZW1vcnkvd2Vha19wdHIuaCIKICNpbmNsdWRlICJiYXNlL3Njb3BlZF9vYnNlcnZlci5oIgogI2luY2x1ZGUgImV4dGVuc2lvbnMvYnJvd3Nlci9hcHBfd2luZG93L2FwcF93aW5kb3dfcmVnaXN0cnkuaCIKLSNpbmNsdWRlICJ1aS9hdXJhL3dpbmRvd19vYnNlcnZlci5oIgorI2luY2x1ZGUgInVpL3ZpZXdzL3dpZGdldC93aWRnZXQuaCIKICNpbmNsdWRlICJ1aS92aWV3cy93aWRnZXQvd2lkZ2V0X29ic2VydmVyLmgiCiAKIGNsYXNzIFByb2ZpbGU7CiAKLW5hbWVzcGFjZSB2aWV3cyB7Ci1jbGFzcyBXaWRnZXQ7Ci19Ci0KIG5hbWVzcGFjZSBleHRlbnNpb25zIHsKIGNsYXNzIEFwcFdpbmRvdzsKIH0KQEAgLTc3LDEwICs3MywxMSBAQAogICAvLyBUaGUgd2lkZ2V0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlyc3QgcnVuIGRpYWxvZywgaWYgdGhlIGRpYWxvZyBpcyBzaG93bi4KICAgdmlld3M6OldpZGdldCogdG9hc3Rfd2lkZ2V0XyA9IG51bGxwdHI7CiAKLSAgU2NvcGVkT2JzZXJ2ZXI8dmlld3M6OldpZGdldCwgdmlld3M6OldpZGdldE9ic2VydmVyPiB0b2FzdF93aWRnZXRfb2JzZXJ2ZXJfOworICBTY29wZWRPYnNlcnZlcjx2aWV3czo6V2lkZ2V0LCB2aWV3czo6V2lkZ2V0T2JzZXJ2ZXI+IHRvYXN0X3dpZGdldF9vYnNlcnZlcl97CisgICAgICB0aGlzfTsKICAgU2NvcGVkT2JzZXJ2ZXI8ZXh0ZW5zaW9uczo6QXBwV2luZG93UmVnaXN0cnksCiAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnM6OkFwcFdpbmRvd1JlZ2lzdHJ5OjpPYnNlcnZlcj4KLSAgICAgIGFwcF93aW5kb3dfb2JzZXJ2ZXJfOworICAgICAgYXBwX3dpbmRvd19vYnNlcnZlcl97dGhpc307CiAKICAgY2xhc3MgQXBwV2lkZ2V0T2JzZXJ2ZXI7CiAgIHN0ZDo6dW5pcXVlX3B0cjxBcHBXaWRnZXRPYnNlcnZlcj4gYXBwX3dpZGdldF9vYnNlcnZlcl87CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2NrX3NjcmVlbl9hcHBzL3N0YXRlX2NvbnRyb2xsZXIuY2MgYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2NrX3NjcmVlbl9hcHBzL3N0YXRlX2NvbnRyb2xsZXIuY2MKaW5kZXggY2U2YmZjMi4uNzk1N2E0ZGUgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2xvY2tfc2NyZWVuX2FwcHMvc3RhdGVfY29udHJvbGxlci5jYworKysgYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2NrX3NjcmVlbl9hcHBzL3N0YXRlX2NvbnRyb2xsZXIuY2MKQEAgLTI5LDcgKzI5LDYgQEAKICNpbmNsdWRlICJjaHJvbWVvcy9kYnVzL2RidXNfdGhyZWFkX21hbmFnZXIuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL3ByZWZzL3ByZWZfcmVnaXN0cnlfc2ltcGxlLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9wcmVmcy9wcmVmX3NlcnZpY2UuaCIKLSNpbmNsdWRlICJjb21wb25lbnRzL3Nlc3Npb25fbWFuYWdlci9jb3JlL3Nlc3Npb25fbWFuYWdlci5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvdXNlcl9tYW5hZ2VyL3VzZXIuaCIKICNpbmNsdWRlICJjb250ZW50L3B1YmxpYy9icm93c2VyL3N5c3RlbV9jb25uZWN0b3IuaCIKICNpbmNsdWRlICJjb250ZW50L3B1YmxpYy9icm93c2VyL3dlYl9jb250ZW50cy5oIgpAQCAtMzksNyArMzgsNiBAQAogI2luY2x1ZGUgImV4dGVuc2lvbnMvYnJvd3Nlci9hcHBfd2luZG93L25hdGl2ZV9hcHBfd2luZG93LmgiCiAjaW5jbHVkZSAiZXh0ZW5zaW9ucy9jb21tb24vZXh0ZW5zaW9uLmgiCiAjaW5jbHVkZSAic2VydmljZXMvc2VydmljZV9tYW5hZ2VyL3B1YmxpYy9jcHAvY29ubmVjdG9yLmgiCi0jaW5jbHVkZSAidWkvZXZlbnRzL2RldmljZXMvZGV2aWNlX2RhdGFfbWFuYWdlci5oIgogI2luY2x1ZGUgInVpL3dtL2NvcmUvd2luZG93X2FuaW1hdGlvbnMuaCIKIAogdXNpbmcgYXNoOjptb2pvbTo6Q2xvc2VMb2NrU2NyZWVuTm90ZVJlYXNvbjsKQEAgLTc4LDEzICs3Niw3IEBACiAgIHJlZ2lzdHJ5LT5SZWdpc3RlclN0cmluZ1ByZWYoa0RhdGFDcnlwdG9LZXlQcmVmLCAiIik7CiB9CiAKLVN0YXRlQ29udHJvbGxlcjo6U3RhdGVDb250cm9sbGVyKCkKLSAgICA6IGJpbmRpbmdfKHRoaXMpLAotICAgICAgbm90ZV93aW5kb3dfb2JzZXJ2ZXJfKHRoaXMpLAotICAgICAgYXBwX3dpbmRvd19vYnNlcnZlcl8odGhpcyksCi0gICAgICBzZXNzaW9uX29ic2VydmVyXyh0aGlzKSwKLSAgICAgIGlucHV0X2RldmljZXNfb2JzZXJ2ZXJfKHRoaXMpLAotICAgICAgcG93ZXJfbWFuYWdlcl9jbGllbnRfb2JzZXJ2ZXJfKHRoaXMpIHsKK1N0YXRlQ29udHJvbGxlcjo6U3RhdGVDb250cm9sbGVyKCkgewogICBEQ0hFQ0soIWdfc3RhdGVfY29udHJvbGxlcl9pbnN0YW5jZSk7CiAKICAgZ19zdGF0ZV9jb250cm9sbGVyX2luc3RhbmNlID0gdGhpczsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2xvY2tfc2NyZWVuX2FwcHMvc3RhdGVfY29udHJvbGxlci5oIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9ja19zY3JlZW5fYXBwcy9zdGF0ZV9jb250cm9sbGVyLmgKaW5kZXggMzc3MWYzZDMuLjFmZWY2Y2UgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2xvY2tfc2NyZWVuX2FwcHMvc3RhdGVfY29udHJvbGxlci5oCisrKyBiL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2xvY2tfc2NyZWVuX2FwcHMvc3RhdGVfY29udHJvbGxlci5oCkBAIC0xNywyMCArMTcsMTggQEAKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2NrX3NjcmVlbl9hcHBzL2FwcF9tYW5hZ2VyLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9ja19zY3JlZW5fYXBwcy9zdGF0ZV9vYnNlcnZlci5oIgogI2luY2x1ZGUgImNocm9tZW9zL2RidXMvcG93ZXIvcG93ZXJfbWFuYWdlcl9jbGllbnQuaCIKKyNpbmNsdWRlICJjb21wb25lbnRzL3Nlc3Npb25fbWFuYWdlci9jb3JlL3Nlc3Npb25fbWFuYWdlci5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvc2Vzc2lvbl9tYW5hZ2VyL2NvcmUvc2Vzc2lvbl9tYW5hZ2VyX29ic2VydmVyLmgiCiAjaW5jbHVkZSAiZXh0ZW5zaW9ucy9icm93c2VyL2FwcF93aW5kb3cvYXBwX3dpbmRvd19yZWdpc3RyeS5oIgogI2luY2x1ZGUgImV4dGVuc2lvbnMvY29tbW9uL2FwaS9hcHBfcnVudGltZS5oIgogI2luY2x1ZGUgIm1vam8vcHVibGljL2NwcC9iaW5kaW5ncy9iaW5kaW5nLmgiCiAjaW5jbHVkZSAidWkvYXVyYS93aW5kb3cuaCIKKyNpbmNsdWRlICJ1aS9ldmVudHMvZGV2aWNlcy9kZXZpY2VfZGF0YV9tYW5hZ2VyLmgiCiAjaW5jbHVkZSAidWkvZXZlbnRzL2RldmljZXMvaW5wdXRfZGV2aWNlX2V2ZW50X29ic2VydmVyLmgiCiAKIGNsYXNzIFByZWZSZWdpc3RyeVNpbXBsZTsKIGNsYXNzIFByb2ZpbGU7CiAKLW5hbWVzcGFjZSBhdXJhIHsKLWNsYXNzIFdpbmRvdzsKLX0KLQogbmFtZXNwYWNlIGJhc2UgewogY2xhc3MgVGlja0Nsb2NrOwogfQpAQCAtNDksMTQgKzQ3LDYgQEAKIH0KIH0gIC8vIG5hbWVzcGFjZSBleHRlbnNpb25zCiAKLW5hbWVzcGFjZSBzZXNzaW9uX21hbmFnZXIgewotY2xhc3MgU2Vzc2lvbk1hbmFnZXI7Ci19Ci0KLW5hbWVzcGFjZSB1aSB7Ci1jbGFzcyBEZXZpY2VEYXRhTWFuYWdlcjsKLX0KLQogbmFtZXNwYWNlIGxvY2tfc2NyZWVuX2FwcHMgewogCiBjbGFzcyBBcHBXaW5kb3dNZXRyaWNzVHJhY2tlcjsKQEAgLTIyMCw3ICsyMTAsNyBAQAogCiAgIGJhc2U6Ok9ic2VydmVyTGlzdDxTdGF0ZU9ic2VydmVyPjo6VW5jaGVja2VkIG9ic2VydmVyc187CiAKLSAgbW9qbzo6QmluZGluZzxhc2g6Om1vam9tOjpUcmF5QWN0aW9uQ2xpZW50PiBiaW5kaW5nXzsKKyAgbW9qbzo6QmluZGluZzxhc2g6Om1vam9tOjpUcmF5QWN0aW9uQ2xpZW50PiBiaW5kaW5nX3t0aGlzfTsKICAgYXNoOjptb2pvbTo6VHJheUFjdGlvblB0ciB0cmF5X2FjdGlvbl9wdHJfOwogCiAgIHN0ZDo6dW5pcXVlX3B0cjxMb2NrU2NyZWVuUHJvZmlsZUNyZWF0b3I+IGxvY2tfc2NyZWVuX3Byb2ZpbGVfY3JlYXRvcl87CkBAIC0yNTEsMTggKzI0MSwxOSBAQAogICAvLyBmb3IgdGhlIGFzc29jaWF0ZWQgYXBwIGhhcyBiZWVuIHByZXZpb3NseSBzZWVuIChhbmQgY2xvc2VkKSBieSB0aGUgdXNlci4KICAgc3RkOjp1bmlxdWVfcHRyPEZpcnN0QXBwUnVuVG9hc3RNYW5hZ2VyPiBmaXJzdF9hcHBfcnVuX3RvYXN0X21hbmFnZXJfOwogCi0gIFNjb3BlZE9ic2VydmVyPGF1cmE6OldpbmRvdywgYXVyYTo6V2luZG93T2JzZXJ2ZXI+IG5vdGVfd2luZG93X29ic2VydmVyXzsKKyAgU2NvcGVkT2JzZXJ2ZXI8YXVyYTo6V2luZG93LCBhdXJhOjpXaW5kb3dPYnNlcnZlcj4gbm90ZV93aW5kb3dfb2JzZXJ2ZXJfeworICAgICAgdGhpc307CiAgIFNjb3BlZE9ic2VydmVyPGV4dGVuc2lvbnM6OkFwcFdpbmRvd1JlZ2lzdHJ5LAogICAgICAgICAgICAgICAgICBleHRlbnNpb25zOjpBcHBXaW5kb3dSZWdpc3RyeTo6T2JzZXJ2ZXI+Ci0gICAgICBhcHBfd2luZG93X29ic2VydmVyXzsKKyAgICAgIGFwcF93aW5kb3dfb2JzZXJ2ZXJfe3RoaXN9OwogICBTY29wZWRPYnNlcnZlcjxzZXNzaW9uX21hbmFnZXI6OlNlc3Npb25NYW5hZ2VyLAogICAgICAgICAgICAgICAgICBzZXNzaW9uX21hbmFnZXI6OlNlc3Npb25NYW5hZ2VyT2JzZXJ2ZXI+Ci0gICAgICBzZXNzaW9uX29ic2VydmVyXzsKKyAgICAgIHNlc3Npb25fb2JzZXJ2ZXJfe3RoaXN9OwogICBTY29wZWRPYnNlcnZlcjx1aTo6RGV2aWNlRGF0YU1hbmFnZXIsIHVpOjpJbnB1dERldmljZUV2ZW50T2JzZXJ2ZXI+Ci0gICAgICBpbnB1dF9kZXZpY2VzX29ic2VydmVyXzsKKyAgICAgIGlucHV0X2RldmljZXNfb2JzZXJ2ZXJfe3RoaXN9OwogICBTY29wZWRPYnNlcnZlcjxjaHJvbWVvczo6UG93ZXJNYW5hZ2VyQ2xpZW50LAogICAgICAgICAgICAgICAgICBjaHJvbWVvczo6UG93ZXJNYW5hZ2VyQ2xpZW50OjpPYnNlcnZlcj4KLSAgICAgIHBvd2VyX21hbmFnZXJfY2xpZW50X29ic2VydmVyXzsKKyAgICAgIHBvd2VyX21hbmFnZXJfY2xpZW50X29ic2VydmVyX3t0aGlzfTsKIAogICAvLyBJZiBzZXQsIHRoaXMgY2FsbGJhY2sgd2lsbCBiZSBydW4gd2hlbiB0aGUgc3RhdGUgY29udHJvbGxlciBpcyBmdWxseQogICAvLyBpbml0aWFsaXplZC4gSXQgY2FuIGJlIHVzZWQgdG8gdGhyb3R0bGUgdGVzdHMgdW50aWwgc3RhdGUgY29udHJvbGxlcgpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9naW4vZGVtb19tb2RlL2RlbW9fbW9kZV9yZXNvdXJjZXNfcmVtb3Zlci5jYyBiL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2xvZ2luL2RlbW9fbW9kZS9kZW1vX21vZGVfcmVzb3VyY2VzX3JlbW92ZXIuY2MKaW5kZXggNGI3ZDZkZi4uNzYxODFhOCAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9naW4vZGVtb19tb2RlL2RlbW9fbW9kZV9yZXNvdXJjZXNfcmVtb3Zlci5jYworKysgYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2dpbi9kZW1vX21vZGUvZGVtb19tb2RlX3Jlc291cmNlc19yZW1vdmVyLmNjCkBAIC0zMyw3ICszMyw2IEBACiAjaW5jbHVkZSAiY29tcG9uZW50cy91c2VyX21hbmFnZXIvdXNlci5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvdXNlcl9tYW5hZ2VyL3VzZXJfdHlwZS5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L3JlMi9zcmMvcmUyL3JlMi5oIgotI2luY2x1ZGUgInVpL2Jhc2UvdXNlcl9hY3Rpdml0eS91c2VyX2FjdGl2aXR5X2RldGVjdG9yLmgiCiAKIG5hbWVzcGFjZSBjaHJvbWVvcyB7CiAKQEAgLTI1MCw5ICsyNDksNyBAQAogCiBEZW1vTW9kZVJlc291cmNlc1JlbW92ZXI6OkRlbW9Nb2RlUmVzb3VyY2VzUmVtb3ZlcihQcmVmU2VydmljZSogbG9jYWxfc3RhdGUpCiAgICAgOiBsb2NhbF9zdGF0ZV8obG9jYWxfc3RhdGUpLAotICAgICAgdGlja19jbG9ja18oYmFzZTo6RGVmYXVsdFRpY2tDbG9jazo6R2V0SW5zdGFuY2UoKSksCi0gICAgICBjcnlwdG9ob21lX29ic2VydmVyXyh0aGlzKSwKLSAgICAgIHVzZXJfYWN0aXZpdHlfb2JzZXJ2ZXJfKHRoaXMpIHsKKyAgICAgIHRpY2tfY2xvY2tfKGJhc2U6OkRlZmF1bHRUaWNrQ2xvY2s6OkdldEluc3RhbmNlKCkpIHsKICAgQ0hFQ0soIWdfaW5zdGFuY2UpOwogICBnX2luc3RhbmNlID0gdGhpczsKIApkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9naW4vZGVtb19tb2RlL2RlbW9fbW9kZV9yZXNvdXJjZXNfcmVtb3Zlci5oIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9naW4vZGVtb19tb2RlL2RlbW9fbW9kZV9yZXNvdXJjZXNfcmVtb3Zlci5oCmluZGV4IGE0MzIxNGNkLi5jZThiMzY2IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2dpbi9kZW1vX21vZGUvZGVtb19tb2RlX3Jlc291cmNlc19yZW1vdmVyLmgKKysrIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9naW4vZGVtb19tb2RlL2RlbW9fbW9kZV9yZXNvdXJjZXNfcmVtb3Zlci5oCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSAiYmFzZS9zY29wZWRfb2JzZXJ2ZXIuaCIKICNpbmNsdWRlICJjaHJvbWVvcy9kYnVzL2NyeXB0b2hvbWUvY3J5cHRvaG9tZV9jbGllbnQuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL3VzZXJfbWFuYWdlci91c2VyX21hbmFnZXIuaCIKKyNpbmNsdWRlICJ1aS9iYXNlL3VzZXJfYWN0aXZpdHkvdXNlcl9hY3Rpdml0eV9kZXRlY3Rvci5oIgogI2luY2x1ZGUgInVpL2Jhc2UvdXNlcl9hY3Rpdml0eS91c2VyX2FjdGl2aXR5X29ic2VydmVyLmgiCiAKIGNsYXNzIFByZWZSZWdpc3RyeVNpbXBsZTsKQEAgLTI5LDcgKzMwLDYgQEAKIAogbmFtZXNwYWNlIHVpIHsKIGNsYXNzIEV2ZW50OwotY2xhc3MgVXNlckFjdGl2aXR5RGV0ZWN0b3I7CiB9ICAvLyBuYW1lc3BhY2UgdWkKIAogbmFtZXNwYWNlIGNocm9tZW9zIHsKQEAgLTE4OSwxMCArMTg5LDEwIEBACiAgIGJhc2U6Ok9wdGlvbmFsPGJhc2U6OlRpbWVUaWNrcz4gdXNhZ2Vfc3RhcnRfOwogICBiYXNlOjpPcHRpb25hbDxiYXNlOjpUaW1lVGlja3M+IHVzYWdlX2VuZF87CiAKLSAgU2NvcGVkT2JzZXJ2ZXI8Q3J5cHRvaG9tZUNsaWVudCwgRGVtb01vZGVSZXNvdXJjZXNSZW1vdmVyPgotICAgICAgY3J5cHRvaG9tZV9vYnNlcnZlcl87Ci0gIFNjb3BlZE9ic2VydmVyPHVpOjpVc2VyQWN0aXZpdHlEZXRlY3RvciwgRGVtb01vZGVSZXNvdXJjZXNSZW1vdmVyPgotICAgICAgdXNlcl9hY3Rpdml0eV9vYnNlcnZlcl87CisgIFNjb3BlZE9ic2VydmVyPENyeXB0b2hvbWVDbGllbnQsIENyeXB0b2hvbWVDbGllbnQ6Ok9ic2VydmVyPgorICAgICAgY3J5cHRvaG9tZV9vYnNlcnZlcl97dGhpc307CisgIFNjb3BlZE9ic2VydmVyPHVpOjpVc2VyQWN0aXZpdHlEZXRlY3RvciwgdWk6OlVzZXJBY3Rpdml0eU9ic2VydmVyPgorICAgICAgdXNlcl9hY3Rpdml0eV9vYnNlcnZlcl97dGhpc307CiAKICAgYmFzZTo6V2Vha1B0ckZhY3Rvcnk8RGVtb01vZGVSZXNvdXJjZXNSZW1vdmVyPiB3ZWFrX3B0cl9mYWN0b3J5X3t0aGlzfTsKIApkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9naW4vZGVtb19tb2RlL2RlbW9fc2Vzc2lvbi5jYyBiL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2xvZ2luL2RlbW9fbW9kZS9kZW1vX3Nlc3Npb24uY2MKaW5kZXggNjA5ZGRmNS4uMzk1ZjZhZiAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9naW4vZGVtb19tb2RlL2RlbW9fc2Vzc2lvbi5jYworKysgYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2dpbi9kZW1vX21vZGUvZGVtb19zZXNzaW9uLmNjCkBAIC00MSwxMiArNDEsMTAgQEAKICNpbmNsdWRlICJjb21wb25lbnRzL2xhbmd1YWdlL2NvcmUvYnJvd3Nlci9wcmVmX25hbWVzLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9wcmVmcy9wcmVmX3JlZ2lzdHJ5X3NpbXBsZS5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvcHJlZnMvcHJlZl9zZXJ2aWNlLmgiCi0jaW5jbHVkZSAiY29tcG9uZW50cy9zZXNzaW9uX21hbmFnZXIvY29yZS9zZXNzaW9uX21hbmFnZXIuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL3VzZXJfbWFuYWdlci91c2VyLmgiCiAjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvYnJvd3Nlci9icm93c2VyX3RocmVhZC5oIgogI2luY2x1ZGUgImNvbnRlbnQvcHVibGljL2Jyb3dzZXIvbmV0d29ya19zZXJ2aWNlX2luc3RhbmNlLmgiCiAjaW5jbHVkZSAiZXh0ZW5zaW9ucy9icm93c2VyL2FwcF93aW5kb3cvYXBwX3dpbmRvdy5oIgotI2luY2x1ZGUgImV4dGVuc2lvbnMvYnJvd3Nlci9leHRlbnNpb25fcmVnaXN0cnkuaCIKICNpbmNsdWRlICJleHRlbnNpb25zL2NvbW1vbi9jb25zdGFudHMuaCIKICNpbmNsdWRlICJzZXJ2aWNlcy9uZXR3b3JrL3B1YmxpYy9jcHAvbmV0d29ya19jb25uZWN0aW9uX3RyYWNrZXIuaCIKICNpbmNsdWRlICJ1aS9iYXNlL2wxMG4vbDEwbl91dGlsLmgiCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2dpbi9kZW1vX21vZGUvZGVtb19zZXNzaW9uLmggYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2dpbi9kZW1vX21vZGUvZGVtb19zZXNzaW9uLmgKaW5kZXggMWEyNzUwYjUuLmRjMTFlYTMgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2xvZ2luL2RlbW9fbW9kZS9kZW1vX3Nlc3Npb24uaAorKysgYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2dpbi9kZW1vX21vZGUvZGVtb19zZXNzaW9uLmgKQEAgLTE1LDkgKzE1LDExIEBACiAjaW5jbHVkZSAiYmFzZS9tZW1vcnkvd2Vha19wdHIuaCIKICNpbmNsdWRlICJiYXNlL3Njb3BlZF9vYnNlcnZlci5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL2Nocm9tZW9zL2xvZ2luL2RlbW9fbW9kZS9kZW1vX2V4dGVuc2lvbnNfZXh0ZXJuYWxfbG9hZGVyLmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9zZXNzaW9uX21hbmFnZXIvY29yZS9zZXNzaW9uX21hbmFnZXIuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL3Nlc3Npb25fbWFuYWdlci9jb3JlL3Nlc3Npb25fbWFuYWdlcl9vYnNlcnZlci5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvdXNlcl9tYW5hZ2VyL3VzZXJfbWFuYWdlci5oIgogI2luY2x1ZGUgImV4dGVuc2lvbnMvYnJvd3Nlci9hcHBfd2luZG93L2FwcF93aW5kb3dfcmVnaXN0cnkuaCIKKyNpbmNsdWRlICJleHRlbnNpb25zL2Jyb3dzZXIvZXh0ZW5zaW9uX3JlZ2lzdHJ5LmgiCiAjaW5jbHVkZSAiZXh0ZW5zaW9ucy9icm93c2VyL2V4dGVuc2lvbl9yZWdpc3RyeV9vYnNlcnZlci5oIgogCiBjbGFzcyBQcmVmUmVnaXN0cnlTaW1wbGU7CkBAIC0yNiwxMCArMjgsNiBAQAogY2xhc3MgT25lU2hvdFRpbWVyOwogfQogCi1uYW1lc3BhY2Ugc2Vzc2lvbl9tYW5hZ2VyIHsKLWNsYXNzIFNlc3Npb25NYW5hZ2VyOwotfQotCiBuYW1lc3BhY2UgY2hyb21lb3MgewogCiBjbGFzcyBEZW1vUmVzb3VyY2VzOwpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9naW4vZXhpc3RpbmdfdXNlcl9jb250cm9sbGVyLmNjIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9naW4vZXhpc3RpbmdfdXNlcl9jb250cm9sbGVyLmNjCmluZGV4IDVlZWViOTMuLmVkZjZkYTMyIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2dpbi9leGlzdGluZ191c2VyX2NvbnRyb2xsZXIuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9naW4vZXhpc3RpbmdfdXNlcl9jb250cm9sbGVyLmNjCkBAIC0zNTQsNyArMzU0LDcgQEAKIAogIHByaXZhdGU6CiAgIGJhc2U6Ok9uY2VDbG9zdXJlIGNhbGxiYWNrXzsKLSAgU2NvcGVkT2JzZXJ2ZXI8cG9saWN5OjpDbG91ZFBvbGljeVN0b3JlLCBQb2xpY3lTdG9yZUxvYWRXYWl0ZXI+CisgIFNjb3BlZE9ic2VydmVyPHBvbGljeTo6Q2xvdWRQb2xpY3lTdG9yZSwgcG9saWN5OjpDbG91ZFBvbGljeVN0b3JlOjpPYnNlcnZlcj4KICAgICAgIHNjb3BlZF9vYnNlcnZlcl97dGhpc307CiB9OwogCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2dpbi9sb2NrL3ZpZXdzX3NjcmVlbl9sb2NrZXIuaCBiL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2xvZ2luL2xvY2svdmlld3Nfc2NyZWVuX2xvY2tlci5oCmluZGV4IGU1ZTAxNWUuLmVhNTcyOWEgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2xvZ2luL2xvY2svdmlld3Nfc2NyZWVuX2xvY2tlci5oCisrKyBiL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2xvZ2luL2xvY2svdmlld3Nfc2NyZWVuX2xvY2tlci5oCkBAIC0xMjMsNyArMTIzLDggQEAKICAgLy8gdXAgdG8gYSBzcGVjaWZpYyB0aW1lb3V0LgogICBiYXNlOjpPbmVTaG90VGltZXIgZXh0ZXJuYWxfYmluYXJ5X3RpbWVyXzsKIAotICBTY29wZWRPYnNlcnZlcjxjaHJvbWVvczo6TWVkaWFBbmFseXRpY3NDbGllbnQsIFZpZXdzU2NyZWVuTG9ja2VyPgorICBTY29wZWRPYnNlcnZlcjxjaHJvbWVvczo6TWVkaWFBbmFseXRpY3NDbGllbnQsCisgICAgICAgICAgICAgICAgIGNocm9tZW9zOjpNZWRpYUFuYWx5dGljc0NsaWVudDo6T2JzZXJ2ZXI+CiAgICAgICBzY29wZWRfb2JzZXJ2ZXJfe3RoaXN9OwogCiAgIGJhc2U6OldlYWtQdHJGYWN0b3J5PFZpZXdzU2NyZWVuTG9ja2VyPiB3ZWFrX2ZhY3Rvcnlfe3RoaXN9OwpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9naW4vb29iZV9pbnRlcmFjdGl2ZV91aV90ZXN0LmNjIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9naW4vb29iZV9pbnRlcmFjdGl2ZV91aV90ZXN0LmNjCmluZGV4IGJiZGViN2EuLjBjMDBhNzBlIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2dpbi9vb2JlX2ludGVyYWN0aXZlX3VpX3Rlc3QuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9naW4vb29iZV9pbnRlcmFjdGl2ZV91aV90ZXN0LmNjCkBAIC0xODUsOSArMTg1LDcgQEAKICAgdGVzdDo6T29iZUpTKCkKICAgICAgIC5DcmVhdGVFbmFibGVkV2FpdGVyKHRydWUsIHsiYXJjLXRvcy1yb290IiwgImFyYy10b3MtbmV4dC1idXR0b24ifSkKICAgICAgIC0+V2FpdCgpOwotICB0ZXN0OjpPb2JlSlMoKS5FdmFsdWF0ZSgKLSAgICAgIHRlc3Q6OkdldE9vYmVFbGVtZW50UGF0aCh7ImFyYy10b3Mtcm9vdCIsICJhcmMtdG9zLW5leHQtYnV0dG9uIn0pICsKLSAgICAgICIuY2xpY2soKSIpOworICB0ZXN0OjpPb2JlSlMoKS5UYXBPblBhdGgoeyJhcmMtdG9zLXJvb3QiLCAiYXJjLXRvcy1uZXh0LWJ1dHRvbiJ9KTsKICAgdGVzdDo6T29iZUpTKCkKICAgICAgIC5DcmVhdGVWaXNpYmlsaXR5V2FpdGVyKHRydWUsIHsiYXJjLXRvcy1yb290IiwgImFyYy1sb2NhdGlvbi1zZXJ2aWNlIn0pCiAgICAgICAtPldhaXQoKTsKQEAgLTE5Nyw4ICsxOTUsNyBAQAogCiAgIGNvbnN0IHN0ZDo6c3RyaW5nIGJ1dHRvbl90b19jbGljayA9CiAgICAgICBhY2NlcHRfdGVybXMgPyAiYXJjLXRvcy1hY2NlcHQtYnV0dG9uIiA6ICJhcmMtdG9zLXNraXAtYnV0dG9uIjsKLSAgdGVzdDo6T29iZUpTKCkuRXZhbHVhdGUoCi0gICAgICB0ZXN0OjpHZXRPb2JlRWxlbWVudFBhdGgoeyJhcmMtdG9zLXJvb3QiLCBidXR0b25fdG9fY2xpY2t9KSArICIuY2xpY2soKSIpOworICB0ZXN0OjpPb2JlSlMoKS5UYXBPblBhdGgoeyJhcmMtdG9zLXJvb3QiLCBidXR0b25fdG9fY2xpY2t9KTsKIAogICBPb2JlU2NyZWVuRXhpdFdhaXRlcihBcmNUZXJtc09mU2VydmljZVNjcmVlblZpZXc6OmtTY3JlZW5JZCkuV2FpdCgpOwogICBMT0coSU5GTykgPDwgIk9vYmVJbnRlcmFjdGl2ZVVJVGVzdDogJ2FyYy10b3MnIHNjcmVlbiBkb25lLiI7CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2dpbi9wYXNzd29yZF9jaGFuZ2VfYnJvd3NlcnRlc3QuY2MgYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2dpbi9wYXNzd29yZF9jaGFuZ2VfYnJvd3NlcnRlc3QuY2MKaW5kZXggNWNiOWFiYWIuLjY1ZGRlMGEgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2xvZ2luL3Bhc3N3b3JkX2NoYW5nZV9icm93c2VydGVzdC5jYworKysgYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2dpbi9wYXNzd29yZF9jaGFuZ2VfYnJvd3NlcnRlc3QuY2MKQEAgLTY2LDcgKzY2LDggQEAKIAogIHByaXZhdGU6CiAgIGJhc2U6Ok9uY2VDbG9zdXJlIHNlc3Npb25fYWN0aXZlX2NhbGxiYWNrXzsKLSAgU2NvcGVkT2JzZXJ2ZXI8c2Vzc2lvbl9tYW5hZ2VyOjpTZXNzaW9uTWFuYWdlciwgU2Vzc2lvblN0YXJ0V2FpdGVyPgorICBTY29wZWRPYnNlcnZlcjxzZXNzaW9uX21hbmFnZXI6OlNlc3Npb25NYW5hZ2VyLAorICAgICAgICAgICAgICAgICBzZXNzaW9uX21hbmFnZXI6OlNlc3Npb25NYW5hZ2VyT2JzZXJ2ZXI+CiAgICAgICBzZXNzaW9uX29ic2VydmVyX3t0aGlzfTsKIAogICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oU2Vzc2lvblN0YXJ0V2FpdGVyKTsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2xvZ2luL3NjcmVlbnMvZGVtb19wcmVmZXJlbmNlc19zY3JlZW4uY2MgYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2dpbi9zY3JlZW5zL2RlbW9fcHJlZmVyZW5jZXNfc2NyZWVuLmNjCmluZGV4IGMzYmJjMTkuLjg4ODVkNzAgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2xvZ2luL3NjcmVlbnMvZGVtb19wcmVmZXJlbmNlc19zY3JlZW4uY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9naW4vc2NyZWVucy9kZW1vX3ByZWZlcmVuY2VzX3NjcmVlbi5jYwpAQCAtNDEsNyArNDEsNiBAQAogICAgIERlbW9QcmVmZXJlbmNlc1NjcmVlblZpZXcqIHZpZXcsCiAgICAgY29uc3QgU2NyZWVuRXhpdENhbGxiYWNrJiBleGl0X2NhbGxiYWNrKQogICAgIDogQmFzZVNjcmVlbihEZW1vUHJlZmVyZW5jZXNTY3JlZW5WaWV3OjprU2NyZWVuSWQpLAotICAgICAgaW5wdXRfbWFuYWdlcl9vYnNlcnZlcl8odGhpcyksCiAgICAgICB2aWV3Xyh2aWV3KSwKICAgICAgIGV4aXRfY2FsbGJhY2tfKGV4aXRfY2FsbGJhY2spIHsKICAgRENIRUNLKHZpZXdfKTsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2xvZ2luL3NjcmVlbnMvZGVtb19wcmVmZXJlbmNlc19zY3JlZW4uaCBiL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2xvZ2luL3NjcmVlbnMvZGVtb19wcmVmZXJlbmNlc19zY3JlZW4uaAppbmRleCAzMzUxNjQ3Li4xNzFlZTEzNSAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9naW4vc2NyZWVucy9kZW1vX3ByZWZlcmVuY2VzX3NjcmVlbi5oCisrKyBiL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2xvZ2luL3NjcmVlbnMvZGVtb19wcmVmZXJlbmNlc19zY3JlZW4uaApAQCAtNjMsOCArNjMsOSBAQAogICAvLyByZXN0b3JlZCBpZiB1c2VyIHByZXNzZXMgYmFjayBidXR0b24uCiAgIHN0ZDo6c3RyaW5nIGluaXRpYWxfaW5wdXRfbWV0aG9kXzsKIAotICBTY29wZWRPYnNlcnZlcjxpbnB1dF9tZXRob2Q6OklucHV0TWV0aG9kTWFuYWdlciwgRGVtb1ByZWZlcmVuY2VzU2NyZWVuPgotICAgICAgaW5wdXRfbWFuYWdlcl9vYnNlcnZlcl87CisgIFNjb3BlZE9ic2VydmVyPGlucHV0X21ldGhvZDo6SW5wdXRNZXRob2RNYW5hZ2VyLAorICAgICAgICAgICAgICAgICBpbnB1dF9tZXRob2Q6OklucHV0TWV0aG9kTWFuYWdlcjo6T2JzZXJ2ZXI+CisgICAgICBpbnB1dF9tYW5hZ2VyX29ic2VydmVyX3t0aGlzfTsKIAogICBEZW1vUHJlZmVyZW5jZXNTY3JlZW5WaWV3KiB2aWV3XzsKICAgU2NyZWVuRXhpdENhbGxiYWNrIGV4aXRfY2FsbGJhY2tfOwpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9naW4vc2NyZWVucy9zeW5jX2NvbnNlbnRfc2NyZWVuLmNjIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9naW4vc2NyZWVucy9zeW5jX2NvbnNlbnRfc2NyZWVuLmNjCmluZGV4IDkwODg5N2M5Li43YmVhZGRjIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2dpbi9zY3JlZW5zL3N5bmNfY29uc2VudF9zY3JlZW4uY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9naW4vc2NyZWVucy9zeW5jX2NvbnNlbnRfc2NyZWVuLmNjCkBAIC0xOCw3ICsxOCw2IEBACiAjaW5jbHVkZSAiY29tcG9uZW50cy9jb25zZW50X2F1ZGl0b3IvY29uc2VudF9hdWRpdG9yLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9wcmVmcy9wcmVmX3NlcnZpY2UuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL3NpZ25pbi9wdWJsaWMvaWRlbnRpdHlfbWFuYWdlci9pZGVudGl0eV9tYW5hZ2VyLmgiCi0jaW5jbHVkZSAiY29tcG9uZW50cy9zeW5jL2RyaXZlci9zeW5jX3NlcnZpY2UuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL3VzZXJfbWFuYWdlci91c2VyX21hbmFnZXIuaCIKIAogbmFtZXNwYWNlIGNocm9tZW9zIHsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2xvZ2luL3NjcmVlbnMvc3luY19jb25zZW50X3NjcmVlbi5oIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9naW4vc2NyZWVucy9zeW5jX2NvbnNlbnRfc2NyZWVuLmgKaW5kZXggY2M1YjgzMi4uYWY0MGI2MCAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9naW4vc2NyZWVucy9zeW5jX2NvbnNlbnRfc2NyZWVuLmgKKysrIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9naW4vc2NyZWVucy9zeW5jX2NvbnNlbnRfc2NyZWVuLmgKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlICJiYXNlL3Njb3BlZF9vYnNlcnZlci5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL2Nocm9tZW9zL2xvZ2luL3NjcmVlbnMvYmFzZV9zY3JlZW4uaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS9jaHJvbWVvcy9sb2dpbi9zeW5jX2NvbnNlbnRfc2NyZWVuX2hhbmRsZXIuaCIKKyNpbmNsdWRlICJjb21wb25lbnRzL3N5bmMvZHJpdmVyL3N5bmNfc2VydmljZS5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvc3luYy9kcml2ZXIvc3luY19zZXJ2aWNlX29ic2VydmVyLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy91c2VyX21hbmFnZXIvdXNlci5oIgogCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2dpbi90ZXN0L2RpYWxvZ193aW5kb3dfd2FpdGVyLmNjIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9naW4vdGVzdC9kaWFsb2dfd2luZG93X3dhaXRlci5jYwppbmRleCBmNjgxYmM3Li5kOWQ0ODY1NWYgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2xvZ2luL3Rlc3QvZGlhbG9nX3dpbmRvd193YWl0ZXIuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9naW4vdGVzdC9kaWFsb2dfd2luZG93X3dhaXRlci5jYwpAQCAtNSw3ICs1LDYgQEAKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2dpbi90ZXN0L2RpYWxvZ193aW5kb3dfd2FpdGVyLmgiCiAKICNpbmNsdWRlICJ1aS9hdXJhL2Vudi5oIgotI2luY2x1ZGUgInVpL2F1cmEvd2luZG93LmgiCiAjaW5jbHVkZSAidWkvdmlld3Mvd2lkZ2V0L3dpZGdldC5oIgogCiBuYW1lc3BhY2UgY2hyb21lb3MgewpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9naW4vdGVzdC9kaWFsb2dfd2luZG93X3dhaXRlci5oIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9naW4vdGVzdC9kaWFsb2dfd2luZG93X3dhaXRlci5oCmluZGV4IDQ4MzA4MGEuLjc5YmQ4NDkgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2xvZ2luL3Rlc3QvZGlhbG9nX3dpbmRvd193YWl0ZXIuaAorKysgYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2dpbi90ZXN0L2RpYWxvZ193aW5kb3dfd2FpdGVyLmgKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlICJiYXNlL3J1bl9sb29wLmgiCiAjaW5jbHVkZSAiYmFzZS9zY29wZWRfb2JzZXJ2ZXIuaCIKICNpbmNsdWRlICJ1aS9hdXJhL2Vudl9vYnNlcnZlci5oIgorI2luY2x1ZGUgInVpL2F1cmEvd2luZG93LmgiCiAjaW5jbHVkZSAidWkvYXVyYS93aW5kb3dfb2JzZXJ2ZXIuaCIKIAogbmFtZXNwYWNlIGNocm9tZW9zIHsKQEAgLTUwLDcgKzUxLDcgQEAKICAgYmFzZTo6UnVuTG9vcCBydW5fbG9vcF87CiAKICAgc3RkOjpzZXQ8YXVyYTo6V2luZG93Kj4gZGlhbG9nX3dpbmRvd3NfOwotICBTY29wZWRPYnNlcnZlcjxhdXJhOjpXaW5kb3csIERpYWxvZ1dpbmRvd1dhaXRlcj4gd2luZG93X29ic2VydmVyX3t0aGlzfTsKKyAgU2NvcGVkT2JzZXJ2ZXI8YXVyYTo6V2luZG93LCBhdXJhOjpXaW5kb3dPYnNlcnZlcj4gd2luZG93X29ic2VydmVyX3t0aGlzfTsKIAogICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRGlhbG9nV2luZG93V2FpdGVyKTsKIH07CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2dpbi90ZXN0L29vYmVfc2NyZWVuX2V4aXRfd2FpdGVyLmggYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2dpbi90ZXN0L29vYmVfc2NyZWVuX2V4aXRfd2FpdGVyLmgKaW5kZXggY2U5YWFmNy4uMWZmNDYwMDdiIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2dpbi90ZXN0L29vYmVfc2NyZWVuX2V4aXRfd2FpdGVyLmgKKysrIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9naW4vdGVzdC9vb2JlX3NjcmVlbl9leGl0X3dhaXRlci5oCkBAIC00NSw3ICs0NSw3IEBACiAKICAgU3RhdGUgc3RhdGVfID0gU3RhdGU6OklETEU7CiAKLSAgU2NvcGVkT2JzZXJ2ZXI8T29iZVVJLCBPb2JlU2NyZWVuRXhpdFdhaXRlcj4gb29iZV91aV9vYnNlcnZlcl97dGhpc307CisgIFNjb3BlZE9ic2VydmVyPE9vYmVVSSwgT29iZVVJOjpPYnNlcnZlcj4gb29iZV91aV9vYnNlcnZlcl97dGhpc307CiAKICAgc3RkOjp1bmlxdWVfcHRyPGJhc2U6OlJ1bkxvb3A+IHJ1bl9sb29wXzsKIApkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9naW4vdGVzdC9vb2JlX3NjcmVlbl93YWl0ZXIuY2MgYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2dpbi90ZXN0L29vYmVfc2NyZWVuX3dhaXRlci5jYwppbmRleCBjNDVjNGEzLi5hNzMyNmEyIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2dpbi90ZXN0L29vYmVfc2NyZWVuX3dhaXRlci5jYworKysgYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2dpbi90ZXN0L29vYmVfc2NyZWVuX3dhaXRlci5jYwpAQCAtOCw3ICs4LDYgQEAKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2dpbi91aS9sb2dpbl9kaXNwbGF5X2hvc3QuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2dpbi91aS93ZWJ1aV9sb2dpbl92aWV3LmgiCiAjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCi0jaW5jbHVkZSAidWkvYXVyYS93aW5kb3cuaCIKICNpbmNsdWRlICJ1aS92aWV3cy9jb250cm9scy93ZWJ2aWV3L3dlYnZpZXcuaCIKICNpbmNsdWRlICJ1aS92aWV3cy92aWV3LmgiCiAKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2xvZ2luL3Rlc3Qvb29iZV9zY3JlZW5fd2FpdGVyLmggYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2dpbi90ZXN0L29vYmVfc2NyZWVuX3dhaXRlci5oCmluZGV4IGM3MzdiMWUuLjRjYmI2ZGEgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2xvZ2luL3Rlc3Qvb29iZV9zY3JlZW5fd2FpdGVyLmgKKysrIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9naW4vdGVzdC9vb2JlX3NjcmVlbl93YWl0ZXIuaApAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL2Nocm9tZW9zL2xvZ2luL29vYmVfc2NyZWVuLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9naW4vdGVzdC90ZXN0X2NvbmRpdGlvbl93YWl0ZXIuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS9jaHJvbWVvcy9sb2dpbi9vb2JlX3VpLmgiCisjaW5jbHVkZSAidWkvYXVyYS93aW5kb3cuaCIKICNpbmNsdWRlICJ1aS9hdXJhL3dpbmRvd19vYnNlcnZlci5oIgogCiBuYW1lc3BhY2UgYmFzZSB7CkBAIC0xOCw4ICsxOSw2IEBACiAKIG5hbWVzcGFjZSBjaHJvbWVvcyB7CiAKLWNsYXNzIE9vYmVVSTsKLQogLy8gQSB3YWl0ZXIgdGhhdCBibG9ja3MgdW50aWwgdGhlIHRhcmdldCBvb2JlIHNjcmVlbiBpcyByZWFjaGVkLgogY2xhc3MgT29iZVNjcmVlbldhaXRlciA6IHB1YmxpYyBPb2JlVUk6Ok9ic2VydmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB0ZXN0OjpUZXN0Q29uZGl0aW9uV2FpdGVyLApAQCAtNzYsOSArNzUsMTAgQEAKICAgLy8gdmlzaWJsZS4gVHJ1ZSBieSBkZWZhdWx0LgogICBib29sIGNoZWNrX25hdGl2ZV93aW5kb3dfdmlzaWJsZV8gPSB0cnVlOwogCi0gIFNjb3BlZE9ic2VydmVyPE9vYmVVSSwgT29iZVNjcmVlbldhaXRlcj4gb29iZV91aV9vYnNlcnZlcl97dGhpc307CisgIFNjb3BlZE9ic2VydmVyPE9vYmVVSSwgT29iZVVJOjpPYnNlcnZlcj4gb29iZV91aV9vYnNlcnZlcl97dGhpc307CiAKLSAgU2NvcGVkT2JzZXJ2ZXI8YXVyYTo6V2luZG93LCBPb2JlU2NyZWVuV2FpdGVyPiBuYXRpdmVfd2luZG93X29ic2VydmVyX3t0aGlzfTsKKyAgU2NvcGVkT2JzZXJ2ZXI8YXVyYTo6V2luZG93LCBhdXJhOjpXaW5kb3dPYnNlcnZlcj4gbmF0aXZlX3dpbmRvd19vYnNlcnZlcl97CisgICAgICB0aGlzfTsKIAogICBzdGQ6OnVuaXF1ZV9wdHI8YmFzZTo6UnVuTG9vcD4gcnVuX2xvb3BfOwogCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2dpbi90ZXN0L29vYmVfd2luZG93X3Zpc2liaWxpdHlfd2FpdGVyLmNjIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9naW4vdGVzdC9vb2JlX3dpbmRvd192aXNpYmlsaXR5X3dhaXRlci5jYwppbmRleCA5YjJiMTk0Li5jZjIyZjBmNyAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9naW4vdGVzdC9vb2JlX3dpbmRvd192aXNpYmlsaXR5X3dhaXRlci5jYworKysgYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2dpbi90ZXN0L29vYmVfd2luZG93X3Zpc2liaWxpdHlfd2FpdGVyLmNjCkBAIC03LDcgKzcsNiBAQAogI2luY2x1ZGUgImJhc2UvcnVuX2xvb3AuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2dpbi91aS9sb2dpbl9kaXNwbGF5X2hvc3QuaCIKICNpbmNsdWRlICJjb250ZW50L3B1YmxpYy9icm93c2VyL3dlYl9jb250ZW50cy5oIgotI2luY2x1ZGUgInVpL2F1cmEvd2luZG93LmgiCiAjaW5jbHVkZSAidWkvZ2Z4L25hdGl2ZV93aWRnZXRfdHlwZXMuaCIKIAogbmFtZXNwYWNlIGNocm9tZW9zIHsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2xvZ2luL3Rlc3Qvb29iZV93aW5kb3dfdmlzaWJpbGl0eV93YWl0ZXIuaCBiL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2xvZ2luL3Rlc3Qvb29iZV93aW5kb3dfdmlzaWJpbGl0eV93YWl0ZXIuaAppbmRleCBmODcyMGM4Li5mMWQzMGUzIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2dpbi90ZXN0L29vYmVfd2luZG93X3Zpc2liaWxpdHlfd2FpdGVyLmgKKysrIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9naW4vdGVzdC9vb2JlX3dpbmRvd192aXNpYmlsaXR5X3dhaXRlci5oCkBAIC04LDEyICs4LDkgQEAKICNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCiAjaW5jbHVkZSAiYmFzZS9tYWNyb3MuaCIKICNpbmNsdWRlICJiYXNlL3Njb3BlZF9vYnNlcnZlci5oIgorI2luY2x1ZGUgInVpL2F1cmEvd2luZG93LmgiCiAjaW5jbHVkZSAidWkvYXVyYS93aW5kb3dfb2JzZXJ2ZXIuaCIKIAotbmFtZXNwYWNlIGF1cmEgewotY2xhc3MgV2luZG93OwotfQotCiBuYW1lc3BhY2UgY2hyb21lb3MgewogCiAvLyBXYWl0cyBmb3IgdGhlIHdpbmRvdyB0aGF0IGhvc3RzIE9PQkUgVUkgY2hhbmdlcyB2aXNpYmlsaXR5IHRvIHRhcmdldCB2YWx1ZS4KQEAgLTM2LDggKzMzLDcgQEAKIAogICBjb25zdCBib29sIHRhcmdldF92aXNpYmlsaXR5XzsKICAgYmFzZTo6T25jZUNsb3N1cmUgd2FpdF9zdG9wX2Nsb3N1cmVfOwotICBTY29wZWRPYnNlcnZlcjxhdXJhOjpXaW5kb3csIE9vYmVXaW5kb3dWaXNpYmlsaXR5V2FpdGVyPiB3aW5kb3dfb2JzZXJ2ZXJfewotICAgICAgdGhpc307CisgIFNjb3BlZE9ic2VydmVyPGF1cmE6OldpbmRvdywgYXVyYTo6V2luZG93T2JzZXJ2ZXI+IHdpbmRvd19vYnNlcnZlcl97dGhpc307CiAKICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKE9vYmVXaW5kb3dWaXNpYmlsaXR5V2FpdGVyKTsKIH07CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2dpbi91aS9raW9za19hcHBfbWVudV9jb250cm9sbGVyLmggYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2dpbi91aS9raW9za19hcHBfbWVudV9jb250cm9sbGVyLmgKaW5kZXggNzEwYjcxNjQuLjI1N2U2YjMgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2xvZ2luL3VpL2tpb3NrX2FwcF9tZW51X2NvbnRyb2xsZXIuaAorKysgYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2dpbi91aS9raW9za19hcHBfbWVudV9jb250cm9sbGVyLmgKQEAgLTM3LDggKzM3LDEwIEBACiAgcHJpdmF0ZToKICAgdm9pZCBMYXVuY2hBcHAoY29uc3QgYXNoOjpLaW9za0FwcE1lbnVFbnRyeSYgYXBwKTsKIAotICBTY29wZWRPYnNlcnZlcjxLaW9za0FwcE1hbmFnZXIsIEtpb3NrQXBwTWVudUNvbnRyb2xsZXI+IGtpb3NrX29ic2VydmVyX3t0aGlzfTsKLSAgU2NvcGVkT2JzZXJ2ZXI8QXJjS2lvc2tBcHBNYW5hZ2VyLCBLaW9za0FwcE1lbnVDb250cm9sbGVyPgorICBTY29wZWRPYnNlcnZlcjxLaW9za0FwcE1hbmFnZXIsIEtpb3NrQXBwTWFuYWdlck9ic2VydmVyPiBraW9za19vYnNlcnZlcl97CisgICAgICB0aGlzfTsKKyAgU2NvcGVkT2JzZXJ2ZXI8QXJjS2lvc2tBcHBNYW5hZ2VyLAorICAgICAgICAgICAgICAgICBBcmNLaW9za0FwcE1hbmFnZXI6OkFyY0tpb3NrQXBwTWFuYWdlck9ic2VydmVyPgogICAgICAgYXJjX2tpb3NrX29ic2VydmVyX3t0aGlzfTsKIAogICBiYXNlOjpXZWFrUHRyRmFjdG9yeTxLaW9za0FwcE1lbnVDb250cm9sbGVyPiB3ZWFrX2ZhY3Rvcnlfe3RoaXN9OwpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvbG9naW4vdWkvb29iZV91aV9kaWFsb2dfZGVsZWdhdGUuY2MgYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2dpbi91aS9vb2JlX3VpX2RpYWxvZ19kZWxlZ2F0ZS5jYwppbmRleCA0ODQ4OGI5Li42YzFiODQxIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2dpbi91aS9vb2JlX3VpX2RpYWxvZ19kZWxlZ2F0ZS5jYworKysgYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2dpbi91aS9vb2JlX3VpX2RpYWxvZ19kZWxlZ2F0ZS5jYwpAQCAtMTEsNyArMTEsNiBAQAogI2luY2x1ZGUgImFzaC9wdWJsaWMvY3BwL2xvZ2luX3NjcmVlbi5oIgogI2luY2x1ZGUgImFzaC9wdWJsaWMvY3BwL2xvZ2luX3NjcmVlbl9tb2RlbC5oIgogI2luY2x1ZGUgImFzaC9wdWJsaWMvY3BwL3NoZWxsX3dpbmRvd19pZHMuaCIKLSNpbmNsdWRlICJhc2gvcHVibGljL2NwcC90YWJsZXRfbW9kZS5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL2Nocm9tZW9zL2xvZ2luL3VpL2xvZ2luX2Rpc3BsYXlfaG9zdF9tb2pvLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvcHJvZmlsZXMvcHJvZmlsZV9oZWxwZXIuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9leHRlbnNpb25zL2Nocm9tZV9leHRlbnNpb25fd2ViX2NvbnRlbnRzX29ic2VydmVyLmgiCkBAIC0yNyw3ICsyNiw2IEBACiAjaW5jbHVkZSAidWkvYmFzZS9hY2NlbGVyYXRvcnMvYWNjZWxlcmF0b3IuaCIKICNpbmNsdWRlICJ1aS9iYXNlL3VpX2Jhc2VfZmVhdHVyZXMuaCIKICNpbmNsdWRlICJ1aS9kaXNwbGF5L2Rpc3BsYXkuaCIKLSNpbmNsdWRlICJ1aS9kaXNwbGF5L3NjcmVlbi5oIgogI2luY2x1ZGUgInVpL3ZpZXdzL2NvbnRyb2xzL3dlYnZpZXcvdW5oYW5kbGVkX2tleWJvYXJkX2V2ZW50X2hhbmRsZXIuaCIKICNpbmNsdWRlICJ1aS92aWV3cy9jb250cm9scy93ZWJ2aWV3L3dlYl9kaWFsb2dfdmlldy5oIgogI2luY2x1ZGUgInVpL3ZpZXdzL2ZvY3VzL2ZvY3VzX21hbmFnZXIuaCIKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2xvZ2luL3VpL29vYmVfdWlfZGlhbG9nX2RlbGVnYXRlLmggYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2dpbi91aS9vb2JlX3VpX2RpYWxvZ19kZWxlZ2F0ZS5oCmluZGV4IDI0Njc2MDBkLi4wODI2ZTQ0IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9sb2dpbi91aS9vb2JlX3VpX2RpYWxvZ19kZWxlZ2F0ZS5oCisrKyBiL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL2xvZ2luL3VpL29vYmVfdWlfZGlhbG9nX2RlbGVnYXRlLmgKQEAgLTgsNiArOCw3IEBACiAjaW5jbHVkZSA8c3RyaW5nPgogCiAjaW5jbHVkZSAiYXNoL3B1YmxpYy9jcHAvbG9naW5fdHlwZXMuaCIKKyNpbmNsdWRlICJhc2gvcHVibGljL2NwcC90YWJsZXRfbW9kZS5oIgogI2luY2x1ZGUgImFzaC9wdWJsaWMvY3BwL3RhYmxldF9tb2RlX29ic2VydmVyLmgiCiAjaW5jbHVkZSAiYmFzZS9tYWNyb3MuaCIKICNpbmNsdWRlICJiYXNlL21lbW9yeS93ZWFrX3B0ci5oIgpAQCAtMTgsMjAgKzE5LDEzIEBACiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvY2hyb21lX3dlYl9tb2RhbF9kaWFsb2dfbWFuYWdlcl9kZWxlZ2F0ZS5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvd2ViX21vZGFsL3dlYl9jb250ZW50c19tb2RhbF9kaWFsb2dfaG9zdC5oIgogI2luY2x1ZGUgInVpL2Rpc3BsYXkvZGlzcGxheV9vYnNlcnZlci5oIgorI2luY2x1ZGUgInVpL2Rpc3BsYXkvc2NyZWVuLmgiCiAjaW5jbHVkZSAidWkvd2ViX2RpYWxvZ3Mvd2ViX2RpYWxvZ19kZWxlZ2F0ZS5oIgogCi1uYW1lc3BhY2UgYXNoIHsKLWNsYXNzIFRhYmxldE1vZGU7Ci19Ci0KIG5hbWVzcGFjZSBjb250ZW50IHsKIGNsYXNzIFdlYkNvbnRlbnRzOwogfQogCi1uYW1lc3BhY2UgZGlzcGxheSB7Ci1jbGFzcyBTY3JlZW47Ci19Ci0KIG5hbWVzcGFjZSB1aSB7CiBjbGFzcyBBY2NlbGVyYXRvcjsKIH0KQEAgLTQzLDExICszNywxMCBAQAogCiBuYW1lc3BhY2UgY2hyb21lb3MgewogCitjbGFzcyBDYXB0aXZlUG9ydGFsRGlhbG9nRGVsZWdhdGU7CiBjbGFzcyBMb2dpbkRpc3BsYXlIb3N0TW9qbzsKIGNsYXNzIE9vYmVVSTsKIAotY2xhc3MgQ2FwdGl2ZVBvcnRhbERpYWxvZ0RlbGVnYXRlOwotCiAvLyBUaGlzIGNsYXNzIG1hbmFnZXMgdGhlIGJlaGF2aW9yIG9mIHRoZSBPb2JlIFVJIGRpYWxvZy4KIC8vIEFuZCBpdHMgbGlmZWN5Y2xlIGlzIG1hbmFnZWQgYnkgdGhlIHdpZGdldCBjcmVhdGVkIGluIFNob3coKS4KIC8vICAgV2ViRGlhbG9nVmlldzwtLS0tZGVsZWdhdGVfLS0tLU9vYmVVSURpYWxvZ0RlbGVnYXRlCkBAIC0xNDUsNyArMTM4LDcgQEAKICAgU2NvcGVkT2JzZXJ2ZXI8Q2hyb21lS2V5Ym9hcmRDb250cm9sbGVyQ2xpZW50LAogICAgICAgICAgICAgICAgICBDaHJvbWVLZXlib2FyZENvbnRyb2xsZXJDbGllbnQ6Ok9ic2VydmVyPgogICAgICAga2V5Ym9hcmRfb2JzZXJ2ZXJfe3RoaXN9OwotICBTY29wZWRPYnNlcnZlcjxDYXB0aXZlUG9ydGFsV2luZG93UHJveHksIE9vYmVVSURpYWxvZ0RlbGVnYXRlPgorICBTY29wZWRPYnNlcnZlcjxDYXB0aXZlUG9ydGFsV2luZG93UHJveHksIENhcHRpdmVQb3J0YWxXaW5kb3dQcm94eTo6T2JzZXJ2ZXI+CiAgICAgICBjYXB0aXZlX3BvcnRhbF9vYnNlcnZlcl97dGhpc307CiAKICAgc3RkOjptYXA8dWk6OkFjY2VsZXJhdG9yLCBzdGQ6OnN0cmluZz4gYWNjZWxfbWFwXzsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL25vdGVfdGFraW5nX2hlbHBlci5jYyBiL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL25vdGVfdGFraW5nX2hlbHBlci5jYwppbmRleCBlZTRjODc2Mi4uODg0NjBmZWYgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL25vdGVfdGFraW5nX2hlbHBlci5jYworKysgYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9ub3RlX3Rha2luZ19oZWxwZXIuY2MKQEAgLTM2Myw3ICszNjMsNiBAQAogTm90ZVRha2luZ0hlbHBlcjo6Tm90ZVRha2luZ0hlbHBlcigpCiAgICAgOiBsYXVuY2hfY2hyb21lX2FwcF9jYWxsYmFja18oCiAgICAgICAgICAgYmFzZTo6QmluZCgmYXBwczo6TGF1bmNoUGxhdGZvcm1BcHBXaXRoQWN0aW9uKSksCi0gICAgICBleHRlbnNpb25fcmVnaXN0cnlfb2JzZXJ2ZXJfKHRoaXMpLAogICAgICAgbm90ZV90YWtpbmdfY29udHJvbGxlcl9jbGllbnRfKAogICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8Tm90ZVRha2luZ0NvbnRyb2xsZXJDbGllbnQ+KHRoaXMpKSB7CiAgIERDSEVDS19DVVJSRU5UTFlfT04oY29udGVudDo6QnJvd3NlclRocmVhZDo6VUkpOwpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3Mvbm90ZV90YWtpbmdfaGVscGVyLmggYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9ub3RlX3Rha2luZ19oZWxwZXIuaAppbmRleCBlMmYwODdjNS4uOWIyMWIyMiAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3Mvbm90ZV90YWtpbmdfaGVscGVyLmgKKysrIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3Mvbm90ZV90YWtpbmdfaGVscGVyLmgKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlICJjb21wb25lbnRzL2FyYy9pbnRlbnRfaGVscGVyL2FyY19pbnRlbnRfaGVscGVyX29ic2VydmVyLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9hcmMvbW9qb20vaW50ZW50X2hlbHBlci5tb2pvbS5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvcHJlZnMvcHJlZl9jaGFuZ2VfcmVnaXN0cmFyLmgiCisjaW5jbHVkZSAiZXh0ZW5zaW9ucy9icm93c2VyL2V4dGVuc2lvbl9yZWdpc3RyeS5oIgogI2luY2x1ZGUgImV4dGVuc2lvbnMvYnJvd3Nlci9leHRlbnNpb25fcmVnaXN0cnlfb2JzZXJ2ZXIuaCIKICNpbmNsdWRlICJleHRlbnNpb25zL2NvbW1vbi9leHRlbnNpb24uaCIKIApAQCAtMzUsNyArMzYsNiBAQAogCiBuYW1lc3BhY2UgZXh0ZW5zaW9ucyB7CiBjbGFzcyBFeHRlbnNpb247Ci1jbGFzcyBFeHRlbnNpb25SZWdpc3RyeTsKIG5hbWVzcGFjZSBhcGkgewogbmFtZXNwYWNlIGFwcF9ydW50aW1lIHsKIHN0cnVjdCBBY3Rpb25EYXRhOwpAQCAtMjk1LDcgKzI5NSw3IEBACiAgIC8vIFRyYWNrcyBFeHRlbnNpb25SZWdpc3RyeSBvYnNlcnZhdGlvbiBmb3IgZGlmZmVyZW50IHByb2ZpbGVzLgogICBTY29wZWRPYnNlcnZlcjxleHRlbnNpb25zOjpFeHRlbnNpb25SZWdpc3RyeSwKICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uczo6RXh0ZW5zaW9uUmVnaXN0cnlPYnNlcnZlcj4KLSAgICAgIGV4dGVuc2lvbl9yZWdpc3RyeV9vYnNlcnZlcl87CisgICAgICBleHRlbnNpb25fcmVnaXN0cnlfb2JzZXJ2ZXJfe3RoaXN9OwogCiAgIC8vIFRoZSBwcm9maWxlIGZvciB3aGljaCBsb2NrIHNjcmVlbiBhcHBzIGFyZSBlbmFibGVkLAogICBQcm9maWxlKiBwcm9maWxlX3dpdGhfZW5hYmxlZF9sb2NrX3NjcmVlbl9hcHBzXyA9IG51bGxwdHI7CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9wb3dlci9tbC9hZGFwdGl2ZV9zY3JlZW5fYnJpZ2h0bmVzc19tYW5hZ2VyLmNjIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvcG93ZXIvbWwvYWRhcHRpdmVfc2NyZWVuX2JyaWdodG5lc3NfbWFuYWdlci5jYwppbmRleCAzNjAwY2JiLi42ODRiMjkxYSAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvcG93ZXIvbWwvYWRhcHRpdmVfc2NyZWVuX2JyaWdodG5lc3NfbWFuYWdlci5jYworKysgYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9wb3dlci9tbC9hZGFwdGl2ZV9zY3JlZW5fYnJpZ2h0bmVzc19tYW5hZ2VyLmNjCkBAIC0zNCw3ICszNCw2IEBACiAjaW5jbHVkZSAic2VydmljZXMvbWV0cmljcy9wdWJsaWMvY3BwL3VrbV9zb3VyY2VfaWQuaCIKICNpbmNsdWRlICJzZXJ2aWNlcy92aXovcHVibGljL21vam9tL2NvbXBvc2l0aW5nL3ZpZGVvX2RldGVjdG9yX29ic2VydmVyLm1vam9tLmgiCiAjaW5jbHVkZSAidWkvYXVyYS9lbnYuaCIKLSNpbmNsdWRlICJ1aS9iYXNlL3VzZXJfYWN0aXZpdHkvdXNlcl9hY3Rpdml0eV9kZXRlY3Rvci5oIgogCiBuYW1lc3BhY2UgY2hyb21lb3MgewogbmFtZXNwYWNlIHBvd2VyIHsKQEAgLTExMiw4ICsxMTEsNiBAQAogICAgIHN0ZDo6dW5pcXVlX3B0cjxiYXNlOjpSZXBlYXRpbmdUaW1lcj4gcGVyaW9kaWNfdGltZXIpCiAgICAgOiBwZXJpb2RpY190aW1lcl8oc3RkOjptb3ZlKHBlcmlvZGljX3RpbWVyKSksCiAgICAgICB1a21fbG9nZ2VyXyhzdGQ6Om1vdmUodWttX2xvZ2dlcikpLAotICAgICAgdXNlcl9hY3Rpdml0eV9vYnNlcnZlcl8odGhpcyksCi0gICAgICBwb3dlcl9tYW5hZ2VyX2NsaWVudF9vYnNlcnZlcl8odGhpcyksCiAgICAgICBhY2Nlc3NpYmlsaXR5X21hbmFnZXJfKGFjY2Vzc2liaWxpdHlfbWFuYWdlciksCiAgICAgICBtYWduaWZpY2F0aW9uX21hbmFnZXJfKG1hZ25pZmljYXRpb25fbWFuYWdlciksCiAgICAgICBiaW5kaW5nXyh0aGlzLCBzdGQ6Om1vdmUocmVxdWVzdCkpLApkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvcG93ZXIvbWwvYWRhcHRpdmVfc2NyZWVuX2JyaWdodG5lc3NfbWFuYWdlci5oIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvcG93ZXIvbWwvYWRhcHRpdmVfc2NyZWVuX2JyaWdodG5lc3NfbWFuYWdlci5oCmluZGV4IDY1N2VmZjYuLjBiN2UwMzEgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL3Bvd2VyL21sL2FkYXB0aXZlX3NjcmVlbl9icmlnaHRuZXNzX21hbmFnZXIuaAorKysgYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9wb3dlci9tbC9hZGFwdGl2ZV9zY3JlZW5fYnJpZ2h0bmVzc19tYW5hZ2VyLmgKQEAgLTE4LDE2ICsxOCwxMyBAQAogI2luY2x1ZGUgImNocm9tZW9zL2RidXMvcG93ZXJfbWFuYWdlci9wb3dlcl9zdXBwbHlfcHJvcGVydGllcy5wYi5oIgogI2luY2x1ZGUgIm1vam8vcHVibGljL2NwcC9iaW5kaW5ncy9iaW5kaW5nLmgiCiAjaW5jbHVkZSAic2VydmljZXMvdml6L3B1YmxpYy9tb2pvbS9jb21wb3NpdGluZy92aWRlb19kZXRlY3Rvcl9vYnNlcnZlci5tb2pvbS5oIgorI2luY2x1ZGUgInVpL2Jhc2UvdXNlcl9hY3Rpdml0eS91c2VyX2FjdGl2aXR5X2RldGVjdG9yLmgiCiAjaW5jbHVkZSAidWkvYmFzZS91c2VyX2FjdGl2aXR5L3VzZXJfYWN0aXZpdHlfb2JzZXJ2ZXIuaCIKIAogbmFtZXNwYWNlIGJhc2UgewogY2xhc3MgUmVwZWF0aW5nVGltZXI7CiB9ICAvLyBuYW1lc3BhY2UgYmFzZQogCi1uYW1lc3BhY2UgdWkgewotY2xhc3MgVXNlckFjdGl2aXR5RGV0ZWN0b3I7Ci19ICAvLyBuYW1lc3BhY2UgdWkKLQogbmFtZXNwYWNlIGNocm9tZW9zIHsKIAogY2xhc3MgQWNjZXNzaWJpbGl0eU1hbmFnZXI7CkBAIC0xMTIsMTAgKzEwOSwxMCBAQAogICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QWRhcHRpdmVTY3JlZW5CcmlnaHRuZXNzVWttTG9nZ2VyPiB1a21fbG9nZ2VyXzsKIAogICBTY29wZWRPYnNlcnZlcjx1aTo6VXNlckFjdGl2aXR5RGV0ZWN0b3IsIHVpOjpVc2VyQWN0aXZpdHlPYnNlcnZlcj4KLSAgICAgIHVzZXJfYWN0aXZpdHlfb2JzZXJ2ZXJfOworICAgICAgdXNlcl9hY3Rpdml0eV9vYnNlcnZlcl97dGhpc307CiAgIFNjb3BlZE9ic2VydmVyPGNocm9tZW9zOjpQb3dlck1hbmFnZXJDbGllbnQsCiAgICAgICAgICAgICAgICAgIGNocm9tZW9zOjpQb3dlck1hbmFnZXJDbGllbnQ6Ok9ic2VydmVyPgotICAgICAgcG93ZXJfbWFuYWdlcl9jbGllbnRfb2JzZXJ2ZXJfOworICAgICAgcG93ZXJfbWFuYWdlcl9jbGllbnRfb2JzZXJ2ZXJfe3RoaXN9OwogCiAgIEFjY2Vzc2liaWxpdHlNYW5hZ2VyKiBjb25zdCBhY2Nlc3NpYmlsaXR5X21hbmFnZXJfOwogICBNYWduaWZpY2F0aW9uTWFuYWdlciogY29uc3QgbWFnbmlmaWNhdGlvbl9tYW5hZ2VyXzsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL3ByaW50aW5nL2J1bGtfcHJpbnRlcnNfY2FsY3VsYXRvcl9mYWN0b3J5LmNjIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvcHJpbnRpbmcvYnVsa19wcmludGVyc19jYWxjdWxhdG9yX2ZhY3RvcnkuY2MKaW5kZXggZmQwZmJiYS4uZDkzOWQyZiAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvcHJpbnRpbmcvYnVsa19wcmludGVyc19jYWxjdWxhdG9yX2ZhY3RvcnkuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvcHJpbnRpbmcvYnVsa19wcmludGVyc19jYWxjdWxhdG9yX2ZhY3RvcnkuY2MKQEAgLTYsOCArNiw2IEBACiAKICNpbmNsdWRlICJiYXNlL25vX2Rlc3RydWN0b3IuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9wcmludGluZy9idWxrX3ByaW50ZXJzX2NhbGN1bGF0b3IuaCIKLSNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9wcm9maWxlcy9wcm9maWxlX2hlbHBlci5oIgotI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3Byb2ZpbGVzL3Byb2ZpbGUuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL2FjY291bnRfaWQvYWNjb3VudF9pZC5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvdXNlcl9tYW5hZ2VyL3VzZXIuaCIKIApAQCAtMjksMTYgKzI3LDYgQEAKICAgcmV0dXJuIHByaW50ZXJzX2J5X3VzZXJfW2FjY291bnRfaWRdLT5Bc1dlYWtQdHIoKTsKIH0KIAotYmFzZTo6V2Vha1B0cjxCdWxrUHJpbnRlcnNDYWxjdWxhdG9yPgotQnVsa1ByaW50ZXJzQ2FsY3VsYXRvckZhY3Rvcnk6OkdldEZvclByb2ZpbGUoUHJvZmlsZSogcHJvZmlsZSkgewotICBEQ0hFQ0tfQ0FMTEVEX09OX1ZBTElEX1NFUVVFTkNFKHNlcXVlbmNlX2NoZWNrZXJfKTsKLSAgY29uc3QgdXNlcl9tYW5hZ2VyOjpVc2VyKiB1c2VyID0KLSAgICAgIFByb2ZpbGVIZWxwZXI6OkdldCgpLT5HZXRVc2VyQnlQcm9maWxlKHByb2ZpbGUpOwotICBpZiAoIXVzZXIpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIHJldHVybiBHZXRGb3JBY2NvdW50SWQodXNlci0+R2V0QWNjb3VudElkKCkpOwotfQotCiB2b2lkIEJ1bGtQcmludGVyc0NhbGN1bGF0b3JGYWN0b3J5OjpSZW1vdmVGb3JVc2VySWQoCiAgICAgY29uc3QgQWNjb3VudElkJiBhY2NvdW50X2lkKSB7CiAgIERDSEVDS19DQUxMRURfT05fVkFMSURfU0VRVUVOQ0Uoc2VxdWVuY2VfY2hlY2tlcl8pOwpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvcHJpbnRpbmcvYnVsa19wcmludGVyc19jYWxjdWxhdG9yX2ZhY3RvcnkuaCBiL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL3ByaW50aW5nL2J1bGtfcHJpbnRlcnNfY2FsY3VsYXRvcl9mYWN0b3J5LmgKaW5kZXggYTMwY2MwYS4uM2E0YmQ3OCAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvcHJpbnRpbmcvYnVsa19wcmludGVyc19jYWxjdWxhdG9yX2ZhY3RvcnkuaAorKysgYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9wcmludGluZy9idWxrX3ByaW50ZXJzX2NhbGN1bGF0b3JfZmFjdG9yeS5oCkBAIC0xMyw3ICsxMyw2IEBACiAjaW5jbHVkZSAiYmFzZS9zZXF1ZW5jZV9jaGVja2VyLmgiCiAKIGNsYXNzIEFjY291bnRJZDsKLWNsYXNzIFByb2ZpbGU7CiAKIG5hbWVzcGFjZSBjaHJvbWVvcyB7CiAKQEAgLTMyLDIxICszMSwxNCBAQAogICAvLyB8YWNjb3VudF9pZHwuCiAgIC8vIElmIHJlcXVlc3RlZCBCdWxrUHJpbnRlcnNDYWxjdWxhdG9yIGRvZXMgbm90IGV4aXN0LCB0aGUgb2JqZWN0IGlzCiAgIC8vIGNyZWF0ZWQgYW5kIHJlZ2lzdGVyZWQuIFRoZSByZXR1cm5lZCBvYmplY3QgcmVtYWlucyB2YWxpZCB1bnRpbAotICAvLyBSZW1vdmVGb3JVc2VySWQgb3IgU2h1dGRvd24gaXMgY2FsbGVkLgorICAvLyBSZW1vdmVGb3JVc2VySWQgb3IgU2h1dGRvd24gaXMgY2FsbGVkLiBJdCBuZXZlciByZXR1cm5zIG51bGxwdHIuCiAgIGJhc2U6OldlYWtQdHI8QnVsa1ByaW50ZXJzQ2FsY3VsYXRvcj4gR2V0Rm9yQWNjb3VudElkKAogICAgICAgY29uc3QgQWNjb3VudElkJiBhY2NvdW50X2lkKTsKIAotICAvLyBSZXR1cm5zIGEgV2Vha1B0ciB0byB0aGUgQnVsa1ByaW50ZXJzQ2FsY3VsYXRvciByZWdpc3RlcmVkIGZvciB8cHJvZmlsZXwKLSAgLy8gd2hpY2ggY291bGQgYmUgbnVsbHB0ciBpZiB8cHJvZmlsZXwgZG9lcyBub3QgbWFwIHRvIGEgdmFsaWQgQWNjb3VudElkLgotICAvLyBJZiByZXF1ZXN0ZWQgQnVsa1ByaW50ZXJzQ2FsY3VsYXRvciBkb2VzIG5vdCBleGlzdCwgdGhlIG9iamVjdCBpcwotICAvLyBjcmVhdGVkIGFuZCByZWdpc3RlcmVkLiBUaGUgcmV0dXJuZWQgb2JqZWN0IHJlbWFpbnMgdmFsaWQgdW50aWwKLSAgLy8gUmVtb3ZlRm9yVXNlcklkIG9yIFNodXRkb3duIGlzIGNhbGxlZC4KLSAgYmFzZTo6V2Vha1B0cjxCdWxrUHJpbnRlcnNDYWxjdWxhdG9yPiBHZXRGb3JQcm9maWxlKFByb2ZpbGUqIHByb2ZpbGUpOwotCiAgIC8vIFJldHVybnMgYSBXZWFrUHRyIHRvIHRoZSBCdWxrUHJpbnRlcnNDYWxjdWxhdG9yIHJlZ2lzdGVyZWQgZm9yIHRoZSBkZXZpY2UuCiAgIC8vIElmIHJlcXVlc3RlZCBCdWxrUHJpbnRlcnNDYWxjdWxhdG9yIGRvZXMgbm90IGV4aXN0LCB0aGUgb2JqZWN0IGlzCiAgIC8vIGNyZWF0ZWQgYW5kIHJlZ2lzdGVyZWQuIFRoZSByZXR1cm5lZCBvYmplY3QgcmVtYWlucyB2YWxpZCB1bnRpbCBTaHV0ZG93biBpcwotICAvLyBjYWxsZWQuCisgIC8vIGNhbGxlZC4gSXQgbmV2ZXIgcmV0dXJucyBudWxscHRyLgogICBiYXNlOjpXZWFrUHRyPEJ1bGtQcmludGVyc0NhbGN1bGF0b3I+IEdldEZvckRldmljZSgpOwogCiAgIC8vIERlbGV0ZXMgdGhlIEJ1bGtQcmludGVyc0NhbGN1bGF0b3IgcmVnaXN0ZXJlZCBmb3IgfGFjY291bnRfaWR8LgpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvcHJpbnRpbmcvY2FsY3VsYXRvcnNfcG9saWNpZXNfYmluZGVyLmNjIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvcHJpbnRpbmcvY2FsY3VsYXRvcnNfcG9saWNpZXNfYmluZGVyLmNjCmluZGV4IDhhNWY0NzQuLjdjNzcxNGQ4IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9wcmludGluZy9jYWxjdWxhdG9yc19wb2xpY2llc19iaW5kZXIuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvcHJpbnRpbmcvY2FsY3VsYXRvcnNfcG9saWNpZXNfYmluZGVyLmNjCkBAIC0xMSw2ICsxMSw3IEBACiAKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9wcmludGluZy9idWxrX3ByaW50ZXJzX2NhbGN1bGF0b3IuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9wcmludGluZy9idWxrX3ByaW50ZXJzX2NhbGN1bGF0b3JfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNocm9tZS9icm93c2VyL2Nocm9tZW9zL3Byb2ZpbGVzL3Byb2ZpbGVfaGVscGVyLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvY2hyb21lb3Mvc2V0dGluZ3MvY3Jvc19zZXR0aW5ncy5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3Byb2ZpbGVzL3Byb2ZpbGUuaCIKICNpbmNsdWRlICJjaHJvbWUvY29tbW9uL3ByZWZfbmFtZXMuaCIKQEAgLTE4LDYgKzE5LDcgQEAKICNpbmNsdWRlICJjb21wb25lbnRzL3ByZWZfcmVnaXN0cnkvcHJlZl9yZWdpc3RyeV9zeW5jYWJsZS5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvcHJlZnMvcHJlZl9jaGFuZ2VfcmVnaXN0cmFyLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9wcmVmcy9wcmVmX3NlcnZpY2UuaCIKKyNpbmNsdWRlICJjb21wb25lbnRzL3VzZXJfbWFuYWdlci91c2VyLmgiCiAKIG5hbWVzcGFjZSBjaHJvbWVvcyB7CiAKQEAgLTY5LDkgKzcxLDE1IEBACiAgICAgICBCaW5kU2V0dGluZ3Moa0RldmljZU5hdGl2ZVByaW50ZXJzV2hpdGVsaXN0LAogICAgICAgICAgICAgICAgICAgICZDYWxjdWxhdG9yc1BvbGljaWVzQmluZGVySW1wbDo6VXBkYXRlRGV2aWNlV2hpdGVsaXN0KTsKICAgICB9CisgICAgLy8gQ2FsY3VsYXRlIGFjY291bnRfaWRfLgorICAgIGNvbnN0IHVzZXJfbWFuYWdlcjo6VXNlciogdXNlciA9CisgICAgICAgIFByb2ZpbGVIZWxwZXI6OkdldCgpLT5HZXRVc2VyQnlQcm9maWxlKHByb2ZpbGUpOworICAgIGlmICh1c2VyKSB7CisgICAgICBhY2NvdW50X2lkXyA9IHVzZXItPkdldEFjY291bnRJZCgpOworICAgICAgdXNlcl9wcmludGVyc18gPQorICAgICAgICAgIEJ1bGtQcmludGVyc0NhbGN1bGF0b3JGYWN0b3J5OjpHZXQoKS0+R2V0Rm9yQWNjb3VudElkKGFjY291bnRfaWRfKTsKKyAgICB9CiAgICAgLy8gQmluZCB1c2VyIHBvbGljaWVzIHRvIGNvcnJlc3BvbmRpbmcgaW5zdGFuY2Ugb2YgQnVsa1ByaW50ZXJzQ2FsY3VsYXRvci4KLSAgICB1c2VyX3ByaW50ZXJzXyA9Ci0gICAgICAgIEJ1bGtQcmludGVyc0NhbGN1bGF0b3JGYWN0b3J5OjpHZXQoKS0+R2V0Rm9yUHJvZmlsZShwcm9maWxlKTsKICAgICBpZiAodXNlcl9wcmludGVyc18gJiYgKysoQmluZGluZ3NDb3VudCgpW3VzZXJfcHJpbnRlcnNfLmdldCgpXSkgPT0gMSkgewogICAgICAgQmluZFByZWYocHJlZnM6OmtSZWNvbW1lbmRlZE5hdGl2ZVByaW50ZXJzQWNjZXNzTW9kZSwKICAgICAgICAgICAgICAgICZDYWxjdWxhdG9yc1BvbGljaWVzQmluZGVySW1wbDo6VXBkYXRlVXNlckFjY2Vzc01vZGUpOwpAQCAtODksNiArOTcsNyBAQAogICAgIH0KICAgICBpZiAodXNlcl9wcmludGVyc18gJiYgLS0oQmluZGluZ3NDb3VudCgpW3VzZXJfcHJpbnRlcnNfLmdldCgpXSkgPT0gMCkgewogICAgICAgQmluZGluZ3NDb3VudCgpLmVyYXNlKHVzZXJfcHJpbnRlcnNfLmdldCgpKTsKKyAgICAgIEJ1bGtQcmludGVyc0NhbGN1bGF0b3JGYWN0b3J5OjpHZXQoKS0+UmVtb3ZlRm9yVXNlcklkKGFjY291bnRfaWRfKTsKICAgICB9CiAgIH0KIApAQCAtOTksMzMgKzEwOCw0NSBAQAogICAgIGlmICghc2V0dGluZ3NfLT5HZXRJbnRlZ2VyKGtEZXZpY2VOYXRpdmVQcmludGVyc0FjY2Vzc01vZGUsICZtb2RlX3ZhbCkpIHsKICAgICAgIG1vZGVfdmFsID0gQnVsa1ByaW50ZXJzQ2FsY3VsYXRvcjo6QWNjZXNzTW9kZTo6VU5TRVQ7CiAgICAgfQotICAgIGRldmljZV9wcmludGVyc18tPlNldEFjY2Vzc01vZGUoQ29udmVydFRvQWNjZXNzTW9kZShtb2RlX3ZhbCkpOworICAgIGlmIChkZXZpY2VfcHJpbnRlcnNfKSB7CisgICAgICBkZXZpY2VfcHJpbnRlcnNfLT5TZXRBY2Nlc3NNb2RlKENvbnZlcnRUb0FjY2Vzc01vZGUobW9kZV92YWwpKTsKKyAgICB9CiAgIH0KIAogICB2b2lkIFVwZGF0ZURldmljZUJsYWNrbGlzdCgpIHsKLSAgICBkZXZpY2VfcHJpbnRlcnNfLT5TZXRCbGFja2xpc3QoCi0gICAgICAgIEZyb21TZXR0aW5ncyhrRGV2aWNlTmF0aXZlUHJpbnRlcnNCbGFja2xpc3QpKTsKKyAgICBpZiAoZGV2aWNlX3ByaW50ZXJzXykgeworICAgICAgZGV2aWNlX3ByaW50ZXJzXy0+U2V0QmxhY2tsaXN0KAorICAgICAgICAgIEZyb21TZXR0aW5ncyhrRGV2aWNlTmF0aXZlUHJpbnRlcnNCbGFja2xpc3QpKTsKKyAgICB9CiAgIH0KIAogICB2b2lkIFVwZGF0ZURldmljZVdoaXRlbGlzdCgpIHsKLSAgICBkZXZpY2VfcHJpbnRlcnNfLT5TZXRXaGl0ZWxpc3QoCi0gICAgICAgIEZyb21TZXR0aW5ncyhrRGV2aWNlTmF0aXZlUHJpbnRlcnNXaGl0ZWxpc3QpKTsKKyAgICBpZiAoZGV2aWNlX3ByaW50ZXJzXykgeworICAgICAgZGV2aWNlX3ByaW50ZXJzXy0+U2V0V2hpdGVsaXN0KAorICAgICAgICAgIEZyb21TZXR0aW5ncyhrRGV2aWNlTmF0aXZlUHJpbnRlcnNXaGl0ZWxpc3QpKTsKKyAgICB9CiAgIH0KIAogICB2b2lkIFVwZGF0ZVVzZXJBY2Nlc3NNb2RlKCkgewotICAgIHVzZXJfcHJpbnRlcnNfLT5TZXRBY2Nlc3NNb2RlKAotICAgICAgICBDb252ZXJ0VG9BY2Nlc3NNb2RlKHByb2ZpbGVfLT5HZXRQcmVmcygpLT5HZXRJbnRlZ2VyKAotICAgICAgICAgICAgcHJlZnM6OmtSZWNvbW1lbmRlZE5hdGl2ZVByaW50ZXJzQWNjZXNzTW9kZSkpKTsKKyAgICBpZiAodXNlcl9wcmludGVyc18pIHsKKyAgICAgIHVzZXJfcHJpbnRlcnNfLT5TZXRBY2Nlc3NNb2RlKAorICAgICAgICAgIENvbnZlcnRUb0FjY2Vzc01vZGUocHJvZmlsZV8tPkdldFByZWZzKCktPkdldEludGVnZXIoCisgICAgICAgICAgICAgIHByZWZzOjprUmVjb21tZW5kZWROYXRpdmVQcmludGVyc0FjY2Vzc01vZGUpKSk7CisgICAgfQogICB9CiAKICAgdm9pZCBVcGRhdGVVc2VyQmxhY2tsaXN0KCkgewotICAgIHVzZXJfcHJpbnRlcnNfLT5TZXRCbGFja2xpc3QoCi0gICAgICAgIEZyb21QcmVmcyhwcmVmczo6a1JlY29tbWVuZGVkTmF0aXZlUHJpbnRlcnNCbGFja2xpc3QpKTsKKyAgICBpZiAodXNlcl9wcmludGVyc18pIHsKKyAgICAgIHVzZXJfcHJpbnRlcnNfLT5TZXRCbGFja2xpc3QoCisgICAgICAgICAgRnJvbVByZWZzKHByZWZzOjprUmVjb21tZW5kZWROYXRpdmVQcmludGVyc0JsYWNrbGlzdCkpOworICAgIH0KICAgfQogCiAgIHZvaWQgVXBkYXRlVXNlcldoaXRlbGlzdCgpIHsKLSAgICB1c2VyX3ByaW50ZXJzXy0+U2V0V2hpdGVsaXN0KAotICAgICAgICBGcm9tUHJlZnMocHJlZnM6OmtSZWNvbW1lbmRlZE5hdGl2ZVByaW50ZXJzV2hpdGVsaXN0KSk7CisgICAgaWYgKHVzZXJfcHJpbnRlcnNfKSB7CisgICAgICB1c2VyX3ByaW50ZXJzXy0+U2V0V2hpdGVsaXN0KAorICAgICAgICAgIEZyb21QcmVmcyhwcmVmczo6a1JlY29tbWVuZGVkTmF0aXZlUHJpbnRlcnNXaGl0ZWxpc3QpKTsKKyAgICB9CiAgIH0KIAogICB0eXBlZGVmIHZvaWQgKENhbGN1bGF0b3JzUG9saWNpZXNCaW5kZXJJbXBsOjoqU2ltcGxlTWV0aG9kKSgpOwpAQCAtMTYwLDcgKzE4MSw5IEBACiAgICAgcmV0dXJuIENvbnZlcnRUb1ZlY3Rvcihwcm9maWxlXy0+R2V0UHJlZnMoKS0+R2V0TGlzdChwb2xpY3lfbmFtZSkpOwogICB9CiAKLSAgLy8gRGV2aWNlIGFuZCB1c2VyIGJ1bGsgcHJpbnRlcnMuIFVub3duZWQuCisgIC8vIERldmljZSBhbmQgdXNlciBidWxrIHByaW50ZXJzIGNhbGN1bGF0b3IuIFVub3duZWQuIFRoZXkgYm90aCBtYXkgYmUgc2V0IHRvCisgIC8vIG51bGxwdHIgZHVyaW5nIHN5c3RlbSBzaHV0ZG93bi4gVGhlIHVzZXIgYnVsayBwcmludGVycyBjYWxjdWxhdG9yIGlzIGFsc28KKyAgLy8gc2V0IHRvIG51bGxwdHIgd2hlbiBjb3JyZXNwb25kaW5nIHByb2ZpbGUgaXMgYmVpbmcgZGVzdHJveWVkLgogICBiYXNlOjpXZWFrUHRyPEJ1bGtQcmludGVyc0NhbGN1bGF0b3I+IGRldmljZV9wcmludGVyc187CiAgIGJhc2U6OldlYWtQdHI8QnVsa1ByaW50ZXJzQ2FsY3VsYXRvcj4gdXNlcl9wcmludGVyc187CiAKQEAgLTE2OCw2ICsxOTEsNyBAQAogICBDcm9zU2V0dGluZ3MqIHNldHRpbmdzXzsKICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDcm9zU2V0dGluZ3M6Ok9ic2VydmVyU3Vic2NyaXB0aW9uPj4gc3Vic2NyaXB0aW9uc187CiAgIFByb2ZpbGUqIHByb2ZpbGVfOworICBBY2NvdW50SWQgYWNjb3VudF9pZF87CiAgIFByZWZDaGFuZ2VSZWdpc3RyYXIgcHJlZl9jaGFuZ2VfcmVnaXN0cmFyXzsKIAogICBTRVFVRU5DRV9DSEVDS0VSKHNlcXVlbmNlX2NoZWNrZXJfKTsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL3ByaW50aW5nL2VudGVycHJpc2VfcHJpbnRlcnNfcHJvdmlkZXIuY2MgYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9wcmludGluZy9lbnRlcnByaXNlX3ByaW50ZXJzX3Byb3ZpZGVyLmNjCmluZGV4IGQ5NmZiNzguLjVjYjk2ZWEgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL2Nocm9tZW9zL3ByaW50aW5nL2VudGVycHJpc2VfcHJpbnRlcnNfcHJvdmlkZXIuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvcHJpbnRpbmcvZW50ZXJwcmlzZV9wcmludGVyc19wcm92aWRlci5jYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL2Nocm9tZW9zL3ByaW50aW5nL2J1bGtfcHJpbnRlcnNfY2FsY3VsYXRvci5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL2Nocm9tZW9zL3ByaW50aW5nL2J1bGtfcHJpbnRlcnNfY2FsY3VsYXRvcl9mYWN0b3J5LmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvcHJpbnRpbmcvY2FsY3VsYXRvcnNfcG9saWNpZXNfYmluZGVyLmgiCisjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvcHJvZmlsZXMvcHJvZmlsZV9oZWxwZXIuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9zZXR0aW5ncy9jcm9zX3NldHRpbmdzLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvcG9saWN5L3Byb2ZpbGVfcG9saWN5X2Nvbm5lY3Rvci5oIgogI2luY2x1ZGUgImNocm9tZS9jb21tb24vcHJlZl9uYW1lcy5oIgpAQCAtMjEsNiArMjIsNyBAQAogI2luY2x1ZGUgImNvbXBvbmVudHMvcHJlZl9yZWdpc3RyeS9wcmVmX3JlZ2lzdHJ5X3N5bmNhYmxlLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9wcmVmcy9wcmVmX2NoYW5nZV9yZWdpc3RyYXIuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL3ByZWZzL3ByZWZfc2VydmljZS5oIgorI2luY2x1ZGUgImNvbXBvbmVudHMvdXNlcl9tYW5hZ2VyL3VzZXIuaCIKIAogbmFtZXNwYWNlIGNocm9tZW9zIHsKIApAQCAtNTQsMTAgKzU2LDE0IEBACiAgICAgICBkZXZpY2VfcHJpbnRlcnNfLT5BZGRPYnNlcnZlcih0aGlzKTsKICAgICAgIFJlY2FsY3VsYXRlQ29tcGxldGVGbGFnRm9yRGV2aWNlUHJpbnRlcnMoKTsKICAgICB9Ci0gICAgLy8gR2V0IGluc3RhbmNlIG9mIEJ1bGtQcmludGVyc0NhbGN1bGF0b3IgZm9yIHVzZXIgcG9saWNpZXMuCi0gICAgdXNlcl9wcmludGVyc18gPQotICAgICAgICBCdWxrUHJpbnRlcnNDYWxjdWxhdG9yRmFjdG9yeTo6R2V0KCktPkdldEZvclByb2ZpbGUocHJvZmlsZSk7Ci0gICAgaWYgKHVzZXJfcHJpbnRlcnNfKSB7CisgICAgLy8gQ2FsY3VsYXRlIGFjY291bnRfaWRfIGFuZCBnZXQgaW5zdGFuY2Ugb2YgQnVsa1ByaW50ZXJzQ2FsY3VsYXRvciBmb3IgdXNlcgorICAgIC8vIHBvbGljaWVzLgorICAgIGNvbnN0IHVzZXJfbWFuYWdlcjo6VXNlciogdXNlciA9CisgICAgICAgIFByb2ZpbGVIZWxwZXI6OkdldCgpLT5HZXRVc2VyQnlQcm9maWxlKHByb2ZpbGUpOworICAgIGlmICh1c2VyKSB7CisgICAgICBhY2NvdW50X2lkXyA9IHVzZXItPkdldEFjY291bnRJZCgpOworICAgICAgdXNlcl9wcmludGVyc18gPQorICAgICAgICAgIEJ1bGtQcmludGVyc0NhbGN1bGF0b3JGYWN0b3J5OjpHZXQoKS0+R2V0Rm9yQWNjb3VudElkKGFjY291bnRfaWRfKTsKICAgICAgIHVzZXJfcHJpbnRlcnNfLT5BZGRPYnNlcnZlcih0aGlzKTsKICAgICAgIFJlY2FsY3VsYXRlQ29tcGxldGVGbGFnRm9yVXNlclByaW50ZXJzKCk7CiAgICAgfQpAQCAtNzEsOCArNzcsMTAgQEAKICAgfkVudGVycHJpc2VQcmludGVyc1Byb3ZpZGVySW1wbCgpIG92ZXJyaWRlIHsKICAgICBpZiAoZGV2aWNlX3ByaW50ZXJzXykKICAgICAgIGRldmljZV9wcmludGVyc18tPlJlbW92ZU9ic2VydmVyKHRoaXMpOwotICAgIGlmICh1c2VyX3ByaW50ZXJzXykKKyAgICBpZiAodXNlcl9wcmludGVyc18pIHsKICAgICAgIHVzZXJfcHJpbnRlcnNfLT5SZW1vdmVPYnNlcnZlcih0aGlzKTsKKyAgICAgIEJ1bGtQcmludGVyc0NhbGN1bGF0b3JGYWN0b3J5OjpHZXQoKS0+UmVtb3ZlRm9yVXNlcklkKGFjY291bnRfaWRfKTsKKyAgICB9CiAgIH0KIAogICB2b2lkIEFkZE9ic2VydmVyKEVudGVycHJpc2VQcmludGVyc1Byb3ZpZGVyOjpPYnNlcnZlciogb2JzZXJ2ZXIpIG92ZXJyaWRlIHsKQEAgLTIyMSw2ICsyMjksNyBAQAogCiAgIC8vIFByb2ZpbGUgKHVzZXIpIHNldHRpbmdzLgogICBQcm9maWxlKiBwcm9maWxlXzsKKyAgQWNjb3VudElkIGFjY291bnRfaWRfOwogICBQcmVmQ2hhbmdlUmVnaXN0cmFyIHByZWZfY2hhbmdlX3JlZ2lzdHJhcl87CiAKICAgYmFzZTo6T2JzZXJ2ZXJMaXN0PEVudGVycHJpc2VQcmludGVyc1Byb3ZpZGVyOjpPYnNlcnZlcj46OlVuY2hlY2tlZApkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvY2hyb21lb3Mvd2lsY29fZHRjX3N1cHBvcnRkL3dpbGNvX2R0Y19zdXBwb3J0ZF9tZXNzYWdpbmcuY2MgYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy93aWxjb19kdGNfc3VwcG9ydGQvd2lsY29fZHRjX3N1cHBvcnRkX21lc3NhZ2luZy5jYwppbmRleCBmM2QwOTc3Li41OWEwNTJiIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy93aWxjb19kdGNfc3VwcG9ydGQvd2lsY29fZHRjX3N1cHBvcnRkX21lc3NhZ2luZy5jYworKysgYi9jaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy93aWxjb19kdGNfc3VwcG9ydGQvd2lsY29fZHRjX3N1cHBvcnRkX21lc3NhZ2luZy5jYwpAQCAtNDMsNyArNDMsNyBAQAogLy8gTm90ZTogdGhlIGxpc3Qgc2l6ZSBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoCiAvLyB8a1dpbGNvRHRjU3VwcG9ydGRIb3N0T3JpZ2luc1NpemV8LgogY29uc3QgY2hhciogY29uc3Qga1dpbGNvRHRjU3VwcG9ydGRIb3N0T3JpZ2luc1tdID0gewotICAgICJjaHJvbWUtZXh0ZW5zaW9uOi8vZWNobG5rY21kb2JrZGdjamdqYmljZW9jZWVvZW5qa2ovIn07CisgICAgImNocm9tZS1leHRlbnNpb246Ly9va2RubGVucGRlZ2JwZGduaWdncG9uZWJuYmtiZWVjYS8ifTsKIAogLy8gU2l6ZSBvZiB8a1dpbGNvRHRjU3VwcG9ydGRIb3N0T3JpZ2luc3wgYXJyYXkuCiBjb25zdCBzaXplX3Qga1dpbGNvRHRjU3VwcG9ydGRIb3N0T3JpZ2luc1NpemUgPQpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvZGV2dG9vbHMvZGV2dG9vbHNfdWlfYmluZGluZ3MuY2MgYi9jaHJvbWUvYnJvd3Nlci9kZXZ0b29scy9kZXZ0b29sc191aV9iaW5kaW5ncy5jYwppbmRleCBjMmExYzc1Li44MDA1NjcxZSAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvZGV2dG9vbHMvZGV2dG9vbHNfdWlfYmluZGluZ3MuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvZGV2dG9vbHMvZGV2dG9vbHNfdWlfYmluZGluZ3MuY2MKQEAgLTIwMCw5ICsyMDAsMTcgQEAKIH0KIAogc3RkOjp1bmlxdWVfcHRyPGJhc2U6OkRpY3Rpb25hcnlWYWx1ZT4gQnVpbGRPYmplY3RGb3JSZXNwb25zZSgKLSAgICBjb25zdCBuZXQ6Okh0dHBSZXNwb25zZUhlYWRlcnMqIHJoKSB7CisgICAgY29uc3QgbmV0OjpIdHRwUmVzcG9uc2VIZWFkZXJzKiByaCwKKyAgICBib29sIHN1Y2Nlc3MpIHsKICAgYXV0byByZXNwb25zZSA9IHN0ZDo6bWFrZV91bmlxdWU8YmFzZTo6RGljdGlvbmFyeVZhbHVlPigpOwotICByZXNwb25zZS0+U2V0SW50ZWdlcigic3RhdHVzQ29kZSIsIHJoID8gcmgtPnJlc3BvbnNlX2NvZGUoKSA6IDIwMCk7CisgIGludCByZXNwb25zZUNvZGUgPSAyMDA7CisgIGlmIChyaCkgeworICAgIHJlc3BvbnNlQ29kZSA9IHJoLT5yZXNwb25zZV9jb2RlKCk7CisgIH0gZWxzZSBpZiAoIXN1Y2Nlc3MpIHsKKyAgICAvLyBJbiBjYXNlIG9mIG5vIGhlYWRlcnMsIGFzc3VtZSBmaWxlOi8vIFVSTCBhbmQgZmFpbGVkIHRvIGxvYWQKKyAgICByZXNwb25zZUNvZGUgPSA0MDQ7CisgIH0KKyAgcmVzcG9uc2UtPlNldEludGVnZXIoInN0YXR1c0NvZGUiLCByZXNwb25zZUNvZGUpOwogCiAgIGF1dG8gaGVhZGVycyA9IHN0ZDo6bWFrZV91bmlxdWU8YmFzZTo6RGljdGlvbmFyeVZhbHVlPigpOwogICBzaXplX3QgaXRlcmF0b3IgPSAwOwpAQCAtNDE5LDcgKzQyNyw3IEBACiAgIH0KIAogICB2b2lkIE9uQ29tcGxldGUoYm9vbCBzdWNjZXNzKSBvdmVycmlkZSB7Ci0gICAgYXV0byByZXNwb25zZSA9IEJ1aWxkT2JqZWN0Rm9yUmVzcG9uc2UocmVzcG9uc2VfaGVhZGVyc18uZ2V0KCkpOworICAgIGF1dG8gcmVzcG9uc2UgPSBCdWlsZE9iamVjdEZvclJlc3BvbnNlKHJlc3BvbnNlX2hlYWRlcnNfLmdldCgpLCBzdWNjZXNzKTsKICAgICBjYWxsYmFja18uUnVuKHJlc3BvbnNlLmdldCgpKTsKIAogICAgIGJpbmRpbmdzXy0+bG9hZGVyc18uZXJhc2UoYmluZGluZ3NfLT5sb2FkZXJzXy5maW5kKHRoaXMpKTsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL2Rvd25sb2FkL2Rvd25sb2FkX3N0YXR1c191cGRhdGVyLmNjIGIvY2hyb21lL2Jyb3dzZXIvZG93bmxvYWQvZG93bmxvYWRfc3RhdHVzX3VwZGF0ZXIuY2MKaW5kZXggYjIxYWExY2MuLjFiM2UxODMgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL2Rvd25sb2FkL2Rvd25sb2FkX3N0YXR1c191cGRhdGVyLmNjCisrKyBiL2Nocm9tZS9icm93c2VyL2Rvd25sb2FkL2Rvd25sb2FkX3N0YXR1c191cGRhdGVyLmNjCkBAIC0xMywxMCArMTMsNiBAQAogI2luY2x1ZGUgImJhc2UvbWVtb3J5L3B0cl91dGlsLmgiCiAjaW5jbHVkZSAiYnVpbGQvYnVpbGRfY29uZmlnLmgiCiAKLSNpZiBkZWZpbmVkKE9TX0xJTlVYKSAmJiAhZGVmaW5lZChPU19DSFJPTUVPUykKLSNpbmNsdWRlICJ1aS92aWV3cy9saW51eF91aS9saW51eF91aS5oIgotI2VuZGlmCi0KIG5hbWVzcGFjZSB7CiAKIC8vIERvd25sb2FkU3RhdHVzVXBkYXRlcjo6VXBkYXRlQXBwSWNvbkRvd25sb2FkUHJvZ3Jlc3MoKSBleHBlY3RzIHRvIG9ubHkgYmUKQEAgLTEzMywxOSArMTI5LDkgQEAKICAgVXBkYXRlQXBwSWNvbkRvd25sb2FkUHJvZ3Jlc3MoaXRlbSk7CiB9CiAKLSNpZiBkZWZpbmVkKE9TX0FORFJPSUQpIHx8IChkZWZpbmVkKFVTRV9BVVJBKSAmJiAhZGVmaW5lZChPU19XSU4pKQorI2lmIGRlZmluZWQoT1NfQU5EUk9JRCkgfHwgZGVmaW5lZChPU19DSFJPTUVPUykKIHZvaWQgRG93bmxvYWRTdGF0dXNVcGRhdGVyOjpVcGRhdGVBcHBJY29uRG93bmxvYWRQcm9ncmVzcygKICAgICBkb3dubG9hZDo6RG93bmxvYWRJdGVtKiBkb3dubG9hZCkgewotI2lmIGRlZmluZWQoT1NfTElOVVgpICYmICFkZWZpbmVkKE9TX0NIUk9NRU9TKQotICBjb25zdCB2aWV3czo6TGludXhVSSogbGludXhfdWkgPSB2aWV3czo6TGludXhVSTo6aW5zdGFuY2UoKTsKLSAgaWYgKGxpbnV4X3VpKSB7Ci0gICAgZmxvYXQgcHJvZ3Jlc3MgPSAwOwotICAgIGludCBkb3dubG9hZF9jb3VudCA9IDA7Ci0gICAgR2V0UHJvZ3Jlc3MoJnByb2dyZXNzLCAmZG93bmxvYWRfY291bnQpOwotICAgIGxpbnV4X3VpLT5TZXREb3dubG9hZENvdW50KGRvd25sb2FkX2NvdW50KTsKLSAgICBsaW51eF91aS0+U2V0UHJvZ3Jlc3NGcmFjdGlvbihwcm9ncmVzcyk7Ci0gIH0KLSNlbmRpZgogICAvLyBUT0RPKGF2aSk6IEltcGxlbWVudCBmb3IgQW5kcm9pZD8KIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvdWkvbGliZ3RrdWkvdW5pdHlfc2VydmljZS5jYyBiL2Nocm9tZS9icm93c2VyL2Rvd25sb2FkL2Rvd25sb2FkX3N0YXR1c191cGRhdGVyX2xpbnV4LmNjCnNpbWlsYXJpdHkgaW5kZXggNzUlCnJlbmFtZSBmcm9tIGNocm9tZS9icm93c2VyL3VpL2xpYmd0a3VpL3VuaXR5X3NlcnZpY2UuY2MKcmVuYW1lIHRvIGNocm9tZS9icm93c2VyL2Rvd25sb2FkL2Rvd25sb2FkX3N0YXR1c191cGRhdGVyX2xpbnV4LmNjCmluZGV4IDQ2NzgwMDYuLjZkNzkxNzggMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3VpL2xpYmd0a3VpL3VuaXR5X3NlcnZpY2UuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvZG93bmxvYWQvZG93bmxvYWRfc3RhdHVzX3VwZGF0ZXJfbGludXguY2MKQEAgLTIsMzYgKzIsMzcgQEAKIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLSNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS9saWJndGt1aS91bml0eV9zZXJ2aWNlLmgiCisjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvZG93bmxvYWQvZG93bmxvYWRfc3RhdHVzX3VwZGF0ZXIuaCIKIAogI2luY2x1ZGUgPGRsZmNuLmg+Ci0jaW5jbHVkZSA8Z3RrL2d0ay5oPgogCiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHN0cmluZz4KIAogI2luY2x1ZGUgImJhc2UvZW52aXJvbm1lbnQuaCIKICNpbmNsdWRlICJiYXNlL25peC94ZGdfdXRpbC5oIgotI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL2xpYmd0a3VpL2d0a191dGlsLmgiCisjaW5jbHVkZSAiY2hyb21lL2NvbW1vbi9jaGFubmVsX2luZm8uaCIKKyNpbmNsdWRlICJ1aS9iYXNlL2dsaWIvZ2xpYl9pbnRlZ2Vycy5oIgogCiAvLyBVbml0eSBkYXRhIHR5cGVkZWZzLgogdHlwZWRlZiBzdHJ1Y3QgX1VuaXR5SW5zcGVjdG9yIFVuaXR5SW5zcGVjdG9yOwogdHlwZWRlZiBVbml0eUluc3BlY3RvciogKCp1bml0eV9pbnNwZWN0b3JfZ2V0X2RlZmF1bHRfZnVuYykodm9pZCk7Ci10eXBlZGVmIGdib29sZWFuICgqdW5pdHlfaW5zcGVjdG9yX2dldF91bml0eV9ydW5uaW5nX2Z1bmMpCi0gICAgKFVuaXR5SW5zcGVjdG9yKiBzZWxmKTsKK3R5cGVkZWYgZ2Jvb2xlYW4gKCp1bml0eV9pbnNwZWN0b3JfZ2V0X3VuaXR5X3J1bm5pbmdfZnVuYykoCisgICAgVW5pdHlJbnNwZWN0b3IqIHNlbGYpOwogCiB0eXBlZGVmIHN0cnVjdCBfVW5pdHlMYXVuY2hlckVudHJ5IFVuaXR5TGF1bmNoZXJFbnRyeTsKLXR5cGVkZWYgVW5pdHlMYXVuY2hlckVudHJ5KiAoKnVuaXR5X2xhdW5jaGVyX2VudHJ5X2dldF9mb3JfZGVza3RvcF9pZF9mdW5jKQotICAgIChjb25zdCBnY2hhciogZGVza3RvcF9pZCk7Cit0eXBlZGVmIFVuaXR5TGF1bmNoZXJFbnRyeSogKCp1bml0eV9sYXVuY2hlcl9lbnRyeV9nZXRfZm9yX2Rlc2t0b3BfaWRfZnVuYykoCisgICAgY29uc3QgZ2NoYXIqIGRlc2t0b3BfaWQpOwogdHlwZWRlZiB2b2lkICgqdW5pdHlfbGF1bmNoZXJfZW50cnlfc2V0X2NvdW50X2Z1bmMpKFVuaXR5TGF1bmNoZXJFbnRyeSogc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDY0IHZhbHVlKTsKLXR5cGVkZWYgdm9pZCAoKnVuaXR5X2xhdW5jaGVyX2VudHJ5X3NldF9jb3VudF92aXNpYmxlX2Z1bmMpCi0gICAgKFVuaXR5TGF1bmNoZXJFbnRyeSogc2VsZiwgZ2Jvb2xlYW4gdmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQ2NCB2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKCp1bml0eV9sYXVuY2hlcl9lbnRyeV9zZXRfY291bnRfdmlzaWJsZV9mdW5jKSgKKyAgICBVbml0eUxhdW5jaGVyRW50cnkqIHNlbGYsCisgICAgZ2Jvb2xlYW4gdmFsdWUpOwogdHlwZWRlZiB2b2lkICgqdW5pdHlfbGF1bmNoZXJfZW50cnlfc2V0X3Byb2dyZXNzX2Z1bmMpKFVuaXR5TGF1bmNoZXJFbnRyeSogc2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZG91YmxlIHZhbHVlKTsKLXR5cGVkZWYgdm9pZCAoKnVuaXR5X2xhdW5jaGVyX2VudHJ5X3NldF9wcm9ncmVzc192aXNpYmxlX2Z1bmMpCi0gICAgKFVuaXR5TGF1bmNoZXJFbnRyeSogc2VsZiwgZ2Jvb2xlYW4gdmFsdWUpOwotCit0eXBlZGVmIHZvaWQgKCp1bml0eV9sYXVuY2hlcl9lbnRyeV9zZXRfcHJvZ3Jlc3NfdmlzaWJsZV9mdW5jKSgKKyAgICBVbml0eUxhdW5jaGVyRW50cnkqIHNlbGYsCisgICAgZ2Jvb2xlYW4gdmFsdWUpOwogCiBuYW1lc3BhY2UgewogCkBAIC01OSw4ICs2MCw3IEBACiAgIGF0dGVtcHRlZF9sb2FkID0gdHJ1ZTsKIAogICBzdGQ6OnVuaXF1ZV9wdHI8YmFzZTo6RW52aXJvbm1lbnQ+IGVudihiYXNlOjpFbnZpcm9ubWVudDo6Q3JlYXRlKCkpOwotICBiYXNlOjpuaXg6OkRlc2t0b3BFbnZpcm9ubWVudCBkZXNrdG9wX2VudiA9Ci0gICAgICBHZXREZXNrdG9wRW52aXJvbm1lbnQoZW52LmdldCgpKTsKKyAgYmFzZTo6bml4OjpEZXNrdG9wRW52aXJvbm1lbnQgZGVza3RvcF9lbnYgPSBHZXREZXNrdG9wRW52aXJvbm1lbnQoZW52LmdldCgpKTsKIAogICAvLyBUaGUgImljb24tdGFza3MiIEtERSB0YXNrIG1hbmFnZXIgYWxzbyBob25vcnMgVW5pdHkgTGF1bmNoZXIgQVBJLgogICBpZiAoZGVza3RvcF9lbnYgIT0gYmFzZTo6bml4OjpERVNLVE9QX0VOVklST05NRU5UX1VOSVRZICYmCkBAIC05MiwxMiArOTIsMTEgQEAKICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dW5pdHlfbGF1bmNoZXJfZW50cnlfZ2V0X2Zvcl9kZXNrdG9wX2lkX2Z1bmM+KAogICAgICAgICAgIGRsc3ltKHVuaXR5X2xpYiwgInVuaXR5X2xhdW5jaGVyX2VudHJ5X2dldF9mb3JfZGVza3RvcF9pZCIpKTsKICAgaWYgKGVudHJ5X2dldF9mb3JfZGVza3RvcF9pZCkgewotICAgIHN0ZDo6c3RyaW5nIGRlc2t0b3BfaWQgPSBsaWJndGt1aTo6R2V0RGVza3RvcE5hbWUoZW52LmdldCgpKTsKKyAgICBzdGQ6OnN0cmluZyBkZXNrdG9wX2lkID0gY2hyb21lOjpHZXREZXNrdG9wTmFtZShlbnYuZ2V0KCkpOwogICAgIGNocm9tZV9lbnRyeSA9IGVudHJ5X2dldF9mb3JfZGVza3RvcF9pZChkZXNrdG9wX2lkLmNfc3RyKCkpOwogCi0gICAgZW50cnlfc2V0X2NvdW50ID0KLSAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1bml0eV9sYXVuY2hlcl9lbnRyeV9zZXRfY291bnRfZnVuYz4oCi0gICAgICAgICAgICBkbHN5bSh1bml0eV9saWIsICJ1bml0eV9sYXVuY2hlcl9lbnRyeV9zZXRfY291bnQiKSk7CisgICAgZW50cnlfc2V0X2NvdW50ID0gcmVpbnRlcnByZXRfY2FzdDx1bml0eV9sYXVuY2hlcl9lbnRyeV9zZXRfY291bnRfZnVuYz4oCisgICAgICAgIGRsc3ltKHVuaXR5X2xpYiwgInVuaXR5X2xhdW5jaGVyX2VudHJ5X3NldF9jb3VudCIpKTsKIAogICAgIGVudHJ5X3NldF9jb3VudF92aXNpYmxlID0KICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1bml0eV9sYXVuY2hlcl9lbnRyeV9zZXRfY291bnRfdmlzaWJsZV9mdW5jPigKQEAgLTExMywyMSArMTEyLDExIEBACiAgIH0KIH0KIAotfSAgLy8gbmFtZXNwYWNlCi0KLQotbmFtZXNwYWNlIHVuaXR5IHsKLQogYm9vbCBJc1J1bm5pbmcoKSB7Ci0gIEVuc3VyZUxpYlVuaXR5TG9hZGVkKCk7Ci0gIGlmIChpbnNwZWN0b3IgJiYgZ2V0X3VuaXR5X3J1bm5pbmcpCi0gICAgcmV0dXJuIGdldF91bml0eV9ydW5uaW5nKGluc3BlY3Rvcik7Ci0KLSAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gaW5zcGVjdG9yICYmIGdldF91bml0eV9ydW5uaW5nICYmIGdldF91bml0eV9ydW5uaW5nKGluc3BlY3Rvcik7CiB9CiAKIHZvaWQgU2V0RG93bmxvYWRDb3VudChpbnQgY291bnQpIHsKLSAgRW5zdXJlTGliVW5pdHlMb2FkZWQoKTsKICAgaWYgKGNocm9tZV9lbnRyeSAmJiBlbnRyeV9zZXRfY291bnQgJiYgZW50cnlfc2V0X2NvdW50X3Zpc2libGUpIHsKICAgICBlbnRyeV9zZXRfY291bnQoY2hyb21lX2VudHJ5LCBjb3VudCk7CiAgICAgZW50cnlfc2V0X2NvdW50X3Zpc2libGUoY2hyb21lX2VudHJ5LCBjb3VudCAhPSAwKTsKQEAgLTEzNSw3ICsxMjQsNiBAQAogfQogCiB2b2lkIFNldFByb2dyZXNzRnJhY3Rpb24oZmxvYXQgcGVyY2VudGFnZSkgewotICBFbnN1cmVMaWJVbml0eUxvYWRlZCgpOwogICBpZiAoY2hyb21lX2VudHJ5ICYmIGVudHJ5X3NldF9wcm9ncmVzcyAmJiBlbnRyeV9zZXRfcHJvZ3Jlc3NfdmlzaWJsZSkgewogICAgIGVudHJ5X3NldF9wcm9ncmVzcyhjaHJvbWVfZW50cnksIHBlcmNlbnRhZ2UpOwogICAgIGVudHJ5X3NldF9wcm9ncmVzc192aXNpYmxlKGNocm9tZV9lbnRyeSwKQEAgLTE0Myw0ICsxMzEsMTcgQEAKICAgfQogfQogCi19ICAvLyBuYW1lc3BhY2UgdW5pdHkKK30gIC8vIG5hbWVzcGFjZQorCit2b2lkIERvd25sb2FkU3RhdHVzVXBkYXRlcjo6VXBkYXRlQXBwSWNvbkRvd25sb2FkUHJvZ3Jlc3MoCisgICAgZG93bmxvYWQ6OkRvd25sb2FkSXRlbSogZG93bmxvYWQpIHsKKyAgLy8gT25seSBpbXBsZW1lbnRlZCBvbiBVbml0eSBmb3Igbm93LgorICBFbnN1cmVMaWJVbml0eUxvYWRlZCgpOworICBpZiAoIUlzUnVubmluZygpKQorICAgIHJldHVybjsKKyAgZmxvYXQgcHJvZ3Jlc3MgPSAwOworICBpbnQgZG93bmxvYWRfY291bnQgPSAwOworICBHZXRQcm9ncmVzcygmcHJvZ3Jlc3MsICZkb3dubG9hZF9jb3VudCk7CisgIFNldERvd25sb2FkQ291bnQoZG93bmxvYWRfY291bnQpOworICBTZXRQcm9ncmVzc0ZyYWN0aW9uKHByb2dyZXNzKTsKK30KZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL2V4dGVuc2lvbnMvYXBpL2NlcnRpZmljYXRlX3Byb3ZpZGVyL2NlcnRpZmljYXRlX3Byb3ZpZGVyX2FwaXRlc3QuY2MgYi9jaHJvbWUvYnJvd3Nlci9leHRlbnNpb25zL2FwaS9jZXJ0aWZpY2F0ZV9wcm92aWRlci9jZXJ0aWZpY2F0ZV9wcm92aWRlcl9hcGl0ZXN0LmNjCmluZGV4IDUwN2RiYWQuLjFkZTIzMjAgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL2V4dGVuc2lvbnMvYXBpL2NlcnRpZmljYXRlX3Byb3ZpZGVyL2NlcnRpZmljYXRlX3Byb3ZpZGVyX2FwaXRlc3QuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvZXh0ZW5zaW9ucy9hcGkvY2VydGlmaWNhdGVfcHJvdmlkZXIvY2VydGlmaWNhdGVfcHJvdmlkZXJfYXBpdGVzdC5jYwpAQCAtMjU3LDggKzI1Nyw3IEBACiAKIH0gIC8vIG5hbWVzcGFjZQogCi0vLyBGbGFreTogY3JidWcuY29tLzEwMTE2MDYuCi1JTl9QUk9DX0JST1dTRVJfVEVTVF9GKENlcnRpZmljYXRlUHJvdmlkZXJBcGlUZXN0LCBESVNBQkxFRF9CYXNpYykgeworSU5fUFJPQ19CUk9XU0VSX1RFU1RfRihDZXJ0aWZpY2F0ZVByb3ZpZGVyQXBpVGVzdCwgQmFzaWMpIHsKICAgLy8gU3RhcnQgYW4gSFRUUFMgdGVzdCBzZXJ2ZXIgdGhhdCByZXF1ZXN0cyBhIGNsaWVudCBjZXJ0aWZpY2F0ZS4KICAgbmV0OjpTcGF3bmVkVGVzdFNlcnZlcjo6U1NMT3B0aW9ucyBzc2xfb3B0aW9uczsKICAgc3NsX29wdGlvbnMucmVxdWVzdF9jbGllbnRfY2VydGlmaWNhdGUgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvZXh0ZW5zaW9ucy9hcGkvaW5wdXRfaW1lL2lucHV0X2ltZV9hcGlfY2hyb21lb3MuY2MgYi9jaHJvbWUvYnJvd3Nlci9leHRlbnNpb25zL2FwaS9pbnB1dF9pbWUvaW5wdXRfaW1lX2FwaV9jaHJvbWVvcy5jYwppbmRleCA5ZmRjODBlZi4uYjhiMWFiYyAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvZXh0ZW5zaW9ucy9hcGkvaW5wdXRfaW1lL2lucHV0X2ltZV9hcGlfY2hyb21lb3MuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvZXh0ZW5zaW9ucy9hcGkvaW5wdXRfaW1lL2lucHV0X2ltZV9hcGlfY2hyb21lb3MuY2MKQEAgLTM1NCw2ICszNTQsOCBAQAogICAgICAgcmV0dXJuIGlucHV0X21ldGhvZF9wcml2YXRlOjpBVVRPX0NBUElUQUxJWkVfVFlQRV9DSEFSQUNURVJTOwogICAgIGlmIChmbGFncyAmIHVpOjpURVhUX0lOUFVUX0ZMQUdfQVVUT0NBUElUQUxJWkVfV09SRFMpCiAgICAgICByZXR1cm4gaW5wdXRfbWV0aG9kX3ByaXZhdGU6OkFVVE9fQ0FQSVRBTElaRV9UWVBFX1dPUkRTOworICAgIGlmIChmbGFncyAmIHVpOjpURVhUX0lOUFVUX0ZMQUdfQVVUT0NBUElUQUxJWkVfU0VOVEVOQ0VTKQorICAgICAgcmV0dXJuIGlucHV0X21ldGhvZF9wcml2YXRlOjpBVVRPX0NBUElUQUxJWkVfVFlQRV9TRU5URU5DRVM7CiAKICAgICAvLyBBdXRvY2FwaXRhbGl6ZSBmbGFnIG1heSBiZSBtaXNzaW5nIGZvciBuYXRpdmUgdGV4dCBmaWVsZHMuCiAgICAgLy8gU2VlIGh0dHBzOi8vY3JidWcuY29tLzEwMDI3MTMuCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9leHRlbnNpb25zL2FwaS9zYWZlX2Jyb3dzaW5nX3ByaXZhdGUvc2FmZV9icm93c2luZ19wcml2YXRlX2V2ZW50X3JvdXRlci5jYyBiL2Nocm9tZS9icm93c2VyL2V4dGVuc2lvbnMvYXBpL3NhZmVfYnJvd3NpbmdfcHJpdmF0ZS9zYWZlX2Jyb3dzaW5nX3ByaXZhdGVfZXZlbnRfcm91dGVyLmNjCmluZGV4IDQ4MzYzY2UuLjNhM2Q3MDUgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL2V4dGVuc2lvbnMvYXBpL3NhZmVfYnJvd3NpbmdfcHJpdmF0ZS9zYWZlX2Jyb3dzaW5nX3ByaXZhdGVfZXZlbnRfcm91dGVyLmNjCisrKyBiL2Nocm9tZS9icm93c2VyL2V4dGVuc2lvbnMvYXBpL3NhZmVfYnJvd3NpbmdfcHJpdmF0ZS9zYWZlX2Jyb3dzaW5nX3ByaXZhdGVfZXZlbnRfcm91dGVyLmNjCkBAIC0yMiw2ICsyMiw4IEBACiAjaW5jbHVkZSAiY29tcG9uZW50cy9wb2xpY3kvY29yZS9jb21tb24vY2xvdWQvY2xvdWRfcG9saWN5X2NsaWVudC5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvcG9saWN5L2NvcmUvY29tbW9uL2Nsb3VkL2RldmljZV9tYW5hZ2VtZW50X3NlcnZpY2UuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL3BvbGljeS9jb3JlL2NvbW1vbi9jbG91ZC9yZWFsdGltZV9yZXBvcnRpbmdfam9iX2NvbmZpZ3VyYXRpb24uaCIKKyNpbmNsdWRlICJjb21wb25lbnRzL3ByZWZzL3ByZWZfc2VydmljZS5oIgorI2luY2x1ZGUgImNvbXBvbmVudHMvc2FmZV9icm93c2luZy9jb21tb24vc2FmZV9icm93c2luZ19wcmVmcy5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvc2FmZV9icm93c2luZy9wcm90by93ZWJwcm90ZWN0LnBiLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9zaWduaW4vcHVibGljL2lkZW50aXR5X21hbmFnZXIvaWRlbnRpdHlfbWFuYWdlci5oIgogI2luY2x1ZGUgImNvbnRlbnQvcHVibGljL2Jyb3dzZXIvYnJvd3Nlcl9jb250ZXh0LmgiCkBAIC03MCw3ICs3MiwxOCBAQAogICAgIGNvbnRlbnQ6OkJyb3dzZXJDb250ZXh0KiBjb250ZXh0KQogICAgIDogY29udGV4dF8oY29udGV4dCkgewogICBldmVudF9yb3V0ZXJfID0gRXZlbnRSb3V0ZXI6OkdldChjb250ZXh0Xyk7Ci0gIEluaXRSZWFsdGltZVJlcG9ydGluZ0NsaWVudCgpOworCisgIC8vIGdfYnJvd3Nlcl9wcm9jZXNzIGFuZC9vciBnX2Jyb3dzZXJfcHJvY2Vzcy0+bG9jYWxfc3RhdGUoKSBtYXkgYmUgbnVsbAorICAvLyBpbiB0ZXN0cy4KKyAgaWYgKGdfYnJvd3Nlcl9wcm9jZXNzICYmIGdfYnJvd3Nlcl9wcm9jZXNzLT5sb2NhbF9zdGF0ZSgpKSB7CisgICAgUmVhbHRpbWVSZXBvcnRpbmdQcmVmQ2hhbmdlZChzdGQ6OnN0cmluZygpKTsKKyAgICByZWdpc3RyYXJfLkluaXQoZ19icm93c2VyX3Byb2Nlc3MtPmxvY2FsX3N0YXRlKCkpOworICAgIHJlZ2lzdHJhcl8uQWRkKAorICAgICAgICBwcmVmczo6a1Vuc2FmZUV2ZW50c1JlcG9ydGluZ0VuYWJsZWQsCisgICAgICAgIGJhc2U6OkJpbmRSZXBlYXRpbmcoCisgICAgICAgICAgICAmU2FmZUJyb3dzaW5nUHJpdmF0ZUV2ZW50Um91dGVyOjpSZWFsdGltZVJlcG9ydGluZ1ByZWZDaGFuZ2VkLAorICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOworICB9CiB9CiAKIFNhZmVCcm93c2luZ1ByaXZhdGVFdmVudFJvdXRlcjo6flNhZmVCcm93c2luZ1ByaXZhdGVFdmVudFJvdXRlcigpIHt9CkBAIC05OCw3ICsxMTEsNyBAQAogICAgIGV2ZW50X3JvdXRlcl8tPkJyb2FkY2FzdEV2ZW50KHN0ZDo6bW92ZShleHRlbnNpb25fZXZlbnQpKTsKICAgfQogCi0gIGlmIChjbGllbnRfKSB7CisgIGlmIChJc1JlYWx0aW1lUmVwb3J0aW5nRW5hYmxlZCgpKSB7CiAgICAgLy8gQ29udmVydCB8cGFyYW1zfCB0byBhIHJlYWwtdGltZSBldmVudCBkaWN0aW9uYXJ5IGFuZCByZXBvcnQgaXQuCiAgICAgYmFzZTo6VmFsdWUgZXZlbnQoYmFzZTo6VmFsdWU6OlR5cGU6OkRJQ1RJT05BUlkpOwogICAgIGV2ZW50LlNldFN0cmluZ0tleShrS2V5VXJsLCBwYXJhbXMudXJsKTsKQEAgLTEyMyw3ICsxMzYsNyBAQAogICAgIGV2ZW50X3JvdXRlcl8tPkJyb2FkY2FzdEV2ZW50KHN0ZDo6bW92ZShleHRlbnNpb25fZXZlbnQpKTsKICAgfQogCi0gIGlmIChjbGllbnRfKSB7CisgIGlmIChJc1JlYWx0aW1lUmVwb3J0aW5nRW5hYmxlZCgpKSB7CiAgICAgLy8gQ29udmVydCB8cGFyYW1zfCB0byBhIHJlYWwtdGltZSBldmVudCBkaWN0aW9uYXJ5IGFuZCByZXBvcnQgaXQuCiAgICAgYmFzZTo6VmFsdWUgZXZlbnQoYmFzZTo6VmFsdWU6OlR5cGU6OkRJQ1RJT05BUlkpOwogICAgIGV2ZW50LlNldFN0cmluZ0tleShrS2V5VXNlck5hbWUsIHVzZXJfbmFtZSk7CkBAIC0xNTQsNyArMTY3LDcgQEAKICAgICBldmVudF9yb3V0ZXJfLT5Ccm9hZGNhc3RFdmVudChzdGQ6Om1vdmUoZXh0ZW5zaW9uX2V2ZW50KSk7CiAgIH0KIAotICBpZiAoY2xpZW50XykgeworICBpZiAoSXNSZWFsdGltZVJlcG9ydGluZ0VuYWJsZWQoKSkgewogICAgIC8vIENvbnZlcnQgfHBhcmFtc3wgdG8gYSByZWFsLXRpbWUgZXZlbnQgZGljdGlvbmFyeSBhbmQgcmVwb3J0IGl0LgogICAgIGJhc2U6OlZhbHVlIGV2ZW50KGJhc2U6OlZhbHVlOjpUeXBlOjpESUNUSU9OQVJZKTsKICAgICBldmVudC5TZXRTdHJpbmdLZXkoa0tleVVybCwgcGFyYW1zLnVybCk7CkBAIC0xOTAsNyArMjAzLDcgQEAKICAgICBldmVudF9yb3V0ZXJfLT5Ccm9hZGNhc3RFdmVudChzdGQ6Om1vdmUoZXh0ZW5zaW9uX2V2ZW50KSk7CiAgIH0KIAotICBpZiAoY2xpZW50XykgeworICBpZiAoSXNSZWFsdGltZVJlcG9ydGluZ0VuYWJsZWQoKSkgewogICAgIC8vIENvbnZlcnQgfHBhcmFtc3wgdG8gYSByZWFsLXRpbWUgZXZlbnQgZGljdGlvbmFyeSBhbmQgcmVwb3J0IGl0LgogICAgIGJhc2U6OlZhbHVlIGV2ZW50KGJhc2U6OlZhbHVlOjpUeXBlOjpESUNUSU9OQVJZKTsKICAgICBldmVudC5TZXRTdHJpbmdLZXkoa0tleVVybCwgcGFyYW1zLnVybCk7CkBAIC0yMjcsNyArMjQwLDcgQEAKICAgICBldmVudF9yb3V0ZXJfLT5Ccm9hZGNhc3RFdmVudChzdGQ6Om1vdmUoZXh0ZW5zaW9uX2V2ZW50KSk7CiAgIH0KIAotICBpZiAoY2xpZW50XykgeworICBpZiAoSXNSZWFsdGltZVJlcG9ydGluZ0VuYWJsZWQoKSkgewogICAgIC8vIENvbnZlcnQgfHBhcmFtc3wgdG8gYSByZWFsLXRpbWUgZXZlbnQgZGljdGlvbmFyeSBhbmQgcmVwb3J0IGl0LgogICAgIGJhc2U6OlZhbHVlIGV2ZW50KGJhc2U6OlZhbHVlOjpUeXBlOjpESUNUSU9OQVJZKTsKICAgICBldmVudC5TZXRTdHJpbmdLZXkoa0tleVVybCwgcGFyYW1zLnVybCk7CkBAIC0yNDQsNyArMjU3LDcgQEAKICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZV9uYW1lLAogICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkb3dubG9hZF9kaWdlc3Rfc2hhMjU2LAogICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0aHJlYXRfdHlwZSkgewotICBpZiAoY2xpZW50XykgeworICBpZiAoSXNSZWFsdGltZVJlcG9ydGluZ0VuYWJsZWQoKSkgewogICAgIC8vIENyZWF0ZSBhIHJlYWwtdGltZSBldmVudCBkaWN0aW9uYXJ5IGZyb20gdGhlIGFyZ3VtZW50cyBhbmQgcmVwb3J0IGl0LgogICAgIGJhc2U6OlZhbHVlIGV2ZW50KGJhc2U6OlZhbHVlOjpUeXBlOjpESUNUSU9OQVJZKTsKICAgICBldmVudC5TZXRTdHJpbmdLZXkoa0tleVVybCwgdXJsLnNwZWMoKSk7CkBAIC0yNjEsNyArMjc0LDcgQEAKICAgICBjb25zdCBHVVJMJiB1cmwsCiAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfbmFtZSwKICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZG93bmxvYWRfZGlnZXN0X3NoYTI1NikgewotICBpZiAoY2xpZW50XykgeworICBpZiAoSXNSZWFsdGltZVJlcG9ydGluZ0VuYWJsZWQoKSkgewogICAgIC8vIENyZWF0ZSBhIHJlYWwtdGltZSBldmVudCBkaWN0aW9uYXJ5IGZyb20gdGhlIGFyZ3VtZW50cyBhbmQgcmVwb3J0IGl0LgogICAgIGJhc2U6OlZhbHVlIGV2ZW50KGJhc2U6OlZhbHVlOjpUeXBlOjpESUNUSU9OQVJZKTsKICAgICBldmVudC5TZXRTdHJpbmdLZXkoa0tleVVybCwgdXJsLnNwZWMoKSk7CkBAIC0yODIsNyArMjk1LDcgQEAKICAgICBjb25zdCBHVVJMJiB1cmwsCiAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfbmFtZSwKICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZG93bmxvYWRfZGlnZXN0X3NoYTI1NikgewotICBpZiAoY2xpZW50XykgeworICBpZiAoSXNSZWFsdGltZVJlcG9ydGluZ0VuYWJsZWQoKSkgewogICAgIC8vIENyZWF0ZSBhIHJlYWwtdGltZSBldmVudCBkaWN0aW9uYXJ5IGZyb20gdGhlIGFyZ3VtZW50cyBhbmQgcmVwb3J0IGl0LgogICAgIGJhc2U6OlZhbHVlIGV2ZW50KGJhc2U6OlZhbHVlOjpUeXBlOjpESUNUSU9OQVJZKTsKICAgICBldmVudC5TZXRTdHJpbmdLZXkoa0tleVVybCwgdXJsLnNwZWMoKSk7CkBAIC0yOTgsNyArMzExLDcgQEAKICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZV9uYW1lLAogICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkb3dubG9hZF9kaWdlc3Rfc2hhMjU2LAogICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0aHJlYXRfdHlwZSkgewotICBpZiAoIWNsaWVudF8pCisgIGlmICghSXNSZWFsdGltZVJlcG9ydGluZ0VuYWJsZWQoKSkKICAgICByZXR1cm47CiAKICAgLy8gQ3JlYXRlIGEgcmVhbC10aW1lIGV2ZW50IGRpY3Rpb25hcnkgYW5kIHJlcG9ydCBpdC4KQEAgLTMxNyw3ICszMzAsNyBAQAogICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlX25hbWUsCiAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRvd25sb2FkX2RpZ2VzdF9zaGEyNTYsCiAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRocmVhdF90eXBlKSB7Ci0gIGlmICghY2xpZW50XykKKyAgaWYgKCFJc1JlYWx0aW1lUmVwb3J0aW5nRW5hYmxlZCgpKQogICAgIHJldHVybjsKIAogICAvLyBDcmVhdGUgYSByZWFsLXRpbWUgZXZlbnQgZGljdGlvbmFyeSBhbmQgcmVwb3J0IGl0LgpAQCAtMzM5LDYgKzM1MiwxMCBAQAogCiB2b2lkIFNhZmVCcm93c2luZ1ByaXZhdGVFdmVudFJvdXRlcjo6SW5pdFJlYWx0aW1lUmVwb3J0aW5nQ2xpZW50KCkgewogI2lmICFkZWZpbmVkKE9TX0NIUk9NRU9TKQorICAvLyBJZiBhbHJlYWR5IGluaXRpYWxpemVkLCBkbyBub3RoaW5nLgorICBpZiAoY2xpZW50XykKKyAgICByZXR1cm47CisKICAgLy8gVGhpcyBtZXRob2QgaXMgbm90IGNvbXBpbGVkIG9uIENocm9tZSBPUyBiZWNhdXNlCiAgIC8vIE1hY2hpbmVMZXZlbFVzZXJDbG91ZFBvbGljeUNvbnRyb2xsZXIgZG9lcyBub3QgZXhpc3QuIEFsc28sCiAgIC8vIHBvbGljeTo6QnJvd3NlckRNVG9rZW5TdG9yYWdlOjpHZXQoKS0+UmV0cmlldmVETVRva2VuKCkgZG9lc24ndCByZXR1cm4gYQpAQCAtNDA1LDYgKzQyMiwyMSBAQAogI2VuZGlmCiB9CiAKK2Jvb2wgU2FmZUJyb3dzaW5nUHJpdmF0ZUV2ZW50Um91dGVyOjpJc1JlYWx0aW1lUmVwb3J0aW5nRW5hYmxlZCgpIHsKKyAgLy8gZ19icm93c2VyX3Byb2Nlc3MgYW5kL29yIGdfYnJvd3Nlcl9wcm9jZXNzLT5sb2NhbF9zdGF0ZSgpIG1heSBiZSBudWxsCisgIC8vIGluIHRlc3RzLgorICByZXR1cm4gZ19icm93c2VyX3Byb2Nlc3MgJiYgZ19icm93c2VyX3Byb2Nlc3MtPmxvY2FsX3N0YXRlKCkgJiYKKyAgICAgICAgIGdfYnJvd3Nlcl9wcm9jZXNzLT5sb2NhbF9zdGF0ZSgpLT5HZXRCb29sZWFuKAorICAgICAgICAgICAgIHByZWZzOjprVW5zYWZlRXZlbnRzUmVwb3J0aW5nRW5hYmxlZCk7Cit9CisKK3ZvaWQgU2FmZUJyb3dzaW5nUHJpdmF0ZUV2ZW50Um91dGVyOjpSZWFsdGltZVJlcG9ydGluZ1ByZWZDaGFuZ2VkKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcmVmKSB7CisgIC8vIElmIHRoZSByZXBvcnRpbmcgcG9saWN5IGhhcyBiZWVuIHR1cm5lZCBvbiwgdHJ5IHRvIGluaXRpYWxpemVkIG5vdy4KKyAgaWYgKElzUmVhbHRpbWVSZXBvcnRpbmdFbmFibGVkKCkpCisgICAgSW5pdFJlYWx0aW1lUmVwb3J0aW5nQ2xpZW50KCk7Cit9CisKIHZvaWQgU2FmZUJyb3dzaW5nUHJpdmF0ZUV2ZW50Um91dGVyOjpSZXBvcnRSZWFsdGltZUV2ZW50KGNvbnN0IGNoYXIqIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpWYWx1ZSBldmVudCkgewogICAvLyBGb3JtYXQgdGhlIGN1cnJlbnQgdGltZSAoVVRDKSBpbiBSRkMzMzM5IGZvcm1hdC4KZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL2V4dGVuc2lvbnMvYXBpL3NhZmVfYnJvd3NpbmdfcHJpdmF0ZS9zYWZlX2Jyb3dzaW5nX3ByaXZhdGVfZXZlbnRfcm91dGVyLmggYi9jaHJvbWUvYnJvd3Nlci9leHRlbnNpb25zL2FwaS9zYWZlX2Jyb3dzaW5nX3ByaXZhdGUvc2FmZV9icm93c2luZ19wcml2YXRlX2V2ZW50X3JvdXRlci5oCmluZGV4IDU3NzFhOTI4Li5mY2MwYjI1IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9leHRlbnNpb25zL2FwaS9zYWZlX2Jyb3dzaW5nX3ByaXZhdGUvc2FmZV9icm93c2luZ19wcml2YXRlX2V2ZW50X3JvdXRlci5oCisrKyBiL2Nocm9tZS9icm93c2VyL2V4dGVuc2lvbnMvYXBpL3NhZmVfYnJvd3NpbmdfcHJpdmF0ZS9zYWZlX2Jyb3dzaW5nX3ByaXZhdGVfZXZlbnRfcm91dGVyLmgKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlICJiYXNlL21hY3Jvcy5oIgogI2luY2x1ZGUgImJhc2UvdmFsdWVzLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9rZXllZF9zZXJ2aWNlL2NvcmUva2V5ZWRfc2VydmljZS5oIgorI2luY2x1ZGUgImNvbXBvbmVudHMvcHJlZnMvcHJlZl9jaGFuZ2VfcmVnaXN0cmFyLmgiCiAKIG5hbWVzcGFjZSBjb250ZW50IHsKIGNsYXNzIEJyb3dzZXJDb250ZXh0OwpAQCAtMTQyLDYgKzE0MywxMiBAQAogICAvLyB3aXRoIENCQ00gYW5kIHRoZSBhcHByb3ByaWF0ZSBwb2xpY2llcyBhcmUgZW5hYmxlZC4KICAgdm9pZCBJbml0UmVhbHRpbWVSZXBvcnRpbmdDbGllbnQoKTsKIAorICAvLyBEZXRlcm1pbmVzIGlmIHRoZSByZWFsLXRpbWUgcmVwb3J0aW5nIGZlYXR1cmUgaXMgZW5hYmxlZC4KKyAgYm9vbCBJc1JlYWx0aW1lUmVwb3J0aW5nRW5hYmxlZCgpOworCisgIC8vIENhbGxlZCB3aGVuZXZlciB0aGUgcmVhbC10aW1lIHJlcG9ydGluZyBwb2xpY3kgY2hhbmdlcy4KKyAgdm9pZCBSZWFsdGltZVJlcG9ydGluZ1ByZWZDaGFuZ2VkKGNvbnN0IHN0ZDo6c3RyaW5nJiBwcmVmKTsKKwogICAvLyBSZXBvcnQgc2FmZSBicm93c2luZyBldmVudCB0aHJvdWdoIHJlYWwtdGltZSByZXBvcnRpbmcgY2hhbm5lbCwgaWYgZW5hYmxlZC4KICAgdm9pZCBSZXBvcnRSZWFsdGltZUV2ZW50KGNvbnN0IGNoYXIqIG5hbWUsIGJhc2U6OlZhbHVlIGV2ZW50KTsKIApAQCAtMTUzLDYgKzE2MCw3IEBACiAgIHNpZ25pbjo6SWRlbnRpdHlNYW5hZ2VyKiBpZGVudGl0eV9tYW5hZ2VyXyA9IG51bGxwdHI7CiAgIEV2ZW50Um91dGVyKiBldmVudF9yb3V0ZXJfID0gbnVsbHB0cjsKICAgc3RkOjp1bmlxdWVfcHRyPHBvbGljeTo6Q2xvdWRQb2xpY3lDbGllbnQ+IGNsaWVudF87CisgIFByZWZDaGFuZ2VSZWdpc3RyYXIgcmVnaXN0cmFyXzsKIAogICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oU2FmZUJyb3dzaW5nUHJpdmF0ZUV2ZW50Um91dGVyKTsKIH07CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9leHRlbnNpb25zL2FwaS9zYWZlX2Jyb3dzaW5nX3ByaXZhdGUvc2FmZV9icm93c2luZ19wcml2YXRlX2V2ZW50X3JvdXRlcl91bml0dGVzdC5jYyBiL2Nocm9tZS9icm93c2VyL2V4dGVuc2lvbnMvYXBpL3NhZmVfYnJvd3NpbmdfcHJpdmF0ZS9zYWZlX2Jyb3dzaW5nX3ByaXZhdGVfZXZlbnRfcm91dGVyX3VuaXR0ZXN0LmNjCmluZGV4IDA5ZDIyNTgyZC4uNzkxMzZjMSAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvZXh0ZW5zaW9ucy9hcGkvc2FmZV9icm93c2luZ19wcml2YXRlL3NhZmVfYnJvd3NpbmdfcHJpdmF0ZV9ldmVudF9yb3V0ZXJfdW5pdHRlc3QuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvZXh0ZW5zaW9ucy9hcGkvc2FmZV9icm93c2luZ19wcml2YXRlL3NhZmVfYnJvd3NpbmdfcHJpdmF0ZV9ldmVudF9yb3V0ZXJfdW5pdHRlc3QuY2MKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlICJjaHJvbWUvdGVzdC9iYXNlL3Rlc3RpbmdfcHJvZmlsZV9tYW5hZ2VyLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9wb2xpY3kvY29yZS9jb21tb24vY2xvdWQvbW9ja19jbG91ZF9wb2xpY3lfY2xpZW50LmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9wb2xpY3kvY29yZS9jb21tb24vY2xvdWQvcmVhbHRpbWVfcmVwb3J0aW5nX2pvYl9jb25maWd1cmF0aW9uLmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9zYWZlX2Jyb3dzaW5nL2NvbW1vbi9zYWZlX2Jyb3dzaW5nX3ByZWZzLmgiCiAjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvdGVzdC9icm93c2VyX3Rhc2tfZW52aXJvbm1lbnQuaCIKICNpbmNsdWRlICJleHRlbnNpb25zL2Jyb3dzZXIvdGVzdF9ldmVudF9yb3V0ZXIuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCIKQEAgLTEwOCwxMCArMTA5LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUEhJU0hJTkciLCAtMjAxKTsKICAgfQogCi0gIHZvaWQgU2V0VXBSb3V0ZXJzKCkgewotICAgIGV2ZW50X3JvdXRlcl8gPSBleHRlbnNpb25zOjpDcmVhdGVBbmRVc2VUZXN0RXZlbnRSb3V0ZXIocHJvZmlsZV8pOwotICAgIFNhZmVCcm93c2luZ1ByaXZhdGVFdmVudFJvdXRlckZhY3Rvcnk6OkdldEluc3RhbmNlKCktPlNldFRlc3RpbmdGYWN0b3J5KAotICAgICAgICBwcm9maWxlXywgYmFzZTo6QmluZFJlcGVhdGluZygmQnVpbGRTYWZlQnJvd3NpbmdQcml2YXRlRXZlbnRSb3V0ZXIpKTsKKyAgdm9pZCBTZXRSZXBvcnRpbmdQb2xpY3koYm9vbCBlbmFibGVkKSB7CisgICAgVGVzdGluZ0Jyb3dzZXJQcm9jZXNzOjpHZXRHbG9iYWwoKS0+bG9jYWxfc3RhdGUoKS0+U2V0Qm9vbGVhbigKKyAgICAgICAgcHJlZnM6OmtVbnNhZmVFdmVudHNSZXBvcnRpbmdFbmFibGVkLCBlbmFibGVkKTsKKworICAgIC8vIElmIHdlIGFyZSBub3QgZW5hYmxpbmcgcmVwb3J0aW5nLCBvciBpZiB0aGUgY2xpZW50IGhhcyBhbHJlYWR5IGJlZW4KKyAgICAvLyBzZXQgZm9yIHRlc3RpbmcsIGp1c3QgcmV0dXJuLgorICAgIGlmICghZW5hYmxlZCB8fCBjbGllbnRfKQorICAgICAgcmV0dXJuOwogCiAgICAgLy8gU2V0IGEgbW9jayBjbG91ZCBwb2xpY3kgY2xpZW50IGluIHRoZSByb3V0ZXIuICBUaGUgcm91dGVyIHdpbGwgb3duIHRoZQogICAgIC8vIGNsaWVudCwgYnV0IGEgcG9pbnRlciB0byB0aGUgY2xpZW50IGlzIG1haW50YWluZWQgaW4gdGhlIHRlc3QgY2xhc3MgdG8KQEAgLTEyMiwxMiArMTI3LDIwIEBACiAgICAgICAgIC0+U2V0Q2xvdWRQb2xpY3lDbGllbnRGb3JUZXN0aW5nKHN0ZDo6bW92ZShjbGllbnQpKTsKICAgfQogCisgIHZvaWQgU2V0VXBSb3V0ZXJzKGJvb2wgcmVhbHRpbWVfcmVwb3J0aW5nX2VuYWJsZSA9IHRydWUpIHsKKyAgICBldmVudF9yb3V0ZXJfID0gZXh0ZW5zaW9uczo6Q3JlYXRlQW5kVXNlVGVzdEV2ZW50Um91dGVyKHByb2ZpbGVfKTsKKyAgICBTYWZlQnJvd3NpbmdQcml2YXRlRXZlbnRSb3V0ZXJGYWN0b3J5OjpHZXRJbnN0YW5jZSgpLT5TZXRUZXN0aW5nRmFjdG9yeSgKKyAgICAgICAgcHJvZmlsZV8sIGJhc2U6OkJpbmRSZXBlYXRpbmcoJkJ1aWxkU2FmZUJyb3dzaW5nUHJpdmF0ZUV2ZW50Um91dGVyKSk7CisKKyAgICBTZXRSZXBvcnRpbmdQb2xpY3kocmVhbHRpbWVfcmVwb3J0aW5nX2VuYWJsZSk7CisgIH0KKwogIHByb3RlY3RlZDoKICAgY29udGVudDo6QnJvd3NlclRhc2tFbnZpcm9ubWVudCB0YXNrX2Vudmlyb25tZW50XzsKICAgVGVzdGluZ1Byb2ZpbGVNYW5hZ2VyIHByb2ZpbGVfbWFuYWdlcl87CiAgIFRlc3RpbmdQcm9maWxlKiBwcm9maWxlXzsKICAgZXh0ZW5zaW9uczo6VGVzdEV2ZW50Um91dGVyKiBldmVudF9yb3V0ZXJfID0gbnVsbHB0cjsKLSAgcG9saWN5OjpNb2NrQ2xvdWRQb2xpY3lDbGllbnQqIGNsaWVudF87CisgIHBvbGljeTo6TW9ja0Nsb3VkUG9saWN5Q2xpZW50KiBjbGllbnRfID0gbnVsbHB0cjsKIAogIHByaXZhdGU6CiAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTYWZlQnJvd3NpbmdQcml2YXRlRXZlbnRSb3V0ZXJUZXN0KTsKQEAgLTMyMyw0ICszMzYsNDUgQEAKICAgRVhQRUNUX0ZBTFNFKAogICAgICAgKmV2ZW50LT5GaW5kQm9vbEtleShTYWZlQnJvd3NpbmdQcml2YXRlRXZlbnRSb3V0ZXI6OmtLZXlDbGlja2VkVGhyb3VnaCkpOwogfQorCitURVNUX0YoU2FmZUJyb3dzaW5nUHJpdmF0ZUV2ZW50Um91dGVyVGVzdCwgUG9saWN5Q29udHJvbE9uVG9PZmZJc0R5bmFtaWMpIHsKKyAgU2V0VXBSb3V0ZXJzKCk7CisgIFNhZmVCcm93c2luZ0V2ZW50T2JzZXJ2ZXIgZXZlbnRfb2JzZXJ2ZXIoCisgICAgICBhcGk6OnNhZmVfYnJvd3NpbmdfcHJpdmF0ZTo6T25TZWN1cml0eUludGVyc3RpdGlhbFNob3duOjprRXZlbnROYW1lKTsKKyAgZXZlbnRfcm91dGVyXy0+QWRkRXZlbnRPYnNlcnZlcigmZXZlbnRfb2JzZXJ2ZXIpOworCisgIEVYUEVDVF9DQUxMKCpjbGllbnRfLCBVcGxvYWRSZWFsdGltZVJlcG9ydChfLCBfKSkuVGltZXMoMSk7CisgIFRyaWdnZXJPblNlY3VyaXR5SW50ZXJzdGl0aWFsU2hvd25FdmVudCgpOworICBiYXNlOjpSdW5Mb29wKCkuUnVuVW50aWxJZGxlKCk7CisgIEVYUEVDVF9FUSgxdSwgZXZlbnRfb2JzZXJ2ZXIuUGFzc0V2ZW50QXJncygpLkdldExpc3QoKS5zaXplKCkpOworICBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucyhjbGllbnRfKTsKKworICAvLyBOb3cgdHVybiBvZmYgcG9saWN5LiAgVGhpcyB0aW1lIG5vIHJlcG9ydCBzaG91bGQgYmUgZ2VuZXJhdGVkLgorICBTZXRSZXBvcnRpbmdQb2xpY3koZmFsc2UpOworICBFWFBFQ1RfQ0FMTCgqY2xpZW50XywgVXBsb2FkUmVhbHRpbWVSZXBvcnQoXywgXykpLlRpbWVzKDApOworICBUcmlnZ2VyT25TZWN1cml0eUludGVyc3RpdGlhbFNob3duRXZlbnQoKTsKKyAgYmFzZTo6UnVuTG9vcCgpLlJ1blVudGlsSWRsZSgpOworICBFWFBFQ1RfRVEoMXUsIGV2ZW50X29ic2VydmVyLlBhc3NFdmVudEFyZ3MoKS5HZXRMaXN0KCkuc2l6ZSgpKTsKKyAgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoY2xpZW50Xyk7Cit9CisKK1RFU1RfRihTYWZlQnJvd3NpbmdQcml2YXRlRXZlbnRSb3V0ZXJUZXN0LCBQb2xpY3lDb250cm9sT2ZmVG9PbklzRHluYW1pYykgeworICBTZXRVcFJvdXRlcnMoLypyZWFsdGltZV9yZXBvcnRpbmdfZW5hYmxlPSovZmFsc2UpOworICBTYWZlQnJvd3NpbmdFdmVudE9ic2VydmVyIGV2ZW50X29ic2VydmVyKAorICAgICAgYXBpOjpzYWZlX2Jyb3dzaW5nX3ByaXZhdGU6Ok9uU2VjdXJpdHlJbnRlcnN0aXRpYWxTaG93bjo6a0V2ZW50TmFtZSk7CisgIGV2ZW50X3JvdXRlcl8tPkFkZEV2ZW50T2JzZXJ2ZXIoJmV2ZW50X29ic2VydmVyKTsKKworICBUcmlnZ2VyT25TZWN1cml0eUludGVyc3RpdGlhbFNob3duRXZlbnQoKTsKKyAgYmFzZTo6UnVuTG9vcCgpLlJ1blVudGlsSWRsZSgpOworICBFWFBFQ1RfRVEoMXUsIGV2ZW50X29ic2VydmVyLlBhc3NFdmVudEFyZ3MoKS5HZXRMaXN0KCkuc2l6ZSgpKTsKKworICAvLyBOb3cgdHVybiBvbiBwb2xpY3kuCisgIFNldFJlcG9ydGluZ1BvbGljeSh0cnVlKTsKKyAgRVhQRUNUX0NBTEwoKmNsaWVudF8sIFVwbG9hZFJlYWx0aW1lUmVwb3J0KF8sIF8pKS5UaW1lcygxKTsKKyAgVHJpZ2dlck9uU2VjdXJpdHlJbnRlcnN0aXRpYWxTaG93bkV2ZW50KCk7CisgIGJhc2U6OlJ1bkxvb3AoKS5SdW5VbnRpbElkbGUoKTsKKyAgRVhQRUNUX0VRKDF1LCBldmVudF9vYnNlcnZlci5QYXNzRXZlbnRBcmdzKCkuR2V0TGlzdCgpLnNpemUoKSk7CisgIE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKGNsaWVudF8pOworfQorCiB9ICAvLyBuYW1lc3BhY2UgZXh0ZW5zaW9ucwpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvZXh0ZW5zaW9ucy9jaHJvbWVfY29udGVudF9icm93c2VyX2NsaWVudF9leHRlbnNpb25zX3BhcnQuY2MgYi9jaHJvbWUvYnJvd3Nlci9leHRlbnNpb25zL2Nocm9tZV9jb250ZW50X2Jyb3dzZXJfY2xpZW50X2V4dGVuc2lvbnNfcGFydC5jYwppbmRleCBiZGM1ODJjLi5jZDE4Mjc5OCAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvZXh0ZW5zaW9ucy9jaHJvbWVfY29udGVudF9icm93c2VyX2NsaWVudF9leHRlbnNpb25zX3BhcnQuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvZXh0ZW5zaW9ucy9jaHJvbWVfY29udGVudF9icm93c2VyX2NsaWVudF9leHRlbnNpb25zX3BhcnQuY2MKQEAgLTU5NSwyOSArNTk1LDYgQEAKIH0KIAogLy8gc3RhdGljCi12b2lkIENocm9tZUNvbnRlbnRCcm93c2VyQ2xpZW50RXh0ZW5zaW9uc1BhcnQ6Ok92ZXJyaWRlTmF2aWdhdGlvblBhcmFtcygKLSAgICBjb250ZW50OjpTaXRlSW5zdGFuY2UqIHNpdGVfaW5zdGFuY2UsCi0gICAgdWk6OlBhZ2VUcmFuc2l0aW9uKiB0cmFuc2l0aW9uLAotICAgIGJvb2wqIGlzX3JlbmRlcmVyX2luaXRpYXRlZCwKLSAgICBjb250ZW50OjpSZWZlcnJlciogcmVmZXJyZXIsCi0gICAgYmFzZTo6T3B0aW9uYWw8dXJsOjpPcmlnaW4+KiBpbml0aWF0b3Jfb3JpZ2luKSB7Ci0gIGNvbnN0IEV4dGVuc2lvbiogZXh0ZW5zaW9uID0KLSAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5OjpHZXQoc2l0ZV9pbnN0YW5jZS0+R2V0QnJvd3NlckNvbnRleHQoKSkKLSAgICAgICAgICAtPmVuYWJsZWRfZXh0ZW5zaW9ucygpCi0gICAgICAgICAgLkdldEV4dGVuc2lvbk9yQXBwQnlVUkwoc2l0ZV9pbnN0YW5jZS0+R2V0U2l0ZVVSTCgpKTsKLSAgaWYgKCFleHRlbnNpb24pCi0gICAgcmV0dXJuOwotCi0gIC8vIEhpZGUgdGhlIHxyZWZlcnJlcnwgZm9yIGV4dGVuc2lvbiBwYWdlcy4gV2UgZG9uJ3Qgd2FudCBzaXRlcyB0byBzZWUgYQotICAvLyByZWZlcnJlciBvZiBjaHJvbWUtZXh0ZW5zaW9uOi8vPC4uLj4uCi0gIC8vCi0gIC8vIE9UT0gsIGRvbid0IGNoYW5nZSB8aW5pdGlhdG9yX29yaWdpbnwgLSBTYW1lU2l0ZS1jb29raWVzIGFuZCBTZWMtRmV0Y2gtU2l0ZQotICAvLyBzaG91bGQgc3RpbGwgc2VlIHRoZSByZXF1ZXN0IGFzIGNyb3NzLXNpdGUuCi0gIGlmIChleHRlbnNpb24tPmlzX2V4dGVuc2lvbigpKQotICAgICpyZWZlcnJlciA9IGNvbnRlbnQ6OlJlZmVycmVyKCk7Ci19Ci0KLS8vIHN0YXRpYwogc3RkOjp2ZWN0b3I8dXJsOjpPcmlnaW4+IENocm9tZUNvbnRlbnRCcm93c2VyQ2xpZW50RXh0ZW5zaW9uc1BhcnQ6OgogICAgIEdldE9yaWdpbnNSZXF1aXJpbmdEZWRpY2F0ZWRQcm9jZXNzKCkgewogICBzdGQ6OnZlY3Rvcjx1cmw6Ok9yaWdpbj4gbGlzdDsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL2V4dGVuc2lvbnMvY2hyb21lX2NvbnRlbnRfYnJvd3Nlcl9jbGllbnRfZXh0ZW5zaW9uc19wYXJ0LmggYi9jaHJvbWUvYnJvd3Nlci9leHRlbnNpb25zL2Nocm9tZV9jb250ZW50X2Jyb3dzZXJfY2xpZW50X2V4dGVuc2lvbnNfcGFydC5oCmluZGV4IDczN2Q2YmYuLjZmZTQ3ZjQgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL2V4dGVuc2lvbnMvY2hyb21lX2NvbnRlbnRfYnJvd3Nlcl9jbGllbnRfZXh0ZW5zaW9uc19wYXJ0LmgKKysrIGIvY2hyb21lL2Jyb3dzZXIvZXh0ZW5zaW9ucy9jaHJvbWVfY29udGVudF9icm93c2VyX2NsaWVudF9leHRlbnNpb25zX3BhcnQuaApAQCAtMTgsNyArMTgsNiBAQAogI2luY2x1ZGUgInVpL2Jhc2UvcGFnZV90cmFuc2l0aW9uX3R5cGVzLmgiCiAKIG5hbWVzcGFjZSBjb250ZW50IHsKLXN0cnVjdCBSZWZlcnJlcjsKIGNsYXNzIFJlbmRlckZyYW1lSG9zdDsKIGNsYXNzIFJlbmRlclByb2Nlc3NIb3N0OwogY2xhc3MgUmVzb3VyY2VDb250ZXh0OwpAQCAtNzcsMTIgKzc2LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVVJMJiBmaXJzdF9wYXJ0eV91cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1VSTCYgc2NyaXB0X3VybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OjpCcm93c2VyQ29udGV4dCogY29udGV4dCk7Ci0gIHN0YXRpYyB2b2lkIE92ZXJyaWRlTmF2aWdhdGlvblBhcmFtcygKLSAgICAgIGNvbnRlbnQ6OlNpdGVJbnN0YW5jZSogc2l0ZV9pbnN0YW5jZSwKLSAgICAgIHVpOjpQYWdlVHJhbnNpdGlvbiogdHJhbnNpdGlvbiwKLSAgICAgIGJvb2wqIGlzX3JlbmRlcmVyX2luaXRpYXRlZCwKLSAgICAgIGNvbnRlbnQ6OlJlZmVycmVyKiByZWZlcnJlciwKLSAgICAgIGJhc2U6Ok9wdGlvbmFsPHVybDo6T3JpZ2luPiogaW5pdGlhdG9yX29yaWdpbik7CiAgIHN0YXRpYyBzdGQ6OnZlY3Rvcjx1cmw6Ok9yaWdpbj4gR2V0T3JpZ2luc1JlcXVpcmluZ0RlZGljYXRlZFByb2Nlc3MoKTsKIAogICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gY2FsbCBJbmZvTWFwOjpTZXRTaWduaW5Qcm9jZXNzKCkuCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9leHRlbnNpb25zL25hdmlnYXRpb25fb2JzZXJ2ZXJfYnJvd3NlcnRlc3QuY2MgYi9jaHJvbWUvYnJvd3Nlci9leHRlbnNpb25zL25hdmlnYXRpb25fb2JzZXJ2ZXJfYnJvd3NlcnRlc3QuY2MKaW5kZXggMjkwYmJmZi4uNGExNDlmYTkgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL2V4dGVuc2lvbnMvbmF2aWdhdGlvbl9vYnNlcnZlcl9icm93c2VydGVzdC5jYworKysgYi9jaHJvbWUvYnJvd3Nlci9leHRlbnNpb25zL25hdmlnYXRpb25fb2JzZXJ2ZXJfYnJvd3NlcnRlc3QuY2MKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9leHRlbnNpb25zL25hdmlnYXRpb25fb2JzZXJ2ZXIuaCIKICNpbmNsdWRlICJjaHJvbWUvdGVzdC9iYXNlL3VpX3Rlc3RfdXRpbHMuaCIKICNpbmNsdWRlICJjb250ZW50L3B1YmxpYy90ZXN0L25vX3JlbmRlcmVyX2NyYXNoZXNfYXNzZXJ0aW9uLmgiCisjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvdGVzdC90ZXN0X25hdmlnYXRpb25fb2JzZXJ2ZXIuaCIKICNpbmNsdWRlICJleHRlbnNpb25zL2Jyb3dzZXIvZXh0ZW5zaW9uX2RpYWxvZ19hdXRvX2NvbmZpcm0uaCIKICNpbmNsdWRlICJleHRlbnNpb25zL2Jyb3dzZXIvZXh0ZW5zaW9uX3ByZWZzLmgiCiAjaW5jbHVkZSAiZXh0ZW5zaW9ucy9icm93c2VyL2V4dGVuc2lvbl9yZWdpc3RyeS5oIgpAQCAtMTMyLDQgKzEzMyw0NSBAQAogICB9CiB9CiAKK0lOX1BST0NfQlJPV1NFUl9URVNUX0YoRXh0ZW5zaW9uQnJvd3NlclRlc3QsIE5vRXh0ZW5zaW9uc0luUmVmZXJlckhlYWRlcikgeworICBBU1NFUlRfVFJVRShlbWJlZGRlZF90ZXN0X3NlcnZlcigpLT5TdGFydCgpKTsKKworICBzY29wZWRfcmVmcHRyPGNvbnN0IEV4dGVuc2lvbj4gZXh0ZW5zaW9uID0KKyAgICAgIENocm9tZVRlc3RFeHRlbnNpb25Mb2FkZXIocHJvZmlsZSgpKS5Mb2FkRXh0ZW5zaW9uKAorICAgICAgICAgIHRlc3RfZGF0YV9kaXJfLkFwcGVuZEFTQ0lJKCJzaW1wbGVfd2l0aF9maWxlIikpOworICBBU1NFUlRfVFJVRShleHRlbnNpb24pOworICBHVVJMIHBhZ2VfdXJsID0gZXh0ZW5zaW9uLT5HZXRSZXNvdXJjZVVSTCgiZmlsZS5odG1sIik7CisgIHVpX3Rlc3RfdXRpbHM6Ok5hdmlnYXRlVG9VUkwoYnJvd3NlcigpLCBwYWdlX3VybCk7CisKKyAgLy8gQ2xpY2sgYSBsaW5rIGluIHRoZSBleHRlbnNpb24uCisgIEdVUkwgdGFyZ2V0X3VybCA9IGVtYmVkZGVkX3Rlc3Rfc2VydmVyKCktPkdldFVSTCgiL2VjaG9oZWFkZXI/cmVmZXJlciIpOworICBjb25zdCBjaGFyIGtTY3JpcHRUZW1wbGF0ZVtdID0gUiIoCisgICAgICBsZXQgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKKyAgICAgIGEuaHJlZiA9ICQxOworICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTsKKyAgICAgIGEuY2xpY2soKTsKKyAgKSI7CisgIGNvbnRlbnQ6OldlYkNvbnRlbnRzKiB3ZWJfY29udGVudHMgPQorICAgICAgYnJvd3NlcigpLT50YWJfc3RyaXBfbW9kZWwoKS0+R2V0QWN0aXZlV2ViQ29udGVudHMoKTsKKyAgY29udGVudDo6VGVzdE5hdmlnYXRpb25PYnNlcnZlciBuYXZfb2JzZXJ2ZXIod2ViX2NvbnRlbnRzLCAxKTsKKyAgRXhlY3V0ZVNjcmlwdEFzeW5jKHdlYl9jb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6OkpzUmVwbGFjZShrU2NyaXB0VGVtcGxhdGUsIHRhcmdldF91cmwpKTsKKworICAvLyBXYWl0IGZvciBuYXZpZ2F0aW9uIHRvIGNvbXBsZXRlIGFuZCB2ZXJpZnkgaXQgd2FzIHN1Y2Nlc3NmdWwuCisgIG5hdl9vYnNlcnZlci5XYWl0Rm9yTmF2aWdhdGlvbkZpbmlzaGVkKCk7CisgIEVYUEVDVF9UUlVFKG5hdl9vYnNlcnZlci5sYXN0X25hdmlnYXRpb25fc3VjY2VlZGVkKCkpOworICBFWFBFQ1RfRVEodGFyZ2V0X3VybCwgbmF2X29ic2VydmVyLmxhc3RfbmF2aWdhdGlvbl91cmwoKSk7CisgIEVYUEVDVF9FUSh0YXJnZXRfdXJsLCB3ZWJfY29udGVudHMtPkdldExhc3RDb21taXR0ZWRVUkwoKSk7CisKKyAgLy8gVmVyaWZ5IHRoYXQgdGhlIFJlZmVycmVyIGhlYWRlciB3YXMgbm90IHByZXNlbnQgKGluIHBhcnRpY3VsYXIsIGl0IHNob3VsZAorICAvLyBub3QgcmV2ZWFsIHRoZSBpZGVudGl0eSBvZiB0aGUgZXh0ZW5zaW9uKS4KKyAgY29udGVudDo6V2FpdEZvckxvYWRTdG9wKHdlYl9jb250ZW50cyk7CisgIEVYUEVDVF9FUSgiTm9uZSIsIGNvbnRlbnQ6OkV2YWxKcyh3ZWJfY29udGVudHMsICJkb2N1bWVudC5ib2R5LmlubmVyVGV4dCIpKTsKKworICAvLyBWZXJpZnkgdGhhdCB0aGUgaW5pdGlhdG9yX29yaWdpbiB3YXMgcHJlc2VudCBhbmQgc2V0IHRvIHRoZSBleHRlbnNpb24uCisgIEFTU0VSVF9UUlVFKG5hdl9vYnNlcnZlci5sYXN0X2luaXRpYXRvcl9vcmlnaW4oKS5oYXNfdmFsdWUoKSk7CisgIEVYUEVDVF9FUSh1cmw6Ok9yaWdpbjo6Q3JlYXRlKHBhZ2VfdXJsKSwKKyAgICAgICAgICAgIG5hdl9vYnNlcnZlci5sYXN0X2luaXRpYXRvcl9vcmlnaW4oKSk7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBleHRlbnNpb25zCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9leHRlbnNpb25zL3VzZXJfc2NyaXB0X2xpc3RlbmVyLmNjIGIvY2hyb21lL2Jyb3dzZXIvZXh0ZW5zaW9ucy91c2VyX3NjcmlwdF9saXN0ZW5lci5jYwppbmRleCA4ZTk0ODY2MS4uMzM0MTE5MGQgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL2V4dGVuc2lvbnMvdXNlcl9zY3JpcHRfbGlzdGVuZXIuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvZXh0ZW5zaW9ucy91c2VyX3NjcmlwdF9saXN0ZW5lci5jYwpAQCAtMTIsNyArMTIsNiBAQAogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL2Nocm9tZV9ub3RpZmljYXRpb25fdHlwZXMuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9wcm9maWxlcy9wcm9maWxlLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvcHJvZmlsZXMvcHJvZmlsZV9tYW5hZ2VyLmgiCi0jaW5jbHVkZSAiY29udGVudC9wdWJsaWMvYnJvd3Nlci9icm93c2VyX3RocmVhZC5oIgogI2luY2x1ZGUgImNvbnRlbnQvcHVibGljL2Jyb3dzZXIvbmF2aWdhdGlvbl9oYW5kbGUuaCIKICNpbmNsdWRlICJjb250ZW50L3B1YmxpYy9icm93c2VyL25hdmlnYXRpb25fdGhyb3R0bGUuaCIKICNpbmNsdWRlICJjb250ZW50L3B1YmxpYy9icm93c2VyL25vdGlmaWNhdGlvbl9zZXJ2aWNlLmgiCkBAIC0yMCw3ICsxOSw2IEBACiAjaW5jbHVkZSAiZXh0ZW5zaW9ucy9jb21tb24vbWFuaWZlc3RfaGFuZGxlcnMvY29udGVudF9zY3JpcHRzX2hhbmRsZXIuaCIKICNpbmNsdWRlICJleHRlbnNpb25zL2NvbW1vbi91cmxfcGF0dGVybi5oIgogCi11c2luZyBjb250ZW50OjpCcm93c2VyVGhyZWFkOwogdXNpbmcgY29udGVudDo6TmF2aWdhdGlvblRocm90dGxlOwogdXNpbmcgY29udGVudDo6UmVzb3VyY2VUeXBlOwogCkBAIC03Nyw4ICs3NSw2IEBACiB9OwogCiBVc2VyU2NyaXB0TGlzdGVuZXI6OlVzZXJTY3JpcHRMaXN0ZW5lcigpIHsKLSAgRENIRUNLX0NVUlJFTlRMWV9PTihCcm93c2VyVGhyZWFkOjpVSSk7Ci0KICAgLy8gUHJvZmlsZSBtYW5hZ2VyIGNhbiBiZSBudWxsIGluIHVuaXQgdGVzdHMuCiAgIGlmIChnX2Jyb3dzZXJfcHJvY2Vzcy0+cHJvZmlsZV9tYW5hZ2VyKCkpIHsKICAgICBmb3IgKGF1dG8qIHByb2ZpbGUgOgpAQCAtOTAsOCArODYsNiBAQAogICByZWdpc3RyYXJfLkFkZCh0aGlzLCBjaHJvbWU6Ok5PVElGSUNBVElPTl9QUk9GSUxFX0FEREVELAogICAgICAgICAgICAgICAgICBjb250ZW50OjpOb3RpZmljYXRpb25TZXJ2aWNlOjpBbGxTb3VyY2VzKCkpOwogCi0gIHJlZ2lzdHJhcl8uQWRkKHRoaXMsIGNocm9tZTo6Tk9USUZJQ0FUSU9OX1BST0ZJTEVfREVTVFJPWUVELAotICAgICAgICAgICAgICAgICBjb250ZW50OjpOb3RpZmljYXRpb25TZXJ2aWNlOjpBbGxTb3VyY2VzKCkpOwogICByZWdpc3RyYXJfLkFkZCh0aGlzLAogICAgICAgICAgICAgICAgICBleHRlbnNpb25zOjpOT1RJRklDQVRJT05fVVNFUl9TQ1JJUFRTX1VQREFURUQsCiAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6Ok5vdGlmaWNhdGlvblNlcnZpY2U6OkFsbFNvdXJjZXMoKSk7CkBAIC0xMTcsNyArMTExLDYgQEAKIFVzZXJTY3JpcHRMaXN0ZW5lcjo6flVzZXJTY3JpcHRMaXN0ZW5lcigpIHt9CiAKIGJvb2wgVXNlclNjcmlwdExpc3RlbmVyOjpTaG91bGREZWxheVJlcXVlc3QoY29uc3QgR1VSTCYgdXJsKSB7Ci0gIERDSEVDS19DVVJSRU5UTFlfT04oQnJvd3NlclRocmVhZDo6VUkpOwogICAvLyBOb3RlOiB3ZSBjb3VsZCBkZWxheSBvbmx5IHJlcXVlc3RzIG1hZGUgYnkgdGhlIHByb2ZpbGUgd2hvIGlzIGNhdXNpbmcgdGhlCiAgIC8vIGRlbGF5LCBidXQgaXQncyBhIGxpdHRsZSBtb3JlIGNvbXBsaWNhdGVkIHRvIGFzc29jaWF0ZSByZXF1ZXN0cyB3aXRoIHRoZQogICAvLyByaWdodCBwcm9maWxlLiBTaW5jZSB0aGlzIGlzIGEgcmFyZSBjYXNlLCB3ZSdsbCBqdXN0IHRha2UgdGhlIGVhc3kgd2F5CkBAIC0xNTAsNyArMTQzLDYgQEAKIH0KIAogdm9pZCBVc2VyU2NyaXB0TGlzdGVuZXI6OkNoZWNrSWZBbGxVc2VyU2NyaXB0c1JlYWR5KCkgewotICBEQ0hFQ0tfQ1VSUkVOVExZX09OKEJyb3dzZXJUaHJlYWQ6OlVJKTsKICAgYm9vbCB3YXNfcmVhZHkgPSB1c2VyX3NjcmlwdHNfcmVhZHlfOwogCiAgIHVzZXJfc2NyaXB0c19yZWFkeV8gPSB0cnVlOwpAQCAtMTY1LDIzICsxNTcsMTUgQEAKIH0KIAogdm9pZCBVc2VyU2NyaXB0TGlzdGVuZXI6OlVzZXJTY3JpcHRzUmVhZHkoY29udGVudDo6QnJvd3NlckNvbnRleHQqIGNvbnRleHQpIHsKLSAgRENIRUNLX0NVUlJFTlRMWV9PTihCcm93c2VyVGhyZWFkOjpVSSk7CisgIERDSEVDSyghY29udGV4dC0+SXNPZmZUaGVSZWNvcmQoKSk7CiAKICAgcHJvZmlsZV9kYXRhX1tjb250ZXh0XS51c2VyX3NjcmlwdHNfcmVhZHkgPSB0cnVlOwogICBDaGVja0lmQWxsVXNlclNjcmlwdHNSZWFkeSgpOwogfQogCi12b2lkIFVzZXJTY3JpcHRMaXN0ZW5lcjo6UHJvZmlsZURlc3Ryb3llZChjb250ZW50OjpCcm93c2VyQ29udGV4dCogY29udGV4dCkgewotICBEQ0hFQ0tfQ1VSUkVOVExZX09OKEJyb3dzZXJUaHJlYWQ6OlVJKTsKLSAgcHJvZmlsZV9kYXRhXy5lcmFzZShjb250ZXh0KTsKLQotICAvLyBXZSBtYXkgaGF2ZSBkZWxldGVkIHRoZSBvbmx5IHByb2ZpbGUgd2Ugd2VyZSB3YWl0aW5nIG9uLgotICBDaGVja0lmQWxsVXNlclNjcmlwdHNSZWFkeSgpOwotfQotCiB2b2lkIFVzZXJTY3JpcHRMaXN0ZW5lcjo6QXBwZW5kTmV3VVJMUGF0dGVybnMoY29udGVudDo6QnJvd3NlckNvbnRleHQqIGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVVJMUGF0dGVybnMmIG5ld19wYXR0ZXJucykgewotICBEQ0hFQ0tfQ1VSUkVOVExZX09OKEJyb3dzZXJUaHJlYWQ6OlVJKTsKKyAgRENIRUNLKCFjb250ZXh0LT5Jc09mZlRoZVJlY29yZCgpKTsKIAogICB1c2VyX3NjcmlwdHNfcmVhZHlfID0gZmFsc2U7CiAKQEAgLTE5NCwxNiArMTc4LDE0IEBACiAKIHZvaWQgVXNlclNjcmlwdExpc3RlbmVyOjpSZXBsYWNlVVJMUGF0dGVybnMoY29udGVudDo6QnJvd3NlckNvbnRleHQqIGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVSTFBhdHRlcm5zJiBwYXR0ZXJucykgewotICBEQ0hFQ0tfQ1VSUkVOVExZX09OKEJyb3dzZXJUaHJlYWQ6OlVJKTsKKyAgLy8gVE9ETyhlc3RhZGUpOiBlbmFibGUgdGhpcyBjaGVjayBvbmNlIGl0IG5vIGxvbmdlciBmYWlscy4KKyAgLy8gRENIRUNLX0VRKDFVLCBwcm9maWxlX2RhdGFfLmNvdW50KGNvbnRleHQpKTsKIAotICBQcm9maWxlRGF0YSYgZGF0YSA9IHByb2ZpbGVfZGF0YV9bY29udGV4dF07Ci0gIGRhdGEudXJsX3BhdHRlcm5zID0gcGF0dGVybnM7CisgIHByb2ZpbGVfZGF0YV9bY29udGV4dF0udXJsX3BhdHRlcm5zID0gcGF0dGVybnM7CiB9CiAKIHZvaWQgVXNlclNjcmlwdExpc3RlbmVyOjpDb2xsZWN0VVJMUGF0dGVybnMoY29uc3QgRXh0ZW5zaW9uKiBleHRlbnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTFBhdHRlcm5zKiBwYXR0ZXJucykgewotICBEQ0hFQ0tfQ1VSUkVOVExZX09OKEJyb3dzZXJUaHJlYWQ6OlVJKTsKLQogICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxVc2VyU2NyaXB0PiYgc2NyaXB0IDoKICAgICAgICBDb250ZW50U2NyaXB0c0luZm86OkdldENvbnRlbnRTY3JpcHRzKGV4dGVuc2lvbikpIHsKICAgICBwYXR0ZXJucy0+aW5zZXJ0KHBhdHRlcm5zLT5lbmQoKSwgc2NyaXB0LT51cmxfcGF0dGVybnMoKS5iZWdpbigpLApAQCAtMjE0LDggKzE5Niw2IEBACiB2b2lkIFVzZXJTY3JpcHRMaXN0ZW5lcjo6T2JzZXJ2ZShpbnQgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQ6Ok5vdGlmaWNhdGlvblNvdXJjZSYgc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudDo6Tm90aWZpY2F0aW9uRGV0YWlscyYgZGV0YWlscykgewotICBEQ0hFQ0tfQ1VSUkVOVExZX09OKEJyb3dzZXJUaHJlYWQ6OlVJKTsKLQogICBzd2l0Y2ggKHR5cGUpIHsKICAgICBjYXNlIGNocm9tZTo6Tk9USUZJQ0FUSU9OX1BST0ZJTEVfQURERUQ6IHsKICAgICAgIGF1dG8qIHJlZ2lzdHJ5ID0KQEAgLTIyNCwxMSArMjA0LDYgQEAKICAgICAgIGV4dGVuc2lvbl9yZWdpc3RyeV9vYnNlcnZlcl8uQWRkKHJlZ2lzdHJ5KTsKICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBjYXNlIGNocm9tZTo6Tk9USUZJQ0FUSU9OX1BST0ZJTEVfREVTVFJPWUVEOiB7Ci0gICAgICBQcm9maWxlKiBwcm9maWxlID0gY29udGVudDo6U291cmNlPFByb2ZpbGU+KHNvdXJjZSkucHRyKCk7Ci0gICAgICBQcm9maWxlRGVzdHJveWVkKHByb2ZpbGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQogICAgIGNhc2UgZXh0ZW5zaW9uczo6Tk9USUZJQ0FUSU9OX1VTRVJfU0NSSVBUU19VUERBVEVEOiB7CiAgICAgICBQcm9maWxlKiBwcm9maWxlID0gY29udGVudDo6U291cmNlPFByb2ZpbGU+KHNvdXJjZSkucHRyKCk7CiAgICAgICBVc2VyU2NyaXB0c1JlYWR5KHByb2ZpbGUpOwpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvZmxhZy1tZXRhZGF0YS5qc29uIGIvY2hyb21lL2Jyb3dzZXIvZmxhZy1tZXRhZGF0YS5qc29uCmluZGV4IDg5MmE4MjAzLi40Njg0OWViIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9mbGFnLW1ldGFkYXRhLmpzb24KKysrIGIvY2hyb21lL2Jyb3dzZXIvZmxhZy1tZXRhZGF0YS5qc29uCkBAIC0xMTM0LDYgKzExMzQsMTEgQEAKICAgICAiZXhwaXJ5X21pbGVzdG9uZSI6IDc3CiAgIH0sCiAgIHsKKyAgICAibmFtZSI6ICJlbmFibGUtY3Nzb20tdmlldy1zY3JvbGwtY29vcmRpbmF0ZXMiLAorICAgICJvd25lcnMiOiBbICJjYXRoaWVjaGVuQGlnYWxpYS5jb20iLCAiZndhbmdAaWdhbGlhLmNvbSIgXSwKKyAgICAiZXhwaXJ5X21pbGVzdG9uZSI6IDgzCisgIH0sCisgIHsKICAgICAibmFtZSI6ICJlbmFibGUtY3Vwcy1wcmludGVycy11aS1vdmVyaGF1bCIsCiAgICAgIm93bmVycyI6IFsgImppbW15eGdvbmciIF0sCiAgICAgImV4cGlyeV9taWxlc3RvbmUiOiA3OQpAQCAtMjA1MiwxMSArMjA1Nyw2IEBACiAgICAgImV4cGlyeV9taWxlc3RvbmUiOiA3NQogICB9LAogICB7Ci0gICAgIm5hbWUiOiAiZW5mb3JjZS10bHMxMy1kb3duZ3JhZGUiLAotICAgICJvd25lcnMiOiBbICJkYXZpZGJlbiIsICJzdmFsZGV6IiBdLAotICAgICJleHBpcnlfbWlsZXN0b25lIjogODIKLSAgfSwKLSAgewogICAgICJuYW1lIjogImVudGVycHJpc2UtcmVwb3J0aW5nLWluLWJyb3dzZXIiLAogICAgICJvd25lcnMiOiBbICJwYXN0YXJtb3ZqIiwgInptaW4iIF0sCiAgICAgImV4cGlyeV9taWxlc3RvbmUiOiA3OQpAQCAtMzI0Miw2ICszMjQyLDExIEBACiAgICAgImV4cGlyeV9taWxlc3RvbmUiOiAtMQogICB9LAogICB7CisgICAgIm5hbWUiOiAidGxzMTMtaGFyZGVuaW5nLWZvci1sb2NhbC1hbmNob3JzIiwKKyAgICAib3duZXJzIjogWyAiZGF2aWRiZW4iLCAic3ZhbGRleiIgXSwKKyAgICAiZXhwaXJ5X21pbGVzdG9uZSI6IDg1CisgIH0sCisgIHsKICAgICAibmFtZSI6ICJ0b3AtY2hyb21lLXRvdWNoLXVpIiwKICAgICAib3duZXJzIjogWyAiY2hyb21lLWRlc2t0b3AtdWktc2VhQGdvb2dsZS5jb20iIF0sCiAgICAgImV4cGlyeV9taWxlc3RvbmUiOiA4MQpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvZmxhZ19kZXNjcmlwdGlvbnMuY2MgYi9jaHJvbWUvYnJvd3Nlci9mbGFnX2Rlc2NyaXB0aW9ucy5jYwppbmRleCA0MzM2Yjc3YS4uNTkzZjZmMWIgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL2ZsYWdfZGVzY3JpcHRpb25zLmNjCisrKyBiL2Nocm9tZS9icm93c2VyL2ZsYWdfZGVzY3JpcHRpb25zLmNjCkBAIC02NjAsMTQgKzY2MCw2IEBACiAgICAgIkV4cGVyaW1lbnRhbCBzeXN0ZW0gZm9yIHVzaW5nIHRoZSBEZXNrdG9wIFBXQSBmcmFtZXdvcmsgZm9yIHJ1bm5pbmcgU3lzdGVtIgogICAgICJBcHBzIChlLmcgU2V0dGluZ3MsIERpc2NvdmVyKS4iOwogCi1jb25zdCBjaGFyIGtFbmZvcmNlVExTMTNEb3duZ3JhZGVOYW1lW10gPSAiVExTIDEuMyBkb3duZ3JhZGUgaGFyZGVuaW5nIjsKLWNvbnN0IGNoYXIga0VuZm9yY2VUTFMxM0Rvd25ncmFkZURlc2NyaXB0aW9uW10gPQotICAgICJUaGlzIG9wdGlvbiBlbmFibGVzIHRoZSBUTFMgMS4zIGRvd25ncmFkZSBoYXJkZW5pbmcgbWVjaGFuaXNtLiBUaGlzICIKLSAgICAiaGFyZGVucyBUTFMgMS4zIGNvbm5lY3Rpb25zIHdoaWxlIHJlbWFpbmluZyBjb21wYXRpYmxlIHdpdGggVExTIDEuMCAiCi0gICAgInRocm91Z2ggMS4yIGNvbm5lY3Rpb25zLiBGaXJld2FsbHMgYW5kIHByb3hpZXMgdGhhdCBkbyBub3QgZnVuY3Rpb24gd2hlbiAiCi0gICAgInRoaXMgaXMgZW5hYmxlZCBkbyBub3QgaW1wbGVtZW50IFRMUyAxLjAgdGhyb3VnaCAxLjIgY29ycmVjdGx5IG9yICIKLSAgICAic2VjdXJlbHkuIFRoZXkgbXVzdCBiZSBmaXhlZCBieSB2ZW5kb3JzLiI7Ci0KIGNvbnN0IGNoYXIga0VuYWJsZVRMUzEzRWFybHlEYXRhTmFtZVtdID0gIlRMUyAxLjMgRWFybHkgRGF0YSI7CiBjb25zdCBjaGFyIGtFbmFibGVUTFMxM0Vhcmx5RGF0YURlc2NyaXB0aW9uW10gPQogICAgICJUaGlzIG9wdGlvbiBlbmFibGVzIFRMUyAxLjMgRWFybHkgRGF0YSwgYWxsb3dpbmcgR0VUIHJlcXVlc3RzIHRvIGJlIHNlbnQgIgpAQCAtNzA4LDYgKzcwMCwxNiBAQAogICAgICJzY3JvbGxlcicuIGkuZS4gVGhlIG9uZSB0aGF0IGdldHMgc3BlY2lhbCBmZWF0dXJlcyBsaWtlIFVSTCBiYXIgbW92ZW1lbnQsICIKICAgICAib3ZlcnNjcm9sbCBnbG93LCByb3RhdGlvbiBhbmNob3JpbmcsIGV0Yy4iOwogCitjb25zdCBjaGFyIGtFbmFibGVDU1NPTVZpZXdTY3JvbGxDb29yZGluYXRlc05hbWVbXSA9CisgICAgIkNTU09NIFZpZXcgU2Nyb2xsIENvb3JkaW5hdGVzIjsKK2NvbnN0IGNoYXIga0VuYWJsZUNTU09NVmlld1Njcm9sbENvb3JkaW5hdGVzRGVzY3JpcHRpb25bXSA9CisgICAgIkVuYWJsZXMgQ1NTT00gVmlldyBTY3JvbGwgQ29vcmRpbmF0ZXMsIHRoaXMgYWZmZWN0cyB0byBib3ggc2Nyb2xsICIKKyAgICAiY29vcmRpbmF0ZXMgaW4gc2Nyb2xsVG9wIC8gc2Nyb2xsTGVmdCAvIHNjcm9sbFRvJyB3aGVuIFNjcm9sbE9yaWdpbiBpc24ndCAiCisgICAgImF0IHRoZSBsZWZ0IHRvcCBjb3JuZXIuIGkuZS4gRm9yIGxlZnR3YXJkcyBvdmVyZmxvdyBkaXJlY3Rpb24gYm94ICIKKyAgICAidGhlIFggY29vcmRpbmF0ZSB3aWxsIHN0YXJ0IGZyb20gMCB0byBuZWdhdGl2ZSB2YWx1ZS4gRm9yIHVwd2FyZHMgYm94IHRoZSAiCisgICAgIlkgY29vcmRpbmF0ZSB3aWxsIHN0YXJ0IGZyb20gMCB0byBuZWdhdGl2ZSB2YWx1ZS4gQW5kIGZvciBvdGhlciBkaXJlY3Rpb25zIgorICAgICIocmlnaHR3YXJkcyBhbmQgZG93bndhcmRzKSB0aGUgdmFsdWUgd2lsbCBzdGFydCBmcm9tIDAgdG8gcG9zaXRpdmUiOworCiBjb25zdCBjaGFyIGtFbmFibGVMaXRlUGFnZVNlcnZlclByZXZpZXdzTmFtZVtdID0gIkxpdGUgUGFnZSBTZXJ2ZXIgUHJldmlld3MiOwogY29uc3QgY2hhciBrRW5hYmxlTGl0ZVBhZ2VTZXJ2ZXJQcmV2aWV3c0Rlc2NyaXB0aW9uW10gPQogICAgICJFbmFibGUgc2hvd2luZyBMaXRlIFBhZ2UgUHJldmlld3Mgc2VydmVkIGZyb20gYSBQcmV2aWV3cyBTZXJ2ZXIuIgpAQCAtMjA0NSw2ICsyMDQ3LDE2IEBACiAgICAgIlRpbnQgY29udGVudHMgY29tcG9zaXRlZCB1c2luZyBHTCB3aXRoIGEgc2hhZGUgb2YgcmVkIHRvIGhlbHAgZGVidWcgYW5kICIKICAgICAic3R1ZHkgb3ZlcmxheSBzdXBwb3J0LiI7CiAKK2NvbnN0IGNoYXIga1RMUzEzSGFyZGVuaW5nRm9yTG9jYWxBbmNob3JzTmFtZVtdID0KKyAgICAiVExTIDEuMyBoYXJkZW5pbmcgZm9yIGxvY2FsIGFuY2hvcnMiOworY29uc3QgY2hhciBrVExTMTNIYXJkZW5pbmdGb3JMb2NhbEFuY2hvcnNEZXNjcmlwdGlvbltdID0KKyAgICAiVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgVExTIDEuMyBkb3duZ3JhZGUgaGFyZGVuaW5nIG1lY2hhbmlzbSBmb3IgIgorICAgICJjb25uZWN0aW9ucyBhdXRoZW50aWNhdGVkIGJ5IGxvY2FsIHRydXN0IGFuY2hvcnMuIFRoaXMgaW1wcm92ZXMgc2VjdXJpdHkgIgorICAgICJmb3IgY29ubmVjdGlvbnMgdG8gVExTLTEuMy1jYXBhYmxlIHNlcnZlcnMgd2hpbGUgcmVtYWluaW5nIGNvbXBhdGlibGUgIgorICAgICJ3aXRoIG9sZGVyIHNlcnZlcnMuIEZpcmV3YWxscyBhbmQgcHJveGllcyB0aGF0IGRvIG5vdCBmdW5jdGlvbiB3aGVuIHRoaXMgIgorICAgICJpcyBlbmFibGVkIGRvIG5vdCBpbXBsZW1lbnQgVExTIDEuMiBjb3JyZWN0bHkgb3Igc2VjdXJlbHkgYW5kIG11c3QgYmUgIgorICAgICJ1cGRhdGVkLiI7CisKIGNvbnN0IGNoYXIga1RvcENocm9tZVRvdWNoVWlOYW1lW10gPSAiVG91Y2ggVUkgTGF5b3V0IjsKIGNvbnN0IGNoYXIga1RvcENocm9tZVRvdWNoVWlEZXNjcmlwdGlvbltdID0KICAgICAiRW5hYmxlcyB0b3VjaCBVSSBsYXlvdXQgaW4gdGhlIGJyb3dzZXIncyB0b3AgY2hyb21lLiI7CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9mbGFnX2Rlc2NyaXB0aW9ucy5oIGIvY2hyb21lL2Jyb3dzZXIvZmxhZ19kZXNjcmlwdGlvbnMuaAppbmRleCAwNmIxZTUyLi40OGU0NjMxIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9mbGFnX2Rlc2NyaXB0aW9ucy5oCisrKyBiL2Nocm9tZS9icm93c2VyL2ZsYWdfZGVzY3JpcHRpb25zLmgKQEAgLTQwNCw5ICs0MDQsNiBAQAogZXh0ZXJuIGNvbnN0IGNoYXIga0VuYWJsZVN5c3RlbVdlYkFwcHNOYW1lW107CiBleHRlcm4gY29uc3QgY2hhciBrRW5hYmxlU3lzdGVtV2ViQXBwc0Rlc2NyaXB0aW9uW107CiAKLWV4dGVybiBjb25zdCBjaGFyIGtFbmZvcmNlVExTMTNEb3duZ3JhZGVOYW1lW107Ci1leHRlcm4gY29uc3QgY2hhciBrRW5mb3JjZVRMUzEzRG93bmdyYWRlRGVzY3JpcHRpb25bXTsKLQogZXh0ZXJuIGNvbnN0IGNoYXIga0VuYWJsZVRMUzEzRWFybHlEYXRhTmFtZVtdOwogZXh0ZXJuIGNvbnN0IGNoYXIga0VuYWJsZVRMUzEzRWFybHlEYXRhRGVzY3JpcHRpb25bXTsKIApAQCAtNDI4LDYgKzQyNSw5IEBACiBleHRlcm4gY29uc3QgY2hhciBrRW5hYmxlSW1wbGljaXRSb290U2Nyb2xsZXJOYW1lW107CiBleHRlcm4gY29uc3QgY2hhciBrRW5hYmxlSW1wbGljaXRSb290U2Nyb2xsZXJEZXNjcmlwdGlvbltdOwogCitleHRlcm4gY29uc3QgY2hhciBrRW5hYmxlQ1NTT01WaWV3U2Nyb2xsQ29vcmRpbmF0ZXNOYW1lW107CitleHRlcm4gY29uc3QgY2hhciBrRW5hYmxlQ1NTT01WaWV3U2Nyb2xsQ29vcmRpbmF0ZXNEZXNjcmlwdGlvbltdOworCiBleHRlcm4gY29uc3QgY2hhciBrRW5hYmxlTGl0ZVBhZ2VTZXJ2ZXJQcmV2aWV3c05hbWVbXTsKIGV4dGVybiBjb25zdCBjaGFyIGtFbmFibGVMaXRlUGFnZVNlcnZlclByZXZpZXdzRGVzY3JpcHRpb25bXTsKIApAQCAtMTIxMCw2ICsxMjEwLDkgQEAKIGV4dGVybiBjb25zdCBjaGFyIGtUaW50R2xDb21wb3NpdGVkQ29udGVudE5hbWVbXTsKIGV4dGVybiBjb25zdCBjaGFyIGtUaW50R2xDb21wb3NpdGVkQ29udGVudERlc2NyaXB0aW9uW107CiAKK2V4dGVybiBjb25zdCBjaGFyIGtUTFMxM0hhcmRlbmluZ0ZvckxvY2FsQW5jaG9yc05hbWVbXTsKK2V4dGVybiBjb25zdCBjaGFyIGtUTFMxM0hhcmRlbmluZ0ZvckxvY2FsQW5jaG9yc0Rlc2NyaXB0aW9uW107CisKIGV4dGVybiBjb25zdCBjaGFyIGtUb3BDaHJvbWVUb3VjaFVpTmFtZVtdOwogZXh0ZXJuIGNvbnN0IGNoYXIga1RvcENocm9tZVRvdWNoVWlEZXNjcmlwdGlvbltdOwogCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9sb29rYWxpa2VzL2xvb2thbGlrZV91cmxfbmF2aWdhdGlvbl90aHJvdHRsZS5jYyBiL2Nocm9tZS9icm93c2VyL2xvb2thbGlrZXMvbG9va2FsaWtlX3VybF9uYXZpZ2F0aW9uX3Rocm90dGxlLmNjCmluZGV4IDIzMGJlMTA5ZC4uODg4YjRiOSAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvbG9va2FsaWtlcy9sb29rYWxpa2VfdXJsX25hdmlnYXRpb25fdGhyb3R0bGUuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvbG9va2FsaWtlcy9sb29rYWxpa2VfdXJsX25hdmlnYXRpb25fdGhyb3R0bGUuY2MKQEAgLTgzLDEwICs4MywxNCBAQAogfQogCiAvLyBSZXR1cm5zIHRoZSBmaXJzdCBtYXRjaGluZyB0b3AgZG9tYWluIHdpdGggYW4gZWRpdCBkaXN0YW5jZSBvZiBhdCBtb3N0IG9uZQotLy8gdG8gfGRvbWFpbl9hbmRfcmVnaXN0cnl8LgorLy8gdG8gfGRvbWFpbl9hbmRfcmVnaXN0cnl8LiBUaGlzIHNlYXJjaCBpcyBkb25lIGluIGxleGljb2dyYXBoaWMgb3JkZXIgb24gdGhlCisvLyB0b3AgNTAwIHN1aXRhYmxlIGRvbWFpbnMsIGluc3RlYWQgb2YgaW4gb3JkZXIgYnkgcG9wdWxhcml0eS4gVGhpcyBtZWFucyB0aGF0CisvLyB0aGUgcmVzdWx0aW5nICJzaW1pbGFyIiBkb21haW4gbWF5IG5vdCBiZSB0aGUgbW9zdCBwb3B1bGFyIGRvbWFpbiB0aGF0CisvLyBtYXRjaGVzLgogc3RkOjpzdHJpbmcgR2V0U2ltaWxhckRvbWFpbkZyb21Ub3A1MDAoY29uc3QgRG9tYWluSW5mbyYgbmF2aWdhdGVkX2RvbWFpbikgewogICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYXZpZ2F0ZWRfc2tlbGV0b24gOiBuYXZpZ2F0ZWRfZG9tYWluLnNrZWxldG9ucykgewotICAgIGZvciAoY29uc3QgY2hhciogY29uc3QgdG9wX2RvbWFpbl9za2VsZXRvbiA6IHRvcDUwMF9kb21haW5zOjprVG9wNTAwKSB7CisgICAgZm9yIChjb25zdCBjaGFyKiBjb25zdCB0b3BfZG9tYWluX3NrZWxldG9uIDoKKyAgICAgICAgIHRvcDUwMF9kb21haW5zOjprVG9wNTAwRWRpdERpc3RhbmNlU2tlbGV0b25zKSB7CiAgICAgICBpZiAobG9va2FsaWtlczo6SXNFZGl0RGlzdGFuY2VBdE1vc3RPbmUoCiAgICAgICAgICAgICAgIGJhc2U6OlVURjhUb1VURjE2KG5hdmlnYXRlZF9za2VsZXRvbiksCiAgICAgICAgICAgICAgIGJhc2U6OlVURjhUb1VURjE2KHRvcF9kb21haW5fc2tlbGV0b24pKSkgewpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvbWVkaWEvcm91dGVyL2Rpc2NvdmVyeS9tZG5zL2Nhc3RfbWVkaWFfc2lua19zZXJ2aWNlX2ltcGwuY2MgYi9jaHJvbWUvYnJvd3Nlci9tZWRpYS9yb3V0ZXIvZGlzY292ZXJ5L21kbnMvY2FzdF9tZWRpYV9zaW5rX3NlcnZpY2VfaW1wbC5jYwppbmRleCBkYjE0ZTFlLi4zMjE2ZjdiNCAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvbWVkaWEvcm91dGVyL2Rpc2NvdmVyeS9tZG5zL2Nhc3RfbWVkaWFfc2lua19zZXJ2aWNlX2ltcGwuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvbWVkaWEvcm91dGVyL2Rpc2NvdmVyeS9tZG5zL2Nhc3RfbWVkaWFfc2lua19zZXJ2aWNlX2ltcGwuY2MKQEAgLTkwLDkgKzkwLDcgQEAKICAgICAgICAgICAgY2FzdF9jaGFubmVsOjpDaGFsbGVuZ2VSZXBseUVycm9yOjpDRVJUX1BBUlNJTkdfRkFJTEVEIHx8CiAgICAgICAgbGFzdF9lcnJvci5jaGFsbGVuZ2VfcmVwbHlfZXJyb3IgPT0KICAgICAgICAgICAgY2FzdF9jaGFubmVsOjpDaGFsbGVuZ2VSZXBseUVycm9yOjpDQU5OT1RfRVhUUkFDVF9QVUJMSUNfS0VZKSB8fAotICAgICAgKGxhc3RfZXJyb3IubmV0X3JldHVybl92YWx1ZSA8PQotICAgICAgICAgICBuZXQ6OkVSUl9DRVJUX0NPTU1PTl9OQU1FX0lOVkFMSUQgJiYgIC8vIENFUlRfWFhYIGVycm9ycwotICAgICAgIGxhc3RfZXJyb3IubmV0X3JldHVybl92YWx1ZSA+IG5ldDo6RVJSX0NFUlRfRU5EKSB8fAorICAgICAgbmV0OjpJc0NlcnRpZmljYXRlRXJyb3IobGFzdF9lcnJvci5uZXRfcmV0dXJuX3ZhbHVlKSB8fAogICAgICAgbGFzdF9lcnJvci5jaGFubmVsX2V2ZW50ID09CiAgICAgICAgICAgY2FzdF9jaGFubmVsOjpDaGFubmVsRXZlbnQ6OlNTTF9TT0NLRVRfQ09OTkVDVF9GQUlMRUQgfHwKICAgICAgIGxhc3RfZXJyb3IuY2hhbm5lbF9ldmVudCA9PQpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvbm90aWZpY2F0aW9ucy9ub3RpZmljYXRpb25fcGxhdGZvcm1fYnJpZGdlX2xpbnV4LmNjIGIvY2hyb21lL2Jyb3dzZXIvbm90aWZpY2F0aW9ucy9ub3RpZmljYXRpb25fcGxhdGZvcm1fYnJpZGdlX2xpbnV4LmNjCmluZGV4IGY5MTZlNGUuLjI0YmFlODEwIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9ub3RpZmljYXRpb25zL25vdGlmaWNhdGlvbl9wbGF0Zm9ybV9icmlkZ2VfbGludXguY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvbm90aWZpY2F0aW9ucy9ub3RpZmljYXRpb25fcGxhdGZvcm1fYnJpZGdlX2xpbnV4LmNjCkBAIC0zMSw3ICszMSw3IEBACiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvY2hyb21lX25vdGlmaWNhdGlvbl90eXBlcy5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL25vdGlmaWNhdGlvbnMvbm90aWZpY2F0aW9uX2Rpc3BsYXlfc2VydmljZV9pbXBsLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvcHJvZmlsZXMvcHJvZmlsZV9tYW5hZ2VyLmgiCi0jaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvc2hlbGxfaW50ZWdyYXRpb25fbGludXguaCIKKyNpbmNsdWRlICJjaHJvbWUvY29tbW9uL2NoYW5uZWxfaW5mby5oIgogI2luY2x1ZGUgImNocm9tZS9ncml0L2Nocm9tZV91bnNjYWxlZF9yZXNvdXJjZXMuaCIKICNpbmNsdWRlICJjaHJvbWUvZ3JpdC9jaHJvbWl1bV9zdHJpbmdzLmgiCiAjaW5jbHVkZSAiY2hyb21lL2dyaXQvZ2VuZXJhdGVkX3Jlc291cmNlcy5oIgpAQCAtNjkxLDggKzY5MSw3IEBACiAgICAgfQogCiAgICAgc3RkOjp1bmlxdWVfcHRyPGJhc2U6OkVudmlyb25tZW50PiBlbnYgPSBiYXNlOjpFbnZpcm9ubWVudDo6Q3JlYXRlKCk7Ci0gICAgYmFzZTo6RmlsZVBhdGggZGVza3RvcF9maWxlKAotICAgICAgICBzaGVsbF9pbnRlZ3JhdGlvbl9saW51eDo6R2V0RGVza3RvcE5hbWUoZW52LmdldCgpKSk7CisgICAgYmFzZTo6RmlsZVBhdGggZGVza3RvcF9maWxlKGNocm9tZTo6R2V0RGVza3RvcE5hbWUoZW52LmdldCgpKSk7CiAgICAgY29uc3QgY2hhciBrRGVza3RvcEZpbGVTdWZmaXhbXSA9ICIuZGVza3RvcCI7CiAgICAgRENIRUNLKGJhc2U6OkVuZHNXaXRoKGRlc2t0b3BfZmlsZS52YWx1ZSgpLCBrRGVza3RvcEZpbGVTdWZmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkNvbXBhcmVDYXNlOjpTRU5TSVRJVkUpKTsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL29wdGltaXphdGlvbl9ndWlkZS9vcHRpbWl6YXRpb25fZ3VpZGVfaGludHNfbWFuYWdlci5jYyBiL2Nocm9tZS9icm93c2VyL29wdGltaXphdGlvbl9ndWlkZS9vcHRpbWl6YXRpb25fZ3VpZGVfaGludHNfbWFuYWdlci5jYwppbmRleCA0Y2Y2ZTdlLi4yMjlhZTY4IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9vcHRpbWl6YXRpb25fZ3VpZGUvb3B0aW1pemF0aW9uX2d1aWRlX2hpbnRzX21hbmFnZXIuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvb3B0aW1pemF0aW9uX2d1aWRlL29wdGltaXphdGlvbl9ndWlkZV9oaW50c19tYW5hZ2VyLmNjCkBAIC02OTMsNyArNjkzLDcgQEAKIH0KIAogdm9pZCBPcHRpbWl6YXRpb25HdWlkZUhpbnRzTWFuYWdlcjo6UmVnaXN0ZXJPcHRpbWl6YXRpb25UeXBlcygKLSAgICBzdGQ6OnZlY3RvcjxvcHRpbWl6YXRpb25fZ3VpZGU6OnByb3RvOjpPcHRpbWl6YXRpb25UeXBlPgorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG9wdGltaXphdGlvbl9ndWlkZTo6cHJvdG86Ok9wdGltaXphdGlvblR5cGU+JgogICAgICAgICBvcHRpbWl6YXRpb25fdHlwZXMpIHsKICAgYm9vbCBzaG91bGRfbG9hZF9uZXdfb3B0aW1pemF0aW9uX2ZpbHRlciA9IGZhbHNlOwogICBmb3IgKGNvbnN0IGF1dG8gb3B0aW1pemF0aW9uX3R5cGUgOiBvcHRpbWl6YXRpb25fdHlwZXMpIHsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL29wdGltaXphdGlvbl9ndWlkZS9vcHRpbWl6YXRpb25fZ3VpZGVfaGludHNfbWFuYWdlci5oIGIvY2hyb21lL2Jyb3dzZXIvb3B0aW1pemF0aW9uX2d1aWRlL29wdGltaXphdGlvbl9ndWlkZV9oaW50c19tYW5hZ2VyLmgKaW5kZXggYzc3ZTA3Yi4uZmE3YjliNCAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvb3B0aW1pemF0aW9uX2d1aWRlL29wdGltaXphdGlvbl9ndWlkZV9oaW50c19tYW5hZ2VyLmgKKysrIGIvY2hyb21lL2Jyb3dzZXIvb3B0aW1pemF0aW9uX2d1aWRlL29wdGltaXphdGlvbl9ndWlkZV9oaW50c19tYW5hZ2VyLmgKQEAgLTg5LDcgKzg5LDcgQEAKICAgLy8gUmVnaXN0ZXJzIHRoZSBvcHRpbWl6YXRpb24gdHlwZXMgdGhhdCBoYXZlIHRoZSBwb3RlbnRpYWwgZm9yIGhpbnRzIHRvIGJlCiAgIC8vIGNhbGxlZCBieSBjb25zdW1lcnMgb2YgdGhlIE9wdGltaXphdGlvbiBHdWlkZS4KICAgdm9pZCBSZWdpc3Rlck9wdGltaXphdGlvblR5cGVzKAotICAgICAgc3RkOjp2ZWN0b3I8b3B0aW1pemF0aW9uX2d1aWRlOjpwcm90bzo6T3B0aW1pemF0aW9uVHlwZT4KKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG9wdGltaXphdGlvbl9ndWlkZTo6cHJvdG86Ok9wdGltaXphdGlvblR5cGU+JgogICAgICAgICAgIG9wdGltaXphdGlvbl90eXBlcyk7CiAKICAgLy8gUmV0dXJucyB3aGV0aGVyIHRoZXJlIGhhdmUgYmVlbiBhbnkgb3B0aW1pemF0aW9uIHR5cGVzIHJlZ2lzdGVyZWQuCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9vcHRpbWl6YXRpb25fZ3VpZGUvb3B0aW1pemF0aW9uX2d1aWRlX2tleWVkX3NlcnZpY2UuY2MgYi9jaHJvbWUvYnJvd3Nlci9vcHRpbWl6YXRpb25fZ3VpZGUvb3B0aW1pemF0aW9uX2d1aWRlX2tleWVkX3NlcnZpY2UuY2MKaW5kZXggNDllMzVjMS4uOWVkNTk0ZmQgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL29wdGltaXphdGlvbl9ndWlkZS9vcHRpbWl6YXRpb25fZ3VpZGVfa2V5ZWRfc2VydmljZS5jYworKysgYi9jaHJvbWUvYnJvd3Nlci9vcHRpbWl6YXRpb25fZ3VpZGUvb3B0aW1pemF0aW9uX2d1aWRlX2tleWVkX3NlcnZpY2UuY2MKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9vcHRpbWl6YXRpb25fZ3VpZGUvb3B0aW1pemF0aW9uX2d1aWRlX3Nlc3Npb25fc3RhdGlzdGljLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvb3B0aW1pemF0aW9uX2d1aWRlL29wdGltaXphdGlvbl9ndWlkZV90b3BfaG9zdF9wcm92aWRlci5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL29wdGltaXphdGlvbl9ndWlkZS9vcHRpbWl6YXRpb25fZ3VpZGVfd2ViX2NvbnRlbnRzX29ic2VydmVyLmgiCisjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvb3B0aW1pemF0aW9uX2d1aWRlL3ByZWRpY3Rpb24vcHJlZGljdGlvbl9tYW5hZ2VyLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvcHJvZmlsZXMvcHJvZmlsZS5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvbGV2ZWxkYl9wcm90by9wdWJsaWMvcHJvdG9fZGF0YWJhc2VfcHJvdmlkZXIuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL29wdGltaXphdGlvbl9ndWlkZS9jb21tYW5kX2xpbmVfdG9wX2hvc3RfcHJvdmlkZXIuaCIKQEAgLTE0Myw2ICsxNDQsOCBAQAogICAgICAgZGF0YWJhc2VfcHJvdmlkZXIsIHRvcF9ob3N0X3Byb3ZpZGVyXy5nZXQoKSwKICAgICAgIGNvbnRlbnQ6OkJyb3dzZXJDb250ZXh0OjpHZXREZWZhdWx0U3RvcmFnZVBhcnRpdGlvbihwcm9maWxlKQogICAgICAgICAgIC0+R2V0VVJMTG9hZGVyRmFjdG9yeUZvckJyb3dzZXJQcm9jZXNzKCkpOworICBwcmVkaWN0aW9uX21hbmFnZXJfID0KKyAgICAgIHN0ZDo6bWFrZV91bmlxdWU8b3B0aW1pemF0aW9uX2d1aWRlOjpQcmVkaWN0aW9uTWFuYWdlcj4oKTsKIH0KIAogdm9pZCBPcHRpbWl6YXRpb25HdWlkZUtleWVkU2VydmljZTo6TWF5YmVMb2FkSGludEZvck5hdmlnYXRpb24oCkBAIC0xNTUsMTIgKzE1OCwxNSBAQAogICB9CiB9CiAKLXZvaWQgT3B0aW1pemF0aW9uR3VpZGVLZXllZFNlcnZpY2U6OlJlZ2lzdGVyT3B0aW1pemF0aW9uVHlwZXMoCi0gICAgc3RkOjp2ZWN0b3I8b3B0aW1pemF0aW9uX2d1aWRlOjpwcm90bzo6T3B0aW1pemF0aW9uVHlwZT4KLSAgICAgICAgb3B0aW1pemF0aW9uX3R5cGVzKSB7Cit2b2lkIE9wdGltaXphdGlvbkd1aWRlS2V5ZWRTZXJ2aWNlOjpSZWdpc3Rlck9wdGltaXphdGlvblR5cGVzQW5kVGFyZ2V0cygKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxvcHRpbWl6YXRpb25fZ3VpZGU6OnByb3RvOjpPcHRpbWl6YXRpb25UeXBlPiYKKyAgICAgICAgb3B0aW1pemF0aW9uX3R5cGVzLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG9wdGltaXphdGlvbl9ndWlkZTo6cHJvdG86Ok9wdGltaXphdGlvblRhcmdldD4mCisgICAgICAgIG9wdGltaXphdGlvbl90YXJnZXRzKSB7CiAgIERDSEVDSyhoaW50c19tYW5hZ2VyXyk7Ci0KKyAgRENIRUNLKHByZWRpY3Rpb25fbWFuYWdlcl8pOwogICBoaW50c19tYW5hZ2VyXy0+UmVnaXN0ZXJPcHRpbWl6YXRpb25UeXBlcyhvcHRpbWl6YXRpb25fdHlwZXMpOworICBwcmVkaWN0aW9uX21hbmFnZXJfLT5SZWdpc3Rlck9wdGltaXphdGlvblRhcmdldHMob3B0aW1pemF0aW9uX3RhcmdldHMpOwogfQogCiBvcHRpbWl6YXRpb25fZ3VpZGU6Ok9wdGltaXphdGlvbkd1aWRlRGVjaXNpb24KQEAgLTE5OCwxMCArMjA0LDYgQEAKIH0KIAogdm9pZCBPcHRpbWl6YXRpb25HdWlkZUtleWVkU2VydmljZTo6VXBkYXRlU2Vzc2lvbkZDUChiYXNlOjpUaW1lRGVsdGEgZmNwKSB7Ci0gIC8vIFRPRE8oY3JidWcvMTAwMTE5NCk6IFRoaXMgd2lsbCBiZSBwYXNzZWQgdG8gdGhlCi0gIC8vIE9wdGltaXphdGlvbkd1aWRlUHJlZGljdGlvbk1hbmFnZXIgdGhhdCB3aWxsIG93biB0aGUgRkNQIHNlc3Npb24KLSAgLy8gc3RhdGlzdGljcy4KLSAgaWYgKCFzZXNzaW9uX2ZjcF8pCi0gICAgc2Vzc2lvbl9mY3BfID0gc3RkOjptYWtlX3VuaXF1ZTxPcHRpbWl6YXRpb25HdWlkZVNlc3Npb25TdGF0aXN0aWM+KCk7Ci0gIHNlc3Npb25fZmNwXy0+QWRkU2FtcGxlKHN0YXRpY19jYXN0PGZsb2F0PihmY3AuSW5NaWxsaXNlY29uZHMoKSkpOworICBpZiAocHJlZGljdGlvbl9tYW5hZ2VyXykKKyAgICBwcmVkaWN0aW9uX21hbmFnZXJfLT5VcGRhdGVGQ1BTZXNzaW9uU3RhdGlzdGljcyhmY3ApOwogfQpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvb3B0aW1pemF0aW9uX2d1aWRlL29wdGltaXphdGlvbl9ndWlkZV9rZXllZF9zZXJ2aWNlLmggYi9jaHJvbWUvYnJvd3Nlci9vcHRpbWl6YXRpb25fZ3VpZGUvb3B0aW1pemF0aW9uX2d1aWRlX2tleWVkX3NlcnZpY2UuaAppbmRleCAzYTEzOTAxMi4uZDZhYmM1ZiAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvb3B0aW1pemF0aW9uX2d1aWRlL29wdGltaXphdGlvbl9ndWlkZV9rZXllZF9zZXJ2aWNlLmgKKysrIGIvY2hyb21lL2Jyb3dzZXIvb3B0aW1pemF0aW9uX2d1aWRlL29wdGltaXphdGlvbl9ndWlkZV9rZXllZF9zZXJ2aWNlLmgKQEAgLTMxLDEwICszMSwxMCBAQAogbmFtZXNwYWNlIG9wdGltaXphdGlvbl9ndWlkZSB7CiBjbGFzcyBPcHRpbWl6YXRpb25HdWlkZVNlcnZpY2U7CiBjbGFzcyBUb3BIb3N0UHJvdmlkZXI7CitjbGFzcyBQcmVkaWN0aW9uTWFuYWdlcjsKIH0gIC8vIG5hbWVzcGFjZSBvcHRpbWl6YXRpb25fZ3VpZGUKIAogY2xhc3MgT3B0aW1pemF0aW9uR3VpZGVIaW50c01hbmFnZXI7Ci1jbGFzcyBPcHRpbWl6YXRpb25HdWlkZVNlc3Npb25TdGF0aXN0aWM7CiAKIGNsYXNzIE9wdGltaXphdGlvbkd1aWRlS2V5ZWRTZXJ2aWNlCiAgICAgOiBwdWJsaWMgS2V5ZWRTZXJ2aWNlLApAQCAtNjAsNiArNjAsMTAgQEAKICAgICByZXR1cm4gdG9wX2hvc3RfcHJvdmlkZXJfLmdldCgpOwogICB9CiAKKyAgb3B0aW1pemF0aW9uX2d1aWRlOjpQcmVkaWN0aW9uTWFuYWdlciogR2V0UHJlZGljdGlvbk1hbmFnZXIoKSB7CisgICAgcmV0dXJuIHByZWRpY3Rpb25fbWFuYWdlcl8uZ2V0KCk7CisgIH0KKwogICAvLyBQcm9tcHRzIHRoZSBsb2FkIG9mIHRoZSBoaW50IGZvciB0aGUgbmF2aWdhdGlvbiwgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lCiAgIC8vIG9wdGltaXphdGlvbiB0eXBlIHJlZ2lzdGVyZWQgYW5kIHRoZXJlIGlzIGEgaGludCBhdmFpbGFibGUuCiAgIHZvaWQgTWF5YmVMb2FkSGludEZvck5hdmlnYXRpb24oY29udGVudDo6TmF2aWdhdGlvbkhhbmRsZSogbmF2aWdhdGlvbl9oYW5kbGUpOwpAQCAtNjgsOSArNzIsMTEgQEAKICAgdm9pZCBDbGVhckRhdGEoKTsKIAogICAvLyBvcHRpbWl6YXRpb25fZ3VpZGU6Ok9wdGltaXphdGlvbkd1aWRlRGVjaWRlciBpbXBsZW1lbnRhdGlvbjoKLSAgdm9pZCBSZWdpc3Rlck9wdGltaXphdGlvblR5cGVzKAotICAgICAgc3RkOjp2ZWN0b3I8b3B0aW1pemF0aW9uX2d1aWRlOjpwcm90bzo6T3B0aW1pemF0aW9uVHlwZT4KLSAgICAgICAgICBvcHRpbWl6YXRpb25fdHlwZXMpIG92ZXJyaWRlOworICB2b2lkIFJlZ2lzdGVyT3B0aW1pemF0aW9uVHlwZXNBbmRUYXJnZXRzKAorICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8b3B0aW1pemF0aW9uX2d1aWRlOjpwcm90bzo6T3B0aW1pemF0aW9uVHlwZT4mCisgICAgICAgICAgb3B0aW1pemF0aW9uX3R5cGVzLAorICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8b3B0aW1pemF0aW9uX2d1aWRlOjpwcm90bzo6T3B0aW1pemF0aW9uVGFyZ2V0PiYKKyAgICAgICAgICBvcHRpbWl6YXRpb25fdGFyZ2V0cykgb3ZlcnJpZGU7CiAgIG9wdGltaXphdGlvbl9ndWlkZTo6T3B0aW1pemF0aW9uR3VpZGVEZWNpc2lvbiBDYW5BcHBseU9wdGltaXphdGlvbigKICAgICAgIGNvbnRlbnQ6Ok5hdmlnYXRpb25IYW5kbGUqIG5hdmlnYXRpb25faGFuZGxlLAogICAgICAgb3B0aW1pemF0aW9uX2d1aWRlOjpwcm90bzo6T3B0aW1pemF0aW9uVGFyZ2V0IG9wdGltaXphdGlvbl90YXJnZXQsCkBAIC04MCwyMSArODYsMTggQEAKICAgLy8gS2V5ZWRTZXJ2aWNlIGltcGxlbWVudGF0aW9uOgogICB2b2lkIFNodXRkb3duKCkgb3ZlcnJpZGU7CiAKLSAgLy8gVXBkYXRlIHxzZXNzaW9uX2ZjcF98IHdpdGggdGhlIHByb3ZpZGVkIGZjcCB2YWx1ZS4KKyAgLy8gVXBkYXRlcyB8cHJlZGljdGlvbl9tYW5hZ2VyX3wgd2l0aCB0aGUgcHJvdmlkZWQgZmNwIHZhbHVlLgogICB2b2lkIFVwZGF0ZVNlc3Npb25GQ1AoYmFzZTo6VGltZURlbHRhIGZjcCk7CiAKLSAgT3B0aW1pemF0aW9uR3VpZGVTZXNzaW9uU3RhdGlzdGljKiBHZXRTZXNzaW9uRkNQRm9yVGVzdGluZygpIGNvbnN0IHsKLSAgICByZXR1cm4gc2Vzc2lvbl9mY3BfLmdldCgpOwotICB9Ci0KICBwcml2YXRlOgogICBjb250ZW50OjpCcm93c2VyQ29udGV4dCogYnJvd3Nlcl9jb250ZXh0XzsKIAogICAvLyBNYW5hZ2VzIHRoZSBzdG9yaW5nLCBsb2FkaW5nLCBhbmQgZmV0Y2hpbmcgb2YgaGludHMuCiAgIHN0ZDo6dW5pcXVlX3B0cjxPcHRpbWl6YXRpb25HdWlkZUhpbnRzTWFuYWdlcj4gaGludHNfbWFuYWdlcl87CiAKLSAgLy8gVGhlIGN1cnJlbnQgc2Vzc2lvbidzIEZDUCBzdGF0aXN0aWNzIGZvciBIVFRQL0hUVFBTIG5hdmlnYXRpb25zLgotICBzdGQ6OnVuaXF1ZV9wdHI8T3B0aW1pemF0aW9uR3VpZGVTZXNzaW9uU3RhdGlzdGljPiBzZXNzaW9uX2ZjcF87CisgIC8vIE1hbmFnZXMgdGhlIHN0b3JpbmcsIGxvYWRpbmcsIGFuZCBldmFsdWF0aW5nIG9mIG9wdGltaXphdGlvbiB0YXJnZXQKKyAgLy8gcHJlZGljdGlvbiBtb2RlbHMuCisgIHN0ZDo6dW5pcXVlX3B0cjxvcHRpbWl6YXRpb25fZ3VpZGU6OlByZWRpY3Rpb25NYW5hZ2VyPiBwcmVkaWN0aW9uX21hbmFnZXJfOwogCiAgIC8vIFRoZSB0b3AgaG9zdCBwcm92aWRlciB0byB1c2UgZm9yIGZldGNoaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgdXNlcidzIHRvcAogICAvLyBob3N0cy4gV2lsbCBiZSBudWxsIGlmIHRoZSB1c2VyIGhhcyBub3QgY29uc2VudGVkIHRvIHRoaXMgdHlwZSBvZiBicm93c2VyCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9vcHRpbWl6YXRpb25fZ3VpZGUvb3B0aW1pemF0aW9uX2d1aWRlX2tleWVkX3NlcnZpY2VfYnJvd3NlcnRlc3QuY2MgYi9jaHJvbWUvYnJvd3Nlci9vcHRpbWl6YXRpb25fZ3VpZGUvb3B0aW1pemF0aW9uX2d1aWRlX2tleWVkX3NlcnZpY2VfYnJvd3NlcnRlc3QuY2MKaW5kZXggNjY2MWZlZC4uMmM2NTZhYjUgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL29wdGltaXphdGlvbl9ndWlkZS9vcHRpbWl6YXRpb25fZ3VpZGVfa2V5ZWRfc2VydmljZV9icm93c2VydGVzdC5jYworKysgYi9jaHJvbWUvYnJvd3Nlci9vcHRpbWl6YXRpb25fZ3VpZGUvb3B0aW1pemF0aW9uX2d1aWRlX2tleWVkX3NlcnZpY2VfYnJvd3NlcnRlc3QuY2MKQEAgLTE4MSw3ICsxODEsOCBAQAogCiAgIHZvaWQgUmVnaXN0ZXJXaXRoS2V5ZWRTZXJ2aWNlKCkgewogICAgIE9wdGltaXphdGlvbkd1aWRlS2V5ZWRTZXJ2aWNlRmFjdG9yeTo6R2V0Rm9yUHJvZmlsZShicm93c2VyKCktPnByb2ZpbGUoKSkKLSAgICAgICAgLT5SZWdpc3Rlck9wdGltaXphdGlvblR5cGVzKHtvcHRpbWl6YXRpb25fZ3VpZGU6OnByb3RvOjpOT1NDUklQVH0pOworICAgICAgICAtPlJlZ2lzdGVyT3B0aW1pemF0aW9uVHlwZXNBbmRUYXJnZXRzKAorICAgICAgICAgICAge29wdGltaXphdGlvbl9ndWlkZTo6cHJvdG86Ok5PU0NSSVBUfSwgLypvcHRpbWl6YXRpb25fdGFyZ2V0cz0qL3t9KTsKICAgfQogCiAgIHZvaWQgUHVzaEhpbnRzQ29tcG9uZW50QW5kV2FpdEZvckNvbXBsZXRpb24oKSB7CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9vcHRpbWl6YXRpb25fZ3VpZGUvcHJlZGljdGlvbi9wcmVkaWN0aW9uX21hbmFnZXIuaCBiL2Nocm9tZS9icm93c2VyL29wdGltaXphdGlvbl9ndWlkZS9wcmVkaWN0aW9uL3ByZWRpY3Rpb25fbWFuYWdlci5oCmluZGV4IGQ1MWJiNjAuLjU1NDExZmEgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL29wdGltaXphdGlvbl9ndWlkZS9wcmVkaWN0aW9uL3ByZWRpY3Rpb25fbWFuYWdlci5oCisrKyBiL2Nocm9tZS9icm93c2VyL29wdGltaXphdGlvbl9ndWlkZS9wcmVkaWN0aW9uL3ByZWRpY3Rpb25fbWFuYWdlci5oCkBAIC01Miw2ICs1MiwxMCBAQAogICAvLyBVcGRhdGVzIHxzZXNzaW9uX2ZjcF98IGFuZCB8cHJldmlvdXNfZmNwX3wgd2l0aCB8ZmNwfC4KICAgdm9pZCBVcGRhdGVGQ1BTZXNzaW9uU3RhdGlzdGljcyhiYXNlOjpUaW1lRGVsdGEgZmNwKTsKIAorICBPcHRpbWl6YXRpb25HdWlkZVNlc3Npb25TdGF0aXN0aWMqIEdldEZDUFNlc3Npb25TdGF0aXN0aWNzRm9yVGVzdGluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxPcHRpbWl6YXRpb25HdWlkZVNlc3Npb25TdGF0aXN0aWMqPigmc2Vzc2lvbl9mY3BfKTsKKyAgfQorCiAgIC8vIG5ldHdvcms6Ok5ldHdvcmtRdWFsaXR5VHJhY2tlcjo6RWZmZWN0aXZlQ29ubmVjdGlvblR5cGVPYnNlcnZlcgogICAvLyBpbXBsZW1lbnRhdGlvbjoKICAgdm9pZCBPbkVmZmVjdGl2ZUNvbm5lY3Rpb25UeXBlQ2hhbmdlZCgKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL29wdGltaXphdGlvbl9ndWlkZS9wcmVkaWN0aW9uL3ByZWRpY3Rpb25fbWFuYWdlcl9icm93c2VydGVzdC5jYyBiL2Nocm9tZS9icm93c2VyL29wdGltaXphdGlvbl9ndWlkZS9wcmVkaWN0aW9uL3ByZWRpY3Rpb25fbWFuYWdlcl9icm93c2VydGVzdC5jYwppbmRleCA5Y2Q1MmE2Yi4uMTMwYmZjMyAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvb3B0aW1pemF0aW9uX2d1aWRlL3ByZWRpY3Rpb24vcHJlZGljdGlvbl9tYW5hZ2VyX2Jyb3dzZXJ0ZXN0LmNjCisrKyBiL2Nocm9tZS9icm93c2VyL29wdGltaXphdGlvbl9ndWlkZS9wcmVkaWN0aW9uL3ByZWRpY3Rpb25fbWFuYWdlcl9icm93c2VydGVzdC5jYwpAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9vcHRpbWl6YXRpb25fZ3VpZGUvb3B0aW1pemF0aW9uX2d1aWRlX2tleWVkX3NlcnZpY2UuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9vcHRpbWl6YXRpb25fZ3VpZGUvb3B0aW1pemF0aW9uX2d1aWRlX2tleWVkX3NlcnZpY2VfZmFjdG9yeS5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL29wdGltaXphdGlvbl9ndWlkZS9vcHRpbWl6YXRpb25fZ3VpZGVfc2Vzc2lvbl9zdGF0aXN0aWMuaCIKKyNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9vcHRpbWl6YXRpb25fZ3VpZGUvcHJlZGljdGlvbi9wcmVkaWN0aW9uX21hbmFnZXIuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9wcm9maWxlcy9wcm9maWxlLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvYnJvd3Nlci5oIgogI2luY2x1ZGUgImNocm9tZS90ZXN0L2Jhc2UvaW5fcHJvY2Vzc19icm93c2VyX3Rlc3QuaCIKQEAgLTUwLDcgKzUxLDkgQEAKIAogICB2b2lkIFJlZ2lzdGVyV2l0aEtleWVkU2VydmljZSgpIHsKICAgICBPcHRpbWl6YXRpb25HdWlkZUtleWVkU2VydmljZUZhY3Rvcnk6OkdldEZvclByb2ZpbGUoYnJvd3NlcigpLT5wcm9maWxlKCkpCi0gICAgICAgIC0+UmVnaXN0ZXJPcHRpbWl6YXRpb25UeXBlcyh7b3B0aW1pemF0aW9uX2d1aWRlOjpwcm90bzo6Tk9TQ1JJUFR9KTsKKyAgICAgICAgLT5SZWdpc3Rlck9wdGltaXphdGlvblR5cGVzQW5kVGFyZ2V0cygKKyAgICAgICAgICAgIHtvcHRpbWl6YXRpb25fZ3VpZGU6OnByb3RvOjpOT1NDUklQVH0sCisgICAgICAgICAgICB7b3B0aW1pemF0aW9uX2d1aWRlOjpwcm90bzo6T1BUSU1JWkFUSU9OX1RBUkdFVF9QQUlORlVMX1BBR0VfTE9BRH0pOwogICB9CiAKICAgc3RkOjp1bmlxdWVfcHRyPHBhZ2VfbG9hZF9tZXRyaWNzOjpQYWdlTG9hZE1ldHJpY3NUZXN0V2FpdGVyPgpAQCAtODQsOCArODcsOSBAQAogICB1aV90ZXN0X3V0aWxzOjpOYXZpZ2F0ZVRvVVJMKGJyb3dzZXIoKSwgaHR0cHNfdXJsX3dpdGhfY29udGVudCgpKTsKICAgd2FpdGVyLT5XYWl0KCk7CiAKLSAgT3B0aW1pemF0aW9uR3VpZGVTZXNzaW9uU3RhdGlzdGljKiBzZXNzaW9uX2ZjcCA9Ci0gICAgICBrZXllZF9zZXJ2aWNlLT5HZXRTZXNzaW9uRkNQRm9yVGVzdGluZygpOworICBjb25zdCBPcHRpbWl6YXRpb25HdWlkZVNlc3Npb25TdGF0aXN0aWMqIHNlc3Npb25fZmNwID0KKyAgICAgIGtleWVkX3NlcnZpY2UtPkdldFByZWRpY3Rpb25NYW5hZ2VyKCkKKyAgICAgICAgICAtPkdldEZDUFNlc3Npb25TdGF0aXN0aWNzRm9yVGVzdGluZygpOwogICBFWFBFQ1RfVFJVRShzZXNzaW9uX2ZjcCk7CiAgIEVYUEVDVF9FUSgxdSwgc2Vzc2lvbl9mY3AtPkdldE51bWJlck9mU2FtcGxlcygpKTsKIH0KQEAgLTEwMiw4ICsxMDYsOSBAQAogICB1aV90ZXN0X3V0aWxzOjpOYXZpZ2F0ZVRvVVJMKGJyb3dzZXIoKSwgaHR0cHNfdXJsX3dpdGhfY29udGVudCgpKTsKICAgd2FpdGVyLT5XYWl0KCk7CiAKLSAgT3B0aW1pemF0aW9uR3VpZGVTZXNzaW9uU3RhdGlzdGljKiBzZXNzaW9uX2ZjcCA9Ci0gICAgICBrZXllZF9zZXJ2aWNlLT5HZXRTZXNzaW9uRkNQRm9yVGVzdGluZygpOworICBjb25zdCBPcHRpbWl6YXRpb25HdWlkZVNlc3Npb25TdGF0aXN0aWMqIHNlc3Npb25fZmNwID0KKyAgICAgIGtleWVkX3NlcnZpY2UtPkdldFByZWRpY3Rpb25NYW5hZ2VyKCkKKyAgICAgICAgICAtPkdldEZDUFNlc3Npb25TdGF0aXN0aWNzRm9yVGVzdGluZygpOwogICBmbG9hdCBjdXJyZW50X21lYW4gPSBzZXNzaW9uX2ZjcC0+R2V0TWVhbigpOwogCiAgIHdhaXRlciA9IENyZWF0ZVBhZ2VMb2FkTWV0cmljc1Rlc3RXYWl0ZXIoKTsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3BhZ2VfbG9hZF9tZXRyaWNzL29ic2VydmVycy9hZF9tZXRyaWNzL2Fkc19wYWdlX2xvYWRfbWV0cmljc19vYnNlcnZlci5jYyBiL2Nocm9tZS9icm93c2VyL3BhZ2VfbG9hZF9tZXRyaWNzL29ic2VydmVycy9hZF9tZXRyaWNzL2Fkc19wYWdlX2xvYWRfbWV0cmljc19vYnNlcnZlci5jYwppbmRleCBhZmM3ZWIwLi40MjVlNzg1IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9wYWdlX2xvYWRfbWV0cmljcy9vYnNlcnZlcnMvYWRfbWV0cmljcy9hZHNfcGFnZV9sb2FkX21ldHJpY3Nfb2JzZXJ2ZXIuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvcGFnZV9sb2FkX21ldHJpY3Mvb2JzZXJ2ZXJzL2FkX21ldHJpY3MvYWRzX3BhZ2VfbG9hZF9tZXRyaWNzX29ic2VydmVyLmNjCkBAIC04NDksMjAgKzg0OSwyMCBAQAogICAgICAgICAgICAgICAgICAgc3RkOjptaW4oYWRfZnJhbWVfZGF0YS5mcmFtZV9zaXplKCkud2lkdGgoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkX2ZyYW1lX2RhdGEuZnJhbWVfc2l6ZSgpLmhlaWdodCgpKSk7CiAKLSAgICBBRFNfSElTVE9HUkFNKCJCeXRlcy5BZEZyYW1lcy5QZXJGcmFtZS5Ub3RhbCIsIFBBR0VfQllURVNfSElTVE9HUkFNLAorICAgIEFEU19ISVNUT0dSQU0oIkJ5dGVzLkFkRnJhbWVzLlBlckZyYW1lLlRvdGFsMiIsIFBBR0VfQllURVNfSElTVE9HUkFNLAogICAgICAgICAgICAgICAgICAgdmlzaWJpbGl0eSwgYWRfZnJhbWVfZGF0YS5ieXRlcygpKTsKICAgICBBRFNfSElTVE9HUkFNKCJCeXRlcy5BZEZyYW1lcy5QZXJGcmFtZS5OZXR3b3JrIiwgUEFHRV9CWVRFU19ISVNUT0dSQU0sCiAgICAgICAgICAgICAgICAgICB2aXNpYmlsaXR5LCBhZF9mcmFtZV9kYXRhLm5ldHdvcmtfYnl0ZXMoKSk7Ci0gICAgQURTX0hJU1RPR1JBTSgiQnl0ZXMuQWRGcmFtZXMuUGVyRnJhbWUuU2FtZU9yaWdpbiIsIFBBR0VfQllURVNfSElTVE9HUkFNLAorICAgIEFEU19ISVNUT0dSQU0oIkJ5dGVzLkFkRnJhbWVzLlBlckZyYW1lLlNhbWVPcmlnaW4yIiwgUEFHRV9CWVRFU19ISVNUT0dSQU0sCiAgICAgICAgICAgICAgICAgICB2aXNpYmlsaXR5LCBhZF9mcmFtZV9kYXRhLnNhbWVfb3JpZ2luX2J5dGVzKCkpOwogICAgIGlmIChhZF9mcmFtZV9kYXRhLmJ5dGVzKCkgPiAwKSB7CiAgICAgICBBRFNfSElTVE9HUkFNKAotICAgICAgICAgICJCeXRlcy5BZEZyYW1lcy5QZXJGcmFtZS5QZXJjZW50TmV0d29yayIsIFVNQV9ISVNUT0dSQU1fUEVSQ0VOVEFHRSwKKyAgICAgICAgICAiQnl0ZXMuQWRGcmFtZXMuUGVyRnJhbWUuUGVyY2VudE5ldHdvcmsyIiwgVU1BX0hJU1RPR1JBTV9QRVJDRU5UQUdFLAogICAgICAgICAgIHZpc2liaWxpdHksCiAgICAgICAgICAgYWRfZnJhbWVfZGF0YS5uZXR3b3JrX2J5dGVzKCkgKiAxMDAgLyBhZF9mcmFtZV9kYXRhLmJ5dGVzKCkpOwogICAgICAgQURTX0hJU1RPR1JBTSgKLSAgICAgICAgICAiQnl0ZXMuQWRGcmFtZXMuUGVyRnJhbWUuUGVyY2VudFNhbWVPcmlnaW4iLCBVTUFfSElTVE9HUkFNX1BFUkNFTlRBR0UsCi0gICAgICAgICAgdmlzaWJpbGl0eSwKKyAgICAgICAgICAiQnl0ZXMuQWRGcmFtZXMuUGVyRnJhbWUuUGVyY2VudFNhbWVPcmlnaW4yIiwKKyAgICAgICAgICBVTUFfSElTVE9HUkFNX1BFUkNFTlRBR0UsIHZpc2liaWxpdHksCiAgICAgICAgICAgYWRfZnJhbWVfZGF0YS5zYW1lX29yaWdpbl9ieXRlcygpICogMTAwIC8gYWRfZnJhbWVfZGF0YS5ieXRlcygpKTsKICAgICB9CiAgICAgQURTX0hJU1RPR1JBTSgiRnJhbWVDb3VudHMuQWRGcmFtZXMuUGVyRnJhbWUuT3JpZ2luU3RhdHVzIiwKQEAgLTg5NCwxOCArODk0LDE5IEBACiAgIGlmIChhZ2dyZWdhdGVfYWRfaW5mby5udW1fZnJhbWVzID09IDApCiAgICAgcmV0dXJuOwogCi0gIEFEU19ISVNUT0dSQU0oIkJ5dGVzLk5vbkFkRnJhbWVzLkFnZ3JlZ2F0ZS5Ub3RhbCIsIFBBR0VfQllURVNfSElTVE9HUkFNLAorICBBRFNfSElTVE9HUkFNKCJCeXRlcy5Ob25BZEZyYW1lcy5BZ2dyZWdhdGUuVG90YWwyIiwgUEFHRV9CWVRFU19ISVNUT0dSQU0sCiAgICAgICAgICAgICAgICAgdmlzaWJpbGl0eSwKICAgICAgICAgICAgICAgICBhZ2dyZWdhdGVfZnJhbWVfZGF0YV8tPmJ5dGVzKCkgLSBhZ2dyZWdhdGVfYWRfaW5mby5ieXRlcyk7CiAKLSAgQURTX0hJU1RPR1JBTSgiQnl0ZXMuRnVsbFBhZ2UuVG90YWwiLCBQQUdFX0JZVEVTX0hJU1RPR1JBTSwgdmlzaWJpbGl0eSwKKyAgQURTX0hJU1RPR1JBTSgiQnl0ZXMuRnVsbFBhZ2UuVG90YWwyIiwgUEFHRV9CWVRFU19ISVNUT0dSQU0sIHZpc2liaWxpdHksCiAgICAgICAgICAgICAgICAgYWdncmVnYXRlX2ZyYW1lX2RhdGFfLT5ieXRlcygpKTsKICAgQURTX0hJU1RPR1JBTSgiQnl0ZXMuRnVsbFBhZ2UuTmV0d29yayIsIFBBR0VfQllURVNfSElTVE9HUkFNLCB2aXNpYmlsaXR5LAogICAgICAgICAgICAgICAgIGFnZ3JlZ2F0ZV9mcmFtZV9kYXRhXy0+bmV0d29ya19ieXRlcygpKTsKIAogICBpZiAoYWdncmVnYXRlX2ZyYW1lX2RhdGFfLT5ieXRlcygpKSB7CiAgICAgQURTX0hJU1RPR1JBTSgKLSAgICAgICAgIkJ5dGVzLkZ1bGxQYWdlLlRvdGFsLlBlcmNlbnRBZHMiLCBVTUFfSElTVE9HUkFNX1BFUkNFTlRBR0UsIHZpc2liaWxpdHksCisgICAgICAgICJCeXRlcy5GdWxsUGFnZS5Ub3RhbC5QZXJjZW50QWRzMiIsIFVNQV9ISVNUT0dSQU1fUEVSQ0VOVEFHRSwKKyAgICAgICAgdmlzaWJpbGl0eSwKICAgICAgICAgYWdncmVnYXRlX2FkX2luZm8uYnl0ZXMgKiAxMDAgLyBhZ2dyZWdhdGVfZnJhbWVfZGF0YV8tPmJ5dGVzKCkpOwogICB9CiAgIGlmIChhZ2dyZWdhdGVfZnJhbWVfZGF0YV8tPm5ldHdvcmtfYnl0ZXMoKSkgewpAQCAtOTE1LDE0ICs5MTYsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICBhZ2dyZWdhdGVfZnJhbWVfZGF0YV8tPm5ldHdvcmtfYnl0ZXMoKSk7CiAgIH0KIAotICBBRFNfSElTVE9HUkFNKCJCeXRlcy5BZEZyYW1lcy5BZ2dyZWdhdGUuVG90YWwiLCBQQUdFX0JZVEVTX0hJU1RPR1JBTSwKKyAgQURTX0hJU1RPR1JBTSgiQnl0ZXMuQWRGcmFtZXMuQWdncmVnYXRlLlRvdGFsMiIsIFBBR0VfQllURVNfSElTVE9HUkFNLAogICAgICAgICAgICAgICAgIHZpc2liaWxpdHksIGFnZ3JlZ2F0ZV9hZF9pbmZvLmJ5dGVzKTsKICAgQURTX0hJU1RPR1JBTSgiQnl0ZXMuQWRGcmFtZXMuQWdncmVnYXRlLk5ldHdvcmsiLCBQQUdFX0JZVEVTX0hJU1RPR1JBTSwKICAgICAgICAgICAgICAgICB2aXNpYmlsaXR5LCBhZ2dyZWdhdGVfYWRfaW5mby5uZXR3b3JrX2J5dGVzKTsKIAogICBpZiAoYWdncmVnYXRlX2FkX2luZm8uYnl0ZXMpIHsKICAgICBBRFNfSElTVE9HUkFNKAotICAgICAgICAiQnl0ZXMuQWRGcmFtZXMuQWdncmVnYXRlLlBlcmNlbnROZXR3b3JrIiwgVU1BX0hJU1RPR1JBTV9QRVJDRU5UQUdFLAorICAgICAgICAiQnl0ZXMuQWRGcmFtZXMuQWdncmVnYXRlLlBlcmNlbnROZXR3b3JrMiIsIFVNQV9ISVNUT0dSQU1fUEVSQ0VOVEFHRSwKICAgICAgICAgdmlzaWJpbGl0eSwKICAgICAgICAgYWdncmVnYXRlX2FkX2luZm8ubmV0d29ya19ieXRlcyAqIDEwMCAvIGFnZ3JlZ2F0ZV9hZF9pbmZvLmJ5dGVzKTsKICAgfQpAQCAtOTMxLDIxICs5MzIsMjEgQEAKICAgLy8gYXMgdGhlc2UgbnVtYmVycyBkbyBub3QgY2hhbmdlIGZvciBkaWZmZXJlbnQgdmlzaWJpbGl0eSB0eXBlcy4KICAgaWYgKHZpc2liaWxpdHkgIT0gRnJhbWVEYXRhOjpGcmFtZVZpc2liaWxpdHk6OmtBbnlWaXNpYmlsaXR5KQogICAgIHJldHVybjsKLSAgQURTX0hJU1RPR1JBTSgiQnl0ZXMuRnVsbFBhZ2UuU2FtZU9yaWdpbiIsIFBBR0VfQllURVNfSElTVE9HUkFNLCB2aXNpYmlsaXR5LAorICBBRFNfSElTVE9HUkFNKCJCeXRlcy5GdWxsUGFnZS5TYW1lT3JpZ2luMiIsIFBBR0VfQllURVNfSElTVE9HUkFNLCB2aXNpYmlsaXR5LAogICAgICAgICAgICAgICAgIGFnZ3JlZ2F0ZV9mcmFtZV9kYXRhXy0+c2FtZV9vcmlnaW5fYnl0ZXMoKSk7CiAgIGlmIChhZ2dyZWdhdGVfZnJhbWVfZGF0YV8tPmJ5dGVzKCkpIHsKLSAgICBBRFNfSElTVE9HUkFNKCJCeXRlcy5GdWxsUGFnZS5QZXJjZW50U2FtZU9yaWdpbiIsIFVNQV9ISVNUT0dSQU1fUEVSQ0VOVEFHRSwKKyAgICBBRFNfSElTVE9HUkFNKCJCeXRlcy5GdWxsUGFnZS5QZXJjZW50U2FtZU9yaWdpbjIiLCBVTUFfSElTVE9HUkFNX1BFUkNFTlRBR0UsCiAgICAgICAgICAgICAgICAgICB2aXNpYmlsaXR5LAogICAgICAgICAgICAgICAgICAgYWdncmVnYXRlX2ZyYW1lX2RhdGFfLT5zYW1lX29yaWdpbl9ieXRlcygpICogMTAwIC8KICAgICAgICAgICAgICAgICAgICAgICBhZ2dyZWdhdGVfZnJhbWVfZGF0YV8tPmJ5dGVzKCkpOwogICB9CiAgIEFEU19ISVNUT0dSQU0oIkJ5dGVzLk1haW5GcmFtZS5OZXR3b3JrIiwgUEFHRV9CWVRFU19ISVNUT0dSQU0sIHZpc2liaWxpdHksCiAgICAgICAgICAgICAgICAgbWFpbl9mcmFtZV9kYXRhXy0+bmV0d29ya19ieXRlcygpKTsKLSAgQURTX0hJU1RPR1JBTSgiQnl0ZXMuTWFpbkZyYW1lLlRvdGFsIiwgUEFHRV9CWVRFU19ISVNUT0dSQU0sIHZpc2liaWxpdHksCisgIEFEU19ISVNUT0dSQU0oIkJ5dGVzLk1haW5GcmFtZS5Ub3RhbDIiLCBQQUdFX0JZVEVTX0hJU1RPR1JBTSwgdmlzaWJpbGl0eSwKICAgICAgICAgICAgICAgICBtYWluX2ZyYW1lX2RhdGFfLT5ieXRlcygpKTsKICAgQURTX0hJU1RPR1JBTSgiQnl0ZXMuTWFpbkZyYW1lLkFkcy5OZXR3b3JrIiwgUEFHRV9CWVRFU19ISVNUT0dSQU0sIHZpc2liaWxpdHksCiAgICAgICAgICAgICAgICAgbWFpbl9mcmFtZV9kYXRhXy0+YWRfbmV0d29ya19ieXRlcygpKTsKLSAgQURTX0hJU1RPR1JBTSgiQnl0ZXMuTWFpbkZyYW1lLkFkcy5Ub3RhbCIsIFBBR0VfQllURVNfSElTVE9HUkFNLCB2aXNpYmlsaXR5LAorICBBRFNfSElTVE9HUkFNKCJCeXRlcy5NYWluRnJhbWUuQWRzLlRvdGFsMiIsIFBBR0VfQllURVNfSElTVE9HUkFNLCB2aXNpYmlsaXR5LAogICAgICAgICAgICAgICAgIG1haW5fZnJhbWVfZGF0YV8tPmFkX2J5dGVzKCkpOwogfQogCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9wYWdlX2xvYWRfbWV0cmljcy9vYnNlcnZlcnMvYWRfbWV0cmljcy9hZHNfcGFnZV9sb2FkX21ldHJpY3Nfb2JzZXJ2ZXJfYnJvd3NlcnRlc3QuY2MgYi9jaHJvbWUvYnJvd3Nlci9wYWdlX2xvYWRfbWV0cmljcy9vYnNlcnZlcnMvYWRfbWV0cmljcy9hZHNfcGFnZV9sb2FkX21ldHJpY3Nfb2JzZXJ2ZXJfYnJvd3NlcnRlc3QuY2MKaW5kZXggYjVlODA0Yi4uODI2ZjBiNiAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvcGFnZV9sb2FkX21ldHJpY3Mvb2JzZXJ2ZXJzL2FkX21ldHJpY3MvYWRzX3BhZ2VfbG9hZF9tZXRyaWNzX29ic2VydmVyX2Jyb3dzZXJ0ZXN0LmNjCisrKyBiL2Nocm9tZS9icm93c2VyL3BhZ2VfbG9hZF9tZXRyaWNzL29ic2VydmVycy9hZF9tZXRyaWNzL2Fkc19wYWdlX2xvYWRfbWV0cmljc19vYnNlcnZlcl9icm93c2VydGVzdC5jYwpAQCAtMjk2LDcgKzI5Niw4IEBACiAgIGhpc3RvZ3JhbV90ZXN0ZXIuRXhwZWN0VW5pcXVlU2FtcGxlKAogICAgICAgIlBhZ2VMb2FkLkNsaWVudHMuQWRzLkZyYW1lQ291bnRzLkFkRnJhbWVzLlRvdGFsIiwgMSwgMSk7CiAgIGhpc3RvZ3JhbV90ZXN0ZXIuRXhwZWN0VW5pcXVlU2FtcGxlKAotICAgICAgIlBhZ2VMb2FkLkNsaWVudHMuQWRzLkJ5dGVzLkFkRnJhbWVzLkFnZ3JlZ2F0ZS5Ub3RhbCIsIDAgLyogPCAxIEtCICovLCAxKTsKKyAgICAgICJQYWdlTG9hZC5DbGllbnRzLkFkcy5CeXRlcy5BZEZyYW1lcy5BZ2dyZWdhdGUuVG90YWwyIiwgMCAvKiA8IDEgS0IgKi8sCisgICAgICAxKTsKICAgYXV0byBlbnRyaWVzID0KICAgICAgIHVrbV9yZWNvcmRlci5HZXRFbnRyaWVzQnlOYW1lKHVrbTo6YnVpbGRlcnM6OkFkRnJhbWVMb2FkOjprRW50cnlOYW1lKTsKICAgRVhQRUNUX0VRKDF1LCBlbnRyaWVzLnNpemUoKSk7CkBAIC0zNzEsMTEgKzM3MiwxMSBAQAogICB3YWl0ZXItPldhaXQoKTsKICAgdWlfdGVzdF91dGlsczo6TmF2aWdhdGVUb1VSTChicm93c2VyKCksIEdVUkwodXJsOjprQWJvdXRCbGFua1VSTCkpOwogICBoaXN0b2dyYW1fdGVzdGVyLkV4cGVjdFRvdGFsQ291bnQoCi0gICAgICAiUGFnZUxvYWQuQ2xpZW50cy5BZHMuVmlzaWJsZS5CeXRlcy5BZEZyYW1lcy5QZXJGcmFtZS5Ub3RhbCIsIDEpOworICAgICAgIlBhZ2VMb2FkLkNsaWVudHMuQWRzLlZpc2libGUuQnl0ZXMuQWRGcmFtZXMuUGVyRnJhbWUuVG90YWwyIiwgMSk7CiAgIGhpc3RvZ3JhbV90ZXN0ZXIuRXhwZWN0VG90YWxDb3VudCgKLSAgICAgICJQYWdlTG9hZC5DbGllbnRzLkFkcy5CeXRlcy5BZEZyYW1lcy5QZXJGcmFtZS5Ub3RhbCIsIDEpOworICAgICAgIlBhZ2VMb2FkLkNsaWVudHMuQWRzLkJ5dGVzLkFkRnJhbWVzLlBlckZyYW1lLlRvdGFsMiIsIDEpOwogICBoaXN0b2dyYW1fdGVzdGVyLkV4cGVjdFRvdGFsQ291bnQoCi0gICAgICAiUGFnZUxvYWQuQ2xpZW50cy5BZHMuTm9uVmlzaWJsZS5CeXRlcy5BZEZyYW1lcy5QZXJGcmFtZS5Ub3RhbCIsIDApOworICAgICAgIlBhZ2VMb2FkLkNsaWVudHMuQWRzLk5vblZpc2libGUuQnl0ZXMuQWRGcmFtZXMuUGVyRnJhbWUuVG90YWwyIiwgMCk7CiAgIGF1dG8gZW50cmllcyA9CiAgICAgICB1a21fcmVjb3JkZXIuR2V0RW50cmllc0J5TmFtZSh1a206OmJ1aWxkZXJzOjpBZEZyYW1lTG9hZDo6a0VudHJ5TmFtZSk7CiAgIEVYUEVDVF9FUSgxdSwgZW50cmllcy5zaXplKCkpOwpAQCAtMzk3LDExICszOTgsMTEgQEAKICAgLy8gTmF2aWdhdGUgYXdheSB0byBmb3JjZSB0aGUgaGlzdG9ncmFtIHJlY29yZGluZy4KICAgdWlfdGVzdF91dGlsczo6TmF2aWdhdGVUb1VSTChicm93c2VyKCksIEdVUkwodXJsOjprQWJvdXRCbGFua1VSTCkpOwogICBoaXN0b2dyYW1fdGVzdGVyLkV4cGVjdFRvdGFsQ291bnQoCi0gICAgICAiUGFnZUxvYWQuQ2xpZW50cy5BZHMuTm9uVmlzaWJsZS5CeXRlcy5BZEZyYW1lcy5QZXJGcmFtZS5Ub3RhbCIsIDEpOworICAgICAgIlBhZ2VMb2FkLkNsaWVudHMuQWRzLk5vblZpc2libGUuQnl0ZXMuQWRGcmFtZXMuUGVyRnJhbWUuVG90YWwyIiwgMSk7CiAgIGhpc3RvZ3JhbV90ZXN0ZXIuRXhwZWN0VG90YWxDb3VudCgKLSAgICAgICJQYWdlTG9hZC5DbGllbnRzLkFkcy5CeXRlcy5BZEZyYW1lcy5QZXJGcmFtZS5Ub3RhbCIsIDEpOworICAgICAgIlBhZ2VMb2FkLkNsaWVudHMuQWRzLkJ5dGVzLkFkRnJhbWVzLlBlckZyYW1lLlRvdGFsMiIsIDEpOwogICBoaXN0b2dyYW1fdGVzdGVyLkV4cGVjdFRvdGFsQ291bnQoCi0gICAgICAiUGFnZUxvYWQuQ2xpZW50cy5BZHMuVmlzaWJsZS5CeXRlcy5BZEZyYW1lcy5QZXJGcmFtZS5Ub3RhbCIsIDApOworICAgICAgIlBhZ2VMb2FkLkNsaWVudHMuQWRzLlZpc2libGUuQnl0ZXMuQWRGcmFtZXMuUGVyRnJhbWUuVG90YWwyIiwgMCk7CiAgIGF1dG8gZW50cmllcyA9CiAgICAgICB1a21fcmVjb3JkZXIuR2V0RW50cmllc0J5TmFtZSh1a206OmJ1aWxkZXJzOjpBZEZyYW1lTG9hZDo6a0VudHJ5TmFtZSk7CiAgIEVYUEVDVF9FUSgxdSwgZW50cmllcy5zaXplKCkpOwpAQCAtNTM0LDE3ICs1MzUsMTggQEAKIAogICAvLyBWZXJpZnkgdGhhdCBpZnJhbWUgZSBpcyBvbmx5IHNhbWUgb3JpZ2luLgogICBoaXN0b2dyYW1fdGVzdGVyLkV4cGVjdEJ1Y2tldENvdW50KAotICAgICAgIlBhZ2VMb2FkLkNsaWVudHMuQWRzLkJ5dGVzLkFkRnJhbWVzLlBlckZyYW1lLlBlcmNlbnRTYW1lT3JpZ2luIiwgMTAwLCAxKTsKKyAgICAgICJQYWdlTG9hZC5DbGllbnRzLkFkcy5CeXRlcy5BZEZyYW1lcy5QZXJGcmFtZS5QZXJjZW50U2FtZU9yaWdpbjIiLCAxMDAsCisgICAgICAxKTsKIAogICAvLyBWZXJpZnkgdGhhdCBpZnJhbWUgYiBjb3VudHMgc3ViZnJhbWVzIGFzIGNyb3NzIG9yaWdpbiBhbmQgYSBuZXN0ZWQgc2FtZQogICAvLyBvcmlnaW4gc3ViZnJhbWUgYXMgc2FtZSBvcmlnaW4uCiAgIGhpc3RvZ3JhbV90ZXN0ZXIuRXhwZWN0QnVja2V0Q291bnQoCi0gICAgICAiUGFnZUxvYWQuQ2xpZW50cy5BZHMuQnl0ZXMuQWRGcmFtZXMuUGVyRnJhbWUuUGVyY2VudFNhbWVPcmlnaW4iLCA1MCwgMSk7CisgICAgICAiUGFnZUxvYWQuQ2xpZW50cy5BZHMuQnl0ZXMuQWRGcmFtZXMuUGVyRnJhbWUuUGVyY2VudFNhbWVPcmlnaW4yIiwgNTAsIDEpOwogCiAgIC8vIFZlcmlmeSB0aGF0IGFsbCBpZnJhbWUgYXJlIHRyZWF0ZWQgYXMgY3Jvc3Mtb3JpZ2luIHRvIHRoZSBwYWdlLiBPbmx5IDEvOCBvZgogICAvLyByZXNvdXJjZXMgYXJlIG9uIG9yaWdpbiBhLmNvbS4KICAgaGlzdG9ncmFtX3Rlc3Rlci5FeHBlY3RCdWNrZXRDb3VudCgKLSAgICAgICJQYWdlTG9hZC5DbGllbnRzLkFkcy5CeXRlcy5GdWxsUGFnZS5QZXJjZW50U2FtZU9yaWdpbiIsIDEyLjUsIDEpOworICAgICAgIlBhZ2VMb2FkLkNsaWVudHMuQWRzLkJ5dGVzLkZ1bGxQYWdlLlBlcmNlbnRTYW1lT3JpZ2luMiIsIDEyLjUsIDEpOwogfQogCiBJTl9QUk9DX0JST1dTRVJfVEVTVF9GKEFkc1BhZ2VMb2FkTWV0cmljc09ic2VydmVyQnJvd3NlclRlc3QsCkBAIC04MDcsMTIgKzgwOSwxMiBAQAogICBoaXN0b2dyYW1fdGVzdGVyLkV4cGVjdEJ1Y2tldENvdW50KAogICAgICAgIlBhZ2VMb2FkLkNsaWVudHMuQWRzLlJlc291cmNlcy5CeXRlcy5BZHMyIiwgNCwgMSk7CiAgIGhpc3RvZ3JhbV90ZXN0ZXIuRXhwZWN0QnVja2V0Q291bnQoCi0gICAgICAiUGFnZUxvYWQuQ2xpZW50cy5BZHMuQnl0ZXMuTWFpbkZyYW1lLkFkcy5Ub3RhbCIsIDEsIDEpOworICAgICAgIlBhZ2VMb2FkLkNsaWVudHMuQWRzLkJ5dGVzLk1haW5GcmFtZS5BZHMuVG90YWwyIiwgMSwgMSk7CiAKICAgLy8gVGhlIG1haW4gZnJhbWUgc2hvdWxkIGhhdmUgMiBLQiBvZiByZXNvdXJjZXMsIDFLQiBmcm9tIHRoZSBtYWluIHJlc291cmNlCiAgIC8vIGFuZCBvbmUgZnJvbSB0aGUgYWQgc2NyaXB0IGluIHRoZSBtYWluIGZyYW1lLgogICBoaXN0b2dyYW1fdGVzdGVyLkV4cGVjdEJ1Y2tldENvdW50KAotICAgICAgIlBhZ2VMb2FkLkNsaWVudHMuQWRzLkJ5dGVzLk1haW5GcmFtZS5Ub3RhbCIsIDIsIDEpOworICAgICAgIlBhZ2VMb2FkLkNsaWVudHMuQWRzLkJ5dGVzLk1haW5GcmFtZS5Ub3RhbDIiLCAyLCAxKTsKIH0KIAogSU5fUFJPQ19CUk9XU0VSX1RFU1RfRihBZHNQYWdlTG9hZE1ldHJpY3NPYnNlcnZlclJlc291cmNlQnJvd3NlclRlc3QsCkBAIC04NTksMTEgKzg2MSwxMSBAQAogICBoaXN0b2dyYW1fdGVzdGVyLkV4cGVjdEJ1Y2tldENvdW50KAogICAgICAgIlBhZ2VMb2FkLkNsaWVudHMuQWRzLkJ5dGVzLkFkRnJhbWVzLkFnZ3JlZ2F0ZS5OZXR3b3JrIiwgMiwgMSk7CiAgIGhpc3RvZ3JhbV90ZXN0ZXIuRXhwZWN0QnVja2V0Q291bnQoCi0gICAgICAiUGFnZUxvYWQuQ2xpZW50cy5BZHMuQnl0ZXMuQWRGcmFtZXMuQWdncmVnYXRlLlRvdGFsIiwgMiwgMSk7CisgICAgICAiUGFnZUxvYWQuQ2xpZW50cy5BZHMuQnl0ZXMuQWRGcmFtZXMuQWdncmVnYXRlLlRvdGFsMiIsIDIsIDEpOwogICBoaXN0b2dyYW1fdGVzdGVyLkV4cGVjdEJ1Y2tldENvdW50KAogICAgICAgIlBhZ2VMb2FkLkNsaWVudHMuQWRzLkJ5dGVzLkFkRnJhbWVzLlBlckZyYW1lLk5ldHdvcmsiLCAyLCAxKTsKICAgaGlzdG9ncmFtX3Rlc3Rlci5FeHBlY3RCdWNrZXRDb3VudCgKLSAgICAgICJQYWdlTG9hZC5DbGllbnRzLkFkcy5CeXRlcy5BZEZyYW1lcy5QZXJGcmFtZS5Ub3RhbCIsIDIsIDEpOworICAgICAgIlBhZ2VMb2FkLkNsaWVudHMuQWRzLkJ5dGVzLkFkRnJhbWVzLlBlckZyYW1lLlRvdGFsMiIsIDIsIDEpOwogICBhdXRvIGVudHJpZXMgPQogICAgICAgdWttX3JlY29yZGVyLkdldEVudHJpZXNCeU5hbWUodWttOjpidWlsZGVyczo6QWRGcmFtZUxvYWQ6OmtFbnRyeU5hbWUpOwogICBFWFBFQ1RfRVEoMXUsIGVudHJpZXMuc2l6ZSgpKTsKQEAgLTg3MSw3ICs4NzMsNyBAQAogICAgICAgZW50cmllcy5mcm9udCgpLCB1a206OmJ1aWxkZXJzOjpBZEZyYW1lTG9hZDo6a0xvYWRpbmdfTmV0d29ya0J5dGVzTmFtZSwKICAgICAgIHVrbTo6R2V0RXhwb25lbnRpYWxCdWNrZXRNaW5Gb3JCeXRlcygyMDQ4KSk7CiAgIHVrbV9yZWNvcmRlci5FeHBlY3RFbnRyeU1ldHJpYygKLSAgICAgIGVudHJpZXMuZnJvbnQoKSwgdWttOjpidWlsZGVyczo6QWRGcmFtZUxvYWQ6OmtMb2FkaW5nX0NhY2hlQnl0ZXNOYW1lLCAwKTsKKyAgICAgIGVudHJpZXMuZnJvbnQoKSwgdWttOjpidWlsZGVyczo6QWRGcmFtZUxvYWQ6OmtMb2FkaW5nX0NhY2hlQnl0ZXMyTmFtZSwgMCk7CiB9CiAKIC8vIFZlcmlmaWVzIHRoYXQgdGhlIGZyYW1lIGlzIG5hdmlnYXRlZCB0byB0aGUgaW50ZXJ2ZW50aW9uIHBhZ2Ugd2hlbiBhCkBAIC0xMjkxLDcgKzEyOTMsNyBAQAogICAgICAgdWttX3JlY29yZGVyLkdldEVudHJpZXNCeU5hbWUodWttOjpidWlsZGVyczo6QWRGcmFtZUxvYWQ6OmtFbnRyeU5hbWUpOwogICBFWFBFQ1RfRVEoMHUsIGVudHJpZXMuc2l6ZSgpKTsKICAgaGlzdG9ncmFtX3Rlc3Rlci5FeHBlY3RUb3RhbENvdW50KAotICAgICAgIlBhZ2VMb2FkLkNsaWVudHMuQWRzLkJ5dGVzLkFkRnJhbWVzLkFnZ3JlZ2F0ZS5Ub3RhbCIsIDApOworICAgICAgIlBhZ2VMb2FkLkNsaWVudHMuQWRzLkJ5dGVzLkFkRnJhbWVzLkFnZ3JlZ2F0ZS5Ub3RhbDIiLCAwKTsKICAgaGlzdG9ncmFtX3Rlc3Rlci5FeHBlY3RUb3RhbENvdW50KAogICAgICAgIlBhZ2VMb2FkLkNsaWVudHMuQWRzLkZyYW1lQ291bnRzLkFkRnJhbWVzLlRvdGFsIiwgMCk7CiB9CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9wYWdlX2xvYWRfbWV0cmljcy9vYnNlcnZlcnMvYWRfbWV0cmljcy9hZHNfcGFnZV9sb2FkX21ldHJpY3Nfb2JzZXJ2ZXJfdW5pdHRlc3QuY2MgYi9jaHJvbWUvYnJvd3Nlci9wYWdlX2xvYWRfbWV0cmljcy9vYnNlcnZlcnMvYWRfbWV0cmljcy9hZHNfcGFnZV9sb2FkX21ldHJpY3Nfb2JzZXJ2ZXJfdW5pdHRlc3QuY2MKaW5kZXggMjc1YzgzMy4uZmVkYTZlZCAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvcGFnZV9sb2FkX21ldHJpY3Mvb2JzZXJ2ZXJzL2FkX21ldHJpY3MvYWRzX3BhZ2VfbG9hZF9tZXRyaWNzX29ic2VydmVyX3VuaXR0ZXN0LmNjCisrKyBiL2Nocm9tZS9icm93c2VyL3BhZ2VfbG9hZF9tZXRyaWNzL29ic2VydmVycy9hZF9tZXRyaWNzL2Fkc19wYWdlX2xvYWRfbWV0cmljc19vYnNlcnZlcl91bml0dGVzdC5jYwpAQCAtNzMsNyArNzMsNyBAQAogICB9CiB9OwogCi1lbnVtIGNsYXNzIFJlc291cmNlQ2FjaGVkIHsgTk9UX0NBQ0hFRCA9IGZhbHNlLCBDQUNIRUQgPSB0cnVlIH07CitlbnVtIGNsYXNzIFJlc291cmNlQ2FjaGVkIHsga05vdENhY2hlZCA9IDAsIGtDYWNoZWRIdHRwLCBrQ2FjaGVkTWVtb3J5IH07CiBlbnVtIGNsYXNzIEZyYW1lVHlwZSB7IEFEID0gMCwgTk9OX0FEIH07CiAKIGNvbnN0IGNoYXIga0FkVXJsW10gPSAiaHR0cHM6Ly9hZHMuY29tL2FkL2Rpc2FsbG93ZWQuaHRtbCI7CkBAIC0yMDgsNyArMjA4LDcgQEAKIAogICBmb3IgKGNvbnN0IGF1dG8mIHRvdGFsX2J5dGVzX2FuZF9jb3VudCA6IGZyYW1lc193aXRoX3RvdGFsX2J5dGVfY291bnQpIHsKICAgICBoaXN0b2dyYW1zLkV4cGVjdEJ1Y2tldENvdW50KAotICAgICAgICBTdWZmaXhlZEhpc3RvZ3JhbSgiQnl0ZXMuQWRGcmFtZXMuUGVyRnJhbWUuVG90YWwiKSwKKyAgICAgICAgU3VmZml4ZWRIaXN0b2dyYW0oIkJ5dGVzLkFkRnJhbWVzLlBlckZyYW1lLlRvdGFsMiIpLAogICAgICAgICB0b3RhbF9ieXRlc19hbmRfY291bnQuZmlyc3QsIHRvdGFsX2J5dGVzX2FuZF9jb3VudC5zZWNvbmQpOwogICB9CiAgIGZvciAoY29uc3QgYXV0byYgbmV0d29ya19ieXRlc19hbmRfY291bnQgOiBmcmFtZXNfd2l0aF9uZXR3b3JrX2J5dGVfY291bnQpIHsKQEAgLTIxOSwzMyArMjE5LDMzIEBACiAgIGZvciAoY29uc3QgYXV0byYgcGVyY2VudF9uZXR3b3JrX2FuZF9jb3VudCA6CiAgICAgICAgZnJhbWVzX3dpdGhfcGVyY2VudF9uZXR3b3JrX2NvdW50KSB7CiAgICAgaGlzdG9ncmFtcy5FeHBlY3RCdWNrZXRDb3VudCgKLSAgICAgICAgU3VmZml4ZWRIaXN0b2dyYW0oIkJ5dGVzLkFkRnJhbWVzLlBlckZyYW1lLlBlcmNlbnROZXR3b3JrIiksCisgICAgICAgIFN1ZmZpeGVkSGlzdG9ncmFtKCJCeXRlcy5BZEZyYW1lcy5QZXJGcmFtZS5QZXJjZW50TmV0d29yazIiKSwKICAgICAgICAgcGVyY2VudF9uZXR3b3JrX2FuZF9jb3VudC5maXJzdCwgcGVyY2VudF9uZXR3b3JrX2FuZF9jb3VudC5zZWNvbmQpOwogICB9CiAKICAgaGlzdG9ncmFtcy5FeHBlY3RVbmlxdWVTYW1wbGUoCi0gICAgICBTdWZmaXhlZEhpc3RvZ3JhbSgiQnl0ZXMuQWRGcmFtZXMuQWdncmVnYXRlLlRvdGFsIiksIHRvdGFsX2FkX2tiLCAxKTsKKyAgICAgIFN1ZmZpeGVkSGlzdG9ncmFtKCJCeXRlcy5BZEZyYW1lcy5BZ2dyZWdhdGUuVG90YWwyIiksIHRvdGFsX2FkX2tiLCAxKTsKICAgaGlzdG9ncmFtcy5FeHBlY3RVbmlxdWVTYW1wbGUoCiAgICAgICBTdWZmaXhlZEhpc3RvZ3JhbSgiQnl0ZXMuQWRGcmFtZXMuQWdncmVnYXRlLk5ldHdvcmsiKSwKICAgICAgIHRvdGFsX2FkX3VuY2FjaGVkX2tiLCAxKTsKICAgaGlzdG9ncmFtcy5FeHBlY3RVbmlxdWVTYW1wbGUoCi0gICAgICBTdWZmaXhlZEhpc3RvZ3JhbSgiQnl0ZXMuRnVsbFBhZ2UuVG90YWwiKSwKKyAgICAgIFN1ZmZpeGVkSGlzdG9ncmFtKCJCeXRlcy5GdWxsUGFnZS5Ub3RhbDIiKSwKICAgICAgIG5vbl9hZF9jYWNoZWRfa2IgKyBub25fYWRfdW5jYWNoZWRfa2IgKyB0b3RhbF9hZF9rYiwgMSk7CiAgIGhpc3RvZ3JhbXMuRXhwZWN0VW5pcXVlU2FtcGxlKFN1ZmZpeGVkSGlzdG9ncmFtKCJCeXRlcy5GdWxsUGFnZS5OZXR3b3JrIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbl9hZF91bmNhY2hlZF9rYiArIHRvdGFsX2FkX3VuY2FjaGVkX2tiLCAxKTsKICAgaGlzdG9ncmFtcy5FeHBlY3RVbmlxdWVTYW1wbGUoCi0gICAgICBTdWZmaXhlZEhpc3RvZ3JhbSgiQnl0ZXMuTm9uQWRGcmFtZXMuQWdncmVnYXRlLlRvdGFsIiksCisgICAgICBTdWZmaXhlZEhpc3RvZ3JhbSgiQnl0ZXMuTm9uQWRGcmFtZXMuQWdncmVnYXRlLlRvdGFsMiIpLAogICAgICAgbm9uX2FkX2NhY2hlZF9rYiArIG5vbl9hZF91bmNhY2hlZF9rYiwgMSk7CiAgIGlmICh0b3RhbF9hZF9rYiArIG5vbl9hZF9jYWNoZWRfa2IgKyBub25fYWRfdW5jYWNoZWRfa2IgPiAwKSB7CiAgICAgaGlzdG9ncmFtcy5FeHBlY3RVbmlxdWVTYW1wbGUoCi0gICAgICAgIFN1ZmZpeGVkSGlzdG9ncmFtKCJCeXRlcy5GdWxsUGFnZS5Ub3RhbC5QZXJjZW50QWRzIiksCisgICAgICAgIFN1ZmZpeGVkSGlzdG9ncmFtKCJCeXRlcy5GdWxsUGFnZS5Ub3RhbC5QZXJjZW50QWRzMiIpLAogICAgICAgICAodG90YWxfYWRfa2IgKiAxMDApIC8KICAgICAgICAgICAgICh0b3RhbF9hZF9rYiArIG5vbl9hZF9jYWNoZWRfa2IgKyBub25fYWRfdW5jYWNoZWRfa2IpLAogICAgICAgICAxKTsKICAgfQogICBpZiAodG90YWxfYWRfa2IgPiAwKSB7CiAgICAgaGlzdG9ncmFtcy5FeHBlY3RVbmlxdWVTYW1wbGUoCi0gICAgICAgIFN1ZmZpeGVkSGlzdG9ncmFtKCJCeXRlcy5BZEZyYW1lcy5BZ2dyZWdhdGUuUGVyY2VudE5ldHdvcmsiKSwKKyAgICAgICAgU3VmZml4ZWRIaXN0b2dyYW0oIkJ5dGVzLkFkRnJhbWVzLkFnZ3JlZ2F0ZS5QZXJjZW50TmV0d29yazIiKSwKICAgICAgICAgKCh0b3RhbF9hZF91bmNhY2hlZF9rYiAqIDEwMCkgLyB0b3RhbF9hZF9rYiksIDEpOwogICB9CiAgIGlmICh0b3RhbF9hZF91bmNhY2hlZF9rYiArIG5vbl9hZF91bmNhY2hlZF9rYiA+IDApIHsKQEAgLTI2Nyw3ICsyNjcsNyBAQAogICAgIGludCBtYXRjaGluZ19lbnRyaWVzID0gMDsKICAgICBmb3IgKGF1dG8gY29uc3QqIGVudHJ5IDogZW50cmllcykgewogICAgICAgaW50NjRfdCBlbnRyeV9jYWNoZV9ieXRlcyA9ICp1a21fcmVjb3JkZXIuR2V0RW50cnlNZXRyaWMoCi0gICAgICAgICAgZW50cnksIHVrbTo6YnVpbGRlcnM6OkFkRnJhbWVMb2FkOjprTG9hZGluZ19DYWNoZUJ5dGVzTmFtZSk7CisgICAgICAgICAgZW50cnksIHVrbTo6YnVpbGRlcnM6OkFkRnJhbWVMb2FkOjprTG9hZGluZ19DYWNoZUJ5dGVzMk5hbWUpOwogICAgICAgaW50NjRfdCBlbnRyeV9uZXR3b3JrX2J5dGVzID0gKnVrbV9yZWNvcmRlci5HZXRFbnRyeU1ldHJpYygKICAgICAgICAgICBlbnRyeSwgdWttOjpidWlsZGVyczo6QWRGcmFtZUxvYWQ6OmtMb2FkaW5nX05ldHdvcmtCeXRlc05hbWUpOwogICAgICAgaWYgKGVudHJ5X2NhY2hlX2J5dGVzID09CkBAIC0zOTEsOSArMzkxLDE3IEBACiAgICAgcmVzb3VyY2UtPmVuY29kZWRfYm9keV9sZW5ndGggPSByZXNvdXJjZV9zaXplX2luX2tieXRlIDw8IDEwOwogICAgIHJlc291cmNlLT5yZXBvcnRlZF9hc19hZF9yZXNvdXJjZSA9IGlzX2FkX3Jlc291cmNlOwogICAgIHJlc291cmNlLT5pc19jb21wbGV0ZSA9IHRydWU7Ci0gICAgcmVzb3VyY2UtPmNhY2hlX3R5cGUgPSAocmVzb3VyY2VfY2FjaGVkID09IFJlc291cmNlQ2FjaGVkOjpOT1RfQ0FDSEVEKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcGFnZV9sb2FkX21ldHJpY3M6Om1vam9tOjpDYWNoZVR5cGU6OmtOb3RDYWNoZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHBhZ2VfbG9hZF9tZXRyaWNzOjptb2pvbTo6Q2FjaGVUeXBlOjprSHR0cDsKKyAgICBzd2l0Y2ggKHJlc291cmNlX2NhY2hlZCkgeworICAgICAgY2FzZSBSZXNvdXJjZUNhY2hlZDo6a05vdENhY2hlZDoKKyAgICAgICAgcmVzb3VyY2UtPmNhY2hlX3R5cGUgPSBwYWdlX2xvYWRfbWV0cmljczo6bW9qb206OkNhY2hlVHlwZTo6a05vdENhY2hlZDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFJlc291cmNlQ2FjaGVkOjprQ2FjaGVkSHR0cDoKKyAgICAgICAgcmVzb3VyY2UtPmNhY2hlX3R5cGUgPSBwYWdlX2xvYWRfbWV0cmljczo6bW9qb206OkNhY2hlVHlwZTo6a0h0dHA7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBSZXNvdXJjZUNhY2hlZDo6a0NhY2hlZE1lbW9yeToKKyAgICAgICAgcmVzb3VyY2UtPmNhY2hlX3R5cGUgPSBwYWdlX2xvYWRfbWV0cmljczo6bW9qb206OkNhY2hlVHlwZTo6a01lbW9yeTsKKyAgICAgICAgYnJlYWs7CisgICAgfQogICAgIHJlc291cmNlLT5taW1lX3R5cGUgPSBtaW1lX3R5cGU7CiAgICAgcmVzb3VyY2UtPmlzX3ByaW1hcnlfZnJhbWVfcmVzb3VyY2UgPSB0cnVlOwogICAgIHJlc291cmNlLT5pc19tYWluX2ZyYW1lX3Jlc291cmNlID0KQEAgLTQ5Nyw5ICs1MDUsOSBAQAogICBSZW5kZXJGcmFtZUhvc3QqIG1haW5fZnJhbWUgPSBOYXZpZ2F0ZU1haW5GcmFtZShrTm9uQWRVcmwpOwogICBSZW5kZXJGcmFtZUhvc3QqIGZyYW1lMSA9IENyZWF0ZUFuZE5hdmlnYXRlU3ViRnJhbWUoa05vbkFkVXJsLCBtYWluX2ZyYW1lKTsKICAgUmVuZGVyRnJhbWVIb3N0KiBmcmFtZTIgPSBDcmVhdGVBbmROYXZpZ2F0ZVN1YkZyYW1lKGtOb25BZFVybCwgbWFpbl9mcmFtZSk7Ci0gIFJlc291cmNlRGF0YVVwZGF0ZShtYWluX2ZyYW1lLCBSZXNvdXJjZUNhY2hlZDo6Tk9UX0NBQ0hFRCwgMTApOwotICBSZXNvdXJjZURhdGFVcGRhdGUoZnJhbWUxLCBSZXNvdXJjZUNhY2hlZDo6Tk9UX0NBQ0hFRCwgMTApOwotICBSZXNvdXJjZURhdGFVcGRhdGUoZnJhbWUyLCBSZXNvdXJjZUNhY2hlZDo6Tk9UX0NBQ0hFRCwgMTApOworICBSZXNvdXJjZURhdGFVcGRhdGUobWFpbl9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsIDEwKTsKKyAgUmVzb3VyY2VEYXRhVXBkYXRlKGZyYW1lMSwgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsIDEwKTsKKyAgUmVzb3VyY2VEYXRhVXBkYXRlKGZyYW1lMiwgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsIDEwKTsKIAogICAvLyBOYXZpZ2F0ZSBhZ2FpbiB0byB0cmlnZ2VyIGhpc3RvZ3JhbXMuCiAgIE5hdmlnYXRlRnJhbWUoa05vbkFkVXJsLCBtYWluX2ZyYW1lKTsKQEAgLTUxNyw5ICs1MjUsOSBAQAogICBSZW5kZXJGcmFtZUhvc3QqIG1haW5fZnJhbWUgPSBOYXZpZ2F0ZU1haW5GcmFtZShrTm9uQWRVcmwpOwogICBSZW5kZXJGcmFtZUhvc3QqIGZyYW1lMSA9IENyZWF0ZUFuZE5hdmlnYXRlU3ViRnJhbWUoa05vbkFkVXJsLCBtYWluX2ZyYW1lKTsKICAgUmVuZGVyRnJhbWVIb3N0KiBmcmFtZTIgPSBDcmVhdGVBbmROYXZpZ2F0ZVN1YkZyYW1lKGtBZFVybCwgbWFpbl9mcmFtZSk7Ci0gIFJlc291cmNlRGF0YVVwZGF0ZShtYWluX2ZyYW1lLCBSZXNvdXJjZUNhY2hlZDo6Tk9UX0NBQ0hFRCwgMTApOwotICBSZXNvdXJjZURhdGFVcGRhdGUoZnJhbWUxLCBSZXNvdXJjZUNhY2hlZDo6Tk9UX0NBQ0hFRCwgMTApOwotICBSZXNvdXJjZURhdGFVcGRhdGUoZnJhbWUyLCBSZXNvdXJjZUNhY2hlZDo6Tk9UX0NBQ0hFRCwgMTApOworICBSZXNvdXJjZURhdGFVcGRhdGUobWFpbl9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsIDEwKTsKKyAgUmVzb3VyY2VEYXRhVXBkYXRlKGZyYW1lMSwgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsIDEwKTsKKyAgUmVzb3VyY2VEYXRhVXBkYXRlKGZyYW1lMiwgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsIDEwKTsKIAogICAvLyBOYXZpZ2F0ZSBhZ2FpbiB0byB0cmlnZ2VyIGhpc3RvZ3JhbXMuCiAgIE5hdmlnYXRlRnJhbWUoa05vbkFkVXJsLCBtYWluX2ZyYW1lKTsKQEAgLTUzMSwxOSArNTM5LDE5IEBACiBURVNUX0YoQWRzUGFnZUxvYWRNZXRyaWNzT2JzZXJ2ZXJUZXN0LCBBZEZyYW1lTWltZVR5cGVCeXRlcykgewogICBSZW5kZXJGcmFtZUhvc3QqIG1haW5fZnJhbWUgPSBOYXZpZ2F0ZU1haW5GcmFtZShrTm9uQWRVcmwpOwogICBSZW5kZXJGcmFtZUhvc3QqIGFkX2ZyYW1lID0gQ3JlYXRlQW5kTmF2aWdhdGVTdWJGcmFtZShrQWRVcmwsIG1haW5fZnJhbWUpOwotICBSZXNvdXJjZURhdGFVcGRhdGUobWFpbl9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6Ok5PVF9DQUNIRUQsIDEwKTsKKyAgUmVzb3VyY2VEYXRhVXBkYXRlKG1haW5fZnJhbWUsIFJlc291cmNlQ2FjaGVkOjprTm90Q2FjaGVkLCAxMCk7CiAgIFJlc291cmNlRGF0YVVwZGF0ZSgKLSAgICAgIGFkX2ZyYW1lLCBSZXNvdXJjZUNhY2hlZDo6Tk9UX0NBQ0hFRCwgMTAgLyogcmVzb3VyY2Vfc2l6ZV9pbl9rYnl0ZSAqLywKKyAgICAgIGFkX2ZyYW1lLCBSZXNvdXJjZUNhY2hlZDo6a05vdENhY2hlZCwgMTAgLyogcmVzb3VyY2Vfc2l6ZV9pbl9rYnl0ZSAqLywKICAgICAgICJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0IiAvKiBtaW1lX3R5cGUgKi8sIHRydWUgLyogaXNfYWRfcmVzb3VyY2UgKi8pOwotICBSZXNvdXJjZURhdGFVcGRhdGUoYWRfZnJhbWUsIFJlc291cmNlQ2FjaGVkOjpOT1RfQ0FDSEVELAorICBSZXNvdXJjZURhdGFVcGRhdGUoYWRfZnJhbWUsIFJlc291cmNlQ2FjaGVkOjprTm90Q2FjaGVkLAogICAgICAgICAgICAgICAgICAgICAgMjAgLyogcmVzb3VyY2Vfc2l6ZV9pbl9rYnl0ZSAqLywKICAgICAgICAgICAgICAgICAgICAgICJpbWFnZS9wbmciIC8qIG1pbWVfdHlwZSAqLywgdHJ1ZSAvKiBpc19hZF9yZXNvdXJjZSAqLyk7Ci0gIFJlc291cmNlRGF0YVVwZGF0ZShhZF9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6Ok5PVF9DQUNIRUQsCisgIFJlc291cmNlRGF0YVVwZGF0ZShhZF9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsCiAgICAgICAgICAgICAgICAgICAgICAzMCAvKiByZXNvdXJjZV9zaXplX2luX2tieXRlICovLAogICAgICAgICAgICAgICAgICAgICAgInZpZGVvL3dlYm0iIC8qIG1pbWVfdHlwZSAqLywgdHJ1ZSAvKiBpc19hZF9yZXNvdXJjZSAqLyk7CiAKICAgLy8gQ2FjaGVkIHJlc291cmNlIG5vdCBjb3VudGVkLgotICBSZXNvdXJjZURhdGFVcGRhdGUoYWRfZnJhbWUsIFJlc291cmNlQ2FjaGVkOjpDQUNIRUQsCisgIFJlc291cmNlRGF0YVVwZGF0ZShhZF9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6OmtDYWNoZWRIdHRwLAogICAgICAgICAgICAgICAgICAgICAgNDAgLyogcmVzb3VyY2Vfc2l6ZV9pbl9rYnl0ZSAqLywKICAgICAgICAgICAgICAgICAgICAgICJ2aWRlby93ZWJtIiAvKiBtaW1lX3R5cGUgKi8sIHRydWUgLyogaXNfYWRfcmVzb3VyY2UgKi8pOwogCkBAIC01NjUsNyArNTczLDcgQEAKICAgICAgIGVudHJpZXMuZnJvbnQoKSwgdWttOjpidWlsZGVyczo6QWRGcmFtZUxvYWQ6OmtMb2FkaW5nX05ldHdvcmtCeXRlc05hbWUsCiAgICAgICB1a206OkdldEV4cG9uZW50aWFsQnVja2V0TWluRm9yQnl0ZXMoNjAgKiAxMDI0KSk7CiAgIHRlc3RfdWttX3JlY29yZGVyKCkuRXhwZWN0RW50cnlNZXRyaWMoCi0gICAgICBlbnRyaWVzLmZyb250KCksIHVrbTo6YnVpbGRlcnM6OkFkRnJhbWVMb2FkOjprTG9hZGluZ19DYWNoZUJ5dGVzTmFtZSwKKyAgICAgIGVudHJpZXMuZnJvbnQoKSwgdWttOjpidWlsZGVyczo6QWRGcmFtZUxvYWQ6OmtMb2FkaW5nX0NhY2hlQnl0ZXMyTmFtZSwKICAgICAgIHVrbTo6R2V0RXhwb25lbnRpYWxCdWNrZXRNaW5Gb3JCeXRlcyg0MCAqIDEwMjQpKTsKICAgdGVzdF91a21fcmVjb3JkZXIoKS5FeHBlY3RFbnRyeU1ldHJpYygKICAgICAgIGVudHJpZXMuZnJvbnQoKSwgdWttOjpidWlsZGVyczo6QWRGcmFtZUxvYWQ6OmtMb2FkaW5nX051bVJlc291cmNlc05hbWUsCkBAIC01NzUsMTQgKzU4MywxNCBAQAogVEVTVF9GKEFkc1BhZ2VMb2FkTWV0cmljc09ic2VydmVyVGVzdCwgUmVzb3VyY2VCZWZvcmVBZEZyYW1lQ29tbWl0cykgewogICBSZW5kZXJGcmFtZUhvc3QqIG1haW5fZnJhbWUgPSBOYXZpZ2F0ZU1haW5GcmFtZShrTm9uQWRVcmwpOwogCi0gIFJlc291cmNlRGF0YVVwZGF0ZShtYWluX2ZyYW1lLCBSZXNvdXJjZUNhY2hlZDo6Tk9UX0NBQ0hFRCwgMTApOworICBSZXNvdXJjZURhdGFVcGRhdGUobWFpbl9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsIDEwKTsKIAogICAvLyBDcmVhdGUgc3ViZnJhbWUgYW5kIGxvYWQgcmVzb3VyY2UgYmVmb3JlIGNvbW1pdC4KICAgUmVuZGVyRnJhbWVIb3N0KiBzdWJmcmFtZSA9CiAgICAgICBSZW5kZXJGcmFtZUhvc3RUZXN0ZXI6OkZvcihtYWluX2ZyYW1lKS0+QXBwZW5kQ2hpbGQoImZvbyIpOwogICBhdXRvIG5hdmlnYXRpb25fc2ltdWxhdG9yID0KICAgICAgIE5hdmlnYXRpb25TaW11bGF0b3I6OkNyZWF0ZVJlbmRlcmVySW5pdGlhdGVkKEdVUkwoa0FkVXJsKSwgc3ViZnJhbWUpOwotICBSZXNvdXJjZURhdGFVcGRhdGUoc3ViZnJhbWUsIFJlc291cmNlQ2FjaGVkOjpOT1RfQ0FDSEVELCAxMCk7CisgIFJlc291cmNlRGF0YVVwZGF0ZShzdWJmcmFtZSwgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsIDEwKTsKICAgbmF2aWdhdGlvbl9zaW11bGF0b3ItPkNvbW1pdCgpOwogCiAgIC8vIE5hdmlnYXRlIGFnYWluIHRvIHRyaWdnZXIgaGlzdG9ncmFtcy4KQEAgLTYwOSwxMCArNjE3LDEwIEBACiAgICAgUmVuZGVyRnJhbWVIb3N0KiBtYWluX2ZyYW1lID0gTmF2aWdhdGVNYWluRnJhbWUoa05vbkFkVXJsKTsKICAgICBSZW5kZXJGcmFtZUhvc3QqIGFkX3N1Yl9mcmFtZSA9CiAgICAgICAgIENyZWF0ZUFuZE5hdmlnYXRlU3ViRnJhbWUoa0FkVXJsLCBtYWluX2ZyYW1lKTsKLSAgICBSZXNvdXJjZURhdGFVcGRhdGUobWFpbl9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6Ok5PVF9DQUNIRUQsIDEwKTsKLSAgICBSZXNvdXJjZURhdGFVcGRhdGUoYWRfc3ViX2ZyYW1lLCBSZXNvdXJjZUNhY2hlZDo6Tk9UX0NBQ0hFRCwgMTApOworICAgIFJlc291cmNlRGF0YVVwZGF0ZShtYWluX2ZyYW1lLCBSZXNvdXJjZUNhY2hlZDo6a05vdENhY2hlZCwgMTApOworICAgIFJlc291cmNlRGF0YVVwZGF0ZShhZF9zdWJfZnJhbWUsIFJlc291cmNlQ2FjaGVkOjprTm90Q2FjaGVkLCAxMCk7CiAgICAgUmVzb3VyY2VEYXRhVXBkYXRlKENyZWF0ZUFuZE5hdmlnYXRlU3ViRnJhbWUoa0FkVXJsLCBhZF9zdWJfZnJhbWUpLAotICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZUNhY2hlZDo6Tk9UX0NBQ0hFRCwgMTApOworICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZUNhY2hlZDo6a05vdENhY2hlZCwgMTApOwogICAgIC8vIFRyaWdnZXIgaGlzdG9ncmFtcyBieSBuYXZpZ2F0aW5nIGF3YXksIHRoZW4gdGVzdCB0aGVtLgogICAgIE5hdmlnYXRlRnJhbWUoa0FkVXJsLCBtYWluX2ZyYW1lKTsKICAgICBoaXN0b2dyYW1zLkV4cGVjdFVuaXF1ZVNhbXBsZShrQ3Jvc3NPcmlnaW5IaXN0b2dyYW1JZCwKQEAgLTYzMSwxMSArNjM5LDExIEBACiAgICAgYmFzZTo6SGlzdG9ncmFtVGVzdGVyIGhpc3RvZ3JhbXM7CiAgICAgdWttOjpUZXN0QXV0b1NldFVrbVJlY29yZGVyIHVrbV9yZWNvcmRlcjsKICAgICBSZW5kZXJGcmFtZUhvc3QqIG1haW5fZnJhbWUgPSBOYXZpZ2F0ZU1haW5GcmFtZShrTm9uQWRVcmwpOwotICAgIFJlc291cmNlRGF0YVVwZGF0ZShtYWluX2ZyYW1lLCBSZXNvdXJjZUNhY2hlZDo6Tk9UX0NBQ0hFRCwgMTApOworICAgIFJlc291cmNlRGF0YVVwZGF0ZShtYWluX2ZyYW1lLCBSZXNvdXJjZUNhY2hlZDo6a05vdENhY2hlZCwgMTApOwogICAgIFJlc291cmNlRGF0YVVwZGF0ZShDcmVhdGVBbmROYXZpZ2F0ZVN1YkZyYW1lKGtBZFVybCwgbWFpbl9mcmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlQ2FjaGVkOjpOT1RfQ0FDSEVELCAxMCk7CisgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlQ2FjaGVkOjprTm90Q2FjaGVkLCAxMCk7CiAgICAgUmVzb3VyY2VEYXRhVXBkYXRlKENyZWF0ZUFuZE5hdmlnYXRlU3ViRnJhbWUoa05vbkFkVXJsLCBtYWluX2ZyYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VDYWNoZWQ6Ok5PVF9DQUNIRUQsIDEwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsIDEwKTsKICAgICAvLyBUcmlnZ2VyIGhpc3RvZ3JhbXMgYnkgbmF2aWdhdGluZyBhd2F5LCB0aGVuIHRlc3QgdGhlbS4KICAgICBOYXZpZ2F0ZUZyYW1lKGtBZFVybCwgbWFpbl9mcmFtZSk7CiAgICAgaGlzdG9ncmFtcy5FeHBlY3RVbmlxdWVTYW1wbGUoa0Nyb3NzT3JpZ2luSGlzdG9ncmFtSWQsCkBAIC02NTUsOSArNjYzLDkgQEAKICAgICBiYXNlOjpIaXN0b2dyYW1UZXN0ZXIgaGlzdG9ncmFtczsKICAgICB1a206OlRlc3RBdXRvU2V0VWttUmVjb3JkZXIgdWttX3JlY29yZGVyOwogICAgIFJlbmRlckZyYW1lSG9zdCogbWFpbl9mcmFtZSA9IE5hdmlnYXRlTWFpbkZyYW1lKGtOb25BZFVybFNhbWVPcmlnaW4pOwotICAgIFJlc291cmNlRGF0YVVwZGF0ZShtYWluX2ZyYW1lLCBSZXNvdXJjZUNhY2hlZDo6Tk9UX0NBQ0hFRCwgMTApOworICAgIFJlc291cmNlRGF0YVVwZGF0ZShtYWluX2ZyYW1lLCBSZXNvdXJjZUNhY2hlZDo6a05vdENhY2hlZCwgMTApOwogICAgIFJlc291cmNlRGF0YVVwZGF0ZShDcmVhdGVBbmROYXZpZ2F0ZVN1YkZyYW1lKGtBZFVybCwgbWFpbl9mcmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlQ2FjaGVkOjpOT1RfQ0FDSEVELCAxMCk7CisgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlQ2FjaGVkOjprTm90Q2FjaGVkLCAxMCk7CiAgICAgLy8gVHJpZ2dlciBoaXN0b2dyYW1zIGJ5IG5hdmlnYXRpbmcgYXdheSwgdGhlbiB0ZXN0IHRoZW0uCiAgICAgTmF2aWdhdGVGcmFtZShrQWRVcmwsIG1haW5fZnJhbWUpOwogICAgIGhpc3RvZ3JhbXMuRXhwZWN0VW5pcXVlU2FtcGxlKGtDcm9zc09yaWdpbkhpc3RvZ3JhbUlkLApAQCAtNjc1LDE0ICs2ODMsMTQgQEAKICAgUmVuZGVyRnJhbWVIb3N0KiBtYWluX2ZyYW1lID0gTmF2aWdhdGVNYWluRnJhbWUoa05vbkFkVXJsKTsKICAgUmVuZGVyRnJhbWVIb3N0KiBhZF9mcmFtZSA9IENyZWF0ZUFuZE5hdmlnYXRlU3ViRnJhbWUoa0FkVXJsLCBtYWluX2ZyYW1lKTsKIAotICBSZXNvdXJjZURhdGFVcGRhdGUobWFpbl9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6Ok5PVF9DQUNIRUQsIDEwKTsKLSAgUmVzb3VyY2VEYXRhVXBkYXRlKGFkX2ZyYW1lLCBSZXNvdXJjZUNhY2hlZDo6Tk9UX0NBQ0hFRCwgMTApOworICBSZXNvdXJjZURhdGFVcGRhdGUobWFpbl9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsIDEwKTsKKyAgUmVzb3VyY2VEYXRhVXBkYXRlKGFkX2ZyYW1lLCBSZXNvdXJjZUNhY2hlZDo6a05vdENhY2hlZCwgMTApOwogCiAgIC8vIE5hdmlnYXRlIHRoZSBhZCBmcmFtZSBhZ2Fpbi4KICAgYWRfZnJhbWUgPSBOYXZpZ2F0ZUZyYW1lKGtOb25BZFVybCwgYWRfZnJhbWUpOwogCiAgIC8vIEluIHRvdGFsLCAzMEtCIGZvciBlbnRpcmUgcGFnZSBhbmQgMjAgaW4gb25lIGFkIGZyYW1lLgotICBSZXNvdXJjZURhdGFVcGRhdGUoYWRfZnJhbWUsIFJlc291cmNlQ2FjaGVkOjpOT1RfQ0FDSEVELCAxMCk7CisgIFJlc291cmNlRGF0YVVwZGF0ZShhZF9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsIDEwKTsKIAogICAvLyBOYXZpZ2F0ZSBhZ2FpbiB0byB0cmlnZ2VyIGhpc3RvZ3JhbXMuCiAgIE5hdmlnYXRlRnJhbWUoa05vbkFkVXJsLCBtYWluX2ZyYW1lKTsKQEAgLTcwMiwxMyArNzEwLDEzIEBACiAgIFJlbmRlckZyYW1lSG9zdCogc3ViX2ZyYW1lX2NoaWxkX2FkID0KICAgICAgIENyZWF0ZUFuZE5hdmlnYXRlU3ViRnJhbWUoa0FkVXJsLCBzdWJfZnJhbWUpOwogCi0gIFJlc291cmNlRGF0YVVwZGF0ZShtYWluX2ZyYW1lLCBSZXNvdXJjZUNhY2hlZDo6Tk9UX0NBQ0hFRCwgMTApOwotICBSZXNvdXJjZURhdGFVcGRhdGUoc3ViX2ZyYW1lLCBSZXNvdXJjZUNhY2hlZDo6Tk9UX0NBQ0hFRCwgMTApOwotICBSZXNvdXJjZURhdGFVcGRhdGUoc3ViX2ZyYW1lX2NoaWxkX2FkLCBSZXNvdXJjZUNhY2hlZDo6Tk9UX0NBQ0hFRCwgMTApOworICBSZXNvdXJjZURhdGFVcGRhdGUobWFpbl9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsIDEwKTsKKyAgUmVzb3VyY2VEYXRhVXBkYXRlKHN1Yl9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsIDEwKTsKKyAgUmVzb3VyY2VEYXRhVXBkYXRlKHN1Yl9mcmFtZV9jaGlsZF9hZCwgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsIDEwKTsKIAogICAvLyBOYXZpZ2F0ZSB0aGUgc3ViZnJhbWUgYWdhaW4sIHRoaXMgdGltZSBpdCdzIGFuIGFkLgogICBzdWJfZnJhbWUgPSBOYXZpZ2F0ZUZyYW1lKGtBZFVybCwgc3ViX2ZyYW1lKTsKLSAgUmVzb3VyY2VEYXRhVXBkYXRlKHN1Yl9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6Ok5PVF9DQUNIRUQsIDEwKTsKKyAgUmVzb3VyY2VEYXRhVXBkYXRlKHN1Yl9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsIDEwKTsKIAogICAvLyBJbiB0b3RhbCwgNDBLQiB3YXMgbG9hZGVkIGZvciB0aGUgZW50aXJlIHBhZ2UgYW5kIDIwS0IgZnJvbSBhZAogICAvLyBmcmFtZXMgKHRoZSBvcmlnaW5hbCBjaGlsZCBhZCBmcmFtZSBhbmQgdGhlIHJlbmF2aWdhdGVkIGZyYW1lIHdoaWNoCkBAIC03MjQsNyArNzMyLDcgQEAKIFRFU1RfRihBZHNQYWdlTG9hZE1ldHJpY3NPYnNlcnZlclRlc3QsIENvdW50QWJvcnRlZE5hdmlnYXRpb24pIHsKICAgLy8gSWYgdGhlIGZpcnN0IG5hdmlnYXRpb24gaW4gYSBmcmFtZSBpcyBhYm9ydGVkLCBrZWVwIHRyYWNrIG9mIGl0cyBieXRlcy4KICAgUmVuZGVyRnJhbWVIb3N0KiBtYWluX2ZyYW1lID0gTmF2aWdhdGVNYWluRnJhbWUoa05vbkFkVXJsKTsKLSAgUmVzb3VyY2VEYXRhVXBkYXRlKG1haW5fZnJhbWUsIFJlc291cmNlQ2FjaGVkOjpOT1RfQ0FDSEVELCAxMCk7CisgIFJlc291cmNlRGF0YVVwZGF0ZShtYWluX2ZyYW1lLCBSZXNvdXJjZUNhY2hlZDo6a05vdENhY2hlZCwgMTApOwogCiAgIC8vIENyZWF0ZSBhbiBhZCBzdWJmcmFtZSB0aGF0IGFib3J0cyBiZWZvcmUgY29tbWl0dGluZy4KICAgUmVuZGVyRnJhbWVIb3N0KiBzdWJmcmFtZV9hZCA9CkBAIC03MzksOCArNzQ3LDggQEAKICAgLy8gTG9hZCByZXNvdXJjZXMgZm9yIHRoZSBhYm9ydGVkIGZyYW1lIChlLmcuLCBzaW11bGF0ZSB0aGUgbmF2aWdhdGlvbgogICAvLyBhYm9ydGluZyBkdWUgdG8gYSBkb2Mud3JpdGUgZHVyaW5nIHByb3Zpc2lvbmFsIG5hdmlnYXRpb24pLiBUaGV5IHNob3VsZAogICAvLyBiZSBjb3VudGVkLgotICBSZXNvdXJjZURhdGFVcGRhdGUoc3ViZnJhbWVfYWQsIFJlc291cmNlQ2FjaGVkOjpOT1RfQ0FDSEVELCAxMCk7Ci0gIFJlc291cmNlRGF0YVVwZGF0ZShzdWJmcmFtZV9hZCwgUmVzb3VyY2VDYWNoZWQ6Ok5PVF9DQUNIRUQsIDEwKTsKKyAgUmVzb3VyY2VEYXRhVXBkYXRlKHN1YmZyYW1lX2FkLCBSZXNvdXJjZUNhY2hlZDo6a05vdENhY2hlZCwgMTApOworICBSZXNvdXJjZURhdGFVcGRhdGUoc3ViZnJhbWVfYWQsIFJlc291cmNlQ2FjaGVkOjprTm90Q2FjaGVkLCAxMCk7CiAKICAgLy8gTmF2aWdhdGUgYWdhaW4gdG8gdHJpZ2dlciBoaXN0b2dyYW1zLgogICBOYXZpZ2F0ZUZyYW1lKGtOb25BZFVybCwgbWFpbl9mcmFtZSk7CkBAIC03NTEsMTEgKzc1OSwxMSBAQAogCiBURVNUX0YoQWRzUGFnZUxvYWRNZXRyaWNzT2JzZXJ2ZXJUZXN0LCBDb3VudEFib3J0ZWRTZWNvbmROYXZpZ2F0aW9uRm9yRnJhbWUpIHsKICAgUmVuZGVyRnJhbWVIb3N0KiBtYWluX2ZyYW1lID0gTmF2aWdhdGVNYWluRnJhbWUoa05vbkFkVXJsKTsKLSAgUmVzb3VyY2VEYXRhVXBkYXRlKG1haW5fZnJhbWUsIFJlc291cmNlQ2FjaGVkOjpOT1RfQ0FDSEVELCAxMCk7CisgIFJlc291cmNlRGF0YVVwZGF0ZShtYWluX2ZyYW1lLCBSZXNvdXJjZUNhY2hlZDo6a05vdENhY2hlZCwgMTApOwogCiAgIC8vIFN1YiBmcmFtZSB0aGF0IGlzIG5vdCBhbiBhZC4KICAgUmVuZGVyRnJhbWVIb3N0KiBzdWJfZnJhbWUgPSBDcmVhdGVBbmROYXZpZ2F0ZVN1YkZyYW1lKGtOb25BZFVybCwgbWFpbl9mcmFtZSk7Ci0gIFJlc291cmNlRGF0YVVwZGF0ZShzdWJfZnJhbWUsIFJlc291cmNlQ2FjaGVkOjpOT1RfQ0FDSEVELCAxMCk7CisgIFJlc291cmNlRGF0YVVwZGF0ZShzdWJfZnJhbWUsIFJlc291cmNlQ2FjaGVkOjprTm90Q2FjaGVkLCAxMCk7CiAKICAgLy8gTm93IG5hdmlnYXRlIChhbmQgYWJvcnQpIHRoZSBzdWJmcmFtZSB0byBhbiBhZC4KICAgYXV0byBuYXZpZ2F0aW9uX3NpbXVsYXRvciA9CkBAIC03NjgsOCArNzc2LDggQEAKICAgLy8gTG9hZCByZXNvdXJjZXMgZm9yIHRoZSBhYm9ydGVkIGZyYW1lIChlLmcuLCBzaW11bGF0ZSB0aGUgbmF2aWdhdGlvbgogICAvLyBhYm9ydGluZyBkdWUgdG8gYSBkb2Mud3JpdGUgZHVyaW5nIHByb3Zpc2lvbmFsIG5hdmlnYXRpb24pLiBTaW5jZSB0aGUKICAgLy8gZnJhbWUgYXR0ZW1wdGVkIHRvIGxvYWQgYW4gYWQsIHRoZSBmcmFtZSBpcyB0YWdnZWQgZm9yZXZlciBhcyBhbiBhZC4KLSAgUmVzb3VyY2VEYXRhVXBkYXRlKHN1Yl9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6Ok5PVF9DQUNIRUQsIDEwKTsKLSAgUmVzb3VyY2VEYXRhVXBkYXRlKHN1Yl9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6Ok5PVF9DQUNIRUQsIDEwKTsKKyAgUmVzb3VyY2VEYXRhVXBkYXRlKHN1Yl9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsIDEwKTsKKyAgUmVzb3VyY2VEYXRhVXBkYXRlKHN1Yl9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsIDEwKTsKIAogICAvLyBOYXZpZ2F0ZSBhZ2FpbiB0byB0cmlnZ2VyIGhpc3RvZ3JhbXMuCiAgIE5hdmlnYXRlRnJhbWUoa05vbkFkVXJsLCBtYWluX2ZyYW1lKTsKQEAgLTc4MSw3ICs3ODksNyBAQAogVEVTVF9GKEFkc1BhZ2VMb2FkTWV0cmljc09ic2VydmVyVGVzdCwgVHdvUmVzb3VyY2VMb2Fkc0JlZm9yZUNvbW1pdCkgewogICAvLyBNYWluIGZyYW1lLgogICBSZW5kZXJGcmFtZUhvc3QqIG1haW5fZnJhbWUgPSBOYXZpZ2F0ZU1haW5GcmFtZShrTm9uQWRVcmwpOwotICBSZXNvdXJjZURhdGFVcGRhdGUobWFpbl9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6Ok5PVF9DQUNIRUQsIDEwKTsKKyAgUmVzb3VyY2VEYXRhVXBkYXRlKG1haW5fZnJhbWUsIFJlc291cmNlQ2FjaGVkOjprTm90Q2FjaGVkLCAxMCk7CiAKICAgLy8gTm93IG9wZW4gYSBzdWJmcmFtZSBhbmQgaGF2ZSBpdHMgcmVzb3VyY2UgbG9hZCBiZWZvcmUgbm90aWZpY2F0aW9uIG9mCiAgIC8vIG5hdmlnYXRpb24gZmluaXNoaW5nLgpAQCAtNzg5LDcgKzc5Nyw3IEBACiAgICAgICBSZW5kZXJGcmFtZUhvc3RUZXN0ZXI6OkZvcihtYWluX2ZyYW1lKS0+QXBwZW5kQ2hpbGQoImZvbyIpOwogICBhdXRvIG5hdmlnYXRpb25fc2ltdWxhdG9yID0KICAgICAgIE5hdmlnYXRpb25TaW11bGF0b3I6OkNyZWF0ZVJlbmRlcmVySW5pdGlhdGVkKEdVUkwoa0FkVXJsKSwgc3ViZnJhbWVfYWQpOwotICBSZXNvdXJjZURhdGFVcGRhdGUoc3ViZnJhbWVfYWQsIFJlc291cmNlQ2FjaGVkOjpOT1RfQ0FDSEVELCAxMCk7CisgIFJlc291cmNlRGF0YVVwZGF0ZShzdWJmcmFtZV9hZCwgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsIDEwKTsKIAogICAvLyBUaGUgc3ViLWZyYW1lIHJlbmF2aWdhdGVzIGJlZm9yZSBpdCBjb21taXRzLgogICBuYXZpZ2F0aW9uX3NpbXVsYXRvci0+U3RhcnQoKTsKQEAgLTc5OCw3ICs4MDYsNyBAQAogCiAgIC8vIFJlbmF2aWdhdGUgdGhlIHN1YmZyYW1lIHRvIGEgc3VjY2Vzc2Z1bCBjb21taXQuIEJ1dCBhZ2FpbiwgdGhlIHJlc291cmNlCiAgIC8vIGxvYWRzIGJlZm9yZSB0aGUgb2JzZXJ2ZXIgc2VlcyB0aGUgZmluaXNoZWQgbmF2aWdhdGlvbi4KLSAgUmVzb3VyY2VEYXRhVXBkYXRlKHN1YmZyYW1lX2FkLCBSZXNvdXJjZUNhY2hlZDo6Tk9UX0NBQ0hFRCwgMTApOworICBSZXNvdXJjZURhdGFVcGRhdGUoc3ViZnJhbWVfYWQsIFJlc291cmNlQ2FjaGVkOjprTm90Q2FjaGVkLCAxMCk7CiAgIE5hdmlnYXRlRnJhbWUoa05vbkFkVXJsLCBzdWJmcmFtZV9hZCk7CiAKICAgLy8gTmF2aWdhdGUgYWdhaW4gdG8gdHJpZ2dlciBoaXN0b2dyYW1zLgpAQCAtODE2LDcgKzgyNCw3IEBACiAgIG5hdmlnYXRpb25fc2ltdWxhdG9yLT5Db21taXQoKTsKIAogICBSZXNvdXJjZURhdGFVcGRhdGUobmF2aWdhdGlvbl9zaW11bGF0b3ItPkdldEZpbmFsUmVuZGVyRnJhbWVIb3N0KCksCi0gICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZUNhY2hlZDo6Tk9UX0NBQ0hFRCwgMTApOworICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsIDEwKTsKIAogICBOYXZpZ2F0ZU1haW5GcmFtZShrTm9uQWRVcmwpOwogCkBAIC04NzcsNyArODg1LDcgQEAKICAgQ29uZmlndXJlQXNTdWJyZXNvdXJjZUZpbHRlck9ubHlVUkwoR1VSTChrTm9uQWRVcmwpKTsKICAgTmF2aWdhdGVNYWluRnJhbWUoa05vbkFkVXJsKTsKIAotICBSZXNvdXJjZURhdGFVcGRhdGUobWFpbl9yZmgoKSwgUmVzb3VyY2VDYWNoZWQ6Ok5PVF9DQUNIRUQsIDEwLAorICBSZXNvdXJjZURhdGFVcGRhdGUobWFpbl9yZmgoKSwgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsIDEwLAogICAgICAgICAgICAgICAgICAgICAgIiIgLyogbWltZV90eXBlICovLCBmYWxzZSAvKiBpc19hZF9yZXNvdXJjZSAqLyk7CiAKICAgUmVuZGVyRnJhbWVIb3N0KiBzdWJmcmFtZSA9CkBAIC04ODUsNyArODkzLDcgQEAKICAgc3RkOjp1bmlxdWVfcHRyPE5hdmlnYXRpb25TaW11bGF0b3I+IHNpbXVsYXRvciA9CiAgICAgICBOYXZpZ2F0aW9uU2ltdWxhdG9yOjpDcmVhdGVSZW5kZXJlckluaXRpYXRlZChHVVJMKGtEZWZhdWx0RGlzYWxsb3dlZFVybCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJmcmFtZSk7Ci0gIFJlc291cmNlRGF0YVVwZGF0ZShzdWJmcmFtZSwgUmVzb3VyY2VDYWNoZWQ6Ok5PVF9DQUNIRUQsIDEwLAorICBSZXNvdXJjZURhdGFVcGRhdGUoc3ViZnJhbWUsIFJlc291cmNlQ2FjaGVkOjprTm90Q2FjaGVkLCAxMCwKICAgICAgICAgICAgICAgICAgICAgICIiIC8qIG1pbWVfdHlwZSAqLywgdHJ1ZSAvKiBpc19hZF9yZXNvdXJjZSAqLyk7CiAgIHNpbXVsYXRvci0+Q29tbWl0KCk7CiAKQEAgLTkwNSwyNSArOTEzLDI1IEBACiAgIFJlbmRlckZyYW1lSG9zdCogYWRfZnJhbWUgPSBDcmVhdGVBbmROYXZpZ2F0ZVN1YkZyYW1lKGtBZFVybCwgbWFpbl9mcmFtZSk7CiAgIFJlbmRlckZyYW1lSG9zdCogY2hpbGRfYWRfZnJhbWUgPSBDcmVhdGVBbmROYXZpZ2F0ZVN1YkZyYW1lKGtBZFVybCwgYWRfZnJhbWUpOwogCi0gIFJlc291cmNlRGF0YVVwZGF0ZShtYWluX2ZyYW1lLCBSZXNvdXJjZUNhY2hlZDo6Tk9UX0NBQ0hFRCwgMTApOworICBSZXNvdXJjZURhdGFVcGRhdGUobWFpbl9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsIDEwKTsKIAogICAvLyBBZGQgc29tZSBkYXRhIHRvIHRoZSBhZCBmcmFtZSBzbyBpdCBnZXRzIHJlcG9ydGVkLgotICBSZXNvdXJjZURhdGFVcGRhdGUoYWRfZnJhbWUsIFJlc291cmNlQ2FjaGVkOjpOT1RfQ0FDSEVELCAxMCk7Ci0gIFJlc291cmNlRGF0YVVwZGF0ZShjaGlsZF9hZF9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6Ok5PVF9DQUNIRUQsIDEwKTsKKyAgUmVzb3VyY2VEYXRhVXBkYXRlKGFkX2ZyYW1lLCBSZXNvdXJjZUNhY2hlZDo6a05vdENhY2hlZCwgMTApOworICBSZXNvdXJjZURhdGFVcGRhdGUoY2hpbGRfYWRfZnJhbWUsIFJlc291cmNlQ2FjaGVkOjprTm90Q2FjaGVkLCAxMCk7CiAKICAgLy8gSnVzdCBkZWxldGUgdGhlIGNoaWxkIGZyYW1lIHRoaXMgdGltZS4KICAgY29udGVudDo6UmVuZGVyRnJhbWVIb3N0VGVzdGVyOjpGb3IoY2hpbGRfYWRfZnJhbWUpLT5EZXRhY2goKTsKIAogICAvLyBWZXJpZnkgcGVyLWZyYW1lIGhpc3RvZ3JhbXMgbm90IHJlY29yZGVkLgogICBoaXN0b2dyYW1fdGVzdGVyKCkuRXhwZWN0VG90YWxDb3VudCgKLSAgICAgIFN1ZmZpeGVkSGlzdG9ncmFtKCJCeXRlcy5BZEZyYW1lcy5QZXJGcmFtZS5Ub3RhbCIpLCAwKTsKKyAgICAgIFN1ZmZpeGVkSGlzdG9ncmFtKCJCeXRlcy5BZEZyYW1lcy5QZXJGcmFtZS5Ub3RhbDIiKSwgMCk7CiAKICAgLy8gRGVsZXRlIHRoZSByb290IGFkIGZyYW1lLgogICBjb250ZW50OjpSZW5kZXJGcmFtZUhvc3RUZXN0ZXI6OkZvcihhZF9mcmFtZSktPkRldGFjaCgpOwogCiAgIC8vIFZlcmlmeSBwZXItZnJhbWUgaGlzdG9ncmFtcyBhcmUgcmVjb3JkZWQuCiAgIGhpc3RvZ3JhbV90ZXN0ZXIoKS5FeHBlY3RVbmlxdWVTYW1wbGUoCi0gICAgICBTdWZmaXhlZEhpc3RvZ3JhbSgiQnl0ZXMuQWRGcmFtZXMuUGVyRnJhbWUuVG90YWwiKSwgMjAsIDEpOworICAgICAgU3VmZml4ZWRIaXN0b2dyYW0oIkJ5dGVzLkFkRnJhbWVzLlBlckZyYW1lLlRvdGFsMiIpLCAyMCwgMSk7CiAKICAgLy8gVmVyaWZ5IHBhZ2UgdG90YWxzIG5vdCByZXBvcnRlZCB5ZXQuCiAgIGhpc3RvZ3JhbV90ZXN0ZXIoKS5FeHBlY3RUb3RhbENvdW50KApAQCAtOTQzLDcgKzk1MSw3IEBACiAgIFJlbmRlckZyYW1lSG9zdCogdmFuaWxsYV9mcmFtZSA9CiAgICAgICBDcmVhdGVBbmROYXZpZ2F0ZVN1YkZyYW1lKGtOb25BZFVybCwgbWFpbl9mcmFtZSk7CiAKLSAgUmVzb3VyY2VEYXRhVXBkYXRlKG1haW5fZnJhbWUsIFJlc291cmNlQ2FjaGVkOjpOT1RfQ0FDSEVELCAxMCk7CisgIFJlc291cmNlRGF0YVVwZGF0ZShtYWluX2ZyYW1lLCBSZXNvdXJjZUNhY2hlZDo6a05vdENhY2hlZCwgMTApOwogCiAgIGNvbnRlbnQ6OlJlbmRlckZyYW1lSG9zdFRlc3Rlcjo6Rm9yKHZhbmlsbGFfZnJhbWUpLT5EZXRhY2goKTsKIApAQCAtOTU0LDI1ICs5NjIsMjUgQEAKIFRFU1RfRihBZHNQYWdlTG9hZE1ldHJpY3NPYnNlcnZlclRlc3QsIE1haW5GcmFtZUFkQnl0ZXNSZWNvcmRlZCkgewogICBOYXZpZ2F0ZU1haW5GcmFtZShrTm9uQWRVcmwpOwogCi0gIFJlc291cmNlRGF0YVVwZGF0ZShtYWluX3JmaCgpLCBSZXNvdXJjZUNhY2hlZDo6Tk9UX0NBQ0hFRCwgMTAsCisgIFJlc291cmNlRGF0YVVwZGF0ZShtYWluX3JmaCgpLCBSZXNvdXJjZUNhY2hlZDo6a05vdENhY2hlZCwgMTAsCiAgICAgICAgICAgICAgICAgICAgICAiIiAvKiBtaW1lX3R5cGUgKi8sIHRydWUgLyogaXNfYWRfcmVzb3VyY2UgKi8pOwotICBSZXNvdXJjZURhdGFVcGRhdGUobWFpbl9yZmgoKSwgUmVzb3VyY2VDYWNoZWQ6OkNBQ0hFRCwgMTAsICIiIC8qIG1pbWVfdHlwZSAqLywKLSAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogaXNfYWRfcmVzb3VyY2UgKi8pOworICBSZXNvdXJjZURhdGFVcGRhdGUobWFpbl9yZmgoKSwgUmVzb3VyY2VDYWNoZWQ6OmtDYWNoZWRIdHRwLCAxMCwKKyAgICAgICAgICAgICAgICAgICAgICIiIC8qIG1pbWVfdHlwZSAqLywgdHJ1ZSAvKiBpc19hZF9yZXNvdXJjZSAqLyk7CiAKICAgUmVuZGVyRnJhbWVIb3N0KiBzdWJmcmFtZSA9CiAgICAgICBSZW5kZXJGcmFtZUhvc3RUZXN0ZXI6OkZvcihtYWluX3JmaCgpKS0+QXBwZW5kQ2hpbGQoImZvbyIpOwogICBzdGQ6OnVuaXF1ZV9wdHI8TmF2aWdhdGlvblNpbXVsYXRvcj4gc2ltdWxhdG9yID0KICAgICAgIE5hdmlnYXRpb25TaW11bGF0b3I6OkNyZWF0ZVJlbmRlcmVySW5pdGlhdGVkKEdVUkwoa0RlZmF1bHREaXNhbGxvd2VkVXJsKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmZyYW1lKTsKLSAgUmVzb3VyY2VEYXRhVXBkYXRlKHN1YmZyYW1lLCBSZXNvdXJjZUNhY2hlZDo6Tk9UX0NBQ0hFRCwgMTAsCisgIFJlc291cmNlRGF0YVVwZGF0ZShzdWJmcmFtZSwgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsIDEwLAogICAgICAgICAgICAgICAgICAgICAgIiIgLyogbWltZV90eXBlICovLCB0cnVlIC8qIGlzX2FkX3Jlc291cmNlICovKTsKLSAgUmVzb3VyY2VEYXRhVXBkYXRlKHN1YmZyYW1lLCBSZXNvdXJjZUNhY2hlZDo6Q0FDSEVELCAxMCwgIiIgLyogbWltZV90eXBlICovLAotICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBpc19hZF9yZXNvdXJjZSAqLyk7CisgIFJlc291cmNlRGF0YVVwZGF0ZShzdWJmcmFtZSwgUmVzb3VyY2VDYWNoZWQ6OmtDYWNoZWRIdHRwLCAxMCwKKyAgICAgICAgICAgICAgICAgICAgICIiIC8qIG1pbWVfdHlwZSAqLywgdHJ1ZSAvKiBpc19hZF9yZXNvdXJjZSAqLyk7CiAgIHNpbXVsYXRvci0+Q29tbWl0KCk7CiAKICAgTmF2aWdhdGVNYWluRnJhbWUoa05vbkFkVXJsKTsKICAgaGlzdG9ncmFtX3Rlc3RlcigpLkV4cGVjdFVuaXF1ZVNhbXBsZSgKLSAgICAgIFN1ZmZpeGVkSGlzdG9ncmFtKCJCeXRlcy5NYWluRnJhbWUuQWRzLlRvdGFsIiksIDIwLCAxKTsKKyAgICAgIFN1ZmZpeGVkSGlzdG9ncmFtKCJCeXRlcy5NYWluRnJhbWUuQWRzLlRvdGFsMiIpLCAyMCwgMSk7CiAgIGhpc3RvZ3JhbV90ZXN0ZXIoKS5FeHBlY3RVbmlxdWVTYW1wbGUoCiAgICAgICBTdWZmaXhlZEhpc3RvZ3JhbSgiQnl0ZXMuTWFpbkZyYW1lLkFkcy5OZXR3b3JrIiksIDEwLCAxKTsKIApAQCAtOTgxLDYgKzk4OSwyMiBAQAogICAgICAgU3VmZml4ZWRIaXN0b2dyYW0oIlJlc291cmNlcy5CeXRlcy5BZHMyIiksIDIwLCAxKTsKIH0KIAorLy8gVGVzdHMgdGhhdCBtZW1vcnkgY2FjaGUgYWQgYnl0ZXMgYXJlIHJlY29yZGVkIGNvcnJlY3RseS4KK1RFU1RfRihBZHNQYWdlTG9hZE1ldHJpY3NPYnNlcnZlclRlc3QsIE1lbW9yeUNhY2hlQWRCeXRlc1JlY29yZGVkKSB7CisgIFJlbmRlckZyYW1lSG9zdCogbWFpbl9mcmFtZSA9IE5hdmlnYXRlTWFpbkZyYW1lKGtOb25BZFVybCk7CisgIFJlbmRlckZyYW1lSG9zdCogZnJhbWUxID0gQ3JlYXRlQW5kTmF2aWdhdGVTdWJGcmFtZShrTm9uQWRVcmwsIG1haW5fZnJhbWUpOworICBSZW5kZXJGcmFtZUhvc3QqIGZyYW1lMiA9IENyZWF0ZUFuZE5hdmlnYXRlU3ViRnJhbWUoa0FkVXJsLCBtYWluX2ZyYW1lKTsKKyAgUmVzb3VyY2VEYXRhVXBkYXRlKG1haW5fZnJhbWUsIFJlc291cmNlQ2FjaGVkOjprTm90Q2FjaGVkLCAxMCk7CisgIFJlc291cmNlRGF0YVVwZGF0ZShmcmFtZTEsIFJlc291cmNlQ2FjaGVkOjprQ2FjaGVkTWVtb3J5LCAxMCk7CisgIFJlc291cmNlRGF0YVVwZGF0ZShmcmFtZTIsIFJlc291cmNlQ2FjaGVkOjprQ2FjaGVkTWVtb3J5LCAxMCk7CisKKyAgLy8gTmF2aWdhdGUgYWdhaW4gdG8gdHJpZ2dlciBoaXN0b2dyYW1zLgorICBOYXZpZ2F0ZUZyYW1lKGtOb25BZFVybCwgbWFpbl9mcmFtZSk7CisKKyAgVGVzdEhpc3RvZ3JhbXMoaGlzdG9ncmFtX3Rlc3RlcigpLCB0ZXN0X3VrbV9yZWNvcmRlcigpLCB7ezEwLCAwfX0sCisgICAgICAgICAgICAgICAgIDEwIC8qIG5vbl9hZF9jYWNoZWRfa2IgKi8sIDEwIC8qIG5vbl9hZF91bmNhY2hlZF9rYiAqLyk7Cit9CisKIC8vIFVLTSBtZXRyaWNzIGZvciBhZCBwYWdlIGxvYWQgYXJlIHJlY29yZGVkIGNvcnJlY3RseS4KIFRFU1RfRihBZHNQYWdlTG9hZE1ldHJpY3NPYnNlcnZlclRlc3QsIEFkUGFnZUxvYWRVS00pIHsKICAgdWttOjpUZXN0QXV0b1NldFVrbVJlY29yZGVyIHVrbV9yZWNvcmRlcjsKQEAgLTk5NSwxMiArMTAxOSwxMiBAQAogICBQb3B1bGF0ZVJlcXVpcmVkVGltaW5nRmllbGRzKCZ0aW1pbmcpOwogICBUaW1pbmdVcGRhdGUodGltaW5nKTsKICAgUmVzb3VyY2VEYXRhVXBkYXRlKAotICAgICAgbWFpbl9yZmgoKSwgUmVzb3VyY2VDYWNoZWQ6Ok5PVF9DQUNIRUQsIDEwIC8qIHJlc291cmNlX3NpemVfaW5fa2J5dGUgKi8sCisgICAgICBtYWluX3JmaCgpLCBSZXNvdXJjZUNhY2hlZDo6a05vdENhY2hlZCwgMTAgLyogcmVzb3VyY2Vfc2l6ZV9pbl9rYnl0ZSAqLywKICAgICAgICJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0IiAvKiBtaW1lX3R5cGUgKi8sIGZhbHNlIC8qIGlzX2FkX3Jlc291cmNlICovKTsKICAgUmVzb3VyY2VEYXRhVXBkYXRlKAotICAgICAgbWFpbl9yZmgoKSwgUmVzb3VyY2VDYWNoZWQ6Ok5PVF9DQUNIRUQsIDEwIC8qIHJlc291cmNlX3NpemVfaW5fa2J5dGUgKi8sCisgICAgICBtYWluX3JmaCgpLCBSZXNvdXJjZUNhY2hlZDo6a05vdENhY2hlZCwgMTAgLyogcmVzb3VyY2Vfc2l6ZV9pbl9rYnl0ZSAqLywKICAgICAgICJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0IiAvKiBtaW1lX3R5cGUgKi8sIHRydWUgLyogaXNfYWRfcmVzb3VyY2UgKi8pOwotICBSZXNvdXJjZURhdGFVcGRhdGUobWFpbl9yZmgoKSwgUmVzb3VyY2VDYWNoZWQ6Ok5PVF9DQUNIRUQsCisgIFJlc291cmNlRGF0YVVwZGF0ZShtYWluX3JmaCgpLCBSZXNvdXJjZUNhY2hlZDo6a05vdENhY2hlZCwKICAgICAgICAgICAgICAgICAgICAgIDEwIC8qIHJlc291cmNlX3NpemVfaW5fa2J5dGUgKi8sCiAgICAgICAgICAgICAgICAgICAgICAidmlkZW8vd2VibSIgLyogbWltZV90eXBlICovLCB0cnVlIC8qIGlzX2FkX3Jlc291cmNlICovKTsKIApAQCAtMTA1NSw3ICsxMDc5LDcgQEAKICAgUmVuZGVyRnJhbWVIb3N0KiBtYWluX2ZyYW1lID0gTmF2aWdhdGVNYWluRnJhbWUoa05vbkFkVXJsKTsKICAgUmVuZGVyRnJhbWVIb3N0KiBhZF9mcmFtZSA9IENyZWF0ZUFuZE5hdmlnYXRlU3ViRnJhbWUoa0FkVXJsLCBtYWluX2ZyYW1lKTsKIAotICBSZXNvdXJjZURhdGFVcGRhdGUobWFpbl9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6Ok5PVF9DQUNIRUQsIDEwKTsKKyAgUmVzb3VyY2VEYXRhVXBkYXRlKG1haW5fZnJhbWUsIFJlc291cmNlQ2FjaGVkOjprTm90Q2FjaGVkLCAxMCk7CiAKICAgLy8gVXNlIENQVSBidXQgbWFpbnRhaW4gemVybyBieXRlcyBpbiB0aGUgYWQgZnJhbWUKICAgT25DcHVUaW1pbmdVcGRhdGUoYWRfZnJhbWUsIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcygxMDAwKSk7CkBAIC0xMDc2LDcgKzExMDAsNyBAQAogICBSZW5kZXJGcmFtZUhvc3QqIGFkX2ZyYW1lID0gQ3JlYXRlQW5kTmF2aWdhdGVTdWJGcmFtZShrQWRVcmwsIG1haW5fZnJhbWUpOwogCiAgIC8vIEFkZCBzb21lIGRhdGEgdG8gdGhlIGFkIGZyYW1lIHNvIGl0IGdldHMgcmVwb3J0ZWQuCi0gIFJlc291cmNlRGF0YVVwZGF0ZShhZF9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6Ok5PVF9DQUNIRUQsIDEwKTsKKyAgUmVzb3VyY2VEYXRhVXBkYXRlKGFkX2ZyYW1lLCBSZXNvdXJjZUNhY2hlZDo6a05vdENhY2hlZCwgMTApOwogCiAgIC8vIFBlcmZvcm0gc29tZSB1cGRhdGVzIG9uIGFkIGFuZCBub24tYWQgZnJhbWVzLiBVc2FnZSAxJS4KICAgT25DcHVUaW1pbmdVcGRhdGUoYWRfZnJhbWUsIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcyg1MDApKTsKQEAgLTExMzAsNyArMTE1NCw3IEBACiAgIFJlbmRlckZyYW1lSG9zdCogYWRfZnJhbWUgPSBDcmVhdGVBbmROYXZpZ2F0ZVN1YkZyYW1lKGtBZFVybCwgbWFpbl9mcmFtZSk7CiAKICAgLy8gQWRkIHNvbWUgZGF0YSB0byB0aGUgYWQgZnJhbWUgc28gaXQgZ2V0cyByZXBvcnRlZC4KLSAgUmVzb3VyY2VEYXRhVXBkYXRlKGFkX2ZyYW1lLCBSZXNvdXJjZUNhY2hlZDo6Tk9UX0NBQ0hFRCwgMTApOworICBSZXNvdXJjZURhdGFVcGRhdGUoYWRfZnJhbWUsIFJlc291cmNlQ2FjaGVkOjprTm90Q2FjaGVkLCAxMCk7CiAKICAgLy8gUGVyZm9ybSBzb21lIHVwZGF0ZXMgb24gYWQgYW5kIG5vbi1hZCBmcmFtZXMuIFVzYWdlIDElLgogICBPbkNwdVRpbWluZ1VwZGF0ZShhZF9mcmFtZSwgYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDUwMCkpOwpAQCAtMTE4Nyw3ICsxMjExLDcgQEAKICAgUmVuZGVyRnJhbWVIb3N0KiBhZF9mcmFtZSA9IENyZWF0ZUFuZE5hdmlnYXRlU3ViRnJhbWUoa0FkVXJsLCBtYWluX2ZyYW1lKTsKIAogICAvLyBBZGQgc29tZSBkYXRhIHRvIHRoZSBhZCBmcmFtZSBzbyBpdCBnZXRzIHJlcG9ydGVkLgotICBSZXNvdXJjZURhdGFVcGRhdGUoYWRfZnJhbWUsIFJlc291cmNlQ2FjaGVkOjpOT1RfQ0FDSEVELCAxMCk7CisgIFJlc291cmNlRGF0YVVwZGF0ZShhZF9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsIDEwKTsKIAogICAvLyBQZXJmb3JtIHNvbWUgdXBkYXRlcyBvbiBhZCBhbmQgbm9uLWFkIGZyYW1lcy4KICAgT25DcHVUaW1pbmdVcGRhdGUoYWRfZnJhbWUsIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcyg1MDApKTsKQEAgLTEyNDEsNyArMTI2NSw3IEBACiAgIFJlbmRlckZyYW1lSG9zdCogYWRfZnJhbWUgPSBDcmVhdGVBbmROYXZpZ2F0ZVN1YkZyYW1lKGtBZFVybCwgbWFpbl9mcmFtZSk7CiAKICAgLy8gQWRkIHNvbWUgZGF0YSB0byB0aGUgYWQgZnJhbWUgc28gaXQgZ2V0IHJlcG9ydGVkLgotICBSZXNvdXJjZURhdGFVcGRhdGUoYWRfZnJhbWUsIFJlc291cmNlQ2FjaGVkOjpOT1RfQ0FDSEVELCAxMCk7CisgIFJlc291cmNlRGF0YVVwZGF0ZShhZF9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsIDEwKTsKIAogICAvLyBQZXJmb3JtIHNvbWUgdXBkYXRlcyBvbiBhZCBhbmQgbm9uLWFkIGZyYW1lcy4KICAgT25DcHVUaW1pbmdVcGRhdGUoYWRfZnJhbWUsIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcyg1MDApKTsKQEAgLTEyOTgsNyArMTMyMiw3IEBACiAgIFJlbmRlckZyYW1lSG9zdCogYWRfZnJhbWUgPSBDcmVhdGVBbmROYXZpZ2F0ZVN1YkZyYW1lKGtBZFVybCwgbWFpbl9mcmFtZSk7CiAKICAgLy8gQWRkIHNvbWUgZGF0YSB0byB0aGUgYWQgZnJhbWUgc28gaXQgZ2V0IHJlcG9ydGVkLgotICBSZXNvdXJjZURhdGFVcGRhdGUoYWRfZnJhbWUsIFJlc291cmNlQ2FjaGVkOjpOT1RfQ0FDSEVELCAxMCk7CisgIFJlc291cmNlRGF0YVVwZGF0ZShhZF9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsIDEwKTsKIAogICAvLyBQZXJmb3JtIHNvbWUgdXBkYXRlcyBvbiBhZCBhbmQgbm9uLWFkIGZyYW1lcy4KICAgT25DcHVUaW1pbmdVcGRhdGUoYWRfZnJhbWUsIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcyg1MDApKTsKQEAgLTEzNjEsNyArMTM4NSw3IEBACiAgIFJlbmRlckZyYW1lSG9zdCogYWRfZnJhbWUgPSBDcmVhdGVBbmROYXZpZ2F0ZVN1YkZyYW1lKGtBZFVybCwgbWFpbl9mcmFtZSk7CiAKICAgLy8gQWRkIHNvbWUgZGF0YSB0byB0aGUgYWQgZnJhbWUgc28gaXQgZ2V0IHJlcG9ydGVkLgotICBSZXNvdXJjZURhdGFVcGRhdGUoYWRfZnJhbWUsIFJlc291cmNlQ2FjaGVkOjpOT1RfQ0FDSEVELCAxMCk7CisgIFJlc291cmNlRGF0YVVwZGF0ZShhZF9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsIDEwKTsKIAogICAvLyBTZXQgdGhlIGZyYW1lIGFzIGJhY2tncm91bmRlZCwgc28gYWxsIHVwZGF0ZXMgYmVsb3cgc2hvdWxkbid0IHJlcG9ydC4KICAgT25IaWRkZW4oKTsKQEAgLTE0MjAsNyArMTQ0NCw3IEBACiAgIFJlbmRlckZyYW1lSG9zdCogYWRfZnJhbWUgPSBDcmVhdGVBbmROYXZpZ2F0ZVN1YkZyYW1lKGtBZFVybCwgbWFpbl9mcmFtZSk7CiAKICAgLy8gQWRkIHNvbWUgZGF0YSB0byB0aGUgYWQgZnJhbWUgc28gaXQgZ2V0IHJlcG9ydGVkLgotICBSZXNvdXJjZURhdGFVcGRhdGUoYWRfZnJhbWUsIFJlc291cmNlQ2FjaGVkOjpOT1RfQ0FDSEVELCAxMCk7CisgIFJlc291cmNlRGF0YVVwZGF0ZShhZF9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsIDEwKTsKIAogICAvLyBQZXJmb3JtIHNvbWUgdXBkYXRlcyBvbiBhZCBhbmQgbm9uLWFkIGZyYW1lcy4KICAgT25DcHVUaW1pbmdVcGRhdGUoYWRfZnJhbWUsIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcyg1MDApKTsKQEAgLTE0NTYsNyArMTQ4MCw3IEBACiAgIFJlbmRlckZyYW1lSG9zdCogYWRfZnJhbWUgPSBDcmVhdGVBbmROYXZpZ2F0ZVN1YkZyYW1lKGtBZFVybCwgbWFpbl9mcmFtZSk7CiAKICAgLy8gQWRkIHNvbWUgZGF0YSB0byB0aGUgYWQgZnJhbWUgc28gaXQgZ2V0IHJlcG9ydGVkLgotICBSZXNvdXJjZURhdGFVcGRhdGUoYWRfZnJhbWUsIFJlc291cmNlQ2FjaGVkOjpOT1RfQ0FDSEVELCAxMCk7CisgIFJlc291cmNlRGF0YVVwZGF0ZShhZF9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsIDEwKTsKIAogICAvLyBQZXJmb3JtIHNvbWUgdXBkYXRlcyBvbiBhZCBhbmQgbm9uLWFkIGZyYW1lcy4KICAgT25DcHVUaW1pbmdVcGRhdGUoYWRfZnJhbWUsIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcyg1MDApKTsKQEAgLTE1MDQsNyArMTUyOCw3IEBACiAgIFJlbmRlckZyYW1lSG9zdCogYWRfZnJhbWUgPSBDcmVhdGVBbmROYXZpZ2F0ZVN1YkZyYW1lKGtBZFVybCwgbWFpbl9mcmFtZSk7CiAKICAgLy8gTG9hZCBieXRlcyBpbiBmcmFtZSB0byByZWNvcmQgdWttIGV2ZW50LgotICBSZXNvdXJjZURhdGFVcGRhdGUoYWRfZnJhbWUsIFJlc291cmNlQ2FjaGVkOjpOT1RfQ0FDSEVELCAxMCk7CisgIFJlc291cmNlRGF0YVVwZGF0ZShhZF9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsIDEwKTsKIAogICBwYWdlX2xvYWRfbWV0cmljczo6bW9qb206OlBhZ2VMb2FkVGltaW5nIHN1YmZyYW1lX3RpbWluZzsKICAgcGFnZV9sb2FkX21ldHJpY3M6OkluaXRQYWdlTG9hZFRpbWluZ0ZvclRlc3QoJnN1YmZyYW1lX3RpbWluZyk7CkBAIC0xNTU4LDEzICsxNTgyLDEzIEBACiAgICAgICBDcmVhdGVBbmROYXZpZ2F0ZVN1YkZyYW1lKGtBZFVybCwgbWFpbl9mcmFtZSk7CiAKICAgLy8gTG9hZCBzb21lIGJ5dGVzIGluIGVhY2ggZnJhbWUgc28gdGhleSBhcmUgY29uc2lkZXJlZCBhZCBpZnJhbWVzLgotICBSZXNvdXJjZURhdGFVcGRhdGUoYWRfZnJhbWVfbm9uZSwgUmVzb3VyY2VDYWNoZWQ6Ok5PVF9DQUNIRUQsIDEpOwotICBSZXNvdXJjZURhdGFVcGRhdGUoYWRfZnJhbWVfbmV0LCBSZXNvdXJjZUNhY2hlZDo6Tk9UX0NBQ0hFRCwgMSk7Ci0gIFJlc291cmNlRGF0YVVwZGF0ZShhZF9mcmFtZV9jcHUsIFJlc291cmNlQ2FjaGVkOjpOT1RfQ0FDSEVELCAxKTsKLSAgUmVzb3VyY2VEYXRhVXBkYXRlKGFkX2ZyYW1lX3RvdGFsX2NwdSwgUmVzb3VyY2VDYWNoZWQ6Ok5PVF9DQUNIRUQsIDEpOworICBSZXNvdXJjZURhdGFVcGRhdGUoYWRfZnJhbWVfbm9uZSwgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsIDEpOworICBSZXNvdXJjZURhdGFVcGRhdGUoYWRfZnJhbWVfbmV0LCBSZXNvdXJjZUNhY2hlZDo6a05vdENhY2hlZCwgMSk7CisgIFJlc291cmNlRGF0YVVwZGF0ZShhZF9mcmFtZV9jcHUsIFJlc291cmNlQ2FjaGVkOjprTm90Q2FjaGVkLCAxKTsKKyAgUmVzb3VyY2VEYXRhVXBkYXRlKGFkX2ZyYW1lX3RvdGFsX2NwdSwgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsIDEpOwogCiAgIC8vIE1ha2UgdGhyZWUgb2YgdGhlIGFkIGZyYW1lcyBoaXQgdGhyZXNob2xkcyBmb3IgaGVhdnkgYWRzLgotICBSZXNvdXJjZURhdGFVcGRhdGUoYWRfZnJhbWVfbmV0LCBSZXNvdXJjZUNhY2hlZDo6Tk9UX0NBQ0hFRCwKKyAgUmVzb3VyY2VEYXRhVXBkYXRlKGFkX2ZyYW1lX25ldCwgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsCiAgICAgICAgICAgICAgICAgICAgICAoaGVhdnlfYWRfdGhyZXNob2xkczo6a01heE5ldHdvcmtCeXRlcyAvIDEwMjQpKTsKICAgT25DcHVUaW1pbmdVcGRhdGUoCiAgICAgICBhZF9mcmFtZV9jcHUsCkBAIC0xNjIyLDEzICsxNjQ2LDEzIEBACiAgIFJlbmRlckZyYW1lSG9zdCogYWRfZnJhbWUgPSBDcmVhdGVBbmROYXZpZ2F0ZVN1YkZyYW1lKGtBZFVybCwgbWFpbl9mcmFtZSk7CiAKICAgLy8gTG9hZCBqdXN0IHVuZGVyIHRoZSB0aHJlc2hvbGQgYW1vdW50IG9mIGJ5dGVzLgotICBSZXNvdXJjZURhdGFVcGRhdGUoYWRfZnJhbWUsIFJlc291cmNlQ2FjaGVkOjpOT1RfQ0FDSEVELAorICBSZXNvdXJjZURhdGFVcGRhdGUoYWRfZnJhbWUsIFJlc291cmNlQ2FjaGVkOjprTm90Q2FjaGVkLAogICAgICAgICAgICAgICAgICAgICAgKGhlYXZ5X2FkX3RocmVzaG9sZHM6OmtNYXhOZXR3b3JrQnl0ZXMgLyAxMDI0KSAtIDEpOwogICBoaXN0b2dyYW1fdGVzdGVyKCkuRXhwZWN0VG90YWxDb3VudCgKICAgICAgIFN1ZmZpeGVkSGlzdG9ncmFtKCJIZWF2eUFkcy5JbnRlcnZlbnRpb25UeXBlMiIpLCAwKTsKIAogICAvLyBMb2FkIGVub3VnaCBieXRlcyB0byB0cmlnZ2VyIHRoZSBpbnRlcnZlbnRpb24uCi0gIFJlc291cmNlRGF0YVVwZGF0ZShhZF9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6Ok5PVF9DQUNIRUQsIDIpOworICBSZXNvdXJjZURhdGFVcGRhdGUoYWRfZnJhbWUsIFJlc291cmNlQ2FjaGVkOjprTm90Q2FjaGVkLCAyKTsKIAogICBoaXN0b2dyYW1fdGVzdGVyKCkuRXhwZWN0VW5pcXVlU2FtcGxlKAogICAgICAgU3VmZml4ZWRIaXN0b2dyYW0oIkhlYXZ5QWRzLkludGVydmVudGlvblR5cGUyIiksCkBAIC0xNjQ3LDEzICsxNjcxLDEzIEBACiAgIFJlbmRlckZyYW1lSG9zdCogYWRfZnJhbWUgPSBDcmVhdGVBbmROYXZpZ2F0ZVN1YkZyYW1lKGtBZFVybCwgbWFpbl9mcmFtZSk7CiAKICAgLy8gTG9hZCBqdXN0IHVuZGVyIHRoZSB0aHJlc2hvbGQgYW1vdW50IG9mIGJ5dGVzIHdpdGggbm9pc2UgaW5jbHVkZWQuCi0gIFJlc291cmNlRGF0YVVwZGF0ZShhZF9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6Ok5PVF9DQUNIRUQsCisgIFJlc291cmNlRGF0YVVwZGF0ZShhZF9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsCiAgICAgICAgICAgICAgICAgICAgICAoaGVhdnlfYWRfdGhyZXNob2xkczo6a01heE5ldHdvcmtCeXRlcyAvIDEwMjQpICsgMSk7CiAgIGhpc3RvZ3JhbV90ZXN0ZXIoKS5FeHBlY3RUb3RhbENvdW50KAogICAgICAgU3VmZml4ZWRIaXN0b2dyYW0oIkhlYXZ5QWRzLkludGVydmVudGlvblR5cGUyIiksIDApOwogCiAgIC8vIExvYWQgZW5vdWdoIGJ5dGVzIHRvIG1lZXQgdGhlIG5vaXNlZCB0aHJlc2hvbGQgY3JpdGVyaWEuCi0gIFJlc291cmNlRGF0YVVwZGF0ZShhZF9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6Ok5PVF9DQUNIRUQsIDEpOworICBSZXNvdXJjZURhdGFVcGRhdGUoYWRfZnJhbWUsIFJlc291cmNlQ2FjaGVkOjprTm90Q2FjaGVkLCAxKTsKIAogICBoaXN0b2dyYW1fdGVzdGVyKCkuRXhwZWN0VW5pcXVlU2FtcGxlKAogICAgICAgU3VmZml4ZWRIaXN0b2dyYW0oIkhlYXZ5QWRzLkludGVydmVudGlvblR5cGUyIiksCkBAIC0xNjc0LDcgKzE2OTgsNyBAQAogICBSZW5kZXJGcmFtZUhvc3QqIGFkX2ZyYW1lID0gQ3JlYXRlQW5kTmF2aWdhdGVTdWJGcmFtZShrQWRVcmwsIG1haW5fZnJhbWUpOwogCiAgIC8vIExvYWQgbmV0d29yayBieXRlcyB0aGF0IHRyaXAgdGhlIGhlYXZ5IGFkIHRocmVzaG9sZCB3aXRob3V0IG5vaXNlLgotICBSZXNvdXJjZURhdGFVcGRhdGUoYWRfZnJhbWUsIFJlc291cmNlQ2FjaGVkOjpOT1RfQ0FDSEVELAorICBSZXNvdXJjZURhdGFVcGRhdGUoYWRfZnJhbWUsIFJlc291cmNlQ2FjaGVkOjprTm90Q2FjaGVkLAogICAgICAgICAgICAgICAgICAgICAgaGVhdnlfYWRfdGhyZXNob2xkczo6a01heE5ldHdvcmtCeXRlcyAvIDEwMjQgKyAxKTsKICAgaGlzdG9ncmFtX3Rlc3RlcigpLkV4cGVjdFRvdGFsQ291bnQoCiAgICAgICBTdWZmaXhlZEhpc3RvZ3JhbSgiSGVhdnlBZHMuSW50ZXJ2ZW50aW9uVHlwZTIiKSwgMCk7CkBAIC0xNzAzLDcgKzE3MjcsNyBAQAogICBSZW5kZXJGcmFtZUhvc3QqIGFkX2ZyYW1lID0gQ3JlYXRlQW5kTmF2aWdhdGVTdWJGcmFtZShrQWRVcmwsIG1haW5fZnJhbWUpOwogCiAgIC8vIExvYWQgbmV0d29yayBieXRlcyB0aGF0IHRyaXAgdGhlIGhlYXZ5IGFkIHRocmVzaG9sZCB3aXRob3V0IG5vaXNlLgotICBSZXNvdXJjZURhdGFVcGRhdGUoYWRfZnJhbWUsIFJlc291cmNlQ2FjaGVkOjpOT1RfQ0FDSEVELAorICBSZXNvdXJjZURhdGFVcGRhdGUoYWRfZnJhbWUsIFJlc291cmNlQ2FjaGVkOjprTm90Q2FjaGVkLAogICAgICAgICAgICAgICAgICAgICAgaGVhdnlfYWRfdGhyZXNob2xkczo6a01heE5ldHdvcmtCeXRlcyAvIDEwMjQgKyAxKTsKICAgaGlzdG9ncmFtX3Rlc3RlcigpLkV4cGVjdFRvdGFsQ291bnQoCiAgICAgICBTdWZmaXhlZEhpc3RvZ3JhbSgiSGVhdnlBZHMuSW50ZXJ2ZW50aW9uVHlwZTIiKSwgMCk7CkBAIC0xNzM1LDcgKzE3NTksNyBAQAogICBSZW5kZXJGcmFtZUhvc3QqIGFkX2ZyYW1lID0gQ3JlYXRlQW5kTmF2aWdhdGVTdWJGcmFtZShrQWRVcmwsIG1haW5fZnJhbWUpOwogCiAgIC8vIEFkZCBzb21lIGRhdGEgdG8gdGhlIGFkIGZyYW1lIHNvIGl0IGdldCByZXBvcnRlZC4KLSAgUmVzb3VyY2VEYXRhVXBkYXRlKGFkX2ZyYW1lLCBSZXNvdXJjZUNhY2hlZDo6Tk9UX0NBQ0hFRCwgMSk7CisgIFJlc291cmNlRGF0YVVwZGF0ZShhZF9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsIDEpOwogCiAgIC8vIFVzZSBqdXN0IHVuZGVyIHRoZSB0aHJlc2hvbGQgYW1vdW50IG9mIENQVS5OZWVkcyB0byBzcHJlYWQgYWNyb3NzIGVub3VnaAogICAvLyB3aW5kb3dzIHRvIG5vdCB0cmlnZ2VyIHBlYWsgdGhyZXNob2xkLgpAQCAtMTc2Miw3ICsxNzg2LDcgQEAKICAgUmVuZGVyRnJhbWVIb3N0KiBhZF9mcmFtZSA9IENyZWF0ZUFuZE5hdmlnYXRlU3ViRnJhbWUoa0FkVXJsLCBtYWluX2ZyYW1lKTsKIAogICAvLyBBZGQgc29tZSBkYXRhIHRvIHRoZSBhZCBmcmFtZSBzbyBpdCBnZXQgcmVwb3J0ZWQuCi0gIFJlc291cmNlRGF0YVVwZGF0ZShhZF9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6Ok5PVF9DQUNIRUQsIDEpOworICBSZXNvdXJjZURhdGFVcGRhdGUoYWRfZnJhbWUsIFJlc291cmNlQ2FjaGVkOjprTm90Q2FjaGVkLCAxKTsKIAogICAvLyBVc2UganVzdCB1bmRlciB0aGUgcGVhayB0aHJlc2hvbGQgYW1vdW50IG9mIENQVS4KICAgT25DcHVUaW1pbmdVcGRhdGUoCkBAIC0xNzg5LDcgKzE4MTMsNyBAQAogICBSZW5kZXJGcmFtZUhvc3QqIGFkX2ZyYW1lID0gQ3JlYXRlQW5kTmF2aWdhdGVTdWJGcmFtZShrQWRVcmwsIG1haW5fZnJhbWUpOwogCiAgIC8vIEFkZCBlbm91Z2ggZGF0YSB0byB0cmlnZ2VyIHRoZSBpbnRlcnZlbnRpb24uCi0gIFJlc291cmNlRGF0YVVwZGF0ZShhZF9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6Ok5PVF9DQUNIRUQsCisgIFJlc291cmNlRGF0YVVwZGF0ZShhZF9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsCiAgICAgICAgICAgICAgICAgICAgICAoa01heEhlYXZ5QWROZXR3b3JrQnl0ZXMgLyAxMDI0KSArIDEpOwogCiAgIGhpc3RvZ3JhbV90ZXN0ZXIoKS5FeHBlY3RUb3RhbENvdW50KApAQCAtMTgxMCw3ICsxODM0LDcgQEAKICAgVHJpZ2dlckZpcnN0VXNlckFjdGl2YXRpb24oYWRfZnJhbWUpOwogCiAgIC8vIEFkZCBlbm91Z2ggZGF0YSB0byB0cmlnZ2VyIHRoZSBpbnRlcnZlbnRpb24uCi0gIFJlc291cmNlRGF0YVVwZGF0ZShhZF9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6Ok5PVF9DQUNIRUQsCisgIFJlc291cmNlRGF0YVVwZGF0ZShhZF9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsCiAgICAgICAgICAgICAgICAgICAgICAoaGVhdnlfYWRfdGhyZXNob2xkczo6a01heE5ldHdvcmtCeXRlcyAvIDEwMjQpICsgMSk7CiAKICAgaGlzdG9ncmFtX3Rlc3RlcigpLkV4cGVjdFRvdGFsQ291bnQoCkBAIC0xODM3LDcgKzE4NjEsNyBAQAogICBSZW5kZXJGcmFtZUhvc3QqIGFkX2ZyYW1lID0gQ3JlYXRlQW5kTmF2aWdhdGVTdWJGcmFtZShrQWRVcmwsIG1haW5fZnJhbWUpOwogCiAgIC8vIEFkZCBlbm91Z2ggZGF0YSB0byB0cmlnZ2VyIHRoZSBpbnRlcnZlbnRpb24uCi0gIFJlc291cmNlRGF0YVVwZGF0ZShhZF9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6Ok5PVF9DQUNIRUQsCisgIFJlc291cmNlRGF0YVVwZGF0ZShhZF9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsCiAgICAgICAgICAgICAgICAgICAgICAoaGVhdnlfYWRfdGhyZXNob2xkczo6a01heE5ldHdvcmtCeXRlcyAvIDEwMjQpICsgMSk7CiAKICAgaGlzdG9ncmFtX3Rlc3RlcigpLkV4cGVjdFRvdGFsQ291bnQoCkBAIC0xODYyLDcgKzE4ODYsNyBAQAogICBSZW5kZXJGcmFtZUhvc3QqIGFkX2ZyYW1lID0gQ3JlYXRlQW5kTmF2aWdhdGVTdWJGcmFtZShrQWRVcmwsIG1haW5fZnJhbWUpOwogCiAgIC8vIEFkZCBlbm91Z2ggZGF0YSB0byB0cmlnZ2VyIHRoZSBpbnRlcnZlbnRpb24uCi0gIFJlc291cmNlRGF0YVVwZGF0ZShhZF9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6Ok5PVF9DQUNIRUQsCisgIFJlc291cmNlRGF0YVVwZGF0ZShhZF9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsCiAgICAgICAgICAgICAgICAgICAgICAoaGVhdnlfYWRfdGhyZXNob2xkczo6a01heE5ldHdvcmtCeXRlcyAvIDEwMjQpICsgMSk7CiAKICAgaGlzdG9ncmFtX3Rlc3RlcigpLkV4cGVjdFRvdGFsQ291bnQoCkBAIC0xODg5LDcgKzE5MTMsNyBAQAogICBSZW5kZXJGcmFtZUhvc3QqIGFkX2ZyYW1lID0gQ3JlYXRlQW5kTmF2aWdhdGVTdWJGcmFtZShrQWRVcmwsIG1haW5fZnJhbWUpOwogCiAgIC8vIEFkZCBlbm91Z2ggZGF0YSB0byB0cmlnZ2VyIHRoZSBpbnRlcnZlbnRpb24uCi0gIFJlc291cmNlRGF0YVVwZGF0ZShhZF9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6Ok5PVF9DQUNIRUQsCisgIFJlc291cmNlRGF0YVVwZGF0ZShhZF9mcmFtZSwgUmVzb3VyY2VDYWNoZWQ6OmtOb3RDYWNoZWQsCiAgICAgICAgICAgICAgICAgICAgICAoaGVhdnlfYWRfdGhyZXNob2xkczo6a01heE5ldHdvcmtCeXRlcyAvIDEwMjQpICsgMSk7CiAKICAgLy8gVmVyaWZ5IHRoZSBpbnRlcnZlbnRpb24gdHJpZ2dlcmVkLgpAQCAtMTkwMyw3ICsxOTI3LDcgQEAKICAgYWRfZnJhbWUgPSBDcmVhdGVBbmROYXZpZ2F0ZVN1YkZyYW1lKGtBZFVybCwgbWFpbl9mcmFtZSk7CiAKICAgLy8gQWRkIGVub3VnaCBkYXRhIHRvIHRyaWdnZXIgdGhlIGludGVydmVudGlvbi4KLSAgUmVzb3VyY2VEYXRhVXBkYXRlKGFkX2ZyYW1lLCBSZXNvdXJjZUNhY2hlZDo6Tk9UX0NBQ0hFRCwKKyAgUmVzb3VyY2VEYXRhVXBkYXRlKGFkX2ZyYW1lLCBSZXNvdXJjZUNhY2hlZDo6a05vdENhY2hlZCwKICAgICAgICAgICAgICAgICAgICAgIChoZWF2eV9hZF90aHJlc2hvbGRzOjprTWF4TmV0d29ya0J5dGVzIC8gMTAyNCkgKyAxKTsKIAogICAvLyBWZXJpZnkgdGhlIGludGVydmVudGlvbiBkaWQgbm90IG9jY3VyIGFnYWluLgpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvcGFnZV9sb2FkX21ldHJpY3Mvb2JzZXJ2ZXJzL2FkX21ldHJpY3MvZnJhbWVfZGF0YS5jYyBiL2Nocm9tZS9icm93c2VyL3BhZ2VfbG9hZF9tZXRyaWNzL29ic2VydmVycy9hZF9tZXRyaWNzL2ZyYW1lX2RhdGEuY2MKaW5kZXggZmExNGRiYS4uODU0ODAyNyAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvcGFnZV9sb2FkX21ldHJpY3Mvb2JzZXJ2ZXJzL2FkX21ldHJpY3MvZnJhbWVfZGF0YS5jYworKysgYi9jaHJvbWUvYnJvd3Nlci9wYWdlX2xvYWRfbWV0cmljcy9vYnNlcnZlcnMvYWRfbWV0cmljcy9mcmFtZV9kYXRhLmNjCkBAIC0xMDEsMTAgKzEwMSw2IEBACiAgICAgY29uc3QgcGFnZV9sb2FkX21ldHJpY3M6Om1vam9tOjpSZXNvdXJjZURhdGFVcGRhdGVQdHImIHJlc291cmNlLAogICAgIGludCBwcm9jZXNzX2lkLAogICAgIGNvbnN0IHBhZ2VfbG9hZF9tZXRyaWNzOjpSZXNvdXJjZVRyYWNrZXImIHJlc291cmNlX3RyYWNrZXIpIHsKLSAgLy8gVE9ETyg5NjgxNDEpOiBVcGRhdGUgdGhlc2UgbWV0cmljcyB0byBpbmNsdWRlIHJlc291cmNlcyBsb2FkZWQgYnkgdGhlCi0gIC8vIG1lbW9yeSBjYWNoZS4KLSAgaWYgKHJlc291cmNlLT5jYWNoZV90eXBlID09IHBhZ2VfbG9hZF9tZXRyaWNzOjptb2pvbTo6Q2FjaGVUeXBlOjprTWVtb3J5KQotICAgIHJldHVybjsKICAgYm9vbCBpc19zYW1lX29yaWdpbiA9IG9yaWdpbl8uSXNTYW1lT3JpZ2luV2l0aChyZXNvdXJjZS0+b3JpZ2luKTsKICAgYnl0ZXNfICs9IHJlc291cmNlLT5kZWx0YV9ieXRlczsKICAgbmV0d29ya19ieXRlc18gKz0gcmVzb3VyY2UtPmRlbHRhX2J5dGVzOwpAQCAtMjU2LDcgKzI1Miw3IEBACiAgIGJ1aWxkZXIKICAgICAgIC5TZXRMb2FkaW5nX05ldHdvcmtCeXRlcygKICAgICAgICAgICB1a206OkdldEV4cG9uZW50aWFsQnVja2V0TWluRm9yQnl0ZXMobmV0d29ya19ieXRlcygpKSkKLSAgICAgIC5TZXRMb2FkaW5nX0NhY2hlQnl0ZXMoCisgICAgICAuU2V0TG9hZGluZ19DYWNoZUJ5dGVzMigKICAgICAgICAgICB1a206OkdldEV4cG9uZW50aWFsQnVja2V0TWluRm9yQnl0ZXMoKGJ5dGVzKCkgLSBuZXR3b3JrX2J5dGVzKCkpKSkKICAgICAgIC5TZXRMb2FkaW5nX1ZpZGVvQnl0ZXModWttOjpHZXRFeHBvbmVudGlhbEJ1Y2tldE1pbkZvckJ5dGVzKAogICAgICAgICAgIEdldEFkTmV0d29ya0J5dGVzRm9yTWltZShSZXNvdXJjZU1pbWVUeXBlOjprVmlkZW8pKSkKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3BhZ2VfbG9hZF9tZXRyaWNzL29ic2VydmVycy9jb3JlX3BhZ2VfbG9hZF9tZXRyaWNzX29ic2VydmVyX3VuaXR0ZXN0LmNjIGIvY2hyb21lL2Jyb3dzZXIvcGFnZV9sb2FkX21ldHJpY3Mvb2JzZXJ2ZXJzL2NvcmVfcGFnZV9sb2FkX21ldHJpY3Nfb2JzZXJ2ZXJfdW5pdHRlc3QuY2MKaW5kZXggZTU5NmNmZi4uOGZkZGE4ZCAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvcGFnZV9sb2FkX21ldHJpY3Mvb2JzZXJ2ZXJzL2NvcmVfcGFnZV9sb2FkX21ldHJpY3Nfb2JzZXJ2ZXJfdW5pdHRlc3QuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvcGFnZV9sb2FkX21ldHJpY3Mvb2JzZXJ2ZXJzL2NvcmVfcGFnZV9sb2FkX21ldHJpY3Nfb2JzZXJ2ZXJfdW5pdHRlc3QuY2MKQEAgLTMyOSw4ICszMjksNiBAQAogICAgICAgY29udGVudDo6TmF2aWdhdGlvblNpbXVsYXRvcjo6Q3JlYXRlUmVuZGVyZXJJbml0aWF0ZWQodXJsLCBtYWluX3JmaCgpKTsKICAgbmF2aWdhdGlvbi0+RmFpbChuZXQ6OkVSUl9USU1FRF9PVVQpOwogICBuYXZpZ2F0aW9uLT5BYm9ydENvbW1pdCgpOwotICBjb250ZW50OjpSZW5kZXJGcmFtZUhvc3RUZXN0ZXI6OkZvcihuYXZpZ2F0aW9uLT5HZXRGaW5hbFJlbmRlckZyYW1lSG9zdCgpKQotICAgICAgLT5TaW11bGF0ZU5hdmlnYXRpb25TdG9wKCk7CiAKICAgaGlzdG9ncmFtX3Rlc3RlcigpLkV4cGVjdFRvdGFsQ291bnQoaW50ZXJuYWw6OmtIaXN0b2dyYW1Eb21Db250ZW50TG9hZGVkLCAwKTsKICAgaGlzdG9ncmFtX3Rlc3RlcigpLkV4cGVjdFRvdGFsQ291bnQoaW50ZXJuYWw6OmtIaXN0b2dyYW1Mb2FkLCAwKTsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3BhZ2VfbG9hZF9tZXRyaWNzL29ic2VydmVycy91a21fcGFnZV9sb2FkX21ldHJpY3Nfb2JzZXJ2ZXJfdW5pdHRlc3QuY2MgYi9jaHJvbWUvYnJvd3Nlci9wYWdlX2xvYWRfbWV0cmljcy9vYnNlcnZlcnMvdWttX3BhZ2VfbG9hZF9tZXRyaWNzX29ic2VydmVyX3VuaXR0ZXN0LmNjCmluZGV4IDQxMzdhZDg1Li4wZTQ2OWJhNCAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvcGFnZV9sb2FkX21ldHJpY3Mvb2JzZXJ2ZXJzL3VrbV9wYWdlX2xvYWRfbWV0cmljc19vYnNlcnZlcl91bml0dGVzdC5jYworKysgYi9jaHJvbWUvYnJvd3Nlci9wYWdlX2xvYWRfbWV0cmljcy9vYnNlcnZlcnMvdWttX3BhZ2VfbG9hZF9tZXRyaWNzX29ic2VydmVyX3VuaXR0ZXN0LmNjCkBAIC0xODMsNyArMTgzLDcgQEAKICAgc3RkOjp1bmlxdWVfcHRyPGNvbnRlbnQ6Ok5hdmlnYXRpb25TaW11bGF0b3I+IG5hdmlnYXRpb24gPQogICAgICAgY29udGVudDo6TmF2aWdhdGlvblNpbXVsYXRvcjo6Q3JlYXRlUmVuZGVyZXJJbml0aWF0ZWQodXJsLCBtYWluX3JmaCgpKTsKICAgbmF2aWdhdGlvbi0+RmFpbChuZXQ6OkVSUl9USU1FRF9PVVQpOwotICBjb250ZW50OjpSZW5kZXJGcmFtZUhvc3RUZXN0ZXI6OkZvcihtYWluX3JmaCgpKS0+U2ltdWxhdGVOYXZpZ2F0aW9uU3RvcCgpOworICBuYXZpZ2F0aW9uLT5BYm9ydENvbW1pdCgpOwogCiAgIC8vIFNpbXVsYXRlIGNsb3NpbmcgdGhlIHRhYi4KICAgRGVsZXRlQ29udGVudHMoKTsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3BlcmZvcm1hbmNlX21hbmFnZXIvY2hyb21lX2NvbnRlbnRfYnJvd3Nlcl9jbGllbnRfcGVyZm9ybWFuY2VfbWFuYWdlcl9wYXJ0LmNjIGIvY2hyb21lL2Jyb3dzZXIvcGVyZm9ybWFuY2VfbWFuYWdlci9jaHJvbWVfY29udGVudF9icm93c2VyX2NsaWVudF9wZXJmb3JtYW5jZV9tYW5hZ2VyX3BhcnQuY2MKaW5kZXggZjczZDBlMGUuLmRjYjllMDBlIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9wZXJmb3JtYW5jZV9tYW5hZ2VyL2Nocm9tZV9jb250ZW50X2Jyb3dzZXJfY2xpZW50X3BlcmZvcm1hbmNlX21hbmFnZXJfcGFydC5jYworKysgYi9jaHJvbWUvYnJvd3Nlci9wZXJmb3JtYW5jZV9tYW5hZ2VyL2Nocm9tZV9jb250ZW50X2Jyb3dzZXJfY2xpZW50X3BlcmZvcm1hbmNlX21hbmFnZXJfcGFydC5jYwpAQCAtMTEsMTYgKzExLDE2IEBACiAjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvc2VxdWVuY2VkX3Rhc2tfcnVubmVyX2hhbmRsZS5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvcGVyZm9ybWFuY2VfbWFuYWdlci9ncmFwaC9wcm9jZXNzX25vZGVfaW1wbC5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvcGVyZm9ybWFuY2VfbWFuYWdlci9wZXJmb3JtYW5jZV9tYW5hZ2VyX2ltcGwuaCIKKyNpbmNsdWRlICJjb21wb25lbnRzL3BlcmZvcm1hbmNlX21hbmFnZXIvcHVibGljL21vam9tL2Nvb3JkaW5hdGlvbl91bml0Lm1vam9tLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9wZXJmb3JtYW5jZV9tYW5hZ2VyL3JlbmRlcl9wcm9jZXNzX3VzZXJfZGF0YS5oIgogI2luY2x1ZGUgImNvbnRlbnQvcHVibGljL2Jyb3dzZXIvcmVuZGVyX3Byb2Nlc3NfaG9zdC5oIgogI2luY2x1ZGUgIm1vam8vcHVibGljL2NwcC9iaW5kaW5ncy9wZW5kaW5nX3JlY2VpdmVyLmgiCi0jaW5jbHVkZSAic2VydmljZXMvcmVzb3VyY2VfY29vcmRpbmF0b3IvcHVibGljL21vam9tL2Nvb3JkaW5hdGlvbl91bml0Lm1vam9tLmgiCiAKIG5hbWVzcGFjZSB7CiAKIHZvaWQgQmluZFByb2Nlc3NOb2RlKAogICAgIGludCByZW5kZXJfcHJvY2Vzc19ob3N0X2lkLAotICAgIG1vam86OlBlbmRpbmdSZWNlaXZlcjxyZXNvdXJjZV9jb29yZGluYXRvcjo6bW9qb206OlByb2Nlc3NDb29yZGluYXRpb25Vbml0PgorICAgIG1vam86OlBlbmRpbmdSZWNlaXZlcjxwZXJmb3JtYW5jZV9tYW5hZ2VyOjptb2pvbTo6UHJvY2Vzc0Nvb3JkaW5hdGlvblVuaXQ+CiAgICAgICAgIHJlY2VpdmVyKSB7CiAgIGNvbnRlbnQ6OlJlbmRlclByb2Nlc3NIb3N0KiByZW5kZXJfcHJvY2Vzc19ob3N0ID0KICAgICAgIGNvbnRlbnQ6OlJlbmRlclByb2Nlc3NIb3N0OjpGcm9tSUQocmVuZGVyX3Byb2Nlc3NfaG9zdF9pZCk7CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9wZXJmb3JtYW5jZV9tYW5hZ2VyL2RlY29yYXRvcnMvZnJvemVuX2ZyYW1lX2FnZ3JlZ2F0b3IuY2MgYi9jaHJvbWUvYnJvd3Nlci9wZXJmb3JtYW5jZV9tYW5hZ2VyL2RlY29yYXRvcnMvZnJvemVuX2ZyYW1lX2FnZ3JlZ2F0b3IuY2MKaW5kZXggMzJiOTRmNS4uYWZhYTM2NTAgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3BlcmZvcm1hbmNlX21hbmFnZXIvZGVjb3JhdG9ycy9mcm96ZW5fZnJhbWVfYWdncmVnYXRvci5jYworKysgYi9jaHJvbWUvYnJvd3Nlci9wZXJmb3JtYW5jZV9tYW5hZ2VyL2RlY29yYXRvcnMvZnJvemVuX2ZyYW1lX2FnZ3JlZ2F0b3IuY2MKQEAgLTEyLDcgKzEyLDcgQEAKIAogbmFtZXNwYWNlIHBlcmZvcm1hbmNlX21hbmFnZXIgewogCi11c2luZyBMaWZlY3ljbGVTdGF0ZSA9IHJlc291cmNlX2Nvb3JkaW5hdG9yOjptb2pvbTo6TGlmZWN5Y2xlU3RhdGU7Cit1c2luZyBMaWZlY3ljbGVTdGF0ZSA9IHBlcmZvcm1hbmNlX21hbmFnZXI6Om1vam9tOjpMaWZlY3ljbGVTdGF0ZTsKIAogLy8gUHJvdmlkZXMgRnJvemVuRnJhbWVBZ2dyZWdhdG9yIG1hY2hpbmVyeSBhY2Nlc3MgdG8gc29tZSBpbnRlcm5hbHMgb2YgYQogLy8gUGFnZU5vZGVJbXBsIGFuZCBQcm9jZXNzTm9kZUltcGwuCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9wZXJmb3JtYW5jZV9tYW5hZ2VyL2RlY29yYXRvcnMvcGFnZV9hZ2dyZWdhdG9yLmNjIGIvY2hyb21lL2Jyb3dzZXIvcGVyZm9ybWFuY2VfbWFuYWdlci9kZWNvcmF0b3JzL3BhZ2VfYWdncmVnYXRvci5jYwppbmRleCAxZGM3MTMxLi45MmE0MWY4ZSAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvcGVyZm9ybWFuY2VfbWFuYWdlci9kZWNvcmF0b3JzL3BhZ2VfYWdncmVnYXRvci5jYworKysgYi9jaHJvbWUvYnJvd3Nlci9wZXJmb3JtYW5jZV9tYW5hZ2VyL2RlY29yYXRvcnMvcGFnZV9hZ2dyZWdhdG9yLmNjCkBAIC04LDExICs4LDExIEBACiAKICNpbmNsdWRlICJjb21wb25lbnRzL3BlcmZvcm1hbmNlX21hbmFnZXIvZ3JhcGgvbm9kZV9hdHRhY2hlZF9kYXRhX2ltcGwuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL3BlcmZvcm1hbmNlX21hbmFnZXIvZ3JhcGgvcGFnZV9ub2RlX2ltcGwuaCIKLSNpbmNsdWRlICJzZXJ2aWNlcy9yZXNvdXJjZV9jb29yZGluYXRvci9wdWJsaWMvbW9qb20vY29vcmRpbmF0aW9uX3VuaXQubW9qb20uaCIKKyNpbmNsdWRlICJjb21wb25lbnRzL3BlcmZvcm1hbmNlX21hbmFnZXIvcHVibGljL21vam9tL2Nvb3JkaW5hdGlvbl91bml0Lm1vam9tLmgiCiAKIG5hbWVzcGFjZSBwZXJmb3JtYW5jZV9tYW5hZ2VyIHsKIAotdXNpbmcgcmVzb3VyY2VfY29vcmRpbmF0b3I6Om1vam9tOjpJbnRlcnZlbnRpb25Qb2xpY3k7Cit1c2luZyBwZXJmb3JtYW5jZV9tYW5hZ2VyOjptb2pvbTo6SW50ZXJ2ZW50aW9uUG9saWN5OwogCiAvLyBQcm92aWRlcyBQYWdlQWdncmVnYXRvciBtYWNoaW5lcnkgYWNjZXNzIHRvIHNvbWUgaW50ZXJuYWxzCiAvLyBvZiBhIFBhZ2VOb2RlSW1wbC4KZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3BlcmZvcm1hbmNlX21hbmFnZXIvZGVjb3JhdG9ycy9wYWdlX2FnZ3JlZ2F0b3JfdW5pdHRlc3QuY2MgYi9jaHJvbWUvYnJvd3Nlci9wZXJmb3JtYW5jZV9tYW5hZ2VyL2RlY29yYXRvcnMvcGFnZV9hZ2dyZWdhdG9yX3VuaXR0ZXN0LmNjCmluZGV4IDcxNjQyMTUuLmZjNDAxYTFmIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9wZXJmb3JtYW5jZV9tYW5hZ2VyL2RlY29yYXRvcnMvcGFnZV9hZ2dyZWdhdG9yX3VuaXR0ZXN0LmNjCisrKyBiL2Nocm9tZS9icm93c2VyL3BlcmZvcm1hbmNlX21hbmFnZXIvZGVjb3JhdG9ycy9wYWdlX2FnZ3JlZ2F0b3JfdW5pdHRlc3QuY2MKQEAgLTgsMTMgKzgsMTMgQEAKICNpbmNsdWRlICJjb21wb25lbnRzL3BlcmZvcm1hbmNlX21hbmFnZXIvZ3JhcGgvZ3JhcGhfaW1wbF9vcGVyYXRpb25zLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9wZXJmb3JtYW5jZV9tYW5hZ2VyL2dyYXBoL3Byb2Nlc3Nfbm9kZV9pbXBsLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9wZXJmb3JtYW5jZV9tYW5hZ2VyL3B1YmxpYy9ncmFwaC9wYWdlX25vZGUuaCIKKyNpbmNsdWRlICJjb21wb25lbnRzL3BlcmZvcm1hbmNlX21hbmFnZXIvcHVibGljL21vam9tL2Nvb3JkaW5hdGlvbl91bml0Lm1vam9tLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9wZXJmb3JtYW5jZV9tYW5hZ2VyL3Rlc3Rfc3VwcG9ydC9ncmFwaF90ZXN0X2hhcm5lc3MuaCIKLSNpbmNsdWRlICJzZXJ2aWNlcy9yZXNvdXJjZV9jb29yZGluYXRvci9wdWJsaWMvbW9qb20vY29vcmRpbmF0aW9uX3VuaXQubW9qb20uaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKIAogbmFtZXNwYWNlIHBlcmZvcm1hbmNlX21hbmFnZXIgewogCi11c2luZyByZXNvdXJjZV9jb29yZGluYXRvcjo6bW9qb206OkludGVydmVudGlvblBvbGljeTsKK3VzaW5nIHBlcmZvcm1hbmNlX21hbmFnZXI6Om1vam9tOjpJbnRlcnZlbnRpb25Qb2xpY3k7CiAKIG5hbWVzcGFjZSB7CiAKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3BlcmZvcm1hbmNlX21hbmFnZXIvZ3JhcGgvcGFnZV9ub2RlX2ltcGxfYnJvd3NlcnRlc3QuY2MgYi9jaHJvbWUvYnJvd3Nlci9wZXJmb3JtYW5jZV9tYW5hZ2VyL2dyYXBoL3BhZ2Vfbm9kZV9pbXBsX2Jyb3dzZXJ0ZXN0LmNjCmluZGV4IDQ1ZTUxN2M4Li4zYTYzMTA1IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9wZXJmb3JtYW5jZV9tYW5hZ2VyL2dyYXBoL3BhZ2Vfbm9kZV9pbXBsX2Jyb3dzZXJ0ZXN0LmNjCisrKyBiL2Nocm9tZS9icm93c2VyL3BlcmZvcm1hbmNlX21hbmFnZXIvZ3JhcGgvcGFnZV9ub2RlX2ltcGxfYnJvd3NlcnRlc3QuY2MKQEAgLTE1NiwxNSArMTU2LDE0IEBACiB9CiAKIHZvaWQgUnVuT3JpZ2luVHJpYWxUZXN0T25QTVNlcXVlbmNlKAotICAgIGNvbnN0IHJlc291cmNlX2Nvb3JkaW5hdG9yOjptb2pvbTo6SW50ZXJ2ZW50aW9uUG9saWN5IGV4cGVjdGVkX3BvbGljeSkgeworICAgIGNvbnN0IG1vam9tOjpJbnRlcnZlbnRpb25Qb2xpY3kgZXhwZWN0ZWRfcG9saWN5KSB7CiAgIGF1dG8qIHBlcmZfbWFuYWdlciA9IFBlcmZvcm1hbmNlTWFuYWdlckltcGw6OkdldEluc3RhbmNlKCk7CiAgIEFTU0VSVF9UUlVFKHBlcmZfbWFuYWdlcik7CiAgIGJhc2U6OlJ1bkxvb3AgcnVuX2xvb3A7CiAgIHBlcmZfbWFuYWdlci0+Q2FsbE9uR3JhcGhJbXBsKAogICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZSgKICAgICAgICAgICAgICAgICAgICAgIFtdKGJhc2U6Ok9uY2VDbG9zdXJlIHF1aXRfY2xvc3VyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc291cmNlX2Nvb3JkaW5hdG9yOjptb2pvbTo6SW50ZXJ2ZW50aW9uUG9saWN5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9qb206OkludGVydmVudGlvblBvbGljeSBleHBlY3RlZF9wb2xpY3ksCiAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZV9tYW5hZ2VyOjpHcmFwaEltcGwqIGdyYXBoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gcGFnZV9ub2RlcyA9IGdyYXBoLT5HZXRBbGxQYWdlTm9kZUltcGxzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIEVYUEVDVF9FUSgxVSwgcGFnZV9ub2Rlcy5zaXplKCkpOwpAQCAtMjI1LDggKzIyNCw3IEBACiAgICAgICAgICAgICAgICAgICAgICB7a09yaWdpblRyaWFsVGVzdEhvc3RuYW1lLAogICAgICAgICAgICAgICAgICAgICAgIGtPcmlnaW5UcmlhbEZyZWV6ZVBvbGljeVRlc3RQYXRoLCBrT3JpZ2luVHJpYWxPcHRJblBhZ2V9LAogICAgICAgICAgICAgICAgICAgICAgIi8iKSkpOwotICBSdW5PcmlnaW5UcmlhbFRlc3RPblBNU2VxdWVuY2UoCi0gICAgICByZXNvdXJjZV9jb29yZGluYXRvcjo6bW9qb206OkludGVydmVudGlvblBvbGljeTo6a09wdEluKTsKKyAgUnVuT3JpZ2luVHJpYWxUZXN0T25QTVNlcXVlbmNlKG1vam9tOjpJbnRlcnZlbnRpb25Qb2xpY3k6OmtPcHRJbik7CiB9CiAKIElOX1BST0NfQlJPV1NFUl9URVNUX0YoUGFnZU5vZGVJbXBsQnJvd3NlclRlc3QsIFBhZ2VGcmVlemVPcmlnaW5UcmlhbE9wdE91dCkgewpAQCAtMjM1LDggKzIzMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICB7a09yaWdpblRyaWFsVGVzdEhvc3RuYW1lLAogICAgICAgICAgICAgICAgICAgICAgIGtPcmlnaW5UcmlhbEZyZWV6ZVBvbGljeVRlc3RQYXRoLCBrT3JpZ2luVHJpYWxPcHRPdXRQYWdlfSwKICAgICAgICAgICAgICAgICAgICAgICIvIikpKTsKLSAgUnVuT3JpZ2luVHJpYWxUZXN0T25QTVNlcXVlbmNlKAotICAgICAgcmVzb3VyY2VfY29vcmRpbmF0b3I6Om1vam9tOjpJbnRlcnZlbnRpb25Qb2xpY3k6OmtPcHRPdXQpOworICBSdW5PcmlnaW5UcmlhbFRlc3RPblBNU2VxdWVuY2UobW9qb206OkludGVydmVudGlvblBvbGljeTo6a09wdE91dCk7CiB9CiAKIElOX1BST0NfQlJPV1NFUl9URVNUX0YoUGFnZU5vZGVJbXBsQnJvd3NlclRlc3QsIFBhZ2VGcmVlemVPcmlnaW5UcmlhbERlZmF1bHQpIHsKQEAgLTI0NSw4ICsyNDIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtPcmlnaW5UcmlhbEZyZWV6ZVBvbGljeVRlc3RQYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtPcmlnaW5UcmlhbERlZmF1bHRQYWdlfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvIikpKTsKLSAgUnVuT3JpZ2luVHJpYWxUZXN0T25QTVNlcXVlbmNlKAotICAgICAgcmVzb3VyY2VfY29vcmRpbmF0b3I6Om1vam9tOjpJbnRlcnZlbnRpb25Qb2xpY3k6OmtEZWZhdWx0KTsKKyAgUnVuT3JpZ2luVHJpYWxUZXN0T25QTVNlcXVlbmNlKG1vam9tOjpJbnRlcnZlbnRpb25Qb2xpY3k6OmtEZWZhdWx0KTsKIH0KIAogSU5fUFJPQ19CUk9XU0VSX1RFU1RfRihQYWdlTm9kZUltcGxCcm93c2VyVGVzdCwKQEAgLTI1NSw4ICsyNTEsNyBAQAogICAgICAgYnJvd3NlcigpLCBHVVJMKGJhc2U6OkpvaW5TdHJpbmcoe2tPcmlnaW5UcmlhbFRlc3RIb3N0bmFtZSwgazJpRnJhbWVzUGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrT3JpZ2luVHJpYWxPcHRJbk9wdE91dH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLyIpKSk7Ci0gIFJ1bk9yaWdpblRyaWFsVGVzdE9uUE1TZXF1ZW5jZSgKLSAgICAgIHJlc291cmNlX2Nvb3JkaW5hdG9yOjptb2pvbTo6SW50ZXJ2ZW50aW9uUG9saWN5OjprT3B0T3V0KTsKKyAgUnVuT3JpZ2luVHJpYWxUZXN0T25QTVNlcXVlbmNlKG1vam9tOjpJbnRlcnZlbnRpb25Qb2xpY3k6OmtPcHRPdXQpOwogfQogCiBJTl9QUk9DX0JST1dTRVJfVEVTVF9GKFBhZ2VOb2RlSW1wbEJyb3dzZXJUZXN0LApAQCAtMjY1LDggKzI2MCw3IEBACiAgICAgICBicm93c2VyKCksIEdVUkwoYmFzZTo6Sm9pblN0cmluZyh7a09yaWdpblRyaWFsVGVzdEhvc3RuYW1lLCBrMmlGcmFtZXNQYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtPcmlnaW5UcmlhbE9wdE91dE9wdElufSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvIikpKTsKLSAgUnVuT3JpZ2luVHJpYWxUZXN0T25QTVNlcXVlbmNlKAotICAgICAgcmVzb3VyY2VfY29vcmRpbmF0b3I6Om1vam9tOjpJbnRlcnZlbnRpb25Qb2xpY3k6OmtPcHRPdXQpOworICBSdW5PcmlnaW5UcmlhbFRlc3RPblBNU2VxdWVuY2UobW9qb206OkludGVydmVudGlvblBvbGljeTo6a09wdE91dCk7CiB9CiAKIElOX1BST0NfQlJPV1NFUl9URVNUX0YoUGFnZU5vZGVJbXBsQnJvd3NlclRlc3QsCkBAIC0yNzUsOCArMjY5LDcgQEAKICAgICAgIGJyb3dzZXIoKSwgR1VSTChiYXNlOjpKb2luU3RyaW5nKHtrT3JpZ2luVHJpYWxUZXN0SG9zdG5hbWUsIGsyaUZyYW1lc1BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga09yaWdpblRyaWFsRGVmYXVsdE9wdElufSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvIikpKTsKLSAgUnVuT3JpZ2luVHJpYWxUZXN0T25QTVNlcXVlbmNlKAotICAgICAgcmVzb3VyY2VfY29vcmRpbmF0b3I6Om1vam9tOjpJbnRlcnZlbnRpb25Qb2xpY3k6OmtPcHRJbik7CisgIFJ1bk9yaWdpblRyaWFsVGVzdE9uUE1TZXF1ZW5jZShtb2pvbTo6SW50ZXJ2ZW50aW9uUG9saWN5OjprT3B0SW4pOwogfQogCiBJTl9QUk9DX0JST1dTRVJfVEVTVF9GKFBhZ2VOb2RlSW1wbEJyb3dzZXJUZXN0LApAQCAtMjg1LDggKzI3OCw3IEBACiAgICAgICBicm93c2VyKCksIEdVUkwoYmFzZTo6Sm9pblN0cmluZyh7a09yaWdpblRyaWFsVGVzdEhvc3RuYW1lLCBrMmlGcmFtZXNQYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtPcmlnaW5UcmlhbERlZmF1bHRPcHRPdXR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8iKSkpOwotICBSdW5PcmlnaW5UcmlhbFRlc3RPblBNU2VxdWVuY2UoCi0gICAgICByZXNvdXJjZV9jb29yZGluYXRvcjo6bW9qb206OkludGVydmVudGlvblBvbGljeTo6a09wdE91dCk7CisgIFJ1bk9yaWdpblRyaWFsVGVzdE9uUE1TZXF1ZW5jZShtb2pvbTo6SW50ZXJ2ZW50aW9uUG9saWN5OjprT3B0T3V0KTsKIH0KIAogSU5fUFJPQ19CUk9XU0VSX1RFU1RfRihQYWdlTm9kZUltcGxCcm93c2VyVGVzdCwKQEAgLTI5NSw4ICsyODcsNyBAQAogICAgICAgYnJvd3NlcigpLCBHVVJMKGJhc2U6OkpvaW5TdHJpbmcoe2tPcmlnaW5UcmlhbFRlc3RIb3N0bmFtZSwgazJpRnJhbWVzUGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrT3JpZ2luVHJpYWxPcHRJbk9wdElufSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvIikpKTsKLSAgUnVuT3JpZ2luVHJpYWxUZXN0T25QTVNlcXVlbmNlKAotICAgICAgcmVzb3VyY2VfY29vcmRpbmF0b3I6Om1vam9tOjpJbnRlcnZlbnRpb25Qb2xpY3k6OmtPcHRJbik7CisgIFJ1bk9yaWdpblRyaWFsVGVzdE9uUE1TZXF1ZW5jZShtb2pvbTo6SW50ZXJ2ZW50aW9uUG9saWN5OjprT3B0SW4pOwogfQogCiBJTl9QUk9DX0JST1dTRVJfVEVTVF9GKFBhZ2VOb2RlSW1wbEJyb3dzZXJUZXN0LApAQCAtMzA1LDggKzI5Niw3IEBACiAgICAgICBicm93c2VyKCksIEdVUkwoYmFzZTo6Sm9pblN0cmluZyh7a09yaWdpblRyaWFsVGVzdEhvc3RuYW1lLCBrMmlGcmFtZXNQYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtPcmlnaW5UcmlhbE9wdE91dE9wdE91dH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLyIpKSk7Ci0gIFJ1bk9yaWdpblRyaWFsVGVzdE9uUE1TZXF1ZW5jZSgKLSAgICAgIHJlc291cmNlX2Nvb3JkaW5hdG9yOjptb2pvbTo6SW50ZXJ2ZW50aW9uUG9saWN5OjprT3B0T3V0KTsKKyAgUnVuT3JpZ2luVHJpYWxUZXN0T25QTVNlcXVlbmNlKG1vam9tOjpJbnRlcnZlbnRpb25Qb2xpY3k6OmtPcHRPdXQpOwogfQogCiBJTl9QUk9DX0JST1dTRVJfVEVTVF9GKFBhZ2VOb2RlSW1wbEJyb3dzZXJUZXN0LApAQCAtMzE1LDggKzMwNSw3IEBACiAgICAgICBicm93c2VyKCksIEdVUkwoYmFzZTo6Sm9pblN0cmluZyh7a09yaWdpblRyaWFsVGVzdEhvc3RuYW1lLCBrMmlGcmFtZXNQYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtPcmlnaW5UcmlhbERlZmF1bHREZWZhdWx0fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvIikpKTsKLSAgUnVuT3JpZ2luVHJpYWxUZXN0T25QTVNlcXVlbmNlKAotICAgICAgcmVzb3VyY2VfY29vcmRpbmF0b3I6Om1vam9tOjpJbnRlcnZlbnRpb25Qb2xpY3k6OmtEZWZhdWx0KTsKKyAgUnVuT3JpZ2luVHJpYWxUZXN0T25QTVNlcXVlbmNlKG1vam9tOjpJbnRlcnZlbnRpb25Qb2xpY3k6OmtEZWZhdWx0KTsKIH0KIAogLy8gVE9ETyhzZWJtYXJjaGFuZCk6IEFkZCBtb3JlIHRlc3RzLCBlLmcuIGEgdGVzdCB3aGVyZSB0aGUgbWFpbiBmcmFtZSBhbmQgYQpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvcG9saWN5L2NvbmZpZ3VyYXRpb25fcG9saWN5X2hhbmRsZXJfbGlzdF9mYWN0b3J5LmNjIGIvY2hyb21lL2Jyb3dzZXIvcG9saWN5L2NvbmZpZ3VyYXRpb25fcG9saWN5X2hhbmRsZXJfbGlzdF9mYWN0b3J5LmNjCmluZGV4IDY5YmY4NDguLmI3NGM4N2YgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3BvbGljeS9jb25maWd1cmF0aW9uX3BvbGljeV9oYW5kbGVyX2xpc3RfZmFjdG9yeS5jYworKysgYi9jaHJvbWUvYnJvd3Nlci9wb2xpY3kvY29uZmlndXJhdGlvbl9wb2xpY3lfaGFuZGxlcl9saXN0X2ZhY3RvcnkuY2MKQEAgLTExODMsNyArMTE4MywxMCBAQAogICAgIGJhc2U6OlZhbHVlOjpUeXBlOjpCT09MRUFOIH0sCiAgIHsga2V5OjprVG90YWxNZW1vcnlMaW1pdE1iLAogICAgIHByZWZzOjprVG90YWxNZW1vcnlMaW1pdE1iLAotICAgIGJhc2U6OlZhbHVlOjpUeXBlOjpJTlRFR0VSIH0KKyAgICBiYXNlOjpWYWx1ZTo6VHlwZTo6SU5URUdFUiB9LAorICB7IGtleTo6a1RMUzEzSGFyZGVuaW5nRm9yTG9jYWxBbmNob3JzRW5hYmxlZCwKKyAgICBwcmVmczo6a1RMUzEzSGFyZGVuaW5nRm9yTG9jYWxBbmNob3JzRW5hYmxlZCwKKyAgICBiYXNlOjpWYWx1ZTo6VHlwZTo6Qk9PTEVBTiB9LAogfTsKIC8vIGNsYW5nLWZvcm1hdCBvbgogCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9wcmV2aWV3cy9oaW50c19mZXRjaGVyX2Jyb3dzZXJ0ZXN0LmNjIGIvY2hyb21lL2Jyb3dzZXIvcHJldmlld3MvaGludHNfZmV0Y2hlcl9icm93c2VydGVzdC5jYwppbmRleCA4YzFjN2RhLi45M2ZjOWM0MiAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvcHJldmlld3MvaGludHNfZmV0Y2hlcl9icm93c2VydGVzdC5jYworKysgYi9jaHJvbWUvYnJvd3Nlci9wcmV2aWV3cy9oaW50c19mZXRjaGVyX2Jyb3dzZXJ0ZXN0LmNjCkBAIC00NTksOSArNDU5LDggQEAKICAgICAgIHJldHVybjsKIAogICAgIGJhc2U6OmZsYXRfc2V0PHN0ZDo6c3RyaW5nPiBob3N0c19yZXF1ZXN0ZWQ7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBob3N0IDogaGludHNfcmVxdWVzdC5ob3N0cygpKSB7CisgICAgZm9yIChjb25zdCBhdXRvJiBob3N0IDogaGludHNfcmVxdWVzdC5ob3N0cygpKQogICAgICAgaG9zdHNfcmVxdWVzdGVkLmluc2VydChob3N0Lmhvc3QoKSk7Ci0gICAgfQogCiAgICAgRVhQRUNUX0VRKGV4cGVjdF9oaW50c19yZXF1ZXN0X2Zvcl9ob3N0c18udmFsdWUoKS5zaXplKCksCiAgICAgICAgICAgICAgIGhvc3RzX3JlcXVlc3RlZC5zaXplKCkpOwpAQCAtMTE2Niw3ICsxMTY1LDggQEAKICAgICAgICAgICAiT3B0aW1pemF0aW9uR3VpZGUuSGludHNGZXRjaGVyLk5hdmlnYXRpb25Ib3N0Q292ZXJlZEJ5RmV0Y2giLCBmYWxzZSwKICAgICAgICAgICA0KTsKICAgICB9Ci0gICAgRVhQRUNUX0VRKElzT3B0aW1pemF0aW9uR3VpZGVLZXllZFNlcnZpY2VFbmFibGVkKCkgPyA0dSA6IDF1LAorICAgIC8vIEhpbnRzIHNob3VsZCBub3QgYmUgZmV0Y2hlZCBmb3IgdGhlIHNhbWUgaG9zdCBhZ2Fpbi4KKyAgICBFWFBFQ1RfRVEoSXNPcHRpbWl6YXRpb25HdWlkZUtleWVkU2VydmljZUVuYWJsZWQoKSA/IDN1IDogMXUsCiAgICAgICAgICAgICAgIGNvdW50X2hpbnRzX3JlcXVlc3RzX3JlY2VpdmVkKCkpOwogICAgIFJldHJ5Rm9ySGlzdG9ncmFtVW50aWxDb3VudFJlYWNoZWQoCiAgICAgICAgIGhpc3RvZ3JhbV90ZXN0ZXIsIG9wdGltaXphdGlvbl9ndWlkZTo6a0xvYWRlZEhpbnRMb2NhbEhpc3RvZ3JhbVN0cmluZywKQEAgLTEzODgsMTEgKzEzODgsMTMgQEAKICAgICByZXR1cm47CiAKICAgLy8gUG9wdWxhdGUgZXhwZWN0ZWQgaG9zdHMgd2l0aCBob3N0cyBjb250YWluZWQgaW4gdGhlIGh0bWwgcmVzcG9uc2Ugb2YKLSAgLy8gc2VhcmNoX3Jlc3VsdHNfcGFnZV91cmwoKS4KKyAgLy8gc2VhcmNoX3Jlc3VsdHNfcGFnZV91cmwoKS4gZXhhbXBsZTIuY29tIGlzIGNvbnRhaW5lZCBpbiB0aGUgSFRNTAorICAvLyByZXNwb25zZSwgYnV0IGhpbnRzIGZvciBleGFtcGxlMi5jb20gbXVzdCBub3QgYmUgZmV0Y2hlZCBzaW5jZSB0aGV5CisgIC8vIHdlcmUgcHVzaGVkIHZpYSBrRmV0Y2hIaW50c092ZXJyaWRlIHN3aXRjaCBhYm92ZS4KICAgYmFzZTo6ZmxhdF9zZXQ8c3RkOjpzdHJpbmc+IGV4cGVjdGVkX2hvc3RzOwogICBleHBlY3RlZF9ob3N0cy5pbnNlcnQoR1VSTCgiaHR0cHM6Ly9mb28uY29tIikuaG9zdCgpKTsKICAgZXhwZWN0ZWRfaG9zdHMuaW5zZXJ0KEdVUkwoImh0dHBzOi8vZXhhbXBsZS5jb20iKS5ob3N0KCkpOwotICBleHBlY3RlZF9ob3N0cy5pbnNlcnQoR1VSTCgiaHR0cHM6Ly9leGFtcGxlMi5jb20iKS5ob3N0KCkpOworICBleHBlY3RlZF9ob3N0cy5pbnNlcnQoR1VSTCgiaHR0cHM6Ly9leGFtcGxlMy5jb20iKS5ob3N0KCkpOwogICBTZXRFeHBlY3RlZEhpbnRzUmVxdWVzdEZvckhvc3RzKGV4cGVjdGVkX2hvc3RzKTsKIAogICBoaXN0b2dyYW1fdGVzdGVyLT5FeHBlY3RUb3RhbENvdW50KApkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvcHJldmlld3MvcHJldmlld3NfbGl0ZV9wYWdlX3JlZGlyZWN0X2Jyb3dzZXJ0ZXN0LmNjIGIvY2hyb21lL2Jyb3dzZXIvcHJldmlld3MvcHJldmlld3NfbGl0ZV9wYWdlX3JlZGlyZWN0X2Jyb3dzZXJ0ZXN0LmNjCmluZGV4IDMyN2VlMDguLjhjNzZhZDMgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3ByZXZpZXdzL3ByZXZpZXdzX2xpdGVfcGFnZV9yZWRpcmVjdF9icm93c2VydGVzdC5jYworKysgYi9jaHJvbWUvYnJvd3Nlci9wcmV2aWV3cy9wcmV2aWV3c19saXRlX3BhZ2VfcmVkaXJlY3RfYnJvd3NlcnRlc3QuY2MKQEAgLTE2NDAsNiArMTY0MCwyNyBAQAogICB9CiB9CiAKK0lOX1BST0NfQlJPV1NFUl9URVNUX1AoCisgICAgUHJldmlld3NMaXRlUGFnZVJlZGlyZWN0U2VydmVyVGltZW91dEJyb3dzZXJUZXN0LAorICAgIERJU0FCTEVfT05fV0lOX01BQ19DSFJPTUVTT1MoCisgICAgICAgIExpdGVQYWdlUHJldmlld3NPcmlnaW5Qcm9iZV9FeHRlcm5hbEZhaWx1cmVSZXBvcnRlZCkpIHsKKyAgc2V0X29yaWdpbl9wcm9iZV9zdWNjZXNzKHRydWUpOworCisgIGJhc2U6Okhpc3RvZ3JhbVRlc3RlciBoaXN0b2dyYW1fdGVzdGVyOworICB1aV90ZXN0X3V0aWxzOjpOYXZpZ2F0ZVRvVVJMKGJyb3dzZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwc0xpdGVQYWdlVVJMKGtTdWNjZXNzLCBudWxscHRyLCAtMSkpOworICBWZXJpZnlQcmV2aWV3Tm90TG9hZGVkKCk7CisgIENsZWFyRGVjaWRlclN0YXRlKCk7CisgIGhpc3RvZ3JhbV90ZXN0ZXIuRXhwZWN0QnVja2V0Q291bnQoCisgICAgICAiUHJldmlld3MuU2VydmVyTGl0ZVBhZ2UuU2VydmVyUmVzcG9uc2UiLAorICAgICAgcHJldmlld3M6OkxpdGVQYWdlUmVkaXJlY3RTZXJ2ZXJSZXNwb25zZTo6a1RpbWVvdXQsIDEpOworCisgIFdhaXRGb3JTZXJ2ZXJQcm9iZSgpOworCisgIGhpc3RvZ3JhbV90ZXN0ZXIuRXhwZWN0VW5pcXVlU2FtcGxlKAorICAgICAgIkF2YWlsYWJpbGl0eS5Qcm9iZXIuRGlkU3VjY2VlZC5BZnRlclJlcG9ydGVkRmFpbHVyZS5MaXRlcGFnZXMiLCB0cnVlLCAxKTsKK30KKwogY2xhc3MgUHJldmlld3NMaXRlUGFnZVJlZGlyZWN0U2VydmVyQmFkU2VydmVyQnJvd3NlclRlc3QKICAgICA6IHB1YmxpYyBQcmV2aWV3c0xpdGVQYWdlUmVkaXJlY3RTZXJ2ZXJCcm93c2VyVGVzdCB7CiAgcHVibGljOgpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvcHJldmlld3MvcHJldmlld3NfbGl0ZV9wYWdlX3JlZGlyZWN0X2RlY2lkZXIuaCBiL2Nocm9tZS9icm93c2VyL3ByZXZpZXdzL3ByZXZpZXdzX2xpdGVfcGFnZV9yZWRpcmVjdF9kZWNpZGVyLmgKaW5kZXggZjcyYWM1MjI1Li5mNGRlY2I4IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9wcmV2aWV3cy9wcmV2aWV3c19saXRlX3BhZ2VfcmVkaXJlY3RfZGVjaWRlci5oCisrKyBiL2Nocm9tZS9icm93c2VyL3ByZXZpZXdzL3ByZXZpZXdzX2xpdGVfcGFnZV9yZWRpcmVjdF9kZWNpZGVyLmgKQEAgLTEyNCw2ICsxMjQsMTAgQEAKIAogICBib29sIGhhc19kcnBfaGVhZGVycygpIGNvbnN0IHsgcmV0dXJuIGRycF9oZWFkZXJzX3ZhbGlkXzsgfQogCisgIEF2YWlsYWJpbGl0eVByb2JlciogbGl0ZXBhZ2VzX3NlcnZpY2VfcHJvYmVyKCkgeworICAgIHJldHVybiBsaXRlcGFnZXNfc2VydmljZV9wcm9iZXJfLmdldCgpOworICB9CisKICBwcml2YXRlOgogICAvLyBBdmFpbGFiaWxpdHlQcm9iZXI6OkRlbGVnYXRlOgogICBib29sIFNob3VsZFNlbmROZXh0UHJvYmUoKSBvdmVycmlkZTsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3ByZXZpZXdzL3ByZXZpZXdzX2xpdGVfcGFnZV9yZWRpcmVjdF9zZXJ2aW5nX3VybF9sb2FkZXIuY2MgYi9jaHJvbWUvYnJvd3Nlci9wcmV2aWV3cy9wcmV2aWV3c19saXRlX3BhZ2VfcmVkaXJlY3Rfc2VydmluZ191cmxfbG9hZGVyLmNjCmluZGV4IDFiM2QxYjEuLmE4MjM0M2I2IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9wcmV2aWV3cy9wcmV2aWV3c19saXRlX3BhZ2VfcmVkaXJlY3Rfc2VydmluZ191cmxfbG9hZGVyLmNjCisrKyBiL2Nocm9tZS9icm93c2VyL3ByZXZpZXdzL3ByZXZpZXdzX2xpdGVfcGFnZV9yZWRpcmVjdF9zZXJ2aW5nX3VybF9sb2FkZXIuY2MKQEAgLTE0Nyw2ICsxNDcsMjYgQEAKICAgICAgIGJhc2U6OkJpbmRPbmNlKCZJbnZhbGlkYXRlRFJQQ29uZmlnT25VSVRocmVhZCwgZnJhbWVfdHJlZV9ub2RlX2lkKSk7CiB9CiAKK3ZvaWQgUmVwb3J0Q29ubmVjdGlvbkZhaWx1cmVPblVJVGhyZWFkKGludCBmcmFtZV90cmVlX25vZGVfaWQpIHsKKyAgYXV0byogd2ViX2NvbnRlbnRzID0KKyAgICAgIGNvbnRlbnQ6OldlYkNvbnRlbnRzOjpGcm9tRnJhbWVUcmVlTm9kZUlkKGZyYW1lX3RyZWVfbm9kZV9pZCk7CisgIC8vIElmIHRoZSBXZWJDb250ZW50cyBoYXMgYmVlbiBjbG9zZWQgdGhpcyBtYXkgYmUgbnVsbC4KKyAgaWYgKCF3ZWJfY29udGVudHMpCisgICAgcmV0dXJuOworCisgIFByZXZpZXdzU2VydmljZUZhY3Rvcnk6OkdldEZvclByb2ZpbGUoCisgICAgICBQcm9maWxlOjpGcm9tQnJvd3NlckNvbnRleHQod2ViX2NvbnRlbnRzLT5HZXRCcm93c2VyQ29udGV4dCgpKSkKKyAgICAgIC0+cHJldmlld3NfbGl0ZV9wYWdlX3JlZGlyZWN0X2RlY2lkZXIoKQorICAgICAgLT5saXRlcGFnZXNfc2VydmljZV9wcm9iZXIoKQorICAgICAgLT5SZXBvcnRFeHRlcm5hbEZhaWx1cmVBbmRSZXRyeSgpOworfQorCit2b2lkIFJlcG9ydENvbm5lY3Rpb25GYWlsdXJlKGludCBmcmFtZV90cmVlX25vZGVfaWQpIHsKKyAgYmFzZTo6UG9zdFRhc2soCisgICAgICBGUk9NX0hFUkUsIHtjb250ZW50OjpCcm93c2VyVGhyZWFkOjpVSSwgYmFzZTo6VGFza1ByaW9yaXR5OjpVU0VSX1ZJU0lCTEV9LAorICAgICAgYmFzZTo6QmluZE9uY2UoJlJlcG9ydENvbm5lY3Rpb25GYWlsdXJlT25VSVRocmVhZCwgZnJhbWVfdHJlZV9ub2RlX2lkKSk7Cit9CisKIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSBrQmxhY2tsaXN0RHVyYXRpb24gPSBiYXNlOjpUaW1lRGVsdGE6OkZyb21EYXlzKDMwKTsKIAogY29uc3QgbmV0OjpOZXR3b3JrVHJhZmZpY0Fubm90YXRpb25UYWcga1ByZXZpZXdzVHJhZmZpY0Fubm90YXRpb24gPQpAQCAtMjI1LDYgKzI0NSw3IEBACiAgIGlmIChyZXN1bHRfY2FsbGJhY2tfLmlzX251bGwoKSkKICAgICByZXR1cm47CiAKKyAgUmVwb3J0Q29ubmVjdGlvbkZhaWx1cmUoZnJhbWVfdHJlZV9ub2RlX2lkXyk7CiAgIFVNQV9ISVNUT0dSQU1fRU5VTUVSQVRJT04oIlByZXZpZXdzLlNlcnZlckxpdGVQYWdlLlNlcnZlclJlc3BvbnNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aWV3czo6TGl0ZVBhZ2VSZWRpcmVjdFNlcnZlclJlc3BvbnNlOjprVGltZW91dCk7CiAKQEAgLTQyNyw2ICs0NDgsOSBAQAogICAgIHJldHVybjsKICAgfQogCisgIGlmIChzdGF0dXMuZXJyb3JfY29kZSAhPSBuZXQ6Ok9LKQorICAgIFJlcG9ydENvbm5lY3Rpb25GYWlsdXJlKGZyYW1lX3RyZWVfbm9kZV9pZF8pOworCiAgIGJhc2U6OlVtYUhpc3RvZ3JhbVNwYXJzZSgKICAgICAgICJQcmV2aWV3cy5TZXJ2ZXJMaXRlUGFnZS5TZXJ2ZXJOZXRFcnJvci5CZWZvcmVDb21taXQiLAogICAgICAgLXN0YXR1cy5lcnJvcl9jb2RlKTsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3Byb2ZpbGVzL2F2YXRhcl9tZW51LmNjIGIvY2hyb21lL2Jyb3dzZXIvcHJvZmlsZXMvYXZhdGFyX21lbnUuY2MKaW5kZXggNThiNzJlZjQuLjI4NTM2NmYgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3Byb2ZpbGVzL2F2YXRhcl9tZW51LmNjCisrKyBiL2Nocm9tZS9icm93c2VyL3Byb2ZpbGVzL2F2YXRhcl9tZW51LmNjCkBAIC00Miw5ICs0Miw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgIEJyb3dzZXIqIGJyb3dzZXIpCiAgICAgOiBwcm9maWxlX2xpc3RfKFByb2ZpbGVMaXN0OjpDcmVhdGUocHJvZmlsZV9zdG9yYWdlKSksCiAgICAgICBtZW51X2FjdGlvbnNfKEF2YXRhck1lbnVBY3Rpb25zOjpDcmVhdGUoKSksCi0jaWYgQlVJTERGTEFHKEVOQUJMRV9TVVBFUlZJU0VEX1VTRVJTKQotICAgICAgc3VwZXJ2aXNlZF91c2VyX29ic2VydmVyXyh0aGlzKSwKLSNlbmRpZgogICAgICAgcHJvZmlsZV9zdG9yYWdlXyhwcm9maWxlX3N0b3JhZ2UpLAogICAgICAgb2JzZXJ2ZXJfKG9ic2VydmVyKSwKICAgICAgIGJyb3dzZXJfKGJyb3dzZXIpIHsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3Byb2ZpbGVzL2F2YXRhcl9tZW51LmggYi9jaHJvbWUvYnJvd3Nlci9wcm9maWxlcy9hdmF0YXJfbWVudS5oCmluZGV4IGVlNmZkNjJiLi4zOWFjYTI4IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9wcm9maWxlcy9hdmF0YXJfbWVudS5oCisrKyBiL2Nocm9tZS9icm93c2VyL3Byb2ZpbGVzL2F2YXRhcl9tZW51LmgKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlICJ1aS9nZngvaW1hZ2UvaW1hZ2UuaCIKIAogI2lmIEJVSUxERkxBRyhFTkFCTEVfU1VQRVJWSVNFRF9VU0VSUykKKyNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9zdXBlcnZpc2VkX3VzZXIvc3VwZXJ2aXNlZF91c2VyX3NlcnZpY2UuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9zdXBlcnZpc2VkX3VzZXIvc3VwZXJ2aXNlZF91c2VyX3NlcnZpY2Vfb2JzZXJ2ZXIuaCIKICNlbmRpZgogCkBAIC0zMSw3ICszMiw2IEBACiBjbGFzcyBCcm93c2VyOwogY2xhc3MgUHJvZmlsZUF0dHJpYnV0ZXNTdG9yYWdlOwogY2xhc3MgUHJvZmlsZUxpc3Q7Ci1jbGFzcyBTdXBlcnZpc2VkVXNlclNlcnZpY2U7CiAKIC8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbWVudS1saWtlIGludGVyZmFjZSB1c2VkIHRvIHNlbGVjdCBwcm9maWxlcywKIC8vIHN1Y2ggYXMgdGhlIGJ1YmJsZSB0aGF0IGFwcGVhcnMgd2hlbiB0aGUgYXZhdGFyIGljb24gaXMgY2xpY2tlZCBpbiB0aGUKQEAgLTE5Nyw3ICsxOTcsNyBAQAogI2lmIEJVSUxERkxBRyhFTkFCTEVfU1VQRVJWSVNFRF9VU0VSUykKICAgLy8gT2JzZXJ2ZXMgY2hhbmdlcyB0byBhIHN1cGVydmlzZWQgdXNlcidzIGN1c3RvZGlhbiBpbmZvLgogICBTY29wZWRPYnNlcnZlcjxTdXBlcnZpc2VkVXNlclNlcnZpY2UsIFN1cGVydmlzZWRVc2VyU2VydmljZU9ic2VydmVyPgotICAgICAgc3VwZXJ2aXNlZF91c2VyX29ic2VydmVyXzsKKyAgICAgIHN1cGVydmlzZWRfdXNlcl9vYnNlcnZlcl97dGhpc307CiAjZW5kaWYKIAogICAvLyBUaGUgc3RvcmFnZSB0aGF0IHByb3ZpZGVzIHRoZSBwcm9maWxlIGF0dHJpYnV0ZXMuIFdlYWsuCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9wcm9maWxlcy9wcm9maWxlX2Jyb3dzZXJ0ZXN0LmNjIGIvY2hyb21lL2Jyb3dzZXIvcHJvZmlsZXMvcHJvZmlsZV9icm93c2VydGVzdC5jYwppbmRleCA2NTJlYWMyLi4xN2I3NThjIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9wcm9maWxlcy9wcm9maWxlX2Jyb3dzZXJ0ZXN0LmNjCisrKyBiL2Nocm9tZS9icm93c2VyL3Byb2ZpbGVzL3Byb2ZpbGVfYnJvd3NlcnRlc3QuY2MKQEAgLTY3MSw1MyArNjcxLDYgQEAKICAgfQogfQogCi1jbGFzcyBQcm9maWxlV2l0aG91dE1lZGlhQ2FjaGVCcm93c2VyVGVzdCA6IHB1YmxpYyBQcm9maWxlQnJvd3NlclRlc3QgewotIHB1YmxpYzoKLSAgUHJvZmlsZVdpdGhvdXRNZWRpYUNhY2hlQnJvd3NlclRlc3QoKSB7Ci0gICAgZmVhdHVyZV9saXN0Xy5Jbml0QW5kRW5hYmxlRmVhdHVyZShmZWF0dXJlczo6a1VzZVNhbWVDYWNoZUZvck1lZGlhKTsKLSAgfQotCi0gIH5Qcm9maWxlV2l0aG91dE1lZGlhQ2FjaGVCcm93c2VyVGVzdCgpIG92ZXJyaWRlIHt9Ci0KLSBwcml2YXRlOgotICBiYXNlOjp0ZXN0OjpTY29wZWRGZWF0dXJlTGlzdCBmZWF0dXJlX2xpc3RfOwotfTsKLQotLy8gVmVyaWZpZXMgdGhhdCB3aGVuIGtVc2VTYW1lQ2FjaGVGb3JNZWRpYSBpcyBlbmFibGVkLCB0aGUgbWVkaWEKLS8vIFVSTFJlcXVlc3RDb250ZXh0IHVzZXMgdGhlIHNhbWUgZGlzayBjYWNoZSBhcyB0aGUgbWFpbiBvbmUuCi1JTl9QUk9DX0JST1dTRVJfVEVTVF9GKFByb2ZpbGVXaXRob3V0TWVkaWFDYWNoZUJyb3dzZXJUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICBOb1NlcGFyYXRlTWVkaWFDYWNoZSkgewotICBBU1NFUlRfVFJVRShlbWJlZGRlZF90ZXN0X3NlcnZlcigpLT5TdGFydCgpKTsKLQotICAvLyBEbyBhIG5vcm1hbCBsb2FkIHVzaW5nIHRoZSBtZWRpYSBVUkxSZXF1ZXN0Q29udGV4dCwgcG9wdWxhdGluZyB0aGUgY2FjaGUuCi0gIFNpbXBsZVVSTExvYWRlckhlbHBlciBzaW1wbGVfbG9hZGVyX2hlbHBlcigKLSAgICAgIC8vIFRPRE8oc3ZpbGxhcik6IHRoaXMgc2hvdWxkIGJlIG1lZGlhIHJlcXVlc3QKLSAgICAgIGNvbnRlbnQ6OkJyb3dzZXJDb250ZXh0OjpHZXREZWZhdWx0U3RvcmFnZVBhcnRpdGlvbihicm93c2VyKCktPnByb2ZpbGUoKSkKLSAgICAgICAgICAtPkdldFVSTExvYWRlckZhY3RvcnlGb3JCcm93c2VyUHJvY2VzcygpCi0gICAgICAgICAgLmdldCgpLAotICAgICAgZW1iZWRkZWRfdGVzdF9zZXJ2ZXIoKS0+R2V0VVJMKCIvY2FjaGV0aW1lIiksIG5ldDo6T0spOwotICBzaW1wbGVfbG9hZGVyX2hlbHBlci5XYWl0Rm9yQ29tcGxldGlvbigpOwotCi0gIC8vIENhY2hlLW9ubHkgbG9hZCBmcm9tIHRoZSBtYWluIHJlcXVlc3QgY29udGV4dCBzaG91bGQgc3VjY2VlZCwgc2luY2UgdGhlCi0gIC8vIG1lZGlhIHJlcXVlc3QgY29udGV4dCB1c2VzIHRoZSBzYW1lIGNhY2hlLgotICBTaW1wbGVVUkxMb2FkZXJIZWxwZXIgc2ltcGxlX2xvYWRlcl9oZWxwZXIyKAotICAgICAgY29udGVudDo6QnJvd3NlckNvbnRleHQ6OkdldERlZmF1bHRTdG9yYWdlUGFydGl0aW9uKGJyb3dzZXIoKS0+cHJvZmlsZSgpKQotICAgICAgICAgIC0+R2V0VVJMTG9hZGVyRmFjdG9yeUZvckJyb3dzZXJQcm9jZXNzKCkKLSAgICAgICAgICAuZ2V0KCksCi0gICAgICBlbWJlZGRlZF90ZXN0X3NlcnZlcigpLT5HZXRVUkwoIi9jYWNoZXRpbWUiKSwgbmV0OjpPSywKLSAgICAgIG5ldDo6TE9BRF9PTkxZX0ZST01fQ0FDSEUpOwotICBzaW1wbGVfbG9hZGVyX2hlbHBlcjIuV2FpdEZvckNvbXBsZXRpb24oKTsKLQotICAvLyBDYWNoZS1vbmx5IGxvYWQgZnJvbSB0aGUgbWVkaWEgcmVxdWVzdCBjb250ZXh0IHNob3VsZCBhbHNvIHN1Y2NlZWQuCi0gIFNpbXBsZVVSTExvYWRlckhlbHBlciBzaW1wbGVfbG9hZGVyX2hlbHBlcjMoCi0gICAgICBjb250ZW50OjpCcm93c2VyQ29udGV4dDo6R2V0RGVmYXVsdFN0b3JhZ2VQYXJ0aXRpb24oYnJvd3NlcigpLT5wcm9maWxlKCkpCi0gICAgICAgICAgLT5HZXRVUkxMb2FkZXJGYWN0b3J5Rm9yQnJvd3NlclByb2Nlc3MoKQotICAgICAgICAgIC5nZXQoKSwKLSAgICAgIGVtYmVkZGVkX3Rlc3Rfc2VydmVyKCktPkdldFVSTCgiL2NhY2hldGltZSIpLCBuZXQ6Ok9LLAotICAgICAgbmV0OjpMT0FEX09OTFlfRlJPTV9DQUNIRSk7Ci0gIHNpbXBsZV9sb2FkZXJfaGVscGVyMy5XYWl0Rm9yQ29tcGxldGlvbigpOwotfQotCiBuYW1lc3BhY2UgewogCiAvLyBXYXRjaGVzIGZvciB0aGUgZGVzdHJ1Y3Rpb24gb2YgdGhlIHNwZWNpZmllZCBwYXRoIChXaGljaCwgaW4gdGhlIHRlc3RzIHRoYXQKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3Jlc291cmNlX2Nvb3JkaW5hdG9yL3RhYl9saWZlY3ljbGVfdW5pdC5jYyBiL2Nocm9tZS9icm93c2VyL3Jlc291cmNlX2Nvb3JkaW5hdG9yL3RhYl9saWZlY3ljbGVfdW5pdC5jYwppbmRleCA3NjYzMmNhLi40MzM5YzUxIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZV9jb29yZGluYXRvci90YWJfbGlmZWN5Y2xlX3VuaXQuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvcmVzb3VyY2VfY29vcmRpbmF0b3IvdGFiX2xpZmVjeWNsZV91bml0LmNjCkBAIC0zODAsOSArMzgwLDkgQEAKIH0KIAogdm9pZCBUYWJMaWZlY3ljbGVVbml0U291cmNlOjpUYWJMaWZlY3ljbGVVbml0OjpVcGRhdGVMaWZlY3ljbGVTdGF0ZSgKLSAgICBtb2pvbTo6TGlmZWN5Y2xlU3RhdGUgc3RhdGUpIHsKKyAgICBwZXJmb3JtYW5jZV9tYW5hZ2VyOjptb2pvbTo6TGlmZWN5Y2xlU3RhdGUgc3RhdGUpIHsKICAgc3dpdGNoIChzdGF0ZSkgewotICAgIGNhc2UgbW9qb206OkxpZmVjeWNsZVN0YXRlOjprRnJvemVuOiB7CisgICAgY2FzZSBwZXJmb3JtYW5jZV9tYW5hZ2VyOjptb2pvbTo6TGlmZWN5Y2xlU3RhdGU6OmtGcm96ZW46IHsKICAgICAgIHN3aXRjaCAoR2V0U3RhdGUoKSkgewogICAgICAgICBjYXNlIExpZmVjeWNsZVVuaXRTdGF0ZTo6UEVORElOR19ESVNDQVJEOiB7CiAgICAgICAgICAgZnJlZXplX3RpbWVvdXRfdGltZXJfLT5TdG9wKCk7CkBAIC00MDUsNyArNDA1LDcgQEAKICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIGNhc2UgbW9qb206OkxpZmVjeWNsZVN0YXRlOjprUnVubmluZzogeworICAgIGNhc2UgcGVyZm9ybWFuY2VfbWFuYWdlcjo6bW9qb206OkxpZmVjeWNsZVN0YXRlOjprUnVubmluZzogewogICAgICAgU2V0U3RhdGUoTGlmZWN5Y2xlVW5pdFN0YXRlOjpBQ1RJVkUsCiAgICAgICAgICAgICAgICBTdGF0ZUNoYW5nZVJlYXNvbjo6UkVOREVSRVJfSU5JVElBVEVEKTsKICAgICAgIGJyZWFrOwpAQCAtNDE5LDcgKzQxOSw3IEBACiB9CiAKIHZvaWQgVGFiTGlmZWN5Y2xlVW5pdFNvdXJjZTo6VGFiTGlmZWN5Y2xlVW5pdDo6VXBkYXRlT3JpZ2luVHJpYWxGcmVlemVQb2xpY3koCi0gICAgbW9qb206OkludGVydmVudGlvblBvbGljeSBwb2xpY3kpIHsKKyAgICBwZXJmb3JtYW5jZV9tYW5hZ2VyOjptb2pvbTo6SW50ZXJ2ZW50aW9uUG9saWN5IHBvbGljeSkgewogICBvcmlnaW5fdHJpYWxfZnJlZXplX3BvbGljeV8gPSBwb2xpY3k7CiB9CiAKQEAgLTEwMjQsMTYgKzEwMjQsMTYgQEAKIAogICAvLyBBcHBseSBvcmlnaW4gdHJpYWwgb3B0LWluL29wdC1vdXQgKHBvbGljeSBpcyBwZXIgcGFnZSkuCiAgIHN3aXRjaCAob3JpZ2luX3RyaWFsX2ZyZWV6ZV9wb2xpY3lfKSB7Ci0gICAgY2FzZSBtb2pvbTo6SW50ZXJ2ZW50aW9uUG9saWN5OjprVW5rbm93bjoKKyAgICBjYXNlIHBlcmZvcm1hbmNlX21hbmFnZXI6Om1vam9tOjpJbnRlcnZlbnRpb25Qb2xpY3k6OmtVbmtub3duOgogICAgICAgZGVjaXNpb25fZGV0YWlscy0+QWRkUmVhc29uKERlY2lzaW9uRmFpbHVyZVJlYXNvbjo6T1JJR0lOX1RSSUFMX1VOS05PV04pOwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSBtb2pvbTo6SW50ZXJ2ZW50aW9uUG9saWN5OjprT3B0T3V0OgorICAgIGNhc2UgcGVyZm9ybWFuY2VfbWFuYWdlcjo6bW9qb206OkludGVydmVudGlvblBvbGljeTo6a09wdE91dDoKICAgICAgIGRlY2lzaW9uX2RldGFpbHMtPkFkZFJlYXNvbihEZWNpc2lvbkZhaWx1cmVSZWFzb246Ok9SSUdJTl9UUklBTF9PUFRfT1VUKTsKICAgICAgIGJyZWFrOwotICAgIGNhc2UgbW9qb206OkludGVydmVudGlvblBvbGljeTo6a09wdEluOgorICAgIGNhc2UgcGVyZm9ybWFuY2VfbWFuYWdlcjo6bW9qb206OkludGVydmVudGlvblBvbGljeTo6a09wdEluOgogICAgICAgZGVjaXNpb25fZGV0YWlscy0+QWRkUmVhc29uKERlY2lzaW9uU3VjY2Vzc1JlYXNvbjo6T1JJR0lOX1RSSUFMX09QVF9JTik7CiAgICAgICBicmVhazsKLSAgICBjYXNlIG1vam9tOjpJbnRlcnZlbnRpb25Qb2xpY3k6OmtEZWZhdWx0OgorICAgIGNhc2UgcGVyZm9ybWFuY2VfbWFuYWdlcjo6bW9qb206OkludGVydmVudGlvblBvbGljeTo6a0RlZmF1bHQ6CiAgICAgICAvLyBMZXQgb3RoZXIgaGV1cmlzdGljcyBkZXRlcm1pbmUgd2hldGhlciB0aGUgdGFiIGNhbiBiZSBmcm96ZW4uCiAgICAgICBicmVhazsKICAgfQpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvcmVzb3VyY2VfY29vcmRpbmF0b3IvdGFiX2xpZmVjeWNsZV91bml0LmggYi9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZV9jb29yZGluYXRvci90YWJfbGlmZWN5Y2xlX3VuaXQuaAppbmRleCA5ZmNkYzAwLi5mY2EwNDVmYyAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvcmVzb3VyY2VfY29vcmRpbmF0b3IvdGFiX2xpZmVjeWNsZV91bml0LmgKKysrIGIvY2hyb21lL2Jyb3dzZXIvcmVzb3VyY2VfY29vcmRpbmF0b3IvdGFiX2xpZmVjeWNsZV91bml0LmgKQEAgLTEzLDEwICsxMywxMCBAQAogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3Jlc291cmNlX2Nvb3JkaW5hdG9yL3RhYl9saWZlY3ljbGVfdW5pdF9leHRlcm5hbC5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3Jlc291cmNlX2Nvb3JkaW5hdG9yL3RhYl9saWZlY3ljbGVfdW5pdF9zb3VyY2UuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9yZXNvdXJjZV9jb29yZGluYXRvci90aW1lLmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9wZXJmb3JtYW5jZV9tYW5hZ2VyL3B1YmxpYy9tb2pvbS9jb29yZGluYXRpb25fdW5pdC5tb2pvbS5oIgogI2luY2x1ZGUgImNvbnRlbnQvcHVibGljL2Jyb3dzZXIvdmlzaWJpbGl0eS5oIgogI2luY2x1ZGUgImNvbnRlbnQvcHVibGljL2Jyb3dzZXIvd2ViX2NvbnRlbnRzX29ic2VydmVyLmgiCiAjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvY29tbW9uL3BhZ2VfaW1wb3J0YW5jZV9zaWduYWxzLmgiCi0jaW5jbHVkZSAic2VydmljZXMvcmVzb3VyY2VfY29vcmRpbmF0b3IvcHVibGljL21vam9tL2Nvb3JkaW5hdGlvbl91bml0Lm1vam9tLmgiCiAKIGNsYXNzIFRhYlN0cmlwTW9kZWw7CiAKQEAgLTg4LDEwICs4OCwxMSBAQAogCiAgIC8vIFVwZGF0ZXMgdGhlIHRhYidzIGxpZmVjeWNsZSBzdGF0ZSB3aGVuIGNoYW5nZWQgb3V0c2lkZSB0aGUgdGFiIGxpZmVjeWNsZQogICAvLyB1bml0LgotICB2b2lkIFVwZGF0ZUxpZmVjeWNsZVN0YXRlKG1vam9tOjpMaWZlY3ljbGVTdGF0ZSBzdGF0ZSk7CisgIHZvaWQgVXBkYXRlTGlmZWN5Y2xlU3RhdGUocGVyZm9ybWFuY2VfbWFuYWdlcjo6bW9qb206OkxpZmVjeWNsZVN0YXRlIHN0YXRlKTsKIAogICAvLyBVcGRhdGVzIHRoZSB0YWIncyBvcmlnaW4gdHJpYWwgZnJlZXplIHBvbGljeS4KLSAgdm9pZCBVcGRhdGVPcmlnaW5UcmlhbEZyZWV6ZVBvbGljeShtb2pvbTo6SW50ZXJ2ZW50aW9uUG9saWN5IHBvbGljeSk7CisgIHZvaWQgVXBkYXRlT3JpZ2luVHJpYWxGcmVlemVQb2xpY3koCisgICAgICBwZXJmb3JtYW5jZV9tYW5hZ2VyOjptb2pvbTo6SW50ZXJ2ZW50aW9uUG9saWN5IHBvbGljeSk7CiAKICAgLy8gU2V0dGVycyBmb3IgdGhlIFdlYkxvY2sgYW5kIEluZGV4ZWREQiBsb2NrIHVzYWdlIHByb3BlcnRpZXMuCiAgIHZvaWQgU2V0SXNIb2xkaW5nV2ViTG9jayhib29sIGlzX2hvbGRpbmdfd2VibG9jayk7CkBAIC0yMTIsOCArMjEzLDggQEAKIAogICAvLyBUaGUgZnJlZXplIHBvbGljeSBzZXQgdmlhIG9yaWdpbiB0cmlhbC4gSW5pdGlhbCB2YWx1ZSBpcyBrRGVmYXVsdCB0byBhdm9pZAogICAvLyBhZmZlY3RpbmcgQ2FuRnJlZXplKCkgYmVmb3JlIHRoZSBwb2xpY3kgaXMgc2V0IGZvciB0aGUgZmlyc3QgdGltZS4KLSAgbW9qb206OkludGVydmVudGlvblBvbGljeSBvcmlnaW5fdHJpYWxfZnJlZXplX3BvbGljeV8gPQotICAgICAgbW9qb206OkludGVydmVudGlvblBvbGljeTo6a0RlZmF1bHQ7CisgIHBlcmZvcm1hbmNlX21hbmFnZXI6Om1vam9tOjpJbnRlcnZlbnRpb25Qb2xpY3kgb3JpZ2luX3RyaWFsX2ZyZWV6ZV9wb2xpY3lfID0KKyAgICAgIHBlcmZvcm1hbmNlX21hbmFnZXI6Om1vam9tOjpJbnRlcnZlbnRpb25Qb2xpY3k6OmtEZWZhdWx0OwogCiAgIC8vIE1haW50YWlucyB0aGUgbW9zdCByZWNlbnQgTGlmZWN5Y2xlVW5pdERpc2NhcmRSZWFzb24gdGhhdCB3YXMgcGFzc2VkIGludG8KICAgLy8gRGlzY2FyZCgpLgpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvcmVzb3VyY2VfY29vcmRpbmF0b3IvdGFiX2xpZmVjeWNsZV91bml0X3NvdXJjZS5jYyBiL2Nocm9tZS9icm93c2VyL3Jlc291cmNlX2Nvb3JkaW5hdG9yL3RhYl9saWZlY3ljbGVfdW5pdF9zb3VyY2UuY2MKaW5kZXggYmEzMjMyYzYuLjZiNjJjNDIgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3Jlc291cmNlX2Nvb3JkaW5hdG9yL3RhYl9saWZlY3ljbGVfdW5pdF9zb3VyY2UuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvcmVzb3VyY2VfY29vcmRpbmF0b3IvdGFiX2xpZmVjeWNsZV91bml0X3NvdXJjZS5jYwpAQCAtNzcsNyArNzcsNyBAQAogIHByaXZhdGU6CiAgIHN0YXRpYyB2b2lkIE9uTGlmZWN5Y2xlU3RhdGVDaGFuZ2VkSW1wbCgKICAgICAgIGNvbnN0IFdlYkNvbnRlbnRzUHJveHkmIGNvbnRlbnRzX3Byb3h5LAotICAgICAgbW9qb206OkxpZmVjeWNsZVN0YXRlIHN0YXRlKSB7CisgICAgICBwZXJmb3JtYW5jZV9tYW5hZ2VyOjptb2pvbTo6TGlmZWN5Y2xlU3RhdGUgc3RhdGUpIHsKICAgICBEQ0hFQ0tfQ1VSUkVOVExZX09OKGNvbnRlbnQ6OkJyb3dzZXJUaHJlYWQ6OlVJKTsKICAgICAvLyBJZiB0aGUgd2ViIGNvbnRlbnRzIGlzIHN0aWxsIGFsaXZlIHRoZW4gZGlzcGF0Y2ggdG8gdGhlIGFjdHVhbAogICAgIC8vIGltcGxlbWVudGF0aW9uIGluIFRhYkxpZmVjeWNsZVVuaXRTb3VyY2UuCkBAIC04Nyw3ICs4Nyw3IEBACiAKICAgc3RhdGljIHZvaWQgT25PcmlnaW5UcmlhbEZyZWV6ZVBvbGljeUNoYW5nZWRJbXBsKAogICAgICAgY29uc3QgV2ViQ29udGVudHNQcm94eSYgY29udGVudHNfcHJveHksCi0gICAgICBtb2pvbTo6SW50ZXJ2ZW50aW9uUG9saWN5IHBvbGljeSkgeworICAgICAgcGVyZm9ybWFuY2VfbWFuYWdlcjo6bW9qb206OkludGVydmVudGlvblBvbGljeSBwb2xpY3kpIHsKICAgICBEQ0hFQ0tfQ1VSUkVOVExZX09OKGNvbnRlbnQ6OkJyb3dzZXJUaHJlYWQ6OlVJKTsKICAgICAvLyBJZiB0aGUgd2ViIGNvbnRlbnRzIGlzIHN0aWxsIGFsaXZlIHRoZW4gZGlzcGF0Y2ggdG8gdGhlIGFjdHVhbAogICAgIC8vIGltcGxlbWVudGF0aW9uIGluIFRhYkxpZmVjeWNsZVVuaXRTb3VyY2UuCkBAIC00MDQsNyArNDA0LDcgQEAKIC8vIHN0YXRpYwogdm9pZCBUYWJMaWZlY3ljbGVVbml0U291cmNlOjpPbkxpZmVjeWNsZVN0YXRlQ2hhbmdlZCgKICAgICBjb250ZW50OjpXZWJDb250ZW50cyogd2ViX2NvbnRlbnRzLAotICAgIG1vam9tOjpMaWZlY3ljbGVTdGF0ZSBzdGF0ZSkgeworICAgIHBlcmZvcm1hbmNlX21hbmFnZXI6Om1vam9tOjpMaWZlY3ljbGVTdGF0ZSBzdGF0ZSkgewogICBUYWJMaWZlY3ljbGVVbml0KiBsaWZlY3ljbGVfdW5pdCA9IEdldFRhYkxpZmVjeWNsZVVuaXQod2ViX2NvbnRlbnRzKTsKIAogICAvLyBTb21lIFdlYkNvbnRlbnRzIGFyZW4ndCBhdHRhY2hlZCB0byBhIHRhYiwgc28gdGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZwpAQCAtNDE3LDcgKzQxNyw3IEBACiAvLyBzdGF0aWMKIHZvaWQgVGFiTGlmZWN5Y2xlVW5pdFNvdXJjZTo6T25PcmlnaW5UcmlhbEZyZWV6ZVBvbGljeUNoYW5nZWQoCiAgICAgY29udGVudDo6V2ViQ29udGVudHMqIHdlYl9jb250ZW50cywKLSAgICBtb2pvbTo6SW50ZXJ2ZW50aW9uUG9saWN5IHBvbGljeSkgeworICAgIHBlcmZvcm1hbmNlX21hbmFnZXI6Om1vam9tOjpJbnRlcnZlbnRpb25Qb2xpY3kgcG9saWN5KSB7CiAgIFRhYkxpZmVjeWNsZVVuaXQqIGxpZmVjeWNsZV91bml0ID0gR2V0VGFiTGlmZWN5Y2xlVW5pdCh3ZWJfY29udGVudHMpOwogCiAgIC8vIFNvbWUgV2ViQ29udGVudHMgYXJlbid0IGF0dGFjaGVkIHRvIGEgdGFiLCBzbyB0aGVyZSBpcyBubyBjb3JyZXNwb25kaW5nCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZV9jb29yZGluYXRvci90YWJfbGlmZWN5Y2xlX3VuaXRfc291cmNlLmggYi9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZV9jb29yZGluYXRvci90YWJfbGlmZWN5Y2xlX3VuaXRfc291cmNlLmgKaW5kZXggMjM4N2UwNWYuLjhkZTcwNDMgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3Jlc291cmNlX2Nvb3JkaW5hdG9yL3RhYl9saWZlY3ljbGVfdW5pdF9zb3VyY2UuaAorKysgYi9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZV9jb29yZGluYXRvci90YWJfbGlmZWN5Y2xlX3VuaXRfc291cmNlLmgKQEAgLTE0LDggKzE0LDggQEAKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS9icm93c2VyX2xpc3Rfb2JzZXJ2ZXIuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS9icm93c2VyX3RhYl9zdHJpcF90cmFja2VyLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvdGFicy90YWJfc3RyaXBfbW9kZWxfb2JzZXJ2ZXIuaCIKLSNpbmNsdWRlICJzZXJ2aWNlcy9yZXNvdXJjZV9jb29yZGluYXRvci9wdWJsaWMvbW9qb20vY29vcmRpbmF0aW9uX3VuaXQubW9qb20uaCIKLSNpbmNsdWRlICJzZXJ2aWNlcy9yZXNvdXJjZV9jb29yZGluYXRvci9wdWJsaWMvbW9qb20vbGlmZWN5Y2xlLm1vam9tLmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9wZXJmb3JtYW5jZV9tYW5hZ2VyL3B1YmxpYy9tb2pvbS9jb29yZGluYXRpb25fdW5pdC5tb2pvbS5oIgorI2luY2x1ZGUgImNvbXBvbmVudHMvcGVyZm9ybWFuY2VfbWFuYWdlci9wdWJsaWMvbW9qb20vbGlmZWN5Y2xlLm1vam9tLmgiCiAKIGNsYXNzIFByZWZDaGFuZ2VSZWdpc3RyYXI7CiBjbGFzcyBQcmVmU2VydmljZTsKQEAgLTE0OSwxMSArMTQ5LDEyIEBACiAKICAgLy8gVGhpcyBpcyBjYWxsZWQgaW5kaXJlY3RseSBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIGV2ZW50IG9uIGEgUGFnZU5vZGUgaW4gdGhlCiAgIC8vIHBlcmZvcm1hbmNlX21hbmFnZXIgR3JhcGguCi0gIHN0YXRpYyB2b2lkIE9uTGlmZWN5Y2xlU3RhdGVDaGFuZ2VkKGNvbnRlbnQ6OldlYkNvbnRlbnRzKiB3ZWJfY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vam9tOjpMaWZlY3ljbGVTdGF0ZSBzdGF0ZSk7CisgIHN0YXRpYyB2b2lkIE9uTGlmZWN5Y2xlU3RhdGVDaGFuZ2VkKAorICAgICAgY29udGVudDo6V2ViQ29udGVudHMqIHdlYl9jb250ZW50cywKKyAgICAgIHBlcmZvcm1hbmNlX21hbmFnZXI6Om1vam9tOjpMaWZlY3ljbGVTdGF0ZSBzdGF0ZSk7CiAgIHN0YXRpYyB2b2lkIE9uT3JpZ2luVHJpYWxGcmVlemVQb2xpY3lDaGFuZ2VkKAogICAgICAgY29udGVudDo6V2ViQ29udGVudHMqIHdlYl9jb250ZW50cywKLSAgICAgIG1vam9tOjpJbnRlcnZlbnRpb25Qb2xpY3kgcG9saWN5KTsKKyAgICAgIHBlcmZvcm1hbmNlX21hbmFnZXI6Om1vam9tOjpJbnRlcnZlbnRpb25Qb2xpY3kgcG9saWN5KTsKICAgc3RhdGljIHZvaWQgT25Jc0hvbGRpbmdXZWJMb2NrQ2hhbmdlZChjb250ZW50OjpXZWJDb250ZW50cyogd2ViX2NvbnRlbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfaG9sZGluZ193ZWJsb2NrKTsKICAgc3RhdGljIHZvaWQgT25Jc0hvbGRpbmdJbmRleGVkREJMb2NrQ2hhbmdlZCgKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3Jlc291cmNlX2Nvb3JkaW5hdG9yL3RhYl9saWZlY3ljbGVfdW5pdF9zb3VyY2VfdW5pdHRlc3QuY2MgYi9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZV9jb29yZGluYXRvci90YWJfbGlmZWN5Y2xlX3VuaXRfc291cmNlX3VuaXR0ZXN0LmNjCmluZGV4IDE5MGJiMmIuLjVhZWRlMDUgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3Jlc291cmNlX2Nvb3JkaW5hdG9yL3RhYl9saWZlY3ljbGVfdW5pdF9zb3VyY2VfdW5pdHRlc3QuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvcmVzb3VyY2VfY29vcmRpbmF0b3IvdGFiX2xpZmVjeWNsZV91bml0X3NvdXJjZV91bml0dGVzdC5jYwpAQCAtNjMwLDcgKzYzMCw4IEBACiAKICAgLy8gVGFiIGNhbm5vdCBiZSBmcm96ZW4gaWYgaXQgb3B0ZWQtb3V0IHZpYSBvcmlnaW4gdHJpYWwuCiAgIFRhYkxpZmVjeWNsZVVuaXRTb3VyY2U6Ok9uT3JpZ2luVHJpYWxGcmVlemVQb2xpY3lDaGFuZ2VkKAotICAgICAgYmFja2dyb3VuZF9jb250ZW50cywgbW9qb206OkludGVydmVudGlvblBvbGljeTo6a09wdE91dCk7CisgICAgICBiYWNrZ3JvdW5kX2NvbnRlbnRzLAorICAgICAgcGVyZm9ybWFuY2VfbWFuYWdlcjo6bW9qb206OkludGVydmVudGlvblBvbGljeTo6a09wdE91dCk7CiAgIEVYUEVDVF9GQUxTRShiYWNrZ3JvdW5kX2xpZmVjeWNsZV91bml0LT5DYW5GcmVlemUoJmRlY2lzaW9uX2RldGFpbHMpKTsKICAgRVhQRUNUX0ZBTFNFKGRlY2lzaW9uX2RldGFpbHMuSXNQb3NpdGl2ZSgpKTsKICAgRVhQRUNUX0VRKERlY2lzaW9uRmFpbHVyZVJlYXNvbjo6T1JJR0lOX1RSSUFMX09QVF9PVVQsCkBAIC02NTYsNyArNjU3LDggQEAKIAogICAvLyBUYWIgY2Fubm90IGJlIGZyb3plbiBpZiBpdHMgb3JpZ2luIHRyaWFsIHBvbGljeSBpcyBzdGlsbCB1bmtub3duLgogICBUYWJMaWZlY3ljbGVVbml0U291cmNlOjpPbk9yaWdpblRyaWFsRnJlZXplUG9saWN5Q2hhbmdlZCgKLSAgICAgIGJhY2tncm91bmRfY29udGVudHMsIG1vam9tOjpJbnRlcnZlbnRpb25Qb2xpY3k6OmtVbmtub3duKTsKKyAgICAgIGJhY2tncm91bmRfY29udGVudHMsCisgICAgICBwZXJmb3JtYW5jZV9tYW5hZ2VyOjptb2pvbTo6SW50ZXJ2ZW50aW9uUG9saWN5OjprVW5rbm93bik7CiAgIEVYUEVDVF9GQUxTRShiYWNrZ3JvdW5kX2xpZmVjeWNsZV91bml0LT5DYW5GcmVlemUoJmRlY2lzaW9uX2RldGFpbHMpKTsKICAgRVhQRUNUX0ZBTFNFKGRlY2lzaW9uX2RldGFpbHMuSXNQb3NpdGl2ZSgpKTsKICAgRVhQRUNUX0VRKERlY2lzaW9uRmFpbHVyZVJlYXNvbjo6T1JJR0lOX1RSSUFMX1VOS05PV04sCkBAIC03MDAsNyArNzAyLDggQEAKICAgLy8gVGhlIGJhY2tncm91bmQgdGFiIGNhbiBiZSBmcm96ZW4gaWYgaXQgb3B0ZWQtaW4gdmlhIG9yaWdpbiB0cmlhbCwgZXZlbiBpZgogICAvLyBpdCB1c2VzIG5vdGlmaWNhdGlvbnMgaW4gYmFja2dyb3VuZC4KICAgVGFiTGlmZWN5Y2xlVW5pdFNvdXJjZTo6T25PcmlnaW5UcmlhbEZyZWV6ZVBvbGljeUNoYW5nZWQoCi0gICAgICBiYWNrZ3JvdW5kX2NvbnRlbnRzLCBtb2pvbTo6SW50ZXJ2ZW50aW9uUG9saWN5OjprT3B0SW4pOworICAgICAgYmFja2dyb3VuZF9jb250ZW50cywKKyAgICAgIHBlcmZvcm1hbmNlX21hbmFnZXI6Om1vam9tOjpJbnRlcnZlbnRpb25Qb2xpY3k6OmtPcHRJbik7CiAgIEVYUEVDVF9UUlVFKGJhY2tncm91bmRfbGlmZWN5Y2xlX3VuaXQtPkNhbkZyZWV6ZSgmZGVjaXNpb25fZGV0YWlscykpOwogICBFWFBFQ1RfVFJVRShkZWNpc2lvbl9kZXRhaWxzLklzUG9zaXRpdmUoKSk7CiAgIEVYUEVDVF9FUShEZWNpc2lvblN1Y2Nlc3NSZWFzb246Ok9SSUdJTl9UUklBTF9PUFRfSU4sCkBAIC03MDksNyArNzEyLDggQEAKIAogICAvLyBUaGUgZm9yZWdyb3VuZCB0YWIgY2Fubm90IGJlIGZyb3plbiwgZXZlbiBpZiBpdCBvcHRlZC1pbiB2aWEgb3JpZ2luIHRyaWFsLgogICBUYWJMaWZlY3ljbGVVbml0U291cmNlOjpPbk9yaWdpblRyaWFsRnJlZXplUG9saWN5Q2hhbmdlZCgKLSAgICAgIGZvcmVncm91bmRfY29udGVudHMsIG1vam9tOjpJbnRlcnZlbnRpb25Qb2xpY3k6OmtPcHRJbik7CisgICAgICBmb3JlZ3JvdW5kX2NvbnRlbnRzLAorICAgICAgcGVyZm9ybWFuY2VfbWFuYWdlcjo6bW9qb206OkludGVydmVudGlvblBvbGljeTo6a09wdEluKTsKICAgRVhQRUNUX0ZBTFNFKGZvcmVncm91bmRfbGlmZWN5Y2xlX3VuaXQtPkNhbkZyZWV6ZSgmZGVjaXNpb25fZGV0YWlscykpOwogICBFWFBFQ1RfRkFMU0UoZGVjaXNpb25fZGV0YWlscy5Jc1Bvc2l0aXZlKCkpOwogICBFWFBFQ1RfRVEoRGVjaXNpb25GYWlsdXJlUmVhc29uOjpMSVZFX1NUQVRFX1ZJU0lCTEUsCkBAIC03ODEsNyArNzg1LDggQEAKIAogICByZWludGVycHJldF9jYXN0PFRhYkxpZmVjeWNsZVVuaXRTb3VyY2U6OlRhYkxpZmVjeWNsZVVuaXQqPigKICAgICAgIGJhY2tncm91bmRfbGlmZWN5Y2xlX3VuaXQpCi0gICAgICAtPlVwZGF0ZUxpZmVjeWNsZVN0YXRlKG1vam9tOjpMaWZlY3ljbGVTdGF0ZTo6a0Zyb3plbik7CisgICAgICAtPlVwZGF0ZUxpZmVjeWNsZVN0YXRlKAorICAgICAgICAgIHBlcmZvcm1hbmNlX21hbmFnZXI6Om1vam9tOjpMaWZlY3ljbGVTdGF0ZTo6a0Zyb3plbik7CiAgIEVYUEVDVF9FUShMaWZlY3ljbGVVbml0U3RhdGU6OkRJU0NBUkRFRCwKICAgICAgICAgICAgIGJhY2tncm91bmRfbGlmZWN5Y2xlX3VuaXQtPkdldFN0YXRlKCkpOwogICBFWFBFQ1RfQ0FMTCh0YWJfb2JzZXJ2ZXJfLApkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvcmVzb3VyY2VfY29vcmRpbmF0b3IvdGFiX21hbmFnZXJfYnJvd3NlcnRlc3QuY2MgYi9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZV9jb29yZGluYXRvci90YWJfbWFuYWdlcl9icm93c2VydGVzdC5jYwppbmRleCAxNjJiNDBmLi4yM2NkZmFmOCAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvcmVzb3VyY2VfY29vcmRpbmF0b3IvdGFiX21hbmFnZXJfYnJvd3NlcnRlc3QuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvcmVzb3VyY2VfY29vcmRpbmF0b3IvdGFiX21hbmFnZXJfYnJvd3NlcnRlc3QuY2MKQEAgLTMwMCw3ICszMDAsOCBAQAogICB2b2lkIFNpbXVsYXRlRnJlZXplU2lnbmFsKGNvbnRlbnQ6OldlYkNvbnRlbnRzKiBjb250ZW50cykgewogICAgIEdldFRhYkxpZmVjeWNsZVVuaXRTb3VyY2UoKQogICAgICAgICAtPkdldFRhYkxpZmVjeWNsZVVuaXQoY29udGVudHMpCi0gICAgICAgIC0+VXBkYXRlTGlmZWN5Y2xlU3RhdGUobW9qb206OkxpZmVjeWNsZVN0YXRlOjprRnJvemVuKTsKKyAgICAgICAgLT5VcGRhdGVMaWZlY3ljbGVTdGF0ZSgKKyAgICAgICAgICAgIHBlcmZvcm1hbmNlX21hbmFnZXI6Om1vam9tOjpMaWZlY3ljbGVTdGF0ZTo6a0Zyb3plbik7CiAgIH0KIAogICBUYWJNYW5hZ2VyKiB0YWJfbWFuYWdlcigpIHsgcmV0dXJuIGdfYnJvd3Nlcl9wcm9jZXNzLT5HZXRUYWJNYW5hZ2VyKCk7IH0KQEAgLTEyNzAsNyArMTI3MSw4IEBACiAgIC8vIFByZXRlbmQgdGhhdCB0aGUgYmFja2dyb3VuZCB0YWIgcmVwb3J0ZWQgaXRzIG9yaWdpbiB0cmlhbCBmcmVlemUgcG9saWN5LCB0bwogICAvLyBwcmV2ZW50IENhbkZyZWV6ZSgpIGZyb20gcmV0dXJuaW5nIGZhbHNlLgogICBUYWJMaWZlY3ljbGVVbml0U291cmNlOjpPbk9yaWdpblRyaWFsRnJlZXplUG9saWN5Q2hhbmdlZCgKLSAgICAgIEdldFdlYkNvbnRlbnRzQXQoMSksIG1vam9tOjpJbnRlcnZlbnRpb25Qb2xpY3k6OmtEZWZhdWx0KTsKKyAgICAgIEdldFdlYkNvbnRlbnRzQXQoMSksCisgICAgICBwZXJmb3JtYW5jZV9tYW5hZ2VyOjptb2pvbTo6SW50ZXJ2ZW50aW9uUG9saWN5OjprRGVmYXVsdCk7CiAKICAgLy8gUHJvYWN0aXZlbHkgZGlzY2FyZCB0aGUgYmFja2dyb3VuZCB0YWIuCiAgIEVYUEVDVF9FUShMaWZlY3ljbGVVbml0U3RhdGU6OkFDVElWRSwgR2V0TGlmZWN5Y2xlVW5pdEF0KDEpLT5HZXRTdGF0ZSgpKTsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3Jlc291cmNlX2Nvb3JkaW5hdG9yL3RhYl9tYW5hZ2VyX3VuaXR0ZXN0LmNjIGIvY2hyb21lL2Jyb3dzZXIvcmVzb3VyY2VfY29vcmRpbmF0b3IvdGFiX21hbmFnZXJfdW5pdHRlc3QuY2MKaW5kZXggNDM4ZjQ4ZTcuLjI1NDZhMjggMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3Jlc291cmNlX2Nvb3JkaW5hdG9yL3RhYl9tYW5hZ2VyX3VuaXR0ZXN0LmNjCisrKyBiL2Nocm9tZS9icm93c2VyL3Jlc291cmNlX2Nvb3JkaW5hdG9yL3RhYl9tYW5hZ2VyX3VuaXR0ZXN0LmNjCkBAIC0yNTksMTIgKzI1OSwxMiBAQAogCiAgIHZvaWQgU2ltdWxhdGVGcmVlemVDb21wbGV0aW9uKGNvbnRlbnQ6OldlYkNvbnRlbnRzKiBjb250ZW50KSB7CiAgICAgR2V0VGFiTGlmZWN5Y2xlVW5pdChjb250ZW50KS0+VXBkYXRlTGlmZWN5Y2xlU3RhdGUoCi0gICAgICAgIG1vam9tOjpMaWZlY3ljbGVTdGF0ZTo6a0Zyb3plbik7CisgICAgICAgIHBlcmZvcm1hbmNlX21hbmFnZXI6Om1vam9tOjpMaWZlY3ljbGVTdGF0ZTo6a0Zyb3plbik7CiAgIH0KIAogICB2b2lkIFNpbXVsYXRlVW5mcmVlemVDb21wbGV0aW9uKGNvbnRlbnQ6OldlYkNvbnRlbnRzKiBjb250ZW50KSB7CiAgICAgR2V0VGFiTGlmZWN5Y2xlVW5pdChjb250ZW50KS0+VXBkYXRlTGlmZWN5Y2xlU3RhdGUoCi0gICAgICAgIG1vam9tOjpMaWZlY3ljbGVTdGF0ZTo6a1J1bm5pbmcpOworICAgICAgICBwZXJmb3JtYW5jZV9tYW5hZ2VyOjptb2pvbTo6TGlmZWN5Y2xlU3RhdGU6OmtSdW5uaW5nKTsKICAgfQogCiAgIHZpcnR1YWwgdm9pZCBDaGVja1Rocm90dGxlUmVzdWx0cygKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3Jlc291cmNlcy9jaHJvbWVvcy9jaHJvbWV2b3gvY3ZveDIvYmFja2dyb3VuZC9pX3NlYXJjaC5qcyBiL2Nocm9tZS9icm93c2VyL3Jlc291cmNlcy9jaHJvbWVvcy9jaHJvbWV2b3gvY3ZveDIvYmFja2dyb3VuZC9pX3NlYXJjaC5qcwppbmRleCBlNDQ5Y2Q1Li45MWQyMmIxZCAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvcmVzb3VyY2VzL2Nocm9tZW9zL2Nocm9tZXZveC9jdm94Mi9iYWNrZ3JvdW5kL2lfc2VhcmNoLmpzCisrKyBiL2Nocm9tZS9icm93c2VyL3Jlc291cmNlcy9jaHJvbWVvcy9jaHJvbWV2b3gvY3ZveDIvYmFja2dyb3VuZC9pX3NlYXJjaC5qcwpAQCAtNDAsOCArNDAsMTEgQEAKICAgLyoqCiAgICAqIENhbGxlZCB3aGVuIHNlYXJjaCByZXN1bHQgbm9kZSBjaGFuZ2VzLgogICAgKiBAcGFyYW0geyFBdXRvbWF0aW9uTm9kZX0gbm9kZSBUaGUgbmV3IHNlYXJjaCByZXN1bHQuCisgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCBUaGUgaW5kZXggaW50byB0aGUgbmFtZSB3aGVyZSB0aGUgc2VhcmNoIG1hdGNoCisgICAqICAgICBzdGFydHMuCisgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGluZGV4IGludG8gdGhlIG5hbWUgd2hlcmUgdGhlIHNlYXJjaCBtYXRjaCBlbmRzLgogICAgKi8KLSAgb25TZWFyY2hSZXN1bHRDaGFuZ2VkOiBmdW5jdGlvbihub2RlKSB7fQorICBvblNlYXJjaFJlc3VsdENoYW5nZWQ6IGZ1bmN0aW9uKG5vZGUsIHN0YXJ0LCBlbmQpIHt9CiB9OwogCiAvKioKQEAgLTYwLDYgKzYzLDkgQEAKICAgLyoqIEB0eXBlIHshY3Vyc29ycy5DdXJzb3J9ICovCiAgIHRoaXMuY3Vyc29yID0gY3Vyc29ycy5DdXJzb3IuZnJvbU5vZGUobGVhZik7CiAKKyAgLyoqIEBwcml2YXRlIHtudW1iZXJ9ICovCisgIHRoaXMuY2FsbGJhY2tJZF8gPSAwOworCiAgIC8vIEdsb2JhbCBleHBvcnRzLgogICAvKiogRXhwb3J0ZWQgZm9yIHRoaXMgYmFja2dyb3VuZCBzY3JpcHQuICovCiAgIGN2b3guQ2hyb21lVm94ID0gY2hyb21lLmV4dGVuc2lvbi5nZXRCYWNrZ3JvdW5kUGFnZSgpWydjdm94J11bJ0Nocm9tZVZveCddOwpAQCAtNzcsNDAgKzgzLDQxIEBACiAgICAqIFBlcmZvcm1zIGEgc2VhcmNoLgogICAgKiBAcGFyYW0ge3N0cmluZ30gc2VhcmNoU3RyCiAgICAqIEBwYXJhbSB7RGlyfSBkaXIKKyAgICogQHBhcmFtIHtib29sZWFuPX0gb3B0X25leHRPYmplY3QKICAgICovCi0gIHNlYXJjaDogZnVuY3Rpb24oc2VhcmNoU3RyLCBkaXIpIHsKLSAgICBzZWFyY2hTdHIgPSBzZWFyY2hTdHIudG9Mb2NhbGVMb3dlckNhc2UoKTsKLSAgICB2YXIgbm9kZSA9IHRoaXMuY3Vyc29yLm5vZGU7Ci0gICAgdmFyIHJlc3VsdCA9IG5vZGU7Ci0gICAgdmFyIHByZXYgPSBub2RlOwotICAgIGRvIHsKLSAgICAgIC8vIEJlY2F1c2UgQ2xvc3VyZSBjYW5ub3QgaW5mZXIgbXVjaCBhYm91dCBwcmV2LgotICAgICAgaWYgKCFwcmV2KQotICAgICAgICBicmVhazsKKyAgc2VhcmNoOiBmdW5jdGlvbihzZWFyY2hTdHIsIGRpciwgb3B0X25leHRPYmplY3QpIHsKKyAgICBjbGVhclRpbWVvdXQodGhpcy5jYWxsYmFja0lkXyk7CisgICAgdmFyIHN0ZXAgPSBmdW5jdGlvbigpIHsKKyAgICAgIHNlYXJjaFN0ciA9IHNlYXJjaFN0ci50b0xvY2FsZUxvd2VyQ2FzZSgpOworICAgICAgdmFyIG5vZGUgPSB0aGlzLmN1cnNvci5ub2RlOworICAgICAgdmFyIHJlc3VsdCA9IG5vZGU7CiAKLSAgICAgIC8vIFdlIHdhbnQgdG8gc3RhcnQvY29udGludWUgdGhlIHNlYXJjaCBhdCB0aGUgbmV4dCBvYmplY3QuCi0gICAgICByZXN1bHQgPQotICAgICAgICAgIEF1dG9tYXRpb25VdGlsLmZpbmROZXh0Tm9kZShwcmV2LCBkaXIsIEF1dG9tYXRpb25QcmVkaWNhdGUub2JqZWN0KTsKLQotICAgICAgaWYgKCFyZXN1bHQpCi0gICAgICAgIGJyZWFrOwotCi0gICAgICAvLyBBc2sgbmF0aXZlIHRvIHNlYXJjaCB0aGUgdW5kZXJseWluZyBkYXRhIGZvciBhIHBlcmZvcm1hbmNlIGJvb3N0LgotICAgICAgcHJldiA9IHJlc3VsdDsKLSAgICAgIHJlc3VsdCA9IHJlc3VsdC5nZXROZXh0VGV4dE1hdGNoKHNlYXJjaFN0ciwgZGlyID09IERpci5CQUNLV0FSRCk7Ci0gICAgICBwcmV2ID0gcmVzdWx0IHx8IHByZXY7Ci0KLSAgICAgIC8vIENoZWNrIHRvIGVuc3VyZSB3ZSBoYXZlIGFuIG9iamVjdC1saWtlIG5vZGU7IG90aGVyd2lzZSwgY29udGludWUuCi0gICAgICBpZiAocmVzdWx0ICYmICFBdXRvbWF0aW9uUHJlZGljYXRlLm9iamVjdChyZXN1bHQpKQotICAgICAgICBjb250aW51ZTsKLSAgICB9IHdoaWxlICghcmVzdWx0KTsKLQotICAgIGlmIChyZXN1bHQpIHsKLSAgICAgIHRoaXMuY3Vyc29yID0gY3Vyc29ycy5DdXJzb3IuZnJvbU5vZGUocmVzdWx0KTsKLSAgICAgIHRoaXMuaGFuZGxlcl8ub25TZWFyY2hSZXN1bHRDaGFuZ2VkKHJlc3VsdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRoaXMuaGFuZGxlcl8ub25TZWFyY2hSZWFjaGVkQm91bmRhcnkodGhpcy5jdXJzb3Iubm9kZSk7CisgICAgICBpZiAob3B0X25leHRPYmplY3QpIHsKKyAgICAgICAgLy8gV2Ugd2FudCB0byBzdGFydC9jb250aW51ZSB0aGUgc2VhcmNoIGF0IHRoZSBuZXh0IG9iamVjdC4KKyAgICAgICAgcmVzdWx0ID0KKyAgICAgICAgICAgIEF1dG9tYXRpb25VdGlsLmZpbmROZXh0Tm9kZShub2RlLCBkaXIsIEF1dG9tYXRpb25QcmVkaWNhdGUub2JqZWN0KTsKICAgICAgIH0KKworICAgICAgZG8geworICAgICAgICAvLyBBc2sgbmF0aXZlIHRvIHNlYXJjaCB0aGUgdW5kZXJseWluZyBkYXRhIGZvciBhIHBlcmZvcm1hbmNlIGJvb3N0LgorICAgICAgICByZXN1bHQgPSByZXN1bHQuZ2V0TmV4dFRleHRNYXRjaChzZWFyY2hTdHIsIGRpciA9PSBEaXIuQkFDS1dBUkQpOworICAgICAgfSB3aGlsZSAocmVzdWx0ICYmICFBdXRvbWF0aW9uUHJlZGljYXRlLm9iamVjdChyZXN1bHQpKTsKKworICAgICAgaWYgKHJlc3VsdCkgeworICAgICAgICB0aGlzLmN1cnNvciA9IGN1cnNvcnMuQ3Vyc29yLmZyb21Ob2RlKHJlc3VsdCk7CisgICAgICAgIHZhciBzdGFydCA9IHJlc3VsdC5uYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5kZXhPZihzZWFyY2hTdHIpOworICAgICAgICB2YXIgZW5kID0gc3RhcnQgKyBzZWFyY2hTdHIubGVuZ3RoOworICAgICAgICB0aGlzLmhhbmRsZXJfLm9uU2VhcmNoUmVzdWx0Q2hhbmdlZChyZXN1bHQsIHN0YXJ0LCBlbmQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5oYW5kbGVyXy5vblNlYXJjaFJlYWNoZWRCb3VuZGFyeSh0aGlzLmN1cnNvci5ub2RlKTsKKyAgICAgIH0KKyAgICB9OworCisgICAgdGhpcy5jYWxsYmFja0lkXyA9IHNldFRpbWVvdXQoc3RlcC5iaW5kKHRoaXMpLCAwKTsKKyAgfSwKKworICBjbGVhcjogZnVuY3Rpb24oKSB7CisgICAgY2xlYXJUaW1lb3V0KHRoaXMuY2FsbGJhY2tJZF8pOwogICB9CiB9OwogCkBAIC0xODMsNyArMTkwLDcgQEAKICAgICAgIGRlZmF1bHQ6CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgdGhpcy5pU2VhcmNoXy5zZWFyY2godGhpcy5pbnB1dF8udmFsdWUsIHRoaXMuZGlyXyk7CisgICAgdGhpcy5pU2VhcmNoXy5zZWFyY2godGhpcy5pbnB1dF8udmFsdWUsIHRoaXMuZGlyXywgdHJ1ZSk7CiAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7CiAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpOwogICAgIHJldHVybiBmYWxzZTsKQEAgLTE5Niw2ICsyMDMsNyBAQAogICAgKi8KICAgb25UZXh0SW5wdXQ6IGZ1bmN0aW9uKGV2dCkgewogICAgIHZhciBzZWFyY2hTdHIgPSBldnQudGFyZ2V0LnZhbHVlICsgZXZ0LmRhdGE7CisgICAgdGhpcy5pU2VhcmNoXy5jbGVhcigpOwogICAgIHRoaXMuaVNlYXJjaF8uc2VhcmNoKHNlYXJjaFN0ciwgdGhpcy5kaXJfKTsKICAgICByZXR1cm4gdHJ1ZTsKICAgfSwKQEAgLTIxMSwyMSArMjE5LDMxIEBACiAgIC8qKgogICAgKiBAb3ZlcnJpZGUKICAgICovCi0gIG9uU2VhcmNoUmVzdWx0Q2hhbmdlZDogZnVuY3Rpb24obm9kZSkgewotICAgIHRoaXMub3V0cHV0Xyhub2RlKTsKKyAgb25TZWFyY2hSZXN1bHRDaGFuZ2VkOiBmdW5jdGlvbihub2RlLCBzdGFydCwgZW5kKSB7CisgICAgdGhpcy5vdXRwdXRfKG5vZGUsIHN0YXJ0LCBlbmQpOwogICB9LAogCiAgIC8qKgogICAgKiBAcGFyYW0geyFBdXRvbWF0aW9uTm9kZX0gbm9kZQorICAgKiBAcGFyYW0ge251bWJlcj19IG9wdF9zdGFydAorICAgKiBAcGFyYW0ge251bWJlcj19IG9wdF9lbmQKICAgICogQHByaXZhdGUKICAgICovCi0gIG91dHB1dF86IGZ1bmN0aW9uKG5vZGUpIHsKKyAgb3V0cHV0XzogZnVuY3Rpb24obm9kZSwgb3B0X3N0YXJ0LCBvcHRfZW5kKSB7CiAgICAgT3V0cHV0LmZvcmNlTW9kZUZvck5leHRTcGVlY2hVdHRlcmFuY2UoY3ZveC5RdWV1ZU1vZGUuRkxVU0gpOwotICAgIHZhciBvID0KLSAgICAgICAgbmV3IE91dHB1dCgpCi0gICAgICAgICAgICAud2l0aFJpY2hTcGVlY2hBbmRCcmFpbGxlKAotICAgICAgICAgICAgICAgIGN1cnNvcnMuUmFuZ2UuZnJvbU5vZGUobm9kZSksIG51bGwsIE91dHB1dC5FdmVudFR5cGUuTkFWSUdBVEUpCi0gICAgICAgICAgICAuZ28oKTsKKyAgICB2YXIgbyA9IG5ldyBPdXRwdXQoKTsKKyAgICBpZiAob3B0X3N0YXJ0ICYmIG9wdF9lbmQpIHsKKyAgICAgIG8ud2l0aFN0cmluZyhbCisgICAgICAgIG5vZGUubmFtZS5zdWJzdHIoMCwgb3B0X3N0YXJ0KSwKKyAgICAgICAgbm9kZS5uYW1lLnN1YnN0cihvcHRfc3RhcnQsIG9wdF9lbmQgLSBvcHRfc3RhcnQpLAorICAgICAgICBub2RlLm5hbWUuc3Vic3RyKG9wdF9lbmQpCisgICAgICBdLmpvaW4oJywgJykpOworICAgICAgby5mb3JtYXQoJyRyb2xlJywgbm9kZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG8ud2l0aFJpY2hTcGVlY2hBbmRCcmFpbGxlKAorICAgICAgICAgIGN1cnNvcnMuUmFuZ2UuZnJvbU5vZGUobm9kZSksIG51bGwsIE91dHB1dC5FdmVudFR5cGUuTkFWSUdBVEUpOworICAgIH0KKyAgICBvLmdvKCk7CiAKICAgICB0aGlzLmJhY2tncm91bmRfLnNldEN1cnJlbnRSYW5nZShjdXJzb3JzLlJhbmdlLmZyb21Ob2RlKG5vZGUpKTsKICAgfSwKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3Jlc291cmNlcy9jaHJvbWVvcy9jaHJvbWV2b3gvY3ZveDIvYmFja2dyb3VuZC9pX3NlYXJjaF90ZXN0LmV4dGpzIGIvY2hyb21lL2Jyb3dzZXIvcmVzb3VyY2VzL2Nocm9tZW9zL2Nocm9tZXZveC9jdm94Mi9iYWNrZ3JvdW5kL2lfc2VhcmNoX3Rlc3QuZXh0anMKaW5kZXggOWYwMDQzNTguLmJmNDFlZjkgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3Jlc291cmNlcy9jaHJvbWVvcy9jaHJvbWV2b3gvY3ZveDIvYmFja2dyb3VuZC9pX3NlYXJjaF90ZXN0LmV4dGpzCisrKyBiL2Nocm9tZS9icm93c2VyL3Jlc291cmNlcy9jaHJvbWVvcy9jaHJvbWV2b3gvY3ZveDIvYmFja2dyb3VuZC9pX3NlYXJjaF90ZXN0LmV4dGpzCkBAIC00NiwxNyArNDYsMjMgQEAKIEZha2VJU2VhcmNoSGFuZGxlci5wcm90b3R5cGUgPSB7CiAgIC8qKiBAb3ZlcnJpZGUgKi8KICAgb25TZWFyY2hSZWFjaGVkQm91bmRhcnk6IGZ1bmN0aW9uKGJvdW5kYXJ5Tm9kZSkgewotICAgIHRoaXMuZXhwZWN0Xy5zaGlmdCgpKGJvdW5kYXJ5Tm9kZSwgdHJ1ZSk7CisgICAgdGhpcy5leHBlY3RfLnNoaWZ0KCkoe25vZGU6IGJvdW5kYXJ5Tm9kZSwgaXNCb3VuZGFyeTogdHJ1ZX0pOwogICB9LAogCi0gIG9uU2VhcmNoUmVzdWx0Q2hhbmdlZDogZnVuY3Rpb24obm9kZSkgewotICAgIHRoaXMuZXhwZWN0Xy5zaGlmdCgpKG5vZGUpOworICAvKiogQG92ZXJyaWRlICovCisgIG9uU2VhcmNoUmVzdWx0Q2hhbmdlZDogZnVuY3Rpb24obm9kZSwgc3RhcnQsIGVuZCkgeworICAgIHRoaXMuZXhwZWN0Xy5zaGlmdCgpKHtub2RlOiBub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogZW5kfSk7CiAgIH0sCiAKICAgZXhwZWN0OiBmdW5jdGlvbihzdHIsIG9wdF9jYWxsYmFjaykgewotICAgIHRoaXMuZXhwZWN0Xy5wdXNoKHRoaXMudGVzdC5uZXdDYWxsYmFjayhmdW5jdGlvbihub2RlLCBpc0JvdW5kKSB7CisgICAgdGhpcy5leHBlY3RfLnB1c2godGhpcy50ZXN0Lm5ld0NhbGxiYWNrKGZ1bmN0aW9uKGFyZ3MpIHsKKyAgICAgIHZhciBub2RlID0gYXJncy5ub2RlOwogICAgICAgdmFyIGFjdHVhbCA9IG5vZGUubmFtZSB8fCBub2RlLnJvbGU7Ci0gICAgICBpZiAoaXNCb3VuZCkKKyAgICAgIGlmIChhcmdzLnN0YXJ0ICYmIGFyZ3MuZW5kKQorICAgICAgICBhY3R1YWwgPSAnc3RhcnQ9JyArIGFyZ3Muc3RhcnQgKyAnIGVuZD0nICsgYXJncy5lbmQgKyAnIHRleHQ9JyArIGFjdHVhbDsKKyAgICAgIGlmIChhcmdzLmlzQm91bmRhcnkpCiAgICAgICAgIGFjdHVhbCA9ICdib3VuZGFyeT0nICsgYWN0dWFsOwogICAgICAgYXNzZXJ0RXF1YWxzKHN0ciwgYWN0dWFsKTsKICAgICAgIG9wdF9jYWxsYmFjayAmJiBvcHRfY2FsbGJhY2soKTsKQEAgLTY0LDE1ICs3MCwxNSBAQAogICB9CiB9OwogCi1URVNUX0YoJ0Nocm9tZVZveElTZWFyY2hUZXN0JywgJ0RJU0FCTEVEX1NpbXBsZScsIGZ1bmN0aW9uKCkgeworVEVTVF9GKCdDaHJvbWVWb3hJU2VhcmNoVGVzdCcsICdTaW1wbGUnLCBmdW5jdGlvbigpIHsKICAgdGhpcy5ydW5XaXRoTG9hZGVkVHJlZSh0aGlzLmxpbmtzQW5kSGVhZGluZ3NEb2MsIGZ1bmN0aW9uKHJvb3ROb2RlKSB7CiAgICAgdmFyIGhhbmRsZXIgPSBuZXcgRmFrZUlTZWFyY2hIYW5kbGVyKHRoaXMpOwotICAgIHZhciBzZWFyY2ggPSBuZXcgSVNlYXJjaChyb290Tm9kZSk7CisgICAgdmFyIHNlYXJjaCA9IG5ldyBJU2VhcmNoKG5ldyBjdXJzb3JzLkN1cnNvcihyb290Tm9kZSwgMCkpOwogICAgIHNlYXJjaC5oYW5kbGVyID0gaGFuZGxlcjsKIAogICAgIC8vIFNpbXBsZSBmb3J3YXJkIHNlYXJjaC4KICAgICBzZWFyY2guc2VhcmNoKCdVUycsICdmb3J3YXJkJyk7Ci0gICAgaGFuZGxlci5leHBlY3QoJ0Fib3V0IFVTJywKKyAgICBoYW5kbGVyLmV4cGVjdCgnc3RhcnQ9NiBlbmQ9OCB0ZXh0PUFib3V0IFVTJywKICAgICAgICAgICAgICAgICAgICBzZWFyY2guc2VhcmNoLmJpbmQoc2VhcmNoLCAnc3RhcnQnLCAnYmFja3dhcmQnKSk7CiAKICAgICBoYW5kbGVyLmV4cGVjdCgnc3RhcnQnLApAQCAtODgsOSArOTQsMTQgQEAKICAgICAgICAgICAgICAgICAgICAvLyBNaXhlZCBjYXNlIHN1YnN0cmluZy4KICAgICAgICAgICAgICAgICAgICBzZWFyY2guc2VhcmNoLmJpbmQoc2VhcmNoLCAnYlJlYWsnLCAnZm9yd2FyZCcpKTsKIAotICAgIGhhbmRsZXIuZXhwZWN0KCdMYXRlc3QgQnJlYWtpbmcgTmV3cycsCi0gICAgICAgICAgICAgICAgICAgc2VhcmNoLnNlYXJjaC5iaW5kKHNlYXJjaCwgJ2JSZWFrJywgJ2ZvcndhcmQnKSk7CisgICAgaGFuZGxlci5leHBlY3QoJ3N0YXJ0PTcgZW5kPTEyIHRleHQ9TGF0ZXN0IEJyZWFraW5nIE5ld3MnLAorICAgICAgICAgICAgICAgICAgIHNlYXJjaC5zZWFyY2guYmluZChzZWFyY2gsICdiUmVha2knLCAnZm9yd2FyZCcpKTsKIAorICAgIC8vIEluY3JlbWVudGFsIHNlYXJjaCBzdGF5cyBvbiB0aGUgY3VycmVudCBub2RlLgorICAgIGhhbmRsZXIuZXhwZWN0KCdzdGFydD03IGVuZD0xMyB0ZXh0PUxhdGVzdCBCcmVha2luZyBOZXdzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2guc2VhcmNoLmJpbmQoc2VhcmNoLCAnYlJlYWtpbycsICdmb3J3YXJkJykpOworCisgICAgLy8gTm8gcmVzdWx0cyBmb3IgdGhlIHNlYXJjaC4KICAgICBoYW5kbGVyLmV4cGVjdCgnYm91bmRhcnk9TGF0ZXN0IEJyZWFraW5nIE5ld3MnKTsKICAgfSk7CiB9KTsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3Jlc291cmNlcy9jaHJvbWVvcy9jaHJvbWV2b3gvY3ZveDIvYmFja2dyb3VuZC9wYW5lbC5qcyBiL2Nocm9tZS9icm93c2VyL3Jlc291cmNlcy9jaHJvbWVvcy9jaHJvbWV2b3gvY3ZveDIvYmFja2dyb3VuZC9wYW5lbC5qcwppbmRleCAyODhlOTE0Li43ZjcwYjMzIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvY2hyb21lb3MvY2hyb21ldm94L2N2b3gyL2JhY2tncm91bmQvcGFuZWwuanMKKysrIGIvY2hyb21lL2Jyb3dzZXIvcmVzb3VyY2VzL2Nocm9tZW9zL2Nocm9tZXZveC9jdm94Mi9iYWNrZ3JvdW5kL3BhbmVsLmpzCkBAIC0zODAsMjUgKzM4MCwzNyBAQAogICAgIH0KICAgfSwgdGhpcykpOwogCi0gIC8vIEFkZCBhbGwgb3BlbiB0YWJzIHRvIHRoZSBUYWJzIG1lbnUuCi0gIGJrZ25kLmNocm9tZS53aW5kb3dzLmdldExhc3RGb2N1c2VkKGZ1bmN0aW9uKGxhc3RGb2N1c2VkV2luZG93KSB7Ci0gICAgYmtnbmQuY2hyb21lLndpbmRvd3MuZ2V0QWxsKHsncG9wdWxhdGUnOiB0cnVlfSwgZnVuY3Rpb24od2luZG93cykgewotICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3aW5kb3dzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIHZhciB0YWJzID0gd2luZG93c1tpXS50YWJzOwotICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRhYnMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICB2YXIgdGl0bGUgPSB0YWJzW2pdLnRpdGxlOwotICAgICAgICAgIGlmICh0YWJzW2pdLmFjdGl2ZSAmJiB3aW5kb3dzW2ldLmlkID09IGxhc3RGb2N1c2VkV2luZG93LmlkKQotICAgICAgICAgICAgdGl0bGUgKz0gJyAnICsgTXNncy5nZXRNc2coJ2FjdGl2ZV90YWInKTsKLSAgICAgICAgICB0YWJzTWVudS5hZGRNZW51SXRlbSgKLSAgICAgICAgICAgICAgdGl0bGUsICcnLCAnJywgJycsIChmdW5jdGlvbih3aW4sIHRhYikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBia2duZC5jaHJvbWUud2luZG93cy51cGRhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW4uaWQsIHtmb2N1c2VkOiB0cnVlfSwgZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJrZ25kLmNocm9tZS50YWJzLnVwZGF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYi5pZCwge2FjdGl2ZTogdHJ1ZX0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5iaW5kKHRoaXMsIHdpbmRvd3NbaV0sIHRhYnNbal0pKTsKKyAgLy8gT25seSBhZGQgYWxsIG9wZW4gdGFicyB0byB0aGUgVGFicyBtZW51IGlmIHdlIGFyZSBsb2dnZWQgaW4uCisgIGNocm9tZS5sb2dpblN0YXRlLmdldFNlc3Npb25TdGF0ZShmdW5jdGlvbigKKyAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqLyBzZXNzaW9uU3RhdGUpIHsKKyAgICBpZiAoc2Vzc2lvblN0YXRlID09PSAnSU5fT09CRV9TQ1JFRU4nIHx8CisgICAgICAgIHNlc3Npb25TdGF0ZSA9PT0gJ0lOX0xPR0lOX1NDUkVFTicgfHwKKyAgICAgICAgc2Vzc2lvblN0YXRlID09PSAnSU5fTE9DS19TQ1JFRU4nKSB7CisgICAgICB0YWJzTWVudS5hZGRNZW51SXRlbSgKKyAgICAgICAgICBNc2dzLmdldE1zZygncGFuZWxfbWVudV9pdGVtX25vbmUnKSwgJycsICcnLCAnJywgZnVuY3Rpb24oKSB7fSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gQWRkIGFsbCBvcGVuIHRhYnMgdG8gdGhlIFRhYnMgbWVudS4KKyAgICBia2duZC5jaHJvbWUud2luZG93cy5nZXRMYXN0Rm9jdXNlZChmdW5jdGlvbihsYXN0Rm9jdXNlZFdpbmRvdykgeworICAgICAgYmtnbmQuY2hyb21lLndpbmRvd3MuZ2V0QWxsKHsncG9wdWxhdGUnOiB0cnVlfSwgZnVuY3Rpb24od2luZG93cykgeworICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdpbmRvd3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICB2YXIgdGFicyA9IHdpbmRvd3NbaV0udGFiczsKKyAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRhYnMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgIHZhciB0aXRsZSA9IHRhYnNbal0udGl0bGU7CisgICAgICAgICAgICBpZiAodGFic1tqXS5hY3RpdmUgJiYgd2luZG93c1tpXS5pZCA9PSBsYXN0Rm9jdXNlZFdpbmRvdy5pZCkKKyAgICAgICAgICAgICAgdGl0bGUgKz0gJyAnICsgTXNncy5nZXRNc2coJ2FjdGl2ZV90YWInKTsKKyAgICAgICAgICAgIHRhYnNNZW51LmFkZE1lbnVJdGVtKAorICAgICAgICAgICAgICAgIHRpdGxlLCAnJywgJycsICcnLCAoZnVuY3Rpb24od2luLCB0YWIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBia2duZC5jaHJvbWUud2luZG93cy51cGRhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbi5pZCwge2ZvY3VzZWQ6IHRydWV9LCBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBia2duZC5jaHJvbWUudGFicy51cGRhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYi5pZCwge2FjdGl2ZTogdHJ1ZX0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuYmluZCh0aGlzLCB3aW5kb3dzW2ldLCB0YWJzW2pdKSk7CisgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICB9CisgICAgICB9KTsKICAgICB9KTsKICAgfSk7CiAKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3Jlc291cmNlcy9jaHJvbWVvcy9jaHJvbWV2b3gvbWFuaWZlc3QuanNvbi5qaW5qYTIgYi9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvY2hyb21lb3MvY2hyb21ldm94L21hbmlmZXN0Lmpzb24uamluamEyCmluZGV4IGU0M2YxMjQuLjZiZjhmZTcgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3Jlc291cmNlcy9jaHJvbWVvcy9jaHJvbWV2b3gvbWFuaWZlc3QuanNvbi5qaW5qYTIKKysrIGIvY2hyb21lL2Jyb3dzZXIvcmVzb3VyY2VzL2Nocm9tZW9zL2Nocm9tZXZveC9tYW5pZmVzdC5qc29uLmppbmphMgpAQCAtMjUsNiArMjUsNyBAQAogICAgICJkb3dubG9hZHMiLAogICAgICJleHBlcmltZW50YWwiLAogICAgICJoaXN0b3J5IiwKKyAgICAibG9naW5TdGF0ZSIsCiAgICAgIm1ldHJpY3NQcml2YXRlIiwKICAgICAibm90aWZpY2F0aW9ucyIsCiAgICAgInNldHRpbmdzUHJpdmF0ZSIsCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvY2hyb21lb3MvY2hyb21ldm94L3Rvb2xzL2NoZWNrX2Nocm9tZXZveC5weSBiL2Nocm9tZS9icm93c2VyL3Jlc291cmNlcy9jaHJvbWVvcy9jaHJvbWV2b3gvdG9vbHMvY2hlY2tfY2hyb21ldm94LnB5CmluZGV4IDBkYWI5MzEwLi5hNzcxOTNkNyAxMDA3NTUKLS0tIGEvY2hyb21lL2Jyb3dzZXIvcmVzb3VyY2VzL2Nocm9tZW9zL2Nocm9tZXZveC90b29scy9jaGVja19jaHJvbWV2b3gucHkKKysrIGIvY2hyb21lL2Jyb3dzZXIvcmVzb3VyY2VzL2Nocm9tZW9zL2Nocm9tZXZveC90b29scy9jaGVja19jaHJvbWV2b3gucHkKQEAgLTU4LDYgKzU4LDEwIEBACiBfTUVUUklDU19QUklWQVRFX0VYVEVSTlMgPSAoCiAgICAgQ2hyb21lUm9vdFBhdGgoJ3RoaXJkX3BhcnR5L2Nsb3N1cmVfY29tcGlsZXIvZXh0ZXJucy9tZXRyaWNzX3ByaXZhdGUuanMnKSkKIAorIyBMb2dpblN0YXRlIGV4dGVybnMgZmlsZS4KK19MT0dJTl9TVEFURV9FWFRFUk5TID0gKAorICAgIENocm9tZVJvb3RQYXRoKCd0aGlyZF9wYXJ0eS9jbG9zdXJlX2NvbXBpbGVyL2V4dGVybnMvbG9naW5fc3RhdGUuanMnKSkKKwogIyBTZXR0aW5ncyBwcml2YXRlIEFQSSBleHRlcm5zIGZpbGUuCiBfU0VUVElOR1NfUFJJVkFURV9FWFRFUk5TID0gKAogICAgIENocm9tZVJvb3RQYXRoKCd0aGlyZF9wYXJ0eS9jbG9zdXJlX2NvbXBpbGVyL2V4dGVybnMvc2V0dGluZ3NfcHJpdmF0ZS5qcycpKQpAQCAtODksNiArOTMsNyBAQAogICAgIF9DSFJPTUVfRVhURU5TSU9OU19FWFRFUk5TLAogICAgIF9DT01NQU5ETElORV9QUklWQVRFX0VYVEVSTlMsCiAgICAgX01FVFJJQ1NfUFJJVkFURV9FWFRFUk5TLAorICAgIF9MT0dJTl9TVEFURV9FWFRFUk5TLAogICAgIF9TRVRUSU5HU19QUklWQVRFX0VYVEVSTlMsXQogCiAjIExpc3Qgb2YgdG9wLWxldmVsIHNjcmlwdHMgYW5kIGV4dGVybnMgdGhhdCB3ZSBjYW4gY2hlY2suCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvY2hyb21lb3MvaW5wdXRfbWV0aG9kL2dvb2dsZV94a2JfbWFuaWZlc3QuanNvbiBiL2Nocm9tZS9icm93c2VyL3Jlc291cmNlcy9jaHJvbWVvcy9pbnB1dF9tZXRob2QvZ29vZ2xlX3hrYl9tYW5pZmVzdC5qc29uCmluZGV4IGU1OWRkODU4Li5hZGI0ODZmIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvY2hyb21lb3MvaW5wdXRfbWV0aG9kL2dvb2dsZV94a2JfbWFuaWZlc3QuanNvbgorKysgYi9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvY2hyb21lb3MvaW5wdXRfbWV0aG9kL2dvb2dsZV94a2JfbWFuaWZlc3QuanNvbgpAQCAtNjI5LDcgKzYyOSw3IEBACiAgICAgICAibmFtZSI6ICJfX01TR19rZXlib2FyZF9jYXRhbGFuX18iLAogICAgICAgInR5cGUiOiAiaW1lIiwKICAgICAgICJpZCI6ICJ4a2I6ZXM6Y2F0OmNhdCIsCi0gICAgICAiaW5kaWNhdG9yIjogIkNBUyIsCisgICAgICAiaW5kaWNhdG9yIjogIkNBVCIsCiAgICAgICAiZGVzY3JpcHRpb24iOiAiIiwKICAgICAgICJsYW5ndWFnZSI6IFsKICAgICAgICAgImNhIgpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvcmVzb3VyY2VzL2Nocm9tZW9zL2lucHV0X21ldGhvZC94a2JfbWFuaWZlc3QuanNvbiBiL2Nocm9tZS9icm93c2VyL3Jlc291cmNlcy9jaHJvbWVvcy9pbnB1dF9tZXRob2QveGtiX21hbmlmZXN0Lmpzb24KaW5kZXggMGJjNDY3YS4uZDMyYzk3YyAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvcmVzb3VyY2VzL2Nocm9tZW9zL2lucHV0X21ldGhvZC94a2JfbWFuaWZlc3QuanNvbgorKysgYi9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvY2hyb21lb3MvaW5wdXRfbWV0aG9kL3hrYl9tYW5pZmVzdC5qc29uCkBAIC00OTQsNyArNDk0LDcgQEAKICAgICAgICJuYW1lIjogIl9fTVNHX2tleWJvYXJkX2NhdGFsYW5fXyIsCiAgICAgICAidHlwZSI6ICJpbWUiLAogICAgICAgImlkIjogInhrYjplczpjYXQ6Y2F0IiwKLSAgICAgICJpbmRpY2F0b3IiOiAiQ0FTIiwKKyAgICAgICJpbmRpY2F0b3IiOiAiQ0FUIiwKICAgICAgICJkZXNjcmlwdGlvbiI6ICIiLAogICAgICAgImxhbmd1YWdlIjogWwogICAgICAgICAiY2EiCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvY2hyb21lb3MvaW50ZXJuZXRfZGV0YWlsX2RpYWxvZy9pbnRlcm5ldF9kZXRhaWxfZGlhbG9nLmpzIGIvY2hyb21lL2Jyb3dzZXIvcmVzb3VyY2VzL2Nocm9tZW9zL2ludGVybmV0X2RldGFpbF9kaWFsb2cvaW50ZXJuZXRfZGV0YWlsX2RpYWxvZy5qcwppbmRleCBkZmI5NTQyMy4uZWJjODE5YSAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvcmVzb3VyY2VzL2Nocm9tZW9zL2ludGVybmV0X2RldGFpbF9kaWFsb2cvaW50ZXJuZXRfZGV0YWlsX2RpYWxvZy5qcworKysgYi9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvY2hyb21lb3MvaW50ZXJuZXRfZGV0YWlsX2RpYWxvZy9pbnRlcm5ldF9kZXRhaWxfZGlhbG9nLmpzCkBAIC05NCwxMCArOTQsMTAgQEAKIAogICAgIC8vIFNldCBkZWZhdWx0IG1hbmFnZWRQcm9wZXJ0aWVzXyB1bnRpbCB0aGV5IGFyZSBsb2FkZWQuCiAgICAgdGhpcy5wcm9wZXJ0aWVzUmVjZWl2ZWRfID0gZmFsc2U7CisgICAgdGhpcy5kZXZpY2VTdGF0ZV8gPSBudWxsOwogICAgIHRoaXMubWFuYWdlZFByb3BlcnRpZXNfID0gT25jTW9qby5nZXREZWZhdWx0TWFuYWdlZFByb3BlcnRpZXMoCiAgICAgICAgIE9uY01vam8uZ2V0TmV0d29ya1R5cGVGcm9tU3RyaW5nKHR5cGUpLCB0aGlzLmd1aWQsIG5hbWUpOwogICAgIHRoaXMuZ2V0TmV0d29ya0RldGFpbHNfKCk7Ci0gICAgdGhpcy5nZXREZXZpY2VTdGF0ZV8oKTsKICAgfSwKIAogICAvKiogQG92ZXJyaWRlICovCkBAIC0xODIsMTAgKzE4MiwxMSBAQAogCiAgIC8qKiBDcm9zTmV0d29ya0NvbmZpZ09ic2VydmVyIGltcGwgKi8KICAgb25EZXZpY2VTdGF0ZUxpc3RDaGFuZ2VkOiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLmdldERldmljZVN0YXRlXygpOwotICAgIGlmICh0aGlzLmd1aWQpIHsKLSAgICAgIHRoaXMuZ2V0TmV0d29ya0RldGFpbHNfKCk7CisgICAgaWYgKCF0aGlzLmd1aWQgfHwgIXRoaXMubWFuYWdlZFByb3BlcnRpZXNfKSB7CisgICAgICByZXR1cm47CiAgICAgfQorICAgIHRoaXMuZ2V0RGV2aWNlU3RhdGVfKCk7CisgICAgdGhpcy5nZXROZXR3b3JrRGV0YWlsc18oKTsKICAgfSwKIAogICAvKiogQHByaXZhdGUgKi8KQEAgLTE5OSwxNiArMjAwLDIxIEBACiAgICAgICB9CiAgICAgICB0aGlzLm1hbmFnZWRQcm9wZXJ0aWVzXyA9IHJlc3BvbnNlLnJlc3VsdDsKICAgICAgIHRoaXMucHJvcGVydGllc1JlY2VpdmVkXyA9IHRydWU7CisgICAgICBpZiAoIXRoaXMuZGV2aWNlU3RhdGVfKSB7CisgICAgICAgIHRoaXMuZ2V0RGV2aWNlU3RhdGVfKCk7CisgICAgICB9CiAgICAgfSk7CiAgIH0sCiAKICAgLyoqIEBwcml2YXRlICovCiAgIGdldERldmljZVN0YXRlXzogZnVuY3Rpb24oKSB7CisgICAgaWYgKCF0aGlzLm1hbmFnZWRQcm9wZXJ0aWVzXykgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjb25zdCB0eXBlID0gdGhpcy5tYW5hZ2VkUHJvcGVydGllc18udHlwZTsKICAgICB0aGlzLm5ldHdvcmtDb25maWdfLmdldERldmljZVN0YXRlTGlzdCgpLnRoZW4ocmVzcG9uc2UgPT4gewogICAgICAgY29uc3QgZGV2aWNlcyA9IHJlc3BvbnNlLnJlc3VsdDsKLSAgICAgIHRoaXMuZGV2aWNlU3RhdGVfID0KLSAgICAgICAgICBkZXZpY2VzLmZpbmQoZGV2aWNlID0+IGRldmljZS50eXBlID09IHRoaXMubWFuYWdlZFByb3BlcnRpZXNfLnR5cGUpIHx8Ci0gICAgICAgICAgbnVsbDsKKyAgICAgIHRoaXMuZGV2aWNlU3RhdGVfID0gZGV2aWNlcy5maW5kKGRldmljZSA9PiBkZXZpY2UudHlwZSA9PSB0eXBlKSB8fCBudWxsOwogICAgIH0pOwogICB9LAogCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvY2hyb21lb3Mvd2FsbHBhcGVyX21hbmFnZXIvY3NzL3dhbGxwYXBlcl9tYW5hZ2VyLmNzcyBiL2Nocm9tZS9icm93c2VyL3Jlc291cmNlcy9jaHJvbWVvcy93YWxscGFwZXJfbWFuYWdlci9jc3Mvd2FsbHBhcGVyX21hbmFnZXIuY3NzCmluZGV4IDg5MWRlYjlmLi5kODNlODU3YiAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvcmVzb3VyY2VzL2Nocm9tZW9zL3dhbGxwYXBlcl9tYW5hZ2VyL2Nzcy93YWxscGFwZXJfbWFuYWdlci5jc3MKKysrIGIvY2hyb21lL2Jyb3dzZXIvcmVzb3VyY2VzL2Nocm9tZW9zL3dhbGxwYXBlcl9tYW5hZ2VyL2Nzcy93YWxscGFwZXJfbWFuYWdlci5jc3MKQEAgLTc1MCw2ICs3NTAsMTAgQEAKICAgdmlzaWJpbGl0eTogaGlkZGVuOyAgLyogTmVlZCB0aGlzIGZvciBjb3JyZWN0IHBvc2l0aW9uaW5nLiAqLwogfQogCisjY3VycmVudC13YWxscGFwZXItaW5mby1iYXIgLnNwYWNlciB7CisgIGZsZXg6IDE7Cit9CisKIDpub3QoLnByZXZpZXctbW9kZSkgI2N1cnJlbnQtd2FsbHBhcGVyLWluZm8tYmFyLnNob3ctaW5mby1iYXIgewogICB2aXNpYmlsaXR5OiB2aXNpYmxlOwogfQpAQCAtODAwLDEyICs4MDQsNiBAQAogICBkaXNwbGF5OiBmbGV4OwogICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICBmb250LXNpemU6IDEycHg7Ci0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsKLSAgcmlnaHQ6IDA7Ci19Ci0KLWh0bWxbZGlyPSdydGwnXSAjY3VycmVudC13YWxscGFwZXItbW9yZS1vcHRpb25zIHsKLSAgcmlnaHQ6IDQyMHB4OwogfQogCiAjY3VycmVudC13YWxscGFwZXItbW9yZS1vcHRpb25zID4gZGl2IHsKQEAgLTgyNSw3ICs4MjMsMTIgQEAKIH0KIAogI2N1cnJlbnQtd2FsbHBhcGVyLW1vcmUtb3B0aW9ucyAudGV4dCB7Ci0gIHBhZGRpbmctdG9wOiAxcHg7CisgIGhlaWdodDogMTZweDsKKyAgbGluZS1oZWlnaHQ6IDE2cHg7CisgIG1heC13aWR0aDogMTYwcHg7CisgIG92ZXJmbG93OiBoaWRkZW47CisgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOworICB3aGl0ZS1zcGFjZTogbm93cmFwOwogfQogCiAjY3VycmVudC13YWxscGFwZXItbW9yZS1vcHRpb25zIC5pY29uIHsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3Jlc291cmNlcy9jaHJvbWVvcy93YWxscGFwZXJfbWFuYWdlci9tYWluLmh0bWwgYi9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvY2hyb21lb3Mvd2FsbHBhcGVyX21hbmFnZXIvbWFpbi5odG1sCmluZGV4IDJiNzg0MTguLmJjZjk1MWYgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3Jlc291cmNlcy9jaHJvbWVvcy93YWxscGFwZXJfbWFuYWdlci9tYWluLmh0bWwKKysrIGIvY2hyb21lL2Jyb3dzZXIvcmVzb3VyY2VzL2Nocm9tZW9zL3dhbGxwYXBlcl9tYW5hZ2VyL21haW4uaHRtbApAQCAtMTA0LDYgKzEwNCw3IEBACiAgICAgICAgICAgICAgIDxkaXYgaWQ9ImN1cnJlbnQtd2FsbHBhcGVyLXRpdGxlIj48L2Rpdj4KICAgICAgICAgICAgICAgPGRpdiBpZD0iY3VycmVudC13YWxscGFwZXItZGVzY3JpcHRpb24iPjwvZGl2PgogICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzcGFjZXIiPjwvZGl2PgogICAgICAgICAgICAgPGRpdiBpZD0iY3VycmVudC13YWxscGFwZXItbW9yZS1vcHRpb25zIj4KICAgICAgICAgICAgICAgPGRpdiBpZD0icmVmcmVzaCI+CiAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaWNvbiI+PC9kaXY+CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvZXh0ZW5zaW9ucy90b29sYmFyLmh0bWwgYi9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvZXh0ZW5zaW9ucy90b29sYmFyLmh0bWwKaW5kZXggOWI4NzA2Yi4uMzhjZjExMjQgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3Jlc291cmNlcy9leHRlbnNpb25zL3Rvb2xiYXIuaHRtbAorKysgYi9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvZXh0ZW5zaW9ucy90b29sYmFyLmh0bWwKQEAgLTk3LDEwICs5NywxMSBAQAogICAgICAgICBuYXJyb3ctdGhyZXNob2xkPSIxMDAwIj4KICAgICAgIDxkaXYgY2xhc3M9Im1vcmUtYWN0aW9ucyI+CiAgICAgICAgIDxzcGFuIGlkPSJkZXZNb2RlTGFiZWwiPiRpMThue3Rvb2xiYXJEZXZNb2RlfTwvc3Bhbj4KLSAgICAgICAgPGNyLXRvb2x0aXAtaWNvbiBoaWRkZW4kPSJbWyFkZXZNb2RlQ29udHJvbGxlZEJ5UG9saWN5XV0iCi0gICAgICAgICAgICB0b29sdGlwLXRleHQ9IiRpMThue2NvbnRyb2xsZWRTZXR0aW5nUG9saWN5fSIKLSAgICAgICAgICAgIGljb24tY2xhc3M9ImNyMjA6ZG9tYWluIgotICAgICAgICAgICAgaWNvbi1hcmlhLWxhYmVsPSIkaTE4bntjb250cm9sbGVkU2V0dGluZ1BvbGljeX0iPgorICAgICAgICA8Y3ItdG9vbHRpcC1pY29uIGhpZGRlbj0iW1shc2hvdWxkRGlzYWJsZURldk1vZGVfKAorICAgICAgICAgICAgZGV2TW9kZUNvbnRyb2xsZWRCeVBvbGljeSwgaXNTdXBlcnZpc2VkKV1dIgorICAgICAgICAgICAgdG9vbHRpcC10ZXh0PSJbW2dldFRvb2x0aXBUZXh0Xyhpc1N1cGVydmlzZWQpXV0iCisgICAgICAgICAgICBpY29uLWNsYXNzPSJbW2dldEljb25fKGlzU3VwZXJ2aXNlZCldXSIKKyAgICAgICAgICAgIGljb24tYXJpYS1sYWJlbD0iW1tnZXRUb29sdGlwVGV4dF8oaXNTdXBlcnZpc2VkKV1dIj4KICAgICAgICAgPC9jci10b29sdGlwLWljb24+CiAgICAgICAgIDxjci10b2dnbGUgaWQ9ImRldk1vZGUiIG9uLWNoYW5nZT0ib25EZXZNb2RlVG9nZ2xlQ2hhbmdlXyIKICAgICAgICAgICAgIGRpc2FibGVkPSJbW3Nob3VsZERpc2FibGVEZXZNb2RlXygKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3Jlc291cmNlcy9leHRlbnNpb25zL3Rvb2xiYXIuanMgYi9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvZXh0ZW5zaW9ucy90b29sYmFyLmpzCmluZGV4IGJkMzU5MGUuLjIyOGNjNDUgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3Jlc291cmNlcy9leHRlbnNpb25zL3Rvb2xiYXIuanMKKysrIGIvY2hyb21lL2Jyb3dzZXIvcmVzb3VyY2VzL2V4dGVuc2lvbnMvdG9vbGJhci5qcwpAQCAtNzYsNiArNzYsMjQgQEAKICAgICB9LAogCiAgICAgLyoqCisgICAgICogQHJldHVybiB7c3RyaW5nfQorICAgICAqIEBwcml2YXRlCisgICAgICovCisgICAgZ2V0VG9vbHRpcFRleHRfOiBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiB0aGlzLmkxOG4oCisgICAgICAgICAgdGhpcy5pc1N1cGVydmlzZWQgPyAnY29udHJvbGxlZFNldHRpbmdDaGlsZFJlc3RyaWN0aW9uJyA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29udHJvbGxlZFNldHRpbmdQb2xpY3knKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogQHJldHVybiB7c3RyaW5nfQorICAgICAqIEBwcml2YXRlCisgICAgICovCisgICAgZ2V0SWNvbl86IGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuIHRoaXMuaXNTdXBlcnZpc2VkID8gJ2NyMjA6a2l0ZScgOiAnY3IyMDpkb21haW4nOworICAgIH0sCisKKyAgICAvKioKICAgICAgKiBAcGFyYW0geyFDdXN0b21FdmVudDxib29sZWFuPn0gZQogICAgICAqIEBwcml2YXRlCiAgICAgICovCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvbG9jYWxfbnRwL2xvY2FsX250cC5jc3MgYi9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvbG9jYWxfbnRwL2xvY2FsX250cC5jc3MKaW5kZXggN2Q5YTQwZi4uMTE5YTJkMiAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvcmVzb3VyY2VzL2xvY2FsX250cC9sb2NhbF9udHAuY3NzCisrKyBiL2Nocm9tZS9icm93c2VyL3Jlc291cmNlcy9sb2NhbF9udHAvbG9jYWxfbnRwLmNzcwpAQCAtMjM2LDcgKzIzNiw3IEBACiAgIGJhY2tncm91bmQtcG9zaXRpb24teDogY2FsYygxMDAlIC0gMTZweCk7CiB9CiAKLSNyZWFsYm94LW1hdGNoZXMgYS5yZW1vdmFibGUgeworI3JlYWxib3gtbWF0Y2hlcy5yZW1vdmFibGUgYSB7CiAgIHBhZGRpbmctaW5saW5lLWVuZDogNDhweDsKIH0KIApAQCAtMzA0LDE1ICszMDQsMTYgQEAKIH0KIAogI3JlYWxib3gtbWF0Y2hlcyAucmVtb3ZlLWljb24gewotICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CisgIGhlaWdodDogMTAwJTsKKyAgd2lkdGg6IDEwMCU7Cit9CisKKyNyZWFsYm94LW1hdGNoZXMgYTotd2Via2l0LWFueSg6aG92ZXIsIDpmb2N1cy13aXRoaW4pIC5yZW1vdmUtaWNvbiB7CiAgIC13ZWJraXQtbWFzay1pbWFnZTogdXJsKC4uLy4uLy4uLy4uL3VpL3dlYnVpL3Jlc291cmNlcy9pbWFnZXMvaWNvbl9jbGVhci5zdmcpOwogICAtd2Via2l0LW1hc2stcG9zaXRpb246IGNlbnRlcjsKICAgLXdlYmtpdC1tYXNrLXJlcGVhdDogbm8tcmVwZWF0OwogICAtd2Via2l0LW1hc2stc2l6ZTogMTZweDsKICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKHZhcigtLUdHOTAwLXJnYikpOwotICBib3JkZXI6IG5vbmU7Ci0gIGhlaWdodDogMTAwJTsKLSAgd2lkdGg6IDEwMCU7CiB9CiAKICNmYWtlYm94ID4gaW5wdXQgewpAQCAtODM3LDEzICs4MzgsMTEgQEAKIH0KIAogI3Byb21vID4gZGl2IC5kaXNtaXNzLWljb24gewotICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgIC13ZWJraXQtbWFzay1pbWFnZTogdXJsKC4uLy4uLy4uLy4uL3VpL3dlYnVpL3Jlc291cmNlcy9pbWFnZXMvaWNvbl9jbGVhci5zdmcpOwogICAtd2Via2l0LW1hc2stcG9zaXRpb246IGNlbnRlciBjZW50ZXI7CiAgIC13ZWJraXQtbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDsKICAgLXdlYmtpdC1tYXNrLXNpemU6IDE2cHg7CiAgIGJhY2tncm91bmQtY29sb3I6IHJnYih2YXIoLS1kaXNtaXNzLWJhY2tncm91bmQtcmdiKSk7Ci0gIGJvcmRlcjogbm9uZTsKICAgZGlzcGxheTogYmxvY2s7CiAgIGhlaWdodDogMTAwJTsKICAgb3V0bGluZTogbm9uZTsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3Jlc291cmNlcy9sb2NhbF9udHAvbG9jYWxfbnRwLmpzIGIvY2hyb21lL2Jyb3dzZXIvcmVzb3VyY2VzL2xvY2FsX250cC9sb2NhbF9udHAuanMKaW5kZXggOTI2ODVmYy4uNWUzOTQxYTEgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3Jlc291cmNlcy9sb2NhbF9udHAvbG9jYWxfbnRwLmpzCisrKyBiL2Nocm9tZS9icm93c2VyL3Jlc291cmNlcy9sb2NhbF9udHAvbG9jYWxfbnRwLmpzCkBAIC0xMjQxLDcgKzEyNDEsNyBAQAogICB9CiAKICAgaWYgKGtleSA9PT0gJ0VudGVyJykgewotICAgIGlmIChtYXRjaEVsc1tzZWxlY3RlZF0pIHsKKyAgICBpZiAobWF0Y2hFbHNbc2VsZWN0ZWRdICYmIG1hdGNoRWxzLmNvbmNhdChyZWFsYm94RWwpLmluY2x1ZGVzKGUudGFyZ2V0KSkgewogICAgICAgLy8gTm90ZTogZGlzcGF0Y2hpbmcgYSBNb3VzZUV2ZW50IGhlcmUgaW5zdGVhZCBvZiB1c2luZyBlLmcuIC5jbGljaygpIGFzCiAgICAgICAvLyB0aGlzIGZvcndhcmRzIGtleSBtb2RpZmllcnMuIFRoaXMgZW5hYmxlcyBTaGlmdCtFbnRlciB0byBvcGVuIGEgbWF0Y2gKICAgICAgIC8vIGluIGEgbmV3IHdpbmRvdywgZm9yIGV4YW1wbGUuCkBAIC0xNDQ4LDcgKzE0NDgsNyBAQAogCiAgICAgICByZW1vdmUuYXBwZW5kQ2hpbGQoaWNvbik7CiAgICAgICBtYXRjaEVsLmFwcGVuZENoaWxkKHJlbW92ZSk7Ci0gICAgICBtYXRjaEVsLmNsYXNzTGlzdC5hZGQoQ0xBU1NFUy5SRU1PVkFCTEUpOworICAgICAgcmVhbGJveE1hdGNoZXNFbC5jbGFzc0xpc3QuYWRkKENMQVNTRVMuUkVNT1ZBQkxFKTsKICAgICB9CiAKICAgICAvLyBUT0RPKGNyYnVnLmNvbS8xMDAyNjg5KTogc2V0IGEgbW9yZSB1c2VmdWwgYXJpYS1sYWJlbCBvbiB8bWF0Y2hFbHwsIGFzCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvb21uaWJveC9vbW5pYm94Lmh0bWwgYi9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvb21uaWJveC9vbW5pYm94Lmh0bWwKaW5kZXggNDAyYmVmMC4uZDUyODRmNSAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvcmVzb3VyY2VzL29tbmlib3gvb21uaWJveC5odG1sCisrKyBiL2Nocm9tZS9icm93c2VyL3Jlc291cmNlcy9vbW5pYm94L29tbmlib3guaHRtbApAQCAtMjY4LDEwICsyNjgsOSBAQAogICAgIDxzcGFuIGNsYXNzPSJsYWJlbCI+CiAgICAgICBhbGwgcHJvdmlkZXJzIGRvbmUgPSA8c3BhbiBpZD0iZG9uZSI+PC9zcGFuPgogICAgIDwvc3Bhbj4KKyAgICA8c3BhbiBjbGFzcz0ibGFiZWwiPnR5cGUgPSA8c3BhbiBpZD0idHlwZSI+PC9zcGFuPjwvc3Bhbj4KICAgICA8c3BhbiBjbGFzcz0ibGFiZWwiPmhvc3QgPSA8c3BhbiBpZD0iaG9zdCI+PC9zcGFuPjwvc3Bhbj4KLSAgICA8c3BhbiBjbGFzcz0ibGFiZWwiPgotICAgICAgaGFzIGlzVHlwZWRIb3N0ID0gPHNwYW4gaWQ9ImlzLXR5cGVkLWhvc3QiPjwvc3Bhbj4KLSAgICA8L3NwYW4+CisgICAgPHNwYW4gY2xhc3M9ImxhYmVsIj5pcyB0eXBlZCBob3N0ID0gPHNwYW4gaWQ9ImlzLXR5cGVkLWhvc3QiPjwvc3Bhbj48L3NwYW4+CiAgIDwvdGVtcGxhdGU+CiAKICAgPG9tbmlib3gtaW5wdXQgaWQ9Im9tbmlib3gtaW5wdXQiPjwvb21uaWJveC1pbnB1dD4KZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3Jlc291cmNlcy9vbW5pYm94L29tbmlib3guanMgYi9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvb21uaWJveC9vbW5pYm94LmpzCmluZGV4IGM1ZDBlNzIyLi5iMjdiOGI4ZSAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvcmVzb3VyY2VzL29tbmlib3gvb21uaWJveC5qcworKysgYi9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvb21uaWJveC9vbW5pYm94LmpzCkBAIC0xNTgsNyArMTU4LDYgQEAKICAgZXhwb3J0RGVsZWdhdGUgPSBuZXcgRXhwb3J0RGVsZWdhdGUob21uaWJveE91dHB1dCwgb21uaWJveElucHV0KTsKIAogICBvbW5pYm94SW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigncXVlcnktaW5wdXRzLWNoYW5nZWQnLCBlID0+IHsKLSAgICBvbW5pYm94T3V0cHV0LnVwZGF0ZVF1ZXJ5SW5wdXRzKGUuZGV0YWlsKTsKICAgICBicm93c2VyUHJveHkubWFrZVJlcXVlc3QoCiAgICAgICAgIGUuZGV0YWlsLmlucHV0VGV4dCwgZS5kZXRhaWwucmVzZXRBdXRvY29tcGxldGVDb250cm9sbGVyLAogICAgICAgICBlLmRldGFpbC5jdXJzb3JQb3NpdGlvbiwgZS5kZXRhaWwuemVyb1N1Z2dlc3QsCkBAIC0yMTEsNyArMjEwLDYgQEAKICAgICB9CiAgICAgdGhpcy5vbW5pYm94SW5wdXRfLnF1ZXJ5SW5wdXRzID0gaW1wb3J0RGF0YS5xdWVyeUlucHV0czsKICAgICB0aGlzLm9tbmlib3hJbnB1dF8uZGlzcGxheUlucHV0cyA9IGltcG9ydERhdGEuZGlzcGxheUlucHV0czsKLSAgICB0aGlzLm9tbmlib3hPdXRwdXRfLnVwZGF0ZVF1ZXJ5SW5wdXRzKGltcG9ydERhdGEucXVlcnlJbnB1dHMpOwogICAgIHRoaXMub21uaWJveE91dHB1dF8udXBkYXRlRGlzcGxheUlucHV0cyhpbXBvcnREYXRhLmRpc3BsYXlJbnB1dHMpOwogICAgIHRoaXMub21uaWJveE91dHB1dF8uc2V0UmVzcG9uc2VzSGlzdG9yeShpbXBvcnREYXRhLnJlc3BvbnNlc0hpc3RvcnkpOwogICAgIHJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvcmVzb3VyY2VzL29tbmlib3gvb21uaWJveF9vdXRwdXQuanMgYi9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvb21uaWJveC9vbW5pYm94X291dHB1dC5qcwppbmRleCA3MjE4NGQwLi41MzgxNWM1IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvb21uaWJveC9vbW5pYm94X291dHB1dC5qcworKysgYi9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvb21uaWJveC9vbW5pYm94X291dHB1dC5qcwpAQCAtOCw2ICs4LDcgQEAKICAgICogICBjdXJzb3JQb3NpdGlvbjogbnVtYmVyLAogICAgKiAgIHRpbWU6IG51bWJlciwKICAgICogICBkb25lOiBib29sZWFuLAorICAgKiAgIHR5cGU6IHN0cmluZywKICAgICogICBob3N0OiBzdHJpbmcsCiAgICAqICAgaXNUeXBlZEhvc3Q6IGJvb2xlYW4sCiAgICAqIH19CkBAIC0zMSwxOSArMzIsMTIgQEAKICAgICAgIHRoaXMucmVzcG9uc2VzSGlzdG9yeSA9IFtdOwogICAgICAgLyoqIEBwcml2YXRlIHshQXJyYXk8IU91dHB1dFJlc3VsdHNHcm91cD59ICovCiAgICAgICB0aGlzLnJlc3VsdHNHcm91cHNfID0gW107Ci0gICAgICAvKiogQHByaXZhdGUgeyFRdWVyeUlucHV0c30gKi8KLSAgICAgIHRoaXMucXVlcnlJbnB1dHNfID0gLyoqIEB0eXBlIHshUXVlcnlJbnB1dHN9ICovICh7fSk7CiAgICAgICAvKiogQHByaXZhdGUgeyFEaXNwbGF5SW5wdXRzfSAqLwogICAgICAgdGhpcy5kaXNwbGF5SW5wdXRzXyA9IE9tbmlib3hJbnB1dC5kZWZhdWx0RGlzcGxheUlucHV0czsKICAgICAgIC8qKiBAcHJpdmF0ZSB7c3RyaW5nfSAqLwogICAgICAgdGhpcy5maWx0ZXJUZXh0XyA9ICcnOwogICAgIH0KIAotICAgIC8qKiBAcGFyYW0geyFRdWVyeUlucHV0c30gcXVlcnlJbnB1dHMgKi8KLSAgICB1cGRhdGVRdWVyeUlucHV0cyhxdWVyeUlucHV0cykgewotICAgICAgdGhpcy5xdWVyeUlucHV0c18gPSBxdWVyeUlucHV0czsKLSAgICB9Ci0KICAgICAvKiogQHBhcmFtIHshRGlzcGxheUlucHV0c30gZGlzcGxheUlucHV0cyAqLwogICAgIHVwZGF0ZURpc3BsYXlJbnB1dHMoZGlzcGxheUlucHV0cykgewogICAgICAgdGhpcy5kaXNwbGF5SW5wdXRzXyA9IGRpc3BsYXlJbnB1dHM7CkBAIC0xMDMsOCArOTcsNyBAQAogICAgICAqIEBwcml2YXRlIEBwYXJhbSB7IW1vam9tLk9tbmlib3hSZXNwb25zZX0gcmVzcG9uc2UKICAgICAgKi8KICAgICBjcmVhdGVSZXN1bHRzR3JvdXBfKHJlc3BvbnNlKSB7Ci0gICAgICBjb25zdCByZXN1bHRzR3JvdXAgPQotICAgICAgICAgIE91dHB1dFJlc3VsdHNHcm91cC5jcmVhdGUocmVzcG9uc2UsIHRoaXMucXVlcnlJbnB1dHNfLmN1cnNvclBvc2l0aW9uKTsKKyAgICAgIGNvbnN0IHJlc3VsdHNHcm91cCA9IE91dHB1dFJlc3VsdHNHcm91cC5jcmVhdGUocmVzcG9uc2UpOwogICAgICAgdGhpcy5yZXN1bHRzR3JvdXBzXy5wdXNoKHJlc3VsdHNHcm91cCk7CiAgICAgICB0aGlzLiQkKCcjY29udGVudHMnKS5hcHBlbmRDaGlsZChyZXN1bHRzR3JvdXApOwogCkBAIC0xOTAsMTIgKzE4MywxMSBAQAogICBjbGFzcyBPdXRwdXRSZXN1bHRzR3JvdXAgZXh0ZW5kcyBPbW5pYm94RWxlbWVudCB7CiAgICAgLyoqCiAgICAgICogQHBhcmFtIHshbW9qb20uT21uaWJveFJlc3BvbnNlfSByZXN1bHRzR3JvdXAKLSAgICAgKiBAcGFyYW0ge251bWJlcn0gY3Vyc29yUG9zaXRpb24KICAgICAgKiBAcmV0dXJuIHshT3V0cHV0UmVzdWx0c0dyb3VwfQogICAgICAqLwotICAgIHN0YXRpYyBjcmVhdGUocmVzdWx0c0dyb3VwLCBjdXJzb3JQb3NpdGlvbikgeworICAgIHN0YXRpYyBjcmVhdGUocmVzdWx0c0dyb3VwKSB7CiAgICAgICBjb25zdCBvdXRwdXRSZXN1bHRzR3JvdXAgPSBuZXcgT3V0cHV0UmVzdWx0c0dyb3VwKCk7Ci0gICAgICBvdXRwdXRSZXN1bHRzR3JvdXAuc2V0UmVzdWx0c0dyb3VwKHJlc3VsdHNHcm91cCwgY3Vyc29yUG9zaXRpb24pOworICAgICAgb3V0cHV0UmVzdWx0c0dyb3VwLnNldFJlc3VsdHNHcm91cChyZXN1bHRzR3JvdXApOwogICAgICAgcmV0dXJuIG91dHB1dFJlc3VsdHNHcm91cDsKICAgICB9CiAKQEAgLTIwMywxOCArMTk1LDE2IEBACiAgICAgICBzdXBlcignb3V0cHV0LXJlc3VsdHMtZ3JvdXAtdGVtcGxhdGUnKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiAgQHBhcmFtIHshbW9qb20uT21uaWJveFJlc3BvbnNlfSByZXN1bHRzR3JvdXAKLSAgICAgKiAgQHBhcmFtIHtudW1iZXJ9IGN1cnNvclBvc2l0aW9uCi0gICAgICovCi0gICAgc2V0UmVzdWx0c0dyb3VwKHJlc3VsdHNHcm91cCwgY3Vyc29yUG9zaXRpb24pIHsKKyAgICAvKiogQHBhcmFtIHshbW9qb20uT21uaWJveFJlc3BvbnNlfSByZXN1bHRzR3JvdXAgKi8KKyAgICBzZXRSZXN1bHRzR3JvdXAocmVzdWx0c0dyb3VwKSB7CiAgICAgICAvKiogQHByaXZhdGUge1Jlc3VsdHNEZXRhaWxzfSAqLwogICAgICAgdGhpcy5kZXRhaWxzXyA9IHsKLSAgICAgICAgY3Vyc29yUG9zaXRpb246IGN1cnNvclBvc2l0aW9uLAorICAgICAgICBjdXJzb3JQb3NpdGlvbjogcmVzdWx0c0dyb3VwLmN1cnNvclBvc2l0aW9uLAogICAgICAgICB0aW1lOiByZXN1bHRzR3JvdXAudGltZVNpbmNlT21uaWJveFN0YXJ0ZWRNcywKICAgICAgICAgZG9uZTogcmVzdWx0c0dyb3VwLmRvbmUsCisgICAgICAgIHR5cGU6IHJlc3VsdHNHcm91cC50eXBlLAogICAgICAgICBob3N0OiByZXN1bHRzR3JvdXAuaG9zdCwKLSAgICAgICAgaXNUeXBlZEhvc3Q6IHJlc3VsdHNHcm91cC5pc1R5cGVkSG9zdAorICAgICAgICBpc1R5cGVkSG9zdDogcmVzdWx0c0dyb3VwLmlzVHlwZWRIb3N0LAogICAgICAgfTsKICAgICAgIC8qKiBAdHlwZSB7IUFycmF5PCFPdXRwdXRIZWFkZXI+fSAqLwogICAgICAgdGhpcy5oZWFkZXJzID0gQ09MVU1OUy5tYXAoT3V0cHV0SGVhZGVyLmNyZWF0ZSk7CkBAIC0zNTMsNiArMzQzLDcgQEAKICAgICAgIHRoaXMuJCQoJyNjdXJzb3ItcG9zaXRpb24nKS50ZXh0Q29udGVudCA9IGRldGFpbHMuY3Vyc29yUG9zaXRpb247CiAgICAgICB0aGlzLiQkKCcjdGltZScpLnRleHRDb250ZW50ID0gZGV0YWlscy50aW1lOwogICAgICAgdGhpcy4kJCgnI2RvbmUnKS50ZXh0Q29udGVudCA9IGRldGFpbHMuZG9uZTsKKyAgICAgIHRoaXMuJCQoJyN0eXBlJykudGV4dENvbnRlbnQgPSBkZXRhaWxzLnR5cGU7CiAgICAgICB0aGlzLiQkKCcjaG9zdCcpLnRleHRDb250ZW50ID0gZGV0YWlscy5ob3N0OwogICAgICAgdGhpcy4kJCgnI2lzLXR5cGVkLWhvc3QnKS50ZXh0Q29udGVudCA9IGRldGFpbHMuaXNUeXBlZEhvc3Q7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvcmVzb3VyY2VzL3NldHRpbmdzL2Fib3V0X3BhZ2UvYWJvdXRfcGFnZS5odG1sIGIvY2hyb21lL2Jyb3dzZXIvcmVzb3VyY2VzL3NldHRpbmdzL2Fib3V0X3BhZ2UvYWJvdXRfcGFnZS5odG1sCmluZGV4IGFhZDc5NzVkLi45OWMwYTFjMSAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvcmVzb3VyY2VzL3NldHRpbmdzL2Fib3V0X3BhZ2UvYWJvdXRfcGFnZS5odG1sCisrKyBiL2Nocm9tZS9icm93c2VyL3Jlc291cmNlcy9zZXR0aW5ncy9hYm91dF9wYWdlL2Fib3V0X3BhZ2UuaHRtbApAQCAtMTUxLDE0ICsxNTEsMTkgQEAKICAgICAgICAgICAgICAgPC9zcGFuPgogPC9pZj4KIDxpZiBleHByPSJjaHJvbWVvcyI+Ci0gICAgICAgICAgICAgPGRpdiBpZD0iZW5kT2ZMaWZlTWVzc2FnZUNvbnRhaW5lciIgaGlkZGVuPSJbWyFoYXNFbmRPZkxpZmVfXV0iPgotICAgICAgICAgICAgICAgJGkxOG57ZW5kT2ZMaWZlTWVzc2FnZX0KLSAgICAgICAgICAgICAgIDxhIGhyZWY9IiRpMThue2VuZE9mTGlmZUxlYXJuTW9yZVVSTH0iIHRhcmdldD0iX2JsYW5rIj4KLSAgICAgICAgICAgICAgICAgJGkxOG57bGVhcm5Nb3JlfQotICAgICAgICAgICAgICAgPC9hPgotICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICA8ZGl2IGlkPSJlbmRPZkxpZmVNZXNzYWdlQ29udGFpbmVyIiBoaWRkZW49IltbIWhhc0VuZE9mTGlmZV9dXSI+CisgICAgICAgICAgICAgICAgJGkxOG57ZW5kT2ZMaWZlTWVzc2FnZX0KKyAgICAgICAgICAgICAgICA8YSBocmVmPSIkaTE4bntlbmRPZkxpZmVMZWFybk1vcmVVUkx9IiB0YXJnZXQ9Il9ibGFuayI+CisgICAgICAgICAgICAgICAgICAkaTE4bntsZWFybk1vcmV9CisgICAgICAgICAgICAgICAgPC9hPgorICAgICAgICAgICAgICA8L2Rpdj4KIDwvaWY+CiAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlY29uZGFyeSI+JGkxOG57YWJvdXRCcm93c2VyVmVyc2lvbn08L2Rpdj4KKzxpZiBleHByPSJjaHJvbWVvcyI+CisgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlY29uZGFyeSIKKyAgICAgICAgICAgICAgICAgIGlubmVyLWgtdC1tLWw9IltbZ2V0VXBkYXRlT3NTZXR0aW5nc0xpbmtfKCldXSI+CisgICAgICAgICAgICAgIDwvZGl2PgorPC9pZj4KICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VwYXJhdG9yIiBoaWRkZW49IltbIXNob3dCdXR0b25Db250YWluZXJfXV0iPjwvZGl2PgogICAgICAgICAgICAgPHNwYW4gaWQ9ImJ1dHRvbkNvbnRhaW5lciIgaGlkZGVuPSJbWyFzaG93QnV0dG9uQ29udGFpbmVyX11dIj4KZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3Jlc291cmNlcy9zZXR0aW5ncy9hYm91dF9wYWdlL2Fib3V0X3BhZ2UuanMgYi9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvc2V0dGluZ3MvYWJvdXRfcGFnZS9hYm91dF9wYWdlLmpzCmluZGV4IGE1YzUzODguLmNkYjg0NTExIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvc2V0dGluZ3MvYWJvdXRfcGFnZS9hYm91dF9wYWdlLmpzCisrKyBiL2Nocm9tZS9icm93c2VyL3Jlc291cmNlcy9zZXR0aW5ncy9hYm91dF9wYWdlL2Fib3V0X3BhZ2UuanMKQEAgLTYzMiw2ICs2MzIsMjAgQEAKICAgICAgICAgdGhpcy5pMThuQWR2YW5jZWQoJ2Fib3V0UHJvZHVjdE9zTGljZW5zZScpOwogICB9LAogCisgIC8vIDxpZiBleHByPSJjaHJvbWVvcyI+CisgIC8qKgorICAgKiBAcmV0dXJuIHtzdHJpbmd9CisgICAqIEBwcml2YXRlCisgICAqLworICBnZXRVcGRhdGVPc1NldHRpbmdzTGlua186IGZ1bmN0aW9uKCkgeworICAgIC8vIE5vdGU6IFRoaXMgc3RyaW5nIGNvbnRhaW5zIHJhdyBIVE1MIGFuZCB0aHVzIHJlcXVpcmVzIGkxOG5BZHZhbmNlZCgpLgorICAgIC8vIFNpbmNlIHRoZSBpMThuIHRlbXBsYXRlIHN5bnRheCAoZS5nLiwgJGkxOG57fSkgZG9lcyBub3QgaW5jbHVkZSBhbgorICAgIC8vICJhZHZhbmNlZCIgdmVyc2lvbiwgaXQncyBub3QgcG9zc2libGUgdG8gaW5saW5lIHRoaXMgbGluayBkaXJlY3RseSBpbiB0aGUKKyAgICAvLyBIVE1MLgorICAgIHJldHVybiB0aGlzLmkxOG5BZHZhbmNlZCgnYWJvdXRVcGRhdGVPc1NldHRpbmdzTGluaycpOworICB9LAorICAvLyA8L2lmPgorCiAgIC8qKgogICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVuYWJsZWQgVHJ1ZSBpZiBDcm9zdGluaSBpcyBlbmFibGVkLgogICAgKiBAcHJpdmF0ZQpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvcmVzb3VyY2VzL3NldHRpbmdzL2Nocm9tZW9zL29zX2FwcHNfcGFnZS9hcHBfbWFuYWdlbWVudF9wYWdlL2Nocm9tZV9hcHBfcGVybWlzc2lvbl92aWV3Lmh0bWwgYi9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvc2V0dGluZ3MvY2hyb21lb3Mvb3NfYXBwc19wYWdlL2FwcF9tYW5hZ2VtZW50X3BhZ2UvY2hyb21lX2FwcF9wZXJtaXNzaW9uX3ZpZXcuaHRtbAppbmRleCBlMGE0ZGE5Li5lZjdkODM2IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvc2V0dGluZ3MvY2hyb21lb3Mvb3NfYXBwc19wYWdlL2FwcF9tYW5hZ2VtZW50X3BhZ2UvY2hyb21lX2FwcF9wZXJtaXNzaW9uX3ZpZXcuaHRtbAorKysgYi9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvc2V0dGluZ3MvY2hyb21lb3Mvb3NfYXBwc19wYWdlL2FwcF9tYW5hZ2VtZW50X3BhZ2UvY2hyb21lX2FwcF9wZXJtaXNzaW9uX3ZpZXcuaHRtbApAQCAtMTQsMTEgKzE0LDYgQEAKICAgICAgICAgYm9yZGVyLXRvcDogbm9uZTsKICAgICAgIH0KIAotICAgICAgI2FwcC1kZXNjcmlwdGlvbiB7Ci0gICAgICAgIHBhZGRpbmctYm90dG9tOiAxMnB4OwotICAgICAgICBwYWRkaW5nLXRvcDogMjRweDsKLSAgICAgIH0KLQogICAgICAgI25vLXBlcm1pc3Npb25zIHsKICAgICAgICAgYm9yZGVyLXRvcDogbm9uZTsKICAgICAgIH0KQEAgLTI5LDkgKzI0LDYgQEAKIAogICAgIDwvc3R5bGU+CiAgICAgPGRpdj4KLSAgICAgIDxkaXYgaWQ9ImFwcC1kZXNjcmlwdGlvbiIgY2xhc3M9InBlcm1pc3Npb24tY2FyZC1yb3ciPgotICAgICAgICBbW2FwcF8uZGVzY3JpcHRpb25dXQotICAgICAgPC9kaXY+CiAgICAgICA8ZGl2IGNsYXNzPSJwZXJtaXNzaW9uLWxpc3QiPgogICAgICAgICA8YXBwLW1hbmFnZW1lbnQtcGluLXRvLXNoZWxmLWl0ZW0KICAgICAgICAgICBpZD0icGluLXRvLXNoZWxmLXNldHRpbmciCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvc2V0dGluZ3MvY2hyb21lb3Mvb3NfYXBwc19wYWdlL2FwcF9tYW5hZ2VtZW50X3BhZ2UvY2hyb21lX2FwcF9wZXJtaXNzaW9uX3ZpZXcuanMgYi9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvc2V0dGluZ3MvY2hyb21lb3Mvb3NfYXBwc19wYWdlL2FwcF9tYW5hZ2VtZW50X3BhZ2UvY2hyb21lX2FwcF9wZXJtaXNzaW9uX3ZpZXcuanMKaW5kZXggNGE5NzdiZTk4Li5jZjZiZDBiIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvc2V0dGluZ3MvY2hyb21lb3Mvb3NfYXBwc19wYWdlL2FwcF9tYW5hZ2VtZW50X3BhZ2UvY2hyb21lX2FwcF9wZXJtaXNzaW9uX3ZpZXcuanMKKysrIGIvY2hyb21lL2Jyb3dzZXIvcmVzb3VyY2VzL3NldHRpbmdzL2Nocm9tZW9zL29zX2FwcHNfcGFnZS9hcHBfbWFuYWdlbWVudF9wYWdlL2Nocm9tZV9hcHBfcGVybWlzc2lvbl92aWV3LmpzCkBAIC0zNiw3ICszNiw2IEBACiAgICAgY29uc3Qge21lc3NhZ2VzOiBtZXNzYWdlc30gPQogICAgICAgICBhd2FpdCBhcHBfbWFuYWdlbWVudC5Ccm93c2VyUHJveHkuZ2V0SW5zdGFuY2UoKQogICAgICAgICAgICAgLmhhbmRsZXIuZ2V0RXh0ZW5zaW9uQXBwUGVybWlzc2lvbk1lc3NhZ2VzKHRoaXMuYXBwXy5pZCk7Ci0gICAgdGhpcy4kWydhcHAtZGVzY3JpcHRpb24nXS5oaWRkZW4gPSB0aGlzLmFwcF8uZGVzY3JpcHRpb24ubGVuZ3RoID09PSAwOwogICAgIHRoaXMubWVzc2FnZXNfID0gbWVzc2FnZXM7CiAgIH0sCiAKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3Jlc291cmNlcy9zZXR0aW5ncy9jaHJvbWVvcy9vc19hcHBzX3BhZ2UvYXBwX21hbmFnZW1lbnRfcGFnZS91bmluc3RhbGxfYnV0dG9uLmh0bWwgYi9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvc2V0dGluZ3MvY2hyb21lb3Mvb3NfYXBwc19wYWdlL2FwcF9tYW5hZ2VtZW50X3BhZ2UvdW5pbnN0YWxsX2J1dHRvbi5odG1sCmluZGV4IDY5NzQ5ZTkuLjY3MTFmNGVlIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvc2V0dGluZ3MvY2hyb21lb3Mvb3NfYXBwc19wYWdlL2FwcF9tYW5hZ2VtZW50X3BhZ2UvdW5pbnN0YWxsX2J1dHRvbi5odG1sCisrKyBiL2Nocm9tZS9icm93c2VyL3Jlc291cmNlcy9zZXR0aW5ncy9jaHJvbWVvcy9vc19hcHBzX3BhZ2UvYXBwX21hbmFnZW1lbnRfcGFnZS91bmluc3RhbGxfYnV0dG9uLmh0bWwKQEAgLTI1LDE1ICsyNSwxNyBAQAogICAgICAgPGNyLXRvb2x0aXAtaWNvbgogICAgICAgICAgIGlkPSJwb2xpY3lJbmRpY2F0b3IiCiAgICAgICAgICAgaWNvbi1jbGFzcz0iY3IyMDpkb21haW4iCi0gICAgICAgICAgdG9vbHRpcC10ZXh0PSJbW2dldFRvb2x0aXBfKGFwcF8pXV0iCi0gICAgICAgICAgaWNvbi1hcmlhLWxhYmVsPSJbW2dldFRvb2x0aXBfKGFwcF8pXV0iCisgICAgICAgICAgdG9vbHRpcC10ZXh0PSIkaTE4bntwb2xpY3lBcHBVbmluc3RhbGxQb2xpY3l9IgorICAgICAgICAgIGljb24tYXJpYS1sYWJlbD0iJGkxOG57cG9saWN5QXBwVW5pbnN0YWxsUG9saWN5fSIKICAgICAgICAgICB0b29sdGlwLXBvc2l0aW9uPSJib3R0b20iPgogICAgICAgPC9jci10b29sdGlwLWljb24+CiAgICAgPC90ZW1wbGF0ZT4KLSAgICA8Y3ItYnV0dG9uIGlkPSJ1bmluc3RhbGxCdXR0b24iIG9uLWNsaWNrPSJvbkNsaWNrXyIKLSAgICAgICAgZGlzYWJsZWQkPSJbW2dldERpc2FibGVTdGF0ZV8oYXBwXyldXSI+Ci0gICAgICAkaTE4bnt1bmluc3RhbGxBcHB9Ci0gICAgPC9jci1idXR0b24+CisgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3dVbmluc3RhbGxCdXR0b25fKGFwcF8pXV0iPgorICAgICAgPGNyLWJ1dHRvbiBpZD0idW5pbnN0YWxsQnV0dG9uIiBvbi1jbGljaz0ib25DbGlja18iCisgICAgICAgICAgZGlzYWJsZWQkPSJbW2dldERpc2FibGVTdGF0ZV8oYXBwXyldXSI+CisgICAgICAgICRpMThue3VuaW5zdGFsbEFwcH0KKyAgICAgIDwvY3ItYnV0dG9uPgorICAgIDwvdGVtcGxhdGU+CiAgIDwvdGVtcGxhdGU+CiAgIDxzY3JpcHQgc3JjPSJ1bmluc3RhbGxfYnV0dG9uLmpzIj48L3NjcmlwdD4KIDwvZG9tLW1vZHVsZT4KZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3Jlc291cmNlcy9zZXR0aW5ncy9jaHJvbWVvcy9vc19hcHBzX3BhZ2UvYXBwX21hbmFnZW1lbnRfcGFnZS91bmluc3RhbGxfYnV0dG9uLmpzIGIvY2hyb21lL2Jyb3dzZXIvcmVzb3VyY2VzL3NldHRpbmdzL2Nocm9tZW9zL29zX2FwcHNfcGFnZS9hcHBfbWFuYWdlbWVudF9wYWdlL3VuaW5zdGFsbF9idXR0b24uanMKaW5kZXggM2I2Y2U0My4uNDBiMzYyOWZiIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvc2V0dGluZ3MvY2hyb21lb3Mvb3NfYXBwc19wYWdlL2FwcF9tYW5hZ2VtZW50X3BhZ2UvdW5pbnN0YWxsX2J1dHRvbi5qcworKysgYi9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvc2V0dGluZ3MvY2hyb21lb3Mvb3NfYXBwc19wYWdlL2FwcF9tYW5hZ2VtZW50X3BhZ2UvdW5pbnN0YWxsX2J1dHRvbi5qcwpAQCAtNiw3ICs2LDYgQEAKICAgaXM6ICdhcHAtbWFuYWdlbWVudC11bmluc3RhbGwtYnV0dG9uJywKIAogICBiZWhhdmlvcnM6IFsKLSAgICBJMThuQmVoYXZpb3IsCiAgICAgYXBwX21hbmFnZW1lbnQuU3RvcmVDbGllbnQsCiAgIF0sCiAKQEAgLTUwLDI5ICs0OSw3IEBACiAgIH0sCiAKICAgLyoqCi0gICAqIFJldHVybnMgc3RyaW5nIHRvIGJlIHNob3duIGFzIGEgdG9vbCB0aXAgb3ZlciB0aGUgcG9saWN5IGluZGljYXRvci4KLSAgICoKLSAgICogQHBhcmFtIHtBcHB9IGFwcAotICAgKiBAcmV0dXJuIHs/c3RyaW5nfQotICAgKiBAcHJpdmF0ZQotICAgKi8KLSAgZ2V0VG9vbHRpcF86IGZ1bmN0aW9uKGFwcCkgewotICAgIGlmICghYXBwKSB7Ci0gICAgICByZXR1cm4gJyc7Ci0gICAgfQotCi0gICAgc3dpdGNoIChhcHAuaW5zdGFsbFNvdXJjZSkgewotICAgICAgY2FzZSBJbnN0YWxsU291cmNlLmtTeXN0ZW06Ci0gICAgICAgIHJldHVybiB0aGlzLmkxOG4oJ3N5c3RlbUFwcFVuaW5zdGFsbFBvbGljeScpOwotICAgICAgY2FzZSBJbnN0YWxsU291cmNlLmtQb2xpY3k6Ci0gICAgICAgIHJldHVybiB0aGlzLmkxOG4oJ3BvbGljeUFwcFVuaW5zdGFsbFBvbGljeScpOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYXNzZXJ0Tm90UmVhY2hlZCgpOwotICAgIH0KLSAgfSwKLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBhcHAgd2FzIGluc3RhbGxlZCBieSBhIHBvbGljeQorICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGFwcCB3YXMgaW5zdGFsbGVkIGJ5IGEgcG9saWN5LgogICAgKgogICAgKiBAcGFyYW0ge0FwcH0gYXBwCiAgICAqIEByZXR1cm5zIHtib29sZWFufQpAQCAtODIsOCArNTksMTkgQEAKICAgICBpZiAoIWFwcCkgewogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICByZXR1cm4gYXBwLmluc3RhbGxTb3VyY2UgPT09IEluc3RhbGxTb3VyY2Uua1BvbGljeSB8fAotICAgICAgICBhcHAuaW5zdGFsbFNvdXJjZSA9PT0gSW5zdGFsbFNvdXJjZS5rU3lzdGVtOworICAgIHJldHVybiBhcHAuaW5zdGFsbFNvdXJjZSA9PT0gSW5zdGFsbFNvdXJjZS5rUG9saWN5OworICB9LAorCisgIC8qKgorICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHVuaW5zdGFsbCBidXR0b24gc2hvdWxkIGJlIHNob3duLgorICAgKgorICAgKiBAcGFyYW0ge0FwcH0gYXBwCisgICAqLworICBzaG93VW5pbnN0YWxsQnV0dG9uXzogZnVuY3Rpb24oYXBwKSB7CisgICAgaWYgKCFhcHApIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIGFwcC5pbnN0YWxsU291cmNlICE9PSBJbnN0YWxsU291cmNlLmtTeXN0ZW07CiAgIH0sCiAKICAgLyoqCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvc2V0dGluZ3MvaW50ZXJuZXRfcGFnZS9pbnRlcm5ldF9kZXRhaWxfcGFnZS5qcyBiL2Nocm9tZS9icm93c2VyL3Jlc291cmNlcy9zZXR0aW5ncy9pbnRlcm5ldF9wYWdlL2ludGVybmV0X2RldGFpbF9wYWdlLmpzCmluZGV4IDNjOTNlZmQuLmJmZGZmYjIgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3Jlc291cmNlcy9zZXR0aW5ncy9pbnRlcm5ldF9wYWdlL2ludGVybmV0X2RldGFpbF9wYWdlLmpzCisrKyBiL2Nocm9tZS9icm93c2VyL3Jlc291cmNlcy9zZXR0aW5ncy9pbnRlcm5ldF9wYWdlL2ludGVybmV0X2RldGFpbF9wYWdlLmpzCkBAIC0yNDMsNiArMjQzLDcgQEAKICAgICB0aGlzLmd1aWQgPSBndWlkOwogICAgIC8vIFNldCBkZWZhdWx0IHByb3BlcnRpZXMgdW50aWwgdGhleSBhcmUgbG9hZGVkLgogICAgIHRoaXMucHJvcGVydGllc1JlY2VpdmVkXyA9IGZhbHNlOworICAgIHRoaXMuZGV2aWNlU3RhdGVfID0gbnVsbDsKICAgICB0aGlzLm1hbmFnZWRQcm9wZXJ0aWVzXyA9IE9uY01vam8uZ2V0RGVmYXVsdE1hbmFnZWRQcm9wZXJ0aWVzKAogICAgICAgICBPbmNNb2pvLmdldE5ldHdvcmtUeXBlRnJvbVN0cmluZyh0eXBlKSwgdGhpcy5ndWlkLCBuYW1lKTsKICAgICB0aGlzLmRpZFNldEZvY3VzXyA9IGZhbHNlOwpAQCAtMzY0LDE1ICszNjUsMTAgQEAKICAgICBpZiAoIXRoaXMubWFuYWdlZFByb3BlcnRpZXNfKSB7CiAgICAgICByZXR1cm47CiAgICAgfQorICAgIGNvbnN0IHR5cGUgPSB0aGlzLm1hbmFnZWRQcm9wZXJ0aWVzXy50eXBlOwogICAgIHRoaXMubmV0d29ya0NvbmZpZ18uZ2V0RGV2aWNlU3RhdGVMaXN0KCkudGhlbihyZXNwb25zZSA9PiB7Ci0gICAgICBpZiAoIXRoaXMubWFuYWdlZFByb3BlcnRpZXNfKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQogICAgICAgY29uc3QgZGV2aWNlcyA9IHJlc3BvbnNlLnJlc3VsdDsKLSAgICAgIHRoaXMuZGV2aWNlU3RhdGVfID0KLSAgICAgICAgICBkZXZpY2VzLmZpbmQoZGV2aWNlID0+IGRldmljZS50eXBlID09IHRoaXMubWFuYWdlZFByb3BlcnRpZXNfLnR5cGUpIHx8Ci0gICAgICAgICAgbnVsbDsKKyAgICAgIHRoaXMuZGV2aWNlU3RhdGVfID0gZGV2aWNlcy5maW5kKGRldmljZSA9PiBkZXZpY2UudHlwZSA9PSB0eXBlKSB8fCBudWxsOwogICAgIH0pOwogICB9LAogCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvc2V0dGluZ3Mvcm91dGUuanMgYi9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvc2V0dGluZ3Mvcm91dGUuanMKaW5kZXggMDVkYWIxMS4uMDkxYmI5MzNlIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9yZXNvdXJjZXMvc2V0dGluZ3Mvcm91dGUuanMKKysrIGIvY2hyb21lL2Jyb3dzZXIvcmVzb3VyY2VzL3NldHRpbmdzL3JvdXRlLmpzCkBAIC03NTMsOSArNzUzLDEyIEBACiAgICAgICB0aGlzLmluaXRpYWxpemVSb3V0ZUZyb21VcmxDYWxsZWRfID0gdHJ1ZTsKIAogICAgICAgY29uc3Qgcm91dGUgPSB0aGlzLmdldFJvdXRlRm9yUGF0aCh3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUpOwotICAgICAgaWYgKHJvdXRlKSB7Ci0gICAgICAgIHRoaXMucmVjb3JkTWV0cmljcyh3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUpOwotICAgICAgfQorCisgICAgICAvLyBSZWNvcmQgYWxsIGNvcnJlY3QgcGF0aHMgZW50ZXJlZCBvbiB0aGUgc2V0dGluZ3MgcGFnZSwgYW5kCisgICAgICAvLyBhcyBhbGwgaW5jb3JyZWN0IHBhdGhzIGFyZSByb3V0ZWQgdG8gdGhlIG1haW4gc2V0dGluZ3MgcGFnZSwKKyAgICAgIC8vIHJlY29yZCBhbGwgaW5jb3JyZWN0IHBhdGhzIGFzIGhpdHRpbmcgdGhlIG1haW4gc2V0dGluZ3MgcGFnZS4KKyAgICAgIHRoaXMucmVjb3JkTWV0cmljcyhyb3V0ZSA/IHJvdXRlLnBhdGggOiB0aGlzLnJvdXRlc18uQkFTSUMucGF0aCk7CisKICAgICAgIC8vIE5ldmVyIGFsbG93IGRpcmVjdCBuYXZpZ2F0aW9uIHRvIEFEVkFOQ0VELgogICAgICAgaWYgKHJvdXRlICYmIHJvdXRlICE9IHRoaXMucm91dGVzXy5BRFZBTkNFRCkgewogICAgICAgICB0aGlzLmN1cnJlbnRSb3V0ZSA9IHJvdXRlOwpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvc2FmZV9icm93c2luZy9hbmRyb2lkL3NlcnZpY2VzX2RlbGVnYXRlX2FuZHJvaWQuY2MgYi9jaHJvbWUvYnJvd3Nlci9zYWZlX2Jyb3dzaW5nL2FuZHJvaWQvc2VydmljZXNfZGVsZWdhdGVfYW5kcm9pZC5jYwppbmRleCBkM2RmNmU3Yi4uYWFmOGQ1ZSAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvc2FmZV9icm93c2luZy9hbmRyb2lkL3NlcnZpY2VzX2RlbGVnYXRlX2FuZHJvaWQuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvc2FmZV9icm93c2luZy9hbmRyb2lkL3NlcnZpY2VzX2RlbGVnYXRlX2FuZHJvaWQuY2MKQEAgLTEyMiwxNCArMTIyLDYgQEAKICAgcmV0dXJuIHRlbGVtZXRyeV9zZXJ2aWNlXy5nZXQoKTsKIH0KIAotdm9pZCBTZXJ2aWNlc0RlbGVnYXRlQW5kcm9pZDo6Q3JlYXRlVmVyZGljdENhY2hlTWFuYWdlcihQcm9maWxlKiBwcm9maWxlKSB7fQotdm9pZCBTZXJ2aWNlc0RlbGVnYXRlQW5kcm9pZDo6UmVtb3ZlVmVyZGljdENhY2hlTWFuYWdlcihQcm9maWxlKiBwcm9maWxlKSB7fQotVmVyZGljdENhY2hlTWFuYWdlciogU2VydmljZXNEZWxlZ2F0ZUFuZHJvaWQ6OkdldFZlcmRpY3RDYWNoZU1hbmFnZXIoCi0gICAgUHJvZmlsZSogcHJvZmlsZSkgY29uc3QgewotICBOT1RJTVBMRU1FTlRFRCgpOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLQogdm9pZCBTZXJ2aWNlc0RlbGVnYXRlQW5kcm9pZDo6Q3JlYXRlQmluYXJ5VXBsb2FkU2VydmljZShQcm9maWxlKiBwcm9maWxlKSB7fQogdm9pZCBTZXJ2aWNlc0RlbGVnYXRlQW5kcm9pZDo6UmVtb3ZlQmluYXJ5VXBsb2FkU2VydmljZShQcm9maWxlKiBwcm9maWxlKSB7fQogQmluYXJ5VXBsb2FkU2VydmljZSogU2VydmljZXNEZWxlZ2F0ZUFuZHJvaWQ6OkdldEJpbmFyeVVwbG9hZFNlcnZpY2UoCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9zYWZlX2Jyb3dzaW5nL2FuZHJvaWQvc2VydmljZXNfZGVsZWdhdGVfYW5kcm9pZC5oIGIvY2hyb21lL2Jyb3dzZXIvc2FmZV9icm93c2luZy9hbmRyb2lkL3NlcnZpY2VzX2RlbGVnYXRlX2FuZHJvaWQuaAppbmRleCA0MzI5Mzc0Li4wZTU3NmMwIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9zYWZlX2Jyb3dzaW5nL2FuZHJvaWQvc2VydmljZXNfZGVsZWdhdGVfYW5kcm9pZC5oCisrKyBiL2Nocm9tZS9icm93c2VyL3NhZmVfYnJvd3NpbmcvYW5kcm9pZC9zZXJ2aWNlc19kZWxlZ2F0ZV9hbmRyb2lkLmgKQEAgLTUwLDEwICs1MCw2IEBACiAgIHZvaWQgUmVtb3ZlVGVsZW1ldHJ5U2VydmljZSgpIG92ZXJyaWRlOwogICBUZWxlbWV0cnlTZXJ2aWNlKiBHZXRUZWxlbWV0cnlTZXJ2aWNlKCkgY29uc3Qgb3ZlcnJpZGU7CiAKLSAgdm9pZCBDcmVhdGVWZXJkaWN0Q2FjaGVNYW5hZ2VyKFByb2ZpbGUqIHByb2ZpbGUpIG92ZXJyaWRlOwotICB2b2lkIFJlbW92ZVZlcmRpY3RDYWNoZU1hbmFnZXIoUHJvZmlsZSogcHJvZmlsZSkgb3ZlcnJpZGU7Ci0gIFZlcmRpY3RDYWNoZU1hbmFnZXIqIEdldFZlcmRpY3RDYWNoZU1hbmFnZXIoUHJvZmlsZSogcHJvZmlsZSkgY29uc3Qgb3ZlcnJpZGU7Ci0KICAgdm9pZCBDcmVhdGVCaW5hcnlVcGxvYWRTZXJ2aWNlKFByb2ZpbGUqIHByb2ZpbGUpIG92ZXJyaWRlOwogICB2b2lkIFJlbW92ZUJpbmFyeVVwbG9hZFNlcnZpY2UoUHJvZmlsZSogcHJvZmlsZSkgb3ZlcnJpZGU7CiAgIEJpbmFyeVVwbG9hZFNlcnZpY2UqIEdldEJpbmFyeVVwbG9hZFNlcnZpY2UoUHJvZmlsZSogcHJvZmlsZSkgY29uc3Qgb3ZlcnJpZGU7CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9zYWZlX2Jyb3dzaW5nL2Nocm9tZV9wYXNzd29yZF9wcm90ZWN0aW9uX3NlcnZpY2UuY2MgYi9jaHJvbWUvYnJvd3Nlci9zYWZlX2Jyb3dzaW5nL2Nocm9tZV9wYXNzd29yZF9wcm90ZWN0aW9uX3NlcnZpY2UuY2MKaW5kZXggNDM1MjIxOC4uMTQzNzYxMjUgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3NhZmVfYnJvd3NpbmcvY2hyb21lX3Bhc3N3b3JkX3Byb3RlY3Rpb25fc2VydmljZS5jYworKysgYi9jaHJvbWUvYnJvd3Nlci9zYWZlX2Jyb3dzaW5nL2Nocm9tZV9wYXNzd29yZF9wcm90ZWN0aW9uX3NlcnZpY2UuY2MKQEAgLTg5Niw3ICs4OTYsMTEgQEAKICAgICB9IGVsc2UgewogICAgICAgLy8gfG91dGNvbWV8IGlzIG9ubHkgcmVjb3JkZWQgYXMgc3VjY2VlZGVkIG9yIHJlc3BvbnNlX2FscmVhZHlfY2FjaGVkLgogICAgICAgTWF5YmVMb2dQYXNzd29yZFJldXNlTG9va3VwUmVzdWx0V2l0aFZlcmRpY3QoCi0gICAgICAgICAgd2ViX2NvbnRlbnRzLCBQYXNzd29yZFR5cGU6Ok9USEVSX0dBSUFfUEFTU1dPUkQsCisgICAgICAgICAgd2ViX2NvbnRlbnRzLAorICAgICAgICAgIHBhc3N3b3JkX3R5cGUuYWNjb3VudF90eXBlKCkgPT0KKyAgICAgICAgICAgICAgICAgIFJldXNlZFBhc3N3b3JkQWNjb3VudFR5cGU6OlNBVkVEX1BBU1NXT1JECisgICAgICAgICAgICAgID8gUGFzc3dvcmRUeXBlOjpTQVZFRF9QQVNTV09SRAorICAgICAgICAgICAgICA6IFBhc3N3b3JkVHlwZTo6T1RIRVJfR0FJQV9QQVNTV09SRCwKICAgICAgICAgICBvdXRjb21lID09IFJlcXVlc3RPdXRjb21lOjpTVUNDRUVERUQKICAgICAgICAgICAgICAgPyBQYXNzd29yZFJldXNlTG9va3VwOjpSRVFVRVNUX1NVQ0NFU1MKICAgICAgICAgICAgICAgOiBQYXNzd29yZFJldXNlTG9va3VwOjpDQUNIRV9ISVQsCkBAIC05MTAsNyArOTE0LDggQEAKICAgICAgICAgICAgICAgY29udGVudDo6UmVmZXJyZXIoKSwKICAgICAgICAgICAgICAgLyppbl9uZXdfdGFiPSovdHJ1ZSk7CiAgICAgICB3ZWJfY29udGVudHNfd2l0aF91bmhhbmRsZWRfZW50ZXJwcmlzZV9yZXVzZXNfLmVyYXNlKHdlYl9jb250ZW50cyk7Ci0gICAgfSBlbHNlIHsKKyAgICB9IGVsc2UgaWYgKHBhc3N3b3JkX3R5cGUuYWNjb3VudF90eXBlKCkgIT0KKyAgICAgICAgICAgICAgIFJldXNlZFBhc3N3b3JkQWNjb3VudFR5cGU6OlNBVkVEX1BBU1NXT1JEKSB7CiAgICAgICAvLyBPcGVucyBhY2NvdW50cy5nb29nbGUuY29tIGluIGEgbmV3IHRhYi4KICAgICAgIE9wZW5Vcmwod2ViX2NvbnRlbnRzLCBHZXREZWZhdWx0Q2hhbmdlUGFzc3dvcmRVUkwoKSwgY29udGVudDo6UmVmZXJyZXIoKSwKICAgICAgICAgICAgICAgLyppbl9uZXdfdGFiPSovdHJ1ZSk7CkBAIC0xNTQ2LDggKzE1NTEsNiBAQAogICAgICAgICAgIGJhc2U6OlJhbmREb3VibGUoKSA8PSBrUHJvYmFiaWxpdHlGb3JTZW5kaW5nUmVwb3J0c0Zyb21TYWZlVVJMcyk7CiB9CiAKLS8vIFRPRE8oY3JidWcuY29tLzk5NTkyNik6IEVuYWJsZSBjYWNoaW5nIG9uIEFuZHJvaWQKLSNpZiBCVUlMREZMQUcoRlVMTF9TQUZFX0JST1dTSU5HKQogLy8gU3RvcmVzIHx2ZXJkaWN0fCBpbiB8c2V0dGluZ3N8IGJhc2VkIG9uIGl0cyB8dHJpZ2dlcl90eXBlfCwgfHVybHwsCiAvLyByZXVzZWQgfHBhc3N3b3JkX3R5cGV8LCB8dmVyZGljdHwgYW5kIHxyZWNlaXZlX3RpbWV8Lgogdm9pZCBDaHJvbWVQYXNzd29yZFByb3RlY3Rpb25TZXJ2aWNlOjpDYWNoZVZlcmRpY3QoCkBAIC0xNTgyLDYgKzE1ODUsNyBAQAogICByZXR1cm4gY2FjaGVfbWFuYWdlcl8tPkdldFN0b3JlZFBoaXNoR3VhcmRWZXJkaWN0Q291bnQodHJpZ2dlcl90eXBlKTsKIH0KIAorI2lmIEJVSUxERkxBRyhGVUxMX1NBRkVfQlJPV1NJTkcpCiBib29sIENocm9tZVBhc3N3b3JkUHJvdGVjdGlvblNlcnZpY2U6OklzVW5kZXJBZHZhbmNlZFByb3RlY3Rpb24oKSB7CiAgIHJldHVybiBBZHZhbmNlZFByb3RlY3Rpb25TdGF0dXNNYW5hZ2VyRmFjdG9yeTo6R2V0Rm9yUHJvZmlsZShwcm9maWxlXykKICAgICAgIC0+aXNfdW5kZXJfYWR2YW5jZWRfcHJvdGVjdGlvbigpOwpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvc2FmZV9icm93c2luZy9jaHJvbWVfcGFzc3dvcmRfcHJvdGVjdGlvbl9zZXJ2aWNlLmggYi9jaHJvbWUvYnJvd3Nlci9zYWZlX2Jyb3dzaW5nL2Nocm9tZV9wYXNzd29yZF9wcm90ZWN0aW9uX3NlcnZpY2UuaAppbmRleCA0NWIyMTc1Yy4uODQ1MjBmYSAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvc2FmZV9icm93c2luZy9jaHJvbWVfcGFzc3dvcmRfcHJvdGVjdGlvbl9zZXJ2aWNlLmgKKysrIGIvY2hyb21lL2Jyb3dzZXIvc2FmZV9icm93c2luZy9jaHJvbWVfcGFzc3dvcmRfcHJvdGVjdGlvbl9zZXJ2aWNlLmgKQEAgLTIxOSwxMiArMjE5LDYgQEAKICAgTG9naW5SZXB1dGF0aW9uQ2xpZW50UmVxdWVzdDo6UGFzc3dvcmRSZXVzZUV2ZW50OjpTeW5jQWNjb3VudFR5cGUKICAgR2V0U3luY0FjY291bnRUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CiAKLS8vIFRPRE8oY3JidWcuY29tLzk5NTkyNik6IEVuYWJsZSBjYWNoaW5nIG9uIEFuZHJvaWQKLS8vIE5vdGU6IEJlZm9yZSBlbmFibGUgdmVyZGljdCBjYWNoZSBtYW5hZ2VyIG9uIEFuZHJvaWQsCi0vLyBhZGQgQ09OVEVOVF9TRVRUSU5HU19UWVBFX1BBU1NXT1JEX1BST1RFQ1RJT04gdG8gQW5kcm9pZAotLy8gT3RoZXJ3aXNlLCBpdCB3aWxsIGZhaWwgb24gL2NvbXBvbmVudHMvIGNvbnRlbnRfc2V0dGluZ3MvY29yZS9icm93c2VyLwotLy8gY29udGVudF9zZXR0aW5nc19kZWZhdWx0X3Byb3ZpZGVyLmNjL0dldFJ1bGVJdGVyYXRvcgotI2lmIEJVSUxERkxBRyhGVUxMX1NBRkVfQlJPV1NJTkcpCiAgIC8vIFN0b3JlcyB8dmVyZGljdHwgaW4gdGhlIGNhY2hlIGJhc2VkIG9uIGl0cyB8dHJpZ2dlcl90eXBlfCwgfHVybHwsCiAgIC8vIHJldXNlZCB8cGFzc3dvcmRfdHlwZXwsIHx2ZXJkaWN0fCBhbmQgfHJlY2VpdmVfdGltZXwuCiAgIHZvaWQgQ2FjaGVWZXJkaWN0KGNvbnN0IEdVUkwmIHVybCwKQEAgLTI0NCw3ICsyMzgsNiBAQAogICAgICAgTG9naW5SZXB1dGF0aW9uQ2xpZW50UmVxdWVzdDo6VHJpZ2dlclR5cGUgdHJpZ2dlcl90eXBlLAogICAgICAgUmV1c2VkUGFzc3dvcmRBY2NvdW50VHlwZSBwYXNzd29yZF90eXBlLAogICAgICAgTG9naW5SZXB1dGF0aW9uQ2xpZW50UmVzcG9uc2UqIG91dF9yZXNwb25zZSkgb3ZlcnJpZGU7Ci0jZW5kaWYKIAogICAvLyBTYW5pdGl6ZSByZWZlcnJlciBjaGFpbiBieSBvbmx5IGtlZXBpbmcgb3JpZ2luIGluZm9ybWF0aW9uIG9mIGFsbCBVUkxzLgogICB2b2lkIFNhbml0aXplUmVmZXJyZXJDaGFpbihSZWZlcnJlckNoYWluKiByZWZlcnJlcl9jaGFpbikgb3ZlcnJpZGU7CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9zYWZlX2Jyb3dzaW5nL2Rvd25sb2FkX3Byb3RlY3Rpb24vY2hlY2tfY2xpZW50X2Rvd25sb2FkX3JlcXVlc3QuY2MgYi9jaHJvbWUvYnJvd3Nlci9zYWZlX2Jyb3dzaW5nL2Rvd25sb2FkX3Byb3RlY3Rpb24vY2hlY2tfY2xpZW50X2Rvd25sb2FkX3JlcXVlc3QuY2MKaW5kZXggMGY1YjAxYy4uODA5Mzc5MSAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvc2FmZV9icm93c2luZy9kb3dubG9hZF9wcm90ZWN0aW9uL2NoZWNrX2NsaWVudF9kb3dubG9hZF9yZXF1ZXN0LmNjCisrKyBiL2Nocm9tZS9icm93c2VyL3NhZmVfYnJvd3NpbmcvZG93bmxvYWRfcHJvdGVjdGlvbi9jaGVja19jbGllbnRfZG93bmxvYWRfcmVxdWVzdC5jYwpAQCAtMTAzLDEwICsxMDMsNiBAQAogICBpZiAocmVzdWx0ICE9IEJpbmFyeVVwbG9hZFNlcnZpY2U6OlJlc3VsdDo6U1VDQ0VTUykKICAgICByZXR1cm47CiAKLSAgaWYgKCFnX2Jyb3dzZXJfcHJvY2Vzcy0+bG9jYWxfc3RhdGUoKS0+R2V0Qm9vbGVhbigKLSAgICAgICAgICBwcmVmczo6a1Vuc2FmZUV2ZW50c1JlcG9ydGluZ0VuYWJsZWQpKQotICAgIHJldHVybjsKLQogICBpZiAocmVzcG9uc2UubWFsd2FyZV9zY2FuX3ZlcmRpY3QoKS52ZXJkaWN0KCkgPT0KICAgICAgICAgICBNYWx3YXJlRGVlcFNjYW5uaW5nVmVyZGljdDo6VVdTIHx8CiAgICAgICByZXNwb25zZS5tYWx3YXJlX3NjYW5fdmVyZGljdCgpLnZlcmRpY3QoKSA9PQpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvc2hlbGxfaW50ZWdyYXRpb25fbGludXguY2MgYi9jaHJvbWUvYnJvd3Nlci9zaGVsbF9pbnRlZ3JhdGlvbl9saW51eC5jYwppbmRleCA2YjA4NTkyOS4uZTAwMGM2YyAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvc2hlbGxfaW50ZWdyYXRpb25fbGludXguY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvc2hlbGxfaW50ZWdyYXRpb25fbGludXguY2MKQEAgLTExOCw3ICsxMTgsNyBAQAogICAgIGFyZ3YucHVzaF9iYWNrKGtYZGdTZXR0aW5nc0RlZmF1bHRTY2hlbWVIYW5kbGVyKTsKICAgICBhcmd2LnB1c2hfYmFjayhwcm90b2NvbCk7CiAgIH0KLSAgYXJndi5wdXNoX2JhY2soR2V0RGVza3RvcE5hbWUoZW52LmdldCgpKSk7CisgIGFyZ3YucHVzaF9iYWNrKGNocm9tZTo6R2V0RGVza3RvcE5hbWUoZW52LmdldCgpKSk7CiAKICAgaW50IGV4aXRfY29kZTsKICAgYm9vbCByYW5fb2sgPSBMYXVuY2hYZGdVdGlsaXR5KGFyZ3YsICZleGl0X2NvZGUpOwpAQCAtMTU0LDcgKzE1NCw3IEBACiAgICAgYXJndi5wdXNoX2JhY2soa1hkZ1NldHRpbmdzRGVmYXVsdFNjaGVtZUhhbmRsZXIpOwogICAgIGFyZ3YucHVzaF9iYWNrKHByb3RvY29sKTsKICAgfQotICBhcmd2LnB1c2hfYmFjayhHZXREZXNrdG9wTmFtZShlbnYuZ2V0KCkpKTsKKyAgYXJndi5wdXNoX2JhY2soY2hyb21lOjpHZXREZXNrdG9wTmFtZShlbnYuZ2V0KCkpKTsKIAogICBzdGQ6OnN0cmluZyByZXBseTsKICAgaW50IHN1Y2Nlc3NfY29kZTsKQEAgLTQwNywzNSArNDA3LDEzIEBACiBzdGQ6OnN0cmluZyBHZXRQcm9ncmFtQ2xhc3NOYW1lKCkgewogICBzdGQ6OnVuaXF1ZV9wdHI8YmFzZTo6RW52aXJvbm1lbnQ+IGVudihiYXNlOjpFbnZpcm9ubWVudDo6Q3JlYXRlKCkpOwogICByZXR1cm4gaW50ZXJuYWw6OkdldFByb2dyYW1DbGFzc05hbWUoKmJhc2U6OkNvbW1hbmRMaW5lOjpGb3JDdXJyZW50UHJvY2VzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0RGVza3RvcE5hbWUoZW52LmdldCgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHJvbWU6OkdldERlc2t0b3BOYW1lKGVudi5nZXQoKSkpOwogfQogCiBzdGQ6OnN0cmluZyBHZXRQcm9ncmFtQ2xhc3NDbGFzcygpIHsKICAgc3RkOjp1bmlxdWVfcHRyPGJhc2U6OkVudmlyb25tZW50PiBlbnYoYmFzZTo6RW52aXJvbm1lbnQ6OkNyZWF0ZSgpKTsKICAgcmV0dXJuIGludGVybmFsOjpHZXRQcm9ncmFtQ2xhc3NDbGFzcygqYmFzZTo6Q29tbWFuZExpbmU6OkZvckN1cnJlbnRQcm9jZXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0RGVza3RvcE5hbWUoZW52LmdldCgpKSk7Ci19Ci0KLXN0ZDo6c3RyaW5nIEdldERlc2t0b3BOYW1lKGJhc2U6OkVudmlyb25tZW50KiBlbnYpIHsKLSNpZiBCVUlMREZMQUcoR09PR0xFX0NIUk9NRV9CUkFORElORykKLSAgdmVyc2lvbl9pbmZvOjpDaGFubmVsIHByb2R1Y3RfY2hhbm5lbChjaHJvbWU6OkdldENoYW5uZWwoKSk7Ci0gIHN3aXRjaCAocHJvZHVjdF9jaGFubmVsKSB7Ci0gICAgY2FzZSB2ZXJzaW9uX2luZm86OkNoYW5uZWw6OkRFVjoKLSAgICAgIHJldHVybiAiZ29vZ2xlLWNocm9tZS11bnN0YWJsZS5kZXNrdG9wIjsKLSAgICBjYXNlIHZlcnNpb25faW5mbzo6Q2hhbm5lbDo6QkVUQToKLSAgICAgIHJldHVybiAiZ29vZ2xlLWNocm9tZS1iZXRhLmRlc2t0b3AiOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gImdvb2dsZS1jaHJvbWUuZGVza3RvcCI7Ci0gIH0KLSNlbHNlICAvLyBCVUlMREZMQUcoQ0hST01JVU1fQlJBTkRJTkcpCi0gIC8vIEFsbG93ICRDSFJPTUVfREVTS1RPUCB0byBvdmVycmlkZSB0aGUgYnVpbHQtaW4gdmFsdWUsIHNvIHRoYXQgZGV2ZWxvcG1lbnQKLSAgLy8gdmVyc2lvbnMgY2FuIHNldCB0aGVtc2VsdmVzIGFzIHRoZSBkZWZhdWx0IHdpdGhvdXQgaW50ZXJmZXJpbmcgd2l0aAotICAvLyBub24tb2ZmaWNpYWwsIHBhY2thZ2VkIHZlcnNpb25zIHVzaW5nIHRoZSBidWlsdC1pbiB2YWx1ZS4KLSAgc3RkOjpzdHJpbmcgbmFtZTsKLSAgaWYgKGVudi0+R2V0VmFyKCJDSFJPTUVfREVTS1RPUCIsICZuYW1lKSAmJiAhbmFtZS5lbXB0eSgpKQotICAgIHJldHVybiBuYW1lOwotICByZXR1cm4gImNocm9taXVtLWJyb3dzZXIuZGVza3RvcCI7Ci0jZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHJvbWU6OkdldERlc2t0b3BOYW1lKGVudi5nZXQoKSkpOwogfQogCiBzdGQ6OnN0cmluZyBHZXRJY29uTmFtZSgpIHsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3NoZWxsX2ludGVncmF0aW9uX2xpbnV4LmggYi9jaHJvbWUvYnJvd3Nlci9zaGVsbF9pbnRlZ3JhdGlvbl9saW51eC5oCmluZGV4IDA3MTQyMjZhLi5lYmQ0YjZkIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9zaGVsbF9pbnRlZ3JhdGlvbl9saW51eC5oCisrKyBiL2Nocm9tZS9icm93c2VyL3NoZWxsX2ludGVncmF0aW9uX2xpbnV4LmgKQEAgLTM1LDkgKzM1LDYgQEAKIC8vIEdldHMgdGhlIG5hbWUgZm9yIHVzZSBhcyB0aGUgcmVzX2NsYXNzIG9mIHRoZSB3aW5kb3cncyBXTV9DTEFTUyBwcm9wZXJ0eS4KIHN0ZDo6c3RyaW5nIEdldFByb2dyYW1DbGFzc0NsYXNzKCk7CiAKLS8vIFJldHVybnMgZmlsZW5hbWUgb2YgdGhlIGRlc2t0b3Agc2hvcnRjdXQgdXNlZCB0byBsYXVuY2ggdGhlIGJyb3dzZXIuCi1zdGQ6OnN0cmluZyBHZXREZXNrdG9wTmFtZShiYXNlOjpFbnZpcm9ubWVudCogZW52KTsKLQogLy8gUmV0dXJucyBuYW1lIG9mIHRoZSBicm93c2VyIGljb24gKHdpdGhvdXQgYSBwYXRoIG9yIGZpbGUgZXh0ZW5zaW9uKS4KIHN0ZDo6c3RyaW5nIEdldEljb25OYW1lKCk7CiAKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3NpZ25pbi9zaWduaW5fdWlfdXRpbC5jYyBiL2Nocm9tZS9icm93c2VyL3NpZ25pbi9zaWduaW5fdWlfdXRpbC5jYwppbmRleCA5YTE0NTJjZC4uOTA5MGE3NDMgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3NpZ25pbi9zaWduaW5fdWlfdXRpbC5jYworKysgYi9jaHJvbWUvYnJvd3Nlci9zaWduaW4vc2lnbmluX3VpX3V0aWwuY2MKQEAgLTgsMTAgKzgsMTQgQEAKICNpbmNsdWRlICJiYXNlL2JpbmRfaGVscGVycy5oIgogI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKICNpbmNsdWRlICJiYXNlL2ZlYXR1cmVfbGlzdC5oIgorI2luY2x1ZGUgImJhc2UvbWV0cmljcy9oaXN0b2dyYW1fZnVuY3Rpb25zLmgiCiAjaW5jbHVkZSAiYmFzZS9tZXRyaWNzL2hpc3RvZ3JhbV9tYWNyb3MuaCIKKyNpbmNsdWRlICJiYXNlL21ldHJpY3MvdXNlcl9tZXRyaWNzLmgiCiAjaW5jbHVkZSAiYmFzZS9zdHJpbmdzL3N0cmluZ191dGlsLmgiCiAjaW5jbHVkZSAiYmFzZS9zdHJpbmdzL3N5c19zdHJpbmdfY29udmVyc2lvbnMuaCIKICNpbmNsdWRlICJiYXNlL3N0cmluZ3MvdXRmX3N0cmluZ19jb252ZXJzaW9ucy5oIgorI2luY2x1ZGUgImJhc2Uvc3VwcG9ydHNfdXNlcl9kYXRhLmgiCisjaW5jbHVkZSAiYmFzZS90aW1lL3RpbWUuaCIKICNpbmNsdWRlICJidWlsZC9idWlsZF9jb25maWcuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9icm93c2VyX3Byb2Nlc3MuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9wcm9maWxlcy9wcm9maWxlLmgiCkBAIC00Miw4ICs0Niw2NCBAQAogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL3dlYnVpL3NpZ25pbi9kaWNlX3R1cm5fc3luY19vbl9oZWxwZXIuaCIKICNlbmRpZgogCi0jaWYgQlVJTERGTEFHKEVOQUJMRV9ESUNFX1NVUFBPUlQpCiBuYW1lc3BhY2UgeworCisvLyBLZXkgZm9yIHN0b3JpbmcgYW5pbWF0ZWQgaWRlbnRpdHkgcGVyLXByb2ZpbGUgZGF0YS4KK2NvbnN0IGNoYXIga0FuaW1hdGVkSWRlbnRpdHlLZXlOYW1lW10gPSAiYW5pbWF0ZWRfaWRlbnRpdHlfdXNlcl9kYXRhIjsKKworY29uc3RleHByIGJhc2U6OlRpbWVEZWx0YSBrRGVsYXlGb3JDcm9zc1dpbmRvd0FuaW1hdGlvblJlcGxheSA9CisgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kcyg1KTsKKworLy8gVXNlckRhdGEgYXR0YWNoZWQgdG8gdGhlIHVzZXIgcHJvZmlsZSwga2VlcGluZyB0cmFjayBvZiB0aGUgbGFzdCB0aW1lIHRoZQorLy8gYW5pbWF0aW9uIHdhcyBzaG93biB0byB0aGUgdXNlci4KK2NsYXNzIEFuaW1hdGVkSWRlbnRpdHlVc2VyRGF0YSA6IHB1YmxpYyBiYXNlOjpTdXBwb3J0c1VzZXJEYXRhOjpEYXRhIHsKKyBwdWJsaWM6CisgIH5BbmltYXRlZElkZW50aXR5VXNlckRhdGEoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgLy8gUmV0dXJucyB0aGUgIGxhc3QgdGltZSB0aGUgYW5pbWF0aW9uIHdhcyBzaG93bi4gUmV0dXJucyB0aGUgbnVsbCB0aW1lIGlmIGl0CisgIC8vIHdhcyBuZXZlciBzaG93bi4KKyAgc3RhdGljIGJhc2U6OlRpbWVUaWNrcyBHZXRMYXN0U2hvd24oUHJvZmlsZSogcHJvZmlsZSkgeworICAgIERDSEVDSyhwcm9maWxlKTsKKyAgICBBbmltYXRlZElkZW50aXR5VXNlckRhdGEqIGRhdGEgPSBHZXRGb3JQcm9maWxlKHByb2ZpbGUpOworICAgIGlmICghZGF0YSkKKyAgICAgIHJldHVybiBiYXNlOjpUaW1lVGlja3MoKTsKKworICAgIERDSEVDSyghZGF0YS0+bGFzdF9zaG93bl8uaXNfbnVsbCgpKTsKKyAgICByZXR1cm4gZGF0YS0+bGFzdF9zaG93bl87CisgIH0KKworICAvLyBTZXRzIHRoZSBhbmltYXRpb24gdGltZS4KKyAgc3RhdGljIHZvaWQgU2V0TGFzdFNob3duKFByb2ZpbGUqIHByb2ZpbGUsIGJhc2U6OlRpbWVUaWNrcyB0aW1lKSB7CisgICAgRENIRUNLKCF0aW1lLmlzX251bGwoKSk7CisgICAgR2V0T3JDcmVhdGVGb3JQcm9maWxlKHByb2ZpbGUpLT5sYXN0X3Nob3duXyA9IHRpbWU7CisgIH0KKworIHByaXZhdGU6CisgIC8vIFJldHVybnMgbnVsbHB0ciBpZiB0aGVyZSBpcyBubyBBbmltYXRlZElkZW50aXR5VXNlckRhdGEgYXR0YWNoZWQgdG8gdGhlCisgIC8vIHByb2ZpbGUuCisgIHN0YXRpYyBBbmltYXRlZElkZW50aXR5VXNlckRhdGEqIEdldEZvclByb2ZpbGUoUHJvZmlsZSogcHJvZmlsZSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxBbmltYXRlZElkZW50aXR5VXNlckRhdGEqPigKKyAgICAgICAgcHJvZmlsZS0+R2V0VXNlckRhdGEoa0FuaW1hdGVkSWRlbnRpdHlLZXlOYW1lKSk7CisgIH0KKworICAvLyBOZXZlciByZXR1cm5zIG51bGxwdHIuCisgIHN0YXRpYyBBbmltYXRlZElkZW50aXR5VXNlckRhdGEqIEdldE9yQ3JlYXRlRm9yUHJvZmlsZShQcm9maWxlKiBwcm9maWxlKSB7CisgICAgRENIRUNLKHByb2ZpbGUpOworICAgIEFuaW1hdGVkSWRlbnRpdHlVc2VyRGF0YSogZXhpc3RpbmdfZGF0YSA9IEdldEZvclByb2ZpbGUocHJvZmlsZSk7CisgICAgaWYgKGV4aXN0aW5nX2RhdGEpCisgICAgICByZXR1cm4gZXhpc3RpbmdfZGF0YTsKKworICAgIGF1dG8gbmV3X2RhdGEgPSBzdGQ6Om1ha2VfdW5pcXVlPEFuaW1hdGVkSWRlbnRpdHlVc2VyRGF0YT4oKTsKKyAgICBhdXRvKiBuZXdfZGF0YV9wdHIgPSBuZXdfZGF0YS5nZXQoKTsKKyAgICBwcm9maWxlLT5TZXRVc2VyRGF0YShrQW5pbWF0ZWRJZGVudGl0eUtleU5hbWUsIHN0ZDo6bW92ZShuZXdfZGF0YSkpOworICAgIHJldHVybiBuZXdfZGF0YV9wdHI7CisgIH0KKworICAvLyBMYXN0IHRpbWUgdGhlIGFuaW1hdGlvbiB3YXMgc2hvd24uCisgIGJhc2U6OlRpbWVUaWNrcyBsYXN0X3Nob3duXzsKK307CisKKyNpZiBCVUlMREZMQUcoRU5BQkxFX0RJQ0VfU1VQUE9SVCkKIHZvaWQgQ3JlYXRlRGljZVR1cm5TeW5jT25IZWxwZXIoCiAgICAgUHJvZmlsZSogcHJvZmlsZSwKICAgICBCcm93c2VyKiBicm93c2VyLApAQCAtNTgsOSArMTE4LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduaW5fcHJvbW9fYWN0aW9uLCBzaWduaW5fcmVhc29uLCBhY2NvdW50X2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmluX2Fib3J0ZWRfbW9kZSk7CiB9Ci19ICAvLyBuYW1lc3BhY2UKICNlbmRpZiAgLy8gQlVJTERGTEFHKEVOQUJMRV9ESUNFX1NVUFBPUlQpCiAKK30gIC8vIG5hbWVzcGFjZQorCiBuYW1lc3BhY2Ugc2lnbmluX3VpX3V0aWwgewogCiBiYXNlOjpzdHJpbmcxNiBHZXRBdXRoZW50aWNhdGVkVXNlcm5hbWUoUHJvZmlsZSogcHJvZmlsZSkgewpAQCAtMjcwLDIwICszMzEsMjIgQEAKICAgcmV0dXJuIGRvbWFpbjsKIH0KIAotYm9vbCBTaG91bGRTaG93SWRlbnRpdHlPbk9wZW5pbmdQcm9maWxlKAorYm9vbCBTaG91bGRTaG93QW5pbWF0ZWRJZGVudGl0eU9uT3BlbmluZ1dpbmRvdygKICAgICBjb25zdCBQcm9maWxlQXR0cmlidXRlc1N0b3JhZ2UmIHByb2ZpbGVfYXR0cmlidXRlc19zdG9yYWdlLAogICAgIFByb2ZpbGUqIHByb2ZpbGUpIHsKICAgRENIRUNLKHByb2ZpbGUpOwogICBzaWduaW46OklkZW50aXR5TWFuYWdlciogaWRlbnRpdHlfbWFuYWdlciA9CiAgICAgICBJZGVudGl0eU1hbmFnZXJGYWN0b3J5OjpHZXRGb3JQcm9maWxlKHByb2ZpbGUpOwogICBEQ0hFQ0soaWRlbnRpdHlfbWFuYWdlci0+QXJlUmVmcmVzaFRva2Vuc0xvYWRlZCgpKTsKLSAgLy8gV2FpdCB3aXRoIHRoZSBwb3RlbnRpYWwgcG9zaXRpdmUgcmVzcG9uc2UgdW50aWwgcmVmcmVzaCB0b2tlbnMgYXJlIGxvYWRlZAotICAvLyBzbyB0aGF0IHdlIG5ldmVyIHNob3cgaXQgdHdpY2Ugb24gc3RhcnR1cC4KLSAgLy8gVE9ETyhjcmJ1Zy5jb20vMTAwOTQ0MSk6IE1ha2UgaXQgb25seSBhcHBlYXIgb25jZSBwZXIgcHJvZmlsZQotICAvLyBpbnN0YW50aWF0aW9uIChjdXJyZW50bHkgaXQgYXBwZWFycyBmb3IgZXZlcnkgbmV3IHdpbmRvdyB3aGljaCBoYXZlIHRoZWlyCi0gIC8vIG93biBpbnN0YW5jZSBvZiBBdmF0YXJUb29sYmFyQnV0dG9uKS4KLSAgaWYgKCFiYXNlOjpGZWF0dXJlTGlzdDo6SXNFbmFibGVkKAotICAgICAgICAgIGZlYXR1cmVzOjprQW5pbWF0ZWRBdmF0YXJCdXR0b25Pbk9wZW5pbmdQcm9maWxlKSkgeworCisgIGJhc2U6OlRpbWVUaWNrcyBhbmltYXRpb25fbGFzdF9zaG93biA9CisgICAgICBBbmltYXRlZElkZW50aXR5VXNlckRhdGE6OkdldExhc3RTaG93bihwcm9maWxlKTsKKyAgLy8gV2hlbiBhIG5ldyB3aW5kb3cgaXMgY3JlYXRlZCwgb25seSBzaG93IHRoZSBhbmltYXRpb24gaWYgaXQgd2FzIG5ldmVyIHNob3duCisgIC8vIGZvciB0aGlzIHByb2ZpbGUsIG9yIGlmIGl0IHdhcyBzaG93biBpbiBhbm90aGVyIHdpbmRvdyBpbiB0aGUgbGFzdCBmZXcKKyAgLy8gc2Vjb25kcyAoYmVjYXVzZSB0aGUgdXNlciBtYXkgaGF2ZSBtaXNzZWQgaXQpLgorICBpZiAoIWFuaW1hdGlvbl9sYXN0X3Nob3duLmlzX251bGwoKSAmJgorICAgICAgYmFzZTo6VGltZVRpY2tzOjpOb3coKSAtIGFuaW1hdGlvbl9sYXN0X3Nob3duID4KKyAgICAgICAgICBrRGVsYXlGb3JDcm9zc1dpbmRvd0FuaW1hdGlvblJlcGxheSkgewogICAgIHJldHVybiBmYWxzZTsKICAgfQogCkBAIC0yOTYsNCArMzU5LDIwIEBACiAgIHJldHVybiBpZGVudGl0eV9tYW5hZ2VyLT5HZXRBY2NvdW50c1dpdGhSZWZyZXNoVG9rZW5zKCkuc2l6ZSgpID4gMTsKIH0KIAordm9pZCBSZWNvcmRBbmltYXRlZElkZW50aXR5VHJpZ2dlcmVkKFByb2ZpbGUqIHByb2ZpbGUpIHsKKyAgQW5pbWF0ZWRJZGVudGl0eVVzZXJEYXRhOjpTZXRMYXN0U2hvd24ocHJvZmlsZSwgYmFzZTo6VGltZVRpY2tzOjpOb3coKSk7Cit9CisKK3ZvaWQgUmVjb3JkUHJvZmlsZU1lbnVWaWV3U2hvd24oUHJvZmlsZSogcHJvZmlsZSkgeworICBiYXNlOjpSZWNvcmRBY3Rpb24oYmFzZTo6VXNlck1ldHJpY3NBY3Rpb24oIlByb2ZpbGVNZW51X09wZW5lZCIpKTsKKworICBiYXNlOjpUaW1lVGlja3MgYW5pbWF0aW9uX2xhc3Rfc2hvd24gPQorICAgICAgQW5pbWF0ZWRJZGVudGl0eVVzZXJEYXRhOjpHZXRMYXN0U2hvd24ocHJvZmlsZSk7CisgIGlmIChhbmltYXRpb25fbGFzdF9zaG93bi5pc19udWxsKCkpCisgICAgcmV0dXJuOworCisgIGJhc2U6OlVtYUhpc3RvZ3JhbUxvbmdUaW1lcygiUHJvZmlsZS5NZW51Lk9wZW5lZEFmdGVyQXZhdGFyQW5pbWF0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlRpbWVUaWNrczo6Tm93KCkgLSBhbmltYXRpb25fbGFzdF9zaG93bik7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBzaWduaW5fdWlfdXRpbApkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvc2lnbmluL3NpZ25pbl91aV91dGlsLmggYi9jaHJvbWUvYnJvd3Nlci9zaWduaW4vc2lnbmluX3VpX3V0aWwuaAppbmRleCBjYTMyOWFlLi44MDdjNTUwOCAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvc2lnbmluL3NpZ25pbl91aV91dGlsLmgKKysrIGIvY2hyb21lL2Jyb3dzZXIvc2lnbmluL3NpZ25pbl91aV91dGlsLmgKQEAgLTk2LDEyICs5NiwxOSBAQAogI2VuZGlmCiAKIC8vIFJldHVybnMgd2hldGhlciBDaHJvbWUgc2hvdWxkIHNob3cgdGhlIGlkZW50aXR5IG9mIHRoZSB1c2VyICh1c2luZyBhIGJyaWVmCi0vLyBhbmltYXRpb24pIG9uIG9wZW5pbmcgYSBwcm9maWxlLiBJZGVudGl0eU1hbmFnZXIncyByZWZyZXNoIHRva2VucyBtdXN0IGJlCisvLyBhbmltYXRpb24pIG9uIG9wZW5pbmcgYSBuZXcgd2luZG93LiBJZGVudGl0eU1hbmFnZXIncyByZWZyZXNoIHRva2VucyBtdXN0IGJlCiAvLyBsb2FkZWQgd2hlbiB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkLgotYm9vbCBTaG91bGRTaG93SWRlbnRpdHlPbk9wZW5pbmdQcm9maWxlKAorYm9vbCBTaG91bGRTaG93QW5pbWF0ZWRJZGVudGl0eU9uT3BlbmluZ1dpbmRvdygKICAgICBjb25zdCBQcm9maWxlQXR0cmlidXRlc1N0b3JhZ2UmIHByb2ZpbGVfYXR0cmlidXRlc19zdG9yYWdlLAogICAgIFByb2ZpbGUqIHByb2ZpbGUpOwogCisvLyBSZWNvcmRzIHRoYXQgdGhlIGFuaW1hdGVkIGlkZW50aXR5IHdhcyBzaG93biBmb3IgdGhlIGdpdmVuIHByb2ZpbGUuIFRoaXMgaXMKKy8vIHVzZWQgZm9yIG1ldHJpY3MgYW5kIHRvIGRlY2lkZSB3aGV0aGVyL3doZW4gdGhlIGFuaW1hdGlvbiBjYW4gYmUgc2hvd24gYWdhaW4uCit2b2lkIFJlY29yZEFuaW1hdGVkSWRlbnRpdHlUcmlnZ2VyZWQoUHJvZmlsZSogcHJvZmlsZSk7CisKKy8vIENhbGxlZCB3aGVuIHRoZSBQcm9maWxlTWVudVZpZXcgaXMgb3BlbmVkLiBVc2VkIGZvciBtZXRyaWNzLgordm9pZCBSZWNvcmRQcm9maWxlTWVudVZpZXdTaG93bihQcm9maWxlKiBwcm9maWxlKTsKKwogfSAgLy8gbmFtZXNwYWNlIHNpZ25pbl91aV91dGlsCiAKICNlbmRpZiAgLy8gQ0hST01FX0JST1dTRVJfU0lHTklOX1NJR05JTl9VSV9VVElMX0hfCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9zaWduaW4vc2lnbmluX3VpX3V0aWxfdW5pdHRlc3QuY2MgYi9jaHJvbWUvYnJvd3Nlci9zaWduaW4vc2lnbmluX3VpX3V0aWxfdW5pdHRlc3QuY2MKaW5kZXggOGE0MjM0Mi4uZjJlYTc5MCAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvc2lnbmluL3NpZ25pbl91aV91dGlsX3VuaXR0ZXN0LmNjCisrKyBiL2Nocm9tZS9icm93c2VyL3NpZ25pbi9zaWduaW5fdWlfdXRpbF91bml0dGVzdC5jYwpAQCAtOCw2ICs4LDcgQEAKICNpbmNsdWRlICJiYXNlL21hY3Jvcy5oIgogI2luY2x1ZGUgImJhc2UvdGVzdC9tZXRyaWNzL2hpc3RvZ3JhbV90ZXN0ZXIuaCIKICNpbmNsdWRlICJiYXNlL3Rlc3QvbWV0cmljcy91c2VyX2FjdGlvbl90ZXN0ZXIuaCIKKyNpbmNsdWRlICJiYXNlL3Rlc3QvdGFza19lbnZpcm9ubWVudC5oIgogI2luY2x1ZGUgImJ1aWxkL2J1aWxkZmxhZy5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3Byb2ZpbGVzL3Byb2ZpbGVfYXR0cmlidXRlc19zdG9yYWdlLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvc2lnbmluL2lkZW50aXR5X21hbmFnZXJfZmFjdG9yeS5oIgpAQCAtODksNyArOTAsOSBAQAogCiBjbGFzcyBEaWNlU2lnbmluVWlVdGlsVGVzdCA6IHB1YmxpYyBCcm93c2VyV2l0aFRlc3RXaW5kb3dUZXN0IHsKICBwdWJsaWM6Ci0gIERpY2VTaWduaW5VaVV0aWxUZXN0KCkgPSBkZWZhdWx0OworICBEaWNlU2lnbmluVWlVdGlsVGVzdCgpCisgICAgICA6IEJyb3dzZXJXaXRoVGVzdFdpbmRvd1Rlc3QoCisgICAgICAgICAgICBiYXNlOjp0ZXN0OjpUYXNrRW52aXJvbm1lbnQ6OlRpbWVTb3VyY2U6Ok1PQ0tfVElNRSkge30KICAgfkRpY2VTaWduaW5VaVV0aWxUZXN0KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwogCiAgIHN0cnVjdCBDcmVhdGVEaWNlVHVyblN5bmNPbkhlbHBlclBhcmFtcyB7CkBAIC01MDgsNyArNTExLDcgQEAKICNlbmRpZiAgLy8gQlVJTERGTEFHKEVOQUJMRV9ESUNFX1NVUFBPUlQpCiAKIFRFU1RfRihEaWNlU2lnbmluVWlVdGlsVGVzdCwKLSAgICAgICBTaG91bGRTaG93SWRlbnRpdHlPbk9wZW5pbmdQcm9maWxlX1JldHVybnNUcnVlRm9yTXVsdGlQcm9maWxlcykgeworICAgICAgIFNob3VsZFNob3dBbmltYXRlZElkZW50aXR5T25PcGVuaW5nV2luZG93X1JldHVybnNUcnVlRm9yTXVsdGlQcm9maWxlcykgewogICBjb25zdCBjaGFyIGtTZWNvbmRQcm9maWxlW10gPSAiU2Vjb25kUHJvZmlsZSI7CiAgIGNvbnN0IGJhc2U6OkZpbGVQYXRoIHByb2ZpbGVfcGF0aCA9CiAgICAgICBwcm9maWxlX21hbmFnZXIoKS0+cHJvZmlsZXNfZGlyKCkuQXBwZW5kQVNDSUkoa1NlY29uZFByb2ZpbGUpOwpAQCAtNTE2LDEyICs1MTksMTIgQEAKICAgICAgIHByb2ZpbGVfcGF0aCwgYmFzZTo6QVNDSUlUb1VURjE2KGtTZWNvbmRQcm9maWxlKSwgc3RkOjpzdHJpbmcoKSwKICAgICAgIGJhc2U6OnN0cmluZzE2KCksIGZhbHNlLCAwLCBzdGQ6OnN0cmluZygpLCBFbXB0eUFjY291bnRJZCgpKTsKIAotICBFWFBFQ1RfVFJVRShTaG91bGRTaG93SWRlbnRpdHlPbk9wZW5pbmdQcm9maWxlKAorICBFWFBFQ1RfVFJVRShTaG91bGRTaG93QW5pbWF0ZWRJZGVudGl0eU9uT3BlbmluZ1dpbmRvdygKICAgICAgICpwcm9maWxlX21hbmFnZXIoKS0+cHJvZmlsZV9hdHRyaWJ1dGVzX3N0b3JhZ2UoKSwgcHJvZmlsZSgpKSk7CiB9CiAKIFRFU1RfRihEaWNlU2lnbmluVWlVdGlsVGVzdCwKLSAgICAgICBTaG91bGRTaG93SWRlbnRpdHlPbk9wZW5pbmdQcm9maWxlX1JldHVybnNUcnVlRm9yTXVsdGlTaWduaW4pIHsKKyAgICAgICBTaG91bGRTaG93QW5pbWF0ZWRJZGVudGl0eU9uT3BlbmluZ1dpbmRvd19SZXR1cm5zVHJ1ZUZvck11bHRpU2lnbmluKSB7CiAgIEdldElkZW50aXR5TWFuYWdlcigpLT5HZXRBY2NvdW50c011dGF0b3IoKS0+QWRkT3JVcGRhdGVBY2NvdW50KAogICAgICAga01haW5HYWlhSUQsIGtNYWluRW1haWwsICJyZWZyZXNoX3Rva2VuIiwgZmFsc2UsCiAgICAgICBzaWduaW5fbWV0cmljczo6U291cmNlRm9yUmVmcmVzaFRva2VuT3BlcmF0aW9uOjprVW5rbm93bik7CkBAIC01MjksMzYgKzUzMiw0NiBAQAogICAgICAga1NlY29uZGFyeUVtYWlsLCBrU2Vjb25kYXJ5R2FpYUlELCAicmVmcmVzaF90b2tlbiIsIGZhbHNlLAogICAgICAgc2lnbmluX21ldHJpY3M6OlNvdXJjZUZvclJlZnJlc2hUb2tlbk9wZXJhdGlvbjo6a1Vua25vd24pOwogCi0gIEVYUEVDVF9UUlVFKFNob3VsZFNob3dJZGVudGl0eU9uT3BlbmluZ1Byb2ZpbGUoCisgIEVYUEVDVF9UUlVFKFNob3VsZFNob3dBbmltYXRlZElkZW50aXR5T25PcGVuaW5nV2luZG93KAorICAgICAgKnByb2ZpbGVfbWFuYWdlcigpLT5wcm9maWxlX2F0dHJpYnV0ZXNfc3RvcmFnZSgpLCBwcm9maWxlKCkpKTsKKworICAvLyBUaGUgaWRlbnRpdHkgY2FuIGJlIHNob3duIGFnYWluIGltbWVkaWF0ZWx5ICh3aGljaCBpcyB3aGF0IGhhcHBlbnMgaWYgdGhlcmUKKyAgLy8gaXMgbXVsdGlwbGUgd2luZG93cyBhdCBzdGFydHVwKS4KKyAgUmVjb3JkQW5pbWF0ZWRJZGVudGl0eVRyaWdnZXJlZChwcm9maWxlKCkpOworICBFWFBFQ1RfVFJVRShTaG91bGRTaG93QW5pbWF0ZWRJZGVudGl0eU9uT3BlbmluZ1dpbmRvdygKICAgICAgICpwcm9maWxlX21hbmFnZXIoKS0+cHJvZmlsZV9hdHRyaWJ1dGVzX3N0b3JhZ2UoKSwgcHJvZmlsZSgpKSk7CiB9CiAKIFRFU1RfRigKICAgICBEaWNlU2lnbmluVWlVdGlsVGVzdCwKLSAgICBTaG91bGRTaG93SWRlbnRpdHlPbk9wZW5pbmdQcm9maWxlX1JldHVybnNGYWxzZUZvclNpbmdsZVByb2ZpbGVTaW5nbGVTaWduaW4pIHsKKyAgICBTaG91bGRTaG93QW5pbWF0ZWRJZGVudGl0eU9uT3BlbmluZ1dpbmRvd19SZXR1cm5zRmFsc2VGb3JTaW5nbGVQcm9maWxlU2luZ2xlU2lnbmluKSB7CiAgIEdldElkZW50aXR5TWFuYWdlcigpLT5HZXRBY2NvdW50c011dGF0b3IoKS0+QWRkT3JVcGRhdGVBY2NvdW50KAogICAgICAga01haW5HYWlhSUQsIGtNYWluRW1haWwsICJyZWZyZXNoX3Rva2VuIiwgZmFsc2UsCiAgICAgICBzaWduaW5fbWV0cmljczo6U291cmNlRm9yUmVmcmVzaFRva2VuT3BlcmF0aW9uOjprVW5rbm93bik7CiAKLSAgRVhQRUNUX0ZBTFNFKFNob3VsZFNob3dJZGVudGl0eU9uT3BlbmluZ1Byb2ZpbGUoCisgIEVYUEVDVF9GQUxTRShTaG91bGRTaG93QW5pbWF0ZWRJZGVudGl0eU9uT3BlbmluZ1dpbmRvdygKICAgICAgICpwcm9maWxlX21hbmFnZXIoKS0+cHJvZmlsZV9hdHRyaWJ1dGVzX3N0b3JhZ2UoKSwgcHJvZmlsZSgpKSk7CiB9CiAKIFRFU1RfRihEaWNlU2lnbmluVWlVdGlsVGVzdCwKLSAgICAgICBTaG91bGRTaG93SWRlbnRpdHlPbk9wZW5pbmdQcm9maWxlX1JldHVybnNGYWxzZUZvckZlYXR1cmVEaXNhYmxlZCkgewotICBiYXNlOjp0ZXN0OjpTY29wZWRGZWF0dXJlTGlzdCBzY29wZWRfZmVhdHVyZV9saXN0OwotICBzY29wZWRfZmVhdHVyZV9saXN0LkluaXRBbmREaXNhYmxlRmVhdHVyZSgKLSAgICAgIGZlYXR1cmVzOjprQW5pbWF0ZWRBdmF0YXJCdXR0b25Pbk9wZW5pbmdQcm9maWxlKTsKLQotICAvLyBEbyB0aGUgc2FtZSBzZXR1cCB0aGF0IG1ha2VzIHRoZSBwcmV2aW91cyB0ZXN0IHJldHVybiB0cnVlLgorICAgICAgIFNob3VsZFNob3dBbmltYXRlZElkZW50aXR5T25PcGVuaW5nV2luZG93X1JldHVybnNGYWxzZUZvck5ld1dpbmRvdykgewogICBHZXRJZGVudGl0eU1hbmFnZXIoKS0+R2V0QWNjb3VudHNNdXRhdG9yKCktPkFkZE9yVXBkYXRlQWNjb3VudCgKICAgICAgIGtNYWluR2FpYUlELCBrTWFpbkVtYWlsLCAicmVmcmVzaF90b2tlbiIsIGZhbHNlLAogICAgICAgc2lnbmluX21ldHJpY3M6OlNvdXJjZUZvclJlZnJlc2hUb2tlbk9wZXJhdGlvbjo6a1Vua25vd24pOwogICBHZXRJZGVudGl0eU1hbmFnZXIoKS0+R2V0QWNjb3VudHNNdXRhdG9yKCktPkFkZE9yVXBkYXRlQWNjb3VudCgKICAgICAgIGtTZWNvbmRhcnlFbWFpbCwga1NlY29uZGFyeUdhaWFJRCwgInJlZnJlc2hfdG9rZW4iLCBmYWxzZSwKICAgICAgIHNpZ25pbl9tZXRyaWNzOjpTb3VyY2VGb3JSZWZyZXNoVG9rZW5PcGVyYXRpb246OmtVbmtub3duKTsKKyAgRVhQRUNUX1RSVUUoU2hvdWxkU2hvd0FuaW1hdGVkSWRlbnRpdHlPbk9wZW5pbmdXaW5kb3coCisgICAgICAqcHJvZmlsZV9tYW5hZ2VyKCktPnByb2ZpbGVfYXR0cmlidXRlc19zdG9yYWdlKCksIHByb2ZpbGUoKSkpOwogCi0gIEVYUEVDVF9GQUxTRShTaG91bGRTaG93SWRlbnRpdHlPbk9wZW5pbmdQcm9maWxlKAorICAvLyBBbmltYXRpb24gaXMgc2hvd24gb25jZS4KKyAgUmVjb3JkQW5pbWF0ZWRJZGVudGl0eVRyaWdnZXJlZChwcm9maWxlKCkpOworCisgIC8vIFdhaXQgYSBmZXcgc2Vjb25kcy4KKyAgdGFza19lbnZpcm9ubWVudCgpLT5GYXN0Rm9yd2FyZEJ5KGJhc2U6OlRpbWVEZWx0YTo6RnJvbVNlY29uZHMoNikpOworCisgIC8vIEFuaW1hdGlvbiBpcyBub3Qgc2hvd24gYWdhaW4gaW4gYSBuZXcgd2luZG93LgorICBFWFBFQ1RfRkFMU0UoU2hvdWxkU2hvd0FuaW1hdGVkSWRlbnRpdHlPbk9wZW5pbmdXaW5kb3coCiAgICAgICAqcHJvZmlsZV9tYW5hZ2VyKCktPnByb2ZpbGVfYXR0cmlidXRlc19zdG9yYWdlKCksIHByb2ZpbGUoKSkpOwogfQogCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9zaWduaW4vc2lnbmluX3V0aWxfd2luLmNjIGIvY2hyb21lL2Jyb3dzZXIvc2lnbmluL3NpZ25pbl91dGlsX3dpbi5jYwppbmRleCAxM2I2M2U1Li5kY2YzODg3YSAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvc2lnbmluL3NpZ25pbl91dGlsX3dpbi5jYworKysgYi9jaHJvbWUvYnJvd3Nlci9zaWduaW4vc2lnbmluX3V0aWxfd2luLmNjCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSAiYmFzZS9zdHJpbmdzL3V0Zl9zdHJpbmdfY29udmVyc2lvbnMuaCIKICNpbmNsdWRlICJiYXNlL3dpbi9yZWdpc3RyeS5oIgogI2luY2x1ZGUgImJhc2Uvd2luL3dpbl91dGlsLmgiCisjaW5jbHVkZSAiYmFzZS93aW4vd2luY3J5cHRfc2hpbS5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL2Jyb3dzZXJfcHJvY2Vzcy5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL2ZpcnN0X3J1bi9maXJzdF9ydW4uaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9wcm9maWxlcy9wcm9maWxlLmgiCkBAIC0yNSw3ICsyNiw2IEBACiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvYnJvd3Nlcl9saXN0LmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvd2VidWkvc2lnbmluL2RpY2VfdHVybl9zeW5jX29uX2hlbHBlci5oIgogI2luY2x1ZGUgImNocm9tZS9jcmVkZW50aWFsX3Byb3ZpZGVyL2NvbW1vbi9nY3Bfc3RyaW5ncy5oIgotI2luY2x1ZGUgImNvbXBvbmVudHMvb3NfY3J5cHQvb3NfY3J5cHQuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL3ByZWZzL3ByZWZfc2VydmljZS5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvc2lnbmluL2NvcmUvYnJvd3Nlci9hYm91dF9zaWduaW5faW50ZXJuYWxzLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9zaWduaW4vcHVibGljL2Jhc2Uvc2lnbmluX21ldHJpY3MuaCIKQEAgLTQ1LDEwICs0NSwyMCBAQAogfQogCiBzdGQ6OnN0cmluZyBEZWNyeXB0UmVmcmVzaFRva2VuKGNvbnN0IHN0ZDo6c3RyaW5nJiBjaXBoZXJfdGV4dCkgewotICBzdGQ6OnN0cmluZyByZWZyZXNoX3Rva2VuOwotICBpZiAoIU9TQ3J5cHQ6OkRlY3J5cHRTdHJpbmcoY2lwaGVyX3RleHQsICZyZWZyZXNoX3Rva2VuKSkKKyAgREFUQV9CTE9CIGlucHV0OworICBpbnB1dC5wYkRhdGEgPQorICAgICAgY29uc3RfY2FzdDxCWVRFKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBCWVRFKj4oY2lwaGVyX3RleHQuZGF0YSgpKSk7CisgIGlucHV0LmNiRGF0YSA9IHN0YXRpY19jYXN0PERXT1JEPihjaXBoZXJfdGV4dC5sZW5ndGgoKSk7CisgIERBVEFfQkxPQiBvdXRwdXQ7CisgIEJPT0wgcmVzdWx0ID0gOjpDcnlwdFVucHJvdGVjdERhdGEoJmlucHV0LCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSWVBUUFJPVEVDVF9VSV9GT1JCSURERU4sICZvdXRwdXQpOworCisgIGlmICghcmVzdWx0KQogICAgIHJldHVybiBzdGQ6OnN0cmluZygpOwogCisgIHN0ZDo6c3RyaW5nIHJlZnJlc2hfdG9rZW4ocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4ob3V0cHV0LnBiRGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmNiRGF0YSk7CisgIDo6TG9jYWxGcmVlKG91dHB1dC5wYkRhdGEpOwogICByZXR1cm4gcmVmcmVzaF90b2tlbjsKIH0KIApkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvc2lnbmluL3NpZ25pbl91dGlsX3dpbl9icm93c2VydGVzdC5jYyBiL2Nocm9tZS9icm93c2VyL3NpZ25pbi9zaWduaW5fdXRpbF93aW5fYnJvd3NlcnRlc3QuY2MKaW5kZXggZDM2N2VjZC4uYTJlZWQzYyAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvc2lnbmluL3NpZ25pbl91dGlsX3dpbl9icm93c2VydGVzdC5jYworKysgYi9jaHJvbWUvYnJvd3Nlci9zaWduaW4vc2lnbmluX3V0aWxfd2luX2Jyb3dzZXJ0ZXN0LmNjCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSAiYmFzZS9zdHJpbmdzL3V0Zl9zdHJpbmdfY29udmVyc2lvbnMuaCIKICNpbmNsdWRlICJiYXNlL3Rlc3QvYmluZF90ZXN0X3V0aWwuaCIKICNpbmNsdWRlICJiYXNlL3Rlc3QvdGVzdF9yZWdfdXRpbF93aW4uaCIKKyNpbmNsdWRlICJiYXNlL3dpbi93aW5jcnlwdF9zaGltLmgiCiAjaW5jbHVkZSAiYnVpbGQvYnVpbGRfY29uZmlnLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvZmlyc3RfcnVuL2ZpcnN0X3J1bi5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3Byb2ZpbGVzL3Byb2ZpbGVfbWFuYWdlci5oIgpAQCAtMjQsNyArMjUsNiBAQAogI2luY2x1ZGUgImNocm9tZS9jcmVkZW50aWFsX3Byb3ZpZGVyL2NvbW1vbi9nY3Bfc3RyaW5ncy5oIgogI2luY2x1ZGUgImNocm9tZS90ZXN0L2Jhc2UvaW5fcHJvY2Vzc19icm93c2VyX3Rlc3QuaCIKICNpbmNsdWRlICJjaHJvbWUvdGVzdC9iYXNlL3Rlc3RpbmdfYnJvd3Nlcl9wcm9jZXNzLmgiCi0jaW5jbHVkZSAiY29tcG9uZW50cy9vc19jcnlwdC9vc19jcnlwdC5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvcHJlZnMvcHJlZl9zZXJ2aWNlLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9zaWduaW4vcHVibGljL2Jhc2Uvc2lnbmluX3ByZWZfbmFtZXMuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL3NpZ25pbi9wdWJsaWMvaWRlbnRpdHlfbWFuYWdlci9pZGVudGl0eV9tYW5hZ2VyLmgiCkBAIC0xMTAsNyArMTEwLDcgQEAKICAgICB9CiAKICAgICBpZiAoIUdldFBhcmFtKCkucmVmcmVzaF90b2tlbi5lbXB0eSgpKQotICAgICAgV3JpdGVScmVmcmVzaFRva2VuKCZrZXksIEdldFBhcmFtKCkucmVmcmVzaF90b2tlbik7CisgICAgICBXcml0ZVJlZnJlc2hUb2tlbigma2V5LCBHZXRQYXJhbSgpLnJlZnJlc2hfdG9rZW4pOwogCiAgICAgaWYgKEdldFBhcmFtKCkuZXhwZWN0X2lzX3N0YXJ0ZWQpIHsKICAgICAgIHNpZ25pbl91dGlsOjpTZXREaWNlVHVyblN5bmNPbkhlbHBlckRlbGVnYXRlRm9yVGVzdGluZygKQEAgLTEzMiwxNiArMTMyLDI2IEBACiAgICAgfQogICB9CiAKLSAgdm9pZCBXcml0ZVJyZWZyZXNoVG9rZW4oYmFzZTo6d2luOjpSZWdLZXkqIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHJlZnJlc2hfdG9rZW4pIHsKKyAgdm9pZCBXcml0ZVJlZnJlc2hUb2tlbihiYXNlOjp3aW46OlJlZ0tleSoga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiByZWZyZXNoX3Rva2VuKSB7CiAgICAgRVhQRUNUX1RSVUUoa2V5LT5WYWxpZCgpKTsKLSAgICBzdGQ6OnN0cmluZyBjaXBoZXJ0ZXh0OwotICAgIEVYUEVDVF9UUlVFKE9TQ3J5cHQ6OkVuY3J5cHRTdHJpbmcocmVmcmVzaF90b2tlbiwgJmNpcGhlcnRleHQpKTsKKyAgICBEQVRBX0JMT0IgcGxhaW50ZXh0OworICAgIHBsYWludGV4dC5wYkRhdGEgPQorICAgICAgICByZWludGVycHJldF9jYXN0PEJZVEUqPihjb25zdF9jYXN0PGNoYXIqPihyZWZyZXNoX3Rva2VuLmNfc3RyKCkpKTsKKyAgICBwbGFpbnRleHQuY2JEYXRhID0gc3RhdGljX2Nhc3Q8RFdPUkQ+KHJlZnJlc2hfdG9rZW4ubGVuZ3RoKCkpOworCisgICAgREFUQV9CTE9CIGNpcGhlcnRleHQ7CisgICAgQVNTRVJUX1RSVUUoOjpDcnlwdFByb3RlY3REYXRhKCZwbGFpbnRleHQsIEwiR2FpYSByZWZyZXNoIHRva2VuIiwgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgbnVsbHB0ciwgQ1JZUFRQUk9URUNUX1VJX0ZPUkJJRERFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNpcGhlcnRleHQpKTsKKyAgICBzdGQ6OnN0cmluZyBlbmNyeXB0ZWRfZGF0YShyZWludGVycHJldF9jYXN0PGNoYXIqPihjaXBoZXJ0ZXh0LnBiRGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lwaGVydGV4dC5jYkRhdGEpOwogICAgIEVYUEVDVF9FUSgKICAgICAgICAgRVJST1JfU1VDQ0VTUywKICAgICAgICAga2V5LT5Xcml0ZVZhbHVlKAogICAgICAgICAgICAgYmFzZTo6QVNDSUlUb1VURjE2KGNyZWRlbnRpYWxfcHJvdmlkZXI6OmtLZXlSZWZyZXNoVG9rZW4pLmNfc3RyKCksCi0gICAgICAgICAgICBjaXBoZXJ0ZXh0LmNfc3RyKCksIGNpcGhlcnRleHQubGVuZ3RoKCksIFJFR19CSU5BUlkpKTsKKyAgICAgICAgICAgIGVuY3J5cHRlZF9kYXRhLmNfc3RyKCksIGVuY3J5cHRlZF9kYXRhLmxlbmd0aCgpLCBSRUdfQklOQVJZKSk7CisgICAgTG9jYWxGcmVlKGNpcGhlcnRleHQucGJEYXRhKTsKICAgfQogCiAgIHZvaWQgRXhwZWN0UmVmcmVzaFRva2VuRXhpc3RzKGJvb2wgZXhpc3RzKSB7CkBAIC0yMDUsNyArMjE1LDcgQEAKICAgICAvLyBXcml0ZSBhIG5ldyByZWZyZXNoIHRva2VuLgogICAgIGJhc2U6Ondpbjo6UmVnS2V5IGtleTsKICAgICBDcmVhdGVSZWdLZXkoJmtleSk7Ci0gICAgV3JpdGVScmVmcmVzaFRva2VuKCZrZXksICJsc3QtbmV3Iik7CisgICAgV3JpdGVSZWZyZXNoVG9rZW4oJmtleSwgImxzdC1uZXciKTsKICAgICBBU1NFUlRfRkFMU0Uoc2lnbmluX3V0aWw6OlJlYXV0aFdpdGhDcmVkZW50aWFsUHJvdmlkZXJJZlBvc3NpYmxlKHByb2ZpbGUpKTsKIAogICAgIC8vIFNpZ24gdXNlciBvdXQgb2YgYnJvd3Nlci4KQEAgLTIzNCw3ICsyNDQsNyBAQAogICAgIC8vIFdyaXRlIGEgbmV3IHJlZnJlc2ggdG9rZW4uIFRoaXMgdGltZSByZWF1dGggc2hvdWxkIHdvcmsuCiAgICAgYmFzZTo6d2luOjpSZWdLZXkga2V5OwogICAgIENyZWF0ZVJlZ0tleSgma2V5KTsKLSAgICBXcml0ZVJyZWZyZXNoVG9rZW4oJmtleSwgImxzdC1uZXciKTsKKyAgICBXcml0ZVJlZnJlc2hUb2tlbigma2V5LCAibHN0LW5ldyIpOwogICAgIEFTU0VSVF9GQUxTRShzaWduaW5fdXRpbDo6UmVhdXRoV2l0aENyZWRlbnRpYWxQcm92aWRlcklmUG9zc2libGUocHJvZmlsZSkpOwogCiAgICAgLy8gTWFrZSBzdXJlIHRoZSBwcm9maWxlIHN0YXlzIHNpZ25lZCBpbiwgYnV0IGluIGFuIGF1dGggZXJyb3Igc3RhdGUuCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9zaXRlX2lzb2xhdGlvbi9zaXRlX2lzb2xhdGlvbl9wb2xpY3kuY2MgYi9jaHJvbWUvYnJvd3Nlci9zaXRlX2lzb2xhdGlvbi9zaXRlX2lzb2xhdGlvbl9wb2xpY3kuY2MKaW5kZXggZDE1ZWUyOWMuLjY5YzJiZTcgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3NpdGVfaXNvbGF0aW9uL3NpdGVfaXNvbGF0aW9uX3BvbGljeS5jYworKysgYi9jaHJvbWUvYnJvd3Nlci9zaXRlX2lzb2xhdGlvbi9zaXRlX2lzb2xhdGlvbl9wb2xpY3kuY2MKQEAgLTE2LDkgKzE2LDIzIEBACiAKIC8vIHN0YXRpYwogYm9vbCBTaXRlSXNvbGF0aW9uUG9saWN5OjpJc0lzb2xhdGlvbkZvclBhc3N3b3JkU2l0ZXNFbmFibGVkKCkgewotICAvLyBJZ25vcmUgYXR0ZW1wdHMgdG8gYWRkIG5ldyBpc29sYXRlZCBvcmlnaW5zIHdoZW4gc2l0ZSBpc29sYXRpb24gaXMgdHVybmVkCi0gIC8vIG9mZiwgZm9yIGV4YW1wbGUgdmlhIGEgY29tbWFuZC1saW5lIHN3aXRjaCwgb3IgdmlhIGEgY29udGVudC8gZW1iZWRkZXIKLSAgLy8gdGhhdCB0dXJucyBzaXRlIGlzb2xhdGlvbiBvZmYgZm9yIGxvdy1tZW1vcnkgZGV2aWNlcy4KKyAgLy8gSWYgdGhlIHVzZXIgaGFzIGV4cGxpY2l0bHkgZW5hYmxlZCBzaXRlIGlzb2xhdGlvbiBmb3IgcGFzc3dvcmQgc2l0ZXMgZnJvbQorICAvLyBjaHJvbWU6Ly9mbGFncyBvciBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIGhvbm9yIHRoaXMgcmVnYXJkbGVzcyBvZiBwb2xpY2llcworICAvLyB0aGF0IG1heSBkaXNhYmxlIHNpdGUgaXNvbGF0aW9uLiAgSW4gcGFydGljdWxhciwgdGhpcyBtZWFucyB0aGF0IHRoZQorICAvLyBjaHJvbWU6Ly9mbGFncyBzd2l0Y2ggZm9yIHRoaXMgZmVhdHVyZSB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgYW55IG1lbW9yeQorICAvLyB0aHJlc2hvbGQgcmVzdHJpY3Rpb25zIGFuZCBvdmVyIGEgc3dpdGNoIGZvciBkaXNhYmxpbmcgc2l0ZSBpc29sYXRpb24uCisgIGlmIChiYXNlOjpGZWF0dXJlTGlzdDo6R2V0SW5zdGFuY2UoKS0+SXNGZWF0dXJlT3ZlcnJpZGRlbkZyb21Db21tYW5kTGluZSgKKyAgICAgICAgICBmZWF0dXJlczo6a1NpdGVJc29sYXRpb25Gb3JQYXNzd29yZFNpdGVzLm5hbWUsCisgICAgICAgICAgYmFzZTo6RmVhdHVyZUxpc3Q6Ok9WRVJSSURFX0VOQUJMRV9GRUFUVVJFKSkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gRG9uJ3QgaXNvbGF0ZSBhbnl0aGluZyB3aGVuIHNpdGUgaXNvbGF0aW9uIGlzIHR1cm5lZCBvZmYgYnkgdGhlIHVzZXIgb3IKKyAgLy8gcG9saWN5LiBUaGlzIGluY2x1ZGVzIHRoaW5ncyBsaWtlIHRoZSBzd2l0Y2hlczo6a0Rpc2FibGVTaXRlSXNvbGF0aW9uCisgIC8vIGNvbW1hbmQtbGluZSBzd2l0Y2gsIHRoZSBjb3JyZXNwb25kaW5nICJEaXNhYmxlIHNpdGUgaXNvbGF0aW9uIiBlbnRyeSBpbgorICAvLyBjaHJvbWU6Ly9mbGFncywgZW50ZXJwcmlzZSBwb2xpY3kgY29udHJvbGxlZCB2aWEKKyAgLy8gc3dpdGNoZXM6OmtEaXNhYmxlU2l0ZUlzb2xhdGlvbkZvclBvbGljeSwgYW5kIG1lbW9yeSB0aHJlc2hvbGQgY2hlY2tzIGluCisgIC8vIFNob3VsZERpc2FibGVTaXRlSXNvbGF0aW9uRHVlVG9NZW1vcnlUaHJlc2hvbGQoKS4KICAgaWYgKCFjb250ZW50OjpTaXRlSXNvbGF0aW9uUG9saWN5OjpBcmVEeW5hbWljSXNvbGF0ZWRPcmlnaW5zRW5hYmxlZCgpKQogICAgIHJldHVybiBmYWxzZTsKIApAQCAtNDMsNiArNTcsMzQgQEAKIH0KIAogLy8gc3RhdGljCitib29sIFNpdGVJc29sYXRpb25Qb2xpY3k6OlNob3VsZERpc2FibGVTaXRlSXNvbGF0aW9uRHVlVG9NZW1vcnlUaHJlc2hvbGQoKSB7CisgIC8vIFVzaW5nIDEwNzcgcmF0aGVyIHRoYW4gMTAyNCBiZWNhdXNlIDEpIGl0IGhlbHBzIGVuc3VyZSB0aGF0IGRldmljZXMgd2l0aAorICAvLyBleGFjdGx5IDFHQiBvZiBSQU0gd29uJ3QgZ2V0IGluY2x1ZGVkIGJlY2F1c2Ugb2YgaW5hY2N1cmFjaWVzIG9yIG9mZi1ieS1vbmUKKyAgLy8gZXJyb3JzIGFuZCAyKSB0aGlzIGlzIHRoZSBidWNrZXQgYm91bmRhcnkgaW4gTWVtb3J5LlN0YXRzLldpbi5Ub3RhbFBoeXMyLgorICAvLyBTZWUgYWxzbyBodHRwczovL2NyYnVnLmNvbS84NDQxMTguCisgIGNvbnN0ZXhwciBpbnQga0RlZmF1bHRNZW1vcnlUaHJlc2hvbGRNYiA9IDEwNzc7CisKKyAgLy8gVE9ETyhhY29sd2VsbCk6IFJlbmFtZSBmZWF0dXJlIHNpbmNlIGl0IG5vdyBhZmZlY3RzIG1vcmUgdGhhbiBqdXN0IHRoZQorICAvLyBzaXRlLXBlci1wcm9jZXNzIGNhc2UuCisgIGlmIChiYXNlOjpGZWF0dXJlTGlzdDo6SXNFbmFibGVkKAorICAgICAgICAgIGZlYXR1cmVzOjprU2l0ZVBlclByb2Nlc3NPbmx5Rm9ySGlnaE1lbW9yeUNsaWVudHMpKSB7CisgICAgaW50IG1lbW9yeV90aHJlc2hvbGRfbWIgPSBiYXNlOjpHZXRGaWVsZFRyaWFsUGFyYW1CeUZlYXR1cmVBc0ludCgKKyAgICAgICAgZmVhdHVyZXM6OmtTaXRlUGVyUHJvY2Vzc09ubHlGb3JIaWdoTWVtb3J5Q2xpZW50cywKKyAgICAgICAgZmVhdHVyZXM6OmtTaXRlUGVyUHJvY2Vzc09ubHlGb3JIaWdoTWVtb3J5Q2xpZW50c1BhcmFtTmFtZSwKKyAgICAgICAga0RlZmF1bHRNZW1vcnlUaHJlc2hvbGRNYik7CisgICAgcmV0dXJuIGJhc2U6OlN5c0luZm86OkFtb3VudE9mUGh5c2ljYWxNZW1vcnlNQigpIDw9IG1lbW9yeV90aHJlc2hvbGRfbWI7CisgIH0KKworI2lmIGRlZmluZWQoT1NfQU5EUk9JRCkKKyAgaWYgKGJhc2U6OlN5c0luZm86OkFtb3VudE9mUGh5c2ljYWxNZW1vcnlNQigpIDw9IGtEZWZhdWx0TWVtb3J5VGhyZXNob2xkTWIpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorI2VuZGlmCisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBzdGF0aWMKIHZvaWQgU2l0ZUlzb2xhdGlvblBvbGljeTo6QXBwbHlQZXJzaXN0ZWRJc29sYXRlZE9yaWdpbnMoUHJvZmlsZSogcHJvZmlsZSkgewogICAvLyBJZiB0aGUgdXNlciB0dXJuZWQgb2ZmIHBhc3N3b3JkLXRyaWdnZXJlZCBpc29sYXRpb24sIGRvbid0IGFwcGx5IGFueQogICAvLyBzdG9yZWQgaXNvbGF0ZWQgb3JpZ2lucywgYnV0IGFsc28gZG9uJ3QgY2xlYXIgdGhlbSBmcm9tIHByZWZzLCBzbyB0aGF0CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9zaXRlX2lzb2xhdGlvbi9zaXRlX2lzb2xhdGlvbl9wb2xpY3kuaCBiL2Nocm9tZS9icm93c2VyL3NpdGVfaXNvbGF0aW9uL3NpdGVfaXNvbGF0aW9uX3BvbGljeS5oCmluZGV4IDYxODM1NDYuLjI1ZGQyMTYgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3NpdGVfaXNvbGF0aW9uL3NpdGVfaXNvbGF0aW9uX3BvbGljeS5oCisrKyBiL2Nocm9tZS9icm93c2VyL3NpdGVfaXNvbGF0aW9uL3NpdGVfaXNvbGF0aW9uX3BvbGljeS5oCkBAIC0zMSw2ICszMSwxNSBAQAogICAvLyBoYXZlIGJlZW4gbG9hZGVkLgogICBzdGF0aWMgdm9pZCBBcHBseVBlcnNpc3RlZElzb2xhdGVkT3JpZ2lucyhQcm9maWxlKiBwcm9maWxlKTsKIAorICAvLyBEZXRlcm1pbmVzIHdoZXRoZXIgU2l0ZSBJc29sYXRpb24gc2hvdWxkIGJlIGRpc2FibGVkIGJlY2F1c2UgdGhlIGRldmljZQorICAvLyBkb2VzIG5vdCBoYXZlIHRoZSBtaW5pbXVtIHJlcXVpcmVkIGFtb3VudCBvZiBtZW1vcnkuCisgIC8vCisgIC8vIFRPRE8oYWxleG1vcyk6IEN1cnJlbnRseSwgdGhlIG1lbW9yeSB0aHJlc2hvbGQgaXMgc2hhcmVkIGZvciBhbGwgc2l0ZQorICAvLyBpc29sYXRpb24gbW9kZXMsIGluY2x1ZGluZyBzdHJpY3Qgc2l0ZSBpc29sYXRpb24gYW5kIHBhc3N3b3JkIHNpdGUKKyAgLy8gaXNvbGF0aW9uLiAgSW4gdGhlIGZ1dHVyZSwgc29tZSBzaXRlIGlzb2xhdGlvbiBtb2RlcyBtYXkgcmVxdWlyZSB0aGVpciBvd24KKyAgLy8gbWVtb3J5IHRocmVzaG9sZC4KKyAgc3RhdGljIGJvb2wgU2hvdWxkRGlzYWJsZVNpdGVJc29sYXRpb25EdWVUb01lbW9yeVRocmVzaG9sZCgpOworCiAgcHJpdmF0ZToKICAgRElTQUxMT1dfSU1QTElDSVRfQ09OU1RSVUNUT1JTKFNpdGVJc29sYXRpb25Qb2xpY3kpOwogfTsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3NzbC9zc2xfY29uZmlnX3NlcnZpY2VfbWFuYWdlcl9wcmVmLmNjIGIvY2hyb21lL2Jyb3dzZXIvc3NsL3NzbF9jb25maWdfc2VydmljZV9tYW5hZ2VyX3ByZWYuY2MKaW5kZXggMzYxZTEyYi4uOTg5OTFmMWUgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3NzbC9zc2xfY29uZmlnX3NlcnZpY2VfbWFuYWdlcl9wcmVmLmNjCisrKyBiL2Nocm9tZS9icm93c2VyL3NzbC9zc2xfY29uZmlnX3NlcnZpY2VfbWFuYWdlcl9wcmVmLmNjCkBAIC0xMCwxMSArMTAsMTIgQEAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlICJiYXNlL2JpbmQuaCIKKyNpbmNsdWRlICJiYXNlL2ZlYXR1cmVfbGlzdC5oIgogI2luY2x1ZGUgImJhc2UvbG9jYXRpb24uaCIKICNpbmNsdWRlICJiYXNlL21hY3Jvcy5oIgotI2luY2x1ZGUgImJhc2UvbWV0cmljcy9maWVsZF90cmlhbF9wYXJhbXMuaCIKICNpbmNsdWRlICJiYXNlL3N0cmluZ3Mvc3RyaW5nX3V0aWwuaCIKICNpbmNsdWRlICJiYXNlL3ZhbHVlcy5oIgorI2luY2x1ZGUgImNocm9tZS9jb21tb24vY2hyb21lX2ZlYXR1cmVzLmgiCiAjaW5jbHVkZSAiY2hyb21lL2NvbW1vbi9jaHJvbWVfc3dpdGNoZXMuaCIKICNpbmNsdWRlICJjaHJvbWUvY29tbW9uL3ByZWZfbmFtZXMuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL2NvbnRlbnRfc2V0dGluZ3MvY29yZS9icm93c2VyL2NvbnRlbnRfc2V0dGluZ3NfdXRpbHMuaCIKQEAgLTE1MCw2ICsxNTEsNyBAQAogICAvLyBUaGUgbG9jYWxfc3RhdGUgcHJlZnMuCiAgIEJvb2xlYW5QcmVmTWVtYmVyIHJldl9jaGVja2luZ19lbmFibGVkXzsKICAgQm9vbGVhblByZWZNZW1iZXIgcmV2X2NoZWNraW5nX3JlcXVpcmVkX2xvY2FsX2FuY2hvcnNfOworICBCb29sZWFuUHJlZk1lbWJlciB0bHMxM19oYXJkZW5pbmdfZm9yX2xvY2FsX2FuY2hvcnNfZW5hYmxlZF87CiAgIFN0cmluZ1ByZWZNZW1iZXIgc3NsX3ZlcnNpb25fbWluXzsKICAgU3RyaW5nUHJlZk1lbWJlciBzc2xfdmVyc2lvbl9tYXhfOwogICBTdHJpbmdMaXN0UHJlZk1lbWJlciBoMl9jbGllbnRfY2VydF9jb2FsZXNjaW5nX2hvc3RfcGF0dGVybnNfOwpAQCAtMTY2LDYgKzE2OCwxMSBAQAogICAgIFByZWZTZXJ2aWNlKiBsb2NhbF9zdGF0ZSkgewogICBEQ0hFQ0sobG9jYWxfc3RhdGUpOwogCisgIGxvY2FsX3N0YXRlLT5TZXREZWZhdWx0UHJlZlZhbHVlKAorICAgICAgcHJlZnM6OmtUTFMxM0hhcmRlbmluZ0ZvckxvY2FsQW5jaG9yc0VuYWJsZWQsCisgICAgICBiYXNlOjpWYWx1ZShiYXNlOjpGZWF0dXJlTGlzdDo6SXNFbmFibGVkKAorICAgICAgICAgIGZlYXR1cmVzOjprVExTMTNIYXJkZW5pbmdGb3JMb2NhbEFuY2hvcnMpKSk7CisKICAgUHJlZkNoYW5nZVJlZ2lzdHJhcjo6TmFtZWRDaGFuZ2VDYWxsYmFjayBsb2NhbF9zdGF0ZV9jYWxsYmFjayA9CiAgICAgICBiYXNlOjpCaW5kUmVwZWF0aW5nKCZTU0xDb25maWdTZXJ2aWNlTWFuYWdlclByZWY6Ok9uUHJlZmVyZW5jZUNoYW5nZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcyksIGxvY2FsX3N0YXRlKTsKQEAgLTE3NSw2ICsxODIsOSBAQAogICByZXZfY2hlY2tpbmdfcmVxdWlyZWRfbG9jYWxfYW5jaG9yc18uSW5pdCgKICAgICAgIHByZWZzOjprQ2VydFJldm9jYXRpb25DaGVja2luZ1JlcXVpcmVkTG9jYWxBbmNob3JzLCBsb2NhbF9zdGF0ZSwKICAgICAgIGxvY2FsX3N0YXRlX2NhbGxiYWNrKTsKKyAgdGxzMTNfaGFyZGVuaW5nX2Zvcl9sb2NhbF9hbmNob3JzX2VuYWJsZWRfLkluaXQoCisgICAgICBwcmVmczo6a1RMUzEzSGFyZGVuaW5nRm9yTG9jYWxBbmNob3JzRW5hYmxlZCwgbG9jYWxfc3RhdGUsCisgICAgICBsb2NhbF9zdGF0ZV9jYWxsYmFjayk7CiAgIHNzbF92ZXJzaW9uX21pbl8uSW5pdChwcmVmczo6a1NTTFZlcnNpb25NaW4sIGxvY2FsX3N0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxfc3RhdGVfY2FsbGJhY2spOwogICBzc2xfdmVyc2lvbl9tYXhfLkluaXQocHJlZnM6OmtTU0xWZXJzaW9uTWF4LCBsb2NhbF9zdGF0ZSwKQEAgLTE5OCw2ICsyMDgsMTAgQEAKICAgcmVnaXN0cnktPlJlZ2lzdGVyQm9vbGVhblByZWYoCiAgICAgICBwcmVmczo6a0NlcnRSZXZvY2F0aW9uQ2hlY2tpbmdSZXF1aXJlZExvY2FsQW5jaG9ycywKICAgICAgIGRlZmF1bHRfdmVyaWZpZXJfY29uZmlnLnJlcXVpcmVfcmV2X2NoZWNraW5nX2xvY2FsX2FuY2hvcnMpOworICBuZXQ6OlNTTENvbnRleHRDb25maWcgZGVmYXVsdF9jb250ZXh0X2NvbmZpZzsKKyAgcmVnaXN0cnktPlJlZ2lzdGVyQm9vbGVhblByZWYoCisgICAgICBwcmVmczo6a1RMUzEzSGFyZGVuaW5nRm9yTG9jYWxBbmNob3JzRW5hYmxlZCwKKyAgICAgIGRlZmF1bHRfY29udGV4dF9jb25maWcudGxzMTNfaGFyZGVuaW5nX2Zvcl9sb2NhbF9hbmNob3JzX2VuYWJsZWQpOwogICByZWdpc3RyeS0+UmVnaXN0ZXJTdHJpbmdQcmVmKHByZWZzOjprU1NMVmVyc2lvbk1pbiwgc3RkOjpzdHJpbmcoKSk7CiAgIHJlZ2lzdHJ5LT5SZWdpc3RlclN0cmluZ1ByZWYocHJlZnM6OmtTU0xWZXJzaW9uTWF4LCBzdGQ6OnN0cmluZygpKTsKICAgcmVnaXN0cnktPlJlZ2lzdGVyTGlzdFByZWYocHJlZnM6OmtDaXBoZXJTdWl0ZUJsYWNrbGlzdCk7CkBAIC0yNDcsNiArMjYxLDggQEAKICAgICBjb25maWctPnJldl9jaGVja2luZ19lbmFibGVkID0gZmFsc2U7CiAgIGNvbmZpZy0+cmV2X2NoZWNraW5nX3JlcXVpcmVkX2xvY2FsX2FuY2hvcnMgPQogICAgICAgcmV2X2NoZWNraW5nX3JlcXVpcmVkX2xvY2FsX2FuY2hvcnNfLkdldFZhbHVlKCk7CisgIGNvbmZpZy0+dGxzMTNfaGFyZGVuaW5nX2Zvcl9sb2NhbF9hbmNob3JzX2VuYWJsZWQgPQorICAgICAgdGxzMTNfaGFyZGVuaW5nX2Zvcl9sb2NhbF9hbmNob3JzX2VuYWJsZWRfLkdldFZhbHVlKCk7CiAgIHN0ZDo6c3RyaW5nIHZlcnNpb25fbWluX3N0ciA9IHNzbF92ZXJzaW9uX21pbl8uR2V0VmFsdWUoKTsKICAgc3RkOjpzdHJpbmcgdmVyc2lvbl9tYXhfc3RyID0gc3NsX3ZlcnNpb25fbWF4Xy5HZXRWYWx1ZSgpOwogCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9zc2wvc3NsX2NvbmZpZ19zZXJ2aWNlX21hbmFnZXJfcHJlZl91bml0dGVzdC5jYyBiL2Nocm9tZS9icm93c2VyL3NzbC9zc2xfY29uZmlnX3NlcnZpY2VfbWFuYWdlcl9wcmVmX3VuaXR0ZXN0LmNjCmluZGV4IDliOWI0NTMuLjdkNWRlZjggMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3NzbC9zc2xfY29uZmlnX3NlcnZpY2VfbWFuYWdlcl9wcmVmX3VuaXR0ZXN0LmNjCisrKyBiL2Nocm9tZS9icm93c2VyL3NzbC9zc2xfY29uZmlnX3NlcnZpY2VfbWFuYWdlcl9wcmVmX3VuaXR0ZXN0LmNjCkBAIC02LDExICs2LDE0IEBACiAjaW5jbHVkZSA8dXRpbGl0eT4KIAogI2luY2x1ZGUgImJhc2UvY29tbWFuZF9saW5lLmgiCisjaW5jbHVkZSAiYmFzZS9mZWF0dXJlX2xpc3QuaCIKICNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgogI2luY2x1ZGUgImJhc2UvcnVuX2xvb3AuaCIKKyNpbmNsdWRlICJiYXNlL3Rlc3Qvc2NvcGVkX2ZlYXR1cmVfbGlzdC5oIgogI2luY2x1ZGUgImJhc2UvdGVzdC90YXNrX2Vudmlyb25tZW50LmgiCiAjaW5jbHVkZSAiYmFzZS92YWx1ZXMuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9zc2wvc3NsX2NvbmZpZ19zZXJ2aWNlX21hbmFnZXIuaCIKKyNpbmNsdWRlICJjaHJvbWUvY29tbW9uL2Nocm9tZV9mZWF0dXJlcy5oIgogI2luY2x1ZGUgImNocm9tZS9jb21tb24vY2hyb21lX3N3aXRjaGVzLmgiCiAjaW5jbHVkZSAiY2hyb21lL2NvbW1vbi9wcmVmX25hbWVzLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9wcmVmcy90ZXN0aW5nX3ByZWZfc2VydmljZS5oIgpAQCAtMjk3LDMgKzMwMCw1NyBAQAogCiAgIEVYUEVDVF9UUlVFKG9ic2VydmVkX2NvbmZpZ3NfWzBdLT5yZXZfY2hlY2tpbmdfcmVxdWlyZWRfbG9jYWxfYW5jaG9ycyk7CiB9CisKKy8vIFRlc3RzIHRoYXQgdGhlIFRMUyAxLjMgaGFyZGVuaW5nIHByZWYgY29ycmVjdGx5IHNldHMgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUKKy8vIGluIFNTTCBjb25maWdzLgorVEVTVF9GKFNTTENvbmZpZ1NlcnZpY2VNYW5hZ2VyUHJlZlRlc3QsIFRMUzEzSGFyZGVuaW5nRm9yTG9jYWxBbmNob3JzKSB7CisgIFRlc3RpbmdQcmVmU2VydmljZVNpbXBsZSBsb2NhbF9zdGF0ZTsKKyAgU1NMQ29uZmlnU2VydmljZU1hbmFnZXI6OlJlZ2lzdGVyUHJlZnMobG9jYWxfc3RhdGUucmVnaXN0cnkoKSk7CisKKyAgc3RkOjp1bmlxdWVfcHRyPFNTTENvbmZpZ1NlcnZpY2VNYW5hZ2VyPiBjb25maWdfbWFuYWdlciA9CisgICAgICBTZXRVcENvbmZpZ1NlcnZpY2VNYW5hZ2VyKCZsb2NhbF9zdGF0ZSk7CisKKyAgLy8gVGhlIGhhcmRlbmluZyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgorICBFWFBFQ1RfRkFMU0UoaW5pdGlhbF9jb25maWdfLT50bHMxM19oYXJkZW5pbmdfZm9yX2xvY2FsX2FuY2hvcnNfZW5hYmxlZCk7CisKKyAgLy8gSXQgY2FuIGJlIGVuYWJsZWQgdmlhIHByZWZlcmVuY2UuCisgIGxvY2FsX3N0YXRlLlNldFVzZXJQcmVmKHByZWZzOjprVExTMTNIYXJkZW5pbmdGb3JMb2NhbEFuY2hvcnNFbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPGJhc2U6OlZhbHVlPih0cnVlKSk7CisgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFdhaXRGb3JVcGRhdGUoKSk7CisgIEVYUEVDVF9UUlVFKG9ic2VydmVkX2NvbmZpZ3NfWzBdLT50bHMxM19oYXJkZW5pbmdfZm9yX2xvY2FsX2FuY2hvcnNfZW5hYmxlZCk7CisKKyAgLy8gSXQgY2FuIHRoZW4gYmUgZGlzYWJsZWQgYWdhaW4uCisgIGxvY2FsX3N0YXRlLlNldFVzZXJQcmVmKHByZWZzOjprVExTMTNIYXJkZW5pbmdGb3JMb2NhbEFuY2hvcnNFbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPGJhc2U6OlZhbHVlPihmYWxzZSkpOworICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShXYWl0Rm9yVXBkYXRlKCkpOworICBFWFBFQ1RfRkFMU0Uob2JzZXJ2ZWRfY29uZmlnc19bMV0tPnRsczEzX2hhcmRlbmluZ19mb3JfbG9jYWxfYW5jaG9yc19lbmFibGVkKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgVExTIDEuMyBoYXJkZW5pbmcgcHJlZiBjb3JyZWN0bHkgaW50ZXJhY3RzIHdpdGggdGhlIGZlYXR1cmUKKy8vIGZsYWcuCitURVNUX0YoU1NMQ29uZmlnU2VydmljZU1hbmFnZXJQcmVmVGVzdCwKKyAgICAgICBUTFMxM0hhcmRlbmluZ0ZvckxvY2FsQW5jaG9yc0ZlYXR1cmVFbmFibGVkKSB7CisgIGJhc2U6OnRlc3Q6OlNjb3BlZEZlYXR1cmVMaXN0IGZlYXR1cmVfbGlzdDsKKyAgZmVhdHVyZV9saXN0LkluaXRBbmRFbmFibGVGZWF0dXJlKGZlYXR1cmVzOjprVExTMTNIYXJkZW5pbmdGb3JMb2NhbEFuY2hvcnMpOworCisgIFRlc3RpbmdQcmVmU2VydmljZVNpbXBsZSBsb2NhbF9zdGF0ZTsKKyAgU1NMQ29uZmlnU2VydmljZU1hbmFnZXI6OlJlZ2lzdGVyUHJlZnMobG9jYWxfc3RhdGUucmVnaXN0cnkoKSk7CisKKyAgc3RkOjp1bmlxdWVfcHRyPFNTTENvbmZpZ1NlcnZpY2VNYW5hZ2VyPiBjb25maWdfbWFuYWdlciA9CisgICAgICBTZXRVcENvbmZpZ1NlcnZpY2VNYW5hZ2VyKCZsb2NhbF9zdGF0ZSk7CisKKyAgLy8gV2l0aCB0aGUgZmVhdHVyZSBlbmFibGVkLCB0aGUgaGFyZGVuaW5nIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4KKyAgRVhQRUNUX1RSVUUoaW5pdGlhbF9jb25maWdfLT50bHMxM19oYXJkZW5pbmdfZm9yX2xvY2FsX2FuY2hvcnNfZW5hYmxlZCk7CisKKyAgLy8gSXQgY2FuIGJlIGRpc2FibGVkIHZpYSBwcmVmZXJlbmNlcy4KKyAgbG9jYWxfc3RhdGUuU2V0VXNlclByZWYocHJlZnM6OmtUTFMxM0hhcmRlbmluZ0ZvckxvY2FsQW5jaG9yc0VuYWJsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8YmFzZTo6VmFsdWU+KGZhbHNlKSk7CisgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFdhaXRGb3JVcGRhdGUoKSk7CisgIEVYUEVDVF9GQUxTRShvYnNlcnZlZF9jb25maWdzX1swXS0+dGxzMTNfaGFyZGVuaW5nX2Zvcl9sb2NhbF9hbmNob3JzX2VuYWJsZWQpOworCisgIC8vIEl0IGNhbiB0aGVuIGJlIGVuYWJsZWQgYWdhaW4uCisgIGxvY2FsX3N0YXRlLlNldFVzZXJQcmVmKHByZWZzOjprVExTMTNIYXJkZW5pbmdGb3JMb2NhbEFuY2hvcnNFbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPGJhc2U6OlZhbHVlPih0cnVlKSk7CisgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFdhaXRGb3JVcGRhdGUoKSk7CisgIEVYUEVDVF9UUlVFKG9ic2VydmVkX2NvbmZpZ3NfWzFdLT50bHMxM19oYXJkZW5pbmdfZm9yX2xvY2FsX2FuY2hvcnNfZW5hYmxlZCk7Cit9CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9zdXBlcnZpc2VkX3VzZXIvcGVybWlzc2lvbl9yZXF1ZXN0X2NyZWF0b3JfbW9jay5jYyBiL2Nocm9tZS9icm93c2VyL3N1cGVydmlzZWRfdXNlci9wZXJtaXNzaW9uX3JlcXVlc3RfY3JlYXRvcl9tb2NrLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMjVlMDUKLS0tIC9kZXYvbnVsbAorKysgYi9jaHJvbWUvYnJvd3Nlci9zdXBlcnZpc2VkX3VzZXIvcGVybWlzc2lvbl9yZXF1ZXN0X2NyZWF0b3JfbW9jay5jYwpAQCAtMCwwICsxLDExMyBAQAorLy8gQ29weXJpZ2h0IDIwMTkgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvc3VwZXJ2aXNlZF91c2VyL3Blcm1pc3Npb25fcmVxdWVzdF9jcmVhdG9yX21vY2suaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKKyNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJiYXNlL3ZhbHVlcy5oIgorI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3Byb2ZpbGVzL3Byb2ZpbGUuaCIKKyNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9zdXBlcnZpc2VkX3VzZXIvc3VwZXJ2aXNlZF91c2VyX2NvbnN0YW50cy5oIgorI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3N1cGVydmlzZWRfdXNlci9zdXBlcnZpc2VkX3VzZXJfc2V0dGluZ3Nfc2VydmljZS5oIgorI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3N1cGVydmlzZWRfdXNlci9zdXBlcnZpc2VkX3VzZXJfc2V0dGluZ3Nfc2VydmljZV9mYWN0b3J5LmgiCisKK25hbWVzcGFjZSB7CisKK3N0ZDo6dW5pcXVlX3B0cjxiYXNlOjpEaWN0aW9uYXJ5VmFsdWU+IEdldE1hbnVhbEJlaGF2aW9ySG9zdERpY3QoCisgICAgUHJvZmlsZSogcHJvZmlsZSkgeworICBTdXBlcnZpc2VkVXNlclNldHRpbmdzU2VydmljZSogc2V0dGluZ3Nfc2VydmljZSA9CisgICAgICBTdXBlcnZpc2VkVXNlclNldHRpbmdzU2VydmljZUZhY3Rvcnk6OkdldEZvcktleShwcm9maWxlLT5HZXRQcm9maWxlS2V5KCkpOworICBjb25zdCBiYXNlOjpEaWN0aW9uYXJ5VmFsdWUqIGxvY2FsX3NldHRpbmdzID0KKyAgICAgIHNldHRpbmdzX3NlcnZpY2UtPkxvY2FsU2V0dGluZ3NGb3JUZXN0KCk7CisgIHN0ZDo6dW5pcXVlX3B0cjxiYXNlOjpEaWN0aW9uYXJ5VmFsdWU+IGRpY3RfdG9faW5zZXJ0OworCisgIGlmIChsb2NhbF9zZXR0aW5ncy0+SGFzS2V5KAorICAgICAgICAgIHN1cGVydmlzZWRfdXNlcnM6OmtDb250ZW50UGFja01hbnVhbEJlaGF2aW9ySG9zdHMpKSB7CisgICAgY29uc3QgYmFzZTo6RGljdGlvbmFyeVZhbHVlKiBkaWN0X3ZhbHVlOworCisgICAgbG9jYWxfc2V0dGluZ3MtPkdldERpY3Rpb25hcnkoCisgICAgICAgIHN1cGVydmlzZWRfdXNlcnM6OmtDb250ZW50UGFja01hbnVhbEJlaGF2aW9ySG9zdHMsICZkaWN0X3ZhbHVlKTsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxiYXNlOjpWYWx1ZT4gY2xvbmUgPQorICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPGJhc2U6OlZhbHVlPihkaWN0X3ZhbHVlLT5DbG9uZSgpKTsKKworICAgIGRpY3RfdG9faW5zZXJ0ID0gYmFzZTo6RGljdGlvbmFyeVZhbHVlOjpGcm9tKHN0ZDo6bW92ZShjbG9uZSkpOworICB9IGVsc2UgeworICAgIGRpY3RfdG9faW5zZXJ0ID0gc3RkOjptYWtlX3VuaXF1ZTxiYXNlOjpEaWN0aW9uYXJ5VmFsdWU+KCk7CisgIH0KKworICByZXR1cm4gZGljdF90b19pbnNlcnQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitQZXJtaXNzaW9uUmVxdWVzdENyZWF0b3JNb2NrOjpQZXJtaXNzaW9uUmVxdWVzdENyZWF0b3JNb2NrKFByb2ZpbGUqIHByb2ZpbGUpCisgICAgOiBwcm9maWxlXyhwcm9maWxlKSB7fQorCitQZXJtaXNzaW9uUmVxdWVzdENyZWF0b3JNb2NrOjp+UGVybWlzc2lvblJlcXVlc3RDcmVhdG9yTW9jaygpID0gZGVmYXVsdDsKKworYm9vbCBQZXJtaXNzaW9uUmVxdWVzdENyZWF0b3JNb2NrOjpJc0VuYWJsZWQoKSBjb25zdCB7CisgIHJldHVybiBlbmFibGVkXzsKK30KKwordm9pZCBQZXJtaXNzaW9uUmVxdWVzdENyZWF0b3JNb2NrOjpDcmVhdGVVUkxBY2Nlc3NSZXF1ZXN0KAorICAgIGNvbnN0IEdVUkwmIHVybF9yZXF1ZXN0ZWQsCisgICAgU3VjY2Vzc0NhbGxiYWNrIGNhbGxiYWNrKSB7CisgIERDSEVDSyhlbmFibGVkXyk7CisgIHVybF9yZXF1ZXN0c18ucHVzaF9iYWNrKHVybF9yZXF1ZXN0ZWQpOworICBpZiAoIWRlbGF5X2hhbmRsaW5nXykKKyAgICBDcmVhdGVVUkxBY2Nlc3NSZXF1ZXN0SW1wbCh1cmxfcmVxdWVzdGVkKTsKKyAgc3RkOjptb3ZlKGNhbGxiYWNrKS5SdW4odHJ1ZSk7Cit9CisKK3ZvaWQgUGVybWlzc2lvblJlcXVlc3RDcmVhdG9yTW9jazo6U2V0UGVybWlzc2lvblJlc3VsdChib29sIHJlc3VsdCkgeworICByZXN1bHRfID0gcmVzdWx0OworfQorCit2b2lkIFBlcm1pc3Npb25SZXF1ZXN0Q3JlYXRvck1vY2s6OlNldEVuYWJsZWQoKSB7CisgIGVuYWJsZWRfID0gdHJ1ZTsKK30KKwordm9pZCBQZXJtaXNzaW9uUmVxdWVzdENyZWF0b3JNb2NrOjpEZWxheUhhbmRsaW5nRm9yTmV4dFJlcXVlc3RzKCkgeworICBEQ0hFQ0soIWRlbGF5X2hhbmRsaW5nXyk7CisKKyAgbGFzdF91cmxfcmVxdWVzdF9oYW5kbGVkX2luZGV4XyA9IHVybF9yZXF1ZXN0c18uc2l6ZSgpIC0gMTsKKyAgZGVsYXlfaGFuZGxpbmdfID0gdHJ1ZTsKK30KKwordm9pZCBQZXJtaXNzaW9uUmVxdWVzdENyZWF0b3JNb2NrOjpIYW5kbGVEZWxheWVkUmVxdWVzdHMoKSB7CisgIERDSEVDSyhkZWxheV9oYW5kbGluZ18pOworCisgIGF1dG8gZGljdF90b19pbnNlcnQgPSBHZXRNYW51YWxCZWhhdmlvckhvc3REaWN0KHByb2ZpbGVfKTsKKworICBmb3IgKHNpemVfdCBpID0gbGFzdF91cmxfcmVxdWVzdF9oYW5kbGVkX2luZGV4XyArIDE7IGkgPCB1cmxfcmVxdWVzdHNfLnNpemUoKTsKKyAgICAgICBpKyspIHsKKyAgICBkaWN0X3RvX2luc2VydC0+U2V0S2V5KHVybF9yZXF1ZXN0c19baV0uaG9zdCgpLCBiYXNlOjpWYWx1ZShyZXN1bHRfKSk7CisgIH0KKworICBTdXBlcnZpc2VkVXNlclNldHRpbmdzU2VydmljZSogc2V0dGluZ3Nfc2VydmljZSA9CisgICAgICBTdXBlcnZpc2VkVXNlclNldHRpbmdzU2VydmljZUZhY3Rvcnk6OkdldEZvcktleSgKKyAgICAgICAgICBwcm9maWxlXy0+R2V0UHJvZmlsZUtleSgpKTsKKworICBzZXR0aW5nc19zZXJ2aWNlLT5TZXRMb2NhbFNldHRpbmcoCisgICAgICBzdXBlcnZpc2VkX3VzZXJzOjprQ29udGVudFBhY2tNYW51YWxCZWhhdmlvckhvc3RzLAorICAgICAgc3RkOjptb3ZlKGRpY3RfdG9faW5zZXJ0KSk7CisKKyAgZGVsYXlfaGFuZGxpbmdfID0gZmFsc2U7Cit9CisKK3ZvaWQgUGVybWlzc2lvblJlcXVlc3RDcmVhdG9yTW9jazo6Q3JlYXRlVVJMQWNjZXNzUmVxdWVzdEltcGwoCisgICAgY29uc3QgR1VSTCYgdXJsX3JlcXVlc3RlZCkgeworICBhdXRvIGRpY3RfdG9faW5zZXJ0ID0gR2V0TWFudWFsQmVoYXZpb3JIb3N0RGljdChwcm9maWxlXyk7CisgIGRpY3RfdG9faW5zZXJ0LT5TZXRLZXkodXJsX3JlcXVlc3RlZC5ob3N0KCksIGJhc2U6OlZhbHVlKHJlc3VsdF8pKTsKKworICBTdXBlcnZpc2VkVXNlclNldHRpbmdzU2VydmljZSogc2V0dGluZ3Nfc2VydmljZSA9CisgICAgICBTdXBlcnZpc2VkVXNlclNldHRpbmdzU2VydmljZUZhY3Rvcnk6OkdldEZvcktleSgKKyAgICAgICAgICBwcm9maWxlXy0+R2V0UHJvZmlsZUtleSgpKTsKKyAgc2V0dGluZ3Nfc2VydmljZS0+U2V0TG9jYWxTZXR0aW5nKAorICAgICAgc3VwZXJ2aXNlZF91c2Vyczo6a0NvbnRlbnRQYWNrTWFudWFsQmVoYXZpb3JIb3N0cywKKyAgICAgIHN0ZDo6bW92ZShkaWN0X3RvX2luc2VydCkpOworfQpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvc3VwZXJ2aXNlZF91c2VyL3Blcm1pc3Npb25fcmVxdWVzdF9jcmVhdG9yX21vY2suaCBiL2Nocm9tZS9icm93c2VyL3N1cGVydmlzZWRfdXNlci9wZXJtaXNzaW9uX3JlcXVlc3RfY3JlYXRvcl9tb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk0NmI1M2QKLS0tIC9kZXYvbnVsbAorKysgYi9jaHJvbWUvYnJvd3Nlci9zdXBlcnZpc2VkX3VzZXIvcGVybWlzc2lvbl9yZXF1ZXN0X2NyZWF0b3JfbW9jay5oCkBAIC0wLDAgKzEsNTQgQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2lmbmRlZiBDSFJPTUVfQlJPV1NFUl9TVVBFUlZJU0VEX1VTRVJfUEVSTUlTU0lPTl9SRVFVRVNUX0NSRUFUT1JfTU9DS19IXworI2RlZmluZSBDSFJPTUVfQlJPV1NFUl9TVVBFUlZJU0VEX1VTRVJfUEVSTUlTU0lPTl9SRVFVRVNUX0NSRUFUT1JfTU9DS19IXworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImJhc2UvbWFjcm9zLmgiCisjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvc3VwZXJ2aXNlZF91c2VyL3Blcm1pc3Npb25fcmVxdWVzdF9jcmVhdG9yLmgiCisjaW5jbHVkZSAidXJsL2d1cmwuaCIKKworY2xhc3MgUHJvZmlsZTsKKworY2xhc3MgUGVybWlzc2lvblJlcXVlc3RDcmVhdG9yTW9jayA6IHB1YmxpYyBQZXJtaXNzaW9uUmVxdWVzdENyZWF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgUGVybWlzc2lvblJlcXVlc3RDcmVhdG9yTW9jayhQcm9maWxlKiBwcm9maWxlKTsKKyAgflBlcm1pc3Npb25SZXF1ZXN0Q3JlYXRvck1vY2soKSBvdmVycmlkZTsKKworICAvLyBQZXJtaXNzaW9uUmVxdWVzdENyZWF0b3I6CisgIGJvb2wgSXNFbmFibGVkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgQ3JlYXRlVVJMQWNjZXNzUmVxdWVzdChjb25zdCBHVVJMJiB1cmxfcmVxdWVzdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VjY2Vzc0NhbGxiYWNrIGNhbGxiYWNrKSBvdmVycmlkZTsKKworICAvLyBTZXRzIHdoZXRoZXIgdGhlIG5leHQgY2FsbCB0byBjcmVhdGUgcmVxdWVzdHMgd2lsbCBzdWNjZWVkLgorICB2b2lkIFNldFBlcm1pc3Npb25SZXN1bHQoYm9vbCByZXN1bHQpOworICB2b2lkIFNldEVuYWJsZWQoKTsKKworICAvLyBEZWxheXMgYXBwcm92YWxzIGZvciBpbmNvbWluZyByZXF1ZXN0cyB1bnRpbAorICAvLyB8UGVybWlzc2lvblJlcXVlc3RDcmVhdG9yTW9jazo6SGFuZGxlRGVsYXllZFJlcXVlc3RzfCBpcyBjYWxsZWQuCisgIHZvaWQgRGVsYXlIYW5kbGluZ0Zvck5leHRSZXF1ZXN0cygpOworICB2b2lkIEhhbmRsZURlbGF5ZWRSZXF1ZXN0cygpOworCisgIC8vIEdldHRlciBtZXRob2RzLgorICBjb25zdCBzdGQ6OnZlY3RvcjxHVVJMPiYgdXJsX3JlcXVlc3RzKCkgY29uc3QgeyByZXR1cm4gdXJsX3JlcXVlc3RzXzsgfQorCisgcHJpdmF0ZToKKyAgdm9pZCBDcmVhdGVVUkxBY2Nlc3NSZXF1ZXN0SW1wbChjb25zdCBHVVJMJiB1cmxfcmVxdWVzdGVkKTsKKworICBib29sIHJlc3VsdF8gPSBmYWxzZTsKKyAgYm9vbCBlbmFibGVkXyA9IGZhbHNlOworICBib29sIGRlbGF5X2hhbmRsaW5nXyA9IGZhbHNlOworICBpbnQgbGFzdF91cmxfcmVxdWVzdF9oYW5kbGVkX2luZGV4XyA9IDA7CisKKyAgUHJvZmlsZSogcHJvZmlsZV8gPSBudWxscHRyOworCisgIHN0ZDo6dmVjdG9yPEdVUkw+IHVybF9yZXF1ZXN0c187CisKKyAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFBlcm1pc3Npb25SZXF1ZXN0Q3JlYXRvck1vY2spOworfTsKKworI2VuZGlmICAvLyBDSFJPTUVfQlJPV1NFUl9TVVBFUlZJU0VEX1VTRVJfUEVSTUlTU0lPTl9SRVFVRVNUX0NSRUFUT1JfTU9DS19IXwpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvc3VwZXJ2aXNlZF91c2VyL3N1cGVydmlzZWRfdXNlcl9pbnRlcnN0aXRpYWwuY2MgYi9jaHJvbWUvYnJvd3Nlci9zdXBlcnZpc2VkX3VzZXIvc3VwZXJ2aXNlZF91c2VyX2ludGVyc3RpdGlhbC5jYwppbmRleCAwZDJmMzk0Li42OGM1OWUwNSAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvc3VwZXJ2aXNlZF91c2VyL3N1cGVydmlzZWRfdXNlcl9pbnRlcnN0aXRpYWwuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvc3VwZXJ2aXNlZF91c2VyL3N1cGVydmlzZWRfdXNlcl9pbnRlcnN0aXRpYWwuY2MKQEAgLTU0LDYgKzU0LDE1IEBACiAvLyBGb3IgdXNlIGluIGhpc3RvZ3JhbXMuCiBlbnVtIENvbW1hbmRzIHsgUFJFVklFVywgQkFDSywgTlRQLCBBQ0NFU1NfUkVRVUVTVCwgSElTVE9HUkFNX0JPVU5ESU5HX1ZBTFVFIH07CiAKKy8vIEZvciB1c2UgaW4gaGlzdG9ncmFtcy5UaGUgZW51bSB2YWx1ZXMgc2hvdWxkIHJlbWFpbiBzeW5jaHJvbml6ZWQgd2l0aCB0aGUKKy8vIGVudW0gTWFuYWdlZFVzZXJVUkxSZXF1ZXN0UGVybWlzc2lvblNvdXJjZSBpbgorLy8gdG9vbHMvbWV0cmljcy9oaXN0b2dyYW1zL2VudW1zLnhtbC4KK2VudW0gY2xhc3MgUmVxdWVzdFBlcm1pc3Npb25Tb3VyY2UgeworICBNQUlOX0ZSQU1FID0gMCwKKyAgU1VCX0ZSQU1FLAorICBISVNUT0dSQU1fQk9VTkRJTkdfVkFMVUUKK307CisKIGNsYXNzIFRhYkNsb3NlciA6IHB1YmxpYyBjb250ZW50OjpXZWJDb250ZW50c1VzZXJEYXRhPFRhYkNsb3Nlcj4gewogIHB1YmxpYzoKICAgflRhYkNsb3NlcigpIG92ZXJyaWRlIHt9CkBAIC0xMzksMTEgKzE0OCwxNSBAQAogc3RkOjp1bmlxdWVfcHRyPFN1cGVydmlzZWRVc2VySW50ZXJzdGl0aWFsPiBTdXBlcnZpc2VkVXNlckludGVyc3RpdGlhbDo6Q3JlYXRlKAogICAgIFdlYkNvbnRlbnRzKiB3ZWJfY29udGVudHMsCiAgICAgY29uc3QgR1VSTCYgdXJsLAotICAgIHN1cGVydmlzZWRfdXNlcl9lcnJvcl9wYWdlOjpGaWx0ZXJpbmdCZWhhdmlvclJlYXNvbiByZWFzb24pIHsKLSAgc3RkOjp1bmlxdWVfcHRyPFN1cGVydmlzZWRVc2VySW50ZXJzdGl0aWFsPiBpbnRlcnN0aXRpYWwgPSBiYXNlOjpXcmFwVW5pcXVlKAotICAgICAgbmV3IFN1cGVydmlzZWRVc2VySW50ZXJzdGl0aWFsKHdlYl9jb250ZW50cywgdXJsLCByZWFzb24pKTsKKyAgICBzdXBlcnZpc2VkX3VzZXJfZXJyb3JfcGFnZTo6RmlsdGVyaW5nQmVoYXZpb3JSZWFzb24gcmVhc29uLAorICAgIGludCBmcmFtZV9pZCwKKyAgICBpbnQ2NF90IGludGVyc3RpdGlhbF9uYXZpZ2F0aW9uX2lkKSB7CisgIHN0ZDo6dW5pcXVlX3B0cjxTdXBlcnZpc2VkVXNlckludGVyc3RpdGlhbD4gaW50ZXJzdGl0aWFsID0KKyAgICAgIGJhc2U6OldyYXBVbmlxdWUobmV3IFN1cGVydmlzZWRVc2VySW50ZXJzdGl0aWFsKAorICAgICAgICAgIHdlYl9jb250ZW50cywgdXJsLCByZWFzb24sIGZyYW1lX2lkLCBpbnRlcnN0aXRpYWxfbmF2aWdhdGlvbl9pZCkpOwogCi0gIENsZWFuVXBJbmZvQmFyKHdlYl9jb250ZW50cyk7CisgIGlmICh3ZWJfY29udGVudHMtPkdldE1haW5GcmFtZSgpLT5HZXRGcmFtZVRyZWVOb2RlSWQoKSA9PSBmcmFtZV9pZCkKKyAgICBDbGVhblVwSW5mb0Jhcih3ZWJfY29udGVudHMpOwogCiAgIC8vIENhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgdGhlIGludGVyc3RpdGlhbC4KICAgcmV0dXJuIGludGVyc3RpdGlhbDsKQEAgLTE1MiwxMSArMTY1LDE1IEBACiBTdXBlcnZpc2VkVXNlckludGVyc3RpdGlhbDo6U3VwZXJ2aXNlZFVzZXJJbnRlcnN0aXRpYWwoCiAgICAgV2ViQ29udGVudHMqIHdlYl9jb250ZW50cywKICAgICBjb25zdCBHVVJMJiB1cmwsCi0gICAgc3VwZXJ2aXNlZF91c2VyX2Vycm9yX3BhZ2U6OkZpbHRlcmluZ0JlaGF2aW9yUmVhc29uIHJlYXNvbikKKyAgICBzdXBlcnZpc2VkX3VzZXJfZXJyb3JfcGFnZTo6RmlsdGVyaW5nQmVoYXZpb3JSZWFzb24gcmVhc29uLAorICAgIGludCBmcmFtZV9pZCwKKyAgICBpbnQ2NF90IGludGVyc3RpdGlhbF9uYXZpZ2F0aW9uX2lkKQogICAgIDogd2ViX2NvbnRlbnRzXyh3ZWJfY29udGVudHMpLAogICAgICAgcHJvZmlsZV8oUHJvZmlsZTo6RnJvbUJyb3dzZXJDb250ZXh0KHdlYl9jb250ZW50cy0+R2V0QnJvd3NlckNvbnRleHQoKSkpLAogICAgICAgdXJsXyh1cmwpLAotICAgICAgcmVhc29uXyhyZWFzb24pIHt9CisgICAgICByZWFzb25fKHJlYXNvbiksCisgICAgICBmcmFtZV9pZF8oZnJhbWVfaWQpLAorICAgICAgaW50ZXJzdGl0aWFsX25hdmlnYXRpb25faWRfKGludGVyc3RpdGlhbF9uYXZpZ2F0aW9uX2lkKSB7fQogCiBTdXBlcnZpc2VkVXNlckludGVyc3RpdGlhbDo6flN1cGVydmlzZWRVc2VySW50ZXJzdGl0aWFsKCkge30KIApAQCAtMTkzLDkgKzIxMCwxMiBAQAogfQogCiB2b2lkIFN1cGVydmlzZWRVc2VySW50ZXJzdGl0aWFsOjpHb0JhY2soKSB7CisgIC8vIEdvQmFjayBvbmx5IGZvciBtYWluIGZyYW1lLgorICBEQ0hFQ0tfRVEod2ViX2NvbnRlbnRzKCktPkdldE1haW5GcmFtZSgpLT5HZXRGcmFtZVRyZWVOb2RlSWQoKSwgZnJhbWVfaWQoKSk7CisKICAgVU1BX0hJU1RPR1JBTV9FTlVNRVJBVElPTigiTWFuYWdlZE1vZGUuQmxvY2tpbmdJbnRlcnN0aXRpYWxDb21tYW5kIiwgQkFDSywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBISVNUT0dSQU1fQk9VTkRJTkdfVkFMVUUpOwotICBNb3ZlQXdheUZyb21DdXJyZW50UGFnZSgpOworICBBdHRlbXB0TW92ZUF3YXlGcm9tQ3VycmVudEZyYW1lVVJMKCk7CiAgIE9uSW50ZXJzdGl0aWFsRG9uZSgpOwogfQogCkBAIC0yMDMsNiArMjIzLDE2IEBACiAgICAgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQoYm9vbCk+IFJlcXVlc3RDYWxsYmFjaykgewogICBVTUFfSElTVE9HUkFNX0VOVU1FUkFUSU9OKCJNYW5hZ2VkTW9kZS5CbG9ja2luZ0ludGVyc3RpdGlhbENvbW1hbmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDQ0VTU19SRVFVRVNULCBISVNUT0dSQU1fQk9VTkRJTkdfVkFMVUUpOworCisgIFJlcXVlc3RQZXJtaXNzaW9uU291cmNlIHNvdXJjZTsKKyAgaWYgKHdlYl9jb250ZW50cygpLT5HZXRNYWluRnJhbWUoKS0+R2V0RnJhbWVUcmVlTm9kZUlkKCkgPT0gZnJhbWVfaWQoKSkKKyAgICBzb3VyY2UgPSBSZXF1ZXN0UGVybWlzc2lvblNvdXJjZTo6TUFJTl9GUkFNRTsKKyAgZWxzZQorICAgIHNvdXJjZSA9IFJlcXVlc3RQZXJtaXNzaW9uU291cmNlOjpTVUJfRlJBTUU7CisKKyAgVU1BX0hJU1RPR1JBTV9FTlVNRVJBVElPTigiTWFuYWdlZFVzZXJzLlJlcXVlc3RQZXJtaXNzaW9uU291cmNlIiwgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RQZXJtaXNzaW9uU291cmNlOjpISVNUT0dSQU1fQk9VTkRJTkdfVkFMVUUpOworCiAgIFN1cGVydmlzZWRVc2VyU2VydmljZSogc3VwZXJ2aXNlZF91c2VyX3NlcnZpY2UgPQogICAgICAgU3VwZXJ2aXNlZFVzZXJTZXJ2aWNlRmFjdG9yeTo6R2V0Rm9yUHJvZmlsZShwcm9maWxlXyk7CiAgIHN1cGVydmlzZWRfdXNlcl9zZXJ2aWNlLT5BZGRVUkxBY2Nlc3NSZXF1ZXN0KHVybF8sCkBAIC0yMzcsNyArMjY3LDcgQEAKICAgcmV0dXJuOwogfQogCi12b2lkIFN1cGVydmlzZWRVc2VySW50ZXJzdGl0aWFsOjpNb3ZlQXdheUZyb21DdXJyZW50UGFnZSgpIHsKK3ZvaWQgU3VwZXJ2aXNlZFVzZXJJbnRlcnN0aXRpYWw6OkF0dGVtcHRNb3ZlQXdheUZyb21DdXJyZW50RnJhbWVVUkwoKSB7CiAgIC8vIE5vIG5lZWQgdG8gZG8gYW55dGhpbmcgaWYgdGhlIFdlYkNvbnRlbnRzIGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nCiAgIC8vIGRlc3Ryb3llZCBhbnl3YXkuCiAgIGlmICh3ZWJfY29udGVudHNfLT5Jc0JlaW5nRGVzdHJveWVkKCkpCkBAIC0yNjAsNSArMjkwLDUgQEAKICAgLy8gQWZ0ZXIgdGhpcywgdGhlIFdlYkNvbnRlbnRzIG1heSBiZSBkZXN0cm95ZWQuIE1ha2Ugc3VyZSB3ZSBkb24ndCB0cnkgdG8gdXNlCiAgIC8vIGl0IGFnYWluLgogICB3ZWJfY29udGVudHNfID0gbnVsbHB0cjsKLSAgbmF2aWdhdGlvbl9vYnNlcnZlci0+T25JbnRlcnN0aXRpYWxEb25lKCk7CisgIG5hdmlnYXRpb25fb2JzZXJ2ZXItPk9uSW50ZXJzdGl0aWFsRG9uZShmcmFtZV9pZF8pOwogfQpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvc3VwZXJ2aXNlZF91c2VyL3N1cGVydmlzZWRfdXNlcl9pbnRlcnN0aXRpYWwuaCBiL2Nocm9tZS9icm93c2VyL3N1cGVydmlzZWRfdXNlci9zdXBlcnZpc2VkX3VzZXJfaW50ZXJzdGl0aWFsLmgKaW5kZXggZDBmOTJjYTkuLjE4ZTgwZjMgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3N1cGVydmlzZWRfdXNlci9zdXBlcnZpc2VkX3VzZXJfaW50ZXJzdGl0aWFsLmgKKysrIGIvY2hyb21lL2Jyb3dzZXIvc3VwZXJ2aXNlZF91c2VyL3N1cGVydmlzZWRfdXNlcl9pbnRlcnN0aXRpYWwuaApAQCAtNSw2ICs1LDcgQEAKICNpZm5kZWYgQ0hST01FX0JST1dTRVJfU1VQRVJWSVNFRF9VU0VSX1NVUEVSVklTRURfVVNFUl9JTlRFUlNUSVRJQUxfSF8KICNkZWZpbmUgQ0hST01FX0JST1dTRVJfU1VQRVJWSVNFRF9VU0VSX1NVUEVSVklTRURfVVNFUl9JTlRFUlNUSVRJQUxfSF8KIAorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxzdHJpbmc+CiAKICNpbmNsdWRlICJiYXNlL2NhbGxiYWNrX2ZvcndhcmQuaCIKQEAgLTE0LDcgKzE1LDcgQEAKIAogbmFtZXNwYWNlIGNvbnRlbnQgewogY2xhc3MgV2ViQ29udGVudHM7Ci19Cit9ICAvLyBuYW1lc3BhY2UgY29udGVudAogCiBjbGFzcyBQcm9maWxlOwogCkBAIC0zMCw3ICszMSw5IEBACiAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8U3VwZXJ2aXNlZFVzZXJJbnRlcnN0aXRpYWw+IENyZWF0ZSgKICAgICAgIGNvbnRlbnQ6OldlYkNvbnRlbnRzKiB3ZWJfY29udGVudHMsCiAgICAgICBjb25zdCBHVVJMJiB1cmwsCi0gICAgICBzdXBlcnZpc2VkX3VzZXJfZXJyb3JfcGFnZTo6RmlsdGVyaW5nQmVoYXZpb3JSZWFzb24gcmVhc29uKTsKKyAgICAgIHN1cGVydmlzZWRfdXNlcl9lcnJvcl9wYWdlOjpGaWx0ZXJpbmdCZWhhdmlvclJlYXNvbiByZWFzb24sCisgICAgICBpbnQgZnJhbWVfaWQsCisgICAgICBpbnQ2NF90IGludGVyc3RpdGlhbF9uYXZpZ2F0aW9uX2lkKTsKIAogICBzdGF0aWMgc3RkOjpzdHJpbmcgR2V0SFRNTENvbnRlbnRzKAogICAgICAgUHJvZmlsZSogcHJvZmlsZSwKQEAgLTQwLDI2ICs0Myw0MiBAQAogICB2b2lkIFJlcXVlc3RQZXJtaXNzaW9uKGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKGJvb2wpPiBjYWxsYmFjayk7CiAgIHZvaWQgU2hvd0ZlZWRiYWNrKCk7CiAKKyAgLy8gR2V0dGVyIG1ldGhvZHMuCisgIGNvbnRlbnQ6OldlYkNvbnRlbnRzKiB3ZWJfY29udGVudHMoKSB7IHJldHVybiB3ZWJfY29udGVudHNfOyB9CisgIGludCBmcmFtZV9pZCgpIGNvbnN0IHsgcmV0dXJuIGZyYW1lX2lkXzsgfQorICBpbnQ2NF90IGludGVyc3RpdGlhbF9uYXZpZ2F0aW9uX2lkKCkgY29uc3QgeworICAgIHJldHVybiBpbnRlcnN0aXRpYWxfbmF2aWdhdGlvbl9pZF87CisgIH0KKyAgY29uc3QgR1VSTCYgdXJsKCkgY29uc3QgeyByZXR1cm4gdXJsXzsgfQorCiAgcHJpdmF0ZToKICAgU3VwZXJ2aXNlZFVzZXJJbnRlcnN0aXRpYWwoCiAgICAgICBjb250ZW50OjpXZWJDb250ZW50cyogd2ViX2NvbnRlbnRzLAogICAgICAgY29uc3QgR1VSTCYgdXJsLAotICAgICAgc3VwZXJ2aXNlZF91c2VyX2Vycm9yX3BhZ2U6OkZpbHRlcmluZ0JlaGF2aW9yUmVhc29uIHJlYXNvbik7CisgICAgICBzdXBlcnZpc2VkX3VzZXJfZXJyb3JfcGFnZTo6RmlsdGVyaW5nQmVoYXZpb3JSZWFzb24gcmVhc29uLAorICAgICAgaW50IGZyYW1lX2lkLAorICAgICAgaW50NjRfdCBpbnRlcnN0aXRpYWxfbmF2aWdhdGlvbl9pZCk7CiAKLSAgLy8gTW92ZXMgYXdheSBmcm9tIHRoZSBwYWdlIGJlaGluZCB0aGUgaW50ZXJzdGl0aWFsIHdoZW4gbm90IHByb2NlZWRpbmcgd2l0aAotICAvLyB0aGUgcmVxdWVzdC4KLSAgdm9pZCBNb3ZlQXdheUZyb21DdXJyZW50UGFnZSgpOworICAvLyBUcmllcyB0byBnbyBiYWNrLgorICB2b2lkIEF0dGVtcHRNb3ZlQXdheUZyb21DdXJyZW50RnJhbWVVUkwoKTsKIAogICB2b2lkIE9uSW50ZXJzdGl0aWFsRG9uZSgpOwogCi0gIC8vIE93bnMgdGhlIGludGVyc3RpdGlhbCwgd2hpY2ggb3ducyB1cy4KKyAgLy8gT3ducyBTdXBlcnZpc2VkVXNlck5hdmlnYXRpb25PYnNlcnZlciB3aGljaCBvd25zIHVzLgogICBjb250ZW50OjpXZWJDb250ZW50cyogd2ViX2NvbnRlbnRzXzsKIAogICBQcm9maWxlKiBwcm9maWxlXzsKIAorICAvLyBUaGUgbGFzdCBjb21taXR0ZWQgdXJsIGZvciB0aGlzIGZyYW1lLgogICBHVVJMIHVybF87CiAgIHN1cGVydmlzZWRfdXNlcl9lcnJvcl9wYWdlOjpGaWx0ZXJpbmdCZWhhdmlvclJlYXNvbiByZWFzb25fOwogCisgIC8vIFRoZSB1bmlxdWVseSBpZGVudGlmeWluZyBnbG9iYWwgaWQgZm9yIHRoZSBmcmFtZS4KKyAgaW50IGZyYW1lX2lkXzsKKworICAvLyBUaGUgTmF2aWdhdGlvbiBJRCBvZiB0aGUgbmF2aWdhdGlvbiB0aGF0IGxhc3QgdHJpZ2dlcmVkIHRoZSBpbnRlcnN0aXRpYWwuCisgIGludDY0X3QgaW50ZXJzdGl0aWFsX25hdmlnYXRpb25faWRfOworCiAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTdXBlcnZpc2VkVXNlckludGVyc3RpdGlhbCk7CiB9OwogCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9zdXBlcnZpc2VkX3VzZXIvc3VwZXJ2aXNlZF91c2VyX25hdmlnYXRpb25fb2JzZXJ2ZXIuY2MgYi9jaHJvbWUvYnJvd3Nlci9zdXBlcnZpc2VkX3VzZXIvc3VwZXJ2aXNlZF91c2VyX25hdmlnYXRpb25fb2JzZXJ2ZXIuY2MKaW5kZXggYWQ2NjU2MjAuLmUwZTM2MDUgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3N1cGVydmlzZWRfdXNlci9zdXBlcnZpc2VkX3VzZXJfbmF2aWdhdGlvbl9vYnNlcnZlci5jYworKysgYi9jaHJvbWUvYnJvd3Nlci9zdXBlcnZpc2VkX3VzZXIvc3VwZXJ2aXNlZF91c2VyX25hdmlnYXRpb25fb2JzZXJ2ZXIuY2MKQEAgLTQsOCArNCwxMSBAQAogCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvc3VwZXJ2aXNlZF91c2VyL3N1cGVydmlzZWRfdXNlcl9uYXZpZ2F0aW9uX29ic2VydmVyLmgiCiAKKyNpbmNsdWRlIDx1dGlsaXR5PgorCiAjaW5jbHVkZSAiYmFzZS9iaW5kLmgiCiAjaW5jbHVkZSAiYmFzZS9jYWxsYmFjay5oIgorI2luY2x1ZGUgImJhc2UvbWV0cmljcy9oaXN0b2dyYW1fbWFjcm9zLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvaGlzdG9yeS9oaXN0b3J5X3NlcnZpY2VfZmFjdG9yeS5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3Byb2ZpbGVzL3Byb2ZpbGUuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9zdXBlcnZpc2VkX3VzZXIvc3VwZXJ2aXNlZF91c2VyX2ludGVyc3RpdGlhbC5oIgpAQCAtMjEsNiArMjQsMTcgQEAKICNpbmNsdWRlICJjb250ZW50L3B1YmxpYy9icm93c2VyL2Jyb3dzZXJfdGhyZWFkLmgiCiAjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvYnJvd3Nlci9uYXZpZ2F0aW9uX2VudHJ5LmgiCiAjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvYnJvd3Nlci9uYXZpZ2F0aW9uX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvbnRlbnQvcHVibGljL2Jyb3dzZXIvcmVsb2FkX3R5cGUuaCIKKyNpbmNsdWRlICJjb250ZW50L3B1YmxpYy9icm93c2VyL3JlbmRlcl9mcmFtZV9ob3N0LmgiCisjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvYnJvd3Nlci9yZW5kZXJfcHJvY2Vzc19ob3N0LmgiCisKK25hbWVzcGFjZSB7CisKK2Jvb2wgSXNNYWluRnJhbWUoY29udGVudDo6UmVuZGVyRnJhbWVIb3N0KiByZW5kZXJfZnJhbWVfaG9zdCkgeworICByZXR1cm4gIXJlbmRlcl9mcmFtZV9ob3N0LT5HZXRQYXJlbnQoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCiAKIHVzaW5nIGNvbnRlbnQ6Ok5hdmlnYXRpb25FbnRyeTsKIApAQCAtNDUsNiArNTksNyBAQAogICAgIGNvbnN0IEdVUkwmIHVybCwKICAgICBzdXBlcnZpc2VkX3VzZXJfZXJyb3JfcGFnZTo6RmlsdGVyaW5nQmVoYXZpb3JSZWFzb24gcmVhc29uLAogICAgIGludDY0X3QgbmF2aWdhdGlvbl9pZCwKKyAgICBpbnQgZnJhbWVfaWQsCiAgICAgY29uc3QgYmFzZTo6Q2FsbGJhY2s8CiAgICAgICAgIHZvaWQoU3VwZXJ2aXNlZFVzZXJOYXZpZ2F0aW9uVGhyb3R0bGU6OkNhbGxiYWNrQWN0aW9ucyk+JiBjYWxsYmFjaykgewogICBTdXBlcnZpc2VkVXNlck5hdmlnYXRpb25PYnNlcnZlciogbmF2aWdhdGlvbl9vYnNlcnZlciA9CkBAIC01OCw3ICs3Myw3IEBACiAgIH0KIAogICBuYXZpZ2F0aW9uX29ic2VydmVyLT5PblJlcXVlc3RCbG9ja2VkSW50ZXJuYWwodXJsLCByZWFzb24sIG5hdmlnYXRpb25faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZV9pZCwgY2FsbGJhY2spOwogfQogCiB2b2lkIFN1cGVydmlzZWRVc2VyTmF2aWdhdGlvbk9ic2VydmVyOjpVcGRhdGVNYWluRnJhbWVGaWx0ZXJpbmdTdGF0dXMoCkBAIC03MCwzNyArODUsOTUgQEAKIAogdm9pZCBTdXBlcnZpc2VkVXNlck5hdmlnYXRpb25PYnNlcnZlcjo6RGlkRmluaXNoTmF2aWdhdGlvbigKICAgICAgIGNvbnRlbnQ6Ok5hdmlnYXRpb25IYW5kbGUqIG5hdmlnYXRpb25faGFuZGxlKSB7CisgIGludCBmcmFtZV9pZCA9IG5hdmlnYXRpb25faGFuZGxlLT5HZXRGcmFtZVRyZWVOb2RlSWQoKTsKKyAgaW50NjRfdCBuYXZpZ2F0aW9uX2lkID0gbmF2aWdhdGlvbl9oYW5kbGUtPkdldE5hdmlnYXRpb25JZCgpOworCiAgIC8vIElmIHRoaXMgaXMgYSBkaWZmZXJlbnQgbmF2aWdhdGlvbiB0aGFuIHRoZSBvbmUgdGhhdCB0cmlnZ2VyZWQgdGhlCi0gIC8vIGludGVyc3RpdGlhbCwgcmVtb3ZlIHRoZSBpbnRlcnN0aXRpYWwuCi0gIGlmIChpbnRlcnN0aXRpYWxfICYmCi0gICAgICBuYXZpZ2F0aW9uX2hhbmRsZS0+R2V0TmF2aWdhdGlvbklkKCkgIT0gaW50ZXJzdGl0aWFsX25hdmlnYXRpb25faWRfKSB7Ci0gICAgT25JbnRlcnN0aXRpYWxEb25lKCk7CisgIC8vIGludGVyc3RpdGlhbCBpbiB0aGUgZnJhbWUsIHRoZW4gaW50ZXJzdGl0aWFsIGlzIGRvbmUuCisgIGlmIChiYXNlOjpDb250YWlucyhzdXBlcnZpc2VkX3VzZXJfaW50ZXJzdGl0aWFsc18sIGZyYW1lX2lkKSAmJgorICAgICAgbmF2aWdhdGlvbl9pZCAhPSBzdXBlcnZpc2VkX3VzZXJfaW50ZXJzdGl0aWFsc19bZnJhbWVfaWRdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmludGVyc3RpdGlhbF9uYXZpZ2F0aW9uX2lkKCkpIHsKKyAgICBPbkludGVyc3RpdGlhbERvbmUoZnJhbWVfaWQpOwogICB9CiAKICAgLy8gT25seSBmaWx0ZXIgc2FtZSBwYWdlIG5hdmlnYXRpb25zIChlZy4gcHVzaFN0YXRlL3BvcFN0YXRlKTsgb3RoZXJzIHdpbGwKICAgLy8gaGF2ZSBiZWVuIGZpbHRlcmVkIGJ5IHRoZSBOYXZpZ2F0aW9uVGhyb3R0bGUuCiAgIGlmIChuYXZpZ2F0aW9uX2hhbmRsZS0+SXNTYW1lRG9jdW1lbnQoKSAmJgogICAgICAgbmF2aWdhdGlvbl9oYW5kbGUtPklzSW5NYWluRnJhbWUoKSkgeworICAgIGF1dG8qIHJlbmRlcl9mcmFtZV9ob3N0ID0gbmF2aWdhdGlvbl9oYW5kbGUtPkdldFJlbmRlckZyYW1lSG9zdCgpOworICAgIGludCBwcm9jZXNzX2lkID0gcmVuZGVyX2ZyYW1lX2hvc3QtPkdldFByb2Nlc3MoKS0+R2V0SUQoKTsKKyAgICBpbnQgcm91dGluZ19pZCA9IHJlbmRlcl9mcmFtZV9ob3N0LT5HZXRSb3V0aW5nSUQoKTsKKwogICAgIHVybF9maWx0ZXJfLT5HZXRGaWx0ZXJpbmdCZWhhdmlvckZvclVSTFdpdGhBc3luY0NoZWNrcygKICAgICAgICAgd2ViX2NvbnRlbnRzKCktPkdldExhc3RDb21taXR0ZWRVUkwoKSwKICAgICAgICAgYmFzZTo6QmluZE9uY2UoCiAgICAgICAgICAgICAmU3VwZXJ2aXNlZFVzZXJOYXZpZ2F0aW9uT2JzZXJ2ZXI6OlVSTEZpbHRlckNoZWNrQ2FsbGJhY2ssCi0gICAgICAgICAgICB3ZWFrX3B0cl9mYWN0b3J5Xy5HZXRXZWFrUHRyKCksIG5hdmlnYXRpb25faGFuZGxlLT5HZXRVUkwoKSkpOworICAgICAgICAgICAgd2Vha19wdHJfZmFjdG9yeV8uR2V0V2Vha1B0cigpLCBuYXZpZ2F0aW9uX2hhbmRsZS0+R2V0VVJMKCksCisgICAgICAgICAgICBwcm9jZXNzX2lkLCByb3V0aW5nX2lkKSk7CisgIH0KK30KKwordm9pZCBTdXBlcnZpc2VkVXNlck5hdmlnYXRpb25PYnNlcnZlcjo6RnJhbWVEZWxldGVkKAorICAgIGNvbnRlbnQ6OlJlbmRlckZyYW1lSG9zdCogcmVuZGVyX2ZyYW1lX2hvc3QpIHsKKyAgaW50IGZyYW1lX2lkID0gcmVuZGVyX2ZyYW1lX2hvc3QtPkdldEZyYW1lVHJlZU5vZGVJZCgpOworICBzdXBlcnZpc2VkX3VzZXJfaW50ZXJzdGl0aWFsc18uZXJhc2UoZnJhbWVfaWQpOworfQorCit2b2lkIFN1cGVydmlzZWRVc2VyTmF2aWdhdGlvbk9ic2VydmVyOjpEaWRGaW5pc2hMb2FkKAorICAgIGNvbnRlbnQ6OlJlbmRlckZyYW1lSG9zdCogcmVuZGVyX2ZyYW1lX2hvc3QsCisgICAgY29uc3QgR1VSTCYgdmFsaWRhdGVkX3VybCkgeworICBpZiAoSXNNYWluRnJhbWUocmVuZGVyX2ZyYW1lX2hvc3QpKSB7CisgICAgYm9vbCBtYWluX2ZyYW1lX2Jsb2NrZWQgPQorICAgICAgICBiYXNlOjpDb250YWlucyhzdXBlcnZpc2VkX3VzZXJfaW50ZXJzdGl0aWFsc18sCisgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcl9mcmFtZV9ob3N0LT5HZXRGcmFtZVRyZWVOb2RlSWQoKSk7CisgICAgaW50IGNvdW50ID0gc3VwZXJ2aXNlZF91c2VyX2ludGVyc3RpdGlhbHNfLnNpemUoKTsKKyAgICBpZiAobWFpbl9mcmFtZV9ibG9ja2VkKQorICAgICAgY291bnQgPSAwOworCisgICAgVU1BX0hJU1RPR1JBTV9DT1VOVFNfMTAwMCgiTWFuYWdlZFVzZXJzLkJsb2NrZWRJZnJhbWVDb3VudCIsIGNvdW50KTsKKyAgfQorCisgIGlmIChiYXNlOjpDb250YWlucyhzdXBlcnZpc2VkX3VzZXJfaW50ZXJzdGl0aWFsc18sCisgICAgICAgICAgICAgICAgICAgICByZW5kZXJfZnJhbWVfaG9zdC0+R2V0RnJhbWVUcmVlTm9kZUlkKCkpKSB7CisgICAgVU1BX0hJU1RPR1JBTV9DT1VOVFNfMTAwMCgiTWFuYWdlZFVzZXJzLkJsb2NrZWRGcmFtZURlcHRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcl9mcmFtZV9ob3N0LT5HZXRGcmFtZURlcHRoKCkpOwogICB9CiB9CiAKIHZvaWQgU3VwZXJ2aXNlZFVzZXJOYXZpZ2F0aW9uT2JzZXJ2ZXI6Ok9uVVJMRmlsdGVyQ2hhbmdlZCgpIHsKKyAgYXV0byogbWFpbl9mcmFtZSA9IHdlYl9jb250ZW50cygpLT5HZXRNYWluRnJhbWUoKTsKKyAgaW50IG1haW5fZnJhbWVfcHJvY2Vzc19pZCA9IG1haW5fZnJhbWUtPkdldFByb2Nlc3MoKS0+R2V0SUQoKTsKKyAgaW50IHJvdXRpbmdfaWQgPSBtYWluX2ZyYW1lLT5HZXRSb3V0aW5nSUQoKTsKKwogICB1cmxfZmlsdGVyXy0+R2V0RmlsdGVyaW5nQmVoYXZpb3JGb3JVUkxXaXRoQXN5bmNDaGVja3MoCiAgICAgICB3ZWJfY29udGVudHMoKS0+R2V0TGFzdENvbW1pdHRlZFVSTCgpLAogICAgICAgYmFzZTo6QmluZE9uY2UoJlN1cGVydmlzZWRVc2VyTmF2aWdhdGlvbk9ic2VydmVyOjpVUkxGaWx0ZXJDaGVja0NhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgd2Vha19wdHJfZmFjdG9yeV8uR2V0V2Vha1B0cigpLAotICAgICAgICAgICAgICAgICAgICAgd2ViX2NvbnRlbnRzKCktPkdldExhc3RDb21taXR0ZWRVUkwoKSkpOworICAgICAgICAgICAgICAgICAgICAgd2ViX2NvbnRlbnRzKCktPkdldExhc3RDb21taXR0ZWRVUkwoKSwKKyAgICAgICAgICAgICAgICAgICAgIG1haW5fZnJhbWVfcHJvY2Vzc19pZCwgcm91dGluZ19pZCkpOworCisgIFByb2ZpbGUqIHByb2ZpbGUgPQorICAgICAgUHJvZmlsZTo6RnJvbUJyb3dzZXJDb250ZXh0KHdlYl9jb250ZW50cygpLT5HZXRCcm93c2VyQ29udGV4dCgpKTsKKyAgU3VwZXJ2aXNlZFVzZXJTZXJ2aWNlKiBzZXJ2aWNlID0KKyAgICAgIFN1cGVydmlzZWRVc2VyU2VydmljZUZhY3Rvcnk6OkdldEZvclByb2ZpbGUocHJvZmlsZSk7CisgIGlmICghc2VydmljZS0+SXNTdXBlcnZpc2VkVXNlcklmcmFtZUZpbHRlckVuYWJsZWQoKSkKKyAgICByZXR1cm47CisKKyAgLy8gSWZyYW1lIGZpbHRlcmluZyBoYXMgYmVlbiBlbmFibGVkLgorICB3ZWJfY29udGVudHMoKS0+Rm9yRWFjaEZyYW1lKAorICAgICAgYmFzZTo6QmluZFJlcGVhdGluZygmU3VwZXJ2aXNlZFVzZXJOYXZpZ2F0aW9uT2JzZXJ2ZXI6OkZpbHRlclJlbmRlckZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWFrX3B0cl9mYWN0b3J5Xy5HZXRXZWFrUHRyKCkpKTsKK30KKwordm9pZCBTdXBlcnZpc2VkVXNlck5hdmlnYXRpb25PYnNlcnZlcjo6T25JbnRlcnN0aXRpYWxEb25lKGludCBmcmFtZV9pZCkgeworICBzdXBlcnZpc2VkX3VzZXJfaW50ZXJzdGl0aWFsc18uZXJhc2UoZnJhbWVfaWQpOwogfQogCiB2b2lkIFN1cGVydmlzZWRVc2VyTmF2aWdhdGlvbk9ic2VydmVyOjpPblJlcXVlc3RCbG9ja2VkSW50ZXJuYWwoCiAgICAgY29uc3QgR1VSTCYgdXJsLAogICAgIHN1cGVydmlzZWRfdXNlcl9lcnJvcl9wYWdlOjpGaWx0ZXJpbmdCZWhhdmlvclJlYXNvbiByZWFzb24sCiAgICAgaW50NjRfdCBuYXZpZ2F0aW9uX2lkLAorICAgIGludCBmcmFtZV9pZCwKICAgICBjb25zdCBiYXNlOjpDYWxsYmFjazwKICAgICAgICAgdm9pZChTdXBlcnZpc2VkVXNlck5hdmlnYXRpb25UaHJvdHRsZTo6Q2FsbGJhY2tBY3Rpb25zKT4mIGNhbGxiYWNrKSB7CiAgIC8vIFRPRE8oYmF1ZXJiKTogVXNlIFNhbmVUaW1lIHdoZW4gYXZhaWxhYmxlLgpAQCAtMTM3LDI1ICsyMTAsNDEgQEAKIAogICAvLyBTaG93IHRoZSBpbnRlcnN0aXRpYWwuCiAgIGNvbnN0IGJvb2wgaW5pdGlhbF9wYWdlX2xvYWQgPSB0cnVlOwotICBNYXliZVNob3dJbnRlcnN0aXRpYWwodXJsLCByZWFzb24sIGluaXRpYWxfcGFnZV9sb2FkLCBuYXZpZ2F0aW9uX2lkLAorICBNYXliZVNob3dJbnRlcnN0aXRpYWwodXJsLCByZWFzb24sIGluaXRpYWxfcGFnZV9sb2FkLCBuYXZpZ2F0aW9uX2lkLCBmcmFtZV9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKTsKIH0KIAogdm9pZCBTdXBlcnZpc2VkVXNlck5hdmlnYXRpb25PYnNlcnZlcjo6VVJMRmlsdGVyQ2hlY2tDYWxsYmFjaygKICAgICBjb25zdCBHVVJMJiB1cmwsCisgICAgaW50IHJlbmRlcl9mcmFtZV9wcm9jZXNzX2lkLAorICAgIGludCByZW5kZXJfZnJhbWVfcm91dGluZ19pZCwKICAgICBTdXBlcnZpc2VkVXNlclVSTEZpbHRlcjo6RmlsdGVyaW5nQmVoYXZpb3IgYmVoYXZpb3IsCiAgICAgc3VwZXJ2aXNlZF91c2VyX2Vycm9yX3BhZ2U6OkZpbHRlcmluZ0JlaGF2aW9yUmVhc29uIHJlYXNvbiwKICAgICBib29sIHVuY2VydGFpbikgewotICAvLyBJZiB0aGUgcGFnZSBoYXMgYmVlbiBjaGFuZ2VkIGluIHRoZSBtZWFudGltZSwgd2UgY2FuIGV4aXQuCi0gIGlmICh1cmwgIT0gd2ViX2NvbnRlbnRzKCktPkdldExhc3RDb21taXR0ZWRVUkwoKSkKKyAgYXV0byogcmVuZGVyX2ZyYW1lX2hvc3QgPSBjb250ZW50OjpSZW5kZXJGcmFtZUhvc3Q6OkZyb21JRCgKKyAgICAgIHJlbmRlcl9mcmFtZV9wcm9jZXNzX2lkLCByZW5kZXJfZnJhbWVfcm91dGluZ19pZCk7CisKKyAgaWYgKCFyZW5kZXJfZnJhbWVfaG9zdCB8fCAhcmVuZGVyX2ZyYW1lX2hvc3QtPklzUmVuZGVyRnJhbWVMaXZlKCkpCiAgICAgcmV0dXJuOwogCi0gIGJvb2wgaXNfc2hvd2luZ19pbnRlcnN0aXRpYWwgPSBpbnRlcnN0aXRpYWxfLmdldCgpICE9IG51bGxwdHI7CisgIGludCBmcmFtZV9pZCA9IHJlbmRlcl9mcmFtZV9ob3N0LT5HZXRGcmFtZVRyZWVOb2RlSWQoKTsKKyAgYm9vbCBpc19zaG93aW5nX2ludGVyc3RpdGlhbCA9CisgICAgICBiYXNlOjpDb250YWlucyhzdXBlcnZpc2VkX3VzZXJfaW50ZXJzdGl0aWFsc18sIGZyYW1lX2lkKTsKICAgYm9vbCBzaG91bGRfc2hvd19pbnRlcnN0aXRpYWwgPQogICAgICAgYmVoYXZpb3IgPT0gU3VwZXJ2aXNlZFVzZXJVUkxGaWx0ZXI6OkZpbHRlcmluZ0JlaGF2aW9yOjpCTE9DSzsKIAotICBpZiAoaXNfc2hvd2luZ19pbnRlcnN0aXRpYWwgIT0gc2hvdWxkX3Nob3dfaW50ZXJzdGl0aWFsKQotICAgIHdlYl9jb250ZW50cygpLT5HZXRDb250cm9sbGVyKCkuUmVsb2FkKGNvbnRlbnQ6OlJlbG9hZFR5cGU6Ok5PUk1BTCwgZmFsc2UpOworICAvLyBJZiBhbiBpbnRlcnN0aXRpYWwgaXMgYmVpbmcgc2hvd24gd2hlcmUgaXQgc2hvdWxkbid0IChmb3IgZS5nLiBiZWNhdXNlIGEKKyAgLy8gcGFyZW50IGp1c3QgYXBwcm92ZWQgYSByZXF1ZXN0KSByZWxvYWRpbmcgd2lsbCBjbGVhciBpdC4gT24gdGhlIG90aGVyIGhhbmQsCisgIC8vIGlmIGFuIGludGVyc3RpdGlhbCBlcnJvciBwYWdlIGlzIG5vdCBiZWluZyBzaG93biBidXQgaXQgc2hvdWxkIGJlIHNob3duLAorICAvLyB0aGVuIHJlbG9hZGluZyB3aWxsIHRyaWdnZXIgdGhlIG5hdmlnYXRpb24gdGhyb3R0bGUgdG8gc2hvdyB0aGUgZXJyb3IgcGFnZS4KKyAgaWYgKGlzX3Nob3dpbmdfaW50ZXJzdGl0aWFsICE9IHNob3VsZF9zaG93X2ludGVyc3RpdGlhbCkgeworICAgIGlmIChJc01haW5GcmFtZShyZW5kZXJfZnJhbWVfaG9zdCkpIHsKKyAgICAgIHdlYl9jb250ZW50cygpLT5HZXRDb250cm9sbGVyKCkuUmVsb2FkKGNvbnRlbnQ6OlJlbG9hZFR5cGU6Ok5PUk1BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrX2Zvcl9yZXBvc3QgKi8gZmFsc2UpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICByZW5kZXJfZnJhbWVfaG9zdC0+UmVsb2FkKCk7CisgIH0KIH0KIAogdm9pZCBTdXBlcnZpc2VkVXNlck5hdmlnYXRpb25PYnNlcnZlcjo6TWF5YmVTaG93SW50ZXJzdGl0aWFsKApAQCAtMTYzLDMzICsyNTIsNjUgQEAKICAgICBzdXBlcnZpc2VkX3VzZXJfZXJyb3JfcGFnZTo6RmlsdGVyaW5nQmVoYXZpb3JSZWFzb24gcmVhc29uLAogICAgIGJvb2wgaW5pdGlhbF9wYWdlX2xvYWQsCiAgICAgaW50NjRfdCBuYXZpZ2F0aW9uX2lkLAorICAgIGludCBmcmFtZV9pZCwKICAgICBjb25zdCBiYXNlOjpDYWxsYmFjazwKICAgICAgICAgdm9pZChTdXBlcnZpc2VkVXNlck5hdmlnYXRpb25UaHJvdHRsZTo6Q2FsbGJhY2tBY3Rpb25zKT4mIGNhbGxiYWNrKSB7Ci0gIGludGVyc3RpdGlhbF9uYXZpZ2F0aW9uX2lkXyA9IG5hdmlnYXRpb25faWQ7Ci0gIGludGVyc3RpdGlhbF8gPQotICAgICAgU3VwZXJ2aXNlZFVzZXJJbnRlcnN0aXRpYWw6OkNyZWF0ZSh3ZWJfY29udGVudHMoKSwgdXJsLCByZWFzb24pOworICBzdGQ6OnVuaXF1ZV9wdHI8U3VwZXJ2aXNlZFVzZXJJbnRlcnN0aXRpYWw+IGludGVyc3RpdGlhbCA9CisgICAgICBTdXBlcnZpc2VkVXNlckludGVyc3RpdGlhbDo6Q3JlYXRlKHdlYl9jb250ZW50cygpLCB1cmwsIHJlYXNvbiwgZnJhbWVfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25faWQpOworCisgIHN1cGVydmlzZWRfdXNlcl9pbnRlcnN0aXRpYWxzX1tmcmFtZV9pZF0gPSBzdGQ6Om1vdmUoaW50ZXJzdGl0aWFsKTsKKwogICBjYWxsYmFjay5SdW4oU3VwZXJ2aXNlZFVzZXJOYXZpZ2F0aW9uVGhyb3R0bGU6OkNhbGxiYWNrQWN0aW9uczo6CiAgICAgICAgICAgICAgICAgICAga0NhbmNlbFdpdGhJbnRlcnN0aXRpYWwpOwogfQogCi12b2lkIFN1cGVydmlzZWRVc2VyTmF2aWdhdGlvbk9ic2VydmVyOjpPbkludGVyc3RpdGlhbERvbmUoKSB7Ci0gIGludGVyc3RpdGlhbF8ucmVzZXQoKTsKK3ZvaWQgU3VwZXJ2aXNlZFVzZXJOYXZpZ2F0aW9uT2JzZXJ2ZXI6OkZpbHRlclJlbmRlckZyYW1lKAorICAgIGNvbnRlbnQ6OlJlbmRlckZyYW1lSG9zdCogcmVuZGVyX2ZyYW1lX2hvc3QpIHsKKyAgLy8gSWYgdGhlIFJlbmRlckZyYW1lSG9zdCBpcyBub3QgbGl2ZSByZXR1cm4uCisgIC8vIElmIHRoZSBSZW5kZXJGcmFtZUhvc3QgYmVsb25ncyB0byB0aGUgbWFpbiBmcmFtZSwgcmV0dXJuLiBUaGlzIGlzIGJlY2F1c2UKKyAgLy8gdGhlIG1haW4gZnJhbWUgaXMgYWxyZWFkeSBmaWx0ZXJlZCBpbgorICAvLyB8U3VwZXJ2aXNlZFVzZXJOYXZpZ2F0aW9uT2JzZXJ2ZXI6Ok9uVVJMRmlsdGVyQ2hhbmdlZHwuCisgIGlmICghcmVuZGVyX2ZyYW1lX2hvc3QtPklzUmVuZGVyRnJhbWVMaXZlKCkgfHwgSXNNYWluRnJhbWUocmVuZGVyX2ZyYW1lX2hvc3QpKQorICAgIHJldHVybjsKKworICBjb25zdCBHVVJMJiBsYXN0X2NvbW1pdHRlZF91cmwgPSByZW5kZXJfZnJhbWVfaG9zdC0+R2V0TGFzdENvbW1pdHRlZFVSTCgpOworCisgIHVybF9maWx0ZXJfLT5HZXRGaWx0ZXJpbmdCZWhhdmlvckZvclVSTFdpdGhBc3luY0NoZWNrcygKKyAgICAgIHdlYl9jb250ZW50cygpLT5HZXRMYXN0Q29tbWl0dGVkVVJMKCksCisgICAgICBiYXNlOjpCaW5kT25jZSgmU3VwZXJ2aXNlZFVzZXJOYXZpZ2F0aW9uT2JzZXJ2ZXI6OlVSTEZpbHRlckNoZWNrQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICB3ZWFrX3B0cl9mYWN0b3J5Xy5HZXRXZWFrUHRyKCksIGxhc3RfY29tbWl0dGVkX3VybCwKKyAgICAgICAgICAgICAgICAgICAgIHJlbmRlcl9mcmFtZV9ob3N0LT5HZXRQcm9jZXNzKCktPkdldElEKCksCisgICAgICAgICAgICAgICAgICAgICByZW5kZXJfZnJhbWVfaG9zdC0+R2V0Um91dGluZ0lEKCkpKTsKIH0KIAogdm9pZCBTdXBlcnZpc2VkVXNlck5hdmlnYXRpb25PYnNlcnZlcjo6R29CYWNrKCkgewotICBpZiAoaW50ZXJzdGl0aWFsXykKLSAgICBpbnRlcnN0aXRpYWxfLT5Hb0JhY2soKTsKKyAgYXV0byogcmVuZGVyX2ZyYW1lX2hvc3QgPSBiaW5kaW5nXy5HZXRDdXJyZW50VGFyZ2V0RnJhbWUoKTsKKyAgYXV0byBpZCA9IHJlbmRlcl9mcmFtZV9ob3N0LT5HZXRGcmFtZVRyZWVOb2RlSWQoKTsKKworICAvLyBSZXF1ZXN0IGNhbiBjb21lIG9ubHkgZnJvbSB0aGUgbWFpbiBmcmFtZS4KKyAgaWYgKCFJc01haW5GcmFtZShyZW5kZXJfZnJhbWVfaG9zdCkpCisgICAgcmV0dXJuOworCisgIGlmIChiYXNlOjpDb250YWlucyhzdXBlcnZpc2VkX3VzZXJfaW50ZXJzdGl0aWFsc18sIGlkKSkKKyAgICBzdXBlcnZpc2VkX3VzZXJfaW50ZXJzdGl0aWFsc19baWRdLT5Hb0JhY2soKTsKIH0KIAogdm9pZCBTdXBlcnZpc2VkVXNlck5hdmlnYXRpb25PYnNlcnZlcjo6UmVxdWVzdFBlcm1pc3Npb24oCiAgICAgUmVxdWVzdFBlcm1pc3Npb25DYWxsYmFjayBjYWxsYmFjaykgewotICBpZiAoaW50ZXJzdGl0aWFsXykKLSAgICBpbnRlcnN0aXRpYWxfLT5SZXF1ZXN0UGVybWlzc2lvbihzdGQ6Om1vdmUoY2FsbGJhY2spKTsKKyAgYXV0byogcmVuZGVyX2ZyYW1lX2hvc3QgPSBiaW5kaW5nXy5HZXRDdXJyZW50VGFyZ2V0RnJhbWUoKTsKKyAgaW50IGlkID0gcmVuZGVyX2ZyYW1lX2hvc3QtPkdldEZyYW1lVHJlZU5vZGVJZCgpOworCisgIGlmIChiYXNlOjpDb250YWlucyhzdXBlcnZpc2VkX3VzZXJfaW50ZXJzdGl0aWFsc18sIGlkKSkKKyAgICBzdXBlcnZpc2VkX3VzZXJfaW50ZXJzdGl0aWFsc19baWRdLT5SZXF1ZXN0UGVybWlzc2lvbihzdGQ6Om1vdmUoY2FsbGJhY2spKTsKIH0KIAogdm9pZCBTdXBlcnZpc2VkVXNlck5hdmlnYXRpb25PYnNlcnZlcjo6RmVlZGJhY2soKSB7Ci0gIGlmIChpbnRlcnN0aXRpYWxfKQotICAgIGludGVyc3RpdGlhbF8tPlNob3dGZWVkYmFjaygpOworICBhdXRvKiByZW5kZXJfZnJhbWVfaG9zdCA9IGJpbmRpbmdfLkdldEN1cnJlbnRUYXJnZXRGcmFtZSgpOworICBpbnQgaWQgPSByZW5kZXJfZnJhbWVfaG9zdC0+R2V0RnJhbWVUcmVlTm9kZUlkKCk7CisKKyAgaWYgKGJhc2U6OkNvbnRhaW5zKHN1cGVydmlzZWRfdXNlcl9pbnRlcnN0aXRpYWxzXywgaWQpKQorICAgIHN1cGVydmlzZWRfdXNlcl9pbnRlcnN0aXRpYWxzX1tpZF0tPlNob3dGZWVkYmFjaygpOwogfQogCiBXRUJfQ09OVEVOVFNfVVNFUl9EQVRBX0tFWV9JTVBMKFN1cGVydmlzZWRVc2VyTmF2aWdhdGlvbk9ic2VydmVyKQpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvc3VwZXJ2aXNlZF91c2VyL3N1cGVydmlzZWRfdXNlcl9uYXZpZ2F0aW9uX29ic2VydmVyLmggYi9jaHJvbWUvYnJvd3Nlci9zdXBlcnZpc2VkX3VzZXIvc3VwZXJ2aXNlZF91c2VyX25hdmlnYXRpb25fb2JzZXJ2ZXIuaAppbmRleCAwYjM1MTNlLi5hMjA3YzY5IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9zdXBlcnZpc2VkX3VzZXIvc3VwZXJ2aXNlZF91c2VyX25hdmlnYXRpb25fb2JzZXJ2ZXIuaAorKysgYi9jaHJvbWUvYnJvd3Nlci9zdXBlcnZpc2VkX3VzZXIvc3VwZXJ2aXNlZF91c2VyX25hdmlnYXRpb25fb2JzZXJ2ZXIuaApAQCAtNSw2ICs1LDcgQEAKICNpZm5kZWYgQ0hST01FX0JST1dTRVJfU1VQRVJWSVNFRF9VU0VSX1NVUEVSVklTRURfVVNFUl9OQVZJR0FUSU9OX09CU0VSVkVSX0hfCiAjZGVmaW5lIENIUk9NRV9CUk9XU0VSX1NVUEVSVklTRURfVVNFUl9TVVBFUlZJU0VEX1VTRVJfTkFWSUdBVElPTl9PQlNFUlZFUl9IXwogCisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgImJhc2UvbWFjcm9zLmgiCkBAIC0yNCw4ICsyNSw5IEBACiAKIG5hbWVzcGFjZSBjb250ZW50IHsKIGNsYXNzIE5hdmlnYXRpb25IYW5kbGU7CitjbGFzcyBSZW5kZXJGcmFtZUhvc3Q7CiBjbGFzcyBXZWJDb250ZW50czsKLX0KK30gIC8vIG5hbWVzcGFjZSBjb250ZW50CiAKIGNsYXNzIFN1cGVydmlzZWRVc2VyTmF2aWdhdGlvbk9ic2VydmVyCiAgICAgOiBwdWJsaWMgY29udGVudDo6V2ViQ29udGVudHNVc2VyRGF0YTxTdXBlcnZpc2VkVXNlck5hdmlnYXRpb25PYnNlcnZlcj4sCkBAIC00Niw2ICs0OCw3IEBACiAgICAgICBjb25zdCBHVVJMJiB1cmwsCiAgICAgICBzdXBlcnZpc2VkX3VzZXJfZXJyb3JfcGFnZTo6RmlsdGVyaW5nQmVoYXZpb3JSZWFzb24gcmVhc29uLAogICAgICAgaW50NjRfdCBuYXZpZ2F0aW9uX2lkLAorICAgICAgaW50IGZyYW1lX2lkLAogICAgICAgY29uc3QgYmFzZTo6Q2FsbGJhY2s8CiAgICAgICAgICAgdm9pZChTdXBlcnZpc2VkVXNlck5hdmlnYXRpb25UaHJvdHRsZTo6Q2FsbGJhY2tBY3Rpb25zKT4mIGNhbGxiYWNrKTsKIApAQCAtNjMsMTYgKzY2LDI0IEBACiAgICAgcmV0dXJuIG1haW5fZnJhbWVfZmlsdGVyaW5nX2JlaGF2aW9yX3JlYXNvbl87CiAgIH0KIAotICAvLyBXZWJDb250ZW50c09ic2VydmVyIGltcGxlbWVudGF0aW9uLgorICAvLyBXZWJDb250ZW50c09ic2VydmVyOgogICB2b2lkIERpZEZpbmlzaE5hdmlnYXRpb24oCiAgICAgICBjb250ZW50OjpOYXZpZ2F0aW9uSGFuZGxlKiBuYXZpZ2F0aW9uX2hhbmRsZSkgb3ZlcnJpZGU7CisgIHZvaWQgRnJhbWVEZWxldGVkKGNvbnRlbnQ6OlJlbmRlckZyYW1lSG9zdCogcmVuZGVyX2ZyYW1lX2hvc3QpIG92ZXJyaWRlOworICB2b2lkIERpZEZpbmlzaExvYWQoY29udGVudDo6UmVuZGVyRnJhbWVIb3N0KiByZW5kZXJfZnJhbWVfaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdVUkwmIHZhbGlkYXRlZF91cmwpIG92ZXJyaWRlOwogCi0gIC8vIFN1cGVydmlzZWRVc2VyU2VydmljZU9ic2VydmVyIGltcGxlbWVudGF0aW9uLgorICAvLyBTdXBlcnZpc2VkVXNlclNlcnZpY2VPYnNlcnZlcjoKICAgdm9pZCBPblVSTEZpbHRlckNoYW5nZWQoKSBvdmVycmlkZTsKIAogICAvLyBDYWxsZWQgd2hlbiBpbnRlcnN0aXRpYWwgZXJyb3IgcGFnZSBpcyBubyBsb25nZXIgYmVpbmcgc2hvd24gaW4gdGhlIG1haW4KICAgLy8gZnJhbWUuCi0gIHZvaWQgT25JbnRlcnN0aXRpYWxEb25lKCk7CisgIHZvaWQgT25JbnRlcnN0aXRpYWxEb25lKGludCBmcmFtZV9pZCk7CisKKyAgY29uc3Qgc3RkOjptYXA8aW50LCBzdGQ6OnVuaXF1ZV9wdHI8U3VwZXJ2aXNlZFVzZXJJbnRlcnN0aXRpYWw+PiYKKyAgaW50ZXJzdGl0aWFsc19mb3JfdGVzdCgpIHsKKyAgICByZXR1cm4gc3VwZXJ2aXNlZF91c2VyX2ludGVyc3RpdGlhbHNfOworICB9CiAKICBwcml2YXRlOgogICBmcmllbmQgY2xhc3MgY29udGVudDo6V2ViQ29udGVudHNVc2VyRGF0YTxTdXBlcnZpc2VkVXNlck5hdmlnYXRpb25PYnNlcnZlcj47CkBAIC04MywxMSArOTQsMTQgQEAKICAgICAgIGNvbnN0IEdVUkwmIHVybCwKICAgICAgIHN1cGVydmlzZWRfdXNlcl9lcnJvcl9wYWdlOjpGaWx0ZXJpbmdCZWhhdmlvclJlYXNvbiByZWFzb24sCiAgICAgICBpbnQ2NF90IG5hdmlnYXRpb25faWQsCisgICAgICBpbnQgZnJhbWVfaWQsCiAgICAgICBjb25zdCBiYXNlOjpDYWxsYmFjazwKICAgICAgICAgICB2b2lkKFN1cGVydmlzZWRVc2VyTmF2aWdhdGlvblRocm90dGxlOjpDYWxsYmFja0FjdGlvbnMpPiYgY2FsbGJhY2spOwogCiAgIHZvaWQgVVJMRmlsdGVyQ2hlY2tDYWxsYmFjaygKICAgICAgIGNvbnN0IEdVUkwmIHVybCwKKyAgICAgIGludCByZW5kZXJfZnJhbWVfcHJvY2Vzc19pZCwKKyAgICAgIGludCByZW5kZXJfZnJhbWVfcm91dGluZ19pZCwKICAgICAgIFN1cGVydmlzZWRVc2VyVVJMRmlsdGVyOjpGaWx0ZXJpbmdCZWhhdmlvciBiZWhhdmlvciwKICAgICAgIHN1cGVydmlzZWRfdXNlcl9lcnJvcl9wYWdlOjpGaWx0ZXJpbmdCZWhhdmlvclJlYXNvbiByZWFzb24sCiAgICAgICBib29sIHVuY2VydGFpbik7CkBAIC05Nyw5ICsxMTEsMTMgQEAKICAgICAgIHN1cGVydmlzZWRfdXNlcl9lcnJvcl9wYWdlOjpGaWx0ZXJpbmdCZWhhdmlvclJlYXNvbiByZWFzb24sCiAgICAgICBib29sIGluaXRpYWxfcGFnZV9sb2FkLAogICAgICAgaW50NjRfdCBuYXZpZ2F0aW9uX2lkLAorICAgICAgaW50IGZyYW1lX2lkLAogICAgICAgY29uc3QgYmFzZTo6Q2FsbGJhY2s8CiAgICAgICAgICAgdm9pZChTdXBlcnZpc2VkVXNlck5hdmlnYXRpb25UaHJvdHRsZTo6Q2FsbGJhY2tBY3Rpb25zKT4mIGNhbGxiYWNrKTsKIAorICAvLyBGaWx0ZXJzIHRoZSByZW5kZXIgZnJhbWUgaG9zdCBpZiByZW5kZXIgZnJhbWUgaXMgbGl2ZS4KKyAgdm9pZCBGaWx0ZXJSZW5kZXJGcmFtZShjb250ZW50OjpSZW5kZXJGcmFtZUhvc3QqIHJlbmRlcl9mcmFtZV9ob3N0KTsKKwogICAvLyBzdXBlcnZpc2VkX3VzZXI6Om1vam9tOjpTdXBlcnZpc2VkVXNlckNvbW1hbmRzIGltcGxlbWVudGF0aW9uLiBTaG91bGQgbm90CiAgIC8vIGJlIGNhbGxlZCB3aGVuIGFuIGludGVyc3RpdGlhbCBpcyBubyBsb25nZXIgc2hvd2luZy4gVGhpcyBzaG91bGQgYmUKICAgLy8gZW5mb3JjZWQgYnkgdGhlIG1vam8gY2FsbGVyLgpAQCAtMTEzLDggKzEzMSwxMCBAQAogICAvLyBPd25lZCBieSBTdXBlcnZpc2VkVXNlclNlcnZpY2VGYWN0b3J5IChsaWZldGltZSBvZiBQcm9maWxlKS4KICAgU3VwZXJ2aXNlZFVzZXJTZXJ2aWNlKiBzdXBlcnZpc2VkX3VzZXJfc2VydmljZV87CiAKLSAgLy8gTmF2aWdhdGlvbiBJRCBvZiB0aGUgbmF2aWdhdGlvbiB0aGF0IHRyaWdnZXJlZCB0aGUgbGFzdCBpbnRlcnN0aXRpYWwuCi0gIGludDY0X3QgaW50ZXJzdGl0aWFsX25hdmlnYXRpb25faWRfID0gLTE7CisgIC8vIEtlZXBzIHRyYWNrIG9mIHRoZSBibG9ja2VkIGZyYW1lcy4gSXQgbWFwcyB0aGUgZnJhbWUncyBnbG9iYWxseSB1bmlxdWUKKyAgLy8gaWQgdG8gaXRzIGNvcnJlc3BvbmRpbmcgfFN1cGVydmlzZWRVc2VySW50ZXJzdGl0aWFsfCBpbnN0YW5jZS4KKyAgc3RkOjptYXA8aW50LCBzdGQ6OnVuaXF1ZV9wdHI8U3VwZXJ2aXNlZFVzZXJJbnRlcnN0aXRpYWw+PgorICAgICAgc3VwZXJ2aXNlZF91c2VyX2ludGVyc3RpdGlhbHNfOwogCiAgIFN1cGVydmlzZWRVc2VyVVJMRmlsdGVyOjpGaWx0ZXJpbmdCZWhhdmlvciBtYWluX2ZyYW1lX2ZpbHRlcmluZ19iZWhhdmlvcl8gPQogICAgICAgU3VwZXJ2aXNlZFVzZXJVUkxGaWx0ZXI6OkZpbHRlcmluZ0JlaGF2aW9yOjpBTExPVzsKQEAgLTEyNSw4ICsxNDUsNiBAQAogICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Y29uc3Qgc2Vzc2lvbnM6OlNlcmlhbGl6ZWROYXZpZ2F0aW9uRW50cnk+PgogICAgICAgYmxvY2tlZF9uYXZpZ2F0aW9uc187CiAKLSAgc3RkOjp1bmlxdWVfcHRyPFN1cGVydmlzZWRVc2VySW50ZXJzdGl0aWFsPiBpbnRlcnN0aXRpYWxfOwotCiAgIGNvbnRlbnQ6OldlYkNvbnRlbnRzRnJhbWVCaW5kaW5nU2V0PAogICAgICAgc3VwZXJ2aXNlZF91c2VyOjptb2pvbTo6U3VwZXJ2aXNlZFVzZXJDb21tYW5kcz4KICAgICAgIGJpbmRpbmdfOwpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvc3VwZXJ2aXNlZF91c2VyL3N1cGVydmlzZWRfdXNlcl9uYXZpZ2F0aW9uX3Rocm90dGxlLmNjIGIvY2hyb21lL2Jyb3dzZXIvc3VwZXJ2aXNlZF91c2VyL3N1cGVydmlzZWRfdXNlcl9uYXZpZ2F0aW9uX3Rocm90dGxlLmNjCmluZGV4IDViNGE2MmYuLmY4Mjc1OTMgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3N1cGVydmlzZWRfdXNlci9zdXBlcnZpc2VkX3VzZXJfbmF2aWdhdGlvbl90aHJvdHRsZS5jYworKysgYi9jaHJvbWUvYnJvd3Nlci9zdXBlcnZpc2VkX3VzZXIvc3VwZXJ2aXNlZF91c2VyX25hdmlnYXRpb25fdGhyb3R0bGUuY2MKQEAgLTEyNiw4ICsxMjYsMTAgQEAKICAgICAgIGJlaGF2aW9yID09IFN1cGVydmlzZWRVc2VyVVJMRmlsdGVyOjpGaWx0ZXJpbmdCZWhhdmlvcjo6QUxMT1c7CiAgIGJvb2wgaXNfd2hpdGVsaXN0ZWQgPQogICAgICAgcmVhc29uID09IHN1cGVydmlzZWRfdXNlcl9lcnJvcl9wYWdlOjpGaWx0ZXJpbmdCZWhhdmlvclJlYXNvbjo6V0hJVEVMSVNUOworICBib29sIGlzX21hbnVhbCA9CisgICAgICByZWFzb24gPT0gc3VwZXJ2aXNlZF91c2VyX2Vycm9yX3BhZ2U6OkZpbHRlcmluZ0JlaGF2aW9yUmVhc29uOjpNQU5VQUw7CiAKLSAgcmV0dXJuIGlzX2FsbG93ZWQgJiYgaXNfd2hpdGVsaXN0ZWQ7CisgIHJldHVybiBpc19hbGxvd2VkICYmIChpc193aGl0ZWxpc3RlZCB8fCBpc19tYW51YWwpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UKQEAgLTIxMiw2ICsyMTQsNyBAQAogICBTdXBlcnZpc2VkVXNlck5hdmlnYXRpb25PYnNlcnZlcjo6T25SZXF1ZXN0QmxvY2tlZCgKICAgICAgIG5hdmlnYXRpb25faGFuZGxlKCktPkdldFdlYkNvbnRlbnRzKCksIG5hdmlnYXRpb25faGFuZGxlKCktPkdldFVSTCgpLAogICAgICAgcmVhc29uLCBuYXZpZ2F0aW9uX2hhbmRsZSgpLT5HZXROYXZpZ2F0aW9uSWQoKSwKKyAgICAgIG5hdmlnYXRpb25faGFuZGxlKCktPkdldEZyYW1lVHJlZU5vZGVJZCgpLAogICAgICAgYmFzZTo6QmluZCgmU3VwZXJ2aXNlZFVzZXJOYXZpZ2F0aW9uVGhyb3R0bGU6Ok9uSW50ZXJzdGl0aWFsUmVzdWx0LAogICAgICAgICAgICAgICAgICB3ZWFrX3B0cl9mYWN0b3J5Xy5HZXRXZWFrUHRyKCkpKTsKIH0KZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3N1cGVydmlzZWRfdXNlci9zdXBlcnZpc2VkX3VzZXJfbmF2aWdhdGlvbl90aHJvdHRsZV9icm93c2VydGVzdC5jYyBiL2Nocm9tZS9icm93c2VyL3N1cGVydmlzZWRfdXNlci9zdXBlcnZpc2VkX3VzZXJfbmF2aWdhdGlvbl90aHJvdHRsZV9icm93c2VydGVzdC5jYwppbmRleCBiZTFiNjllZjAuLjBlNDFkNjEgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3N1cGVydmlzZWRfdXNlci9zdXBlcnZpc2VkX3VzZXJfbmF2aWdhdGlvbl90aHJvdHRsZV9icm93c2VydGVzdC5jYworKysgYi9jaHJvbWUvYnJvd3Nlci9zdXBlcnZpc2VkX3VzZXIvc3VwZXJ2aXNlZF91c2VyX25hdmlnYXRpb25fdGhyb3R0bGVfYnJvd3NlcnRlc3QuY2MKQEAgLTcsMTEgKzcsMTggQEAKICNpbmNsdWRlICJiYXNlL2NvbW1hbmRfbGluZS5oIgogI2luY2x1ZGUgImJhc2UvZmlsZXMvZmlsZV9wYXRoLmgiCiAjaW5jbHVkZSAiYmFzZS9wYXRoX3NlcnZpY2UuaCIKKyNpbmNsdWRlICJiYXNlL3J1bl9sb29wLmgiCiAjaW5jbHVkZSAiYmFzZS9zdHJpbmdzL3V0Zl9zdHJpbmdfY29udmVyc2lvbnMuaCIKICNpbmNsdWRlICJiYXNlL3ZhbHVlcy5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3Byb2ZpbGVzL3Byb2ZpbGUuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9zdXBlcnZpc2VkX3VzZXIvbG9nZ2VkX2luX3VzZXJfbWl4aW4uaCIKKyNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9zdXBlcnZpc2VkX3VzZXIvcGVybWlzc2lvbl9yZXF1ZXN0X2NyZWF0b3JfbW9jay5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3N1cGVydmlzZWRfdXNlci9zdXBlcnZpc2VkX3VzZXJfY29uc3RhbnRzLmgiCisjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvc3VwZXJ2aXNlZF91c2VyL3N1cGVydmlzZWRfdXNlcl9mZWF0dXJlcy5oIgorI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3N1cGVydmlzZWRfdXNlci9zdXBlcnZpc2VkX3VzZXJfaW50ZXJzdGl0aWFsLmgiCisjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvc3VwZXJ2aXNlZF91c2VyL3N1cGVydmlzZWRfdXNlcl9uYXZpZ2F0aW9uX29ic2VydmVyLmgiCisjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvc3VwZXJ2aXNlZF91c2VyL3N1cGVydmlzZWRfdXNlcl9zZXJ2aWNlLmgiCisjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvc3VwZXJ2aXNlZF91c2VyL3N1cGVydmlzZWRfdXNlcl9zZXJ2aWNlX2ZhY3RvcnkuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9zdXBlcnZpc2VkX3VzZXIvc3VwZXJ2aXNlZF91c2VyX3NldHRpbmdzX3NlcnZpY2UuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9zdXBlcnZpc2VkX3VzZXIvc3VwZXJ2aXNlZF91c2VyX3NldHRpbmdzX3NlcnZpY2VfZmFjdG9yeS5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3N1cGVydmlzZWRfdXNlci9zdXBlcnZpc2VkX3VzZXJfdXJsX2ZpbHRlci5oIgpAQCAtMTksNiArMjYsNyBAQAogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL3RhYnMvdGFiX3N0cmlwX21vZGVsLmgiCiAjaW5jbHVkZSAiY2hyb21lL3Rlc3QvYmFzZS91aV90ZXN0X3V0aWxzLmgiCiAjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvYnJvd3Nlci9uYXZpZ2F0aW9uX2VudHJ5LmgiCisjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvYnJvd3Nlci9uYXZpZ2F0aW9uX2hhbmRsZS5oIgogI2luY2x1ZGUgImNvbnRlbnQvcHVibGljL2Jyb3dzZXIvd2ViX2NvbnRlbnRzLmgiCiAjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvY29tbW9uL2NvbnRlbnRfcGF0aHMuaCIKICNpbmNsdWRlICJjb250ZW50L3B1YmxpYy9jb21tb24vcGFnZV90eXBlLmgiCkBAIC0zNCw5ICs0Miw4NSBAQAogCiBzdGF0aWMgY29uc3QgY2hhcioga0V4YW1wbGVIb3N0ID0gInd3dy5leGFtcGxlLmNvbSI7CiBzdGF0aWMgY29uc3QgY2hhcioga0V4YW1wbGVIb3N0MiA9ICJ3d3cuZXhhbXBsZTIuY29tIjsKLQorc3RhdGljIGNvbnN0IGNoYXIqIGtJZnJhbWVIb3N0MSA9ICJ3d3cuaWZyYW1lMS5jb20iOwogc3RhdGljIGNvbnN0IGNoYXIqIGtJZnJhbWVIb3N0MiA9ICJ3d3cuaWZyYW1lMi5jb20iOwogCisvLyBIZWxwZXIgY2xhc3MgdG8gd2FpdCBmb3IgYSBwYXJ0aWN1bGFyIG5hdmlnYXRpb24gaW4gYSBwYXJ0aWN1bGFyIHJlbmRlcgorLy8gZnJhbWUuCitjbGFzcyBOYXZpZ2F0aW9uRmluaXNoZWRXYWl0ZXIgOiBwdWJsaWMgY29udGVudDo6V2ViQ29udGVudHNPYnNlcnZlciB7CisgcHVibGljOgorICBOYXZpZ2F0aW9uRmluaXNoZWRXYWl0ZXIoV2ViQ29udGVudHMqIHdlYl9jb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdVUkwmIHVybCkKKyAgICAgIDogY29udGVudDo6V2ViQ29udGVudHNPYnNlcnZlcih3ZWJfY29udGVudHMpLAorICAgICAgICBmcmFtZV9pZF8oZnJhbWVfaWQpLAorICAgICAgICB1cmxfKHVybCkge30KKworICB+TmF2aWdhdGlvbkZpbmlzaGVkV2FpdGVyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgIHZvaWQgV2FpdCgpIHsKKyAgICBpZiAoZGlkX2ZpbmlzaF8pCisgICAgICByZXR1cm47CisgICAgcnVuX2xvb3BfLlJ1bigpOworICB9CisKKyAgLy8gY29udGVudDo6V2ViQ29udGVudHNPYnNlcnZlcjoKKyAgdm9pZCBEaWRGaW5pc2hOYXZpZ2F0aW9uKAorICAgICAgY29udGVudDo6TmF2aWdhdGlvbkhhbmRsZSogbmF2aWdhdGlvbl9oYW5kbGUpIG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgaW50IGZyYW1lX2lkXzsKKyAgR1VSTCB1cmxfOworICBib29sIGRpZF9maW5pc2hfID0gZmFsc2U7CisgIGJhc2U6OlJ1bkxvb3AgcnVuX2xvb3Bfe2Jhc2U6OlJ1bkxvb3A6OlR5cGU6OmtOZXN0YWJsZVRhc2tzQWxsb3dlZH07CisKKyAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKE5hdmlnYXRpb25GaW5pc2hlZFdhaXRlcik7Cit9OworCit2b2lkIE5hdmlnYXRpb25GaW5pc2hlZFdhaXRlcjo6RGlkRmluaXNoTmF2aWdhdGlvbigKKyAgICBjb250ZW50OjpOYXZpZ2F0aW9uSGFuZGxlKiBuYXZpZ2F0aW9uX2hhbmRsZSkgeworICBpZiAobmF2aWdhdGlvbl9oYW5kbGUtPkdldEZyYW1lVHJlZU5vZGVJZCgpICE9IGZyYW1lX2lkXyB8fAorICAgICAgbmF2aWdhdGlvbl9oYW5kbGUtPkdldFVSTCgpICE9IHVybF8pCisgICAgcmV0dXJuOworICBkaWRfZmluaXNoXyA9IHRydWU7CisgIHJ1bl9sb29wXy5RdWl0KCk7Cit9CisKKy8vIENsYXNzIHRvIGtlZXAgdHJhY2sgb2YgaWZyYW1lcyBjcmVhdGVkIGFuZCBkZXN0cm95ZWQuCitjbGFzcyBSZW5kZXJGcmFtZVRyYWNrZXIgOiBwdWJsaWMgY29udGVudDo6V2ViQ29udGVudHNPYnNlcnZlciB7CisgcHVibGljOgorICBleHBsaWNpdCBSZW5kZXJGcmFtZVRyYWNrZXIoY29udGVudDo6V2ViQ29udGVudHMqIHdlYl9jb250ZW50cykKKyAgICAgIDogY29udGVudDo6V2ViQ29udGVudHNPYnNlcnZlcih3ZWJfY29udGVudHMpIHt9CisgIH5SZW5kZXJGcmFtZVRyYWNrZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgLy8gY29udGVudDo6V2ViQ29udGVudHNPYnNlcnZlcjoKKyAgdm9pZCBSZW5kZXJGcmFtZUhvc3RDaGFuZ2VkKGNvbnRlbnQ6OlJlbmRlckZyYW1lSG9zdCogb2xkX2hvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OjpSZW5kZXJGcmFtZUhvc3QqIG5ld19ob3N0KSBvdmVycmlkZTsKKyAgdm9pZCBGcmFtZURlbGV0ZWQoY29udGVudDo6UmVuZGVyRnJhbWVIb3N0KiBob3N0KSBvdmVycmlkZTsKKworICBjb250ZW50OjpSZW5kZXJGcmFtZUhvc3QqIEdldEhvc3QoaW50IGZyYW1lX2lkKSB7CisgICAgaWYgKCFiYXNlOjpDb250YWlucyhyZW5kZXJfZnJhbWVfaG9zdHNfLCBmcmFtZV9pZCkpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICByZXR1cm4gcmVuZGVyX2ZyYW1lX2hvc3RzX1tmcmFtZV9pZF07CisgIH0KKworIHByaXZhdGU6CisgIHN0ZDo6bWFwPGludCwgY29udGVudDo6UmVuZGVyRnJhbWVIb3N0Kj4gcmVuZGVyX2ZyYW1lX2hvc3RzXzsKK307CisKK3ZvaWQgUmVuZGVyRnJhbWVUcmFja2VyOjpSZW5kZXJGcmFtZUhvc3RDaGFuZ2VkKAorICAgIGNvbnRlbnQ6OlJlbmRlckZyYW1lSG9zdCogb2xkX2hvc3QsCisgICAgY29udGVudDo6UmVuZGVyRnJhbWVIb3N0KiBuZXdfaG9zdCkgeworICByZW5kZXJfZnJhbWVfaG9zdHNfW25ld19ob3N0LT5HZXRGcmFtZVRyZWVOb2RlSWQoKV0gPSBuZXdfaG9zdDsKK30KKwordm9pZCBSZW5kZXJGcmFtZVRyYWNrZXI6OkZyYW1lRGVsZXRlZChjb250ZW50OjpSZW5kZXJGcmFtZUhvc3QqIGhvc3QpIHsKKyAgaWYgKCFiYXNlOjpDb250YWlucyhyZW5kZXJfZnJhbWVfaG9zdHNfLCBob3N0LT5HZXRGcmFtZVRyZWVOb2RlSWQoKSkpCisgICAgcmV0dXJuOworCisgIHJlbmRlcl9mcmFtZV9ob3N0c18uZXJhc2UoaG9zdC0+R2V0RnJhbWVUcmVlTm9kZUlkKCkpOworfQorCiB9ICAvLyBuYW1lc3BhY2UKIAogY2xhc3MgU3VwZXJ2aXNlZFVzZXJOYXZpZ2F0aW9uVGhyb3R0bGVUZXN0CkBAIC00NSw2ICsxMjksOSBAQAogICBTdXBlcnZpc2VkVXNlck5hdmlnYXRpb25UaHJvdHRsZVRlc3QoKSA9IGRlZmF1bHQ7CiAgIH5TdXBlcnZpc2VkVXNlck5hdmlnYXRpb25UaHJvdHRsZVRlc3QoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CiAKKyAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlOworICB2b2lkIFNldFVwT25NYWluVGhyZWFkKCkgb3ZlcnJpZGU7CisKICAgdm9pZCBCbG9ja0hvc3QoY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3QpIHsKICAgICBQcm9maWxlKiBwcm9maWxlID0gYnJvd3NlcigpLT5wcm9maWxlKCk7CiAgICAgU3VwZXJ2aXNlZFVzZXJTZXR0aW5nc1NlcnZpY2UqIHNldHRpbmdzX3NlcnZpY2UgPQpAQCAtODMsOSArMTcwLDYgQEAKICAgfQogCiAgcHJpdmF0ZToKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlOwotICB2b2lkIFNldFVwT25NYWluVGhyZWFkKCkgb3ZlcnJpZGU7Ci0KICAgc3RkOjp1bmlxdWVfcHRyPGNocm9tZW9zOjpMb2dnZWRJblVzZXJNaXhpbj4gbG9nZ2VkX2luX3VzZXJfbWl4aW5fOwogfTsKIApAQCAtMTc5LDYgKzI2MywyMDUgQEAKICAgRVhQRUNUX1RSVUUobG9hZGVkMik7CiB9CiAKK2NsYXNzIFN1cGVydmlzZWRVc2VySWZyYW1lRmlsdGVyVGVzdAorICAgIDogcHVibGljIFN1cGVydmlzZWRVc2VyTmF2aWdhdGlvblRocm90dGxlVGVzdCB7CisgcHJvdGVjdGVkOgorICBTdXBlcnZpc2VkVXNlcklmcmFtZUZpbHRlclRlc3QoKSA9IGRlZmF1bHQ7CisgIH5TdXBlcnZpc2VkVXNlcklmcmFtZUZpbHRlclRlc3QoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlOworICB2b2lkIFNldFVwT25NYWluVGhyZWFkKCkgb3ZlcnJpZGU7CisgIHZvaWQgVGVhckRvd25Pbk1haW5UaHJlYWQoKSBvdmVycmlkZTsKKworICBzdGQ6OnZlY3RvcjxpbnQ+IEdldEJsb2NrZWRGcmFtZXMoKTsKKyAgY29uc3QgR1VSTCYgR2V0QmxvY2tlZEZyYW1lVVJMKGludCBmcmFtZV9pZCk7CisgIGJvb2wgSXNJbnRlcnN0aXRpYWxCZWluZ1Nob3duSW5GcmFtZShpbnQgZnJhbWVfaWQpOworICB2b2lkIFJlcXVlc3RQZXJtaXNzaW9uRnJvbUZyYW1lKGludCBmcmFtZV9pZCk7CisgIHZvaWQgV2FpdEZvck5hdmlnYXRpb25GaW5pc2hlZChpbnQgZnJhbWVfaWQsIGNvbnN0IEdVUkwmIHVybCk7CisKKyAgUGVybWlzc2lvblJlcXVlc3RDcmVhdG9yTW9jayogcGVybWlzc2lvbl9jcmVhdG9yKCkgeworICAgIHJldHVybiBwZXJtaXNzaW9uX2NyZWF0b3JfOworICB9CisKKyAgUmVuZGVyRnJhbWVUcmFja2VyKiB0cmFja2VyKCkgeyByZXR1cm4gdHJhY2tlcl8uZ2V0KCk7IH0KKworIHByaXZhdGU6CisgIHN0ZDo6dW5pcXVlX3B0cjxSZW5kZXJGcmFtZVRyYWNrZXI+IHRyYWNrZXJfOworICBQZXJtaXNzaW9uUmVxdWVzdENyZWF0b3JNb2NrKiBwZXJtaXNzaW9uX2NyZWF0b3JfOworCisgIGJhc2U6OnRlc3Q6OlNjb3BlZEZlYXR1cmVMaXN0IHNjb3BlZF9mZWF0dXJlX2xpc3RfOworfTsKKwordm9pZCBTdXBlcnZpc2VkVXNlcklmcmFtZUZpbHRlclRlc3Q6OlNldFVwKCkgeworICBzY29wZWRfZmVhdHVyZV9saXN0Xy5Jbml0QW5kRW5hYmxlRmVhdHVyZSgKKyAgICAgIHN1cGVydmlzZWRfdXNlcnM6OmtTdXBlcnZpc2VkVXNlcklmcmFtZUZpbHRlcik7CisgIFN1cGVydmlzZWRVc2VyTmF2aWdhdGlvblRocm90dGxlVGVzdDo6U2V0VXAoKTsKK30KKwordm9pZCBTdXBlcnZpc2VkVXNlcklmcmFtZUZpbHRlclRlc3Q6OlNldFVwT25NYWluVGhyZWFkKCkgeworICBTdXBlcnZpc2VkVXNlck5hdmlnYXRpb25UaHJvdHRsZVRlc3Q6OlNldFVwT25NYWluVGhyZWFkKCk7CisKKyAgU3VwZXJ2aXNlZFVzZXJTZXJ2aWNlKiBzZXJ2aWNlID0KKyAgICAgIFN1cGVydmlzZWRVc2VyU2VydmljZUZhY3Rvcnk6OkdldEZvclByb2ZpbGUoYnJvd3NlcigpLT5wcm9maWxlKCkpOworICBzdGQ6OnVuaXF1ZV9wdHI8UGVybWlzc2lvblJlcXVlc3RDcmVhdG9yPiBjcmVhdG9yID0KKyAgICAgIHN0ZDo6bWFrZV91bmlxdWU8UGVybWlzc2lvblJlcXVlc3RDcmVhdG9yTW9jaz4oYnJvd3NlcigpLT5wcm9maWxlKCkpOworICBwZXJtaXNzaW9uX2NyZWF0b3JfID0KKyAgICAgIHN0YXRpY19jYXN0PFBlcm1pc3Npb25SZXF1ZXN0Q3JlYXRvck1vY2sqPihjcmVhdG9yLmdldCgpKTsKKyAgcGVybWlzc2lvbl9jcmVhdG9yXy0+U2V0RW5hYmxlZCgpOworICBzZXJ2aWNlLT5TZXRQcmltYXJ5UGVybWlzc2lvbkNyZWF0b3JGb3JUZXN0KHN0ZDo6bW92ZShjcmVhdG9yKSk7CisKKyAgV2ViQ29udGVudHMqIHRhYiA9IGJyb3dzZXIoKS0+dGFiX3N0cmlwX21vZGVsKCktPkdldEFjdGl2ZVdlYkNvbnRlbnRzKCk7CisgIHRyYWNrZXJfID0gc3RkOjptYWtlX3VuaXF1ZTxSZW5kZXJGcmFtZVRyYWNrZXI+KHRhYik7Cit9CisKK3ZvaWQgU3VwZXJ2aXNlZFVzZXJJZnJhbWVGaWx0ZXJUZXN0OjpUZWFyRG93bk9uTWFpblRocmVhZCgpIHsKKyAgdHJhY2tlcl8ucmVzZXQoKTsKKyAgU3VwZXJ2aXNlZFVzZXJOYXZpZ2F0aW9uVGhyb3R0bGVUZXN0OjpUZWFyRG93bk9uTWFpblRocmVhZCgpOworfQorCitzdGQ6OnZlY3RvcjxpbnQ+IFN1cGVydmlzZWRVc2VySWZyYW1lRmlsdGVyVGVzdDo6R2V0QmxvY2tlZEZyYW1lcygpIHsKKyAgV2ViQ29udGVudHMqIHRhYiA9IGJyb3dzZXIoKS0+dGFiX3N0cmlwX21vZGVsKCktPkdldEFjdGl2ZVdlYkNvbnRlbnRzKCk7CisgIGF1dG8qIG5hdmlnYXRpb25fb2JzZXJ2ZXIgPQorICAgICAgU3VwZXJ2aXNlZFVzZXJOYXZpZ2F0aW9uT2JzZXJ2ZXI6OkZyb21XZWJDb250ZW50cyh0YWIpOworICBjb25zdCBhdXRvJiBpbnRlcnN0aXRpYWxzID0gbmF2aWdhdGlvbl9vYnNlcnZlci0+aW50ZXJzdGl0aWFsc19mb3JfdGVzdCgpOworCisgIHN0ZDo6dmVjdG9yPGludD4gYmxvY2tlZF9mcmFtZXM7CisgIGJsb2NrZWRfZnJhbWVzLnJlc2VydmUoaW50ZXJzdGl0aWFscy5zaXplKCkpOworCisgIGZvciAoY29uc3QgYXV0byYgZWxlbSA6IGludGVyc3RpdGlhbHMpCisgICAgYmxvY2tlZF9mcmFtZXMucHVzaF9iYWNrKGVsZW0uZmlyc3QpOworCisgIHJldHVybiBibG9ja2VkX2ZyYW1lczsKK30KKworY29uc3QgR1VSTCYgU3VwZXJ2aXNlZFVzZXJJZnJhbWVGaWx0ZXJUZXN0OjpHZXRCbG9ja2VkRnJhbWVVUkwoaW50IGZyYW1lX2lkKSB7CisgIFdlYkNvbnRlbnRzKiB0YWIgPSBicm93c2VyKCktPnRhYl9zdHJpcF9tb2RlbCgpLT5HZXRBY3RpdmVXZWJDb250ZW50cygpOworICBhdXRvKiBuYXZpZ2F0aW9uX29ic2VydmVyID0KKyAgICAgIFN1cGVydmlzZWRVc2VyTmF2aWdhdGlvbk9ic2VydmVyOjpGcm9tV2ViQ29udGVudHModGFiKTsKKyAgY29uc3QgYXV0byYgaW50ZXJzdGl0aWFscyA9IG5hdmlnYXRpb25fb2JzZXJ2ZXItPmludGVyc3RpdGlhbHNfZm9yX3Rlc3QoKTsKKyAgRENIRUNLKGJhc2U6OkNvbnRhaW5zKGludGVyc3RpdGlhbHMsIGZyYW1lX2lkKSk7CisgIHJldHVybiBpbnRlcnN0aXRpYWxzLmF0KGZyYW1lX2lkKS0+dXJsKCk7Cit9CisKK2Jvb2wgU3VwZXJ2aXNlZFVzZXJJZnJhbWVGaWx0ZXJUZXN0OjpJc0ludGVyc3RpdGlhbEJlaW5nU2hvd25JbkZyYW1lKAorICAgIGludCBmcmFtZV9pZCkgeworICAvLyBGaXJzdCBjaGVjayB0aGF0IFN1cGVydmlzZWRVc2VyTmF2aWdhdGlvbk9ic2VydmVyIGJlbGlldmVzIHRoYXQgdGhlcmUgaXMKKyAgLy8gYW4gZXJyb3IgcGFnZSBpbiB0aGUgZnJhbWUgaG9zdGVkIGJ5IHxyZmh8LgorICBXZWJDb250ZW50cyogdGFiID0gYnJvd3NlcigpLT50YWJfc3RyaXBfbW9kZWwoKS0+R2V0QWN0aXZlV2ViQ29udGVudHMoKTsKKyAgYXV0byogbmF2aWdhdGlvbl9vYnNlcnZlciA9CisgICAgICBTdXBlcnZpc2VkVXNlck5hdmlnYXRpb25PYnNlcnZlcjo6RnJvbVdlYkNvbnRlbnRzKHRhYik7CisgIGF1dG8mIGludGVyc3RpdGlhbHMgPSBuYXZpZ2F0aW9uX29ic2VydmVyLT5pbnRlcnN0aXRpYWxzX2Zvcl90ZXN0KCk7CisKKyAgaWYgKCFiYXNlOjpDb250YWlucyhpbnRlcnN0aXRpYWxzLCBmcmFtZV9pZCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIFRoZW4gY2hlY2sgdGhhdCBhbiBlcnJvciBwYWdlIGhhcyBhY3R1YWxseSBiZWVuIGxvYWRlZCBpbiB0aGUgZnJhbWUuCisgIHN0ZDo6c3RyaW5nIGNvbW1hbmQgPQorICAgICAgImRvbUF1dG9tYXRpb25Db250cm9sbGVyLnNlbmQoIgorICAgICAgIihkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdzdXBlcnZpc2VkLXVzZXItYmxvY2snKSAhPSBudWxsKSAiCisgICAgICAiPyAodHJ1ZSkgOiAoZmFsc2UpKTsiOworCisgIGF1dG8qIHJlbmRlcl9mcmFtZV9ob3N0ID0gdHJhY2tlcigpLT5HZXRIb3N0KGZyYW1lX2lkKTsKKyAgRENIRUNLKHJlbmRlcl9mcmFtZV9ob3N0LT5Jc1JlbmRlckZyYW1lTGl2ZSgpKTsKKworICBib29sIHZhbHVlID0gZmFsc2U7CisgIGF1dG8gdGFyZ2V0ID0gY29udGVudDo6VG9SZW5kZXJGcmFtZUhvc3QocmVuZGVyX2ZyYW1lX2hvc3QpOworICBFWFBFQ1RfVFJVRShjb250ZW50OjpFeGVjdXRlU2NyaXB0V2l0aG91dFVzZXJHZXN0dXJlQW5kRXh0cmFjdEJvb2woCisgICAgICB0YXJnZXQsIGNvbW1hbmQsICZ2YWx1ZSkpOworICByZXR1cm4gdmFsdWU7Cit9CisKK3ZvaWQgU3VwZXJ2aXNlZFVzZXJJZnJhbWVGaWx0ZXJUZXN0OjpSZXF1ZXN0UGVybWlzc2lvbkZyb21GcmFtZShpbnQgZnJhbWVfaWQpIHsKKyAgYXV0byogcmVuZGVyX2ZyYW1lX2hvc3QgPSB0cmFja2VyKCktPkdldEhvc3QoZnJhbWVfaWQpOworICBEQ0hFQ0socmVuZGVyX2ZyYW1lX2hvc3QpOworICBEQ0hFQ0socmVuZGVyX2ZyYW1lX2hvc3QtPklzUmVuZGVyRnJhbWVMaXZlKCkpOworICBzdGQ6OnN0cmluZyBjb21tYW5kID0gInNlbmRDb21tYW5kKFwncmVxdWVzdFwnKSI7CisgIEFTU0VSVF9UUlVFKGNvbnRlbnQ6OkV4ZWN1dGVTY3JpcHQoCisgICAgICBjb250ZW50OjpUb1JlbmRlckZyYW1lSG9zdChyZW5kZXJfZnJhbWVfaG9zdCksIGNvbW1hbmQpKTsKK30KKwordm9pZCBTdXBlcnZpc2VkVXNlcklmcmFtZUZpbHRlclRlc3Q6OldhaXRGb3JOYXZpZ2F0aW9uRmluaXNoZWQoCisgICAgaW50IGZyYW1lX2lkLAorICAgIGNvbnN0IEdVUkwmIHVybCkgeworICBXZWJDb250ZW50cyogdGFiID0gYnJvd3NlcigpLT50YWJfc3RyaXBfbW9kZWwoKS0+R2V0QWN0aXZlV2ViQ29udGVudHMoKTsKKyAgTmF2aWdhdGlvbkZpbmlzaGVkV2FpdGVyIHdhaXRlcih0YWIsIGZyYW1lX2lkLCB1cmwpOworICB3YWl0ZXIuV2FpdCgpOworfQorCitJTl9QUk9DX0JST1dTRVJfVEVTVF9GKFN1cGVydmlzZWRVc2VySWZyYW1lRmlsdGVyVGVzdCwgQmxvY2tTdWJGcmFtZSkgeworICBCbG9ja0hvc3Qoa0lmcmFtZUhvc3QyKTsKKyAgR1VSTCBhbGxvd2VkX3VybF93aXRoX2lmcmFtZXMgPSBlbWJlZGRlZF90ZXN0X3NlcnZlcigpLT5HZXRVUkwoCisgICAgICBrRXhhbXBsZUhvc3QsICIvc3VwZXJ2aXNlZF91c2VyL3dpdGhfaWZyYW1lcy5odG1sIik7CisgIHVpX3Rlc3RfdXRpbHM6Ok5hdmlnYXRlVG9VUkwoYnJvd3NlcigpLCBhbGxvd2VkX3VybF93aXRoX2lmcmFtZXMpOworICBFWFBFQ1RfRkFMU0UoSXNJbnRlcnN0aXRpYWxCZWluZ1Nob3duKGJyb3dzZXIoKSkpOworCisgIC8vIFRoZSBmaXJzdCBpZnJhbWUncyBzb3VyY2UgaXMgfGtJZnJhbWVIb3N0MXwgYW5kIGl0IGlzIG5vdCBibG9ja2VkLiBJdCB3aWxsCisgIC8vIHN1Y2Nlc3NmdWxseSBsb2FkLgorICBhdXRvIGJsb2NrZWQgPSBHZXRCbG9ja2VkRnJhbWVzKCk7CisgIEVYUEVDVF9FUShibG9ja2VkLnNpemUoKSwgMXUpOworCisgIGludCBibG9ja2VkX2ZyYW1lX2lkID0gYmxvY2tlZFswXTsKKworICBFWFBFQ1RfVFJVRShJc0ludGVyc3RpdGlhbEJlaW5nU2hvd25JbkZyYW1lKGJsb2NrZWRfZnJhbWVfaWQpKTsKKworICBwZXJtaXNzaW9uX2NyZWF0b3IoKS0+U2V0UGVybWlzc2lvblJlc3VsdCh0cnVlKTsKKyAgUmVxdWVzdFBlcm1pc3Npb25Gcm9tRnJhbWUoYmxvY2tlZF9mcmFtZV9pZCk7CisgIEVYUEVDVF9FUShwZXJtaXNzaW9uX2NyZWF0b3IoKS0+dXJsX3JlcXVlc3RzKCkuc2l6ZSgpLCAxdSk7CisgIHN0ZDo6c3RyaW5nIHJlcXVlc3RlZF9ob3N0ID0gcGVybWlzc2lvbl9jcmVhdG9yKCktPnVybF9yZXF1ZXN0cygpWzBdLmhvc3QoKTsKKworICBFWFBFQ1RfRVEocmVxdWVzdGVkX2hvc3QsIGtJZnJhbWVIb3N0Mik7CisKKyAgV2FpdEZvck5hdmlnYXRpb25GaW5pc2hlZChibG9ja2VkWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25fY3JlYXRvcigpLT51cmxfcmVxdWVzdHMoKVswXSk7CisKKyAgRVhQRUNUX0ZBTFNFKElzSW50ZXJzdGl0aWFsQmVpbmdTaG93bkluRnJhbWUoYmxvY2tlZF9mcmFtZV9pZCkpOworfQorCitJTl9QUk9DX0JST1dTRVJfVEVTVF9GKFN1cGVydmlzZWRVc2VySWZyYW1lRmlsdGVyVGVzdCwgQmxvY2tNdWx0aXBsZVN1YkZyYW1lcykgeworICBCbG9ja0hvc3Qoa0lmcmFtZUhvc3QxKTsKKyAgQmxvY2tIb3N0KGtJZnJhbWVIb3N0Mik7CisKKyAgR1VSTCBhbGxvd2VkX3VybF93aXRoX2lmcmFtZXMgPSBlbWJlZGRlZF90ZXN0X3NlcnZlcigpLT5HZXRVUkwoCisgICAgICBrRXhhbXBsZUhvc3QsICIvc3VwZXJ2aXNlZF91c2VyL3dpdGhfaWZyYW1lcy5odG1sIik7CisgIHVpX3Rlc3RfdXRpbHM6Ok5hdmlnYXRlVG9VUkwoYnJvd3NlcigpLCBhbGxvd2VkX3VybF93aXRoX2lmcmFtZXMpOworICBFWFBFQ1RfRkFMU0UoSXNJbnRlcnN0aXRpYWxCZWluZ1Nob3duKGJyb3dzZXIoKSkpOworCisgIGF1dG8gYmxvY2tlZCA9IEdldEJsb2NrZWRGcmFtZXMoKTsKKyAgRVhQRUNUX0VRKGJsb2NrZWQuc2l6ZSgpLCAydSk7CisKKyAgaW50IGJsb2NrZWRfZnJhbWVfaWRfMSA9IGJsb2NrZWRbMF07CisgIEdVUkwgYmxvY2tlZF9mcmFtZV91cmxfMSA9IEdldEJsb2NrZWRGcmFtZVVSTChibG9ja2VkX2ZyYW1lX2lkXzEpOworCisgIGludCBibG9ja2VkX2ZyYW1lX2lkXzIgPSBibG9ja2VkWzFdOworICBHVVJMIGJsb2NrZWRfZnJhbWVfdXJsXzIgPSBHZXRCbG9ja2VkRnJhbWVVUkwoYmxvY2tlZF9mcmFtZV9pZF8yKTsKKworICBFWFBFQ1RfVFJVRShJc0ludGVyc3RpdGlhbEJlaW5nU2hvd25JbkZyYW1lKGJsb2NrZWRfZnJhbWVfaWRfMSkpOworCisgIFdlYkNvbnRlbnRzKiB0YWIgPSBicm93c2VyKCktPnRhYl9zdHJpcF9tb2RlbCgpLT5HZXRBY3RpdmVXZWJDb250ZW50cygpOworCisgIHBlcm1pc3Npb25fY3JlYXRvcigpLT5TZXRQZXJtaXNzaW9uUmVzdWx0KHRydWUpOworICBwZXJtaXNzaW9uX2NyZWF0b3IoKS0+RGVsYXlIYW5kbGluZ0Zvck5leHRSZXF1ZXN0cygpOworCisgIFJlcXVlc3RQZXJtaXNzaW9uRnJvbUZyYW1lKGJsb2NrZWRfZnJhbWVfaWRfMSk7CisgIFJlcXVlc3RQZXJtaXNzaW9uRnJvbUZyYW1lKGJsb2NrZWRfZnJhbWVfaWRfMik7CisKKyAgRVhQRUNUX0VRKHBlcm1pc3Npb25fY3JlYXRvcigpLT51cmxfcmVxdWVzdHMoKS5zaXplKCksIDJ1KTsKKyAgRVhQRUNUX0VRKHBlcm1pc3Npb25fY3JlYXRvcigpLT51cmxfcmVxdWVzdHMoKVswXSwgR1VSTChibG9ja2VkX2ZyYW1lX3VybF8xKSk7CisgIEVYUEVDVF9FUShwZXJtaXNzaW9uX2NyZWF0b3IoKS0+dXJsX3JlcXVlc3RzKClbMV0sIEdVUkwoYmxvY2tlZF9mcmFtZV91cmxfMikpOworCisgIE5hdmlnYXRpb25GaW5pc2hlZFdhaXRlciB3YWl0ZXIxKHRhYiwgYmxvY2tlZF9mcmFtZV9pZF8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja2VkX2ZyYW1lX3VybF8xKTsKKyAgTmF2aWdhdGlvbkZpbmlzaGVkV2FpdGVyIHdhaXRlcjIodGFiLCBibG9ja2VkX2ZyYW1lX2lkXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrZWRfZnJhbWVfdXJsXzIpOworCisgIHBlcm1pc3Npb25fY3JlYXRvcigpLT5IYW5kbGVEZWxheWVkUmVxdWVzdHMoKTsKKworICB3YWl0ZXIxLldhaXQoKTsKKyAgd2FpdGVyMi5XYWl0KCk7CisKKyAgRENIRUNLX0VRKEdldEJsb2NrZWRGcmFtZXMoKS5zaXplKCksIDB1KTsKK30KKwogY2xhc3MgU3VwZXJ2aXNlZFVzZXJOYXZpZ2F0aW9uVGhyb3R0bGVOb3RTdXBlcnZpc2VkVGVzdAogICAgIDogcHVibGljIFN1cGVydmlzZWRVc2VyTmF2aWdhdGlvblRocm90dGxlVGVzdCB7CiAgcHJvdGVjdGVkOgpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvc3VwZXJ2aXNlZF91c2VyL3N1cGVydmlzZWRfdXNlcl9zZXJ2aWNlLmNjIGIvY2hyb21lL2Jyb3dzZXIvc3VwZXJ2aXNlZF91c2VyL3N1cGVydmlzZWRfdXNlcl9zZXJ2aWNlLmNjCmluZGV4IGJkY2YyNDQuLjhiYTAwZTMgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3N1cGVydmlzZWRfdXNlci9zdXBlcnZpc2VkX3VzZXJfc2VydmljZS5jYworKysgYi9jaHJvbWUvYnJvd3Nlci9zdXBlcnZpc2VkX3VzZXIvc3VwZXJ2aXNlZF91c2VyX3NlcnZpY2UuY2MKQEAgLTY0LDcgKzY0LDYgQEAKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9leHRlbnNpb25zL2V4dGVuc2lvbl9zZXJ2aWNlLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvZXh0ZW5zaW9ucy9leHRlbnNpb25fdXRpbC5oIgogI2luY2x1ZGUgImV4dGVuc2lvbnMvYnJvd3Nlci9leHRlbnNpb25fcHJlZnMuaCIKLSNpbmNsdWRlICJleHRlbnNpb25zL2Jyb3dzZXIvZXh0ZW5zaW9uX3JlZ2lzdHJ5LmgiCiAjaW5jbHVkZSAiZXh0ZW5zaW9ucy9icm93c2VyL2V4dGVuc2lvbl9zeXN0ZW0uaCIKICNlbmRpZgogCkBAIC0yODUsMTIgKzI4NCw3IEBACiAgICAgICBpc19wcm9maWxlX2FjdGl2ZV8oZmFsc2UpLAogICAgICAgZGlkX2luaXRfKGZhbHNlKSwKICAgICAgIGRpZF9zaHV0ZG93bl8oZmFsc2UpLAotICAgICAgYmxhY2tsaXN0X3N0YXRlXyhCbGFja2xpc3RMb2FkU3RhdGU6Ok5PVF9MT0FERUQpCi0jaWYgQlVJTERGTEFHKEVOQUJMRV9FWFRFTlNJT05TKQotICAgICAgLAotICAgICAgcmVnaXN0cnlfb2JzZXJ2ZXJfKHRoaXMpCi0jZW5kaWYKLXsKKyAgICAgIGJsYWNrbGlzdF9zdGF0ZV8oQmxhY2tsaXN0TG9hZFN0YXRlOjpOT1RfTE9BREVEKSB7CiAgIHVybF9maWx0ZXJfLkFkZE9ic2VydmVyKHRoaXMpOwogI2lmIEJVSUxERkxBRyhFTkFCTEVfRVhURU5TSU9OUykKICAgcmVnaXN0cnlfb2JzZXJ2ZXJfLkFkZChleHRlbnNpb25zOjpFeHRlbnNpb25SZWdpc3RyeTo6R2V0KHByb2ZpbGUpKTsKQEAgLTMwMyw2ICsyOTcsMTggQEAKICAgICAgIGdfYnJvd3Nlcl9wcm9jZXNzLT5zdXBlcnZpc2VkX3VzZXJfd2hpdGVsaXN0X2luc3RhbGxlcigpLCBjbGllbnRfaWQpOwogfQogCit2b2lkIFN1cGVydmlzZWRVc2VyU2VydmljZTo6U2V0UHJpbWFyeVBlcm1pc3Npb25DcmVhdG9yRm9yVGVzdCgKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8UGVybWlzc2lvblJlcXVlc3RDcmVhdG9yPiBwZXJtaXNzaW9uX2NyZWF0b3IpIHsKKyAgaWYgKHBlcm1pc3Npb25zX2NyZWF0b3JzXy5lbXB0eSgpKSB7CisgICAgcGVybWlzc2lvbnNfY3JlYXRvcnNfLnB1c2hfYmFjayhzdGQ6Om1vdmUocGVybWlzc2lvbl9jcmVhdG9yKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gRWxzZSB0aGVyZSBhcmUgb3RoZXIgcGVybWlzc2lvbiBjcmVhdG9ycy4KKyAgcGVybWlzc2lvbnNfY3JlYXRvcnNfLmluc2VydChwZXJtaXNzaW9uc19jcmVhdG9yc18uYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocGVybWlzc2lvbl9jcmVhdG9yKSk7Cit9CisKIHZvaWQgU3VwZXJ2aXNlZFVzZXJTZXJ2aWNlOjpTZXRBY3RpdmUoYm9vbCBhY3RpdmUpIHsKICAgaWYgKGFjdGl2ZV8gPT0gYWN0aXZlKQogICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3N1cGVydmlzZWRfdXNlci9zdXBlcnZpc2VkX3VzZXJfc2VydmljZS5oIGIvY2hyb21lL2Jyb3dzZXIvc3VwZXJ2aXNlZF91c2VyL3N1cGVydmlzZWRfdXNlcl9zZXJ2aWNlLmgKaW5kZXggYTE4NDA1Ny4uYjFjOTMxZjMgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3N1cGVydmlzZWRfdXNlci9zdXBlcnZpc2VkX3VzZXJfc2VydmljZS5oCisrKyBiL2Nocm9tZS9icm93c2VyL3N1cGVydmlzZWRfdXNlci9zdXBlcnZpc2VkX3VzZXJfc2VydmljZS5oCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSAiZXh0ZW5zaW9ucy9idWlsZGZsYWdzL2J1aWxkZmxhZ3MuaCIKIAogI2lmIEJVSUxERkxBRyhFTkFCTEVfRVhURU5TSU9OUykKKyNpbmNsdWRlICJleHRlbnNpb25zL2Jyb3dzZXIvZXh0ZW5zaW9uX3JlZ2lzdHJ5LmgiCiAjaW5jbHVkZSAiZXh0ZW5zaW9ucy9icm93c2VyL2V4dGVuc2lvbl9yZWdpc3RyeV9vYnNlcnZlci5oIgogI2luY2x1ZGUgImV4dGVuc2lvbnMvYnJvd3Nlci9tYW5hZ2VtZW50X3BvbGljeS5oIgogI2VuZGlmCkBAIC00OCwxMCArNDksNiBAQAogY2xhc3MgVmVyc2lvbjsKIH0KIAotbmFtZXNwYWNlIGV4dGVuc2lvbnMgewotY2xhc3MgRXh0ZW5zaW9uUmVnaXN0cnk7Ci19Ci0KIG5hbWVzcGFjZSB1c2VyX3ByZWZzIHsKIGNsYXNzIFByZWZSZWdpc3RyeVN5bmNhYmxlOwogfQpAQCAtMTc3LDYgKzE3NCw5IEBACiAgIH0KICNlbmRpZiAgLy8gIWRlZmluZWQoT1NfQU5EUk9JRCkKIAorICB2b2lkIFNldFByaW1hcnlQZXJtaXNzaW9uQ3JlYXRvckZvclRlc3QoCisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UGVybWlzc2lvblJlcXVlc3RDcmVhdG9yPiBwZXJtaXNzaW9uX2NyZWF0b3IpOworCiAgcHJpdmF0ZToKICAgZnJpZW5kIGNsYXNzIFN1cGVydmlzZWRVc2VyU2VydmljZUV4dGVuc2lvblRlc3RCYXNlOwogICBmcmllbmQgY2xhc3MgU3VwZXJ2aXNlZFVzZXJTZXJ2aWNlRmFjdG9yeTsKQEAgLTMzOSw3ICszMzksNyBAQAogI2lmIEJVSUxERkxBRyhFTkFCTEVfRVhURU5TSU9OUykKICAgU2NvcGVkT2JzZXJ2ZXI8ZXh0ZW5zaW9uczo6RXh0ZW5zaW9uUmVnaXN0cnksCiAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnM6OkV4dGVuc2lvblJlZ2lzdHJ5T2JzZXJ2ZXI+Ci0gICAgICByZWdpc3RyeV9vYnNlcnZlcl87CisgICAgICByZWdpc3RyeV9vYnNlcnZlcl97dGhpc307CiAjZW5kaWYKIAogICBiYXNlOjpPYnNlcnZlckxpc3Q8U3VwZXJ2aXNlZFVzZXJTZXJ2aWNlT2JzZXJ2ZXI+OjpVbmNoZWNrZWQgb2JzZXJ2ZXJfbGlzdF87CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9zdXBlcnZpc2VkX3VzZXIvc3VwZXJ2aXNlZF91c2VyX3VybF9maWx0ZXIuY2MgYi9jaHJvbWUvYnJvd3Nlci9zdXBlcnZpc2VkX3VzZXIvc3VwZXJ2aXNlZF91c2VyX3VybF9maWx0ZXIuY2MKaW5kZXggY2M4MGE0NS4uMzkyOWNjYzggMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3N1cGVydmlzZWRfdXNlci9zdXBlcnZpc2VkX3VzZXJfdXJsX2ZpbHRlci5jYworKysgYi9jaHJvbWUvYnJvd3Nlci9zdXBlcnZpc2VkX3VzZXIvc3VwZXJ2aXNlZF91c2VyX3VybF9maWx0ZXIuY2MKQEAgLTU5OSwxMSArNTk5LDExIEBACiAgIGFzeW5jX3VybF9jaGVja2VyXy5yZXNldCgpOwogfQogCi12b2lkIFN1cGVydmlzZWRVc2VyVVJMRmlsdGVyOjpBZGRPYnNlcnZlcihPYnNlcnZlciogb2JzZXJ2ZXIpIGNvbnN0IHsKK3ZvaWQgU3VwZXJ2aXNlZFVzZXJVUkxGaWx0ZXI6OkFkZE9ic2VydmVyKE9ic2VydmVyKiBvYnNlcnZlcikgewogICBvYnNlcnZlcnNfLkFkZE9ic2VydmVyKG9ic2VydmVyKTsKIH0KIAotdm9pZCBTdXBlcnZpc2VkVXNlclVSTEZpbHRlcjo6UmVtb3ZlT2JzZXJ2ZXIoT2JzZXJ2ZXIqIG9ic2VydmVyKSBjb25zdCB7Cit2b2lkIFN1cGVydmlzZWRVc2VyVVJMRmlsdGVyOjpSZW1vdmVPYnNlcnZlcihPYnNlcnZlciogb2JzZXJ2ZXIpIHsKICAgb2JzZXJ2ZXJzXy5SZW1vdmVPYnNlcnZlcihvYnNlcnZlcik7CiB9CiAKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3N1cGVydmlzZWRfdXNlci9zdXBlcnZpc2VkX3VzZXJfdXJsX2ZpbHRlci5oIGIvY2hyb21lL2Jyb3dzZXIvc3VwZXJ2aXNlZF91c2VyL3N1cGVydmlzZWRfdXNlcl91cmxfZmlsdGVyLmgKaW5kZXggYjA0MWI3MDcuLjgyMzE3YTllIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9zdXBlcnZpc2VkX3VzZXIvc3VwZXJ2aXNlZF91c2VyX3VybF9maWx0ZXIuaAorKysgYi9jaHJvbWUvYnJvd3Nlci9zdXBlcnZpc2VkX3VzZXIvc3VwZXJ2aXNlZF91c2VyX3VybF9maWx0ZXIuaApAQCAtMTY0LDggKzE2NCw4IEBACiAgIC8vIHByZXNlbnQsIGFuZCByZXNldHMgdGhlIGRlZmF1bHQgYmVoYXZpb3IgdG8gImFsbG93Ii4KICAgdm9pZCBDbGVhcigpOwogCi0gIHZvaWQgQWRkT2JzZXJ2ZXIoT2JzZXJ2ZXIqIG9ic2VydmVyKSBjb25zdDsKLSAgdm9pZCBSZW1vdmVPYnNlcnZlcihPYnNlcnZlciogb2JzZXJ2ZXIpIGNvbnN0OworICB2b2lkIEFkZE9ic2VydmVyKE9ic2VydmVyKiBvYnNlcnZlcik7CisgIHZvaWQgUmVtb3ZlT2JzZXJ2ZXIoT2JzZXJ2ZXIqIG9ic2VydmVyKTsKIAogICAvLyBTZXRzIGEgZGlmZmVyZW50IHRhc2sgcnVubmVyIGZvciB0ZXN0aW5nLgogICB2b2lkIFNldEJsb2NraW5nVGFza1J1bm5lckZvclRlc3RpbmcoCkBAIC0xODcsOCArMTg3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgIHNhZmVfc2VhcmNoX2FwaTo6Q2xhc3NpZmljYXRpb24gY2xhc3NpZmljYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICBib29sIHVuY2VydGFpbikgY29uc3Q7CiAKLSAgLy8gVGhpcyBpcyBtdXRhYmxlIHRvIGFsbG93IG5vdGlmaWNhdGlvbiBpbiBjb25zdCBtZW1iZXIgZnVuY3Rpb25zLgotICBtdXRhYmxlIGJhc2U6Ok9ic2VydmVyTGlzdDxPYnNlcnZlcj46OlVuY2hlY2tlZCBvYnNlcnZlcnNfOworICBiYXNlOjpPYnNlcnZlckxpc3Q8T2JzZXJ2ZXI+OjpVbmNoZWNrZWQgb2JzZXJ2ZXJzXzsKIAogICBGaWx0ZXJpbmdCZWhhdmlvciBkZWZhdWx0X2JlaGF2aW9yXzsKICAgc3RkOjp1bmlxdWVfcHRyPENvbnRlbnRzPiBjb250ZW50c187CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci9zeW5jL3Rlc3QvaW50ZWdyYXRpb24vc2luZ2xlX2NsaWVudF9ib29rbWFya3Nfc3luY190ZXN0LmNjIGIvY2hyb21lL2Jyb3dzZXIvc3luYy90ZXN0L2ludGVncmF0aW9uL3NpbmdsZV9jbGllbnRfYm9va21hcmtzX3N5bmNfdGVzdC5jYwppbmRleCBkZTAwZTcyLi42MDQ0ZmNmIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci9zeW5jL3Rlc3QvaW50ZWdyYXRpb24vc2luZ2xlX2NsaWVudF9ib29rbWFya3Nfc3luY190ZXN0LmNjCisrKyBiL2Nocm9tZS9icm93c2VyL3N5bmMvdGVzdC9pbnRlZ3JhdGlvbi9zaW5nbGVfY2xpZW50X2Jvb2ttYXJrc19zeW5jX3Rlc3QuY2MKQEAgLTc4Nyw2ICs3ODcsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypSRU1PVEVfSU5JVElBTF9VUERBVEU9Ki81KSk7CiB9CiAKKy8vIFRPRE8oY3JidWcuY29tLzEwMTIyMjIpOiByZS1lbmFibGUgdGhpcyB0ZXN0IG9uIGFsbCBidWlsZGVycyBvbmNlIGZsYWtpbmVzcworLy8gaXMgYWRkcmVzc2VkLgorI2lmIGRlZmluZWQoVEhSRUFEX1NBTklUSVpFUikKKyNkZWZpbmUgTUFZQkVfQXBwbHlSZW1vdGVDcmVhdGlvbldpdGhWYWxpZEdVSUQgXAorICBESVNBQkxFRF9BcHBseVJlbW90ZUNyZWF0aW9uV2l0aFZhbGlkR1VJRAorI2Vsc2UKKyNkZWZpbmUgTUFZQkVfQXBwbHlSZW1vdGVDcmVhdGlvbldpdGhWYWxpZEdVSUQgQXBwbHlSZW1vdGVDcmVhdGlvbldpdGhWYWxpZEdVSUQKKyNlbmRpZgogSU5fUFJPQ19CUk9XU0VSX1RFU1RfUChTaW5nbGVDbGllbnRCb29rbWFya3NTeW5jVGVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgQXBwbHlSZW1vdGVDcmVhdGlvbldpdGhWYWxpZEdVSUQpIHsKICAgLy8gVGhpcyB0ZXN0IGlzIG9ubHkgcmVsZXZhbnQgZm9yIFVTUyBjb2RlIHBhdGguCkBAIC05OTEsOCArOTk5LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmF0b3JfY2xpZW50X2l0ZW1faWQpKTsKIH0KIAorLy8gVE9ETyhjcmJ1Zy5jb20vMTAxMjIyMyk6IHJlLWVuYWJsZSB0aGlzIHRlc3Qgb24gYWxsIGJ1aWxkZXJzIG9uY2UgZmxha2luZXNzCisvLyBpcyBhZGRyZXNzZWQuCisjaWYgZGVmaW5lZChUSFJFQURfU0FOSVRJWkVSKQorI2RlZmluZSBNQVlCRV9BcHBseVJlbW90ZVVwZGF0ZVdpdGhWYWxpZEdVSUQgXAorICBESVNBQkxFRF9BcHBseVJlbW90ZVVwZGF0ZVdpdGhWYWxpZEdVSUQKKyNlbHNlCisjZGVmaW5lIE1BWUJFX0FwcGx5UmVtb3RlVXBkYXRlV2l0aFZhbGlkR1VJRCBBcHBseVJlbW90ZVVwZGF0ZVdpdGhWYWxpZEdVSUQKKyNlbmRpZgogSU5fUFJPQ19CUk9XU0VSX1RFU1RfUChTaW5nbGVDbGllbnRCb29rbWFya3NTeW5jVGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgQXBwbHlSZW1vdGVVcGRhdGVXaXRoVmFsaWRHVUlEKSB7CisgICAgICAgICAgICAgICAgICAgICAgIE1BWUJFX0FwcGx5UmVtb3RlVXBkYXRlV2l0aFZhbGlkR1VJRCkgewogICAvLyBUaGlzIHRlc3QgaXMgb25seSByZWxldmFudCBmb3IgVVNTIGNvZGUgcGF0aCBhbmQgd2hlbiBCb29rbWFya05vZGUgR1VJRAogICAvLyByZXBsYWNlbWVudCBpcyBlbmFibGVkLgogICBpZiAoIWJhc2U6OkZlYXR1cmVMaXN0OjpJc0VuYWJsZWQoc3dpdGNoZXM6OmtTeW5jVVNTQm9va21hcmtzKSkKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3RyYW5zbGF0ZS90cmFuc2xhdGVfZmFrZV9wYWdlLmNjIGIvY2hyb21lL2Jyb3dzZXIvdHJhbnNsYXRlL3RyYW5zbGF0ZV9mYWtlX3BhZ2UuY2MKaW5kZXggYzJjNGQwYy4uZDYyMjg2YSAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvdHJhbnNsYXRlL3RyYW5zbGF0ZV9mYWtlX3BhZ2UuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvdHJhbnNsYXRlL3RyYW5zbGF0ZV9mYWtlX3BhZ2UuY2MKQEAgLTQ4LDggKzQ4LDYgQEAKIAogLy8gdHJhbnNsYXRlOjptb2pvbTo6UGFnZSBpbXBsZW1lbnRhdGlvbi4KIHZvaWQgRmFrZVBhZ2VJbXBsOjpUcmFuc2xhdGUoY29uc3Qgc3RkOjpzdHJpbmcmIHRyYW5zbGF0ZV9zY3JpcHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcms6Om1vam9tOjpVUkxMb2FkZXJGYWN0b3J5UHRyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnVzZWRfbG9hZGVyX2ZhY3RvcnlfZm9yX3RyYW5zbGF0ZV9zY3JpcHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VfbGFuZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldF9sYW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGVDYWxsYmFjayBjYWxsYmFjaykgewpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvdHJhbnNsYXRlL3RyYW5zbGF0ZV9mYWtlX3BhZ2UuaCBiL2Nocm9tZS9icm93c2VyL3RyYW5zbGF0ZS90cmFuc2xhdGVfZmFrZV9wYWdlLmgKaW5kZXggNjY4YzcwNjguLmYyYTBhZGEgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3RyYW5zbGF0ZS90cmFuc2xhdGVfZmFrZV9wYWdlLmgKKysrIGIvY2hyb21lL2Jyb3dzZXIvdHJhbnNsYXRlL3RyYW5zbGF0ZV9mYWtlX3BhZ2UuaApAQCAtNDgsMTIgKzQ4LDEwIEBACiAgIG1vam86OlBlbmRpbmdSZW1vdGU8dHJhbnNsYXRlOjptb2pvbTo6UGFnZT4gQmluZFRvTmV3UGFnZVJlbW90ZSgpOwogCiAgIC8vIHRyYW5zbGF0ZTo6bW9qb206OlBhZ2UgaW1wbGVtZW50YXRpb24uCi0gIHZvaWQgVHJhbnNsYXRlKAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRyYW5zbGF0ZV9zY3JpcHQsCi0gICAgICBuZXR3b3JrOjptb2pvbTo6VVJMTG9hZGVyRmFjdG9yeVB0ciBsb2FkZXJfZmFjdG9yeV9mb3JfdHJhbnNsYXRlX3NjcmlwdCwKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VfbGFuZywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0YXJnZXRfbGFuZywKLSAgICAgIFRyYW5zbGF0ZUNhbGxiYWNrIGNhbGxiYWNrKSBvdmVycmlkZTsKKyAgdm9pZCBUcmFuc2xhdGUoY29uc3Qgc3RkOjpzdHJpbmcmIHRyYW5zbGF0ZV9zY3JpcHQsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VfbGFuZywKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldF9sYW5nLAorICAgICAgICAgICAgICAgICBUcmFuc2xhdGVDYWxsYmFjayBjYWxsYmFjaykgb3ZlcnJpZGU7CiAKICAgdm9pZCBSZXZlcnRUcmFuc2xhdGlvbigpIG92ZXJyaWRlOwogCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci91aS9CVUlMRC5nbiBiL2Nocm9tZS9icm93c2VyL3VpL0JVSUxELmduCmluZGV4IDI0ODkwMTEzMC4uNGQwMWVjZiAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvdWkvQlVJTEQuZ24KKysrIGIvY2hyb21lL2Jyb3dzZXIvdWkvQlVJTEQuZ24KQEAgLTQ1LDYgKzQ1LDcgQEAKICAgICAiYXBwX2xpc3QvYXBwX2xpc3RfdXRpbC5oIiwKIAogICAgICMgQWxsIG90aGVyIGJyb3dzZXIvdWkvYXBwX2xpc3QgZmlsZXMgZ28gdW5kZXIgZW5hYmxlX2FwcF9saXN0IGJlbG93LgorICAgICJhdXRvZmlsbC9hdXRvZmlsbF9idWJibGVfaGFuZGxlci5oIiwKICAgICAiYXV0b2ZpbGwvYXV0b2ZpbGxfcG9wdXBfY29udHJvbGxlci5oIiwKICAgICAiYXV0b2ZpbGwvYXV0b2ZpbGxfcG9wdXBfY29udHJvbGxlcl9pbXBsLmNjIiwKICAgICAiYXV0b2ZpbGwvYXV0b2ZpbGxfcG9wdXBfY29udHJvbGxlcl9pbXBsLmgiLApAQCAtNzAsNiArNzEsOCBAQAogICAgICJhdXRvZmlsbC9wb3B1cF9jb250cm9sbGVyX2NvbW1vbi5oIiwKICAgICAiYXV0b2ZpbGwvcG9wdXBfdmlld19jb21tb24uY2MiLAogICAgICJhdXRvZmlsbC9wb3B1cF92aWV3X2NvbW1vbi5oIiwKKyAgICAiYXV0b2ZpbGwvdGVzdC90ZXN0X2F1dG9maWxsX2J1YmJsZV9oYW5kbGVyLmNjIiwKKyAgICAiYXV0b2ZpbGwvdGVzdC90ZXN0X2F1dG9maWxsX2J1YmJsZV9oYW5kbGVyLmgiLAogICAgICJibG9ja2VkX2NvbnRlbnQvYmxvY2tlZF93aW5kb3dfcGFyYW1zLmNjIiwKICAgICAiYmxvY2tlZF9jb250ZW50L2Jsb2NrZWRfd2luZG93X3BhcmFtcy5oIiwKICAgICAiYmxvY2tlZF9jb250ZW50L2xpc3RfaXRlbV9wb3NpdGlvbi5jYyIsCkBAIC0yNjAzLDYgKzI2MDYsOCBAQAogICAgICAgInZpZXdzL2FwcHMvYXBwX2luZm9fZGlhbG9nL2FwcF9pbmZvX3N1bW1hcnlfcGFuZWwuaCIsCiAgICAgICAidmlld3MvYXBwcy9jaHJvbWVfbmF0aXZlX2FwcF93aW5kb3dfdmlld3MuY2MiLAogICAgICAgInZpZXdzL2FwcHMvY2hyb21lX25hdGl2ZV9hcHBfd2luZG93X3ZpZXdzLmgiLAorICAgICAgInZpZXdzL2F1dG9maWxsL2F1dG9maWxsX2J1YmJsZV9oYW5kbGVyX2ltcGwuY2MiLAorICAgICAgInZpZXdzL2F1dG9maWxsL2F1dG9maWxsX2J1YmJsZV9oYW5kbGVyX2ltcGwuaCIsCiAgICAgICAidmlld3MvYXV0b2ZpbGwvYXV0b2ZpbGxfcG9wdXBfYmFzZV92aWV3LmNjIiwKICAgICAgICJ2aWV3cy9hdXRvZmlsbC9hdXRvZmlsbF9wb3B1cF9iYXNlX3ZpZXcuaCIsCiAgICAgICAidmlld3MvYXV0b2ZpbGwvYXV0b2ZpbGxfcG9wdXBfdmlld19uYXRpdmVfdmlld3MuY2MiLApkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvdWkvYXBwX2xpc3QvYXBwX2xpc3RfY2xpZW50X2ltcGwuaCBiL2Nocm9tZS9icm93c2VyL3VpL2FwcF9saXN0L2FwcF9saXN0X2NsaWVudF9pbXBsLmgKaW5kZXggZmM1N2M2MDAuLjdhNjUwNGMgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3VpL2FwcF9saXN0L2FwcF9saXN0X2NsaWVudF9pbXBsLmgKKysrIGIvY2hyb21lL2Jyb3dzZXIvdWkvYXBwX2xpc3QvYXBwX2xpc3RfY2xpZW50X2ltcGwuaApAQCAtMTc4LDcgKzE3OCw3IEBACiAgIHN0ZDo6dW5pcXVlX3B0cjxhcHBfbGlzdDo6U2VhcmNoQ29udHJvbGxlcj4gc2VhcmNoX2NvbnRyb2xsZXJfOwogICBzdGQ6OnVuaXF1ZV9wdHI8QXBwU3luY1VJU3RhdGVXYXRjaGVyPiBhcHBfc3luY191aV9zdGF0ZV93YXRjaGVyXzsKIAotICBTY29wZWRPYnNlcnZlcjxUZW1wbGF0ZVVSTFNlcnZpY2UsIEFwcExpc3RDbGllbnRJbXBsPgorICBTY29wZWRPYnNlcnZlcjxUZW1wbGF0ZVVSTFNlcnZpY2UsIFRlbXBsYXRlVVJMU2VydmljZU9ic2VydmVyPgogICAgICAgdGVtcGxhdGVfdXJsX3NlcnZpY2Vfb2JzZXJ2ZXJfe3RoaXN9OwogCiAgIGFzaDo6QXBwTGlzdENvbnRyb2xsZXIqIGFwcF9saXN0X2NvbnRyb2xsZXJfID0gbnVsbHB0cjsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL2FwcF9saXN0L2FyYy9hcmNfYXBwX3Rlc3QuY2MgYi9jaHJvbWUvYnJvd3Nlci91aS9hcHBfbGlzdC9hcmMvYXJjX2FwcF90ZXN0LmNjCmluZGV4IDFlZmVjNjguLjYwMzgyNjFmNSAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvdWkvYXBwX2xpc3QvYXJjL2FyY19hcHBfdGVzdC5jYworKysgYi9jaHJvbWUvYnJvd3Nlci91aS9hcHBfbGlzdC9hcmMvYXJjX2FwcF90ZXN0LmNjCkBAIC0xMjIsMTUgKzEyMiwxNiBAQAogICAgICAgYXJjOjpTZXRBcmNQbGF5U3RvcmVFbmFibGVkRm9yUHJvZmlsZShwcm9maWxlXywgdHJ1ZSk7CiAgICAgaWYgKCFhcmM6OklzQXJjUGxheVN0b3JlRW5hYmxlZFByZWZlcmVuY2VNYW5hZ2VkRm9yUHJvZmlsZShwcm9maWxlXykpCiAgICAgICBFWFBFQ1RfVFJVRShhcmNfc2Vzc2lvbl9tYW5hZ2VyXy0+ZW5hYmxlX3JlcXVlc3RlZCgpKTsKLSAgfQogCi0gIGFwcF9pbnN0YW5jZV8gPSBzdGQ6Om1ha2VfdW5pcXVlPGFyYzo6RmFrZUFwcEluc3RhbmNlPihhcmNfYXBwX2xpc3RfcHJlZl8pOwotICBhcmNfc2VydmljZV9tYW5hZ2VyXy0+YXJjX2JyaWRnZV9zZXJ2aWNlKCktPmFwcCgpLT5TZXRJbnN0YW5jZSgKLSAgICAgIGFwcF9pbnN0YW5jZV8uZ2V0KCkpOwotICAvLyBUT0RPKGtobWVsKTogUmVzb2x2ZSB0aGlzIGdyYWNlZnVsbHkuIFNldCBvZiBkZWZhdWx0IGFwcCB0ZXN0cyBkb2VzIG5vdAotICAvLyBleHBlY3Qgd2FpdGluZyBpbiBBcmNBcHBUZXN0IHNldHVwLgotICBpZiAod2FpdF9kZWZhdWx0X2FwcHNfKQotICAgIFdhaXRGb3JJbnN0YW5jZVJlYWR5KGFyY19zZXJ2aWNlX21hbmFnZXJfLT5hcmNfYnJpZGdlX3NlcnZpY2UoKS0+YXBwKCkpOworICAgIGFwcF9pbnN0YW5jZV8gPSBzdGQ6Om1ha2VfdW5pcXVlPGFyYzo6RmFrZUFwcEluc3RhbmNlPihhcmNfYXBwX2xpc3RfcHJlZl8pOworICAgIGFyY19zZXJ2aWNlX21hbmFnZXJfLT5hcmNfYnJpZGdlX3NlcnZpY2UoKS0+YXBwKCktPlNldEluc3RhbmNlKAorICAgICAgICBhcHBfaW5zdGFuY2VfLmdldCgpKTsKKworICAgIC8vIFRPRE8oa2htZWwpOiBSZXNvbHZlIHRoaXMgZ3JhY2VmdWxseS4gU2V0IG9mIGRlZmF1bHQgYXBwIHRlc3RzIGRvZXMgbm90CisgICAgLy8gZXhwZWN0IHdhaXRpbmcgaW4gQXJjQXBwVGVzdCBzZXR1cC4KKyAgICBpZiAod2FpdF9kZWZhdWx0X2FwcHNfKQorICAgICAgV2FpdEZvckluc3RhbmNlUmVhZHkoYXJjX3NlcnZpY2VfbWFuYWdlcl8tPmFyY19icmlkZ2Vfc2VydmljZSgpLT5hcHAoKSk7CisgIH0KIAogICAvLyBFbnN1cmUgdGhhdCB0aGUgc2luZ2xldG9uIGFwcHM6OkFyY0FwcHMgaXMgY29uc3RydWN0ZWQuCiAgIGlmIChiYXNlOjpGZWF0dXJlTGlzdDo6SXNFbmFibGVkKGZlYXR1cmVzOjprQXBwU2VydmljZUFzaCkpCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci91aS9hcHBfbGlzdC9hcmMvYXJjX2FwcF91dGlscy5jYyBiL2Nocm9tZS9icm93c2VyL3VpL2FwcF9saXN0L2FyYy9hcmNfYXBwX3V0aWxzLmNjCmluZGV4IDk5NmI2ZjMuLjk2MWI3ODM5IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS9hcHBfbGlzdC9hcmMvYXJjX2FwcF91dGlscy5jYworKysgYi9jaHJvbWUvYnJvd3Nlci91aS9hcHBfbGlzdC9hcmMvYXJjX2FwcF91dGlscy5jYwpAQCAtMjUyLDYgKzI1Miw4IEBACiBjb25zdCBjaGFyIGtQbGF5U3RvcmVBY3Rpdml0eVtdID0gImNvbS5hbmRyb2lkLnZlbmRpbmcuQXNzZXRCcm93c2VyQWN0aXZpdHkiOwogY29uc3QgY2hhciBrU2V0dGluZ3NBcHBJZFtdID0gIm1jb25ib2VsZWxoanBrYmRoaGlpamtnY2ltb2FuZ2RqIjsKIGNvbnN0IGNoYXIga0luaXRpYWxTdGFydFBhcmFtW10gPSAiUy5vcmcuY2hyb21pdW0uYXJjLnN0YXJ0X3R5cGU9aW5pdGlhbFN0YXJ0IjsKK2NvbnN0IGNoYXIga1JlcXVlc3RTdGFydFRpbWVQYXJhbVRlbXBsYXRlW10gPQorICAgICJTLm9yZy5jaHJvbWl1bS5hcmMucmVxdWVzdC5zdGFydD0lbGQiOwogY29uc3RleHByIGNoYXIga1NldHRpbmdzQXBwUGFja2FnZVtdID0gImNvbS5hbmRyb2lkLnNldHRpbmdzIjsKIGNvbnN0IGNoYXIga1NldHRpbmdzQXBwRG9tYWluVXJsQWN0aXZpdHlbXSA9CiAgICAgImNvbS5hbmRyb2lkLnNldHRpbmdzLlNldHRpbmdzJE1hbmFnZURvbWFpblVybHNBY3Rpdml0eSI7CkBAIC0zMzUsNiArMzM3LDcgQEAKIAogICBBcmNBcHBMaXN0UHJlZnMqIHByZWZzID0gQXJjQXBwTGlzdFByZWZzOjpHZXQoY29udGV4dCk7CiAgIHN0ZDo6dW5pcXVlX3B0cjxBcmNBcHBMaXN0UHJlZnM6OkFwcEluZm8+IGFwcF9pbmZvID0gcHJlZnMtPkdldEFwcChhcHBfaWQpOworICBiYXNlOjpPcHRpb25hbDxzdGQ6OnN0cmluZz4gbGF1bmNoX2ludGVudF90b19zZW5kID0gc3RkOjptb3ZlKGxhdW5jaF9pbnRlbnQpOwogICBpZiAoYXBwX2luZm8gJiYgIWFwcF9pbmZvLT5yZWFkeSkgewogICAgIGlmICghSXNBcmNQbGF5U3RvcmVFbmFibGVkRm9yUHJvZmlsZShwcm9maWxlKSkgewogICAgICAgaWYgKHByZWZzLT5Jc0RlZmF1bHQoYXBwX2lkKSkgewpAQCAtMzc5LDggKzM4Miw5IEBACiAgICAgLy8gY2hyb21lX2NvbnRyb2xsZXIgbWF5IGJlIG51bGwgaW4gdGVzdHMuCiAgICAgaWYgKGNocm9tZV9jb250cm9sbGVyKSB7CiAgICAgICBjaHJvbWVfY29udHJvbGxlci0+R2V0U2hlbGZTcGlubmVyQ29udHJvbGxlcigpLT5BZGRTcGlubmVyVG9TaGVsZigKLSAgICAgICAgICBhcHBfaWQsIHN0ZDo6bWFrZV91bmlxdWU8QXJjU2hlbGZTcGlubmVySXRlbUNvbnRyb2xsZXI+KAotICAgICAgICAgICAgICAgICAgICAgIGFwcF9pZCwgZXZlbnRfZmxhZ3MsIEdldFZhbGlkRGlzcGxheUlkKGRpc3BsYXlfaWQpKSk7CisgICAgICAgICAgYXBwX2lkLAorICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QXJjU2hlbGZTcGlubmVySXRlbUNvbnRyb2xsZXI+KAorICAgICAgICAgICAgICBhcHBfaWQsIGV2ZW50X2ZsYWdzLCB1c2VyX2FjdGlvbiwgR2V0VmFsaWREaXNwbGF5SWQoZGlzcGxheV9pZCkpKTsKIAogICAgICAgLy8gT24gc29tZSBib2FyZHMsIEFSQyBpcyBib290ZWQgd2l0aCBhIHJlc3RyaWN0ZWQgc2V0IG9mIHJlc291cmNlcyBieQogICAgICAgLy8gZGVmYXVsdCB0byBhdm9pZCBzbG93aW5nIGRvd24gQ2hyb21lJ3MgdXNlciBzZXNzaW9uIHJlc3RvcmF0aW9uLgpAQCAtMzkwLDEwICszOTQsMTggQEAKICAgICB9CiAgICAgcHJlZnMtPlNldExhc3RMYXVuY2hUaW1lKGFwcF9pZCk7CiAgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSBpZiAoYXBwX2lkID09IGtQbGF5U3RvcmVBcHBJZCAmJiAhbGF1bmNoX2ludGVudF90b19zZW5kKSB7CisgICAgLy8gUmVjb3JkIGxhdW5jaCByZXF1ZXN0IHRpbWUgaW4gb3JkZXIgdG8gdHJhY2sgUGxheSBTdG9yZSBkZWZhdWx0IGxhdW5jaAorICAgIC8vIHBlcmZvcm1hbmNlLgorICAgIGxhdW5jaF9pbnRlbnRfdG9fc2VuZCA9IEdldExhdW5jaEludGVudCgKKyAgICAgICAga1BsYXlTdG9yZVBhY2thZ2UsIGtQbGF5U3RvcmVBY3Rpdml0eSwKKyAgICAgICAge2Jhc2U6OlN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgIGtSZXF1ZXN0U3RhcnRUaW1lUGFyYW1UZW1wbGF0ZSwKKyAgICAgICAgICAgIChiYXNlOjpUaW1lVGlja3M6Ok5vdygpIC0gYmFzZTo6VGltZVRpY2tzKCkpLkluTWlsbGlzZWNvbmRzKCkpfSk7CiAgIH0KIAogICBhcmM6OkFyY0Jvb3RQaGFzZU1vbml0b3JCcmlkZ2U6OlJlY29yZEZpcnN0QXBwTGF1bmNoRGVsYXlVTUEoY29udGV4dCk7Ci0gIHJldHVybiBMYXVuY2goY29udGV4dCwgYXBwX2lkLCBsYXVuY2hfaW50ZW50LCBldmVudF9mbGFncywKKyAgcmV0dXJuIExhdW5jaChjb250ZXh0LCBhcHBfaWQsIGxhdW5jaF9pbnRlbnRfdG9fc2VuZCwgZXZlbnRfZmxhZ3MsCiAgICAgICAgICAgICAgICAgR2V0VmFsaWREaXNwbGF5SWQoZGlzcGxheV9pZCkpOwogfQogCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci91aS9hcHBfbGlzdC9hcmMvYXJjX2FwcF91dGlscy5oIGIvY2hyb21lL2Jyb3dzZXIvdWkvYXBwX2xpc3QvYXJjL2FyY19hcHBfdXRpbHMuaAppbmRleCA4OGIxNjYyZS4uMjE0MzA1NCAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvdWkvYXBwX2xpc3QvYXJjL2FyY19hcHBfdXRpbHMuaAorKysgYi9jaHJvbWUvYnJvd3Nlci91aS9hcHBfbGlzdC9hcmMvYXJjX2FwcF91dGlscy5oCkBAIC00MCw2ICs0MCw3IEBACiBleHRlcm4gY29uc3QgY2hhciBrUGxheVN0b3JlQWN0aXZpdHlbXTsKIGV4dGVybiBjb25zdCBjaGFyIGtTZXR0aW5nc0FwcElkW107CiBleHRlcm4gY29uc3QgY2hhciBrSW5pdGlhbFN0YXJ0UGFyYW1bXTsKK2V4dGVybiBjb25zdCBjaGFyIGtSZXF1ZXN0U3RhcnRUaW1lUGFyYW1UZW1wbGF0ZVtdOwogZXh0ZXJuIGNvbnN0IGNoYXIga1NldHRpbmdzQXBwRG9tYWluVXJsQWN0aXZpdHlbXTsKIAogLy8gUmVwcmVzZW50cyB1bnBhcnNlZCBpbnRlbnQuCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci91aS9hcHBfbGlzdC9zZWFyY2gvYXBwX3NlcnZpY2VfYXBwX3Jlc3VsdC5jYyBiL2Nocm9tZS9icm93c2VyL3VpL2FwcF9saXN0L3NlYXJjaC9hcHBfc2VydmljZV9hcHBfcmVzdWx0LmNjCmluZGV4IDRmZjE4NjIuLjlkMzZlMmMgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3VpL2FwcF9saXN0L3NlYXJjaC9hcHBfc2VydmljZV9hcHBfcmVzdWx0LmNjCisrKyBiL2Nocm9tZS9icm93c2VyL3VpL2FwcF9saXN0L3NlYXJjaC9hcHBfc2VydmljZV9hcHBfcmVzdWx0LmNjCkBAIC03LDYgKzcsNyBAQAogI2luY2x1ZGUgImFzaC9wdWJsaWMvY3BwL2FwcF9saXN0L2FwcF9saXN0X2NvbmZpZy5oIgogI2luY2x1ZGUgImFzaC9wdWJsaWMvY3BwL2FwcF9saXN0L2FwcF9saXN0X3R5cGVzLmgiCiAjaW5jbHVkZSAiYmFzZS9iaW5kLmgiCisjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvYXBwcy9hcHBfc2VydmljZS9hcHBfc2VydmljZV9tZXRyaWNzLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvYXBwcy9hcHBfc2VydmljZS9hcHBfc2VydmljZV9wcm94eS5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL2FwcHMvYXBwX3NlcnZpY2UvYXBwX3NlcnZpY2VfcHJveHlfZmFjdG9yeS5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL2FwcF9saXN0L2FwcF9saXN0X2NsaWVudF9pbXBsLmgiCkBAIC01MiwxMCArNTMsNyBAQAogICAgICAgLy8gVE9ETyhjcmJ1Zy5jb20vODI2OTgyKTogSXMgdGhpcyBTZXRSZXN1bHRUeXBlIGNhbGwgbmVjZXNzYXJ5Pz8gRG9lcwogICAgICAgLy8gYW55b25lIGNhcmUgYWJvdXQgdGhlIGtJbnRlcm5hbEFwcCB2cyBrSW5zdGFsbGVkQXBwIGRpc3RpbmN0aW9uPwogICAgICAgU2V0UmVzdWx0VHlwZShSZXN1bHRUeXBlOjprSW50ZXJuYWxBcHApOwotICAgICAgLy8gVE9ETyhjcmJ1Zy5jb20vODI2OTgyKTogTW92ZSB0aGlzIGZyb20gdGhlIEFwcCBTZXJ2aWNlIGNhbGxlciB0bwotICAgICAgLy8gY2FsbGVlLCBjbG9zZXIgdG8gd2hlcmUgb3RoZXIgaGlzdG9ncmFtcyBhcmUgdXBkYXRlZCBpbgotICAgICAgLy8gQnVpbHRJbkNocm9tZU9zQXBwczo6TGF1bmNoPz8KLSAgICAgIEludGVybmFsQXBwUmVzdWx0OjpSZWNvcmRTaG93SGlzdG9ncmFtKGFwcF9pZCk7CisgICAgICBhcHBzOjpSZWNvcmRCdWlsdEluQXBwU2VhcmNoUmVzdWx0KGFwcF9pZCk7CiAgICAgICBicmVhazsKICAgICBjYXNlIGFwcHM6Om1vam9tOjpBcHBUeXBlOjprRXh0ZW5zaW9uOgogICAgICAgLy8gVE9ETyhjcmJ1Zy5jb20vODI2OTgyKTogd2h5IGRvIHdlIHBhc3MgdGhlIFVSTCBhbmQgbm90IHRoZSBhcHBfaWQ/PwpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvdWkvYXBwX2xpc3Qvc2VhcmNoL3plcm9fc3RhdGVfZmlsZV9wcm92aWRlci5jYyBiL2Nocm9tZS9icm93c2VyL3VpL2FwcF9saXN0L3NlYXJjaC96ZXJvX3N0YXRlX2ZpbGVfcHJvdmlkZXIuY2MKaW5kZXggOTliMWQyN2IuLjhlOTE2MTIgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3VpL2FwcF9saXN0L3NlYXJjaC96ZXJvX3N0YXRlX2ZpbGVfcHJvdmlkZXIuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvdWkvYXBwX2xpc3Qvc2VhcmNoL3plcm9fc3RhdGVfZmlsZV9wcm92aWRlci5jYwpAQCAtMTMsNyArMTMsNiBAQAogI2luY2x1ZGUgImJhc2UvdGFzay90YXNrX3RyYWl0cy5oIgogI2luY2x1ZGUgImJhc2UvdGFza19ydW5uZXJfdXRpbC5oIgogI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3Njb3BlZF9ibG9ja2luZ19jYWxsLmgiCi0jaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvZmlsZV9tYW5hZ2VyL2ZpbGVfdGFza3Nfbm90aWZpZXIuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9wcm9maWxlcy9wcm9maWxlX2hlbHBlci5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3Byb2ZpbGVzL3Byb2ZpbGUuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS9hcHBfbGlzdC9zZWFyY2gvc2VhcmNoX3Jlc3VsdF9yYW5rZXIvcmVjdXJyZW5jZV9yYW5rZXIuaCIKQEAgLTQ5LDcgKzQ4LDcgQEAKIH0gIC8vIG5hbWVzcGFjZQogCiBaZXJvU3RhdGVGaWxlUHJvdmlkZXI6Olplcm9TdGF0ZUZpbGVQcm92aWRlcihQcm9maWxlKiBwcm9maWxlKQotICAgIDogcHJvZmlsZV8ocHJvZmlsZSksIGZpbGVfdGFza3Nfb2JzZXJ2ZXJfKHRoaXMpLCB3ZWFrX2ZhY3RvcnlfKHRoaXMpIHsKKyAgICA6IHByb2ZpbGVfKHByb2ZpbGUpIHsKICAgRENIRUNLKHByb2ZpbGVfKTsKICAgdGFza19ydW5uZXJfID0gYmFzZTo6Q3JlYXRlU2VxdWVuY2VkVGFza1J1bm5lcigKICAgICAgIHtiYXNlOjpUaHJlYWRQb29sKCksIGJhc2U6OlRhc2tQcmlvcml0eTo6QkVTVF9FRkZPUlQsIGJhc2U6Ok1heUJsb2NrKCksCkBAIC04MCw3ICs3OSw3IEBACiB2b2lkIFplcm9TdGF0ZUZpbGVQcm92aWRlcjo6U3RhcnQoY29uc3QgYmFzZTo6c3RyaW5nMTYmIHF1ZXJ5KSB7CiAgIHF1ZXJ5X3N0YXJ0X3RpbWVfID0gYmFzZTo6VGltZVRpY2tzOjpOb3coKTsKICAgQ2xlYXJSZXN1bHRzU2lsZW50bHkoKTsKLSAgaWYgKCFxdWVyeS5lbXB0eSgpKQorICBpZiAoIWZpbGVzX3Jhbmtlcl8gfHwgIXF1ZXJ5LmVtcHR5KCkpCiAgICAgcmV0dXJuOwogCiAgIGJhc2U6OlBvc3RUYXNrQW5kUmVwbHlXaXRoUmVzdWx0KApkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvdWkvYXBwX2xpc3Qvc2VhcmNoL3plcm9fc3RhdGVfZmlsZV9wcm92aWRlci5oIGIvY2hyb21lL2Jyb3dzZXIvdWkvYXBwX2xpc3Qvc2VhcmNoL3plcm9fc3RhdGVfZmlsZV9wcm92aWRlci5oCmluZGV4IDcxYTJlNmUxLi43NmFkNzg5IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS9hcHBfbGlzdC9zZWFyY2gvemVyb19zdGF0ZV9maWxlX3Byb3ZpZGVyLmgKKysrIGIvY2hyb21lL2Jyb3dzZXIvdWkvYXBwX2xpc3Qvc2VhcmNoL3plcm9fc3RhdGVfZmlsZV9wcm92aWRlci5oCkBAIC0xNywxNyArMTcsMTIgQEAKICNpbmNsdWRlICJiYXNlL3NlcXVlbmNlZF90YXNrX3J1bm5lci5oIgogI2luY2x1ZGUgImJhc2Uvc3RyaW5ncy9zdHJpbmcxNi5oIgogI2luY2x1ZGUgImJhc2UvdGltZS90aW1lLmgiCisjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvY2hyb21lb3MvZmlsZV9tYW5hZ2VyL2ZpbGVfdGFza3Nfbm90aWZpZXIuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9maWxlX21hbmFnZXIvZmlsZV90YXNrc19vYnNlcnZlci5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL2FwcF9saXN0L3NlYXJjaC9zZWFyY2hfcHJvdmlkZXIuaCIKIAogY2xhc3MgUHJvZmlsZTsKIAotbmFtZXNwYWNlIGZpbGVfbWFuYWdlciB7Ci1uYW1lc3BhY2UgZmlsZV90YXNrcyB7Ci1jbGFzcyBGaWxlVGFza3NOb3RpZmllcjsKLX0KLX0gIC8vIG5hbWVzcGFjZSBmaWxlX21hbmFnZXIKLQogbmFtZXNwYWNlIGFwcF9saXN0IHsKIG5hbWVzcGFjZSBpbnRlcm5hbCB7CiAKQEAgLTY5LDEyICs2NCwxMiBAQAogCiAgIFNjb3BlZE9ic2VydmVyPGZpbGVfbWFuYWdlcjo6ZmlsZV90YXNrczo6RmlsZVRhc2tzTm90aWZpZXIsCiAgICAgICAgICAgICAgICAgIGZpbGVfbWFuYWdlcjo6ZmlsZV90YXNrczo6RmlsZVRhc2tzT2JzZXJ2ZXI+Ci0gICAgICBmaWxlX3Rhc2tzX29ic2VydmVyXzsKKyAgICAgIGZpbGVfdGFza3Nfb2JzZXJ2ZXJfe3RoaXN9OwogCiAgIFNFUVVFTkNFX0NIRUNLRVIoc2VxdWVuY2VfY2hlY2tlcl8pOwogCiAgIHNjb3BlZF9yZWZwdHI8YmFzZTo6U2VxdWVuY2VkVGFza1J1bm5lcj4gdGFza19ydW5uZXJfOwotICBiYXNlOjpXZWFrUHRyRmFjdG9yeTxaZXJvU3RhdGVGaWxlUHJvdmlkZXI+IHdlYWtfZmFjdG9yeV87CisgIGJhc2U6OldlYWtQdHJGYWN0b3J5PFplcm9TdGF0ZUZpbGVQcm92aWRlcj4gd2Vha19mYWN0b3J5X3t0aGlzfTsKIAogICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oWmVyb1N0YXRlRmlsZVByb3ZpZGVyKTsKIH07CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci91aS9hc2gvYXNzaXN0YW50L2Fzc2lzdGFudF9pbWFnZV9kb3dubG9hZGVyLmNjIGIvY2hyb21lL2Jyb3dzZXIvdWkvYXNoL2Fzc2lzdGFudC9hc3Npc3RhbnRfaW1hZ2VfZG93bmxvYWRlci5jYwppbmRleCA5NmU0NzMyLi4xMGI1MmUwIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS9hc2gvYXNzaXN0YW50L2Fzc2lzdGFudF9pbWFnZV9kb3dubG9hZGVyLmNjCisrKyBiL2Nocm9tZS9icm93c2VyL3VpL2FzaC9hc3Npc3RhbnQvYXNzaXN0YW50X2ltYWdlX2Rvd25sb2FkZXIuY2MKQEAgLTYyLDcgKzYyLDcgQEAKICAgICBiaXRtYXBfZmV0Y2hlcl8tPkluaXQoCiAgICAgICAgIC8qcmVmZXJyZXI9Ki9zdGQ6OnN0cmluZygpLCBuZXQ6OlVSTFJlcXVlc3Q6Ok5FVkVSX0NMRUFSX1JFRkVSUkVSLAogICAgICAgICBuZXQ6OkxPQURfRE9fTk9UX1NFTkRfQ09PS0lFUyB8IG5ldDo6TE9BRF9ET19OT1RfU0FWRV9DT09LSUVTIHwKLSAgICAgICAgICAgIG5ldDo6TE9BRF9ET19OT1RfU0VORF9BVVRIX0RBVEEgfCBuZXQ6OkxPQURfTUFZQkVfVVNFUl9HRVNUVVJFKTsKKyAgICAgICAgICAgIG5ldDo6TE9BRF9ET19OT1RfU0VORF9BVVRIX0RBVEEpOwogCiAgICAgYml0bWFwX2ZldGNoZXJfLT5TdGFydCgKICAgICAgICAgY29udGVudDo6QnJvd3NlckNvbnRleHQ6OkdldERlZmF1bHRTdG9yYWdlUGFydGl0aW9uKHByb2ZpbGUpCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci91aS9hc2gvYXNzaXN0YW50L2RldmljZV9hY3Rpb25zLmNjIGIvY2hyb21lL2Jyb3dzZXIvdWkvYXNoL2Fzc2lzdGFudC9kZXZpY2VfYWN0aW9ucy5jYwppbmRleCBiNWZlNTU2Li40MmFmYzNmIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS9hc2gvYXNzaXN0YW50L2RldmljZV9hY3Rpb25zLmNjCisrKyBiL2Nocm9tZS9icm93c2VyL3VpL2FzaC9hc3Npc3RhbnQvZGV2aWNlX2FjdGlvbnMuY2MKQEAgLTExNyw3ICsxMTcsNyBAQAogCiB9ICAvLyBuYW1lc3BhY2UKIAotRGV2aWNlQWN0aW9uczo6RGV2aWNlQWN0aW9ucygpIDogc2NvcGVkX3ByZWZzX29ic2VydmVyXyh0aGlzKSB7fQorRGV2aWNlQWN0aW9uczo6RGV2aWNlQWN0aW9ucygpID0gZGVmYXVsdDsKIAogRGV2aWNlQWN0aW9uczo6fkRldmljZUFjdGlvbnMoKSB7CiAgIHJlY2VpdmVyc18uQ2xlYXIoKTsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL2FzaC9hc3Npc3RhbnQvZGV2aWNlX2FjdGlvbnMuaCBiL2Nocm9tZS9icm93c2VyL3VpL2FzaC9hc3Npc3RhbnQvZGV2aWNlX2FjdGlvbnMuaAppbmRleCBjYzg5Zjk1Li45MWFiZDliNSAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvdWkvYXNoL2Fzc2lzdGFudC9kZXZpY2VfYWN0aW9ucy5oCisrKyBiL2Nocm9tZS9icm93c2VyL3VpL2FzaC9hc3Npc3RhbnQvZGV2aWNlX2FjdGlvbnMuaApAQCAtNDksNyArNDksOCBAQAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmNBcHBMaXN0UHJlZnM6OkFwcEluZm8mIGFwcF9pbmZvKSBvdmVycmlkZTsKICAgdm9pZCBPbkFwcFJlbW92ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIGlkKSBvdmVycmlkZTsKIAotICBTY29wZWRPYnNlcnZlcjxBcmNBcHBMaXN0UHJlZnMsIERldmljZUFjdGlvbnM+IHNjb3BlZF9wcmVmc19vYnNlcnZlcl87CisgIFNjb3BlZE9ic2VydmVyPEFyY0FwcExpc3RQcmVmcywgQXJjQXBwTGlzdFByZWZzOjpPYnNlcnZlcj4KKyAgICAgIHNjb3BlZF9wcmVmc19vYnNlcnZlcl97dGhpc307CiAgIG1vam86OlJlY2VpdmVyU2V0PGNocm9tZW9zOjphc3Npc3RhbnQ6Om1vam9tOjpEZXZpY2VBY3Rpb25zPiByZWNlaXZlcnNfOwogICBtb2pvOjpJbnRlcmZhY2VQdHJTZXQ8Y2hyb21lb3M6OmFzc2lzdGFudDo6bW9qb206OkFwcExpc3RFdmVudFN1YnNjcmliZXI+CiAgICAgICBhcHBfbGlzdF9zdWJzY3JpYmVyc187CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci91aS9hc2gvbGF1bmNoZXIvYXBwX3dpbmRvd19sYXVuY2hlcl9pdGVtX2NvbnRyb2xsZXIuY2MgYi9jaHJvbWUvYnJvd3Nlci91aS9hc2gvbGF1bmNoZXIvYXBwX3dpbmRvd19sYXVuY2hlcl9pdGVtX2NvbnRyb2xsZXIuY2MKaW5kZXggZjU0Yjc3Mi4uNmJhNmZjMiAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvdWkvYXNoL2xhdW5jaGVyL2FwcF93aW5kb3dfbGF1bmNoZXJfaXRlbV9jb250cm9sbGVyLmNjCisrKyBiL2Nocm9tZS9icm93c2VyL3VpL2FzaC9sYXVuY2hlci9hcHBfd2luZG93X2xhdW5jaGVyX2l0ZW1fY29udHJvbGxlci5jYwpAQCAtMTMsMTMgKzEzLDEyIEBACiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvYXNoL2xhdW5jaGVyL2xhdW5jaGVyX2NvbnRleHRfbWVudS5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL2FzaC9sYXVuY2hlci9sYXVuY2hlcl9jb250cm9sbGVyX2hlbHBlci5oIgogI2luY2x1ZGUgInVpL2F1cmEvY2xpZW50L2F1cmFfY29uc3RhbnRzLmgiCi0jaW5jbHVkZSAidWkvYXVyYS93aW5kb3cuaCIKICNpbmNsdWRlICJ1aS9iYXNlL2Jhc2Vfd2luZG93LmgiCiAjaW5jbHVkZSAidWkvd20vY29yZS93aW5kb3dfdXRpbC5oIgogCiBBcHBXaW5kb3dMYXVuY2hlckl0ZW1Db250cm9sbGVyOjpBcHBXaW5kb3dMYXVuY2hlckl0ZW1Db250cm9sbGVyKAogICAgIGNvbnN0IGFzaDo6U2hlbGZJRCYgc2hlbGZfaWQpCi0gICAgOiBhc2g6OlNoZWxmSXRlbURlbGVnYXRlKHNoZWxmX2lkKSwgb2JzZXJ2ZWRfd2luZG93c18odGhpcykge30KKyAgICA6IGFzaDo6U2hlbGZJdGVtRGVsZWdhdGUoc2hlbGZfaWQpIHt9CiAKIEFwcFdpbmRvd0xhdW5jaGVySXRlbUNvbnRyb2xsZXI6On5BcHBXaW5kb3dMYXVuY2hlckl0ZW1Db250cm9sbGVyKCkge30KIApkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvdWkvYXNoL2xhdW5jaGVyL2FwcF93aW5kb3dfbGF1bmNoZXJfaXRlbV9jb250cm9sbGVyLmggYi9jaHJvbWUvYnJvd3Nlci91aS9hc2gvbGF1bmNoZXIvYXBwX3dpbmRvd19sYXVuY2hlcl9pdGVtX2NvbnRyb2xsZXIuaAppbmRleCA0NzIzY2JjOS4uZjdmZDk2MiAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvdWkvYXNoL2xhdW5jaGVyL2FwcF93aW5kb3dfbGF1bmNoZXJfaXRlbV9jb250cm9sbGVyLmgKKysrIGIvY2hyb21lL2Jyb3dzZXIvdWkvYXNoL2xhdW5jaGVyL2FwcF93aW5kb3dfbGF1bmNoZXJfaXRlbV9jb250cm9sbGVyLmgKQEAgLTEyLDEyICsxMiw5IEBACiAjaW5jbHVkZSAiYXNoL3B1YmxpYy9jcHAvc2hlbGZfaXRlbV9kZWxlZ2F0ZS5oIgogI2luY2x1ZGUgImJhc2UvbWFjcm9zLmgiCiAjaW5jbHVkZSAiYmFzZS9zY29wZWRfb2JzZXJ2ZXIuaCIKKyNpbmNsdWRlICJ1aS9hdXJhL3dpbmRvdy5oIgogI2luY2x1ZGUgInVpL2F1cmEvd2luZG93X29ic2VydmVyLmgiCiAKLW5hbWVzcGFjZSBhdXJhIHsKLWNsYXNzIFdpbmRvdzsKLX0KLQogbmFtZXNwYWNlIHVpIHsKIGNsYXNzIEJhc2VXaW5kb3c7CiB9CkBAIC0xMDUsNyArMTAyLDcgQEAKICAgdWk6OkJhc2VXaW5kb3cqIGxhc3RfYWN0aXZlX3dpbmRvd18gPSBudWxscHRyOwogCiAgIC8vIFNjb3BlZCBsaXN0IG9mIG9ic2VydmVkIHdpbmRvd3MgKGZvciByZW1vdmFsIG9uIGRlc3RydWN0aW9uKQotICBTY29wZWRPYnNlcnZlcjxhdXJhOjpXaW5kb3csIGF1cmE6OldpbmRvd09ic2VydmVyPiBvYnNlcnZlZF93aW5kb3dzXzsKKyAgU2NvcGVkT2JzZXJ2ZXI8YXVyYTo6V2luZG93LCBhdXJhOjpXaW5kb3dPYnNlcnZlcj4gb2JzZXJ2ZWRfd2luZG93c197dGhpc307CiAKICAgc3RkOjp1bmlxdWVfcHRyPExhdW5jaGVyQ29udGV4dE1lbnU+IGNvbnRleHRfbWVudV87CiAKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL2FzaC9sYXVuY2hlci9hcmNfYXBwX3dpbmRvd19sYXVuY2hlcl9jb250cm9sbGVyLmNjIGIvY2hyb21lL2Jyb3dzZXIvdWkvYXNoL2xhdW5jaGVyL2FyY19hcHBfd2luZG93X2xhdW5jaGVyX2NvbnRyb2xsZXIuY2MKaW5kZXggMjZiNjY4ZjkuLjhmYTA2N2I2IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS9hc2gvbGF1bmNoZXIvYXJjX2FwcF93aW5kb3dfbGF1bmNoZXJfY29udHJvbGxlci5jYworKysgYi9jaHJvbWUvYnJvd3Nlci91aS9hc2gvbGF1bmNoZXIvYXJjX2FwcF93aW5kb3dfbGF1bmNoZXJfY29udHJvbGxlci5jYwpAQCAtNTEyLDE5ICs1MTIsOCBAQAogICBhcHBfd2luZG93LT5TZXRDb250cm9sbGVyKGNvbnRyb2xsZXIpOwogICBhcHBfd2luZG93LT5zZXRfc2hlbGZfaWQoc2hlbGZfaWQpOwogCi0gIGlmICghb3B0X2luX21hbmFnZW1lbnRfY2hlY2tfc3RhcnRfdGltZV8uaXNfbnVsbCgpICYmCi0gICAgICBhcHBfd2luZG93X2luZm8tPmFwcF9zaGVsZl9pZCgpLmFwcF9pZCgpID09IGFyYzo6a1BsYXlTdG9yZUFwcElkKSB7Ci0gICAgYXJjOjpJbnRlbnQgaW50ZW50OwotICAgIGlmIChhcmM6OlBhcnNlSW50ZW50KGFwcF93aW5kb3dfaW5mby0+bGF1bmNoX2ludGVudCgpLCAmaW50ZW50KSAmJgotICAgICAgICBpbnRlbnQuSGFzRXh0cmFQYXJhbShhcmM6OmtJbml0aWFsU3RhcnRQYXJhbSkpIHsKLSAgICAgIERDSEVDSyghYXJjOjpJc1JvYm90T3JPZmZsaW5lRGVtb0FjY291bnRNb2RlKCkpOwotICAgICAgYXJjOjpVcGRhdGVQbGF5U3RvcmVTaG93VGltZSgKLSAgICAgICAgICBiYXNlOjpUaW1lOjpOb3coKSAtIG9wdF9pbl9tYW5hZ2VtZW50X2NoZWNrX3N0YXJ0X3RpbWVfLAotICAgICAgICAgIG93bmVyKCktPnByb2ZpbGUoKSk7Ci0gICAgICBWTE9HKDEpIDw8ICJQbGF5IFN0b3JlIGlzIGluaXRpYWxseSBzaG93bi4iOwotICAgIH0KLSAgICBvcHRfaW5fbWFuYWdlbWVudF9jaGVja19zdGFydF90aW1lXyA9IGJhc2U6OlRpbWUoKTsKLSAgfQorICBpZiAoYXBwX3dpbmRvd19pbmZvLT5hcHBfc2hlbGZfaWQoKS5hcHBfaWQoKSA9PSBhcmM6OmtQbGF5U3RvcmVBcHBJZCkKKyAgICBIYW5kbGVQbGF5U3RvcmVMYXVuY2goYXBwX3dpbmRvd19pbmZvKTsKIH0KIAogdm9pZCBBcmNBcHBXaW5kb3dMYXVuY2hlckNvbnRyb2xsZXI6OlVucmVnaXN0ZXJBcHAoCkBAIC01MzksMyArNTI4LDM0IEBACiAgIGFwcF93aW5kb3ctPlNldENvbnRyb2xsZXIobnVsbHB0cik7CiAgIGFwcF93aW5kb3dfaW5mby0+c2V0X2FwcF93aW5kb3cobnVsbHB0cik7CiB9CisKK3ZvaWQgQXJjQXBwV2luZG93TGF1bmNoZXJDb250cm9sbGVyOjpIYW5kbGVQbGF5U3RvcmVMYXVuY2goCisgICAgQXBwV2luZG93SW5mbyogYXBwX3dpbmRvd19pbmZvKSB7CisgIGFyYzo6SW50ZW50IGludGVudDsKKyAgaWYgKCFhcmM6OlBhcnNlSW50ZW50KGFwcF93aW5kb3dfaW5mby0+bGF1bmNoX2ludGVudCgpLCAmaW50ZW50KSkKKyAgICByZXR1cm47CisKKyAgaWYgKCFvcHRfaW5fbWFuYWdlbWVudF9jaGVja19zdGFydF90aW1lXy5pc19udWxsKCkpIHsKKyAgICBpZiAoaW50ZW50Lkhhc0V4dHJhUGFyYW0oYXJjOjprSW5pdGlhbFN0YXJ0UGFyYW0pKSB7CisgICAgICBEQ0hFQ0soIWFyYzo6SXNSb2JvdE9yT2ZmbGluZURlbW9BY2NvdW50TW9kZSgpKTsKKyAgICAgIGFyYzo6VXBkYXRlUGxheVN0b3JlU2hvd25UaW1lRGVwcmVjYXRlZCgKKyAgICAgICAgICBiYXNlOjpUaW1lOjpOb3coKSAtIG9wdF9pbl9tYW5hZ2VtZW50X2NoZWNrX3N0YXJ0X3RpbWVfLAorICAgICAgICAgIG93bmVyKCktPnByb2ZpbGUoKSk7CisgICAgICBWTE9HKDEpIDw8ICJQbGF5IFN0b3JlIGlzIGluaXRpYWxseSBzaG93bi4iOworICAgIH0KKyAgICBvcHRfaW5fbWFuYWdlbWVudF9jaGVja19zdGFydF90aW1lXyA9IGJhc2U6OlRpbWUoKTsKKyAgICByZXR1cm47CisgIH0KKworICBmb3IgKGNvbnN0IGF1dG8mIHBhcmFtIDogaW50ZW50LmV4dHJhX3BhcmFtcygpKSB7CisgICAgaW50NjRfdCBzdGFydF9yZXF1ZXN0X21zOworICAgIGlmIChzc2NhbmYocGFyYW0uY19zdHIoKSwgYXJjOjprUmVxdWVzdFN0YXJ0VGltZVBhcmFtVGVtcGxhdGUsCisgICAgICAgICAgICAgICAmc3RhcnRfcmVxdWVzdF9tcykgIT0gMSkKKyAgICAgIGNvbnRpbnVlOworICAgIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSBsYXVuY2hfdGltZSA9CisgICAgICAgIGJhc2U6OlRpbWVUaWNrczo6Tm93KCkgLSBiYXNlOjpUaW1lVGlja3MoKSAtCisgICAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcyhzdGFydF9yZXF1ZXN0X21zKTsKKyAgICBEQ0hFQ0tfR0UobGF1bmNoX3RpbWUsIGJhc2U6OlRpbWVEZWx0YSgpKTsKKyAgICBhcmM6OlVwZGF0ZVBsYXlTdG9yZUxhdW5jaFRpbWUobGF1bmNoX3RpbWUpOworICB9Cit9CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci91aS9hc2gvbGF1bmNoZXIvYXJjX2FwcF93aW5kb3dfbGF1bmNoZXJfY29udHJvbGxlci5oIGIvY2hyb21lL2Jyb3dzZXIvdWkvYXNoL2xhdW5jaGVyL2FyY19hcHBfd2luZG93X2xhdW5jaGVyX2NvbnRyb2xsZXIuaAppbmRleCAwYTVhZDAzLi45MDMwNTFlIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS9hc2gvbGF1bmNoZXIvYXJjX2FwcF93aW5kb3dfbGF1bmNoZXJfY29udHJvbGxlci5oCisrKyBiL2Nocm9tZS9icm93c2VyL3VpL2FzaC9sYXVuY2hlci9hcmNfYXBwX3dpbmRvd19sYXVuY2hlcl9jb250cm9sbGVyLmgKQEAgLTkxLDYgKzkxLDcgQEAKIAogICB2b2lkIFJlZ2lzdGVyQXBwKEFwcFdpbmRvd0luZm8qIGFwcF93aW5kb3dfaW5mbyk7CiAgIHZvaWQgVW5yZWdpc3RlckFwcChBcHBXaW5kb3dJbmZvKiBhcHBfd2luZG93X2luZm8pOworICB2b2lkIEhhbmRsZVBsYXlTdG9yZUxhdW5jaChBcHBXaW5kb3dJbmZvKiBhcHBfd2luZG93X2luZm8pOwogCiAgIEFwcFdpbmRvd0luZm8qIEdldEFwcFdpbmRvd0luZm9Gb3JUYXNrKGludCB0YXNrX2lkKTsKICAgQXJjQXBwV2luZG93KiBHZXRBcHBXaW5kb3dGb3JUYXNrKGludCB0YXNrX2lkKTsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL2FzaC9sYXVuY2hlci9hcmNfc2hlbGZfc3Bpbm5lcl9pdGVtX2NvbnRyb2xsZXIuY2MgYi9jaHJvbWUvYnJvd3Nlci91aS9hc2gvbGF1bmNoZXIvYXJjX3NoZWxmX3NwaW5uZXJfaXRlbV9jb250cm9sbGVyLmNjCmluZGV4IDNlNmY1ZjkuLjJiNWFkNTYgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3VpL2FzaC9sYXVuY2hlci9hcmNfc2hlbGZfc3Bpbm5lcl9pdGVtX2NvbnRyb2xsZXIuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvdWkvYXNoL2xhdW5jaGVyL2FyY19zaGVsZl9zcGlubmVyX2l0ZW1fY29udHJvbGxlci5jYwpAQCAtNSwxNiArNSwxNyBAQAogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL2FzaC9sYXVuY2hlci9hcmNfc2hlbGZfc3Bpbm5lcl9pdGVtX2NvbnRyb2xsZXIuaCIKIAogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3Byb2ZpbGVzL3Byb2ZpbGUuaCIKLSNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS9hcHBfbGlzdC9hcmMvYXJjX2FwcF91dGlscy5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL2FzaC9sYXVuY2hlci9zaGVsZl9zcGlubmVyX2NvbnRyb2xsZXIuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL2FyYy9tZXRyaWNzL2FyY19tZXRyaWNzX2NvbnN0YW50cy5oIgogCiBBcmNTaGVsZlNwaW5uZXJJdGVtQ29udHJvbGxlcjo6QXJjU2hlbGZTcGlubmVySXRlbUNvbnRyb2xsZXIoCiAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFyY19hcHBfaWQsCiAgICAgaW50IGV2ZW50X2ZsYWdzLAorICAgIGFyYzo6VXNlckludGVyYWN0aW9uVHlwZSB1c2VyX2ludGVyYWN0aW9uX3R5cGUsCiAgICAgaW50NjRfdCBkaXNwbGF5X2lkKQogICAgIDogU2hlbGZTcGlubmVySXRlbUNvbnRyb2xsZXIoYXJjX2FwcF9pZCksCiAgICAgICBldmVudF9mbGFnc18oZXZlbnRfZmxhZ3MpLAorICAgICAgdXNlcl9pbnRlcmFjdGlvbl90eXBlXyh1c2VyX2ludGVyYWN0aW9uX3R5cGUpLAogICAgICAgZGlzcGxheV9pZF8oZGlzcGxheV9pZCkgewogICBhcmM6OkFyY1Nlc3Npb25NYW5hZ2VyKiBhcmNfc2Vzc2lvbl9tYW5hZ2VyID0gYXJjOjpBcmNTZXNzaW9uTWFuYWdlcjo6R2V0KCk7CiAgIC8vIGFyYzo6QXJjU2Vzc2lvbk1hbmFnZXIgbWlnaHQgbm90IGJlIHNldCBpbiB0ZXN0cy4KQEAgLTU3LDcgKzU4LDcgQEAKIAogICAvLyBDbG9zZSgpIGRlc3Ryb3lzIHRoaXMgb2JqZWN0LCBzbyBzdGFydCBsYXVuY2hpbmcgdGhlIGFwcCBmaXJzdC4KICAgYXJjOjpMYXVuY2hBcHAob2JzZXJ2ZWRfcHJvZmlsZV8sIGFyY19hcHBfaWQsIGV2ZW50X2ZsYWdzXywKLSAgICAgICAgICAgICAgICAgYXJjOjpVc2VySW50ZXJhY3Rpb25UeXBlOjpBUFBfU1RBUlRFRF9GUk9NX1NIRUxGLCBkaXNwbGF5X2lkXyk7CisgICAgICAgICAgICAgICAgIHVzZXJfaW50ZXJhY3Rpb25fdHlwZV8sIGRpc3BsYXlfaWRfKTsKICAgQ2xvc2UoKTsKIH0KIApkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvdWkvYXNoL2xhdW5jaGVyL2FyY19zaGVsZl9zcGlubmVyX2l0ZW1fY29udHJvbGxlci5oIGIvY2hyb21lL2Jyb3dzZXIvdWkvYXNoL2xhdW5jaGVyL2FyY19zaGVsZl9zcGlubmVyX2l0ZW1fY29udHJvbGxlci5oCmluZGV4IDA3YTE2MGQuLmMyNTNkMjIgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3VpL2FzaC9sYXVuY2hlci9hcmNfc2hlbGZfc3Bpbm5lcl9pdGVtX2NvbnRyb2xsZXIuaAorKysgYi9jaHJvbWUvYnJvd3Nlci91aS9hc2gvbGF1bmNoZXIvYXJjX3NoZWxmX3NwaW5uZXJfaXRlbV9jb250cm9sbGVyLmgKQEAgLTExLDggKzExLDEwIEBACiAKICNpbmNsdWRlICJiYXNlL21hY3Jvcy5oIgogI2luY2x1ZGUgImJhc2UvbWVtb3J5L3dlYWtfcHRyLmgiCisjaW5jbHVkZSAiYmFzZS90aW1lL3RpbWUuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9hcmMvc2Vzc2lvbi9hcmNfc2Vzc2lvbl9tYW5hZ2VyLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvYXBwX2xpc3QvYXJjL2FyY19hcHBfbGlzdF9wcmVmcy5oIgorI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL2FwcF9saXN0L2FyYy9hcmNfYXBwX3V0aWxzLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvYXNoL2xhdW5jaGVyL3NoZWxmX3NwaW5uZXJfaXRlbV9jb250cm9sbGVyLmgiCiAKIC8vIEFyY1NoZWxmU3Bpbm5lckl0ZW1Db250cm9sbGVyIGRpc3BsYXlzIHRoZSBpY29uIG9mIHRoZSBBUkMgYXBwIHRoYXQKQEAgLTI0LDYgKzI2LDcgQEAKICBwdWJsaWM6CiAgIEFyY1NoZWxmU3Bpbm5lckl0ZW1Db250cm9sbGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBhcmNfYXBwX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnRfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyYzo6VXNlckludGVyYWN0aW9uVHlwZSB1c2VyX2ludGVyYWN0aW9uX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZGlzcGxheV9pZCk7CiAKICAgfkFyY1NoZWxmU3Bpbm5lckl0ZW1Db250cm9sbGVyKCkgb3ZlcnJpZGU7CkBAIC00NCw2ICs0Nyw5IEBACiAgIC8vIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGxhdW5jaCBldmVudCBvbmNlIHRoZSBhcHAgaXMgYWN0dWFsbHkgbGF1bmNoZWQuCiAgIGNvbnN0IGludCBldmVudF9mbGFnc187CiAKKyAgLy8gU3RvcmVzIGhvdyB0aGlzIGFjdGlvbiB3YXMgaW5pdGlhdGVkLgorICBjb25zdCBhcmM6OlVzZXJJbnRlcmFjdGlvblR5cGUgdXNlcl9pbnRlcmFjdGlvbl90eXBlXzsKKwogICBjb25zdCBpbnQ2NF90IGRpc3BsYXlfaWRfOwogCiAgIC8vIFVub3duZWQKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL2FzaC9sYXVuY2hlci9jaHJvbWVfbGF1bmNoZXJfY29udHJvbGxlcl9icm93c2VydGVzdC5jYyBiL2Nocm9tZS9icm93c2VyL3VpL2FzaC9sYXVuY2hlci9jaHJvbWVfbGF1bmNoZXJfY29udHJvbGxlcl9icm93c2VydGVzdC5jYwppbmRleCBlNmE0MzdmLi45ZjRiYWQ5IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS9hc2gvbGF1bmNoZXIvY2hyb21lX2xhdW5jaGVyX2NvbnRyb2xsZXJfYnJvd3NlcnRlc3QuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvdWkvYXNoL2xhdW5jaGVyL2Nocm9tZV9sYXVuY2hlcl9jb250cm9sbGVyX2Jyb3dzZXJ0ZXN0LmNjCkBAIC0xMSwxNSArMTEsMTkgQEAKICNpbmNsdWRlICJhc2gvcHVibGljL2NwcC9hcHBfbWVudV9jb25zdGFudHMuaCIKICNpbmNsdWRlICJhc2gvcHVibGljL2NwcC9zaGVsZl9pdGVtX2RlbGVnYXRlLmgiCiAjaW5jbHVkZSAiYXNoL3B1YmxpYy9jcHAvc2hlbGZfbW9kZWwuaCIKKyNpbmNsdWRlICJhc2gvcHVibGljL2NwcC90YWJsZXRfbW9kZS5oIgogI2luY2x1ZGUgImFzaC9wdWJsaWMvY3BwL3dpbmRvd19wcm9wZXJ0aWVzLmgiCisjaW5jbHVkZSAiYXNoL3Jvb3Rfd2luZG93X2NvbnRyb2xsZXIuaCIKICNpbmNsdWRlICJhc2gvc2hlbGYvaG9tZV9idXR0b24uaCIKICNpbmNsdWRlICJhc2gvc2hlbGYvb3ZlcmZsb3dfYnV0dG9uLmgiCiAjaW5jbHVkZSAiYXNoL3NoZWxmL3NoZWxmLmgiCiAjaW5jbHVkZSAiYXNoL3NoZWxmL3NoZWxmX2FwcF9idXR0b24uaCIKKyNpbmNsdWRlICJhc2gvc2hlbGYvc2hlbGZfbGF5b3V0X21hbmFnZXIuaCIKICNpbmNsdWRlICJhc2gvc2hlbGYvc2hlbGZfdmlldy5oIgogI2luY2x1ZGUgImFzaC9zaGVsZi9zaGVsZl92aWV3X3Rlc3RfYXBpLmgiCiAjaW5jbHVkZSAiYXNoL3NoZWxmL3NoZWxmX3dpZGdldC5oIgogI2luY2x1ZGUgImFzaC9zaGVsbC5oIgorI2luY2x1ZGUgImFzaC93bS90YWJsZXRfbW9kZS90YWJsZXRfbW9kZV9jb250cm9sbGVyLmgiCiAjaW5jbHVkZSAiYmFzZS9tYWNyb3MuaCIKICNpbmNsdWRlICJiYXNlL3J1bl9sb29wLmgiCiAjaW5jbHVkZSAiYmFzZS9zdHJpbmdzL3N0cmluZ3ByaW50Zi5oIgpAQCAtNTQsNiArNTgsNyBAQAogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL3NldHRpbmdzX3dpbmRvd19tYW5hZ2VyX2Nocm9tZW9zLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvdGFicy90YWJfc3RyaXBfbW9kZWwuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS90ZXN0L3Rlc3RfYXBwX3dpbmRvd19pY29uX29ic2VydmVyLmgiCisjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvZnJhbWUvYnJvd3Nlcl92aWV3LmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy9jb21wb25lbnRzL3dlYl9hcHBfaGVscGVycy5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvc3lzdGVtX3dlYl9hcHBfbWFuYWdlci5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvdGVzdC93ZWJfYXBwX2luc3RhbGxfb2JzZXJ2ZXIuaCIKQEAgLTYyLDYgKzY3LDcgQEAKICNpbmNsdWRlICJjaHJvbWUvY29tbW9uL2Nocm9tZV9zd2l0Y2hlcy5oIgogI2luY2x1ZGUgImNocm9tZS9jb21tb24vZXh0ZW5zaW9ucy9tYW5pZmVzdF9oYW5kbGVycy9hcHBfbGF1bmNoX2luZm8uaCIKICNpbmNsdWRlICJjaHJvbWUvdGVzdC9iYXNlL3VpX3Rlc3RfdXRpbHMuaCIKKyNpbmNsdWRlICJjaHJvbWVvcy9jb25zdGFudHMvY2hyb21lb3Nfc3dpdGNoZXMuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL2NyeF9maWxlL2lkX3V0aWwuaCIKICNpbmNsdWRlICJjb250ZW50L3B1YmxpYy9icm93c2VyL3dlYl9jb250ZW50cy5oIgogI2luY2x1ZGUgImNvbnRlbnQvcHVibGljL3Rlc3QvYnJvd3Nlcl90ZXN0X3V0aWxzLmgiCkBAIC03OCw2ICs4NCw3IEBACiAjaW5jbHVkZSAidWkvYXVyYS93aW5kb3cuaCIKICNpbmNsdWRlICJ1aS9iYXNlL2Jhc2Vfd2luZG93LmgiCiAjaW5jbHVkZSAidWkvYmFzZS93aW5kb3dfb3Blbl9kaXNwb3NpdGlvbi5oIgorI2luY2x1ZGUgInVpL2Rpc3BsYXkvZGlzcGxheS5oIgogI2luY2x1ZGUgInVpL2Rpc3BsYXkvbWFuYWdlci9kaXNwbGF5X21hbmFnZXIuaCIKICNpbmNsdWRlICJ1aS9kaXNwbGF5L3NjcmVlbi5oIgogI2luY2x1ZGUgInVpL2Rpc3BsYXkvdGVzdC9kaXNwbGF5X21hbmFnZXJfdGVzdF9hcGkuaCIKQEAgLTE0MCw2ICsxNDcsMzUgQEAKICAgICAgIC5pZCgpOwogfQogCit2b2lkIEV4dGVuZEhvdHNlYXQoQnJvd3NlciogYnJvd3NlcikgeworICBhc2g6OlJvb3RXaW5kb3dDb250cm9sbGVyKiBjb25zdCBjb250cm9sbGVyID0KKyAgICAgIGFzaDo6U2hlbGw6OkdldFJvb3RXaW5kb3dDb250cm9sbGVyV2l0aERpc3BsYXlJZCgKKyAgICAgICAgICBkaXNwbGF5OjpTY3JlZW46OkdldFNjcmVlbigpLT5HZXRQcmltYXJ5RGlzcGxheSgpLmlkKCkpOworICBFWFBFQ1RfRVEoYXNoOjpIb3RzZWF0U3RhdGU6OmtIaWRkZW4sCisgICAgICAgICAgICBjb250cm9sbGVyLT5zaGVsZigpLT5zaGVsZl9sYXlvdXRfbWFuYWdlcigpLT5ob3RzZWF0X3N0YXRlKCkpOworCisgIEJyb3dzZXJWaWV3KiBjb25zdCBicm93c2VyX3ZpZXcgPQorICAgICAgQnJvd3NlclZpZXc6OkdldEJyb3dzZXJWaWV3Rm9yQnJvd3Nlcihicm93c2VyKTsKKyAgYXVyYTo6V2luZG93KiBjb25zdCBicm93c2VyX3dpbmRvdyA9CisgICAgICBicm93c2VyX3ZpZXctPkdldFdpZGdldCgpLT5HZXROYXRpdmVXaW5kb3coKTsKKworICBjb25zdCBnZng6OlJlY3QgZGlzcGxheV9ib3VuZHMgPSBkaXNwbGF5OjpTY3JlZW46OkdldFNjcmVlbigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPkdldERpc3BsYXlOZWFyZXN0V2luZG93KGJyb3dzZXJfd2luZG93KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJvdW5kcygpOworICBjb25zdCBnZng6OlBvaW50IHN0YXJ0X3BvaW50ID0gZ2Z4OjpQb2ludCgKKyAgICAgIGRpc3BsYXlfYm91bmRzLndpZHRoKCkgLyA0LAorICAgICAgZGlzcGxheV9ib3VuZHMuYm90dG9tKCkgLSBhc2g6OlNoZWxmQ29uZmlnOjpHZXQoKS0+c2hlbGZfc2l6ZSgpIC8gMik7CisgIGdmeDo6UG9pbnQgZW5kX3BvaW50KHN0YXJ0X3BvaW50KTsKKyAgZW5kX3BvaW50LnNldF95KDEwKTsKKworICB1aTo6dGVzdDo6RXZlbnRHZW5lcmF0b3IgZXZlbnRfZ2VuZXJhdG9yKGNvbnRyb2xsZXItPkdldFJvb3RXaW5kb3coKSk7CisgIGV2ZW50X2dlbmVyYXRvci5HZXN0dXJlU2Nyb2xsU2VxdWVuY2UoCisgICAgICBzdGFydF9wb2ludCwgZW5kX3BvaW50LCBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoNTAwKSwgNCk7CisKKyAgRVhQRUNUX0VRKGFzaDo6SG90c2VhdFN0YXRlOjprRXh0ZW5kZWQsCisgICAgICAgICAgICBjb250cm9sbGVyLT5zaGVsZigpLT5zaGVsZl9sYXlvdXRfbWFuYWdlcigpLT5ob3RzZWF0X3N0YXRlKCkpOworfQorCiB9ICAvLyBuYW1lc3BhY2UKIAogY2xhc3MgTGF1bmNoZXJQbGF0Zm9ybUFwcEJyb3dzZXJUZXN0CkBAIC0yNTQsMzYgKzI5MCw2IEBACiAgICAgcmV0dXJuIHNoZWxmX21vZGVsKCktPkdldEl0ZW1JbmRleEZvclR5cGUodHlwZSk7CiAgIH0KIAotICAvLyBUcnkgdG8gcmlwIG9mZiB8aXRlbV9pbmRleHwuCi0gIHZvaWQgUmlwT2ZmSXRlbUluZGV4KGludCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgdWk6OnRlc3Q6OkV2ZW50R2VuZXJhdG9yKiBnZW5lcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgIGFzaDo6U2hlbGZWaWV3VGVzdEFQSSogdGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgUmlwT2ZmQ29tbWFuZCBjb21tYW5kKSB7Ci0gICAgYXNoOjpTaGVsZkFwcEJ1dHRvbiogYnV0dG9uID0gdGVzdC0+R2V0QnV0dG9uKGluZGV4KTsKLSAgICBnZng6OlBvaW50IHN0YXJ0X3BvaW50ID0gYnV0dG9uLT5HZXRCb3VuZHNJblNjcmVlbigpLkNlbnRlclBvaW50KCk7Ci0gICAgZ2Z4OjpQb2ludCByaXBfb2ZmX3BvaW50KHN0YXJ0X3BvaW50LngoKSwgMCk7Ci0gICAgZ2VuZXJhdG9yLT5Nb3ZlTW91c2VUbyhzdGFydF9wb2ludC54KCksIHN0YXJ0X3BvaW50LnkoKSk7Ci0gICAgYmFzZTo6UnVuTG9vcCgpLlJ1blVudGlsSWRsZSgpOwotICAgIGdlbmVyYXRvci0+UHJlc3NMZWZ0QnV0dG9uKCk7Ci0gICAgYmFzZTo6UnVuTG9vcCgpLlJ1blVudGlsSWRsZSgpOwotICAgIGdlbmVyYXRvci0+TW92ZU1vdXNlVG8ocmlwX29mZl9wb2ludC54KCksIHJpcF9vZmZfcG9pbnQueSgpKTsKLSAgICBiYXNlOjpSdW5Mb29wKCkuUnVuVW50aWxJZGxlKCk7Ci0gICAgdGVzdC0+UnVuTWVzc2FnZUxvb3BVbnRpbEFuaW1hdGlvbnNEb25lKCk7Ci0gICAgaWYgKGNvbW1hbmQgPT0gUklQX09GRl9JVEVNX0FORF9SRVRVUk4pIHsKLSAgICAgIGdlbmVyYXRvci0+TW92ZU1vdXNlVG8oc3RhcnRfcG9pbnQueCgpLCBzdGFydF9wb2ludC55KCkpOwotICAgICAgYmFzZTo6UnVuTG9vcCgpLlJ1blVudGlsSWRsZSgpOwotICAgICAgdGVzdC0+UnVuTWVzc2FnZUxvb3BVbnRpbEFuaW1hdGlvbnNEb25lKCk7Ci0gICAgfSBlbHNlIGlmIChjb21tYW5kID09IFJJUF9PRkZfSVRFTV9BTkRfQ0FOQ0VMKSB7Ci0gICAgICAvLyBUaGlzIHRyaWdnZXJzIGFuIGludGVybmFsIGNhbmNlbC4gVXNpbmcgVktFWV9FU0NBUEUgd2FzIHRvbyB1bnJlbGlhYmxlLgotICAgICAgYnV0dG9uLT5Pbk1vdXNlQ2FwdHVyZUxvc3QoKTsKLSAgICB9Ci0gICAgaWYgKGNvbW1hbmQgIT0gUklQX09GRl9JVEVNX0FORF9ET05UX1JFTEVBU0VfTU9VU0UpIHsKLSAgICAgIGdlbmVyYXRvci0+UmVsZWFzZUxlZnRCdXR0b24oKTsKLSAgICAgIGJhc2U6OlJ1bkxvb3AoKS5SdW5VbnRpbElkbGUoKTsKLSAgICAgIHRlc3QtPlJ1bk1lc3NhZ2VMb29wVW50aWxBbmltYXRpb25zRG9uZSgpOwotICAgIH0KLSAgfQotCiAgIC8vIENyZWF0ZXMgYSBjb250ZXh0IG1lbnUgZm9yIHRoZSBleGlzdGluZyBicm93c2VyIHNob3J0Y3V0IGl0ZW0uCiAgIHN0ZDo6dW5pcXVlX3B0cjxMYXVuY2hlckNvbnRleHRNZW51PiBDcmVhdGVCcm93c2VySXRlbUNvbnRleHRNZW51KCkgewogICAgIGludCBpbmRleCA9IHNoZWxmX21vZGVsKCktPkdldEl0ZW1JbmRleEZvclR5cGUoYXNoOjpUWVBFX0JST1dTRVJfU0hPUlRDVVQpOwpAQCAtMTk5NywzICsyMDAzLDU4IEBACiAgIEVYUEVDVF9UUlVFKAogICAgICAgc2hlbGZfbW9kZWwoKS0+R2V0U2hlbGZJdGVtRGVsZWdhdGUoc2hlbGZfbW9kZWwoKS0+aXRlbXMoKVswXS5pZCkpOwogfQorCitjbGFzcyBIb3RzZWF0U2hlbGZBcHBCcm93c2VyVGVzdCA6IHB1YmxpYyBTaGVsZkFwcEJyb3dzZXJUZXN0IHsKKyBwdWJsaWM6CisgIEhvdHNlYXRTaGVsZkFwcEJyb3dzZXJUZXN0KCkgPSBkZWZhdWx0OworICB+SG90c2VhdFNoZWxmQXBwQnJvd3NlclRlc3QoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgLy8gU2hlbGZBcHBCcm93c2VyVGVzdDoKKyAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICBiYXNlOjpDb21tYW5kTGluZTo6Rm9yQ3VycmVudFByb2Nlc3MoKS0+QXBwZW5kU3dpdGNoKAorICAgICAgICBjaHJvbWVvczo6c3dpdGNoZXM6OmtTaGVsZkhvdHNlYXQpOworICAgIFNoZWxmQXBwQnJvd3NlclRlc3Q6OlNldFVwKCk7CisgIH0KKworIHByaXZhdGU6CisgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihIb3RzZWF0U2hlbGZBcHBCcm93c2VyVGVzdCk7Cit9OworCisvLyBUZXN0cyB0aGF0IGxhdW5jaGluZyBhbmQgc3dpdGNoaW5nIGFwcHMgYnkgdGFwcGluZyBzaGVsZiBidXR0b25zIGhpZGVzIHRoZQorLy8gaG90c2VhdC4KK0lOX1BST0NfQlJPV1NFUl9URVNUX0YoSG90c2VhdFNoZWxmQXBwQnJvd3NlclRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgIFRhcHBpbmdBcHBJY29uc0hpZGVzSG90c2VhdCkgeworICBhc2g6OlNoZWxsOjpHZXQoKS0+dGFibGV0X21vZGVfY29udHJvbGxlcigpLT5TZXRFbmFibGVkRm9yVGVzdCh0cnVlKTsKKworICAvLyBDcmVhdGUgdHdvIGFwcHMsIHRoZW4gZXh0ZW5kIHRoZSBob3RzZWF0LgorICBhc2g6OlNoZWxmSUQgc2hvcnRjdXRfaWRfMSA9IENyZWF0ZVNob3J0Y3V0KCJhcHAxIik7CisgIGFzaDo6U2hlbGZJRCBzaG9ydGN1dF9pZF8yID0gQ3JlYXRlU2hvcnRjdXQoImFwcDIiKTsKKyAgRXh0ZW5kSG90c2VhdChicm93c2VyKCkpOworCisgIC8vIExhdW5jaCBhcHAxLCB0aGUgaG90c2VhdCBzaG91bGQgaGlkZS4KKyAgYXNoOjpSb290V2luZG93Q29udHJvbGxlciogY29udHJvbGxlciA9CisgICAgICBhc2g6OlNoZWxsOjpHZXRSb290V2luZG93Q29udHJvbGxlcldpdGhEaXNwbGF5SWQoCisgICAgICAgICAgZGlzcGxheTo6U2NyZWVuOjpHZXRTY3JlZW4oKS0+R2V0UHJpbWFyeURpc3BsYXkoKS5pZCgpKTsKKyAgYXNoOjpTaGVsZlZpZXcqIHNoZWxmX3ZpZXcgPSBjb250cm9sbGVyLT5zaGVsZigpLT5HZXRTaGVsZlZpZXdGb3JUZXN0aW5nKCk7CisgIHZpZXdzOjpWaWV3KiBidXR0b25fMSA9IHNoZWxmX3ZpZXctPkdldFNoZWxmQXBwQnV0dG9uKHNob3J0Y3V0X2lkXzEpOworICB1aTo6dGVzdDo6RXZlbnRHZW5lcmF0b3IgZXZlbnRfZ2VuZXJhdG9yKGNvbnRyb2xsZXItPkdldFJvb3RXaW5kb3coKSk7CisgIGV2ZW50X2dlbmVyYXRvci5HZXN0dXJlVGFwQXQoYnV0dG9uXzEtPkdldEJvdW5kc0luU2NyZWVuKCkuQ2VudGVyUG9pbnQoKSk7CisKKyAgRVhQRUNUX0VRKGFzaDo6SG90c2VhdFN0YXRlOjprSGlkZGVuLAorICAgICAgICAgICAgY29udHJvbGxlci0+c2hlbGYoKS0+c2hlbGZfbGF5b3V0X21hbmFnZXIoKS0+aG90c2VhdF9zdGF0ZSgpKTsKKworICAvLyBTaG93IHRoZSBob3RzZWF0IGFnYWluLCBhbmQgbGF1bmNoIGFwcDIuIFRoZSBob3RzZWF0IHNob3VsZCBoaWRlIGFnYWluLgorICBFeHRlbmRIb3RzZWF0KGJyb3dzZXIoKSk7CisgIHZpZXdzOjpWaWV3KiBidXR0b25fMiA9IHNoZWxmX3ZpZXctPkdldFNoZWxmQXBwQnV0dG9uKHNob3J0Y3V0X2lkXzIpOworICBldmVudF9nZW5lcmF0b3IuR2VzdHVyZVRhcEF0KGJ1dHRvbl8yLT5HZXRCb3VuZHNJblNjcmVlbigpLkNlbnRlclBvaW50KCkpOworCisgIEVYUEVDVF9FUShhc2g6OkhvdHNlYXRTdGF0ZTo6a0hpZGRlbiwKKyAgICAgICAgICAgIGNvbnRyb2xsZXItPnNoZWxmKCktPnNoZWxmX2xheW91dF9tYW5hZ2VyKCktPmhvdHNlYXRfc3RhdGUoKSk7CisKKyAgLy8gRXh0ZW5kIHRoZSBob3RzZWF0IGFuZCB0ZXN0IHRoYXQgc3dpdGNoaW5nIGJhY2sgdG8gYXBwMSByZXN1bHRzIGluIGEgaGlkZGVuCisgIC8vIGhvdHNlYXQuCisgIEV4dGVuZEhvdHNlYXQoYnJvd3NlcigpKTsKKyAgZXZlbnRfZ2VuZXJhdG9yLkdlc3R1cmVUYXBBdChidXR0b25fMS0+R2V0Qm91bmRzSW5TY3JlZW4oKS5DZW50ZXJQb2ludCgpKTsKKyAgRVhQRUNUX0VRKGFzaDo6SG90c2VhdFN0YXRlOjprSGlkZGVuLAorICAgICAgICAgICAgY29udHJvbGxlci0+c2hlbGYoKS0+c2hlbGZfbGF5b3V0X21hbmFnZXIoKS0+aG90c2VhdF9zdGF0ZSgpKTsKK30KZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL2FzaC9sYXVuY2hlci9jaHJvbWVfbGF1bmNoZXJfY29udHJvbGxlcl91bml0dGVzdC5jYyBiL2Nocm9tZS9icm93c2VyL3VpL2FzaC9sYXVuY2hlci9jaHJvbWVfbGF1bmNoZXJfY29udHJvbGxlcl91bml0dGVzdC5jYwppbmRleCBmNmY5YTc1Li5lZWE5M2E2IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS9hc2gvbGF1bmNoZXIvY2hyb21lX2xhdW5jaGVyX2NvbnRyb2xsZXJfdW5pdHRlc3QuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvdWkvYXNoL2xhdW5jaGVyL2Nocm9tZV9sYXVuY2hlcl9jb250cm9sbGVyX3VuaXR0ZXN0LmNjCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSAiYmFzZS9sb2NhdGlvbi5oIgogI2luY2x1ZGUgImJhc2UvbWFjcm9zLmgiCiAjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcHRyX3V0aWwuaCIKKyNpbmNsdWRlICJiYXNlL21ldHJpY3Mvc3RhdGlzdGljc19yZWNvcmRlci5oIgogI2luY2x1ZGUgImJhc2UvcnVuX2xvb3AuaCIKICNpbmNsdWRlICJiYXNlL3NpbmdsZV90aHJlYWRfdGFza19ydW5uZXIuaCIKICNpbmNsdWRlICJiYXNlL3N0cmluZ3MvdXRmX3N0cmluZ19jb252ZXJzaW9ucy5oIgpAQCAtNDM0Myw2ICs0MzQ0LDY5IEBACiAgICAgICBhcmM6OmtQbGF5U3RvcmVBcHBJZCkpOwogfQogCitURVNUX0YoQ2hyb21lTGF1bmNoZXJDb250cm9sbGVyQXJjRGVmYXVsdEFwcHNUZXN0LCBQbGF5U3RvcmVMYXVuY2hNZXRyaWMpIHsKKyAgZXh0ZW5zaW9uX3NlcnZpY2VfLT5BZGRFeHRlbnNpb24oYXJjX3N1cHBvcnRfaG9zdF8uZ2V0KCkpOworICBhcmNfdGVzdF8uU2V0VXAocHJvZmlsZSgpKTsKKyAgQXJjQXBwTGlzdFByZWZzKiBjb25zdCBwcmVmcyA9IGFyY190ZXN0Xy5hcmNfYXBwX2xpc3RfcHJlZnMoKTsKKworICBJbml0TGF1bmNoZXJDb250cm9sbGVyKCk7CisgIEVuYWJsZVBsYXlTdG9yZSh0cnVlKTsKKworICAvLyBQbGF5IFN0b3JlIGF2YWlsYWJsZSBub3cgYXMgYSBkZWZhdWx0IGFwcCBidXQgaXMgbm90IHJlYWR5IHlldC4KKyAgc3RkOjp1bmlxdWVfcHRyPEFyY0FwcExpc3RQcmVmczo6QXBwSW5mbz4gYXBwX2luZm8gPQorICAgICAgcHJlZnMtPkdldEFwcChhcmM6OmtQbGF5U3RvcmVBcHBJZCk7CisgIEFTU0VSVF9UUlVFKGFwcF9pbmZvKTsKKyAgRVhQRUNUX0ZBTFNFKGFwcF9pbmZvLT5yZWFkeSk7CisKKyAgY29uc3RleHByIGNoYXIga0hpc3RvZ3JhbU5hbWVbXSA9ICJBcmMuUGxheVN0b3JlTGF1bmNoLlRpbWVEZWx0YSI7CisKKyAgLy8gTGF1bmNoIFBsYXkgU3RvcmUgaW4gZGVmZXJyZWQgbW9kZS4KKyAgYXJjOjpMYXVuY2hBcHAocHJvZmlsZSgpLCBhcmM6OmtQbGF5U3RvcmVBcHBJZCwgdWk6OkVGX0xFRlRfTU9VU0VfQlVUVE9OLAorICAgICAgICAgICAgICAgICBhcmM6OlVzZXJJbnRlcmFjdGlvblR5cGU6Ok5PVF9VU0VSX0lOSVRJQVRFRCk7CisgIC8vIFRoaXMgaXMgZGVmZXJyZWQgbGF1bmNoLCBubyBhY3R1YWwgaW50ZW50cyBhcmUgZGVsaXZlcmVkIHRvIEFSQy4KKyAgRVhQRUNUX0VRKDBVLCBhcmNfdGVzdF8uYXBwX2luc3RhbmNlKCktPmxhdW5jaF9pbnRlbnRzKCkuc2l6ZSgpKTsKKyAgYXJjOjptb2pvbTo6QXBwSW5mbyBhcHA7CisgIGFwcC5hY3Rpdml0eSA9IGFyYzo6a1BsYXlTdG9yZUFjdGl2aXR5OworICBhcHAucGFja2FnZV9uYW1lID0gYXJjOjprUGxheVN0b3JlUGFja2FnZTsKKyAgY29uc3QgYmFzZTo6VGltZVRpY2tzIGFwcF9yZWFkeV90aWNrcyA9IGJhc2U6OlRpbWVUaWNrczo6Tm93KCk7CisgIGFyY190ZXN0Xy5hcHBfaW5zdGFuY2UoKS0+U2VuZFJlZnJlc2hBcHBMaXN0KHthcHB9KTsKKyAgQVNTRVJUX0VRKDFVLCBhcmNfdGVzdF8uYXBwX2luc3RhbmNlKCktPmxhdW5jaF9pbnRlbnRzKCkuc2l6ZSgpKTsKKyAgc3RkOjpzdHJpbmcgcGxheV9zdG9yZV93aW5kb3dfaWQoIm9yZy5jaHJvbWl1bS5hcmMuMSIpOworICB2aWV3czo6V2lkZ2V0KiBwbGF5X3N0b3JlX3dpbmRvdyA9IENyZWF0ZUFyY1dpbmRvdyhwbGF5X3N0b3JlX3dpbmRvd19pZCk7CisgIGFyY190ZXN0Xy5hcHBfaW5zdGFuY2UoKS0+U2VuZFRhc2tDcmVhdGVkKAorICAgICAgMSwgYXBwLCBhcmNfdGVzdF8uYXBwX2luc3RhbmNlKCktPmxhdW5jaF9pbnRlbnRzKClbMF0pOworICBjb25zdCBiYXNlOjpUaW1lVGlja3MgYXBwX2xhdW5jaGVkX3RpY2tzID0gYmFzZTo6VGltZVRpY2tzOjpOb3coKTsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBsYXVuY2hlcl9jb250cm9sbGVyXy0+R2V0SXRlbShhc2g6OlNoZWxmSUQoYXJjOjprUGxheVN0b3JlQXBwSWQpKSk7CisgIC8vIFVNQSBpcyByZXBvcnRlZCBzaW5jZSBhcHAgYmVjb21lcyByZWFkeS4KKyAgYmFzZTo6SGlzdG9ncmFtQmFzZSogY29uc3QgaGlzdG9ncmFtID0KKyAgICAgIGJhc2U6OlN0YXRpc3RpY3NSZWNvcmRlcjo6RmluZEhpc3RvZ3JhbShrSGlzdG9ncmFtTmFtZSk7CisgIEFTU0VSVF9UUlVFKGhpc3RvZ3JhbSk7CisgIC8vIFJlY29yZGVkIHRpbWUgc2hvdWxkIG5vdCBiZSBsb25nZXIgdGhhbgorICAvLyBhcHBfbGF1bmNoZWRfdGlja3MgLSBhcHBfcmVhZHlfdGlja3MsIHRoZSBpbmRpY2F0aW9uIHRoYXQgYXBwIGxhdW5jaCB0aW1lCisgIC8vIHdhcyByZWNvcmRlZCBzaW5jZSBhcHAgYmVjYW1lIHJlYWR5LgorICBzdGQ6OnVuaXF1ZV9wdHI8YmFzZTo6SGlzdG9ncmFtU2FtcGxlcz4gc2FtcGxlcyA9IGhpc3RvZ3JhbS0+U25hcHNob3REZWx0YSgpOworICBBU1NFUlRfRVEoMSwgc2FtcGxlcy0+VG90YWxDb3VudCgpKTsKKyAgRVhQRUNUX0dFKChhcHBfbGF1bmNoZWRfdGlja3MgLSBhcHBfcmVhZHlfdGlja3MpLkluTWlsbGlzZWNvbmRzKCksCisgICAgICAgICAgICBzYW1wbGVzLT5zdW0oKSk7CisgIHBsYXlfc3RvcmVfd2luZG93LT5DbG9zZSgpOworCisgIC8vIExhdW5jaCBQbGF5IFN0b3JlIGluIGFwcC1yZWFkeSBtb2RlLgorICBhcmM6OkxhdW5jaEFwcChwcm9maWxlKCksIGFyYzo6a1BsYXlTdG9yZUFwcElkLCB1aTo6RUZfTEVGVF9NT1VTRV9CVVRUT04sCisgICAgICAgICAgICAgICAgIGFyYzo6VXNlckludGVyYWN0aW9uVHlwZTo6Tk9UX1VTRVJfSU5JVElBVEVEKTsKKyAgQVNTRVJUX0VRKDJVLCBhcmNfdGVzdF8uYXBwX2luc3RhbmNlKCktPmxhdW5jaF9pbnRlbnRzKCkuc2l6ZSgpKTsKKyAgcGxheV9zdG9yZV93aW5kb3dfaWQgPSAib3JnLmNocm9taXVtLmFyYy4yIjsKKyAgcGxheV9zdG9yZV93aW5kb3cgPSBDcmVhdGVBcmNXaW5kb3cocGxheV9zdG9yZV93aW5kb3dfaWQpOworICBhcmNfdGVzdF8uYXBwX2luc3RhbmNlKCktPlNlbmRUYXNrQ3JlYXRlZCgKKyAgICAgIDIsIGFwcCwgYXJjX3Rlc3RfLmFwcF9pbnN0YW5jZSgpLT5sYXVuY2hfaW50ZW50cygpWzFdKTsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBsYXVuY2hlcl9jb250cm9sbGVyXy0+R2V0SXRlbShhc2g6OlNoZWxmSUQoYXJjOjprUGxheVN0b3JlQXBwSWQpKSk7CisgIC8vIFVNQSBpcyByZXBvcnRlZCBmb3IgYXBwLXJlYWR5IGxhdW5jaC4gTm90ZSwgcHJldmlvdXMgY2FsbCBvZiBTbmFwc2hvdERlbHRhCisgIC8vIHJlc2V0cyBzYW1wbGVzLCBzbyB3ZSBleHBlY3QgaGVyZSBvbmx5IG9uZSByZWNvcmRlZC4KKyAgRVhQRUNUX0VRKDEsIGhpc3RvZ3JhbS0+U25hcHNob3REZWx0YSgpLT5Ub3RhbENvdW50KCkpOworICBwbGF5X3N0b3JlX3dpbmRvdy0+Q2xvc2UoKTsKK30KKwogLy8gVGVzdHMgdGhhdCB0aGUgUGxheSBTdG9yZSBpcyBub3QgdmlzaWJsZSBpbiBBT1NQIGltYWdlIGFuZCB2aXNpYmxlIGluIGRlZmF1bHQKIC8vIGltYWdlcy4KIFRFU1RfUChDaHJvbWVMYXVuY2hlckNvbnRyb2xsZXJQbGF5U3RvcmVBdmFpbGFiaWxpdHlUZXN0LCBWaXNpYmxlKSB7CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci91aS9hdXRvZmlsbC9hdXRvZmlsbF9idWJibGVfaGFuZGxlci5oIGIvY2hyb21lL2Jyb3dzZXIvdWkvYXV0b2ZpbGwvYXV0b2ZpbGxfYnViYmxlX2hhbmRsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2E0NTUwCi0tLSAvZGV2L251bGwKKysrIGIvY2hyb21lL2Jyb3dzZXIvdWkvYXV0b2ZpbGwvYXV0b2ZpbGxfYnViYmxlX2hhbmRsZXIuaApAQCAtMCwwICsxLDUxIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaWZuZGVmIENIUk9NRV9CUk9XU0VSX1VJX0FVVE9GSUxMX0FVVE9GSUxMX0JVQkJMRV9IQU5ETEVSX0hfCisjZGVmaW5lIENIUk9NRV9CUk9XU0VSX1VJX0FVVE9GSUxMX0FVVE9GSUxMX0JVQkJMRV9IQU5ETEVSX0hfCisKKyNpbmNsdWRlICJiYXNlL21hY3Jvcy5oIgorCituYW1lc3BhY2UgY29udGVudCB7CitjbGFzcyBXZWJDb250ZW50czsKK30KKworbmFtZXNwYWNlIGF1dG9maWxsIHsKK2NsYXNzIExvY2FsQ2FyZE1pZ3JhdGlvbkJ1YmJsZTsKK2NsYXNzIExvY2FsQ2FyZE1pZ3JhdGlvbkJ1YmJsZUNvbnRyb2xsZXI7CitjbGFzcyBTYXZlQ2FyZEJ1YmJsZVZpZXc7CitjbGFzcyBTYXZlQ2FyZEJ1YmJsZUNvbnRyb2xsZXI7CisKKy8vIFJlc3BvbnNpYmxlIGZvciByZWNlaXZpbmcgY2FsbHMgZnJvbSBjb250cm9sbGVycyBhbmQgc2hvd2luZyBhdXRvZmlsbAorLy8gYnViYmxlcy4KK2NsYXNzIEF1dG9maWxsQnViYmxlSGFuZGxlciB7CisgcHVibGljOgorICBBdXRvZmlsbEJ1YmJsZUhhbmRsZXIoKSA9IGRlZmF1bHQ7CisgIHZpcnR1YWwgfkF1dG9maWxsQnViYmxlSGFuZGxlcigpID0gZGVmYXVsdDsKKworICB2aXJ0dWFsIFNhdmVDYXJkQnViYmxlVmlldyogU2hvd1NhdmVDcmVkaXRDYXJkQnViYmxlKAorICAgICAgY29udGVudDo6V2ViQ29udGVudHMqIHdlYl9jb250ZW50cywKKyAgICAgIFNhdmVDYXJkQnViYmxlQ29udHJvbGxlciogY29udHJvbGxlciwKKyAgICAgIGJvb2wgaXNfdXNlcl9nZXN0dXJlKSA9IDA7CisKKyAgdmlydHVhbCBMb2NhbENhcmRNaWdyYXRpb25CdWJibGUqIFNob3dMb2NhbENhcmRNaWdyYXRpb25CdWJibGUoCisgICAgICBjb250ZW50OjpXZWJDb250ZW50cyogd2ViX2NvbnRlbnRzLAorICAgICAgTG9jYWxDYXJkTWlncmF0aW9uQnViYmxlQ29udHJvbGxlciogY29udHJvbGxlciwKKyAgICAgIGJvb2wgaXNfdXNlcl9nZXN0dXJlKSA9IDA7CisKKyAgLy8gVE9ETyhjcmJ1Zy5jb20vOTY0MTI3KTogV2FpdCBmb3IgdGhlIGludGVncmF0aW9uIHdpdGggc2lnbiBpbiBhZnRlciBsb2NhbAorICAvLyBzYXZlIHRvIGJlIGxhbmRlZCB0byBzZWUgaWYgd2UgbmVlZCB0byBtZXJnZSBwYXNzd29yZCBzYXZlZCBhbmQgY3JlZGl0IGNhcmQKKyAgLy8gc2F2ZWQgZnVuY3Rpb25zLgorICB2aXJ0dWFsIHZvaWQgT25QYXNzd29yZFNhdmVkKCkgPSAwOworCisgIC8vIFRPRE8oY3JidWcuY29tLzk2NDEyNyk6IE1vdmUgcGFzc3dvcmQgYnViYmxlIGhlcmUuCisgIC8vIFRPRE8oY3JidWcuY29tLzk2NDEyNyk6IEFkZCBTaG93U3luY1Byb21vQnViYmxlKCkuCisKKyBwcml2YXRlOgorICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQXV0b2ZpbGxCdWJibGVIYW5kbGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhdXRvZmlsbAorCisjZW5kaWYgIC8vIENIUk9NRV9CUk9XU0VSX1VJX0FVVE9GSUxMX0FVVE9GSUxMX0JVQkJMRV9IQU5ETEVSX0hfCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci91aS9hdXRvZmlsbC9wYXltZW50cy9sb2NhbF9jYXJkX21pZ3JhdGlvbl9idWJibGVfY29udHJvbGxlcl9pbXBsLmNjIGIvY2hyb21lL2Jyb3dzZXIvdWkvYXV0b2ZpbGwvcGF5bWVudHMvbG9jYWxfY2FyZF9taWdyYXRpb25fYnViYmxlX2NvbnRyb2xsZXJfaW1wbC5jYwppbmRleCAyZTVhMmI1YjUuLjU4MDc5OWMgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3VpL2F1dG9maWxsL3BheW1lbnRzL2xvY2FsX2NhcmRfbWlncmF0aW9uX2J1YmJsZV9jb250cm9sbGVyX2ltcGwuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvdWkvYXV0b2ZpbGwvcGF5bWVudHMvbG9jYWxfY2FyZF9taWdyYXRpb25fYnViYmxlX2NvbnRyb2xsZXJfaW1wbC5jYwpAQCAtOCw2ICs4LDcgQEAKIAogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL2F1dG9maWxsL3N0cmlrZV9kYXRhYmFzZV9mYWN0b3J5LmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvcHJvZmlsZXMvcHJvZmlsZS5oIgorI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL2F1dG9maWxsL2F1dG9maWxsX2J1YmJsZV9oYW5kbGVyLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvYXV0b2ZpbGwvcGF5bWVudHMvbG9jYWxfY2FyZF9taWdyYXRpb25fYnViYmxlLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvYXV0b2ZpbGwvcGF5bWVudHMvcGF5bWVudHNfdWlfY29uc3RhbnRzLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvYnJvd3Nlci5oIgpAQCAtMTc0LDggKzE3NSw5IEBACiAKICAgQnJvd3NlciogYnJvd3NlciA9IGNocm9tZTo6RmluZEJyb3dzZXJXaXRoV2ViQ29udGVudHMod2ViX2NvbnRlbnRzKCkpOwogICBsb2NhbF9jYXJkX21pZ3JhdGlvbl9idWJibGVfID0KLSAgICAgIGJyb3dzZXItPndpbmRvdygpLT5TaG93TG9jYWxDYXJkTWlncmF0aW9uQnViYmxlKHdlYl9jb250ZW50cygpLCB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfcmVzaG93Xyk7CisgICAgICBicm93c2VyLT53aW5kb3coKQorICAgICAgICAgIC0+R2V0QXV0b2ZpbGxCdWJibGVIYW5kbGVyKCkKKyAgICAgICAgICAtPlNob3dMb2NhbENhcmRNaWdyYXRpb25CdWJibGUod2ViX2NvbnRlbnRzKCksIHRoaXMsIGlzX3Jlc2hvd18pOwogICBEQ0hFQ0sobG9jYWxfY2FyZF9taWdyYXRpb25fYnViYmxlXyk7CiAgIFVwZGF0ZUxvY2FsQ2FyZE1pZ3JhdGlvbkljb24oKTsKICAgdGltZXJfID0gc3RkOjptYWtlX3VuaXF1ZTxiYXNlOjpFbGFwc2VkVGltZXI+KCk7CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci91aS9hdXRvZmlsbC9wYXltZW50cy9sb2NhbF9jYXJkX21pZ3JhdGlvbl9idWJibGVfY29udHJvbGxlcl9pbXBsX3VuaXR0ZXN0LmNjIGIvY2hyb21lL2Jyb3dzZXIvdWkvYXV0b2ZpbGwvcGF5bWVudHMvbG9jYWxfY2FyZF9taWdyYXRpb25fYnViYmxlX2NvbnRyb2xsZXJfaW1wbF91bml0dGVzdC5jYwppbmRleCA0NjM1MGYyLi40MDk1NTVkIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS9hdXRvZmlsbC9wYXltZW50cy9sb2NhbF9jYXJkX21pZ3JhdGlvbl9idWJibGVfY29udHJvbGxlcl9pbXBsX3VuaXR0ZXN0LmNjCisrKyBiL2Nocm9tZS9icm93c2VyL3VpL2F1dG9maWxsL3BheW1lbnRzL2xvY2FsX2NhcmRfbWlncmF0aW9uX2J1YmJsZV9jb250cm9sbGVyX2ltcGxfdW5pdHRlc3QuY2MKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlICJiYXNlL3Rlc3QvbWV0cmljcy9oaXN0b2dyYW1fdGVzdGVyLmgiCiAjaW5jbHVkZSAiYmFzZS92YWx1ZXMuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS9hdXRvZmlsbC9wYXltZW50cy9sb2NhbF9jYXJkX21pZ3JhdGlvbl9idWJibGUuaCIKKyNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS9hdXRvZmlsbC90ZXN0L3Rlc3RfYXV0b2ZpbGxfYnViYmxlX2hhbmRsZXIuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS90YWJzL3RhYl9zdHJpcF9tb2RlbC5oIgogI2luY2x1ZGUgImNocm9tZS90ZXN0L2Jhc2UvYnJvd3Nlcl93aXRoX3Rlc3Rfd2luZG93X3Rlc3QuaCIKICNpbmNsdWRlICJjaHJvbWUvdGVzdC9iYXNlL2Nocm9tZV9yZW5kZXJfdmlld19ob3N0X3Rlc3RfaGFybmVzcy5oIgpAQCAtNTksMjYgKzYwLDYgQEAKICAgYmFzZTo6VGltZURlbHRhIGVsYXBzZWRfOwogfTsKIAotY2xhc3MgVGVzdExvY2FsQ2FyZE1pZ3JhdGlvbkJ1YmJsZSBmaW5hbCA6IHB1YmxpYyBMb2NhbENhcmRNaWdyYXRpb25CdWJibGUgewotICB2b2lkIEhpZGUoKSBvdmVycmlkZSB7fQotfTsKLQotY2xhc3MgTG9jYWxDYXJkTWlncmF0aW9uQnViYmxlVGVzdEJyb3dzZXJXaW5kb3cgOiBwdWJsaWMgVGVzdEJyb3dzZXJXaW5kb3cgewotIHB1YmxpYzoKLSAgTG9jYWxDYXJkTWlncmF0aW9uQnViYmxlKiBTaG93TG9jYWxDYXJkTWlncmF0aW9uQnViYmxlKAotICAgICAgY29udGVudDo6V2ViQ29udGVudHMqIGNvbnRlbnRzLAotICAgICAgTG9jYWxDYXJkTWlncmF0aW9uQnViYmxlQ29udHJvbGxlciogY29udHJvbGxlciwKLSAgICAgIGJvb2wgdXNlcl9nZXN0dXJlKSBvdmVycmlkZSB7Ci0gICAgdGVzdF9sb2NhbF9jYXJkX21pZ3JhdGlvbl9idWJibGVfID0KLSAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxUZXN0TG9jYWxDYXJkTWlncmF0aW9uQnViYmxlPigpOwotICAgIHJldHVybiB0ZXN0X2xvY2FsX2NhcmRfbWlncmF0aW9uX2J1YmJsZV8uZ2V0KCk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0ZDo6dW5pcXVlX3B0cjxUZXN0TG9jYWxDYXJkTWlncmF0aW9uQnViYmxlPgotICAgICAgdGVzdF9sb2NhbF9jYXJkX21pZ3JhdGlvbl9idWJibGVfOwotfTsKLQogfSAgLy8gbmFtZXNwYWNlCiAKIGNsYXNzIExvY2FsQ2FyZE1pZ3JhdGlvbkJ1YmJsZUNvbnRyb2xsZXJJbXBsVGVzdApAQCAtOTQsMTAgKzc1LDYgQEAKICAgICBUZXN0TG9jYWxDYXJkTWlncmF0aW9uQnViYmxlQ29udHJvbGxlckltcGw6OkNyZWF0ZUZvclRlc3Rpbmcod2ViX2NvbnRlbnRzKTsKICAgfQogCi0gIHN0ZDo6dW5pcXVlX3B0cjxCcm93c2VyV2luZG93PiBDcmVhdGVCcm93c2VyV2luZG93KCkgb3ZlcnJpZGUgewotICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPExvY2FsQ2FyZE1pZ3JhdGlvbkJ1YmJsZVRlc3RCcm93c2VyV2luZG93PigpOwotICB9Ci0KICBwcm90ZWN0ZWQ6CiAgIHZvaWQgU2hvd0J1YmJsZSgpIHsKICAgICBjb250cm9sbGVyKCktPlNob3dCdWJibGUoYmFzZTo6QmluZE9uY2UoJkxvY2FsQ2FyZE1pZ3JhdGlvbkNhbGxiYWNrKSk7CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci91aS9hdXRvZmlsbC9wYXltZW50cy9zYXZlX2NhcmRfYnViYmxlX2NvbnRyb2xsZXJfaW1wbC5jYyBiL2Nocm9tZS9icm93c2VyL3VpL2F1dG9maWxsL3BheW1lbnRzL3NhdmVfY2FyZF9idWJibGVfY29udHJvbGxlcl9pbXBsLmNjCmluZGV4IDMzMGI5NWYuLjc1NmRiMDggMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3VpL2F1dG9maWxsL3BheW1lbnRzL3NhdmVfY2FyZF9idWJibGVfY29udHJvbGxlcl9pbXBsLmNjCisrKyBiL2Nocm9tZS9icm93c2VyL3VpL2F1dG9maWxsL3BheW1lbnRzL3NhdmVfY2FyZF9idWJibGVfY29udHJvbGxlcl9pbXBsLmNjCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvc2lnbmluL3NpZ25pbl91aV91dGlsLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvc3NsL3NlY3VyaXR5X3N0YXRlX3RhYl9oZWxwZXIuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9zeW5jL3Byb2ZpbGVfc3luY19zZXJ2aWNlX2ZhY3RvcnkuaCIKKyNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS9hdXRvZmlsbC9hdXRvZmlsbF9idWJibGVfaGFuZGxlci5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL2F1dG9maWxsL3BheW1lbnRzL3BheW1lbnRzX3VpX2NvbnN0YW50cy5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL2F1dG9maWxsL3BheW1lbnRzL3NhdmVfY2FyZF9idWJibGVfdmlldy5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL2F1dG9maWxsL3BheW1lbnRzL3NhdmVfY2FyZF91aS5oIgpAQCAtNzYxLDggKzc2Miw5IEBACiAgIFVwZGF0ZVNhdmVDYXJkSWNvbigpOwogCiAgIEJyb3dzZXIqIGJyb3dzZXIgPSBjaHJvbWU6OkZpbmRCcm93c2VyV2l0aFdlYkNvbnRlbnRzKHdlYl9jb250ZW50cygpKTsKLSAgc2F2ZV9jYXJkX2J1YmJsZV92aWV3XyA9IGJyb3dzZXItPndpbmRvdygpLT5TaG93U2F2ZUNyZWRpdENhcmRCdWJibGUoCi0gICAgICB3ZWJfY29udGVudHMoKSwgdGhpcywgaXNfcmVzaG93Xyk7CisgIHNhdmVfY2FyZF9idWJibGVfdmlld18gPQorICAgICAgYnJvd3Nlci0+d2luZG93KCktPkdldEF1dG9maWxsQnViYmxlSGFuZGxlcigpLT5TaG93U2F2ZUNyZWRpdENhcmRCdWJibGUoCisgICAgICAgICAgd2ViX2NvbnRlbnRzKCksIHRoaXMsIGlzX3Jlc2hvd18pOwogICBEQ0hFQ0soc2F2ZV9jYXJkX2J1YmJsZV92aWV3Xyk7CiAKICAgLy8gVXBkYXRlIGljb24gYWZ0ZXIgY3JlYXRpbmcgfHNhdmVfY2FyZF9idWJibGVfdmlld198IHNvIHRoYXQgaWNvbiB3aWxsIHNob3cKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL2F1dG9maWxsL3BheW1lbnRzL3NhdmVfY2FyZF9idWJibGVfY29udHJvbGxlcl9pbXBsX3VuaXR0ZXN0LmNjIGIvY2hyb21lL2Jyb3dzZXIvdWkvYXV0b2ZpbGwvcGF5bWVudHMvc2F2ZV9jYXJkX2J1YmJsZV9jb250cm9sbGVyX2ltcGxfdW5pdHRlc3QuY2MKaW5kZXggODIwOTk4Ny4uZWNlNGE2NzggMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3VpL2F1dG9maWxsL3BheW1lbnRzL3NhdmVfY2FyZF9idWJibGVfY29udHJvbGxlcl9pbXBsX3VuaXR0ZXN0LmNjCisrKyBiL2Nocm9tZS9icm93c2VyL3VpL2F1dG9maWxsL3BheW1lbnRzL3NhdmVfY2FyZF9idWJibGVfY29udHJvbGxlcl9pbXBsX3VuaXR0ZXN0LmNjCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSAiYmFzZS92YWx1ZXMuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS9hdXRvZmlsbC9wYXltZW50cy9zYXZlX2NhcmRfYnViYmxlX3ZpZXcuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS9hdXRvZmlsbC9wYXltZW50cy9zYXZlX2NhcmRfdWkuaCIKKyNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS9hdXRvZmlsbC90ZXN0L3Rlc3RfYXV0b2ZpbGxfYnViYmxlX2hhbmRsZXIuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS90YWJzL3RhYl9zdHJpcF9tb2RlbC5oIgogI2luY2x1ZGUgImNocm9tZS90ZXN0L2Jhc2UvYnJvd3Nlcl93aXRoX3Rlc3Rfd2luZG93X3Rlc3QuaCIKICNpbmNsdWRlICJjaHJvbWUvdGVzdC9iYXNlL2Nocm9tZV9yZW5kZXJfdmlld19ob3N0X3Rlc3RfaGFybmVzcy5oIgpAQCAtOTMsMTAgKzk0LDYgQEAKICAgICAgICAgICAgIHByZWZzOjpQUkVWSU9VU19TQVZFX0NSRURJVF9DQVJEX1BST01QVF9VU0VSX0RFQ0lTSU9OX05PTkUpOwogICB9CiAKLSAgc3RkOjp1bmlxdWVfcHRyPEJyb3dzZXJXaW5kb3c+IENyZWF0ZUJyb3dzZXJXaW5kb3coKSBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8U2F2ZUNhcmRCdWJibGVUZXN0QnJvd3NlcldpbmRvdz4oKTsKLSAgfQotCiAgIHZvaWQgU2V0TGVnYWxNZXNzYWdlKAogICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2VfanNvbiwKICAgICAgIEF1dG9maWxsQ2xpZW50OjpTYXZlQ3JlZGl0Q2FyZE9wdGlvbnMgb3B0aW9ucyA9CkBAIC0xNTcsMjUgKzE1NCw2IEBACiAgIGJhc2U6OnRlc3Q6OlNjb3BlZEZlYXR1cmVMaXN0IHNjb3BlZF9mZWF0dXJlX2xpc3RfOwogCiAgcHJpdmF0ZToKLSAgY2xhc3MgVGVzdFNhdmVDYXJkQnViYmxlVmlldyBmaW5hbCA6IHB1YmxpYyBTYXZlQ2FyZEJ1YmJsZVZpZXcgewotICAgIHZvaWQgSGlkZSgpIG92ZXJyaWRlIHt9Ci0gIH07Ci0KLSAgY2xhc3MgU2F2ZUNhcmRCdWJibGVUZXN0QnJvd3NlcldpbmRvdyA6IHB1YmxpYyBUZXN0QnJvd3NlcldpbmRvdyB7Ci0gICBwdWJsaWM6Ci0gICAgU2F2ZUNhcmRCdWJibGVWaWV3KiBTaG93U2F2ZUNyZWRpdENhcmRCdWJibGUoCi0gICAgICAgIGNvbnRlbnQ6OldlYkNvbnRlbnRzKiBjb250ZW50cywKLSAgICAgICAgU2F2ZUNhcmRCdWJibGVDb250cm9sbGVyKiBjb250cm9sbGVyLAotICAgICAgICBib29sIHVzZXJfZ2VzdHVyZSkgb3ZlcnJpZGUgewotICAgICAgaWYgKCFzYXZlX2NhcmRfYnViYmxlX3ZpZXdfKQotICAgICAgICBzYXZlX2NhcmRfYnViYmxlX3ZpZXdfID0gc3RkOjptYWtlX3VuaXF1ZTxUZXN0U2F2ZUNhcmRCdWJibGVWaWV3PigpOwotICAgICAgcmV0dXJuIHNhdmVfY2FyZF9idWJibGVfdmlld18uZ2V0KCk7Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIHN0ZDo6dW5pcXVlX3B0cjxUZXN0U2F2ZUNhcmRCdWJibGVWaWV3PiBzYXZlX2NhcmRfYnViYmxlX3ZpZXdfOwotICB9OwotCiAgIHN0YXRpYyB2b2lkIFVwbG9hZFNhdmVDYXJkQ2FsbGJhY2soCiAgICAgICBBdXRvZmlsbENsaWVudDo6U2F2ZUNhcmRPZmZlclVzZXJEZWNpc2lvbiB1c2VyX2RlY2lzaW9uLAogICAgICAgY29uc3QgQXV0b2ZpbGxDbGllbnQ6OlVzZXJQcm92aWRlZENhcmREZXRhaWxzJgpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvdWkvYXV0b2ZpbGwvdGVzdC90ZXN0X2F1dG9maWxsX2J1YmJsZV9oYW5kbGVyLmNjIGIvY2hyb21lL2Jyb3dzZXIvdWkvYXV0b2ZpbGwvdGVzdC90ZXN0X2F1dG9maWxsX2J1YmJsZV9oYW5kbGVyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMDViM2QKLS0tIC9kZXYvbnVsbAorKysgYi9jaHJvbWUvYnJvd3Nlci91aS9hdXRvZmlsbC90ZXN0L3Rlc3RfYXV0b2ZpbGxfYnViYmxlX2hhbmRsZXIuY2MKQEAgLTAsMCArMSwzNiBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE5IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL2F1dG9maWxsL3Rlc3QvdGVzdF9hdXRvZmlsbF9idWJibGVfaGFuZGxlci5oIgorCituYW1lc3BhY2UgYXV0b2ZpbGwgeworCitUZXN0QXV0b2ZpbGxCdWJibGVIYW5kbGVyOjpUZXN0QXV0b2ZpbGxCdWJibGVIYW5kbGVyKCkgPSBkZWZhdWx0OworCitUZXN0QXV0b2ZpbGxCdWJibGVIYW5kbGVyOjp+VGVzdEF1dG9maWxsQnViYmxlSGFuZGxlcigpID0gZGVmYXVsdDsKKworU2F2ZUNhcmRCdWJibGVWaWV3KiBUZXN0QXV0b2ZpbGxCdWJibGVIYW5kbGVyOjpTaG93U2F2ZUNyZWRpdENhcmRCdWJibGUoCisgICAgY29udGVudDo6V2ViQ29udGVudHMqIHdlYl9jb250ZW50cywKKyAgICBTYXZlQ2FyZEJ1YmJsZUNvbnRyb2xsZXIqIGNvbnRyb2xsZXIsCisgICAgYm9vbCBpc191c2VyX2dlc3R1cmUpIHsKKyAgaWYgKCFzYXZlX2NhcmRfYnViYmxlX3ZpZXdfKQorICAgIHNhdmVfY2FyZF9idWJibGVfdmlld18gPSBzdGQ6Om1ha2VfdW5pcXVlPFRlc3RTYXZlQ2FyZEJ1YmJsZVZpZXc+KCk7CisgIHJldHVybiBzYXZlX2NhcmRfYnViYmxlX3ZpZXdfLmdldCgpOworfQorCitMb2NhbENhcmRNaWdyYXRpb25CdWJibGUqCitUZXN0QXV0b2ZpbGxCdWJibGVIYW5kbGVyOjpTaG93TG9jYWxDYXJkTWlncmF0aW9uQnViYmxlKAorICAgIGNvbnRlbnQ6OldlYkNvbnRlbnRzKiB3ZWJfY29udGVudHMsCisgICAgTG9jYWxDYXJkTWlncmF0aW9uQnViYmxlQ29udHJvbGxlciogY29udHJvbGxlciwKKyAgICBib29sIGlzX3VzZXJfZ2VzdHVyZSkgeworICBpZiAoIWxvY2FsX2NhcmRfbWlncmF0aW9uX2J1YmJsZV92aWV3XykgeworICAgIGxvY2FsX2NhcmRfbWlncmF0aW9uX2J1YmJsZV92aWV3XyA9CisgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8VGVzdExvY2FsQ2FyZE1pZ3JhdGlvbkJ1YmJsZVZpZXc+KCk7CisgIH0KKyAgcmV0dXJuIGxvY2FsX2NhcmRfbWlncmF0aW9uX2J1YmJsZV92aWV3Xy5nZXQoKTsKK30KKwordm9pZCBUZXN0QXV0b2ZpbGxCdWJibGVIYW5kbGVyOjpPblBhc3N3b3JkU2F2ZWQoKSB7fQorCit9ICAvLyBuYW1lc3BhY2UgYXV0b2ZpbGwKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL2F1dG9maWxsL3Rlc3QvdGVzdF9hdXRvZmlsbF9idWJibGVfaGFuZGxlci5oIGIvY2hyb21lL2Jyb3dzZXIvdWkvYXV0b2ZpbGwvdGVzdC90ZXN0X2F1dG9maWxsX2J1YmJsZV9oYW5kbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ5ZTcyYwotLS0gL2Rldi9udWxsCisrKyBiL2Nocm9tZS9icm93c2VyL3VpL2F1dG9maWxsL3Rlc3QvdGVzdF9hdXRvZmlsbF9idWJibGVfaGFuZGxlci5oCkBAIC0wLDAgKzEsNTEgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxOSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpZm5kZWYgQ0hST01FX0JST1dTRVJfVUlfQVVUT0ZJTExfVEVTVF9URVNUX0FVVE9GSUxMX0JVQkJMRV9IQU5ETEVSX0hfCisjZGVmaW5lIENIUk9NRV9CUk9XU0VSX1VJX0FVVE9GSUxMX1RFU1RfVEVTVF9BVVRPRklMTF9CVUJCTEVfSEFORExFUl9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiYmFzZS9tYWNyb3MuaCIKKyNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS9hdXRvZmlsbC9hdXRvZmlsbF9idWJibGVfaGFuZGxlci5oIgorI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL2F1dG9maWxsL3BheW1lbnRzL2xvY2FsX2NhcmRfbWlncmF0aW9uX2J1YmJsZS5oIgorI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL2F1dG9maWxsL3BheW1lbnRzL3NhdmVfY2FyZF9idWJibGVfdmlldy5oIgorCituYW1lc3BhY2UgYXV0b2ZpbGwgeworCitjbGFzcyBUZXN0TG9jYWxDYXJkTWlncmF0aW9uQnViYmxlVmlldyBmaW5hbCA6IHB1YmxpYyBMb2NhbENhcmRNaWdyYXRpb25CdWJibGUgeworICB2b2lkIEhpZGUoKSBvdmVycmlkZSB7fQorfTsKKworY2xhc3MgVGVzdFNhdmVDYXJkQnViYmxlVmlldyBmaW5hbCA6IHB1YmxpYyBTYXZlQ2FyZEJ1YmJsZVZpZXcgeworICB2b2lkIEhpZGUoKSBvdmVycmlkZSB7fQorfTsKKworY2xhc3MgVGVzdEF1dG9maWxsQnViYmxlSGFuZGxlciA6IHB1YmxpYyBBdXRvZmlsbEJ1YmJsZUhhbmRsZXIgeworIHB1YmxpYzoKKyAgVGVzdEF1dG9maWxsQnViYmxlSGFuZGxlcigpOworICB+VGVzdEF1dG9maWxsQnViYmxlSGFuZGxlcigpIG92ZXJyaWRlOworCisgIC8vIEF1dG9maWxsQnViYmxlSGFuZGxlcjoKKyAgU2F2ZUNhcmRCdWJibGVWaWV3KiBTaG93U2F2ZUNyZWRpdENhcmRCdWJibGUoCisgICAgICBjb250ZW50OjpXZWJDb250ZW50cyogd2ViX2NvbnRlbnRzLAorICAgICAgU2F2ZUNhcmRCdWJibGVDb250cm9sbGVyKiBjb250cm9sbGVyLAorICAgICAgYm9vbCBpc191c2VyX2dlc3R1cmUpIG92ZXJyaWRlOworICBMb2NhbENhcmRNaWdyYXRpb25CdWJibGUqIFNob3dMb2NhbENhcmRNaWdyYXRpb25CdWJibGUoCisgICAgICBjb250ZW50OjpXZWJDb250ZW50cyogd2ViX2NvbnRlbnRzLAorICAgICAgTG9jYWxDYXJkTWlncmF0aW9uQnViYmxlQ29udHJvbGxlciogY29udHJvbGxlciwKKyAgICAgIGJvb2wgaXNfdXNlcl9nZXN0dXJlKSBvdmVycmlkZTsKKyAgdm9pZCBPblBhc3N3b3JkU2F2ZWQoKSBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIHN0ZDo6dW5pcXVlX3B0cjxUZXN0TG9jYWxDYXJkTWlncmF0aW9uQnViYmxlVmlldz4KKyAgICAgIGxvY2FsX2NhcmRfbWlncmF0aW9uX2J1YmJsZV92aWV3XzsKKyAgc3RkOjp1bmlxdWVfcHRyPFRlc3RTYXZlQ2FyZEJ1YmJsZVZpZXc+IHNhdmVfY2FyZF9idWJibGVfdmlld187CisKKyAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFRlc3RBdXRvZmlsbEJ1YmJsZUhhbmRsZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGF1dG9maWxsCisKKyNlbmRpZiAgLy8gQ0hST01FX0JST1dTRVJfVUlfQVVUT0ZJTExfVEVTVF9URVNUX0FVVE9GSUxMX0JVQkJMRV9IQU5ETEVSX0hfCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci91aS9icm93c2VyX3dpbmRvdy5oIGIvY2hyb21lL2Jyb3dzZXIvdWkvYnJvd3Nlcl93aW5kb3cuaAppbmRleCAzM2IyNmY2Li4xMzRkZjE2MiAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvdWkvYnJvd3Nlcl93aW5kb3cuaAorKysgYi9jaHJvbWUvYnJvd3Nlci91aS9icm93c2VyX3dpbmRvdy5oCkBAIC00NSwxMCArNDUsNyBAQAogY2xhc3MgVG9vbGJhckFjdGlvbnNCYXI7CiAKIG5hbWVzcGFjZSBhdXRvZmlsbCB7Ci1jbGFzcyBMb2NhbENhcmRNaWdyYXRpb25CdWJibGVDb250cm9sbGVyOwotY2xhc3MgTG9jYWxDYXJkTWlncmF0aW9uQnViYmxlOwotY2xhc3MgU2F2ZUNhcmRCdWJibGVDb250cm9sbGVyOwotY2xhc3MgU2F2ZUNhcmRCdWJibGVWaWV3OworY2xhc3MgQXV0b2ZpbGxCdWJibGVIYW5kbGVyOwogfSAgLy8gbmFtZXNwYWNlIGF1dG9maWxsCiAKIG5hbWVzcGFjZSBjb250ZW50IHsKQEAgLTI1Myw4ICsyNTAsOSBAQAogICAvLyB0aGUgd2luZG93LiBSZXR1cm5zIHdoZXRoZXIgYW55IGNoYW5nZSBvY2N1cnJlZC4KICAgdmlydHVhbCBib29sIFVwZGF0ZVBhZ2VBY3Rpb25JY29uKFBhZ2VBY3Rpb25JY29uVHlwZSB0eXBlKSA9IDA7CiAKLSAgLy8gRXhlY3V0ZXMgaGlnaGxpZ2h0IGFuaW1hdGlvbiBvbiB0b29sYmFyJ3MgYXZhdGFyLgotICB2aXJ0dWFsIHZvaWQgU2hvd0F2YXRhckhpZ2hsaWdodEFuaW1hdGlvbigpID0gMDsKKyAgLy8gUmV0dXJucyB0aGUgQXV0b2ZpbGxCdWJibGVIYW5kbGVyIHJlc3BvbnNpYmxlIGZvciBoYW5kbGluZyBhbGwKKyAgLy8gQXV0b2ZpbGwtcmVsYXRlZCBidWJibGVzLgorICB2aXJ0dWFsIGF1dG9maWxsOjpBdXRvZmlsbEJ1YmJsZUhhbmRsZXIqIEdldEF1dG9maWxsQnViYmxlSGFuZGxlcigpID0gMDsKIAogICAvLyBFeGVjdXRlcyB0aGUgYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHBhZ2UgYWN0aW9uIGljb24uCiAgIHZpcnR1YWwgdm9pZCBFeGVjdXRlUGFnZUFjdGlvbkljb25Gb3JUZXN0aW5nKFBhZ2VBY3Rpb25JY29uVHlwZSB0eXBlKSA9IDA7CkBAIC0zNjUsMTggKzM2Myw2IEBACiAgICAgICBxcmNvZGVfZ2VuZXJhdG9yOjpRUkNvZGVHZW5lcmF0b3JCdWJibGVDb250cm9sbGVyKiBjb250cm9sbGVyLAogICAgICAgY29uc3QgR1VSTCYgdXJsKSA9IDA7CiAKLSAgLy8gU2hvd3MgdGhlICJTYXZlIGNyZWRpdCBjYXJkIiBidWJibGUuCi0gIHZpcnR1YWwgYXV0b2ZpbGw6OlNhdmVDYXJkQnViYmxlVmlldyogU2hvd1NhdmVDcmVkaXRDYXJkQnViYmxlKAotICAgICAgY29udGVudDo6V2ViQ29udGVudHMqIGNvbnRlbnRzLAotICAgICAgYXV0b2ZpbGw6OlNhdmVDYXJkQnViYmxlQ29udHJvbGxlciogY29udHJvbGxlciwKLSAgICAgIGJvb2wgaXNfdXNlcl9nZXN0dXJlKSA9IDA7Ci0KLSAgLy8gU2hvd3MgdGhlIGxvY2FsIGNhcmQgbWlncmF0aW9uIGJ1YmJsZS4KLSAgdmlydHVhbCBhdXRvZmlsbDo6TG9jYWxDYXJkTWlncmF0aW9uQnViYmxlKiBTaG93TG9jYWxDYXJkTWlncmF0aW9uQnViYmxlKAotICAgICAgY29udGVudDo6V2ViQ29udGVudHMqIGNvbnRlbnRzLAotICAgICAgYXV0b2ZpbGw6OkxvY2FsQ2FyZE1pZ3JhdGlvbkJ1YmJsZUNvbnRyb2xsZXIqIGNvbnRyb2xsZXIsCi0gICAgICBib29sIGlzX3VzZXJfZ2VzdHVyZSkgPSAwOwotCiAgIC8vIFNob3dzIHRoZSAic2VuZCB0YWIgdG8gc2VsZiIgYnViYmxlLgogICB2aXJ0dWFsIHNlbmRfdGFiX3RvX3NlbGY6OlNlbmRUYWJUb1NlbGZCdWJibGVWaWV3KiBTaG93U2VuZFRhYlRvU2VsZkJ1YmJsZSgKICAgICAgIGNvbnRlbnQ6OldlYkNvbnRlbnRzKiBjb250ZW50cywKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL2NvY29hL2NvbG9yX2Nob29zZXJfbWFjLmggYi9jaHJvbWUvYnJvd3Nlci91aS9jb2NvYS9jb2xvcl9jaG9vc2VyX21hYy5oCmluZGV4IDY0ZGEyMDcuLjViY2JmNzIwIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS9jb2NvYS9jb2xvcl9jaG9vc2VyX21hYy5oCisrKyBiL2Nocm9tZS9icm93c2VyL3VpL2NvY29hL2NvbG9yX2Nob29zZXJfbWFjLmgKQEAgLTExLDcgKzExLDggQEAKICNpbmNsdWRlICJjb21wb25lbnRzL3JlbW90ZV9jb2NvYS9jb21tb24vY29sb3JfcGFuZWwubW9qb20uaCIKICNpbmNsdWRlICJjb250ZW50L3B1YmxpYy9icm93c2VyL2NvbG9yX2Nob29zZXIuaCIKICNpbmNsdWRlICJjb250ZW50L3B1YmxpYy9icm93c2VyL3dlYl9jb250ZW50cy5oIgotI2luY2x1ZGUgIm1vam8vcHVibGljL2NwcC9iaW5kaW5ncy9iaW5kaW5nLmgiCisjaW5jbHVkZSAibW9qby9wdWJsaWMvY3BwL2JpbmRpbmdzL3JlY2VpdmVyLmgiCisjaW5jbHVkZSAibW9qby9wdWJsaWMvY3BwL2JpbmRpbmdzL3JlbW90ZS5oIgogCiBjbGFzcyBDb2xvckNob29zZXJNYWMgOiBwdWJsaWMgY29udGVudDo6Q29sb3JDaG9vc2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHJlbW90ZV9jb2NvYTo6bW9qb206OkNvbG9yUGFuZWxIb3N0IHsKQEAgLTQwLDggKzQxLDggQEAKICAgLy8gb3V0bGl2ZSB0aGlzIGNsYXNzLgogICBjb250ZW50OjpXZWJDb250ZW50cyogd2ViX2NvbnRlbnRzXzsKIAotICByZW1vdGVfY29jb2E6Om1vam9tOjpDb2xvclBhbmVsUHRyIG1vam9fcGFuZWxfcHRyXzsKLSAgbW9qbzo6QmluZGluZzxyZW1vdGVfY29jb2E6Om1vam9tOjpDb2xvclBhbmVsSG9zdD4gbW9qb19ob3N0X2JpbmRpbmdfOworICBtb2pvOjpSZW1vdGU8cmVtb3RlX2NvY29hOjptb2pvbTo6Q29sb3JQYW5lbD4gbW9qb19wYW5lbF9yZW1vdGVfOworICBtb2pvOjpSZWNlaXZlcjxyZW1vdGVfY29jb2E6Om1vam9tOjpDb2xvclBhbmVsSG9zdD4gbW9qb19ob3N0X3JlY2VpdmVyX3t0aGlzfTsKICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKENvbG9yQ2hvb3Nlck1hYyk7CiB9OwogCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci91aS9jb2NvYS9jb2xvcl9jaG9vc2VyX21hYy5tbSBiL2Nocm9tZS9icm93c2VyL3VpL2NvY29hL2NvbG9yX2Nob29zZXJfbWFjLm1tCmluZGV4IGZjYTE2ZjkuLjUwOTEyMWMgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3VpL2NvY29hL2NvbG9yX2Nob29zZXJfbWFjLm1tCisrKyBiL2Nocm9tZS9icm93c2VyL3VpL2NvY29hL2NvbG9yX2Nob29zZXJfbWFjLm1tCkBAIC05LDggKzksNyBAQAogI2luY2x1ZGUgImNvbXBvbmVudHMvcmVtb3RlX2NvY29hL2FwcF9zaGltL2NvbG9yX3BhbmVsX2JyaWRnZS5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvcmVtb3RlX2NvY29hL2Jyb3dzZXIvYXBwbGljYXRpb25faG9zdC5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvcmVtb3RlX2NvY29hL2Jyb3dzZXIvd2luZG93LmgiCi0jaW5jbHVkZSAibW9qby9wdWJsaWMvY3BwL2JpbmRpbmdzL2ludGVyZmFjZV9yZXF1ZXN0LmgiCi0jaW5jbHVkZSAibW9qby9wdWJsaWMvY3BwL2JpbmRpbmdzL3N0cm9uZ19iaW5kaW5nLmgiCisjaW5jbHVkZSAibW9qby9wdWJsaWMvY3BwL2JpbmRpbmdzL3NlbGZfb3duZWRfcmVjZWl2ZXIuaCIKICNpbmNsdWRlICJza2lhL2V4dC9za2lhX3V0aWxzX21hYy5oIgogCiBuYW1lc3BhY2UgewpAQCAtMzIsMjAgKzMxLDIwIEBACiAKIENvbG9yQ2hvb3Nlck1hYzo6Q29sb3JDaG9vc2VyTWFjKGNvbnRlbnQ6OldlYkNvbnRlbnRzKiB3ZWJfY29udGVudHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa0NvbG9yIGluaXRpYWxfY29sb3IpCi0gICAgOiB3ZWJfY29udGVudHNfKHdlYl9jb250ZW50cyksIG1vam9faG9zdF9iaW5kaW5nXyh0aGlzKSB7Ci0gIHJlbW90ZV9jb2NvYTo6bW9qb206OkNvbG9yUGFuZWxIb3N0UHRyIG1vam9faG9zdF9wdHI7Ci0gIG1vam9faG9zdF9iaW5kaW5nXy5CaW5kKG1vam86Ok1ha2VSZXF1ZXN0KCZtb2pvX2hvc3RfcHRyKSk7CisgICAgOiB3ZWJfY29udGVudHNfKHdlYl9jb250ZW50cykgewogICBhdXRvKiBhcHBsaWNhdGlvbl9ob3N0ID0gcmVtb3RlX2NvY29hOjpBcHBsaWNhdGlvbkhvc3Q6OkdldEZvck5hdGl2ZVZpZXcoCiAgICAgICB3ZWJfY29udGVudHMgPyB3ZWJfY29udGVudHMtPkdldE5hdGl2ZVZpZXcoKSA6IGdmeDo6TmF0aXZlVmlldygpKTsKICAgaWYgKGFwcGxpY2F0aW9uX2hvc3QpIHsKICAgICBhcHBsaWNhdGlvbl9ob3N0LT5HZXRBcHBsaWNhdGlvbigpLT5TaG93Q29sb3JQYW5lbCgKLSAgICAgICAgbW9qbzo6TWFrZVJlcXVlc3QoJm1vam9fcGFuZWxfcHRyXyksIHN0ZDo6bW92ZShtb2pvX2hvc3RfcHRyKSk7CisgICAgICAgIG1vam9fcGFuZWxfcmVtb3RlXy5CaW5kTmV3UGlwZUFuZFBhc3NSZWNlaXZlcigpLAorICAgICAgICBtb2pvX2hvc3RfcmVjZWl2ZXJfLkJpbmROZXdQaXBlQW5kUGFzc1JlbW90ZSgpKTsKICAgfSBlbHNlIHsKLSAgICBtb2pvOjpNYWtlU3Ryb25nQmluZGluZyhzdGQ6Om1ha2VfdW5pcXVlPHJlbW90ZV9jb2NvYTo6Q29sb3JQYW5lbEJyaWRnZT4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShtb2pvX2hvc3RfcHRyKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9qbzo6TWFrZVJlcXVlc3QoJm1vam9fcGFuZWxfcHRyXykpOworICAgIG1vam86Ok1ha2VTZWxmT3duZWRSZWNlaXZlcigKKyAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxyZW1vdGVfY29jb2E6OkNvbG9yUGFuZWxCcmlkZ2U+KAorICAgICAgICAgICAgbW9qb19ob3N0X3JlY2VpdmVyXy5CaW5kTmV3UGlwZUFuZFBhc3NSZW1vdGUoKSksCisgICAgICAgIG1vam9fcGFuZWxfcmVtb3RlXy5CaW5kTmV3UGlwZUFuZFBhc3NSZWNlaXZlcigpKTsKICAgfQotICBtb2pvX3BhbmVsX3B0cl8tPlNob3coaW5pdGlhbF9jb2xvcik7CisgIG1vam9fcGFuZWxfcmVtb3RlXy0+U2hvdyhpbml0aWFsX2NvbG9yKTsKIH0KIAogQ29sb3JDaG9vc2VyTWFjOjp+Q29sb3JDaG9vc2VyTWFjKCkgewpAQCAtNzMsNyArNzIsNyBAQAogfQogCiB2b2lkIENvbG9yQ2hvb3Nlck1hYzo6U2V0U2VsZWN0ZWRDb2xvcihTa0NvbG9yIGNvbG9yKSB7Ci0gIG1vam9fcGFuZWxfcHRyXy0+U2V0U2VsZWN0ZWRDb2xvcihjb2xvcik7CisgIG1vam9fcGFuZWxfcmVtb3RlXy0+U2V0U2VsZWN0ZWRDb2xvcihjb2xvcik7CiB9CiAKIG5hbWVzcGFjZSBjaHJvbWUgewpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvdWkvY29jb2EvamF2YXNjcmlwdF9hcHBfbW9kYWxfZGlhbG9nX2NvY29hLmggYi9jaHJvbWUvYnJvd3Nlci91aS9jb2NvYS9qYXZhc2NyaXB0X2FwcF9tb2RhbF9kaWFsb2dfY29jb2EuaAppbmRleCA3MTZiZDYwLi4wZTY0NGY3IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS9jb2NvYS9qYXZhc2NyaXB0X2FwcF9tb2RhbF9kaWFsb2dfY29jb2EuaAorKysgYi9jaHJvbWUvYnJvd3Nlci91aS9jb2NvYS9qYXZhc2NyaXB0X2FwcF9tb2RhbF9kaWFsb2dfY29jb2EuaApAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgImNvbXBvbmVudHMvYXBwX21vZGFsL25hdGl2ZV9hcHBfbW9kYWxfZGlhbG9nLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9yZW1vdGVfY29jb2EvYXBwX3NoaW0vYWxlcnQuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL3JlbW90ZV9jb2NvYS9jb21tb24vYWxlcnQubW9qb20uaCIKKyNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvYmluZGluZ3MvcmVtb3RlLmgiCiAKIGNsYXNzIFBvcHVuZGVyUHJldmVudGVyOwogCkBAIC01MiwxMCArNTMsMTAgQEAKIAogICAvLyBDYWxsZWQgaWYgdGhlcmUgaXMgYW4gZXJyb3IgY29ubmVjdGluZyB0byB0aGUgYWxlcnQgcHJvY2Vzcy4gRGVsZXRlcwogICAvLyB8dGhpc3wuCi0gIHZvaWQgT25Db25uZWN0aW9uRXJyb3IoKTsKKyAgdm9pZCBPbk1vam9EaXNjb25uZWN0KCk7CiAKICAgLy8gTW9qbyBpbnRlcmZhY2UgdG8gdGhlIE5TQWxlcnQuCi0gIHJlbW90ZV9jb2NvYTo6bW9qb206OkFsZXJ0QnJpZGdlUHRyIGFsZXJ0X2JyaWRnZV87CisgIG1vam86OlJlbW90ZTxyZW1vdGVfY29jb2E6Om1vam9tOjpBbGVydEJyaWRnZT4gYWxlcnRfYnJpZGdlXzsKIAogICBzdGQ6OnVuaXF1ZV9wdHI8YXBwX21vZGFsOjpKYXZhU2NyaXB0QXBwTW9kYWxEaWFsb2c+IGRpYWxvZ187CiAgIHN0ZDo6dW5pcXVlX3B0cjxQb3B1bmRlclByZXZlbnRlcj4gcG9wdW5kZXJfcHJldmVudGVyXzsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL2NvY29hL2phdmFzY3JpcHRfYXBwX21vZGFsX2RpYWxvZ19jb2NvYS5tbSBiL2Nocm9tZS9icm93c2VyL3VpL2NvY29hL2phdmFzY3JpcHRfYXBwX21vZGFsX2RpYWxvZ19jb2NvYS5tbQppbmRleCA5OTVjYzQxNS4uODRkYmMxYiAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvdWkvY29jb2EvamF2YXNjcmlwdF9hcHBfbW9kYWxfZGlhbG9nX2NvY29hLm1tCisrKyBiL2Nocm9tZS9icm93c2VyL3VpL2NvY29hL2phdmFzY3JpcHRfYXBwX21vZGFsX2RpYWxvZ19jb2NvYS5tbQpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgImNvbXBvbmVudHMvc3RyaW5ncy9ncml0L2NvbXBvbmVudHNfc3RyaW5ncy5oIgogI2luY2x1ZGUgImNvbnRlbnQvcHVibGljL2Jyb3dzZXIvd2ViX2NvbnRlbnRzLmgiCiAjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvYnJvd3Nlci93ZWJfY29udGVudHNfZGVsZWdhdGUuaCIKKyNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvYmluZGluZ3MvcGVuZGluZ19yZWNlaXZlci5oIgogI2luY2x1ZGUgInVpL2FjY2VsZXJhdGVkX3dpZGdldF9tYWMvd2luZG93X3Jlc2l6ZV9oZWxwZXJfbWFjLmgiCiAjaW5jbHVkZSAidWkvYmFzZS9sMTBuL2wxMG5fdXRpbC5oIgogI2luY2x1ZGUgInVpL2Jhc2UvdWlfYmFzZV90eXBlcy5oIgpAQCAtMTA5LDcgKzExMCw3IEBACiAgIGRlbGV0ZSB0aGlzOwogfQogCi12b2lkIEphdmFTY3JpcHRBcHBNb2RhbERpYWxvZ0NvY29hOjpPbkNvbm5lY3Rpb25FcnJvcigpIHsKK3ZvaWQgSmF2YVNjcmlwdEFwcE1vZGFsRGlhbG9nQ29jb2E6Ok9uTW9qb0Rpc2Nvbm5lY3QoKSB7CiAgIGRpYWxvZygpLT5PbkNsb3NlKCk7CiAgIGRlbGV0ZSB0aGlzOwogfQpAQCAtMTM0LDEwICsxMzUsMTAgQEAKIHZvaWQgSmF2YVNjcmlwdEFwcE1vZGFsRGlhbG9nQ29jb2E6OlNob3dBcHBNb2RhbERpYWxvZygpIHsKICAgaXNfc2hvd2luZ18gPSB0cnVlOwogCi0gIHJlbW90ZV9jb2NvYTo6bW9qb206OkFsZXJ0QnJpZGdlUmVxdWVzdCBicmlkZ2VfcmVxdWVzdCA9Ci0gICAgICBtb2pvOjpNYWtlUmVxdWVzdCgmYWxlcnRfYnJpZGdlXyk7Ci0gIGFsZXJ0X2JyaWRnZV8uc2V0X2Nvbm5lY3Rpb25fZXJyb3JfaGFuZGxlcigKLSAgICAgIGJhc2U6OkJpbmRPbmNlKCZKYXZhU2NyaXB0QXBwTW9kYWxEaWFsb2dDb2NvYTo6T25Db25uZWN0aW9uRXJyb3IsCisgIG1vam86OlBlbmRpbmdSZWNlaXZlcjxyZW1vdGVfY29jb2E6Om1vam9tOjpBbGVydEJyaWRnZT4gYnJpZGdlX3JlY2VpdmVyID0KKyAgICAgIGFsZXJ0X2JyaWRnZV8uQmluZE5ld1BpcGVBbmRQYXNzUmVjZWl2ZXIoKTsKKyAgYWxlcnRfYnJpZGdlXy5zZXRfZGlzY29ubmVjdF9oYW5kbGVyKAorICAgICAgYmFzZTo6QmluZE9uY2UoJkphdmFTY3JpcHRBcHBNb2RhbERpYWxvZ0NvY29hOjpPbk1vam9EaXNjb25uZWN0LAogICAgICAgICAgICAgICAgICAgICAgd2Vha19mYWN0b3J5Xy5HZXRXZWFrUHRyKCkpKTsKICAgLy8gSWYgdGhlIGFsZXJ0IGlzIGZyb20gYSB3aW5kb3cgdGhhdCBpcyBvdXQgb2YgcHJvY2VzcyB0aGVuIHVzZSB0aGUKICAgLy8gcmVtb3RlX2NvY29hOjpBcHBsaWNhdGlvbkhvc3QgZm9yIHRoYXQgd2luZG93IHRvIGNyZWF0ZSB0aGUgYWxlcnQuCkBAIC0xNDYsOSArMTQ3LDkgQEAKICAgYXV0byogYXBwbGljYXRpb25faG9zdCA9IHJlbW90ZV9jb2NvYTo6QXBwbGljYXRpb25Ib3N0OjpHZXRGb3JOYXRpdmVWaWV3KAogICAgICAgZGlhbG9nXy0+d2ViX2NvbnRlbnRzKCktPkdldE5hdGl2ZVZpZXcoKSk7CiAgIGlmIChhcHBsaWNhdGlvbl9ob3N0KQotICAgIGFwcGxpY2F0aW9uX2hvc3QtPkdldEFwcGxpY2F0aW9uKCktPkNyZWF0ZUFsZXJ0KHN0ZDo6bW92ZShicmlkZ2VfcmVxdWVzdCkpOworICAgIGFwcGxpY2F0aW9uX2hvc3QtPkdldEFwcGxpY2F0aW9uKCktPkNyZWF0ZUFsZXJ0KHN0ZDo6bW92ZShicmlkZ2VfcmVjZWl2ZXIpKTsKICAgZWxzZQotICAgIGlnbm9yZV9yZXN1bHQobmV3IHJlbW90ZV9jb2NvYTo6QWxlcnRCcmlkZ2Uoc3RkOjptb3ZlKGJyaWRnZV9yZXF1ZXN0KSkpOworICAgIGlnbm9yZV9yZXN1bHQobmV3IHJlbW90ZV9jb2NvYTo6QWxlcnRCcmlkZ2Uoc3RkOjptb3ZlKGJyaWRnZV9yZWNlaXZlcikpKTsKICAgYWxlcnRfYnJpZGdlXy0+U2hvdygKICAgICAgIEdldEFsZXJ0UGFyYW1zKCksCiAgICAgICBiYXNlOjpCaW5kT25jZSgmSmF2YVNjcmlwdEFwcE1vZGFsRGlhbG9nQ29jb2E6Ok9uQWxlcnRGaW5pc2hlZCwKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL2xpYmd0a3VpL0JVSUxELmduIGIvY2hyb21lL2Jyb3dzZXIvdWkvbGliZ3RrdWkvQlVJTEQuZ24KaW5kZXggMjZlODM5MC4uYjFiOGUzMyAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvdWkvbGliZ3RrdWkvQlVJTEQuZ24KKysrIGIvY2hyb21lL2Jyb3dzZXIvdWkvbGliZ3RrdWkvQlVJTEQuZ24KQEAgLTIwLDcgKzIwLDYgQEAKICAgICAiZ3RrX3V0aWwuaCIsCiAgICAgImlucHV0X21ldGhvZF9jb250ZXh0X2ltcGxfZ3RrLmNjIiwKICAgICAiaW5wdXRfbWV0aG9kX2NvbnRleHRfaW1wbF9ndGsuaCIsCi0gICAgImxpYmd0a3VpX2V4cG9ydC5oIiwKICAgICAibmF0aXZlX3RoZW1lX2d0ay5jYyIsCiAgICAgIm5hdGl2ZV90aGVtZV9ndGsuaCIsCiAgICAgIm5hdl9idXR0b25fcHJvdmlkZXJfZ3RrLmNjIiwKQEAgLTM3LDE2ICszNiw5IEBACiAgICAgInNldHRpbmdzX3Byb3ZpZGVyLmgiLAogICAgICJzZXR0aW5nc19wcm92aWRlcl9ndGsuY2MiLAogICAgICJzZXR0aW5nc19wcm92aWRlcl9ndGsuaCIsCi0gICAgInNraWFfdXRpbHNfZ3RrLmNjIiwKLSAgICAic2tpYV91dGlsc19ndGsuaCIsCi0gICAgInVuaXR5X3NlcnZpY2UuY2MiLAotICAgICJ1bml0eV9zZXJ2aWNlLmgiLAogICBdCiAKLSAgY29uZmlncyArPSBbCi0gICAgIi8vYnVpbGQvY29uZmlnL2xpbnV4L3BhbmdvY2Fpcm8iLAotICAgICIvL2J1aWxkL2NvbmZpZy9saW51eDp4MTEiLAotICBdCisgIGNvbmZpZ3MgKz0gWyAiLy9idWlsZC9jb25maWcvbGludXgvcGFuZ29jYWlybyIgXQogCiAgIGlmICh1c2VfZ2lvKSB7CiAgICAgc291cmNlcyArPSBbCkBAIC02MCwyNiArNTIsMTUgQEAKICAgICBjb25maWdzICs9IFsgIi8vcHJpbnRpbmc6Y3VwcyIgXQogICB9CiAKLSAgZGVmaW5lcyA9IFsgIkxJQkdUS1VJX0lNUExFTUVOVEFUSU9OIiBdCisgIGRlZmluZXMgPSBbICJJU19MSUJHVEtVSV9JTVBMIiBdCiAKICAgZGVwcyA9IFsKICAgICAiLy9iYXNlIiwKLSAgICAiLy9iYXNlOmkxOG4iLAotICAgICIvL2Jhc2UvdGhpcmRfcGFydHkvZHluYW1pY19hbm5vdGF0aW9ucyIsCi0gICAgIi8vYnVpbGQ6YnJhbmRpbmdfYnVpbGRmbGFncyIsCiAgICAgIi8vYnVpbGQvY29uZmlnL2xpbnV4L2d0ayIsCiAgICAgIi8vYnVpbGQvY29uZmlnL2xpbnV4L2d0azpndGtwcmludCIsCi0gICAgIi8vY2MvcGFpbnQiLAotICAgICIvL2Nocm9tZTpleHRyYV9yZXNvdXJjZXMiLAotICAgICIvL2Nocm9tZTpyZXNvdXJjZXMiLAotICAgICIvL2Nocm9tZTpzdHJpbmdzIiwKLSAgICAiLy9jaHJvbWUvYXBwOmNvbW1hbmRfaWRzIiwKLSAgICAiLy9jaHJvbWUvYXBwL3RoZW1lOnRoZW1lX3Jlc291cmNlcyIsCiAgICAgIi8vY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MiLAotICAgICIvL2Nocm9tZS9jb21tb246YnVpbGRmbGFncyIsCiAgICAgIi8vY2hyb21lL2NvbW1vbjpjb25zdGFudHMiLAogICAgICIvL2NvbXBvbmVudHMvcHJlZnMiLAotICAgICIvL2NvbXBvbmVudHMvcmVzb3VyY2VzIiwKICAgICAiLy9jb250ZW50L3B1YmxpYy9icm93c2VyIiwKICAgICAiLy9wcmludGluZyIsCiAgICAgIi8vc2tpYSIsCkBAIC05NiwxMSArNzcsOSBAQAogICAgICIvL3VpL2V2ZW50cyIsCiAgICAgIi8vdWkvZXZlbnRzOmRvbV9rZXlib2FyZF9sYXlvdXQiLAogICAgICIvL3VpL2V2ZW50czpkb21fa2V5Y29kZV9jb252ZXJ0ZXIiLAotICAgICIvL3VpL2V2ZW50czpldmVudHNfYmFzZSIsCiAgICAgIi8vdWkvZ2Z4IiwKICAgICAiLy91aS9nZngvZ2VvbWV0cnkiLAogICAgICIvL3VpL25hdGl2ZV90aGVtZSIsCi0gICAgIi8vdWkvcmVzb3VyY2VzIiwKICAgICAiLy91aS9zaGVsbF9kaWFsb2dzIiwKICAgICAiLy91aS9zdHJpbmdzIiwKICAgICAiLy91aS92aWV3cyIsCkBAIC0xMTUsNiArOTQsOCBAQAogICAgICAgImd0a19ldmVudF9sb29wX3gxMS5oIiwKICAgICBdCiAKKyAgICBjb25maWdzICs9IFsgIi8vYnVpbGQvY29uZmlnL2xpbnV4OngxMSIgXQorCiAgICAgZGVmaW5lcyArPSBbICJVU0VfR1RLX0VWRU5UX0xPT1BfWDExIiBdCiAKICAgICBkZXBzICs9IFsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL2xpYmd0a3VpL2d0a19rZXlfYmluZGluZ3NfaGFuZGxlci5jYyBiL2Nocm9tZS9icm93c2VyL3VpL2xpYmd0a3VpL2d0a19rZXlfYmluZGluZ3NfaGFuZGxlci5jYwppbmRleCBmZTc0OTkyLi5kNjNiZGNiIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS9saWJndGt1aS9ndGtfa2V5X2JpbmRpbmdzX2hhbmRsZXIuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvdWkvbGliZ3RrdWkvZ3RrX2tleV9iaW5kaW5nc19oYW5kbGVyLmNjCkBAIC0zNTUsNyArMzU1LDcgQEAKIHZvaWQgR3RrS2V5QmluZGluZ3NIYW5kbGVyOjpNb3ZlVmlld3BvcnQoR3RrVGV4dFZpZXcqIHRleHRfdmlldywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3RrU2Nyb2xsU3RlcCBzdGVwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50IGNvdW50KSB7Ci0gIC8vIE5vdCBzdXBwb3J0ZWQgYnkgd2Via2l0LgorICAvLyBOb3Qgc3VwcG9ydGVkIGJ5IEJsaW5rLgogfQogCiB2b2lkIEd0a0tleUJpbmRpbmdzSGFuZGxlcjo6UGFzdGVDbGlwYm9hcmQoR3RrVGV4dFZpZXcqIHRleHRfdmlldykgewpAQCAtMzc1LDExICszNzUsMTEgQEAKIH0KIAogdm9pZCBHdGtLZXlCaW5kaW5nc0hhbmRsZXI6OlRvZ2dsZUN1cnNvclZpc2libGUoR3RrVGV4dFZpZXcqIHRleHRfdmlldykgewotICAvLyBOb3Qgc3VwcG9ydGVkIGJ5IHdlYmtpdC4KKyAgLy8gTm90IHN1cHBvcnRlZCBieSBCbGluay4KIH0KIAogdm9pZCBHdGtLZXlCaW5kaW5nc0hhbmRsZXI6OlRvZ2dsZU92ZXJ3cml0ZShHdGtUZXh0VmlldyogdGV4dF92aWV3KSB7Ci0gIC8vIE5vdCBzdXBwb3J0ZWQgYnkgd2Via2l0LgorICAvLyBOb3Qgc3VwcG9ydGVkIGJ5IEJsaW5rLgogfQogCiAjaWYgIUdUS19DSEVDS19WRVJTSU9OKDMsIDkwLCAwKQpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvdWkvbGliZ3RrdWkvZ3RrX2tleV9iaW5kaW5nc19oYW5kbGVyLmggYi9jaHJvbWUvYnJvd3Nlci91aS9saWJndGt1aS9ndGtfa2V5X2JpbmRpbmdzX2hhbmRsZXIuaAppbmRleCA4YTliYzNjLi5iYjM3MDczNiAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvdWkvbGliZ3RrdWkvZ3RrX2tleV9iaW5kaW5nc19oYW5kbGVyLmgKKysrIGIvY2hyb21lL2Jyb3dzZXIvdWkvbGliZ3RrdWkvZ3RrX2tleV9iaW5kaW5nc19oYW5kbGVyLmgKQEAgLTM0LDEwICszNCw4IEBACiAvLyBjbGFzcyBkZXJpdmVkIGZyb20gR3RrVGV4dFZpZXcgaXMgdXNlZCwgd2hpY2ggb3ZlcnJpZGVzIGFsbCBzaWduYWxzIHJlbGF0ZWQKIC8vIHRvIGtleSBiaW5kaW5ncywgdG8gbWFrZSBzdXJlIEd0a1RleHRWaWV3IHdvbid0IHJlY2VpdmUgdGhlbS4KIC8vCi0vLyBTZWUgdGhpcmRfcGFydHkvV2ViS2l0L1NvdXJjZS9XZWJDb3JlL2VkaXRpbmcvRWRpdG9yQ29tbWFuZC5jcHAgZm9yIGRldGFpbGVkCi0vLyBkZWZpbml0aW9uIG9mIHdlYmtpdCBlZGl0IGNvbW1hbmRzLgotLy8gU2VlIHdlYmtpdC9nbHVlL2VkaXRvcl9jbGllbnRfaW1wbC5jYyBmb3Iga2V5IGJpbmRpbmdzIHByZWRlZmluZWQgaW4gb3VyCi0vLyB3ZWJraXQgZ2x1ZS4KKy8vIFNlZSB0aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL2VkaXRpbmcvY29tbWFuZHMvZWRpdG9yX2NvbW1hbmQuY2MgZm9yCisvLyBkZXRhaWxlZCBkZWZpbml0aW9uIG9mIEJsaW5rIGVkaXQgY29tbWFuZHMuCiBjbGFzcyBHdGtLZXlCaW5kaW5nc0hhbmRsZXIgewogIHB1YmxpYzoKICAgR3RrS2V5QmluZGluZ3NIYW5kbGVyKCk7CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci91aS9saWJndGt1aS9ndGtfdWkuY2MgYi9jaHJvbWUvYnJvd3Nlci91aS9saWJndGt1aS9ndGtfdWkuY2MKaW5kZXggODYwMjkyZTIuLjRmNTYyNGQgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3VpL2xpYmd0a3VpL2d0a191aS5jYworKysgYi9jaHJvbWUvYnJvd3Nlci91aS9saWJndGt1aS9ndGtfdWkuY2MKQEAgLTE2LDcgKzE2LDYgQEAKICNpbmNsdWRlICJiYXNlL2NvbnRhaW5lcnMvZmxhdF9tYXAuaCIKICNpbmNsdWRlICJiYXNlL2RlYnVnL2xlYWtfYW5ub3RhdGlvbnMuaCIKICNpbmNsdWRlICJiYXNlL2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiYmFzZS9pMThuL3J0bC5oIgogI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgogI2luY2x1ZGUgImJhc2Uvbml4L21pbWVfdXRpbF94ZGcuaCIKICNpbmNsdWRlICJiYXNlL25peC94ZGdfdXRpbC5oIgpAQCAtMzMsOCArMzIsNiBAQAogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL2xpYmd0a3VpL3ByaW50aW5nX2d0a191dGlsLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvbGliZ3RrdWkvc2VsZWN0X2ZpbGVfZGlhbG9nX2ltcGwuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS9saWJndGt1aS9zZXR0aW5nc19wcm92aWRlcl9ndGsuaCIKLSNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS9saWJndGt1aS9za2lhX3V0aWxzX2d0ay5oIgotI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL2xpYmd0a3VpL3VuaXR5X3NlcnZpY2UuaCIKICNpbmNsdWRlICJjaHJvbWUvY29tbW9uL3ByZWZfbmFtZXMuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL3ByZWZzL3ByZWZfc2VydmljZS5oIgogI2luY2x1ZGUgInByaW50aW5nL2J1aWxkZmxhZ3MvYnVpbGRmbGFncy5oIgpAQCAtNDUsNyArNDIsNiBAQAogI2luY2x1ZGUgInVpL2Jhc2UvaW1lL2xpbnV4L2Zha2VfaW5wdXRfbWV0aG9kX2NvbnRleHQuaCIKICNpbmNsdWRlICJ1aS9iYXNlL2ltZS9saW51eC9saW51eF9pbnB1dF9tZXRob2RfY29udGV4dC5oIgogI2luY2x1ZGUgInVpL2Jhc2UvaW1lL2xpbnV4L2xpbnV4X2lucHV0X21ldGhvZF9jb250ZXh0X2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJ1aS9iYXNlL3Jlc291cmNlL3Jlc291cmNlX2J1bmRsZS5oIgogI2luY2x1ZGUgInVpL2Rpc3BsYXkvZGlzcGxheS5oIgogI2luY2x1ZGUgInVpL2V2ZW50cy9rZXljb2Rlcy9kb20vZG9tX2NvZGUuaCIKICNpbmNsdWRlICJ1aS9ldmVudHMva2V5Y29kZXMvZG9tL2RvbV9rZXlib2FyZF9sYXlvdXRfbWFuYWdlci5oIgpAQCAtNjUsNyArNjEsNiBAQAogI2luY2x1ZGUgInVpL3ZpZXdzL2NvbnRyb2xzL2J1dHRvbi9sYWJlbF9idXR0b25fYm9yZGVyLmgiCiAjaW5jbHVkZSAidWkvdmlld3MvbGludXhfdWkvZGV2aWNlX3NjYWxlX2ZhY3Rvcl9vYnNlcnZlci5oIgogI2luY2x1ZGUgInVpL3ZpZXdzL2xpbnV4X3VpL3dpbmRvd19idXR0b25fb3JkZXJfb2JzZXJ2ZXIuaCIKLSNpbmNsdWRlICJ1aS92aWV3cy9yZXNvdXJjZXMvZ3JpdC92aWV3c19yZXNvdXJjZXMuaCIKIAogI2lmIGRlZmluZWQoVVNFX0dJTykKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS9saWJndGt1aS9zZXR0aW5nc19wcm92aWRlcl9nc2V0dGluZ3MuaCIKQEAgLTkwLDE0ICs4NSw2IEBACiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvbmF2X2J1dHRvbl9wcm92aWRlci5oIgogI2VuZGlmCiAKLS8vIEEgbWluaW1pemVkIHBvcnQgb2YgR3RrVGhlbWVTZXJ2aWNlIGludG8gc29tZXRoaW5nIHRoYXQgY2FuIHByb3ZpZGUgY29sb3JzCi0vLyBhbmQgaW1hZ2VzIGZvciBhdXJhLgotLy8KLS8vIFRPRE8oZXJnKTogVGhlcmUncyBzdGlsbCBhIGxvdCB0aGF0IG5lZWRzIHBvcnRlZCBvciBkb25lIGZvciB0aGUgZmlyc3QgdGltZToKLS8vCi0vLyAtIFJlbmRlciBhbmQgaW5qZWN0IHRoZSBvbW5pYm94IGJhY2tncm91bmQuCi0vLyAtIE1ha2Ugc3VyZSB0byB0ZXN0IHdpdGggYSBsaWdodCBvbiBkYXJrIHRoZW1lLCB0b28uCi0KIG5hbWVzcGFjZSBsaWJndGt1aSB7CiAKIG5hbWVzcGFjZSB7CkBAIC0zMzksNiArMzI2LDYxIEBACiB9CiAjZW5kaWYgIC8vIGRlZmluZWQoVVNFX0dUS19FVkVOVF9MT09QX1gxMSkKIAorY29uc3QgU2tCaXRtYXAgR2RrUGl4YnVmVG9Ta0JpdG1hcChHZGtQaXhidWYqIHBpeGJ1ZikgeworICAvLyBUT0RPKGVyZyk6IFdoYXQgZG8gd2UgZG8gaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHBpeGJ1ZiBmYWlscyB0aGVzZSBkY2hlY2tzPworICAvLyBJIHdvdWxkIHByZWZlciB0byB1c2Ugb3VyIGd0ayBiYXNlZCBjYW52YXMsIGJ1dCB0aGF0IHdvdWxkIHJlcXVpcmUKKyAgLy8gcmVjb21waWxpbmcgaGFsZiBvZiBvdXIgc2tpYSBleHRlbnNpb25zIHdpdGggZ3RrIHN1cHBvcnQsIHdoaWNoIHdlIGNhbid0CisgIC8vIGRvIGluIHRoaXMgYnVpbGQuCisgIERDSEVDS19FUShHREtfQ09MT1JTUEFDRV9SR0IsIGdka19waXhidWZfZ2V0X2NvbG9yc3BhY2UocGl4YnVmKSk7CisKKyAgaW50IG5fY2hhbm5lbHMgPSBnZGtfcGl4YnVmX2dldF9uX2NoYW5uZWxzKHBpeGJ1Zik7CisgIGludCB3ID0gZ2RrX3BpeGJ1Zl9nZXRfd2lkdGgocGl4YnVmKTsKKyAgaW50IGggPSBnZGtfcGl4YnVmX2dldF9oZWlnaHQocGl4YnVmKTsKKworICBTa0JpdG1hcCByZXQ7CisgIHJldC5hbGxvY04zMlBpeGVscyh3LCBoKTsKKyAgcmV0LmVyYXNlQ29sb3IoMCk7CisKKyAgdWludDMyX3QqIHNraWFfZGF0YSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Kj4ocmV0LmdldEFkZHIoMCwgMCkpOworCisgIGlmIChuX2NoYW5uZWxzID09IDQpIHsKKyAgICBpbnQgdG90YWxfbGVuZ3RoID0gdyAqIGg7CisgICAgZ3VjaGFyKiBnZGtfcGl4ZWxzID0gZ2RrX3BpeGJ1Zl9nZXRfcGl4ZWxzKHBpeGJ1Zik7CisKKyAgICAvLyBOb3cgaGVyZSdzIHRoZSB0cmljazogd2UgbmVlZCB0byBjb252ZXJ0IHRoZSBnZGsgZGF0YSAod2hpY2ggaXMgUkdCQSBhbmQKKyAgICAvLyBpc24ndCBwcmVtdWx0aXBsaWVkKSB0byBza2lhICh3aGljaCBjYW4gYmUgYW55dGhpbmcgYW5kIHByZW11bHRpcGxpZWQpLgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxfbGVuZ3RoOyArK2ksIGdka19waXhlbHMgKz0gNCkgeworICAgICAgY29uc3QgdW5zaWduZWQgY2hhciYgcmVkID0gZ2RrX3BpeGVsc1swXTsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXImIGdyZWVuID0gZ2RrX3BpeGVsc1sxXTsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXImIGJsdWUgPSBnZGtfcGl4ZWxzWzJdOworICAgICAgY29uc3QgdW5zaWduZWQgY2hhciYgYWxwaGEgPSBnZGtfcGl4ZWxzWzNdOworCisgICAgICBza2lhX2RhdGFbaV0gPSBTa1ByZU11bHRpcGx5QVJHQihhbHBoYSwgcmVkLCBncmVlbiwgYmx1ZSk7CisgICAgfQorICB9IGVsc2UgaWYgKG5fY2hhbm5lbHMgPT0gMykgeworICAgIC8vIEJlY2F1c2UgR0RLIG1ha2VzIHJvd3N0cmlkZXMgd29yZCBhbGlnbmVkLCB3ZSBuZWVkIHRvIGRvIHNvbWV0aGluZyBhIGJpdAorICAgIC8vIG1vcmUgY29tcGxleCB3aGVuIGEgcGl4ZWwgaXNuJ3QgcGVyZmVjdGx5IGEgd29yZCBvZiBtZW1vcnkuCisgICAgaW50IHJvd3N0cmlkZSA9IGdka19waXhidWZfZ2V0X3Jvd3N0cmlkZShwaXhidWYpOworICAgIGd1Y2hhciogZ2RrX3BpeGVscyA9IGdka19waXhidWZfZ2V0X3BpeGVscyhwaXhidWYpOworICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaDsgKyt5KSB7CisgICAgICBpbnQgcm93ID0geSAqIHJvd3N0cmlkZTsKKworICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3OyArK3gpIHsKKyAgICAgICAgZ3VjaGFyKiBwaXhlbCA9IGdka19waXhlbHMgKyByb3cgKyAoeCAqIDMpOworICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyJiByZWQgPSBwaXhlbFswXTsKKyAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciYgZ3JlZW4gPSBwaXhlbFsxXTsKKyAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciYgYmx1ZSA9IHBpeGVsWzJdOworCisgICAgICAgIHNraWFfZGF0YVt5ICogdyArIHhdID0gU2tQcmVNdWx0aXBseUFSR0IoMjU1LCByZWQsIGdyZWVuLCBibHVlKTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgTk9UUkVBQ0hFRCgpOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKwogfSAgLy8gbmFtZXNwYWNlCiAKIEd0a1VpOjpHdGtVaSgpIHsKQEAgLTQ5NCw4ICs1MzYsNyBAQAogCiAgIC8vIERpdmlkaW5nIEdUSydzIGN1cnNvciBibGluayBjeWNsZSB0aW1lIChpbiBtaWxsaXNlY29uZHMpIGJ5IHRoaXMgdmFsdWUKICAgLy8geWllbGRzIGFuIGFwcHJvcHJpYXRlIHZhbHVlIGZvcgotICAvLyBibGluazo6bW9qb206OlJlbmRlcmVyUHJlZmVyZW5jZXM6OmNhcmV0X2JsaW5rX2ludGVydmFsLiAgVGhpcwotICAvLyBtYXRjaGVzIHRoZSBsb2dpYyBpbiB0aGUgV2ViS2l0IEdUSyBwb3J0LgorICAvLyBibGluazo6bW9qb206OlJlbmRlcmVyUHJlZmVyZW5jZXM6OmNhcmV0X2JsaW5rX2ludGVydmFsLgogICBzdGF0aWMgY29uc3QgZG91YmxlIGtHdGtDdXJzb3JCbGlua0N5Y2xlRmFjdG9yID0gMjAwMC4wOwogCiAgIGdpbnQgY3Vyc29yX2JsaW5rX3RpbWUgPSBrR3RrRGVmYXVsdEN1cnNvckJsaW5rVGltZTsKQEAgLTU0MywxNiArNTg0LDYgQEAKICAgcmV0dXJuIGZhbHNlOwogfQogCi12b2lkIEd0a1VpOjpTZXREb3dubG9hZENvdW50KGludCBjb3VudCkgY29uc3QgewotICBpZiAodW5pdHk6OklzUnVubmluZygpKQotICAgIHVuaXR5OjpTZXREb3dubG9hZENvdW50KGNvdW50KTsKLX0KLQotdm9pZCBHdGtVaTo6U2V0UHJvZ3Jlc3NGcmFjdGlvbihmbG9hdCBwZXJjZW50YWdlKSBjb25zdCB7Ci0gIGlmICh1bml0eTo6SXNSdW5uaW5nKCkpCi0gICAgdW5pdHk6OlNldFByb2dyZXNzRnJhY3Rpb24ocGVyY2VudGFnZSk7Ci19Ci0KIGdmeDo6SW1hZ2UgR3RrVWk6OkdldEljb25Gb3JDb250ZW50VHlwZShjb25zdCBzdGQ6OnN0cmluZyYgY29udGVudF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKSBjb25zdCB7CiAgIC8vIFRoaXMgY2FsbCBkb2Vzbid0IHRha2UgYSByZWZlcmVuY2UuCkBAIC01NzEsNyArNjAyLDcgQEAKICAgICBpZiAoIXBpeGJ1ZikKICAgICAgIGNvbnRpbnVlOwogCi0gICAgU2tCaXRtYXAgYml0bWFwID0gR2RrUGl4YnVmVG9JbWFnZVNraWEocGl4YnVmLmdldCgpKTsKKyAgICBTa0JpdG1hcCBiaXRtYXAgPSBHZGtQaXhidWZUb1NrQml0bWFwKHBpeGJ1Zi5nZXQoKSk7CiAgICAgRENIRUNLX0VRKHNpemUsIGJpdG1hcC53aWR0aCgpKTsKICAgICBEQ0hFQ0tfRVEoc2l6ZSwgYml0bWFwLmhlaWdodCgpKTsKICAgICBnZng6OkltYWdlU2tpYSBpbWFnZV9za2lhID0gZ2Z4OjpJbWFnZVNraWE6OkNyZWF0ZUZyb20xeEJpdG1hcChiaXRtYXApOwpAQCAtODQ4LDcgKzg3OSw3IEBACiAgIGNvbG9yc19bVGhlbWVQcm9wZXJ0aWVzOjpDT0xPUl9OVFBfTElOS10gPSBuYXRpdmVfdGhlbWVfLT5HZXRTeXN0ZW1Db2xvcigKICAgICAgIHVpOjpOYXRpdmVUaGVtZTo6a0NvbG9ySWRfVGV4dGZpZWxkU2VsZWN0aW9uQmFja2dyb3VuZEZvY3VzZWQpOwogCi0gIC8vIEdlbmVyYXRlIHRoZSBjb2xvcnMgdGhhdCB3ZSBwYXNzIHRvIFdlYktpdC4KKyAgLy8gR2VuZXJhdGUgdGhlIGNvbG9ycyB0aGF0IHdlIHBhc3MgdG8gQmxpbmsuCiAgIGZvY3VzX3JpbmdfY29sb3JfID0gbmF0aXZlX3RoZW1lXy0+R2V0U3lzdGVtQ29sb3IoCiAgICAgICB1aTo6TmF0aXZlVGhlbWU6OmtDb2xvcklkX0ZvY3VzZWRCb3JkZXJDb2xvcik7CiAKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL2xpYmd0a3VpL2d0a191aS5oIGIvY2hyb21lL2Jyb3dzZXIvdWkvbGliZ3RrdWkvZ3RrX3VpLmgKaW5kZXggNDRhZDYxMDYuLjU0NWEwZDNlIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS9saWJndGt1aS9ndGtfdWkuaAorKysgYi9jaHJvbWUvYnJvd3Nlci91aS9saWJndGt1aS9ndGtfdWkuaApAQCAtMTAsMTAgKzEwLDEwIEBACiAjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSAiYmFzZS9jb21waWxlcl9zcGVjaWZpYy5oIgorI2luY2x1ZGUgImJhc2UvY29tcG9uZW50X2V4cG9ydC5oIgogI2luY2x1ZGUgImJhc2UvbWFjcm9zLmgiCiAjaW5jbHVkZSAiYmFzZS9vYnNlcnZlcl9saXN0LmgiCiAjaW5jbHVkZSAiYnVpbGQvYnVpbGRmbGFnLmgiCi0jaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvbGliZ3RrdWkvbGliZ3RrdWlfZXhwb3J0LmgiCiAjaW5jbHVkZSAidWkvYmFzZS9nbGliL2dsaWJfc2lnbmFsLmgiCiAjaW5jbHVkZSAidWkvZ2Z4L2NvbG9yX3V0aWxzLmgiCiAjaW5jbHVkZSAidWkvdmlld3MvbGludXhfdWkvbGludXhfdWkuaCIKQEAgLTgxLDggKzgxLDYgQEAKICAgdWk6Ok5hdGl2ZVRoZW1lKiBHZXROYXRpdmVUaGVtZShhdXJhOjpXaW5kb3cqIHdpbmRvdykgY29uc3Qgb3ZlcnJpZGU7CiAgIHZvaWQgU2V0TmF0aXZlVGhlbWVPdmVycmlkZShOYXRpdmVUaGVtZUdldHRlciBjYWxsYmFjaykgb3ZlcnJpZGU7CiAgIGJvb2wgR2V0RGVmYXVsdFVzZXNTeXN0ZW1UaGVtZSgpIGNvbnN0IG92ZXJyaWRlOwotICB2b2lkIFNldERvd25sb2FkQ291bnQoaW50IGNvdW50KSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBTZXRQcm9ncmVzc0ZyYWN0aW9uKGZsb2F0IHBlcmNlbnRhZ2UpIGNvbnN0IG92ZXJyaWRlOwogICBnZng6OkltYWdlIEdldEljb25Gb3JDb250ZW50VHlwZShjb25zdCBzdGQ6OnN0cmluZyYgY29udGVudF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSkgY29uc3Qgb3ZlcnJpZGU7CiAgIHN0ZDo6dW5pcXVlX3B0cjx2aWV3czo6Qm9yZGVyPiBDcmVhdGVOYXRpdmVCb3JkZXIoCkBAIC0xMjYsNyArMTI0LDcgQEAKICAgdm9pZCBMb2FkR3RrVmFsdWVzKCk7CiAKICAgLy8gRXh0cmFjdHMgY29sb3JzIGFuZCB0aW50cyBmcm9tIHRoZSBHVEsgdGhlbWUsIGJvdGggZm9yIHRoZQotICAvLyBUaGVtZVNlcnZpY2UgaW50ZXJmYWNlIGFuZCB0aGUgY29sb3JzIHdlIHNlbmQgdG8gd2Via2l0LgorICAvLyBUaGVtZVNlcnZpY2UgaW50ZXJmYWNlIGFuZCB0aGUgY29sb3JzIHdlIHNlbmQgdG8gQmxpbmsuCiAgIHZvaWQgVXBkYXRlQ29sb3JzKCk7CiAKICAgLy8gU2V0cyB0aGUgWGN1cnNvciB0aGVtZSBhbmQgc2l6ZSB3aXRoIHRoZSBHVEsgdGhlbWUgYW5kIHNpemUuCkBAIC0xNTQsNyArMTUyLDcgQEAKICAgLy8gc3lzdGVtLXJlbmRlcmVkIGJvcmRlcnMgYW5kIHRpdGxlYmFyLgogICBDb2xvck1hcCBuYXRpdmVfZnJhbWVfY29sb3JzXzsKIAotICAvLyBDb2xvcnMgdGhhdCB3ZSBwYXNzIHRvIFdlYktpdC4gVGhlc2UgYXJlIGdlbmVyYXRlZCBlYWNoIHRpbWUgdGhlIHRoZW1lCisgIC8vIENvbG9ycyB0aGF0IHdlIHBhc3MgdG8gQmxpbmsuIFRoZXNlIGFyZSBnZW5lcmF0ZWQgZWFjaCB0aW1lIHRoZSB0aGVtZQogICAvLyBjaGFuZ2VzLgogICBTa0NvbG9yIGZvY3VzX3JpbmdfY29sb3JfOwogICBTa0NvbG9yIGFjdGl2ZV9zZWxlY3Rpb25fYmdfY29sb3JfOwpAQCAtMjA1LDYgKzIwMyw2IEBACiB9ICAvLyBuYW1lc3BhY2UgbGliZ3RrdWkKIAogLy8gQWNjZXNzIHBvaW50IHRvIHRoZSBHVEsgZGVza3RvcCBzeXN0ZW0uCi1MSUJHVEtVSV9FWFBPUlQgdmlld3M6OkxpbnV4VUkqIEJ1aWxkR3RrVWkoKTsKK0NPTVBPTkVOVF9FWFBPUlQoTElCR1RLVUkpIHZpZXdzOjpMaW51eFVJKiBCdWlsZEd0a1VpKCk7CiAKICNlbmRpZiAgLy8gQ0hST01FX0JST1dTRVJfVUlfTElCR1RLVUlfR1RLX1VJX0hfCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci91aS9saWJndGt1aS9ndGtfdXRpbC5jYyBiL2Nocm9tZS9icm93c2VyL3VpL2xpYmd0a3VpL2d0a191dGlsLmNjCmluZGV4IGM5ZDYyMjkuLjQyNzE1MzNkIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS9saWJndGt1aS9ndGtfdXRpbC5jYworKysgYi9jaHJvbWUvYnJvd3Nlci91aS9saWJndGt1aS9ndGtfdXRpbC5jYwpAQCAtMjAsNyArMjAsNiBAQAogI2luY2x1ZGUgImJhc2Uvc3RyaW5ncy9zdHJpbmdfc3BsaXQuaCIKICNpbmNsdWRlICJiYXNlL3N0cmluZ3Mvc3RyaW5nX3Rva2VuaXplci5oIgogI2luY2x1ZGUgImJhc2Uvc3RyaW5ncy9zdHJpbmdfdXRpbC5oIgotI2luY2x1ZGUgImJ1aWxkL2JyYW5kaW5nX2J1aWxkZmxhZ3MuaCIKICNpbmNsdWRlICJ1aS9hdXJhL3dpbmRvd190cmVlX2hvc3QuaCIKICNpbmNsdWRlICJ1aS9iYXNlL2FjY2VsZXJhdG9ycy9hY2NlbGVyYXRvci5oIgogI2luY2x1ZGUgInVpL2V2ZW50cy9ldmVudC5oIgpAQCAtMTM4LDU0ICsxMzcsNiBAQAogICBDb21tb25Jbml0RnJvbUNvbW1hbmRMaW5lKGNvbW1hbmRfbGluZSk7CiB9CiAKLS8vIFRPRE8oZXJnKTogVGhpcyBtZXRob2Qgd2FzIGNvcGllZCBvdXQgb2Ygc2hlbGxfaW50ZWdyYXRpb25fbGludXguY2MuIEJlY2F1c2UKLS8vIG9mIGhvdyB0aGlzIGxpYnJhcnkgaXMgc3RydWN0dXJlZCBhcyBhIHN0YW5kIGFsb25lIC5zbywgd2UgY2FuJ3QgY2FsbCBjb2RlCi0vLyBmcm9tIGJyb3dzZXIgYW5kIGFib3ZlLgotc3RkOjpzdHJpbmcgR2V0RGVza3RvcE5hbWUoYmFzZTo6RW52aXJvbm1lbnQqIGVudikgewotI2lmIEJVSUxERkxBRyhHT09HTEVfQ0hST01FX0JSQU5ESU5HKQotICByZXR1cm4gImdvb2dsZS1jaHJvbWUuZGVza3RvcCI7Ci0jZWxzZSAgLy8gQlVJTERGTEFHKENIUk9NSVVNX0JSQU5ESU5HKQotICAvLyBBbGxvdyAkQ0hST01FX0RFU0tUT1AgdG8gb3ZlcnJpZGUgdGhlIGJ1aWx0LWluIHZhbHVlLCBzbyB0aGF0IGRldmVsb3BtZW50Ci0gIC8vIHZlcnNpb25zIGNhbiBzZXQgdGhlbXNlbHZlcyBhcyB0aGUgZGVmYXVsdCB3aXRob3V0IGludGVyZmVyaW5nIHdpdGgKLSAgLy8gbm9uLW9mZmljaWFsLCBwYWNrYWdlZCB2ZXJzaW9ucyB1c2luZyB0aGUgYnVpbHQtaW4gdmFsdWUuCi0gIHN0ZDo6c3RyaW5nIG5hbWU7Ci0gIGlmIChlbnYtPkdldFZhcigiQ0hST01FX0RFU0tUT1AiLCAmbmFtZSkgJiYgIW5hbWUuZW1wdHkoKSkKLSAgICByZXR1cm4gbmFtZTsKLSAgcmV0dXJuICJjaHJvbWl1bS1icm93c2VyLmRlc2t0b3AiOwotI2VuZGlmCi19Ci0KLUdka01vZGlmaWVyVHlwZSBHZXRHZGtNb2RpZmllckZvckFjY2VsZXJhdG9yKAotICAgIGNvbnN0IHVpOjpBY2NlbGVyYXRvciYgYWNjZWxlcmF0b3IpIHsKLSAgaW50IGV2ZW50X2ZsYWcgPSBhY2NlbGVyYXRvci5tb2RpZmllcnMoKTsKLSAgaW50IG1vZGlmaWVyID0gMDsKLSAgaWYgKGV2ZW50X2ZsYWcgJiB1aTo6RUZfU0hJRlRfRE9XTikKLSAgICBtb2RpZmllciB8PSBHREtfU0hJRlRfTUFTSzsKLSAgaWYgKGV2ZW50X2ZsYWcgJiB1aTo6RUZfQ09OVFJPTF9ET1dOKQotICAgIG1vZGlmaWVyIHw9IEdES19DT05UUk9MX01BU0s7Ci0gIGlmIChldmVudF9mbGFnICYgdWk6OkVGX0FMVF9ET1dOKQotICAgIG1vZGlmaWVyIHw9IEdES19NT0QxX01BU0s7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxHZGtNb2RpZmllclR5cGU+KG1vZGlmaWVyKTsKLX0KLQotaW50IEV2ZW50RmxhZ3NGcm9tR2RrU3RhdGUoZ3VpbnQgc3RhdGUpIHsKLSAgaW50IGZsYWdzID0gdWk6OkVGX05PTkU7Ci0gIGZsYWdzIHw9IChzdGF0ZSAmIEdES19TSElGVF9NQVNLKSA/IHVpOjpFRl9TSElGVF9ET1dOIDogdWk6OkVGX05PTkU7Ci0gIGZsYWdzIHw9IChzdGF0ZSAmIEdES19MT0NLX01BU0spID8gdWk6OkVGX0NBUFNfTE9DS19PTiA6IHVpOjpFRl9OT05FOwotICBmbGFncyB8PSAoc3RhdGUgJiBHREtfQ09OVFJPTF9NQVNLKSA/IHVpOjpFRl9DT05UUk9MX0RPV04gOiB1aTo6RUZfTk9ORTsKLSAgZmxhZ3MgfD0gKHN0YXRlICYgR0RLX01PRDFfTUFTSykgPyB1aTo6RUZfQUxUX0RPV04gOiB1aTo6RUZfTk9ORTsKLSAgZmxhZ3MgfD0gKHN0YXRlICYgR0RLX0JVVFRPTjFfTUFTSykgPyB1aTo6RUZfTEVGVF9NT1VTRV9CVVRUT04gOiB1aTo6RUZfTk9ORTsKLSAgZmxhZ3MgfD0KLSAgICAgIChzdGF0ZSAmIEdES19CVVRUT04yX01BU0spID8gdWk6OkVGX01JRERMRV9NT1VTRV9CVVRUT04gOiB1aTo6RUZfTk9ORTsKLSAgZmxhZ3MgfD0gKHN0YXRlICYgR0RLX0JVVFRPTjNfTUFTSykgPyB1aTo6RUZfUklHSFRfTU9VU0VfQlVUVE9OIDogdWk6OkVGX05PTkU7Ci0gIHJldHVybiBmbGFnczsKLX0KLQotdm9pZCBUdXJuQnV0dG9uQmx1ZShHdGtXaWRnZXQqIGJ1dHRvbikgewotICBndGtfc3R5bGVfY29udGV4dF9hZGRfY2xhc3MoZ3RrX3dpZGdldF9nZXRfc3R5bGVfY29udGV4dChidXR0b24pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1Z2dlc3RlZC1hY3Rpb24iKTsKLX0KLQogdm9pZCBTZXRHdGtUcmFuc2llbnRGb3JBdXJhKEd0a1dpZGdldCogZGlhbG9nLCBhdXJhOjpXaW5kb3cqIHBhcmVudCkgewogICBpZiAoIXBhcmVudCB8fCAhcGFyZW50LT5HZXRIb3N0KCkpCiAgICAgcmV0dXJuOwpAQCAtMjYwLDE0ICsyMTEsNiBAQAogCiB9ICAvLyBuYW1lc3BhY2UKIAotdm9pZCogR2V0R2RrU2hhcmVkTGlicmFyeSgpIHsKLSAgc3RkOjpzdHJpbmcgbGliX25hbWUgPQotICAgICAgImxpYmdkay0iICsgc3RkOjp0b19zdHJpbmcoR1RLX01BSk9SX1ZFUlNJT04pICsgIi5zby4wIjsKLSAgc3RhdGljIHZvaWQqIGdka19saWIgPSBkbG9wZW4obGliX25hbWUuY19zdHIoKSwgUlRMRF9MQVpZKTsKLSAgRENIRUNLKGdka19saWIpOwotICByZXR1cm4gZ2RrX2xpYjsKLX0KLQogdm9pZCogR2V0R3RrU2hhcmVkTGlicmFyeSgpIHsKICAgc3RkOjpzdHJpbmcgbGliX25hbWUgPQogICAgICAgImxpYmd0ay0iICsgc3RkOjp0b19zdHJpbmcoR1RLX01BSk9SX1ZFUlNJT04pICsgIi5zby4wIjsKQEAgLTY2MiwxNCArNjA1LDYgQEAKICAgcmV0dXJuIHByb3BfdmFsdWU7CiB9CiAKLSNpZiBkZWZpbmVkKFVTRV9YMTEpCi1ndWludCBHZXRHZGtLZXlDb2RlRm9yQWNjZWxlcmF0b3IoY29uc3QgdWk6OkFjY2VsZXJhdG9yJiBhY2NlbGVyYXRvcikgewotICAvLyBUaGUgc2Vjb25kIHBhcmFtZXRlciBpcyBmYWxzZSBiZWNhdXNlIGFjY2VsZXJhdG9yIGtleXMgYXJlIGV4cHJlc3NlZCBpbgotICAvLyB0ZXJtcyBvZiB0aGUgbm9uLXNoaWZ0LW1vZGlmaWVkIGtleS4KLSAgcmV0dXJuIFhLZXlzeW1Gb3JXaW5kb3dzS2V5Q29kZShhY2NlbGVyYXRvci5rZXlfY29kZSgpLCBmYWxzZSk7Ci19Ci0jZW5kaWYKLQogR2RrRGlzcGxheSogR2V0R2RrRGlzcGxheSgpIHsKICAgR2RrRGlzcGxheSogZGlzcGxheSA9IG51bGxwdHI7CiAgIC8vIFRPRE8oY3JidWcuY29tLzEwMDI2NzQpOiBSZW1vdmUgb25jZSBHdGtJTS1iYXNlZCBMaW51eElucHV0TWV0aG9kQ29udGV4dApkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvdWkvbGliZ3RrdWkvZ3RrX3V0aWwuaCBiL2Nocm9tZS9icm93c2VyL3VpL2xpYmd0a3VpL2d0a191dGlsLmgKaW5kZXggZTBhYjM0Y2EuLmM5NzEyY2QgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3VpL2xpYmd0a3VpL2d0a191dGlsLmgKKysrIGIvY2hyb21lL2Jyb3dzZXIvdWkvbGliZ3RrdWkvZ3RrX3V0aWwuaApAQCAtMjAsNyArMjAsNiBAQAogCiBuYW1lc3BhY2UgYmFzZSB7CiBjbGFzcyBDb21tYW5kTGluZTsKLWNsYXNzIEVudmlyb25tZW50OwogfQogCiBuYW1lc3BhY2UgY29sb3JfdXRpbHMgewpAQCAtMjgsNyArMjcsNiBAQAogfQogCiBuYW1lc3BhY2UgdWkgewotY2xhc3MgQWNjZWxlcmF0b3I7CiBjbGFzcyBLZXlFdmVudDsKIH0KIApAQCAtMzgsMTggKzM2LDYgQEAKIAogdm9pZCBHdGtJbml0RnJvbUNvbW1hbmRMaW5lKGNvbnN0IGJhc2U6OkNvbW1hbmRMaW5lJiBjb21tYW5kX2xpbmUpOwogCi0vLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSAiLmRlc2t0b3AiIGZpbGUgYXNzb2NpYXRlZCB3aXRoIG91ciBydW5uaW5nIHByb2Nlc3MuCi1zdGQ6OnN0cmluZyBHZXREZXNrdG9wTmFtZShiYXNlOjpFbnZpcm9ubWVudCogZW52KTsKLQotR2RrTW9kaWZpZXJUeXBlIEdldEdka01vZGlmaWVyRm9yQWNjZWxlcmF0b3IoCi0gICAgY29uc3QgdWk6OkFjY2VsZXJhdG9yJiBhY2NlbGVyYXRvcik7Ci0KLS8vIFRyYW5zbGF0ZXMgZXZlbnQgZmxhZ3MgaW50byBwbGFmb3JtIGluZGVwZW5kZW50IGV2ZW50IGZsYWdzLgotaW50IEV2ZW50RmxhZ3NGcm9tR2RrU3RhdGUoZ3VpbnQgc3RhdGUpOwotCi0vLyBTdHlsZSBhIEdUSyBidXR0b24gYXMgYSBCbHVlQnV0dG9uCi12b2lkIFR1cm5CdXR0b25CbHVlKEd0a1dpZGdldCogYnV0dG9uKTsKLQogLy8gU2V0cyB8ZGlhbG9nfCBhcyB0cmFuc2llbnQgZm9yIHxwYXJlbnR8LCB3aGljaCB3aWxsIGtlZXAgaXQgb24gdG9wIGFuZCBjZW50ZXIKIC8vIGl0IGFib3ZlIHxwYXJlbnR8LiBEbyBub3RoaW5nIGlmIHxwYXJlbnR8IGlzIG51bGxwdHIuCiB2b2lkIFNldEd0a1RyYW5zaWVudEZvckF1cmEoR3RrV2lkZ2V0KiBkaWFsb2csIGF1cmE6OldpbmRvdyogcGFyZW50KTsKQEAgLTY4LDcgKzU0LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dmlld3M6OkZyYW1lQnV0dG9uPiogbGVhZGluZ19idXR0b25zLAogICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx2aWV3czo6RnJhbWVCdXR0b24+KiB0cmFpbGluZ19idXR0b25zKTsKIAotdm9pZCogR2V0R2RrU2hhcmVkTGlicmFyeSgpOwogdm9pZCogR2V0R3RrU2hhcmVkTGlicmFyeSgpOwogCiBjbGFzcyBDYWlyb1N1cmZhY2UgewpAQCAtMTg5LDExICsxNzQsNiBAQAogc3RkOjpzdHJpbmcgR2V0R3RrU2V0dGluZ3NTdHJpbmdQcm9wZXJ0eShHdGtTZXR0aW5ncyogc2V0dGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyKiBwcm9wX25hbWUpOwogCi0jaWYgZGVmaW5lZChVU0VfWDExKQotLy8gVE9ETyh0aG9tYXNhbmRlcnNvbik6IFJlbW92ZSB0aGlzIG9uY2UgR3RrU3RhdHVzSWNvbiBpcyByZW1vdmVkLgotZ3VpbnQgR2V0R2RrS2V5Q29kZUZvckFjY2VsZXJhdG9yKGNvbnN0IHVpOjpBY2NlbGVyYXRvciYgYWNjZWxlcmF0b3IpOwotI2VuZGlmCi0KIC8vIEdldCBjdXJyZW50IEdka0Rpc3BsYXkgaW5zdGFuY2UKIEdka0Rpc3BsYXkqIEdldEdka0Rpc3BsYXkoKTsKIApkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvdWkvbGliZ3RrdWkvbGliZ3RrdWlfZXhwb3J0LmggYi9jaHJvbWUvYnJvd3Nlci91aS9saWJndGt1aS9saWJndGt1aV9leHBvcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZiYWU3OS4uMDAwMDAwMAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS9saWJndGt1aS9saWJndGt1aV9leHBvcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgQ0hST01FX0JST1dTRVJfVUlfTElCR1RLVUlfTElCR1RLVUlfRVhQT1JUX0hfCi0jZGVmaW5lIENIUk9NRV9CUk9XU0VSX1VJX0xJQkdUS1VJX0xJQkdUS1VJX0VYUE9SVF9IXwotCi0vLyBEZWZpbmVzIExJQkdUS1VJX0VYUE9SVCBzbyB0aGF0IGZ1bmN0aW9uYWxpdHkgaW1wbGVtZW50ZWQgYnkgb3VyIGxpbWl0ZWQKLS8vIGd0ayBtb2R1bGUgY2FuIGJlIGV4cG9ydGVkIHRvIGNvbnN1bWVycy4KLQotI2lmIGRlZmluZWQoQ09NUE9ORU5UX0JVSUxEKQotI2lmIGRlZmluZWQoV0lOMzIpCi0KLSNlcnJvciAiTElCR1RLVUkgZG9lcyBub3QgYnVpbGQgb24gV2luZG93cy4iCi0KLSNlbHNlICAvLyBkZWZpbmVkKFdJTjMyKQotI2lmIGRlZmluZWQoTElCR1RLVUlfSU1QTEVNRU5UQVRJT04pCi0jZGVmaW5lIExJQkdUS1VJX0VYUE9SVCBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQotI2Vsc2UKLSNkZWZpbmUgTElCR1RLVUlfRVhQT1JUCi0jZW5kaWYKLSNlbmRpZgotCi0jZWxzZSAgLy8gZGVmaW5lZChDT01QT05FTlRfQlVJTEQpCi0jZGVmaW5lIExJQkdUS1VJX0VYUE9SVAotI2VuZGlmCi0KLSNlbmRpZiAgLy8gQ0hST01FX0JST1dTRVJfVUlfTElCR1RLVUlfTElCR1RLVUlfRVhQT1JUX0hfCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci91aS9saWJndGt1aS9uYXRpdmVfdGhlbWVfZ3RrLmNjIGIvY2hyb21lL2Jyb3dzZXIvdWkvbGliZ3RrdWkvbmF0aXZlX3RoZW1lX2d0ay5jYwppbmRleCBiNzdiOGE1Li5hZDg3ZjQ3IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS9saWJndGt1aS9uYXRpdmVfdGhlbWVfZ3RrLmNjCisrKyBiL2Nocm9tZS9icm93c2VyL3VpL2xpYmd0a3VpL25hdGl2ZV90aGVtZV9ndGsuY2MKQEAgLTcsNyArNyw2IEBACiAjaW5jbHVkZSA8Z3RrL2d0ay5oPgogCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvbGliZ3RrdWkvZ3RrX3V0aWwuaCIKLSNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS9saWJndGt1aS9za2lhX3V0aWxzX2d0ay5oIgogI2luY2x1ZGUgInVpL2dmeC9jb2xvcl9wYWxldHRlLmgiCiAjaW5jbHVkZSAidWkvZ2Z4L2NvbG9yX3V0aWxzLmgiCiAjaW5jbHVkZSAidWkvZ2Z4L2dlb21ldHJ5L3JlY3QuaCIKQEAgLTE1OSw3ICsxNTgsOCBAQAogICAgICAgR2RrQ29sb3IqIGNvbG9yOwogICAgICAgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0X3N0eWxlKGxpbmtfY29udGV4dCwgImxpbmstY29sb3IiLCAmY29sb3IsIG51bGxwdHIpOwogICAgICAgaWYgKGNvbG9yKSB7Ci0gICAgICAgIFNrQ29sb3IgcmV0X2NvbG9yID0gR2RrQ29sb3JUb1NrQ29sb3IoKmNvbG9yKTsKKyAgICAgICAgU2tDb2xvciByZXRfY29sb3IgPQorICAgICAgICAgICAgU2tDb2xvclNldFJHQihjb2xvci0+cmVkID4+IDgsIGNvbG9yLT5ncmVlbiA+PiA4LCBjb2xvci0+Ymx1ZSA+PiA4KTsKICAgICAgICAgLy8gZ2RrX2NvbG9yX2ZyZWUoKSB3YXMgZGVwcmVjYXRlZCBpbiBHdGszLjE0LiAgVGhpcyBjb2RlIHBhdGggaXMgb25seQogICAgICAgICAvLyB0YWtlbiBvbiB2ZXJzaW9ucyBlYXJsaWVyIHRoYW4gR3RrMy4xMiwgYnV0IHRoZSBjb21waWxlciBkb2Vzbid0IGtub3cKICAgICAgICAgLy8gdGhhdCwgc28gc2lsZW5jZSB0aGUgZGVwcmVjYXRpb24gd2FybmluZ3MuCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci91aS9saWJndGt1aS9uYXZfYnV0dG9uX3Byb3ZpZGVyX2d0ay5oIGIvY2hyb21lL2Jyb3dzZXIvdWkvbGliZ3RrdWkvbmF2X2J1dHRvbl9wcm92aWRlcl9ndGsuaAppbmRleCAxNzVkYzE5NC4uYjg3ODcyOGEgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3VpL2xpYmd0a3VpL25hdl9idXR0b25fcHJvdmlkZXJfZ3RrLmgKKysrIGIvY2hyb21lL2Jyb3dzZXIvdWkvbGliZ3RrdWkvbmF2X2J1dHRvbl9wcm92aWRlcl9ndGsuaApAQCAtNywxNSArNywxNiBAQAogCiAjaW5jbHVkZSA8bWFwPgogCisjaW5jbHVkZSAiYmFzZS9jb21wb25lbnRfZXhwb3J0LmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvZnJhbWVfYnV0dG9uX2Rpc3BsYXlfdHlwZXMuaCIKLSNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS9saWJndGt1aS9saWJndGt1aV9leHBvcnQuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS92aWV3cy9uYXZfYnV0dG9uX3Byb3ZpZGVyLmgiCiAjaW5jbHVkZSAidWkvZ2Z4L2ltYWdlL2ltYWdlX3NraWEuaCIKICNpbmNsdWRlICJ1aS92aWV3cy9jb250cm9scy9idXR0b24vYnV0dG9uLmgiCiAKIG5hbWVzcGFjZSBsaWJndGt1aSB7CiAKLWNsYXNzIExJQkdUS1VJX0VYUE9SVCBOYXZCdXR0b25Qcm92aWRlckd0ayA6IHB1YmxpYyB2aWV3czo6TmF2QnV0dG9uUHJvdmlkZXIgeworY2xhc3MgQ09NUE9ORU5UX0VYUE9SVChMSUJHVEtVSSkgTmF2QnV0dG9uUHJvdmlkZXJHdGsKKyAgICA6IHB1YmxpYyB2aWV3czo6TmF2QnV0dG9uUHJvdmlkZXIgewogIHB1YmxpYzoKICAgTmF2QnV0dG9uUHJvdmlkZXJHdGsoKTsKICAgfk5hdkJ1dHRvblByb3ZpZGVyR3RrKCkgb3ZlcnJpZGU7CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci91aS9saWJndGt1aS9zZWxlY3RfZmlsZV9kaWFsb2dfaW1wbF9rZGUuY2MgYi9jaHJvbWUvYnJvd3Nlci91aS9saWJndGt1aS9zZWxlY3RfZmlsZV9kaWFsb2dfaW1wbF9rZGUuY2MKaW5kZXggOTQ5ZjE1YTcuLmEwYTkzMzUgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3VpL2xpYmd0a3VpL3NlbGVjdF9maWxlX2RpYWxvZ19pbXBsX2tkZS5jYworKysgYi9jaHJvbWUvYnJvd3Nlci91aS9saWJndGt1aS9zZWxlY3RfZmlsZV9kaWFsb2dfaW1wbF9rZGUuY2MKQEAgLTMxLDcgKzMxLDYgQEAKICNpbmNsdWRlICJ1aS9nZngveC94MTEuaCIKICNpbmNsdWRlICJ1aS9zdHJpbmdzL2dyaXQvdWlfc3RyaW5ncy5oIgogCi0KIHVzaW5nIGNvbnRlbnQ6OkJyb3dzZXJUaHJlYWQ7CiAKIG5hbWVzcGFjZSB7CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci91aS9saWJndGt1aS9za2lhX3V0aWxzX2d0ay5jYyBiL2Nocm9tZS9icm93c2VyL3VpL2xpYmd0a3VpL3NraWFfdXRpbHNfZ3RrLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGFlYzU3Li4wMDAwMDAwCi0tLSBhL2Nocm9tZS9icm93c2VyL3VpL2xpYmd0a3VpL3NraWFfdXRpbHNfZ3RrLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS9saWJndGt1aS9za2lhX3V0aWxzX2d0ay5oIgotCi0jaW5jbHVkZSA8Z2RrL2dkay5oPgotCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvc2tpYS9pbmNsdWRlL2NvcmUvU2tCaXRtYXAuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9za2lhL2luY2x1ZGUvY29yZS9Ta1VuUHJlTXVsdGlwbHkuaCIKLQotbmFtZXNwYWNlIGxpYmd0a3VpIHsKLQotLy8gR0RLX0NPTE9SX1JHQiBtdWx0aXBsaWVzIGJ5IDI1NyAoPSAweDEwMDAxKSB0byBkaXN0cmlidXRlIHRoZSBiaXRzIGV2ZW5seQotLy8gU2VlOiBodHRwOi8vd3d3Lm1pbmRjb250cm9sLm9yZy9+aHBsdXMvZ3JhcGhpY3MvZXhwYW5kLWJpdHMuaHRtbAotLy8gVG8gZ2V0IGJhY2ssIHdlIGNhbiBqdXN0IHJpZ2h0IHNoaWZ0IGJ5IGVpZ2h0Ci0vLyAob3IsIGZvcm11bGF0ZWQgZGlmZmVyZW50bHksIGkgPT0gKGkqMjU3KS8yNTYgZm9yIGFsbCBpIDwgMjU2KS4KLQotI2lmICFHVEtfQ0hFQ0tfVkVSU0lPTigzLCA5MCwgMCkKLVNrQ29sb3IgR2RrQ29sb3JUb1NrQ29sb3IoR2RrQ29sb3IgY29sb3IpIHsKLSAgcmV0dXJuIFNrQ29sb3JTZXRSR0IoY29sb3IucmVkID4+IDgsIGNvbG9yLmdyZWVuID4+IDgsIGNvbG9yLmJsdWUgPj4gOCk7Ci19Ci0KLUdka0NvbG9yIFNrQ29sb3JUb0dka0NvbG9yKFNrQ29sb3IgY29sb3IpIHsKLSAgR2RrQ29sb3IgZ2RrX2NvbG9yID0gewotICAgICAgMCwgc3RhdGljX2Nhc3Q8Z3VpbnQxNj4oU2tDb2xvckdldFIoY29sb3IpICoga1NraWFUb0dES011bHRpcGxpZXIpLAotICAgICAgc3RhdGljX2Nhc3Q8Z3VpbnQxNj4oU2tDb2xvckdldEcoY29sb3IpICoga1NraWFUb0dES011bHRpcGxpZXIpLAotICAgICAgc3RhdGljX2Nhc3Q8Z3VpbnQxNj4oU2tDb2xvckdldEIoY29sb3IpICoga1NraWFUb0dES011bHRpcGxpZXIpfTsKLSAgcmV0dXJuIGdka19jb2xvcjsKLX0KLSNlbmRpZgotCi1jb25zdCBTa0JpdG1hcCBHZGtQaXhidWZUb0ltYWdlU2tpYShHZGtQaXhidWYqIHBpeGJ1ZikgewotICAvLyBUT0RPKGVyZyk6IFdoYXQgZG8gd2UgZG8gaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHBpeGJ1ZiBmYWlscyB0aGVzZSBkY2hlY2tzPwotICAvLyBJIHdvdWxkIHByZWZlciB0byB1c2Ugb3VyIGd0ayBiYXNlZCBjYW52YXMsIGJ1dCB0aGF0IHdvdWxkIHJlcXVpcmUKLSAgLy8gcmVjb21waWxpbmcgaGFsZiBvZiBvdXIgc2tpYSBleHRlbnNpb25zIHdpdGggZ3RrIHN1cHBvcnQsIHdoaWNoIHdlIGNhbid0Ci0gIC8vIGRvIGluIHRoaXMgYnVpbGQuCi0gIERDSEVDS19FUShHREtfQ09MT1JTUEFDRV9SR0IsIGdka19waXhidWZfZ2V0X2NvbG9yc3BhY2UocGl4YnVmKSk7Ci0KLSAgaW50IG5fY2hhbm5lbHMgPSBnZGtfcGl4YnVmX2dldF9uX2NoYW5uZWxzKHBpeGJ1Zik7Ci0gIGludCB3ID0gZ2RrX3BpeGJ1Zl9nZXRfd2lkdGgocGl4YnVmKTsKLSAgaW50IGggPSBnZGtfcGl4YnVmX2dldF9oZWlnaHQocGl4YnVmKTsKLQotICBTa0JpdG1hcCByZXQ7Ci0gIHJldC5hbGxvY04zMlBpeGVscyh3LCBoKTsKLSAgcmV0LmVyYXNlQ29sb3IoMCk7Ci0KLSAgdWludDMyX3QqIHNraWFfZGF0YSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Kj4ocmV0LmdldEFkZHIoMCwgMCkpOwotCi0gIGlmIChuX2NoYW5uZWxzID09IDQpIHsKLSAgICBpbnQgdG90YWxfbGVuZ3RoID0gdyAqIGg7Ci0gICAgZ3VjaGFyKiBnZGtfcGl4ZWxzID0gZ2RrX3BpeGJ1Zl9nZXRfcGl4ZWxzKHBpeGJ1Zik7Ci0KLSAgICAvLyBOb3cgaGVyZSdzIHRoZSB0cmljazogd2UgbmVlZCB0byBjb252ZXJ0IHRoZSBnZGsgZGF0YSAod2hpY2ggaXMgUkdCQSBhbmQKLSAgICAvLyBpc24ndCBwcmVtdWx0aXBsaWVkKSB0byBza2lhICh3aGljaCBjYW4gYmUgYW55dGhpbmcgYW5kIHByZW11bHRpcGxpZWQpLgotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxfbGVuZ3RoOyArK2ksIGdka19waXhlbHMgKz0gNCkgewotICAgICAgY29uc3QgdW5zaWduZWQgY2hhciYgcmVkID0gZ2RrX3BpeGVsc1swXTsKLSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXImIGdyZWVuID0gZ2RrX3BpeGVsc1sxXTsKLSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXImIGJsdWUgPSBnZGtfcGl4ZWxzWzJdOwotICAgICAgY29uc3QgdW5zaWduZWQgY2hhciYgYWxwaGEgPSBnZGtfcGl4ZWxzWzNdOwotCi0gICAgICBza2lhX2RhdGFbaV0gPSBTa1ByZU11bHRpcGx5QVJHQihhbHBoYSwgcmVkLCBncmVlbiwgYmx1ZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKG5fY2hhbm5lbHMgPT0gMykgewotICAgIC8vIEJlY2F1c2UgR0RLIG1ha2VzIHJvd3N0cmlkZXMgd29yZCBhbGlnbmVkLCB3ZSBuZWVkIHRvIGRvIHNvbWV0aGluZyBhIGJpdAotICAgIC8vIG1vcmUgY29tcGxleCB3aGVuIGEgcGl4ZWwgaXNuJ3QgcGVyZmVjdGx5IGEgd29yZCBvZiBtZW1vcnkuCi0gICAgaW50IHJvd3N0cmlkZSA9IGdka19waXhidWZfZ2V0X3Jvd3N0cmlkZShwaXhidWYpOwotICAgIGd1Y2hhciogZ2RrX3BpeGVscyA9IGdka19waXhidWZfZ2V0X3BpeGVscyhwaXhidWYpOwotICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaDsgKyt5KSB7Ci0gICAgICBpbnQgcm93ID0geSAqIHJvd3N0cmlkZTsKLQotICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3OyArK3gpIHsKLSAgICAgICAgZ3VjaGFyKiBwaXhlbCA9IGdka19waXhlbHMgKyByb3cgKyAoeCAqIDMpOwotICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyJiByZWQgPSBwaXhlbFswXTsKLSAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciYgZ3JlZW4gPSBwaXhlbFsxXTsKLSAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciYgYmx1ZSA9IHBpeGVsWzJdOwotCi0gICAgICAgIHNraWFfZGF0YVt5ICogdyArIHhdID0gU2tQcmVNdWx0aXBseUFSR0IoMjU1LCByZWQsIGdyZWVuLCBibHVlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICB9Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotR2RrUGl4YnVmKiBHZGtQaXhidWZGcm9tU2tCaXRtYXAoY29uc3QgU2tCaXRtYXAmIGJpdG1hcCkgewotICBpZiAoYml0bWFwLmlzTnVsbCgpKQotICAgIHJldHVybiBudWxscHRyOwotCi0gIGludCB3aWR0aCA9IGJpdG1hcC53aWR0aCgpOwotICBpbnQgaGVpZ2h0ID0gYml0bWFwLmhlaWdodCgpOwotCi0gIEdka1BpeGJ1ZiogcGl4YnVmID0KLSAgICAgIGdka19waXhidWZfbmV3KEdES19DT0xPUlNQQUNFX1JHQiwgIC8vIFRoZSBvbmx5IGNvbG9yc3BhY2UgZ3RrIHN1cHBvcnRzLgotICAgICAgICAgICAgICAgICAgICAgVFJVRSwgICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgYW4gYWxwaGEgY2hhbm5lbC4KLSAgICAgICAgICAgICAgICAgICAgIDgsIHdpZHRoLCBoZWlnaHQpOwotCi0gIC8vIFNrQml0bWFwcyBhcmUgcHJlbXVsdGlwbGllZCwgd2UgbmVlZCB0byB1bnByZW11bHRpcGx5IHRoZW0uCi0gIGNvbnN0IGludCBrQnl0ZXNQZXJQaXhlbCA9IDQ7Ci0gIHVpbnQ4X3QqIGRpdmlkZWQgPSBnZGtfcGl4YnVmX2dldF9waXhlbHMocGl4YnVmKTsKLQotICBmb3IgKGludCB5ID0gMCwgaSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewotICAgIGZvciAoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewotICAgICAgdWludDMyX3QgcGl4ZWwgPSBiaXRtYXAuZ2V0QWRkcjMyKDAsIHkpW3hdOwotCi0gICAgICBpbnQgYWxwaGEgPSBTa0NvbG9yR2V0QShwaXhlbCk7Ci0gICAgICBpZiAoYWxwaGEgIT0gMCAmJiBhbHBoYSAhPSAyNTUpIHsKLSAgICAgICAgU2tDb2xvciB1bm11bHRpcGxpZWQgPSBTa1VuUHJlTXVsdGlwbHk6OlBNQ29sb3JUb0NvbG9yKHBpeGVsKTsKLSAgICAgICAgZGl2aWRlZFtpICsgMF0gPSBTa0NvbG9yR2V0Uih1bm11bHRpcGxpZWQpOwotICAgICAgICBkaXZpZGVkW2kgKyAxXSA9IFNrQ29sb3JHZXRHKHVubXVsdGlwbGllZCk7Ci0gICAgICAgIGRpdmlkZWRbaSArIDJdID0gU2tDb2xvckdldEIodW5tdWx0aXBsaWVkKTsKLSAgICAgICAgZGl2aWRlZFtpICsgM10gPSBhbHBoYTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGRpdmlkZWRbaSArIDBdID0gU2tDb2xvckdldFIocGl4ZWwpOwotICAgICAgICBkaXZpZGVkW2kgKyAxXSA9IFNrQ29sb3JHZXRHKHBpeGVsKTsKLSAgICAgICAgZGl2aWRlZFtpICsgMl0gPSBTa0NvbG9yR2V0QihwaXhlbCk7Ci0gICAgICAgIGRpdmlkZWRbaSArIDNdID0gYWxwaGE7Ci0gICAgICB9Ci0gICAgICBpICs9IGtCeXRlc1BlclBpeGVsOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBwaXhidWY7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBsaWJndGt1aQpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvdWkvbGliZ3RrdWkvc2tpYV91dGlsc19ndGsuaCBiL2Nocm9tZS9icm93c2VyL3VpL2xpYmd0a3VpL3NraWFfdXRpbHNfZ3RrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNmVkNjhhLi4wMDAwMDAwCi0tLSBhL2Nocm9tZS9icm93c2VyL3VpL2xpYmd0a3VpL3NraWFfdXRpbHNfZ3RrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIENIUk9NRV9CUk9XU0VSX1VJX0xJQkdUS1VJX1NLSUFfVVRJTFNfR1RLX0hfCi0jZGVmaW5lIENIUk9NRV9CUk9XU0VSX1VJX0xJQkdUS1VJX1NLSUFfVVRJTFNfR1RLX0hfCi0KLSNpbmNsdWRlIDxndGsvZ3RrLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9za2lhL2luY2x1ZGUvY29yZS9Ta0NvbG9yLmgiCi0KLSNpZiAhR1RLX0NIRUNLX1ZFUlNJT04oMywgOTAsIDApCi10eXBlZGVmIHN0cnVjdCBfR2RrQ29sb3IgR2RrQ29sb3I7Ci0jZW5kaWYKLXR5cGVkZWYgc3RydWN0IF9HZGtQaXhidWYgR2RrUGl4YnVmOwotCi1jbGFzcyBTa0JpdG1hcDsKLQotI2lmICFHVEtfQ0hFQ0tfVkVSU0lPTigzLCA5MCwgMCkKLS8vIERlZmluZSBhIG1hY3JvIGZvciBjcmVhdGluZyBHZGtDb2xvcnMgZnJvbSBSR0IgdmFsdWVzLiAgVGhpcyBpcyBhIG1hY3JvIHRvCi0vLyBhbGxvdyBzdGF0aWMgY29uc3RydWN0aW9uIG9mIGxpdGVyYWxzLCBldGMuICBVc2UgdGhpcyBsaWtlOgotLy8gICBHZGtDb2xvciB3aGl0ZSA9IEdES19DT0xPUl9SR0IoMHhmZiwgMHhmZiwgMHhmZik7Ci0jZGVmaW5lIEdES19DT0xPUl9SR0IociwgZywgYikgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgciAqIDo6bGliZ3RrdWk6OmtTa2lhVG9HREtNdWx0aXBsaWVyLCAgICBcCi0gICAgZyAqIDo6bGliZ3RrdWk6OmtTa2lhVG9HREtNdWx0aXBsaWVyLCAgICBcCi0gICAgYiAqIDo6bGliZ3RrdWk6OmtTa2lhVG9HREtNdWx0aXBsaWVyLCAgICBcCi0gIH0KLSNlbmRpZgotCi1uYW1lc3BhY2UgbGliZ3RrdWkgewotCi0jaWYgIUdUS19DSEVDS19WRVJTSU9OKDMsIDkwLCAwKQotLy8gTXVsdGlwbHkgdWludDhfdCBjb2xvciBjb21wb25lbnRzIGJ5IHRoaXMuCi1jb25zdCBpbnQga1NraWFUb0dES011bHRpcGxpZXIgPSAyNTc7Ci0KLS8vIENvbnZlcnRzIEdka0NvbG9ycyB0byB0aGUgQVJHQiBsYXlvdXQgU2tpYSBleHBlY3RzLgotU2tDb2xvciBHZGtDb2xvclRvU2tDb2xvcihHZGtDb2xvciBjb2xvcik7Ci0KLS8vIENvbnZlcnRzIEFSR0IgdG8gR2RrQ29sb3IuCi1HZGtDb2xvciBTa0NvbG9yVG9HZGtDb2xvcihTa0NvbG9yIGNvbG9yKTsKLSNlbmRpZgotCi1jb25zdCBTa0JpdG1hcCBHZGtQaXhidWZUb0ltYWdlU2tpYShHZGtQaXhidWYqIHBpeGJ1Zik7Ci0KLS8vIENvbnZlcnQgYW5kIGNvcHkgYSBTa0JpdG1hcCB0byBhIEdka1BpeGJ1Zi4gTk9URTogdGhpcyB1c2VzIEJHUkFUb1JHQkEsIHNvCi0vLyBpdCBpcyBhbiBleHBlbnNpdmUgb3BlcmF0aW9uLiAgVGhlIHJldHVybmVkIEdka1BpeGJ1ZiB3aWxsIGhhdmUgYSByZWZjb3VudCBvZgotLy8gMSwgYW5kIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIHVucmVmaW5nIGl0IHdoZW4gZG9uZS4KLUdka1BpeGJ1ZiogR2RrUGl4YnVmRnJvbVNrQml0bWFwKGNvbnN0IFNrQml0bWFwJiBiaXRtYXApOwotCi19ICAvLyBuYW1lc3BhY2UgbGliZ3RrdWkKLQotI2VuZGlmICAvLyBDSFJPTUVfQlJPV1NFUl9VSV9MSUJHVEtVSV9TS0lBX1VUSUxTX0dUS19IXwpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvdWkvbGliZ3RrdWkvdW5pdHlfc2VydmljZS5oIGIvY2hyb21lL2Jyb3dzZXIvdWkvbGliZ3RrdWkvdW5pdHlfc2VydmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDY3ZTE0Ni4uMDAwMDAwMAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS9saWJndGt1aS91bml0eV9zZXJ2aWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMyBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgQ0hST01FX0JST1dTRVJfVUlfTElCR1RLVUlfVU5JVFlfU0VSVklDRV9IXwotI2RlZmluZSBDSFJPTUVfQlJPV1NFUl9VSV9MSUJHVEtVSV9VTklUWV9TRVJWSUNFX0hfCi0KLW5hbWVzcGFjZSB1bml0eSB7Ci0KLS8vIFJldHVybnMgd2hldGhlciB1bml0eSBpcyBjdXJyZW50bHkgcnVubmluZy4KLWJvb2wgSXNSdW5uaW5nKCk7Ci0KLS8vIElmIHVuaXR5IGlzIHJ1bm5pbmcsIHNldHMgdGhlIGRvd25sb2FkIGNvdW50ZXIgaW4gdGhlIGRvY2sgaWNvbi4gQW55IHZhbHVlCi0vLyBvdGhlciB0aGFuIDAgZGlzcGxheXMgdGhlIGJhZGdlLgotdm9pZCBTZXREb3dubG9hZENvdW50KGludCBjb3VudCk7Ci0KLS8vIElmIHVuaXR5IGlzIHJ1bm5pbmcsIHNldHMgdGhlIGRvd25sb2FkIHByb2dyZXNzIGJhciBpbiB0aGUgZG9jayBpY29uLiBBbnkKLS8vIHZhbHVlIGJldHdlZW4gMC4wIGFuZCAxLjAgKGV4Y2x1c2l2ZSkgc2hvd3MgdGhlIHByb2dyZXNzIGJhci4KLXZvaWQgU2V0UHJvZ3Jlc3NGcmFjdGlvbihmbG9hdCBwZXJjZW50YWdlKTsKLQotfSAgLy8gbmFtZXNwYWNlIHVuaXR5Ci0KLSNlbmRpZiAgLy8gQ0hST01FX0JST1dTRVJfVUlfTElCR1RLVUlfVU5JVFlfU0VSVklDRV9IXwpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvdWkvcGFzc3dvcmRzL2FjY291bnRfYXZhdGFyX2ZldGNoZXIuY2MgYi9jaHJvbWUvYnJvd3Nlci91aS9wYXNzd29yZHMvYWNjb3VudF9hdmF0YXJfZmV0Y2hlci5jYwppbmRleCA5ZGRiNDVjLi5iODQwMzE0IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS9wYXNzd29yZHMvYWNjb3VudF9hdmF0YXJfZmV0Y2hlci5jYworKysgYi9jaHJvbWUvYnJvd3Nlci91aS9wYXNzd29yZHMvYWNjb3VudF9hdmF0YXJfZmV0Y2hlci5jYwpAQCAtNTcsOCArNTcsNyBAQAogICAgIG5ldHdvcms6Om1vam9tOjpVUkxMb2FkZXJGYWN0b3J5KiBsb2FkZXJfZmFjdG9yeSkgewogICBmZXRjaGVyXy5Jbml0KHN0ZDo6c3RyaW5nKCksIG5ldDo6VVJMUmVxdWVzdDo6TkVWRVJfQ0xFQVJfUkVGRVJSRVIsCiAgICAgICAgICAgICAgICAgbmV0OjpMT0FEX0RPX05PVF9TRU5EX0NPT0tJRVMgfCBuZXQ6OkxPQURfRE9fTk9UX1NBVkVfQ09PS0lFUyB8Ci0gICAgICAgICAgICAgICAgICAgIG5ldDo6TE9BRF9ET19OT1RfU0VORF9BVVRIX0RBVEEgfAotICAgICAgICAgICAgICAgICAgICBuZXQ6OkxPQURfTUFZQkVfVVNFUl9HRVNUVVJFKTsKKyAgICAgICAgICAgICAgICAgICAgbmV0OjpMT0FEX0RPX05PVF9TRU5EX0FVVEhfREFUQSk7CiAgIGZldGNoZXJfLlN0YXJ0KGxvYWRlcl9mYWN0b3J5KTsKIH0KIApkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvdWkvcGFzc3dvcmRzL21hbmFnZV9wYXNzd29yZHNfdWlfY29udHJvbGxlci5jYyBiL2Nocm9tZS9icm93c2VyL3VpL3Bhc3N3b3Jkcy9tYW5hZ2VfcGFzc3dvcmRzX3VpX2NvbnRyb2xsZXIuY2MKaW5kZXggMTliOTU4OTAuLmNjYzY5ZWYgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3VpL3Bhc3N3b3Jkcy9tYW5hZ2VfcGFzc3dvcmRzX3VpX2NvbnRyb2xsZXIuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvdWkvcGFzc3dvcmRzL21hbmFnZV9wYXNzd29yZHNfdWlfY29udHJvbGxlci5jYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3Bhc3N3b3JkX21hbmFnZXIvY2hyb21lX3Bhc3N3b3JkX21hbmFnZXJfY2xpZW50LmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvcGFzc3dvcmRfbWFuYWdlci9wYXNzd29yZF9zdG9yZV9mYWN0b3J5LmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvc2lnbmluL3NpZ25pbl91aV91dGlsLmgiCisjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvYXV0b2ZpbGwvYXV0b2ZpbGxfYnViYmxlX2hhbmRsZXIuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS9icm93c2VyX2NvbW1hbmRfY29udHJvbGxlci5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL2Jyb3dzZXJfY29tbWFuZHMuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS9icm93c2VyX2ZpbmRlci5oIgpAQCAtNTIwLDcgKzUyMSw3IEBACiAgIEJyb3dzZXIqIGJyb3dzZXIgPSBjaHJvbWU6OkZpbmRCcm93c2VyV2l0aFdlYkNvbnRlbnRzKHdlYl9jb250ZW50cygpKTsKICAgaWYgKCFicm93c2VyKQogICAgIHJldHVybjsKLSAgYnJvd3Nlci0+d2luZG93KCktPlNob3dBdmF0YXJIaWdobGlnaHRBbmltYXRpb24oKTsKKyAgYnJvd3Nlci0+d2luZG93KCktPkdldEF1dG9maWxsQnViYmxlSGFuZGxlcigpLT5PblBhc3N3b3JkU2F2ZWQoKTsKIH0KIAogdm9pZCBNYW5hZ2VQYXNzd29yZHNVSUNvbnRyb2xsZXI6Ok5ldmVyU2F2ZVBhc3N3b3JkSW50ZXJuYWwoKSB7CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci91aS9zdGFydHVwL2JhZF9mbGFnc19wcm9tcHQuY2MgYi9jaHJvbWUvYnJvd3Nlci91aS9zdGFydHVwL2JhZF9mbGFnc19wcm9tcHQuY2MKaW5kZXggNDMzZDE4Yi4uNTY0NDRkZCAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvdWkvc3RhcnR1cC9iYWRfZmxhZ3NfcHJvbXB0LmNjCisrKyBiL2Nocm9tZS9icm93c2VyL3VpL3N0YXJ0dXAvYmFkX2ZsYWdzX3Byb21wdC5jYwpAQCAtMTQ0LDcgKzE0NCw2IEBACiAvLyAic3RhYmlsaXR5IGFuZCBzZWN1cml0eSB3aWxsIHN1ZmZlciIuCiBzdGF0aWMgY29uc3QgYmFzZTo6RmVhdHVyZSoga0JhZEZlYXR1cmVGbGFnc0luQWJvdXRGbGFnc1tdID0gewogICAgICZmZWF0dXJlczo6a0FsbG93U2lnbmVkSFRUUEV4Y2hhbmdlQ2VydHNXaXRob3V0RXh0ZW5zaW9uLAotICAgICZmZWF0dXJlczo6a0J1bmRsZWRIVFRQRXhjaGFuZ2VzLAogI2lmIGRlZmluZWQoT1NfQU5EUk9JRCkKICAgICAmY2hyb21lOjphbmRyb2lkOjprQ29tbWFuZExpbmVPbk5vblJvb3RlZCwKICNlbmRpZiAgLy8gT1NfQU5EUk9JRApkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvdWkvdWlfZmVhdHVyZXMuY2MgYi9jaHJvbWUvYnJvd3Nlci91aS91aV9mZWF0dXJlcy5jYwppbmRleCA2ODJmMWU1Li41NTdhMDRjIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS91aV9mZWF0dXJlcy5jYworKysgYi9jaHJvbWUvYnJvd3Nlci91aS91aV9mZWF0dXJlcy5jYwpAQCAtMTUsMTAgKzE1LDEwIEBACiAvLyBodHRwczovL2NyYnVnLmNvbS85NjczMTcKIGNvbnN0IGJhc2U6OkZlYXR1cmUga0FuaW1hdGVkQXZhdGFyQnV0dG9uT25TaWduSW57CiAgICAgIkFuaW1hdGVkQXZhdGFyQnV0dG9uT25TaWduSW4iLCBiYXNlOjpGRUFUVVJFX0VOQUJMRURfQllfREVGQVVMVH07Ci0vLyBFbmFibGVzIGFuIGFuaW1hdGVkIGF2YXRhciBidXR0b24gb24gdGhlIG9wZW4tcHJvZmlsZS9zdGFydHVwIHRyaWdnZXIuIFRoaXMKKy8vIEVuYWJsZXMgYW4gYW5pbWF0ZWQgYXZhdGFyIGJ1dHRvbiBvbiB0aGUgb3Blbi13aW5kb3cvc3RhcnR1cCB0cmlnZ2VyLiBUaGlzCiAvLyBmZWF0dXJlIGlzIGd1YXJkZWQgYnkga0FuaW1hdGVkQXZhdGFyQnV0dG9uIGFuZCBzZXJ2ZXMgYXMgYSBraWxsLXN3aXRjaC4gU2VlCiAvLyBodHRwczovL2NyYnVnLmNvbS85NjczMTcKLWNvbnN0IGJhc2U6OkZlYXR1cmUga0FuaW1hdGVkQXZhdGFyQnV0dG9uT25PcGVuaW5nUHJvZmlsZXsKK2NvbnN0IGJhc2U6OkZlYXR1cmUga0FuaW1hdGVkQXZhdGFyQnV0dG9uT25PcGVuaW5nV2luZG93ewogICAgICJBbmltYXRlZEF2YXRhckJ1dHRvbk9uT3BlbmluZ1Byb2ZpbGUiLCBiYXNlOjpGRUFUVVJFX0VOQUJMRURfQllfREVGQVVMVH07CiAKIC8vIEVuYWJsZXMgc2hvd2luZyB0aGUgRVYgY2VydGlmaWNhdGUgZGV0YWlscyBpbiB0aGUgUGFnZSBJbmZvIGJ1YmJsZS4KQEAgLTc3LDcgKzc3LDcgQEAKIC8vIEVuYWJsZXMgYSBtb3JlIHByb21pbmVudCBhY3RpdmUgdGFiIHRpdGxlIGluIGRhcmsgbW9kZSB0byBhaWQgd2l0aAogLy8gYWNjZXNzaWJpbGl0eS4KIGNvbnN0IGJhc2U6OkZlYXR1cmUga1Byb21pbmVudERhcmtNb2RlQWN0aXZlVGFiVGl0bGV7Ci0gICAgIlByb21pbmVudERhcmtNb2RlQWN0aXZlVGFiVGl0bGUiLCBiYXNlOjpGRUFUVVJFX0VOQUJMRURfQllfREVGQVVMVH07CisgICAgIlByb21pbmVudERhcmtNb2RlQWN0aXZlVGFiVGl0bGUiLCBiYXNlOjpGRUFUVVJFX0RJU0FCTEVEX0JZX0RFRkFVTFR9OwogCiAvLyBFbmFibGVzIGEgd2ViLWJhc2VkIHNlcGFyYXRvciB0aGF0J3Mgb25seSB1c2VkIGZvciBwZXJmb3JtYW5jZSB0ZXN0aW5nLiBTZWUKIC8vIGh0dHBzOi8vY3JidWcuY29tLzk5MzUwMi4KZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL3VpX2ZlYXR1cmVzLmggYi9jaHJvbWUvYnJvd3Nlci91aS91aV9mZWF0dXJlcy5oCmluZGV4IGYzMTQ0NWEuLmVlOWYyMmEgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3VpL3VpX2ZlYXR1cmVzLmgKKysrIGIvY2hyb21lL2Jyb3dzZXIvdWkvdWlfZmVhdHVyZXMuaApAQCAtMTksNyArMTksNyBAQAogCiBleHRlcm4gY29uc3QgYmFzZTo6RmVhdHVyZSBrQW5pbWF0ZWRBdmF0YXJCdXR0b247CiBleHRlcm4gY29uc3QgYmFzZTo6RmVhdHVyZSBrQW5pbWF0ZWRBdmF0YXJCdXR0b25PblNpZ25JbjsKLWV4dGVybiBjb25zdCBiYXNlOjpGZWF0dXJlIGtBbmltYXRlZEF2YXRhckJ1dHRvbk9uT3BlbmluZ1Byb2ZpbGU7CitleHRlcm4gY29uc3QgYmFzZTo6RmVhdHVyZSBrQW5pbWF0ZWRBdmF0YXJCdXR0b25Pbk9wZW5pbmdXaW5kb3c7CiAKIGV4dGVybiBjb25zdCBiYXNlOjpGZWF0dXJlIGtFdkRldGFpbHNJblBhZ2VJbmZvOwogCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci91aS92aWV3cy9hcHBzL2Nocm9tZV9uYXRpdmVfYXBwX3dpbmRvd192aWV3c19hdXJhX2FzaC5jYyBiL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL2FwcHMvY2hyb21lX25hdGl2ZV9hcHBfd2luZG93X3ZpZXdzX2F1cmFfYXNoLmNjCmluZGV4IGYwNWUyOTFkLi5hYWY5MGE1IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS92aWV3cy9hcHBzL2Nocm9tZV9uYXRpdmVfYXBwX3dpbmRvd192aWV3c19hdXJhX2FzaC5jYworKysgYi9jaHJvbWUvYnJvd3Nlci91aS92aWV3cy9hcHBzL2Nocm9tZV9uYXRpdmVfYXBwX3dpbmRvd192aWV3c19hdXJhX2FzaC5jYwpAQCAtMTgsNyArMTgsNiBAQAogI2luY2x1ZGUgImFzaC9wdWJsaWMvY3BwL3dpbmRvd19wcm9wZXJ0aWVzLmgiCiAjaW5jbHVkZSAiYXNoL3B1YmxpYy9jcHAvd2luZG93X3N0YXRlX3R5cGUuaCIKICNpbmNsdWRlICJhc2gvcHVibGljL21vam9tL2NvbnN0YW50cy5tb2pvbS5oIgotI2luY2x1ZGUgImFzaC93bS93aW5kb3dfc3RhdGUuaCIKICNpbmNsdWRlICJiYXNlL2JpbmQuaCIKICNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9ub3RlX3Rha2luZ19oZWxwZXIuaCIKQEAgLTMyLDcgKzMxLDYgQEAKICNpbmNsdWRlICJjb21wb25lbnRzL3Nlc3Npb25fbWFuYWdlci9jb3JlL3Nlc3Npb25fbWFuYWdlci5oIgogI2luY2x1ZGUgImV4dGVuc2lvbnMvY29tbW9uL2NvbnN0YW50cy5oIgogI2luY2x1ZGUgInVpL2F1cmEvY2xpZW50L2F1cmFfY29uc3RhbnRzLmgiCi0jaW5jbHVkZSAidWkvYXVyYS93aW5kb3cuaCIKICNpbmNsdWRlICJ1aS9iYXNlL2hpdF90ZXN0LmgiCiAjaW5jbHVkZSAidWkvYmFzZS9tb2RlbHMvc2ltcGxlX21lbnVfbW9kZWwuaCIKICNpbmNsdWRlICJ1aS9iYXNlL3VpX2Jhc2VfdHlwZXMuaCIKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL2FwcHMvY2hyb21lX25hdGl2ZV9hcHBfd2luZG93X3ZpZXdzX2F1cmFfYXNoLmggYi9jaHJvbWUvYnJvd3Nlci91aS92aWV3cy9hcHBzL2Nocm9tZV9uYXRpdmVfYXBwX3dpbmRvd192aWV3c19hdXJhX2FzaC5oCmluZGV4IGExYmZmOWQzLi4wZTcyYmM3IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS92aWV3cy9hcHBzL2Nocm9tZV9uYXRpdmVfYXBwX3dpbmRvd192aWV3c19hdXJhX2FzaC5oCisrKyBiL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL2FwcHMvY2hyb21lX25hdGl2ZV9hcHBfd2luZG93X3ZpZXdzX2F1cmFfYXNoLmgKQEAgLTksMTIgKzksMTQgQEAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlICJhc2gvcHVibGljL2NwcC90YWJsZXRfbW9kZV9vYnNlcnZlci5oIgorI2luY2x1ZGUgImFzaC93bS93aW5kb3dfc3RhdGUuaCIKICNpbmNsdWRlICJhc2gvd20vd2luZG93X3N0YXRlX29ic2VydmVyLmgiCiAjaW5jbHVkZSAiYmFzZS9ndGVzdF9wcm9kX3V0aWwuaCIKICNpbmNsdWRlICJiYXNlL3Njb3BlZF9vYnNlcnZlci5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL2V4Y2x1c2l2ZV9hY2Nlc3MvZXhjbHVzaXZlX2FjY2Vzc19jb250ZXh0LmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvYXBwcy9jaHJvbWVfbmF0aXZlX2FwcF93aW5kb3dfdmlld3NfYXVyYS5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL3ZpZXdzL2V4Y2x1c2l2ZV9hY2Nlc3NfYnViYmxlX3ZpZXdzX2NvbnRleHQuaCIKKyNpbmNsdWRlICJ1aS9hdXJhL3dpbmRvdy5oIgogI2luY2x1ZGUgInVpL2F1cmEvd2luZG93X29ic2VydmVyLmgiCiAjaW5jbHVkZSAidWkvYmFzZS9hY2NlbGVyYXRvcnMvYWNjZWxlcmF0b3IuaCIKICNpbmNsdWRlICJ1aS92aWV3cy9jb250ZXh0X21lbnVfY29udHJvbGxlci5oIgpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvYXV0b2ZpbGwvYXV0b2ZpbGxfYnViYmxlX2hhbmRsZXJfaW1wbC5jYyBiL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL2F1dG9maWxsL2F1dG9maWxsX2J1YmJsZV9oYW5kbGVyX2ltcGwuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMyZGY0NTIKLS0tIC9kZXYvbnVsbAorKysgYi9jaHJvbWUvYnJvd3Nlci91aS92aWV3cy9hdXRvZmlsbC9hdXRvZmlsbF9idWJibGVfaGFuZGxlcl9pbXBsLmNjCkBAIC0wLDAgKzEsMTI4IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvYXV0b2ZpbGwvYXV0b2ZpbGxfYnViYmxlX2hhbmRsZXJfaW1wbC5oIgorCisjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvYXV0b2ZpbGwvcGVyc29uYWxfZGF0YV9tYW5hZ2VyX2ZhY3RvcnkuaCIKKyNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9wcm9maWxlcy9wcm9maWxlLmgiCisjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvYXV0b2ZpbGwvcGF5bWVudHMvbG9jYWxfY2FyZF9taWdyYXRpb25fYnViYmxlLmgiCisjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvYXV0b2ZpbGwvcGF5bWVudHMvc2F2ZV9jYXJkX2J1YmJsZV92aWV3LmgiCisjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvYXV0b2ZpbGwvcGF5bWVudHMvc2F2ZV9jYXJkX3VpLmgiCisjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvYXV0b2ZpbGwvcGF5bWVudHMvbG9jYWxfY2FyZF9taWdyYXRpb25fYnViYmxlX3ZpZXdzLmgiCisjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvYXV0b2ZpbGwvcGF5bWVudHMvbG9jYWxfY2FyZF9taWdyYXRpb25faWNvbl92aWV3LmgiCisjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvYXV0b2ZpbGwvcGF5bWVudHMvc2F2ZV9jYXJkX2J1YmJsZV92aWV3cy5oIgorI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL3ZpZXdzL2F1dG9maWxsL3BheW1lbnRzL3NhdmVfY2FyZF9mYWlsdXJlX2J1YmJsZV92aWV3cy5oIgorI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL3ZpZXdzL2F1dG9maWxsL3BheW1lbnRzL3NhdmVfY2FyZF9pY29uX3ZpZXcuaCIKKyNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS92aWV3cy9hdXRvZmlsbC9wYXltZW50cy9zYXZlX2NhcmRfbWFuYWdlX2NhcmRzX2J1YmJsZV92aWV3cy5oIgorI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL3ZpZXdzL2F1dG9maWxsL3BheW1lbnRzL3NhdmVfY2FyZF9vZmZlcl9idWJibGVfdmlld3MuaCIKKyNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS92aWV3cy9hdXRvZmlsbC9wYXltZW50cy9zYXZlX2NhcmRfc2lnbl9pbl9wcm9tb19idWJibGVfdmlld3MuaCIKKyNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS92aWV3cy9mcmFtZS90b29sYmFyX2J1dHRvbl9wcm92aWRlci5oIgorI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL3ZpZXdzL3BhZ2VfYWN0aW9uL3BhZ2VfYWN0aW9uX2ljb25fdmlldy5oIgorI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL3ZpZXdzL3Byb2ZpbGVzL2F2YXRhcl90b29sYmFyX2J1dHRvbi5oIgorI2luY2x1ZGUgImNvbXBvbmVudHMvYXV0b2ZpbGwvY29yZS9icm93c2VyL3BlcnNvbmFsX2RhdGFfbWFuYWdlci5oIgorI2luY2x1ZGUgImNvbXBvbmVudHMvYXV0b2ZpbGwvY29yZS9icm93c2VyL3BlcnNvbmFsX2RhdGFfbWFuYWdlcl9vYnNlcnZlci5oIgorI2luY2x1ZGUgInVpL3ZpZXdzL2J1YmJsZS9idWJibGVfZGlhbG9nX2RlbGVnYXRlX3ZpZXcuaCIKKworbmFtZXNwYWNlIGF1dG9maWxsIHsKKworQXV0b2ZpbGxCdWJibGVIYW5kbGVySW1wbDo6QXV0b2ZpbGxCdWJibGVIYW5kbGVySW1wbCgKKyAgICBUb29sYmFyQnV0dG9uUHJvdmlkZXIqIHRvb2xiYXJfYnV0dG9uX3Byb3ZpZGVyLAorICAgIFByb2ZpbGUqIHByb2ZpbGUpCisgICAgOiB0b29sYmFyX2J1dHRvbl9wcm92aWRlcl8odG9vbGJhcl9idXR0b25fcHJvdmlkZXIpIHsKKyAgaWYgKHByb2ZpbGUpIHsKKyAgICBwZXJzb25hbF9kYXRhX21hbmFnZXJfb2JzZXJ2ZXJfLkFkZCgKKyAgICAgICAgUGVyc29uYWxEYXRhTWFuYWdlckZhY3Rvcnk6OkdldEZvclByb2ZpbGUoCisgICAgICAgICAgICBwcm9maWxlLT5HZXRPcmlnaW5hbFByb2ZpbGUoKSkpOworICB9Cit9CisKK0F1dG9maWxsQnViYmxlSGFuZGxlckltcGw6On5BdXRvZmlsbEJ1YmJsZUhhbmRsZXJJbXBsKCkgPSBkZWZhdWx0OworCisvLyBUT0RPKGNyYnVnLmNvbS85MzI4MTgpOiBDbGVhbiB1cCB0aGlzIHR3byBmdW5jdGlvbnMgYW5kIGFkZCBoZWxwZXIgZm9yIHNoYXJlZAorLy8gY29kZS4KK1NhdmVDYXJkQnViYmxlVmlldyogQXV0b2ZpbGxCdWJibGVIYW5kbGVySW1wbDo6U2hvd1NhdmVDcmVkaXRDYXJkQnViYmxlKAorICAgIGNvbnRlbnQ6OldlYkNvbnRlbnRzKiB3ZWJfY29udGVudHMsCisgICAgU2F2ZUNhcmRCdWJibGVDb250cm9sbGVyKiBjb250cm9sbGVyLAorICAgIGJvb2wgaXNfdXNlcl9nZXN0dXJlKSB7CisgIGF1dG9maWxsOjpCdWJibGVUeXBlIGJ1YmJsZV90eXBlID0gY29udHJvbGxlci0+R2V0QnViYmxlVHlwZSgpOworICBQYWdlQWN0aW9uSWNvblZpZXcqIGljb25fdmlldyA9CisgICAgICB0b29sYmFyX2J1dHRvbl9wcm92aWRlcl8tPkdldFBhZ2VBY3Rpb25JY29uVmlldygKKyAgICAgICAgICBQYWdlQWN0aW9uSWNvblR5cGU6OmtTYXZlQ2FyZCk7CisgIHZpZXdzOjpWaWV3KiBhbmNob3JfdmlldyA9CisgICAgICB0b29sYmFyX2J1dHRvbl9wcm92aWRlcl8tPkdldEFuY2hvclZpZXcoUGFnZUFjdGlvbkljb25UeXBlOjprU2F2ZUNhcmQpOworCisgIGF1dG9maWxsOjpTYXZlQ2FyZEJ1YmJsZVZpZXdzKiBidWJibGUgPSBudWxscHRyOworICBzd2l0Y2ggKGJ1YmJsZV90eXBlKSB7CisgICAgY2FzZSBhdXRvZmlsbDo6QnViYmxlVHlwZTo6TE9DQUxfU0FWRToKKyAgICBjYXNlIGF1dG9maWxsOjpCdWJibGVUeXBlOjpVUExPQURfU0FWRToKKyAgICAgIGJ1YmJsZSA9IG5ldyBhdXRvZmlsbDo6U2F2ZUNhcmRPZmZlckJ1YmJsZVZpZXdzKGFuY2hvcl92aWV3LCB3ZWJfY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYXV0b2ZpbGw6OkJ1YmJsZVR5cGU6OlNJR05fSU5fUFJPTU86CisgICAgICBidWJibGUgPSBuZXcgYXV0b2ZpbGw6OlNhdmVDYXJkU2lnbkluUHJvbW9CdWJibGVWaWV3cygKKyAgICAgICAgICBhbmNob3Jfdmlldywgd2ViX2NvbnRlbnRzLCBjb250cm9sbGVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYXV0b2ZpbGw6OkJ1YmJsZVR5cGU6Ok1BTkFHRV9DQVJEUzoKKyAgICAgIGJ1YmJsZSA9IG5ldyBhdXRvZmlsbDo6U2F2ZUNhcmRNYW5hZ2VDYXJkc0J1YmJsZVZpZXdzKAorICAgICAgICAgIGFuY2hvcl92aWV3LCB3ZWJfY29udGVudHMsIGNvbnRyb2xsZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBhdXRvZmlsbDo6QnViYmxlVHlwZTo6RkFJTFVSRToKKyAgICAgIGJ1YmJsZSA9IG5ldyBhdXRvZmlsbDo6U2F2ZUNhcmRGYWlsdXJlQnViYmxlVmlld3MoCisgICAgICAgICAgYW5jaG9yX3ZpZXcsIHdlYl9jb250ZW50cywgY29udHJvbGxlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIGF1dG9maWxsOjpCdWJibGVUeXBlOjpVUExPQURfSU5fUFJPR1JFU1M6CisgICAgY2FzZSBhdXRvZmlsbDo6QnViYmxlVHlwZTo6SU5BQ1RJVkU6CisgICAgICBicmVhazsKKyAgfQorICBEQ0hFQ0soYnViYmxlKTsKKworICBpZiAoaWNvbl92aWV3KQorICAgIGJ1YmJsZS0+U2V0SGlnaGxpZ2h0ZWRCdXR0b24oaWNvbl92aWV3KTsKKworICB2aWV3czo6QnViYmxlRGlhbG9nRGVsZWdhdGVWaWV3OjpDcmVhdGVCdWJibGUoYnViYmxlKTsKKyAgYnViYmxlLT5TaG93KGlzX3VzZXJfZ2VzdHVyZSA/IGF1dG9maWxsOjpTYXZlQ2FyZEJ1YmJsZVZpZXdzOjpVU0VSX0dFU1RVUkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGF1dG9maWxsOjpTYXZlQ2FyZEJ1YmJsZVZpZXdzOjpBVVRPTUFUSUMpOworICByZXR1cm4gYnViYmxlOworfQorCitMb2NhbENhcmRNaWdyYXRpb25CdWJibGUqCitBdXRvZmlsbEJ1YmJsZUhhbmRsZXJJbXBsOjpTaG93TG9jYWxDYXJkTWlncmF0aW9uQnViYmxlKAorICAgIGNvbnRlbnQ6OldlYkNvbnRlbnRzKiB3ZWJfY29udGVudHMsCisgICAgTG9jYWxDYXJkTWlncmF0aW9uQnViYmxlQ29udHJvbGxlciogY29udHJvbGxlciwKKyAgICBib29sIGlzX3VzZXJfZ2VzdHVyZSkgeworICBhdXRvZmlsbDo6TG9jYWxDYXJkTWlncmF0aW9uQnViYmxlVmlld3MqIGJ1YmJsZSA9CisgICAgICBuZXcgYXV0b2ZpbGw6OkxvY2FsQ2FyZE1pZ3JhdGlvbkJ1YmJsZVZpZXdzKAorICAgICAgICAgIHRvb2xiYXJfYnV0dG9uX3Byb3ZpZGVyXy0+R2V0QW5jaG9yVmlldygKKyAgICAgICAgICAgICAgUGFnZUFjdGlvbkljb25UeXBlOjprTG9jYWxDYXJkTWlncmF0aW9uKSwKKyAgICAgICAgICB3ZWJfY29udGVudHMsIGNvbnRyb2xsZXIpOworCisgIFBhZ2VBY3Rpb25JY29uVmlldyogaWNvbl92aWV3ID0KKyAgICAgIHRvb2xiYXJfYnV0dG9uX3Byb3ZpZGVyXy0+R2V0UGFnZUFjdGlvbkljb25WaWV3KAorICAgICAgICAgIFBhZ2VBY3Rpb25JY29uVHlwZTo6a0xvY2FsQ2FyZE1pZ3JhdGlvbik7CisgIGlmIChpY29uX3ZpZXcpCisgICAgYnViYmxlLT5TZXRIaWdobGlnaHRlZEJ1dHRvbihpY29uX3ZpZXcpOworCisgIHZpZXdzOjpCdWJibGVEaWFsb2dEZWxlZ2F0ZVZpZXc6OkNyZWF0ZUJ1YmJsZShidWJibGUpOworICBidWJibGUtPlNob3coaXNfdXNlcl9nZXN0dXJlCisgICAgICAgICAgICAgICAgICAgPyBhdXRvZmlsbDo6TG9jYWxDYXJkTWlncmF0aW9uQnViYmxlVmlld3M6OlVTRVJfR0VTVFVSRQorICAgICAgICAgICAgICAgICAgIDogYXV0b2ZpbGw6OkxvY2FsQ2FyZE1pZ3JhdGlvbkJ1YmJsZVZpZXdzOjpBVVRPTUFUSUMpOworICByZXR1cm4gYnViYmxlOworfQorCit2b2lkIEF1dG9maWxsQnViYmxlSGFuZGxlckltcGw6Ok9uUGFzc3dvcmRTYXZlZCgpIHsKKyAgU2hvd0F2YXRhckhpZ2hsaWdodEFuaW1hdGlvbigpOworfQorCit2b2lkIEF1dG9maWxsQnViYmxlSGFuZGxlckltcGw6Ok9uQ3JlZGl0Q2FyZFNhdmVkKCkgeworICBTaG93QXZhdGFySGlnaGxpZ2h0QW5pbWF0aW9uKCk7Cit9CisKK3ZvaWQgQXV0b2ZpbGxCdWJibGVIYW5kbGVySW1wbDo6U2hvd0F2YXRhckhpZ2hsaWdodEFuaW1hdGlvbigpIHsKKyAgQXZhdGFyVG9vbGJhckJ1dHRvbiogYXZhdGFyID0KKyAgICAgIHRvb2xiYXJfYnV0dG9uX3Byb3ZpZGVyXy0+R2V0QXZhdGFyVG9vbGJhckJ1dHRvbigpOworICBpZiAoYXZhdGFyKQorICAgIGF2YXRhci0+U2hvd0F2YXRhckhpZ2hsaWdodEFuaW1hdGlvbigpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYXV0b2ZpbGwKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL2F1dG9maWxsL2F1dG9maWxsX2J1YmJsZV9oYW5kbGVyX2ltcGwuaCBiL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL2F1dG9maWxsL2F1dG9maWxsX2J1YmJsZV9oYW5kbGVyX2ltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzkzOTNiYgotLS0gL2Rldi9udWxsCisrKyBiL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL2F1dG9maWxsL2F1dG9maWxsX2J1YmJsZV9oYW5kbGVyX2ltcGwuaApAQCAtMCwwICsxLDYzIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaWZuZGVmIENIUk9NRV9CUk9XU0VSX1VJX1ZJRVdTX0FVVE9GSUxMX0FVVE9GSUxMX0JVQkJMRV9IQU5ETEVSX0lNUExfSF8KKyNkZWZpbmUgQ0hST01FX0JST1dTRVJfVUlfVklFV1NfQVVUT0ZJTExfQVVUT0ZJTExfQlVCQkxFX0hBTkRMRVJfSU1QTF9IXworCisjaW5jbHVkZSAiYmFzZS9tYWNyb3MuaCIKKyNpbmNsdWRlICJiYXNlL3Njb3BlZF9vYnNlcnZlci5oIgorI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL2F1dG9maWxsL2F1dG9maWxsX2J1YmJsZV9oYW5kbGVyLmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9hdXRvZmlsbC9jb3JlL2Jyb3dzZXIvcGVyc29uYWxfZGF0YV9tYW5hZ2VyLmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9hdXRvZmlsbC9jb3JlL2Jyb3dzZXIvcGVyc29uYWxfZGF0YV9tYW5hZ2VyX29ic2VydmVyLmgiCisKK2NsYXNzIFByb2ZpbGU7CitjbGFzcyBUb29sYmFyQnV0dG9uUHJvdmlkZXI7CisKK25hbWVzcGFjZSBjb250ZW50IHsKK2NsYXNzIFdlYkNvbnRlbnRzOworfQorCituYW1lc3BhY2UgYXV0b2ZpbGwgeworY2xhc3MgTG9jYWxDYXJkTWlncmF0aW9uQnViYmxlOworY2xhc3MgTG9jYWxDYXJkTWlncmF0aW9uQnViYmxlQ29udHJvbGxlcjsKK2NsYXNzIFNhdmVDYXJkQnViYmxlVmlldzsKK2NsYXNzIFNhdmVDYXJkQnViYmxlQ29udHJvbGxlcjsKKworY2xhc3MgQXV0b2ZpbGxCdWJibGVIYW5kbGVySW1wbCA6IHB1YmxpYyBBdXRvZmlsbEJ1YmJsZUhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFBlcnNvbmFsRGF0YU1hbmFnZXJPYnNlcnZlciB7CisgcHVibGljOgorICBBdXRvZmlsbEJ1YmJsZUhhbmRsZXJJbXBsKFRvb2xiYXJCdXR0b25Qcm92aWRlciogdG9vbGJhcl9idXR0b25fcHJvdmlkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZmlsZSogcHJvZmlsZSk7CisgIH5BdXRvZmlsbEJ1YmJsZUhhbmRsZXJJbXBsKCkgb3ZlcnJpZGU7CisKKyAgLy8gQXV0b2ZpbGxCdWJibGVIYW5kbGVyOgorICBTYXZlQ2FyZEJ1YmJsZVZpZXcqIFNob3dTYXZlQ3JlZGl0Q2FyZEJ1YmJsZSgKKyAgICAgIGNvbnRlbnQ6OldlYkNvbnRlbnRzKiB3ZWJfY29udGVudHMsCisgICAgICBTYXZlQ2FyZEJ1YmJsZUNvbnRyb2xsZXIqIGNvbnRyb2xsZXIsCisgICAgICBib29sIGlzX3VzZXJfZ2VzdHVyZSkgb3ZlcnJpZGU7CisgIExvY2FsQ2FyZE1pZ3JhdGlvbkJ1YmJsZSogU2hvd0xvY2FsQ2FyZE1pZ3JhdGlvbkJ1YmJsZSgKKyAgICAgIGNvbnRlbnQ6OldlYkNvbnRlbnRzKiB3ZWJfY29udGVudHMsCisgICAgICBMb2NhbENhcmRNaWdyYXRpb25CdWJibGVDb250cm9sbGVyKiBjb250cm9sbGVyLAorICAgICAgYm9vbCBpc191c2VyX2dlc3R1cmUpIG92ZXJyaWRlOworICB2b2lkIE9uUGFzc3dvcmRTYXZlZCgpIG92ZXJyaWRlOworCisgIC8vIGF1dG9maWxsOjpQZXJzb25hbERhdGFNYW5hZ2VyT2JzZXJ2ZXI6CisgIHZvaWQgT25DcmVkaXRDYXJkU2F2ZWQoKSBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIC8vIEV4ZWN1dGVzIGhpZ2hsaWdodCBhbmltYXRpb24gb24gdG9vbGJhcidzIGF2YXRhciBpY29uLgorICB2b2lkIFNob3dBdmF0YXJIaWdobGlnaHRBbmltYXRpb24oKTsKKworICBUb29sYmFyQnV0dG9uUHJvdmlkZXIqIHRvb2xiYXJfYnV0dG9uX3Byb3ZpZGVyXyA9IG51bGxwdHI7CisKKyAgU2NvcGVkT2JzZXJ2ZXI8YXV0b2ZpbGw6OlBlcnNvbmFsRGF0YU1hbmFnZXIsCisgICAgICAgICAgICAgICAgIGF1dG9maWxsOjpQZXJzb25hbERhdGFNYW5hZ2VyT2JzZXJ2ZXI+CisgICAgICBwZXJzb25hbF9kYXRhX21hbmFnZXJfb2JzZXJ2ZXJfe3RoaXN9OworCisgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBdXRvZmlsbEJ1YmJsZUhhbmRsZXJJbXBsKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhdXRvZmlsbAorCisjZW5kaWYgIC8vIENIUk9NRV9CUk9XU0VSX1VJX1ZJRVdTX0FVVE9GSUxMX0FVVE9GSUxMX0JVQkJMRV9IQU5ETEVSX0lNUExfSF8KZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL2V4dGVuc2lvbnMvZXh0ZW5zaW9uc19tZW51X3ZpZXcuY2MgYi9jaHJvbWUvYnJvd3Nlci91aS92aWV3cy9leHRlbnNpb25zL2V4dGVuc2lvbnNfbWVudV92aWV3LmNjCmluZGV4IDFjODhjNzQ4Li5iYWQwYTEyIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS92aWV3cy9leHRlbnNpb25zL2V4dGVuc2lvbnNfbWVudV92aWV3LmNjCisrKyBiL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL2V4dGVuc2lvbnMvZXh0ZW5zaW9uc19tZW51X3ZpZXcuY2MKQEAgLTEzLDEzICsxMywxNiBAQAogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL3ZpZXdzL2Nocm9tZV90eXBvZ3JhcGh5LmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvZXh0ZW5zaW9ucy9leHRlbnNpb25zX21lbnVfaXRlbV92aWV3LmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvaG92ZXJfYnV0dG9uLmgiCisjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvaG92ZXJfYnV0dG9uX2NvbnRyb2xsZXIuaCIKICNpbmNsdWRlICJjaHJvbWUvZ3JpdC9nZW5lcmF0ZWRfcmVzb3VyY2VzLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy92ZWN0b3JfaWNvbnMvdmVjdG9yX2ljb25zLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvc2tpYS9pbmNsdWRlL2NvcmUvU2tQYXRoLmgiCiAjaW5jbHVkZSAidWkvYmFzZS9sMTBuL2wxMG5fdXRpbC5oIgogI2luY2x1ZGUgInVpL2dmeC9wYWludF92ZWN0b3JfaWNvbi5oIgorI2luY2x1ZGUgInVpL3ZpZXdzL2FuaW1hdGlvbi9pbmtfZHJvcF9ob3N0X3ZpZXcuaCIKICNpbmNsdWRlICJ1aS92aWV3cy9jb250cm9scy9idXR0b24vaW1hZ2VfYnV0dG9uLmgiCiAjaW5jbHVkZSAidWkvdmlld3MvY29udHJvbHMvYnV0dG9uL2ltYWdlX2J1dHRvbl9mYWN0b3J5LmgiCisjaW5jbHVkZSAidWkvdmlld3MvY29udHJvbHMvYnV0dG9uL2xhYmVsX2J1dHRvbi5oIgogI2luY2x1ZGUgInVpL3ZpZXdzL2NvbnRyb2xzL2xhYmVsLmgiCiAjaW5jbHVkZSAidWkvdmlld3MvY29udHJvbHMvc2Nyb2xsX3ZpZXcuaCIKICNpbmNsdWRlICJ1aS92aWV3cy9jb250cm9scy9zZXBhcmF0b3IuaCIKQEAgLTEwOCwxNCArMTExLDI5IEBACiAgIEFkZENoaWxkVmlldyhzdGQ6Om1vdmUoc2Nyb2xsX3ZpZXcpKTsKIAogICBBZGRDaGlsZFZpZXcoc3RkOjptYWtlX3VuaXF1ZTx2aWV3czo6U2VwYXJhdG9yPigpKTsKLSAgYXV0byBpY29uX3ZpZXcgPSBDcmVhdGVGaXhlZFNpemVJY29uVmlldygpOwotICBpY29uX3ZpZXctPlNldEltYWdlKAorCisgIGNvbnN0ZXhwciBnZng6Okluc2V0cyBrRGVmYXVsdEJvcmRlckluc2V0cyA9IGdmeDo6SW5zZXRzKDEyKTsKKyAgYXV0byBmb290ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPHZpZXdzOjpMYWJlbEJ1dHRvbj4oCisgICAgICAmYnV0dG9uX2xpc3RlbmVyXywgbDEwbl91dGlsOjpHZXRTdHJpbmdVVEYxNihJRFNfTUFOQUdFX0VYVEVOU0lPTiksCisgICAgICB2aWV3czo6c3R5bGU6OkNPTlRFWFRfQlVUVE9OKTsKKyAgZm9vdGVyLT5TZXRCdXR0b25Db250cm9sbGVyKHN0ZDo6bWFrZV91bmlxdWU8SG92ZXJCdXR0b25Db250cm9sbGVyPigKKyAgICAgIGZvb3Rlci5nZXQoKSwgJmJ1dHRvbl9saXN0ZW5lcl8sCisgICAgICBzdGQ6Om1ha2VfdW5pcXVlPHZpZXdzOjpCdXR0b246OkRlZmF1bHRCdXR0b25Db250cm9sbGVyRGVsZWdhdGU+KAorICAgICAgICAgIGZvb3Rlci5nZXQoKSkpKTsKKyAgZm9vdGVyLT5TZXRJbWFnZSgKKyAgICAgIHZpZXdzOjpCdXR0b246OlNUQVRFX05PUk1BTCwKICAgICAgIGdmeDo6Q3JlYXRlVmVjdG9ySWNvbih2ZWN0b3JfaWNvbnM6OmtTZXR0aW5nc0ljb24sIDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldE5hdGl2ZVRoZW1lKCktPkdldFN5c3RlbUNvbG9yKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aTo6TmF0aXZlVGhlbWU6OmtDb2xvcklkX0RlZmF1bHRJY29uQ29sb3IpKSk7Ci0gIGF1dG8gZm9vdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxIb3ZlckJ1dHRvbj4oCi0gICAgICAmYnV0dG9uX2xpc3RlbmVyXywgc3RkOjptb3ZlKGljb25fdmlldyksCi0gICAgICBsMTBuX3V0aWw6OkdldFN0cmluZ1VURjE2KElEU19NQU5BR0VfRVhURU5TSU9OKSwgYmFzZTo6c3RyaW5nMTYoKSk7CisKKyAgLy8gSXRlbXMgd2l0aGluIGEgbWVudSBzaG91bGQgbm90IHNob3cgZm9jdXMgcmluZ3MuCisgIGZvb3Rlci0+U2V0SW5zdGFsbEZvY3VzUmluZ09uRm9jdXMoZmFsc2UpOworICBmb290ZXItPlNldEZvY3VzQmVoYXZpb3Iodmlld3M6OlZpZXc6OkZvY3VzQmVoYXZpb3I6OkFMV0FZUyk7CisgIGZvb3Rlci0+U2V0Qm9yZGVyKHZpZXdzOjpDcmVhdGVFbXB0eUJvcmRlcihrRGVmYXVsdEJvcmRlckluc2V0cykpOworICBmb290ZXItPlNldElua0Ryb3BNb2RlKHZpZXdzOjpJbmtEcm9wSG9zdFZpZXc6Oklua0Ryb3BNb2RlOjpPTik7CisgIGZvb3Rlci0+c2V0X2lua19kcm9wX2Jhc2VfY29sb3IoSG92ZXJCdXR0b246OkdldElua0Ryb3BDb2xvcihmb290ZXIuZ2V0KCkpKTsKKyAgZm9vdGVyLT5TZXRJbWFnZUxhYmVsU3BhY2luZyhDaHJvbWVMYXlvdXRQcm92aWRlcjo6R2V0KCktPkdldERpc3RhbmNlTWV0cmljKAorICAgICAgdmlld3M6OkRJU1RBTkNFX0JVVFRPTl9IT1JJWk9OVEFMX1BBRERJTkcpKTsKICAgZm9vdGVyLT5TZXRJRChFWFRFTlNJT05TX1NFVFRJTkdTX0lEKTsKICAgbWFuYWdlX2V4dGVuc2lvbnNfYnV0dG9uX2Zvcl90ZXN0aW5nXyA9IGZvb3Rlci5nZXQoKTsKICAgQWRkQ2hpbGRWaWV3KHN0ZDo6bW92ZShmb290ZXIpKTsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL2ZyYW1lL2Jyb3dzZXJfbm9uX2NsaWVudF9mcmFtZV92aWV3X2FzaC5jYyBiL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL2ZyYW1lL2Jyb3dzZXJfbm9uX2NsaWVudF9mcmFtZV92aWV3X2FzaC5jYwppbmRleCBlZjZjYWEzLi43YjJiMWU0IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS92aWV3cy9mcmFtZS9icm93c2VyX25vbl9jbGllbnRfZnJhbWVfdmlld19hc2guY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvZnJhbWUvYnJvd3Nlcl9ub25fY2xpZW50X2ZyYW1lX3ZpZXdfYXNoLmNjCkBAIC01MSw3ICs1MSw2IEBACiAjaW5jbHVkZSAidWkvYWNjZXNzaWJpbGl0eS9heF9ub2RlX2RhdGEuaCIKICNpbmNsdWRlICJ1aS9hdXJhL2NsaWVudC9hdXJhX2NvbnN0YW50cy5oIgogI2luY2x1ZGUgInVpL2F1cmEvZW52LmgiCi0jaW5jbHVkZSAidWkvYXVyYS93aW5kb3cuaCIKICNpbmNsdWRlICJ1aS9iYXNlL2hpdF90ZXN0LmgiCiAjaW5jbHVkZSAidWkvYmFzZS9sYXlvdXQuaCIKICNpbmNsdWRlICJ1aS9ldmVudHMvZ2VzdHVyZXMvZ2VzdHVyZV9yZWNvZ25pemVyLmgiCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci91aS92aWV3cy9mcmFtZS9icm93c2VyX25vbl9jbGllbnRfZnJhbWVfdmlld19hc2guaCBiL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL2ZyYW1lL2Jyb3dzZXJfbm9uX2NsaWVudF9mcmFtZV92aWV3X2FzaC5oCmluZGV4IDFiMDI0M2QuLjQxZjE4ZmYgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL2ZyYW1lL2Jyb3dzZXJfbm9uX2NsaWVudF9mcmFtZV92aWV3X2FzaC5oCisrKyBiL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL2ZyYW1lL2Jyb3dzZXJfbm9uX2NsaWVudF9mcmFtZV92aWV3X2FzaC5oCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvZnJhbWUvaW1tZXJzaXZlX21vZGVfY29udHJvbGxlci5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL3ZpZXdzL3RhYl9pY29uX3ZpZXdfbW9kZWwuaCIKICNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvYmluZGluZ3MvYmluZGluZy5oIgorI2luY2x1ZGUgInVpL2F1cmEvd2luZG93LmgiCiAjaW5jbHVkZSAidWkvYXVyYS93aW5kb3dfb2JzZXJ2ZXIuaCIKIAogbmFtZXNwYWNlIHsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL2ZyYW1lL2Jyb3dzZXJfbm9uX2NsaWVudF9mcmFtZV92aWV3X2FzaF9icm93c2VydGVzdC5jYyBiL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL2ZyYW1lL2Jyb3dzZXJfbm9uX2NsaWVudF9mcmFtZV92aWV3X2FzaF9icm93c2VydGVzdC5jYwppbmRleCA1MmJhNDQ0Li42NmNmMmVmIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS92aWV3cy9mcmFtZS9icm93c2VyX25vbl9jbGllbnRfZnJhbWVfdmlld19hc2hfYnJvd3NlcnRlc3QuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvZnJhbWUvYnJvd3Nlcl9ub25fY2xpZW50X2ZyYW1lX3ZpZXdfYXNoX2Jyb3dzZXJ0ZXN0LmNjCkBAIC0xMSwxMyArMTEsMTMgQEAKICNpbmNsdWRlICJhc2gvcHVibGljL2NwcC9mcmFtZV9oZWFkZXIuaCIKICNpbmNsdWRlICJhc2gvcHVibGljL2NwcC9pbW1lcnNpdmUvaW1tZXJzaXZlX2Z1bGxzY3JlZW5fY29udHJvbGxlcl90ZXN0X2FwaS5oIgogI2luY2x1ZGUgImFzaC9wdWJsaWMvY3BwL3NoZWxmX3Rlc3RfYXBpLmgiCisjaW5jbHVkZSAiYXNoL3B1YmxpYy9jcHAvc3BsaXRfdmlld190ZXN0X2FwaS5oIgogI2luY2x1ZGUgImFzaC9wdWJsaWMvY3BwL3Rlc3Qvc2hlbGxfdGVzdF9hcGkuaCIKICNpbmNsdWRlICJhc2gvcHVibGljL2NwcC93aW5kb3dfcGluX3R5cGUuaCIKICNpbmNsdWRlICJhc2gvcHVibGljL2NwcC93aW5kb3dfcHJvcGVydGllcy5oIgogI2luY2x1ZGUgImFzaC9wdWJsaWMvbW9qb20vY29uc3RhbnRzLm1vam9tLmgiCiAjaW5jbHVkZSAiYXNoL3NoZWxsLmgiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hc2gtb2sKICNpbmNsdWRlICJhc2gvd20vb3ZlcnZpZXcvb3ZlcnZpZXdfY29udHJvbGxlci5oIiAgICAgICAgLy8gbWFzaC1vawotI2luY2x1ZGUgImFzaC93bS9zcGxpdHZpZXcvc3BsaXRfdmlld19jb250cm9sbGVyLmgiICAgICAvLyBtYXNoLW9rCiAjaW5jbHVkZSAiYXNoL3dtL3RhYmxldF9tb2RlL3RhYmxldF9tb2RlX2NvbnRyb2xsZXIuaCIgIC8vIG1hc2gtb2sKICNpbmNsdWRlICJiYXNlL2JpbmRfaGVscGVycy5oIgogI2luY2x1ZGUgImJhc2UvcnVuX2xvb3AuaCIKQEAgLTEyODAsOCArMTI4MCw4IEBACiAgIEVYUEVDVF9GQUxTRShmcmFtZV92aWV3LT5jYXB0aW9uX2J1dHRvbl9jb250YWluZXJfLT5HZXRWaXNpYmxlKCkpOwogICBFbmRPdmVydmlldygpOwogICBFWFBFQ1RfRkFMU0UoZnJhbWVfdmlldy0+Y2FwdGlvbl9idXR0b25fY29udGFpbmVyXy0+R2V0VmlzaWJsZSgpKTsKLSAgYXNoOjpTaGVsbDo6R2V0KCktPnNwbGl0X3ZpZXdfY29udHJvbGxlcigpLT5TbmFwV2luZG93KAotICAgICAgd2lkZ2V0LT5HZXROYXRpdmVXaW5kb3coKSwgYXNoOjpTcGxpdFZpZXdDb250cm9sbGVyOjpMRUZUKTsKKyAgYXNoOjpTcGxpdFZpZXdUZXN0QXBpKCkuU25hcFdpbmRvdyh3aWRnZXQtPkdldE5hdGl2ZVdpbmRvdygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzaDo6U3BsaXRWaWV3VGVzdEFwaTo6U25hcFBvc2l0aW9uOjpMRUZUKTsKICAgRVhQRUNUX0ZBTFNFKGZyYW1lX3ZpZXctPmNhcHRpb25fYnV0dG9uX2NvbnRhaW5lcl8tPkdldFZpc2libGUoKSk7CiB9CiAKQEAgLTEzMTYsOCArMTMxNiw4IEBACiAgIEVuZE92ZXJ2aWV3KCk7CiAgIEVYUEVDVF9UUlVFKGZyYW1lX3ZpZXcyLT5jYXB0aW9uX2J1dHRvbl9jb250YWluZXJfLT5HZXRWaXNpYmxlKCkpOwogCi0gIGFzaDo6U2hlbGw6OkdldCgpLT5zcGxpdF92aWV3X2NvbnRyb2xsZXIoKS0+U25hcFdpbmRvdygKLSAgICAgIHdpZGdldDItPkdldE5hdGl2ZVdpbmRvdygpLCBhc2g6OlNwbGl0Vmlld0NvbnRyb2xsZXI6OlJJR0hUKTsKKyAgYXNoOjpTcGxpdFZpZXdUZXN0QXBpKCkuU25hcFdpbmRvdygKKyAgICAgIHdpZGdldDItPkdldE5hdGl2ZVdpbmRvdygpLCBhc2g6OlNwbGl0Vmlld1Rlc3RBcGk6OlNuYXBQb3NpdGlvbjo6UklHSFQpOwogICBFWFBFQ1RfVFJVRShmcmFtZV92aWV3Mi0+Y2FwdGlvbl9idXR0b25fY29udGFpbmVyXy0+R2V0VmlzaWJsZSgpKTsKIH0KIApkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvZnJhbWUvYnJvd3Nlcl92aWV3LmNjIGIvY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvZnJhbWUvYnJvd3Nlcl92aWV3LmNjCmluZGV4IDUxYTg2NDguLjI0ZGE1ODEgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL2ZyYW1lL2Jyb3dzZXJfdmlldy5jYworKysgYi9jaHJvbWUvYnJvd3Nlci91aS92aWV3cy9mcmFtZS9icm93c2VyX3ZpZXcuY2MKQEAgLTcwLDE0ICs3MCw3IEBACiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvdmlld19pZHMuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS92aWV3cy9hY2NlbGVyYXRvcl90YWJsZS5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL3ZpZXdzL2FjY2Vzc2liaWxpdHkvaW52ZXJ0X2J1YmJsZV92aWV3LmgiCi0jaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvYXV0b2ZpbGwvcGF5bWVudHMvbG9jYWxfY2FyZF9taWdyYXRpb25fYnViYmxlX3ZpZXdzLmgiCi0jaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvYXV0b2ZpbGwvcGF5bWVudHMvbG9jYWxfY2FyZF9taWdyYXRpb25faWNvbl92aWV3LmgiCi0jaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvYXV0b2ZpbGwvcGF5bWVudHMvc2F2ZV9jYXJkX2J1YmJsZV92aWV3cy5oIgotI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL3ZpZXdzL2F1dG9maWxsL3BheW1lbnRzL3NhdmVfY2FyZF9mYWlsdXJlX2J1YmJsZV92aWV3cy5oIgotI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL3ZpZXdzL2F1dG9maWxsL3BheW1lbnRzL3NhdmVfY2FyZF9pY29uX3ZpZXcuaCIKLSNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS92aWV3cy9hdXRvZmlsbC9wYXltZW50cy9zYXZlX2NhcmRfbWFuYWdlX2NhcmRzX2J1YmJsZV92aWV3cy5oIgotI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL3ZpZXdzL2F1dG9maWxsL3BheW1lbnRzL3NhdmVfY2FyZF9vZmZlcl9idWJibGVfdmlld3MuaCIKLSNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS92aWV3cy9hdXRvZmlsbC9wYXltZW50cy9zYXZlX2NhcmRfc2lnbl9pbl9wcm9tb19idWJibGVfdmlld3MuaCIKKyNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS92aWV3cy9hdXRvZmlsbC9hdXRvZmlsbF9idWJibGVfaGFuZGxlcl9pbXBsLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvYm9va21hcmtzL2Jvb2ttYXJrX2Jhcl92aWV3LmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvYm9va21hcmtzL2Jvb2ttYXJrX2J1YmJsZV92aWV3LmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvZG93bmxvYWQvZG93bmxvYWRfaW5fcHJvZ3Jlc3NfZGlhbG9nX3ZpZXcuaCIKQEAgLTEwMjYsNiArMTAxOSwxMCBAQAogCiB2b2lkIEJyb3dzZXJWaWV3OjpTZXRUb29sYmFyQnV0dG9uUHJvdmlkZXIoVG9vbGJhckJ1dHRvblByb3ZpZGVyKiBwcm92aWRlcikgewogICB0b29sYmFyX2J1dHRvbl9wcm92aWRlcl8gPSBwcm92aWRlcjsKKyAgLy8gUmVjcmVhdGUgdGhlIGF1dG9maWxsIGJ1YmJsZSBoYW5kbGVyIHdoZW4gdG9vbGJhciBidXR0b24gcHJvdmlkZXIgY2hhbmdlcy4KKyAgYXV0b2ZpbGxfYnViYmxlX2hhbmRsZXJfID0KKyAgICAgIHN0ZDo6bWFrZV91bmlxdWU8YXV0b2ZpbGw6OkF1dG9maWxsQnViYmxlSGFuZGxlckltcGw+KAorICAgICAgICAgIHRvb2xiYXJfYnV0dG9uX3Byb3ZpZGVyXywgYnJvd3Nlcl8tPnByb2ZpbGUoKSk7CiB9CiAKIGJvb2wgQnJvd3NlclZpZXc6OlVwZGF0ZVBhZ2VBY3Rpb25JY29uKFBhZ2VBY3Rpb25JY29uVHlwZSB0eXBlKSB7CkBAIC0xMDM0LDExICsxMDMxLDggQEAKICAgcmV0dXJuIGljb24gPyBpY29uLT5VcGRhdGUoKSA6IGZhbHNlOwogfQogCi12b2lkIEJyb3dzZXJWaWV3OjpTaG93QXZhdGFySGlnaGxpZ2h0QW5pbWF0aW9uKCkgewotICBBdmF0YXJUb29sYmFyQnV0dG9uKiBhdmF0YXJfYnV0dG9uID0gdG9vbGJhcl8tPkdldEF2YXRhclRvb2xiYXJCdXR0b24oKTsKLSAgaWYgKCFhdmF0YXJfYnV0dG9uKQotICAgIHJldHVybjsKLSAgYXZhdGFyX2J1dHRvbi0+U2hvd0F2YXRhckhpZ2hsaWdodEFuaW1hdGlvbigpOworYXV0b2ZpbGw6OkF1dG9maWxsQnViYmxlSGFuZGxlciogQnJvd3NlclZpZXc6OkdldEF1dG9maWxsQnViYmxlSGFuZGxlcigpIHsKKyAgcmV0dXJuIGF1dG9maWxsX2J1YmJsZV9oYW5kbGVyXy5nZXQoKTsKIH0KIAogdm9pZCBCcm93c2VyVmlldzo6RXhlY3V0ZVBhZ2VBY3Rpb25JY29uRm9yVGVzdGluZyhQYWdlQWN0aW9uSWNvblR5cGUgdHlwZSkgewpAQCAtMTMwOSw1NiArMTMwMyw2IEBACiAgIHJldHVybiBidWJibGU7CiB9CiAKLS8vIFRPRE8oY3JidWcuY29tLzkzMjgxOCk6IENsZWFuIHVwIHRoaXMgdHdvIGZ1bmN0aW9ucyBhbmQgYWRkIGhlbHBlciBmb3Igc2hhcmVkCi0vLyBjb2RlLgotLy8gVE9ETyhjcmJ1Zy5jb20vOTMyODE4KTogV2hldGhlciB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gb3duZWQgcG9pbnRlciBvciBub3QKLS8vIGlzIHVuY2xlYXIuIFNvcnQgdGhhdCBvdXQsIGFuZCBtYWtlIGl0IHJldHVybiB1bmlxdWVfcHRyIG9yIG5vdCBhcwotLy8gYXBwcm9wcmlhdGUuCi1hdXRvZmlsbDo6U2F2ZUNhcmRCdWJibGVWaWV3KiBCcm93c2VyVmlldzo6U2hvd1NhdmVDcmVkaXRDYXJkQnViYmxlKAotICAgIGNvbnRlbnQ6OldlYkNvbnRlbnRzKiB3ZWJfY29udGVudHMsCi0gICAgYXV0b2ZpbGw6OlNhdmVDYXJkQnViYmxlQ29udHJvbGxlciogY29udHJvbGxlciwKLSAgICBib29sIHVzZXJfZ2VzdHVyZSkgewotICBhdXRvZmlsbDo6QnViYmxlVHlwZSBidWJibGVfdHlwZSA9IGNvbnRyb2xsZXItPkdldEJ1YmJsZVR5cGUoKTsKLSAgUGFnZUFjdGlvbkljb25WaWV3KiBpY29uX3ZpZXcgPQotICAgICAgdG9vbGJhcl9idXR0b25fcHJvdmlkZXJfLT5HZXRQYWdlQWN0aW9uSWNvblZpZXcoCi0gICAgICAgICAgUGFnZUFjdGlvbkljb25UeXBlOjprU2F2ZUNhcmQpOwotICB2aWV3czo6VmlldyogYW5jaG9yX3ZpZXcgPQotICAgICAgdG9vbGJhcl9idXR0b25fcHJvdmlkZXJfLT5HZXRBbmNob3JWaWV3KFBhZ2VBY3Rpb25JY29uVHlwZTo6a1NhdmVDYXJkKTsKLQotICBhdXRvZmlsbDo6U2F2ZUNhcmRCdWJibGVWaWV3cyogYnViYmxlID0gbnVsbHB0cjsKLSAgc3dpdGNoIChidWJibGVfdHlwZSkgewotICAgIGNhc2UgYXV0b2ZpbGw6OkJ1YmJsZVR5cGU6OkxPQ0FMX1NBVkU6Ci0gICAgY2FzZSBhdXRvZmlsbDo6QnViYmxlVHlwZTo6VVBMT0FEX1NBVkU6Ci0gICAgICBidWJibGUgPSBuZXcgYXV0b2ZpbGw6OlNhdmVDYXJkT2ZmZXJCdWJibGVWaWV3cyhhbmNob3Jfdmlldywgd2ViX2NvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGF1dG9maWxsOjpCdWJibGVUeXBlOjpTSUdOX0lOX1BST01POgotICAgICAgYnViYmxlID0gbmV3IGF1dG9maWxsOjpTYXZlQ2FyZFNpZ25JblByb21vQnViYmxlVmlld3MoCi0gICAgICAgICAgYW5jaG9yX3ZpZXcsIHdlYl9jb250ZW50cywgY29udHJvbGxlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGF1dG9maWxsOjpCdWJibGVUeXBlOjpNQU5BR0VfQ0FSRFM6Ci0gICAgICBidWJibGUgPSBuZXcgYXV0b2ZpbGw6OlNhdmVDYXJkTWFuYWdlQ2FyZHNCdWJibGVWaWV3cygKLSAgICAgICAgICBhbmNob3Jfdmlldywgd2ViX2NvbnRlbnRzLCBjb250cm9sbGVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYXV0b2ZpbGw6OkJ1YmJsZVR5cGU6OkZBSUxVUkU6Ci0gICAgICBidWJibGUgPSBuZXcgYXV0b2ZpbGw6OlNhdmVDYXJkRmFpbHVyZUJ1YmJsZVZpZXdzKAotICAgICAgICAgIGFuY2hvcl92aWV3LCB3ZWJfY29udGVudHMsIGNvbnRyb2xsZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBhdXRvZmlsbDo6QnViYmxlVHlwZTo6VVBMT0FEX0lOX1BST0dSRVNTOgotICAgIGNhc2UgYXV0b2ZpbGw6OkJ1YmJsZVR5cGU6OklOQUNUSVZFOgotICAgICAgYnJlYWs7Ci0gIH0KLSAgRENIRUNLKGJ1YmJsZSk7Ci0KLSAgaWYgKGljb25fdmlldykKLSAgICBidWJibGUtPlNldEhpZ2hsaWdodGVkQnV0dG9uKGljb25fdmlldyk7Ci0KLSAgdmlld3M6OkJ1YmJsZURpYWxvZ0RlbGVnYXRlVmlldzo6Q3JlYXRlQnViYmxlKGJ1YmJsZSk7Ci0gIGJ1YmJsZS0+U2hvdyh1c2VyX2dlc3R1cmUgPyBhdXRvZmlsbDo6U2F2ZUNhcmRCdWJibGVWaWV3czo6VVNFUl9HRVNUVVJFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhdXRvZmlsbDo6U2F2ZUNhcmRCdWJibGVWaWV3czo6QVVUT01BVElDKTsKLSAgcmV0dXJuIGJ1YmJsZTsKLX0KLQogU2hhcmluZ0RpYWxvZyogQnJvd3NlclZpZXc6OlNob3dTaGFyaW5nRGlhbG9nKAogICAgIGNvbnRlbnQ6OldlYkNvbnRlbnRzKiB3ZWJfY29udGVudHMsCiAgICAgU2hhcmluZ1VpQ29udHJvbGxlciogY29udHJvbGxlcikgewpAQCAtMTM5NiwyOSArMTM0MCw2IEBACiAgIHJldHVybiBidWJibGU7CiB9CiAKLWF1dG9maWxsOjpMb2NhbENhcmRNaWdyYXRpb25CdWJibGUqIEJyb3dzZXJWaWV3OjpTaG93TG9jYWxDYXJkTWlncmF0aW9uQnViYmxlKAotICAgIGNvbnRlbnQ6OldlYkNvbnRlbnRzKiB3ZWJfY29udGVudHMsCi0gICAgYXV0b2ZpbGw6OkxvY2FsQ2FyZE1pZ3JhdGlvbkJ1YmJsZUNvbnRyb2xsZXIqIGNvbnRyb2xsZXIsCi0gICAgYm9vbCB1c2VyX2dlc3R1cmUpIHsKLSAgYXV0b2ZpbGw6OkxvY2FsQ2FyZE1pZ3JhdGlvbkJ1YmJsZVZpZXdzKiBidWJibGUgPQotICAgICAgbmV3IGF1dG9maWxsOjpMb2NhbENhcmRNaWdyYXRpb25CdWJibGVWaWV3cygKLSAgICAgICAgICB0b29sYmFyX2J1dHRvbl9wcm92aWRlcl8tPkdldEFuY2hvclZpZXcoCi0gICAgICAgICAgICAgIFBhZ2VBY3Rpb25JY29uVHlwZTo6a0xvY2FsQ2FyZE1pZ3JhdGlvbiksCi0gICAgICAgICAgd2ViX2NvbnRlbnRzLCBjb250cm9sbGVyKTsKLQotICBQYWdlQWN0aW9uSWNvblZpZXcqIGljb25fdmlldyA9Ci0gICAgICB0b29sYmFyX2J1dHRvbl9wcm92aWRlcl8tPkdldFBhZ2VBY3Rpb25JY29uVmlldygKLSAgICAgICAgICBQYWdlQWN0aW9uSWNvblR5cGU6OmtMb2NhbENhcmRNaWdyYXRpb24pOwotICBpZiAoaWNvbl92aWV3KQotICAgIGJ1YmJsZS0+U2V0SGlnaGxpZ2h0ZWRCdXR0b24oaWNvbl92aWV3KTsKLQotICB2aWV3czo6QnViYmxlRGlhbG9nRGVsZWdhdGVWaWV3OjpDcmVhdGVCdWJibGUoYnViYmxlKTsKLSAgYnViYmxlLT5TaG93KHVzZXJfZ2VzdHVyZQotICAgICAgICAgICAgICAgICAgID8gYXV0b2ZpbGw6OkxvY2FsQ2FyZE1pZ3JhdGlvbkJ1YmJsZVZpZXdzOjpVU0VSX0dFU1RVUkUKLSAgICAgICAgICAgICAgICAgICA6IGF1dG9maWxsOjpMb2NhbENhcmRNaWdyYXRpb25CdWJibGVWaWV3czo6QVVUT01BVElDKTsKLSAgcmV0dXJuIGJ1YmJsZTsKLX0KLQogU2hvd1RyYW5zbGF0ZUJ1YmJsZVJlc3VsdCBCcm93c2VyVmlldzo6U2hvd1RyYW5zbGF0ZUJ1YmJsZSgKICAgICBjb250ZW50OjpXZWJDb250ZW50cyogd2ViX2NvbnRlbnRzLAogICAgIHRyYW5zbGF0ZTo6VHJhbnNsYXRlU3RlcCBzdGVwLApAQCAtMjk2OSw3ICsyODkwLDggQEAKICAgICBzaWduaW5fbWV0cmljczo6QWNjZXNzUG9pbnQgYWNjZXNzX3BvaW50LAogICAgIGJvb2wgZm9jdXNfZmlyc3RfcHJvZmlsZV9idXR0b24pIHsKICAgLy8gRG8gbm90IHNob3cgYXZhdGFyIGJ1YmJsZSBpZiB0aGVyZSBpcyBubyBhdmF0YXIgbWVudSBidXR0b24uCi0gIHZpZXdzOjpCdXR0b24qIGF2YXRhcl9idXR0b24gPSB0b29sYmFyXy0+R2V0QXZhdGFyVG9vbGJhckJ1dHRvbigpOworICB2aWV3czo6QnV0dG9uKiBhdmF0YXJfYnV0dG9uID0KKyAgICAgIHRvb2xiYXJfYnV0dG9uX3Byb3ZpZGVyXy0+R2V0QXZhdGFyVG9vbGJhckJ1dHRvbigpOwogICBpZiAoIWF2YXRhcl9idXR0b24pCiAgICAgcmV0dXJuOwogCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci91aS92aWV3cy9mcmFtZS9icm93c2VyX3ZpZXcuaCBiL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL2ZyYW1lL2Jyb3dzZXJfdmlldy5oCmluZGV4IGNkNWU1MzM3Li41OTZiMjQ0YiAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvZnJhbWUvYnJvd3Nlcl92aWV3LmgKKysrIGIvY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvZnJhbWUvYnJvd3Nlcl92aWV3LmgKQEAgLTMzMiw3ICszMzIsNyBAQAogICBib29sIElzRnVsbHNjcmVlbigpIGNvbnN0IG92ZXJyaWRlOwogICBib29sIElzRnVsbHNjcmVlbkJ1YmJsZVZpc2libGUoKSBjb25zdCBvdmVycmlkZTsKICAgYm9vbCBVcGRhdGVQYWdlQWN0aW9uSWNvbihQYWdlQWN0aW9uSWNvblR5cGUgdHlwZSkgb3ZlcnJpZGU7Ci0gIHZvaWQgU2hvd0F2YXRhckhpZ2hsaWdodEFuaW1hdGlvbigpIG92ZXJyaWRlOworICBhdXRvZmlsbDo6QXV0b2ZpbGxCdWJibGVIYW5kbGVyKiBHZXRBdXRvZmlsbEJ1YmJsZUhhbmRsZXIoKSBvdmVycmlkZTsKICAgdm9pZCBFeGVjdXRlUGFnZUFjdGlvbkljb25Gb3JUZXN0aW5nKFBhZ2VBY3Rpb25JY29uVHlwZSB0eXBlKSBvdmVycmlkZTsKICAgTG9jYXRpb25CYXIqIEdldExvY2F0aW9uQmFyKCkgY29uc3Qgb3ZlcnJpZGU7CiAgIHZvaWQgU2V0Rm9jdXNUb0xvY2F0aW9uQmFyKGJvb2wgc2VsZWN0X2FsbCkgb3ZlcnJpZGU7CkBAIC0zNjksMTggKzM2OSwxMCBAQAogICAgICAgY29udGVudDo6V2ViQ29udGVudHMqIGNvbnRlbnRzLAogICAgICAgcXJjb2RlX2dlbmVyYXRvcjo6UVJDb2RlR2VuZXJhdG9yQnViYmxlQ29udHJvbGxlciogY29udHJvbGxlciwKICAgICAgIGNvbnN0IEdVUkwmIHVybCkgb3ZlcnJpZGU7Ci0gIGF1dG9maWxsOjpTYXZlQ2FyZEJ1YmJsZVZpZXcqIFNob3dTYXZlQ3JlZGl0Q2FyZEJ1YmJsZSgKLSAgICAgIGNvbnRlbnQ6OldlYkNvbnRlbnRzKiBjb250ZW50cywKLSAgICAgIGF1dG9maWxsOjpTYXZlQ2FyZEJ1YmJsZUNvbnRyb2xsZXIqIGNvbnRyb2xsZXIsCi0gICAgICBib29sIGlzX3VzZXJfZ2VzdHVyZSkgb3ZlcnJpZGU7CiAgIHNlbmRfdGFiX3RvX3NlbGY6OlNlbmRUYWJUb1NlbGZCdWJibGVWaWV3KiBTaG93U2VuZFRhYlRvU2VsZkJ1YmJsZSgKICAgICAgIGNvbnRlbnQ6OldlYkNvbnRlbnRzKiBjb250ZW50cywKICAgICAgIHNlbmRfdGFiX3RvX3NlbGY6OlNlbmRUYWJUb1NlbGZCdWJibGVDb250cm9sbGVyKiBjb250cm9sbGVyLAogICAgICAgYm9vbCBpc191c2VyX2dlc3R1cmUpIG92ZXJyaWRlOwotICBhdXRvZmlsbDo6TG9jYWxDYXJkTWlncmF0aW9uQnViYmxlKiBTaG93TG9jYWxDYXJkTWlncmF0aW9uQnViYmxlKAotICAgICAgY29udGVudDo6V2ViQ29udGVudHMqIGNvbnRlbnRzLAotICAgICAgYXV0b2ZpbGw6OkxvY2FsQ2FyZE1pZ3JhdGlvbkJ1YmJsZUNvbnRyb2xsZXIqIGNvbnRyb2xsZXIsCi0gICAgICBib29sIGlzX3VzZXJfZ2VzdHVyZSkgb3ZlcnJpZGU7CiAgIFNob3dUcmFuc2xhdGVCdWJibGVSZXN1bHQgU2hvd1RyYW5zbGF0ZUJ1YmJsZSgKICAgICAgIGNvbnRlbnQ6OldlYkNvbnRlbnRzKiBjb250ZW50cywKICAgICAgIHRyYW5zbGF0ZTo6VHJhbnNsYXRlU3RlcCBzdGVwLApAQCAtNzcyLDYgKzc2NCw5IEBACiAgIC8vIGFwcGVhciBpbiBhIGhvc3RlZCBhcHAgZnJhbWUgb3IgaW4gYSB0YWJiZWQgVUkgdG9vbGJhci4KICAgVG9vbGJhckJ1dHRvblByb3ZpZGVyKiB0b29sYmFyX2J1dHRvbl9wcm92aWRlcl8gPSBudWxscHRyOwogCisgIC8vIFRoZSBoYW5kbGVyIHJlc3BvbnNpYmxlIGZvciBzaG93aW5nIGF1dG9maWxsIGJ1YmJsZXMuCisgIHN0ZDo6dW5pcXVlX3B0cjxhdXRvZmlsbDo6QXV0b2ZpbGxCdWJibGVIYW5kbGVyPiBhdXRvZmlsbF9idWJibGVfaGFuZGxlcl87CisKICAgLy8gVHJhY2tzIGFuZCBzdG9yZXMgdGhlIGxhc3QgZm9jdXNlZCB2aWV3IHdoaWNoIGlzIG5vdCB0aGUKICAgLy8gZGV2dG9vbHNfd2ViX3ZpZXdfIG9yIGFueSBvZiBpdHMgY2hpbGRyZW4uIFVzZWQgdG8gcmVzdG9yZSBmb2N1cyBvbmNlCiAgIC8vIHRoZSBkZXZ0b29sc193ZWJfdmlld18gaXMgaGlkZGVuLgpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvZnJhbWUvaW1tZXJzaXZlX21vZGVfY29udHJvbGxlcl9hc2guY2MgYi9jaHJvbWUvYnJvd3Nlci91aS92aWV3cy9mcmFtZS9pbW1lcnNpdmVfbW9kZV9jb250cm9sbGVyX2FzaC5jYwppbmRleCA5OTc0MmIwMy4uMzU5ODA5MCAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvZnJhbWUvaW1tZXJzaXZlX21vZGVfY29udHJvbGxlcl9hc2guY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvZnJhbWUvaW1tZXJzaXZlX21vZGVfY29udHJvbGxlcl9hc2guY2MKQEAgLTE2LDcgKzE2LDYgQEAKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS92aWV3cy90YWJzL3RhYl9zdHJpcC5oIgogI2luY2x1ZGUgImNvbnRlbnQvcHVibGljL2Jyb3dzZXIvd2ViX2NvbnRlbnRzLmgiCiAjaW5jbHVkZSAidWkvYXVyYS9jbGllbnQvYXVyYV9jb25zdGFudHMuaCIKLSNpbmNsdWRlICJ1aS9hdXJhL3dpbmRvdy5oIgogI2luY2x1ZGUgInVpL2F1cmEvd2luZG93X3RhcmdldGVyLmgiCiAjaW5jbHVkZSAidWkvY29tcG9zaXRvci9sYXllci5oIgogI2luY2x1ZGUgInVpL2NvbXBvc2l0b3IvcGFpbnRfY29udGV4dC5oIgpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvZnJhbWUvaW1tZXJzaXZlX21vZGVfY29udHJvbGxlcl9hc2guaCBiL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL2ZyYW1lL2ltbWVyc2l2ZV9tb2RlX2NvbnRyb2xsZXJfYXNoLmgKaW5kZXggYTQ5YWFlYmMuLjA5NTBlZDkgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL2ZyYW1lL2ltbWVyc2l2ZV9tb2RlX2NvbnRyb2xsZXJfYXNoLmgKKysrIGIvY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvZnJhbWUvaW1tZXJzaXZlX21vZGVfY29udHJvbGxlcl9hc2guaApAQCAtMTQsMTMgKzE0LDEwIEBACiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvZXhjbHVzaXZlX2FjY2Vzcy9mdWxsc2NyZWVuX2NvbnRyb2xsZXIuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS9leGNsdXNpdmVfYWNjZXNzL2Z1bGxzY3JlZW5fb2JzZXJ2ZXIuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS92aWV3cy9mcmFtZS9pbW1lcnNpdmVfbW9kZV9jb250cm9sbGVyLmgiCisjaW5jbHVkZSAidWkvYXVyYS93aW5kb3cuaCIKICNpbmNsdWRlICJ1aS9hdXJhL3dpbmRvd19vYnNlcnZlci5oIgogI2luY2x1ZGUgInVpL2dmeC9nZW9tZXRyeS9yZWN0LmgiCiAKLW5hbWVzcGFjZSBhdXJhIHsKLWNsYXNzIFdpbmRvdzsKLX0KLQogY2xhc3MgSW1tZXJzaXZlTW9kZUNvbnRyb2xsZXJBc2gKICAgICA6IHB1YmxpYyBJbW1lcnNpdmVNb2RlQ29udHJvbGxlciwKICAgICAgIHB1YmxpYyBhc2g6OkltbWVyc2l2ZUZ1bGxzY3JlZW5Db250cm9sbGVyRGVsZWdhdGUsCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci91aS92aWV3cy9mcmFtZS90b29sYmFyX2J1dHRvbl9wcm92aWRlci5oIGIvY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvZnJhbWUvdG9vbGJhcl9idXR0b25fcHJvdmlkZXIuaAppbmRleCA0MTVkYzk5Li4wNThjZWI4IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS92aWV3cy9mcmFtZS90b29sYmFyX2J1dHRvbl9wcm92aWRlci5oCisrKyBiL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL2ZyYW1lL3Rvb2xiYXJfYnV0dG9uX3Byb3ZpZGVyLmgKQEAgLTgsNiArOCw3IEBACiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvcGFnZV9hY3Rpb24vcGFnZV9hY3Rpb25faWNvbl90eXBlLmgiCiAKIGNsYXNzIEFwcE1lbnVCdXR0b247CitjbGFzcyBBdmF0YXJUb29sYmFyQnV0dG9uOwogY2xhc3MgQnJvd3NlckFjdGlvbnNDb250YWluZXI7CiBjbGFzcyBQYWdlQWN0aW9uSWNvblZpZXc7CiBjbGFzcyBUb29sYmFyQWN0aW9uVmlldzsKQEAgLTYxLDYgKzYyLDkgQEAKICAgLy8gU2VlIGNvbW1lbnQgaW4gYnJvd3Nlcl93aW5kb3cuaCBmb3IgbW9yZSBpbmZvLgogICB2aXJ0dWFsIHZvaWQgWm9vbUNoYW5nZWRGb3JBY3RpdmVUYWIoYm9vbCBjYW5fc2hvd19idWJibGUpID0gMDsKIAorICAvLyBSZXR1cm5zIHRoZSBhdmF0YXIgYnV0dG9uLgorICB2aXJ0dWFsIEF2YXRhclRvb2xiYXJCdXR0b24qIEdldEF2YXRhclRvb2xiYXJCdXR0b24oKSA9IDA7CisKICAgLy8gVE9ETyhjYWxhbWl0eSk6IE1vdmUgb3RoZXIgYnV0dG9ucyBhbmQgYnV0dG9uIGFjdGlvbnMgaW50byBoZXJlLgogIHByb3RlY3RlZDoKICAgdmlydHVhbCB+VG9vbGJhckJ1dHRvblByb3ZpZGVyKCkge30KZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL29tbmlib3gvb21uaWJveF9yZXN1bHRfdmlldy5jYyBiL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL29tbmlib3gvb21uaWJveF9yZXN1bHRfdmlldy5jYwppbmRleCA4NDYxZDM0Li4wOTJlZGVmIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS92aWV3cy9vbW5pYm94L29tbmlib3hfcmVzdWx0X3ZpZXcuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvdWkvdmlld3Mvb21uaWJveC9vbW5pYm94X3Jlc3VsdF92aWV3LmNjCkBAIC0xMDEsNyArMTAxLDcgQEAKICAga2V5d29yZF92aWV3Xy0+T25NYXRjaFVwZGF0ZSh0aGlzLCBtYXRjaF8pOwogCiAgIC8vIFNldCB1cCBwb3NzaWJsZSBidXR0b24uCi0gIGlmIChtYXRjaC5TaG91bGRTaG93QnV0dG9uKCkpIHsKKyAgaWYgKG1hdGNoLlNob3VsZFNob3dUYWJNYXRjaEJ1dHRvbigpKSB7CiAgICAgc3VnZ2VzdGlvbl90YWJfc3dpdGNoX2J1dHRvbl8gPSBzdGQ6Om1ha2VfdW5pcXVlPE9tbmlib3hUYWJTd2l0Y2hCdXR0b24+KAogICAgICAgICBwb3B1cF9jb250ZW50c192aWV3XywgdGhpcywKICAgICAgICAgbDEwbl91dGlsOjpHZXRTdHJpbmdVVEYxNihJRFNfT01OSUJPWF9UQUJfU1VHR0VTVF9ISU5UKSwKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL29tbmlib3gvb21uaWJveF92aWV3X3ZpZXdzLmNjIGIvY2hyb21lL2Jyb3dzZXIvdWkvdmlld3Mvb21uaWJveC9vbW5pYm94X3ZpZXdfdmlld3MuY2MKaW5kZXggZTdhNTliYTIuLjA1YjNiMTEgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL29tbmlib3gvb21uaWJveF92aWV3X3ZpZXdzLmNjCisrKyBiL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL29tbmlib3gvb21uaWJveF92aWV3X3ZpZXdzLmNjCkBAIC02NjUsNyArNjY1LDcgQEAKICAgLy8gSWYgd2Ugc2hpZnQtdGFiYmVkIChhbmQgYWN0dWFsbHkgbW92ZWQpIHRvIGEgc3VnZ2VzdGlvbiB3aXRoIGEgdGFiCiAgIC8vIHN3aXRjaCBidXR0b24sIHNlbGVjdCBpdC4KICAgaWYgKGV2ZW50LklzU2hpZnREb3duKCkgJiYKLSAgICAgIG1vZGVsKCktPnBvcHVwX21vZGVsKCktPlNlbGVjdGVkTGluZUhhc0J1dHRvbigpKSB7CisgICAgICBtb2RlbCgpLT5wb3B1cF9tb2RlbCgpLT5TZWxlY3RlZExpbmVIYXNUYWJNYXRjaCgpKSB7CiAgICAgbW9kZWwoKS0+cG9wdXBfbW9kZWwoKS0+U2V0U2VsZWN0ZWRMaW5lU3RhdGUoCiAgICAgICAgIE9tbmlib3hQb3B1cE1vZGVsOjpCVVRUT05fRk9DVVNFRCk7CiAgICAgcG9wdXBfdmlld18tPlByb3ZpZGVCdXR0b25Gb2N1c0hpbnQoCkBAIC02OTcsNyArNjk3LDcgQEAKIAogYm9vbCBPbW5pYm94Vmlld1ZpZXdzOjpTZWxlY3RlZFN1Z2dlc3Rpb25IYXNUYWJNYXRjaCgpIGNvbnN0IHsKICAgcmV0dXJuIG1vZGVsKCktPnBvcHVwX21vZGVsKCkgJiYgIC8vIENhbiBiZSBudWxsIGluIHRlc3RzLgotICAgICAgICAgbW9kZWwoKS0+cG9wdXBfbW9kZWwoKS0+U2VsZWN0ZWRMaW5lSGFzQnV0dG9uKCk7CisgICAgICAgICBtb2RlbCgpLT5wb3B1cF9tb2RlbCgpLT5TZWxlY3RlZExpbmVIYXNUYWJNYXRjaCgpOwogfQogCiBib29sIE9tbmlib3hWaWV3Vmlld3M6OkRpcmVjdGlvbkF3YXJlU2VsZWN0aW9uQXRFbmQoKSBjb25zdCB7CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci91aS92aWV3cy9wcm9maWxlcy9hdmF0YXJfdG9vbGJhcl9idXR0b24uY2MgYi9jaHJvbWUvYnJvd3Nlci91aS92aWV3cy9wcm9maWxlcy9hdmF0YXJfdG9vbGJhcl9idXR0b24uY2MKaW5kZXggMTJkNGY3OC4uZDhiZmExNSAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvcHJvZmlsZXMvYXZhdGFyX3Rvb2xiYXJfYnV0dG9uLmNjCisrKyBiL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL3Byb2ZpbGVzL2F2YXRhcl90b29sYmFyX2J1dHRvbi5jYwpAQCAtMTAsNyArMTAsNiBAQAogI2luY2x1ZGUgImJ1aWxkL2J1aWxkX2NvbmZpZy5oIgogI2luY2x1ZGUgImNocm9tZS9hcHAvY2hyb21lX2NvbW1hbmRfaWRzLmgiCiAjaW5jbHVkZSAiY2hyb21lL2FwcC92ZWN0b3JfaWNvbnMvdmVjdG9yX2ljb25zLmgiCi0jaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvYXV0b2ZpbGwvcGVyc29uYWxfZGF0YV9tYW5hZ2VyX2ZhY3RvcnkuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9icm93c2VyX3Byb2Nlc3MuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9wcm9maWxlcy9hdmF0YXJfbWVudS5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3Byb2ZpbGVzL3Byb2ZpbGUuaCIKQEAgLTE3MCw5ICsxNjksNiBAQAogICBVcGRhdGVUZXh0KCk7CiAKICAgbWRfb2JzZXJ2ZXJfLkFkZCh1aTo6TWF0ZXJpYWxEZXNpZ25Db250cm9sbGVyOjpHZXRJbnN0YW5jZSgpKTsKLSAgcGVyc29uYWxfZGF0YV9tYW5hZ2VyX29ic2VydmVyXy5BZGQoCi0gICAgICBhdXRvZmlsbDo6UGVyc29uYWxEYXRhTWFuYWdlckZhY3Rvcnk6OkdldEZvclByb2ZpbGUoCi0gICAgICAgICAgcHJvZmlsZV8tPkdldE9yaWdpbmFsUHJvZmlsZSgpKSk7CiB9CiAKIEF2YXRhclRvb2xiYXJCdXR0b246On5BdmF0YXJUb29sYmFyQnV0dG9uKCkgewpAQCAtMzYyLDE4ICszNTgsMTkgQEAKIAogdm9pZCBBdmF0YXJUb29sYmFyQnV0dG9uOjpPblVuY29uc2VudGVkUHJpbWFyeUFjY291bnRDaGFuZ2VkKAogICAgIGNvbnN0IENvcmVBY2NvdW50SW5mbyYgdW5jb25zZW50ZWRfcHJpbWFyeV9hY2NvdW50X2luZm8pIHsKLSAgaWYgKCFiYXNlOjpGZWF0dXJlTGlzdDo6SXNFbmFibGVkKGZlYXR1cmVzOjprQW5pbWF0ZWRBdmF0YXJCdXR0b25PblNpZ25JbikpCi0gICAgcmV0dXJuOwotICBPblVzZXJJZGVudGl0eUNoYW5nZWQodW5jb25zZW50ZWRfcHJpbWFyeV9hY2NvdW50X2luZm8pOworICBPblVzZXJJZGVudGl0eUNoYW5nZWQodW5jb25zZW50ZWRfcHJpbWFyeV9hY2NvdW50X2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlczo6a0FuaW1hdGVkQXZhdGFyQnV0dG9uT25TaWduSW4pOwogfQogCiB2b2lkIEF2YXRhclRvb2xiYXJCdXR0b246Ok9uUmVmcmVzaFRva2Vuc0xvYWRlZCgpIHsKLSAgaWYgKCFzaWduaW5fdWlfdXRpbDo6U2hvdWxkU2hvd0lkZW50aXR5T25PcGVuaW5nUHJvZmlsZSgKKyAgaWYgKCFzaWduaW5fdWlfdXRpbDo6U2hvdWxkU2hvd0FuaW1hdGVkSWRlbnRpdHlPbk9wZW5pbmdXaW5kb3coCiAgICAgICAgICAgR2V0UHJvZmlsZUF0dHJpYnV0ZXNTdG9yYWdlKCksIHByb2ZpbGVfKSkgewogICAgIHJldHVybjsKICAgfQorCiAgIE9uVXNlcklkZW50aXR5Q2hhbmdlZChJZGVudGl0eU1hbmFnZXJGYWN0b3J5OjpHZXRGb3JQcm9maWxlKHByb2ZpbGVfKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0VW5jb25zZW50ZWRQcmltYXJ5QWNjb3VudEluZm8oKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5HZXRVbmNvbnNlbnRlZFByaW1hcnlBY2NvdW50SW5mbygpLAorICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXM6OmtBbmltYXRlZEF2YXRhckJ1dHRvbk9uT3BlbmluZ1dpbmRvdyk7CiB9CiAKIHZvaWQgQXZhdGFyVG9vbGJhckJ1dHRvbjo6T25BY2NvdW50c0luQ29va2llVXBkYXRlZCgKQEAgLTM5NywxMCArMzk0LDYgQEAKICAgUHJlZmVycmVkU2l6ZUNoYW5nZWQoKTsKIH0KIAotdm9pZCBBdmF0YXJUb29sYmFyQnV0dG9uOjpPbkNyZWRpdENhcmRTYXZlZCgpIHsKLSAgU2hvd0F2YXRhckhpZ2hsaWdodEFuaW1hdGlvbigpOwotfQotCiB2b2lkIEF2YXRhclRvb2xiYXJCdXR0b246OlNob3dJZGVudGl0eUFuaW1hdGlvbigpIHsKICAgRENIRUNLX0VRKGlkZW50aXR5X2FuaW1hdGlvbl9zdGF0ZV8sCiAgICAgICAgICAgICBJZGVudGl0eUFuaW1hdGlvblN0YXRlOjprV2FpdGluZ0ZvckltYWdlKTsKQEAgLTU3NCw5ICs1NjcsMTggQEAKIH0KIAogdm9pZCBBdmF0YXJUb29sYmFyQnV0dG9uOjpPblVzZXJJZGVudGl0eUNoYW5nZWQoCi0gICAgY29uc3QgQ29yZUFjY291bnRJbmZvJiB1c2VyX2lkZW50aXR5KSB7CisgICAgY29uc3QgQ29yZUFjY291bnRJbmZvJiB1c2VyX2lkZW50aXR5LAorICAgIGNvbnN0IGJhc2U6OkZlYXR1cmUmIHRyaWdnZXJpbmdfZmVhdHVyZSkgeworICBpZiAodXNlcl9pZGVudGl0eS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuOworCisgIC8vIFJlY29yZCB0aGUgbGFzdCB0aW1lIHRoZSBhbmltYXRlZCBpZGVudGl0eSB3YXMgc2V0LiBUaGlzIGlzIGRvbmUgZXZlbiBpZgorICAvLyB0aGUgZmVhdHVyZSBpcyBkaXNhYmxlZCwgdG8gYWxsb3cgY29tcGFyaW5nIG1ldHJpY3MgYmV0d2VlbiBleHBlcmltZW50YWwKKyAgLy8gZ3JvdXBzLgorICBzaWduaW5fdWlfdXRpbDo6UmVjb3JkQW5pbWF0ZWRJZGVudGl0eVRyaWdnZXJlZChwcm9maWxlXyk7CisKICAgaWYgKCFiYXNlOjpGZWF0dXJlTGlzdDo6SXNFbmFibGVkKGZlYXR1cmVzOjprQW5pbWF0ZWRBdmF0YXJCdXR0b24pIHx8Ci0gICAgICB1c2VyX2lkZW50aXR5LklzRW1wdHkoKSkgeworICAgICAgIWJhc2U6OkZlYXR1cmVMaXN0OjpJc0VuYWJsZWQodHJpZ2dlcmluZ19mZWF0dXJlKSkgewogICAgIHJldHVybjsKICAgfQogCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci91aS92aWV3cy9wcm9maWxlcy9hdmF0YXJfdG9vbGJhcl9idXR0b24uaCBiL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL3Byb2ZpbGVzL2F2YXRhcl90b29sYmFyX2J1dHRvbi5oCmluZGV4IDYyMWUwOGUuLmIzY2JmN2UgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL3Byb2ZpbGVzL2F2YXRhcl90b29sYmFyX2J1dHRvbi5oCisrKyBiL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL3Byb2ZpbGVzL2F2YXRhcl90b29sYmFyX2J1dHRvbi5oCkBAIC01LDYgKzUsNyBAQAogI2lmbmRlZiBDSFJPTUVfQlJPV1NFUl9VSV9WSUVXU19QUk9GSUxFU19BVkFUQVJfVE9PTEJBUl9CVVRUT05fSF8KICNkZWZpbmUgQ0hST01FX0JST1dTRVJfVUlfVklFV1NfUFJPRklMRVNfQVZBVEFSX1RPT0xCQVJfQlVUVE9OX0hfCiAKKyNpbmNsdWRlICJiYXNlL2ZlYXR1cmVfbGlzdC5oIgogI2luY2x1ZGUgImJhc2UvbWFjcm9zLmgiCiAjaW5jbHVkZSAiYmFzZS9zY29wZWRfb2JzZXJ2ZXIuaCIKICNpbmNsdWRlICJidWlsZC9idWlsZF9jb25maWcuaCIKQEAgLTE0LDggKzE1LDYgQEAKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS9icm93c2VyX2xpc3QuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS9icm93c2VyX2xpc3Rfb2JzZXJ2ZXIuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS92aWV3cy90b29sYmFyL3Rvb2xiYXJfYnV0dG9uLmgiCi0jaW5jbHVkZSAiY29tcG9uZW50cy9hdXRvZmlsbC9jb3JlL2Jyb3dzZXIvcGVyc29uYWxfZGF0YV9tYW5hZ2VyLmgiCi0jaW5jbHVkZSAiY29tcG9uZW50cy9hdXRvZmlsbC9jb3JlL2Jyb3dzZXIvcGVyc29uYWxfZGF0YV9tYW5hZ2VyX29ic2VydmVyLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9zaWduaW4vcHVibGljL2lkZW50aXR5X21hbmFnZXIvaWRlbnRpdHlfbWFuYWdlci5oIgogI2luY2x1ZGUgInVpL2Jhc2UvbWF0ZXJpYWxfZGVzaWduL21hdGVyaWFsX2Rlc2lnbl9jb250cm9sbGVyLmgiCiAjaW5jbHVkZSAidWkvYmFzZS9tYXRlcmlhbF9kZXNpZ24vbWF0ZXJpYWxfZGVzaWduX2NvbnRyb2xsZXJfb2JzZXJ2ZXIuaCIKQEAgLTI4LDggKzI3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgQnJvd3Nlckxpc3RPYnNlcnZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgUHJvZmlsZUF0dHJpYnV0ZXNTdG9yYWdlOjpPYnNlcnZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgc2lnbmluOjpJZGVudGl0eU1hbmFnZXI6Ok9ic2VydmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB1aTo6TWF0ZXJpYWxEZXNpZ25Db250cm9sbGVyT2JzZXJ2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGF1dG9maWxsOjpQZXJzb25hbERhdGFNYW5hZ2VyT2JzZXJ2ZXIgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB1aTo6TWF0ZXJpYWxEZXNpZ25Db250cm9sbGVyT2JzZXJ2ZXIgewogIHB1YmxpYzoKICAgZXhwbGljaXQgQXZhdGFyVG9vbGJhckJ1dHRvbihCcm93c2VyKiBicm93c2VyKTsKICAgfkF2YXRhclRvb2xiYXJCdXR0b24oKSBvdmVycmlkZTsKQEAgLTk5LDkgKzk3LDYgQEAKICAgLy8gdWk6Ok1hdGVyaWFsRGVzaWduQ29udHJvbGxlck9ic2VydmVyOgogICB2b2lkIE9uVG91Y2hVaUNoYW5nZWQoKSBvdmVycmlkZTsKIAotICAvLyBhdXRvZmlsbDo6UGVyc29uYWxEYXRhTWFuYWdlck9ic2VydmVyOgotICB2b2lkIE9uQ3JlZGl0Q2FyZFNhdmVkKCkgb3ZlcnJpZGU7Ci0KICAgdm9pZCBTaG93SWRlbnRpdHlBbmltYXRpb24oKTsKICAgdm9pZCBIaWRlSWRlbnRpdHlBbmltYXRpb25XaGVuTm90SG92ZXJlZE9yRm9jdXNlZCgpOwogICB2b2lkIEhpZGVJZGVudGl0eUFuaW1hdGlvbigpOwpAQCAtMTE5LDcgKzExNCw4IEBACiAgIHZvaWQgU2V0SW5zZXRzKCk7CiAKICAgLy8gSW5pdGlhdGVzIHNob3dpbmcgdGhlIGlkZW50aXR5IHx1c2VyX2lkZW50aXR5fCAoaWYgbm9uLWVtcHR5KS4KLSAgdm9pZCBPblVzZXJJZGVudGl0eUNoYW5nZWQoY29uc3QgQ29yZUFjY291bnRJbmZvJiB1c2VyX2lkZW50aXR5KTsKKyAgdm9pZCBPblVzZXJJZGVudGl0eUNoYW5nZWQoY29uc3QgQ29yZUFjY291bnRJbmZvJiB1c2VyX2lkZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpGZWF0dXJlJiB0cmlnZ2VyaW5nX2ZlYXR1cmUpOwogCiAgIHZvaWQgU2hvd0hpZ2hsaWdodEFuaW1hdGlvbigpOwogICB2b2lkIEhpZGVIaWdobGlnaHRBbmltYXRpb24oKTsKQEAgLTE0NSw5ICsxNDEsNiBAQAogICBTY29wZWRPYnNlcnZlcjx1aTo6TWF0ZXJpYWxEZXNpZ25Db250cm9sbGVyLAogICAgICAgICAgICAgICAgICB1aTo6TWF0ZXJpYWxEZXNpZ25Db250cm9sbGVyT2JzZXJ2ZXI+CiAgICAgICBtZF9vYnNlcnZlcl97dGhpc307Ci0gIFNjb3BlZE9ic2VydmVyPGF1dG9maWxsOjpQZXJzb25hbERhdGFNYW5hZ2VyLAotICAgICAgICAgICAgICAgICBhdXRvZmlsbDo6UGVyc29uYWxEYXRhTWFuYWdlck9ic2VydmVyPgotICAgICAgcGVyc29uYWxfZGF0YV9tYW5hZ2VyX29ic2VydmVyX3t0aGlzfTsKIAogICBiYXNlOjpXZWFrUHRyRmFjdG9yeTxBdmF0YXJUb29sYmFyQnV0dG9uPiB3ZWFrX3B0cl9mYWN0b3J5X3t0aGlzfTsKIApkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvcHJvZmlsZXMvcHJvZmlsZV9tZW51X3ZpZXdfYmFzZS5jYyBiL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL3Byb2ZpbGVzL3Byb2ZpbGVfbWVudV92aWV3X2Jhc2UuY2MKaW5kZXggZjQ1Mjk2Ni4uOGY4MzFlYTIgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL3Byb2ZpbGVzL3Byb2ZpbGVfbWVudV92aWV3X2Jhc2UuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvcHJvZmlsZXMvcHJvZmlsZV9tZW51X3ZpZXdfYmFzZS5jYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgImNocm9tZS9hcHAvdmVjdG9yX2ljb25zL3ZlY3Rvcl9pY29ucy5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3Byb2ZpbGVzL3Byb2ZpbGUuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9wcm9maWxlcy9wcm9maWxlX2F2YXRhcl9pY29uX3V0aWwuaCIKKyNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9zaWduaW4vc2lnbmluX3VpX3V0aWwuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS9jaHJvbWVfcGFnZXMuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS91aV9mZWF0dXJlcy5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL3ZpZXdzL2Nocm9tZV9sYXlvdXRfcHJvdmlkZXIuaCIKQEAgLTE5Nyw3ICsxOTgsNyBAQAogICBpZiAoSXNTaG93aW5nKCkpCiAgICAgcmV0dXJuOwogCi0gIGJhc2U6OlJlY29yZEFjdGlvbihiYXNlOjpVc2VyTWV0cmljc0FjdGlvbigiUHJvZmlsZU1lbnVfT3BlbmVkIikpOworICBzaWduaW5fdWlfdXRpbDo6UmVjb3JkUHJvZmlsZU1lbnVWaWV3U2hvd24oYnJvd3Nlci0+cHJvZmlsZSgpKTsKIAogICBQcm9maWxlTWVudVZpZXdCYXNlKiBidWJibGU7CiAKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL3Byb2ZpbGVzL3Byb2ZpbGVfbWVudV92aWV3X2Jyb3dzZXJ0ZXN0LmNjIGIvY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvcHJvZmlsZXMvcHJvZmlsZV9tZW51X3ZpZXdfYnJvd3NlcnRlc3QuY2MKaW5kZXggM2Q1YmIzZC4uMzYwODQzZCAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvcHJvZmlsZXMvcHJvZmlsZV9tZW51X3ZpZXdfYnJvd3NlcnRlc3QuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvcHJvZmlsZXMvcHJvZmlsZV9tZW51X3ZpZXdfYnJvd3NlcnRlc3QuY2MKQEAgLTE5MCw3ICsxOTAsOCBAQAogCiAgIHZvaWQgT3BlblByb2ZpbGVNZW51Vmlld3MoQnJvd3NlciogYnJvd3NlcikgewogICAgIEJyb3dzZXJWaWV3KiBicm93c2VyX3ZpZXcgPSBCcm93c2VyVmlldzo6R2V0QnJvd3NlclZpZXdGb3JCcm93c2VyKGJyb3dzZXIpOwotICAgIHZpZXdzOjpWaWV3KiBidXR0b24gPSBicm93c2VyX3ZpZXctPnRvb2xiYXIoKS0+R2V0QXZhdGFyVG9vbGJhckJ1dHRvbigpOworICAgIHZpZXdzOjpWaWV3KiBidXR0b24gPQorICAgICAgICBicm93c2VyX3ZpZXctPnRvb2xiYXJfYnV0dG9uX3Byb3ZpZGVyKCktPkdldEF2YXRhclRvb2xiYXJCdXR0b24oKTsKICAgICBEQ0hFQ0soYnV0dG9uKTsKIAogICAgIHVpOjpNb3VzZUV2ZW50IGUodWk6OkVUX01PVVNFX1BSRVNTRUQsIGdmeDo6UG9pbnQoKSwgZ2Z4OjpQb2ludCgpLApAQCAtNjYxLDcgKzY2Miw3IEBACiAKICAgICAvLyBDbGljayB0aGUgYXZhdGFyIGJ1dHRvbiB0byBvcGVuIHRoZSBtZW51LgogICAgIHZpZXdzOjpWaWV3KiBhdmF0YXJfYnV0dG9uID0KLSAgICAgICAgYnJvd3Nlcl92aWV3LT50b29sYmFyKCktPkdldEF2YXRhclRvb2xiYXJCdXR0b24oKTsKKyAgICAgICAgYnJvd3Nlcl92aWV3LT50b29sYmFyX2J1dHRvbl9wcm92aWRlcigpLT5HZXRBdmF0YXJUb29sYmFyQnV0dG9uKCk7CiAgICAgQVNTRVJUX1RSVUUoYXZhdGFyX2J1dHRvbik7CiAgICAgQ2xpY2soYXZhdGFyX2J1dHRvbik7CiAKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL3NhZmVfYnJvd3NpbmcvcGFzc3dvcmRfcmV1c2VfbW9kYWxfd2FybmluZ19kaWFsb2cuY2MgYi9jaHJvbWUvYnJvd3Nlci91aS92aWV3cy9zYWZlX2Jyb3dzaW5nL3Bhc3N3b3JkX3JldXNlX21vZGFsX3dhcm5pbmdfZGlhbG9nLmNjCmluZGV4IGY0ZDU3ODcuLjYwYTNmMTZlIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS92aWV3cy9zYWZlX2Jyb3dzaW5nL3Bhc3N3b3JkX3JldXNlX21vZGFsX3dhcm5pbmdfZGlhbG9nLmNjCisrKyBiL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL3NhZmVfYnJvd3NpbmcvcGFzc3dvcmRfcmV1c2VfbW9kYWxfd2FybmluZ19kaWFsb2cuY2MKQEAgLTcsNiArNyw3IEBACiAjaW5jbHVkZSAiYmFzZS9pMThuL3J0bC5oIgogI2luY2x1ZGUgImJhc2Uvc3RyaW5ncy91dGZfc3RyaW5nX2NvbnZlcnNpb25zLmgiCiAjaW5jbHVkZSAiY2hyb21lL2FwcC92ZWN0b3JfaWNvbnMvdmVjdG9yX2ljb25zLmgiCisjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvYWNjZXNzaWJpbGl0eS9ub25fYWNjZXNzaWJsZV9pbWFnZV92aWV3LmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvY2hyb21lX2xheW91dF9wcm92aWRlci5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL3ZpZXdzL2Nocm9tZV90eXBvZ3JhcGh5LmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9jb25zdHJhaW5lZF93aW5kb3cvY29uc3RyYWluZWRfd2luZG93X3ZpZXdzLmgiCkBAIC0yMCw5ICsyMSw4MyBAQAogI2luY2x1ZGUgInVpL2dmeC9pbWFnZS9pbWFnZV9za2lhLmgiCiAjaW5jbHVkZSAidWkvZ2Z4L3BhaW50X3ZlY3Rvcl9pY29uLmgiCiAjaW5jbHVkZSAidWkvdmlld3MvYm9yZGVyLmgiCi0jaW5jbHVkZSAidWkvdmlld3MvY29udHJvbHMvbGFiZWwuaCIKKyNpbmNsdWRlICJ1aS92aWV3cy9sYXlvdXQvYm94X2xheW91dC5oIgogI2luY2x1ZGUgInVpL3ZpZXdzL2xheW91dC9maWxsX2xheW91dC5oIgogCit1c2luZyB2aWV3czo6Qm94TGF5b3V0OworCituYW1lc3BhY2UgeworCisvLyBGaXhlZCBoZWlnaHQgb2YgdGhlIGlsbHVzdHJhdGlvbiBzaG93biBvbiB0aGUgdG9wIG9mIHRoZSBkaWFsb2cuCitjb25zdGV4cHIgaW50IGtTYWZlQnJvd3NpbmdJbGx1c3RyYXRpb25IZWlnaHQgPSAxMjA7CisKKy8vIEZpeGVkIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIGlsbHVzdHJhdGlvbiBzaG93biBvbiB0aGUgdG9wIG9mIHRoZSBkaWFsb2cgaW4KKy8vIG5vcm1hbCBtb2RlLgorY29uc3RleHByIFNrQ29sb3Iga1NhZmVCcm93c2luZ1BpY3R1cmVCYWNrZ3JvdW5kQ29sb3IgPQorICAgIFNrQ29sb3JTZXRBUkdCKDB4MEEsIDAsIDAsIDApOworCisvLyBGaXhlZCBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBpbGx1c3RyYXRpb24gc2hvd24gb24gdGhlIHRvcCBvZiB0aGUgZGlhbG9nIGluCisvLyBkYXJrIG1vZGUuCitjb25zdGV4cHIgU2tDb2xvciBrU2FmZUJyb3dzaW5nUGljdHVyZUJhY2tncm91bmRDb2xvckRhcmtNb2RlID0KKyAgICBTa0NvbG9yU2V0QVJHQigweDFBLCAweDAwLCAweDAwLCAweDAwKTsKKworLy8gVXBkYXRlcyB0aGUgaW1hZ2UgZGlzcGxheWVkIG9uIHRoZSBpbGx1c3RyYXRpb24gYmFzZWQgb24gdGhlIGN1cnJlbnQgdGhlbWUuCit2b2lkIFNhZmVCcm93c2luZ1VwZGF0ZUltYWdlVmlldyhOb25BY2Nlc3NpYmxlSW1hZ2VWaWV3KiBpbWFnZV92aWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkYXJrX21vZGVfZW5hYmxlZCkgeworICBpbWFnZV92aWV3LT5TZXRJbWFnZShnZng6OkNyZWF0ZVZlY3Rvckljb24oCisgICAgICBkYXJrX21vZGVfZW5hYmxlZCA/IGtQYXNzd29yZENoZWNrV2FybmluZ0RhcmtJY29uCisgICAgICAgICAgICAgICAgICAgICAgICA6IGtQYXNzd29yZENoZWNrV2FybmluZ0ljb24sCisgICAgICBkYXJrX21vZGVfZW5hYmxlZCA/IGtTYWZlQnJvd3NpbmdQaWN0dXJlQmFja2dyb3VuZENvbG9yRGFya01vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIDoga1NhZmVCcm93c2luZ1BpY3R1cmVCYWNrZ3JvdW5kQ29sb3IpKTsKK30KKworLy8gQ3JlYXRlcyB0aGUgaWxsdXN0cmF0aW9uIHdoaWNoIGlzIHJlbmRlcmVkIG9uIHRvcCBvZiB0aGUgZGlhbG9nLgorc3RkOjp1bmlxdWVfcHRyPE5vbkFjY2Vzc2libGVJbWFnZVZpZXc+IFNhZmVCcm93c2luZ0NyZWF0ZUlsbHVzdHJhdGlvbigKKyAgICBib29sIGRhcmtfbW9kZV9lbmFibGVkKSB7CisgIGNvbnN0IGdmeDo6U2l6ZSBpbGx1c3RyYXRpb25fc2l6ZSgKKyAgICAgIENocm9tZUxheW91dFByb3ZpZGVyOjpHZXQoKS0+R2V0RGlzdGFuY2VNZXRyaWMoCisgICAgICAgICAgRElTVEFOQ0VfTU9EQUxfRElBTE9HX1BSRUZFUlJFRF9XSURUSCksCisgICAgICBrU2FmZUJyb3dzaW5nSWxsdXN0cmF0aW9uSGVpZ2h0KTsKKyAgYXV0byBpbWFnZV92aWV3ID0gc3RkOjptYWtlX3VuaXF1ZTxOb25BY2Nlc3NpYmxlSW1hZ2VWaWV3PigpOworICBpbWFnZV92aWV3LT5TZXRQcmVmZXJyZWRTaXplKGlsbHVzdHJhdGlvbl9zaXplKTsKKyAgU2FmZUJyb3dzaW5nVXBkYXRlSW1hZ2VWaWV3KGltYWdlX3ZpZXcuZ2V0KCksIGRhcmtfbW9kZV9lbmFibGVkKTsKKyAgaW1hZ2Vfdmlldy0+U2V0U2l6ZShpbGx1c3RyYXRpb25fc2l6ZSk7CisgIGltYWdlX3ZpZXctPlNldFZlcnRpY2FsQWxpZ25tZW50KHZpZXdzOjpJbWFnZVZpZXc6OkFsaWdubWVudDo6a0xlYWRpbmcpOworICByZXR1cm4gaW1hZ2VfdmlldzsKK30KKworLy8gU2V0cyB1cCB0aGUgY29udGVudCBjb250YWluaW5nIHRoZSB0aXRsZSBhbmQgZGVzY3JpcHRpb24gZm9yIHRoZSBkaWFsb2cKKy8vIHJlbmRlcmVkIGJlbG93IHRoZSBpbGx1c3RyYXRpb24uCitzdGQ6OnVuaXF1ZV9wdHI8dmlld3M6OlZpZXc+IFNldHVwQ29udGVudChjb25zdCBiYXNlOjpzdHJpbmcxNiYgdGl0bGUpIHsKKyAgYXV0byBjb250ZW50ID0gc3RkOjptYWtlX3VuaXF1ZTx2aWV3czo6Vmlldz4oKTsKKyAgY29udGVudC0+U2V0TGF5b3V0TWFuYWdlcihzdGQ6Om1ha2VfdW5pcXVlPEJveExheW91dD4oCisgICAgICBCb3hMYXlvdXQ6Ok9yaWVudGF0aW9uOjprVmVydGljYWwsIGdmeDo6SW5zZXRzKCksCisgICAgICB2aWV3czo6TGF5b3V0UHJvdmlkZXI6OkdldCgpLT5HZXREaXN0YW5jZU1ldHJpYygKKyAgICAgICAgICB2aWV3czo6RElTVEFOQ0VfVU5SRUxBVEVEX0NPTlRST0xfVkVSVElDQUwpKSk7CisgIGNvbnRlbnQtPlNldEJvcmRlcih2aWV3czo6Q3JlYXRlRW1wdHlCb3JkZXIoCisgICAgICB2aWV3czo6TGF5b3V0UHJvdmlkZXI6OkdldCgpLT5HZXREaWFsb2dJbnNldHNGb3JDb250ZW50VHlwZSgKKyAgICAgICAgICB2aWV3czo6Q09OVFJPTCwgdmlld3M6OkNPTlRST0wpKSk7CisKKyAgYXV0byB0aXRsZV9sYWJlbCA9IHN0ZDo6bWFrZV91bmlxdWU8dmlld3M6OkxhYmVsPigKKyAgICAgIHRpdGxlLCB2aWV3czo6c3R5bGU6OkNPTlRFWFRfRElBTE9HX1RJVExFLCB2aWV3czo6c3R5bGU6OlNUWUxFX1BSSU1BUlkpOworICB0aXRsZV9sYWJlbC0+U2V0TXVsdGlMaW5lKHRydWUpOworICB0aXRsZV9sYWJlbC0+U2V0SG9yaXpvbnRhbEFsaWdubWVudChnZng6OkFMSUdOX0xFRlQpOworICBjb250ZW50LT5BZGRDaGlsZFZpZXcoc3RkOjptb3ZlKHRpdGxlX2xhYmVsKSk7CisKKyAgcmV0dXJuIGNvbnRlbnQ7Cit9CisKKy8vIENyZWF0ZXMgdGhlIGRlc2NyaXB0aW9uIG9uIHRoZSBtb2RhbCB3YXJuaW5nIGRpYWxvZy4KK3ZpZXdzOjpMYWJlbCogQ3JlYXRlTWVzc2FnZUJvZHlMYWJlbChiYXNlOjpzdHJpbmcxNiB0ZXh0KSB7CisgIHZpZXdzOjpMYWJlbCogbWVzc2FnZV9ib2R5X2xhYmVsID0gbmV3IHZpZXdzOjpMYWJlbCh0ZXh0KTsKKyAgbWVzc2FnZV9ib2R5X2xhYmVsLT5TZXRNdWx0aUxpbmUodHJ1ZSk7CisgIG1lc3NhZ2VfYm9keV9sYWJlbC0+U2V0SG9yaXpvbnRhbEFsaWdubWVudChnZng6OkFMSUdOX0xFRlQpOworICBtZXNzYWdlX2JvZHlfbGFiZWwtPlNldEhhbmRsZXNUb29sdGlwcyhmYWxzZSk7CisgIHJldHVybiBtZXNzYWdlX2JvZHlfbGFiZWw7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCiBuYW1lc3BhY2Ugc2FmZV9icm93c2luZyB7CiAKIGNvbnN0ZXhwciBpbnQga0ljb25TaXplID0gMjA7CkBAIC01MiwxOCArMTI3LDQ2IEBACiAgIC8vIHxzZXJ2aWNlfCBtYXliZSBOVUxMIGluIHRlc3RzLgogICBpZiAoc2VydmljZV8pCiAgICAgc2VydmljZV8tPkFkZE9ic2VydmVyKHRoaXMpOworCisgIHZpZXdzOjpMYWJlbCogbWVzc2FnZV9ib2R5X2xhYmVsID0gQ3JlYXRlTWVzc2FnZUJvZHlMYWJlbCgKKyAgICAgIHNlcnZpY2VfCisgICAgICAgICAgPyBzZXJ2aWNlXy0+R2V0V2FybmluZ0RldGFpbFRleHQocGFzc3dvcmRfdHlwZSkKKyAgICAgICAgICA6IGwxMG5fdXRpbDo6R2V0U3RyaW5nVVRGMTYoSURTX1BBR0VfSU5GT19DSEFOR0VfUEFTU1dPUkRfREVUQUlMUykpOworCisgIGlmIChwYXNzd29yZF90eXBlLmFjY291bnRfdHlwZSgpID09CisgICAgICBSZXVzZWRQYXNzd29yZEFjY291bnRUeXBlOjpTQVZFRF9QQVNTV09SRCkgeworICAgIENyZWF0ZVNhdmVkUGFzc3dvcmRSZXVzZU1vZGFsV2FybmluZ0RpYWxvZyhtZXNzYWdlX2JvZHlfbGFiZWwpOworICB9IGVsc2UgeworICAgIENyZWF0ZUdhaWFQYXNzd29yZFJldXNlTW9kYWxXYXJuaW5nRGlhbG9nKG1lc3NhZ2VfYm9keV9sYWJlbCk7CisgIH0KK30KKworUGFzc3dvcmRSZXVzZU1vZGFsV2FybmluZ0RpYWxvZzo6flBhc3N3b3JkUmV1c2VNb2RhbFdhcm5pbmdEaWFsb2coKSB7CisgIGlmIChzZXJ2aWNlXykKKyAgICBzZXJ2aWNlXy0+UmVtb3ZlT2JzZXJ2ZXIodGhpcyk7Cit9CisKK3ZvaWQgUGFzc3dvcmRSZXVzZU1vZGFsV2FybmluZ0RpYWxvZzo6CisgICAgQ3JlYXRlU2F2ZWRQYXNzd29yZFJldXNlTW9kYWxXYXJuaW5nRGlhbG9nKAorICAgICAgICB2aWV3czo6TGFiZWwqIG1lc3NhZ2VfYm9keV9sYWJlbCkgeworICBTZXRMYXlvdXRNYW5hZ2VyKHN0ZDo6bWFrZV91bmlxdWU8Qm94TGF5b3V0PigKKyAgICAgIHZpZXdzOjpCb3hMYXlvdXQ6Ok9yaWVudGF0aW9uOjprVmVydGljYWwsIGdmeDo6SW5zZXRzKCksCisgICAgICAwIC8qIGJldHdlZW5fY2hpbGRfc3BhY2luZyAqLykpOworICBzdGQ6OnVuaXF1ZV9wdHI8Tm9uQWNjZXNzaWJsZUltYWdlVmlldz4gaWxsdXN0cmF0aW9uID0KKyAgICAgIFNhZmVCcm93c2luZ0NyZWF0ZUlsbHVzdHJhdGlvbihHZXROYXRpdmVUaGVtZSgpLT5TaG91bGRVc2VEYXJrQ29sb3JzKCkpOworICBzdGQ6OnVuaXF1ZV9wdHI8dmlld3M6OlZpZXc+IGNvbnRlbnQgPSBTZXR1cENvbnRlbnQoCisgICAgICBsMTBuX3V0aWw6OkdldFN0cmluZ1VURjE2KElEU19QQUdFX0lORk9fQ0hBTkdFX1BBU1NXT1JEX1NVTU1BUlkpKTsKKyAgY29udGVudC0+QWRkQ2hpbGRWaWV3KHN0ZDo6bW92ZShtZXNzYWdlX2JvZHlfbGFiZWwpKTsKKyAgQWRkQ2hpbGRWaWV3KHN0ZDo6bW92ZShpbGx1c3RyYXRpb24pKTsKKyAgQWRkQ2hpbGRWaWV3KHN0ZDo6bW92ZShjb250ZW50KSk7Cit9CisKK3ZvaWQgUGFzc3dvcmRSZXVzZU1vZGFsV2FybmluZ0RpYWxvZzo6Q3JlYXRlR2FpYVBhc3N3b3JkUmV1c2VNb2RhbFdhcm5pbmdEaWFsb2coCisgICAgdmlld3M6OkxhYmVsKiBtZXNzYWdlX2JvZHlfbGFiZWwpIHsKICAgY29uc3QgQ2hyb21lTGF5b3V0UHJvdmlkZXIqIHByb3ZpZGVyID0gQ2hyb21lTGF5b3V0UHJvdmlkZXI6OkdldCgpOwogICBzZXRfbWFyZ2lucygKICAgICAgIHByb3ZpZGVyLT5HZXREaWFsb2dJbnNldHNGb3JDb250ZW50VHlwZSh2aWV3czo6VEVYVCwgdmlld3M6OlRFWFQpKTsKICAgU2V0TGF5b3V0TWFuYWdlcihzdGQ6Om1ha2VfdW5pcXVlPHZpZXdzOjpGaWxsTGF5b3V0PigpKTsKLQotICB2aWV3czo6TGFiZWwqIG1lc3NhZ2VfYm9keV9sYWJlbCA9IG5ldyB2aWV3czo6TGFiZWwoCi0gICAgICBzZXJ2aWNlXwotICAgICAgICAgID8gc2VydmljZV8tPkdldFdhcm5pbmdEZXRhaWxUZXh0KHBhc3N3b3JkX3R5cGUpCi0gICAgICAgICAgOiBsMTBuX3V0aWw6OkdldFN0cmluZ1VURjE2KElEU19QQUdFX0lORk9fQ0hBTkdFX1BBU1NXT1JEX0RFVEFJTFMpKTsKLSAgbWVzc2FnZV9ib2R5X2xhYmVsLT5TZXRNdWx0aUxpbmUodHJ1ZSk7Ci0gIG1lc3NhZ2VfYm9keV9sYWJlbC0+U2V0SG9yaXpvbnRhbEFsaWdubWVudChnZng6OkFMSUdOX0xFRlQpOwotICBtZXNzYWdlX2JvZHlfbGFiZWwtPlNldEhhbmRsZXNUb29sdGlwcyhmYWxzZSk7CiAgIC8vIE1ha2VzIG1lc3NhZ2UgbGFiZWwgYWxpZ24gd2l0aCB0aXRsZSBsYWJlbC4KICAgaW50IGhvcml6b250YWxfYWRqdXN0bWVudCA9CiAgICAgICBrSWNvblNpemUgKwpAQCAtNzgsMTEgKzE4MSw2IEBACiAgIEFkZENoaWxkVmlldyhtZXNzYWdlX2JvZHlfbGFiZWwpOwogfQogCi1QYXNzd29yZFJldXNlTW9kYWxXYXJuaW5nRGlhbG9nOjp+UGFzc3dvcmRSZXVzZU1vZGFsV2FybmluZ0RpYWxvZygpIHsKLSAgaWYgKHNlcnZpY2VfKQotICAgIHNlcnZpY2VfLT5SZW1vdmVPYnNlcnZlcih0aGlzKTsKLX0KLQogZ2Z4OjpTaXplIFBhc3N3b3JkUmV1c2VNb2RhbFdhcm5pbmdEaWFsb2c6OkNhbGN1bGF0ZVByZWZlcnJlZFNpemUoKSBjb25zdCB7CiAgIGNvbnN0ZXhwciBpbnQga0RpYWxvZ1dpZHRoID0gNDAwOwogICByZXR1cm4gZ2Z4OjpTaXplKGtEaWFsb2dXaWR0aCwgR2V0SGVpZ2h0Rm9yV2lkdGgoa0RpYWxvZ1dpZHRoKSk7CkBAIC05Myw3ICsxOTEsMTIgQEAKIH0KIAogYmFzZTo6c3RyaW5nMTYgUGFzc3dvcmRSZXVzZU1vZGFsV2FybmluZ0RpYWxvZzo6R2V0V2luZG93VGl0bGUoKSBjb25zdCB7Ci0gIHJldHVybiBsMTBuX3V0aWw6OkdldFN0cmluZ1VURjE2KElEU19QQUdFX0lORk9fQ0hBTkdFX1BBU1NXT1JEX1NVTU1BUlkpOworICAvLyBJdCdzIG9rIHRvIHJldHVybiBhbiBlbXB0eSBzdHJpbmcgZm9yIHRoZSB0aXRsZSBhcyB0aGlzIG1ldGhvZAorICAvLyBpcyBmcm9tIHZpZXdzOjpEaWFsb2dEZWxlZ2F0ZVZpZXcgY2xhc3MuCisgIHJldHVybiBwYXNzd29yZF90eXBlXy5hY2NvdW50X3R5cGUoKSA9PQorICAgICAgICAgICAgICAgICBSZXVzZWRQYXNzd29yZEFjY291bnRUeXBlOjpTQVZFRF9QQVNTV09SRAorICAgICAgICAgICAgID8gYmFzZTo6c3RyaW5nMTYoKQorICAgICAgICAgICAgIDogbDEwbl91dGlsOjpHZXRTdHJpbmdVVEYxNihJRFNfUEFHRV9JTkZPX0NIQU5HRV9QQVNTV09SRF9TVU1NQVJZKTsKIH0KIAogYm9vbCBQYXNzd29yZFJldXNlTW9kYWxXYXJuaW5nRGlhbG9nOjpTaG91bGRTaG93Q2xvc2VCdXR0b24oKSBjb25zdCB7CkBAIC0xMDEsMjAgKzIwNCwzNCBAQAogfQogCiBnZng6OkltYWdlU2tpYSBQYXNzd29yZFJldXNlTW9kYWxXYXJuaW5nRGlhbG9nOjpHZXRXaW5kb3dJY29uKCkgewotICByZXR1cm4gZ2Z4OjpDcmVhdGVWZWN0b3JJY29uKGtTZWN1cml0eUljb24sIGtJY29uU2l6ZSwgZ2Z4OjprQ2hyb21lSWNvbkdyZXkpOworICByZXR1cm4gcGFzc3dvcmRfdHlwZV8uYWNjb3VudF90eXBlKCkgPT0KKyAgICAgICAgICAgICAgICAgUmV1c2VkUGFzc3dvcmRBY2NvdW50VHlwZTo6U0FWRURfUEFTU1dPUkQKKyAgICAgICAgICAgICA/IGdmeDo6SW1hZ2VTa2lhKCkKKyAgICAgICAgICAgICA6IGdmeDo6Q3JlYXRlVmVjdG9ySWNvbihrU2VjdXJpdHlJY29uLCBrSWNvblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2Z4OjprQ2hyb21lSWNvbkdyZXkpOwogfQogCiBib29sIFBhc3N3b3JkUmV1c2VNb2RhbFdhcm5pbmdEaWFsb2c6OlNob3VsZFNob3dXaW5kb3dJY29uKCkgY29uc3QgewogICByZXR1cm4gdHJ1ZTsKIH0KIAoraW50IFBhc3N3b3JkUmV1c2VNb2RhbFdhcm5pbmdEaWFsb2c6OkdldERpYWxvZ0J1dHRvbnMoKSBjb25zdCB7CisgIHJldHVybiBwYXNzd29yZF90eXBlXy5hY2NvdW50X3R5cGUoKSA9PQorICAgICAgICAgICAgICAgICBSZXVzZWRQYXNzd29yZEFjY291bnRUeXBlOjpTQVZFRF9QQVNTV09SRAorICAgICAgICAgICAgID8gdWk6OkRJQUxPR19CVVRUT05fT0sKKyAgICAgICAgICAgICA6IHVpOjpESUFMT0dfQlVUVE9OX09LIHwgdWk6OkRJQUxPR19CVVRUT05fQ0FOQ0VMOworfQorCiBib29sIFBhc3N3b3JkUmV1c2VNb2RhbFdhcm5pbmdEaWFsb2c6OkNhbmNlbCgpIHsKICAgc3RkOjptb3ZlKGRvbmVfY2FsbGJhY2tfKS5SdW4oV2FybmluZ0FjdGlvbjo6SUdOT1JFX1dBUk5JTkcpOwogICByZXR1cm4gdHJ1ZTsKIH0KIAogYm9vbCBQYXNzd29yZFJldXNlTW9kYWxXYXJuaW5nRGlhbG9nOjpBY2NlcHQoKSB7Ci0gIHN0ZDo6bW92ZShkb25lX2NhbGxiYWNrXykuUnVuKFdhcm5pbmdBY3Rpb246OkNIQU5HRV9QQVNTV09SRCk7CisgIGlmIChwYXNzd29yZF90eXBlXy5hY2NvdW50X3R5cGUoKSAhPQorICAgICAgUmV1c2VkUGFzc3dvcmRBY2NvdW50VHlwZTo6U0FWRURfUEFTU1dPUkQpCisgICAgc3RkOjptb3ZlKGRvbmVfY2FsbGJhY2tfKS5SdW4oV2FybmluZ0FjdGlvbjo6Q0hBTkdFX1BBU1NXT1JEKTsKKwogICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtMTI4LDExICsyNDUsMTcgQEAKICAgICB1aTo6RGlhbG9nQnV0dG9uIGJ1dHRvbikgY29uc3QgewogICBzd2l0Y2ggKGJ1dHRvbikgewogICAgIGNhc2UgdWk6OkRJQUxPR19CVVRUT05fT0s6Ci0gICAgICByZXR1cm4gbDEwbl91dGlsOjpHZXRTdHJpbmdVVEYxNigKLSAgICAgICAgICBwYXNzd29yZF90eXBlXy5hY2NvdW50X3R5cGUoKSA9PQotICAgICAgICAgICAgICAgICAgUmV1c2VkUGFzc3dvcmRBY2NvdW50VHlwZTo6Tk9OX0dBSUFfRU5URVJQUklTRQotICAgICAgICAgICAgICA/IElEU19QQUdFX0lORk9fQ0hBTkdFX1BBU1NXT1JEX0JVVFRPTgotICAgICAgICAgICAgICA6IElEU19QQUdFX0lORk9fUFJPVEVDVF9BQ0NPVU5UX0JVVFRPTik7CisgICAgICBzd2l0Y2ggKHBhc3N3b3JkX3R5cGVfLmFjY291bnRfdHlwZSgpKSB7CisgICAgICAgIGNhc2UgUmV1c2VkUGFzc3dvcmRBY2NvdW50VHlwZTo6Tk9OX0dBSUFfRU5URVJQUklTRToKKyAgICAgICAgICByZXR1cm4gbDEwbl91dGlsOjpHZXRTdHJpbmdVVEYxNigKKyAgICAgICAgICAgICAgSURTX1BBR0VfSU5GT19DSEFOR0VfUEFTU1dPUkRfQlVUVE9OKTsKKyAgICAgICAgY2FzZSBSZXVzZWRQYXNzd29yZEFjY291bnRUeXBlOjpTQVZFRF9QQVNTV09SRDoKKyAgICAgICAgICByZXR1cm4gbDEwbl91dGlsOjpHZXRTdHJpbmdVVEYxNigKKyAgICAgICAgICAgICAgSURTX1BBR0VfSU5GT19ESVNNSVNTX1BBU1NXT1JEX1dBUk5JTkdfQlVUVE9OKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXR1cm4gbDEwbl91dGlsOjpHZXRTdHJpbmdVVEYxNigKKyAgICAgICAgICAgICAgSURTX1BBR0VfSU5GT19QUk9URUNUX0FDQ09VTlRfQlVUVE9OKTsKKyAgICAgIH0KICAgICBjYXNlIHVpOjpESUFMT0dfQlVUVE9OX0NBTkNFTDoKICAgICAgIHJldHVybiBsMTBuX3V0aWw6OkdldFN0cmluZ1VURjE2KAogICAgICAgICAgIElEU19QQUdFX0lORk9fSUdOT1JFX1BBU1NXT1JEX1dBUk5JTkdfQlVUVE9OKTsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL3NhZmVfYnJvd3NpbmcvcGFzc3dvcmRfcmV1c2VfbW9kYWxfd2FybmluZ19kaWFsb2cuaCBiL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL3NhZmVfYnJvd3NpbmcvcGFzc3dvcmRfcmV1c2VfbW9kYWxfd2FybmluZ19kaWFsb2cuaAppbmRleCBlZTVjMGZhLi5iYzYyMzQ3IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS92aWV3cy9zYWZlX2Jyb3dzaW5nL3Bhc3N3b3JkX3JldXNlX21vZGFsX3dhcm5pbmdfZGlhbG9nLmgKKysrIGIvY2hyb21lL2Jyb3dzZXIvdWkvdmlld3Mvc2FmZV9icm93c2luZy9wYXNzd29yZF9yZXVzZV9tb2RhbF93YXJuaW5nX2RpYWxvZy5oCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3NhZmVfYnJvd3NpbmcvY2hyb21lX3Bhc3N3b3JkX3Byb3RlY3Rpb25fc2VydmljZS5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvcGFzc3dvcmRfbWFuYWdlci9jb3JlL2Jyb3dzZXIvcGFzc3dvcmRfbWFuYWdlcl9tZXRyaWNzX3V0aWwuaCIKICNpbmNsdWRlICJjb250ZW50L3B1YmxpYy9icm93c2VyL3dlYl9jb250ZW50c19vYnNlcnZlci5oIgorI2luY2x1ZGUgInVpL3ZpZXdzL2NvbnRyb2xzL2xhYmVsLmgiCiAjaW5jbHVkZSAidWkvdmlld3Mvd2luZG93L2RpYWxvZ19kZWxlZ2F0ZS5oIgogCiBuYW1lc3BhY2UgY29udGVudCB7CkBAIC0zMiw2ICszMywxMSBAQAogCiAgIH5QYXNzd29yZFJldXNlTW9kYWxXYXJuaW5nRGlhbG9nKCkgb3ZlcnJpZGU7CiAKKyAgdm9pZCBDcmVhdGVTYXZlZFBhc3N3b3JkUmV1c2VNb2RhbFdhcm5pbmdEaWFsb2coCisgICAgICB2aWV3czo6TGFiZWwqIG1lc3NhZ2VfYm9keV9sYWJlbCk7CisgIHZvaWQgQ3JlYXRlR2FpYVBhc3N3b3JkUmV1c2VNb2RhbFdhcm5pbmdEaWFsb2coCisgICAgICB2aWV3czo6TGFiZWwqIG1lc3NhZ2VfYm9keV9sYWJlbCk7CisKICAgLy8gdmlld3M6OkRpYWxvZ0RlbGVnYXRlVmlldzoKICAgZ2Z4OjpTaXplIENhbGN1bGF0ZVByZWZlcnJlZFNpemUoKSBjb25zdCBvdmVycmlkZTsKICAgdWk6Ok1vZGFsVHlwZSBHZXRNb2RhbFR5cGUoKSBjb25zdCBvdmVycmlkZTsKQEAgLTM5LDYgKzQ1LDcgQEAKICAgYm9vbCBTaG91bGRTaG93Q2xvc2VCdXR0b24oKSBjb25zdCBvdmVycmlkZTsKICAgZ2Z4OjpJbWFnZVNraWEgR2V0V2luZG93SWNvbigpIG92ZXJyaWRlOwogICBib29sIFNob3VsZFNob3dXaW5kb3dJY29uKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGludCBHZXREaWFsb2dCdXR0b25zKCkgY29uc3Qgb3ZlcnJpZGU7CiAgIGJvb2wgQ2FuY2VsKCkgb3ZlcnJpZGU7CiAgIGJvb2wgQWNjZXB0KCkgb3ZlcnJpZGU7CiAgIGJvb2wgQ2xvc2UoKSBvdmVycmlkZTsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL3NjcmVlbl9jYXB0dXJlX25vdGlmaWNhdGlvbl91aV92aWV3cy5jYyBiL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL3NjcmVlbl9jYXB0dXJlX25vdGlmaWNhdGlvbl91aV92aWV3cy5jYwppbmRleCA5YzUxNTU4Li4yYzBhNGM1IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS92aWV3cy9zY3JlZW5fY2FwdHVyZV9ub3RpZmljYXRpb25fdWlfdmlld3MuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvdWkvdmlld3Mvc2NyZWVuX2NhcHR1cmVfbm90aWZpY2F0aW9uX3VpX3ZpZXdzLmNjCkBAIC0xNzUsNiArMTc1LDkgQEAKIGdmeDo6TmF0aXZlVmlld0lkIFNjcmVlbkNhcHR1cmVOb3RpZmljYXRpb25VSVZpZXdzOjpPblN0YXJ0ZWQoCiAgICAgYmFzZTo6T25jZUNsb3N1cmUgc3RvcF9jYWxsYmFjaywKICAgICBjb250ZW50OjpNZWRpYVN0cmVhbVVJOjpTb3VyY2VDYWxsYmFjayBzb3VyY2VfY2FsbGJhY2spIHsKKyAgaWYgKEdldFdpZGdldCgpKQorICAgIHJldHVybiAwOworCiAgIHN0b3BfY2FsbGJhY2tfID0gc3RkOjptb3ZlKHN0b3BfY2FsbGJhY2spOwogICBzb3VyY2VfY2FsbGJhY2tfID0gc3RkOjptb3ZlKHNvdXJjZV9jYWxsYmFjayk7CiAKQEAgLTIyNSwxMSArMjI4LDcgQEAKICAgd2lkZ2V0LT5TZXRPcGFjaXR5KGtXaW5kb3dBbHBoYVZhbHVlKTsKICAgd2lkZ2V0LT5TZXRWaXNpYmxlT25BbGxXb3Jrc3BhY2VzKHRydWUpOwogCi0jaWYgZGVmaW5lZChPU19XSU4pCi0gIHJldHVybiBnZng6Ok5hdGl2ZVZpZXdJZCh2aWV3czo6SFdOREZvcldpZGdldCh3aWRnZXQpKTsKLSNlbHNlCiAgIHJldHVybiAwOwotI2VuZGlmCiB9CiAKIHZvaWQgU2NyZWVuQ2FwdHVyZU5vdGlmaWNhdGlvblVJVmlld3M6OkRlbGV0ZURlbGVnYXRlKCkgewpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvdGFicy90YWJfZHJhZ19jb250cm9sbGVyLmNjIGIvY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvdGFicy90YWJfZHJhZ19jb250cm9sbGVyLmNjCmluZGV4IDc2ZWQ2M2QuLjQ3NDQ0NmEgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL3RhYnMvdGFiX2RyYWdfY29udHJvbGxlci5jYworKysgYi9jaHJvbWUvYnJvd3Nlci91aS92aWV3cy90YWJzL3RhYl9kcmFnX2NvbnRyb2xsZXIuY2MKQEAgLTEyNDksNiArMTI0OSw4IEBACiAgIGF0dGFjaGVkX2NvbnRleHRfdGFic19jbG9zZWRfdHJhY2tlcl8gPQogICAgICAgc3RkOjptYWtlX3VuaXF1ZTxEcmFnZ2VkVGFic0Nsb3NlZFRyYWNrZXI+KAogICAgICAgICAgIGF0dGFjaGVkX2NvbnRleHRfLT5HZXRUYWJTdHJpcE1vZGVsKCksIHRoaXMpOworICBpZiAoYXR0YWNoX2luZGV4XyAhPSAtMSkKKyAgICBVcGRhdGVHcm91cEZvckRyYWdnZWRUYWJzKCk7CiB9CiAKIHZvaWQgVGFiRHJhZ0NvbnRyb2xsZXI6OkRldGFjaChSZWxlYXNlQ2FwdHVyZSByZWxlYXNlX2NhcHR1cmUpIHsKQEAgLTIxMzgsNyArMjE0MCw3IEBACiAgIC8vIHVuZ3JvdXBlZC4KIAogICBjb25zdCBUYWIqIGxlZnRfbW9zdF9zZWxlY3RlZF90YWIgPQotICAgICAgc291cmNlX2NvbnRleHRfLT5HZXRUYWJBdChzZWxlY3RlZC5mcm9udCgpKTsKKyAgICAgIGF0dGFjaGVkX2NvbnRleHRfLT5HZXRUYWJBdChzZWxlY3RlZC5mcm9udCgpKTsKIAogICBjb25zdCBpbnQgYnVmZmVyID0gbGVmdF9tb3N0X3NlbGVjdGVkX3RhYi0+d2lkdGgoKSAvIDQ7CiAKQEAgLTIxNTIsNyArMjE1NCw3IEBACiAgIC8vIHRhYiBvciB0aGVyZSBpcyBhIGdyb3VwIGhlYWRlciB0byB0aGUgaW1tZWRpYXRlIGxlZnQuCiAgIGludCBsZWZ0X2VkZ2UgPQogICAgICAgYXR0YWNoZWRfbW9kZWwtPkNvbnRhaW5zSW5kZXgobGVmdF90YWJfaW5kZXgpCi0gICAgICAgICAgPyBzb3VyY2VfY29udGV4dF8tPkdldFRhYkF0KGxlZnRfdGFiX2luZGV4KS0+Ym91bmRzKCkucmlnaHQoKSAtCisgICAgICAgICAgPyBhdHRhY2hlZF9jb250ZXh0Xy0+R2V0VGFiQXQobGVmdF90YWJfaW5kZXgpLT5ib3VuZHMoKS5yaWdodCgpIC0KICAgICAgICAgICAgICAgICB0YWJfbGVmdF9pbnNldAogICAgICAgICAgIDogdGFiX2xlZnRfaW5zZXQ7CiAKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL3RhYnMvdGFiX2RyYWdfY29udHJvbGxlcl9pbnRlcmFjdGl2ZV91aXRlc3QuY2MgYi9jaHJvbWUvYnJvd3Nlci91aS92aWV3cy90YWJzL3RhYl9kcmFnX2NvbnRyb2xsZXJfaW50ZXJhY3RpdmVfdWl0ZXN0LmNjCmluZGV4IDEwZDYzMTM4Li5jNjFlNmU1IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS92aWV3cy90YWJzL3RhYl9kcmFnX2NvbnRyb2xsZXJfaW50ZXJhY3RpdmVfdWl0ZXN0LmNjCisrKyBiL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL3RhYnMvdGFiX2RyYWdfY29udHJvbGxlcl9pbnRlcmFjdGl2ZV91aXRlc3QuY2MKQEAgLTgxLDEwICs4MSwxMCBAQAogI2lmIGRlZmluZWQoT1NfQ0hST01FT1MpCiAjaW5jbHVkZSAiYXNoL3B1YmxpYy9jcHAvYXNoX3N3aXRjaGVzLmgiCiAjaW5jbHVkZSAiYXNoL3B1YmxpYy9jcHAvaW1tZXJzaXZlL2ltbWVyc2l2ZV9mdWxsc2NyZWVuX2NvbnRyb2xsZXJfdGVzdF9hcGkuaCIKKyNpbmNsdWRlICJhc2gvcHVibGljL2NwcC9zcGxpdF92aWV3X3Rlc3RfYXBpLmgiCiAjaW5jbHVkZSAiYXNoL3B1YmxpYy9jcHAvdGVzdC9zaGVsbF90ZXN0X2FwaS5oIgogI2luY2x1ZGUgImFzaC9wdWJsaWMvY3BwL3dpbmRvd19wcm9wZXJ0aWVzLmgiCiAjaW5jbHVkZSAiYXNoL3NoZWxsLmgiCi0jaW5jbHVkZSAiYXNoL3dtL3NwbGl0dmlldy9zcGxpdF92aWV3X2NvbnRyb2xsZXIuaCIKICNpbmNsdWRlICJhc2gvd20vd2luZG93X3N0YXRlLmgiCiAjaW5jbHVkZSAiYmFzZS90ZXN0L3NpbXBsZV90ZXN0X3RpY2tfY2xvY2suaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS92aWV3cy9mcmFtZS9icm93c2VyX3ZpZXdfbGF5b3V0LmgiCkBAIC0xODQzLDYgKzE4NDMsNTAgQEAKICAgRVhQRUNUX0ZBTFNFKGJyb3dzZXIyLT53aW5kb3coKS0+SXNNYXhpbWl6ZWQoKSk7CiB9CiAKKy8vIENyZWF0ZXMgdHdvIGJyb3dzZXIgd2l0aCB0d28gdGFicyBlYWNoLiBUaGUgZmlyc3QgYnJvd3NlciBoYXMgb25lIHRhYiBpbiBhCisvLyBncm91cCBhbmQgdGhlIHNlY29uZCB0YWIgbm90IGluIGEgZ3JvdXAuIFRoZSBzZWNvbmQgYnJvd3NlciB7YnJvd3NlcjJ9IGhhcworLy8gdHdvIHRhYnMgaW4gYW5vdGhlciBncm91cCB7Z3JvdXAxfS4gRHJhZ2dpbmcgdGhlIHR3byB0YWJzIGluIHRoZSBmaXJzdAorLy8gYnJvd3NlciBpbnRvIHRoZSBtaWRkbGUgb2YgdGhlIHNlY29uZCBicm93c2VyIHdpbGwgaW5zZXJ0IHRoZSB0d28gZHJhZ2dlZAorLy8gdGFicyBpbnRvIHRoZSB7Z3JvdXAxfX0gYWZ0ZXIgdGhlIGZpcnN0IHRhYi4KK0lOX1BST0NfQlJPV1NFUl9URVNUX1AoRGV0YWNoVG9Ccm93c2VyVGFiRHJhZ0NvbnRyb2xsZXJUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICBEcmFnV2luZG93SW50b0dyb3VwKSB7CisgIHNjb3BlZF9mZWF0dXJlX2xpc3RfLkluaXRBbmRFbmFibGVGZWF0dXJlKGZlYXR1cmVzOjprVGFiR3JvdXBzKTsKKworICBUYWJTdHJpcCogdGFiX3N0cmlwID0gR2V0VGFiU3RyaXBGb3JCcm93c2VyKGJyb3dzZXIoKSk7CisgIFRhYlN0cmlwTW9kZWwqIG1vZGVsID0gYnJvd3NlcigpLT50YWJfc3RyaXBfbW9kZWwoKTsKKworICBBZGRUYWJzQW5kUmVzZXRCcm93c2VyKGJyb3dzZXIoKSwgMSk7CisgIG1vZGVsLT5BZGRUb05ld0dyb3VwKHswfSk7CisgIFN0b3BBbmltYXRpbmcodGFiX3N0cmlwKTsKKworICAvLyBTZXQgdXAgdGhlIHNlY29uZCBicm93c2VyIHdpdGggdHdvIHRhYnMgaW4gYSBncm91cCB3aXRoIGRpc3RpbmN0IElEcy4KKyAgQnJvd3NlciogYnJvd3NlcjIgPSBDcmVhdGVBbm90aGVyQnJvd3NlckFuZFJlc2l6ZSgpOworICBUYWJTdHJpcCogdGFiX3N0cmlwMiA9IEdldFRhYlN0cmlwRm9yQnJvd3Nlcihicm93c2VyMik7CisgIFRhYlN0cmlwTW9kZWwqIG1vZGVsMiA9IGJyb3dzZXIyLT50YWJfc3RyaXBfbW9kZWwoKTsKKyAgQWRkVGFic0FuZFJlc2V0QnJvd3Nlcihicm93c2VyMiwgMSk7CisgIFJlc2V0SURzKG1vZGVsMiwgMTAwKTsKKyAgVGFiR3JvdXBJZCBncm91cDEgPSBtb2RlbDItPkFkZFRvTmV3R3JvdXAoezAsIDF9KTsKKyAgU3RvcEFuaW1hdGluZyh0YWJfc3RyaXAyKTsKKworICAvLyBDbGljayB0aGUgZmlyc3QgdGFiIGFuZCBzZWxlY3QgdGhlIHNlY29uZCB0YWIgc28gdGhleSBhcmUgdGhlIG9ubHkgb25lcworICAvLyBzZWxlY3RlZC4KKyAgQVNTRVJUX1RSVUUoUHJlc3NJbnB1dChHZXRDZW50ZXJJblNjcmVlbkNvb3JkaW5hdGVzKHRhYl9zdHJpcC0+dGFiX2F0KDApKSkpOworICBBU1NFUlRfVFJVRShSZWxlYXNlSW5wdXQoKSk7CisgIGJyb3dzZXIoKS0+dGFiX3N0cmlwX21vZGVsKCktPlRvZ2dsZVNlbGVjdGlvbkF0KDEpOworCisgIC8vIE1vdmUgdG8gdGhlIGZpcnN0IHRhYiBhbmQgZHJhZyBpdCBlbm91Z2ggc28gdGhhdCBpdCBkZXRhY2hlcywgYnV0IG5vdAorICAvLyBlbm91Z2ggdGhhdCBpdCBhdHRhY2hlcyB0byBicm93c2VyMi4KKyAgRHJhZ1RhYkFuZE5vdGlmeSh0YWJfc3RyaXAsIGJhc2U6OkJpbmRPbmNlKCZEcmFnQWxsVG9TZXBhcmF0ZVdpbmRvd1N0ZXAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgdGFiX3N0cmlwLCB0YWJfc3RyaXAyKSk7CisKKyAgLy8gUmVsZWFzZSB0aGUgbW91c2UsIHN0b3BwaW5nIHRoZSBkcmFnIHNlc3Npb24uCisgIEFTU0VSVF9UUlVFKFJlbGVhc2VJbnB1dCgpKTsKKworICBFWFBFQ1RfRVEoIjEwMCAwIDEgMTAxIiwgSURTdHJpbmcobW9kZWwyKSk7CisgIEVYUEVDVF9USEFUKG1vZGVsMi0+TGlzdFRhYnNJbkdyb3VwKGdyb3VwMSksCisgICAgICAgICAgICAgIHRlc3Rpbmc6OkVsZW1lbnRzQXJlKDAsIDEsIDIsIDMpKTsKK30KKwogbmFtZXNwYWNlIHsKIAogLy8gSW52b2tlZCBmcm9tIHRoZSBuZXN0ZWQgcnVuIGxvb3AuCkBAIC0yMjI0LDggKzIyNjgsOCBAQAogCiAgIC8vIFJpZ2h0IHNuYXAgdGhlIGJyb3dzZXIgd2luZG93LgogICBhdXJhOjpXaW5kb3cqIHdpbmRvdyA9IGJyb3dzZXIoKS0+d2luZG93KCktPkdldE5hdGl2ZVdpbmRvdygpOwotICBhc2g6OlNoZWxsOjpHZXQoKS0+c3BsaXRfdmlld19jb250cm9sbGVyKCktPlNuYXBXaW5kb3coCi0gICAgICB3aW5kb3csIGFzaDo6U3BsaXRWaWV3Q29udHJvbGxlcjo6UklHSFQpOworICBhc2g6OlNwbGl0Vmlld1Rlc3RBcGkoKS5TbmFwV2luZG93KAorICAgICAgd2luZG93LCBhc2g6OlNwbGl0Vmlld1Rlc3RBcGk6OlNuYXBQb3NpdGlvbjo6UklHSFQpOwogICBFWFBFQ1RfTkUoZ2Z4OjpQb2ludCgpLCB3aW5kb3ctPkdldEJvdW5kc0luU2NyZWVuKCkub3JpZ2luKCkpOwogCiAgIERyYWdXaW5kb3dBbmRWZXJpZnlPZmZzZXQodGhpcywgR2V0VGFiU3RyaXBGb3JCcm93c2VyKGJyb3dzZXIoKSksIDApOwpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvdGFicy90YWJfZ3JvdXBfdW5kZXJsaW5lLmNjIGIvY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvdGFicy90YWJfZ3JvdXBfdW5kZXJsaW5lLmNjCmluZGV4IDVhOTExMTkuLjlmNjM0MGUgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL3RhYnMvdGFiX2dyb3VwX3VuZGVybGluZS5jYworKysgYi9jaHJvbWUvYnJvd3Nlci91aS92aWV3cy90YWJzL3RhYl9ncm91cF91bmRlcmxpbmUuY2MKQEAgLTM0LDEyICszNCw2IEBACiAgIGZsYWdzLnNldENvbG9yKEdldENvbG9yKCkpOwogICBmbGFncy5zZXRTdHlsZShjYzo6UGFpbnRGbGFnczo6a0ZpbGxfU3R5bGUpOwogICBjYW52YXMtPkRyYXdQYXRoKHBhdGgsIGZsYWdzKTsKLQotICAvLyBFbnN1cmUgdGhlIGFjdGl2ZSB0YWIgYm9yZGVyIHN0cm9rZSBpcyByZXBhaW50ZWQuCi0gIGNvbnN0IGludCBhY3RpdmVfaW5kZXggPSB0YWJfc3RyaXBfLT5jb250cm9sbGVyKCktPkdldEFjdGl2ZUluZGV4KCk7Ci0gIGlmIChhY3RpdmVfaW5kZXggIT0gdWk6Okxpc3RTZWxlY3Rpb25Nb2RlbDo6a1Vuc2VsZWN0ZWRJbmRleCAmJgotICAgICAgdGFiX3N0cmlwXy0+dGFiX2F0KGFjdGl2ZV9pbmRleCktPmdyb3VwKCkgPT0gZ3JvdXBfKQotICAgIHRhYl9zdHJpcF8tPnRhYl9hdChhY3RpdmVfaW5kZXgpLT5TY2hlZHVsZVBhaW50KCk7CiB9CiAKIHZvaWQgVGFiR3JvdXBVbmRlcmxpbmU6OlVwZGF0ZUJvdW5kcygpIHsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL3RhYnMvdGFiX3N0cmlwLmNjIGIvY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvdGFicy90YWJfc3RyaXAuY2MKaW5kZXggMGNlNTU0NS4uY2FmM2ViNSAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvdGFicy90YWJfc3RyaXAuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvdGFicy90YWJfc3RyaXAuY2MKQEAgLTExNTgsNiArMTE1OCw5IEBACiAgICAgLy8gbW92ZSBpbiB0ZXJtcyBvZiBtb2RlbCBpbmRpY2VzLgogICAgIGxheW91dF9oZWxwZXJfLT5VcGRhdGVHcm91cEhlYWRlckluZGV4KG5ld19ncm91cC52YWx1ZSgpKTsKICAgICBncm91cF91bmRlcmxpbmVzX1tuZXdfZ3JvdXAudmFsdWUoKV0tPlNjaGVkdWxlUGFpbnQoKTsKKyAgICBjb25zdCBpbnQgYWN0aXZlX2luZGV4ID0gY29udHJvbGxlcl8tPkdldEFjdGl2ZUluZGV4KCk7CisgICAgaWYgKGFjdGl2ZV9pbmRleCAhPSB1aTo6TGlzdFNlbGVjdGlvbk1vZGVsOjprVW5zZWxlY3RlZEluZGV4KQorICAgICAgdGFiX2F0KGFjdGl2ZV9pbmRleCktPlNjaGVkdWxlUGFpbnQoKTsKICAgfQogICBpZiAob2xkX2dyb3VwLmhhc192YWx1ZSgpKSB7CiAgICAgaWYgKGNvbnRyb2xsZXJfLT5MaXN0VGFic0luR3JvdXAob2xkX2dyb3VwLnZhbHVlKCkpLnNpemUoKSA9PSAwKSB7CkBAIC0xMTc1LDYgKzExNzgsOSBAQAogdm9pZCBUYWJTdHJpcDo6R3JvdXBWaXN1YWxzQ2hhbmdlZChUYWJHcm91cElkIGdyb3VwKSB7CiAgIGdyb3VwX2hlYWRlcnNfW2dyb3VwXS0+VmlzdWFsc0NoYW5nZWQoKTsKICAgZ3JvdXBfdW5kZXJsaW5lc19bZ3JvdXBdLT5TY2hlZHVsZVBhaW50KCk7CisgIGNvbnN0IGludCBhY3RpdmVfaW5kZXggPSBjb250cm9sbGVyXy0+R2V0QWN0aXZlSW5kZXgoKTsKKyAgaWYgKGFjdGl2ZV9pbmRleCAhPSB1aTo6TGlzdFNlbGVjdGlvbk1vZGVsOjprVW5zZWxlY3RlZEluZGV4KQorICAgIHRhYl9hdChhY3RpdmVfaW5kZXgpLT5TY2hlZHVsZVBhaW50KCk7CiAgIC8vIFRoZSBncm91cCB0aXRsZSBtYXkgaGF2ZSBjaGFuZ2VkIHNpemUuCiAgIFVwZGF0ZUlkZWFsQm91bmRzKCk7CiAgIEFuaW1hdGVUb0lkZWFsQm91bmRzKCk7CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci91aS92aWV3cy90b29sYmFyL3Rvb2xiYXJfdmlldy5jYyBiL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL3Rvb2xiYXIvdG9vbGJhcl92aWV3LmNjCmluZGV4IDMwODM3NGEuLjM4NDFjNDlkIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS92aWV3cy90b29sYmFyL3Rvb2xiYXJfdmlldy5jYworKysgYi9jaHJvbWUvYnJvd3Nlci91aS92aWV3cy90b29sYmFyL3Rvb2xiYXJfdmlldy5jYwpAQCAtNDY1LDE4ICs0NjUsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJvd3Nlcl8tPnByb2ZpbGUoKSwgdXJsLCBhbHJlYWR5X2Jvb2ttYXJrZWQpOwogfQogCi1BdmF0YXJUb29sYmFyQnV0dG9uKiBUb29sYmFyVmlldzo6R2V0QXZhdGFyVG9vbGJhckJ1dHRvbigpIHsKLSAgaWYgKHRvb2xiYXJfYWNjb3VudF9pY29uX2NvbnRhaW5lcl8gJiYKLSAgICAgIHRvb2xiYXJfYWNjb3VudF9pY29uX2NvbnRhaW5lcl8tPmF2YXRhcl9idXR0b24oKSkgewotICAgIHJldHVybiB0b29sYmFyX2FjY291bnRfaWNvbl9jb250YWluZXJfLT5hdmF0YXJfYnV0dG9uKCk7Ci0gIH0KLQotICBpZiAoYXZhdGFyXykKLSAgICByZXR1cm4gYXZhdGFyXzsKLQotICByZXR1cm4gbnVsbHB0cjsKLX0KLQogRXh0ZW5zaW9uc1Rvb2xiYXJCdXR0b24qIFRvb2xiYXJWaWV3OjpHZXRFeHRlbnNpb25zQnV0dG9uKCkgY29uc3QgewogICByZXR1cm4gZXh0ZW5zaW9uc19jb250YWluZXJfLT5leHRlbnNpb25zX2J1dHRvbigpOwogfQpAQCAtODYzLDYgKzg1MSwxOCBAQAogICAgICAgY2FuX3Nob3dfYnViYmxlKTsKIH0KIAorQXZhdGFyVG9vbGJhckJ1dHRvbiogVG9vbGJhclZpZXc6OkdldEF2YXRhclRvb2xiYXJCdXR0b24oKSB7CisgIGlmICh0b29sYmFyX2FjY291bnRfaWNvbl9jb250YWluZXJfICYmCisgICAgICB0b29sYmFyX2FjY291bnRfaWNvbl9jb250YWluZXJfLT5hdmF0YXJfYnV0dG9uKCkpIHsKKyAgICByZXR1cm4gdG9vbGJhcl9hY2NvdW50X2ljb25fY29udGFpbmVyXy0+YXZhdGFyX2J1dHRvbigpOworICB9CisKKyAgaWYgKGF2YXRhcl8pCisgICAgcmV0dXJuIGF2YXRhcl87CisKKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKIEJyb3dzZXJSb290Vmlldzo6RHJvcEluZGV4IFRvb2xiYXJWaWV3OjpHZXREcm9wSW5kZXgoCiAgICAgY29uc3QgdWk6OkRyb3BUYXJnZXRFdmVudCYgZXZlbnQpIHsKICAgcmV0dXJuIHticm93c2VyXy0+dGFiX3N0cmlwX21vZGVsKCktPmFjdGl2ZV9pbmRleCgpLCBmYWxzZX07CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci91aS92aWV3cy90b29sYmFyL3Rvb2xiYXJfdmlldy5oIGIvY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvdG9vbGJhci90b29sYmFyX3ZpZXcuaAppbmRleCBjZjYzZDE5ZWIuLjc4Y2Q4Y2IgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL3Rvb2xiYXIvdG9vbGJhcl92aWV3LmgKKysrIGIvY2hyb21lL2Jyb3dzZXIvdWkvdmlld3MvdG9vbGJhci90b29sYmFyX3ZpZXcuaApAQCAtMTI4LDkgKzEyOCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWxyZWFkeV9ib29rbWFya2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICBib29rbWFya3M6OkJvb2ttYXJrQnViYmxlT2JzZXJ2ZXIqIG9ic2VydmVyKTsKIAotICAvLyBBY2Nlc3MgdG8gdGhlIGF2YXRhciBidXR0b24uCi0gIEF2YXRhclRvb2xiYXJCdXR0b24qIEdldEF2YXRhclRvb2xiYXJCdXR0b24oKTsKLQogICAvLyBBY2Nlc3NvcnMuCiAgIEJyb3dzZXIqIGJyb3dzZXIoKSBjb25zdCB7IHJldHVybiBicm93c2VyXzsgfQogICBCcm93c2VyQWN0aW9uc0NvbnRhaW5lciogYnJvd3Nlcl9hY3Rpb25zKCkgY29uc3QgeyByZXR1cm4gYnJvd3Nlcl9hY3Rpb25zXzsgfQpAQCAtMjM3LDYgKzIzNCw3IEBACiAgIHZpZXdzOjpBY2Nlc3NpYmxlUGFuZVZpZXcqIEdldEFzQWNjZXNzaWJsZVBhbmVWaWV3KCkgb3ZlcnJpZGU7CiAgIHZpZXdzOjpWaWV3KiBHZXRBbmNob3JWaWV3KFBhZ2VBY3Rpb25JY29uVHlwZSB0eXBlKSBvdmVycmlkZTsKICAgdm9pZCBab29tQ2hhbmdlZEZvckFjdGl2ZVRhYihib29sIGNhbl9zaG93X2J1YmJsZSkgb3ZlcnJpZGU7CisgIEF2YXRhclRvb2xiYXJCdXR0b24qIEdldEF2YXRhclRvb2xiYXJCdXR0b24oKSBvdmVycmlkZTsKIAogICAvLyBCcm93c2VyUm9vdFZpZXc6OkRyb3BUYXJnZXQKICAgQnJvd3NlclJvb3RWaWV3OjpEcm9wSW5kZXggR2V0RHJvcEluZGV4KApkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvdWkvdmlld3Mvd2ViX2FwcHMvd2ViX2FwcF9mcmFtZV90b29sYmFyX3ZpZXcuY2MgYi9jaHJvbWUvYnJvd3Nlci91aS92aWV3cy93ZWJfYXBwcy93ZWJfYXBwX2ZyYW1lX3Rvb2xiYXJfdmlldy5jYwppbmRleCBlYmNmMDA1Li4yZDI4NDc1IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS92aWV3cy93ZWJfYXBwcy93ZWJfYXBwX2ZyYW1lX3Rvb2xiYXJfdmlldy5jYworKysgYi9jaHJvbWUvYnJvd3Nlci91aS92aWV3cy93ZWJfYXBwcy93ZWJfYXBwX2ZyYW1lX3Rvb2xiYXJfdmlldy5jYwpAQCAtNDU1LDYgKzQ1NSwxMCBAQAogICBwYWdlX2FjdGlvbl9pY29uX2NvbnRhaW5lcl92aWV3Xy0+Wm9vbUNoYW5nZWRGb3JBY3RpdmVUYWIoY2FuX3Nob3dfYnViYmxlKTsKIH0KIAorQXZhdGFyVG9vbGJhckJ1dHRvbiogV2ViQXBwRnJhbWVUb29sYmFyVmlldzo6R2V0QXZhdGFyVG9vbGJhckJ1dHRvbigpIHsKKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKIHZvaWQgV2ViQXBwRnJhbWVUb29sYmFyVmlldzo6T25XaWRnZXRWaXNpYmlsaXR5Q2hhbmdlZCh2aWV3czo6V2lkZ2V0KiB3aWRnZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB2aXNpYmlsaXR5KSB7CiAgIGlmICghdmlzaWJpbGl0eSB8fCAhcGVuZGluZ193aWRnZXRfdmlzaWJpbGl0eV8pCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci91aS92aWV3cy93ZWJfYXBwcy93ZWJfYXBwX2ZyYW1lX3Rvb2xiYXJfdmlldy5oIGIvY2hyb21lL2Jyb3dzZXIvdWkvdmlld3Mvd2ViX2FwcHMvd2ViX2FwcF9mcmFtZV90b29sYmFyX3ZpZXcuaAppbmRleCAyZDQyOWJlLi5kYzY0ODdhIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS92aWV3cy93ZWJfYXBwcy93ZWJfYXBwX2ZyYW1lX3Rvb2xiYXJfdmlldy5oCisrKyBiL2Nocm9tZS9icm93c2VyL3VpL3ZpZXdzL3dlYl9hcHBzL3dlYl9hcHBfZnJhbWVfdG9vbGJhcl92aWV3LmgKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlICJ1aS92aWV3cy93aWRnZXQvd2lkZ2V0X29ic2VydmVyLmgiCiAKIGNsYXNzIEFwcE1lbnVCdXR0b247CitjbGFzcyBBdmF0YXJUb29sYmFyQnV0dG9uOwogY2xhc3MgQnJvd3NlclZpZXc7CiBjbGFzcyBFeHRlbnNpb25zVG9vbGJhckNvbnRhaW5lcjsKIGNsYXNzIFBhZ2VBY3Rpb25JY29uQ29udGFpbmVyVmlldzsKQEAgLTExOCw2ICsxMTksNyBAQAogICB2aWV3czo6QWNjZXNzaWJsZVBhbmVWaWV3KiBHZXRBc0FjY2Vzc2libGVQYW5lVmlldygpIG92ZXJyaWRlOwogICB2aWV3czo6VmlldyogR2V0QW5jaG9yVmlldyhQYWdlQWN0aW9uSWNvblR5cGUgdHlwZSkgb3ZlcnJpZGU7CiAgIHZvaWQgWm9vbUNoYW5nZWRGb3JBY3RpdmVUYWIoYm9vbCBjYW5fc2hvd19idWJibGUpIG92ZXJyaWRlOworICBBdmF0YXJUb29sYmFyQnV0dG9uKiBHZXRBdmF0YXJUb29sYmFyQnV0dG9uKCkgb3ZlcnJpZGU7CiAKICAgLy8gdmlld3M6OldpZGdldE9ic2VydmVyOgogICB2b2lkIE9uV2lkZ2V0VmlzaWJpbGl0eUNoYW5nZWQodmlld3M6OldpZGdldCogd2lkZ2V0LCBib29sIHZpc2libGUpIG92ZXJyaWRlOwpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvdWkvd2VidWkvYXBwX21hbmFnZW1lbnQvYXBwX21hbmFnZW1lbnRfcGFnZV9oYW5kbGVyLmNjIGIvY2hyb21lL2Jyb3dzZXIvdWkvd2VidWkvYXBwX21hbmFnZW1lbnQvYXBwX21hbmFnZW1lbnRfcGFnZV9oYW5kbGVyLmNjCmluZGV4IGY2YzhlYzNiLi43ZjYxNDNlIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS9hcHBfbWFuYWdlbWVudC9hcHBfbWFuYWdlbWVudF9wYWdlX2hhbmRsZXIuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvdWkvd2VidWkvYXBwX21hbmFnZW1lbnQvYXBwX21hbmFnZW1lbnRfcGFnZV9oYW5kbGVyLmNjCkBAIC05MiwxMyArOTIsNyBAQAogICAgIFByb2ZpbGUqIHByb2ZpbGUpCiAgICAgOiByZWNlaXZlcl8odGhpcywgc3RkOjptb3ZlKHJlY2VpdmVyKSksCiAgICAgICBwYWdlXyhzdGQ6Om1vdmUocGFnZSkpLAotICAgICAgcHJvZmlsZV8ocHJvZmlsZSkKLSNpZiBkZWZpbmVkKE9TX0NIUk9NRU9TKQotICAgICAgLAotICAgICAgYXJjX2FwcF9saXN0X3ByZWZzX29ic2VydmVyXyh0aGlzKSwKLSAgICAgIHNoZWxmX2RlbGVnYXRlXyh0aGlzKQotI2VuZGlmCi17CisgICAgICBwcm9maWxlXyhwcm9maWxlKSB7CiAgIGFwcHM6OkFwcFNlcnZpY2VQcm94eSogcHJveHkgPQogICAgICAgYXBwczo6QXBwU2VydmljZVByb3h5RmFjdG9yeTo6R2V0Rm9yUHJvZmlsZShwcm9maWxlXyk7CiAKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL3dlYnVpL2FwcF9tYW5hZ2VtZW50L2FwcF9tYW5hZ2VtZW50X3BhZ2VfaGFuZGxlci5oIGIvY2hyb21lL2Jyb3dzZXIvdWkvd2VidWkvYXBwX21hbmFnZW1lbnQvYXBwX21hbmFnZW1lbnRfcGFnZV9oYW5kbGVyLmgKaW5kZXggMTBmYTQwNC4uNmJjNDVkNCAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvdWkvd2VidWkvYXBwX21hbmFnZW1lbnQvYXBwX21hbmFnZW1lbnRfcGFnZV9oYW5kbGVyLmgKKysrIGIvY2hyb21lL2Jyb3dzZXIvdWkvd2VidWkvYXBwX21hbmFnZW1lbnQvYXBwX21hbmFnZW1lbnRfcGFnZV9oYW5kbGVyLmgKQEAgLTIyLDEyICsyMiwxMCBAQAogY2xhc3MgUHJvZmlsZTsKIAogY2xhc3MgQXBwTWFuYWdlbWVudFBhZ2VIYW5kbGVyIDogcHVibGljIGFwcF9tYW5hZ2VtZW50Ojptb2pvbTo6UGFnZUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYXBwczo6QXBwUmVnaXN0cnlDYWNoZTo6T2JzZXJ2ZXIKICNpZiBkZWZpbmVkKE9TX0NIUk9NRU9TKQotICAgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBBcmNBcHBMaXN0UHJlZnM6Ok9ic2VydmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgQXJjQXBwTGlzdFByZWZzOjpPYnNlcnZlciwKICNlbmRpZiAgLy8gT1NfQ0hST01FT1MKLXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBhcHBzOjpBcHBSZWdpc3RyeUNhY2hlOjpPYnNlcnZlciB7CiAgcHVibGljOgogICBBcHBNYW5hZ2VtZW50UGFnZUhhbmRsZXIoCiAgICAgICBtb2pvOjpQZW5kaW5nUmVjZWl2ZXI8YXBwX21hbmFnZW1lbnQ6Om1vam9tOjpQYWdlSGFuZGxlcj4gcmVjZWl2ZXIsCkBAIC03OSw5ICs3Nyw5IEBACiAgIFByb2ZpbGUqIHByb2ZpbGVfOwogCiAjaWYgZGVmaW5lZChPU19DSFJPTUVPUykKLSAgU2NvcGVkT2JzZXJ2ZXI8QXJjQXBwTGlzdFByZWZzLCBBcHBNYW5hZ2VtZW50UGFnZUhhbmRsZXI+Ci0gICAgICBhcmNfYXBwX2xpc3RfcHJlZnNfb2JzZXJ2ZXJfOwotICBBcHBNYW5hZ2VtZW50U2hlbGZEZWxlZ2F0ZSBzaGVsZl9kZWxlZ2F0ZV87CisgIFNjb3BlZE9ic2VydmVyPEFyY0FwcExpc3RQcmVmcywgQXJjQXBwTGlzdFByZWZzOjpPYnNlcnZlcj4KKyAgICAgIGFyY19hcHBfbGlzdF9wcmVmc19vYnNlcnZlcl97dGhpc307CisgIEFwcE1hbmFnZW1lbnRTaGVsZkRlbGVnYXRlIHNoZWxmX2RlbGVnYXRlX3t0aGlzfTsKICNlbmRpZiAgLy8gT1NfQ0hST01FT1MKIAogICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQXBwTWFuYWdlbWVudFBhZ2VIYW5kbGVyKTsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL3dlYnVpL2Nocm9tZW9zL2xvZ2luL29vYmVfZGlzcGxheV9jaG9vc2VyLmNjIGIvY2hyb21lL2Jyb3dzZXIvdWkvd2VidWkvY2hyb21lb3MvbG9naW4vb29iZV9kaXNwbGF5X2Nob29zZXIuY2MKaW5kZXggMGI0NWUyZC4uMDRjNTI5MDIgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3VpL3dlYnVpL2Nocm9tZW9zL2xvZ2luL29vYmVfZGlzcGxheV9jaG9vc2VyLmNjCisrKyBiL2Nocm9tZS9icm93c2VyL3VpL3dlYnVpL2Nocm9tZW9zL2xvZ2luL29vYmVfZGlzcGxheV9jaG9vc2VyLmNjCkBAIC0xOCw3ICsxOCw2IEBACiAjaW5jbHVkZSAic2VydmljZXMvc2VydmljZV9tYW5hZ2VyL3B1YmxpYy9jcHAvY29ubmVjdG9yLmgiCiAjaW5jbHVkZSAidWkvZGlzcGxheS9kaXNwbGF5LmgiCiAjaW5jbHVkZSAidWkvZGlzcGxheS9zY3JlZW4uaCIKLSNpbmNsdWRlICJ1aS9ldmVudHMvZGV2aWNlcy9kZXZpY2VfZGF0YV9tYW5hZ2VyLmgiCiAjaW5jbHVkZSAidWkvZXZlbnRzL2RldmljZXMvdG91Y2hzY3JlZW5fZGV2aWNlLmgiCiAKIHVzaW5nIGNvbnRlbnQ6OkJyb3dzZXJUaHJlYWQ7CkBAIC00Miw3ICs0MSw3IEBACiAKIH0gIC8vIG5hbWVzcGFjZQogCi1Pb2JlRGlzcGxheUNob29zZXI6Ok9vYmVEaXNwbGF5Q2hvb3NlcigpIDogc2NvcGVkX29ic2VydmVyXyh0aGlzKSB7CitPb2JlRGlzcGxheUNob29zZXI6Ok9vYmVEaXNwbGF5Q2hvb3NlcigpIHsKICAgLy8gfGNvbm5lY3RvcnwgbWF5IGJlIG51bGwgaW4gdGVzdHMuCiAgIGF1dG8qIGNvbm5lY3RvciA9IGNvbnRlbnQ6OkdldFN5c3RlbUNvbm5lY3RvcigpOwogICBpZiAoY29ubmVjdG9yKSB7CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS9jaHJvbWVvcy9sb2dpbi9vb2JlX2Rpc3BsYXlfY2hvb3Nlci5oIGIvY2hyb21lL2Jyb3dzZXIvdWkvd2VidWkvY2hyb21lb3MvbG9naW4vb29iZV9kaXNwbGF5X2Nob29zZXIuaAppbmRleCA1NTUwNTBjLi5jMjk5MzcyIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS9jaHJvbWVvcy9sb2dpbi9vb2JlX2Rpc3BsYXlfY2hvb3Nlci5oCisrKyBiL2Nocm9tZS9icm93c2VyL3VpL3dlYnVpL2Nocm9tZW9zL2xvZ2luL29vYmVfZGlzcGxheV9jaG9vc2VyLmgKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSAiYmFzZS9tYWNyb3MuaCIKICNpbmNsdWRlICJiYXNlL21lbW9yeS93ZWFrX3B0ci5oIgogI2luY2x1ZGUgImJhc2Uvc2NvcGVkX29ic2VydmVyLmgiCisjaW5jbHVkZSAidWkvZXZlbnRzL2RldmljZXMvZGV2aWNlX2RhdGFfbWFuYWdlci5oIgogI2luY2x1ZGUgInVpL2V2ZW50cy9kZXZpY2VzL2lucHV0X2RldmljZV9ldmVudF9vYnNlcnZlci5oIgogCiBuYW1lc3BhY2UgdWkgewpAQCAtNDQsNyArNDUsNyBAQAogICB2b2lkIE9uRGV2aWNlTGlzdHNDb21wbGV0ZSgpIG92ZXJyaWRlOwogCiAgIFNjb3BlZE9ic2VydmVyPHVpOjpEZXZpY2VEYXRhTWFuYWdlciwgdWk6OklucHV0RGV2aWNlRXZlbnRPYnNlcnZlcj4KLSAgICAgIHNjb3BlZF9vYnNlcnZlcl87CisgICAgICBzY29wZWRfb2JzZXJ2ZXJfe3RoaXN9OwogICBhc2g6Om1vam9tOjpDcm9zRGlzcGxheUNvbmZpZ0NvbnRyb2xsZXJQdHIgY3Jvc19kaXNwbGF5X2NvbmZpZ19wdHJfOwogCiAgIGJhc2U6OldlYWtQdHJGYWN0b3J5PE9vYmVEaXNwbGF5Q2hvb3Nlcj4gd2Vha19wdHJfZmFjdG9yeV97dGhpc307CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS9leHRlbnNpb25zL2V4dGVuc2lvbnNfdWkuY2MgYi9jaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS9leHRlbnNpb25zL2V4dGVuc2lvbnNfdWkuY2MKaW5kZXggNjQ1Y2Y5ZC4uMThiMDBkNTMgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3VpL3dlYnVpL2V4dGVuc2lvbnMvZXh0ZW5zaW9uc191aS5jYworKysgYi9jaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS9leHRlbnNpb25zL2V4dGVuc2lvbnNfdWkuY2MKQEAgLTY5LDYgKzY5LDggQEAKICAgICB7ImNsb3NlIiwgSURTX0NMT1NFfSwKICAgICB7ImNsZWFyIiwgSURTX0NMRUFSfSwKICAgICB7ImNvbmZpcm0iLCBJRFNfQ09ORklSTX0sCisgICAgeyJjb250cm9sbGVkU2V0dGluZ0NoaWxkUmVzdHJpY3Rpb24iLAorICAgICBJRFNfQ09OVFJPTExFRF9TRVRUSU5HX0NISUxEX1JFU1RSSUNUSU9OfSwKICAgICB7ImNvbnRyb2xsZWRTZXR0aW5nUG9saWN5IiwgSURTX0NPTlRST0xMRURfU0VUVElOR19QT0xJQ1l9LAogICAgIHsiZG9uZSIsIElEU19ET05FfSwKICAgICB7ImxlYXJuTW9yZSIsIElEU19MRUFSTl9NT1JFfSwKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL3dlYnVpL29tbmlib3gvb21uaWJveC5tb2pvbSBiL2Nocm9tZS9icm93c2VyL3VpL3dlYnVpL29tbmlib3gvb21uaWJveC5tb2pvbQppbmRleCA3OTE5MDkzLi5lMTEzZmRlIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS9vbW5pYm94L29tbmlib3gubW9qb20KKysrIGIvY2hyb21lL2Jyb3dzZXIvdWkvd2VidWkvb21uaWJveC9vbW5pYm94Lm1vam9tCkBAIC01Miw5ICs1MiwxMCBAQAogfTsKIAogc3RydWN0IE9tbmlib3hSZXNwb25zZSB7Ci0gIGJvb2wgZG9uZTsKKyAgaW50MzIgY3Vyc29yX3Bvc2l0aW9uOwogICAvLyBUaW1lIGRlbHRhIHNpbmNlIHRoZSByZXF1ZXN0IHdhcyBzdGFydGVkLCBpbiBtaWxsaXNlY29uZHMuCiAgIGludDMyIHRpbWVfc2luY2Vfb21uaWJveF9zdGFydGVkX21zOworICBib29sIGRvbmU7CiAgIC8vIFRoZSBpbmZlcnJlZCBtZXRyaWNzOjpPbW5pYm94SW5wdXRUeXBlIG9mIHRoZSByZXF1ZXN0IHJlcHJlc2VudGVkIGFzIGEKICAgLy8gc3RyaW5nLgogICBzdHJpbmcgdHlwZTsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL3dlYnVpL29tbmlib3gvb21uaWJveF9wYWdlX2hhbmRsZXIuY2MgYi9jaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS9vbW5pYm94L29tbmlib3hfcGFnZV9oYW5kbGVyLmNjCmluZGV4IGM2NTNlZWUuLmM4ZGM2MDIgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3VpL3dlYnVpL29tbmlib3gvb21uaWJveF9wYWdlX2hhbmRsZXIuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvdWkvd2VidWkvb21uaWJveC9vbW5pYm94X3BhZ2VfaGFuZGxlci5jYwpAQCAtMjM1LDIyICsyMzUsMjUgQEAKIH0KIAogdm9pZCBPbW5pYm94UGFnZUhhbmRsZXI6Ok9uT21uaWJveFF1ZXJ5KEF1dG9jb21wbGV0ZUNvbnRyb2xsZXIqIGNvbnRyb2xsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6c3RyaW5nMTYmIGlucHV0X3RleHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdXRvY29tcGxldGVJbnB1dCYgaW5wdXQpIHsKKyAgdGltZV9vbW5pYm94X3N0YXJ0ZWRfID0gYmFzZTo6VGltZTo6Tm93KCk7CisgIGlucHV0XyA9IGlucHV0OwogICBwYWdlXy0+SGFuZGxlTmV3QXV0b2NvbXBsZXRlUXVlcnkoY29udHJvbGxlciA9PSBjb250cm9sbGVyXy5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVURjE2VG9VVEY4KGlucHV0X3RleHQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVURjE2VG9VVEY4KGlucHV0LnRleHQoKSkpOwogfQogCiB2b2lkIE9tbmlib3hQYWdlSGFuZGxlcjo6T25PbW5pYm94UmVzdWx0Q2hhbmdlZCgKICAgICBib29sIGRlZmF1bHRfbWF0Y2hfY2hhbmdlZCwKICAgICBBdXRvY29tcGxldGVDb250cm9sbGVyKiBjb250cm9sbGVyKSB7CiAgIG1vam9tOjpPbW5pYm94UmVzcG9uc2VQdHIgcmVzcG9uc2UobW9qb206Ok9tbmlib3hSZXNwb25zZTo6TmV3KCkpOwotICByZXNwb25zZS0+ZG9uZSA9IGNvbnRyb2xsZXItPmRvbmUoKTsKKyAgcmVzcG9uc2UtPmN1cnNvcl9wb3NpdGlvbiA9IGlucHV0Xy5jdXJzb3JfcG9zaXRpb24oKTsKICAgcmVzcG9uc2UtPnRpbWVfc2luY2Vfb21uaWJveF9zdGFydGVkX21zID0KICAgICAgIChiYXNlOjpUaW1lOjpOb3coKSAtIHRpbWVfb21uaWJveF9zdGFydGVkXykuSW5NaWxsaXNlY29uZHMoKTsKKyAgcmVzcG9uc2UtPmRvbmUgPSBjb250cm9sbGVyLT5kb25lKCk7CisgIHJlc3BvbnNlLT50eXBlID0gQXV0b2NvbXBsZXRlSW5wdXQ6OlR5cGVUb1N0cmluZyhpbnB1dF8udHlwZSgpKTsKICAgY29uc3QgYmFzZTo6c3RyaW5nMTYgaG9zdCA9CiAgICAgICBpbnB1dF8udGV4dCgpLnN1YnN0cihpbnB1dF8ucGFydHMoKS5ob3N0LmJlZ2luLCBpbnB1dF8ucGFydHMoKS5ob3N0Lmxlbik7CiAgIHJlc3BvbnNlLT5ob3N0ID0gYmFzZTo6VVRGMTZUb1VURjgoaG9zdCk7Ci0gIHJlc3BvbnNlLT50eXBlID0gQXV0b2NvbXBsZXRlSW5wdXQ6OlR5cGVUb1N0cmluZyhpbnB1dF8udHlwZSgpKTsKICAgYm9vbCBpc190eXBlZF9ob3N0OwogICBpZiAoIUxvb2t1cElzVHlwZWRIb3N0KGhvc3QsICZpc190eXBlZF9ob3N0KSkKICAgICBpc190eXBlZF9ob3N0ID0gZmFsc2U7CkBAIC0zOTIsMzAgKzM5NSwyMiBAQAogICAvLyBhY3R1YWwgcmVzdWx0cyB0byBub3QgZGVwZW5kIG9uIHRoZSBzdGF0ZSBvZiB0aGUgcHJldmlvdXMgcmVxdWVzdC4KICAgaWYgKHJlc2V0X2F1dG9jb21wbGV0ZV9jb250cm9sbGVyKQogICAgIFJlc2V0Q29udHJvbGxlcigpOwotICAvLyBUT0RPIChtYW51a2gpOiBPbW5pYm94UGFnZUhhbmRsZXI6OlN0YXJ0T21uaWJveFF1ZXJ5IGlzIGludm9rZWQgb25seSBmb3IKLSAgLy8gcXVlcmllcyBmcm9tIHRoZSBkZWJ1ZyBwYWdlIGFuZCBub3QgZm9yIHF1ZXJpZXMgZnJvbSB0aGUgYnJvd3NlciBvbW5pYm94LgotICAvLyB0aW1lX29tbmlib3hfc3RhcnRlZF8gYW5kIGlucHV0XyBhcmUgdGhlcmVmb3JlIG5vdCBzZXQgZm9yIGJyb3dzZXIgb21uaWJveAotICAvLyBxdWVyaWVzLCByZXN1bHRpbmcgaW4gaW5hY2N1cmF0ZSB0aW1lX3NpbmNlX29tbmlib3hfc3RhcnRlZF9tcywgaG9zdCwgdHlwZSwKLSAgLy8gYW5kIGlzX3R5cGVkX2hvc3QgdmFsdWVzIGluIHRoZSByZXN1bHQgb2JqZWN0IGJlaW5nIHNlbnQgdG8gdGhlIGRlYnVnIHBhZ2UuCi0gIC8vIEZvciB0aGUgdXNlciwgdGhpcyBtZWFucyB0aGUgJ2RldGFpbHMnIHNlY3Rpb24gaXMgbW9zdGx5IGluYWNjdXJhdGUgZm9yCi0gIC8vIGJyb3dzZXIgb21uaWJveCBxdWVyaWVzLgotICB0aW1lX29tbmlib3hfc3RhcnRlZF8gPSBiYXNlOjpUaW1lOjpOb3coKTsKLSAgaW5wdXRfID0gQXV0b2NvbXBsZXRlSW5wdXQoCisgIEF1dG9jb21wbGV0ZUlucHV0IGlucHV0KAogICAgICAgYmFzZTo6VVRGOFRvVVRGMTYoaW5wdXRfc3RyaW5nKSwgY3Vyc29yX3Bvc2l0aW9uLAogICAgICAgc3RhdGljX2Nhc3Q8bWV0cmljczo6T21uaWJveEV2ZW50UHJvdG86OlBhZ2VDbGFzc2lmaWNhdGlvbj4oCiAgICAgICAgICAgcGFnZV9jbGFzc2lmaWNhdGlvbiksCiAgICAgICBDaHJvbWVBdXRvY29tcGxldGVTY2hlbWVDbGFzc2lmaWVyKHByb2ZpbGVfKSk7CiAgIEdVUkwgY3VycmVudF91cmxfZ3VybHtjdXJyZW50X3VybH07CiAgIGlmIChjdXJyZW50X3VybF9ndXJsLmlzX3ZhbGlkKCkpCi0gICAgaW5wdXRfLnNldF9jdXJyZW50X3VybChjdXJyZW50X3VybF9ndXJsKTsKLSAgaW5wdXRfLnNldF9jdXJyZW50X3RpdGxlKGJhc2U6OlVURjhUb1VURjE2KGN1cnJlbnRfdXJsKSk7Ci0gIGlucHV0Xy5zZXRfcHJldmVudF9pbmxpbmVfYXV0b2NvbXBsZXRlKHByZXZlbnRfaW5saW5lX2F1dG9jb21wbGV0ZSk7Ci0gIGlucHV0Xy5zZXRfcHJlZmVyX2tleXdvcmQocHJlZmVyX2tleXdvcmQpOworICAgIGlucHV0LnNldF9jdXJyZW50X3VybChjdXJyZW50X3VybF9ndXJsKTsKKyAgaW5wdXQuc2V0X2N1cnJlbnRfdGl0bGUoYmFzZTo6VVRGOFRvVVRGMTYoY3VycmVudF91cmwpKTsKKyAgaW5wdXQuc2V0X3ByZXZlbnRfaW5saW5lX2F1dG9jb21wbGV0ZShwcmV2ZW50X2lubGluZV9hdXRvY29tcGxldGUpOworICBpbnB1dC5zZXRfcHJlZmVyX2tleXdvcmQocHJlZmVyX2tleXdvcmQpOwogICBpZiAocHJlZmVyX2tleXdvcmQpCi0gICAgaW5wdXRfLnNldF9rZXl3b3JkX21vZGVfZW50cnlfbWV0aG9kKG1ldHJpY3M6Ok9tbmlib3hFdmVudFByb3RvOjpUQUIpOwotICBpbnB1dF8uc2V0X2Zyb21fb21uaWJveF9mb2N1cyh6ZXJvX3N1Z2dlc3QpOworICAgIGlucHV0LnNldF9rZXl3b3JkX21vZGVfZW50cnlfbWV0aG9kKG1ldHJpY3M6Ok9tbmlib3hFdmVudFByb3RvOjpUQUIpOworICBpbnB1dC5zZXRfZnJvbV9vbW5pYm94X2ZvY3VzKHplcm9fc3VnZ2VzdCk7CiAKLSAgT25PbW5pYm94UXVlcnkoY29udHJvbGxlcl8uZ2V0KCksIGlucHV0Xy50ZXh0KCkpOworICBPbk9tbmlib3hRdWVyeShjb250cm9sbGVyXy5nZXQoKSwgaW5wdXQpOwogICBjb250cm9sbGVyXy0+U3RhcnQoaW5wdXRfKTsKIH0KIApkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvdWkvd2VidWkvb21uaWJveC9vbW5pYm94X3BhZ2VfaGFuZGxlci5oIGIvY2hyb21lL2Jyb3dzZXIvdWkvd2VidWkvb21uaWJveC9vbW5pYm94X3BhZ2VfaGFuZGxlci5oCmluZGV4IDUzZjc4MzEuLmM5NjBmZjAgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3VpL3dlYnVpL29tbmlib3gvb21uaWJveF9wYWdlX2hhbmRsZXIuaAorKysgYi9jaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS9vbW5pYm94L29tbmlib3hfcGFnZV9oYW5kbGVyLmgKQEAgLTQzLDcgKzQzLDcgQEAKIAogICAvLyBPbW5pYm94Q29udHJvbGxlckVtaXR0ZXI6Ok9ic2VydmVyIG92ZXJyaWRlczoKICAgdm9pZCBPbk9tbmlib3hRdWVyeShBdXRvY29tcGxldGVDb250cm9sbGVyKiBjb250cm9sbGVyLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OnN0cmluZzE2JiBpbnB1dF90ZXh0KSBvdmVycmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdXRvY29tcGxldGVJbnB1dCYgaW5wdXQpIG92ZXJyaWRlOwogICB2b2lkIE9uT21uaWJveFJlc3VsdENoYW5nZWQoYm9vbCBkZWZhdWx0X21hdGNoX2NoYW5nZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdXRvY29tcGxldGVDb250cm9sbGVyKiBjb250cm9sbGVyKSBvdmVycmlkZTsKIApkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvdWkvd2VidWkvcHJpbnRfcHJldmlldy9wcmludF9wcmV2aWV3X2hhbmRsZXIuY2MgYi9jaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS9wcmludF9wcmV2aWV3L3ByaW50X3ByZXZpZXdfaGFuZGxlci5jYwppbmRleCA5ZjRjNDZhLi40NDZmYzdkIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS9wcmludF9wcmV2aWV3L3ByaW50X3ByZXZpZXdfaGFuZGxlci5jYworKysgYi9jaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS9wcmludF9wcmV2aWV3L3ByaW50X3ByZXZpZXdfaGFuZGxlci5jYwpAQCAtMTEzOCw2ICsxMTM4LDEwIEBACiB9CiAKIHZvaWQgUHJpbnRQcmV2aWV3SGFuZGxlcjo6T25QcmludFByZXZpZXdGYWlsZWQoaW50IHJlcXVlc3RfaWQpIHsKKyAgV2ViQ29udGVudHMqIGluaXRpYXRvciA9IEdldEluaXRpYXRvcigpOworICBpZiAoIWluaXRpYXRvciB8fCBpbml0aWF0b3ItPklzQmVpbmdEZXN0cm95ZWQoKSkKKyAgICByZXR1cm47ICAvLyBEcm9wIG5vdGlmaWNhdGlvbiBpZiBmaXJlZCBkdXJpbmcgZGVzdHJ1Y3Rpb24gc2VxdWVuY2UuCisKICAgc3RkOjpzdHJpbmcgY2FsbGJhY2tfaWQgPSBHZXRDYWxsYmFja0lkKHJlcXVlc3RfaWQpOwogICBpZiAoY2FsbGJhY2tfaWQuZW1wdHkoKSkKICAgICByZXR1cm47CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS9zZXR0aW5ncy9jaHJvbWVvcy9jaGFuZ2VfcGljdHVyZV9oYW5kbGVyLmNjIGIvY2hyb21lL2Jyb3dzZXIvdWkvd2VidWkvc2V0dGluZ3MvY2hyb21lb3MvY2hhbmdlX3BpY3R1cmVfaGFuZGxlci5jYwppbmRleCAxMDZjN2JiLi4xYzViNjA1IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS9zZXR0aW5ncy9jaHJvbWVvcy9jaGFuZ2VfcGljdHVyZV9oYW5kbGVyLmNjCisrKyBiL2Nocm9tZS9icm93c2VyL3VpL3dlYnVpL3NldHRpbmdzL2Nocm9tZW9zL2NoYW5nZV9waWN0dXJlX2hhbmRsZXIuY2MKQEAgLTg1LDkgKzg1LDcgQEAKIH0gIC8vIG5hbWVzcGFjZQogCiBDaGFuZ2VQaWN0dXJlSGFuZGxlcjo6Q2hhbmdlUGljdHVyZUhhbmRsZXIoKQotICAgIDogcHJldmlvdXNfaW1hZ2VfaW5kZXhfKHVzZXJfbWFuYWdlcjo6VXNlcjo6VVNFUl9JTUFHRV9JTlZBTElEKSwKLSAgICAgIHVzZXJfbWFuYWdlcl9vYnNlcnZlcl8odGhpcyksCi0gICAgICBjYW1lcmFfb2JzZXJ2ZXJfKHRoaXMpIHsKKyAgICA6IHByZXZpb3VzX2ltYWdlX2luZGV4Xyh1c2VyX21hbmFnZXI6OlVzZXI6OlVTRVJfSU1BR0VfSU5WQUxJRCkgewogICB1aTo6UmVzb3VyY2VCdW5kbGUmIGJ1bmRsZSA9IHVpOjpSZXNvdXJjZUJ1bmRsZTo6R2V0U2hhcmVkSW5zdGFuY2UoKTsKICAgYXVkaW86OlNvdW5kc01hbmFnZXIqIG1hbmFnZXIgPSBhdWRpbzo6U291bmRzTWFuYWdlcjo6R2V0KCk7CiAgIG1hbmFnZXItPkluaXRpYWxpemUoU09VTkRfT0JKRUNUX0RFTEVURSwKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL3dlYnVpL3NldHRpbmdzL2Nocm9tZW9zL2NoYW5nZV9waWN0dXJlX2hhbmRsZXIuaCBiL2Nocm9tZS9icm93c2VyL3VpL3dlYnVpL3NldHRpbmdzL2Nocm9tZW9zL2NoYW5nZV9waWN0dXJlX2hhbmRsZXIuaAppbmRleCA3MDAzODM3Li5hM2JiOTVkMiAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvdWkvd2VidWkvc2V0dGluZ3MvY2hyb21lb3MvY2hhbmdlX3BpY3R1cmVfaGFuZGxlci5oCisrKyBiL2Nocm9tZS9icm93c2VyL3VpL3dlYnVpL3NldHRpbmdzL2Nocm9tZW9zL2NoYW5nZV9waWN0dXJlX2hhbmRsZXIuaApAQCAtMTM5LDkgKzEzOSwxMCBAQAogICAvLyBEYXRhIGZvciB8dXNlcl9waG90b198LgogICBzY29wZWRfcmVmcHRyPGJhc2U6OlJlZkNvdW50ZWRCeXRlcz4gdXNlcl9waG90b19kYXRhXzsKIAotICBTY29wZWRPYnNlcnZlcjx1c2VyX21hbmFnZXI6OlVzZXJNYW5hZ2VyLCBDaGFuZ2VQaWN0dXJlSGFuZGxlcj4KLSAgICAgIHVzZXJfbWFuYWdlcl9vYnNlcnZlcl87Ci0gIFNjb3BlZE9ic2VydmVyPENhbWVyYVByZXNlbmNlTm90aWZpZXIsIENoYW5nZVBpY3R1cmVIYW5kbGVyPiBjYW1lcmFfb2JzZXJ2ZXJfOworICBTY29wZWRPYnNlcnZlcjx1c2VyX21hbmFnZXI6OlVzZXJNYW5hZ2VyLCB1c2VyX21hbmFnZXI6OlVzZXJNYW5hZ2VyOjpPYnNlcnZlcj4KKyAgICAgIHVzZXJfbWFuYWdlcl9vYnNlcnZlcl97dGhpc307CisgIFNjb3BlZE9ic2VydmVyPENhbWVyYVByZXNlbmNlTm90aWZpZXIsIENhbWVyYVByZXNlbmNlTm90aWZpZXI6Ok9ic2VydmVyPgorICAgICAgY2FtZXJhX29ic2VydmVyX3t0aGlzfTsKIAogICBiYXNlOjpXZWFrUHRyRmFjdG9yeTxDaGFuZ2VQaWN0dXJlSGFuZGxlcj4gd2Vha19wdHJfZmFjdG9yeV97dGhpc307CiAKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL3dlYnVpL3NldHRpbmdzL2Nocm9tZW9zL2RldmljZV9rZXlib2FyZF9oYW5kbGVyLmNjIGIvY2hyb21lL2Jyb3dzZXIvdWkvd2VidWkvc2V0dGluZ3MvY2hyb21lb3MvZGV2aWNlX2tleWJvYXJkX2hhbmRsZXIuY2MKaW5kZXggYzM4Njg3ZS4uZWUxNmE1MyAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvdWkvd2VidWkvc2V0dGluZ3MvY2hyb21lb3MvZGV2aWNlX2tleWJvYXJkX2hhbmRsZXIuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvdWkvd2VidWkvc2V0dGluZ3MvY2hyb21lb3MvZGV2aWNlX2tleWJvYXJkX2hhbmRsZXIuY2MKQEAgLTE2LDcgKzE2LDYgQEAKICNpbmNsdWRlICJzZXJ2aWNlcy9zZXJ2aWNlX21hbmFnZXIvcHVibGljL2NwcC9jb25uZWN0b3IuaCIKICNpbmNsdWRlICJ1aS9jaHJvbWVvcy9ldmVudHMvZXZlbnRfcmV3cml0ZXJfY2hyb21lb3MuaCIKICNpbmNsdWRlICJ1aS9jaHJvbWVvcy9ldmVudHMva2V5Ym9hcmRfbGF5b3V0X3V0aWwuaCIKLSNpbmNsdWRlICJ1aS9ldmVudHMvZGV2aWNlcy9kZXZpY2VfZGF0YV9tYW5hZ2VyLmgiCiAKIG5hbWVzcGFjZSB7CiAKQEAgLTU5LDggKzU4LDcgQEAKICAgaGFuZGxlcl8tPkhhbmRsZUluaXRpYWxpemUoJmFyZ3MpOwogfQogCi1LZXlib2FyZEhhbmRsZXI6OktleWJvYXJkSGFuZGxlcigpIDogb2JzZXJ2ZXJfKHRoaXMpIHt9Ci0KK0tleWJvYXJkSGFuZGxlcjo6S2V5Ym9hcmRIYW5kbGVyKCkgPSBkZWZhdWx0OwogS2V5Ym9hcmRIYW5kbGVyOjp+S2V5Ym9hcmRIYW5kbGVyKCkgPSBkZWZhdWx0OwogCiB2b2lkIEtleWJvYXJkSGFuZGxlcjo6UmVnaXN0ZXJNZXNzYWdlcygpIHsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL3dlYnVpL3NldHRpbmdzL2Nocm9tZW9zL2RldmljZV9rZXlib2FyZF9oYW5kbGVyLmggYi9jaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS9zZXR0aW5ncy9jaHJvbWVvcy9kZXZpY2Vfa2V5Ym9hcmRfaGFuZGxlci5oCmluZGV4IDg5ZTcwYmIuLmVlNmM0ODAgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3VpL3dlYnVpL3NldHRpbmdzL2Nocm9tZW9zL2RldmljZV9rZXlib2FyZF9oYW5kbGVyLmgKKysrIGIvY2hyb21lL2Jyb3dzZXIvdWkvd2VidWkvc2V0dGluZ3MvY2hyb21lb3MvZGV2aWNlX2tleWJvYXJkX2hhbmRsZXIuaApAQCAtOCwxNiArOCwxMyBAQAogI2luY2x1ZGUgImJhc2UvbWFjcm9zLmgiCiAjaW5jbHVkZSAiYmFzZS9zY29wZWRfb2JzZXJ2ZXIuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS9zZXR0aW5ncy9zZXR0aW5nc19wYWdlX3VpX2hhbmRsZXIuaCIKKyNpbmNsdWRlICJ1aS9ldmVudHMvZGV2aWNlcy9kZXZpY2VfZGF0YV9tYW5hZ2VyLmgiCiAjaW5jbHVkZSAidWkvZXZlbnRzL2RldmljZXMvaW5wdXRfZGV2aWNlX2V2ZW50X29ic2VydmVyLmgiCiAKIG5hbWVzcGFjZSBiYXNlIHsKIGNsYXNzIExpc3RWYWx1ZTsKIH0KIAotbmFtZXNwYWNlIHVpIHsKLWNsYXNzIERldmljZURhdGFNYW5hZ2VyOwotfQotCiBuYW1lc3BhY2UgY2hyb21lb3MgewogbmFtZXNwYWNlIHNldHRpbmdzIHsKIApAQCAtNzEsNyArNjgsOCBAQAogICAvLyBTZW5kcyB0aGUgVUkgYSBtZXNzYWdlIGFib3V0IHdoZXRoZXIgaGFyZHdhcmUga2V5Ym9hcmQgYXJlIGF0dGFjaGVkLgogICB2b2lkIFVwZGF0ZUtleWJvYXJkcygpOwogCi0gIFNjb3BlZE9ic2VydmVyPHVpOjpEZXZpY2VEYXRhTWFuYWdlciwgS2V5Ym9hcmRIYW5kbGVyPiBvYnNlcnZlcl87CisgIFNjb3BlZE9ic2VydmVyPHVpOjpEZXZpY2VEYXRhTWFuYWdlciwgdWk6OklucHV0RGV2aWNlRXZlbnRPYnNlcnZlcj4gb2JzZXJ2ZXJfeworICAgICAgdGhpc307CiAKICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEtleWJvYXJkSGFuZGxlcik7CiB9OwpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvdWkvd2VidWkvc2V0dGluZ3MvY2hyb21lb3MvZGV2aWNlX3Bvd2VyX2hhbmRsZXIuY2MgYi9jaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS9zZXR0aW5ncy9jaHJvbWVvcy9kZXZpY2VfcG93ZXJfaGFuZGxlci5jYwppbmRleCA3OWZlZWE4Li4xOTA2YTMzIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS9zZXR0aW5ncy9jaHJvbWVvcy9kZXZpY2VfcG93ZXJfaGFuZGxlci5jYworKysgYi9jaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS9zZXR0aW5ncy9jaHJvbWVvcy9kZXZpY2VfcG93ZXJfaGFuZGxlci5jYwpAQCAtMTA5LDggKzEwOSw3IEBACiAgIGhhbmRsZXJfLT5IYW5kbGVTZXRMaWRDbG9zZWRCZWhhdmlvcigmYXJncyk7CiB9CiAKLVBvd2VySGFuZGxlcjo6UG93ZXJIYW5kbGVyKFByZWZTZXJ2aWNlKiBwcmVmcykKLSAgICA6IHByZWZzXyhwcmVmcyksIHBvd2VyX21hbmFnZXJfY2xpZW50X29ic2VydmVyXyh0aGlzKSB7fQorUG93ZXJIYW5kbGVyOjpQb3dlckhhbmRsZXIoUHJlZlNlcnZpY2UqIHByZWZzKSA6IHByZWZzXyhwcmVmcykge30KIAogUG93ZXJIYW5kbGVyOjp+UG93ZXJIYW5kbGVyKCkge30KIApkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvdWkvd2VidWkvc2V0dGluZ3MvY2hyb21lb3MvZGV2aWNlX3Bvd2VyX2hhbmRsZXIuaCBiL2Nocm9tZS9icm93c2VyL3VpL3dlYnVpL3NldHRpbmdzL2Nocm9tZW9zL2RldmljZV9wb3dlcl9oYW5kbGVyLmgKaW5kZXggYTM2MmRjZC4uZDU1YTM5NCAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvdWkvd2VidWkvc2V0dGluZ3MvY2hyb21lb3MvZGV2aWNlX3Bvd2VyX2hhbmRsZXIuaAorKysgYi9jaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS9zZXR0aW5ncy9jaHJvbWVvcy9kZXZpY2VfcG93ZXJfaGFuZGxlci5oCkBAIC0xMTQsOCArMTE0LDggQEAKICAgLy8gVXNlZCB0byB3YXRjaCBwb3dlciBtYW5hZ2VtZW50IHByZWZzIGZvciBjaGFuZ2VzIHNvIHRoZSBVSSBjYW4gYmUgbm90aWZpZWQuCiAgIHN0ZDo6dW5pcXVlX3B0cjxQcmVmQ2hhbmdlUmVnaXN0cmFyPiBwcmVmX2NoYW5nZV9yZWdpc3RyYXJfOwogCi0gIFNjb3BlZE9ic2VydmVyPFBvd2VyTWFuYWdlckNsaWVudCwgUG93ZXJIYW5kbGVyPgotICAgICAgcG93ZXJfbWFuYWdlcl9jbGllbnRfb2JzZXJ2ZXJfOworICBTY29wZWRPYnNlcnZlcjxQb3dlck1hbmFnZXJDbGllbnQsIFBvd2VyTWFuYWdlckNsaWVudDo6T2JzZXJ2ZXI+CisgICAgICBwb3dlcl9tYW5hZ2VyX2NsaWVudF9vYnNlcnZlcl97dGhpc307CiAKICAgLy8gTGFzdCBsaWQgc3RhdGUgcmVjZWl2ZWQgZnJvbSBwb3dlcmQuCiAgIFBvd2VyTWFuYWdlckNsaWVudDo6TGlkU3RhdGUgbGlkX3N0YXRlXyA9IFBvd2VyTWFuYWdlckNsaWVudDo6TGlkU3RhdGU6Ok9QRU47CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS9zZXR0aW5ncy9jaHJvbWVvcy9kZXZpY2Vfc3R5bHVzX2hhbmRsZXIuY2MgYi9jaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS9zZXR0aW5ncy9jaHJvbWVvcy9kZXZpY2Vfc3R5bHVzX2hhbmRsZXIuY2MKaW5kZXggMjAyZmNmOC4uYWQ3ZjJlZSAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvdWkvd2VidWkvc2V0dGluZ3MvY2hyb21lb3MvZGV2aWNlX3N0eWx1c19oYW5kbGVyLmNjCisrKyBiL2Nocm9tZS9icm93c2VyL3VpL3dlYnVpL3NldHRpbmdzL2Nocm9tZW9zL2RldmljZV9zdHlsdXNfaGFuZGxlci5jYwpAQCAtMTQsNyArMTQsNiBAQAogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL2Nocm9tZW9zL2FyYy9hcmNfdXRpbC5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3Byb2ZpbGVzL3Byb2ZpbGUuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS9hcHBfbGlzdC9hcmMvYXJjX2FwcF91dGlscy5oIgotI2luY2x1ZGUgInVpL2V2ZW50cy9kZXZpY2VzL2RldmljZV9kYXRhX21hbmFnZXIuaCIKIAogbmFtZXNwYWNlIGNocm9tZW9zIHsKIG5hbWVzcGFjZSBzZXR0aW5ncyB7CkBAIC0yOSw4ICsyOCw3IEBACiAKIH0gIC8vIG5hbWVzcGFjZQogCi1TdHlsdXNIYW5kbGVyOjpTdHlsdXNIYW5kbGVyKCkgOiBub3RlX29ic2VydmVyXyh0aGlzKSwgaW5wdXRfb2JzZXJ2ZXJfKHRoaXMpIHt9Ci0KK1N0eWx1c0hhbmRsZXI6OlN0eWx1c0hhbmRsZXIoKSA9IGRlZmF1bHQ7CiBTdHlsdXNIYW5kbGVyOjp+U3R5bHVzSGFuZGxlcigpID0gZGVmYXVsdDsKIAogdm9pZCBTdHlsdXNIYW5kbGVyOjpSZWdpc3Rlck1lc3NhZ2VzKCkgewpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvdWkvd2VidWkvc2V0dGluZ3MvY2hyb21lb3MvZGV2aWNlX3N0eWx1c19oYW5kbGVyLmggYi9jaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS9zZXR0aW5ncy9jaHJvbWVvcy9kZXZpY2Vfc3R5bHVzX2hhbmRsZXIuaAppbmRleCBhMWJlNDliLi5jMGUyNDI5IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS9zZXR0aW5ncy9jaHJvbWVvcy9kZXZpY2Vfc3R5bHVzX2hhbmRsZXIuaAorKysgYi9jaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS9zZXR0aW5ncy9jaHJvbWVvcy9kZXZpY2Vfc3R5bHVzX2hhbmRsZXIuaApAQCAtMTIsMTYgKzEyLDEzIEBACiAjaW5jbHVkZSAiYmFzZS9zY29wZWRfb2JzZXJ2ZXIuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9jaHJvbWVvcy9ub3RlX3Rha2luZ19oZWxwZXIuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS9zZXR0aW5ncy9zZXR0aW5nc19wYWdlX3VpX2hhbmRsZXIuaCIKKyNpbmNsdWRlICJ1aS9ldmVudHMvZGV2aWNlcy9kZXZpY2VfZGF0YV9tYW5hZ2VyLmgiCiAjaW5jbHVkZSAidWkvZXZlbnRzL2RldmljZXMvaW5wdXRfZGV2aWNlX2V2ZW50X29ic2VydmVyLmgiCiAKIG5hbWVzcGFjZSBiYXNlIHsKIGNsYXNzIExpc3RWYWx1ZTsKIH0KIAotbmFtZXNwYWNlIHVpIHsKLWNsYXNzIERldmljZURhdGFNYW5hZ2VyOwotfQotCiBuYW1lc3BhY2UgY2hyb21lb3MgewogbmFtZXNwYWNlIHNldHRpbmdzIHsKIApAQCAtNjMsOSArNjAsMTAgQEAKICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IG5vdGVfdGFraW5nX2FwcF9pZHNfOwogCiAgIC8vIE9ic2VydmVyIHJlZ2lzdHJhdGlvbi4KLSAgU2NvcGVkT2JzZXJ2ZXI8Tm90ZVRha2luZ0hlbHBlciwgTm90ZVRha2luZ0hlbHBlcjo6T2JzZXJ2ZXI+IG5vdGVfb2JzZXJ2ZXJfOworICBTY29wZWRPYnNlcnZlcjxOb3RlVGFraW5nSGVscGVyLCBOb3RlVGFraW5nSGVscGVyOjpPYnNlcnZlcj4gbm90ZV9vYnNlcnZlcl97CisgICAgICB0aGlzfTsKICAgU2NvcGVkT2JzZXJ2ZXI8dWk6OkRldmljZURhdGFNYW5hZ2VyLCB1aTo6SW5wdXREZXZpY2VFdmVudE9ic2VydmVyPgotICAgICAgaW5wdXRfb2JzZXJ2ZXJfOworICAgICAgaW5wdXRfb2JzZXJ2ZXJfe3RoaXN9OwogCiAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTdHlsdXNIYW5kbGVyKTsKIH07CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS9zZXR0aW5ncy9jaHJvbWVvcy9maW5nZXJwcmludF9oYW5kbGVyLmNjIGIvY2hyb21lL2Jyb3dzZXIvdWkvd2VidWkvc2V0dGluZ3MvY2hyb21lb3MvZmluZ2VycHJpbnRfaGFuZGxlci5jYwppbmRleCAzNzYzZGQ0Li42MDFlZWFmIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS9zZXR0aW5ncy9jaHJvbWVvcy9maW5nZXJwcmludF9oYW5kbGVyLmNjCisrKyBiL2Nocm9tZS9icm93c2VyL3VpL3dlYnVpL3NldHRpbmdzL2Nocm9tZW9zL2ZpbmdlcnByaW50X2hhbmRsZXIuY2MKQEAgLTIwLDcgKzIwLDYgQEAKICNpbmNsdWRlICJjaHJvbWUvY29tbW9uL3ByZWZfbmFtZXMuaCIKICNpbmNsdWRlICJjaHJvbWUvZ3JpdC9nZW5lcmF0ZWRfcmVzb3VyY2VzLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9wcmVmcy9wcmVmX3NlcnZpY2UuaCIKLSNpbmNsdWRlICJjb21wb25lbnRzL3Nlc3Npb25fbWFuYWdlci9jb3JlL3Nlc3Npb25fbWFuYWdlci5oIgogI2luY2x1ZGUgImNvbnRlbnQvcHVibGljL2Jyb3dzZXIvc3lzdGVtX2Nvbm5lY3Rvci5oIgogI2luY2x1ZGUgInNlcnZpY2VzL2RldmljZS9wdWJsaWMvbW9qb20vY29uc3RhbnRzLm1vam9tLmgiCiAjaW5jbHVkZSAic2VydmljZXMvc2VydmljZV9tYW5hZ2VyL3B1YmxpYy9jcHAvY29ubmVjdG9yLmgiCkBAIC01Nyw4ICs1Niw3IEBACiAKIH0gIC8vIG5hbWVzcGFjZQogCi1GaW5nZXJwcmludEhhbmRsZXI6OkZpbmdlcnByaW50SGFuZGxlcihQcm9maWxlKiBwcm9maWxlKQotICAgIDogcHJvZmlsZV8ocHJvZmlsZSksIHNlc3Npb25fb2JzZXJ2ZXJfKHRoaXMpIHsKK0ZpbmdlcnByaW50SGFuZGxlcjo6RmluZ2VycHJpbnRIYW5kbGVyKFByb2ZpbGUqIHByb2ZpbGUpIDogcHJvZmlsZV8ocHJvZmlsZSkgewogICBjb250ZW50OjpHZXRTeXN0ZW1Db25uZWN0b3IoKS0+Q29ubmVjdCgKICAgICAgIGRldmljZTo6bW9qb206OmtTZXJ2aWNlTmFtZSwgZnBfc2VydmljZV8uQmluZE5ld1BpcGVBbmRQYXNzUmVjZWl2ZXIoKSk7CiAgIHVzZXJfaWRfID0gUHJvZmlsZUhlbHBlcjo6R2V0KCktPkdldFVzZXJJZEhhc2hGcm9tUHJvZmlsZShwcm9maWxlKTsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL3dlYnVpL3NldHRpbmdzL2Nocm9tZW9zL2ZpbmdlcnByaW50X2hhbmRsZXIuaCBiL2Nocm9tZS9icm93c2VyL3VpL3dlYnVpL3NldHRpbmdzL2Nocm9tZW9zL2ZpbmdlcnByaW50X2hhbmRsZXIuaAppbmRleCBmYmI0MzIzZC4uOTdjODVmZCAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvdWkvd2VidWkvc2V0dGluZ3MvY2hyb21lb3MvZmluZ2VycHJpbnRfaGFuZGxlci5oCisrKyBiL2Nocm9tZS9icm93c2VyL3VpL3dlYnVpL3NldHRpbmdzL2Nocm9tZW9zL2ZpbmdlcnByaW50X2hhbmRsZXIuaApAQCAtOCw2ICs4LDcgQEAKICNpbmNsdWRlICJiYXNlL2NvbnRhaW5lcnMvZmxhdF9tYXAuaCIKICNpbmNsdWRlICJiYXNlL3Njb3BlZF9vYnNlcnZlci5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3VpL3dlYnVpL3NldHRpbmdzL3NldHRpbmdzX3BhZ2VfdWlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvbXBvbmVudHMvc2Vzc2lvbl9tYW5hZ2VyL2NvcmUvc2Vzc2lvbl9tYW5hZ2VyLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9zZXNzaW9uX21hbmFnZXIvY29yZS9zZXNzaW9uX21hbmFnZXJfb2JzZXJ2ZXIuaCIKICNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvYmluZGluZ3MvcmVjZWl2ZXIuaCIKICNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvYmluZGluZ3MvcmVtb3RlLmgiCkBAIC0xOSwxMCArMjAsNiBAQAogY2xhc3MgTGlzdFZhbHVlOwogfSAgLy8gbmFtZXNwYWNlIGJhc2UKIAotbmFtZXNwYWNlIHNlc3Npb25fbWFuYWdlciB7Ci1jbGFzcyBTZXNzaW9uTWFuYWdlcjsKLX0gIC8vIG5hbWVzcGFjZSBzZXNzaW9uX21hbmFnZXIKLQogbmFtZXNwYWNlIGNocm9tZW9zIHsKIG5hbWVzcGFjZSBzZXR0aW5ncyB7CiAKQEAgLTg0LDcgKzgxLDcgQEAKICAgbW9qbzo6UmVjZWl2ZXI8ZGV2aWNlOjptb2pvbTo6RmluZ2VycHJpbnRPYnNlcnZlcj4gcmVjZWl2ZXJfe3RoaXN9OwogICBTY29wZWRPYnNlcnZlcjxzZXNzaW9uX21hbmFnZXI6OlNlc3Npb25NYW5hZ2VyLAogICAgICAgICAgICAgICAgICBzZXNzaW9uX21hbmFnZXI6OlNlc3Npb25NYW5hZ2VyT2JzZXJ2ZXI+Ci0gICAgICBzZXNzaW9uX29ic2VydmVyXzsKKyAgICAgIHNlc3Npb25fb2JzZXJ2ZXJfe3RoaXN9OwogCiAgIGJhc2U6OldlYWtQdHJGYWN0b3J5PEZpbmdlcnByaW50SGFuZGxlcj4gd2Vha19wdHJfZmFjdG9yeV97dGhpc307CiAKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL3dlYnVpL3NldHRpbmdzL2Nocm9tZW9zL2tlcmJlcm9zX2FjY291bnRzX2hhbmRsZXIuY2MgYi9jaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS9zZXR0aW5ncy9jaHJvbWVvcy9rZXJiZXJvc19hY2NvdW50c19oYW5kbGVyLmNjCmluZGV4IDE5OTA3MzIuLmYyNDlmNzIgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3VpL3dlYnVpL3NldHRpbmdzL2Nocm9tZW9zL2tlcmJlcm9zX2FjY291bnRzX2hhbmRsZXIuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvdWkvd2VidWkvc2V0dGluZ3MvY2hyb21lb3Mva2VyYmVyb3NfYWNjb3VudHNfaGFuZGxlci5jYwpAQCAtMjEsOSArMjEsNyBAQAogbmFtZXNwYWNlIGNocm9tZW9zIHsKIG5hbWVzcGFjZSBzZXR0aW5ncyB7CiAKLUtlcmJlcm9zQWNjb3VudHNIYW5kbGVyOjpLZXJiZXJvc0FjY291bnRzSGFuZGxlcigpCi0gICAgOiBjcmVkZW50aWFsc19tYW5hZ2VyX29ic2VydmVyXyh0aGlzKSB7fQotCitLZXJiZXJvc0FjY291bnRzSGFuZGxlcjo6S2VyYmVyb3NBY2NvdW50c0hhbmRsZXIoKSA9IGRlZmF1bHQ7CiBLZXJiZXJvc0FjY291bnRzSGFuZGxlcjo6fktlcmJlcm9zQWNjb3VudHNIYW5kbGVyKCkgPSBkZWZhdWx0OwogCiB2b2lkIEtlcmJlcm9zQWNjb3VudHNIYW5kbGVyOjpSZWdpc3Rlck1lc3NhZ2VzKCkgewpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvdWkvd2VidWkvc2V0dGluZ3MvY2hyb21lb3Mva2VyYmVyb3NfYWNjb3VudHNfaGFuZGxlci5oIGIvY2hyb21lL2Jyb3dzZXIvdWkvd2VidWkvc2V0dGluZ3MvY2hyb21lb3Mva2VyYmVyb3NfYWNjb3VudHNfaGFuZGxlci5oCmluZGV4IDI5NmNmNDUuLjAwZGZhMGMgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3VpL3dlYnVpL3NldHRpbmdzL2Nocm9tZW9zL2tlcmJlcm9zX2FjY291bnRzX2hhbmRsZXIuaAorKysgYi9jaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS9zZXR0aW5ncy9jaHJvbWVvcy9rZXJiZXJvc19hY2NvdW50c19oYW5kbGVyLmgKQEAgLTc3LDcgKzc3LDcgQEAKICAgLy8gVGhpcyBjbGFzcyBrZWVwcyB0cmFjayBvZiB0aGF0IGFuZCByZW1vdmVzIHRoaXMgaW5zdGFuY2Ugb24gZGVzdHJ1Y3Rpb24uCiAgIFNjb3BlZE9ic2VydmVyPEtlcmJlcm9zQ3JlZGVudGlhbHNNYW5hZ2VyLAogICAgICAgICAgICAgICAgICBLZXJiZXJvc0NyZWRlbnRpYWxzTWFuYWdlcjo6T2JzZXJ2ZXI+Ci0gICAgICBjcmVkZW50aWFsc19tYW5hZ2VyX29ic2VydmVyXzsKKyAgICAgIGNyZWRlbnRpYWxzX21hbmFnZXJfb2JzZXJ2ZXJfe3RoaXN9OwogCiAgIGJhc2U6OldlYWtQdHJGYWN0b3J5PEtlcmJlcm9zQWNjb3VudHNIYW5kbGVyPiB3ZWFrX2ZhY3Rvcnlfe3RoaXN9OwogCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS9zZXR0aW5ncy9zZXR0aW5nc19sb2NhbGl6ZWRfc3RyaW5nc19wcm92aWRlci5jYyBiL2Nocm9tZS9icm93c2VyL3VpL3dlYnVpL3NldHRpbmdzL3NldHRpbmdzX2xvY2FsaXplZF9zdHJpbmdzX3Byb3ZpZGVyLmNjCmluZGV4IGMzNzk1YTguLjk2NTExZjMgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3VpL3dlYnVpL3NldHRpbmdzL3NldHRpbmdzX2xvY2FsaXplZF9zdHJpbmdzX3Byb3ZpZGVyLmNjCisrKyBiL2Nocm9tZS9icm93c2VyL3VpL3dlYnVpL3NldHRpbmdzL3NldHRpbmdzX2xvY2FsaXplZF9zdHJpbmdzX3Byb3ZpZGVyLmNjCkBAIC00NDcsNiArNDQ3LDggQEAKICAgICAgSURTX1NFVFRJTkdTX0FCT1VUX1BBR0VfUkVMQVVOQ0hfQU5EX1BPV0VSV0FTSH0sCiAgICAgeyJhYm91dFJvbGxiYWNrSW5Qcm9ncmVzcyIsIElEU19TRVRUSU5HU19VUEdSQURFX1JPTExCQUNLX0lOX1BST0dSRVNTfSwKICAgICB7ImFib3V0Um9sbGJhY2tTdWNjZXNzIiwgSURTX1NFVFRJTkdTX1VQR1JBREVfUk9MTEJBQ0tfU1VDQ0VTU30sCisgICAgeyJhYm91dFVwZGF0ZU9zU2V0dGluZ3NMaW5rIiwKKyAgICAgSURTX1NFVFRJTkdTX0FCT1VUX1NFRV9PU19TRVRUSU5HU19GT1JfVVBEQVRFX01FU1NBR0V9LAogICAgIHsiYWJvdXRVcGdyYWRlVXBkYXRpbmdDaGFubmVsU3dpdGNoIiwKICAgICAgSURTX1NFVFRJTkdTX1VQR1JBREVfVVBEQVRJTkdfQ0hBTk5FTF9TV0lUQ0h9LAogICAgIHsiYWJvdXRVcGdyYWRlU3VjY2Vzc0NoYW5uZWxTd2l0Y2giLApAQCAtNjY3LDcgKzY2OSw2IEBACiAgICAgICB7InBvbGljeUFwcFVuaW5zdGFsbFBvbGljeSIsIElEU19BUFBfTUFOQUdFTUVOVF9QT0xJQ1lfQVBQX1BPTElDWV9TVFJJTkd9LAogICAgICAgeyJzaXplIiwgSURTX0FQUF9NQU5BR0VNRU5UX1NJWkV9LAogICAgICAgeyJzdG9yYWdlIiwgSURTX0FQUF9NQU5BR0VNRU5UX1NUT1JBR0V9LAotICAgICAgeyJzeXN0ZW1BcHBVbmluc3RhbGxQb2xpY3kiLCBJRFNfQVBQX01BTkFHRU1FTlRfU1lTVEVNX0FQUF9QT0xJQ1lfU1RSSU5HfSwKICAgICAgIHsidGhpc0FwcENhbiIsIElEU19BUFBfTUFOQUdFTUVOVF9USElTX0FQUF9DQU59LAogICAgICAgeyJ0aXRsZSIsIElEU19BUFBfTUFOQUdFTUVOVF9USVRMRX0sCiAgICAgICB7InVuaW5zdGFsbEFwcCIsIElEU19BUFBfTUFOQUdFTUVOVF9VTklOU1RBTExfQVBQfSwKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL3dlYnVpL3NpZ25pbi9pbmxpbmVfbG9naW5faGFuZGxlci5jYyBiL2Nocm9tZS9icm93c2VyL3VpL3dlYnVpL3NpZ25pbi9pbmxpbmVfbG9naW5faGFuZGxlci5jYwppbmRleCBmYjQ4M2Y0NS4uNTk5NGFhYzIgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3VpL3dlYnVpL3NpZ25pbi9pbmxpbmVfbG9naW5faGFuZGxlci5jYworKysgYi9jaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS9zaWduaW4vaW5saW5lX2xvZ2luX2hhbmRsZXIuY2MKQEAgLTE2MiwxMSArMTYyLDkgQEAKICAgICAgIGNvbnRlbnQ6OkJyb3dzZXJDb250ZXh0OjpHZXRTdG9yYWdlUGFydGl0aW9uRm9yU2l0ZSgKICAgICAgICAgICBjb250ZW50cy0+R2V0QnJvd3NlckNvbnRleHQoKSwgc2lnbmluOjpHZXRTaWduaW5QYXJ0aXRpb25VUkwoKSk7CiAKLSAgbmV0OjpDb29raWVPcHRpb25zIGNvb2tpZV9vcHRpb25zOwotICBjb29raWVfb3B0aW9ucy5zZXRfaW5jbHVkZV9odHRwb25seSgpOwotCiAgIHBhcnRpdGlvbi0+R2V0Q29va2llTWFuYWdlckZvckJyb3dzZXJQcm9jZXNzKCktPkdldENvb2tpZUxpc3QoCi0gICAgICBHYWlhVXJsczo6R2V0SW5zdGFuY2UoKS0+Z2FpYV91cmwoKSwgY29va2llX29wdGlvbnMsCisgICAgICBHYWlhVXJsczo6R2V0SW5zdGFuY2UoKS0+Z2FpYV91cmwoKSwKKyAgICAgIG5ldDo6Q29va2llT3B0aW9uczo6TWFrZUFsbEluY2x1c2l2ZSgpLAogICAgICAgYmFzZTo6QmluZE9uY2UoJklubGluZUxvZ2luSGFuZGxlcjo6SGFuZGxlQ29tcGxldGVMb2dpbk1lc3NhZ2VXaXRoQ29va2llcywKICAgICAgICAgICAgICAgICAgICAgIHdlYWtfcHRyX2ZhY3RvcnlfLkdldFdlYWtQdHIoKSwKICAgICAgICAgICAgICAgICAgICAgIGJhc2U6Okxpc3RWYWx1ZShhcmdzLT5HZXRMaXN0KCkpKSk7CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS9zdXBlcnZpc2VkX3VzZXJfaW50ZXJuYWxzX21lc3NhZ2VfaGFuZGxlci5jYyBiL2Nocm9tZS9icm93c2VyL3VpL3dlYnVpL3N1cGVydmlzZWRfdXNlcl9pbnRlcm5hbHNfbWVzc2FnZV9oYW5kbGVyLmNjCmluZGV4IDdmNDRkZDhlLi43ZDQwMjdiIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS9zdXBlcnZpc2VkX3VzZXJfaW50ZXJuYWxzX21lc3NhZ2VfaGFuZGxlci5jYworKysgYi9jaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS9zdXBlcnZpc2VkX3VzZXJfaW50ZXJuYWxzX21lc3NhZ2VfaGFuZGxlci5jYwpAQCAtMTgsNyArMTgsNiBAQAogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3NpZ25pbi9pZGVudGl0eV9tYW5hZ2VyX2ZhY3RvcnkuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9zdXBlcnZpc2VkX3VzZXIvY2hpbGRfYWNjb3VudHMvY2hpbGRfYWNjb3VudF9zZXJ2aWNlLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvc3VwZXJ2aXNlZF91c2VyL3N1cGVydmlzZWRfdXNlcl9lcnJvcl9wYWdlL3N1cGVydmlzZWRfdXNlcl9lcnJvcl9wYWdlLmgiCi0jaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvc3VwZXJ2aXNlZF91c2VyL3N1cGVydmlzZWRfdXNlcl9zZXJ2aWNlLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvc3VwZXJ2aXNlZF91c2VyL3N1cGVydmlzZWRfdXNlcl9zZXJ2aWNlX2ZhY3RvcnkuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9zdXBlcnZpc2VkX3VzZXIvc3VwZXJ2aXNlZF91c2VyX3NldHRpbmdzX3NlcnZpY2UuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9zdXBlcnZpc2VkX3VzZXIvc3VwZXJ2aXNlZF91c2VyX3NldHRpbmdzX3NlcnZpY2VfZmFjdG9yeS5oIgpAQCAtMTE3LDEyICsxMTYsMTEgQEAKIAogfSAgLy8gbmFtZXNwYWNlCiAKLVN1cGVydmlzZWRVc2VySW50ZXJuYWxzTWVzc2FnZUhhbmRsZXI6OlN1cGVydmlzZWRVc2VySW50ZXJuYWxzTWVzc2FnZUhhbmRsZXIoKQotICAgIDogc2NvcGVkX29ic2VydmVyXyh0aGlzKSB7fQorU3VwZXJ2aXNlZFVzZXJJbnRlcm5hbHNNZXNzYWdlSGFuZGxlcjo6U3VwZXJ2aXNlZFVzZXJJbnRlcm5hbHNNZXNzYWdlSGFuZGxlcigpID0KKyAgICBkZWZhdWx0OwogCiBTdXBlcnZpc2VkVXNlckludGVybmFsc01lc3NhZ2VIYW5kbGVyOjoKLSAgICB+U3VwZXJ2aXNlZFVzZXJJbnRlcm5hbHNNZXNzYWdlSGFuZGxlcigpIHsKLX0KKyAgICB+U3VwZXJ2aXNlZFVzZXJJbnRlcm5hbHNNZXNzYWdlSGFuZGxlcigpID0gZGVmYXVsdDsKIAogdm9pZCBTdXBlcnZpc2VkVXNlckludGVybmFsc01lc3NhZ2VIYW5kbGVyOjpSZWdpc3Rlck1lc3NhZ2VzKCkgewogICBEQ0hFQ0tfQ1VSUkVOVExZX09OKEJyb3dzZXJUaHJlYWQ6OlVJKTsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL3dlYnVpL3N1cGVydmlzZWRfdXNlcl9pbnRlcm5hbHNfbWVzc2FnZV9oYW5kbGVyLmggYi9jaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS9zdXBlcnZpc2VkX3VzZXJfaW50ZXJuYWxzX21lc3NhZ2VfaGFuZGxlci5oCmluZGV4IGYyNTdlYWEuLjYxOWI1ODAgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3VpL3dlYnVpL3N1cGVydmlzZWRfdXNlcl9pbnRlcm5hbHNfbWVzc2FnZV9oYW5kbGVyLmgKKysrIGIvY2hyb21lL2Jyb3dzZXIvdWkvd2VidWkvc3VwZXJ2aXNlZF91c2VyX2ludGVybmFsc19tZXNzYWdlX2hhbmRsZXIuaApAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgImJhc2UvbWVtb3J5L3dlYWtfcHRyLmgiCiAjaW5jbHVkZSAiYmFzZS9zY29wZWRfb2JzZXJ2ZXIuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9zdXBlcnZpc2VkX3VzZXIvc3VwZXJ2aXNlZF91c2VyX2Vycm9yX3BhZ2Uvc3VwZXJ2aXNlZF91c2VyX2Vycm9yX3BhZ2UuaCIKKyNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9zdXBlcnZpc2VkX3VzZXIvc3VwZXJ2aXNlZF91c2VyX3NlcnZpY2UuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9zdXBlcnZpc2VkX3VzZXIvc3VwZXJ2aXNlZF91c2VyX3NlcnZpY2Vfb2JzZXJ2ZXIuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci9zdXBlcnZpc2VkX3VzZXIvc3VwZXJ2aXNlZF91c2VyX3VybF9maWx0ZXIuaCIKICNpbmNsdWRlICJjb250ZW50L3B1YmxpYy9icm93c2VyL3dlYl91aV9tZXNzYWdlX2hhbmRsZXIuaCIKQEAgLTE4LDggKzE5LDYgQEAKIGNsYXNzIExpc3RWYWx1ZTsKIH0gIC8vIG5hbWVzcGFjZSBiYXNlCiAKLWNsYXNzIFN1cGVydmlzZWRVc2VyU2VydmljZTsKLQogLy8gVGhlIGltcGxlbWVudGF0aW9uIGZvciB0aGUgY2hyb21lOi8vc3VwZXJ2aXNlZC11c2VyLWludGVybmFscyBwYWdlLgogY2xhc3MgU3VwZXJ2aXNlZFVzZXJJbnRlcm5hbHNNZXNzYWdlSGFuZGxlcgogICAgIDogcHVibGljIGNvbnRlbnQ6OldlYlVJTWVzc2FnZUhhbmRsZXIsCkBAIC02Myw3ICs2Miw3IEBACiAgICAgICB1c2VyX3NldHRpbmdzX3N1YnNjcmlwdGlvbl87CiAKICAgU2NvcGVkT2JzZXJ2ZXI8U3VwZXJ2aXNlZFVzZXJVUkxGaWx0ZXIsIFN1cGVydmlzZWRVc2VyVVJMRmlsdGVyOjpPYnNlcnZlcj4KLSAgICAgIHNjb3BlZF9vYnNlcnZlcl87CisgICAgICBzY29wZWRfb2JzZXJ2ZXJfe3RoaXN9OwogCiAgIGJhc2U6OldlYWtQdHJGYWN0b3J5PFN1cGVydmlzZWRVc2VySW50ZXJuYWxzTWVzc2FnZUhhbmRsZXI+IHdlYWtfZmFjdG9yeV97CiAgICAgICB0aGlzfTsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3VpL3dlYnVpL3RhYl9zdHJpcC90aHVtYm5haWxfdHJhY2tlci5jYyBiL2Nocm9tZS9icm93c2VyL3VpL3dlYnVpL3RhYl9zdHJpcC90aHVtYm5haWxfdHJhY2tlci5jYwppbmRleCA2Yzc0ZGQ5Li4yNjIxNDRjIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci91aS93ZWJ1aS90YWJfc3RyaXAvdGh1bWJuYWlsX3RyYWNrZXIuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvdWkvd2VidWkvdGFiX3N0cmlwL3RodW1ibmFpbF90cmFja2VyLmNjCkBAIC03LDYgKzcsNyBAQAogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx1dGlsaXR5PgogCisjaW5jbHVkZSAiYmFzZS9tYWNyb3MuaCIKICNpbmNsdWRlICJiYXNlL3Njb3BlZF9vYnNlcnZlci5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3Byb2ZpbGVzL3Byb2ZpbGUuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS90aHVtYm5haWxzL3RodW1ibmFpbF9pbWFnZS5oIgpAQCAtMTksOSArMjAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFRodW1ibmFpbEltYWdlOjpPYnNlcnZlciB7CiAgcHVibGljOgogICBDb250ZW50c0RhdGEoVGh1bWJuYWlsVHJhY2tlciogcGFyZW50LCBjb250ZW50OjpXZWJDb250ZW50cyogY29udGVudHMpCi0gICAgICA6IGNvbnRlbnQ6OldlYkNvbnRlbnRzT2JzZXJ2ZXIoY29udGVudHMpLAotICAgICAgICBwYXJlbnRfKHBhcmVudCksCi0gICAgICAgIG9ic2VydmVyXyh0aGlzKSB7CisgICAgICA6IGNvbnRlbnQ6OldlYkNvbnRlbnRzT2JzZXJ2ZXIoY29udGVudHMpLCBwYXJlbnRfKHBhcmVudCkgewogICAgIHRodW1ibmFpbF8gPSBwYXJlbnRfLT50aHVtYm5haWxfZ2V0dGVyXy5SdW4oY29udGVudHMpOwogICAgIGlmICh0aHVtYm5haWxfKQogICAgICAgb2JzZXJ2ZXJfLkFkZCh0aHVtYm5haWxfLmdldCgpKTsKQEAgLTUzLDcgKzUyLDkgQEAKICBwcml2YXRlOgogICBUaHVtYm5haWxUcmFja2VyKiBwYXJlbnRfOwogICBzY29wZWRfcmVmcHRyPFRodW1ibmFpbEltYWdlPiB0aHVtYm5haWxfOwotICBTY29wZWRPYnNlcnZlcjxUaHVtYm5haWxJbWFnZSwgQ29udGVudHNEYXRhPiBvYnNlcnZlcl87CisgIFNjb3BlZE9ic2VydmVyPFRodW1ibmFpbEltYWdlLCBUaHVtYm5haWxJbWFnZTo6T2JzZXJ2ZXI+IG9ic2VydmVyX3t0aGlzfTsKKworICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQ29udGVudHNEYXRhKTsKIH07CiAKIFRodW1ibmFpbFRyYWNrZXI6OlRodW1ibmFpbFRyYWNrZXIoVGh1bWJuYWlsVXBkYXRlZENhbGxiYWNrIGNhbGxiYWNrKQpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvdXRpbC9hbmRyb2lkL2phdmEvc3JjL29yZy9jaHJvbWl1bS9jaHJvbWUvYnJvd3Nlci91dGlsL1ZpZXdVdGlscy5qYXZhIGIvY2hyb21lL2Jyb3dzZXIvdXRpbC9hbmRyb2lkL2phdmEvc3JjL29yZy9jaHJvbWl1bS9jaHJvbWUvYnJvd3Nlci91dGlsL1ZpZXdVdGlscy5qYXZhCmluZGV4IGM4ZTFlNzEuLmY0OTlmMjQgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3V0aWwvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21lL2Jyb3dzZXIvdXRpbC9WaWV3VXRpbHMuamF2YQorKysgYi9jaHJvbWUvYnJvd3Nlci91dGlsL2FuZHJvaWQvamF2YS9zcmMvb3JnL2Nocm9taXVtL2Nocm9tZS9icm93c2VyL3V0aWwvVmlld1V0aWxzLmphdmEKQEAgLTE2LDggKzE2LDYgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogCi1pbXBvcnQgb3JnLmNocm9taXVtLmJhc2UuQ29udGV4dFV0aWxzOwotCiAvKioKICAqIFZpZXctcmVsYXRlZCB1dGlsaXR5IG1ldGhvZHMuCiAgKi8KQEAgLTE1OCwxMiArMTU2LDEzIEBACiAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIGEge0BsaW5rIFJvdW5kZWRCaXRtYXBEcmF3YWJsZX0gdXNpbmcgdGhlIHByb3ZpZGVkIHtAbGluayBCaXRtYXB9IGFuZCBjb3JuZXJSYWRpdXMuCisgICAgICogQHBhcmFtIHJlc291cmNlcyBUaGUge0BsaW5rIFJlc291cmNlc30uCiAgICAgICogQHBhcmFtIGljb24gVGhlIHtAbGluayBCaXRtYXB9IHRvIHJvdW5kLgogICAgICAqIEBwYXJhbSBjb3JuZXJSYWRpdXMgVGhlIGNvcm5lciByYWRpdXMuCiAgICAgICogQHJldHVybiBBIHtAbGluayBSb3VuZGVkQml0bWFwRHJhd2FibGV9IGZvciB0aGUgcHJvdmlkZWQge0BsaW5rIEJpdG1hcH0uCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBSb3VuZGVkQml0bWFwRHJhd2FibGUgY3JlYXRlUm91bmRlZEJpdG1hcERyYXdhYmxlKEJpdG1hcCBpY29uLCBpbnQgY29ybmVyUmFkaXVzKSB7Ci0gICAgICAgIFJlc291cmNlcyByZXNvdXJjZXMgPSBDb250ZXh0VXRpbHMuZ2V0QXBwbGljYXRpb25Db250ZXh0KCkuZ2V0UmVzb3VyY2VzKCk7CisgICAgcHVibGljIHN0YXRpYyBSb3VuZGVkQml0bWFwRHJhd2FibGUgY3JlYXRlUm91bmRlZEJpdG1hcERyYXdhYmxlKAorICAgICAgICAgICAgUmVzb3VyY2VzIHJlc291cmNlcywgQml0bWFwIGljb24sIGludCBjb3JuZXJSYWRpdXMpIHsKICAgICAgICAgUm91bmRlZEJpdG1hcERyYXdhYmxlIHJvdW5kZWRJY29uID0gUm91bmRlZEJpdG1hcERyYXdhYmxlRmFjdG9yeS5jcmVhdGUocmVzb3VyY2VzLCBpY29uKTsKICAgICAgICAgcm91bmRlZEljb24uc2V0Q29ybmVyUmFkaXVzKGNvcm5lclJhZGl1cyk7CiAgICAgICAgIHJldHVybiByb3VuZGVkSWNvbjsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3ZyL3NlcnZpY2UvYnJvd3Nlcl94cl9ydW50aW1lLmNjIGIvY2hyb21lL2Jyb3dzZXIvdnIvc2VydmljZS9icm93c2VyX3hyX3J1bnRpbWUuY2MKaW5kZXggMTJiZjZlOC4uYTNjMTg4OSAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvdnIvc2VydmljZS9icm93c2VyX3hyX3J1bnRpbWUuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvdnIvc2VydmljZS9icm93c2VyX3hyX3J1bnRpbWUuY2MKQEAgLTQ0NCw2ICs0NDQsMTUgQEAKICAgfQogfQogCit2b2lkIEJyb3dzZXJYUlJ1bnRpbWU6OlNldEZyYW1lc1Rocm90dGxlZChjb25zdCBWUlNlcnZpY2VJbXBsKiBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0aHJvdHRsZWQpIHsKKyAgaWYgKHNlcnZpY2UgPT0gcHJlc2VudGluZ19zZXJ2aWNlXykgeworICAgIGZvciAoQnJvd3NlclhSUnVudGltZU9ic2VydmVyJiBvYnNlcnZlciA6IG9ic2VydmVyc18pIHsKKyAgICAgIG9ic2VydmVyLlNldEZyYW1lc1Rocm90dGxlZCh0aHJvdHRsZWQpOworICAgIH0KKyAgfQorfQorCiB2b2lkIEJyb3dzZXJYUlJ1bnRpbWU6OlJlcXVlc3RTZXNzaW9uKAogICAgIFZSU2VydmljZUltcGwqIHNlcnZpY2UsCiAgICAgY29uc3QgZGV2aWNlOjptb2pvbTo6WFJSdW50aW1lU2Vzc2lvbk9wdGlvbnNQdHImIG9wdGlvbnMsCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci92ci9zZXJ2aWNlL2Jyb3dzZXJfeHJfcnVudGltZS5oIGIvY2hyb21lL2Jyb3dzZXIvdnIvc2VydmljZS9icm93c2VyX3hyX3J1bnRpbWUuaAppbmRleCAzNzUxZDQ0ZC4uNDA5ODg5OTUgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3ZyL3NlcnZpY2UvYnJvd3Nlcl94cl9ydW50aW1lLmgKKysrIGIvY2hyb21lL2Jyb3dzZXIvdnIvc2VydmljZS9icm93c2VyX3hyX3J1bnRpbWUuaApAQCAtMzgsNiArMzgsOCBAQAogICAvLyBzZXNzaW9uLiBUaGVyZSBjYW4gb25seSBiZSBhdCBtb3N0IG9uZSBhY3RpdmUgaW1tZXJzaXZlIHNlc3Npb24gZm9yIHRoZQogICAvLyBYUlJ1bnRpbWUuIFNldCB0byBudWxsIHdoZW4gdGhlcmUgaXMgbm8gYWN0aXZlIGltbWVyc2l2ZSBzZXNzaW9uLgogICB2aXJ0dWFsIHZvaWQgU2V0V2ViWFJXZWJDb250ZW50cyhjb250ZW50OjpXZWJDb250ZW50cyogY29udGVudHMpID0gMDsKKworICB2aXJ0dWFsIHZvaWQgU2V0RnJhbWVzVGhyb3R0bGVkKGJvb2wgdGhyb3R0bGVkKSA9IDA7CiB9OwogCiAvLyBUaGlzIGNsYXNzIHdyYXBzIGEgcGh5c2ljYWwgZGV2aWNlJ3MgaW50ZXJmYWNlcywgYW5kIHJlZ2lzdGVycyBmb3IgZXZlbnRzLgpAQCAtNjcsNiArNjksNyBAQAogICB2b2lkIE9uU2VydmljZUFkZGVkKFZSU2VydmljZUltcGwqIHNlcnZpY2UpOwogICB2b2lkIE9uU2VydmljZVJlbW92ZWQoVlJTZXJ2aWNlSW1wbCogc2VydmljZSk7CiAgIHZvaWQgRXhpdFByZXNlbnQoVlJTZXJ2aWNlSW1wbCogc2VydmljZSk7CisgIHZvaWQgU2V0RnJhbWVzVGhyb3R0bGVkKGNvbnN0IFZSU2VydmljZUltcGwqIHNlcnZpY2UsIGJvb2wgdGhyb3R0bGVkKTsKICAgdm9pZCBSZXF1ZXN0U2Vzc2lvbihWUlNlcnZpY2VJbXBsKiBzZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRldmljZTo6bW9qb206OlhSUnVudGltZVNlc3Npb25PcHRpb25zUHRyJiBvcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RTZXNzaW9uQ2FsbGJhY2sgY2FsbGJhY2spOwpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvdnIvc2VydmljZS9pc29sYXRlZF9kZXZpY2VfcHJvdmlkZXIuY2MgYi9jaHJvbWUvYnJvd3Nlci92ci9zZXJ2aWNlL2lzb2xhdGVkX2RldmljZV9wcm92aWRlci5jYwppbmRleCBiNWYyMTMyNS4uNWY0NGY2MzMgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3ZyL3NlcnZpY2UvaXNvbGF0ZWRfZGV2aWNlX3Byb3ZpZGVyLmNjCisrKyBiL2Nocm9tZS9icm93c2VyL3ZyL3NlcnZpY2UvaXNvbGF0ZWRfZGV2aWNlX3Byb3ZpZGVyLmNjCkBAIC03Nyw3ICs3Nyw3IEBACiAgICAgT25EZXZpY2VzRW51bWVyYXRlZCgpOwogICB9IGVsc2UgewogICAgIGRldmljZV9wcm92aWRlcl8ucmVzZXQoKTsKLSAgICBiaW5kaW5nXy5DbG9zZSgpOworICAgIHJlY2VpdmVyXy5yZXNldCgpOwogICAgIHJldHJ5X2NvdW50XysrOwogICAgIFNldHVwRGV2aWNlUHJvdmlkZXIoKTsKICAgfQpAQCAtOTgsMTYgKzk4LDE0IEBACiAKIHZvaWQgSXNvbGF0ZWRWUkRldmljZVByb3ZpZGVyOjpTZXR1cERldmljZVByb3ZpZGVyKCkgewogICBHZXRYUkRldmljZVNlcnZpY2UoKS0+QmluZFJ1bnRpbWVQcm92aWRlcigKLSAgICAgIG1vam86Ok1ha2VSZXF1ZXN0KCZkZXZpY2VfcHJvdmlkZXJfKSk7Ci0gIGRldmljZV9wcm92aWRlcl8uc2V0X2Nvbm5lY3Rpb25fZXJyb3JfaGFuZGxlcihiYXNlOjpCaW5kT25jZSgKKyAgICAgIGRldmljZV9wcm92aWRlcl8uQmluZE5ld1BpcGVBbmRQYXNzUmVjZWl2ZXIoKSk7CisgIGRldmljZV9wcm92aWRlcl8uc2V0X2Rpc2Nvbm5lY3RfaGFuZGxlcihiYXNlOjpCaW5kT25jZSgKICAgICAgICZJc29sYXRlZFZSRGV2aWNlUHJvdmlkZXI6Ok9uU2VydmVyRXJyb3IsIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKIAotICBkZXZpY2U6Om1vam9tOjpJc29sYXRlZFhSUnVudGltZVByb3ZpZGVyQ2xpZW50UHRyIGNsaWVudDsKLSAgYmluZGluZ18uQmluZChtb2pvOjpNYWtlUmVxdWVzdCgmY2xpZW50KSk7Ci0gIGRldmljZV9wcm92aWRlcl8tPlJlcXVlc3REZXZpY2VzKHN0ZDo6bW92ZShjbGllbnQpKTsKKyAgZGV2aWNlX3Byb3ZpZGVyXy0+UmVxdWVzdERldmljZXMocmVjZWl2ZXJfLkJpbmROZXdQaXBlQW5kUGFzc1JlbW90ZSgpKTsKIH0KIAotSXNvbGF0ZWRWUkRldmljZVByb3ZpZGVyOjpJc29sYXRlZFZSRGV2aWNlUHJvdmlkZXIoKSA6IGJpbmRpbmdfKHRoaXMpIHt9CitJc29sYXRlZFZSRGV2aWNlUHJvdmlkZXI6Oklzb2xhdGVkVlJEZXZpY2VQcm92aWRlcigpID0gZGVmYXVsdDsKIAogSXNvbGF0ZWRWUkRldmljZVByb3ZpZGVyOjp+SXNvbGF0ZWRWUkRldmljZVByb3ZpZGVyKCkgewogICBmb3IgKGF1dG8mIGVudHJ5IDogdWlfaG9zdF9tYXBfKSB7CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci92ci9zZXJ2aWNlL2lzb2xhdGVkX2RldmljZV9wcm92aWRlci5oIGIvY2hyb21lL2Jyb3dzZXIvdnIvc2VydmljZS9pc29sYXRlZF9kZXZpY2VfcHJvdmlkZXIuaAppbmRleCA2MTgyNDc4ZC4uZWU4MTg1NSAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvdnIvc2VydmljZS9pc29sYXRlZF9kZXZpY2VfcHJvdmlkZXIuaAorKysgYi9jaHJvbWUvYnJvd3Nlci92ci9zZXJ2aWNlL2lzb2xhdGVkX2RldmljZV9wcm92aWRlci5oCkBAIC05LDcgKzksOCBAQAogI2luY2x1ZGUgImRldmljZS92ci9wdWJsaWMvbW9qb20vaXNvbGF0ZWRfeHJfc2VydmljZS5tb2pvbS5oIgogI2luY2x1ZGUgImRldmljZS92ci92cl9kZXZpY2UuaCIKICNpbmNsdWRlICJkZXZpY2UvdnIvdnJfZGV2aWNlX3Byb3ZpZGVyLmgiCi0jaW5jbHVkZSAibW9qby9wdWJsaWMvY3BwL2JpbmRpbmdzL2JpbmRpbmcuaCIKKyNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvYmluZGluZ3MvcmVjZWl2ZXIuaCIKKyNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvYmluZGluZ3MvcmVtb3RlLmgiCiAKIG5hbWVzcGFjZSB2ciB7CiAKQEAgLTQ4LDcgKzQ5LDcgQEAKIAogICBib29sIGluaXRpYWxpemVkXyA9IGZhbHNlOwogICBpbnQgcmV0cnlfY291bnRfID0gMDsKLSAgZGV2aWNlOjptb2pvbTo6SXNvbGF0ZWRYUlJ1bnRpbWVQcm92aWRlclB0ciBkZXZpY2VfcHJvdmlkZXJfOworICBtb2pvOjpSZW1vdGU8ZGV2aWNlOjptb2pvbTo6SXNvbGF0ZWRYUlJ1bnRpbWVQcm92aWRlcj4gZGV2aWNlX3Byb3ZpZGVyXzsKIAogICBiYXNlOjpSZXBlYXRpbmdDYWxsYmFjazx2b2lkKGRldmljZTo6bW9qb206OlhSRGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlOjptb2pvbTo6VlJEaXNwbGF5SW5mb1B0ciwKQEAgLTU3LDcgKzU4LDggQEAKICAgYmFzZTo6UmVwZWF0aW5nQ2FsbGJhY2s8dm9pZChkZXZpY2U6Om1vam9tOjpYUkRldmljZUlkKT4KICAgICAgIHJlbW92ZV9kZXZpY2VfY2FsbGJhY2tfOwogICBiYXNlOjpPbmNlQ2xvc3VyZSBpbml0aWFsaXphdGlvbl9jb21wbGV0ZV87Ci0gIG1vam86OkJpbmRpbmc8ZGV2aWNlOjptb2pvbTo6SXNvbGF0ZWRYUlJ1bnRpbWVQcm92aWRlckNsaWVudD4gYmluZGluZ187CisgIG1vam86OlJlY2VpdmVyPGRldmljZTo6bW9qb206Oklzb2xhdGVkWFJSdW50aW1lUHJvdmlkZXJDbGllbnQ+IHJlY2VpdmVyX3sKKyAgICAgIHRoaXN9OwogCiAgIHVzaW5nIFVpSG9zdE1hcCA9CiAgICAgICBiYXNlOjpmbGF0X21hcDxkZXZpY2U6Om1vam9tOjpYUkRldmljZUlkLCBzdGQ6OnVuaXF1ZV9wdHI8VlJVaUhvc3Q+PjsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3ZyL3NlcnZpY2UvdnJfc2VydmljZV9pbXBsLmNjIGIvY2hyb21lL2Jyb3dzZXIvdnIvc2VydmljZS92cl9zZXJ2aWNlX2ltcGwuY2MKaW5kZXggNmY3NGQzMi4uZjY1M2M3MWQgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3ZyL3NlcnZpY2UvdnJfc2VydmljZV9pbXBsLmNjCisrKyBiL2Nocm9tZS9icm93c2VyL3ZyL3NlcnZpY2UvdnJfc2VydmljZV9pbXBsLmNjCkBAIC01NDIsNiArNTQyLDE3IEBACiAgICAgaW1tZXJzaXZlX3J1bnRpbWUtPkV4aXRQcmVzZW50KHRoaXMpOwogfQogCit2b2lkIFZSU2VydmljZUltcGw6OlNldEZyYW1lc1Rocm90dGxlZChib29sIHRocm90dGxlZCkgeworICBpZiAodGhyb3R0bGVkICE9IGZyYW1lc190aHJvdHRsZWRfKSB7CisgICAgZnJhbWVzX3Rocm90dGxlZF8gPSB0aHJvdHRsZWQ7CisgICAgQnJvd3NlclhSUnVudGltZSogaW1tZXJzaXZlX3J1bnRpbWUgPQorICAgICAgICBydW50aW1lX21hbmFnZXJfLT5HZXRJbW1lcnNpdmVSdW50aW1lKCk7CisgICAgaWYgKGltbWVyc2l2ZV9ydW50aW1lKSB7CisgICAgICBpbW1lcnNpdmVfcnVudGltZS0+U2V0RnJhbWVzVGhyb3R0bGVkKHRoaXMsIGZyYW1lc190aHJvdHRsZWRfKTsKKyAgICB9CisgIH0KK30KKwogdm9pZCBWUlNlcnZpY2VJbXBsOjpTZXRMaXN0ZW5pbmdGb3JBY3RpdmF0ZSgKICAgICBtb2pvOjpQZW5kaW5nUmVtb3RlPGRldmljZTo6bW9qb206OlZSRGlzcGxheUNsaWVudD4gZGlzcGxheV9jbGllbnQpIHsKICAgLy8gVE9ETyhjcmJ1Zy5jb20vOTk5NzQ1KTogUmVtb3ZlIHRoZSBjaGVjayBpZiB0aGUgY29uZGl0aW9uIHRvIGNoZWNrIGlmCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci92ci9zZXJ2aWNlL3ZyX3NlcnZpY2VfaW1wbC5oIGIvY2hyb21lL2Jyb3dzZXIvdnIvc2VydmljZS92cl9zZXJ2aWNlX2ltcGwuaAppbmRleCA1MzU2OTVjLi5mNWEyMjM3IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci92ci9zZXJ2aWNlL3ZyX3NlcnZpY2VfaW1wbC5oCisrKyBiL2Nocm9tZS9icm93c2VyL3ZyL3NlcnZpY2UvdnJfc2VydmljZV9pbXBsLmgKQEAgLTY1LDYgKzY1LDcgQEAKICAgICAgIGRldmljZTo6bW9qb206OlhSU2Vzc2lvbk9wdGlvbnNQdHIgb3B0aW9ucywKICAgICAgIGRldmljZTo6bW9qb206OlZSU2VydmljZTo6U3VwcG9ydHNTZXNzaW9uQ2FsbGJhY2sgY2FsbGJhY2spIG92ZXJyaWRlOwogICB2b2lkIEV4aXRQcmVzZW50KCkgb3ZlcnJpZGU7CisgIHZvaWQgU2V0RnJhbWVzVGhyb3R0bGVkKGJvb2wgdGhyb3R0bGVkKSBvdmVycmlkZTsKICAgLy8gZGV2aWNlOjptb2pvbTo6VlJTZXJ2aWNlIFdlYlZSIGNvbXBhdGliaWxpdHkgZnVuY3Rpb25zCiAgIHZvaWQgR2V0SW1tZXJzaXZlVlJEaXNwbGF5SW5mbygKICAgICAgIGRldmljZTo6bW9qb206OlZSU2VydmljZTo6R2V0SW1tZXJzaXZlVlJEaXNwbGF5SW5mb0NhbGxiYWNrIGNhbGxiYWNrKQpAQCAtMTY4LDYgKzE2OSw3IEBACiAKICAgYm9vbCBpbml0aWFsaXphdGlvbl9jb21wbGV0ZV8gPSBmYWxzZTsKICAgYm9vbCBpbl9mb2N1c2VkX2ZyYW1lXyA9IGZhbHNlOworICBib29sIGZyYW1lc190aHJvdHRsZWRfID0gZmFsc2U7CiAKICAgc3RkOjptYXA8ZGV2aWNlOjptb2pvbTo6WFJEZXZpY2VJZCwgWHJDb25zZW50UHJvbXB0TGV2ZWw+CiAgICAgICBjb25zZW50X2dyYW50ZWRfZGV2aWNlc187CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci92ci91aV9ob3N0L3ZyX3VpX2hvc3RfaW1wbC5jYyBiL2Nocm9tZS9icm93c2VyL3ZyL3VpX2hvc3QvdnJfdWlfaG9zdF9pbXBsLmNjCmluZGV4IDhhZjBiOTlhLi4wODY0NzM2YyAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvdnIvdWlfaG9zdC92cl91aV9ob3N0X2ltcGwuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvdnIvdWlfaG9zdC92cl91aV9ob3N0X2ltcGwuY2MKQEAgLTIyOCw2ICsyMjgsNyBAQAogICAgIFN0YXJ0VWlSZW5kZXJpbmcoKTsKICAgICBJbml0Q2FwdHVyaW5nU3RhdGVzKCk7CiAgICAgdWlfcmVuZGVyaW5nX3RocmVhZF8tPlNldFdlYlhyUHJlc2VudGluZyh0cnVlKTsKKyAgICB1aV9yZW5kZXJpbmdfdGhyZWFkXy0+U2V0RnJhbWVzVGhyb3R0bGVkKGZyYW1lc190aHJvdHRsZWRfKTsKIAogICAgIFBvbGxDYXB0dXJpbmdTdGF0ZSgpOwogCkBAIC0yNTcsNiArMjU4LDE3IEBACiAgIH0KIH0KIAordm9pZCBWUlVpSG9zdEltcGw6OlNldEZyYW1lc1Rocm90dGxlZChib29sIHRocm90dGxlZCkgeworICBmcmFtZXNfdGhyb3R0bGVkXyA9IHRocm90dGxlZDsKKworICBpZiAoIXVpX3JlbmRlcmluZ190aHJlYWRfKSB7CisgICAgRFZMT0coMSkgPDwgX19mdW5jX18gPDwgIjogbm8gdWlfcmVuZGVyaW5nX3RocmVhZF8iOworICAgIHJldHVybjsKKyAgfQorCisgIHVpX3JlbmRlcmluZ190aHJlYWRfLT5TZXRGcmFtZXNUaHJvdHRsZWQoZnJhbWVzX3Rocm90dGxlZF8pOworfQorCiB2b2lkIFZSVWlIb3N0SW1wbDo6U2V0VlJEaXNwbGF5SW5mbygKICAgICBkZXZpY2U6Om1vam9tOjpWUkRpc3BsYXlJbmZvUHRyIGRpc3BsYXlfaW5mbykgewogICBEQ0hFQ0tfQ0FMTEVEX09OX1ZBTElEX1RIUkVBRCh0aHJlYWRfY2hlY2tlcl8pOwpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvdnIvdWlfaG9zdC92cl91aV9ob3N0X2ltcGwuaCBiL2Nocm9tZS9icm93c2VyL3ZyL3VpX2hvc3QvdnJfdWlfaG9zdF9pbXBsLmgKaW5kZXggYmYwZjllYjUuLjRhMDAxMDUgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3ZyL3VpX2hvc3QvdnJfdWlfaG9zdF9pbXBsLmgKKysrIGIvY2hyb21lL2Jyb3dzZXIvdnIvdWlfaG9zdC92cl91aV9ob3N0X2ltcGwuaApAQCAtNzMsNiArNzMsNyBAQAogICAvLyBCcm93c2VyWFJSdW50aW1lT2JzZXJ2ZXIgaW1wbGVtZW50YXRpb24uCiAgIHZvaWQgU2V0V2ViWFJXZWJDb250ZW50cyhjb250ZW50OjpXZWJDb250ZW50cyogY29udGVudHMpIG92ZXJyaWRlOwogICB2b2lkIFNldFZSRGlzcGxheUluZm8oZGV2aWNlOjptb2pvbTo6VlJEaXNwbGF5SW5mb1B0ciBkaXNwbGF5X2luZm8pIG92ZXJyaWRlOworICB2b2lkIFNldEZyYW1lc1Rocm90dGxlZChib29sIHRocm90dGxlZCkgb3ZlcnJpZGU7CiAKICAgLy8gSW50ZXJuYWwgbWV0aG9kcyB1c2VkIHRvIHN0YXJ0L3N0b3AgdGhlIFVJIHJlbmRlcmluZyB0aHJlYWQgdGhhdCBpcyB1c2VkCiAgIC8vIGZvciBkcmF3aW5nIGJyb3dzZXIgVUkgKHN1Y2ggYXMgcGVybWlzc2lvbiBwcm9tcHRzKSBmb3IgZGlzcGxheSBpbiBWUi4KQEAgLTEyMCw2ICsxMjEsNyBAQAogICBiYXNlOjpUaW1lIGluZGljYXRvcnNfc2hvd25fc3RhcnRfdGltZV87CiAgIGJvb2wgaW5kaWNhdG9yc192aXNpYmxlXyA9IGZhbHNlOwogICBib29sIGluZGljYXRvcnNfc2hvd2luZ19maXJzdF90aW1lXyA9IHRydWU7CisgIGJvb2wgZnJhbWVzX3Rocm90dGxlZF8gPSBmYWxzZTsKIAogICBtb2pvOjpSZW1vdGU8ZGV2aWNlOjptb2pvbTo6R2VvbG9jYXRpb25Db25maWc+IGdlb2xvY2F0aW9uX2NvbmZpZ187CiAgIGJhc2U6OkNhbmNlbGFibGVDbG9zdXJlIHBvbGxfY2FwdHVyaW5nX3N0YXRlX3Rhc2tfOwpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvdnIvd2luL3ZyX2Jyb3dzZXJfcmVuZGVyZXJfdGhyZWFkX3dpbi5jYyBiL2Nocm9tZS9icm93c2VyL3ZyL3dpbi92cl9icm93c2VyX3JlbmRlcmVyX3RocmVhZF93aW4uY2MKaW5kZXggYTIzNGNmNS4uMjdmMTQ3ZCAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvdnIvd2luL3ZyX2Jyb3dzZXJfcmVuZGVyZXJfdGhyZWFkX3dpbi5jYworKysgYi9jaHJvbWUvYnJvd3Nlci92ci93aW4vdnJfYnJvd3Nlcl9yZW5kZXJlcl90aHJlYWRfd2luLmNjCkBAIC04Nyw3ICs4Nyw3IEBACiAgICAgcmV0dXJuOwogCiAgIGlmIChwcmVzZW50aW5nKSB7Ci0gICAgY29tcG9zaXRvcl8tPkNyZWF0ZUltbWVyc2l2ZU92ZXJsYXkobW9qbzo6TWFrZVJlcXVlc3QoJm92ZXJsYXlfKSk7CisgICAgY29tcG9zaXRvcl8tPkNyZWF0ZUltbWVyc2l2ZU92ZXJsYXkob3ZlcmxheV8uQmluZE5ld1BpcGVBbmRQYXNzUmVjZWl2ZXIoKSk7CiAgICAgU3RhcnRXZWJYclRpbWVvdXQoKTsKICAgfSBlbHNlIHsKICAgICBTdG9wV2ViWHJUaW1lb3V0KCk7CkBAIC05NSwxMiArOTUsMTUgQEAKIH0KIAogdm9pZCBWUkJyb3dzZXJSZW5kZXJlclRocmVhZFdpbjo6U3RhcnRXZWJYclRpbWVvdXQoKSB7Ci0gIHdhaXRpbmdfZm9yX2ZpcnN0X2ZyYW1lXyA9IHRydWU7CisgIGZyYW1lX3RpbWVvdXRfcnVubmluZ18gPSB0cnVlOwogICBvdmVybGF5Xy0+U2V0T3ZlcmxheUFuZFdlYlhSVmlzaWJpbGl0eShkcmF3X3N0YXRlXy5TaG91bGREcmF3VUkoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd19zdGF0ZV8uU2hvdWxkRHJhd1dlYlhSKCkpOwogCi0gIG92ZXJsYXlfLT5SZXF1ZXN0Tm90aWZpY2F0aW9uT25XZWJYclN1Ym1pdHRlZChiYXNlOjpCaW5kT25jZSgKLSAgICAgICZWUkJyb3dzZXJSZW5kZXJlclRocmVhZFdpbjo6T25XZWJYUlN1Ym1pdHRlZCwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOworICBpZiAoIXdhaXRpbmdfZm9yX3dlYnhyX2ZyYW1lXykgeworICAgIHdhaXRpbmdfZm9yX3dlYnhyX2ZyYW1lXyA9IHRydWU7CisgICAgb3ZlcmxheV8tPlJlcXVlc3ROb3RpZmljYXRpb25PbldlYlhyU3VibWl0dGVkKGJhc2U6OkJpbmRPbmNlKAorICAgICAgICAmVlJCcm93c2VyUmVuZGVyZXJUaHJlYWRXaW46Ok9uV2ViWFJTdWJtaXR0ZWQsIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKKyAgfQogCiAgIHdlYnhyX3NwaW5uZXJfdGltZW91dF9jbG9zdXJlXy5SZXNldChiYXNlOjpCaW5kT25jZSgKICAgICAgICZWUkJyb3dzZXJSZW5kZXJlclRocmVhZFdpbjo6T25XZWJYclRpbWVvdXRJbW1pbmVudCwKQEAgLTEyNCw3ICsxMjcsNyBAQAogICBpZiAoIXdlYnhyX2ZyYW1lX3RpbWVvdXRfY2xvc3VyZV8uSXNDYW5jZWxsZWQoKSkKICAgICB3ZWJ4cl9mcmFtZV90aW1lb3V0X2Nsb3N1cmVfLkNhbmNlbCgpOwogICBPblNwaW5uZXJWaXNpYmlsaXR5Q2hhbmdlZChmYWxzZSk7Ci0gIHdhaXRpbmdfZm9yX2ZpcnN0X2ZyYW1lXyA9IGZhbHNlOworICBmcmFtZV90aW1lb3V0X3J1bm5pbmdfID0gZmFsc2U7CiB9CiAKIGludCBWUkJyb3dzZXJSZW5kZXJlclRocmVhZFdpbjo6R2V0TmV4dFJlcXVlc3RJZCgpIHsKQEAgLTE0NCwxNiArMTQ3LDEwIEBACiAgIHNjaGVkdWxlcl91aV8tPk9uV2ViWHJUaW1lZE91dCgpOwogfQogCi12b2lkIFZSQnJvd3NlclJlbmRlcmVyVGhyZWFkV2luOjpTZXRWaXNpYmxlRXh0ZXJuYWxQcm9tcHROb3RpZmljYXRpb24oCi0gICAgRXh0ZXJuYWxQcm9tcHROb3RpZmljYXRpb25UeXBlIHByb21wdCkgewotICBpZiAoIWRyYXdfc3RhdGVfLlNldFByb21wdChwcm9tcHQpKQotICAgIHJldHVybjsKLQordm9pZCBWUkJyb3dzZXJSZW5kZXJlclRocmVhZFdpbjo6VXBkYXRlT3ZlcmxheVN0YXRlKCkgewogICBpZiAoZHJhd19zdGF0ZV8uU2hvdWxkRHJhd1VJKCkpCiAgICAgU3RhcnRPdmVybGF5KCk7CiAKLSAgdWlfLT5TZXRWaXNpYmxlRXh0ZXJuYWxQcm9tcHROb3RpZmljYXRpb24ocHJvbXB0KTsKLQogICBpZiAob3ZlcmxheV8pCiAgICAgb3ZlcmxheV8tPlNldE92ZXJsYXlBbmRXZWJYUlZpc2liaWxpdHkoZHJhd19zdGF0ZV8uU2hvdWxkRHJhd1VJKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd19zdGF0ZV8uU2hvdWxkRHJhd1dlYlhSKCkpOwpAQCAtMTY3LDI2ICsxNjQsNTUgQEAKICAgfQogfQogCi12b2lkIFZSQnJvd3NlclJlbmRlcmVyVGhyZWFkV2luOjpTZXRJbmRpY2F0b3JzVmlzaWJsZShib29sIHZpc2libGUpIHsKLSAgaWYgKCFkcmF3X3N0YXRlXy5TZXRJbmRpY2F0b3JzVmlzaWJsZSh2aXNpYmxlKSkKK3ZvaWQgVlJCcm93c2VyUmVuZGVyZXJUaHJlYWRXaW46OlNldEZyYW1lc1Rocm90dGxlZChib29sIHRocm90dGxlZCkgeworICBpZiAoZnJhbWVzX3Rocm90dGxlZF8gPT0gdGhyb3R0bGVkKQogICAgIHJldHVybjsKIAotICBpZiAoZHJhd19zdGF0ZV8uU2hvdWxkRHJhd1VJKCkpCi0gICAgU3RhcnRPdmVybGF5KCk7CisgIGZyYW1lc190aHJvdHRsZWRfID0gdGhyb3R0bGVkOwogCi0gIGlmIChvdmVybGF5XykKLSAgICBvdmVybGF5Xy0+U2V0T3ZlcmxheUFuZFdlYlhSVmlzaWJpbGl0eShkcmF3X3N0YXRlXy5TaG91bGREcmF3VUkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3X3N0YXRlXy5TaG91bGREcmF3V2ViWFIoKSk7Ci0gIGlmIChkcmF3X3N0YXRlXy5TaG91bGREcmF3VUkoKSkgewotICAgIGlmIChvdmVybGF5XykgIC8vIEZhbHNlIG9ubHkgd2hpbGUgdGVzdGluZwotICAgICAgb3ZlcmxheV8tPlJlcXVlc3ROZXh0T3ZlcmxheVBvc2UoCi0gICAgICAgICAgYmFzZTo6QmluZE9uY2UoJlZSQnJvd3NlclJlbmRlcmVyVGhyZWFkV2luOjpPblBvc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSwgR2V0TmV4dFJlcXVlc3RJZCgpKSk7CisgIGlmIChnX2ZyYW1lX3RpbWVvdXRfdWlfZGlzYWJsZWRfZm9yX3Rlc3RpbmdfKQorICAgIHJldHVybjsKKworICBpZiAoZnJhbWVzX3Rocm90dGxlZF8pIHsKKyAgICBTdG9wV2ViWHJUaW1lb3V0KCk7CisKKyAgICAvLyBUT0RPKGFsY29vcGVyKTogVGhpcyBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIGJlc3QgdGhpbmcgdG8gc2hvdywgYnV0IGl0J3MKKyAgICAvLyB0aGUgYmVzdCB0aGF0IHdlIGhhdmUgcmlnaHQgbm93LiAgSXQgZW5zdXJlcyB0aGF0IHdlIHN1Ym1pdCAqc29tZXRoaW5nKgorICAgIC8vIHJhdGhlciB0aGFuIGxldHRpbmcgdGhlIGRlZmF1bHQgc3lzdGVtICJTdGFsbGVkIiBVSSB0YWtlIG92ZXIsIHdpdGhvdXQKKyAgICAvLyBzaG93aW5nIGEgbWVzc2FnZSB0aGF0IHRoZSBwYWdlIGlzIGJlaGF2aW5nIGJhZGx5LgorICAgIE9uV2ViWHJUaW1lb3V0SW1taW5lbnQoKTsKICAgfSBlbHNlIHsKLSAgICBTdG9wT3ZlcmxheSgpOworICAgIFN0YXJ0V2ViWHJUaW1lb3V0KCk7CiAgIH0KIH0KIAordm9pZCBWUkJyb3dzZXJSZW5kZXJlclRocmVhZFdpbjo6U2V0VmlzaWJsZUV4dGVybmFsUHJvbXB0Tm90aWZpY2F0aW9uKAorICAgIEV4dGVybmFsUHJvbXB0Tm90aWZpY2F0aW9uVHlwZSBwcm9tcHQpIHsKKyAgaWYgKCFkcmF3X3N0YXRlXy5TZXRQcm9tcHQocHJvbXB0KSkKKyAgICByZXR1cm47CisKKyAgVXBkYXRlT3ZlcmxheVN0YXRlKCk7CisKKyAgaWYgKCF1aV8pIHsKKyAgICAvLyBJZiB0aGUgdWkgaXMgZGlzbWlzc2VkLCBtYWtlIHN1cmUgdGhhdCB3ZSBkb24ndCAqYWN0dWFsbHkqIGhhdmUgYSBwcm9tcHQKKyAgICAvLyBzdGF0ZSB0aGF0IHdlIG5lZWRlZCB0byBzZXQuCisgICAgRENIRUNLKHByb21wdCA9PSBFeHRlcm5hbFByb21wdE5vdGlmaWNhdGlvblR5cGU6OmtQcm9tcHROb25lKTsKKyAgICByZXR1cm47CisgIH0KKworICB1aV8tPlNldFZpc2libGVFeHRlcm5hbFByb21wdE5vdGlmaWNhdGlvbihwcm9tcHQpOworfQorCit2b2lkIFZSQnJvd3NlclJlbmRlcmVyVGhyZWFkV2luOjpTZXRJbmRpY2F0b3JzVmlzaWJsZShib29sIHZpc2libGUpIHsKKyAgaWYgKGRyYXdfc3RhdGVfLlNldEluZGljYXRvcnNWaXNpYmxlKHZpc2libGUpKQorICAgIFVwZGF0ZU92ZXJsYXlTdGF0ZSgpOworfQorCit2b2lkIFZSQnJvd3NlclJlbmRlcmVyVGhyZWFkV2luOjpPblNwaW5uZXJWaXNpYmlsaXR5Q2hhbmdlZChib29sIHZpc2libGUpIHsKKyAgaWYgKGRyYXdfc3RhdGVfLlNldFNwaW5uZXJWaXNpYmxlKHZpc2libGUpKQorICAgIFVwZGF0ZU92ZXJsYXlTdGF0ZSgpOworfQorCiB2b2lkIFZSQnJvd3NlclJlbmRlcmVyVGhyZWFkV2luOjpTZXRDYXB0dXJpbmdTdGF0ZSgKICAgICBjb25zdCBDYXB0dXJpbmdTdGF0ZU1vZGVsJiBhY3RpdmVfY2FwdHVyaW5nLAogICAgIGNvbnN0IENhcHR1cmluZ1N0YXRlTW9kZWwmIGJhY2tncm91bmRfY2FwdHVyaW5nLApAQCAtMzEzLDMxICszMzksMTEgQEAKICAgc3RhcnRlZF8gPSB0cnVlOwogfQogCi12b2lkIFZSQnJvd3NlclJlbmRlcmVyVGhyZWFkV2luOjpPblNwaW5uZXJWaXNpYmlsaXR5Q2hhbmdlZChib29sIHZpc2libGUpIHsKLSAgaWYgKCFkcmF3X3N0YXRlXy5TZXRTcGlubmVyVmlzaWJsZSh2aXNpYmxlKSkKLSAgICByZXR1cm47Ci0gIGlmIChkcmF3X3N0YXRlXy5TaG91bGREcmF3VUkoKSkgewotICAgIFN0YXJ0T3ZlcmxheSgpOwotICB9Ci0KLSAgaWYgKG92ZXJsYXlfKSB7Ci0gICAgb3ZlcmxheV8tPlNldE92ZXJsYXlBbmRXZWJYUlZpc2liaWxpdHkoZHJhd19zdGF0ZV8uU2hvdWxkRHJhd1VJKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd19zdGF0ZV8uU2hvdWxkRHJhd1dlYlhSKCkpOwotICB9Ci0KLSAgaWYgKGRyYXdfc3RhdGVfLlNob3VsZERyYXdVSSgpKSB7Ci0gICAgaWYgKG92ZXJsYXlfKSAgLy8gRmFsc2Ugb25seSB3aGlsZSB0ZXN0aW5nLgotICAgICAgb3ZlcmxheV8tPlJlcXVlc3ROZXh0T3ZlcmxheVBvc2UoCi0gICAgICAgICAgYmFzZTo6QmluZE9uY2UoJlZSQnJvd3NlclJlbmRlcmVyVGhyZWFkV2luOjpPblBvc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSwgR2V0TmV4dFJlcXVlc3RJZCgpKSk7Ci0gIH0gZWxzZSB7Ci0gICAgU3RvcE92ZXJsYXkoKTsKLSAgfQotfQotCiB2b2lkIFZSQnJvd3NlclJlbmRlcmVyVGhyZWFkV2luOjpPbldlYlhSU3VibWl0dGVkKCkgeworICB3YWl0aW5nX2Zvcl93ZWJ4cl9mcmFtZV8gPSBmYWxzZTsKICAgaWYgKHNjaGVkdWxlcl91aV8pCiAgICAgc2NoZWR1bGVyX3VpXy0+T25XZWJYckZyYW1lQXZhaWxhYmxlKCk7CisKICAgU3RvcFdlYlhyVGltZW91dCgpOwogfQogCkBAIC00NDgsOCArNDU0LDEyIEBACiAgIGlmICghc3VjY2VzcyAmJiBncmFwaGljc18pIHsKICAgICBncmFwaGljc18tPlJlc2V0TWVtb3J5QnVmZmVyKCk7CiAgIH0KLSAgaWYgKHNjaGVkdWxlcl91aV8gJiYgc3VjY2VzcyAmJiAhd2FpdGluZ19mb3JfZmlyc3RfZnJhbWVfKQorCisgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIG9ubHkgbm90aWZ5IHRoYXQgYSBXZWJYciBmcmFtZSBpcyBub3cKKyAgaWYgKHNjaGVkdWxlcl91aV8gJiYgc3VjY2VzcyAmJiAhZnJhbWVfdGltZW91dF9ydW5uaW5nXykgewogICAgIHNjaGVkdWxlcl91aV8tPk9uV2ViWHJGcmFtZUF2YWlsYWJsZSgpOworICB9CisKICAgaWYgKGRyYXdfc3RhdGVfLlNob3VsZERyYXdVSSgpICYmIHN0YXJ0ZWRfKSB7CiAgICAgb3ZlcmxheV8tPlJlcXVlc3ROZXh0T3ZlcmxheVBvc2UoCiAgICAgICAgIGJhc2U6OkJpbmRPbmNlKCZWUkJyb3dzZXJSZW5kZXJlclRocmVhZFdpbjo6T25Qb3NlLApkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvdnIvd2luL3ZyX2Jyb3dzZXJfcmVuZGVyZXJfdGhyZWFkX3dpbi5oIGIvY2hyb21lL2Jyb3dzZXIvdnIvd2luL3ZyX2Jyb3dzZXJfcmVuZGVyZXJfdGhyZWFkX3dpbi5oCmluZGV4IGNjZjc0NjUuLjk4MWE3MDI5IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci92ci93aW4vdnJfYnJvd3Nlcl9yZW5kZXJlcl90aHJlYWRfd2luLmgKKysrIGIvY2hyb21lL2Jyb3dzZXIvdnIvd2luL3ZyX2Jyb3dzZXJfcmVuZGVyZXJfdGhyZWFkX3dpbi5oCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvYnJvd3Nlci93ZWJfY29udGVudHMuaCIKICNpbmNsdWRlICJkZXZpY2UvdnIvcHVibGljL21vam9tL2lzb2xhdGVkX3hyX3NlcnZpY2UubW9qb20uaCIKICNpbmNsdWRlICJkZXZpY2UvdnIvcHVibGljL21vam9tL3ZyX3NlcnZpY2UubW9qb20uaCIKKyNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvYmluZGluZ3MvcmVtb3RlLmgiCiAKIG5hbWVzcGFjZSB2ciB7CiAKQEAgLTM0LDYgKzM1LDcgQEAKICAgdm9pZCBTZXRWUkRpc3BsYXlJbmZvKGRldmljZTo6bW9qb206OlZSRGlzcGxheUluZm9QdHIgZGlzcGxheV9pbmZvKTsKICAgdm9pZCBTZXRMb2NhdGlvbkluZm8oR1VSTCBndXJsKTsKICAgdm9pZCBTZXRXZWJYclByZXNlbnRpbmcoYm9vbCBwcmVzZW50aW5nKTsKKyAgdm9pZCBTZXRGcmFtZXNUaHJvdHRsZWQoYm9vbCB0aHJvdHRsZWQpOwogCiAgIC8vIFRoZSBiZWxvdyBmdW5jdGlvbihzKSBhZmZlY3Qocykgd2hldGhlciBVSSBpcyBkcmF3biBvciBub3QuCiAgIHZvaWQgU2V0VmlzaWJsZUV4dGVybmFsUHJvbXB0Tm90aWZpY2F0aW9uKApAQCAtODAsNiArODIsOCBAQAogICB2b2lkIFN0b3BXZWJYclRpbWVvdXQoKTsKICAgaW50IEdldE5leHRSZXF1ZXN0SWQoKTsKIAorICB2b2lkIFVwZGF0ZU92ZXJsYXlTdGF0ZSgpOworCiAgIC8vIFdlIG5lZWQgdG8gZG8gc29tZSBpbml0aWFsaXphdGlvbiBvZiBHcmFwaGljc0RlbGVnYXRlV2luIGJlZm9yZQogICAvLyBicm93c2VyX3JlbmRlcmVyXywgc28gd2UgZmlyc3Qgc3RvcmUgaXQgaW4gYSB1bmlxdWVfcHRyLCB0aGVuIHRyYW5zaXRpb24KICAgLy8gb3duZXJzaGlwIHRvIGJyb3dzZXJfcmVuZGVyZXJfLgpAQCAtMTAyLDEwICsxMDYsMTIgQEAKICAgRHJhd1N0YXRlIGRyYXdfc3RhdGVfOwogICBib29sIHN0YXJ0ZWRfID0gZmFsc2U7CiAgIGJvb2wgd2VieHJfcHJlc2VudGluZ18gPSBmYWxzZTsKLSAgYm9vbCB3YWl0aW5nX2Zvcl9maXJzdF9mcmFtZV8gPSB0cnVlOworICBib29sIGZyYW1lX3RpbWVvdXRfcnVubmluZ18gPSB0cnVlOworICBib29sIHdhaXRpbmdfZm9yX3dlYnhyX2ZyYW1lXyA9IGZhbHNlOworICBib29sIGZyYW1lc190aHJvdHRsZWRfID0gZmFsc2U7CiAgIGludCBjdXJyZW50X3JlcXVlc3RfaWRfID0gMDsKIAotICBkZXZpY2U6Om1vam9tOjpJbW1lcnNpdmVPdmVybGF5UHRyIG92ZXJsYXlfOworICBtb2pvOjpSZW1vdGU8ZGV2aWNlOjptb2pvbTo6SW1tZXJzaXZlT3ZlcmxheT4gb3ZlcmxheV87CiAgIGRldmljZTo6bW9qb206OlZSRGlzcGxheUluZm9QdHIgZGlzcGxheV9pbmZvXzsKIAogICBiYXNlOjpDYW5jZWxhYmxlT25jZUNsb3N1cmUgd2VieHJfZnJhbWVfdGltZW91dF9jbG9zdXJlXzsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvQlVJTEQuZ24gYi9jaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL0JVSUxELmduCmluZGV4IDg3ZDA5OTljLi4zNTM4ODAyIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL0JVSUxELmduCisrKyBiL2Nocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvQlVJTEQuZ24KQEAgLTQzLDggKzQzLDExIEBACiAgICAgIndlYl9hcHBfcmVnaXN0cmFyLmgiLAogICAgICJ3ZWJfYXBwX3JlZ2lzdHJ5X3VwZGF0ZS5jYyIsCiAgICAgIndlYl9hcHBfcmVnaXN0cnlfdXBkYXRlLmgiLAorICAgICJ3ZWJfYXBwX3Nob3J0Y3V0X21hbmFnZXIuY2MiLAorICAgICJ3ZWJfYXBwX3Nob3J0Y3V0X21hbmFnZXIuaCIsCiAgICAgIndlYl9hcHBfc3luY19icmlkZ2UuY2MiLAogICAgICJ3ZWJfYXBwX3N5bmNfYnJpZGdlLmgiLAorICAgICJ3ZWJfYXBwX3N5bmNfaW5zdGFsbF9kZWxlZ2F0ZS5oIiwKICAgXQogCiAgIGRlcHMgPSBbCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL2NvbXBvbmVudHMvQlVJTEQuZ24gYi9jaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL2NvbXBvbmVudHMvQlVJTEQuZ24KaW5kZXggNzc0ZjFjMC4uODIxYjc4ZjcgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvY29tcG9uZW50cy9CVUlMRC5nbgorKysgYi9jaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL2NvbXBvbmVudHMvQlVJTEQuZ24KQEAgLTExLDYgKzExLDggQEAKICAgICAiYXBwX3JlZ2lzdHJhcl9vYnNlcnZlci5oIiwKICAgICAiYXBwX3JlZ2lzdHJ5X2NvbnRyb2xsZXIuY2MiLAogICAgICJhcHBfcmVnaXN0cnlfY29udHJvbGxlci5oIiwKKyAgICAiYXBwX3Nob3J0Y3V0X21hbmFnZXIuY2MiLAorICAgICJhcHBfc2hvcnRjdXRfbWFuYWdlci5oIiwKICAgICAiZXh0ZXJuYWxfaW5zdGFsbF9vcHRpb25zLmNjIiwKICAgICAiZXh0ZXJuYWxfaW5zdGFsbF9vcHRpb25zLmgiLAogICAgICJleHRlcm5hbGx5X2luc3RhbGxlZF93ZWJfYXBwX3ByZWZzLmNjIiwKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvY29tcG9uZW50cy9hcHBfc2hvcnRjdXRfbWFuYWdlci5jYyBiL2Nocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvY29tcG9uZW50cy9hcHBfc2hvcnRjdXRfbWFuYWdlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTVjZTUyCi0tLSAvZGV2L251bGwKKysrIGIvY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy9jb21wb25lbnRzL2FwcF9zaG9ydGN1dF9tYW5hZ2VyLmNjCkBAIC0wLDAgKzEsMTcgQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvY29tcG9uZW50cy9hcHBfc2hvcnRjdXRfbWFuYWdlci5oIgorCituYW1lc3BhY2Ugd2ViX2FwcCB7CisKK0FwcFNob3J0Y3V0TWFuYWdlcjo6QXBwU2hvcnRjdXRNYW5hZ2VyKFByb2ZpbGUqIHByb2ZpbGUpIDogcHJvZmlsZV8ocHJvZmlsZSkge30KKworQXBwU2hvcnRjdXRNYW5hZ2VyOjp+QXBwU2hvcnRjdXRNYW5hZ2VyKCkgPSBkZWZhdWx0OworCit2b2lkIEFwcFNob3J0Y3V0TWFuYWdlcjo6U2V0U3Vic3lzdGVtcyhBcHBSZWdpc3RyYXIqIHJlZ2lzdHJhcikgeworICByZWdpc3RyYXJfID0gcmVnaXN0cmFyOworfQorCit9ICAvLyBuYW1lc3BhY2Ugd2ViX2FwcApkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy9jb21wb25lbnRzL2FwcF9zaG9ydGN1dF9tYW5hZ2VyLmggYi9jaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL2NvbXBvbmVudHMvYXBwX3Nob3J0Y3V0X21hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjI5ZDdmYQotLS0gL2Rldi9udWxsCisrKyBiL2Nocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvY29tcG9uZW50cy9hcHBfc2hvcnRjdXRfbWFuYWdlci5oCkBAIC0wLDAgKzEsNDAgQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2lmbmRlZiBDSFJPTUVfQlJPV1NFUl9XRUJfQVBQTElDQVRJT05TX0NPTVBPTkVOVFNfQVBQX1NIT1JUQ1VUX01BTkFHRVJfSF8KKyNkZWZpbmUgQ0hST01FX0JST1dTRVJfV0VCX0FQUExJQ0FUSU9OU19DT01QT05FTlRTX0FQUF9TSE9SVENVVF9NQU5BR0VSX0hfCisKKyNpbmNsdWRlICJiYXNlL21hY3Jvcy5oIgorCitjbGFzcyBQcm9maWxlOworCituYW1lc3BhY2Ugd2ViX2FwcCB7CisKK2NsYXNzIEFwcFJlZ2lzdHJhcjsKKworLy8gVE9ETyhjcmJ1Zy5jb20vODYwNTgxKTogTWlncmF0ZSBmdW5jdGlvbnMgZnJvbQorLy8gd2ViX2FwcF9leHRlbnNpb25fc2hvcnRjdXQuKGh8Y2MpIGFuZAorLy8gcGxhdGZvcm1fYXBwcy9zaG9ydGN1dF9tYW5hZ2VyLihofGNjKSB0byB0aGUgQXBwU2hvcnRjdXRNYW5hZ2VyLCBzbyB3ZWIgYXBwCisvLyBzaG9ydGN1dHMgY2FuIGJlIG1hbmFnZWQgaW4gYW4gZXh0ZW5zaW9ucyBhZ25vc3RpYyB3YXkuCitjbGFzcyBBcHBTaG9ydGN1dE1hbmFnZXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQXBwU2hvcnRjdXRNYW5hZ2VyKFByb2ZpbGUqIHByb2ZpbGUpOworICB2aXJ0dWFsIH5BcHBTaG9ydGN1dE1hbmFnZXIoKTsKKworICB2b2lkIFNldFN1YnN5c3RlbXMoQXBwUmVnaXN0cmFyKiByZWdpc3RyYXIpOworCisgcHJvdGVjdGVkOgorICBBcHBSZWdpc3RyYXIqIHJlZ2lzdHJhcigpIHsgcmV0dXJuIHJlZ2lzdHJhcl87IH0KKyAgUHJvZmlsZSogcHJvZmlsZSgpIHsgcmV0dXJuIHByb2ZpbGVfOyB9CisKKyBwcml2YXRlOgorICBBcHBSZWdpc3RyYXIqIHJlZ2lzdHJhcl8gPSBudWxscHRyOworICBQcm9maWxlKiBjb25zdCBwcm9maWxlXzsKKworICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQXBwU2hvcnRjdXRNYW5hZ2VyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB3ZWJfYXBwCisKKyNlbmRpZiAgLy8gQ0hST01FX0JST1dTRVJfV0VCX0FQUExJQ0FUSU9OU19DT01QT05FTlRTX0FQUF9TSE9SVENVVF9NQU5BR0VSX0hfCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL2NvbXBvbmVudHMvd2ViX2FwcF9jb25zdGFudHMuaCBiL2Nocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvY29tcG9uZW50cy93ZWJfYXBwX2NvbnN0YW50cy5oCmluZGV4IDVhNmIxMDAuLjYxZDI0MTkgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvY29tcG9uZW50cy93ZWJfYXBwX2NvbnN0YW50cy5oCisrKyBiL2Nocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvY29tcG9uZW50cy93ZWJfYXBwX2NvbnN0YW50cy5oCkBAIC0xOSw2ICsxOSw5IEBACiAgIGtTeXN0ZW0gPSBrTWluVmFsdWUsCiAgIGtQb2xpY3ksCiAgIGtXZWJBcHBTdG9yZSwKKyAgLy8gV2Ugc3luYyBvbmx5IHJlZ3VsYXIgdXNlci1pbnN0YWxsZWQgYXBwcyBmcm9tIHRoZSBvcGVuIHdlYi4gRm9yCisgIC8vIHVzZXItaW5zdGFsbGVkIGFwcHMgd2l0aG91dCBvdmVybGFwcyB0aGlzIGlzIHRoZSBvbmx5IHNvdXJjZSB0aGF0IHdpbGwgYmUKKyAgLy8gc2V0LgogICBrU3luYywKICAga0RlZmF1bHQsCiAgIGtNYXhWYWx1ZQpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy9jb21wb25lbnRzL3dlYl9hcHBfcHJvdmlkZXJfYmFzZS5oIGIvY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy9jb21wb25lbnRzL3dlYl9hcHBfcHJvdmlkZXJfYmFzZS5oCmluZGV4IGQ2MWE3ZmMuLjNkOGM3MTQ1IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL2NvbXBvbmVudHMvd2ViX2FwcF9wcm92aWRlcl9iYXNlLmgKKysrIGIvY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy9jb21wb25lbnRzL3dlYl9hcHBfcHJvdmlkZXJfYmFzZS5oCkBAIC0yMCw2ICsyMCw3IEBACiBjbGFzcyBBcHBSZWdpc3RyeUNvbnRyb2xsZXI7CiBjbGFzcyBGaWxlSGFuZGxlck1hbmFnZXI7CiBjbGFzcyBBcHBJY29uTWFuYWdlcjsKK2NsYXNzIEFwcFNob3J0Y3V0TWFuYWdlcjsKIGNsYXNzIFdlYkFwcFBvbGljeU1hbmFnZXI7CiBjbGFzcyBNYW5pZmVzdFVwZGF0ZU1hbmFnZXI7CiBjbGFzcyBXZWJBcHBBdWRpb0ZvY3VzSWRNYXA7CkBAIC01OCw2ICs1OSw4IEBACiAgIC8vIEltcGxlbWVudHMgZmV0Y2hpbmcgb2YgYXBwIGljb25zLgogICB2aXJ0dWFsIEFwcEljb25NYW5hZ2VyJiBpY29uX21hbmFnZXIoKSA9IDA7CiAKKyAgdmlydHVhbCBBcHBTaG9ydGN1dE1hbmFnZXImIHNob3J0Y3V0X21hbmFnZXIoKSA9IDA7CisKICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFdlYkFwcFByb3ZpZGVyQmFzZSk7CiB9OwogCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL2V4dGVuc2lvbnMvQlVJTEQuZ24gYi9jaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL2V4dGVuc2lvbnMvQlVJTEQuZ24KaW5kZXggOTEzMTcwM2EuLjY2OTk5YjQgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvZXh0ZW5zaW9ucy9CVUlMRC5nbgorKysgYi9jaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL2V4dGVuc2lvbnMvQlVJTEQuZ24KQEAgLTIwLDYgKzIwLDggQEAKICAgICAiYm9va21hcmtfYXBwX3JlZ2lzdHJhci5oIiwKICAgICAiYm9va21hcmtfYXBwX3JlZ2lzdHJ5X2NvbnRyb2xsZXIuY2MiLAogICAgICJib29rbWFya19hcHBfcmVnaXN0cnlfY29udHJvbGxlci5oIiwKKyAgICAiYm9va21hcmtfYXBwX3Nob3J0Y3V0X21hbmFnZXIuY2MiLAorICAgICJib29rbWFya19hcHBfc2hvcnRjdXRfbWFuYWdlci5oIiwKICAgICAiYm9va21hcmtfYXBwX3V0aWwuY2MiLAogICAgICJib29rbWFya19hcHBfdXRpbC5oIiwKICAgICAid2ViX2FwcF9leHRlbnNpb25fc2hvcnRjdXQuY2MiLApkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy9leHRlbnNpb25zL2Jvb2ttYXJrX2FwcF9zaG9ydGN1dF9tYW5hZ2VyLmNjIGIvY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy9leHRlbnNpb25zL2Jvb2ttYXJrX2FwcF9zaG9ydGN1dF9tYW5hZ2VyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYTE4YzkKLS0tIC9kZXYvbnVsbAorKysgYi9jaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL2V4dGVuc2lvbnMvYm9va21hcmtfYXBwX3Nob3J0Y3V0X21hbmFnZXIuY2MKQEAgLTAsMCArMSwxNCBAQAorLy8gQ29weXJpZ2h0IDIwMTkgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy9leHRlbnNpb25zL2Jvb2ttYXJrX2FwcF9zaG9ydGN1dF9tYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBleHRlbnNpb25zIHsKKworQm9va21hcmtBcHBTaG9ydGN1dE1hbmFnZXI6OkJvb2ttYXJrQXBwU2hvcnRjdXRNYW5hZ2VyKFByb2ZpbGUqIHByb2ZpbGUpCisgICAgOiB3ZWJfYXBwOjpBcHBTaG9ydGN1dE1hbmFnZXIocHJvZmlsZSkge30KKworQm9va21hcmtBcHBTaG9ydGN1dE1hbmFnZXI6On5Cb29rbWFya0FwcFNob3J0Y3V0TWFuYWdlcigpID0gZGVmYXVsdDsKKworfSAgLy8gbmFtZXNwYWNlIGV4dGVuc2lvbnMKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvZXh0ZW5zaW9ucy9ib29rbWFya19hcHBfc2hvcnRjdXRfbWFuYWdlci5oIGIvY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy9leHRlbnNpb25zL2Jvb2ttYXJrX2FwcF9zaG9ydGN1dF9tYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI2YTgxYzEKLS0tIC9kZXYvbnVsbAorKysgYi9jaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL2V4dGVuc2lvbnMvYm9va21hcmtfYXBwX3Nob3J0Y3V0X21hbmFnZXIuaApAQCAtMCwwICsxLDI2IEBACisvLyBDb3B5cmlnaHQgMjAxOSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpZm5kZWYgQ0hST01FX0JST1dTRVJfV0VCX0FQUExJQ0FUSU9OU19FWFRFTlNJT05TX0JPT0tNQVJLX0FQUF9TSE9SVENVVF9NQU5BR0VSX0hfCisjZGVmaW5lIENIUk9NRV9CUk9XU0VSX1dFQl9BUFBMSUNBVElPTlNfRVhURU5TSU9OU19CT09LTUFSS19BUFBfU0hPUlRDVVRfTUFOQUdFUl9IXworCisjaW5jbHVkZSAiYmFzZS9tYWNyb3MuaCIKKyNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL2NvbXBvbmVudHMvYXBwX3Nob3J0Y3V0X21hbmFnZXIuaCIKKworY2xhc3MgUHJvZmlsZTsKKworbmFtZXNwYWNlIGV4dGVuc2lvbnMgeworCitjbGFzcyBCb29rbWFya0FwcFNob3J0Y3V0TWFuYWdlciA6IHB1YmxpYyB3ZWJfYXBwOjpBcHBTaG9ydGN1dE1hbmFnZXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQm9va21hcmtBcHBTaG9ydGN1dE1hbmFnZXIoUHJvZmlsZSogcHJvZmlsZSk7CisgIH5Cb29rbWFya0FwcFNob3J0Y3V0TWFuYWdlcigpIG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEJvb2ttYXJrQXBwU2hvcnRjdXRNYW5hZ2VyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBleHRlbnNpb25zCisKKyNlbmRpZiAgLy8gQ0hST01FX0JST1dTRVJfV0VCX0FQUExJQ0FUSU9OU19FWFRFTlNJT05TX0JPT0tNQVJLX0FQUF9TSE9SVENVVF9NQU5BR0VSX0hfCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL2V4dGVuc2lvbnMvd2ViX2FwcF9leHRlbnNpb25fc2hvcnRjdXQuY2MgYi9jaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL2V4dGVuc2lvbnMvd2ViX2FwcF9leHRlbnNpb25fc2hvcnRjdXQuY2MKaW5kZXggNzFmYTVkZC4uNzRhZmFjOTIgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvZXh0ZW5zaW9ucy93ZWJfYXBwX2V4dGVuc2lvbl9zaG9ydGN1dC5jYworKysgYi9jaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL2V4dGVuc2lvbnMvd2ViX2FwcF9leHRlbnNpb25fc2hvcnRjdXQuY2MKQEAgLTI1NSwxMyArMjU1LDYgQEAKICAgcmV0dXJuIHJlYXNvbiA9PSBTSE9SVENVVF9DUkVBVElPTl9CWV9VU0VSOwogfQogCi1iYXNlOjpGaWxlUGF0aCBHZXRXZWJBcHBEYXRhRGlyZWN0b3J5KGNvbnN0IGJhc2U6OkZpbGVQYXRoJiBwcm9maWxlX3BhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4dGVuc2lvbnM6OkV4dGVuc2lvbiYgZXh0ZW5zaW9uKSB7Ci0gIHJldHVybiBHZXRXZWJBcHBEYXRhRGlyZWN0b3J5KAotICAgICAgcHJvZmlsZV9wYXRoLCBleHRlbnNpb24uaWQoKSwKLSAgICAgIEdVUkwoZXh0ZW5zaW9uczo6QXBwTGF1bmNoSW5mbzo6R2V0TGF1bmNoV2ViVVJMKCZleHRlbnNpb24pKSk7Ci19Ci0KIHZvaWQgQ3JlYXRlU2hvcnRjdXRzKFNob3J0Y3V0Q3JlYXRpb25SZWFzb24gcmVhc29uLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2hvcnRjdXRMb2NhdGlvbnMmIGxvY2F0aW9ucywKICAgICAgICAgICAgICAgICAgICAgIFByb2ZpbGUqIHByb2ZpbGUsCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL2V4dGVuc2lvbnMvd2ViX2FwcF9leHRlbnNpb25fc2hvcnRjdXQuaCBiL2Nocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvZXh0ZW5zaW9ucy93ZWJfYXBwX2V4dGVuc2lvbl9zaG9ydGN1dC5oCmluZGV4IGIwMGE4YmEuLmE5MmUyMzQgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvZXh0ZW5zaW9ucy93ZWJfYXBwX2V4dGVuc2lvbl9zaG9ydGN1dC5oCisrKyBiL2Nocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvZXh0ZW5zaW9ucy93ZWJfYXBwX2V4dGVuc2lvbl9zaG9ydGN1dC5oCkBAIC01NCwxMSArNTQsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9maWxlKiBwcm9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleHRlbnNpb25zOjpFeHRlbnNpb24qIGV4dGVuc2lvbik7CiAKLS8vIEdldHMgdGhlIHVzZXIgZGF0YSBkaXJlY3RvcnkgdG8gdXNlIGZvciB8ZXh0ZW5zaW9ufCBsb2NhdGVkIGluc2lkZQotLy8gfHByb2ZpbGVfcGF0aHwuCi1iYXNlOjpGaWxlUGF0aCBHZXRXZWJBcHBEYXRhRGlyZWN0b3J5KGNvbnN0IGJhc2U6OkZpbGVQYXRoJiBwcm9maWxlX3BhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4dGVuc2lvbnM6OkV4dGVuc2lvbiYgZXh0ZW5zaW9uKTsKLQogLy8gQ3JlYXRlcyBzaG9ydGN1dHMgZm9yIGFuIGFwcC4gVGhpcyBsb2FkcyB0aGUgYXBwJ3MgaWNvbiBmcm9tIGRpc2ssIGFuZCBjYWxscwogLy8gQ3JlYXRlU2hvcnRjdXRzV2l0aEluZm8oKS4gSWYgeW91IGFscmVhZHkgaGF2ZSBhIFNob3J0Y3V0SW5mbyB3aXRoIHRoZSBhcHAncwogLy8gaWNvbiBsb2FkZWQsIHlvdSBzaG91bGQgdXNlIENyZWF0ZVNob3J0Y3V0c1dpdGhJbmZvKCkgZGlyZWN0bHkuCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL3Rlc3QvdGVzdF93ZWJfYXBwX3JlZ2lzdHJ5X2NvbnRyb2xsZXIuY2MgYi9jaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL3Rlc3QvdGVzdF93ZWJfYXBwX3JlZ2lzdHJ5X2NvbnRyb2xsZXIuY2MKaW5kZXggYjJlMzU5MC4uODEwNjBhNCAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy90ZXN0L3Rlc3Rfd2ViX2FwcF9yZWdpc3RyeV9jb250cm9sbGVyLmNjCisrKyBiL2Nocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvdGVzdC90ZXN0X3dlYl9hcHBfcmVnaXN0cnlfY29udHJvbGxlci5jYwpAQCAtNyw2ICs3LDcgQEAKICNpbmNsdWRlICJiYXNlL3J1bl9sb29wLmgiCiAjaW5jbHVkZSAiYmFzZS90ZXN0L2JpbmRfdGVzdF91dGlsLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy90ZXN0L3Rlc3Rfd2ViX2FwcF9kYXRhYmFzZV9mYWN0b3J5LmgiCisjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy93ZWJfYXBwLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy93ZWJfYXBwX3JlZ2lzdHJ5X3VwZGF0ZS5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvd2ViX2FwcF9zeW5jX2JyaWRnZS5oIgogCkBAIC0yMSw3ICsyMiw3IEBACiAgIG11dGFibGVfcmVnaXN0cmFyXyA9IHN0ZDo6bWFrZV91bmlxdWU8V2ViQXBwUmVnaXN0cmFyTXV0YWJsZT4ocHJvZmlsZSk7CiAKICAgc3luY19icmlkZ2VfID0gc3RkOjptYWtlX3VuaXF1ZTxXZWJBcHBTeW5jQnJpZGdlPigKLSAgICAgIHByb2ZpbGUsIGRhdGFiYXNlX2ZhY3RvcnlfLmdldCgpLCBtdXRhYmxlX3JlZ2lzdHJhcl8uZ2V0KCksCisgICAgICBwcm9maWxlLCBkYXRhYmFzZV9mYWN0b3J5Xy5nZXQoKSwgbXV0YWJsZV9yZWdpc3RyYXJfLmdldCgpLCB0aGlzLAogICAgICAgbW9ja19wcm9jZXNzb3JfLkNyZWF0ZUZvcndhcmRpbmdQcm9jZXNzb3IoKSk7CiAKICAgT05fQ0FMTChwcm9jZXNzb3IoKSwgSXNUcmFja2luZ01ldGFkYXRhKCkpCkBAIC01MSw2ICs1MiwxMiBAQAogICAgIHVwZGF0ZS0+RGVsZXRlQXBwKGFwcF9pZCk7CiB9CiAKK3ZvaWQgVGVzdFdlYkFwcFJlZ2lzdHJ5Q29udHJvbGxlcjo6SW5zdGFsbFdlYkFwcHNBZnRlclN5bmMoCisgICAgc3RkOjp2ZWN0b3I8V2ViQXBwKj4gd2ViX2FwcHMpIHt9CisKK3ZvaWQgVGVzdFdlYkFwcFJlZ2lzdHJ5Q29udHJvbGxlcjo6VW5pbnN0YWxsV2ViQXBwc0FmdGVyU3luYygKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8V2ViQXBwPj4gd2ViX2FwcHMpIHt9CisKIHZvaWQgVGVzdFdlYkFwcFJlZ2lzdHJ5Q29udHJvbGxlcjo6RGVzdHJveVN1YnN5c3RlbXMoKSB7CiAgIG11dGFibGVfcmVnaXN0cmFyXy5yZXNldCgpOwogICBzeW5jX2JyaWRnZV8ucmVzZXQoKTsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvdGVzdC90ZXN0X3dlYl9hcHBfcmVnaXN0cnlfY29udHJvbGxlci5oIGIvY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy90ZXN0L3Rlc3Rfd2ViX2FwcF9yZWdpc3RyeV9jb250cm9sbGVyLmgKaW5kZXggN2Q5Nzc3MC4uMzIyYzQ3M2EgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvdGVzdC90ZXN0X3dlYl9hcHBfcmVnaXN0cnlfY29udHJvbGxlci5oCisrKyBiL2Nocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvdGVzdC90ZXN0X3dlYl9hcHBfcmVnaXN0cnlfY29udHJvbGxlci5oCkBAIC05LDYgKzksNyBAQAogCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy9jb21wb25lbnRzL3dlYl9hcHBfaGVscGVycy5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvd2ViX2FwcF9yZWdpc3RyYXIuaCIKKyNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL3dlYl9hcHBfc3luY19pbnN0YWxsX2RlbGVnYXRlLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9zeW5jL21vZGVsL21vY2tfbW9kZWxfdHlwZV9jaGFuZ2VfcHJvY2Vzc29yLmgiCiAjaW5jbHVkZSAidGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLmgiCiAKQEAgLTIwLDcgKzIxLDcgQEAKIGNsYXNzIFdlYkFwcFN5bmNCcmlkZ2U7CiBjbGFzcyBXZWJBcHA7CiAKLWNsYXNzIFRlc3RXZWJBcHBSZWdpc3RyeUNvbnRyb2xsZXIgeworY2xhc3MgVGVzdFdlYkFwcFJlZ2lzdHJ5Q29udHJvbGxlciA6IHB1YmxpYyBTeW5jSW5zdGFsbERlbGVnYXRlIHsKICBwdWJsaWM6CiAgIFRlc3RXZWJBcHBSZWdpc3RyeUNvbnRyb2xsZXIoKTsKICAgflRlc3RXZWJBcHBSZWdpc3RyeUNvbnRyb2xsZXIoKTsKQEAgLTM1LDYgKzM2LDExIEBACiAgIHZvaWQgVW5yZWdpc3RlckFwcChjb25zdCBBcHBJZCYgYXBwX2lkKTsKICAgdm9pZCBVbnJlZ2lzdGVyQWxsKCk7CiAKKyAgLy8gU3luY0luc3RhbGxEZWxlZ2F0ZToKKyAgdm9pZCBJbnN0YWxsV2ViQXBwc0FmdGVyU3luYyhzdGQ6OnZlY3RvcjxXZWJBcHAqPiB3ZWJfYXBwcykgb3ZlcnJpZGU7CisgIHZvaWQgVW5pbnN0YWxsV2ViQXBwc0FmdGVyU3luYygKKyAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxXZWJBcHA+PiB3ZWJfYXBwcykgb3ZlcnJpZGU7CisKICAgdm9pZCBEZXN0cm95U3Vic3lzdGVtcygpOwogCiAgIFRlc3RXZWJBcHBEYXRhYmFzZUZhY3RvcnkmIGRhdGFiYXNlX2ZhY3RvcnkoKSB7IHJldHVybiAqZGF0YWJhc2VfZmFjdG9yeV87IH0KZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvd2ViX2FwcC5oIGIvY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy93ZWJfYXBwLmgKaW5kZXggZmE2ODg4Yi4uYTJlZWNjYjIgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvd2ViX2FwcC5oCisrKyBiL2Nocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvd2ViX2FwcC5oCkBAIC0zMyw2ICszMyw5IEBACiAgIGNvbnN0IEdVUkwmIHNjb3BlKCkgY29uc3QgeyByZXR1cm4gc2NvcGVfOyB9CiAgIGNvbnN0IGJhc2U6Ok9wdGlvbmFsPFNrQ29sb3I+JiB0aGVtZV9jb2xvcigpIGNvbnN0IHsgcmV0dXJuIHRoZW1lX2NvbG9yXzsgfQogICBibGluazo6bW9qb206OkRpc3BsYXlNb2RlIGRpc3BsYXlfbW9kZSgpIGNvbnN0IHsgcmV0dXJuIGRpc3BsYXlfbW9kZV87IH0KKyAgLy8gTG9jYWxseSBpbnN0YWxsZWQgYXBwcyBoYXZlIHNob3J0Y3V0cyBpbnN0YWxsZWQgb24gdmFyaW91cyBVSSBzdXJmYWNlcy4KKyAgLy8gSWYgYXBwIGlzbid0IGxvY2FsbHkgaW5zdGFsbGVkLCBpdCBpcyBleGNsdWRlZCBmcm9tIFVJcyBhbmQgb25seSBsaXN0ZWQgYXMKKyAgLy8gYSBwYXJ0IG9mIHVzZXIncyBhcHAgbGlicmFyeS4KICAgYm9vbCBpc19sb2NhbGx5X2luc3RhbGxlZCgpIGNvbnN0IHsgcmV0dXJuIGlzX2xvY2FsbHlfaW5zdGFsbGVkXzsgfQogICAvLyBTeW5jLWluaXRpYXRlZCBpbnN0YWxsYXRpb24gcHJvZHVjZXMgYSBzeW5jIHBsYWNlaG9sZGVyIGFwcCBhd2FpdGluZyBmb3IKICAgLy8gZnVsbCBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gVGhlIHN5bmMgcGxhY2Vob2xkZXIgYXBwIGhhcyBvbmx5IGFwcF9pZCwKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvd2ViX2FwcF9kYXRhYmFzZS5jYyBiL2Nocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvd2ViX2FwcF9kYXRhYmFzZS5jYwppbmRleCA4N2M2ZWIwLi4wMDBmNjU3IDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL3dlYl9hcHBfZGF0YWJhc2UuY2MKKysrIGIvY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy93ZWJfYXBwX2RhdGFiYXNlLmNjCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy93ZWJfYXBwX3JlZ2lzdHJ5X3VwZGF0ZS5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvc3luYy9iYXNlL21vZGVsX3R5cGUuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL3N5bmMvbW9kZWwvbWV0YWRhdGFfYmF0Y2guaCIKKyNpbmNsdWRlICJjb21wb25lbnRzL3N5bmMvbW9kZWwvbWV0YWRhdGFfY2hhbmdlX2xpc3QuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL3N5bmMvbW9kZWwvbW9kZWxfZXJyb3IuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvbW9qb20vbWFuaWZlc3QvZGlzcGxheV9tb2RlLm1vam9tLmgiCiAKQEAgLTUwLDE0ICs1MSwxOCBAQAogICB3cml0ZV9iYXRjaF8gPSBzdG9yZV8tPkNyZWF0ZVdyaXRlQmF0Y2goKTsKIH0KIAotdm9pZCBXZWJBcHBEYXRhYmFzZTo6Q29tbWl0VHJhbnNhY3Rpb24oY29uc3QgUmVnaXN0cnlVcGRhdGVEYXRhJiB1cGRhdGVfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBsZXRpb25DYWxsYmFjayBjYWxsYmFjaykgewordm9pZCBXZWJBcHBEYXRhYmFzZTo6Q29tbWl0VHJhbnNhY3Rpb24oCisgICAgY29uc3QgUmVnaXN0cnlVcGRhdGVEYXRhJiB1cGRhdGVfZGF0YSwKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8c3luY2VyOjpNZXRhZGF0YUNoYW5nZUxpc3Q+IG1ldGFkYXRhX2NoYW5nZV9saXN0LAorICAgIENvbXBsZXRpb25DYWxsYmFjayBjYWxsYmFjaykgewogICBEQ0hFQ0tfQ0FMTEVEX09OX1ZBTElEX1NFUVVFTkNFKHNlcXVlbmNlX2NoZWNrZXJfKTsKICAgRENIRUNLKG9wZW5lZF8pOwogCiAgIERDSEVDSyh3cml0ZV9iYXRjaF8pOwogICBEQ0hFQ0soIXVwZGF0ZV9kYXRhLklzRW1wdHkoKSk7CiAKKyAgd3JpdGVfYmF0Y2hfLT5UYWtlTWV0YWRhdGFDaGFuZ2VzRnJvbShzdGQ6Om1vdmUobWV0YWRhdGFfY2hhbmdlX2xpc3QpKTsKKwogICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxXZWJBcHA+JiB3ZWJfYXBwIDogdXBkYXRlX2RhdGEuYXBwc190b19jcmVhdGUpIHsKICAgICBhdXRvIHByb3RvID0gQ3JlYXRlV2ViQXBwUHJvdG8oKndlYl9hcHApOwogICAgIHdyaXRlX2JhdGNoXy0+V3JpdGVEYXRhKHdlYl9hcHAtPmFwcF9pZCgpLCBwcm90by0+U2VyaWFsaXplQXNTdHJpbmcoKSk7CmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL3dlYl9hcHBfZGF0YWJhc2UuaCBiL2Nocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvd2ViX2FwcF9kYXRhYmFzZS5oCmluZGV4IDRlZmU2OWUuLjA3ZTdkZTcgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvd2ViX2FwcF9kYXRhYmFzZS5oCisrKyBiL2Nocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvd2ViX2FwcF9kYXRhYmFzZS5oCkBAIC0yMSw2ICsyMSw3IEBACiBuYW1lc3BhY2Ugc3luY2VyIHsKIGNsYXNzIE1vZGVsRXJyb3I7CiBjbGFzcyBNZXRhZGF0YUJhdGNoOworY2xhc3MgTWV0YWRhdGFDaGFuZ2VMaXN0OwogfSAgLy8gbmFtZXNwYWNlIHN5bmNlcgogCiBuYW1lc3BhY2Ugd2ViX2FwcCB7CkBAIC00OSw4ICs1MCwxMCBAQAogICB1c2luZyBDb21wbGV0aW9uQ2FsbGJhY2sgPSBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZChib29sIHN1Y2Nlc3MpPjsKICAgLy8gVGhlcmUgY2FuIGJlIG9ubHkgMSB0cmFuc2FjdGlvbiBhdCBhIHRpbWUuCiAgIHZvaWQgQmVnaW5UcmFuc2FjdGlvbigpOwotICB2b2lkIENvbW1pdFRyYW5zYWN0aW9uKGNvbnN0IFJlZ2lzdHJ5VXBkYXRlRGF0YSYgdXBkYXRlX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGxldGlvbkNhbGxiYWNrIGNhbGxiYWNrKTsKKyAgdm9pZCBDb21taXRUcmFuc2FjdGlvbigKKyAgICAgIGNvbnN0IFJlZ2lzdHJ5VXBkYXRlRGF0YSYgdXBkYXRlX2RhdGEsCisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8c3luY2VyOjpNZXRhZGF0YUNoYW5nZUxpc3Q+IG1ldGFkYXRhX2NoYW5nZV9saXN0LAorICAgICAgQ29tcGxldGlvbkNhbGxiYWNrIGNhbGxiYWNrKTsKICAgdm9pZCBDYW5jZWxUcmFuc2FjdGlvbigpOwogCiAgIC8vIEV4cG9zZWQgZm9yIHRlc3RpbmcuCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL3dlYl9hcHBfaW5zdGFsbF9tYW5hZ2VyLmNjIGIvY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy93ZWJfYXBwX2luc3RhbGxfbWFuYWdlci5jYwppbmRleCBhODNlNWJhLi5mMGUyZmYwIDEwMDY0NAotLS0gYS9jaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL3dlYl9hcHBfaW5zdGFsbF9tYW5hZ2VyLmNjCisrKyBiL2Nocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvd2ViX2FwcF9pbnN0YWxsX21hbmFnZXIuY2MKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL2NvbXBvbmVudHMvd2ViX2FwcF9jb25zdGFudHMuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL2NvbXBvbmVudHMvd2ViX2FwcF9kYXRhX3JldHJpZXZlci5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvY29tcG9uZW50cy93ZWJfYXBwX3V0aWxzLmgiCisjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy93ZWJfYXBwLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy93ZWJfYXBwX2luc3RhbGxfdGFzay5oIgogI2luY2x1ZGUgImNocm9tZS9jb21tb24vd2ViX2FwcGxpY2F0aW9uX2luZm8uaCIKICNpbmNsdWRlICJjb250ZW50L3B1YmxpYy9icm93c2VyL3dlYl9jb250ZW50cy5oIgpAQCAtMTU0LDYgKzE1NSwxOCBAQAogICB3ZWJfY29udGVudHNfLnJlc2V0KCk7CiB9CiAKK3ZvaWQgV2ViQXBwSW5zdGFsbE1hbmFnZXI6Okluc3RhbGxXZWJBcHBzQWZ0ZXJTeW5jKAorICAgIHN0ZDo6dmVjdG9yPFdlYkFwcCo+IHdlYl9hcHBzKSB7CisgIC8vIFRPRE8oY3JidWcuY29tLzg2MDU4Myk6IEltcGxlbWVudCBzeW5jLWluaXRpYXRlZCBhcHAgaW5zdGFsbHMuCisgIE5PVElNUExFTUVOVEVEKCk7Cit9CisKK3ZvaWQgV2ViQXBwSW5zdGFsbE1hbmFnZXI6OlVuaW5zdGFsbFdlYkFwcHNBZnRlclN5bmMoCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFdlYkFwcD4+IHdlYl9hcHBzKSB7CisgIC8vIFRPRE8oY3JidWcuY29tLzg2MDU4Myk6IEltcGxlbWVudCBzeW5jLWluaXRpYXRlZCBhcHAgdW5pbnN0YWxscy4KKyAgTk9USU1QTEVNRU5URUQoKTsKK30KKwogdm9pZCBXZWJBcHBJbnN0YWxsTWFuYWdlcjo6U2V0VXJsTG9hZGVyRm9yVGVzdGluZygKICAgICBzdGQ6OnVuaXF1ZV9wdHI8V2ViQXBwVXJsTG9hZGVyPiB1cmxfbG9hZGVyKSB7CiAgIHVybF9sb2FkZXJfID0gc3RkOjptb3ZlKHVybF9sb2FkZXIpOwpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy93ZWJfYXBwX2luc3RhbGxfbWFuYWdlci5oIGIvY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy93ZWJfYXBwX2luc3RhbGxfbWFuYWdlci5oCmluZGV4IGJlM2IyZGMuLjRiZjdhYTIgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvd2ViX2FwcF9pbnN0YWxsX21hbmFnZXIuaAorKysgYi9jaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL3dlYl9hcHBfaW5zdGFsbF9tYW5hZ2VyLmgKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL2NvbXBvbmVudHMvaW5zdGFsbF9tYW5hZ2VyLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy9jb21wb25lbnRzL3dlYl9hcHBfaGVscGVycy5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvY29tcG9uZW50cy93ZWJfYXBwX3VybF9sb2FkZXIuaCIKKyNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL3dlYl9hcHBfc3luY19pbnN0YWxsX2RlbGVnYXRlLmgiCiAKIGNsYXNzIFByb2ZpbGU7CiAKQEAgLTI5LDcgKzMwLDggQEAKIGNsYXNzIFdlYkFwcERhdGFSZXRyaWV2ZXI7CiBjbGFzcyBXZWJBcHBJbnN0YWxsVGFzazsKIAotY2xhc3MgV2ViQXBwSW5zdGFsbE1hbmFnZXIgZmluYWwgOiBwdWJsaWMgSW5zdGFsbE1hbmFnZXIgeworY2xhc3MgV2ViQXBwSW5zdGFsbE1hbmFnZXIgZmluYWwgOiBwdWJsaWMgSW5zdGFsbE1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTeW5jSW5zdGFsbERlbGVnYXRlIHsKICBwdWJsaWM6CiAgIGV4cGxpY2l0IFdlYkFwcEluc3RhbGxNYW5hZ2VyKFByb2ZpbGUqIHByb2ZpbGUpOwogICB+V2ViQXBwSW5zdGFsbE1hbmFnZXIoKSBvdmVycmlkZTsKQEAgLTY0LDYgKzY2LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uY2VJbnN0YWxsQ2FsbGJhY2sgY2FsbGJhY2spIG92ZXJyaWRlOwogICB2b2lkIFNodXRkb3duKCkgb3ZlcnJpZGU7CiAKKyAgLy8gRm9yIHRoZSBuZXcgVVNTLWJhc2VkIHN5c3RlbSBvbmx5LiBTeW5jSW5zdGFsbERlbGVnYXRlOgorICB2b2lkIEluc3RhbGxXZWJBcHBzQWZ0ZXJTeW5jKHN0ZDo6dmVjdG9yPFdlYkFwcCo+IHdlYl9hcHBzKSBvdmVycmlkZTsKKyAgdm9pZCBVbmluc3RhbGxXZWJBcHBzQWZ0ZXJTeW5jKAorICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFdlYkFwcD4+IHdlYl9hcHBzKSBvdmVycmlkZTsKKwogICB1c2luZyBEYXRhUmV0cmlldmVyRmFjdG9yeSA9CiAgICAgICBiYXNlOjpSZXBlYXRpbmdDYWxsYmFjazxzdGQ6OnVuaXF1ZV9wdHI8V2ViQXBwRGF0YVJldHJpZXZlcj4oKT47CiAgIHZvaWQgU2V0RGF0YVJldHJpZXZlckZhY3RvcnlGb3JUZXN0aW5nKApkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy93ZWJfYXBwX3Byb3ZpZGVyLmNjIGIvY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy93ZWJfYXBwX3Byb3ZpZGVyLmNjCmluZGV4IDNlZjE5MDVlLi5jMWRiY2NmOCAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy93ZWJfYXBwX3Byb3ZpZGVyLmNjCisrKyBiL2Nocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvd2ViX2FwcF9wcm92aWRlci5jYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvZXh0ZW5zaW9ucy9ib29rbWFya19hcHBfaW5zdGFsbF9maW5hbGl6ZXIuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL2V4dGVuc2lvbnMvYm9va21hcmtfYXBwX3JlZ2lzdHJhci5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvZXh0ZW5zaW9ucy9ib29rbWFya19hcHBfcmVnaXN0cnlfY29udHJvbGxlci5oIgorI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvZXh0ZW5zaW9ucy9ib29rbWFya19hcHBfc2hvcnRjdXRfbWFuYWdlci5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvZXh0ZXJuYWxfd2ViX2FwcF9tYW5hZ2VyLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy9maWxlX3V0aWxzX3dyYXBwZXIuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL3BlbmRpbmdfYXBwX21hbmFnZXJfaW1wbC5oIgpAQCAtMzIsNiArMzMsNyBAQAogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvd2ViX2FwcF9pbnN0YWxsX21hbmFnZXIuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL3dlYl9hcHBfcHJvdmlkZXJfZmFjdG9yeS5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvd2ViX2FwcF9yZWdpc3RyYXIuaCIKKyNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL3dlYl9hcHBfc2hvcnRjdXRfbWFuYWdlci5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvd2ViX2FwcF9zeW5jX2JyaWRnZS5oIgogI2luY2x1ZGUgImNocm9tZS9jb21tb24vY2hyb21lX2ZlYXR1cmVzLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9wcmVmX3JlZ2lzdHJ5L3ByZWZfcmVnaXN0cnlfc3luY2FibGUuaCIKQEAgLTEzMyw2ICsxMzUsMTEgQEAKICAgcmV0dXJuICppY29uX21hbmFnZXJfOwogfQogCitBcHBTaG9ydGN1dE1hbmFnZXImIFdlYkFwcFByb3ZpZGVyOjpzaG9ydGN1dF9tYW5hZ2VyKCkgeworICBDaGVja0lzQ29ubmVjdGVkKCk7CisgIHJldHVybiAqc2hvcnRjdXRfbWFuYWdlcl87Cit9CisKIFN5c3RlbVdlYkFwcE1hbmFnZXImIFdlYkFwcFByb3ZpZGVyOjpzeXN0ZW1fd2ViX2FwcF9tYW5hZ2VyKCkgewogICBDaGVja0lzQ29ubmVjdGVkKCk7CiAgIHJldHVybiAqc3lzdGVtX3dlYl9hcHBfbWFuYWdlcl87CkBAIC0xNzAsNyArMTc3LDggQEAKICAgICBhdXRvIG11dGFibGVfcmVnaXN0cmFyID0gc3RkOjptYWtlX3VuaXF1ZTxXZWJBcHBSZWdpc3RyYXJNdXRhYmxlPihwcm9maWxlKTsKIAogICAgIHN5bmNfYnJpZGdlID0gc3RkOjptYWtlX3VuaXF1ZTxXZWJBcHBTeW5jQnJpZGdlPigKLSAgICAgICAgcHJvZmlsZSwgZGF0YWJhc2VfZmFjdG9yeV8uZ2V0KCksIG11dGFibGVfcmVnaXN0cmFyLmdldCgpKTsKKyAgICAgICAgcHJvZmlsZSwgZGF0YWJhc2VfZmFjdG9yeV8uZ2V0KCksIG11dGFibGVfcmVnaXN0cmFyLmdldCgpLAorICAgICAgICBpbnN0YWxsX21hbmFnZXJfLmdldCgpKTsKIAogICAgIC8vIFVwY2FzdCB0byByZWFkLW9ubHkgV2ViQXBwUmVnaXN0cmFyLgogICAgIHJlZ2lzdHJhciA9IHN0ZDo6bW92ZShtdXRhYmxlX3JlZ2lzdHJhcik7CkBAIC0xODEsNiArMTg5LDcgQEAKICAgaW5zdGFsbF9maW5hbGl6ZXJfID0gc3RkOjptYWtlX3VuaXF1ZTxXZWJBcHBJbnN0YWxsRmluYWxpemVyPigKICAgICAgIHN5bmNfYnJpZGdlLmdldCgpLCBpY29uX21hbmFnZXIuZ2V0KCkpOwogICBmaWxlX2hhbmRsZXJfbWFuYWdlcl8gPSBzdGQ6Om1ha2VfdW5pcXVlPFdlYkFwcEZpbGVIYW5kbGVyTWFuYWdlcj4ocHJvZmlsZSk7CisgIHNob3J0Y3V0X21hbmFnZXJfID0gc3RkOjptYWtlX3VuaXF1ZTxXZWJBcHBTaG9ydGN1dE1hbmFnZXI+KHByb2ZpbGUpOwogCiAgIC8vIFVwY2FzdCB0byB1bmlmaWVkIHN1YnN5c3RlbSB0eXBlczoKICAgcmVnaXN0cmFyXyA9IHN0ZDo6bW92ZShyZWdpc3RyYXIpOwpAQCAtMTk3LDYgKzIwNiw4IEBACiAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPGV4dGVuc2lvbnM6OkJvb2ttYXJrQXBwSW5zdGFsbEZpbmFsaXplcj4ocHJvZmlsZSk7CiAgIGZpbGVfaGFuZGxlcl9tYW5hZ2VyXyA9CiAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPGV4dGVuc2lvbnM6OkJvb2ttYXJrQXBwRmlsZUhhbmRsZXJNYW5hZ2VyPihwcm9maWxlKTsKKyAgc2hvcnRjdXRfbWFuYWdlcl8gPQorICAgICAgc3RkOjptYWtlX3VuaXF1ZTxleHRlbnNpb25zOjpCb29rbWFya0FwcFNob3J0Y3V0TWFuYWdlcj4ocHJvZmlsZSk7CiB9CiAKIHZvaWQgV2ViQXBwUHJvdmlkZXI6OkNvbm5lY3RTdWJzeXN0ZW1zKCkgewpAQCAtMjEzLDYgKzIyNCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdHJhcl8uZ2V0KCksIHVpX21hbmFnZXJfLmdldCgpKTsKICAgd2ViX2FwcF9wb2xpY3lfbWFuYWdlcl8tPlNldFN1YnN5c3RlbXMocGVuZGluZ19hcHBfbWFuYWdlcl8uZ2V0KCkpOwogICBmaWxlX2hhbmRsZXJfbWFuYWdlcl8tPlNldFN1YnN5c3RlbXMocmVnaXN0cmFyXy5nZXQoKSk7CisgIHNob3J0Y3V0X21hbmFnZXJfLT5TZXRTdWJzeXN0ZW1zKHJlZ2lzdHJhcl8uZ2V0KCkpOwogCiAgIGNvbm5lY3RlZF8gPSB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy93ZWJfYXBwX3Byb3ZpZGVyLmggYi9jaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL3dlYl9hcHBfcHJvdmlkZXIuaAppbmRleCA5OWJjMDJhLi5mYjY1MWEyMSAxMDA2NDQKLS0tIGEvY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy93ZWJfYXBwX3Byb3ZpZGVyLmgKKysrIGIvY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy93ZWJfYXBwX3Byb3ZpZGVyLmgKQEAgLTMxLDYgKzMxLDcgQEAKIC8vIEZvcndhcmQgZGVjbGFyYXRpb25zIG9mIGdlbmVyYWxpemVkIGludGVyZmFjZXMuCiBjbGFzcyBBcHBSZWdpc3RyeUNvbnRyb2xsZXI7CiBjbGFzcyBBcHBJY29uTWFuYWdlcjsKK2NsYXNzIEFwcFNob3J0Y3V0TWFuYWdlcjsKIGNsYXNzIEV4dGVybmFsV2ViQXBwTWFuYWdlcjsKIGNsYXNzIEZpbGVIYW5kbGVyTWFuYWdlcjsKIGNsYXNzIEluc3RhbGxGaW5hbGl6ZXI7CkBAIC03Nyw2ICs3OCw3IEBACiAgIFdlYkFwcEF1ZGlvRm9jdXNJZE1hcCYgYXVkaW9fZm9jdXNfaWRfbWFwKCkgb3ZlcnJpZGU7CiAgIEZpbGVIYW5kbGVyTWFuYWdlciYgZmlsZV9oYW5kbGVyX21hbmFnZXIoKSBvdmVycmlkZTsKICAgQXBwSWNvbk1hbmFnZXImIGljb25fbWFuYWdlcigpIG92ZXJyaWRlOworICBBcHBTaG9ydGN1dE1hbmFnZXImIHNob3J0Y3V0X21hbmFnZXIoKSBvdmVycmlkZTsKIAogICBTeXN0ZW1XZWJBcHBNYW5hZ2VyJiBzeXN0ZW1fd2ViX2FwcF9tYW5hZ2VyKCk7CiAKQEAgLTEyMSw2ICsxMjMsNyBAQAogICBzdGQ6OnVuaXF1ZV9wdHI8SW5zdGFsbEZpbmFsaXplcj4gaW5zdGFsbF9maW5hbGl6ZXJfOwogICBzdGQ6OnVuaXF1ZV9wdHI8TWFuaWZlc3RVcGRhdGVNYW5hZ2VyPiBtYW5pZmVzdF91cGRhdGVfbWFuYWdlcl87CiAgIHN0ZDo6dW5pcXVlX3B0cjxQZW5kaW5nQXBwTWFuYWdlcj4gcGVuZGluZ19hcHBfbWFuYWdlcl87CisgIHN0ZDo6dW5pcXVlX3B0cjxBcHBTaG9ydGN1dE1hbmFnZXI+IHNob3J0Y3V0X21hbmFnZXJfOwogICBzdGQ6OnVuaXF1ZV9wdHI8U3lzdGVtV2ViQXBwTWFuYWdlcj4gc3lzdGVtX3dlYl9hcHBfbWFuYWdlcl87CiAgIHN0ZDo6dW5pcXVlX3B0cjxXZWJBcHBBdWRpb0ZvY3VzSWRNYXA+IGF1ZGlvX2ZvY3VzX2lkX21hcF87CiAgIHN0ZDo6dW5pcXVlX3B0cjxXZWJBcHBJbnN0YWxsTWFuYWdlcj4gaW5zdGFsbF9tYW5hZ2VyXzsKZGlmZiAtLWdpdCBhL2Nocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvd2ViX2FwcF9zaG9ydGN1dF9tYW5hZ2VyLmNjIGIvY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy93ZWJfYXBwX3Nob3J0Y3V0X21hbmFnZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBkZDMwZgotLS0gL2Rldi9udWxsCisrKyBiL2Nocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvd2ViX2FwcF9zaG9ydGN1dF9tYW5hZ2VyLmNjCkBAIC0wLDAgKzEsMTQgQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvd2ViX2FwcF9zaG9ydGN1dF9tYW5hZ2VyLmgiCisKK25hbWVzcGFjZSB3ZWJfYXBwIHsKKworV2ViQXBwU2hvcnRjdXRNYW5hZ2VyOjpXZWJBcHBTaG9ydGN1dE1hbmFnZXIoUHJvZmlsZSogcHJvZmlsZSkKKyAgICA6IEFwcFNob3J0Y3V0TWFuYWdlcihwcm9maWxlKSB7fQorCitXZWJBcHBTaG9ydGN1dE1hbmFnZXI6On5XZWJBcHBTaG9ydGN1dE1hbmFnZXIoKSA9IGRlZmF1bHQ7CisKK30gIC8vIG5hbWVzcGFjZSB3ZWJfYXBwCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL3dlYl9hcHBfc2hvcnRjdXRfbWFuYWdlci5oIGIvY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy93ZWJfYXBwX3Nob3J0Y3V0X21hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2IyOTgzCi0tLSAvZGV2L251bGwKKysrIGIvY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy93ZWJfYXBwX3Nob3J0Y3V0X21hbmFnZXIuaApAQCAtMCwwICsxLDI2IEBACisvLyBDb3B5cmlnaHQgMjAxOSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpZm5kZWYgQ0hST01FX0JST1dTRVJfV0VCX0FQUExJQ0FUSU9OU19XRUJfQVBQX1NIT1JUQ1VUX01BTkFHRVJfSF8KKyNkZWZpbmUgQ0hST01FX0JST1dTRVJfV0VCX0FQUExJQ0FUSU9OU19XRUJfQVBQX1NIT1JUQ1VUX01BTkFHRVJfSF8KKworI2luY2x1ZGUgImJhc2UvbWFjcm9zLmgiCisjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy9jb21wb25lbnRzL2FwcF9zaG9ydGN1dF9tYW5hZ2VyLmgiCisKK2NsYXNzIFByb2ZpbGU7CisKK25hbWVzcGFjZSB3ZWJfYXBwIHsKKworY2xhc3MgV2ViQXBwU2hvcnRjdXRNYW5hZ2VyIDogcHVibGljIEFwcFNob3J0Y3V0TWFuYWdlciB7CisgcHVibGljOgorICBleHBsaWNpdCBXZWJBcHBTaG9ydGN1dE1hbmFnZXIoUHJvZmlsZSogcHJvZmlsZSk7CisgIH5XZWJBcHBTaG9ydGN1dE1hbmFnZXIoKSBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihXZWJBcHBTaG9ydGN1dE1hbmFnZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHdlYl9hcHAKKworI2VuZGlmICAvLyBDSFJPTUVfQlJPV1NFUl9XRUJfQVBQTElDQVRJT05TX1dFQl9BUFBfU0hPUlRDVVRfTUFOQUdFUl9IXwpkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy93ZWJfYXBwX3N5bmNfYnJpZGdlLmNjIGIvY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy93ZWJfYXBwX3N5bmNfYnJpZGdlLmNjCmluZGV4IDVjM2MyNDYuLjRhNGE3ZWIgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvd2ViX2FwcF9zeW5jX2JyaWRnZS5jYworKysgYi9jaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL3dlYl9hcHBfc3luY19icmlkZ2UuY2MKQEAgLTUsMTYgKzUsMjAgQEAKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL3dlYl9hcHBfc3luY19icmlkZ2UuaCIKIAogI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlICJiYXNlL2JpbmQuaCIKICNpbmNsdWRlICJiYXNlL2JpbmRfaGVscGVycy5oIgogI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKKyNpbmNsdWRlICJiYXNlL2NvbnRhaW5lcnMvZmxhdF9zZXQuaCIKICNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKICNpbmNsdWRlICJiYXNlL29wdGlvbmFsLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy9jb21wb25lbnRzL3dlYl9hcHBfaGVscGVycy5oIgorI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvd2ViX2FwcC5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvd2ViX2FwcF9kYXRhYmFzZS5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvd2ViX2FwcF9kYXRhYmFzZV9mYWN0b3J5LmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy93ZWJfYXBwX3JlZ2lzdHJ5X3VwZGF0ZS5oIgorI2luY2x1ZGUgImNocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvd2ViX2FwcF9zeW5jX2luc3RhbGxfZGVsZWdhdGUuaCIKICNpbmNsdWRlICJjaHJvbWUvY29tbW9uL2NoYW5uZWxfaW5mby5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvc3luYy9iYXNlL21vZGVsX3R5cGUuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL3N5bmMvYmFzZS9yZXBvcnRfdW5yZWNvdmVyYWJsZV9lcnJvci5oIgpAQCAtMzYsMjcgKzQwLDcxIEBACiAgIGF1dG8gZW50aXR5X2RhdGEgPSBzdGQ6Om1ha2VfdW5pcXVlPHN5bmNlcjo6RW50aXR5RGF0YT4oKTsKICAgZW50aXR5X2RhdGEtPm5hbWUgPSBhcHAubmFtZSgpOwogCi0gIHN5bmNfcGI6OldlYkFwcFNwZWNpZmljcyogc3BlY2lmaWNzID0KKyAgc3luY19wYjo6V2ViQXBwU3BlY2lmaWNzKiBzeW5jX2RhdGEgPQogICAgICAgZW50aXR5X2RhdGEtPnNwZWNpZmljcy5tdXRhYmxlX3dlYl9hcHAoKTsKLSAgc3BlY2lmaWNzLT5zZXRfbGF1bmNoX3VybChhcHAubGF1bmNoX3VybCgpLnNwZWMoKSk7Ci0gIHNwZWNpZmljcy0+c2V0X25hbWUoYXBwLm5hbWUoKSk7Ci0gIHNwZWNpZmljcy0+c2V0X2Rpc3BsYXlfbW9kZShUb1dlYkFwcFNwZWNpZmljc0Rpc3BsYXlNb2RlKGFwcC5kaXNwbGF5X21vZGUoKSkpOwotICBpZiAoYXBwLnRoZW1lX2NvbG9yKCkuaGFzX3ZhbHVlKCkpCi0gICAgc3BlY2lmaWNzLT5zZXRfdGhlbWVfY29sb3IoYXBwLnRoZW1lX2NvbG9yKCkudmFsdWUoKSk7CisgIHN5bmNfZGF0YS0+c2V0X2xhdW5jaF91cmwoYXBwLmxhdW5jaF91cmwoKS5zcGVjKCkpOworICBzeW5jX2RhdGEtPnNldF9kaXNwbGF5X21vZGUoVG9XZWJBcHBTcGVjaWZpY3NEaXNwbGF5TW9kZShhcHAuZGlzcGxheV9tb2RlKCkpKTsKKyAgc3luY19kYXRhLT5zZXRfbmFtZShhcHAuc3luY19kYXRhKCkubmFtZSk7CisgIGlmIChhcHAuc3luY19kYXRhKCkudGhlbWVfY29sb3IuaGFzX3ZhbHVlKCkpCisgICAgc3luY19kYXRhLT5zZXRfdGhlbWVfY29sb3IoYXBwLnN5bmNfZGF0YSgpLnRoZW1lX2NvbG9yLnZhbHVlKCkpOwogCiAgIHJldHVybiBlbnRpdHlfZGF0YTsKIH0KIAordm9pZCBBcHBseVN5bmNEYXRhVG9BcHAoY29uc3Qgc3luY19wYjo6V2ViQXBwU3BlY2lmaWNzJiBzeW5jX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBXZWJBcHAqIGFwcCkgeworICBhcHAtPkFkZFNvdXJjZShTb3VyY2U6OmtTeW5jKTsKKworICAvLyBhcHBfaWQgaXMgYSBoYXNoIG9mIGxhdW5jaF91cmwuIFBhcnNlIGxhdW5jaF91cmwgZmlyc3Q6CisgIEdVUkwgbGF1bmNoX3VybChzeW5jX2RhdGEubGF1bmNoX3VybCgpKTsKKyAgaWYgKGxhdW5jaF91cmwuaXNfZW1wdHkoKSB8fCAhbGF1bmNoX3VybC5pc192YWxpZCgpKSB7CisgICAgRExPRyhFUlJPUikgPDwgIkFwcGx5U3luY0RhdGFUb0FwcDogbGF1bmNoX3VybCBwYXJzZSBlcnJvci4iOworICAgIHJldHVybjsKKyAgfQorICBpZiAoYXBwLT5hcHBfaWQoKSAhPSBHZW5lcmF0ZUFwcElkRnJvbVVSTChsYXVuY2hfdXJsKSkgeworICAgIERMT0coRVJST1IpIDw8ICJBcHBseVN5bmNEYXRhVG9BcHA6IGFwcF9pZCBkb2Vzbid0IG1hdGNoIGxhdW5jaF91cmwuIjsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoYXBwLT5sYXVuY2hfdXJsKCkuaXNfZW1wdHkoKSkgeworICAgIGFwcC0+U2V0TGF1bmNoVXJsKHN0ZDo6bW92ZShsYXVuY2hfdXJsKSk7CisgIH0gZWxzZSBpZiAoYXBwLT5sYXVuY2hfdXJsKCkgIT0gbGF1bmNoX3VybCkgeworICAgIERMT0coRVJST1IpCisgICAgICAgIDw8ICJBcHBseVN5bmNEYXRhVG9BcHA6IGV4aXN0aW5nIGxhdW5jaF91cmwgZG9lc24ndCBtYXRjaCBsYXVuY2hfdXJsLiI7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gQWx3YXlzIG92ZXJyaWRlIGRpc3BsYXkgbW9kZSB3aXRoIGEgc3luY2VkIHZhbHVlLgorICBhcHAtPlNldERpc3BsYXlNb2RlKFRvTW9qb21EaXNwbGF5TW9kZShzeW5jX2RhdGEuZGlzcGxheV9tb2RlKCkpKTsKKworICBXZWJBcHA6OlN5bmNEYXRhIHBhcnNlZF9zeW5jX2RhdGE7CisgIHBhcnNlZF9zeW5jX2RhdGEubmFtZSA9IHN5bmNfZGF0YS5uYW1lKCk7CisgIGlmIChzeW5jX2RhdGEuaGFzX3RoZW1lX2NvbG9yKCkpCisgICAgcGFyc2VkX3N5bmNfZGF0YS50aGVtZV9jb2xvciA9IHN5bmNfZGF0YS50aGVtZV9jb2xvcigpOworICBhcHAtPlNldFN5bmNEYXRhKHBhcnNlZF9zeW5jX2RhdGEpOworfQorCitib29sIEFyZUFwcHNMb2NhbGx5SW5zdGFsbGVkQnlEZWZhdWx0KCkgeworI2lmIGRlZmluZWQoT1NfQ0hST01FT1MpCisgIC8vIE9uIENocm9tZSBPUywgc3luYyBhbHdheXMgbG9jYWxseSBpbnN0YWxscyBhbiBhcHAuCisgIHJldHVybiB0cnVlOworI2Vsc2UKKyAgcmV0dXJuIGZhbHNlOworI2VuZGlmCit9CisKIH0gIC8vIG5hbWVzcGFjZQogCiBXZWJBcHBTeW5jQnJpZGdlOjpXZWJBcHBTeW5jQnJpZGdlKAogICAgIFByb2ZpbGUqIHByb2ZpbGUsCiAgICAgQWJzdHJhY3RXZWJBcHBEYXRhYmFzZUZhY3RvcnkqIGRhdGFiYXNlX2ZhY3RvcnksCi0gICAgV2ViQXBwUmVnaXN0cmFyTXV0YWJsZSogcmVnaXN0cmFyKQorICAgIFdlYkFwcFJlZ2lzdHJhck11dGFibGUqIHJlZ2lzdHJhciwKKyAgICBTeW5jSW5zdGFsbERlbGVnYXRlKiBpbnN0YWxsX2RlbGVnYXRlKQogICAgIDogV2ViQXBwU3luY0JyaWRnZSgKICAgICAgICAgICBwcm9maWxlLAogICAgICAgICAgIGRhdGFiYXNlX2ZhY3RvcnksCiAgICAgICAgICAgcmVnaXN0cmFyLAorICAgICAgICAgIGluc3RhbGxfZGVsZWdhdGUsCiAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxzeW5jZXI6OkNsaWVudFRhZ0Jhc2VkTW9kZWxUeXBlUHJvY2Vzc29yPigKICAgICAgICAgICAgICAgc3luY2VyOjpXRUJfQVBQUywKICAgICAgICAgICAgICAgYmFzZTo6QmluZFJlcGVhdGluZygmc3luY2VyOjpSZXBvcnRVbnJlY292ZXJhYmxlRXJyb3IsCkBAIC02NiwxMCArMTE0LDEyIEBACiAgICAgUHJvZmlsZSogcHJvZmlsZSwKICAgICBBYnN0cmFjdFdlYkFwcERhdGFiYXNlRmFjdG9yeSogZGF0YWJhc2VfZmFjdG9yeSwKICAgICBXZWJBcHBSZWdpc3RyYXJNdXRhYmxlKiByZWdpc3RyYXIsCisgICAgU3luY0luc3RhbGxEZWxlZ2F0ZSogaW5zdGFsbF9kZWxlZ2F0ZSwKICAgICBzdGQ6OnVuaXF1ZV9wdHI8c3luY2VyOjpNb2RlbFR5cGVDaGFuZ2VQcm9jZXNzb3I+IGNoYW5nZV9wcm9jZXNzb3IpCiAgICAgOiBBcHBSZWdpc3RyeUNvbnRyb2xsZXIocHJvZmlsZSksCiAgICAgICBzeW5jZXI6Ok1vZGVsVHlwZVN5bmNCcmlkZ2Uoc3RkOjptb3ZlKGNoYW5nZV9wcm9jZXNzb3IpKSwKLSAgICAgIHJlZ2lzdHJhcl8ocmVnaXN0cmFyKSB7CisgICAgICByZWdpc3RyYXJfKHJlZ2lzdHJhciksCisgICAgICBpbnN0YWxsX2RlbGVnYXRlXyhpbnN0YWxsX2RlbGVnYXRlKSB7CiAgIERDSEVDSyhkYXRhYmFzZV9mYWN0b3J5KTsKICAgRENIRUNLKHJlZ2lzdHJhcl8pOwogICBkYXRhYmFzZV8gPSBzdGQ6Om1ha2VfdW5pcXVlPFdlYkFwcERhdGFiYXNlPigKQEAgLTEwMywxMiArMTUzLDE0IEBACiAKICAgQ2hlY2tSZWdpc3RyeVVwZGF0ZURhdGEodXBkYXRlLT51cGRhdGVfZGF0YSgpKTsKIAotICByZWdpc3RyYXJfLT5Db3VudE11dGF0aW9uKCk7Ci0KICAgc3RkOjp1bmlxdWVfcHRyPFJlZ2lzdHJ5VXBkYXRlRGF0YT4gdXBkYXRlX2RhdGEgPSB1cGRhdGUtPlRha2VVcGRhdGVEYXRhKCk7CisgIHN0ZDo6dW5pcXVlX3B0cjxzeW5jZXI6Ok1ldGFkYXRhQ2hhbmdlTGlzdD4gbWV0YWRhdGFfY2hhbmdlX2xpc3QgPQorICAgICAgQ3JlYXRlTWV0YWRhdGFDaGFuZ2VMaXN0KCk7CisKKyAgVXBkYXRlU3luYygqdXBkYXRlX2RhdGEsIG1ldGFkYXRhX2NoYW5nZV9saXN0LmdldCgpKTsKIAogICBkYXRhYmFzZV8tPkNvbW1pdFRyYW5zYWN0aW9uKAotICAgICAgKnVwZGF0ZV9kYXRhLAorICAgICAgKnVwZGF0ZV9kYXRhLCBzdGQ6Om1vdmUobWV0YWRhdGFfY2hhbmdlX2xpc3QpLAogICAgICAgYmFzZTo6QmluZE9uY2UoJldlYkFwcFN5bmNCcmlkZ2U6Ok9uRGF0YVdyaXR0ZW4sCiAgICAgICAgICAgICAgICAgICAgICB3ZWFrX3B0cl9mYWN0b3J5Xy5HZXRXZWFrUHRyKCksIHN0ZDo6bW92ZShjYWxsYmFjaykpKTsKIApAQCAtMTU3LDE5ICsyMDksNzMgQEAKICNlbmRpZgogfQogCi12b2lkIFdlYkFwcFN5bmNCcmlkZ2U6OlVwZGF0ZVJlZ2lzdHJhcigKK3N0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxXZWJBcHA+PiBXZWJBcHBTeW5jQnJpZGdlOjpVcGRhdGVSZWdpc3RyYXIoCiAgICAgc3RkOjp1bmlxdWVfcHRyPFJlZ2lzdHJ5VXBkYXRlRGF0YT4gdXBkYXRlX2RhdGEpIHsKKyAgcmVnaXN0cmFyXy0+Q291bnRNdXRhdGlvbigpOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxXZWJBcHA+PiBhcHBzX3VucmVnaXN0ZXJlZDsKKwogICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxXZWJBcHA+JiB3ZWJfYXBwIDogdXBkYXRlX2RhdGEtPmFwcHNfdG9fY3JlYXRlKSB7CiAgICAgQXBwSWQgYXBwX2lkID0gd2ViX2FwcC0+YXBwX2lkKCk7CiAgICAgRENIRUNLKCFyZWdpc3RyYXJfLT5HZXRBcHBCeUlkKGFwcF9pZCkpOwogICAgIHJlZ2lzdHJhcl8tPnJlZ2lzdHJ5KCkuZW1wbGFjZShzdGQ6Om1vdmUoYXBwX2lkKSwgc3RkOjptb3ZlKHdlYl9hcHApKTsKICAgfQogCisgIC8vIHVwZGF0ZV9kYXRhLT5hcHBzX3RvX3VwZGF0ZSBhcmUgaWdub3JlZCBoZXJlIGJlY2F1c2Ugd2UgZG8gaW4tcGxhY2UKKyAgLy8gdXBkYXRlcy4KKwogICBmb3IgKGNvbnN0IEFwcElkJiBhcHBfaWQgOiB1cGRhdGVfZGF0YS0+YXBwc190b19kZWxldGUpIHsKICAgICBhdXRvIGl0ID0gcmVnaXN0cmFyXy0+cmVnaXN0cnkoKS5maW5kKGFwcF9pZCk7CiAgICAgRENIRUNLKGl0ICE9IHJlZ2lzdHJhcl8tPnJlZ2lzdHJ5KCkuZW5kKCkpOworCisgICAgYXBwc191bnJlZ2lzdGVyZWQucHVzaF9iYWNrKHN0ZDo6bW92ZShpdC0+c2Vjb25kKSk7CiAgICAgcmVnaXN0cmFyXy0+cmVnaXN0cnkoKS5lcmFzZShpdCk7CiAgIH0KKworICByZXR1cm4gYXBwc191bnJlZ2lzdGVyZWQ7Cit9CisKK3ZvaWQgV2ViQXBwU3luY0JyaWRnZTo6VXBkYXRlU3luYygKKyAgICBjb25zdCBSZWdpc3RyeVVwZGF0ZURhdGEmIHVwZGF0ZV9kYXRhLAorICAgIHN5bmNlcjo6TWV0YWRhdGFDaGFuZ2VMaXN0KiBtZXRhZGF0YV9jaGFuZ2VfbGlzdCkgeworICAvLyBXZSBkb24ndCBibG9jayB3ZWIgYXBwIHN1YnN5c3RlbXMgb24gV2ViQXBwU3luY0JyaWRnZTo6TWVyZ2VTeW5jRGF0YTogd2UKKyAgLy8gY2FsbCBXZWJBcHBQcm92aWRlcjo6T25SZWdpc3RyeUNvbnRyb2xsZXJSZWFkeSgpIHJpZ2h0IGFmdGVyCisgIC8vIGNoYW5nZV9wcm9jZXNzb3IoKS0+TW9kZWxSZWFkeVRvU3luYy4gQXMgYSByZXN1bHQsIHN1YnN5c3RlbXMgbWF5IHByb2R1Y2UKKyAgLy8gc29tZSBsb2NhbCBjaGFuZ2VzIGJldHdlZW4gT25SZWdpc3RyeUNvbnRyb2xsZXJSZWFkeSBhbmQgTWVyZ2VTeW5jRGF0YS4KKyAgLy8gUmV0dXJuIGVhcmx5IGluIHRoaXMgY2FzZS4gVGhlIHByb2Nlc3NvciBjYW5ub3QgZG8gYW55IHVzZWZ1bCBtZXRhZGF0YQorICAvLyB0cmFja2luZyB1bnRpbCBNZXJnZVN5bmNEYXRhIGlzIGNhbGxlZDoKKyAgaWYgKCFjaGFuZ2VfcHJvY2Vzc29yKCktPklzVHJhY2tpbmdNZXRhZGF0YSgpKQorICAgIHJldHVybjsKKworICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxXZWJBcHA+JiBhcHAgOiB1cGRhdGVfZGF0YS5hcHBzX3RvX2NyZWF0ZSkgeworICAgIGlmIChhcHAtPklzU3luY2VkKCkpIHsKKyAgICAgIGNoYW5nZV9wcm9jZXNzb3IoKS0+UHV0KGFwcC0+YXBwX2lkKCksIENyZWF0ZVN5bmNFbnRpdHlEYXRhKCphcHApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFfY2hhbmdlX2xpc3QpOworICAgIH0KKyAgfQorCisgIC8vIEFuIGFwcCBtYXkgb2J0YWluIG9yIG1heSBsb29zZSBJc1N5bmNlZCBmbGFnIHdpdGhvdXQgYmVpbmcgZGVsZXRlZC4gV2UKKyAgLy8gc2hvdWxkIGNvbnNlcnZhdGl2ZWx5IGluY2x1ZGUgb3IgZXhjbHVkZSB0aGUgYXBwIGZyb20gdGhlIHN5bmNlZCBhcHBzCisgIC8vIHN1YnNldC4KKyAgLy8KKyAgLy8gVE9ETyhsb3lzbyk6IFNlbmQgYW4gdXBkYXRlIHRvIHN5bmMgc2VydmVyIG9ubHkgaWYgYW55IHN5bmMtc3BlY2lmaWMKKyAgLy8gZGF0YSB3YXMgY2hhbmdlZC4gSW1wbGVtZW50IHNvbWUgZGlydHkgZmxhZ3MgaW4gV2ViQXBwIHNldHRlciBtZXRob2RzLgorICBmb3IgKGNvbnN0IFdlYkFwcCogYXBwIDogdXBkYXRlX2RhdGEuYXBwc190b191cGRhdGUpIHsKKyAgICBpZiAoYXBwLT5Jc1N5bmNlZCgpKSB7CisgICAgICBjaGFuZ2VfcHJvY2Vzc29yKCktPlB1dChhcHAtPmFwcF9pZCgpLCBDcmVhdGVTeW5jRW50aXR5RGF0YSgqYXBwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhX2NoYW5nZV9saXN0KTsKKyAgICB9IGVsc2UgeworICAgICAgY2hhbmdlX3Byb2Nlc3NvcigpLT5EZWxldGUoYXBwLT5hcHBfaWQoKSwgbWV0YWRhdGFfY2hhbmdlX2xpc3QpOworICAgIH0KKyAgfQorCisgIC8vIFdlIHNob3VsZCB1bmNvbmRpdGlvbmFsbHkgZGVsZXRlIGZyb20gc3luYyAoaW4gY2FzZSBJc1N5bmNlZCBmbGFnIHdhcworICAvLyByZW1vdmVkIGR1cmluZyB0aGUgdXBkYXRlKS4KKyAgZm9yIChjb25zdCBBcHBJZCYgYXBwX2lkIDogdXBkYXRlX2RhdGEuYXBwc190b19kZWxldGUpIHsKKyAgICBjb25zdCBXZWJBcHAqIGFwcCA9IHJlZ2lzdHJhcl8tPkdldEFwcEJ5SWQoYXBwX2lkKTsKKyAgICBEQ0hFQ0soYXBwKTsKKyAgICBjaGFuZ2VfcHJvY2Vzc29yKCktPkRlbGV0ZShhcHBfaWQsIG1ldGFkYXRhX2NoYW5nZV9saXN0KTsKKyAgfQogfQogCiB2b2lkIFdlYkFwcFN5bmNCcmlkZ2U6Ok9uRGF0YWJhc2VPcGVuZWQoCkBAIC0xOTUsNiArMzAxLDEwMiBAQAogICBjaGFuZ2VfcHJvY2Vzc29yKCktPlJlcG9ydEVycm9yKGVycm9yKTsKIH0KIAordm9pZCBXZWJBcHBTeW5jQnJpZGdlOjpNZXJnZUxvY2FsQXBwc1RvU3luYygKKyAgICBjb25zdCBzeW5jZXI6OkVudGl0eUNoYW5nZUxpc3QmIGVudGl0eV9kYXRhLAorICAgIHN5bmNlcjo6TWV0YWRhdGFDaGFuZ2VMaXN0KiBtZXRhZGF0YV9jaGFuZ2VfbGlzdCkgeworICAvLyBCdWlsZCBhIGhlbHBlciBzZXQgb2YgdGhlIHN5bmMgc2VydmVyIGFwcHMgdG8gc3BlZWQgdXAgbG9va3Vwcy4gVGhlCisgIC8vIGZsYXRfc2V0IHdpbGwgcmV1c2UgdGhlIHVuZGVybHlpbmcgbWVtb3J5IG9mIHRoaXMgdmVjdG9yLiBhcHBfaWQgaXMgc3RvcmFnZQorICAvLyBrZXkuCisgIHN0ZDo6dmVjdG9yPEFwcElkPiBzdG9yYWdlX2tleXM7CisgIHN0b3JhZ2Vfa2V5cy5yZXNlcnZlKGVudGl0eV9kYXRhLnNpemUoKSk7CisgIGZvciAoY29uc3QgYXV0byYgY2hhbmdlIDogZW50aXR5X2RhdGEpCisgICAgc3RvcmFnZV9rZXlzLnB1c2hfYmFjayhjaGFuZ2UtPnN0b3JhZ2Vfa2V5KCkpOworICAvLyBTb3J0IG9ubHkgb25jZS4KKyAgYmFzZTo6ZmxhdF9zZXQ8QXBwSWQ+IHN5bmNfc2VydmVyX2FwcHMoc3RkOjptb3ZlKHN0b3JhZ2Vfa2V5cykpOworCisgIGZvciAoY29uc3QgV2ViQXBwJiBhcHAgOiByZWdpc3RyYXJfLT5BbGxBcHBzKCkpIHsKKyAgICBpZiAoIWFwcC5Jc1N5bmNlZCgpKQorICAgICAgY29udGludWU7CisKKyAgICBib29sIGV4aXN0c19yZW1vdGVseSA9IHN5bmNfc2VydmVyX2FwcHMuY29udGFpbnMoYXBwLmFwcF9pZCgpKTsKKyAgICBpZiAoIWV4aXN0c19yZW1vdGVseSkgeworICAgICAgY2hhbmdlX3Byb2Nlc3NvcigpLT5QdXQoYXBwLmFwcF9pZCgpLCBDcmVhdGVTeW5jRW50aXR5RGF0YShhcHApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFfY2hhbmdlX2xpc3QpOworICAgIH0KKyAgfQorfQorCit2b2lkIFdlYkFwcFN5bmNCcmlkZ2U6OkFwcGx5U3luY0RhdGFDaGFuZ2UoCisgICAgY29uc3Qgc3luY2VyOjpFbnRpdHlDaGFuZ2UmIGNoYW5nZSwKKyAgICBSZWdpc3RyeVVwZGF0ZURhdGEqIHVwZGF0ZV9sb2NhbF9kYXRhKSB7CisgIC8vIGFwcF9pZCBpcyBzdG9yYWdlIGtleS4KKyAgY29uc3QgQXBwSWQmIGFwcF9pZCA9IGNoYW5nZS5zdG9yYWdlX2tleSgpOworCisgIFdlYkFwcCogZXhpc3Rpbmdfd2ViX2FwcCA9IHJlZ2lzdHJhcl8tPkdldEFwcEJ5SWRNdXRhYmxlKGFwcF9pZCk7CisKKyAgLy8gSGFuZGxlIGRlbGV0aW9uIGZpcnN0LgorICBpZiAoY2hhbmdlLnR5cGUoKSA9PSBzeW5jZXI6OkVudGl0eUNoYW5nZTo6QUNUSU9OX0RFTEVURSkgeworICAgIGlmICghZXhpc3Rpbmdfd2ViX2FwcCkgeworICAgICAgRExPRyhFUlJPUikgPDwgIkFwcGx5U3luY0RhdGFDaGFuZ2UgZXJyb3I6IG5vIGFwcCB0byBkZWxldGUiOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBleGlzdGluZ193ZWJfYXBwLT5SZW1vdmVTb3VyY2UoU291cmNlOjprU3luYyk7CisKKyAgICBpZiAoZXhpc3Rpbmdfd2ViX2FwcC0+SGFzQW55U291cmNlcygpKQorICAgICAgdXBkYXRlX2xvY2FsX2RhdGEtPmFwcHNfdG9fdXBkYXRlLmluc2VydChleGlzdGluZ193ZWJfYXBwKTsKKyAgICBlbHNlCisgICAgICB1cGRhdGVfbG9jYWxfZGF0YS0+YXBwc190b19kZWxldGUucHVzaF9iYWNrKGFwcF9pZCk7CisKKyAgICByZXR1cm47CisgIH0KKworICAvLyBIYW5kbGUgRW50aXR5Q2hhbmdlOjpBQ1RJT05fQUREIGFuZCBFbnRpdHlDaGFuZ2U6OkFDVElPTl9VUERBVEUuCisgIERDSEVDSyhjaGFuZ2UuZGF0YSgpLnNwZWNpZmljcy5oYXNfd2ViX2FwcCgpKTsKKyAgY29uc3Qgc3luY19wYjo6V2ViQXBwU3BlY2lmaWNzJiBzcGVjaWZpY3MgPSBjaGFuZ2UuZGF0YSgpLnNwZWNpZmljcy53ZWJfYXBwKCk7CisKKyAgaWYgKGV4aXN0aW5nX3dlYl9hcHApIHsKKyAgICAvLyBBbnkgZW50aXRpZXMgdGhhdCBhcHBlYXIgaW4gYm90aCBzZXRzIG11c3QgYmUgbWVyZ2VkLgorICAgIEFwcGx5U3luY0RhdGFUb0FwcChzcGVjaWZpY3MsIGV4aXN0aW5nX3dlYl9hcHApOworICAgIC8vIFByZXNlcnZlIHdlYl9hcHAtPmlzX2xvY2FsbHlfaW5zdGFsbGVkIHVzZXIncyBjaG9pY2UgaGVyZS4KKworICAgIHVwZGF0ZV9sb2NhbF9kYXRhLT5hcHBzX3RvX3VwZGF0ZS5pbnNlcnQoZXhpc3Rpbmdfd2ViX2FwcCk7CisgIH0gZWxzZSB7CisgICAgLy8gQW55IHJlbW90ZSBlbnRpdGllcyB0aGF0IGRvbuKAmXQgZXhpc3QgbG9jYWxseSBtdXN0IGJlIHdyaXR0ZW4gdG8gbG9jYWwKKyAgICAvLyBzdG9yYWdlLgorICAgIGF1dG8gd2ViX2FwcCA9IHN0ZDo6bWFrZV91bmlxdWU8V2ViQXBwPihhcHBfaWQpOworCisgICAgLy8gUmVxdWVzdCBhIGZvbGxvd3VwIHN5bmMtaW5pdGlhdGVkIGluc3RhbGwgZm9yIHRoaXMgcGxhY2Vob2xkZXIgdG8gZmV0Y2gKKyAgICAvLyBmdWxsIGxvY2FsIGRhdGEgYW5kIGFsbCB0aGUgaWNvbnMuCisgICAgd2ViX2FwcC0+U2V0SXNTeW5jUGxhY2Vob2xkZXIodHJ1ZSk7CisKKyAgICBBcHBseVN5bmNEYXRhVG9BcHAoc3BlY2lmaWNzLCB3ZWJfYXBwLmdldCgpKTsKKworICAgIC8vIEZvciBhIG5ldyBhcHAsIGF1dG9tYXRpY2FsbHkgY2hvb3NlIGlmIHdlIHdhbnQgdG8gaW5zdGFsbCBpdCBsb2NhbGx5LgorICAgIHdlYl9hcHAtPlNldElzTG9jYWxseUluc3RhbGxlZChBcmVBcHBzTG9jYWxseUluc3RhbGxlZEJ5RGVmYXVsdCgpKTsKKworICAgIHVwZGF0ZV9sb2NhbF9kYXRhLT5hcHBzX3RvX2NyZWF0ZS5wdXNoX2JhY2soc3RkOjptb3ZlKHdlYl9hcHApKTsKKyAgfQorfQorCit2b2lkIFdlYkFwcFN5bmNCcmlkZ2U6OkFwcGx5U3luY0NoYW5nZXNUb1JlZ2lzdHJhcigKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8UmVnaXN0cnlVcGRhdGVEYXRhPiB1cGRhdGVfbG9jYWxfZGF0YSkgeworICBzdGQ6OnZlY3RvcjxXZWJBcHAqPiBhcHBzX3RvX2luc3RhbGw7CisgIGZvciAoY29uc3QgYXV0byYgd2ViX2FwcCA6IHVwZGF0ZV9sb2NhbF9kYXRhLT5hcHBzX3RvX2NyZWF0ZSkKKyAgICBhcHBzX3RvX2luc3RhbGwucHVzaF9iYWNrKHdlYl9hcHAuZ2V0KCkpOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxXZWJBcHA+PiBhcHBzX3VucmVnaXN0ZXJlZCA9CisgICAgICBVcGRhdGVSZWdpc3RyYXIoc3RkOjptb3ZlKHVwZGF0ZV9sb2NhbF9kYXRhKSk7CisKKyAgLy8gRG8gYSBmdWxsIGZvbGxvdyB1cCBpbnN0YWxsIGZvciBhbGwgcmVtb3RlIGVudGl0aWVzIHRoYXQgZG9u4oCZdCBleGlzdAorICAvLyBsb2NhbGx5LgorICBpbnN0YWxsX2RlbGVnYXRlXy0+SW5zdGFsbFdlYkFwcHNBZnRlclN5bmMoc3RkOjptb3ZlKGFwcHNfdG9faW5zdGFsbCkpOworCisgIC8vIERvIGEgZnVsbCBmb2xsb3cgdXAgdW5pbnN0YWxsIGZvciBhbGwgZGVsZXRlZCByZW1vdGUgZW50aXRpZXMgdGhhdCBleGlzdAorICAvLyBsb2NhbGx5IGFuZCBub3QgbmVlZGVkIGJ5IG90aGVyIHNvdXJjZXMuIFdlIG5lZWQgdG8gY2xlYW4gdXAgZGlzayBkYXRhCisgIC8vIChpY29ucykuCisgIGluc3RhbGxfZGVsZWdhdGVfLT5Vbmluc3RhbGxXZWJBcHBzQWZ0ZXJTeW5jKHN0ZDo6bW92ZShhcHBzX3VucmVnaXN0ZXJlZCkpOworfQorCiBzdGQ6OnVuaXF1ZV9wdHI8c3luY2VyOjpNZXRhZGF0YUNoYW5nZUxpc3Q+CiBXZWJBcHBTeW5jQnJpZGdlOjpDcmVhdGVNZXRhZGF0YUNoYW5nZUxpc3QoKSB7CiAgIHJldHVybiBzeW5jZXI6Ok1vZGVsVHlwZVN0b3JlOjpXcml0ZUJhdGNoOjpDcmVhdGVNZXRhZGF0YUNoYW5nZUxpc3QoKTsKQEAgLTIwMywxNCArNDA1LDQyIEBACiBiYXNlOjpPcHRpb25hbDxzeW5jZXI6Ok1vZGVsRXJyb3I+IFdlYkFwcFN5bmNCcmlkZ2U6Ok1lcmdlU3luY0RhdGEoCiAgICAgc3RkOjp1bmlxdWVfcHRyPHN5bmNlcjo6TWV0YWRhdGFDaGFuZ2VMaXN0PiBtZXRhZGF0YV9jaGFuZ2VfbGlzdCwKICAgICBzeW5jZXI6OkVudGl0eUNoYW5nZUxpc3QgZW50aXR5X2RhdGEpIHsKLSAgTk9USU1QTEVNRU5URUQoKTsKKyAgRENIRUNLKGNoYW5nZV9wcm9jZXNzb3IoKS0+SXNUcmFja2luZ01ldGFkYXRhKCkpOworCisgIGF1dG8gdXBkYXRlX2xvY2FsX2RhdGEgPSBzdGQ6Om1ha2VfdW5pcXVlPFJlZ2lzdHJ5VXBkYXRlRGF0YT4oKTsKKworICBkYXRhYmFzZV8tPkJlZ2luVHJhbnNhY3Rpb24oKTsKKworICBmb3IgKGNvbnN0IGF1dG8mIGNoYW5nZSA6IGVudGl0eV9kYXRhKSB7CisgICAgRENIRUNLX05FKGNoYW5nZS0+dHlwZSgpLCBzeW5jZXI6OkVudGl0eUNoYW5nZTo6QUNUSU9OX0RFTEVURSk7CisgICAgQXBwbHlTeW5jRGF0YUNoYW5nZSgqY2hhbmdlLCB1cGRhdGVfbG9jYWxfZGF0YS5nZXQoKSk7CisgIH0KKworICBNZXJnZUxvY2FsQXBwc1RvU3luYyhlbnRpdHlfZGF0YSwgbWV0YWRhdGFfY2hhbmdlX2xpc3QuZ2V0KCkpOworCisgIGRhdGFiYXNlXy0+Q29tbWl0VHJhbnNhY3Rpb24oCisgICAgICAqdXBkYXRlX2xvY2FsX2RhdGEsIHN0ZDo6bW92ZShtZXRhZGF0YV9jaGFuZ2VfbGlzdCksIGJhc2U6OkRvTm90aGluZygpKTsKKworICBBcHBseVN5bmNDaGFuZ2VzVG9SZWdpc3RyYXIoc3RkOjptb3ZlKHVwZGF0ZV9sb2NhbF9kYXRhKSk7CiAgIHJldHVybiBiYXNlOjpudWxsb3B0OwogfQogCiBiYXNlOjpPcHRpb25hbDxzeW5jZXI6Ok1vZGVsRXJyb3I+IFdlYkFwcFN5bmNCcmlkZ2U6OkFwcGx5U3luY0NoYW5nZXMoCiAgICAgc3RkOjp1bmlxdWVfcHRyPHN5bmNlcjo6TWV0YWRhdGFDaGFuZ2VMaXN0PiBtZXRhZGF0YV9jaGFuZ2VfbGlzdCwKICAgICBzeW5jZXI6OkVudGl0eUNoYW5nZUxpc3QgZW50aXR5X2NoYW5nZXMpIHsKLSAgTk9USU1QTEVNRU5URUQoKTsKKyAgRENIRUNLKGNoYW5nZV9wcm9jZXNzb3IoKS0+SXNUcmFja2luZ01ldGFkYXRhKCkpOworCisgIGF1dG8gdXBkYXRlX2xvY2FsX2RhdGEgPSBzdGQ6Om1ha2VfdW5pcXVlPFJlZ2lzdHJ5VXBkYXRlRGF0YT4oKTsKKworICBkYXRhYmFzZV8tPkJlZ2luVHJhbnNhY3Rpb24oKTsKKworICBmb3IgKGNvbnN0IGF1dG8mIGNoYW5nZSA6IGVudGl0eV9jaGFuZ2VzKQorICAgIEFwcGx5U3luY0RhdGFDaGFuZ2UoKmNoYW5nZSwgdXBkYXRlX2xvY2FsX2RhdGEuZ2V0KCkpOworCisgIGRhdGFiYXNlXy0+Q29tbWl0VHJhbnNhY3Rpb24oCisgICAgICAqdXBkYXRlX2xvY2FsX2RhdGEsIHN0ZDo6bW92ZShtZXRhZGF0YV9jaGFuZ2VfbGlzdCksIGJhc2U6OkRvTm90aGluZygpKTsKKworICBBcHBseVN5bmNDaGFuZ2VzVG9SZWdpc3RyYXIoc3RkOjptb3ZlKHVwZGF0ZV9sb2NhbF9kYXRhKSk7CiAgIHJldHVybiBiYXNlOjpudWxsb3B0OwogfQogCmRpZmYgLS1naXQgYS9jaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL3dlYl9hcHBfc3luY19icmlkZ2UuaCBiL2Nocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvd2ViX2FwcF9zeW5jX2JyaWRnZS5oCmluZGV4IGQxNTBlMWIuLjljNTQ5YjQgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvd2ViX2FwcF9zeW5jX2JyaWRnZS5oCisrKyBiL2Nocm9tZS9icm93c2VyL3dlYl9hcHBsaWNhdGlvbnMvd2ViX2FwcF9zeW5jX2JyaWRnZS5oCkBAIC0xNCwxMiArMTQsMTQgQEAKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL2NvbXBvbmVudHMvYXBwX3JlZ2lzdHJ5X2NvbnRyb2xsZXIuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL3dlYl9hcHAuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL3dlYl9hcHBfcmVnaXN0cmFyLmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9zeW5jL21vZGVsL2VudGl0eV9jaGFuZ2UuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL3N5bmMvbW9kZWwvbW9kZWxfdHlwZV9zeW5jX2JyaWRnZS5oIgogCiBjbGFzcyBQcm9maWxlOwogCiBuYW1lc3BhY2Ugc3luY2VyIHsKIGNsYXNzIE1ldGFkYXRhQmF0Y2g7CitjbGFzcyBNZXRhZGF0YUNoYW5nZUxpc3Q7CiBjbGFzcyBNb2RlbEVycm9yOwogY2xhc3MgTW9kZWxUeXBlQ2hhbmdlUHJvY2Vzc29yOwogfSAgLy8gbmFtZXNwYWNlIHN5bmNlcgpAQCAtMjcsNiArMjksNyBAQAogbmFtZXNwYWNlIHdlYl9hcHAgewogCiBjbGFzcyBBYnN0cmFjdFdlYkFwcERhdGFiYXNlRmFjdG9yeTsKK2NsYXNzIFN5bmNJbnN0YWxsRGVsZWdhdGU7CiBjbGFzcyBXZWJBcHBEYXRhYmFzZTsKIGNsYXNzIFdlYkFwcFJlZ2lzdHJ5VXBkYXRlOwogc3RydWN0IFJlZ2lzdHJ5VXBkYXRlRGF0YTsKQEAgLTM4LDEyICs0MSwxNCBAQAogIHB1YmxpYzoKICAgV2ViQXBwU3luY0JyaWRnZShQcm9maWxlKiBwcm9maWxlLAogICAgICAgICAgICAgICAgICAgIEFic3RyYWN0V2ViQXBwRGF0YWJhc2VGYWN0b3J5KiBkYXRhYmFzZV9mYWN0b3J5LAotICAgICAgICAgICAgICAgICAgIFdlYkFwcFJlZ2lzdHJhck11dGFibGUqIHJlZ2lzdHJhcik7CisgICAgICAgICAgICAgICAgICAgV2ViQXBwUmVnaXN0cmFyTXV0YWJsZSogcmVnaXN0cmFyLAorICAgICAgICAgICAgICAgICAgIFN5bmNJbnN0YWxsRGVsZWdhdGUqIGluc3RhbGxfZGVsZWdhdGUpOwogICAvLyBUZXN0cyBtYXkgaW5qZWN0IG1vY2tzIHVzaW5nIHRoaXMgY3Rvci4KICAgV2ViQXBwU3luY0JyaWRnZSgKICAgICAgIFByb2ZpbGUqIHByb2ZpbGUsCiAgICAgICBBYnN0cmFjdFdlYkFwcERhdGFiYXNlRmFjdG9yeSogZGF0YWJhc2VfZmFjdG9yeSwKICAgICAgIFdlYkFwcFJlZ2lzdHJhck11dGFibGUqIHJlZ2lzdHJhciwKKyAgICAgIFN5bmNJbnN0YWxsRGVsZWdhdGUqIGluc3RhbGxfZGVsZWdhdGUsCiAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8c3luY2VyOjpNb2RlbFR5cGVDaGFuZ2VQcm9jZXNzb3I+IGNoYW5nZV9wcm9jZXNzb3IpOwogICB+V2ViQXBwU3luY0JyaWRnZSgpIG92ZXJyaWRlOwogCkBAIC02NCw4ICs2OSwxNSBAQAogCiAgcHJpdmF0ZToKICAgdm9pZCBDaGVja1JlZ2lzdHJ5VXBkYXRlRGF0YShjb25zdCBSZWdpc3RyeVVwZGF0ZURhdGEmIHVwZGF0ZV9kYXRhKSBjb25zdDsKLSAgLy8gVXBkYXRlIHRoZSBpbi1tZW1vcnkgbW9kZWwuCi0gIHZvaWQgVXBkYXRlUmVnaXN0cmFyKHN0ZDo6dW5pcXVlX3B0cjxSZWdpc3RyeVVwZGF0ZURhdGE+IHVwZGF0ZV9kYXRhKTsKKworICAvLyBVcGRhdGUgdGhlIGluLW1lbW9yeSBtb2RlbC4gUmV0dXJucyB1bnJlZ2lzdGVyZWQgYXBwcyB3aGljaCBtYXkgYmUKKyAgLy8gZGlzcG9zZWQuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxXZWJBcHA+PiBVcGRhdGVSZWdpc3RyYXIoCisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UmVnaXN0cnlVcGRhdGVEYXRhPiB1cGRhdGVfZGF0YSk7CisKKyAgLy8gVXBkYXRlIHRoZSByZW1vdGUgc3luYyBzZXJ2ZXIuCisgIHZvaWQgVXBkYXRlU3luYyhjb25zdCBSZWdpc3RyeVVwZGF0ZURhdGEmIHVwZGF0ZV9kYXRhLAorICAgICAgICAgICAgICAgICAgc3luY2VyOjpNZXRhZGF0YUNoYW5nZUxpc3QqIG1ldGFkYXRhX2NoYW5nZV9saXN0KTsKIAogICB2b2lkIE9uRGF0YWJhc2VPcGVuZWQoYmFzZTo6T25jZUNsb3N1cmUgY2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RyeSByZWdpc3RyeSwKQEAgLTc0LDYgKzg2LDE3IEBACiAKICAgdm9pZCBSZXBvcnRFcnJvclRvQ2hhbmdlUHJvY2Vzc29yKGNvbnN0IHN5bmNlcjo6TW9kZWxFcnJvciYgZXJyb3IpOwogCisgIC8vIEFueSBsb2NhbCBlbnRpdGllcyB0aGF0IGRvbuKAmXQgZXhpc3QgcmVtb3RlbHkgbXVzdCBiZSBwcm92aWRlZCB0byBzeW5jLgorICB2b2lkIE1lcmdlTG9jYWxBcHBzVG9TeW5jKGNvbnN0IHN5bmNlcjo6RW50aXR5Q2hhbmdlTGlzdCYgZW50aXR5X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2VyOjpNZXRhZGF0YUNoYW5nZUxpc3QqIG1ldGFkYXRhX2NoYW5nZV9saXN0KTsKKworICB2b2lkIEFwcGx5U3luY0RhdGFDaGFuZ2UoY29uc3Qgc3luY2VyOjpFbnRpdHlDaGFuZ2UmIGNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdHJ5VXBkYXRlRGF0YSogdXBkYXRlX2xvY2FsX2RhdGEpOworCisgIC8vIFVwZGF0ZSByZWdpc3RyYXIgYW5kIEluc3RhbGwvVW5pbnN0YWxsIG1pc3NpbmcvZXhjZXNzaXZlIGxvY2FsIGFwcHMuCisgIHZvaWQgQXBwbHlTeW5jQ2hhbmdlc1RvUmVnaXN0cmFyKAorICAgICAgc3RkOjp1bmlxdWVfcHRyPFJlZ2lzdHJ5VXBkYXRlRGF0YT4gdXBkYXRlX2xvY2FsX2RhdGEpOworCiAgIC8vIHN5bmNlcjo6TW9kZWxUeXBlU3luY0JyaWRnZToKICAgc3RkOjp1bmlxdWVfcHRyPHN5bmNlcjo6TWV0YWRhdGFDaGFuZ2VMaXN0PiBDcmVhdGVNZXRhZGF0YUNoYW5nZUxpc3QoKQogICAgICAgb3ZlcnJpZGU7CkBAIC05MCw2ICsxMTMsNyBAQAogCiAgIHN0ZDo6dW5pcXVlX3B0cjxXZWJBcHBEYXRhYmFzZT4gZGF0YWJhc2VfOwogICBXZWJBcHBSZWdpc3RyYXJNdXRhYmxlKiBjb25zdCByZWdpc3RyYXJfOworICBTeW5jSW5zdGFsbERlbGVnYXRlKiBjb25zdCBpbnN0YWxsX2RlbGVnYXRlXzsKIAogICBib29sIGlzX2luX3VwZGF0ZV8gPSBmYWxzZTsKIApkaWZmIC0tZ2l0IGEvY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy93ZWJfYXBwX3N5bmNfaW5zdGFsbF9kZWxlZ2F0ZS5oIGIvY2hyb21lL2Jyb3dzZXIvd2ViX2FwcGxpY2F0aW9ucy93ZWJfYXBwX3N5bmNfaW5zdGFsbF9kZWxlZ2F0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYmZkMzgKLS0tIC9kZXYvbnVsbAorKysgYi9jaHJvbWUvYnJvd3Nlci93ZWJfYXBwbGljYXRpb25zL3dlYl9hcHBfc3luY19pbnN0YWxsX2RlbGVnYXRlLmgKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTkgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaWZuZGVmIENIUk9NRV9CUk9XU0VSX1dFQl9BUFBMSUNBVElPTlNfV0VCX0FQUF9TWU5DX0lOU1RBTExfREVMRUdBVEVfSF8KKyNkZWZpbmUgQ0hST01FX0JST1dTRVJfV0VCX0FQUExJQ0FUSU9OU19XRUJfQVBQX1NZTkNfSU5TVEFMTF9ERUxFR0FURV9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIHdlYl9hcHAgeworCitjbGFzcyBXZWJBcHA7CisKKy8vIFdlYkFwcFN5bmNCcmlkZ2UgZGVsZWdhdGVzIHN5bmMtaW5pdGlhdGVkIGluc3RhbGxzIGFuZCB1bmluc3RhbGxzIHVzaW5nCisvLyB0aGlzIGludGVyZmFjZS4KK2NsYXNzIFN5bmNJbnN0YWxsRGVsZWdhdGUgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+U3luY0luc3RhbGxEZWxlZ2F0ZSgpID0gZGVmYXVsdDsKKworICAvLyB8d2ViX2FwcHN8IGFyZSBhbHJlYWR5IHJlZ2lzdGVyZWQgYW5kIG93bmVkIGJ5IHRoZSByZWdpc3RyYXIuCisgIHZpcnR1YWwgdm9pZCBJbnN0YWxsV2ViQXBwc0FmdGVyU3luYyhzdGQ6OnZlY3RvcjxXZWJBcHAqPiB3ZWJfYXBwcykgPSAwOworICAvLyB8d2ViX2FwcHN8IGFyZSBhbHJlYWR5IHVucmVnaXN0ZXJlZCBhbmQgbm90IG93bmVkIGJ5IHRoZSByZWdpc3RyYXIuCisgIHZpcnR1YWwgdm9pZCBVbmluc3RhbGxXZWJBcHBzQWZ0ZXJTeW5jKAorICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFdlYkFwcD4+IHdlYl9hcHBzKSA9IDA7Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugd2ViX2FwcAorCisjZW5kaWYgIC8vIENIUk9NRV9CUk9XU0VSX1dFQl9BUFBMSUNBVElPTlNfV0VCX0FQUF9TWU5DX0lOU1RBTExfREVMRUdBVEVfSF8KZGlmZiAtLWdpdCBhL2Nocm9tZS9jb21tb24vY2hhbm5lbF9pbmZvLmggYi9jaHJvbWUvY29tbW9uL2NoYW5uZWxfaW5mby5oCmluZGV4IDg4MWEyNTUuLmMyYzZjM2MgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9jb21tb24vY2hhbm5lbF9pbmZvLmgKKysrIGIvY2hyb21lL2NvbW1vbi9jaGFubmVsX2luZm8uaApAQCAtOSw2ICs5LDEwIEBACiAKICNpbmNsdWRlICJidWlsZC9idWlsZF9jb25maWcuaCIKIAorbmFtZXNwYWNlIGJhc2UgeworY2xhc3MgRW52aXJvbm1lbnQ7Cit9CisKIG5hbWVzcGFjZSB2ZXJzaW9uX2luZm8gewogZW51bSBjbGFzcyBDaGFubmVsOwogfQpAQCAtNTEsNiArNTUsMTIgQEAKIHN0ZDo6c3RyaW5nIEdldENoYW5uZWxTdWZmaXhGb3JEYXRhRGlyKCk7CiAjZW5kaWYKIAorI2lmIGRlZmluZWQoT1NfTElOVVgpICYmICFkZWZpbmVkKE9TX0NIUk9NRU9TKQorLy8gUmV0dXJucyB0aGUgY2hhbm5lbC1zcGVjaWZpYyBmaWxlbmFtZSBvZiB0aGUgZGVza3RvcCBzaG9ydGN1dCB1c2VkIHRvIGxhdW5jaAorLy8gdGhlIGJyb3dzZXIuCitzdGQ6OnN0cmluZyBHZXREZXNrdG9wTmFtZShiYXNlOjpFbnZpcm9ubWVudCogZW52KTsKKyNlbmRpZgorCiB9ICAvLyBuYW1lc3BhY2UgY2hyb21lCiAKICNlbmRpZiAgLy8gQ0hST01FX0NPTU1PTl9DSEFOTkVMX0lORk9fSF8KZGlmZiAtLWdpdCBhL2Nocm9tZS9jb21tb24vY2hhbm5lbF9pbmZvX3Bvc2l4LmNjIGIvY2hyb21lL2NvbW1vbi9jaGFubmVsX2luZm9fcG9zaXguY2MKaW5kZXggNDdhOWUzMDEuLmQ1ZGZiZTEzIDEwMDY0NAotLS0gYS9jaHJvbWUvY29tbW9uL2NoYW5uZWxfaW5mb19wb3NpeC5jYworKysgYi9jaHJvbWUvY29tbW9uL2NoYW5uZWxfaW5mb19wb3NpeC5jYwpAQCAtNCw2ICs0LDcgQEAKIAogI2luY2x1ZGUgImNocm9tZS9jb21tb24vY2hhbm5lbF9pbmZvLmgiCiAKKyNpbmNsdWRlICJiYXNlL2Vudmlyb25tZW50LmgiCiAjaW5jbHVkZSAiYmFzZS9zdHJpbmdzL3N0cmluZ191dGlsLmgiCiAjaW5jbHVkZSAiYnVpbGQvYnJhbmRpbmdfYnVpbGRmbGFncy5oIgogI2luY2x1ZGUgImJ1aWxkL2J1aWxkX2NvbmZpZy5oIgpAQCAtNjgsNiArNjksMzAgQEAKIH0KICNlbmRpZiAgLy8gZGVmaW5lZChHT09HTEVfQ0hST01FX0JVSUxEKQogCisjaWYgZGVmaW5lZChPU19MSU5VWCkgJiYgIWRlZmluZWQoT1NfQ0hST01FT1MpCitzdGQ6OnN0cmluZyBHZXREZXNrdG9wTmFtZShiYXNlOjpFbnZpcm9ubWVudCogZW52KSB7CisjaWYgQlVJTERGTEFHKEdPT0dMRV9DSFJPTUVfQlJBTkRJTkcpCisgIHZlcnNpb25faW5mbzo6Q2hhbm5lbCBwcm9kdWN0X2NoYW5uZWwoR2V0Q2hhbm5lbCgpKTsKKyAgc3dpdGNoIChwcm9kdWN0X2NoYW5uZWwpIHsKKyAgICBjYXNlIHZlcnNpb25faW5mbzo6Q2hhbm5lbDo6REVWOgorICAgICAgcmV0dXJuICJnb29nbGUtY2hyb21lLXVuc3RhYmxlLmRlc2t0b3AiOworICAgIGNhc2UgdmVyc2lvbl9pbmZvOjpDaGFubmVsOjpCRVRBOgorICAgICAgcmV0dXJuICJnb29nbGUtY2hyb21lLWJldGEuZGVza3RvcCI7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAiZ29vZ2xlLWNocm9tZS5kZXNrdG9wIjsKKyAgfQorI2Vsc2UgIC8vIEJVSUxERkxBRyhDSFJPTUlVTV9CUkFORElORykKKyAgLy8gQWxsb3cgJENIUk9NRV9ERVNLVE9QIHRvIG92ZXJyaWRlIHRoZSBidWlsdC1pbiB2YWx1ZSwgc28gdGhhdCBkZXZlbG9wbWVudAorICAvLyB2ZXJzaW9ucyBjYW4gc2V0IHRoZW1zZWx2ZXMgYXMgdGhlIGRlZmF1bHQgd2l0aG91dCBpbnRlcmZlcmluZyB3aXRoCisgIC8vIG5vbi1vZmZpY2lhbCwgcGFja2FnZWQgdmVyc2lvbnMgdXNpbmcgdGhlIGJ1aWx0LWluIHZhbHVlLgorICBzdGQ6OnN0cmluZyBuYW1lOworICBpZiAoZW52LT5HZXRWYXIoIkNIUk9NRV9ERVNLVE9QIiwgJm5hbWUpICYmICFuYW1lLmVtcHR5KCkpCisgICAgcmV0dXJuIG5hbWU7CisgIHJldHVybiAiY2hyb21pdW0tYnJvd3Nlci5kZXNrdG9wIjsKKyNlbmRpZgorfQorI2VuZGlmICAvLyBkZWZpbmVkKE9TX0xJTlVYKSAmJiAhZGVmaW5lZChPU19DSFJPTUVPUykKKwogdmVyc2lvbl9pbmZvOjpDaGFubmVsIEdldENoYW5uZWwoKSB7CiAgIHJldHVybiBHZXRDaGFubmVsSW1wbChudWxscHRyLCBudWxscHRyKTsKIH0KZGlmZiAtLWdpdCBhL2Nocm9tZS9jb21tb24vY2hyb21lX2ZlYXR1cmVzLmNjIGIvY2hyb21lL2NvbW1vbi9jaHJvbWVfZmVhdHVyZXMuY2MKaW5kZXggMzFlY2E5YWEyLi5kOWE1OWM0NiAxMDA2NDQKLS0tIGEvY2hyb21lL2NvbW1vbi9jaHJvbWVfZmVhdHVyZXMuY2MKKysrIGIvY2hyb21lL2NvbW1vbi9jaHJvbWVfZmVhdHVyZXMuY2MKQEAgLTE0Miw2ICsxNDIsMTYgQEAKICAgICAiVGhpcmRQYXJ0eU1vZHVsZXNCbG9ja2luZyIsIGJhc2U6OkZFQVRVUkVfRElTQUJMRURfQllfREVGQVVMVH07CiAjZW5kaWYKIAorLy8gRW5hYmxlcyB0aGUgYWRkaXRpb25hbCBUTFMgMS4zIHNlcnZlci1yYW5kb20tYmFzZWQgZG93bmdyYWRlIHByb3RlY3Rpb24KKy8vIGRlc2NyaWJlZCBpbiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjODQ0NiNzZWN0aW9uLTQuMS4zIGZvcgorLy8gY29ubmVjdGlvbnMgd2hpY2ggY2hhaW4gdG8gYSBsb2NhbCB0cnVzdCBhbmNob3IuIFRoZSBwcm90ZWN0aW9uIGlzCisvLyB1bmNvbmRpdGlvbmFsbHkgZW5hYmxlZCBmb3Iga25vd24gdHJ1c3QgYW5jaG9ycy4KKy8vCisvLyBUaGlzIGlzIGEgTVVTVC1sZXZlbCByZXF1aXJlbWVudCBvZiBUTFMgMS4zLCBidXQgbWF5IGhhdmUgY29tcGF0aWJpbGl0eQorLy8gaXNzdWVzIHdpdGggc29tZSBvdXRkYXRlZCBidWdneSBUTFMtdGVybWluYXRpbmcgcHJveGllcy4KK2NvbnN0IGJhc2U6OkZlYXR1cmUga1RMUzEzSGFyZGVuaW5nRm9yTG9jYWxBbmNob3JzeworICAgICJUTFMxM0hhcmRlbmluZ0ZvckxvY2FsQW5jaG9ycyIsIGJhc2U6OkZFQVRVUkVfRElTQUJMRURfQllfREVGQVVMVH07CisKICNpZiAoZGVmaW5lZChPU19MSU5VWCkgJiYgIWRlZmluZWQoT1NfQ0hST01FT1MpKSB8fCBkZWZpbmVkKE9TX01BQ09TWCkKIC8vIEVuYWJsZXMgdGhlIGR1YWwgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIHRyaWFsIGZlYXR1cmUuCiAvLyBodHRwczovL2NyYnVnLmNvbS82NDkwMjYKQEAgLTc3MywxMCArNzgzLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpGRUFUVVJFX0VOQUJMRURfQllfREVGQVVMVH07CiAjZW5kaWYKIAotLy8gRW5hYmxlcyB1c2luZyB0aGUgbWFpbiBIVFRQIGNhY2hlIGZvciBtZWRpYSBmaWxlcyBhcyB3ZWxsLgotY29uc3QgYmFzZTo6RmVhdHVyZSBrVXNlU2FtZUNhY2hlRm9yTWVkaWF7IlVzZVNhbWVDYWNoZUZvck1lZGlhIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkZFQVRVUkVfRElTQUJMRURfQllfREVGQVVMVH07Ci0KICNpZiBkZWZpbmVkKE9TX0NIUk9NRU9TKQogLy8gRW5hYmxlcyBzdXBwb3J0IG9mIGxpYmN1cHMgQVBJcyBmcm9tIEFSQwogY29uc3QgYmFzZTo6RmVhdHVyZSBrQXJjQ3Vwc0FwaXsiQXJjQ3Vwc0FwaSIsCmRpZmYgLS1naXQgYS9jaHJvbWUvY29tbW9uL2Nocm9tZV9mZWF0dXJlcy5oIGIvY2hyb21lL2NvbW1vbi9jaHJvbWVfZmVhdHVyZXMuaAppbmRleCA1ZDg5MWNjLi5lMWM4OGYxIDEwMDY0NAotLS0gYS9jaHJvbWUvY29tbW9uL2Nocm9tZV9mZWF0dXJlcy5oCisrKyBiL2Nocm9tZS9jb21tb24vY2hyb21lX2ZlYXR1cmVzLmgKQEAgLTQ1MCw2ICs0NTAsOSBAQAogI2VuZGlmCiAKIENPTVBPTkVOVF9FWFBPUlQoQ0hST01FX0ZFQVRVUkVTKQorZXh0ZXJuIGNvbnN0IGJhc2U6OkZlYXR1cmUga1RMUzEzSGFyZGVuaW5nRm9yTG9jYWxBbmNob3JzOworCitDT01QT05FTlRfRVhQT1JUKENIUk9NRV9GRUFUVVJFUykKIGV4dGVybiBjb25zdCBiYXNlOjpGZWF0dXJlIGtUcmVhdFVuc2FmZURvd25sb2Fkc0FzQWN0aXZlOwogQ09NUE9ORU5UX0VYUE9SVChDSFJPTUVfRkVBVFVSRVMpCiBleHRlcm4gY29uc3QgY2hhciBrVHJlYXRVbnNhZmVEb3dubG9hZHNBc0FjdGl2ZVBhcmFtTmFtZVtdOwpAQCAtNDg3LDkgKzQ5MCw2IEBACiAKICNlbmRpZgogCi1DT01QT05FTlRfRVhQT1JUKENIUk9NRV9GRUFUVVJFUykKLWV4dGVybiBjb25zdCBiYXNlOjpGZWF0dXJlIGtVc2VTYW1lQ2FjaGVGb3JNZWRpYTsKLQogI2lmIGRlZmluZWQoT1NfQ0hST01FT1MpCiBDT01QT05FTlRfRVhQT1JUKENIUk9NRV9GRUFUVVJFUykgZXh0ZXJuIGNvbnN0IGJhc2U6OkZlYXR1cmUga0FyY0N1cHNBcGk7CiAKZGlmZiAtLWdpdCBhL2Nocm9tZS9jb21tb24vcHJlZl9uYW1lcy5jYyBiL2Nocm9tZS9jb21tb24vcHJlZl9uYW1lcy5jYwppbmRleCBmYjcyYmI5Li41ZmYzZGUyIDEwMDY0NAotLS0gYS9jaHJvbWUvY29tbW9uL3ByZWZfbmFtZXMuY2MKKysrIGIvY2hyb21lL2NvbW1vbi9wcmVmX25hbWVzLmNjCkBAIC0xODgxLDYgKzE4ODEsMTEgQEAKIC8vIGZyb20gaHR0cCB0byBodHRwcy4KIGNvbnN0IGNoYXIga0hTVFNQb2xpY3lCeXBhc3NMaXN0W10gPSAiaHN0cy5wb2xpY3kudXBncmFkZV9ieXBhc3NfbGlzdCI7CiAKKy8vIElmIHRydWUsIGVuYWJsZXMgc3Ryb25nZXIgVExTIDEuMyBkb3duZ3JhZGUgcHJvdGVjdGlvbiBmb3IgY29ubmVjdGlvbnMgdXNpbmcKKy8vIGxvY2FsIHRydXN0IGFuY2hvcnMuCitjb25zdCBjaGFyIGtUTFMxM0hhcmRlbmluZ0ZvckxvY2FsQW5jaG9yc0VuYWJsZWRbXSA9CisgICAgInNzbC50bHMxM19oYXJkZW5pbmdfZm9yX2xvY2FsX2FuY2hvcnMiOworCiAvLyBCb29sZWFuIHRoYXQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGJ1aWx0LWluIGFzeW5jaHJvbm91cyBETlMgY2xpZW50IGlzIHVzZWQuCiBjb25zdCBjaGFyIGtCdWlsdEluRG5zQ2xpZW50RW5hYmxlZFtdID0gImFzeW5jX2Rucy5lbmFibGVkIjsKIApkaWZmIC0tZ2l0IGEvY2hyb21lL2NvbW1vbi9wcmVmX25hbWVzLmggYi9jaHJvbWUvY29tbW9uL3ByZWZfbmFtZXMuaAppbmRleCBjOTk5MGQzLi4wZTUyN2E4IDEwMDY0NAotLS0gYS9jaHJvbWUvY29tbW9uL3ByZWZfbmFtZXMuaAorKysgYi9jaHJvbWUvY29tbW9uL3ByZWZfbmFtZXMuaApAQCAtNzM5LDYgKzczOSw3IEBACiBleHRlcm4gY29uc3QgY2hhciBrQ2lwaGVyU3VpdGVCbGFja2xpc3RbXTsKIGV4dGVybiBjb25zdCBjaGFyIGtIMkNsaWVudENlcnRDb2FsZXNjaW5nSG9zdHNbXTsKIGV4dGVybiBjb25zdCBjaGFyIGtIU1RTUG9saWN5QnlwYXNzTGlzdFtdOworZXh0ZXJuIGNvbnN0IGNoYXIga1RMUzEzSGFyZGVuaW5nRm9yTG9jYWxBbmNob3JzRW5hYmxlZFtdOwogCiBleHRlcm4gY29uc3QgY2hhciBrQnVpbHRJbkRuc0NsaWVudEVuYWJsZWRbXTsKIGV4dGVybiBjb25zdCBjaGFyIGtEbnNPdmVySHR0cHNNb2RlW107CmRpZmYgLS1naXQgYS9jaHJvbWUvY29tbW9uL3N0YWNrX3NhbXBsaW5nX2NvbmZpZ3VyYXRpb24uY2MgYi9jaHJvbWUvY29tbW9uL3N0YWNrX3NhbXBsaW5nX2NvbmZpZ3VyYXRpb24uY2MKaW5kZXggMzVjMDc2OGUuLjJkOGMyMmUgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9jb21tb24vc3RhY2tfc2FtcGxpbmdfY29uZmlndXJhdGlvbi5jYworKysgYi9jaHJvbWUvY29tbW9uL3N0YWNrX3NhbXBsaW5nX2NvbmZpZ3VyYXRpb24uY2MKQEAgLTE1LDYgKzE1LDEwIEBACiAjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvY29tbW9uL2NvbnRlbnRfc3dpdGNoZXMuaCIKICNpbmNsdWRlICJleHRlbnNpb25zL2J1aWxkZmxhZ3MvYnVpbGRmbGFncy5oIgogCisjaWYgZGVmaW5lZChPU19XSU4pCisjaW5jbHVkZSAiYmFzZS93aW4vc3RhdGljX2NvbnN0YW50cy5oIgorI2VuZGlmCisKICNpZiBkZWZpbmVkKE9TX01BQ09TWCkKICNpbmNsdWRlICJiYXNlL21hYy9tYWNfdXRpbC5oIgogI2VuZGlmCkBAIC0xODksNiArMTkzLDEzIEBACiAgIGlmICghSXNQcm9maWxlclN1cHBvcnRlZCgpKQogICAgIHJldHVybiBQUk9GSUxFX0RJU0FCTEVEOwogCisjaWYgZGVmaW5lZChPU19XSU4pCisgIC8vIERvIG5vdCBzdGFydCB0aGUgcHJvZmlsZXIgd2hlbiBBcHBsaWNhdGlvbiBWZXJpZmllciBpcyBpbiB1c2U7IHJ1bm5pbmcgdGhlbQorICAvLyBzaW11bHRhbmVvdXNseSBjYW4gY2F1c2UgY3Jhc2hlcyBhbmQgaGFzIG5vIGtub3duIHVzZSBjYXNlLgorICBpZiAoR2V0TW9kdWxlSGFuZGxlQShiYXNlOjp3aW46OmtBcHBsaWNhdGlvblZlcmlmaWVyRGxsTmFtZSkpCisgICAgcmV0dXJuIFBST0ZJTEVfRElTQUJMRUQ7CisjZW5kaWYKKwogICBzd2l0Y2ggKGNocm9tZTo6R2V0Q2hhbm5lbCgpKSB7CiAgICAgLy8gRW5hYmxlIHRoZSBwcm9maWxlciB1bmNvbmRpdGlvbmFsbHkgZm9yIGRldmVsb3BtZW50L3dhdGVyZmFsbCBidWlsZHMuCiAgICAgY2FzZSB2ZXJzaW9uX2luZm86OkNoYW5uZWw6OlVOS05PV046CmRpZmYgLS1naXQgYS9jaHJvbWUvcmVuZGVyZXIvdHJhbnNsYXRlL3RyYW5zbGF0ZV9oZWxwZXJfYnJvd3NlcnRlc3QuY2MgYi9jaHJvbWUvcmVuZGVyZXIvdHJhbnNsYXRlL3RyYW5zbGF0ZV9oZWxwZXJfYnJvd3NlcnRlc3QuY2MKaW5kZXggMDM2Y2UyYjFkLi4wOWFjNWRjIDEwMDY0NAotLS0gYS9jaHJvbWUvcmVuZGVyZXIvdHJhbnNsYXRlL3RyYW5zbGF0ZV9oZWxwZXJfYnJvd3NlcnRlc3QuY2MKKysrIGIvY2hyb21lL3JlbmRlcmVyL3RyYW5zbGF0ZS90cmFuc2xhdGVfaGVscGVyX2Jyb3dzZXJ0ZXN0LmNjCkBAIC05Miw4ICs5Miw3IEBACiAgICAgdHJhbnNfcmVzdWx0X2Vycm9yX3R5cGVfID0gdHJhbnNsYXRlOjpUcmFuc2xhdGVFcnJvcnM6Ok5PTkU7CiAKICAgICAvLyBXaWxsIGdldCBuZXcgcmVzdWx0IHZhbHVlcyB2aWEgT25QYWdlVHJhbnNsYXRlZC4KLSAgICBUcmFuc2xhdGUodHJhbnNsYXRlX3NjcmlwdCwgbmV0d29yazo6bW9qb206OlVSTExvYWRlckZhY3RvcnlQdHIoKSwKLSAgICAgICAgICAgICAgc291cmNlX2xhbmcsIHRhcmdldF9sYW5nLAorICAgIFRyYW5zbGF0ZSh0cmFuc2xhdGVfc2NyaXB0LCBzb3VyY2VfbGFuZywgdGFyZ2V0X2xhbmcsCiAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoJlRlc3RUcmFuc2xhdGVIZWxwZXI6Ok9uUGFnZVRyYW5zbGF0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwogICB9CmRpZmYgLS1naXQgYS9jaHJvbWUvcmVuZGVyZXIvdXJsX2xvYWRlcl90aHJvdHRsZV9wcm92aWRlcl9pbXBsLmNjIGIvY2hyb21lL3JlbmRlcmVyL3VybF9sb2FkZXJfdGhyb3R0bGVfcHJvdmlkZXJfaW1wbC5jYwppbmRleCAwNzNmNDQxLi4xNjQyZDVkIDEwMDY0NAotLS0gYS9jaHJvbWUvcmVuZGVyZXIvdXJsX2xvYWRlcl90aHJvdHRsZV9wcm92aWRlcl9pbXBsLmNjCisrKyBiL2Nocm9tZS9yZW5kZXJlci91cmxfbG9hZGVyX3Rocm90dGxlX3Byb3ZpZGVyX2ltcGwuY2MKQEAgLTczLDEyICs3Myw2IEBACiAKIHZvaWQgU2V0RXh0ZW5zaW9uVGhyb3R0bGVNYW5hZ2VyVGVzdFBvbGljeSgKICAgICBleHRlbnNpb25zOjpFeHRlbnNpb25UaHJvdHRsZU1hbmFnZXIqIGV4dGVuc2lvbl90aHJvdHRsZV9tYW5hZ2VyKSB7Ci0gIC8vIFJlcXVlc3RzIGlzc3VlZCB3aXRoaW4gd2l0aGluIHxrVXNlckdlc3R1cmVXaW5kb3dNc3wgb2YgYSB1c2VyIGdlc3R1cmUKLSAgLy8gYXJlIGFsc28gY29uc2lkZXJlZCBhcyB1c2VyIGdlc3R1cmVzIChzZWUKLSAgLy8gcmVzb3VyY2VfZGlzcGF0Y2hlcl9ob3N0X2ltcGwuY2MpLCBzbyB0aGVzZSB0ZXN0cyBuZWVkIHRvIGJ5cGFzcyB0aGUKLSAgLy8gY2hlY2tpbmcgb2YgdGhlIG5ldDo6TE9BRF9NQVlCRV9VU0VSX0dFU1RVUkUgbG9hZCBmbGFnIGluIHRoZSBtYW5hZ2VyCi0gIC8vIGluIG9yZGVyIHRvIHRlc3QgdGhlIHRocm90dGxpbmcgbG9naWMuCi0gIGV4dGVuc2lvbl90aHJvdHRsZV9tYW5hZ2VyLT5TZXRJZ25vcmVVc2VyR2VzdHVyZUxvYWRGbGFnRm9yVGVzdHModHJ1ZSk7CiAgIHN0ZDo6dW5pcXVlX3B0cjxuZXQ6OkJhY2tvZmZFbnRyeTo6UG9saWN5PiBwb2xpY3koCiAgICAgICBuZXcgbmV0OjpCYWNrb2ZmRW50cnk6OlBvbGljeXsKICAgICAgICAgICAvLyBOdW1iZXIgb2YgaW5pdGlhbCBlcnJvcnMgKGluIHNlcXVlbmNlKSB0byBpZ25vcmUgYmVmb3JlCmRpZmYgLS1naXQgYS9jaHJvbWUvc2VydmljZXMvaXNvbGF0ZWRfeHJfZGV2aWNlL3hyX3J1bnRpbWVfcHJvdmlkZXIuY2MgYi9jaHJvbWUvc2VydmljZXMvaXNvbGF0ZWRfeHJfZGV2aWNlL3hyX3J1bnRpbWVfcHJvdmlkZXIuY2MKaW5kZXggYWE2ZWE1NS4uZTU0NDgwYSAxMDA2NDQKLS0tIGEvY2hyb21lL3NlcnZpY2VzL2lzb2xhdGVkX3hyX2RldmljZS94cl9ydW50aW1lX3Byb3ZpZGVyLmNjCisrKyBiL2Nocm9tZS9zZXJ2aWNlcy9pc29sYXRlZF94cl9kZXZpY2UveHJfcnVudGltZV9wcm92aWRlci5jYwpAQCAtMzksNyArMzksNyBAQAogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVnJEZXZpY2VUPgogc3RkOjp1bmlxdWVfcHRyPFZyRGV2aWNlVD4gRW5hYmxlUnVudGltZSgKLSAgICBkZXZpY2U6Om1vam9tOjpJc29sYXRlZFhSUnVudGltZVByb3ZpZGVyQ2xpZW50UHRyJiBjbGllbnQpIHsKKyAgICBkZXZpY2U6Om1vam9tOjpJc29sYXRlZFhSUnVudGltZVByb3ZpZGVyQ2xpZW50KiBjbGllbnQpIHsKICAgYXV0byBkZXZpY2UgPSBzdGQ6Om1ha2VfdW5pcXVlPFZyRGV2aWNlVD4oKTsKICAgVFJBQ0VfRVZFTlRfSU5TVEFOVDEoInhyIiwgIkhhcmR3YXJlQWRkZWQiLCBUUkFDRV9FVkVOVF9TQ09QRV9USFJFQUQsICJpZCIsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oZGV2aWNlLT5HZXRJZCgpKSk7CkBAIC01Miw3ICs1Miw3IEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBWckRldmljZVQ+Ci12b2lkIERpc2FibGVSdW50aW1lKGRldmljZTo6bW9qb206Oklzb2xhdGVkWFJSdW50aW1lUHJvdmlkZXJDbGllbnRQdHImIGNsaWVudCwKK3ZvaWQgRGlzYWJsZVJ1bnRpbWUoZGV2aWNlOjptb2pvbTo6SXNvbGF0ZWRYUlJ1bnRpbWVQcm92aWRlckNsaWVudCogY2xpZW50LAogICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8VnJEZXZpY2VUPiBkZXZpY2UpIHsKICAgVFJBQ0VfRVZFTlRfSU5TVEFOVDEoInhyIiwgIkhhcmR3YXJlUmVtb3ZlZCIsIFRSQUNFX0VWRU5UX1NDT1BFX1RIUkVBRCwgImlkIiwKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihkZXZpY2UtPkdldElkKCkpKTsKQEAgLTYyLDcgKzYyLDcgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFZySGFyZHdhcmVUPgotdm9pZCBTZXRSdW50aW1lU3RhdHVzKGRldmljZTo6bW9qb206Oklzb2xhdGVkWFJSdW50aW1lUHJvdmlkZXJDbGllbnRQdHImIGNsaWVudCwKK3ZvaWQgU2V0UnVudGltZVN0YXR1cyhkZXZpY2U6Om1vam9tOjpJc29sYXRlZFhSUnVudGltZVByb3ZpZGVyQ2xpZW50KiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgSXNvbGF0ZWRYUlJ1bnRpbWVQcm92aWRlcjo6UnVudGltZVN0YXR1cyBzdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFZySGFyZHdhcmVUPiogb3V0X2RldmljZSkgewogICBpZiAoc3RhdHVzID09IElzb2xhdGVkWFJSdW50aW1lUHJvdmlkZXI6OlJ1bnRpbWVTdGF0dXM6OmtFbmFibGUgJiYKQEAgLTE3MSw5ICsxNzEsMTAgQEAKIH0KIAogdm9pZCBJc29sYXRlZFhSUnVudGltZVByb3ZpZGVyOjpSZXF1ZXN0RGV2aWNlcygKLSAgICBkZXZpY2U6Om1vam9tOjpJc29sYXRlZFhSUnVudGltZVByb3ZpZGVyQ2xpZW50UHRyIGNsaWVudCkgeworICAgIG1vam86OlBlbmRpbmdSZW1vdGU8ZGV2aWNlOjptb2pvbTo6SXNvbGF0ZWRYUlJ1bnRpbWVQcm92aWRlckNsaWVudD4KKyAgICAgICAgY2xpZW50KSB7CiAgIC8vIFN0YXJ0IHBvbGxpbmcgdG8gZGV0ZWN0IGRldmljZXMgYmVpbmcgYWRkZWQvcmVtb3ZlZC4KLSAgY2xpZW50XyA9IHN0ZDo6bW92ZShjbGllbnQpOworICBjbGllbnRfLkJpbmQoc3RkOjptb3ZlKGNsaWVudCkpOwogICBTZXR1cFBvbGxpbmdGb3JEZXZpY2VDaGFuZ2VzKCk7CiAgIGNsaWVudF8tPk9uRGV2aWNlc0VudW1lcmF0ZWQoKTsKIH0KQEAgLTE4Niw3ICsxODcsNyBAQAogfQogCiB2b2lkIElzb2xhdGVkWFJSdW50aW1lUHJvdmlkZXI6OlNldE9jdWx1c1ZyUnVudGltZVN0YXR1cyhSdW50aW1lU3RhdHVzIHN0YXR1cykgewotICBTZXRSdW50aW1lU3RhdHVzKGNsaWVudF8sIHN0YXR1cywgJm9jdWx1c19kZXZpY2VfKTsKKyAgU2V0UnVudGltZVN0YXR1cyhjbGllbnRfLmdldCgpLCBzdGF0dXMsICZvY3VsdXNfZGV2aWNlXyk7CiB9CiAjZW5kaWYgIC8vIEJVSUxERkxBRyhFTkFCTEVfT0NVTFVTX1ZSKQogCkBAIC0xOTgsNyArMTk5LDcgQEAKIH0KIAogdm9pZCBJc29sYXRlZFhSUnVudGltZVByb3ZpZGVyOjpTZXRPcGVuVnJSdW50aW1lU3RhdHVzKFJ1bnRpbWVTdGF0dXMgc3RhdHVzKSB7Ci0gIFNldFJ1bnRpbWVTdGF0dXMoY2xpZW50Xywgc3RhdHVzLCAmb3BlbnZyX2RldmljZV8pOworICBTZXRSdW50aW1lU3RhdHVzKGNsaWVudF8uZ2V0KCksIHN0YXR1cywgJm9wZW52cl9kZXZpY2VfKTsKIH0KICNlbmRpZiAgLy8gQlVJTERGTEFHKEVOQUJMRV9PUEVOVlIpCiAKQEAgLTIwOCw3ICsyMDksNyBAQAogfQogCiB2b2lkIElzb2xhdGVkWFJSdW50aW1lUHJvdmlkZXI6OlNldFdNUlJ1bnRpbWVTdGF0dXMoUnVudGltZVN0YXR1cyBzdGF0dXMpIHsKLSAgU2V0UnVudGltZVN0YXR1cyhjbGllbnRfLCBzdGF0dXMsICZ3bXJfZGV2aWNlXyk7CisgIFNldFJ1bnRpbWVTdGF0dXMoY2xpZW50Xy5nZXQoKSwgc3RhdHVzLCAmd21yX2RldmljZV8pOwogfQogI2VuZGlmICAvLyBCVUlMREZMQUcoRU5BQkxFX1dJTkRPV1NfTVIpCiAKQEAgLTIxOCw3ICsyMTksNyBAQAogfQogCiB2b2lkIElzb2xhdGVkWFJSdW50aW1lUHJvdmlkZXI6OlNldE9wZW5YclJ1bnRpbWVTdGF0dXMoUnVudGltZVN0YXR1cyBzdGF0dXMpIHsKLSAgU2V0UnVudGltZVN0YXR1cyhjbGllbnRfLCBzdGF0dXMsICZvcGVueHJfZGV2aWNlXyk7CisgIFNldFJ1bnRpbWVTdGF0dXMoY2xpZW50Xy5nZXQoKSwgc3RhdHVzLCAmb3BlbnhyX2RldmljZV8pOwogfQogI2VuZGlmICAvLyBCVUlMREZMQUcoRU5BQkxFX09QRU5YUikKIApkaWZmIC0tZ2l0IGEvY2hyb21lL3NlcnZpY2VzL2lzb2xhdGVkX3hyX2RldmljZS94cl9ydW50aW1lX3Byb3ZpZGVyLmggYi9jaHJvbWUvc2VydmljZXMvaXNvbGF0ZWRfeHJfZGV2aWNlL3hyX3J1bnRpbWVfcHJvdmlkZXIuaAppbmRleCAxZDhiODc4NC4uNGNkZjY0N2UgMTAwNjQ0Ci0tLSBhL2Nocm9tZS9zZXJ2aWNlcy9pc29sYXRlZF94cl9kZXZpY2UveHJfcnVudGltZV9wcm92aWRlci5oCisrKyBiL2Nocm9tZS9zZXJ2aWNlcy9pc29sYXRlZF94cl9kZXZpY2UveHJfcnVudGltZV9wcm92aWRlci5oCkBAIC05LDYgKzksOCBAQAogCiAjaW5jbHVkZSAiZGV2aWNlL3ZyL2J1aWxkZmxhZ3MvYnVpbGRmbGFncy5oIgogI2luY2x1ZGUgImRldmljZS92ci9wdWJsaWMvbW9qb20vaXNvbGF0ZWRfeHJfc2VydmljZS5tb2pvbS5oIgorI2luY2x1ZGUgIm1vam8vcHVibGljL2NwcC9iaW5kaW5ncy9wZW5kaW5nX3JlbW90ZS5oIgorI2luY2x1ZGUgIm1vam8vcHVibGljL2NwcC9iaW5kaW5ncy9yZW1vdGUuaCIKIAogbmFtZXNwYWNlIGRldmljZSB7CiBjbGFzcyBPY3VsdXNEZXZpY2U7CkBAIC0yNSw3ICsyNyw4IEBACiAgIH5Jc29sYXRlZFhSUnVudGltZVByb3ZpZGVyKCkgZmluYWw7CiAKICAgdm9pZCBSZXF1ZXN0RGV2aWNlcygKLSAgICAgIGRldmljZTo6bW9qb206Oklzb2xhdGVkWFJSdW50aW1lUHJvdmlkZXJDbGllbnRQdHIgY2xpZW50KSBvdmVycmlkZTsKKyAgICAgIG1vam86OlBlbmRpbmdSZW1vdGU8ZGV2aWNlOjptb2pvbTo6SXNvbGF0ZWRYUlJ1bnRpbWVQcm92aWRlckNsaWVudD4KKyAgICAgICAgICBjbGllbnQpIG92ZXJyaWRlOwogCiAgIGVudW0gY2xhc3MgUnVudGltZVN0YXR1czsKIApAQCAtNjIsNyArNjUsNyBAQAogICBzdGQ6OnVuaXF1ZV9wdHI8ZGV2aWNlOjpPcGVuWHJEZXZpY2U+IG9wZW54cl9kZXZpY2VfOwogI2VuZGlmCiAKLSAgZGV2aWNlOjptb2pvbTo6SXNvbGF0ZWRYUlJ1bnRpbWVQcm92aWRlckNsaWVudFB0ciBjbGllbnRfOworICBtb2pvOjpSZW1vdGU8ZGV2aWNlOjptb2pvbTo6SXNvbGF0ZWRYUlJ1bnRpbWVQcm92aWRlckNsaWVudD4gY2xpZW50XzsKICAgYmFzZTo6V2Vha1B0ckZhY3Rvcnk8SXNvbGF0ZWRYUlJ1bnRpbWVQcm92aWRlcj4gd2Vha19wdHJfZmFjdG9yeV97dGhpc307CiB9OwogCmRpZmYgLS1naXQgYS9jaHJvbWUvdGVzdC9CVUlMRC5nbiBiL2Nocm9tZS90ZXN0L0JVSUxELmduCmluZGV4IDJmZTgzOTAuLjNiMGY1YWUgMTAwNjQ0Ci0tLSBhL2Nocm9tZS90ZXN0L0JVSUxELmduCisrKyBiL2Nocm9tZS90ZXN0L0JVSUxELmduCkBAIC0yNTQ3LDYgKzI1NDcsOCBAQAogICAgICAgc291cmNlcyArPSBbCiAgICAgICAgICIuLi9icm93c2VyL3N1cGVydmlzZWRfdXNlci9sb2dnZWRfaW5fdXNlcl9taXhpbi5jYyIsCiAgICAgICAgICIuLi9icm93c2VyL3N1cGVydmlzZWRfdXNlci9sb2dnZWRfaW5fdXNlcl9taXhpbi5oIiwKKyAgICAgICAgIi4uL2Jyb3dzZXIvc3VwZXJ2aXNlZF91c2VyL3Blcm1pc3Npb25fcmVxdWVzdF9jcmVhdG9yX21vY2suY2MiLAorICAgICAgICAiLi4vYnJvd3Nlci9zdXBlcnZpc2VkX3VzZXIvcGVybWlzc2lvbl9yZXF1ZXN0X2NyZWF0b3JfbW9jay5oIiwKICAgICAgICAgIi4uL2Jyb3dzZXIvc3VwZXJ2aXNlZF91c2VyL3N1cGVydmlzZWRfdXNlcl9uYXZpZ2F0aW9uX3Rocm90dGxlX2Jyb3dzZXJ0ZXN0LmNjIiwKICAgICAgICAgIi4uL2Jyb3dzZXIvc3VwZXJ2aXNlZF91c2VyL3N1cGVydmlzZWRfdXNlcl9zZXJ2aWNlX2Jyb3dzZXJ0ZXN0LmNjIiwKICAgICAgICAgIi4uL2Jyb3dzZXIvc3VwZXJ2aXNlZF91c2VyL3N1cGVydmlzZWRfdXNlcl91cmxfZmlsdGVyX2Jyb3dzZXJ0ZXN0LmNjIiwKZGlmZiAtLWdpdCBhL2Nocm9tZS90ZXN0L2Jhc2UvanMyZ3Rlc3QuZ25pIGIvY2hyb21lL3Rlc3QvYmFzZS9qczJndGVzdC5nbmkKaW5kZXggNDE4ODI2OWEuLmZjZDVjN2QgMTAwNjQ0Ci0tLSBhL2Nocm9tZS90ZXN0L2Jhc2UvanMyZ3Rlc3QuZ25pCisrKyBiL2Nocm9tZS90ZXN0L2Jhc2UvanMyZ3Rlc3QuZ25pCkBAIC0xOSwxNDQgKzE5LDEzNCBAQAogIyAgIGRlZmluZXMKICMgICBkZXBzCiAjICAgdmlzaWJpbGl0eQotaWYgKGlzX3dpbiAmJiBob3N0X29zICE9ICJ3aW4iKSB7Ci0gICMgUnVubmluZyB2OF9zaGVsbCBmb3IgdGhlIGhvc3QgZG9lc24ndCB3b3JrIGluIGNyb3NzIGJ1aWxkcywKLSAgIyBodHRwczovL2NyYnVnLmNvbS8xMDEwNTYxCi0gIHRlbXBsYXRlKCJqczJndGVzdCIpIHsKLSAgICBub3RfbmVlZGVkKGludm9rZXIsICIqIikKLSAgICBncm91cCh0YXJnZXRfbmFtZSkgewordGVtcGxhdGUoImpzMmd0ZXN0IikgeworICBhc3NlcnQoZGVmaW5lZChpbnZva2VyLnRlc3RfdHlwZSkgJiYKKyAgICAgICAgIChpbnZva2VyLnRlc3RfdHlwZSA9PSAid2VidWkiIHx8IGludm9rZXIudGVzdF90eXBlID09ICJ1bml0IiB8fAorICAgICAgICAgIGludm9rZXIudGVzdF90eXBlID09ICJleHRlbnNpb24iIHx8CisgICAgICAgICAgaW52b2tlci50ZXN0X3R5cGUgPT0gIm1vam9fbGl0ZV93ZWJ1aSIpKQorICBhY3Rpb25fbmFtZSA9IHRhcmdldF9uYW1lICsgIl9hY3Rpb24iCisgIHNvdXJjZV9zZXRfbmFtZSA9IHRhcmdldF9uYW1lCisKKyAgIyBUaGUgbWFwcGluZyBmcm9tIHNvdXJjZXMgdG8gdGhlIGNvcGllZCB2ZXJzaW9uLgorICBjb3BpZWRfc291cmNlX3BhdHRlcm4gPSAiJHJvb3Rfb3V0X2Rpci90ZXN0X2RhdGEve3tzb3VyY2Vfcm9vdF9yZWxhdGl2ZV9kaXJ9fS97e3NvdXJjZV9maWxlX3BhcnR9fSIKKworICBnZW5fc291cmNlX3BhdHRlcm4gPSAie3tzb3VyY2VfZ2VuX2Rpcn19L3t7c291cmNlX25hbWVfcGFydH19LWdlbi5jYyIKKworICBkYXRhID0gW10KKyAgaWYgKGRlZmluZWQoaW52b2tlci5kYXRhKSkgeworICAgIGRhdGEgKz0gaW52b2tlci5kYXRhCisgIH0KKworICBhY3Rpb25fZm9yZWFjaChhY3Rpb25fbmFtZSkgeworICAgIHRlc3Rvbmx5ID0gdHJ1ZQorICAgIHZpc2liaWxpdHkgPSBbICI6JHNvdXJjZV9zZXRfbmFtZSIgXQorICAgIHNjcmlwdCA9ICIvL3Rvb2xzL2d5cHY4c2gucHkiCisKKyAgICBzb3VyY2VzID0gaW52b2tlci5zb3VyY2VzCisKKyAgICB2OF9zaGVsbF9wYXRoID0gZ2V0X2xhYmVsX2luZm8oIi8vdjg6djhfc2hlbGwoJHY4X3NuYXBzaG90X3Rvb2xjaGFpbikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicm9vdF9vdXRfZGlyIikgKyAiL3Y4X3NoZWxsIgorICAgIGlmIChob3N0X29zID09ICJ3aW4iKSB7CisgICAgICB2OF9zaGVsbF9wYXRoICs9ICIuZXhlIgorICAgIH0KKworICAgIGlucHV0X2pzID0gWworICAgICAgIi8vY2hyb21lL3RoaXJkX3BhcnR5L21vY2s0anMvbW9jazRqcy5qcyIsCisgICAgICAiLy9jaHJvbWUvdGVzdC9kYXRhL3dlYnVpL3Rlc3RfYXBpLmpzIiwKKyAgICAgICIvL2Nocm9tZS90ZXN0L2Jhc2UvanMyZ3Rlc3QuanMiLAorICAgIF0KKyAgICBpbnB1dHMgPSBbIHY4X3NoZWxsX3BhdGggXSArIGlucHV0X2pzCisgICAgaWYgKGRlZmluZWQoaW52b2tlci5kZXBzX2pzKSkgeworICAgICAgaW5wdXRzICs9IFsgaW52b2tlci5kZXBzX2pzIF0KKyAgICB9CisgICAgaWYgKGRlZmluZWQoaW52b2tlci5nZW5faW5jbHVkZV9maWxlcykpIHsKKyAgICAgIGlucHV0cyArPSBpbnZva2VyLmdlbl9pbmNsdWRlX2ZpbGVzCisgICAgfQorCisgICAgIyBPdXRwdXRzLiBUaGUgc2NyaXB0IHdpbGwgY29weSB0aGUgc291cmNlIGZpbGVzIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LAorICAgICMgd2hpY2ggdGhlbiBtdXN0IGJlIHRyZWF0ZWQgYXMgcnVudGltZSBkYXRhLiBUaGUgZ2VuZXJhdGVkIC5jYyBmaWxlIGlzbid0CisgICAgIyBkYXRhLCBpdCB3aWxsIGJlIGNvbXBpbGVkIGluIGEgc3RlcCBiZWxvdy4KKyAgICBvdXRwdXRzID0gWworICAgICAgY29waWVkX3NvdXJjZV9wYXR0ZXJuLAorICAgICAgZ2VuX3NvdXJjZV9wYXR0ZXJuLAorICAgIF0KKyAgICBkYXRhICs9IHByb2Nlc3NfZmlsZV90ZW1wbGF0ZShzb3VyY2VzLCBbIGNvcGllZF9zb3VyY2VfcGF0dGVybiBdKQorCisgICAgYXJncyA9IFtdCisgICAgaWYgKGRlZmluZWQoaW52b2tlci5kZXBzX2pzKSkgeworICAgICAgYXJncyArPSBbCisgICAgICAgICItLWRlcHNfanMiLAorICAgICAgICByZWJhc2VfcGF0aChpbnZva2VyLmRlcHNfanMsIHJvb3RfYnVpbGRfZGlyKSwKKyAgICAgIF0KKyAgICB9CisgICAgYXJncyArPSBbCisgICAgICAjIE5lZWQgIi4vIiBmb3Igc2NyaXB0IHRvIGZpbmQgYmluYXJ5IChjdXIgZGlyIGlzIG5vdCBvbiBwYXRoKS4KKyAgICAgICIuLyIgKyByZWJhc2VfcGF0aCh2OF9zaGVsbF9wYXRoLCByb290X2J1aWxkX2RpciksCisgICAgXQorICAgIGFyZ3MgKz0gcmViYXNlX3BhdGgoaW5wdXRfanMsIHJvb3RfYnVpbGRfZGlyKSArIFsgaW52b2tlci50ZXN0X3R5cGUgXQorICAgIGlmICh2OF91c2VfZXh0ZXJuYWxfc3RhcnR1cF9kYXRhKSB7CisgICAgICBhcmdzICs9IFsgIi0tZXh0ZXJuYWw9eSIgXQorICAgIH0gZWxzZSB7CisgICAgICBhcmdzICs9IFsgIi0tZXh0ZXJuYWw9biIgXQorICAgIH0KKyAgICBhcmdzICs9IFsKKyAgICAgICJ7e3NvdXJjZX19IiwKKyAgICAgIHJlYmFzZV9wYXRoKCIvLyIsIHJvb3RfYnVpbGRfZGlyKSwgICMgUGF0aCB0byBzb3VyY2Ugcm9vdC4KKyAgICAgIGdlbl9zb3VyY2VfcGF0dGVybiwKKyAgICAgIHJlYmFzZV9wYXRoKGNvcGllZF9zb3VyY2VfcGF0dGVybiwgcm9vdF9idWlsZF9kaXIpLAorICAgIF0KKworICAgIGRlcHMgPSBbCisgICAgICAiLy92ODp2OF9zaGVsbCgkdjhfc25hcHNob3RfdG9vbGNoYWluKSIsCisgICAgXQorICAgIGlmIChkZWZpbmVkKGludm9rZXIuZGVwcykpIHsKKyAgICAgIGRlcHMgKz0gaW52b2tlci5kZXBzCiAgICAgfQogICB9Ci19IGVsc2UgewotICB0ZW1wbGF0ZSgianMyZ3Rlc3QiKSB7Ci0gICAgYXNzZXJ0KGRlZmluZWQoaW52b2tlci50ZXN0X3R5cGUpICYmCi0gICAgICAgICAgIChpbnZva2VyLnRlc3RfdHlwZSA9PSAid2VidWkiIHx8IGludm9rZXIudGVzdF90eXBlID09ICJ1bml0IiB8fAotICAgICAgICAgICAgaW52b2tlci50ZXN0X3R5cGUgPT0gImV4dGVuc2lvbiIgfHwKLSAgICAgICAgICAgIGludm9rZXIudGVzdF90eXBlID09ICJtb2pvX2xpdGVfd2VidWkiKSkKLSAgICBhY3Rpb25fbmFtZSA9IHRhcmdldF9uYW1lICsgIl9hY3Rpb24iCi0gICAgc291cmNlX3NldF9uYW1lID0gdGFyZ2V0X25hbWUKIAotICAgICMgVGhlIG1hcHBpbmcgZnJvbSBzb3VyY2VzIHRvIHRoZSBjb3BpZWQgdmVyc2lvbi4KLSAgICBjb3BpZWRfc291cmNlX3BhdHRlcm4gPSAiJHJvb3Rfb3V0X2Rpci90ZXN0X2RhdGEve3tzb3VyY2Vfcm9vdF9yZWxhdGl2ZV9kaXJ9fS97e3NvdXJjZV9maWxlX3BhcnR9fSIKLQotICAgIGdlbl9zb3VyY2VfcGF0dGVybiA9ICJ7e3NvdXJjZV9nZW5fZGlyfX0ve3tzb3VyY2VfbmFtZV9wYXJ0fX0tZ2VuLmNjIgotCi0gICAgZGF0YSA9IFtdCi0gICAgaWYgKGRlZmluZWQoaW52b2tlci5kYXRhKSkgewotICAgICAgZGF0YSArPSBpbnZva2VyLmRhdGEKLSAgICB9Ci0KLSAgICBhY3Rpb25fZm9yZWFjaChhY3Rpb25fbmFtZSkgewotICAgICAgdGVzdG9ubHkgPSB0cnVlCisgIGlmIChkZWZpbmVkKGludm9rZXIuZXh0cmFfanNfZmlsZXMpKSB7CisgICAgY29weV90YXJnZXRfbmFtZSA9IHRhcmdldF9uYW1lICsgIl9jb3B5IgorICAgIGNvcHkoY29weV90YXJnZXRfbmFtZSkgewogICAgICAgdmlzaWJpbGl0eSA9IFsgIjokc291cmNlX3NldF9uYW1lIiBdCi0gICAgICBzY3JpcHQgPSAiLy90b29scy9neXB2OHNoLnB5IgotCi0gICAgICBzb3VyY2VzID0gaW52b2tlci5zb3VyY2VzCi0KLSAgICAgIHY4X3NoZWxsX3BhdGggPSBnZXRfbGFiZWxfaW5mbygiLy92ODp2OF9zaGVsbCgkdjhfc25hcHNob3RfdG9vbGNoYWluKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJvb3Rfb3V0X2RpciIpICsgIi92OF9zaGVsbCIKLSAgICAgIGlmIChob3N0X29zID09ICJ3aW4iKSB7Ci0gICAgICAgIHY4X3NoZWxsX3BhdGggKz0gIi5leGUiCi0gICAgICB9Ci0KLSAgICAgIGlucHV0X2pzID0gWwotICAgICAgICAiLy9jaHJvbWUvdGhpcmRfcGFydHkvbW9jazRqcy9tb2NrNGpzLmpzIiwKLSAgICAgICAgIi8vY2hyb21lL3Rlc3QvZGF0YS93ZWJ1aS90ZXN0X2FwaS5qcyIsCi0gICAgICAgICIvL2Nocm9tZS90ZXN0L2Jhc2UvanMyZ3Rlc3QuanMiLAotICAgICAgXQotICAgICAgaW5wdXRzID0gWyB2OF9zaGVsbF9wYXRoIF0gKyBpbnB1dF9qcwotICAgICAgaWYgKGRlZmluZWQoaW52b2tlci5kZXBzX2pzKSkgewotICAgICAgICBpbnB1dHMgKz0gWyBpbnZva2VyLmRlcHNfanMgXQotICAgICAgfQotICAgICAgaWYgKGRlZmluZWQoaW52b2tlci5nZW5faW5jbHVkZV9maWxlcykpIHsKLSAgICAgICAgaW5wdXRzICs9IGludm9rZXIuZ2VuX2luY2x1ZGVfZmlsZXMKLSAgICAgIH0KLQotICAgICAgIyBPdXRwdXRzLiBUaGUgc2NyaXB0IHdpbGwgY29weSB0aGUgc291cmNlIGZpbGVzIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LAotICAgICAgIyB3aGljaCB0aGVuIG11c3QgYmUgdHJlYXRlZCBhcyBydW50aW1lIGRhdGEuIFRoZSBnZW5lcmF0ZWQgLmNjIGZpbGUgaXNuJ3QKLSAgICAgICMgZGF0YSwgaXQgd2lsbCBiZSBjb21waWxlZCBpbiBhIHN0ZXAgYmVsb3cuCisgICAgICBzb3VyY2VzID0gaW52b2tlci5leHRyYV9qc19maWxlcwogICAgICAgb3V0cHV0cyA9IFsKICAgICAgICAgY29waWVkX3NvdXJjZV9wYXR0ZXJuLAotICAgICAgICBnZW5fc291cmNlX3BhdHRlcm4sCiAgICAgICBdCi0gICAgICBkYXRhICs9IHByb2Nlc3NfZmlsZV90ZW1wbGF0ZShzb3VyY2VzLCBbIGNvcGllZF9zb3VyY2VfcGF0dGVybiBdKQotCi0gICAgICBhcmdzID0gW10KLSAgICAgIGlmIChkZWZpbmVkKGludm9rZXIuZGVwc19qcykpIHsKLSAgICAgICAgYXJncyArPSBbCi0gICAgICAgICAgIi0tZGVwc19qcyIsCi0gICAgICAgICAgcmViYXNlX3BhdGgoaW52b2tlci5kZXBzX2pzLCByb290X2J1aWxkX2RpciksCi0gICAgICAgIF0KLSAgICAgIH0KLSAgICAgIGFyZ3MgKz0gWwotICAgICAgICAjIE5lZWQgIi4vIiBmb3Igc2NyaXB0IHRvIGZpbmQgYmluYXJ5IChjdXIgZGlyIGlzIG5vdCBvbiBwYXRoKS4KLSAgICAgICAgIi4vIiArIHJlYmFzZV9wYXRoKHY4X3NoZWxsX3BhdGgsIHJvb3RfYnVpbGRfZGlyKSwKLSAgICAgIF0KLSAgICAgIGFyZ3MgKz0gcmViYXNlX3BhdGgoaW5wdXRfanMsIHJvb3RfYnVpbGRfZGlyKSArIFsgaW52b2tlci50ZXN0X3R5cGUgXQotICAgICAgaWYgKHY4X3VzZV9leHRlcm5hbF9zdGFydHVwX2RhdGEpIHsKLSAgICAgICAgYXJncyArPSBbICItLWV4dGVybmFsPXkiIF0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGFyZ3MgKz0gWyAiLS1leHRlcm5hbD1uIiBdCi0gICAgICB9Ci0gICAgICBhcmdzICs9IFsKLSAgICAgICAgInt7c291cmNlfX0iLAotICAgICAgICByZWJhc2VfcGF0aCgiLy8iLCByb290X2J1aWxkX2RpciksICAjIFBhdGggdG8gc291cmNlIHJvb3QuCi0gICAgICAgIGdlbl9zb3VyY2VfcGF0dGVybiwKLSAgICAgICAgcmViYXNlX3BhdGgoY29waWVkX3NvdXJjZV9wYXR0ZXJuLCByb290X2J1aWxkX2RpciksCi0gICAgICBdCi0KLSAgICAgIGRlcHMgPSBbCi0gICAgICAgICIvL3Y4OnY4X3NoZWxsKCR2OF9zbmFwc2hvdF90b29sY2hhaW4pIiwKLSAgICAgIF0KLSAgICAgIGlmIChkZWZpbmVkKGludm9rZXIuZGVwcykpIHsKLSAgICAgICAgZGVwcyArPSBpbnZva2VyLmRlcHMKLSAgICAgIH0KICAgICB9CisgIH0KIAorICBzb3VyY2Vfc2V0KHNvdXJjZV9zZXRfbmFtZSkgeworICAgIHRlc3Rvbmx5ID0gdHJ1ZQorICAgIGZvcndhcmRfdmFyaWFibGVzX2Zyb20oaW52b2tlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmluZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlzaWJpbGl0eSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorICAgIHNvdXJjZXMgPSBwcm9jZXNzX2ZpbGVfdGVtcGxhdGUoaW52b2tlci5zb3VyY2VzLCBbIGdlbl9zb3VyY2VfcGF0dGVybiBdKQorCisgICAgIyBUaGlzIGVtcHR5IHB1YmxpYyBoZWFkZXIgaXMgaW50ZW50aW9uYWwgdG8gcmVtb3ZlIHVubmVjZXNzYXJ5IGJ1aWxkCisgICAgIyBkZXBlbmRlbmN5LgorICAgIHB1YmxpYyA9IFtdCisKKyAgICBkZXBzID0gWworICAgICAgIjokYWN0aW9uX25hbWUiLAorCisgICAgICAjIFRoZSBnZW5lcmF0b3IgaW1wbGljaXRseSBtYWtlcyBpbmNsdWRlcyBmcm9tIHRoZXNlIHRhcmdldHMuCisgICAgICAiLy9jaHJvbWUvdGVzdDp0ZXN0X3N1cHBvcnQiLAorICAgICAgIi8vdGVzdGluZy9nbW9jayIsCisgICAgICAiLy90ZXN0aW5nL2d0ZXN0IiwKKyAgICAgICIvL3VybCIsCisgICAgXQorICAgIGlmIChkZWZpbmVkKGludm9rZXIuZGVwcykpIHsKKyAgICAgIGRlcHMgKz0gaW52b2tlci5kZXBzCisgICAgfQorICAgIGlmIChkZWZpbmVkKGludm9rZXIuZ2VuX2luY2x1ZGVfZmlsZXMpKSB7CisgICAgICBkYXRhICs9IGludm9rZXIuZ2VuX2luY2x1ZGVfZmlsZXMKKyAgICB9CiAgICAgaWYgKGRlZmluZWQoaW52b2tlci5leHRyYV9qc19maWxlcykpIHsKLSAgICAgIGNvcHlfdGFyZ2V0X25hbWUgPSB0YXJnZXRfbmFtZSArICJfY29weSIKLSAgICAgIGNvcHkoY29weV90YXJnZXRfbmFtZSkgewotICAgICAgICB2aXNpYmlsaXR5ID0gWyAiOiRzb3VyY2Vfc2V0X25hbWUiIF0KLSAgICAgICAgc291cmNlcyA9IGludm9rZXIuZXh0cmFfanNfZmlsZXMKLSAgICAgICAgb3V0cHV0cyA9IFsKLSAgICAgICAgICBjb3BpZWRfc291cmNlX3BhdHRlcm4sCi0gICAgICAgIF0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBzb3VyY2Vfc2V0KHNvdXJjZV9zZXRfbmFtZSkgewotICAgICAgdGVzdG9ubHkgPSB0cnVlCi0gICAgICBmb3J3YXJkX3ZhcmlhYmxlc19mcm9tKGludm9rZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmaW5lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpc2liaWxpdHkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQotICAgICAgc291cmNlcyA9IHByb2Nlc3NfZmlsZV90ZW1wbGF0ZShpbnZva2VyLnNvdXJjZXMsIFsgZ2VuX3NvdXJjZV9wYXR0ZXJuIF0pCi0KLSAgICAgICMgVGhpcyBlbXB0eSBwdWJsaWMgaGVhZGVyIGlzIGludGVudGlvbmFsIHRvIHJlbW92ZSB1bm5lY2Vzc2FyeSBidWlsZAotICAgICAgIyBkZXBlbmRlbmN5LgotICAgICAgcHVibGljID0gW10KLQotICAgICAgZGVwcyA9IFsKLSAgICAgICAgIjokYWN0aW9uX25hbWUiLAotCi0gICAgICAgICMgVGhlIGdlbmVyYXRvciBpbXBsaWNpdGx5IG1ha2VzIGluY2x1ZGVzIGZyb20gdGhlc2UgdGFyZ2V0cy4KLSAgICAgICAgIi8vY2hyb21lL3Rlc3Q6dGVzdF9zdXBwb3J0IiwKLSAgICAgICAgIi8vdGVzdGluZy9nbW9jayIsCi0gICAgICAgICIvL3Rlc3RpbmcvZ3Rlc3QiLAotICAgICAgICAiLy91cmwiLAorICAgICAgZGF0YV9kZXBzID0gWworICAgICAgICAiOiRjb3B5X3RhcmdldF9uYW1lIiwKICAgICAgIF0KLSAgICAgIGlmIChkZWZpbmVkKGludm9rZXIuZGVwcykpIHsKLSAgICAgICAgZGVwcyArPSBpbnZva2VyLmRlcHMKLSAgICAgIH0KLSAgICAgIGlmIChkZWZpbmVkKGludm9rZXIuZ2VuX2luY2x1ZGVfZmlsZXMpKSB7Ci0gICAgICAgIGRhdGEgKz0gaW52b2tlci5nZW5faW5jbHVkZV9maWxlcwotICAgICAgfQotICAgICAgaWYgKGRlZmluZWQoaW52b2tlci5leHRyYV9qc19maWxlcykpIHsKLSAgICAgICAgZGF0YV9kZXBzID0gWwotICAgICAgICAgICI6JGNvcHlfdGFyZ2V0X25hbWUiLAotICAgICAgICBdCi0gICAgICB9CiAgICAgfQogICB9CiB9CmRpZmYgLS1naXQgYS9jaHJvbWUvdGVzdC9iYXNlL3Rlc3RfYnJvd3Nlcl93aW5kb3cuY2MgYi9jaHJvbWUvdGVzdC9iYXNlL3Rlc3RfYnJvd3Nlcl93aW5kb3cuY2MKaW5kZXggNDE0MTUwMS4uNGI4OWNhYTkgMTAwNjQ0Ci0tLSBhL2Nocm9tZS90ZXN0L2Jhc2UvdGVzdF9icm93c2VyX3dpbmRvdy5jYworKysgYi9jaHJvbWUvdGVzdC9iYXNlL3Rlc3RfYnJvd3Nlcl93aW5kb3cuY2MKQEAgLTE0Myw3ICsxNDMsOSBAQAogICByZXR1cm4gZmFsc2U7CiB9CiAKLXZvaWQgVGVzdEJyb3dzZXJXaW5kb3c6OlNob3dBdmF0YXJIaWdobGlnaHRBbmltYXRpb24oKSB7fQorYXV0b2ZpbGw6OkF1dG9maWxsQnViYmxlSGFuZGxlciogVGVzdEJyb3dzZXJXaW5kb3c6OkdldEF1dG9maWxsQnViYmxlSGFuZGxlcigpIHsKKyAgcmV0dXJuICZhdXRvZmlsbF9idWJibGVfaGFuZGxlcl87Cit9CiAKIFRvb2xiYXJBY3Rpb25zQmFyKiBUZXN0QnJvd3NlcldpbmRvdzo6R2V0VG9vbGJhckFjdGlvbnNCYXIoKSB7CiAgIHJldHVybiBudWxscHRyOwpAQCAtMjAyLDI3ICsyMDQsMTIgQEAKICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLWF1dG9maWxsOjpTYXZlQ2FyZEJ1YmJsZVZpZXcqIFRlc3RCcm93c2VyV2luZG93OjpTaG93U2F2ZUNyZWRpdENhcmRCdWJibGUoCi0gICAgY29udGVudDo6V2ViQ29udGVudHMqIGNvbnRlbnRzLAotICAgIGF1dG9maWxsOjpTYXZlQ2FyZEJ1YmJsZUNvbnRyb2xsZXIqIGNvbnRyb2xsZXIsCi0gICAgYm9vbCB1c2VyX2dlc3R1cmUpIHsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KIFNoYXJpbmdEaWFsb2cqIFRlc3RCcm93c2VyV2luZG93OjpTaG93U2hhcmluZ0RpYWxvZygKICAgICBjb250ZW50OjpXZWJDb250ZW50cyogd2ViX2NvbnRlbnRzLAogICAgIFNoYXJpbmdVaUNvbnRyb2xsZXIqIGNvbnRyb2xsZXIpIHsKICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLWF1dG9maWxsOjpMb2NhbENhcmRNaWdyYXRpb25CdWJibGUqCi1UZXN0QnJvd3NlcldpbmRvdzo6U2hvd0xvY2FsQ2FyZE1pZ3JhdGlvbkJ1YmJsZSgKLSAgICBjb250ZW50OjpXZWJDb250ZW50cyogY29udGVudHMsCi0gICAgYXV0b2ZpbGw6OkxvY2FsQ2FyZE1pZ3JhdGlvbkJ1YmJsZUNvbnRyb2xsZXIqIGNvbnRyb2xsZXIsCi0gICAgYm9vbCB1c2VyX2dlc3R1cmUpIHsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KIHNlbmRfdGFiX3RvX3NlbGY6OlNlbmRUYWJUb1NlbGZCdWJibGVWaWV3KgogVGVzdEJyb3dzZXJXaW5kb3c6OlNob3dTZW5kVGFiVG9TZWxmQnViYmxlKAogICAgIGNvbnRlbnQ6OldlYkNvbnRlbnRzKiBjb250ZW50cywKZGlmZiAtLWdpdCBhL2Nocm9tZS90ZXN0L2Jhc2UvdGVzdF9icm93c2VyX3dpbmRvdy5oIGIvY2hyb21lL3Rlc3QvYmFzZS90ZXN0X2Jyb3dzZXJfd2luZG93LmgKaW5kZXggNDcwMzFkOS4uNmVhNWQ5MiAxMDA2NDQKLS0tIGEvY2hyb21lL3Rlc3QvYmFzZS90ZXN0X2Jyb3dzZXJfd2luZG93LmgKKysrIGIvY2hyb21lL3Rlc3QvYmFzZS90ZXN0X2Jyb3dzZXJfd2luZG93LmgKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlICJiYXNlL21hY3Jvcy5oIgogI2luY2x1ZGUgImJ1aWxkL2J1aWxkX2NvbmZpZy5oIgogI2luY2x1ZGUgImNocm9tZS9icm93c2VyL2Rvd25sb2FkL3Rlc3RfZG93bmxvYWRfc2hlbGYuaCIKKyNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS9hdXRvZmlsbC90ZXN0L3Rlc3RfYXV0b2ZpbGxfYnViYmxlX2hhbmRsZXIuaCIKICNpbmNsdWRlICJjaHJvbWUvYnJvd3Nlci91aS9icm93c2VyLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvYnJvd3Nlcl9kaWFsb2dzLmgiCiAjaW5jbHVkZSAiY2hyb21lL2Jyb3dzZXIvdWkvYnJvd3Nlcl93aW5kb3cuaCIKQEAgLTk5LDcgKzEwMCw3IEBACiAgIGJvb2wgSXNGdWxsc2NyZWVuQnViYmxlVmlzaWJsZSgpIGNvbnN0IG92ZXJyaWRlOwogICBMb2NhdGlvbkJhciogR2V0TG9jYXRpb25CYXIoKSBjb25zdCBvdmVycmlkZTsKICAgYm9vbCBVcGRhdGVQYWdlQWN0aW9uSWNvbihQYWdlQWN0aW9uSWNvblR5cGUgdHlwZSkgb3ZlcnJpZGU7Ci0gIHZvaWQgU2hvd0F2YXRhckhpZ2hsaWdodEFuaW1hdGlvbigpIG92ZXJyaWRlOworICBhdXRvZmlsbDo6QXV0b2ZpbGxCdWJibGVIYW5kbGVyKiBHZXRBdXRvZmlsbEJ1YmJsZUhhbmRsZXIoKSBvdmVycmlkZTsKICAgdm9pZCBFeGVjdXRlUGFnZUFjdGlvbkljb25Gb3JUZXN0aW5nKFBhZ2VBY3Rpb25JY29uVHlwZSB0eXBlKSBvdmVycmlkZSB7fQogICB2b2lkIFNldEZvY3VzVG9Mb2NhdGlvbkJhcihib29sIHNlbGVjdF9hbGwpIG92ZXJyaWRlIHt9CiAgIHZvaWQgVXBkYXRlUmVsb2FkU3RvcFN0YXRlKGJvb2wgaXNfbG9hZGluZywgYm9vbCBmb3JjZSkgb3ZlcnJpZGUge30KQEAgLTE0MCwxNCArMTQxLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhZ2VBY3Rpb25JY29uVHlwZSBpY29uX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlbnRQaWNrZXJSZXNwb25zZSBjYWxsYmFjaykgb3ZlcnJpZGUge30KICNlbmRpZiAgLy8gICFkZWZpbmUoT1NfQU5EUk9JRCkKLSAgYXV0b2ZpbGw6OlNhdmVDYXJkQnViYmxlVmlldyogU2hvd1NhdmVDcmVkaXRDYXJkQnViYmxlKAotICAgICAgY29udGVudDo6V2ViQ29udGVudHMqIGNvbnRlbnRzLAotICAgICAgYXV0b2ZpbGw6OlNhdmVDYXJkQnViYmxlQ29udHJvbGxlciogY29udHJvbGxlciwKLSAgICAgIGJvb2wgdXNlcl9nZXN0dXJlKSBvdmVycmlkZTsKLSAgYXV0b2ZpbGw6OkxvY2FsQ2FyZE1pZ3JhdGlvbkJ1YmJsZSogU2hvd0xvY2FsQ2FyZE1pZ3JhdGlvbkJ1YmJsZSgKLSAgICAgIGNvbnRlbnQ6OldlYkNvbnRlbnRzKiBjb250ZW50cywKLSAgICAgIGF1dG9maWxsOjpMb2NhbENhcmRNaWdyYXRpb25CdWJibGVDb250cm9sbGVyKiBjb250cm9sbGVyLAotICAgICAgYm9vbCB1c2VyX2dlc3R1cmUpIG92ZXJyaWRlOwogICBzZW5kX3RhYl90b19zZWxmOjpTZW5kVGFiVG9TZWxmQnViYmxlVmlldyogU2hvd1NlbmRUYWJUb1NlbGZCdWJibGUoCiAgICAgICBjb250ZW50OjpXZWJDb250ZW50cyogY29udGVudHMsCiAgICAgICBzZW5kX3RhYl90b19zZWxmOjpTZW5kVGFiVG9TZWxmQnViYmxlQ29udHJvbGxlciogY29udHJvbGxlciwKQEAgLTIyOCw2ICsyMjEsNyBAQAogICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihUZXN0TG9jYXRpb25CYXIpOwogICB9OwogCisgIGF1dG9maWxsOjpUZXN0QXV0b2ZpbGxCdWJibGVIYW5kbGVyIGF1dG9maWxsX2J1YmJsZV9oYW5kbGVyXzsKICAgVGVzdERvd25sb2FkU2hlbGYgZG93bmxvYWRfc2hlbGZfOwogICBUZXN0TG9jYXRpb25CYXIgbG9jYXRpb25fYmFyXzsKIApkaWZmIC0tZ2l0IGEvY2hyb21lL3Rlc3QvYmFzZS91aV90ZXN0X3V0aWxzLmNjIGIvY2hyb21lL3Rlc3QvYmFzZS91aV90ZXN0X3V0aWxzLmNjCmluZGV4IDFiOTc0YzMuLmNjNzhkNzcgMTAwNjQ0Ci0tLSBhL2Nocm9tZS90ZXN0L2Jhc2UvdWlfdGVzdF91dGlscy5jYworKysgYi9jaHJvbWUvdGVzdC9iYXNlL3VpX3Rlc3RfdXRpbHMuY2MKQEAgLTIxOSw3ICsyMTksNyBAQAogCiAgIC8vIE9tbmlib3hDb250cm9sbGVyRW1pdHRlcjo6T2JzZXJ2ZXI6CiAgIHZvaWQgT25PbW5pYm94UXVlcnkoQXV0b2NvbXBsZXRlQ29udHJvbGxlciogY29udHJvbGxlciwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpzdHJpbmcxNiYgaW5wdXRfdGV4dCkgb3ZlcnJpZGUge30KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdXRvY29tcGxldGVJbnB1dCYgaW5wdXQpIG92ZXJyaWRlIHt9CiAgIHZvaWQgT25PbW5pYm94UmVzdWx0Q2hhbmdlZChib29sIGRlZmF1bHRfbWF0Y2hfY2hhbmdlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dG9jb21wbGV0ZUNvbnRyb2xsZXIqIGNvbnRyb2xsZXIpIG92ZXJyaWRlIHsKICAgICBpZiAocnVuX2xvb3BfLnJ1bm5pbmcoKSkKZGlmZiAtLWdpdCBhL2Nocm9tZS90ZXN0L2Nocm9tZWRyaXZlci9jaHJvbWUvZGV2dG9vbHNfY2xpZW50X2ltcGwuY2MgYi9jaHJvbWUvdGVzdC9jaHJvbWVkcml2ZXIvY2hyb21lL2RldnRvb2xzX2NsaWVudF9pbXBsLmNjCmluZGV4IDA5MmMyNTAuLjQyODVmYzkgMTAwNjQ0Ci0tLSBhL2Nocm9tZS90ZXN0L2Nocm9tZWRyaXZlci9jaHJvbWUvZGV2dG9vbHNfY2xpZW50X2ltcGwuY2MKKysrIGIvY2hyb21lL3Rlc3QvY2hyb21lZHJpdmVyL2Nocm9tZS9kZXZ0b29sc19jbGllbnRfaW1wbC5jYwpAQCAtNzksOCArNzksOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGlkKQogICAgIDogc29ja2V0XyhmYWN0b3J5LlJ1bigpKSwKICAgICAgIHVybF8odXJsKSwKLSAgICAgIHBhcmVudF8obnVsbHB0ciksCiAgICAgICBvd25lcl8obnVsbHB0ciksCisgICAgICBwYXJlbnRfKG51bGxwdHIpLAogICAgICAgY3Jhc2hlZF8oZmFsc2UpLAogICAgICAgZGV0YWNoZWRfKGZhbHNlKSwKICAgICAgIGlkXyhpZCksCkBAIC05OSw4ICs5OSw4IEBACiAgICAgY29uc3QgRnJvbnRlbmRDbG9zZXJGdW5jJiBmcm9udGVuZF9jbG9zZXJfZnVuYykKICAgICA6IHNvY2tldF8oZmFjdG9yeS5SdW4oKSksCiAgICAgICB1cmxfKHVybCksCi0gICAgICBwYXJlbnRfKG51bGxwdHIpLAogICAgICAgb3duZXJfKG51bGxwdHIpLAorICAgICAgcGFyZW50XyhudWxscHRyKSwKICAgICAgIGNyYXNoZWRfKGZhbHNlKSwKICAgICAgIGRldGFjaGVkXyhmYWxzZSksCiAgICAgICBpZF8oaWQpLApAQCAtMTE0LDkgKzExNCw5IEBACiAKIERldlRvb2xzQ2xpZW50SW1wbDo6RGV2VG9vbHNDbGllbnRJbXBsKERldlRvb2xzQ2xpZW50SW1wbCogcGFyZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlc3Npb25faWQpCi0gICAgOiBwYXJlbnRfKHBhcmVudCksCi0gICAgICBvd25lcl8obnVsbHB0ciksCisgICAgOiBvd25lcl8obnVsbHB0ciksCiAgICAgICBzZXNzaW9uX2lkXyhzZXNzaW9uX2lkKSwKKyAgICAgIHBhcmVudF8ocGFyZW50KSwKICAgICAgIGNyYXNoZWRfKGZhbHNlKSwKICAgICAgIGRldGFjaGVkXyhmYWxzZSksCiAgICAgICBpZF8oc2Vzc2lvbl9pZCksCkBAIC0xMzYsOCArMTM2LDggQEAKICAgICBjb25zdCBQYXJzZXJGdW5jJiBwYXJzZXJfZnVuYykKICAgICA6IHNvY2tldF8oZmFjdG9yeS5SdW4oKSksCiAgICAgICB1cmxfKHVybCksCi0gICAgICBwYXJlbnRfKG51bGxwdHIpLAogICAgICAgb3duZXJfKG51bGxwdHIpLAorICAgICAgcGFyZW50XyhudWxscHRyKSwKICAgICAgIGNyYXNoZWRfKGZhbHNlKSwKICAgICAgIGRldGFjaGVkXyhmYWxzZSksCiAgICAgICBpZF8oaWQpLApAQCAtMjk3LDYgKzI5NywxMCBAQAogCiBEZXZUb29sc0NsaWVudEltcGw6OlJlc3BvbnNlSW5mbzo6flJlc3BvbnNlSW5mbygpIHt9CiAKK0RldlRvb2xzQ2xpZW50SW1wbCogRGV2VG9vbHNDbGllbnRJbXBsOjpHZXRSb290Q2xpZW50KCkgeworICByZXR1cm4gcGFyZW50XyA/IHBhcmVudF8gOiB0aGlzOworfQorCiBTdGF0dXMgRGV2VG9vbHNDbGllbnRJbXBsOjpTZW5kQ29tbWFuZEludGVybmFsKAogICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXRob2QsCiAgICAgY29uc3QgYmFzZTo6RGljdGlvbmFyeVZhbHVlJiBwYXJhbXMsCkBAIC0zMjQsOCArMzI4LDcgQEAKICAgICBWTE9HKDEpIDw8ICJEZXZUb29scyBXZWJTb2NrZXQgQ29tbWFuZDogIiA8PCBtZXRob2QgPDwgIiAoaWQ9IiA8PCBjb21tYW5kX2lkCiAgICAgICAgICAgICA8PCAiKSAiIDw8IGlkXyA8PCAiICIgPDwgRm9ybWF0VmFsdWVGb3JEaXNwbGF5KHBhcmFtcyk7CiAgIH0KLSAgU3luY1dlYlNvY2tldCogc29ja2V0ID0KLSAgICAgIChwYXJlbnRfICE9IG51bGxwdHIpID8gcGFyZW50Xy0+c29ja2V0Xy5nZXQoKSA6IHNvY2tldF8uZ2V0KCk7CisgIFN5bmNXZWJTb2NrZXQqIHNvY2tldCA9IEdldFJvb3RDbGllbnQoKS0+c29ja2V0Xy5nZXQoKTsKICAgaWYgKCFzb2NrZXQtPlNlbmQobWVzc2FnZSkpIHsKICAgICByZXR1cm4gU3RhdHVzKGtEaXNjb25uZWN0ZWQsICJ1bmFibGUgdG8gc2VuZCBtZXNzYWdlIHRvIHJlbmRlcmVyIik7CiAgIH0KZGlmZiAtLWdpdCBhL2Nocm9tZS90ZXN0L2Nocm9tZWRyaXZlci9jaHJvbWUvZGV2dG9vbHNfY2xpZW50X2ltcGwuaCBiL2Nocm9tZS90ZXN0L2Nocm9tZWRyaXZlci9jaHJvbWUvZGV2dG9vbHNfY2xpZW50X2ltcGwuaAppbmRleCA0MjM0ZTNhLi44ZTEyY2I1IDEwMDY0NAotLS0gYS9jaHJvbWUvdGVzdC9jaHJvbWVkcml2ZXIvY2hyb21lL2RldnRvb2xzX2NsaWVudF9pbXBsLmgKKysrIGIvY2hyb21lL3Rlc3QvY2hyb21lZHJpdmVyL2Nocm9tZS9kZXZ0b29sc19jbGllbnRfaW1wbC5oCkBAIC0xMjAsNiArMTIwLDcgQEAKICAgU3RhdHVzIEhhbmRsZVJlY2VpdmVkRXZlbnRzKCkgb3ZlcnJpZGU7CiAgIHZvaWQgU2V0RGV0YWNoZWQoKSBvdmVycmlkZTsKICAgdm9pZCBTZXRPd25lcihXZWJWaWV3SW1wbCogb3duZXIpIG92ZXJyaWRlOworICBEZXZUb29sc0NsaWVudEltcGwqIEdldFJvb3RDbGllbnQoKTsKIAogIHByaXZhdGU6CiAgIGVudW0gUmVzcG9uc2VTdGF0ZSB7CkBAIC0xNjQsMTAgKzE2NSwxMyBAQAogCiAgIHN0ZDo6dW5pcXVlX3B0cjxTeW5jV2ViU29ja2V0PiBzb2NrZXRfOwogICBHVVJMIHVybF87Ci0gIERldlRvb2xzQ2xpZW50SW1wbCogcGFyZW50XzsKICAgLy8gV2ViVmlld0ltcGwgdGhhdCBvd25zIHRoaXMgaW5zdGFuY2U7IG51bGxwdHIgZm9yIGJyb3dzZXItd2lkZSBEZXZUb29scy4KICAgV2ViVmlld0ltcGwqIG93bmVyXzsKICAgY29uc3Qgc3RkOjpzdHJpbmcgc2Vzc2lvbl9pZF87CisgIC8vIHBhcmVudF8gLyBjaGlsZHJlbl86IGl0J3MgYSBmbGF0IGhpZXJhcmNoeSAtIG5lc3RpbmcgaXMgYXQgbW9zdCBvbmUgbGV2ZWwKKyAgLy8gZGVlcC4gY2hpbGRyZW5fIGhvbGRzIGNoaWxkIHNlc3Npb25zIC0gaWRlbnRpZmllZCBieSB0aGVpciBzZXNzaW9uIGlkIC0KKyAgLy8gd2hpY2ggc2VuZC9yZWNlaXZlIG1lc3NhZ2VzIHZpYSB0aGUgc29ja2V0XyBvZiB0aGVpciBwYXJlbnQuCisgIERldlRvb2xzQ2xpZW50SW1wbCogcGFyZW50XzsKICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIERldlRvb2xzQ2xpZW50SW1wbCo+IGNoaWxkcmVuXzsKICAgYm9vbCBjcmFzaGVkXzsKICAgYm9vbCBkZXRhY2hlZF87CmRpZmYgLS1naXQgYS9jaHJvbWUvdGVzdC9jaHJvbWVkcml2ZXIvY2hyb21lL3N0YXR1cy5oIGIvY2hyb21lL3Rlc3QvY2hyb21lZHJpdmVyL2Nocm9tZS9zdGF0dXMuaAppbmRleCAxYjc0NWVmLi4wOTg3NDZhOSAxMDA2NDQKLS0tIGEvY2hyb21lL3Rlc3QvY2hyb21lZHJpdmVyL2Nocm9tZS9zdGF0dXMuaAorKysgYi9jaHJvbWUvdGVzdC9jaHJvbWVkcml2ZXIvY2hyb21lL3N0YXR1cy5oCkBAIC00Miw2ICs0Miw3IEBACiAgIGtGb3JiaWRkZW4gPSAxMDMsCiAgIGtUYWJDcmFzaGVkLAogICBrVGFyZ2V0RGV0YWNoZWQsCisgIGtVbmV4cGVjdGVkQWxlcnRPcGVuX0tlZXAsCiB9OwogCiAvLyBSZXByZXNlbnRzIGEgV2ViRHJpdmVyIHN0YXR1cywgd2hpY2ggbWF5IGJlIGFuIGVycm9yIG9yIG9rLgpkaWZmIC0tZ2l0IGEvY2hyb21lL3Rlc3QvY2hyb21lZHJpdmVyL2Nocm9tZS93ZWJfdmlld19pbXBsLmNjIGIvY2hyb21lL3Rlc3QvY2hyb21lZHJpdmVyL2Nocm9tZS93ZWJfdmlld19pbXBsLmNjCmluZGV4IGM3MTFiMDE4Li5kNDEwOGYwIDEwMDY0NAotLS0gYS9jaHJvbWUvdGVzdC9jaHJvbWVkcml2ZXIvY2hyb21lL3dlYl92aWV3X2ltcGwuY2MKKysrIGIvY2hyb21lL3Rlc3QvY2hyb21lZHJpdmVyL2Nocm9tZS93ZWJfdmlld19pbXBsLmNjCkBAIC0xOTUsMTAgKzE5NSwxNCBAQAogCiBXZWJWaWV3SW1wbCogV2ViVmlld0ltcGw6OkNyZWF0ZUNoaWxkKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXNzaW9uX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0X2lkKSBjb25zdCB7Ci0gIERldlRvb2xzQ2xpZW50SW1wbCogcGFyZW50X2NsaWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxEZXZUb29sc0NsaWVudEltcGwqPihjbGllbnRfLmdldCgpKTsKKyAgLy8gV2hpbGUgdGhlcmUgbWF5IGJlIGEgZGVlcCBoaWVyYXJjaHkgb2YgV2ViVmlld0ltcGwgaW5zdGFuY2VzLCB0aGUKKyAgLy8gaGllcmFyY2h5IGZvciBEZXZUb29sc0NsaWVudEltcGwgaXMgZmxhdCAtIHRoZXJlJ3MgYSByb290IHdoaWNoCisgIC8vIHNlbmRzL3JlY2VpdmVzIG92ZXIgdGhlIHNvY2tldCwgYW5kIGFsbCBjaGlsZCBzZXNzaW9ucyBhcmUgY29uc2lkZXJlZAorICAvLyBpdHMgY2hpbGRyZW4gKG9uZSBsZXZlbCBkZWVwIGF0IG1vc3QpLgorICBEZXZUb29sc0NsaWVudEltcGwqIHJvb3RfY2xpZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PERldlRvb2xzQ2xpZW50SW1wbCo+KGNsaWVudF8uZ2V0KCkpLT5HZXRSb290Q2xpZW50KCk7CiAgIHN0ZDo6dW5pcXVlX3B0cjxEZXZUb29sc0NsaWVudD4gY2hpbGRfY2xpZW50KAotICAgICAgc3RkOjptYWtlX3VuaXF1ZTxEZXZUb29sc0NsaWVudEltcGw+KHBhcmVudF9jbGllbnQsIHNlc3Npb25faWQpKTsKKyAgICAgIHN0ZDo6bWFrZV91bmlxdWU8RGV2VG9vbHNDbGllbnRJbXBsPihyb290X2NsaWVudCwgc2Vzc2lvbl9pZCkpOwogICBXZWJWaWV3SW1wbCogY2hpbGQgPSBuZXcgV2ViVmlld0ltcGwodGFyZ2V0X2lkLCB3M2NfY29tcGxpYW50XywgYnJvd3Nlcl9pbmZvXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShjaGlsZF9jbGllbnQpLCBudWxscHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbl90cmFja2VyXy0+SXNOb25CbG9ja2luZygpCmRpZmYgLS1naXQgYS9jaHJvbWUvdGVzdC9jaHJvbWVkcml2ZXIvdGVzdC9ydW5fcHlfdGVzdHMucHkgYi9jaHJvbWUvdGVzdC9jaHJvbWVkcml2ZXIvdGVzdC9ydW5fcHlfdGVzdHMucHkKaW5kZXggYjNkNzUyMi4uMmM1N2NhYyAxMDA3NTUKLS0tIGEvY2hyb21lL3Rlc3QvY2hyb21lZHJpdmVyL3Rlc3QvcnVuX3B5X3Rlc3RzLnB5CisrKyBiL2Nocm9tZS90ZXN0L2Nocm9tZWRyaXZlci90ZXN0L3J1bl9weV90ZXN0cy5weQpAQCAtOTQ4LDUyICs5NDgsNTUgQEAKICAgZGVmIHRlc3RBY3Rpb25zTXVsdGlUb3VjaFBvaW50KHNlbGYpOgogICAgIHNlbGYuX2RyaXZlci5Mb2FkKHNlbGYuR2V0SHR0cFVybEZvckZpbGUoJy9jaHJvbWVkcml2ZXIvZW1wdHkuaHRtbCcpKQogICAgIHNlbGYuX2RyaXZlci5FeGVjdXRlU2NyaXB0KAotICAgICAgICAnZG9jdW1lbnQuYm9keS5pbm5lckhUTUwgPSAiPGRpdj5vbGQ8L2Rpdj4iOycKLSAgICAgICAgJ3ZhciBkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2IilbMF07JwotICAgICAgICAnd2luZG93LmV2ZW50cyA9IFtdOycKLSAgICAgICAgJ2Rpdi5zdHlsZVsid2lkdGgiXSA9ICIxMDBweCI7JwotICAgICAgICAnZGl2LnN0eWxlWyJoZWlnaHQiXSA9ICIxMDBweCI7JwotICAgICAgICAnZGl2LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCBmdW5jdGlvbihlKSB7JwotICAgICAgICAnICB3aW5kb3cuZXZlbnRzLnB1c2goJwotICAgICAgICAnICAgICAge3R5cGU6IGUudHlwZSwnCi0gICAgICAgICcgICAgICAgeDogZS50b3VjaGVzW2UudG91Y2hlcy5sZW5ndGggLSAxXS5jbGllbnRYLCcKLSAgICAgICAgJyAgICAgICB5OiBlLnRvdWNoZXNbZS50b3VjaGVzLmxlbmd0aCAtIDFdLmNsaWVudFl9KTsnCi0gICAgICAgICd9KTsnCi0gICAgICAgICdkaXYuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLCBmdW5jdGlvbihlKSB7JwotICAgICAgICAnICB3aW5kb3cuZXZlbnRzLnB1c2goJwotICAgICAgICAnICAgICAge3R5cGU6IGUudHlwZX0pOycKLSAgICAgICAgJ30pOycpCisgICAgICAgICcnJworICAgICAgICBkb2N1bWVudC5ib2R5LmlubmVySFRNTAorICAgICAgICAgID0gIjxkaXYgaWQ9J2RpdicgYXV0b2ZvY3VzIHN0eWxlPSd3aWR0aDoyMDBweDsgaGVpZ2h0OjIwMHB4Jz4iOworICAgICAgICB3aW5kb3cuZXZlbnRzID0gW107CisgICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXYnKTsKKyAgICAgICAgZGl2LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBldmVudCA9PiB7CisgICAgICAgICAgd2luZG93LmV2ZW50cy5wdXNoKAorICAgICAgICAgICAgICB7dHlwZTogZXZlbnQudHlwZSwKKyAgICAgICAgICAgICAgIHg6IGV2ZW50LnRvdWNoZXNbZXZlbnQudG91Y2hlcy5sZW5ndGggLSAxXS5jbGllbnRYLAorICAgICAgICAgICAgICAgeTogZXZlbnQudG91Y2hlc1tldmVudC50b3VjaGVzLmxlbmd0aCAtIDFdLmNsaWVudFl9KTsKKyAgICAgICAgfSk7CisgICAgICAgIGRpdi5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIGV2ZW50ID0+IHsKKyAgICAgICAgICB3aW5kb3cuZXZlbnRzLnB1c2goCisgICAgICAgICAgICAgIHt0eXBlOiBldmVudC50eXBlfSk7CisgICAgICAgIH0pOworICAgICAgICAnJycpCisKICAgICBhY3Rpb25zID0gKHsiYWN0aW9ucyI6IFt7CiAgICAgICAidHlwZSI6InBvaW50ZXIiLAotICAgICAgImFjdGlvbnMiOlt7InR5cGUiOiAicG9pbnRlck1vdmUiLCAieCI6IDEwLCAieSI6IDEwfSwKKyAgICAgICJhY3Rpb25zIjpbeyJ0eXBlIjogInBvaW50ZXJNb3ZlIiwgIngiOiA1MCwgInkiOiA1MH0sCiAgICAgICAgICAgICAgICAgIHsidHlwZSI6ICJwb2ludGVyRG93biJ9LAogICAgICAgICAgICAgICAgICB7InR5cGUiOiAicG9pbnRlclVwIn1dLAogICAgICAgInBhcmFtZXRlcnMiOiB7InBvaW50ZXJUeXBlIjogInRvdWNoIn0sCiAgICAgICAiaWQiOiAicG9pbnRlcjEifSwKICAgICAgIHsKICAgICAgICJ0eXBlIjoicG9pbnRlciIsCi0gICAgICAiYWN0aW9ucyI6W3sidHlwZSI6ICJwb2ludGVyTW92ZSIsICJ4IjogMTUsICJ5IjogMTV9LAorICAgICAgImFjdGlvbnMiOlt7InR5cGUiOiAicG9pbnRlck1vdmUiLCAieCI6IDYwLCAieSI6IDYwfSwKICAgICAgICAgICAgICAgICAgeyJ0eXBlIjogInBvaW50ZXJEb3duIn0sCiAgICAgICAgICAgICAgICAgIHsidHlwZSI6ICJwb2ludGVyVXAifV0sCiAgICAgICAicGFyYW1ldGVycyI6IHsicG9pbnRlclR5cGUiOiAidG91Y2gifSwKICAgICAgICJpZCI6ICJwb2ludGVyMiJ9XX0pCiAgICAgc2VsZi5fZHJpdmVyLlBlcmZvcm1BY3Rpb25zKGFjdGlvbnMpCisgICAgdGltZS5zbGVlcCgxKQogICAgIGZvciBfIGluIHJhbmdlKDUpOgogICAgICAgZXZlbnRzID0gc2VsZi5fZHJpdmVyLkV4ZWN1dGVTY3JpcHQoJ3JldHVybiB3aW5kb3cuZXZlbnRzJykKICAgICAgIGlmIGxlbihldmVudHMpID09IDQ6CiAgICAgICAgIGJyZWFrCi0gICAgICAjIFdhaXQgMTAgbXMgZm9yIHRoZSBldmVudCBoYW5kbGVyIHRvIGJlIGV4ZWN1dGVkLgotICAgICAgdGltZS5zbGVlcCgwLjAxKQorICAgICAgIyBXYWl0IDEwMCBtb3JlIG1zIGZvciB0aGUgZXZlbnQgaGFuZGxlciB0byBiZSBleGVjdXRlZC4KKyAgICAgIHRpbWUuc2xlZXAoMC4xKQogCiAgICAgc2VsZi5hc3NlcnRFcXVhbHMoNCwgbGVuKGV2ZW50cykpCiAgICAgc2VsZi5hc3NlcnRFcXVhbHMoInRvdWNoc3RhcnQiLCBldmVudHNbMF1bJ3R5cGUnXSkKICAgICBzZWxmLmFzc2VydEVxdWFscygidG91Y2hzdGFydCIsIGV2ZW50c1sxXVsndHlwZSddKQogICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCJ0b3VjaGVuZCIsIGV2ZW50c1syXVsndHlwZSddKQogICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCJ0b3VjaGVuZCIsIGV2ZW50c1szXVsndHlwZSddKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEwLCBldmVudHNbMF1bJ3gnXSkKLSAgICBzZWxmLmFzc2VydEVxdWFscygxMCwgZXZlbnRzWzBdWyd5J10pCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMoMTUsIGV2ZW50c1sxXVsneCddKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDE1LCBldmVudHNbMV1bJ3knXSkKKyAgICBzZWxmLmFzc2VydEVxdWFscyg1MCwgZXZlbnRzWzBdWyd4J10pCisgICAgc2VsZi5hc3NlcnRFcXVhbHMoNTAsIGV2ZW50c1swXVsneSddKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDYwLCBldmVudHNbMV1bJ3gnXSkKKyAgICBzZWxmLmFzc2VydEVxdWFscyg2MCwgZXZlbnRzWzFdWyd5J10pCiAKICAgZGVmIHRlc3RBY3Rpb25zTXVsdGkoc2VsZik6CiAgICAgc2VsZi5fZHJpdmVyLkxvYWQoc2VsZi5HZXRIdHRwVXJsRm9yRmlsZSgnL2Nocm9tZWRyaXZlci9lbXB0eS5odG1sJykpCmRpZmYgLS1naXQgYS9jaHJvbWUvdGVzdC9jaHJvbWVkcml2ZXIvd2luZG93X2NvbW1hbmRzLmNjIGIvY2hyb21lL3Rlc3QvY2hyb21lZHJpdmVyL3dpbmRvd19jb21tYW5kcy5jYwppbmRleCA1MmFiYWY2Li5jMGI1N2E5IDEwMDY0NAotLS0gYS9jaHJvbWUvdGVzdC9jaHJvbWVkcml2ZXIvd2luZG93X2NvbW1hbmRzLmNjCisrKyBiL2Nocm9tZS90ZXN0L2Nocm9tZWRyaXZlci93aW5kb3dfY29tbWFuZHMuY2MKQEAgLTUxMiw2ICs1MTIsOCBAQAogICAgIHJldHVybiBuYXZfc3RhdHVzOwogICBpZiAoc3RhdHVzLmNvZGUoKSA9PSBrVW5leHBlY3RlZEFsZXJ0T3BlbikKICAgICByZXR1cm4gU3RhdHVzKGtPayk7CisgIGlmIChzdGF0dXMuY29kZSgpID09IGtVbmV4cGVjdGVkQWxlcnRPcGVuX0tlZXApCisgICAgcmV0dXJuIFN0YXR1cyhrVW5leHBlY3RlZEFsZXJ0T3Blbik7CiAgIHJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE3NzMsNyArMTc3NSwxNCBAQAogICBzdGQ6OnN0cmluZyBzY3JlZW5zaG90OwogICBzdGF0dXMgPSB3ZWJfdmlldy0+Q2FwdHVyZVNjcmVlbnNob3QoJnNjcmVlbnNob3QsIGJhc2U6OkRpY3Rpb25hcnlWYWx1ZSgpKTsKICAgaWYgKHN0YXR1cy5Jc0Vycm9yKCkpIHsKLSAgICBMT0coV0FSTklORykgPDwgInNjcmVlbnNob3QgZmFpbGVkLCByZXRyeWluZyI7CisgICAgaWYgKHN0YXR1cy5jb2RlKCkgPT0ga1VuZXhwZWN0ZWRBbGVydE9wZW4pIHsKKyAgICAgIExPRyhXQVJOSU5HKSA8PCBzdGF0dXMubWVzc2FnZSgpIDw8ICIsIGNhbmNlbGxpbmcgc2NyZWVuc2hvdCI7CisgICAgICAvLyB3ZSBjYW4ndCB0YWtlIHNjcmVlbnNob3QgaW4gdGhpcyBzdGF0ZQorICAgICAgLy8gYnV0IHdlIG11c3QgcmV0dXJuIGtVbmV4cGVjdGVkQWxlcnRPcGVuX0tlZXAgaW5zdGVhZAorICAgICAgLy8gc2VlIGh0dHBzOi8vY3JidWcuY29tL2Nocm9tZWRyaXZlci8yMTE3CisgICAgICByZXR1cm4gU3RhdHVzKGtVbmV4cGVjdGVkQWxlcnRPcGVuX0tlZXApOworICAgIH0KKyAgICBMT0coV0FSTklORykgPDwgInNjcmVlbnNob3QgZmFpbGVkLCByZXRyeWluZyAiIDw8IHN0YXR1cy5tZXNzYWdlKCk7CiAgICAgc3RhdHVzID0gd2ViX3ZpZXctPkNhcHR1cmVTY3JlZW5zaG90KCZzY3JlZW5zaG90LCBiYXNlOjpEaWN0aW9uYXJ5VmFsdWUoKSk7CiAgIH0KICAgaWYgKHN0YXR1cy5Jc0Vycm9yKCkpCmRpZmYgLS1naXQgYS9jaHJvbWUvdGVzdC9kYXRhL2FwcGNhY2hlL2ZyZW5jaF9wYWdlX3dpdGhfYXBwY2FjaGUuaHRtbCBiL2Nocm9tZS90ZXN0L2RhdGEvYXBwY2FjaGUvZnJlbmNoX3BhZ2Vfd2l0aF9hcHBjYWNoZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmRmMjAyYi4uMDAwMDAwMAotLS0gYS9jaHJvbWUvdGVzdC9kYXRhL2FwcGNhY2hlL2ZyZW5jaF9wYWdlX3dpdGhfYXBwY2FjaGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sPgotPGh0bWwgbWFuaWZlc3Q9InNpbXBsZV9wYWdlLm1hbmlmZXN0Ij4KLTxoZWFkPgotICA8aGVhZD48dGl0bGU+Q2V0dGUgcGFnZSBlc3QgZW4gRnJhbudhaXM8L3RpdGxlPjwvaGVhZD4KLSAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICAgIGZ1bmN0aW9uIG9uQ2FjaGVkRXZlbnQoKSB7Ci0gICAgICB3aW5kb3cuZG9jdW1lbnQudGl0bGUgPSAiQXBwQ2FjaGUgbWlzIOAgam91ciI7Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gb25Mb2FkKCkgewotICAgICAgd2luZG93LmFwcGxpY2F0aW9uQ2FjaGUuYWRkRXZlbnRMaXN0ZW5lcignY2FjaGVkJywgb25DYWNoZWRFdmVudCwgZmFsc2UpOwotICAgIH0KLSAgPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keSBvbmxvYWQ9Im9uTG9hZCgpIj4KLUNldHRlIHBhZ2UgYSDpdOkgculkaWfpZSBlbiBmcmFu52Fpcy4gU2F2aWV6LXZvdXMgcXVlIGxlIEZyYW7nYWlzIGVzdCBsYSBsYW5ndWUgb2ZmaWNpZWxsZSBkZXMgamV1eCBvbHltcGlxdWVzPyDHYSB2b3VzIGVuIGJvdWNoZSB1biBjb2luLCBwYXMgdnJhaT8KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2Nocm9tZS90ZXN0L2RhdGEvYXBwY2FjaGUvc2ltcGxlX3BhZ2UubWFuaWZlc3QgYi9jaHJvbWUvdGVzdC9kYXRhL2FwcGNhY2hlL3NpbXBsZV9wYWdlLm1hbmlmZXN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmY0MGM1NS4uMDAwMDAwMAotLS0gYS9jaHJvbWUvdGVzdC9kYXRhL2FwcGNhY2hlL3NpbXBsZV9wYWdlLm1hbmlmZXN0CisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1DQUNIRSBNQU5JRkVTVAotCi1ORVRXT1JLOgotKgpkaWZmIC0tZ2l0IGEvY2hyb21lL3Rlc3QvZGF0YS9sb2NhbF9udHAvcmVhbGJveF9icm93c2VydGVzdC5qcyBiL2Nocm9tZS90ZXN0L2RhdGEvbG9jYWxfbnRwL3JlYWxib3hfYnJvd3NlcnRlc3QuanMKaW5kZXggYzgxYjRiNzguLmMxODczMmUgMTAwNjQ0Ci0tLSBhL2Nocm9tZS90ZXN0L2RhdGEvbG9jYWxfbnRwL3JlYWxib3hfYnJvd3NlcnRlc3QuanMKKysrIGIvY2hyb21lL3Rlc3QvZGF0YS9sb2NhbF9udHAvcmVhbGJveF9icm93c2VydGVzdC5qcwpAQCAtMTksNiArMTksNyBAQAogICogQGNvbnN0CiAgKi8KIHRlc3QucmVhbGJveC5DTEFTU0VTID0geworICBSRU1PVkFCTEU6ICdyZW1vdmFibGUnLAogICBSRU1PVkVfSUNPTjogJ3JlbW92ZS1pY29uJywKICAgU0VMRUNURUQ6ICdzZWxlY3RlZCcsCiAgIFNIT1dfTUFUQ0hFUzogJ3Nob3ctbWF0Y2hlcycsCkBAIC01MTMsNiArNTE0LDkgQEAKICAgdGVzdC5yZWFsYm94LnJlYWxib3hFbC5kaXNwYXRjaEV2ZW50KGtleUV2ZW50KTsKICAgYXNzZXJ0RmFsc2Uoa2V5RXZlbnQuZGVmYXVsdFByZXZlbnRlZCk7CiAKKyAgY29uc3QgbWF0Y2hlc0VsID0gJCh0ZXN0LnJlYWxib3guSURTLlJFQUxCT1hfTUFUQ0hFUyk7CisgIGFzc2VydEZhbHNlKG1hdGNoZXNFbC5jbGFzc0xpc3QuY29udGFpbnModGVzdC5yZWFsYm94LkNMQVNTRVMuUkVNT1ZBQkxFKSk7CisKICAgLy8gVGhlIGJlbG93IDIgc3RhdGVtZW50cyBzaG91bGRuJ3QgcmVhbGx5IGhhcHBlbiBpbiB1cGRhdGVkIGNvZGUgYnV0IGlzbid0CiAgIC8vIHRlcnJpYmxlIGlkZWEgdG8ga2VlcCB0ZXN0aW5nIGZvciBub3cuIFRoaXMgaXMgYmVjYXVzZSBTdXBwb3J0c0RlbGV0aW9uKCkKICAgLy8gaXMgbm93IHByb3BhZ2F0ZWQgdG8gdGhlIGNsaWVudCwgc28gd2Ugc2hvdWxkbid0IGFsbG93IHVzZXJzICh2aWEgdGhlIFVJKQpAQCAtNTMzLDYgKzUzNyw5IEBACiAgIGNocm9tZS5lbWJlZGRlZFNlYXJjaC5zZWFyY2hCb3gub25xdWVyeWF1dG9jb21wbGV0ZWRvbmUoCiAgICAgICB7aW5wdXQ6IHRlc3QucmVhbGJveC5yZWFsYm94RWwudmFsdWUsIG1hdGNoZXN9KTsKIAorICBjb25zdCBtYXRjaGVzRWwgPSAkKHRlc3QucmVhbGJveC5JRFMuUkVBTEJPWF9NQVRDSEVTKTsKKyAgYXNzZXJ0VHJ1ZShtYXRjaGVzRWwuY2xhc3NMaXN0LmNvbnRhaW5zKHRlc3QucmVhbGJveC5DTEFTU0VTLlJFTU9WQUJMRSkpOworCiAgIGNvbnN0IGRvd25BcnJvdyA9IG5ldyBLZXlib2FyZEV2ZW50KCdrZXlkb3duJywgewogICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgY2FuY2VsYWJsZTogdHJ1ZSwKQEAgLTU0MSw5ICs1NDgsOSBAQAogICB0ZXN0LnJlYWxib3gucmVhbGJveEVsLmRpc3BhdGNoRXZlbnQoZG93bkFycm93KTsKICAgYXNzZXJ0VHJ1ZShkb3duQXJyb3cuZGVmYXVsdFByZXZlbnRlZCk7CiAKLSAgY29uc3QgbWF0Y2hFbHMgPSAkKHRlc3QucmVhbGJveC5JRFMuUkVBTEJPWF9NQVRDSEVTKS5jaGlsZHJlbjsKLSAgYXNzZXJ0RXF1YWxzKDIsIG1hdGNoRWxzLmxlbmd0aCk7Ci0gIGFzc2VydFRydWUobWF0Y2hFbHNbMV0uY2xhc3NMaXN0LmNvbnRhaW5zKHRlc3QucmVhbGJveC5DTEFTU0VTLlNFTEVDVEVEKSk7CisgIGFzc2VydEVxdWFscygyLCBtYXRjaGVzRWwuY2hpbGRyZW4ubGVuZ3RoKTsKKyAgYXNzZXJ0VHJ1ZSgKKyAgICAgIG1hdGNoZXNFbC5jaGlsZHJlblsxXS5jbGFzc0xpc3QuY29udGFpbnModGVzdC5yZWFsYm94LkNMQVNTRVMuU0VMRUNURUQpKTsKIAogICBjb25zdCBzaGlmdERlbGV0ZSA9IG5ldyBLZXlib2FyZEV2ZW50KCdrZXlkb3duJywgewogICAgIGJ1YmJsZXM6IHRydWUsCkBAIC01NzEsOSArNTc4LDI0IEBACiAgIGNocm9tZS5lbWJlZGRlZFNlYXJjaC5zZWFyY2hCb3gub25xdWVyeWF1dG9jb21wbGV0ZWRvbmUoCiAgICAgICB7aW5wdXQ6IHRlc3QucmVhbGJveC5yZWFsYm94RWwudmFsdWUsIG1hdGNoZXN9KTsKIAotICBjb25zdCBzZWwgPSBgIyR7dGVzdC5yZWFsYm94LklEUy5SRUFMQk9YX01BVENIRVN9Ci0gICAgICAgICAgICAgICAuJHt0ZXN0LnJlYWxib3guQ0xBU1NFUy5SRU1PVkVfSUNPTn1gOwotICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbCkuY2xpY2soKTsKKyAgY29uc3QgbWF0Y2hlc0VsID0gJCh0ZXN0LnJlYWxib3guSURTLlJFQUxCT1hfTUFUQ0hFUyk7CisgIGFzc2VydFRydWUobWF0Y2hlc0VsLmNsYXNzTGlzdC5jb250YWlucyh0ZXN0LnJlYWxib3guQ0xBU1NFUy5SRU1PVkFCTEUpKTsKKworICBjb25zdCBlbnRlciA9IG5ldyBLZXlib2FyZEV2ZW50KCdrZXlkb3duJywgeworICAgIGJ1YmJsZXM6IHRydWUsCisgICAgY2FuY2VsYWJsZTogdHJ1ZSwKKyAgICBrZXk6ICdFbnRlcicsCisgIH0pOworCisgIGxldCBjbGlja2VkID0gZmFsc2U7CisgIG1hdGNoZXNFbC5jaGlsZHJlblswXS5vbmNsaWNrID0gKCkgPT4gY2xpY2tlZCA9IHRydWU7CisKKyAgY29uc3QgaWNvbiA9IG1hdGNoZXNFbC5xdWVyeVNlbGVjdG9yKGAuJHt0ZXN0LnJlYWxib3guQ0xBU1NFUy5SRU1PVkVfSUNPTn1gKTsKKyAgaWNvbi5kaXNwYXRjaEV2ZW50KGVudGVyKTsKKworICBhc3NlcnRGYWxzZShjbGlja2VkKTsKKworICBpY29uLmNsaWNrKCk7CiAKICAgYXNzZXJ0RXF1YWxzKDEsIHRlc3QucmVhbGJveC5kZWxldGVkTGluZXMubGVuZ3RoKTsKICAgYXNzZXJ0RXF1YWxzKDAsIHRlc3QucmVhbGJveC5kZWxldGVkTGluZXNbMF0pOwpkaWZmIC0tZ2l0IGEvY2hyb21lL3Rlc3QvZGF0YS9wb2xpY3kvcG9saWN5X3Rlc3RfY2FzZXMuanNvbiBiL2Nocm9tZS90ZXN0L2RhdGEvcG9saWN5L3BvbGljeV90ZXN0X2Nhc2VzLmpzb24KaW5kZXggY2Q4ZjkzNi4uNjllNDlhNSAxMDA2NDQKLS0tIGEvY2hyb21lL3Rlc3QvZGF0YS9wb2xpY3kvcG9saWN5X3Rlc3RfY2FzZXMuanNvbgorKysgYi9jaHJvbWUvdGVzdC9kYXRhL3BvbGljeS9wb2xpY3lfdGVzdF9jYXNlcy5qc29uCkBAIC01Mjc0LDUgKzUyNzQsMTMgQEAKICAgICAgICAgImxvY2FsX3N0YXRlIjogIHRydWUKICAgICAgIH0KICAgICBdCisgIH0sCisKKyAgIlRMUzEzSGFyZGVuaW5nRm9yTG9jYWxBbmNob3JzRW5hYmxlZCI6IHsKKyAgICAib3MiOiBbIndpbiIsICJsaW51eCIsICJtYWMiLCAiY2hyb21lb3MiLCAiYW5kcm9pZCJdLAorICAgICJ0ZXN0X3BvbGljeSI6IHsgIlRMUzEzSGFyZGVuaW5nRm9yTG9jYWxBbmNob3JzRW5hYmxlZCI6IHRydWUgfSwKKyAgICAicHJlZl9tYXBwaW5ncyI6IFsKKyAgICAgIHsgInByZWYiOiAic3NsLnRsczEzX2hhcmRlbmluZ19mb3JfbG9jYWxfYW5jaG9ycyIsICJsb2NhbF9zdGF0ZSI6IHRydWUgfQorICAgIF0KICAgfQogfQpkaWZmIC0tZ2l0IGEvY2hyb21lL3Rlc3QvZGF0YS9wcmV2aWV3cy9zZWFyY2hfcmVzdWx0c19wYWdlLmh0bWwgYi9jaHJvbWUvdGVzdC9kYXRhL3ByZXZpZXdzL3NlYXJjaF9yZXN1bHRzX3BhZ2UuaHRtbAppbmRleCBkMDAxYzQ5Li4wYmZmMTM2YiAxMDA2NDQKLS0tIGEvY2hyb21lL3Rlc3QvZGF0YS9wcmV2aWV3cy9zZWFyY2hfcmVzdWx0c19wYWdlLmh0bWwKKysrIGIvY2hyb21lL3Rlc3QvZGF0YS9wcmV2aWV3cy9zZWFyY2hfcmVzdWx0c19wYWdlLmh0bWwKQEAgLTExLDUgKzExLDYgQEAKICAgICA8YSBpZD0iZGlmZkhyZWYiIGhyZWY9Imh0dHBzOi8vZXhhbXBsZS5jb20vYmFyLmh0bWwiPmRpZmY8L2E+CiAgICAgPGEgaWQ9ImRpZmZIcmVmIiBocmVmPSJodHRwczovL2V4YW1wbGUuY29tL2Jhei5odG1sIj5kaWZmPC9hPgogICAgIDxhIGlkPSJkaWZmSHJlZiIgaHJlZj0iaHR0cHM6Ly9leGFtcGxlMi5jb20vZm9vLmh0bWwiPmRpZmY8L2E+CisgICAgPGEgaWQ9ImRpZmZIcmVmIiBocmVmPSJodHRwczovL2V4YW1wbGUzLmNvbS9mb28uaHRtbCI+ZGlmZjwvYT4KICAgPC9ib2R5PgogPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Nocm9tZS90ZXN0L2RhdGEveHIvZTJlX3Rlc3RfZmlsZXMvaHRtbC90ZXN0X2lubGluZV92aWV3ZXJfYXZhaWxhYmxlLmh0bWwgYi9jaHJvbWUvdGVzdC9kYXRhL3hyL2UyZV90ZXN0X2ZpbGVzL2h0bWwvdGVzdF9pbmxpbmVfdmlld2VyX2F2YWlsYWJsZS5odG1sCmluZGV4IGQ1ZDg2ZWUuLjU2YmQzZjMgMTAwNjQ0Ci0tLSBhL2Nocm9tZS90ZXN0L2RhdGEveHIvZTJlX3Rlc3RfZmlsZXMvaHRtbC90ZXN0X2lubGluZV92aWV3ZXJfYXZhaWxhYmxlLmh0bWwKKysrIGIvY2hyb21lL3Rlc3QvZGF0YS94ci9lMmVfdGVzdF9maWxlcy9odG1sL3Rlc3RfaW5saW5lX3ZpZXdlcl9hdmFpbGFibGUuaHRtbApAQCAtMzAsOCArMzAsOSBAQAogICAgICAgLy8gVE9ETyAoY3JidWcuY29tLzkzNDkxMik6IENvbnNpZGVyIGltcHJvdmluZyBmbG93IG9uY2UgbWV0aG9kcyBhcmUKICAgICAgIC8vIHVwZGF0ZWQuCiAgICAgICBsZXQgc3RlcCA9ICJzdXBwb3J0c0lubGluZSI7Ci0gICAgICBuYXZpZ2F0b3IueHIuc3VwcG9ydHNTZXNzaW9uKCdpbmxpbmUnKQotICAgICAgLnRoZW4oKCk9PiB7CisgICAgICBuYXZpZ2F0b3IueHIuaXNTZXNzaW9uU3VwcG9ydGVkKCdpbmxpbmUnKQorICAgICAgLnRoZW4oKHN1cHBvcnRlZCk9PiB7CisgICAgICAgIGFzc2VydF90cnVlKHN1cHBvcnRlZCk7CiAgICAgICAgIHN0ZXAgPSAicmVxdWVzdFNlc3Npb24iOwogICAgICAgICByZXR1cm4gbmF2aWdhdG9yLnhyLnJlcXVlc3RTZXNzaW9uKCdpbmxpbmUnKTsKICAgICAgIH0pCmRpZmYgLS1naXQgYS9jaHJvbWUvdGVzdC9kYXRhL3hyL2UyZV90ZXN0X2ZpbGVzL2h0bWwvdGVzdF93ZWJ4cl9jYXBhYmlsaXRpZXMuaHRtbCBiL2Nocm9tZS90ZXN0L2RhdGEveHIvZTJlX3Rlc3RfZmlsZXMvaHRtbC90ZXN0X3dlYnhyX2NhcGFiaWxpdGllcy5odG1sCmluZGV4IGJlNTczZGIuLmNmY2E0NThlIDEwMDY0NAotLS0gYS9jaHJvbWUvdGVzdC9kYXRhL3hyL2UyZV90ZXN0X2ZpbGVzL2h0bWwvdGVzdF93ZWJ4cl9jYXBhYmlsaXRpZXMuaHRtbAorKysgYi9jaHJvbWUvdGVzdC9kYXRhL3hyL2UyZV90ZXN0X2ZpbGVzL2h0bWwvdGVzdF93ZWJ4cl9jYXBhYmlsaXRpZXMuaHRtbApAQCAtMjksMTYgKzI5LDEyIEBACiAgICAgICAgIGxldCBleHBlY3RlZCA9IGV4cGVjdGF0aW9uc1tkZXZpY2VdOwogICAgICAgICB2YXIgc3VwcG9ydHNOb25JbW1lcnNpdmU7CiAgICAgICAgIHZhciBzdXBwb3J0c0ltbWVyc2l2ZTsKLSAgICAgICAgbmF2aWdhdG9yLnhyLnN1cHBvcnRzU2Vzc2lvbignaW5saW5lJykudGhlbiggKCkgPT4gewotICAgICAgICAgIHN1cHBvcnRzTm9uSW1tZXJzaXZlID0gdHJ1ZTsKLSAgICAgICAgfSwgKCkgPT4gewotICAgICAgICAgIHN1cHBvcnRzTm9uSW1tZXJzaXZlID0gZmFsc2U7CisgICAgICAgIG5hdmlnYXRvci54ci5pc1Nlc3Npb25TdXBwb3J0ZWQoJ2lubGluZScpLnRoZW4oKHN1cHBvcnRlZCkgPT4geworICAgICAgICAgIHN1cHBvcnRzTm9uSW1tZXJzaXZlID0gc3VwcG9ydGVkOwogICAgICAgICB9KS50aGVuKCAoKSA9PiB7Ci0gICAgICAgICAgbmF2aWdhdG9yLnhyLnN1cHBvcnRzU2Vzc2lvbignaW1tZXJzaXZlLXZyJykudGhlbiggKCkgPT4gewotICAgICAgICAgICAgc3VwcG9ydHNJbW1lcnNpdmUgPSB0cnVlOwotICAgICAgICAgIH0sICgpID0+IHsKLSAgICAgICAgICAgIHN1cHBvcnRzSW1tZXJzaXZlID0gZmFsc2U7Ci0gICAgICAgICAgfSkudGhlbiggKCkgPT4geworICAgICAgICAgIG5hdmlnYXRvci54ci5pc1Nlc3Npb25TdXBwb3J0ZWQoJ2ltbWVyc2l2ZS12cicpLnRoZW4oKHN1cHBvcnRlZCkgPT4geworICAgICAgICAgICAgc3VwcG9ydHNJbW1lcnNpdmUgPSBzdXBwb3J0ZWQ7CisgICAgICAgICAgfSkudGhlbigoKSA9PiB7CiAgICAgICAgICAgICBhc3NlcnRfZXF1YWxzKHN1cHBvcnRzTm9uSW1tZXJzaXZlLCBleHBlY3RlZFsibm9uLWltbWVyc2l2ZSJdLAogICAgICAgICAgICAgICAgICdEZXZpY2Ugc3VwcG9ydHMgbm9uLWltbWVyc2l2ZSBzZXNzaW9ucycpOwogICAgICAgICAgICAgYXNzZXJ0X2VxdWFscyhzdXBwb3J0c0ltbWVyc2l2ZSwgZXhwZWN0ZWRbImltbWVyc2l2ZSJdLApkaWZmIC0tZ2l0IGEvY2hyb21lL3Rlc3QvZGF0YS94ci9lMmVfdGVzdF9maWxlcy9odG1sL3Rlc3Rfd2VieHJfZG9lc19ub3RfcmV0dXJuX2RldmljZS5odG1sIGIvY2hyb21lL3Rlc3QvZGF0YS94ci9lMmVfdGVzdF9maWxlcy9odG1sL3Rlc3Rfd2VieHJfZG9lc19ub3RfcmV0dXJuX2RldmljZS5odG1sCmluZGV4IGJjNTQ4M2IuLjllMWVkZTJmIDEwMDY0NAotLS0gYS9jaHJvbWUvdGVzdC9kYXRhL3hyL2UyZV90ZXN0X2ZpbGVzL2h0bWwvdGVzdF93ZWJ4cl9kb2VzX25vdF9yZXR1cm5fZGV2aWNlLmh0bWwKKysrIGIvY2hyb21lL3Rlc3QvZGF0YS94ci9lMmVfdGVzdF9maWxlcy9odG1sL3Rlc3Rfd2VieHJfZG9lc19ub3RfcmV0dXJuX2RldmljZS5odG1sCkBAIC0xMSw5ICsxMSw4IEBACiAgICAgPHNjcmlwdCBzcmM9Ii4uLy4uLy4uLy4uLy4uLy4uL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9yZXNvdXJjZXMvdGVzdGhhcm5lc3MuanMiPjwvc2NyaXB0PgogICAgIDxzY3JpcHQgc3JjPSIuLi9yZXNvdXJjZXMvd2VieHJfZTJlLmpzIj48L3NjcmlwdD4KICAgICA8c2NyaXB0PgotICAgICAgbmF2aWdhdG9yLnhyLnN1cHBvcnRzU2Vzc2lvbignaW1tZXJzaXZlLXZyJykudGhlbiggKCkgPT4gewotICAgICAgICBhc3NlcnRfdW5yZWFjaGVkKCJXZWJYUiBpbmRpY2F0ZWQgc3VwcG9ydCBmb3IgJ2ltbWVyc2l2ZS12ciciKTsKLSAgICAgIH0sICgpID0+IHsKKyAgICAgIG5hdmlnYXRvci54ci5pc1Nlc3Npb25TdXBwb3J0ZWQoJ2ltbWVyc2l2ZS12cicpLnRoZW4oKHN1cHBvcnRlZCkgPT4geworICAgICAgICBhc3NlcnRfZmFsc2Uoc3VwcG9ydGVkLCAiV2ViWFIgaW5kaWNhdGVkIHN1cHBvcnQgZm9yICdpbW1lcnNpdmUtdnInIik7CiAgICAgICAgIGRvbmUoKTsKICAgICAgIH0pOwogICAgIDwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvY2hyb21lY2FzdC9icm93c2VyL2Nhc3RfYnJvd3Nlcl9tYWluX3BhcnRzLmNjIGIvY2hyb21lY2FzdC9icm93c2VyL2Nhc3RfYnJvd3Nlcl9tYWluX3BhcnRzLmNjCmluZGV4IGJkNjc4YjAuLmIzNmFjZDYgMTAwNjQ0Ci0tLSBhL2Nocm9tZWNhc3QvYnJvd3Nlci9jYXN0X2Jyb3dzZXJfbWFpbl9wYXJ0cy5jYworKysgYi9jaHJvbWVjYXN0L2Jyb3dzZXIvY2FzdF9icm93c2VyX21haW5fcGFydHMuY2MKQEAgLTU5LDYgKzU5LDcgQEAKICNpbmNsdWRlICJjb250ZW50L3B1YmxpYy9icm93c2VyL2Jyb3dzZXJfdGFza190cmFpdHMuaCIKICNpbmNsdWRlICJjb250ZW50L3B1YmxpYy9icm93c2VyL2Jyb3dzZXJfdGhyZWFkLmgiCiAjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvYnJvd3Nlci9jaGlsZF9wcm9jZXNzX3NlY3VyaXR5X3BvbGljeS5oIgorI2luY2x1ZGUgImNvbnRlbnQvcHVibGljL2Jyb3dzZXIvbmV0d29ya19zZXJ2aWNlX2luc3RhbmNlLmgiCiAjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvYnJvd3Nlci9yZW5kZXJfZnJhbWVfaG9zdC5oIgogI2luY2x1ZGUgImNvbnRlbnQvcHVibGljL2Jyb3dzZXIvc3RvcmFnZV9wYXJ0aXRpb24uaCIKICNpbmNsdWRlICJjb250ZW50L3B1YmxpYy9jb21tb24vY29udGVudF9zd2l0Y2hlcy5oIgpAQCAtNTAxLDEyICs1MDIsMTYgQEAKIAogICB1cmxfcmVxdWVzdF9jb250ZXh0X2ZhY3RvcnlfLT5Jbml0aWFsaXplT25VSVRocmVhZChudWxscHRyKTsKIAotICBjYXN0X2Jyb3dzZXJfcHJvY2Vzc18tPlNldENvbm5lY3Rpdml0eUNoZWNrZXIoQ29ubmVjdGl2aXR5Q2hlY2tlcjo6Q3JlYXRlKAotICAgICAgYmFzZTo6Q3JlYXRlU2luZ2xlVGhyZWFkVGFza1J1bm5lcih7Y29udGVudDo6QnJvd3NlclRocmVhZDo6SU99KSwKLSAgICAgIHVybF9yZXF1ZXN0X2NvbnRleHRfZmFjdG9yeV8tPkdldFN5c3RlbUdldHRlcigpKSk7Ci0KICAgY2FzdF9icm93c2VyX3Byb2Nlc3NfLT5TZXRCcm93c2VyQ29udGV4dCgKICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8Q2FzdEJyb3dzZXJDb250ZXh0PigpKTsKKworICBjYXN0X2Jyb3dzZXJfcHJvY2Vzc18tPlNldENvbm5lY3Rpdml0eUNoZWNrZXIoQ29ubmVjdGl2aXR5Q2hlY2tlcjo6Q3JlYXRlKAorICAgICAgYmFzZTo6Q3JlYXRlU2luZ2xlVGhyZWFkVGFza1J1bm5lcih7Y29udGVudDo6QnJvd3NlclRocmVhZDo6SU99KSwKKyAgICAgIGNvbnRlbnQ6OkJyb3dzZXJDb250ZXh0OjpHZXREZWZhdWx0U3RvcmFnZVBhcnRpdGlvbigKKyAgICAgICAgICBjYXN0X2Jyb3dzZXJfcHJvY2Vzc18tPmJyb3dzZXJfY29udGV4dCgpKQorICAgICAgICAgIC0+R2V0VVJMTG9hZGVyRmFjdG9yeUZvckJyb3dzZXJQcm9jZXNzSU9UaHJlYWQoKSwKKyAgICAgIGNvbnRlbnQ6OkdldE5ldHdvcmtDb25uZWN0aW9uVHJhY2tlcigpKSk7CisKICAgY2FzdF9icm93c2VyX3Byb2Nlc3NfLT5TZXRNZXRyaWNzU2VydmljZUNsaWVudCgKICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8bWV0cmljczo6Q2FzdE1ldHJpY3NTZXJ2aWNlQ2xpZW50PigKICAgICAgICAgICBjYXN0X2Jyb3dzZXJfcHJvY2Vzc18tPmJyb3dzZXJfY2xpZW50KCksCmRpZmYgLS1naXQgYS9jaHJvbWVjYXN0L2RldmljZS9ibHVldG9vdGgvbGUvbGVfc2Nhbl9tYW5hZ2VyX2ltcGwuY2MgYi9jaHJvbWVjYXN0L2RldmljZS9ibHVldG9vdGgvbGUvbGVfc2Nhbl9tYW5hZ2VyX2ltcGwuY2MKaW5kZXggZmMyYWY3Mi4uYjM2YzViNiAxMDA2NDQKLS0tIGEvY2hyb21lY2FzdC9kZXZpY2UvYmx1ZXRvb3RoL2xlL2xlX3NjYW5fbWFuYWdlcl9pbXBsLmNjCisrKyBiL2Nocm9tZWNhc3QvZGV2aWNlL2JsdWV0b290aC9sZS9sZV9zY2FuX21hbmFnZXJfaW1wbC5jYwpAQCAtMTQxLDkgKzE0MSwyNSBAQAogdm9pZCBMZVNjYW5NYW5hZ2VySW1wbDo6U2V0U2NhblBhcmFtZXRlcnMoaW50IHNjYW5faW50ZXJ2YWxfbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Nhbl93aW5kb3dfbXMpIHsKICAgTUFLRV9TVVJFX0lPX1RIUkVBRChTZXRTY2FuUGFyYW1ldGVycywgc2Nhbl9pbnRlcnZhbF9tcywgc2Nhbl93aW5kb3dfbXMpOworICBpZiAoc2Nhbl9oYW5kbGVfaWRzXy5lbXB0eSgpKSB7CisgICAgTE9HKEVSUk9SKSA8PCAiQ2FuJ3Qgc2V0IHNjYW4gcGFyYW1ldGVycywgbm8gc2NhbiBoYW5kbGUiOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIFdlIGNvdWxkIG9ubHkgc2V0IHNjYW4gcGFyYW1ldGVycyB3aGVuIHNjYW4gaXMgcGF1c2VkLgorICBpZiAoIWxlX3NjYW5uZXJfLT5TdG9wU2NhbigpKSB7CisgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHBhdXNlIHNjYW5uaW5nIGJlZm9yZSBzZXR0aW5nIHNjYW4gcGFyYW1ldGVycyI7CisgICAgcmV0dXJuOworICB9CiAKICAgaWYgKCFsZV9zY2FubmVyXy0+U2V0U2NhblBhcmFtZXRlcnMoc2Nhbl9pbnRlcnZhbF9tcywgc2Nhbl93aW5kb3dfbXMpKSB7CiAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHNldCBzY2FuIHBhcmFtZXRlcnMiOworICAgIHJldHVybjsKKyAgfQorCisgIGlmICghbGVfc2Nhbm5lcl8tPlN0YXJ0U2NhbigpKSB7CisgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlc3RhcnQgc2Nhbm5pbmcgYWZ0ZXIgc2V0dGluZyBzY2FuIHBhcmFtZXRlcnMiOworICAgIHJldHVybjsKICAgfQogCiAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIHNjYW5faW50ZXJ2YWw6ICIgPDwgc2Nhbl9pbnRlcnZhbF9tcwpkaWZmIC0tZ2l0IGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9CVUlMRC5nbiBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvQlVJTEQuZ24KaW5kZXggNjVmZTYyNS4uNzA3MjU4MCAxMDA2NDQKLS0tIGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9CVUlMRC5nbgorKysgYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL0JVSUxELmduCkBAIC0xMCw4ICsxMCw2IEBACiBkZWNsYXJlX2FyZ3MoKSB7CiAgIHN5c3RlbV9vd25zX3ZvbHVtZSA9CiAgICAgICB1c2VfYWxzYSAmJiAhZW5hYmxlX2Fzc2lzdGFudCAmJiBjaHJvbWVjYXN0X2JyYW5kaW5nICE9ICJnb29nbGUiCi0KLSAgbWl4ZXJfb3V0cHV0ID0gIiIKIH0KIAogY2FzdF9zb3VyY2Vfc2V0KCJiYWNrZW5kIikgewpAQCAtMTA2LDkgKzEwNCwxMiBAQAogCiAgIGRlcHMgPSBbCiAgICAgIi8vYmFzZSIsCi0gICAgIi8vY2hyb21lY2FzdC9wdWJsaWMvbWVkaWEiLAogICAgICIvL21lZGlhIiwKICAgXQorCisgIHB1YmxpY19kZXBzID0gWworICAgICIvL2Nocm9tZWNhc3QvcHVibGljL21lZGlhIiwKKyAgXQogfQogCiBjYXN0X3NvdXJjZV9zZXQoImF2X3N5bmNfZHVtbXkiKSB7CkBAIC0xNDQsMTkgKzE0NSw2IEBACiAgIF0KIH0KIAotY2FzdF9zb3VyY2Vfc2V0KCJwb3N0X3Byb2Nlc3Nvcl9mYWN0b3J5IikgewotICBzb3VyY2VzID0gWwotICAgICJwb3N0X3Byb2Nlc3Nvcl9mYWN0b3J5LmNjIiwKLSAgICAicG9zdF9wcm9jZXNzb3JfZmFjdG9yeS5oIiwKLSAgXQotCi0gIGRlcHMgPSBbCi0gICAgIi8vYmFzZSIsCi0gICAgIi8vY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9wb3N0X3Byb2Nlc3NvcnM6cG9zdF9wcm9jZXNzb3Jfd3JhcHBlciIsCi0gICAgIi8vY2hyb21lY2FzdC9wdWJsaWMvbWVkaWEiLAotICBdCi19Ci0KIGNhc3Rfc291cmNlX3NldCgiYXVkaW9fcmVzYW1wbGVyIikgewogICBzb3VyY2VzID0gWwogICAgICJhdWRpb19yZXNhbXBsZXIuY2MiLApAQCAtMTkxLDUwICsxNzksNiBAQAogICBjZmxhZ3MgPSBbICItZmZhc3QtbWF0aCIgXQogfQogCi1jYXN0X3NvdXJjZV9zZXQoIm1peGVyX2NvbnRyb2wiKSB7Ci0gIHNvdXJjZXMgPSBbCi0gICAgIm1peGVyX2NvbnRyb2wuaCIsCi0gIF0KLSAgZGVwcyA9IFsKLSAgICAiLy9jaHJvbWVjYXN0L3B1YmxpYyIsCi0gIF0KLX0KLQotY2FzdF9zb3VyY2Vfc2V0KCJtaXhlcl9waXBlbGluZSIpIHsKLSAgc291cmNlcyA9IFsKLSAgICAiYXVkaW9fb3V0cHV0X3JlZGlyZWN0b3JfaW5wdXQuaCIsCi0gICAgImZpbHRlcl9ncm91cC5jYyIsCi0gICAgImZpbHRlcl9ncm91cC5oIiwKLSAgICAibWl4ZXJfaW5wdXQuY2MiLAotICAgICJtaXhlcl9pbnB1dC5oIiwKLSAgICAibWl4ZXJfcGlwZWxpbmUuY2MiLAotICAgICJtaXhlcl9waXBlbGluZS5oIiwKLSAgICAicG9zdF9wcm9jZXNzaW5nX3BpcGVsaW5lLmgiLAotICAgICJwb3N0X3Byb2Nlc3NpbmdfcGlwZWxpbmVfaW1wbC5jYyIsCi0gICAgInBvc3RfcHJvY2Vzc2luZ19waXBlbGluZV9pbXBsLmgiLAotICAgICJwb3N0X3Byb2Nlc3NpbmdfcGlwZWxpbmVfcGFyc2VyLmNjIiwKLSAgICAicG9zdF9wcm9jZXNzaW5nX3BpcGVsaW5lX3BhcnNlci5oIiwKLSAgXQotICBkZXBzID0gWwotICAgICI6YXVkaW9fYnVpbGRmbGFncyIsCi0gICAgIjphdWRpb19oZWxwZXJzIiwKLSAgICAiOmF1ZGlvX3Jlc2FtcGxlciIsCi0gICAgIjpjYXN0X2F1ZGlvX2pzb24iLAotICAgICI6aW50ZXJsZWF2ZWRfY2hhbm5lbF9taXhlciIsCi0gICAgIjpwb3N0X3Byb2Nlc3Nvcl9mYWN0b3J5IiwKLSAgICAiOnB1YmxpYyIsCi0gICAgIi8vYmFzZSIsCi0gICAgIi8vY2hyb21lY2FzdC9iYXNlIiwKLSAgICAiLy9jaHJvbWVjYXN0L21lZGlhL2Jhc2UiLAotICAgICIvL2Nocm9tZWNhc3QvbWVkaWEvY21hL2Jhc2UiLAotICAgICIvL2Nocm9tZWNhc3QvbWVkaWEvY21hL2RlY29kZXIiLAotICAgICIvL2Nocm9tZWNhc3QvcHVibGljIiwKLSAgICAiLy9jaHJvbWVjYXN0L3B1YmxpYy9tZWRpYSIsCi0gICAgIi8vbWVkaWEiLAotICAgICIvL21lZGlhOnNoYXJlZF9tZW1vcnlfc3VwcG9ydCIsCi0gIF0KLX0KLQogY2FzdF9zb3VyY2Vfc2V0KCJ2b2x1bWVfbWFwIikgewogICBzb3VyY2VzID0gWwogICAgICJ2b2x1bWVfbWFwLmNjIiwKQEAgLTI0Myw2ICsxODcsNyBAQAogICBkZXBzID0gWwogICAgICI6Y2FzdF9hdWRpb19qc29uIiwKICAgICAiLy9iYXNlIiwKKyAgICAiLy9jaHJvbWVjYXN0L3B1YmxpYyIsCiAgIF0KIH0KIApAQCAtMjUwLDEwNiArMTk1LDQ4IEBACiAgIHNvdXJjZXMgPSBbCiAgICAgImF1ZGlvX2RlY29kZXJfZm9yX21peGVyLmNjIiwKICAgICAiYXVkaW9fZGVjb2Rlcl9mb3JfbWl4ZXIuaCIsCi0gICAgImF1ZGlvX291dHB1dF9yZWRpcmVjdG9yLmNjIiwKLSAgICAiYXVkaW9fb3V0cHV0X3JlZGlyZWN0b3IuaCIsCi0gICAgImJ1ZmZlcmluZ19taXhlcl9zb3VyY2UuY2MiLAotICAgICJidWZmZXJpbmdfbWl4ZXJfc291cmNlLmgiLAogICAgICJjYXN0X21lZGlhX3NobGliX21peGVyX2F1ZGlvLmNjIiwKLSAgICAiZGlyZWN0X21peGVyX3NvdXJjZS5jYyIsCi0gICAgImRpcmVjdF9taXhlcl9zb3VyY2UuaCIsCi0gICAgImxvb3BiYWNrX2hhbmRsZXIuY2MiLAotICAgICJsb29wYmFja19oYW5kbGVyLmgiLAogICAgICJtZWRpYV9waXBlbGluZV9iYWNrZW5kX2Zvcl9taXhlci5jYyIsCiAgICAgIm1lZGlhX3BpcGVsaW5lX2JhY2tlbmRfZm9yX21peGVyLmgiLAotICAgICJtaXhlcl9pbnB1dF9jb25uZWN0aW9uLmNjIiwKLSAgICAibWl4ZXJfaW5wdXRfY29ubmVjdGlvbi5oIiwKLSAgICAibWl4ZXJfc2VydmljZV9yZWNlaXZlci5jYyIsCi0gICAgIm1peGVyX3NlcnZpY2VfcmVjZWl2ZXIuaCIsCi0gICAgInN0cmVhbV9taXhlci5jYyIsCi0gICAgInN0cmVhbV9taXhlci5oIiwKICAgICAidm9sdW1lX2NvbnRyb2wuY2MiLAogICBdCiAKICAgZGVwcyA9IFsKICAgICAiOmF1ZGlvX2J1aWxkZmxhZ3MiLAogICAgICI6YXVkaW9faGVscGVycyIsCi0gICAgIjphdWRpb19yZXNhbXBsZXIiLAogICAgICI6Y2FzdF9hdWRpb19qc29uIiwKLSAgICAiOmludGVybGVhdmVkX2NoYW5uZWxfbWl4ZXIiLAotICAgICI6bWl4ZXJfY29udHJvbCIsCi0gICAgIjptaXhlcl9waXBlbGluZSIsCi0gICAgIjpwb3N0X3Byb2Nlc3Nvcl9mYWN0b3J5IiwKICAgICAiOnB1YmxpYyIsCiAgICAgIjp2b2x1bWVfbWFwIiwKICAgICAiLy9iYXNlIiwKICAgICAiLy9jaHJvbWVjYXN0L2Jhc2UiLAotICAgICIvL2Nocm9tZWNhc3QvYmFzZTp0aHJlYWRfaGVhbHRoX2NoZWNrZXIiLAotICAgICIvL2Nocm9tZWNhc3QvbWVkaWEvYXVkaW86bGliY2FzdF9leHRlcm5hbF9hdWRpb19waXBlbGluZV8xLjAiLAotICAgICIvL2Nocm9tZWNhc3QvbWVkaWEvYXVkaW8vbWl4ZXJfc2VydmljZTpjb21tb24iLAotICAgICIvL2Nocm9tZWNhc3QvbWVkaWEvYXVkaW8vbWl4ZXJfc2VydmljZTpwcm90byIsCi0gICAgIi8vY2hyb21lY2FzdC9tZWRpYS9hdWRpby9taXhlcl9zZXJ2aWNlL3JlY2VpdmVyIiwKLSAgICAiLy9jaHJvbWVjYXN0L21lZGlhL2Jhc2UiLAogICAgICIvL2Nocm9tZWNhc3QvbWVkaWEvYmFzZTptb25vdG9uaWNfY2xvY2siLAorICAgICIvL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIiLAogICAgICIvL2Nocm9tZWNhc3QvbWVkaWEvY21hL2Jhc2UiLAogICAgICIvL2Nocm9tZWNhc3QvbWVkaWEvY21hL2RlY29kZXIiLAotICAgICIvL2Nocm9tZWNhc3QvbmV0OmlvX2J1ZmZlcl9wb29sIiwKICAgICAiLy9jaHJvbWVjYXN0L3B1YmxpYyIsCiAgICAgIi8vY2hyb21lY2FzdC9wdWJsaWMvbWVkaWEiLAogICAgICIvL21lZGlhIiwKICAgICAiLy9tZWRpYTpzaGFyZWRfbWVtb3J5X3N1cHBvcnQiLAogICBdCi0KLSAgaWYgKHVzZV9hbHNhKSB7Ci0gICAgZGVwcyArPSBbICJhbHNhOmNtYV9iYWNrZW5kX3N1cHBvcnQiIF0KLSAgfSBlbHNlIGlmIChpc19mdWNoc2lhKSB7Ci0gICAgZGVwcyArPSBbICJmdWNoc2lhOmNtYV9iYWNrZW5kX3N1cHBvcnQiIF0KLSAgfSBlbHNlIHsKLSAgICAjIElmIGVuYWJsZV92aWRlb193aXRoX21peGVkX2F1ZGlvICYmICF1c2VfYWxzYSwgdGhlIHBsYXRmb3JtIG5lZWRzIHRvCi0gICAgIyBwcm92aWRlIGl0cyBvd24gbWl4ZXIgb3V0cHV0LgotICAgIGlmICghZW5hYmxlX3ZpZGVvX3dpdGhfbWl4ZWRfYXVkaW8pIHsKLSAgICAgIHNvdXJjZXMgKz0gWyAibWl4ZXJfb3V0cHV0X3N0cmVhbV9kdW1teS5jYyIgXQotICAgIH0gZWxzZSB7Ci0gICAgICBhc3NlcnQoIiRtaXhlcl9vdXRwdXQiICE9ICIiKQotICAgICAgZGVwcyArPSBbICIkbWl4ZXJfb3V0cHV0IiBdCi0gICAgfQotICB9CiB9CiAKIHRlc3QoImNhc3RfYXVkaW9fYmFja2VuZF91bml0dGVzdHMiKSB7CiAgIHRlc3Rvbmx5ID0gdHJ1ZQogICBzb3VyY2VzID0gWwogICAgICJhdWRpb19mYWRlcl91bml0dGVzdC5jYyIsCi0gICAgImZpbHRlcl9ncm91cF91bml0dGVzdC5jYyIsCiAgICAgImludGVybGVhdmVkX2NoYW5uZWxfbWl4ZXJfdW5pdHRlc3QuY2MiLAotICAgICJtb2NrX21peGVyX3NvdXJjZS5jYyIsCi0gICAgIm1vY2tfbWl4ZXJfc291cmNlLmgiLAotICAgICJtb2NrX3Bvc3RfcHJvY2Vzc29yX2ZhY3RvcnkuY2MiLAotICAgICJtb2NrX3Bvc3RfcHJvY2Vzc29yX2ZhY3RvcnkuaCIsCi0gICAgIm1vY2tfcmVkaXJlY3RlZF9hdWRpb19vdXRwdXQuY2MiLAotICAgICJtb2NrX3JlZGlyZWN0ZWRfYXVkaW9fb3V0cHV0LmgiLAotICAgICJzdHJlYW1fbWl4ZXJfZXh0ZXJuYWxfYXVkaW9fcGlwZWxpbmVfdW5pdHRlc3QuY2MiLAotICAgICJzdHJlYW1fbWl4ZXJfdW5pdHRlc3QuY2MiLAogICAgICJ2b2x1bWVfbWFwX3VuaXR0ZXN0LmNjIiwKICAgXQogCiAgIGRlcHMgPSBbCiAgICAgIjphdWRpb19oZWxwZXJzIiwKLSAgICAiOmF2X3N5bmNfZHVtbXkiLAogICAgICI6Y2FzdF9hdWRpb19qc29uIiwKLSAgICAiOmZvcl9taXhlcl9hdWRpbyIsCiAgICAgIjppbnRlcmxlYXZlZF9jaGFubmVsX21peGVyIiwKLSAgICAiOm1peGVyX3BpcGVsaW5lIiwKLSAgICAiOm51bGxfdmlkZW8iLAotICAgICI6cHVibGljIiwKICAgICAiOnZvbHVtZV9tYXAiLAogICAgICIvL2Jhc2UiLAogICAgICIvL2Jhc2UvdGVzdDpydW5fYWxsX3VuaXR0ZXN0cyIsCi0gICAgIi8vY2hyb21lY2FzdC9tZWRpYS9hdWRpbzpmYWtlX2V4dGVybmFsX2F1ZGlvX3BpcGVsaW5lIiwKLSAgICAiLy9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3Bvc3RfcHJvY2Vzc29yczp1bml0dGVzdHMiLAotICAgICIvL2Nocm9tZWNhc3QvcHVibGljIiwKLSAgICAiLy9jaHJvbWVjYXN0L3B1YmxpYy9tZWRpYSIsCisgICAgIi8vY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlcjp1bml0dGVzdHMiLAogICAgICIvL21lZGlhIiwKLSAgICAiLy9tZWRpYTpzaGFyZWRfbWVtb3J5X3N1cHBvcnQiLAogICAgICIvL3Rlc3RpbmcvZ21vY2siLAogICAgICIvL3Rlc3RpbmcvZ3Rlc3QiLAogICBdCmRpZmYgLS1naXQgYS9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL2Fsc2EvQlVJTEQuZ24gYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL2Fsc2EvQlVJTEQuZ24KaW5kZXggMGRhZjg3ZDIuLmE3YWU1ZmIgMTAwNjQ0Ci0tLSBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvYWxzYS9CVUlMRC5nbgorKysgYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL2Fsc2EvQlVJTEQuZ24KQEAgLTE2LDYgKzE2LDcgQEAKICAgXQogCiAgIGRlcHMgPSBbCisgICAgIjp2b2x1bWVfY29udHJvbCIsCiAgICAgIi8vYmFzZSIsCiAgICAgIi8vY2hyb21lY2FzdC9iYXNlIiwKICAgICAiLy9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kOmF1ZGlvX2NvZGVjX3N1cHBvcnQiLApAQCAtMjgsMTIgKzI5LDM5IEBACiAgIF0KIH0KIAotY2FzdF9zb3VyY2Vfc2V0KCJjbWFfYmFja2VuZF9zdXBwb3J0IikgeworY2FzdF9zb3VyY2Vfc2V0KCJhbHNhX3dyYXBwZXIiKSB7CisgIHNvdXJjZXMgPSBbCisgICAgImFsc2Ffd3JhcHBlci5jYyIsCisgICAgImFsc2Ffd3JhcHBlci5oIiwKKyAgXQorCisgIGxpYnMgPSBbICJhc291bmQiIF0KKworICBkZXBzID0gWworICAgICIvL2Jhc2UiLAorICAgICIvL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQ6YXVkaW9fYnVpbGRmbGFncyIsCisgICAgIi8vbWVkaWEiLAorICBdCit9CisKK2Nhc3Rfc291cmNlX3NldCgidm9sdW1lX2NvbnRyb2wiKSB7CiAgIHNvdXJjZXMgPSBbCiAgICAgImFsc2Ffdm9sdW1lX2NvbnRyb2wuY2MiLAogICAgICJhbHNhX3ZvbHVtZV9jb250cm9sLmgiLAotICAgICJhbHNhX3dyYXBwZXIuY2MiLAotICAgICJhbHNhX3dyYXBwZXIuaCIsCisgIF0KKworICBsaWJzID0gWyAiYXNvdW5kIiBdCisKKyAgZGVwcyA9IFsKKyAgICAiLy9iYXNlIiwKKyAgICAiLy9jaHJvbWVjYXN0L2Jhc2U6Y2hyb21lY2FzdF9zd2l0Y2hlcyIsCisgICAgIi8vY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZDpwdWJsaWMiLAorICAgICIvL21lZGlhIiwKKyAgXQorfQorCitjYXN0X3NvdXJjZV9zZXQoIm1peGVyX291dHB1dCIpIHsKKyAgc291cmNlcyA9IFsKICAgICAibWl4ZXJfb3V0cHV0X3N0cmVhbV9hbHNhLmNjIiwKICAgICAibWl4ZXJfb3V0cHV0X3N0cmVhbV9hbHNhLmgiLAogICBdCkBAIC00MSwxMyArNjksOSBAQAogICBsaWJzID0gWyAiYXNvdW5kIiBdCiAKICAgZGVwcyA9IFsKKyAgICAiOmFsc2Ffd3JhcHBlciIsCiAgICAgIi8vYmFzZSIsCi0gICAgIi8vY2hyb21lY2FzdC9iYXNlIiwKLSAgICAiLy9jaHJvbWVjYXN0L21lZGlhL2Jhc2UiLAotICAgICIvL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQ6YXVkaW9fYnVpbGRmbGFncyIsCi0gICAgIi8vY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZDpwdWJsaWMiLAotICAgICIvL2Nocm9tZWNhc3QvbWVkaWEvY21hL2Jhc2UiLAotICAgICIvL2Nocm9tZWNhc3QvbWVkaWEvY21hL2RlY29kZXIiLAorICAgICIvL2Nocm9tZWNhc3QvYmFzZTpjaHJvbWVjYXN0X3N3aXRjaGVzIiwKICAgICAiLy9jaHJvbWVjYXN0L3B1YmxpYy9tZWRpYSIsCiAgICAgIi8vbWVkaWEiLAogICBdCmRpZmYgLS1naXQgYS9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL2F1ZGlvX2RlY29kZXJfZm9yX21peGVyLmggYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL2F1ZGlvX2RlY29kZXJfZm9yX21peGVyLmgKaW5kZXggNGFkZWEzYy4uNzI0ODIzMTMgMTAwNjQ0Ci0tLSBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvYXVkaW9fZGVjb2Rlcl9mb3JfbWl4ZXIuaAorKysgYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL2F1ZGlvX2RlY29kZXJfZm9yX21peGVyLmgKQEAgLTExLDcgKzExLDcgQEAKICNpbmNsdWRlICJiYXNlL2JpbmQuaCIKICNpbmNsdWRlICJiYXNlL2NvbnRhaW5lcnMvY2lyY3VsYXJfZGVxdWUuaCIKICNpbmNsdWRlICJiYXNlL2xvY2F0aW9uLmgiCi0jaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9idWZmZXJpbmdfbWl4ZXJfc291cmNlLmgiCisjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9idWZmZXJpbmdfbWl4ZXJfc291cmNlLmgiCiAjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvZGVjb2Rlci9jYXN0X2F1ZGlvX2RlY29kZXIuaCIKICNpbmNsdWRlICJjaHJvbWVjYXN0L3B1YmxpYy9tZWRpYS9kZWNvZGVyX2NvbmZpZy5oIgogI2luY2x1ZGUgImNocm9tZWNhc3QvcHVibGljL21lZGlhL21lZGlhX3BpcGVsaW5lX2JhY2tlbmQuaCIKZGlmZiAtLWdpdCBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvY2FzdF9tZWRpYV9zaGxpYl9taXhlcl9hdWRpby5jYyBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvY2FzdF9tZWRpYV9zaGxpYl9taXhlcl9hdWRpby5jYwppbmRleCBkZDZkZDVmNy4uYTE5MTM3NiAxMDA2NDQKLS0tIGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9jYXN0X21lZGlhX3NobGliX21peGVyX2F1ZGlvLmNjCisrKyBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvY2FzdF9tZWRpYV9zaGxpYl9taXhlcl9hdWRpby5jYwpAQCAtOSw3ICs5LDcgQEAKICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dXRpbGl0eT4KIAotI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvc3RyZWFtX21peGVyLmgiCisjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9zdHJlYW1fbWl4ZXIuaCIKIAogbmFtZXNwYWNlIGNocm9tZWNhc3QgewogbmFtZXNwYWNlIG1lZGlhIHsKZGlmZiAtLWdpdCBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvY3BsYXkvQlVJTEQuZ24gYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL2NwbGF5L0JVSUxELmduCmluZGV4IGRlOWM2YzQuLjBkOWE5MzggMTAwNjQ0Ci0tLSBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvY3BsYXkvQlVJTEQuZ24KKysrIGIvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9jcGxheS9CVUlMRC5nbgpAQCAtMTAsOSArMTAsOSBAQAogICBkZXBzID0gWwogICAgICIvL2Jhc2UiLAogICAgICIvL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQ6Y2FzdF9hdWRpb19qc29uIiwKLSAgICAiLy9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kOm1peGVyX3BpcGVsaW5lIiwKICAgICAiLy9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kOnB1YmxpYyIsCiAgICAgIi8vY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZDp2b2x1bWVfbWFwIiwKKyAgICAiLy9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyIiwKICAgICAiLy9jaHJvbWVjYXN0L3B1YmxpYyIsCiAgICAgIi8vY2hyb21lY2FzdC9wdWJsaWMvbWVkaWEiLAogICAgICIvL21lZGlhIiwKZGlmZiAtLWdpdCBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvZnVjaHNpYS9CVUlMRC5nbiBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvZnVjaHNpYS9CVUlMRC5nbgppbmRleCAwNDBiMDVhLi4xN2I5ZmZkYiAxMDA2NDQKLS0tIGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9mdWNoc2lhL0JVSUxELmduCisrKyBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvZnVjaHNpYS9CVUlMRC5nbgpAQCAtMTQsNiArMTQsNyBAQAogICBdCiAKICAgZGVwcyA9IFsKKyAgICAiOnZvbHVtZV9jb250cm9sIiwKICAgICAiLy9iYXNlIiwKICAgICAiLy9jaHJvbWVjYXN0L2Jhc2UiLAogICAgICIvL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQ6YXVkaW9fY29kZWNfc3VwcG9ydCIsCkBAIC0yNiw5ICsyNywyMCBAQAogICBdCiB9CiAKLWNhc3Rfc291cmNlX3NldCgiY21hX2JhY2tlbmRfc3VwcG9ydCIpIHsKK2Nhc3Rfc291cmNlX3NldCgidm9sdW1lX2NvbnRyb2wiKSB7CiAgIHNvdXJjZXMgPSBbCiAgICAgImZ1Y2hzaWFfdm9sdW1lX2NvbnRyb2wuY2MiLAorICAgICJmdWNoc2lhX3ZvbHVtZV9jb250cm9sLmgiLAorICBdCisKKyAgZGVwcyA9IFsKKyAgICAiLy9iYXNlIiwKKyAgICAiLy9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kOnB1YmxpYyIsCisgIF0KK30KKworY2FzdF9zb3VyY2Vfc2V0KCJtaXhlcl9vdXRwdXQiKSB7CisgIHNvdXJjZXMgPSBbCiAgICAgIm1peGVyX291dHB1dF9zdHJlYW1fZnVjaHNpYS5jYyIsCiAgICAgIm1peGVyX291dHB1dF9zdHJlYW1fZnVjaHNpYS5oIiwKICAgXQpAQCAtMzYsOCArNDgsNiBAQAogICBkZXBzID0gWwogICAgICIvL2Jhc2UiLAogICAgICIvL2Nocm9tZWNhc3QvYmFzZSIsCi0gICAgIi8vY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZDpwdWJsaWMiLAotICAgICIvL2Nocm9tZWNhc3QvcHVibGljIiwKICAgICAiLy9jaHJvbWVjYXN0L3B1YmxpYy9tZWRpYSIsCiAgICAgIi8vbWVkaWEiLAogICAgICIvL3RoaXJkX3BhcnR5L2Z1Y2hzaWEtc2RrL3NkazptZWRpYSIsCkBAIC01NCw3ICs2NCw3IEBACiAgIGNvbmZpZ3MgKz0gWyAiLy9jaHJvbWVjYXN0L3B1YmxpYzpwdWJsaWNfY29uZmlnIiBdCiAKICAgZGVwcyA9IFsKLSAgICAiOmNtYV9iYWNrZW5kX3N1cHBvcnQiLAorICAgICI6bWl4ZXJfb3V0cHV0IiwKICAgICAiLy9iYXNlIiwKICAgICAiLy9iYXNlL3Rlc3Q6dGVzdF9zdXBwb3J0IiwKICAgICAiLy90ZXN0aW5nL2d0ZXN0IiwKZGlmZiAtLWdpdCBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvZnVjaHNpYS9jYXN0X21lZGlhX3NobGliX2Z1Y2hzaWEuY2MgYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL2Z1Y2hzaWEvY2FzdF9tZWRpYV9zaGxpYl9mdWNoc2lhLmNjCmluZGV4IGE1MTg1NjguLjYwY2E3MDEgMTAwNjQ0Ci0tLSBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvZnVjaHNpYS9jYXN0X21lZGlhX3NobGliX2Z1Y2hzaWEuY2MKKysrIGIvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9mdWNoc2lhL2Nhc3RfbWVkaWFfc2hsaWJfZnVjaHNpYS5jYwpAQCAtNSw3ICs1LDYgQEAKICNpbmNsdWRlICJjaHJvbWVjYXN0L3B1YmxpYy9jYXN0X21lZGlhX3NobGliLmgiCiAKICNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21lZGlhX3BpcGVsaW5lX2JhY2tlbmRfZm9yX21peGVyLmgiCi0jaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9zdHJlYW1fbWl4ZXIuaCIKICNpbmNsdWRlICJjaHJvbWVjYXN0L3B1YmxpYy9ncmFwaGljc190eXBlcy5oIgogI2luY2x1ZGUgImNocm9tZWNhc3QvcHVibGljL3ZpZGVvX3BsYW5lLmgiCiAjaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYS5oIgpAQCAtNzUsMTkgKzc0LDUgQEAKICAgcmV0dXJuIGZhbHNlOwogfQogCi12b2lkIENhc3RNZWRpYVNobGliOjpBZGRMb29wYmFja0F1ZGlvT2JzZXJ2ZXIoTG9vcGJhY2tBdWRpb09ic2VydmVyKiBvYnNlcnZlcikgewotICBTdHJlYW1NaXhlcjo6R2V0KCktPkFkZExvb3BiYWNrQXVkaW9PYnNlcnZlcihvYnNlcnZlcik7Ci19Ci0KLXZvaWQgQ2FzdE1lZGlhU2hsaWI6OlJlbW92ZUxvb3BiYWNrQXVkaW9PYnNlcnZlcigKLSAgICBMb29wYmFja0F1ZGlvT2JzZXJ2ZXIqIG9ic2VydmVyKSB7Ci0gIFN0cmVhbU1peGVyOjpHZXQoKS0+UmVtb3ZlTG9vcGJhY2tBdWRpb09ic2VydmVyKG9ic2VydmVyKTsKLX0KLQotdm9pZCBDYXN0TWVkaWFTaGxpYjo6U2V0UG9zdFByb2Nlc3NvckNvbmZpZyhjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvbmZpZykgewotICBTdHJlYW1NaXhlcjo6R2V0KCktPlNldFBvc3RQcm9jZXNzb3JDb25maWcobmFtZSwgY29uZmlnKTsKLX0KLQogfSAgLy8gbmFtZXNwYWNlIG1lZGlhCiB9ICAvLyBuYW1lc3BhY2UgY2hyb21lY2FzdApkaWZmIC0tZ2l0IGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9CVUlMRC5nbiBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvQlVJTEQuZ24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThkZTczMgotLS0gL2Rldi9udWxsCisrKyBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvQlVJTEQuZ24KQEAgLTAsMCArMSwxMzIgQEAKKyMgQ29weXJpZ2h0IDIwMTkgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKyMgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0KCIvL2J1aWxkL2NvbmZpZy9jaHJvbWVjYXN0X2J1aWxkLmduaSIpCitpbXBvcnQoIi8vY2hyb21lY2FzdC9jaHJvbWVjYXN0LmduaSIpCitpbXBvcnQoIi8vbWVkaWEvbWVkaWFfb3B0aW9ucy5nbmkiKQorCitkZWNsYXJlX2FyZ3MoKSB7CisgIG1peGVyX291dHB1dCA9ICIiCit9CisKK2Nhc3Rfc291cmNlX3NldCgibWl4ZXJfY29udHJvbCIpIHsKKyAgc291cmNlcyA9IFsKKyAgICAibWl4ZXJfY29udHJvbC5oIiwKKyAgXQorICBkZXBzID0gWworICAgICIvL2Nocm9tZWNhc3QvcHVibGljIiwKKyAgXQorfQorCitjYXN0X3NvdXJjZV9zZXQoInBvc3RfcHJvY2Vzc29yX3BhdGhzIikgeworICBzb3VyY2VzID0gWworICAgICJwb3N0X3Byb2Nlc3Nvcl9wYXRocy5jYyIsCisgICAgInBvc3RfcHJvY2Vzc29yX3BhdGhzLmgiLAorICBdCisgIGRlcHMgPSBbCisgICAgIi8vYmFzZSIsCisgIF0KK30KKworY2FzdF9zb3VyY2Vfc2V0KCJtaXhlciIpIHsKKyAgc291cmNlcyA9IFsKKyAgICAiYXVkaW9fb3V0cHV0X3JlZGlyZWN0b3IuY2MiLAorICAgICJhdWRpb19vdXRwdXRfcmVkaXJlY3Rvci5oIiwKKyAgICAiYXVkaW9fb3V0cHV0X3JlZGlyZWN0b3JfaW5wdXQuaCIsCisgICAgImJ1ZmZlcmluZ19taXhlcl9zb3VyY2UuY2MiLAorICAgICJidWZmZXJpbmdfbWl4ZXJfc291cmNlLmgiLAorICAgICJkaXJlY3RfbWl4ZXJfc291cmNlLmNjIiwKKyAgICAiZGlyZWN0X21peGVyX3NvdXJjZS5oIiwKKyAgICAiZmlsdGVyX2dyb3VwLmNjIiwKKyAgICAiZmlsdGVyX2dyb3VwLmgiLAorICAgICJsb29wYmFja19oYW5kbGVyLmNjIiwKKyAgICAibG9vcGJhY2tfaGFuZGxlci5oIiwKKyAgICAibWl4ZXJfaW5wdXQuY2MiLAorICAgICJtaXhlcl9pbnB1dC5oIiwKKyAgICAibWl4ZXJfaW5wdXRfY29ubmVjdGlvbi5jYyIsCisgICAgIm1peGVyX2lucHV0X2Nvbm5lY3Rpb24uaCIsCisgICAgIm1peGVyX3BpcGVsaW5lLmNjIiwKKyAgICAibWl4ZXJfcGlwZWxpbmUuaCIsCisgICAgIm1peGVyX3NlcnZpY2VfcmVjZWl2ZXIuY2MiLAorICAgICJtaXhlcl9zZXJ2aWNlX3JlY2VpdmVyLmgiLAorICAgICJwb3N0X3Byb2Nlc3NpbmdfcGlwZWxpbmUuaCIsCisgICAgInBvc3RfcHJvY2Vzc2luZ19waXBlbGluZV9pbXBsLmNjIiwKKyAgICAicG9zdF9wcm9jZXNzaW5nX3BpcGVsaW5lX2ltcGwuaCIsCisgICAgInBvc3RfcHJvY2Vzc2luZ19waXBlbGluZV9wYXJzZXIuY2MiLAorICAgICJwb3N0X3Byb2Nlc3NpbmdfcGlwZWxpbmVfcGFyc2VyLmgiLAorICAgICJwb3N0X3Byb2Nlc3Nvcl9mYWN0b3J5LmNjIiwKKyAgICAicG9zdF9wcm9jZXNzb3JfZmFjdG9yeS5oIiwKKyAgICAic3RyZWFtX21peGVyLmNjIiwKKyAgICAic3RyZWFtX21peGVyLmgiLAorICBdCisKKyAgZGVwcyA9IFsKKyAgICAiOm1peGVyX2NvbnRyb2wiLAorICAgICI6cG9zdF9wcm9jZXNzb3JfcGF0aHMiLAorICAgICIvL2Jhc2UiLAorICAgICIvL2Nocm9tZWNhc3QvYmFzZSIsCisgICAgIi8vY2hyb21lY2FzdC9iYXNlOmNocm9tZWNhc3Rfc3dpdGNoZXMiLAorICAgICIvL2Nocm9tZWNhc3QvYmFzZTp0aHJlYWRfaGVhbHRoX2NoZWNrZXIiLAorICAgICIvL2Nocm9tZWNhc3QvbWVkaWEvYXVkaW86bGliY2FzdF9leHRlcm5hbF9hdWRpb19waXBlbGluZV8xLjAiLAorICAgICIvL2Nocm9tZWNhc3QvbWVkaWEvYXVkaW8vbWl4ZXJfc2VydmljZTpjb21tb24iLAorICAgICIvL2Nocm9tZWNhc3QvbWVkaWEvYXVkaW8vbWl4ZXJfc2VydmljZTpwcm90byIsCisgICAgIi8vY2hyb21lY2FzdC9tZWRpYS9hdWRpby9taXhlcl9zZXJ2aWNlL3JlY2VpdmVyIiwKKyAgICAiLy9jaHJvbWVjYXN0L21lZGlhL2Jhc2UiLAorICAgICIvL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQ6YXVkaW9faGVscGVycyIsCisgICAgIi8vY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZDphdWRpb19yZXNhbXBsZXIiLAorICAgICIvL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQ6Y2FzdF9hdWRpb19qc29uIiwKKyAgICAiLy9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kOmludGVybGVhdmVkX2NoYW5uZWxfbWl4ZXIiLAorICAgICIvL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQ6dm9sdW1lX21hcCIsCisgICAgIi8vY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9wb3N0X3Byb2Nlc3NvcnM6cG9zdF9wcm9jZXNzb3Jfd3JhcHBlciIsCisgICAgIi8vY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFzZSIsCisgICAgIi8vY2hyb21lY2FzdC9uZXQ6aW9fYnVmZmVyX3Bvb2wiLAorICAgICIvL2Nocm9tZWNhc3QvcHVibGljIiwKKyAgICAiLy9jaHJvbWVjYXN0L3B1YmxpYy9tZWRpYSIsCisgICAgIi8vbWVkaWEiLAorICAgICIvL21lZGlhOnNoYXJlZF9tZW1vcnlfc3VwcG9ydCIsCisgIF0KKworICBpZiAodXNlX2Fsc2EpIHsKKyAgICBkZXBzICs9IFsgIi8vY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9hbHNhOm1peGVyX291dHB1dCIgXQorICB9IGVsc2UgaWYgKGlzX2Z1Y2hzaWEpIHsKKyAgICBkZXBzICs9IFsgIi8vY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9mdWNoc2lhOm1peGVyX291dHB1dCIgXQorICB9IGVsc2UgeworICAgICMgSWYgZW5hYmxlX3ZpZGVvX3dpdGhfbWl4ZWRfYXVkaW8gJiYgIXVzZV9hbHNhLCB0aGUgcGxhdGZvcm0gbmVlZHMgdG8KKyAgICAjIHByb3ZpZGUgaXRzIG93biBtaXhlciBvdXRwdXQuCisgICAgaWYgKCFlbmFibGVfdmlkZW9fd2l0aF9taXhlZF9hdWRpbykgeworICAgICAgc291cmNlcyArPSBbICJtaXhlcl9vdXRwdXRfc3RyZWFtX2R1bW15LmNjIiBdCisgICAgfSBlbHNlIHsKKyAgICAgIGFzc2VydCgiJG1peGVyX291dHB1dCIgIT0gIiIpCisgICAgICBkZXBzICs9IFsgIiRtaXhlcl9vdXRwdXQiIF0KKyAgICB9CisgIH0KK30KKworY2FzdF9zb3VyY2Vfc2V0KCJ1bml0dGVzdHMiKSB7CisgIHRlc3Rvbmx5ID0gdHJ1ZQorICBzb3VyY2VzID0gWworICAgICJmaWx0ZXJfZ3JvdXBfdW5pdHRlc3QuY2MiLAorICAgICJtb2NrX21peGVyX3NvdXJjZS5jYyIsCisgICAgIm1vY2tfbWl4ZXJfc291cmNlLmgiLAorICAgICJtb2NrX3Bvc3RfcHJvY2Vzc29yX2ZhY3RvcnkuY2MiLAorICAgICJtb2NrX3Bvc3RfcHJvY2Vzc29yX2ZhY3RvcnkuaCIsCisgICAgIm1vY2tfcmVkaXJlY3RlZF9hdWRpb19vdXRwdXQuY2MiLAorICAgICJtb2NrX3JlZGlyZWN0ZWRfYXVkaW9fb3V0cHV0LmgiLAorICAgICJzdHJlYW1fbWl4ZXJfZXh0ZXJuYWxfYXVkaW9fcGlwZWxpbmVfdW5pdHRlc3QuY2MiLAorICAgICJzdHJlYW1fbWl4ZXJfdW5pdHRlc3QuY2MiLAorICBdCisKKyAgZGVwcyA9IFsKKyAgICAiOm1peGVyIiwKKyAgICAiLy9iYXNlIiwKKyAgICAiLy9jaHJvbWVjYXN0L21lZGlhL2F1ZGlvOmZha2VfZXh0ZXJuYWxfYXVkaW9fcGlwZWxpbmUiLAorICAgICIvL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvcG9zdF9wcm9jZXNzb3JzOnVuaXR0ZXN0cyIsCisgICAgIi8vY2hyb21lY2FzdC9wdWJsaWMiLAorICAgICIvL2Nocm9tZWNhc3QvcHVibGljL21lZGlhIiwKKyAgICAiLy9tZWRpYSIsCisgICAgIi8vbWVkaWE6c2hhcmVkX21lbW9yeV9zdXBwb3J0IiwKKyAgICAiLy90ZXN0aW5nL2dtb2NrIiwKKyAgICAiLy90ZXN0aW5nL2d0ZXN0IiwKKyAgXQorfQpkaWZmIC0tZ2l0IGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9hdWRpb19vdXRwdXRfcmVkaXJlY3Rvci5jYyBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvYXVkaW9fb3V0cHV0X3JlZGlyZWN0b3IuY2MKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9hdWRpb19vdXRwdXRfcmVkaXJlY3Rvci5jYwpyZW5hbWUgdG8gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9hdWRpb19vdXRwdXRfcmVkaXJlY3Rvci5jYwppbmRleCA5NjQ4YjY5Zi4uNjMzOTk1OCAxMDA2NDQKLS0tIGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9hdWRpb19vdXRwdXRfcmVkaXJlY3Rvci5jYworKysgYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL2F1ZGlvX291dHB1dF9yZWRpcmVjdG9yLmNjCkBAIC0yLDcgKzIsNyBAQAogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAotI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvYXVkaW9fb3V0cHV0X3JlZGlyZWN0b3IuaCIKKyNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL2F1ZGlvX291dHB1dF9yZWRpcmVjdG9yLmgiCiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8dXRpbGl0eT4KQEAgLTEyLDkgKzEyLDkgQEAKICNpbmNsdWRlICJiYXNlL3N0cmluZ3MvcGF0dGVybi5oIgogI2luY2x1ZGUgImJhc2UvdmFsdWVzLmgiCiAjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9hdWRpb19mYWRlci5oIgotI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvYXVkaW9fb3V0cHV0X3JlZGlyZWN0b3JfaW5wdXQuaCIKLSNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyX2lucHV0LmgiCi0jaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9zdHJlYW1fbWl4ZXIuaCIKKyNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL2F1ZGlvX291dHB1dF9yZWRpcmVjdG9yX2lucHV0LmgiCisjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9taXhlcl9pbnB1dC5oIgorI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvc3RyZWFtX21peGVyLmgiCiAjaW5jbHVkZSAiY2hyb21lY2FzdC9wdWJsaWMvY2FzdF9tZWRpYV9zaGxpYi5oIgogI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYXVkaW9fYnVzLmgiCiAjaW5jbHVkZSAibWVkaWEvYmFzZS9hdWRpb190aW1lc3RhbXBfaGVscGVyLmgiCmRpZmYgLS1naXQgYS9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL2F1ZGlvX291dHB1dF9yZWRpcmVjdG9yLmggYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL2F1ZGlvX291dHB1dF9yZWRpcmVjdG9yLmgKc2ltaWxhcml0eSBpbmRleCA5NCUKcmVuYW1lIGZyb20gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9hdWRpb19vdXRwdXRfcmVkaXJlY3Rvci5oCnJlbmFtZSB0byBjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL2F1ZGlvX291dHB1dF9yZWRpcmVjdG9yLmgKaW5kZXggNDZhNzE3My4uZDFiZDIyZSAxMDA2NDQKLS0tIGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9hdWRpb19vdXRwdXRfcmVkaXJlY3Rvci5oCisrKyBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvYXVkaW9fb3V0cHV0X3JlZGlyZWN0b3IuaApAQCAtMiw4ICsyLDggQEAKIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLSNpZm5kZWYgQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9BVURJT19PVVRQVVRfUkVESVJFQ1RPUl9IXwotI2RlZmluZSBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX0FVRElPX09VVFBVVF9SRURJUkVDVE9SX0hfCisjaWZuZGVmIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfTUlYRVJfQVVESU9fT1VUUFVUX1JFRElSRUNUT1JfSF8KKyNkZWZpbmUgQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9NSVhFUl9BVURJT19PVVRQVVRfUkVESVJFQ1RPUl9IXwogCiAjaW5jbHVkZSA8Y3N0ZGludD4KICNpbmNsdWRlIDxtZW1vcnk+CkBAIC0xMTYsNCArMTE2LDQgQEAKIH0gIC8vIG5hbWVzcGFjZSBtZWRpYQogfSAgLy8gbmFtZXNwYWNlIGNocm9tZWNhc3QKIAotI2VuZGlmICAvLyBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX0FVRElPX09VVFBVVF9SRURJUkVDVE9SX0hfCisjZW5kaWYgIC8vIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfTUlYRVJfQVVESU9fT1VUUFVUX1JFRElSRUNUT1JfSF8KZGlmZiAtLWdpdCBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvYXVkaW9fb3V0cHV0X3JlZGlyZWN0b3JfaW5wdXQuaCBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvYXVkaW9fb3V0cHV0X3JlZGlyZWN0b3JfaW5wdXQuaApzaW1pbGFyaXR5IGluZGV4IDg0JQpyZW5hbWUgZnJvbSBjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL2F1ZGlvX291dHB1dF9yZWRpcmVjdG9yX2lucHV0LmgKcmVuYW1lIHRvIGNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvYXVkaW9fb3V0cHV0X3JlZGlyZWN0b3JfaW5wdXQuaAppbmRleCA5MTRhZThkMi4uMzQ1MjJkMCAxMDA2NDQKLS0tIGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9hdWRpb19vdXRwdXRfcmVkaXJlY3Rvcl9pbnB1dC5oCisrKyBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvYXVkaW9fb3V0cHV0X3JlZGlyZWN0b3JfaW5wdXQuaApAQCAtMiw4ICsyLDggQEAKIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLSNpZm5kZWYgQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9BVURJT19PVVRQVVRfUkVESVJFQ1RPUl9JTlBVVF9IXwotI2RlZmluZSBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX0FVRElPX09VVFBVVF9SRURJUkVDVE9SX0lOUFVUX0hfCisjaWZuZGVmIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfTUlYRVJfQVVESU9fT1VUUFVUX1JFRElSRUNUT1JfSU5QVVRfSF8KKyNkZWZpbmUgQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9NSVhFUl9BVURJT19PVVRQVVRfUkVESVJFQ1RPUl9JTlBVVF9IXwogCiBuYW1lc3BhY2UgbWVkaWEgewogY2xhc3MgQXVkaW9CdXM7CkBAIC00MSw0ICs0MSw0IEBACiB9ICAvLyBuYW1lc3BhY2UgbWVkaWEKIH0gIC8vIG5hbWVzcGFjZSBjaHJvbWVjYXN0CiAKLSNlbmRpZiAgLy8gQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9BVURJT19PVVRQVVRfUkVESVJFQ1RPUl9JTlBVVF9IXworI2VuZGlmICAvLyBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX01JWEVSX0FVRElPX09VVFBVVF9SRURJUkVDVE9SX0lOUFVUX0hfCmRpZmYgLS1naXQgYS9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL2J1ZmZlcmluZ19taXhlcl9zb3VyY2UuY2MgYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL2J1ZmZlcmluZ19taXhlcl9zb3VyY2UuY2MKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9idWZmZXJpbmdfbWl4ZXJfc291cmNlLmNjCnJlbmFtZSB0byBjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL2J1ZmZlcmluZ19taXhlcl9zb3VyY2UuY2MKaW5kZXggYzdlNWRhNi4uMjIxNjIwNCAxMDA2NDQKLS0tIGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9idWZmZXJpbmdfbWl4ZXJfc291cmNlLmNjCisrKyBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvYnVmZmVyaW5nX21peGVyX3NvdXJjZS5jYwpAQCAtMiw3ICsyLDcgQEAKIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLSNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL2J1ZmZlcmluZ19taXhlcl9zb3VyY2UuaCIKKyNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL2J1ZmZlcmluZ19taXhlcl9zb3VyY2UuaCIKIAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgpAQCAtMTgsNyArMTgsNyBAQAogI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF90YXNrX3J1bm5lcl9oYW5kbGUuaCIKICNpbmNsdWRlICJiYXNlL3RpbWUvdGltZS5oIgogI2luY2x1ZGUgImNocm9tZWNhc3QvYmFzZS9jaHJvbWVjYXN0X3N3aXRjaGVzLmgiCi0jaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9zdHJlYW1fbWl4ZXIuaCIKKyNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3N0cmVhbV9taXhlci5oIgogI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2Jhc2UvZGVjb2Rlcl9idWZmZXJfYWRhcHRlci5oIgogI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2Jhc2UvZGVjb2Rlcl9idWZmZXJfYmFzZS5oIgogI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX2RldmljZV9kZXNjcmlwdGlvbi5oIgpkaWZmIC0tZ2l0IGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9idWZmZXJpbmdfbWl4ZXJfc291cmNlLmggYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL2J1ZmZlcmluZ19taXhlcl9zb3VyY2UuaApzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSBjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL2J1ZmZlcmluZ19taXhlcl9zb3VyY2UuaApyZW5hbWUgdG8gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9idWZmZXJpbmdfbWl4ZXJfc291cmNlLmgKaW5kZXggYmRkYmFhNTMuLjYzODcyMTEgMTAwNjQ0Ci0tLSBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvYnVmZmVyaW5nX21peGVyX3NvdXJjZS5oCisrKyBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvYnVmZmVyaW5nX21peGVyX3NvdXJjZS5oCkBAIC0yLDggKzIsOCBAQAogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAotI2lmbmRlZiBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX0JVRkZFUklOR19NSVhFUl9TT1VSQ0VfSF8KLSNkZWZpbmUgQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9CVUZGRVJJTkdfTUlYRVJfU09VUkNFX0hfCisjaWZuZGVmIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfTUlYRVJfQlVGRkVSSU5HX01JWEVSX1NPVVJDRV9IXworI2RlZmluZSBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX01JWEVSX0JVRkZFUklOR19NSVhFUl9TT1VSQ0VfSF8KIAogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CkBAIC0xNyw3ICsxNyw3IEBACiAjaW5jbHVkZSAiYmFzZS90aHJlYWRfYW5ub3RhdGlvbnMuaCIKICNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL2F1ZGlvX2ZhZGVyLmgiCiAjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9hdWRpb19yZXNhbXBsZXIuaCIKLSNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyX2lucHV0LmgiCisjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9taXhlcl9pbnB1dC5oIgogI2luY2x1ZGUgImNocm9tZWNhc3QvcHVibGljL21lZGlhL21lZGlhX3BpcGVsaW5lX2JhY2tlbmQuaCIKICNpbmNsdWRlICJjaHJvbWVjYXN0L3B1YmxpYy92b2x1bWVfY29udHJvbC5oIgogCkBAIC0yMzIsNCArMjMyLDQgQEAKIH0gIC8vIG5hbWVzcGFjZSBtZWRpYQogfSAgLy8gbmFtZXNwYWNlIGNocm9tZWNhc3QKIAotI2VuZGlmICAvLyBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX0JVRkZFUklOR19NSVhFUl9TT1VSQ0VfSF8KKyNlbmRpZiAgLy8gQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9NSVhFUl9CVUZGRVJJTkdfTUlYRVJfU09VUkNFX0hfCmRpZmYgLS1naXQgYS9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL2RpcmVjdF9taXhlcl9zb3VyY2UuY2MgYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL2RpcmVjdF9taXhlcl9zb3VyY2UuY2MKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9kaXJlY3RfbWl4ZXJfc291cmNlLmNjCnJlbmFtZSB0byBjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL2RpcmVjdF9taXhlcl9zb3VyY2UuY2MKaW5kZXggODE3YTU2Mi4uMjMwMDdlMyAxMDA2NDQKLS0tIGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9kaXJlY3RfbWl4ZXJfc291cmNlLmNjCisrKyBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvZGlyZWN0X21peGVyX3NvdXJjZS5jYwpAQCAtMiwxMCArMiwxMCBAQAogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAotI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvZGlyZWN0X21peGVyX3NvdXJjZS5oIgorI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvZGlyZWN0X21peGVyX3NvdXJjZS5oIgogCiAjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9zdHJlYW1fbWl4ZXIuaCIKKyNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3N0cmVhbV9taXhlci5oIgogI2luY2x1ZGUgImNocm9tZWNhc3QvcHVibGljL21lZGlhL2RpcmVjdF9hdWRpb19zb3VyY2UuaCIKICNpbmNsdWRlICJjaHJvbWVjYXN0L3B1YmxpYy9tZWRpYS9tZWRpYV9waXBlbGluZV9kZXZpY2VfcGFyYW1zLmgiCiAjaW5jbHVkZSAibWVkaWEvYmFzZS9hdWRpb19idXMuaCIKZGlmZiAtLWdpdCBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvZGlyZWN0X21peGVyX3NvdXJjZS5oIGIvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9kaXJlY3RfbWl4ZXJfc291cmNlLmgKc2ltaWxhcml0eSBpbmRleCA5MCUKcmVuYW1lIGZyb20gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9kaXJlY3RfbWl4ZXJfc291cmNlLmgKcmVuYW1lIHRvIGNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvZGlyZWN0X21peGVyX3NvdXJjZS5oCmluZGV4IDFmYThkMDkuLmZkNDQ4OTYgMTAwNjQ0Ci0tLSBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvZGlyZWN0X21peGVyX3NvdXJjZS5oCisrKyBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvZGlyZWN0X21peGVyX3NvdXJjZS5oCkBAIC0yLDE0ICsyLDE0IEBACiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCi0jaWZuZGVmIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfRElSRUNUX01JWEVSX1NPVVJDRV9IXwotI2RlZmluZSBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX0RJUkVDVF9NSVhFUl9TT1VSQ0VfSF8KKyNpZm5kZWYgQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9NSVhFUl9ESVJFQ1RfTUlYRVJfU09VUkNFX0hfCisjZGVmaW5lIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfTUlYRVJfRElSRUNUX01JWEVSX1NPVVJDRV9IXwogCiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgImJhc2UvbWFjcm9zLmgiCi0jaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlcl9pbnB1dC5oIgorI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvbWl4ZXJfaW5wdXQuaCIKICNpbmNsdWRlICJjaHJvbWVjYXN0L3B1YmxpYy9tZWRpYS9tZWRpYV9waXBlbGluZV9iYWNrZW5kLmgiCiAjaW5jbHVkZSAiY2hyb21lY2FzdC9wdWJsaWMvdm9sdW1lX2NvbnRyb2wuaCIKIApAQCAtODMsNCArODMsNCBAQAogfSAgLy8gbmFtZXNwYWNlIG1lZGlhCiB9ICAvLyBuYW1lc3BhY2UgY2hyb21lY2FzdAogCi0jZW5kaWYgIC8vIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfRElSRUNUX01JWEVSX1NPVVJDRV9IXworI2VuZGlmICAvLyBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX01JWEVSX0RJUkVDVF9NSVhFUl9TT1VSQ0VfSF8KZGlmZiAtLWdpdCBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvZmlsdGVyX2dyb3VwLmNjIGIvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9maWx0ZXJfZ3JvdXAuY2MKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9maWx0ZXJfZ3JvdXAuY2MKcmVuYW1lIHRvIGNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvZmlsdGVyX2dyb3VwLmNjCmluZGV4IDNhMDY1OWQuLjQ2YTVkZDQgMTAwNjQ0Ci0tLSBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvZmlsdGVyX2dyb3VwLmNjCisrKyBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvZmlsdGVyX2dyb3VwLmNjCkBAIC0yLDcgKzIsNyBAQAogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAotI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvZmlsdGVyX2dyb3VwLmgiCisjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9maWx0ZXJfZ3JvdXAuaCIKIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KIApAQCAtMTAsOCArMTAsOCBAQAogI2luY2x1ZGUgImJhc2UvdGltZS90aW1lLmgiCiAjaW5jbHVkZSAiYmFzZS92YWx1ZXMuaCIKICNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL2ludGVybGVhdmVkX2NoYW5uZWxfbWl4ZXIuaCIKLSNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyX2lucHV0LmgiCi0jaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9wb3N0X3Byb2Nlc3NpbmdfcGlwZWxpbmUuaCIKKyNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL21peGVyX2lucHV0LmgiCisjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9wb3N0X3Byb2Nlc3NpbmdfcGlwZWxpbmUuaCIKICNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX2J1cy5oIgogI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYXVkaW9fc2FtcGxlX3R5cGVzLmgiCiAjaW5jbHVkZSAibWVkaWEvYmFzZS92ZWN0b3JfbWF0aC5oIgpkaWZmIC0tZ2l0IGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9maWx0ZXJfZ3JvdXAuaCBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvZmlsdGVyX2dyb3VwLmgKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9maWx0ZXJfZ3JvdXAuaApyZW5hbWUgdG8gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9maWx0ZXJfZ3JvdXAuaAppbmRleCAzOTVlMWI4Li4yMDA5YmQ2IDEwMDY0NAotLS0gYS9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL2ZpbHRlcl9ncm91cC5oCisrKyBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvZmlsdGVyX2dyb3VwLmgKQEAgLTIsOCArMiw4IEBACiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCi0jaWZuZGVmIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfRklMVEVSX0dST1VQX0hfCi0jZGVmaW5lIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfRklMVEVSX0dST1VQX0hfCisjaWZuZGVmIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfTUlYRVJfRklMVEVSX0dST1VQX0hfCisjZGVmaW5lIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfTUlYRVJfRklMVEVSX0dST1VQX0hfCiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KIApAQCAtMTYyLDQgKzE2Miw0IEBACiB9ICAvLyBuYW1lc3BhY2UgbWVkaWEKIH0gIC8vIG5hbWVzcGFjZSBjaHJvbWVjYXN0CiAKLSNlbmRpZiAgLy8gQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9GSUxURVJfR1JPVVBfSF8KKyNlbmRpZiAgLy8gQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9NSVhFUl9GSUxURVJfR1JPVVBfSF8KZGlmZiAtLWdpdCBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvZmlsdGVyX2dyb3VwX3VuaXR0ZXN0LmNjIGIvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9maWx0ZXJfZ3JvdXBfdW5pdHRlc3QuY2MKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9maWx0ZXJfZ3JvdXBfdW5pdHRlc3QuY2MKcmVuYW1lIHRvIGNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvZmlsdGVyX2dyb3VwX3VuaXR0ZXN0LmNjCmluZGV4IDM5NjZmN2IuLmZiOWRhZjQgMTAwNjQ0Ci0tLSBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvZmlsdGVyX2dyb3VwX3VuaXR0ZXN0LmNjCisrKyBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvZmlsdGVyX2dyb3VwX3VuaXR0ZXN0LmNjCkBAIC0yLDE0ICsyLDE0IEBACiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCi0jaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9maWx0ZXJfZ3JvdXAuaCIKKyNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL2ZpbHRlcl9ncm91cC5oIgogCiAjaW5jbHVkZSAiYmFzZS9jb250YWluZXJzL2ZsYXRfc2V0LmgiCiAjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcHRyX3V0aWwuaCIKLSNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyX2lucHV0LmgiCi0jaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9tb2NrX21peGVyX3NvdXJjZS5oIgotI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvcG9zdF9wcm9jZXNzaW5nX3BpcGVsaW5lLmgiCi0jaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9zdHJlYW1fbWl4ZXIuaCIKKyNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL21peGVyX2lucHV0LmgiCisjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9tb2NrX21peGVyX3NvdXJjZS5oIgorI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvcG9zdF9wcm9jZXNzaW5nX3BpcGVsaW5lLmgiCisjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9zdHJlYW1fbWl4ZXIuaCIKICNpbmNsdWRlICJjaHJvbWVjYXN0L3B1YmxpYy9tZWRpYS9hdWRpb19wb3N0X3Byb2Nlc3NvcjJfc2hsaWIuaCIKICNpbmNsdWRlICJjaHJvbWVjYXN0L3B1YmxpYy92b2x1bWVfY29udHJvbC5oIgogI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYXVkaW9fYnVzLmgiCkBAIC0zOSw3ICszOSw3IEBACiAgIE1vY2tQb3N0UHJvY2Vzc2luZ1BpcGVsaW5lKCkKICAgICAgIDogTW9ja1Bvc3RQcm9jZXNzaW5nUGlwZWxpbmUoa051bUlucHV0Q2hhbm5lbHMpIHt9CiAKLSAgTW9ja1Bvc3RQcm9jZXNzaW5nUGlwZWxpbmUoaW50IG51bV9vdXRwdXRfY2hhbm5lbHMpCisgIGV4cGxpY2l0IE1vY2tQb3N0UHJvY2Vzc2luZ1BpcGVsaW5lKGludCBudW1fb3V0cHV0X2NoYW5uZWxzKQogICAgICAgOiBudW1fb3V0cHV0X2NoYW5uZWxzXyhudW1fb3V0cHV0X2NoYW5uZWxzKSB7CiAgICAgT05fQ0FMTCgqdGhpcywgUHJvY2Vzc0ZyYW1lcyhfLCBfLCBfLCBfKSkKICAgICAgICAgLldpbGxCeURlZmF1bHQoCmRpZmYgLS1naXQgYS9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL2xvb3BiYWNrX2hhbmRsZXIuY2MgYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL2xvb3BiYWNrX2hhbmRsZXIuY2MKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9sb29wYmFja19oYW5kbGVyLmNjCnJlbmFtZSB0byBjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL2xvb3BiYWNrX2hhbmRsZXIuY2MKaW5kZXggODUxMzA1OC4uYmM2MDQ2MCAxMDA2NDQKLS0tIGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9sb29wYmFja19oYW5kbGVyLmNjCisrKyBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvbG9vcGJhY2tfaGFuZGxlci5jYwpAQCAtMiw3ICsyLDcgQEAKIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLSNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL2xvb3BiYWNrX2hhbmRsZXIuaCIKKyNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL2xvb3BiYWNrX2hhbmRsZXIuaCIKIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDx1dGlsaXR5PgpAQCAtMzEsNyArMzEsOCBAQAogY2xhc3MgTG9vcGJhY2tIYW5kbGVySW1wbCA6IHB1YmxpYyBMb29wYmFja0hhbmRsZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIENhc3RNZWRpYVNobGliOjpMb29wYmFja0F1ZGlvT2JzZXJ2ZXIgewogIHB1YmxpYzoKLSAgTG9vcGJhY2tIYW5kbGVySW1wbChzY29wZWRfcmVmcHRyPGJhc2U6OlNpbmdsZVRocmVhZFRhc2tSdW5uZXI+IHRhc2tfcnVubmVyKQorICBleHBsaWNpdCBMb29wYmFja0hhbmRsZXJJbXBsKAorICAgICAgc2NvcGVkX3JlZnB0cjxiYXNlOjpTaW5nbGVUaHJlYWRUYXNrUnVubmVyPiB0YXNrX3J1bm5lcikKICAgICAgIDogZXh0ZXJuYWxfYXVkaW9fcGlwZWxpbmVfc3VwcG9ydGVkXygKICAgICAgICAgICAgIEV4dGVybmFsQXVkaW9QaXBlbGluZVNobGliOjpJc1N1cHBvcnRlZCgpKSwKICAgICAgICAgdGFza19zaWduYWxfKCZsb2NrXykgewpkaWZmIC0tZ2l0IGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9sb29wYmFja19oYW5kbGVyLmggYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL2xvb3BiYWNrX2hhbmRsZXIuaApzaW1pbGFyaXR5IGluZGV4IDg3JQpyZW5hbWUgZnJvbSBjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL2xvb3BiYWNrX2hhbmRsZXIuaApyZW5hbWUgdG8gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9sb29wYmFja19oYW5kbGVyLmgKaW5kZXggODA3Yzg5Yy4uOTIwNmUxNyAxMDA2NDQKLS0tIGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9sb29wYmFja19oYW5kbGVyLmgKKysrIGIvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9sb29wYmFja19oYW5kbGVyLmgKQEAgLTIsOCArMiw4IEBACiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCi0jaWZuZGVmIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfTE9PUEJBQ0tfSEFORExFUl9IXwotI2RlZmluZSBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX0xPT1BCQUNLX0hBTkRMRVJfSF8KKyNpZm5kZWYgQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9NSVhFUl9MT09QQkFDS19IQU5ETEVSX0hfCisjZGVmaW5lIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfTUlYRVJfTE9PUEJBQ0tfSEFORExFUl9IXwogCiAjaW5jbHVkZSA8Y3N0ZGludD4KICNpbmNsdWRlIDxtZW1vcnk+CkBAIC01Miw0ICs1Miw0IEBACiB9ICAvLyBuYW1lc3BhY2UgbWVkaWEKIH0gIC8vIG5hbWVzcGFjZSBjaHJvbWVjYXN0CiAKLSNlbmRpZiAgLy8gQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9MT09QQkFDS19IQU5ETEVSX0hfCisjZW5kaWYgIC8vIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfTUlYRVJfTE9PUEJBQ0tfSEFORExFUl9IXwpkaWZmIC0tZ2l0IGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlcl9jb250cm9sLmggYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL21peGVyX2NvbnRyb2wuaApzaW1pbGFyaXR5IGluZGV4IDg0JQpyZW5hbWUgZnJvbSBjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyX2NvbnRyb2wuaApyZW5hbWUgdG8gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9taXhlcl9jb250cm9sLmgKaW5kZXggODNhNzBhNC4uM2E4ZTYwMCAxMDA2NDQKLS0tIGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlcl9jb250cm9sLmgKKysrIGIvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9taXhlcl9jb250cm9sLmgKQEAgLTIsOCArMiw4IEBACiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCi0jaWZuZGVmIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfTUlYRVJfQ09OVFJPTF9IXwotI2RlZmluZSBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX01JWEVSX0NPTlRST0xfSF8KKyNpZm5kZWYgQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9NSVhFUl9NSVhFUl9DT05UUk9MX0hfCisjZGVmaW5lIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfTUlYRVJfTUlYRVJfQ09OVFJPTF9IXwogCiAjaW5jbHVkZSAiY2hyb21lY2FzdC9wdWJsaWMvY2hyb21lY2FzdF9leHBvcnQuaCIKIApAQCAtMzEsNCArMzEsNCBAQAogfSAgLy8gbmFtZXNwYWNlIG1lZGlhCiB9ICAvLyBuYW1lc3BhY2UgY2hyb21lY2FzdAogCi0jZW5kaWYgIC8vIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfTUlYRVJfQ09OVFJPTF9IXworI2VuZGlmICAvLyBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX01JWEVSX01JWEVSX0NPTlRST0xfSF8KZGlmZiAtLWdpdCBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXJfaW5wdXQuY2MgYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL21peGVyX2lucHV0LmNjCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIGNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXJfaW5wdXQuY2MKcmVuYW1lIHRvIGNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvbWl4ZXJfaW5wdXQuY2MKaW5kZXggZDliNjg2Ny4uMzU1YTk3ZjcgMTAwNjQ0Ci0tLSBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXJfaW5wdXQuY2MKKysrIGIvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9taXhlcl9pbnB1dC5jYwpAQCAtMiw3ICsyLDcgQEAKIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLSNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyX2lucHV0LmgiCisjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9taXhlcl9pbnB1dC5oIgogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKQEAgLTE1LDggKzE1LDggQEAKICNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKICNpbmNsdWRlICJiYXNlL251bWVyaWNzL3Jhbmdlcy5oIgogI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvYXVkaW9fZmFkZXIuaCIKLSNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL2F1ZGlvX291dHB1dF9yZWRpcmVjdG9yX2lucHV0LmgiCi0jaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9maWx0ZXJfZ3JvdXAuaCIKKyNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL2F1ZGlvX291dHB1dF9yZWRpcmVjdG9yX2lucHV0LmgiCisjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9maWx0ZXJfZ3JvdXAuaCIKICNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX2J1cy5oIgogI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYXVkaW9fdGltZXN0YW1wX2hlbHBlci5oIgogI2luY2x1ZGUgIm1lZGlhL2Jhc2UvY2hhbm5lbF9taXhlci5oIgpkaWZmIC0tZ2l0IGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlcl9pbnB1dC5oIGIvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9taXhlcl9pbnB1dC5oCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIGNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXJfaW5wdXQuaApyZW5hbWUgdG8gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9taXhlcl9pbnB1dC5oCmluZGV4IDY5ZTNlYjMuLjdjOWQxNmQgMTAwNjQ0Ci0tLSBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXJfaW5wdXQuaAorKysgYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL21peGVyX2lucHV0LmgKQEAgLTIsOCArMiw4IEBACiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCi0jaWZuZGVmIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfTUlYRVJfSU5QVVRfSF8KLSNkZWZpbmUgQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9NSVhFUl9JTlBVVF9IXworI2lmbmRlZiBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX01JWEVSX01JWEVSX0lOUFVUX0hfCisjZGVmaW5lIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfTUlYRVJfTUlYRVJfSU5QVVRfSF8KIAogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxzdHJpbmc+CkBAIC04NCw4ICs4NCw3IEBACiAgICAgdmlydHVhbCB+U291cmNlKCkgPSBkZWZhdWx0OwogICB9OwogCi0gIE1peGVySW5wdXQoU291cmNlKiBzb3VyY2UsCi0gICAgICAgICAgICAgRmlsdGVyR3JvdXAqIGZpbHRlcl9ncm91cCk7CisgIE1peGVySW5wdXQoU291cmNlKiBzb3VyY2UsIEZpbHRlckdyb3VwKiBmaWx0ZXJfZ3JvdXApOwogICB+TWl4ZXJJbnB1dCgpOwogCiAgIHZvaWQgU2V0RmlsdGVyR3JvdXAoRmlsdGVyR3JvdXAqIGZpbHRlcl9ncm91cCk7CkBAIC0xODYsNCArMTg1LDQgQEAKIH0gIC8vIG5hbWVzcGFjZSBtZWRpYQogfSAgLy8gbmFtZXNwYWNlIGNocm9tZWNhc3QKIAotI2VuZGlmICAvLyBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX01JWEVSX0lOUFVUX0hfCisjZW5kaWYgIC8vIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfTUlYRVJfTUlYRVJfSU5QVVRfSF8KZGlmZiAtLWdpdCBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXJfaW5wdXRfY29ubmVjdGlvbi5jYyBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvbWl4ZXJfaW5wdXRfY29ubmVjdGlvbi5jYwpzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyX2lucHV0X2Nvbm5lY3Rpb24uY2MKcmVuYW1lIHRvIGNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvbWl4ZXJfaW5wdXRfY29ubmVjdGlvbi5jYwppbmRleCAyMGZkMWJhLi42ODUwNDc3IDEwMDY0NAotLS0gYS9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyX2lucHV0X2Nvbm5lY3Rpb24uY2MKKysrIGIvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9taXhlcl9pbnB1dF9jb25uZWN0aW9uLmNjCkBAIC0yLDcgKzIsNyBAQAogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAotI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXJfaW5wdXRfY29ubmVjdGlvbi5oIgorI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvbWl4ZXJfaW5wdXRfY29ubmVjdGlvbi5oIgogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSAiY2hyb21lY2FzdC9iYXNlL2Nocm9tZWNhc3Rfc3dpdGNoZXMuaCIKICNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2F1ZGlvL21peGVyX3NlcnZpY2UvY29udmVyc2lvbnMuaCIKICNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2F1ZGlvL21peGVyX3NlcnZpY2UvbWl4ZXJfc2VydmljZS5wYi5oIgotI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvc3RyZWFtX21peGVyLmgiCisjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9zdHJlYW1fbWl4ZXIuaCIKICNpbmNsdWRlICJjaHJvbWVjYXN0L25ldC9pb19idWZmZXJfcG9vbC5oIgogI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX2RldmljZV9kZXNjcmlwdGlvbi5oIgogI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYXVkaW9fYnVzLmgiCmRpZmYgLS1naXQgYS9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyX2lucHV0X2Nvbm5lY3Rpb24uaCBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvbWl4ZXJfaW5wdXRfY29ubmVjdGlvbi5oCnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIGNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXJfaW5wdXRfY29ubmVjdGlvbi5oCnJlbmFtZSB0byBjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL21peGVyX2lucHV0X2Nvbm5lY3Rpb24uaAppbmRleCBkMDY5ZTJmLi41MWU4N2JjIDEwMDY0NAotLS0gYS9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyX2lucHV0X2Nvbm5lY3Rpb24uaAorKysgYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL21peGVyX2lucHV0X2Nvbm5lY3Rpb24uaApAQCAtMiw4ICsyLDggQEAKIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLSNpZm5kZWYgQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9NSVhFUl9JTlBVVF9DT05ORUNUSU9OX0hfCi0jZGVmaW5lIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfTUlYRVJfSU5QVVRfQ09OTkVDVElPTl9IXworI2lmbmRlZiBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX01JWEVSX01JWEVSX0lOUFVUX0NPTk5FQ1RJT05fSF8KKyNkZWZpbmUgQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9NSVhFUl9NSVhFUl9JTlBVVF9DT05ORUNUSU9OX0hfCiAKICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8c3RyaW5nPgpAQCAtMTgsNyArMTgsNyBAQAogI2luY2x1ZGUgImJhc2UvdGltZXIvdGltZXIuaCIKICNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2F1ZGlvL21peGVyX3NlcnZpY2UvbWl4ZXJfc29ja2V0LmgiCiAjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9hdWRpb19mYWRlci5oIgotI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXJfaW5wdXQuaCIKKyNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL21peGVyX2lucHV0LmgiCiAjaW5jbHVkZSAiY2hyb21lY2FzdC9wdWJsaWMvbWVkaWEvbWVkaWFfcGlwZWxpbmVfYmFja2VuZC5oIgogI2luY2x1ZGUgImNocm9tZWNhc3QvcHVibGljL3ZvbHVtZV9jb250cm9sLmgiCiAKQEAgLTE4Nyw0ICsxODcsNCBAQAogfSAgLy8gbmFtZXNwYWNlIG1lZGlhCiB9ICAvLyBuYW1lc3BhY2UgY2hyb21lY2FzdAogCi0jZW5kaWYgIC8vIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfTUlYRVJfSU5QVVRfQ09OTkVDVElPTl9IXworI2VuZGlmICAvLyBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX01JWEVSX01JWEVSX0lOUFVUX0NPTk5FQ1RJT05fSF8KZGlmZiAtLWdpdCBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXJfb3V0cHV0X3N0cmVhbV9kdW1teS5jYyBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvbWl4ZXJfb3V0cHV0X3N0cmVhbV9kdW1teS5jYwpzaW1pbGFyaXR5IGluZGV4IDgxJQpyZW5hbWUgZnJvbSBjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyX291dHB1dF9zdHJlYW1fZHVtbXkuY2MKcmVuYW1lIHRvIGNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvbWl4ZXJfb3V0cHV0X3N0cmVhbV9kdW1teS5jYwppbmRleCAzMmMyMWQ3Li45OGYxYmRjIDEwMDY0NAotLS0gYS9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyX291dHB1dF9zdHJlYW1fZHVtbXkuY2MKKysrIGIvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9taXhlcl9vdXRwdXRfc3RyZWFtX2R1bW15LmNjCkBAIC01LDcgKzUsNiBAQAogI2luY2x1ZGUgPG1lbW9yeT4KIAogI2luY2x1ZGUgImJhc2UvbWFjcm9zLmgiCi0jaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9zeXN0ZW1fdm9sdW1lX2NvbnRyb2wuaCIKICNpbmNsdWRlICJjaHJvbWVjYXN0L3B1YmxpYy9tZWRpYS9taXhlcl9vdXRwdXRfc3RyZWFtLmgiCiAKIG5hbWVzcGFjZSBjaHJvbWVjYXN0IHsKQEAgLTQ3LDEzICs0Niw1IEBACiAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPE1peGVyT3V0cHV0U3RyZWFtRHVtbXk+KCk7CiB9CiAKLS8vIHN0YXRpYwotc3RkOjp1bmlxdWVfcHRyPFN5c3RlbVZvbHVtZUNvbnRyb2w+IFN5c3RlbVZvbHVtZUNvbnRyb2w6OkNyZWF0ZSgKLSAgICBEZWxlZ2F0ZSogZGVsZWdhdGUpIHsKLSAgLy8gTm8gdGVzdHMgY3VycmVudGx5IGFjdHVhbGx5IGNhbGwgdGhpcywgc28gd2UgZG9uJ3QgbmVlZCBhIHJlYWwgZHVtbXkKLSAgLy8gaW1wbGVtZW50YXRpb24gaGVyZS4KLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KIH0gIC8vIG5hbWVzcGFjZSBtZWRpYQogfSAgLy8gbmFtZXNwYWNlIGNocm9tZWNhc3QKZGlmZiAtLWdpdCBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXJfcGlwZWxpbmUuY2MgYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL21peGVyX3BpcGVsaW5lLmNjCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIGNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXJfcGlwZWxpbmUuY2MKcmVuYW1lIHRvIGNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvbWl4ZXJfcGlwZWxpbmUuY2MKaW5kZXggNzI2ODdhMTEuLjdhNzAyZTcgMTAwNjQ0Ci0tLSBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXJfcGlwZWxpbmUuY2MKKysrIGIvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9taXhlcl9waXBlbGluZS5jYwpAQCAtMiw3ICsyLDcgQEAKIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLSNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyX3BpcGVsaW5lLmgiCisjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9taXhlcl9waXBlbGluZS5oIgogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPHV0aWxpdHk+CkBAIC0xMCw5ICsxMCw5IEBACiAjaW5jbHVkZSAiYmFzZS9jb250YWluZXJzL2ZsYXRfc2V0LmgiCiAjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCiAjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9iYXNlL2F1ZGlvX2RldmljZV9pZHMuaCIKLSNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL2ZpbHRlcl9ncm91cC5oIgotI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvcG9zdF9wcm9jZXNzaW5nX3BpcGVsaW5lX2ltcGwuaCIKLSNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3Bvc3RfcHJvY2Vzc2luZ19waXBlbGluZV9wYXJzZXIuaCIKKyNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL2ZpbHRlcl9ncm91cC5oIgorI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvcG9zdF9wcm9jZXNzaW5nX3BpcGVsaW5lX2ltcGwuaCIKKyNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc2luZ19waXBlbGluZV9wYXJzZXIuaCIKICNpbmNsdWRlICJjaHJvbWVjYXN0L3B1YmxpYy9tZWRpYS9hdWRpb19wb3N0X3Byb2Nlc3NvcjJfc2hsaWIuaCIKICNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19kZXZpY2VfZGVzY3JpcHRpb24uaCIKIApkaWZmIC0tZ2l0IGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlcl9waXBlbGluZS5oIGIvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9taXhlcl9waXBlbGluZS5oCnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIGNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXJfcGlwZWxpbmUuaApyZW5hbWUgdG8gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9taXhlcl9waXBlbGluZS5oCmluZGV4IDg0Y2ZjMzUuLjM0NDgyZWMgMTAwNjQ0Ci0tLSBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXJfcGlwZWxpbmUuaAorKysgYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL21peGVyX3BpcGVsaW5lLmgKQEAgLTIsOCArMiw4IEBACiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCi0jaWZuZGVmIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfTUlYRVJfUElQRUxJTkVfSF8KLSNkZWZpbmUgQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9NSVhFUl9QSVBFTElORV9IXworI2lmbmRlZiBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX01JWEVSX01JWEVSX1BJUEVMSU5FX0hfCisjZGVmaW5lIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfTUlYRVJfTUlYRVJfUElQRUxJTkVfSF8KIAogI2luY2x1ZGUgPGNzdGRpbnQ+CiAjaW5jbHVkZSA8bWVtb3J5PgpAQCAtMTA3LDQgKzEwNyw0IEBACiB9ICAvLyBuYW1lc3BhY2UgbWVkaWEKIH0gIC8vIG5hbWVzcGFjZSBjaHJvbWVjYXN0CiAKLSNlbmRpZiAgLy8gQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9NSVhFUl9QSVBFTElORV9IXworI2VuZGlmICAvLyBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX01JWEVSX01JWEVSX1BJUEVMSU5FX0hfCmRpZmYgLS1naXQgYS9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyX3NlcnZpY2VfcmVjZWl2ZXIuY2MgYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL21peGVyX3NlcnZpY2VfcmVjZWl2ZXIuY2MKc2ltaWxhcml0eSBpbmRleCA5MSUKcmVuYW1lIGZyb20gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlcl9zZXJ2aWNlX3JlY2VpdmVyLmNjCnJlbmFtZSB0byBjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL21peGVyX3NlcnZpY2VfcmVjZWl2ZXIuY2MKaW5kZXggNGM3MTNlZC4uNjVkNmM2OCAxMDA2NDQKLS0tIGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlcl9zZXJ2aWNlX3JlY2VpdmVyLmNjCisrKyBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvbWl4ZXJfc2VydmljZV9yZWNlaXZlci5jYwpAQCAtMiwxNCArMiwxNCBAQAogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAotI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXJfc2VydmljZV9yZWNlaXZlci5oIgorI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvbWl4ZXJfc2VydmljZV9yZWNlaXZlci5oIgogCiAjaW5jbHVkZSA8dXRpbGl0eT4KIAogI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgogI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvYXVkaW8vbWl4ZXJfc2VydmljZS9taXhlcl9zZXJ2aWNlLnBiLmgiCiAjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9hdWRpby9taXhlcl9zZXJ2aWNlL21peGVyX3NvY2tldC5oIgotI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXJfaW5wdXRfY29ubmVjdGlvbi5oIgorI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvbWl4ZXJfaW5wdXRfY29ubmVjdGlvbi5oIgogCiBuYW1lc3BhY2UgY2hyb21lY2FzdCB7CiBuYW1lc3BhY2UgbWVkaWEgewpkaWZmIC0tZ2l0IGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlcl9zZXJ2aWNlX3JlY2VpdmVyLmggYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL21peGVyX3NlcnZpY2VfcmVjZWl2ZXIuaApzaW1pbGFyaXR5IGluZGV4IDg2JQpyZW5hbWUgZnJvbSBjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyX3NlcnZpY2VfcmVjZWl2ZXIuaApyZW5hbWUgdG8gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9taXhlcl9zZXJ2aWNlX3JlY2VpdmVyLmgKaW5kZXggZTI0OWYxODguLjIzOWI4ZjU4IDEwMDY0NAotLS0gYS9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyX3NlcnZpY2VfcmVjZWl2ZXIuaAorKysgYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL21peGVyX3NlcnZpY2VfcmVjZWl2ZXIuaApAQCAtMiw4ICsyLDggQEAKIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLSNpZm5kZWYgQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9NSVhFUl9TRVJWSUNFX1JFQ0VJVkVSX0hfCi0jZGVmaW5lIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfTUlYRVJfU0VSVklDRV9SRUNFSVZFUl9IXworI2lmbmRlZiBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX01JWEVSX01JWEVSX1NFUlZJQ0VfUkVDRUlWRVJfSF8KKyNkZWZpbmUgQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9NSVhFUl9NSVhFUl9TRVJWSUNFX1JFQ0VJVkVSX0hfCiAKICNpbmNsdWRlIDxtZW1vcnk+CiAKQEAgLTQ2LDQgKzQ2LDQgQEAKIH0gIC8vIG5hbWVzcGFjZSBtZWRpYQogfSAgLy8gbmFtZXNwYWNlIGNocm9tZWNhc3QKIAotI2VuZGlmICAvLyBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX01JWEVSX1NFUlZJQ0VfUkVDRUlWRVJfSF8KKyNlbmRpZiAgLy8gQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9NSVhFUl9NSVhFUl9TRVJWSUNFX1JFQ0VJVkVSX0hfCmRpZmYgLS1naXQgYS9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21vY2tfbWl4ZXJfc291cmNlLmNjIGIvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9tb2NrX21peGVyX3NvdXJjZS5jYwpzaW1pbGFyaXR5IGluZGV4IDk0JQpyZW5hbWUgZnJvbSBjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21vY2tfbWl4ZXJfc291cmNlLmNjCnJlbmFtZSB0byBjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL21vY2tfbWl4ZXJfc291cmNlLmNjCmluZGV4IDQ5MWY1ODAuLjZlYjAwZDMgMTAwNjQ0Ci0tLSBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbW9ja19taXhlcl9zb3VyY2UuY2MKKysrIGIvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9tb2NrX21peGVyX3NvdXJjZS5jYwpAQCAtMiw4ICsyLDkgQEAKIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLSNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21vY2tfbWl4ZXJfc291cmNlLmgiCisjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9tb2NrX21peGVyX3NvdXJjZS5oIgogCisjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPHV0aWxpdHk+CiAKICNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKZGlmZiAtLWdpdCBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbW9ja19taXhlcl9zb3VyY2UuaCBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvbW9ja19taXhlcl9zb3VyY2UuaApzaW1pbGFyaXR5IGluZGV4IDkwJQpyZW5hbWUgZnJvbSBjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21vY2tfbWl4ZXJfc291cmNlLmgKcmVuYW1lIHRvIGNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvbW9ja19taXhlcl9zb3VyY2UuaAppbmRleCA3NWViYmI0Li5lZjdlZDdjYiAxMDA2NDQKLS0tIGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9tb2NrX21peGVyX3NvdXJjZS5oCisrKyBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvbW9ja19taXhlcl9zb3VyY2UuaApAQCAtMiwxNCArMiwxNCBAQAogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAotI2lmbmRlZiBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX01PQ0tfTUlYRVJfU09VUkNFX0hfCi0jZGVmaW5lIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfTU9DS19NSVhFUl9TT1VSQ0VfSF8KKyNpZm5kZWYgQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9NSVhFUl9NT0NLX01JWEVSX1NPVVJDRV9IXworI2RlZmluZSBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX01JWEVSX01PQ0tfTUlYRVJfU09VUkNFX0hfCiAKICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8c3RyaW5nPgogCiAjaW5jbHVkZSAiYmFzZS9tYWNyb3MuaCIKLSNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyX2lucHV0LmgiCisjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9taXhlcl9pbnB1dC5oIgogI2luY2x1ZGUgImNocm9tZWNhc3QvcHVibGljL3ZvbHVtZV9jb250cm9sLmgiCiAjaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fZGV2aWNlX2Rlc2NyaXB0aW9uLmgiCiAjaW5jbHVkZSAidGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLmgiCkBAIC04MCw0ICs4MCw0IEBACiB9ICAvLyBuYW1lc3BhY2UgbWVkaWEKIH0gIC8vIG5hbWVzcGFjZSBjaHJvbWVjYXN0CiAKLSNlbmRpZiAgLy8gQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9NT0NLX01JWEVSX1NPVVJDRV9IXworI2VuZGlmICAvLyBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX01JWEVSX01PQ0tfTUlYRVJfU09VUkNFX0hfCmRpZmYgLS1naXQgYS9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21vY2tfcG9zdF9wcm9jZXNzb3JfZmFjdG9yeS5jYyBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvbW9ja19wb3N0X3Byb2Nlc3Nvcl9mYWN0b3J5LmNjCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIGNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbW9ja19wb3N0X3Byb2Nlc3Nvcl9mYWN0b3J5LmNjCnJlbmFtZSB0byBjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL21vY2tfcG9zdF9wcm9jZXNzb3JfZmFjdG9yeS5jYwppbmRleCBlZTZiNzhmLi5hNjI2MzRkIDEwMDY0NAotLS0gYS9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21vY2tfcG9zdF9wcm9jZXNzb3JfZmFjdG9yeS5jYworKysgYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL21vY2tfcG9zdF9wcm9jZXNzb3JfZmFjdG9yeS5jYwpAQCAtMiw3ICsyLDcgQEAKIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLSNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21vY2tfcG9zdF9wcm9jZXNzb3JfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvbW9ja19wb3N0X3Byb2Nlc3Nvcl9mYWN0b3J5LmgiCiAKICNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKICNpbmNsdWRlICJiYXNlL3ZhbHVlcy5oIgpkaWZmIC0tZ2l0IGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9tb2NrX3Bvc3RfcHJvY2Vzc29yX2ZhY3RvcnkuaCBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvbW9ja19wb3N0X3Byb2Nlc3Nvcl9mYWN0b3J5LmgKc2ltaWxhcml0eSBpbmRleCA4OSUKcmVuYW1lIGZyb20gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9tb2NrX3Bvc3RfcHJvY2Vzc29yX2ZhY3RvcnkuaApyZW5hbWUgdG8gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9tb2NrX3Bvc3RfcHJvY2Vzc29yX2ZhY3RvcnkuaAppbmRleCA1YjE5NmJmYi4uNTcxZTY3NCAxMDA2NDQKLS0tIGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9tb2NrX3Bvc3RfcHJvY2Vzc29yX2ZhY3RvcnkuaAorKysgYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL21vY2tfcG9zdF9wcm9jZXNzb3JfZmFjdG9yeS5oCkBAIC0yLDE1ICsyLDE1IEBACiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCi0jaWZuZGVmIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfTU9DS19QT1NUX1BST0NFU1NPUl9GQUNUT1JZX0hfCi0jZGVmaW5lIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfTU9DS19QT1NUX1BST0NFU1NPUl9GQUNUT1JZX0hfCisjaWZuZGVmIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfTUlYRVJfTU9DS19QT1NUX1BST0NFU1NPUl9GQUNUT1JZX0hfCisjZGVmaW5lIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfTUlYRVJfTU9DS19QT1NUX1BST0NFU1NPUl9GQUNUT1JZX0hfCiAKICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CiAKICNpbmNsdWRlICJiYXNlL21hY3Jvcy5oIgotI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvcG9zdF9wcm9jZXNzaW5nX3BpcGVsaW5lLmgiCisjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9wb3N0X3Byb2Nlc3NpbmdfcGlwZWxpbmUuaCIKICNpbmNsdWRlICJjaHJvbWVjYXN0L3B1YmxpYy9tZWRpYS9hdWRpb19wb3N0X3Byb2Nlc3NvcjJfc2hsaWIuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCIKIApAQCAtNTcsNyArNTcsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfc2lsZW5jZSkgewogICAgIG91dHB1dF9idWZmZXJfID0gZGF0YTsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8ZG91YmxlPihyZW5kZXJpbmdfZGVsYXlfZnJhbWVzXykgLyBzYW1wbGVfcmF0ZV87Ci0gICAgOwogICB9CiAKICAgTW9ja1Bvc3RQcm9jZXNzb3JGYWN0b3J5KiBjb25zdCBmYWN0b3J5XzsKQEAgLTg2LDQgKzg1LDQgQEAKIH0gIC8vIG5hbWVzcGFjZSBtZWRpYQogfSAgLy8gbmFtZXNwYWNlIGNocm9tZWNhc3QKIAotI2VuZGlmICAvLyBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX01PQ0tfUE9TVF9QUk9DRVNTT1JfRkFDVE9SWV9IXworI2VuZGlmICAvLyBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX01JWEVSX01PQ0tfUE9TVF9QUk9DRVNTT1JfRkFDVE9SWV9IXwpkaWZmIC0tZ2l0IGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9tb2NrX3JlZGlyZWN0ZWRfYXVkaW9fb3V0cHV0LmNjIGIvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9tb2NrX3JlZGlyZWN0ZWRfYXVkaW9fb3V0cHV0LmNjCnNpbWlsYXJpdHkgaW5kZXggOTQlCnJlbmFtZSBmcm9tIGNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbW9ja19yZWRpcmVjdGVkX2F1ZGlvX291dHB1dC5jYwpyZW5hbWUgdG8gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9tb2NrX3JlZGlyZWN0ZWRfYXVkaW9fb3V0cHV0LmNjCmluZGV4IDU3MTY0NGEuLjQ1YWFjNDQgMTAwNjQ0Ci0tLSBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbW9ja19yZWRpcmVjdGVkX2F1ZGlvX291dHB1dC5jYworKysgYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL21vY2tfcmVkaXJlY3RlZF9hdWRpb19vdXRwdXQuY2MKQEAgLTIsNyArMiw3IEBACiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCi0jaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9tb2NrX3JlZGlyZWN0ZWRfYXVkaW9fb3V0cHV0LmgiCisjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9tb2NrX3JlZGlyZWN0ZWRfYXVkaW9fb3V0cHV0LmgiCiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAKZGlmZiAtLWdpdCBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbW9ja19yZWRpcmVjdGVkX2F1ZGlvX291dHB1dC5oIGIvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9tb2NrX3JlZGlyZWN0ZWRfYXVkaW9fb3V0cHV0LmgKc2ltaWxhcml0eSBpbmRleCA4NSUKcmVuYW1lIGZyb20gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9tb2NrX3JlZGlyZWN0ZWRfYXVkaW9fb3V0cHV0LmgKcmVuYW1lIHRvIGNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvbW9ja19yZWRpcmVjdGVkX2F1ZGlvX291dHB1dC5oCmluZGV4IDdlOGU2NGEuLjRmZTNkODdlIDEwMDY0NAotLS0gYS9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21vY2tfcmVkaXJlY3RlZF9hdWRpb19vdXRwdXQuaAorKysgYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL21vY2tfcmVkaXJlY3RlZF9hdWRpb19vdXRwdXQuaApAQCAtMiw4ICsyLDggQEAKIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLSNpZm5kZWYgQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9NT0NLX1JFRElSRUNURURfQVVESU9fT1VUUFVUX0hfCi0jZGVmaW5lIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfTU9DS19SRURJUkVDVEVEX0FVRElPX09VVFBVVF9IXworI2lmbmRlZiBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX01JWEVSX01PQ0tfUkVESVJFQ1RFRF9BVURJT19PVVRQVVRfSF8KKyNkZWZpbmUgQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9NSVhFUl9NT0NLX1JFRElSRUNURURfQVVESU9fT1VUUFVUX0hfCiAKICNpbmNsdWRlIDxjc3RkaW50PgogI2luY2x1ZGUgPG1lbW9yeT4KQEAgLTUxLDQgKzUxLDQgQEAKIH0gIC8vIG5hbWVzcGFjZSBtZWRpYQogfSAgLy8gbmFtZXNwYWNlIGNocm9tZWNhc3QKIAotI2VuZGlmICAvLyBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX01PQ0tfUkVESVJFQ1RFRF9BVURJT19PVVRQVVRfSF8KKyNlbmRpZiAgLy8gQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9NSVhFUl9NT0NLX1JFRElSRUNURURfQVVESU9fT1VUUFVUX0hfCmRpZmYgLS1naXQgYS9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3Bvc3RfcHJvY2Vzc2luZ19waXBlbGluZS5oIGIvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9wb3N0X3Byb2Nlc3NpbmdfcGlwZWxpbmUuaApzaW1pbGFyaXR5IGluZGV4IDg3JQpyZW5hbWUgZnJvbSBjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3Bvc3RfcHJvY2Vzc2luZ19waXBlbGluZS5oCnJlbmFtZSB0byBjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc2luZ19waXBlbGluZS5oCmluZGV4IDk4NmJmNmEuLjZkZDQ4OGIgMTAwNjQ0Ci0tLSBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvcG9zdF9wcm9jZXNzaW5nX3BpcGVsaW5lLmgKKysrIGIvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9wb3N0X3Byb2Nlc3NpbmdfcGlwZWxpbmUuaApAQCAtMiwxMCArMiwxMSBAQAogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAotI2lmbmRlZiBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX1BPU1RfUFJPQ0VTU0lOR19QSVBFTElORV9IXwotI2RlZmluZSBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX1BPU1RfUFJPQ0VTU0lOR19QSVBFTElORV9IXworI2lmbmRlZiBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX01JWEVSX1BPU1RfUFJPQ0VTU0lOR19QSVBFTElORV9IXworI2RlZmluZSBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX01JWEVSX1BPU1RfUFJPQ0VTU0lOR19QSVBFTElORV9IXwogCiAjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlICJjaHJvbWVjYXN0L3B1YmxpYy9tZWRpYS9hdWRpb19wb3N0X3Byb2Nlc3NvcjJfc2hsaWIuaCIKQEAgLTUzLDQgKzU0LDQgQEAKIH0gIC8vIG5hbWVzcGFjZSBtZWRpYQogfSAgLy8gbmFtZXNwYWNlIGNocm9tZWNhc3QKIAotI2VuZGlmICAvLyBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX1BPU1RfUFJPQ0VTU0lOR19QSVBFTElORV9IXworI2VuZGlmICAvLyBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX01JWEVSX1BPU1RfUFJPQ0VTU0lOR19QSVBFTElORV9IXwpkaWZmIC0tZ2l0IGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9wb3N0X3Byb2Nlc3NpbmdfcGlwZWxpbmVfaW1wbC5jYyBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvcG9zdF9wcm9jZXNzaW5nX3BpcGVsaW5lX2ltcGwuY2MKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9wb3N0X3Byb2Nlc3NpbmdfcGlwZWxpbmVfaW1wbC5jYwpyZW5hbWUgdG8gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9wb3N0X3Byb2Nlc3NpbmdfcGlwZWxpbmVfaW1wbC5jYwppbmRleCAzYWFiYzU4Li44NjAzNmQ1NCAxMDA2NDQKLS0tIGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9wb3N0X3Byb2Nlc3NpbmdfcGlwZWxpbmVfaW1wbC5jYworKysgYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc2luZ19waXBlbGluZV9pbXBsLmNjCkBAIC0yLDcgKzIsNyBAQAogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAotI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvcG9zdF9wcm9jZXNzaW5nX3BpcGVsaW5lX2ltcGwuaCIKKyNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc2luZ19waXBlbGluZV9pbXBsLmgiCiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8Y21hdGg+CmRpZmYgLS1naXQgYS9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3Bvc3RfcHJvY2Vzc2luZ19waXBlbGluZV9pbXBsLmggYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc2luZ19waXBlbGluZV9pbXBsLmgKc2ltaWxhcml0eSBpbmRleCA4OCUKcmVuYW1lIGZyb20gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9wb3N0X3Byb2Nlc3NpbmdfcGlwZWxpbmVfaW1wbC5oCnJlbmFtZSB0byBjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc2luZ19waXBlbGluZV9pbXBsLmgKaW5kZXggZjYwNGFjZjkuLmI3MmQwYjYgMTAwNjQ0Ci0tLSBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvcG9zdF9wcm9jZXNzaW5nX3BpcGVsaW5lX2ltcGwuaAorKysgYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc2luZ19waXBlbGluZV9pbXBsLmgKQEAgLTIsOCArMiw4IEBACiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCi0jaWZuZGVmIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfUE9TVF9QUk9DRVNTSU5HX1BJUEVMSU5FX0lNUExfSF8KLSNkZWZpbmUgQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9QT1NUX1BST0NFU1NJTkdfUElQRUxJTkVfSU1QTF9IXworI2lmbmRlZiBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX01JWEVSX1BPU1RfUFJPQ0VTU0lOR19QSVBFTElORV9JTVBMX0hfCisjZGVmaW5lIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfTUlYRVJfUE9TVF9QUk9DRVNTSU5HX1BJUEVMSU5FX0lNUExfSF8KIAogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxzdHJpbmc+CkBAIC0xMSw4ICsxMSw4IEBACiAKICNpbmNsdWRlICJiYXNlL21hY3Jvcy5oIgogI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvYmFzZS9hbGlnbmVkX2J1ZmZlci5oIgotI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvcG9zdF9wcm9jZXNzaW5nX3BpcGVsaW5lLmgiCi0jaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9wb3N0X3Byb2Nlc3Nvcl9mYWN0b3J5LmgiCisjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9wb3N0X3Byb2Nlc3NpbmdfcGlwZWxpbmUuaCIKKyNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc29yX2ZhY3RvcnkuaCIKICNpbmNsdWRlICJjaHJvbWVjYXN0L3B1YmxpYy92b2x1bWVfY29udHJvbC5oIgogCiBuYW1lc3BhY2UgYmFzZSB7CkBAIC05OSw0ICs5OSw0IEBACiB9ICAvLyBuYW1lc3BhY2UgbWVkaWEKIH0gIC8vIG5hbWVzcGFjZSBjaHJvbWVjYXN0CiAKLSNlbmRpZiAgLy8gQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9QT1NUX1BST0NFU1NJTkdfUElQRUxJTkVfSU1QTF9IXworI2VuZGlmICAvLyBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX01JWEVSX1BPU1RfUFJPQ0VTU0lOR19QSVBFTElORV9JTVBMX0hfCmRpZmYgLS1naXQgYS9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3Bvc3RfcHJvY2Vzc2luZ19waXBlbGluZV9wYXJzZXIuY2MgYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc2luZ19waXBlbGluZV9wYXJzZXIuY2MKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9wb3N0X3Byb2Nlc3NpbmdfcGlwZWxpbmVfcGFyc2VyLmNjCnJlbmFtZSB0byBjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc2luZ19waXBlbGluZV9wYXJzZXIuY2MKaW5kZXggZDk2OWZiZS4uYjIxNTRkMiAxMDA2NDQKLS0tIGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9wb3N0X3Byb2Nlc3NpbmdfcGlwZWxpbmVfcGFyc2VyLmNjCisrKyBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvcG9zdF9wcm9jZXNzaW5nX3BpcGVsaW5lX3BhcnNlci5jYwpAQCAtMiw3ICsyLDcgQEAKIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLSNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3Bvc3RfcHJvY2Vzc2luZ19waXBlbGluZV9wYXJzZXIuaCIKKyNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc2luZ19waXBlbGluZV9wYXJzZXIuaCIKIAogI2luY2x1ZGUgPHV0aWxpdHk+CiAKZGlmZiAtLWdpdCBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvcG9zdF9wcm9jZXNzaW5nX3BpcGVsaW5lX3BhcnNlci5oIGIvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9wb3N0X3Byb2Nlc3NpbmdfcGlwZWxpbmVfcGFyc2VyLmgKc2ltaWxhcml0eSBpbmRleCA5MCUKcmVuYW1lIGZyb20gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9wb3N0X3Byb2Nlc3NpbmdfcGlwZWxpbmVfcGFyc2VyLmgKcmVuYW1lIHRvIGNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvcG9zdF9wcm9jZXNzaW5nX3BpcGVsaW5lX3BhcnNlci5oCmluZGV4IGJhNDg1MmUwLi5mOGQ1ZDU2ZSAxMDA2NDQKLS0tIGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9wb3N0X3Byb2Nlc3NpbmdfcGlwZWxpbmVfcGFyc2VyLmgKKysrIGIvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9wb3N0X3Byb2Nlc3NpbmdfcGlwZWxpbmVfcGFyc2VyLmgKQEAgLTIsOCArMiw4IEBACiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCi0jaWZuZGVmIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfUE9TVF9QUk9DRVNTSU5HX1BJUEVMSU5FX1BBUlNFUl9IXwotI2RlZmluZSBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX1BPU1RfUFJPQ0VTU0lOR19QSVBFTElORV9QQVJTRVJfSF8KKyNpZm5kZWYgQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9NSVhFUl9QT1NUX1BST0NFU1NJTkdfUElQRUxJTkVfUEFSU0VSX0hfCisjZGVmaW5lIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfTUlYRVJfUE9TVF9QUk9DRVNTSU5HX1BJUEVMSU5FX1BBUlNFUl9IXwogCiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHN0cmluZz4KQEAgLTc3LDQgKzc3LDQgQEAKIH0gIC8vIG5hbWVzcGFjZSBtZWRpYQogfSAgLy8gbmFtZXNwYWNlIGNocm9tZWNhc3QKIAotI2VuZGlmICAvLyBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX1BPU1RfUFJPQ0VTU0lOR19QSVBFTElORV9QQVJTRVJfSF8KKyNlbmRpZiAgLy8gQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9NSVhFUl9QT1NUX1BST0NFU1NJTkdfUElQRUxJTkVfUEFSU0VSX0hfCmRpZmYgLS1naXQgYS9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3Bvc3RfcHJvY2Vzc29yX2ZhY3RvcnkuY2MgYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc29yX2ZhY3RvcnkuY2MKc2ltaWxhcml0eSBpbmRleCA4MCUKcmVuYW1lIGZyb20gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9wb3N0X3Byb2Nlc3Nvcl9mYWN0b3J5LmNjCnJlbmFtZSB0byBjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc29yX2ZhY3RvcnkuY2MKaW5kZXggYzk4ZmQ0YTMuLjFhMDg5N2QgMTAwNjQ0Ci0tLSBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvcG9zdF9wcm9jZXNzb3JfZmFjdG9yeS5jYworKysgYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc29yX2ZhY3RvcnkuY2MKQEAgLTIsNyArMiw3IEBACiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCi0jaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9wb3N0X3Byb2Nlc3Nvcl9mYWN0b3J5LmgiCisjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9wb3N0X3Byb2Nlc3Nvcl9mYWN0b3J5LmgiCiAKICNpbmNsdWRlIDxtZW1vcnk+CiAKQEAgLTExLDcgKzExLDggQEAKICNpbmNsdWRlICJiYXNlL21lbW9yeS9wdHJfdXRpbC5oIgogI2luY2x1ZGUgImJhc2Uvc2NvcGVkX25hdGl2ZV9saWJyYXJ5LmgiCiAjaW5jbHVkZSAiYmFzZS9zdHJpbmdzL3N0cmluZ3ByaW50Zi5oIgotI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvcG9zdF9wcm9jZXNzb3JzL3Bvc3RfcHJvY2Vzc29yX3dyYXBwZXIuaCIKKyNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc29yX3BhdGhzLmgiCisjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9wb3N0X3Byb2Nlc3NvcnMvcG9zdF9wcm9jZXNzb3Jfd3JhcHBlci5oIgogI2luY2x1ZGUgImNocm9tZWNhc3QvcHVibGljL21lZGlhL2F1ZGlvX3Bvc3RfcHJvY2Vzc29yMl9zaGxpYi5oIgogI2luY2x1ZGUgImNocm9tZWNhc3QvcHVibGljL21lZGlhL2F1ZGlvX3Bvc3RfcHJvY2Vzc29yX3NobGliLmgiCiAKQEAgLTIyLDIzICsyMywyMiBAQAogCiBjb25zdCBjaGFyIGtWMVNvQ3JlYXRlRnVuY3Rpb25bXSA9ICJBdWRpb1Bvc3RQcm9jZXNzb3JTaGxpYl9DcmVhdGUiOwogY29uc3QgY2hhciBrVjJTb0NyZWF0ZUZ1bmN0aW9uW10gPSAiQXVkaW9Qb3N0UHJvY2Vzc29yMlNobGliX0NyZWF0ZSI7Ci1jb25zdCBjaGFyIGtQcmVmZXJyZWRMaWJyYXJ5UGF0aFtdID0gIi9zeXN0ZW0vY2hyb21lL2xpYi9wcm9jZXNzb3JzIjsKLWNvbnN0IGNoYXIga1ByZWZlcnJlZE9lbUxpYnJhcnlQYXRoW10gPSAiL29lbV9jYXN0X3NobGliL3Byb2Nlc3NvcnMiOwogCiBiYXNlOjpGaWxlUGF0aCBGaW5kTGlicmFyeShjb25zdCBzdGQ6OnN0cmluZyYgbGlicmFyeV9uYW1lKSB7CiAgIGJhc2U6OkZpbGVQYXRoIHJlbGF0aXZlX3BhdGgobGlicmFyeV9uYW1lKTsKLSAgYmFzZTo6RmlsZVBhdGggZnVsbF9wYXRoKGtQcmVmZXJyZWRMaWJyYXJ5UGF0aCk7CisgIGJhc2U6OkZpbGVQYXRoIGZ1bGxfcGF0aCA9IEdldFBvc3RQcm9jZXNzb3JEaXJlY3RvcnkoKTsKICAgZnVsbF9wYXRoID0gZnVsbF9wYXRoLkFwcGVuZChyZWxhdGl2ZV9wYXRoKTsKICAgaWYgKGJhc2U6OlBhdGhFeGlzdHMoZnVsbF9wYXRoKSkgewogICAgIHJldHVybiBmdWxsX3BhdGg7CiAgIH0KLSAgZnVsbF9wYXRoID0gYmFzZTo6RmlsZVBhdGgoa1ByZWZlcnJlZE9lbUxpYnJhcnlQYXRoKTsKKyAgZnVsbF9wYXRoID0gR2V0T2VtUG9zdFByb2Nlc3NvckRpcmVjdG9yeSgpOwogICBmdWxsX3BhdGggPSBmdWxsX3BhdGguQXBwZW5kKHJlbGF0aXZlX3BhdGgpOwogICBpZiAoYmFzZTo6UGF0aEV4aXN0cyhmdWxsX3BhdGgpKSB7CiAgICAgcmV0dXJuIGZ1bGxfcGF0aDsKICAgfQotICBMT0coV0FSTklORykgPDwgbGlicmFyeV9uYW1lIDw8ICIgbm90IGZvdW5kIGluICIgPDwga1ByZWZlcnJlZExpYnJhcnlQYXRoCi0gICAgICAgICAgICAgICA8PCAiIG9yICIgPDwga1ByZWZlcnJlZE9lbUxpYnJhcnlQYXRoCisgIExPRyhXQVJOSU5HKSA8PCBsaWJyYXJ5X25hbWUgPDwgIiBub3QgZm91bmQgaW4gIgorICAgICAgICAgICAgICAgPDwgR2V0UG9zdFByb2Nlc3NvckRpcmVjdG9yeSgpLkFzVVRGOFVuc2FmZSgpIDw8ICIgb3IgIgorICAgICAgICAgICAgICAgPDwgR2V0T2VtUG9zdFByb2Nlc3NvckRpcmVjdG9yeSgpLkFzVVRGOFVuc2FmZSgpCiAgICAgICAgICAgICAgICA8PCAiLiBQcmVmZXIgc3RvcmluZyBwb3N0IHByb2Nlc3NvcnMgaW4gdGhlc2UgZGlyZWN0b3JpZXMuIjsKICAgcmV0dXJuIHJlbGF0aXZlX3BhdGg7CiB9CkBAIC0xMDQsMTUgKzEwNCw1IEBACiAgIHJldHVybiBmYWxzZTsKIH0KIAotLy8gc3RhdGljCi1iYXNlOjpGaWxlUGF0aCBjb25zdCBQb3N0UHJvY2Vzc29yRmFjdG9yeTo6R2V0UG9zdFByb2Nlc3NvckRpcmVjdG9yeSgpIHsKLSAgcmV0dXJuIGJhc2U6OkZpbGVQYXRoKGtQcmVmZXJyZWRMaWJyYXJ5UGF0aCk7Ci19Ci0KLS8vIHN0YXRpYwotYmFzZTo6RmlsZVBhdGggY29uc3QgUG9zdFByb2Nlc3NvckZhY3Rvcnk6OkdldE9lbVBvc3RQcm9jZXNzb3JEaXJlY3RvcnkoKSB7Ci0gIHJldHVybiBiYXNlOjpGaWxlUGF0aChrUHJlZmVycmVkT2VtTGlicmFyeVBhdGgpOwotfQotCiB9ICAvLyBuYW1lc3BhY2UgbWVkaWEKIH0gIC8vIG5hbWVzcGFjZSBjaHJvbWVjYXN0CmRpZmYgLS1naXQgYS9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3Bvc3RfcHJvY2Vzc29yX2ZhY3RvcnkuaCBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvcG9zdF9wcm9jZXNzb3JfZmFjdG9yeS5oCnNpbWlsYXJpdHkgaW5kZXggNzYlCnJlbmFtZSBmcm9tIGNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvcG9zdF9wcm9jZXNzb3JfZmFjdG9yeS5oCnJlbmFtZSB0byBjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc29yX2ZhY3RvcnkuaAppbmRleCBhZmM1NTg0Li41NGIzZmZiIDEwMDY0NAotLS0gYS9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3Bvc3RfcHJvY2Vzc29yX2ZhY3RvcnkuaAorKysgYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc29yX2ZhY3RvcnkuaApAQCAtMiw4ICsyLDggQEAKIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLSNpZm5kZWYgQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9QT1NUX1BST0NFU1NPUl9GQUNUT1JZX0hfCi0jZGVmaW5lIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfUE9TVF9QUk9DRVNTT1JfRkFDVE9SWV9IXworI2lmbmRlZiBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX01JWEVSX1BPU1RfUFJPQ0VTU09SX0ZBQ1RPUllfSF8KKyNkZWZpbmUgQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9NSVhFUl9QT1NUX1BST0NFU1NPUl9GQUNUT1JZX0hfCiAKICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8c3RyaW5nPgpAQCAtMjksMTIgKzI5LDYgQEAKICAgLy8gQ2hlY2tzIGlmIGEgbGlicmFyeSBpcyBhIFYxIG9yIFYyIHBvc3QgcHJvY2Vzc29yLgogICBzdGF0aWMgYm9vbCBJc1Bvc3RQcm9jZXNzb3JMaWJyYXJ5KGNvbnN0IGJhc2U6OkZpbGVQYXRoJiBsaWJyYXJ5X3BhdGgpOwogCi0gIC8vIFJldHVybnMgdGhlIHByZWZlcnJlZCBkaXJlY3RvcnkgZm9yIDFQIFBvc3QgUHJvY2Vzc29ycy4KLSAgc3RhdGljIGJhc2U6OkZpbGVQYXRoIGNvbnN0IEdldFBvc3RQcm9jZXNzb3JEaXJlY3RvcnkoKTsKLQotICAvLyBSZXR1cm5zIHRoZSBwcmVmZXJyZWQgZGlyZWN0cm95IGZvciAzUCBQb3N0IFByb2Nlc3NvcnMuCi0gIHN0YXRpYyBiYXNlOjpGaWxlUGF0aCBjb25zdCBHZXRPZW1Qb3N0UHJvY2Vzc29yRGlyZWN0b3J5KCk7Ci0KICAgLy8gQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBBdWRpb1Bvc3RQcm9jZXNzb3IyIG9yIGEgd3JhcHBlZCBBdWRpb1Bvc3RQcm9jZXNzb3IuCiAgIC8vIEJ5IGRlZmF1bHQsIHdpbGwgYXR0ZW1wdCB0byBmaW5kIHRoZSBsaWJyYXJ5IGluCiAgIC8vIC9zeXN0ZW0vY2hyb21lL2xpYi9wcm9jZXNzb3JzL3xsaWJyYXJ5X25hbWV8LiBXaWxsIGZhbGwgYmFjayB0bwpAQCAtNTYsNCArNTAsNCBAQAogfSAgLy8gbmFtZXNwYWNlIG1lZGlhCiB9ICAvLyBuYW1lc3BhY2UgY2hyb21lY2FzdAogCi0jZW5kaWYgIC8vIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfUE9TVF9QUk9DRVNTT1JfRkFDVE9SWV9IXworI2VuZGlmICAvLyBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX01JWEVSX1BPU1RfUFJPQ0VTU09SX0ZBQ1RPUllfSF8KZGlmZiAtLWdpdCBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvcG9zdF9wcm9jZXNzb3JfcGF0aHMuY2MgYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc29yX3BhdGhzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNzY5MTkKLS0tIC9kZXYvbnVsbAorKysgYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc29yX3BhdGhzLmNjCkBAIC0wLDAgKzEsMjggQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvcG9zdF9wcm9jZXNzb3JfcGF0aHMuaCIKKworbmFtZXNwYWNlIGNocm9tZWNhc3QgeworbmFtZXNwYWNlIG1lZGlhIHsKKworbmFtZXNwYWNlIHsKKworY29uc3QgY2hhciBrUHJlZmVycmVkTGlicmFyeVBhdGhbXSA9ICIvc3lzdGVtL2Nocm9tZS9saWIvcHJvY2Vzc29ycyI7Citjb25zdCBjaGFyIGtQcmVmZXJyZWRPZW1MaWJyYXJ5UGF0aFtdID0gIi9vZW1fY2FzdF9zaGxpYi9wcm9jZXNzb3JzIjsKKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYworYmFzZTo6RmlsZVBhdGggR2V0UG9zdFByb2Nlc3NvckRpcmVjdG9yeSgpIHsKKyAgcmV0dXJuIGJhc2U6OkZpbGVQYXRoKGtQcmVmZXJyZWRMaWJyYXJ5UGF0aCk7Cit9CisKKy8vIHN0YXRpYworYmFzZTo6RmlsZVBhdGggR2V0T2VtUG9zdFByb2Nlc3NvckRpcmVjdG9yeSgpIHsKKyAgcmV0dXJuIGJhc2U6OkZpbGVQYXRoKGtQcmVmZXJyZWRPZW1MaWJyYXJ5UGF0aCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGNocm9tZWNhc3QKZGlmZiAtLWdpdCBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvcG9zdF9wcm9jZXNzb3JfcGF0aHMuaCBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvcG9zdF9wcm9jZXNzb3JfcGF0aHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTdjYzVlCi0tLSAvZGV2L251bGwKKysrIGIvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9wb3N0X3Byb2Nlc3Nvcl9wYXRocy5oCkBAIC0wLDAgKzEsMjIgQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2lmbmRlZiBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX01JWEVSX1BPU1RfUFJPQ0VTU09SX1BBVEhTX0hfCisjZGVmaW5lIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfTUlYRVJfUE9TVF9QUk9DRVNTT1JfUEFUSFNfSF8KKworI2luY2x1ZGUgImJhc2UvZmlsZXMvZmlsZV9wYXRoLmgiCisKK25hbWVzcGFjZSBjaHJvbWVjYXN0IHsKK25hbWVzcGFjZSBtZWRpYSB7CisKKy8vIFJldHVybnMgdGhlIHByZWZlcnJlZCBkaXJlY3RvcnkgZm9yIDFQIFBvc3QgUHJvY2Vzc29ycy4KK2Jhc2U6OkZpbGVQYXRoIEdldFBvc3RQcm9jZXNzb3JEaXJlY3RvcnkoKTsKKworLy8gUmV0dXJucyB0aGUgcHJlZmVycmVkIGRpcmVjdG9yeSBmb3IgM1AgUG9zdCBQcm9jZXNzb3JzLgorYmFzZTo6RmlsZVBhdGggR2V0T2VtUG9zdFByb2Nlc3NvckRpcmVjdG9yeSgpOworCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBjaHJvbWVjYXN0CisKKyNlbmRpZiAgLy8gQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9NSVhFUl9QT1NUX1BST0NFU1NPUl9QQVRIU19IXwpkaWZmIC0tZ2l0IGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9wb3N0X3Byb2Nlc3NvcnMvQlVJTEQuZ24gYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc29ycy9CVUlMRC5nbgpzaW1pbGFyaXR5IGluZGV4IDkxJQpyZW5hbWUgZnJvbSBjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3Bvc3RfcHJvY2Vzc29ycy9CVUlMRC5nbgpyZW5hbWUgdG8gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9wb3N0X3Byb2Nlc3NvcnMvQlVJTEQuZ24KaW5kZXggZWM3ZGVmMi4uNmFkY2JlM2MgMTAwNjQ0Ci0tLSBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvcG9zdF9wcm9jZXNzb3JzL0JVSUxELmduCisrKyBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvcG9zdF9wcm9jZXNzb3JzL0JVSUxELmduCkBAIC0yMiw3ICsyMiw3IEBACiAgIF0KICAgZGVmaW5lcyA9IFsKICAgICAiREVGSU5FRF9QT1NUUFJPQ0VTU09SX05BTUU9Y2hyb21lY2FzdDo6bWVkaWE6OkdvdmVybm9yIiwKLSAgICAiREVGSU5FRF9QT1NUUFJPQ0VTU09SX0hFQURFUj1jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3Bvc3RfcHJvY2Vzc29ycy9nb3Zlcm5vci5oIiwKKyAgICAiREVGSU5FRF9QT1NUUFJPQ0VTU09SX0hFQURFUj1jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc29ycy9nb3Zlcm5vci5oIiwKICAgXQogICBkZXBzID0gWwogICAgICI6Z292ZXJub3IiLApAQCAtNTQsNyArNTQsNyBAQAogICBdCiAgIGRlZmluZXMgPSBbCiAgICAgIkRFRklORURfUE9TVFBST0NFU1NPUl9OQU1FPWNocm9tZWNhc3Q6Om1lZGlhOjpTYXR1cmF0ZWRHYWluIiwKLSAgICAiREVGSU5FRF9QT1NUUFJPQ0VTU09SX0hFQURFUj1jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3Bvc3RfcHJvY2Vzc29ycy9zYXR1cmF0ZWRfZ2Fpbi5oIiwKKyAgICAiREVGSU5FRF9QT1NUUFJPQ0VTU09SX0hFQURFUj1jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc29ycy9zYXR1cmF0ZWRfZ2Fpbi5oIiwKICAgXQogICBkZXBzID0gWwogICAgICI6c2F0dXJhdGVkX2dhaW4iLApkaWZmIC0tZ2l0IGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9wb3N0X3Byb2Nlc3NvcnMvZ292ZXJub3IuY2MgYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc29ycy9nb3Zlcm5vci5jYwpzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3Bvc3RfcHJvY2Vzc29ycy9nb3Zlcm5vci5jYwpyZW5hbWUgdG8gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9wb3N0X3Byb2Nlc3NvcnMvZ292ZXJub3IuY2MKaW5kZXggMzYzYWJkYi4uNjU2NjUxYiAxMDA2NDQKLS0tIGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9wb3N0X3Byb2Nlc3NvcnMvZ292ZXJub3IuY2MKKysrIGIvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9wb3N0X3Byb2Nlc3NvcnMvZ292ZXJub3IuY2MKQEAgLTIsNyArMiw3IEBACiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCi0jaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9wb3N0X3Byb2Nlc3NvcnMvZ292ZXJub3IuaCIKKyNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc29ycy9nb3Zlcm5vci5oIgogCiAjaW5jbHVkZSA8bGltaXRzPgogI2luY2x1ZGUgPG1lbW9yeT4KZGlmZiAtLWdpdCBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvcG9zdF9wcm9jZXNzb3JzL2dvdmVybm9yLmggYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc29ycy9nb3Zlcm5vci5oCnNpbWlsYXJpdHkgaW5kZXggODclCnJlbmFtZSBmcm9tIGNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvcG9zdF9wcm9jZXNzb3JzL2dvdmVybm9yLmgKcmVuYW1lIHRvIGNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvcG9zdF9wcm9jZXNzb3JzL2dvdmVybm9yLmgKaW5kZXggM2MzOTk3My4uZGQxYzgxMyAxMDA2NDQKLS0tIGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9wb3N0X3Byb2Nlc3NvcnMvZ292ZXJub3IuaAorKysgYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc29ycy9nb3Zlcm5vci5oCkBAIC0yLDggKzIsOCBAQAogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAotI2lmbmRlZiBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX1BPU1RfUFJPQ0VTU09SU19HT1ZFUk5PUl9IXwotI2RlZmluZSBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX1BPU1RfUFJPQ0VTU09SU19HT1ZFUk5PUl9IXworI2lmbmRlZiBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX01JWEVSX1BPU1RfUFJPQ0VTU09SU19HT1ZFUk5PUl9IXworI2RlZmluZSBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX01JWEVSX1BPU1RfUFJPQ0VTU09SU19HT1ZFUk5PUl9IXwogCiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHN0cmluZz4KQEAgLTU0LDQgKzU0LDQgQEAKIH0gIC8vIG5hbWVzcGFjZSBtZWRpYQogfSAgLy8gbmFtZXNwYWNlIGNocm9tZWNhc3QKIAotI2VuZGlmICAvLyBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX1BPU1RfUFJPQ0VTU09SU19HT1ZFUk5PUl9IXworI2VuZGlmICAvLyBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX01JWEVSX1BPU1RfUFJPQ0VTU09SU19HT1ZFUk5PUl9IXwpkaWZmIC0tZ2l0IGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9wb3N0X3Byb2Nlc3NvcnMvZ292ZXJub3JfdW5pdHRlc3QuY2MgYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc29ycy9nb3Zlcm5vcl91bml0dGVzdC5jYwpzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSBjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3Bvc3RfcHJvY2Vzc29ycy9nb3Zlcm5vcl91bml0dGVzdC5jYwpyZW5hbWUgdG8gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9wb3N0X3Byb2Nlc3NvcnMvZ292ZXJub3JfdW5pdHRlc3QuY2MKaW5kZXggZjQ1NWNlOC4uNjBlODdjMyAxMDA2NDQKLS0tIGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9wb3N0X3Byb2Nlc3NvcnMvZ292ZXJub3JfdW5pdHRlc3QuY2MKKysrIGIvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9wb3N0X3Byb2Nlc3NvcnMvZ292ZXJub3JfdW5pdHRlc3QuY2MKQEAgLTIsNyArMiw3IEBACiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCi0jaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9wb3N0X3Byb2Nlc3NvcnMvZ292ZXJub3IuaCIKKyNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc29ycy9nb3Zlcm5vci5oIgogCiAjaW5jbHVkZSA8Y21hdGg+CiAjaW5jbHVkZSA8Y3N0ZGludD4KQEAgLTE0LDcgKzE0LDcgQEAKICNpbmNsdWRlICJiYXNlL21hY3Jvcy5oIgogI2luY2x1ZGUgImJhc2Uvc3RyaW5ncy9zdHJpbmdwcmludGYuaCIKICNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2Jhc2UvYWxpZ25lZF9idWZmZXIuaCIKLSNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3Bvc3RfcHJvY2Vzc29ycy9wb3N0X3Byb2Nlc3Nvcl91bml0dGVzdC5oIgorI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvcG9zdF9wcm9jZXNzb3JzL3Bvc3RfcHJvY2Vzc29yX3VuaXR0ZXN0LmgiCiAjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCiAKIG5hbWVzcGFjZSBjaHJvbWVjYXN0IHsKZGlmZiAtLWdpdCBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvcG9zdF9wcm9jZXNzb3JzL3Bvc3RfcHJvY2Vzc29yX25hbWUuY2MgYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc29ycy9wb3N0X3Byb2Nlc3Nvcl9uYW1lLmNjCnNpbWlsYXJpdHkgaW5kZXggOTIlCnJlbmFtZSBmcm9tIGNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvcG9zdF9wcm9jZXNzb3JzL3Bvc3RfcHJvY2Vzc29yX25hbWUuY2MKcmVuYW1lIHRvIGNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvcG9zdF9wcm9jZXNzb3JzL3Bvc3RfcHJvY2Vzc29yX25hbWUuY2MKaW5kZXggZDYzMDU0MmYuLjBmNDgwZWMgMTAwNjQ0Ci0tLSBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvcG9zdF9wcm9jZXNzb3JzL3Bvc3RfcHJvY2Vzc29yX25hbWUuY2MKKysrIGIvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9wb3N0X3Byb2Nlc3NvcnMvcG9zdF9wcm9jZXNzb3JfbmFtZS5jYwpAQCAtMiw4ICsyLDggQEAKIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKKyNpbmNsdWRlICJjaHJvbWVjYXN0L3B1YmxpYy9jaHJvbWVjYXN0X2V4cG9ydC5oIgogI2luY2x1ZGUgImNocm9tZWNhc3QvcHVibGljL21lZGlhL2F1ZGlvX3Bvc3RfcHJvY2Vzc29yMl9zaGxpYi5oIgotI2luY2x1ZGUgImNocm9tZWNhc3RfZXhwb3J0LmgiCiAKICNkZWZpbmUgU1RSSU5HSUZZKHgpICN4CiAjZGVmaW5lIFNUUklOR0lGWV9XUkFQUEVSKHgpIFNUUklOR0lGWSh4KQpkaWZmIC0tZ2l0IGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9wb3N0X3Byb2Nlc3NvcnMvcG9zdF9wcm9jZXNzb3JfdW5pdHRlc3QuY2MgYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc29ycy9wb3N0X3Byb2Nlc3Nvcl91bml0dGVzdC5jYwpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3Bvc3RfcHJvY2Vzc29ycy9wb3N0X3Byb2Nlc3Nvcl91bml0dGVzdC5jYwpyZW5hbWUgdG8gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9wb3N0X3Byb2Nlc3NvcnMvcG9zdF9wcm9jZXNzb3JfdW5pdHRlc3QuY2MKaW5kZXggNzdlZmU1OC4uOGMzNDZmOSAxMDA2NDQKLS0tIGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9wb3N0X3Byb2Nlc3NvcnMvcG9zdF9wcm9jZXNzb3JfdW5pdHRlc3QuY2MKKysrIGIvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9wb3N0X3Byb2Nlc3NvcnMvcG9zdF9wcm9jZXNzb3JfdW5pdHRlc3QuY2MKQEAgLTIsOCArMiw4IEBACiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCi0jaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9wb3N0X3Byb2Nlc3NvcnMvcG9zdF9wcm9jZXNzb3JfdW5pdHRlc3QuaCIKLSNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3Bvc3RfcHJvY2Vzc29ycy9wb3N0X3Byb2Nlc3Nvcl93cmFwcGVyLmgiCisjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9wb3N0X3Byb2Nlc3NvcnMvcG9zdF9wcm9jZXNzb3JfdW5pdHRlc3QuaCIKKyNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc29ycy9wb3N0X3Byb2Nlc3Nvcl93cmFwcGVyLmgiCiAKICNpbmNsdWRlIDx0aW1lLmg+CiAKZGlmZiAtLWdpdCBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvcG9zdF9wcm9jZXNzb3JzL3Bvc3RfcHJvY2Vzc29yX3VuaXR0ZXN0LmggYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc29ycy9wb3N0X3Byb2Nlc3Nvcl91bml0dGVzdC5oCnNpbWlsYXJpdHkgaW5kZXggOTQlCnJlbmFtZSBmcm9tIGNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvcG9zdF9wcm9jZXNzb3JzL3Bvc3RfcHJvY2Vzc29yX3VuaXR0ZXN0LmgKcmVuYW1lIHRvIGNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvcG9zdF9wcm9jZXNzb3JzL3Bvc3RfcHJvY2Vzc29yX3VuaXR0ZXN0LmgKaW5kZXggNmQ5YTg0ZDMuLjg1ZWQ3YjYgMTAwNjQ0Ci0tLSBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvcG9zdF9wcm9jZXNzb3JzL3Bvc3RfcHJvY2Vzc29yX3VuaXR0ZXN0LmgKKysrIGIvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9wb3N0X3Byb2Nlc3NvcnMvcG9zdF9wcm9jZXNzb3JfdW5pdHRlc3QuaApAQCAtMiw5ICsyLDEwIEBACiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCi0jaWZuZGVmIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfUE9TVF9QUk9DRVNTT1JTX1BPU1RfUFJPQ0VTU09SX1VOSVRURVNUX0hfCi0jZGVmaW5lIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfUE9TVF9QUk9DRVNTT1JTX1BPU1RfUFJPQ0VTU09SX1VOSVRURVNUX0hfCisjaWZuZGVmIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfTUlYRVJfUE9TVF9QUk9DRVNTT1JTX1BPU1RfUFJPQ0VTU09SX1VOSVRURVNUX0hfCisjZGVmaW5lIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfTUlYRVJfUE9TVF9QUk9DRVNTT1JTX1BPU1RfUFJPQ0VTU09SX1VOSVRURVNUX0hfCiAKKyNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9iYXNlL2FsaWduZWRfYnVmZmVyLmgiCkBAIC0xMjksNCArMTMwLDQgQEAKIH0gIC8vIG5hbWVzcGFjZSBtZWRpYQogfSAgLy8gbmFtZXNwYWNlIGNocm9tZWNhc3QKIAotI2VuZGlmICAvLyBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX1BPU1RfUFJPQ0VTU09SU19QT1NUX1BST0NFU1NPUl9VTklUVEVTVF9IXworI2VuZGlmICAvLyBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX01JWEVSX1BPU1RfUFJPQ0VTU09SU19QT1NUX1BST0NFU1NPUl9VTklUVEVTVF9IXwpkaWZmIC0tZ2l0IGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9wb3N0X3Byb2Nlc3NvcnMvcG9zdF9wcm9jZXNzb3Jfd3JhcHBlci5jYyBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvcG9zdF9wcm9jZXNzb3JzL3Bvc3RfcHJvY2Vzc29yX3dyYXBwZXIuY2MKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9wb3N0X3Byb2Nlc3NvcnMvcG9zdF9wcm9jZXNzb3Jfd3JhcHBlci5jYwpyZW5hbWUgdG8gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9wb3N0X3Byb2Nlc3NvcnMvcG9zdF9wcm9jZXNzb3Jfd3JhcHBlci5jYwppbmRleCBiNTFkNWEzLi4xZjk0YjU2IDEwMDY0NAotLS0gYS9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3Bvc3RfcHJvY2Vzc29ycy9wb3N0X3Byb2Nlc3Nvcl93cmFwcGVyLmNjCisrKyBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvcG9zdF9wcm9jZXNzb3JzL3Bvc3RfcHJvY2Vzc29yX3dyYXBwZXIuY2MKQEAgLTIsNyArMiw3IEBACiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCi0jaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9wb3N0X3Byb2Nlc3NvcnMvcG9zdF9wcm9jZXNzb3Jfd3JhcHBlci5oIgorI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvcG9zdF9wcm9jZXNzb3JzL3Bvc3RfcHJvY2Vzc29yX3dyYXBwZXIuaCIKIAogI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgogI2luY2x1ZGUgImNocm9tZWNhc3QvcHVibGljL21lZGlhL2F1ZGlvX3Bvc3RfcHJvY2Vzc29yX3NobGliLmgiCmRpZmYgLS1naXQgYS9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3Bvc3RfcHJvY2Vzc29ycy9wb3N0X3Byb2Nlc3Nvcl93cmFwcGVyLmggYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc29ycy9wb3N0X3Byb2Nlc3Nvcl93cmFwcGVyLmgKc2ltaWxhcml0eSBpbmRleCA4NyUKcmVuYW1lIGZyb20gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9wb3N0X3Byb2Nlc3NvcnMvcG9zdF9wcm9jZXNzb3Jfd3JhcHBlci5oCnJlbmFtZSB0byBjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc29ycy9wb3N0X3Byb2Nlc3Nvcl93cmFwcGVyLmgKaW5kZXggYjkwYzY1Yy4uMzkxNGZkNiAxMDA2NDQKLS0tIGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9wb3N0X3Byb2Nlc3NvcnMvcG9zdF9wcm9jZXNzb3Jfd3JhcHBlci5oCisrKyBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvcG9zdF9wcm9jZXNzb3JzL3Bvc3RfcHJvY2Vzc29yX3dyYXBwZXIuaApAQCAtMiw4ICsyLDggQEAKIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLSNpZm5kZWYgQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9QT1NUX1BST0NFU1NPUlNfUE9TVF9QUk9DRVNTT1JfV1JBUFBFUl9IXwotI2RlZmluZSBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX1BPU1RfUFJPQ0VTU09SU19QT1NUX1BST0NFU1NPUl9XUkFQUEVSX0hfCisjaWZuZGVmIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfTUlYRVJfUE9TVF9QUk9DRVNTT1JTX1BPU1RfUFJPQ0VTU09SX1dSQVBQRVJfSF8KKyNkZWZpbmUgQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9NSVhFUl9QT1NUX1BST0NFU1NPUlNfUE9TVF9QUk9DRVNTT1JfV1JBUFBFUl9IXwogCiAvLyBQcm92aWRlcyBhIHdyYXBwZXIgZm9yIEF1ZGlvUG9zdFByb2Nlc3NvciB0byBhbGxvdyB1c2luZyBpdCBhcyBhbgogLy8gQXVkaW9Qb3N0UHJvY2Vzc29yMi4gVGhpcyB3b3JrcyBieSBzaW1wbHkgZm93YXJkaW5nIHRoZSBpbnB1dCBidWZmZXIgYXMgdGhlCkBAIC01OCw0ICs1OCw0IEBACiB9ICAvLyBuYW1lc3BhY2UgbWVkaWEKIH0gIC8vIG5hbWVzcGFjZSBjaHJvbWVjYXN0CiAKLSNlbmRpZiAgLy8gQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9QT1NUX1BST0NFU1NPUlNfUE9TVF9QUk9DRVNTT1JfV1JBUFBFUl9IXworI2VuZGlmICAvLyBDSFJPTUVDQVNUX01FRElBX0NNQV9CQUNLRU5EX01JWEVSX1BPU1RfUFJPQ0VTU09SU19QT1NUX1BST0NFU1NPUl9XUkFQUEVSX0hfCmRpZmYgLS1naXQgYS9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3Bvc3RfcHJvY2Vzc29ycy9zYXR1cmF0ZWRfZ2Fpbi5jYyBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvcG9zdF9wcm9jZXNzb3JzL3NhdHVyYXRlZF9nYWluLmNjCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIGNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvcG9zdF9wcm9jZXNzb3JzL3NhdHVyYXRlZF9nYWluLmNjCnJlbmFtZSB0byBjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc29ycy9zYXR1cmF0ZWRfZ2Fpbi5jYwppbmRleCAwOTExMmFlLi5jOGRhMzQ1IDEwMDY0NAotLS0gYS9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3Bvc3RfcHJvY2Vzc29ycy9zYXR1cmF0ZWRfZ2Fpbi5jYworKysgYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc29ycy9zYXR1cmF0ZWRfZ2Fpbi5jYwpAQCAtMiw3ICsyLDcgQEAKIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLSNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3Bvc3RfcHJvY2Vzc29ycy9zYXR1cmF0ZWRfZ2Fpbi5oIgorI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvcG9zdF9wcm9jZXNzb3JzL3NhdHVyYXRlZF9nYWluLmgiCiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8Y21hdGg+CmRpZmYgLS1naXQgYS9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3Bvc3RfcHJvY2Vzc29ycy9zYXR1cmF0ZWRfZ2Fpbi5oIGIvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9wb3N0X3Byb2Nlc3NvcnMvc2F0dXJhdGVkX2dhaW4uaApzaW1pbGFyaXR5IGluZGV4IDgyJQpyZW5hbWUgZnJvbSBjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3Bvc3RfcHJvY2Vzc29ycy9zYXR1cmF0ZWRfZ2Fpbi5oCnJlbmFtZSB0byBjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc29ycy9zYXR1cmF0ZWRfZ2Fpbi5oCmluZGV4IDNjNjU2ZmYuLjRlOWRkMjAgMTAwNjQ0Ci0tLSBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvcG9zdF9wcm9jZXNzb3JzL3NhdHVyYXRlZF9nYWluLmgKKysrIGIvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9wb3N0X3Byb2Nlc3NvcnMvc2F0dXJhdGVkX2dhaW4uaApAQCAtMiw4ICsyLDggQEAKIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLSNpZm5kZWYgQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9QT1NUX1BST0NFU1NPUlNfU0FUVVJBVEVEX0dBSU5fSF8KLSNkZWZpbmUgQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9QT1NUX1BST0NFU1NPUlNfU0FUVVJBVEVEX0dBSU5fSF8KKyNpZm5kZWYgQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9NSVhFUl9QT1NUX1BST0NFU1NPUlNfU0FUVVJBVEVEX0dBSU5fSF8KKyNkZWZpbmUgQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9NSVhFUl9QT1NUX1BST0NFU1NPUlNfU0FUVVJBVEVEX0dBSU5fSF8KIAogI2luY2x1ZGUgPHN0cmluZz4KIApAQCAtNDEsNCArNDEsNCBAQAogfSAgLy8gbmFtZXNwYWNlIG1lZGlhCiB9ICAvLyBuYW1lc3BhY2UgY2hyb21lY2FzdAogCi0jZW5kaWYgIC8vIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfUE9TVF9QUk9DRVNTT1JTX1NBVFVSQVRFRF9HQUlOX0hfCisjZW5kaWYgIC8vIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfTUlYRVJfUE9TVF9QUk9DRVNTT1JTX1NBVFVSQVRFRF9HQUlOX0hfCmRpZmYgLS1naXQgYS9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3Bvc3RfcHJvY2Vzc29ycy9zYXR1cmF0ZWRfZ2Fpbl91bml0dGVzdC5jYyBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvcG9zdF9wcm9jZXNzb3JzL3NhdHVyYXRlZF9nYWluX3VuaXR0ZXN0LmNjCnNpbWlsYXJpdHkgaW5kZXggOTElCnJlbmFtZSBmcm9tIGNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvcG9zdF9wcm9jZXNzb3JzL3NhdHVyYXRlZF9nYWluX3VuaXR0ZXN0LmNjCnJlbmFtZSB0byBjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc29ycy9zYXR1cmF0ZWRfZ2Fpbl91bml0dGVzdC5jYwppbmRleCA0ODY0ZDU2Yy4uN2Y0MWMzYSAxMDA2NDQKLS0tIGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9wb3N0X3Byb2Nlc3NvcnMvc2F0dXJhdGVkX2dhaW5fdW5pdHRlc3QuY2MKKysrIGIvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9wb3N0X3Byb2Nlc3NvcnMvc2F0dXJhdGVkX2dhaW5fdW5pdHRlc3QuY2MKQEAgLTYsOCArNiw4IEBACiAjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSAiYmFzZS9zdHJpbmdzL3N0cmluZ3ByaW50Zi5oIgotI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvcG9zdF9wcm9jZXNzb3JzL3Bvc3RfcHJvY2Vzc29yX3VuaXR0ZXN0LmgiCi0jaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9wb3N0X3Byb2Nlc3NvcnMvc2F0dXJhdGVkX2dhaW4uaCIKKyNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3Bvc3RfcHJvY2Vzc29ycy9wb3N0X3Byb2Nlc3Nvcl91bml0dGVzdC5oIgorI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvcG9zdF9wcm9jZXNzb3JzL3NhdHVyYXRlZF9nYWluLmgiCiAKIG5hbWVzcGFjZSBjaHJvbWVjYXN0IHsKIG5hbWVzcGFjZSBtZWRpYSB7CkBAIC0xNSw4ICsxNSw3IEBACiAKIG5hbWVzcGFjZSB7CiAKLWNvbnN0IGNoYXIga0NvbmZpZ1RlbXBsYXRlW10gPQotICAgIFIiY29uZmlnKHsiZ2Fpbl9kYiI6ICVmfSljb25maWciOworY29uc3QgY2hhciBrQ29uZmlnVGVtcGxhdGVbXSA9IFIiY29uZmlnKHsiZ2Fpbl9kYiI6ICVmfSljb25maWciOwogCiBzdGQ6OnN0cmluZyBNYWtlQ29uZmlnU3RyaW5nKGZsb2F0IGdhaW5fZGIpIHsKICAgcmV0dXJuIGJhc2U6OlN0cmluZ1ByaW50ZihrQ29uZmlnVGVtcGxhdGUsIGdhaW5fZGIpOwpkaWZmIC0tZ2l0IGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9zdHJlYW1fbWl4ZXIuY2MgYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3N0cmVhbV9taXhlci5jYwpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3N0cmVhbV9taXhlci5jYwpyZW5hbWUgdG8gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9zdHJlYW1fbWl4ZXIuY2MKaW5kZXggZmVlN2Y1NC4uZGE1NDU2YjUgMTAwNjQ0Ci0tLSBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvc3RyZWFtX21peGVyLmNjCisrKyBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvc3RyZWFtX21peGVyLmNjCkBAIC0yLDcgKzIsNyBAQAogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAotI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvc3RyZWFtX21peGVyLmgiCisjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9zdHJlYW1fbWl4ZXIuaCIKIAogI2luY2x1ZGUgPHB0aHJlYWQuaD4KIApAQCAtMjYsMTMgKzI2LDEzIEBACiAjaW5jbHVkZSAiY2hyb21lY2FzdC9iYXNlL3NlcmlhbGl6ZXJzLmgiCiAjaW5jbHVkZSAiY2hyb21lY2FzdC9iYXNlL3RocmVhZF9oZWFsdGhfY2hlY2tlci5oIgogI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvYmFzZS9hdWRpb19kZXZpY2VfaWRzLmgiCi0jaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9hdWRpb19vdXRwdXRfcmVkaXJlY3Rvci5oIgogI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvY2FzdF9hdWRpb19qc29uLmgiCi0jaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9maWx0ZXJfZ3JvdXAuaCIKICNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL2ludGVybGVhdmVkX2NoYW5uZWxfbWl4ZXIuaCIKLSNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyX3NlcnZpY2VfcmVjZWl2ZXIuaCIKLSNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3Bvc3RfcHJvY2Vzc2luZ19waXBlbGluZV9pbXBsLmgiCi0jaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9wb3N0X3Byb2Nlc3NpbmdfcGlwZWxpbmVfcGFyc2VyLmgiCisjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9hdWRpb19vdXRwdXRfcmVkaXJlY3Rvci5oIgorI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvZmlsdGVyX2dyb3VwLmgiCisjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9taXhlcl9zZXJ2aWNlX3JlY2VpdmVyLmgiCisjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9wb3N0X3Byb2Nlc3NpbmdfcGlwZWxpbmVfaW1wbC5oIgorI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvcG9zdF9wcm9jZXNzaW5nX3BpcGVsaW5lX3BhcnNlci5oIgogI2luY2x1ZGUgImNocm9tZWNhc3QvcHVibGljL21lZGlhL21peGVyX291dHB1dF9zdHJlYW0uaCIKICNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19kZXZpY2VfZGVzY3JpcHRpb24uaCIKIApkaWZmIC0tZ2l0IGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9zdHJlYW1fbWl4ZXIuaCBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvc3RyZWFtX21peGVyLmgKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9zdHJlYW1fbWl4ZXIuaApyZW5hbWUgdG8gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9zdHJlYW1fbWl4ZXIuaAppbmRleCA5MTA4OTkzZi4uZDlmN2Q1MjIgMTAwNjQ0Ci0tLSBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvc3RyZWFtX21peGVyLmgKKysrIGIvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9zdHJlYW1fbWl4ZXIuaApAQCAtMiw4ICsyLDggQEAKIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLSNpZm5kZWYgQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9TVFJFQU1fTUlYRVJfSF8KLSNkZWZpbmUgQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9TVFJFQU1fTUlYRVJfSF8KKyNpZm5kZWYgQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9NSVhFUl9TVFJFQU1fTUlYRVJfSF8KKyNkZWZpbmUgQ0hST01FQ0FTVF9NRURJQV9DTUFfQkFDS0VORF9NSVhFUl9TVFJFQU1fTUlYRVJfSF8KIAogI2luY2x1ZGUgPHN0ZGludC5oPgogCkBAIC0yMiwxMCArMjIsMTAgQEAKICNpbmNsdWRlICJiYXNlL3RocmVhZGluZy9zZXF1ZW5jZV9ib3VuZC5oIgogI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZC5oIgogI2luY2x1ZGUgImJhc2UvdGltZS90aW1lLmgiCi0jaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9sb29wYmFja19oYW5kbGVyLmgiCi0jaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlcl9jb250cm9sLmgiCi0jaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlcl9pbnB1dC5oIgotI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXJfcGlwZWxpbmUuaCIKKyNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL2xvb3BiYWNrX2hhbmRsZXIuaCIKKyNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL21peGVyX2NvbnRyb2wuaCIKKyNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL21peGVyX2lucHV0LmgiCisjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9taXhlcl9waXBlbGluZS5oIgogI2luY2x1ZGUgImNocm9tZWNhc3QvcHVibGljL2Nhc3RfbWVkaWFfc2hsaWIuaCIKICNpbmNsdWRlICJjaHJvbWVjYXN0L3B1YmxpYy9tZWRpYS9leHRlcm5hbF9hdWRpb19waXBlbGluZV9zaGxpYi5oIgogI2luY2x1ZGUgImNocm9tZWNhc3QvcHVibGljL21lZGlhL21lZGlhX3BpcGVsaW5lX2JhY2tlbmQuaCIKQEAgLTI0OSw0ICsyNDksNCBAQAogfSAgLy8gbmFtZXNwYWNlIG1lZGlhCiB9ICAvLyBuYW1lc3BhY2UgY2hyb21lY2FzdAogCi0jZW5kaWYgIC8vIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfU1RSRUFNX01JWEVSX0hfCisjZW5kaWYgIC8vIENIUk9NRUNBU1RfTUVESUFfQ01BX0JBQ0tFTkRfTUlYRVJfU1RSRUFNX01JWEVSX0hfCmRpZmYgLS1naXQgYS9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3N0cmVhbV9taXhlcl9leHRlcm5hbF9hdWRpb19waXBlbGluZV91bml0dGVzdC5jYyBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvc3RyZWFtX21peGVyX2V4dGVybmFsX2F1ZGlvX3BpcGVsaW5lX3VuaXR0ZXN0LmNjCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIGNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvc3RyZWFtX21peGVyX2V4dGVybmFsX2F1ZGlvX3BpcGVsaW5lX3VuaXR0ZXN0LmNjCnJlbmFtZSB0byBjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3N0cmVhbV9taXhlcl9leHRlcm5hbF9hdWRpb19waXBlbGluZV91bml0dGVzdC5jYwppbmRleCBjNDZmNTczLi44NWM4MDk5IDEwMDY0NAotLS0gYS9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3N0cmVhbV9taXhlcl9leHRlcm5hbF9hdWRpb19waXBlbGluZV91bml0dGVzdC5jYworKysgYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3N0cmVhbV9taXhlcl9leHRlcm5hbF9hdWRpb19waXBlbGluZV91bml0dGVzdC5jYwpAQCAtMTMsOSArMTMsOSBAQAogI2luY2x1ZGUgImJhc2UvcnVuX2xvb3AuaCIKICNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfdGFza19ydW5uZXJfaGFuZGxlLmgiCiAjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9hdWRpby9mYWtlX2V4dGVybmFsX2F1ZGlvX3BpcGVsaW5lX3N1cHBvcnQuaCIKLSNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21vY2tfbWl4ZXJfc291cmNlLmgiCi0jaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9tb2NrX3Bvc3RfcHJvY2Vzc29yX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3N0cmVhbV9taXhlci5oIgorI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvbW9ja19taXhlcl9zb3VyY2UuaCIKKyNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL21vY2tfcG9zdF9wcm9jZXNzb3JfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvc3RyZWFtX21peGVyLmgiCiAjaW5jbHVkZSAiY2hyb21lY2FzdC9wdWJsaWMvbWVkaWEvZXh0ZXJuYWxfYXVkaW9fcGlwZWxpbmVfc2hsaWIuaCIKICNpbmNsdWRlICJjaHJvbWVjYXN0L3B1YmxpYy9tZWRpYS9taXhlcl9vdXRwdXRfc3RyZWFtLmgiCiAjaW5jbHVkZSAibWVkaWEvYmFzZS9hdWRpb19idXMuaCIKZGlmZiAtLWdpdCBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvc3RyZWFtX21peGVyX3VuaXR0ZXN0LmNjIGIvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9zdHJlYW1fbWl4ZXJfdW5pdHRlc3QuY2MKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9zdHJlYW1fbWl4ZXJfdW5pdHRlc3QuY2MKcmVuYW1lIHRvIGNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvc3RyZWFtX21peGVyX3VuaXR0ZXN0LmNjCmluZGV4IGMzNmQ1NzQuLjIxZDgxNDczIDEwMDY0NAotLS0gYS9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3N0cmVhbV9taXhlcl91bml0dGVzdC5jYworKysgYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL3N0cmVhbV9taXhlcl91bml0dGVzdC5jYwpAQCAtMiw4ICsyLDYgQEAKIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLSNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3N0cmVhbV9taXhlci5oIgotCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPGNtYXRoPgogI2luY2x1ZGUgPGxpbWl0cz4KQEAgLTE4LDExICsxNiwxMiBAQAogI2luY2x1ZGUgImJhc2Uvc3RyaW5ncy9zdHJpbmdwcmludGYuaCIKICNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfdGFza19ydW5uZXJfaGFuZGxlLmgiCiAjaW5jbHVkZSAiYmFzZS92YWx1ZXMuaCIKLSNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL2F1ZGlvX291dHB1dF9yZWRpcmVjdG9yLmgiCi0jaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlcl9pbnB1dC5oIgotI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbW9ja19taXhlcl9zb3VyY2UuaCIKLSNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21vY2tfcG9zdF9wcm9jZXNzb3JfZmFjdG9yeS5oIgotI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbW9ja19yZWRpcmVjdGVkX2F1ZGlvX291dHB1dC5oIgorI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvYXVkaW9fb3V0cHV0X3JlZGlyZWN0b3IuaCIKKyNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL21peGVyL21peGVyX2lucHV0LmgiCisjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9tb2NrX21peGVyX3NvdXJjZS5oIgorI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvbW9ja19wb3N0X3Byb2Nlc3Nvcl9mYWN0b3J5LmgiCisjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9tb2NrX3JlZGlyZWN0ZWRfYXVkaW9fb3V0cHV0LmgiCisjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9taXhlci9zdHJlYW1fbWl4ZXIuaCIKICNpbmNsdWRlICJjaHJvbWVjYXN0L3B1YmxpYy9tZWRpYS9taXhlcl9vdXRwdXRfc3RyZWFtLmgiCiAjaW5jbHVkZSAiY2hyb21lY2FzdC9wdWJsaWMvdm9sdW1lX2NvbnRyb2wuaCIKICNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19kZXZpY2VfZGVzY3JpcHRpb24uaCIKQEAgLTg0NywxMyArODQ2LDI2IEBACiAKICAgY29uc3QgaW50MzJfdCBrTWF4U2FtcGxlID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KCk7CiAgIGNvbnN0IGludDMyX3Qga01pblNhbXBsZSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1pbigpOwotICBjb25zdCBpbnQzMl90IGtFZGdlRGF0YVsyXVs4XSA9IHsKLSAgICAgIHsKLSAgICAgICAgICBrTWluU2FtcGxlLCBrTWluU2FtcGxlLCBrTWluU2FtcGxlLCAwLjAsIDAuMCwga01heFNhbXBsZSwgMC4wLCAwLjAsCi0gICAgICB9LAotICAgICAgewotICAgICAgICAgIGtNaW5TYW1wbGUsIDAuMCwga01heFNhbXBsZSwgMC4wLCBrTWF4U2FtcGxlLCBrTWF4U2FtcGxlLCAwLjAsIDAuMCwKLSAgICAgIH19OworICBjb25zdCBpbnQzMl90IGtFZGdlRGF0YVsyXVs4XSA9IHt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTWluU2FtcGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga01pblNhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtNaW5TYW1wbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTWF4U2FtcGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTWluU2FtcGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga01heFNhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtNYXhTYW1wbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTWF4U2FtcGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTsKIAogICAvLyBIYW5kLWNhbGN1bGF0ZSB0aGUgcmVzdWx0cy4gSW5kZXggMCBpcyBjbGFtcGVkIHRvIC0oMl4zMSkuIEluZGV4IDUgaXMKICAgLy8gY2xhbXBlZCB0byAyXjMxLTEuCkBAIC0xMDg0LDcgKzEwOTYsNyBAQAogICAgICAga0RlbGF5TW9kdWxlU29saWIsICJkZWxheWVyXzIiLCAgLy8gbm9uLXVuaXF1ZSBwcm9jZXNzb3IgbmFtZXMKICAgICAgIGtEZWxheU1vZHVsZVNvbGliLCAiZGVsYXllcl8yIiwKICAgICAgIGtEZWxheU1vZHVsZVNvbGliICAvLyBpbnRlbnRpb25hbGx5IG9taXR0ZWQgcHJvY2Vzc29yIG5hbWUKLSAgICAgICk7CisgICk7CiAKICAgYXV0byBmYWN0b3J5ID0gc3RkOjptYWtlX3VuaXF1ZTxNb2NrUG9zdFByb2Nlc3NvckZhY3Rvcnk+KCk7CiAgIE1vY2tQb3N0UHJvY2Vzc29yRmFjdG9yeSogZmFjdG9yeV9wdHIgPSBmYWN0b3J5LmdldCgpOwpkaWZmIC0tZ2l0IGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC92aWRlby9CVUlMRC5nbiBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvdmlkZW8vQlVJTEQuZ24KaW5kZXggODc5NTQ3NC4uMWEzYTZlMSAxMDA2NDQKLS0tIGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC92aWRlby9CVUlMRC5nbgorKysgYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3ZpZGVvL0JVSUxELmduCkBAIC01NCw3ICs1NCw3IEBACiAgIF0KIAogICBpZiAodXNlX2Fsc2EpIHsKLSAgICBkZXBzICs9IFsgIi8vY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9hbHNhOmNtYV9iYWNrZW5kX3N1cHBvcnQiIF0KKyAgICBkZXBzICs9IFsgIi8vY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9hbHNhOnZvbHVtZV9jb250cm9sIiBdCiAgICAgaWYgKCFpc19jYXN0X2Rlc2t0b3BfYnVpbGQpIHsKICAgICAgIGxpYnMgPSBbICJ2aWRlb2RlY29kZXJmb3JtaXhlciIgXQogICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3ZvbHVtZV9jb250cm9sLmNjIGIvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC92b2x1bWVfY29udHJvbC5jYwppbmRleCA3NDQzNjVhLi5kMzE4OTg0NiAxMDA2NDQKLS0tIGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC92b2x1bWVfY29udHJvbC5jYworKysgYi9jaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3ZvbHVtZV9jb250cm9sLmNjCkBAIC0yNywxMiArMjcsMTAgQEAKICNpbmNsdWRlICJiYXNlL3N5bmNocm9uaXphdGlvbi93YWl0YWJsZV9ldmVudC5oIgogI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZC5oIgogI2luY2x1ZGUgImJhc2UvdmFsdWVzLmgiCi0jaW5jbHVkZSAiY2hyb21lY2FzdC9iYXNlL2luaXRfY29tbWFuZF9saW5lX3NobGliLmgiCiAjaW5jbHVkZSAiY2hyb21lY2FzdC9iYXNlL3NlcmlhbGl6ZXJzLmgiCiAjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9hdWRpb19idWlsZGZsYWdzLmgiCiAjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9jYXN0X2F1ZGlvX2pzb24uaCIKLSNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3Bvc3RfcHJvY2Vzc2luZ19waXBlbGluZV9wYXJzZXIuaCIKLSNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3N0cmVhbV9taXhlci5oIgorI2luY2x1ZGUgImNocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvbWl4ZXIvc3RyZWFtX21peGVyLmgiCiAjaW5jbHVkZSAiY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC9zeXN0ZW1fdm9sdW1lX2NvbnRyb2wuaCIKICNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL3ZvbHVtZV9tYXAuaCIKIApAQCAtNzAsMTEgKzY4LDYgQEAKICAgfQogfQogCi1Wb2x1bWVNYXAmIEdldFZvbHVtZU1hcCgpIHsKLSAgc3RhdGljIGJhc2U6Ok5vRGVzdHJ1Y3RvcjxWb2x1bWVNYXA+IHZvbHVtZV9tYXA7Ci0gIHJldHVybiAqdm9sdW1lX21hcDsKLX0KLQogY2xhc3MgVm9sdW1lQ29udHJvbEludGVybmFsIDogcHVibGljIFN5c3RlbVZvbHVtZUNvbnRyb2w6OkRlbGVnYXRlIHsKICBwdWJsaWM6CiAgIFZvbHVtZUNvbnRyb2xJbnRlcm5hbCgpCkBAIC04Myw3ICs3Niw3IEBACiAgICAgICAgICAgICBiYXNlOjpXYWl0YWJsZUV2ZW50OjpSZXNldFBvbGljeTo6TUFOVUFMLAogICAgICAgICAgICAgYmFzZTo6V2FpdGFibGVFdmVudDo6SW5pdGlhbFN0YXRlOjpOT1RfU0lHTkFMRUQpIHsKICAgICAvLyBMb2FkIHZvbHVtZSBtYXAgdG8gY2hlY2sgdGhhdCB0aGUgY29uZmlnIGZpbGUgaXMgY29ycmVjdC4KLSAgICBHZXRWb2x1bWVNYXAoKTsKKyAgICBWb2x1bWVDb250cm9sOjpWb2x1bWVUb0RiRlMoMC4wZik7CiAKICAgICBzdG9yZWRfdmFsdWVzXy5TZXREb3VibGUoa0tleU1lZGlhRGJGUywga0RlZmF1bHRNZWRpYURiRlMpOwogICAgIHN0b3JlZF92YWx1ZXNfLlNldERvdWJsZShrS2V5QWxhcm1EYkZTLCBrRGVmYXVsdEFsYXJtRGJGUyk7CkBAIC00MDksNyArNDAyLDYgQEAKIAogLy8gc3RhdGljCiB2b2lkIFZvbHVtZUNvbnRyb2w6OkluaXRpYWxpemUoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmd2KSB7Ci0gIGNocm9tZWNhc3Q6OkluaXRDb21tYW5kTGluZVNobGliKGFyZ3YpOwogICBHZXRWb2x1bWVDb250cm9sKCk7CiB9CiAKQEAgLTQ2NCwxNiArNDU2LDYgQEAKIH0KIAogLy8gc3RhdGljCi1mbG9hdCBWb2x1bWVDb250cm9sOjpWb2x1bWVUb0RiRlMoZmxvYXQgdm9sdW1lKSB7Ci0gIHJldHVybiBHZXRWb2x1bWVNYXAoKS5Wb2x1bWVUb0RiRlModm9sdW1lKTsKLX0KLQotLy8gc3RhdGljCi1mbG9hdCBWb2x1bWVDb250cm9sOjpEYkZTVG9Wb2x1bWUoZmxvYXQgZGIpIHsKLSAgcmV0dXJuIEdldFZvbHVtZU1hcCgpLkRiRlNUb1ZvbHVtZShkYik7Ci19Ci0KLS8vIHN0YXRpYwogdm9pZCBWb2x1bWVDb250cm9sOjpTZXRQb3dlclNhdmVNb2RlKGJvb2wgcG93ZXJfc2F2ZV9vbikgewogICBHZXRWb2x1bWVDb250cm9sKCkuU2V0UG93ZXJTYXZlTW9kZShwb3dlcl9zYXZlX29uKTsKIH0KZGlmZiAtLWdpdCBhL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvdm9sdW1lX21hcC5jYyBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvdm9sdW1lX21hcC5jYwppbmRleCA5OTkxZWNiLi5mMjYwNjc2YSAxMDA2NDQKLS0tIGEvY2hyb21lY2FzdC9tZWRpYS9jbWEvYmFja2VuZC92b2x1bWVfbWFwLmNjCisrKyBiL2Nocm9tZWNhc3QvbWVkaWEvY21hL2JhY2tlbmQvdm9sdW1lX21hcC5jYwpAQCAtOCwxOCArOCwyNiBAQAogCiAjaW5jbHVkZSAiYmFzZS9iaW5kLmgiCiAjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCisjaW5jbHVkZSAiYmFzZS9ub19kZXN0cnVjdG9yLmgiCiAjaW5jbHVkZSAiYmFzZS92YWx1ZXMuaCIKICNpbmNsdWRlICJjaHJvbWVjYXN0L21lZGlhL2NtYS9iYWNrZW5kL2Nhc3RfYXVkaW9fanNvbi5oIgorI2luY2x1ZGUgImNocm9tZWNhc3QvcHVibGljL3ZvbHVtZV9jb250cm9sLmgiCiAKIG5hbWVzcGFjZSBjaHJvbWVjYXN0IHsKIG5hbWVzcGFjZSBtZWRpYSB7CiAKIG5hbWVzcGFjZSB7CisKIGNvbnN0ZXhwciBjaGFyIGtLZXlWb2x1bWVNYXBbXSA9ICJ2b2x1bWVfbWFwIjsKIGNvbnN0ZXhwciBjaGFyIGtLZXlMZXZlbFtdID0gImxldmVsIjsKIGNvbnN0ZXhwciBjaGFyIGtLZXlEYltdID0gImRiIjsKIGNvbnN0ZXhwciBmbG9hdCBrTWluRGJGUyA9IC0xMjAuMGY7CiAKK1ZvbHVtZU1hcCYgR2V0Vm9sdW1lTWFwKCkgeworICBzdGF0aWMgYmFzZTo6Tm9EZXN0cnVjdG9yPFZvbHVtZU1hcD4gdm9sdW1lX21hcDsKKyAgcmV0dXJuICp2b2x1bWVfbWFwOworfQorCiB9ICAvLyBuYW1lc3BhY2UKIAogVm9sdW1lTWFwOjpWb2x1bWVNYXAoKQpAQCAtMTMzLDUgKzE0MSwxNSBAQAogICB2b2x1bWVfbWFwXyA9IHN0ZDo6bW92ZShuZXdfbWFwKTsKIH0KIAorLy8gc3RhdGljCitmbG9hdCBWb2x1bWVDb250cm9sOjpWb2x1bWVUb0RiRlMoZmxvYXQgdm9sdW1lKSB7CisgIHJldHVybiBHZXRWb2x1bWVNYXAoKS5Wb2x1bWVUb0RiRlModm9sdW1lKTsKK30KKworLy8gc3RhdGljCitmbG9hdCBWb2x1bWVDb250cm9sOjpEYkZTVG9Wb2x1bWUoZmxvYXQgZGIpIHsKKyAgcmV0dXJuIEdldFZvbHVtZU1hcCgpLkRiRlNUb1ZvbHVtZShkYik7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBtZWRpYQogfSAgLy8gbmFtZXNwYWNlIGNocm9tZWNhc3QKZGlmZiAtLWdpdCBhL2Nocm9tZWNhc3QvbmV0L0JVSUxELmduIGIvY2hyb21lY2FzdC9uZXQvQlVJTEQuZ24KaW5kZXggOTI2YmY0NS4uYzk1ZWQ1NiAxMDA2NDQKLS0tIGEvY2hyb21lY2FzdC9uZXQvQlVJTEQuZ24KKysrIGIvY2hyb21lY2FzdC9uZXQvQlVJTEQuZ24KQEAgLTM0LDYgKzM0LDggQEAKICAgICAiLy9jaHJvbWVjYXN0L3B1YmxpYyIsCiAgICAgIi8vY29tcG9uZW50cy9wcm94eV9jb25maWciLAogICAgICIvL25ldCIsCisgICAgIi8vc2VydmljZXMvbmV0d29yay9wdWJsaWMvY3BwIiwKKyAgICAiLy9zZXJ2aWNlcy9uZXR3b3JrL3B1YmxpYy9tb2pvbSIsCiAgIF0KIAogICBpZiAoaXNfZnVjaHNpYSkgewpkaWZmIC0tZ2l0IGEvY2hyb21lY2FzdC9uZXQvREVQUyBiL2Nocm9tZWNhc3QvbmV0L0RFUFMKaW5kZXggOTBlOTFhNS4uNGFiOTU2MyAxMDA2NDQKLS0tIGEvY2hyb21lY2FzdC9uZXQvREVQUworKysgYi9jaHJvbWVjYXN0L25ldC9ERVBTCkBAIC0xLDQgKzEsNiBAQAogaW5jbHVkZV9ydWxlcyA9IFsKICAgIitjb21wb25lbnRzL3Byb3h5X2NvbmZpZyIsCiAgICIrbmV0IiwKKyAgIitzZXJ2aWNlcy9uZXR3b3JrL3B1YmxpYy9jcHAiLAorICAiK3NlcnZpY2VzL25ldHdvcmsvcHVibGljL21vam9tIiwKIF0KZGlmZiAtLWdpdCBhL2Nocm9tZWNhc3QvbmV0L2Nvbm5lY3Rpdml0eV9jaGVja2VyLmNjIGIvY2hyb21lY2FzdC9uZXQvY29ubmVjdGl2aXR5X2NoZWNrZXIuY2MKaW5kZXggN2M3YTUwYWEuLmI4Mjg1NWEgMTAwNjQ0Ci0tLSBhL2Nocm9tZWNhc3QvbmV0L2Nvbm5lY3Rpdml0eV9jaGVja2VyLmNjCisrKyBiL2Nocm9tZWNhc3QvbmV0L2Nvbm5lY3Rpdml0eV9jaGVja2VyLmNjCkBAIC02LDEzICs2LDE2IEBACiAKICNpbmNsdWRlICJiYXNlL3NpbmdsZV90aHJlYWRfdGFza19ydW5uZXIuaCIKICNpbmNsdWRlICJjaHJvbWVjYXN0L25ldC9jb25uZWN0aXZpdHlfY2hlY2tlcl9pbXBsLmgiCisjaW5jbHVkZSAic2VydmljZXMvbmV0d29yay9wdWJsaWMvY3BwL3NoYXJlZF91cmxfbG9hZGVyX2ZhY3RvcnkuaCIKIAogbmFtZXNwYWNlIGNocm9tZWNhc3QgewogCi1Db25uZWN0aXZpdHlDaGVja2VyOjpDb25uZWN0aXZpdHlDaGVja2VyKCkKLSAgICA6IGNvbm5lY3Rpdml0eV9vYnNlcnZlcl9saXN0XygKLSAgICAgICAgICBuZXcgYmFzZTo6T2JzZXJ2ZXJMaXN0VGhyZWFkU2FmZTxDb25uZWN0aXZpdHlPYnNlcnZlcj4oKSkgewotfQorQ29ubmVjdGl2aXR5Q2hlY2tlcjo6Q29ubmVjdGl2aXR5Q2hlY2tlcigKKyAgICBzY29wZWRfcmVmcHRyPGJhc2U6OlNpbmdsZVRocmVhZFRhc2tSdW5uZXI+IHRhc2tfcnVubmVyKQorICAgIDogUmVmQ291bnRlZERlbGV0ZU9uU2VxdWVuY2Uoc3RkOjptb3ZlKHRhc2tfcnVubmVyKSksCisgICAgICBjb25uZWN0aXZpdHlfb2JzZXJ2ZXJfbGlzdF8oCisgICAgICAgICAgYmFzZTo6TWFrZVJlZkNvdW50ZWQ8CisgICAgICAgICAgICAgIGJhc2U6Ok9ic2VydmVyTGlzdFRocmVhZFNhZmU8Q29ubmVjdGl2aXR5T2JzZXJ2ZXI+PigpKSB7fQogCiBDb25uZWN0aXZpdHlDaGVja2VyOjp+Q29ubmVjdGl2aXR5Q2hlY2tlcigpIHsKIH0KQEAgLTM2LDkgKzM5LDEyIEBACiAvLyBzdGF0aWMKIHNjb3BlZF9yZWZwdHI8Q29ubmVjdGl2aXR5Q2hlY2tlcj4gQ29ubmVjdGl2aXR5Q2hlY2tlcjo6Q3JlYXRlKAogICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8YmFzZTo6U2luZ2xlVGhyZWFkVGFza1J1bm5lcj4mIHRhc2tfcnVubmVyLAotICAgIG5ldDo6VVJMUmVxdWVzdENvbnRleHRHZXR0ZXIqIHVybF9yZXF1ZXN0X2NvbnRleHRfZ2V0dGVyKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPG5ldHdvcms6OlNoYXJlZFVSTExvYWRlckZhY3RvcnlJbmZvPgorICAgICAgICB1cmxfbG9hZGVyX2ZhY3RvcnlfaW5mbywKKyAgICBuZXR3b3JrOjpOZXR3b3JrQ29ubmVjdGlvblRyYWNrZXIqIG5ldHdvcmtfY29ubmVjdGlvbl90cmFja2VyKSB7CiAgIHJldHVybiBDb25uZWN0aXZpdHlDaGVja2VySW1wbDo6Q3JlYXRlKHRhc2tfcnVubmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmxfcmVxdWVzdF9jb250ZXh0X2dldHRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZSh1cmxfbG9hZGVyX2ZhY3RvcnlfaW5mbyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmtfY29ubmVjdGlvbl90cmFja2VyKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGNocm9tZWNhc3QKZGlmZiAtLWdpdCBhL2Nocm9tZWNhc3QvbmV0L2Nvbm5lY3Rpdml0eV9jaGVja2VyLmggYi9jaHJvbWVjYXN0L25ldC9jb25uZWN0aXZpdHlfY2hlY2tlci5oCmluZGV4IDhjNDc3MTAuLjg1YWQ2MDUgMTAwNjQ0Ci0tLSBhL2Nocm9tZWNhc3QvbmV0L2Nvbm5lY3Rpdml0eV9jaGVja2VyLmgKKysrIGIvY2hyb21lY2FzdC9uZXQvY29ubmVjdGl2aXR5X2NoZWNrZXIuaApAQCAtOCwyMiArOCwyNCBAQAogI2luY2x1ZGUgPG1lbW9yeT4KIAogI2luY2x1ZGUgImJhc2UvbWFjcm9zLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZF9kZWxldGVfb25fc2VxdWVuY2UuaCIKICNpbmNsdWRlICJiYXNlL29ic2VydmVyX2xpc3RfdGhyZWFkc2FmZS5oIgorI2luY2x1ZGUgImJhc2Uvc2VxdWVuY2VkX3Rhc2tfcnVubmVyX2hlbHBlcnMuaCIKIAogbmFtZXNwYWNlIGJhc2UgewogY2xhc3MgU2luZ2xlVGhyZWFkVGFza1J1bm5lcjsKIH0KIAotbmFtZXNwYWNlIG5ldCB7Ci1jbGFzcyBVUkxSZXF1ZXN0Q29udGV4dEdldHRlcjsKLX0KK25hbWVzcGFjZSBuZXR3b3JrIHsKK2NsYXNzIFNoYXJlZFVSTExvYWRlckZhY3RvcnlJbmZvOworY2xhc3MgTmV0d29ya0Nvbm5lY3Rpb25UcmFja2VyOworfSAgLy8gbmFtZXNwYWNlIG5ldHdvcmsKIAogbmFtZXNwYWNlIGNocm9tZWNhc3QgewogCiAvLyBDaGVja3MgaWYgaW50ZXJuZXQgY29ubmVjdGl2aXR5IGlzIGF2YWlsYWJsZS4KIGNsYXNzIENvbm5lY3Rpdml0eUNoZWNrZXIKLSAgICA6IHB1YmxpYyBiYXNlOjpSZWZDb3VudGVkVGhyZWFkU2FmZTxDb25uZWN0aXZpdHlDaGVja2VyPiB7CisgICAgOiBwdWJsaWMgYmFzZTo6UmVmQ291bnRlZERlbGV0ZU9uU2VxdWVuY2U8Q29ubmVjdGl2aXR5Q2hlY2tlcj4gewogIHB1YmxpYzoKICAgY2xhc3MgQ29ubmVjdGl2aXR5T2JzZXJ2ZXIgewogICAgcHVibGljOgpAQCAtNDAsOSArNDIsOSBAQAogCiAgIHN0YXRpYyBzY29wZWRfcmVmcHRyPENvbm5lY3Rpdml0eUNoZWNrZXI+IENyZWF0ZSgKICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8YmFzZTo6U2luZ2xlVGhyZWFkVGFza1J1bm5lcj4mIHRhc2tfcnVubmVyLAotICAgICAgbmV0OjpVUkxSZXF1ZXN0Q29udGV4dEdldHRlciogdXJsX3JlcXVlc3RfY29udGV4dF9nZXR0ZXIpOwotCi0gIENvbm5lY3Rpdml0eUNoZWNrZXIoKTsKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxuZXR3b3JrOjpTaGFyZWRVUkxMb2FkZXJGYWN0b3J5SW5mbz4KKyAgICAgICAgICB1cmxfbG9hZGVyX2ZhY3RvcnlfaW5mbywKKyAgICAgIG5ldHdvcms6Ok5ldHdvcmtDb25uZWN0aW9uVHJhY2tlciogbmV0d29ya19jb25uZWN0aW9uX3RyYWNrZXIpOwogCiAgIHZvaWQgQWRkQ29ubmVjdGl2aXR5T2JzZXJ2ZXIoQ29ubmVjdGl2aXR5T2JzZXJ2ZXIqIG9ic2VydmVyKTsKICAgdm9pZCBSZW1vdmVDb25uZWN0aXZpdHlPYnNlcnZlcihDb25uZWN0aXZpdHlPYnNlcnZlciogb2JzZXJ2ZXIpOwpAQCAtNTQsMTMgKzU2LDE2IEBACiAgIHZpcnR1YWwgdm9pZCBDaGVjaygpID0gMDsKIAogIHByb3RlY3RlZDoKKyAgZXhwbGljaXQgQ29ubmVjdGl2aXR5Q2hlY2tlcigKKyAgICAgIHNjb3BlZF9yZWZwdHI8YmFzZTo6U2luZ2xlVGhyZWFkVGFza1J1bm5lcj4gdGFza19ydW5uZXIpOwogICB2aXJ0dWFsIH5Db25uZWN0aXZpdHlDaGVja2VyKCk7CiAKICAgLy8gTm90aWZpZXMgb2JzZXJ2ZXMgdGhhdCBjb25uZWN0aXZpdHkgaGFzIGNoYW5nZWQuCiAgIHZvaWQgTm90aWZ5KGJvb2wgY29ubmVjdGVkKTsKIAogIHByaXZhdGU6Ci0gIGZyaWVuZCBjbGFzcyBiYXNlOjpSZWZDb3VudGVkVGhyZWFkU2FmZTxDb25uZWN0aXZpdHlDaGVja2VyPjsKKyAgZnJpZW5kIGNsYXNzIGJhc2U6OlJlZkNvdW50ZWREZWxldGVPblNlcXVlbmNlPENvbm5lY3Rpdml0eUNoZWNrZXI+OworICBmcmllbmQgY2xhc3MgYmFzZTo6RGVsZXRlSGVscGVyPENvbm5lY3Rpdml0eUNoZWNrZXI+OwogCiAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8YmFzZTo6T2JzZXJ2ZXJMaXN0VGhyZWFkU2FmZTxDb25uZWN0aXZpdHlPYnNlcnZlcj4+CiAgICAgICBjb25uZWN0aXZpdHlfb2JzZXJ2ZXJfbGlzdF87CmRpZmYgLS1naXQgYS9jaHJvbWVjYXN0L25ldC9jb25uZWN0aXZpdHlfY2hlY2tlcl9pbXBsLmNjIGIvY2hyb21lY2FzdC9uZXQvY29ubmVjdGl2aXR5X2NoZWNrZXJfaW1wbC5jYwppbmRleCA3ODY5ZmFlLi4xZTI1ZDA5IDEwMDY0NAotLS0gYS9jaHJvbWVjYXN0L25ldC9jb25uZWN0aXZpdHlfY2hlY2tlcl9pbXBsLmNjCisrKyBiL2Nocm9tZWNhc3QvbmV0L2Nvbm5lY3Rpdml0eV9jaGVja2VyX2ltcGwuY2MKQEAgLTIyLDkgKzIyLDEwIEBACiAjaW5jbHVkZSAibmV0L2h0dHAvaHR0cF9zdGF0dXNfY29kZS5oIgogI2luY2x1ZGUgIm5ldC9odHRwL2h0dHBfdHJhbnNhY3Rpb25fZmFjdG9yeS5oIgogI2luY2x1ZGUgIm5ldC9zb2NrZXQvc3NsX2NsaWVudF9zb2NrZXQuaCIKLSNpbmNsdWRlICJuZXQvdXJsX3JlcXVlc3QvdXJsX3JlcXVlc3RfY29udGV4dC5oIgotI2luY2x1ZGUgIm5ldC91cmxfcmVxdWVzdC91cmxfcmVxdWVzdF9jb250ZXh0X2J1aWxkZXIuaCIKLSNpbmNsdWRlICJuZXQvdXJsX3JlcXVlc3QvdXJsX3JlcXVlc3RfY29udGV4dF9nZXR0ZXIuaCIKKyNpbmNsdWRlICJzZXJ2aWNlcy9uZXR3b3JrL3B1YmxpYy9jcHAvcmVzb3VyY2VfcmVxdWVzdC5oIgorI2luY2x1ZGUgInNlcnZpY2VzL25ldHdvcmsvcHVibGljL2NwcC9zaGFyZWRfdXJsX2xvYWRlcl9mYWN0b3J5LmgiCisjaW5jbHVkZSAic2VydmljZXMvbmV0d29yay9wdWJsaWMvY3BwL3NpbXBsZV91cmxfbG9hZGVyLmgiCisjaW5jbHVkZSAic2VydmljZXMvbmV0d29yay9wdWJsaWMvbW9qb20vbmV0d29ya19jaGFuZ2VfbWFuYWdlci5tb2pvbS5oIgogCiBuYW1lc3BhY2UgY2hyb21lY2FzdCB7CiAKQEAgLTY0LDUwICs2NSw1OSBAQAogLy8gc3RhdGljCiBzY29wZWRfcmVmcHRyPENvbm5lY3Rpdml0eUNoZWNrZXJJbXBsPiBDb25uZWN0aXZpdHlDaGVja2VySW1wbDo6Q3JlYXRlKAogICAgIHNjb3BlZF9yZWZwdHI8YmFzZTo6U2luZ2xlVGhyZWFkVGFza1J1bm5lcj4gdGFza19ydW5uZXIsCi0gICAgbmV0OjpVUkxSZXF1ZXN0Q29udGV4dEdldHRlciogdXJsX3JlcXVlc3RfY29udGV4dF9nZXR0ZXIpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8bmV0d29yazo6U2hhcmVkVVJMTG9hZGVyRmFjdG9yeUluZm8+CisgICAgICAgIHVybF9sb2FkZXJfZmFjdG9yeV9pbmZvLAorICAgIG5ldHdvcms6Ok5ldHdvcmtDb25uZWN0aW9uVHJhY2tlciogbmV0d29ya19jb25uZWN0aW9uX3RyYWNrZXIpIHsKICAgRENIRUNLKHRhc2tfcnVubmVyKTsKIAotICBhdXRvIGNvbm5lY3Rpdml0eV9jaGVja2VyID0KLSAgICAgIGJhc2U6OldyYXBSZWZDb3VudGVkKG5ldyBDb25uZWN0aXZpdHlDaGVja2VySW1wbCh0YXNrX3J1bm5lcikpOworICBhdXRvIGNvbm5lY3Rpdml0eV9jaGVja2VyID0gYmFzZTo6V3JhcFJlZkNvdW50ZWQoCisgICAgICBuZXcgQ29ubmVjdGl2aXR5Q2hlY2tlckltcGwodGFza19ydW5uZXIsIG5ldHdvcmtfY29ubmVjdGlvbl90cmFja2VyKSk7CiAgIHRhc2tfcnVubmVyLT5Qb3N0VGFzaygKICAgICAgIEZST01fSEVSRSwKICAgICAgIGJhc2U6OkJpbmRPbmNlKCZDb25uZWN0aXZpdHlDaGVja2VySW1wbDo6SW5pdGlhbGl6ZSwgY29ubmVjdGl2aXR5X2NoZWNrZXIsCi0gICAgICAgICAgICAgICAgICAgICBiYXNlOjpSZXRhaW5lZFJlZih1cmxfcmVxdWVzdF9jb250ZXh0X2dldHRlcikpKTsKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZSh1cmxfbG9hZGVyX2ZhY3RvcnlfaW5mbykpKTsKICAgcmV0dXJuIGNvbm5lY3Rpdml0eV9jaGVja2VyOwogfQogCiBDb25uZWN0aXZpdHlDaGVja2VySW1wbDo6Q29ubmVjdGl2aXR5Q2hlY2tlckltcGwoCi0gICAgc2NvcGVkX3JlZnB0cjxiYXNlOjpTaW5nbGVUaHJlYWRUYXNrUnVubmVyPiB0YXNrX3J1bm5lcikKLSAgICA6IENvbm5lY3Rpdml0eUNoZWNrZXIoKSwKKyAgICBzY29wZWRfcmVmcHRyPGJhc2U6OlNpbmdsZVRocmVhZFRhc2tSdW5uZXI+IHRhc2tfcnVubmVyLAorICAgIG5ldHdvcms6Ok5ldHdvcmtDb25uZWN0aW9uVHJhY2tlciogbmV0d29ya19jb25uZWN0aW9uX3RyYWNrZXIpCisgICAgOiBDb25uZWN0aXZpdHlDaGVja2VyKHRhc2tfcnVubmVyKSwKICAgICAgIHRhc2tfcnVubmVyXyhzdGQ6Om1vdmUodGFza19ydW5uZXIpKSwKKyAgICAgIG5ldHdvcmtfY29ubmVjdGlvbl90cmFja2VyXyhuZXR3b3JrX2Nvbm5lY3Rpb25fdHJhY2tlciksCiAgICAgICBjb25uZWN0ZWRfKGZhbHNlKSwKLSAgICAgIGNvbm5lY3Rpb25fdHlwZV8obmV0OjpOZXR3b3JrQ2hhbmdlTm90aWZpZXI6OkNPTk5FQ1RJT05fTk9ORSksCisgICAgICBjb25uZWN0aW9uX3R5cGVfKG5ldHdvcms6Om1vam9tOjpDb25uZWN0aW9uVHlwZTo6Q09OTkVDVElPTl9OT05FKSwKICAgICAgIGNoZWNrX2Vycm9yc18oMCksCi0gICAgICBuZXR3b3JrX2NoYW5nZWRfcGVuZGluZ18oZmFsc2UpIHsKLSAgRENIRUNLKHRhc2tfcnVubmVyXy5nZXQoKSk7CisgICAgICBuZXR3b3JrX2NoYW5nZWRfcGVuZGluZ18oZmFsc2UpLAorICAgICAgd2Vha19mYWN0b3J5Xyh0aGlzKSB7CisgIERDSEVDSyh0YXNrX3J1bm5lcl8pOworICBEQ0hFQ0sobmV0d29ya19jb25uZWN0aW9uX3RyYWNrZXJfKTsKKyAgd2Vha190aGlzXyA9IHdlYWtfZmFjdG9yeV8uR2V0V2Vha1B0cigpOwogfQogCiB2b2lkIENvbm5lY3Rpdml0eUNoZWNrZXJJbXBsOjpJbml0aWFsaXplKAotICAgIG5ldDo6VVJMUmVxdWVzdENvbnRleHRHZXR0ZXIqIHVybF9yZXF1ZXN0X2NvbnRleHRfZ2V0dGVyKSB7Ci0gIHVybF9yZXF1ZXN0X2NvbnRleHRfZ2V0dGVyXyA9IHVybF9yZXF1ZXN0X2NvbnRleHRfZ2V0dGVyOworICAgIHN0ZDo6dW5pcXVlX3B0cjxuZXR3b3JrOjpTaGFyZWRVUkxMb2FkZXJGYWN0b3J5SW5mbz4KKyAgICAgICAgdXJsX2xvYWRlcl9mYWN0b3J5X2luZm8pIHsKICAgRENIRUNLKHRhc2tfcnVubmVyXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKKyAgRENIRUNLKHVybF9sb2FkZXJfZmFjdG9yeV9pbmZvKTsKKyAgdXJsX2xvYWRlcl9mYWN0b3J5XyA9IG5ldHdvcms6OlNoYXJlZFVSTExvYWRlckZhY3Rvcnk6OkNyZWF0ZSgKKyAgICAgIHN0ZDo6bW92ZSh1cmxfbG9hZGVyX2ZhY3RvcnlfaW5mbykpOworCiAgIGJhc2U6OkNvbW1hbmRMaW5lKiBjb21tYW5kX2xpbmUgPSBiYXNlOjpDb21tYW5kTGluZTo6Rm9yQ3VycmVudFByb2Nlc3MoKTsKICAgYmFzZTo6Q29tbWFuZExpbmU6OlN0cmluZ1R5cGUgY2hlY2tfdXJsX3N0ciA9CiAgICAgICBjb21tYW5kX2xpbmUtPkdldFN3aXRjaFZhbHVlTmF0aXZlKHN3aXRjaGVzOjprQ29ubmVjdGl2aXR5Q2hlY2tVcmwpOwogICBjb25uZWN0aXZpdHlfY2hlY2tfdXJsXy5yZXNldChuZXcgR1VSTCgKICAgICAgIGNoZWNrX3VybF9zdHIuZW1wdHkoKSA/IGtEZWZhdWx0Q29ubmVjdGl2aXR5Q2hlY2tVcmwgOiBjaGVja191cmxfc3RyKSk7CiAKLSAgdXJsX3JlcXVlc3RfY29udGV4dF8gPSB1cmxfcmVxdWVzdF9jb250ZXh0X2dldHRlci0+R2V0VVJMUmVxdWVzdENvbnRleHQoKTsKKyAgbmV0d29ya19jb25uZWN0aW9uX3RyYWNrZXJfLT5BZGROZXR3b3JrQ29ubmVjdGlvbk9ic2VydmVyKHRoaXMpOwogCi0gIG5ldDo6TmV0d29ya0NoYW5nZU5vdGlmaWVyOjpBZGROZXR3b3JrQ2hhbmdlT2JzZXJ2ZXIodGhpcyk7Ci0gIHRhc2tfcnVubmVyXy0+UG9zdFRhc2soRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmRPbmNlKCZDb25uZWN0aXZpdHlDaGVja2VySW1wbDo6Q2hlY2ssIHRoaXMpKTsKKyAgQ2hlY2soKTsKIH0KIAogQ29ubmVjdGl2aXR5Q2hlY2tlckltcGw6On5Db25uZWN0aXZpdHlDaGVja2VySW1wbCgpIHsKLSAgRENIRUNLKHRhc2tfcnVubmVyXy5nZXQoKSk7Ci0gIG5ldDo6TmV0d29ya0NoYW5nZU5vdGlmaWVyOjpSZW1vdmVOZXR3b3JrQ2hhbmdlT2JzZXJ2ZXIodGhpcyk7Ci0gIHRhc2tfcnVubmVyXy0+RGVsZXRlU29vbihGUk9NX0hFUkUsIHVybF9yZXF1ZXN0Xy5yZWxlYXNlKCkpOworICBEQ0hFQ0sodGFza19ydW5uZXJfKTsKKyAgRENIRUNLKHRhc2tfcnVubmVyXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKKyAgbmV0d29ya19jb25uZWN0aW9uX3RyYWNrZXJfLT5SZW1vdmVOZXR3b3JrQ29ubmVjdGlvbk9ic2VydmVyKHRoaXMpOwogfQogCiBib29sIENvbm5lY3Rpdml0eUNoZWNrZXJJbXBsOjpDb25uZWN0ZWQoKSBjb25zdCB7CkBAIC0xMTcsMTggKzEyNywxOCBAQAogCiB2b2lkIENvbm5lY3Rpdml0eUNoZWNrZXJJbXBsOjpTZXRDb25uZWN0ZWQoYm9vbCBjb25uZWN0ZWQpIHsKICAgRENIRUNLKHRhc2tfcnVubmVyXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgaWYgKGNvbm5lY3RlZF8gPT0gY29ubmVjdGVkKQotICAgIHJldHVybjsKICAgewogICAgIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhjb25uZWN0ZWRfbG9ja18pOworICAgIGlmIChjb25uZWN0ZWRfID09IGNvbm5lY3RlZCkgeworICAgICAgcmV0dXJuOworICAgIH0KICAgICBjb25uZWN0ZWRfID0gY29ubmVjdGVkOwogICB9CiAKICAgYmFzZTo6Q29tbWFuZExpbmUqIGNvbW1hbmRfbGluZSA9IGJhc2U6OkNvbW1hbmRMaW5lOjpGb3JDdXJyZW50UHJvY2VzcygpOwogICBiYXNlOjpDb21tYW5kTGluZTo6U3RyaW5nVHlwZSBjaGVja191cmxfc3RyID0KICAgICAgIGNvbW1hbmRfbGluZS0+R2V0U3dpdGNoVmFsdWVOYXRpdmUoc3dpdGNoZXM6OmtDb25uZWN0aXZpdHlDaGVja1VybCk7Ci0gIGlmIChjaGVja191cmxfc3RyLmVtcHR5KCkpCi0gIHsKKyAgaWYgKGNoZWNrX3VybF9zdHIuZW1wdHkoKSkgewogICAgIGNvbm5lY3Rpdml0eV9jaGVja191cmxfLnJlc2V0KG5ldyBHVVJMKAogICAgICAgY29ubmVjdGVkID8ga0h0dHBDb25uZWN0aXZpdHlDaGVja1VybCA6IGtEZWZhdWx0Q29ubmVjdGl2aXR5Q2hlY2tVcmwpKTsKICAgICBMT0coSU5GTykgPDwgIkNoYW5nZSBjaGVjayB1cmw9IiA8PCAqY29ubmVjdGl2aXR5X2NoZWNrX3VybF87CkBAIC0xNDAsMzIgKzE1MCw0OCBAQAogCiB2b2lkIENvbm5lY3Rpdml0eUNoZWNrZXJJbXBsOjpDaGVjaygpIHsKICAgdGFza19ydW5uZXJfLT5Qb3N0VGFzaygKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZE9uY2UoJkNvbm5lY3Rpdml0eUNoZWNrZXJJbXBsOjpDaGVja0ludGVybmFsLCB0aGlzKSk7CisgICAgICBGUk9NX0hFUkUsCisgICAgICBiYXNlOjpCaW5kT25jZSgmQ29ubmVjdGl2aXR5Q2hlY2tlckltcGw6OkNoZWNrSW50ZXJuYWwsIHdlYWtfdGhpc18pKTsKIH0KIAogdm9pZCBDb25uZWN0aXZpdHlDaGVja2VySW1wbDo6Q2hlY2tJbnRlcm5hbCgpIHsKICAgRENIRUNLKHRhc2tfcnVubmVyXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgRENIRUNLKHVybF9yZXF1ZXN0X2NvbnRleHRfKTsKKyAgRENIRUNLKHVybF9sb2FkZXJfZmFjdG9yeV8pOwogCiAgIC8vIERvbid0IGNoZWNrIGNvbm5lY3Rpdml0eSBpZiBuZXR3b3JrIGlzIG9mZmxpbmUsIGJlY2F1c2UgSW50ZXJuZXQgY291bGQgYmUKICAgLy8gYWNjZXNzaWJsZSB2aWEgbmV0aWZzIGlnbm9yZWQuCi0gIGlmIChuZXQ6Ok5ldHdvcmtDaGFuZ2VOb3RpZmllcjo6SXNPZmZsaW5lKCkpCisgIGF1dG8gY29ubmVjdGlvbl90eXBlID0gbmV0d29yazo6bW9qb206OkNvbm5lY3Rpb25UeXBlOjpDT05ORUNUSU9OX1VOS05PV047CisgIG5ldHdvcmtfY29ubmVjdGlvbl90cmFja2VyXy0+R2V0Q29ubmVjdGlvblR5cGUoCisgICAgICAmY29ubmVjdGlvbl90eXBlLAorICAgICAgYmFzZTo6QmluZE9uY2UoJkNvbm5lY3Rpdml0eUNoZWNrZXJJbXBsOjpPbkNvbm5lY3Rpb25DaGFuZ2VkLAorICAgICAgICAgICAgICAgICAgICAgd2Vha190aGlzXykpOworICBpZiAoY29ubmVjdGlvbl90eXBlID09IG5ldHdvcms6Om1vam9tOjpDb25uZWN0aW9uVHlwZTo6Q09OTkVDVElPTl9OT05FKSB7CiAgICAgcmV0dXJuOworICB9CiAKLSAgLy8gSWYgdXJsX3JlcXVlc3RfIGlzIG5vbi1udWxsLCB0aGVyZSBpcyBhbHJlYWR5IGEgY2hlY2sgZ29pbmcgb24uIERvbid0CisgIC8vIElmIHVybF9sb2FkZXJfIGlzIG5vbi1udWxsLCB0aGVyZSBpcyBhbHJlYWR5IGEgY2hlY2sgZ29pbmcgb24uIERvbid0CiAgIC8vIHN0YXJ0IGFub3RoZXIuCi0gIGlmICh1cmxfcmVxdWVzdF8uZ2V0KCkpCisgIGlmICh1cmxfbG9hZGVyXykgewogICAgIHJldHVybjsKKyAgfQogCi0gIERWTE9HKDEpIDw8ICJDb25uZWN0aXZpdHkgY2hlY2s6IHVybD0iIDw8ICpjb25uZWN0aXZpdHlfY2hlY2tfdXJsXzsKLSAgdXJsX3JlcXVlc3RfID0gdXJsX3JlcXVlc3RfY29udGV4dF8tPkNyZWF0ZVJlcXVlc3QoCi0gICAgICAqY29ubmVjdGl2aXR5X2NoZWNrX3VybF8sIG5ldDo6TUFYSU1VTV9QUklPUklUWSwgdGhpcywKLSAgICAgIE1JU1NJTkdfVFJBRkZJQ19BTk5PVEFUSU9OKTsKLSAgdXJsX3JlcXVlc3RfLT5zZXRfbWV0aG9kKCJIRUFEIik7Ci0gIHVybF9yZXF1ZXN0Xy0+U3RhcnQoKTsKKyAgVkxPRygxKSA8PCAiQ29ubmVjdGl2aXR5IGNoZWNrOiB1cmw9IiA8PCAqY29ubmVjdGl2aXR5X2NoZWNrX3VybF87CisgIGF1dG8gcmVzb3VyY2VfcmVxdWVzdCA9IHN0ZDo6bWFrZV91bmlxdWU8bmV0d29yazo6UmVzb3VyY2VSZXF1ZXN0PigpOworICByZXNvdXJjZV9yZXF1ZXN0LT51cmwgPSBHVVJMKCpjb25uZWN0aXZpdHlfY2hlY2tfdXJsXyk7CisgIHJlc291cmNlX3JlcXVlc3QtPm1ldGhvZCA9ICJIRUFEIjsKKyAgcmVzb3VyY2VfcmVxdWVzdC0+cHJpb3JpdHkgPSBuZXQ6Ok1BWElNVU1fUFJJT1JJVFk7CisgIC8vIFRvIGVuYWJsZSBzc2xfaW5mbyBpbiB0aGUgcmVzcG9uc2UuCisgIHJlc291cmNlX3JlcXVlc3QtPnJlcG9ydF9yYXdfaGVhZGVycyA9IHRydWU7CiAKLSAgdGltZW91dF8uUmVzZXQoYmFzZTo6QmluZCgmQ29ubmVjdGl2aXR5Q2hlY2tlckltcGw6Ok9uVXJsUmVxdWVzdFRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcykpOworICB1cmxfbG9hZGVyXyA9IG5ldHdvcms6OlNpbXBsZVVSTExvYWRlcjo6Q3JlYXRlKHN0ZDo6bW92ZShyZXNvdXJjZV9yZXF1ZXN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSVNTSU5HX1RSQUZGSUNfQU5OT1RBVElPTik7CisgIG5ldHdvcms6OlNpbXBsZVVSTExvYWRlcjo6SGVhZGVyc09ubHlDYWxsYmFjayBjYWxsYmFjayA9IGJhc2U6OkJpbmRPbmNlKAorICAgICAgJkNvbm5lY3Rpdml0eUNoZWNrZXJJbXBsOjpPbkNvbm5lY3Rpdml0eUNoZWNrQ29tcGxldGUsIHdlYWtfdGhpc18pOworICB1cmxfbG9hZGVyXy0+RG93bmxvYWRIZWFkZXJzT25seSh1cmxfbG9hZGVyX2ZhY3RvcnlfLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoY2FsbGJhY2spKTsKKworICB0aW1lb3V0Xy5SZXNldCgKKyAgICAgIGJhc2U6OkJpbmQoJkNvbm5lY3Rpdml0eUNoZWNrZXJJbXBsOjpPblVybFJlcXVlc3RUaW1lb3V0LCB3ZWFrX3RoaXNfKSk7CiAgIC8vIEV4cG9uZW50aWFsIGJhY2tvZmYgZm9yIHRpbWVvdXQgaW4gMywgNiBhbmQgMTIgc2VjLgogICBjb25zdCBpbnQgdGltZW91dCA9IGtSZXF1ZXN0VGltZW91dEluU2Vjb25kcwogICAgICAgICAgICAgICAgICAgICAgIDw8IChjaGVja19lcnJvcnNfID4gMiA/IDIgOiBjaGVja19lcnJvcnNfKTsKQEAgLTE3Myw5ICsxOTksOSBAQAogICAgICAgRlJPTV9IRVJFLCB0aW1lb3V0Xy5jYWxsYmFjaygpLCBiYXNlOjpUaW1lRGVsdGE6OkZyb21TZWNvbmRzKHRpbWVvdXQpKTsKIH0KIAotdm9pZCBDb25uZWN0aXZpdHlDaGVja2VySW1wbDo6T25OZXR3b3JrQ2hhbmdlZCgKLSAgICBuZXQ6Ok5ldHdvcmtDaGFuZ2VOb3RpZmllcjo6Q29ubmVjdGlvblR5cGUgdHlwZSkgewotICBEVkxPRygyKSA8PCAiT25OZXR3b3JrQ2hhbmdlZCAiIDw8IHR5cGU7Cit2b2lkIENvbm5lY3Rpdml0eUNoZWNrZXJJbXBsOjpPbkNvbm5lY3Rpb25DaGFuZ2VkKAorICAgIG5ldHdvcms6Om1vam9tOjpDb25uZWN0aW9uVHlwZSB0eXBlKSB7CisgIERWTE9HKDIpIDw8ICJPbkNvbm5lY3Rpb25DaGFuZ2VkICIgPDwgdHlwZTsKICAgY29ubmVjdGlvbl90eXBlXyA9IHR5cGU7CiAKICAgaWYgKG5ldHdvcmtfY2hhbmdlZF9wZW5kaW5nXykKQEAgLTE4MywxNSArMjA5LDE2IEBACiAgIG5ldHdvcmtfY2hhbmdlZF9wZW5kaW5nXyA9IHRydWU7CiAgIGJhc2U6OlRocmVhZFRhc2tSdW5uZXJIYW5kbGU6OkdldCgpLT5Qb3N0RGVsYXllZFRhc2soCiAgICAgICBGUk9NX0hFUkUsCi0gICAgICBiYXNlOjpCaW5kT25jZSgmQ29ubmVjdGl2aXR5Q2hlY2tlckltcGw6Ok9uTmV0d29ya0NoYW5nZWRJbnRlcm5hbCwgdGhpcyksCisgICAgICBiYXNlOjpCaW5kT25jZSgmQ29ubmVjdGl2aXR5Q2hlY2tlckltcGw6Ok9uQ29ubmVjdGlvbkNoYW5nZWRJbnRlcm5hbCwKKyAgICAgICAgICAgICAgICAgICAgIHdlYWtfdGhpc18pLAogICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kcyhrTmV0d29ya0NoYW5nZWREZWxheUluU2Vjb25kcykpOwogfQogCi12b2lkIENvbm5lY3Rpdml0eUNoZWNrZXJJbXBsOjpPbk5ldHdvcmtDaGFuZ2VkSW50ZXJuYWwoKSB7Cit2b2lkIENvbm5lY3Rpdml0eUNoZWNrZXJJbXBsOjpPbkNvbm5lY3Rpb25DaGFuZ2VkSW50ZXJuYWwoKSB7CiAgIG5ldHdvcmtfY2hhbmdlZF9wZW5kaW5nXyA9IGZhbHNlOwogICBDYW5jZWwoKTsKIAotICBpZiAoY29ubmVjdGlvbl90eXBlXyA9PSBuZXQ6Ok5ldHdvcmtDaGFuZ2VOb3RpZmllcjo6Q09OTkVDVElPTl9OT05FKSB7CisgIGlmIChjb25uZWN0aW9uX3R5cGVfID09IG5ldHdvcms6Om1vam9tOjpDb25uZWN0aW9uVHlwZTo6Q09OTkVDVElPTl9OT05FKSB7CiAgICAgU2V0Q29ubmVjdGVkKGZhbHNlKTsKICAgICByZXR1cm47CiAgIH0KQEAgLTE5OSwxOCArMjI2LDI1IEBACiAgIENoZWNrKCk7CiB9CiAKLXZvaWQgQ29ubmVjdGl2aXR5Q2hlY2tlckltcGw6Ok9uUmVzcG9uc2VTdGFydGVkKG5ldDo6VVJMUmVxdWVzdCogcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXRfZXJyb3IpIHsKK3ZvaWQgQ29ubmVjdGl2aXR5Q2hlY2tlckltcGw6Ok9uQ29ubmVjdGl2aXR5Q2hlY2tDb21wbGV0ZSgKKyAgICBzY29wZWRfcmVmcHRyPG5ldDo6SHR0cFJlc3BvbnNlSGVhZGVycz4gaGVhZGVycykgewogICBEQ0hFQ0sodGFza19ydW5uZXJfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBpbnQgaHR0cF9yZXNwb25zZV9jb2RlID0KLSAgICAgIChuZXRfZXJyb3IgPT0gbmV0OjpPSyAmJgotICAgICAgIHJlcXVlc3QtPnJlc3BvbnNlX2luZm8oKS5oZWFkZXJzLmdldCgpICE9IG51bGxwdHIpCi0gICAgICAgICAgPyByZXF1ZXN0LT5yZXNwb25zZV9pbmZvKCkuaGVhZGVycy0+cmVzcG9uc2VfY29kZSgpCi0gICAgICAgICAgOiBuZXQ6OkhUVFBfQkFEX1JFUVVFU1Q7CisgIERDSEVDSyh1cmxfbG9hZGVyXyk7CisgIHRpbWVvdXRfLkNhbmNlbCgpOworICBpbnQgZXJyb3IgPSB1cmxfbG9hZGVyXy0+TmV0RXJyb3IoKTsKKyAgaWYgKGVycm9yID09IG5ldDo6RVJSX0lOU0VDVVJFX1JFU1BPTlNFICYmIHVybF9sb2FkZXJfLT5SZXNwb25zZUluZm8oKSAmJgorICAgICAgdXJsX2xvYWRlcl8tPlJlc3BvbnNlSW5mbygpLT5zc2xfaW5mbykgeworICAgIExPRyhFUlJPUikgPDwgIk9uU1NMQ2VydGlmaWNhdGVFcnJvcjogY2VydF9zdGF0dXM9IgorICAgICAgICAgICAgICAgPDwgdXJsX2xvYWRlcl8tPlJlc3BvbnNlSW5mbygpLT5zc2xfaW5mby0+Y2VydF9zdGF0dXM7CisgICAgT25VcmxSZXF1ZXN0RXJyb3IoRXJyb3JUeXBlOjpTU0xfQ0VSVElGSUNBVEVfRVJST1IpOworICAgIHJldHVybjsKKyAgfQorICBpbnQgaHR0cF9yZXNwb25zZV9jb2RlID0gKGVycm9yID09IG5ldDo6T0sgJiYgaGVhZGVycykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGhlYWRlcnMtPnJlc3BvbnNlX2NvZGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV0OjpIVFRQX0JBRF9SRVFVRVNUOwogCiAgIC8vIENsZWFycyByZXNvdXJjZXMuCi0gIC8vIFVSTFJlcXVlc3Q6OkNhbmNlbCgpIGlzIGNhbGxlZCBpbiBkZXN0cnVjdG9yLgotICB1cmxfcmVxdWVzdF8ucmVzZXQobnVsbHB0cik7CisgIHVybF9sb2FkZXJfLnJlc2V0KG51bGxwdHIpOwogCiAgIGlmIChodHRwX3Jlc3BvbnNlX2NvZGUgPCA0MDApIHsKICAgICBEVkxPRygxKSA8PCAiQ29ubmVjdGl2aXR5IGNoZWNrIHN1Y2NlZWRlZCI7CkBAIC0yMjAsMzMgKzI1NCwxMiBAQAogICAgIC8vIHJlcXVlc3RzLiBTY2hlZHVsZSBhbm90aGVyIGNoZWNrIHRvIGVuc3VyZSBjb25uZWN0aXZpdHkgaGFzbid0IGRyb3BwZWQuCiAgICAgdGFza19ydW5uZXJfLT5Qb3N0RGVsYXllZFRhc2soCiAgICAgICAgIEZST01fSEVSRSwKLSAgICAgICAgYmFzZTo6QmluZE9uY2UoJkNvbm5lY3Rpdml0eUNoZWNrZXJJbXBsOjpDaGVja0ludGVybmFsLCB0aGlzKSwKKyAgICAgICAgYmFzZTo6QmluZE9uY2UoJkNvbm5lY3Rpdml0eUNoZWNrZXJJbXBsOjpDaGVja0ludGVybmFsLCB3ZWFrX3RoaXNfKSwKICAgICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kcyhrQ29ubmVjdGl2aXR5U3VjY2Vzc1BlcmlvZFNlY29uZHMpKTsKLSAgICB0aW1lb3V0Xy5DYW5jZWwoKTsKICAgICByZXR1cm47CiAgIH0KICAgTE9HKEVSUk9SKSA8PCAiQ29ubmVjdGl2aXR5IGNoZWNrIGZhaWxlZDogIiA8PCBodHRwX3Jlc3BvbnNlX2NvZGU7CiAgIE9uVXJsUmVxdWVzdEVycm9yKEVycm9yVHlwZTo6QkFEX0hUVFBfU1RBVFVTKTsKLSAgdGltZW91dF8uQ2FuY2VsKCk7Ci19Ci0KLXZvaWQgQ29ubmVjdGl2aXR5Q2hlY2tlckltcGw6Ok9uUmVhZENvbXBsZXRlZChuZXQ6OlVSTFJlcXVlc3QqIHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVzX3JlYWQpIHsKLSAgTk9UUkVBQ0hFRCgpOwotfQotCi12b2lkIENvbm5lY3Rpdml0eUNoZWNrZXJJbXBsOjpPblNTTENlcnRpZmljYXRlRXJyb3IoCi0gICAgbmV0OjpVUkxSZXF1ZXN0KiByZXF1ZXN0LAotICAgIGludCBuZXRfZXJyb3IsCi0gICAgY29uc3QgbmV0OjpTU0xJbmZvJiBzc2xfaW5mbywKLSAgICBib29sIGZhdGFsKSB7Ci0gIERDSEVDSyh0YXNrX3J1bm5lcl8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIExPRyhFUlJPUikgPDwgIk9uU1NMQ2VydGlmaWNhdGVFcnJvcjogY2VydF9zdGF0dXM9IiA8PCBzc2xfaW5mby5jZXJ0X3N0YXR1czsKLSAgdXJsX3JlcXVlc3RfY29udGV4dF8tPmh0dHBfdHJhbnNhY3Rpb25fZmFjdG9yeSgpCi0gICAgICAtPkdldFNlc3Npb24oKQotICAgICAgLT5DbGVhclNTTFNlc3Npb25DYWNoZSgpOwotICBPblVybFJlcXVlc3RFcnJvcihFcnJvclR5cGU6OlNTTF9DRVJUSUZJQ0FURV9FUlJPUik7Ci0gIHRpbWVvdXRfLkNhbmNlbCgpOwogfQogCiB2b2lkIENvbm5lY3Rpdml0eUNoZWNrZXJJbXBsOjpPblVybFJlcXVlc3RFcnJvcihFcnJvclR5cGUgdHlwZSkgewpAQCAtMjYyLDEwICsyNzUsMTAgQEAKICAgICBjaGVja19lcnJvcnNfID0ga051bUVycm9yc1RvTm90aWZ5T2ZmbGluZTsKICAgICBTZXRDb25uZWN0ZWQoZmFsc2UpOwogICB9Ci0gIHVybF9yZXF1ZXN0Xy5yZXNldChudWxscHRyKTsKKyAgdXJsX2xvYWRlcl8ucmVzZXQobnVsbHB0cik7CiAgIC8vIENoZWNrIGFnYWluLgogICB0YXNrX3J1bm5lcl8tPlBvc3REZWxheWVkVGFzaygKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZE9uY2UoJkNvbm5lY3Rpdml0eUNoZWNrZXJJbXBsOjpDaGVjaywgdGhpcyksCisgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKCZDb25uZWN0aXZpdHlDaGVja2VySW1wbDo6Q2hlY2ssIHdlYWtfdGhpc18pLAogICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kcyhrQ29ubmVjdGl2aXR5UGVyaW9kU2Vjb25kcykpOwogfQogCkBAIC0yNzcsMTAgKzI5MCwxMCBAQAogCiB2b2lkIENvbm5lY3Rpdml0eUNoZWNrZXJJbXBsOjpDYW5jZWwoKSB7CiAgIERDSEVDSyh0YXNrX3J1bm5lcl8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIGlmICghdXJsX3JlcXVlc3RfLmdldCgpKQorICBpZiAoIXVybF9sb2FkZXJfKQogICAgIHJldHVybjsKLSAgRFZMT0coMikgPDwgIkNhbmNlbCBjb25uZWN0aXZpdHkgY2hlY2sgaW4gcHJvZ3Jlc3MiOwotICB1cmxfcmVxdWVzdF8ucmVzZXQobnVsbHB0cik7ICAvLyBVUkxSZXF1ZXN0OjpDYW5jZWwoKSBpcyBjYWxsZWQgaW4gZGVzdHJ1Y3Rvci4KKyAgVkxPRygyKSA8PCAiQ2FuY2VsIGNvbm5lY3Rpdml0eSBjaGVjayBpbiBwcm9ncmVzcyI7CisgIHVybF9sb2FkZXJfLnJlc2V0KG51bGxwdHIpOwogICB0aW1lb3V0Xy5DYW5jZWwoKTsKIH0KIApkaWZmIC0tZ2l0IGEvY2hyb21lY2FzdC9uZXQvY29ubmVjdGl2aXR5X2NoZWNrZXJfaW1wbC5oIGIvY2hyb21lY2FzdC9uZXQvY29ubmVjdGl2aXR5X2NoZWNrZXJfaW1wbC5oCmluZGV4IDhkNzE4NWUuLjQ0ZmIzY2EgMTAwNjQ0Ci0tLSBhL2Nocm9tZWNhc3QvbmV0L2Nvbm5lY3Rpdml0eV9jaGVja2VyX2ltcGwuaAorKysgYi9jaHJvbWVjYXN0L25ldC9jb25uZWN0aXZpdHlfY2hlY2tlcl9pbXBsLmgKQEAgLTUsMjQgKzUsMjkgQEAKICNpZm5kZWYgQ0hST01FQ0FTVF9ORVRfQ09OTkVDVElWSVRZX0NIRUNLRVJfSU1QTF9IXwogI2RlZmluZSBDSFJPTUVDQVNUX05FVF9DT05ORUNUSVZJVFlfQ0hFQ0tFUl9JTVBMX0hfCiAKKyNpbmNsdWRlIDxtZW1vcnk+CisKICNpbmNsdWRlICJiYXNlL2NhbmNlbGFibGVfY2FsbGJhY2suaCIKICNpbmNsdWRlICJiYXNlL21hY3Jvcy5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9yZWZwdHIuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS93ZWFrX3B0ci5oIgogI2luY2x1ZGUgImNocm9tZWNhc3QvbmV0L2Nvbm5lY3Rpdml0eV9jaGVja2VyLmgiCi0jaW5jbHVkZSAibmV0L2Jhc2UvbmV0d29ya19jaGFuZ2Vfbm90aWZpZXIuaCIKLSNpbmNsdWRlICJuZXQvdXJsX3JlcXVlc3QvdXJsX3JlcXVlc3QuaCIKKyNpbmNsdWRlICJzZXJ2aWNlcy9uZXR3b3JrL3B1YmxpYy9jcHAvbmV0d29ya19jb25uZWN0aW9uX3RyYWNrZXIuaCIKIAogY2xhc3MgR1VSTDsKIAogbmFtZXNwYWNlIGJhc2UgewogY2xhc3MgU2luZ2xlVGhyZWFkVGFza1J1bm5lcjsKLX0KK30gIC8vIG5hbWVzcGFjZSBiYXNlCiAKIG5hbWVzcGFjZSBuZXQgewotY2xhc3MgU1NMSW5mbzsKLWNsYXNzIFVSTFJlcXVlc3Q7Ci1jbGFzcyBVUkxSZXF1ZXN0Q29udGV4dDsKLWNsYXNzIFVSTFJlcXVlc3RDb250ZXh0R2V0dGVyOwotfQorY2xhc3MgSHR0cFJlc3BvbnNlSGVhZGVyczsKK30gIC8vIG5hbWVzcGFjZSBuZXQKKworbmFtZXNwYWNlIG5ldHdvcmsgeworY2xhc3MgU2hhcmVkVVJMTG9hZGVyRmFjdG9yeTsKK2NsYXNzIFNpbXBsZVVSTExvYWRlcjsKK30gIC8vIG5hbWVzcGFjZSBuZXR3b3JrCiAKIG5hbWVzcGFjZSBjaHJvbWVjYXN0IHsKIApAQCAtMzAsMTMgKzM1LDE0IEBACiAvLyB0byBnaXZlbiB1cmwuCiBjbGFzcyBDb25uZWN0aXZpdHlDaGVja2VySW1wbAogICAgIDogcHVibGljIENvbm5lY3Rpdml0eUNoZWNrZXIsCi0gICAgICBwdWJsaWMgbmV0OjpVUkxSZXF1ZXN0OjpEZWxlZ2F0ZSwKLSAgICAgIHB1YmxpYyBuZXQ6Ok5ldHdvcmtDaGFuZ2VOb3RpZmllcjo6TmV0d29ya0NoYW5nZU9ic2VydmVyIHsKKyAgICAgIHB1YmxpYyBuZXR3b3JrOjpOZXR3b3JrQ29ubmVjdGlvblRyYWNrZXI6Ok5ldHdvcmtDb25uZWN0aW9uT2JzZXJ2ZXIgewogIHB1YmxpYzoKICAgLy8gQ29ubmVjdGl2aXR5IGNoZWNraW5nIGFuZCBpbml0aWFsaXphdGlvbiB3aWxsIHJ1biBvbiB0YXNrX3J1bm5lci4KICAgc3RhdGljIHNjb3BlZF9yZWZwdHI8Q29ubmVjdGl2aXR5Q2hlY2tlckltcGw+IENyZWF0ZSgKICAgICAgIHNjb3BlZF9yZWZwdHI8YmFzZTo6U2luZ2xlVGhyZWFkVGFza1J1bm5lcj4gdGFza19ydW5uZXIsCi0gICAgICBuZXQ6OlVSTFJlcXVlc3RDb250ZXh0R2V0dGVyKiB1cmxfcmVxdWVzdF9jb250ZXh0X2dldHRlcik7CisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8bmV0d29yazo6U2hhcmVkVVJMTG9hZGVyRmFjdG9yeUluZm8+CisgICAgICAgICAgdXJsX2xvYWRlcl9mYWN0b3J5X2luZm8sCisgICAgICBuZXR3b3JrOjpOZXR3b3JrQ29ubmVjdGlvblRyYWNrZXIqIG5ldHdvcmtfY29ubmVjdGlvbl90cmFja2VyKTsKIAogICAvLyBDb25uZWN0aXZpdHlDaGVja2VyIGltcGxlbWVudGF0aW9uOgogICBib29sIENvbm5lY3RlZCgpIGNvbnN0IG92ZXJyaWRlOwpAQCAtNDQsMjYgKzUwLDIzIEBACiAKICBwcm90ZWN0ZWQ6CiAgIGV4cGxpY2l0IENvbm5lY3Rpdml0eUNoZWNrZXJJbXBsKAotICAgICAgc2NvcGVkX3JlZnB0cjxiYXNlOjpTaW5nbGVUaHJlYWRUYXNrUnVubmVyPiB0YXNrX3J1bm5lcik7CisgICAgICBzY29wZWRfcmVmcHRyPGJhc2U6OlNpbmdsZVRocmVhZFRhc2tSdW5uZXI+IHRhc2tfcnVubmVyLAorICAgICAgbmV0d29yazo6TmV0d29ya0Nvbm5lY3Rpb25UcmFja2VyKiBuZXR3b3JrX2Nvbm5lY3Rpb25fdHJhY2tlcik7CiAgIH5Db25uZWN0aXZpdHlDaGVja2VySW1wbCgpIG92ZXJyaWRlOwogCiAgcHJpdmF0ZToKLSAgLy8gVXJsUmVxdWVzdDo6RGVsZWdhdGUgaW1wbGVtZW50YXRpb246Ci0gIHZvaWQgT25SZXNwb25zZVN0YXJ0ZWQobmV0OjpVUkxSZXF1ZXN0KiByZXF1ZXN0LCBpbnQgbmV0X2Vycm9yKSBvdmVycmlkZTsKLSAgdm9pZCBPblJlYWRDb21wbGV0ZWQobmV0OjpVUkxSZXF1ZXN0KiByZXF1ZXN0LCBpbnQgYnl0ZXNfcmVhZCkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25TU0xDZXJ0aWZpY2F0ZUVycm9yKG5ldDo6VVJMUmVxdWVzdCogcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5ldF9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0OjpTU0xJbmZvJiBzc2xfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmYXRhbCkgb3ZlcnJpZGU7Ci0KICAgLy8gSW5pdGlhbGl6ZXMgQ29ubmVjdGl2aXR5Q2hlY2tlcgotICB2b2lkIEluaXRpYWxpemUobmV0OjpVUkxSZXF1ZXN0Q29udGV4dEdldHRlciogdXJsX3JlcXVlc3RfY29udGV4dF9nZXR0ZXIpOworICB2b2lkIEluaXRpYWxpemUoc3RkOjp1bmlxdWVfcHRyPG5ldHdvcms6OlNoYXJlZFVSTExvYWRlckZhY3RvcnlJbmZvPgorICAgICAgICAgICAgICAgICAgICAgIHVybF9sb2FkZXJfZmFjdG9yeV9pbmZvKTsKIAotICAvLyBuZXQ6Ok5ldHdvcmtDaGFuZ2VOb3RpZmllcjo6TmV0d29ya0NoYW5nZU9ic2VydmVyIGltcGxlbWVudGF0aW9uOgotICB2b2lkIE9uTmV0d29ya0NoYW5nZWQoCi0gICAgICBuZXQ6Ok5ldHdvcmtDaGFuZ2VOb3RpZmllcjo6Q29ubmVjdGlvblR5cGUgdHlwZSkgb3ZlcnJpZGU7CisgIC8vIG5ldHdvcms6Ok5ldHdvcmtDb25uZWN0aW9uVHJhY2tlcjo6TmV0d29ya0Nvbm5lY3Rpb25PYnNlcnZlcgorICAvLyBpbXBsZW1lbnRhdGlvbjoKKyAgdm9pZCBPbkNvbm5lY3Rpb25DaGFuZ2VkKG5ldHdvcms6Om1vam9tOjpDb25uZWN0aW9uVHlwZSB0eXBlKSBvdmVycmlkZTsKIAotICB2b2lkIE9uTmV0d29ya0NoYW5nZWRJbnRlcm5hbCgpOworICB2b2lkIE9uQ29ubmVjdGlvbkNoYW5nZWRJbnRlcm5hbCgpOworCisgIHZvaWQgT25Db25uZWN0aXZpdHlDaGVja0NvbXBsZXRlKAorICAgICAgc2NvcGVkX3JlZnB0cjxuZXQ6Okh0dHBSZXNwb25zZUhlYWRlcnM+IGhlYWRlcnMpOwogCiAgIC8vIENhbmNlbHMgY3VycmVudCBjb25uZWN0aXZpdHkgY2hlY2tpbmcgaW4gcHJvZ3Jlc3MuCiAgIHZvaWQgQ2FuY2VsKCk7CkBAIC04NiwxNyArODksMTcgQEAKICAgdm9pZCBDaGVja0ludGVybmFsKCk7CiAKICAgc3RkOjp1bmlxdWVfcHRyPEdVUkw+IGNvbm5lY3Rpdml0eV9jaGVja191cmxfOwotICBzY29wZWRfcmVmcHRyPG5ldDo6VVJMUmVxdWVzdENvbnRleHRHZXR0ZXI+IHVybF9yZXF1ZXN0X2NvbnRleHRfZ2V0dGVyXzsKLSAgbmV0OjpVUkxSZXF1ZXN0Q29udGV4dCogdXJsX3JlcXVlc3RfY29udGV4dF87Ci0gIHN0ZDo6dW5pcXVlX3B0cjxuZXQ6OlVSTFJlcXVlc3Q+IHVybF9yZXF1ZXN0XzsKKyAgc2NvcGVkX3JlZnB0cjxuZXR3b3JrOjpTaGFyZWRVUkxMb2FkZXJGYWN0b3J5PiB1cmxfbG9hZGVyX2ZhY3RvcnlfOworICBzdGQ6OnVuaXF1ZV9wdHI8bmV0d29yazo6U2ltcGxlVVJMTG9hZGVyPiB1cmxfbG9hZGVyXzsKICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpTaW5nbGVUaHJlYWRUYXNrUnVubmVyPiB0YXNrX3J1bm5lcl87CisgIG5ldHdvcms6Ok5ldHdvcmtDb25uZWN0aW9uVHJhY2tlciogY29uc3QgbmV0d29ya19jb25uZWN0aW9uX3RyYWNrZXJfOwogCiAgIC8vIGNvbm5lY3RlZF9sb2NrXyBwcm90ZWN0cyBhY2Nlc3MgdG8gY29ubmVjdGVkXyB3aGljaCBpcyBzaGFyZWQgYWNyb3NzCiAgIC8vIHRocmVhZHMuCiAgIG11dGFibGUgYmFzZTo6TG9jayBjb25uZWN0ZWRfbG9ja187CiAgIGJvb2wgY29ubmVjdGVkXzsKIAotICBuZXQ6Ok5ldHdvcmtDaGFuZ2VOb3RpZmllcjo6Q29ubmVjdGlvblR5cGUgY29ubmVjdGlvbl90eXBlXzsKKyAgbmV0d29yazo6bW9qb206OkNvbm5lY3Rpb25UeXBlIGNvbm5lY3Rpb25fdHlwZV87CiAgIC8vIE51bWJlciBvZiBjb25uZWN0aXZpdHkgY2hlY2sgZXJyb3JzLgogICB1bnNpZ25lZCBpbnQgY2hlY2tfZXJyb3JzXzsKICAgYm9vbCBuZXR3b3JrX2NoYW5nZWRfcGVuZGluZ187CkBAIC0xMDUsNiArMTA4LDkgQEAKICAgLy8gY2FsbGVkLgogICBiYXNlOjpDYW5jZWxhYmxlQ2FsbGJhY2s8dm9pZCgpPiB0aW1lb3V0XzsKIAorICBiYXNlOjpXZWFrUHRyPENvbm5lY3Rpdml0eUNoZWNrZXJJbXBsPiB3ZWFrX3RoaXNfOworICBiYXNlOjpXZWFrUHRyRmFjdG9yeTxDb25uZWN0aXZpdHlDaGVja2VySW1wbD4gd2Vha19mYWN0b3J5XzsKKwogICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQ29ubmVjdGl2aXR5Q2hlY2tlckltcGwpOwogfTsKIApkaWZmIC0tZ2l0IGEvY2hyb21lY2FzdC9uZXQvZmFrZV9jb25uZWN0aXZpdHlfY2hlY2tlci5jYyBiL2Nocm9tZWNhc3QvbmV0L2Zha2VfY29ubmVjdGl2aXR5X2NoZWNrZXIuY2MKaW5kZXggZmMzY2FlZC4uY2JlMDUxNCAxMDA2NDQKLS0tIGEvY2hyb21lY2FzdC9uZXQvZmFrZV9jb25uZWN0aXZpdHlfY2hlY2tlci5jYworKysgYi9jaHJvbWVjYXN0L25ldC9mYWtlX2Nvbm5lY3Rpdml0eV9jaGVja2VyLmNjCkBAIC0zLDEzICszLDEzIEBACiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCiAjaW5jbHVkZSAiY2hyb21lY2FzdC9uZXQvZmFrZV9jb25uZWN0aXZpdHlfY2hlY2tlci5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF90YXNrX3J1bm5lcl9oYW5kbGUuaCIKIAogbmFtZXNwYWNlIGNocm9tZWNhc3QgewogCiBGYWtlQ29ubmVjdGl2aXR5Q2hlY2tlcjo6RmFrZUNvbm5lY3Rpdml0eUNoZWNrZXIoKQotICAgIDogQ29ubmVjdGl2aXR5Q2hlY2tlcigpLAotICAgICAgY29ubmVjdGVkXyh0cnVlKSB7Ci19CisgICAgOiBDb25uZWN0aXZpdHlDaGVja2VyKGJhc2U6OlRocmVhZFRhc2tSdW5uZXJIYW5kbGU6OkdldCgpKSwKKyAgICAgIGNvbm5lY3RlZF8odHJ1ZSkge30KIAogRmFrZUNvbm5lY3Rpdml0eUNoZWNrZXI6On5GYWtlQ29ubmVjdGl2aXR5Q2hlY2tlcigpIHt9CiAKZGlmZiAtLWdpdCBhL2Nocm9tZW9zL0NIUk9NRU9TX0xLR00gYi9jaHJvbWVvcy9DSFJPTUVPU19MS0dNCmluZGV4IDBlNWU3ZWEuLjkxZGJmYzIgMTAwNjQ0Ci0tLSBhL2Nocm9tZW9zL0NIUk9NRU9TX0xLR00KKysrIGIvY2hyb21lb3MvQ0hST01FT1NfTEtHTQpAQCAtMSArMSBAQAotMTI1NzkuMC4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorMTI1ODEuMC4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2hyb21lb3MvZGJ1cy9wb3dlci9mYWtlX3Bvd2VyX21hbmFnZXJfY2xpZW50LmNjIGIvY2hyb21lb3MvZGJ1cy9wb3dlci9mYWtlX3Bvd2VyX21hbmFnZXJfY2xpZW50LmNjCmluZGV4IDQ2ZjZmMWEuLjE3ZjE1YzggMTAwNjQ0Ci0tLSBhL2Nocm9tZW9zL2RidXMvcG93ZXIvZmFrZV9wb3dlcl9tYW5hZ2VyX2NsaWVudC5jYworKysgYi9jaHJvbWVvcy9kYnVzL3Bvd2VyL2Zha2VfcG93ZXJfbWFuYWdlcl9jbGllbnQuY2MKQEAgLTI3OSw2ICsyNzksMTAgQEAKICAgLS1udW1fcGVuZGluZ19zdXNwZW5kX3JlYWRpbmVzc19jYWxsYmFja3NfOwogfQogCitib29sIEZha2VQb3dlck1hbmFnZXJDbGllbnQ6OlN1cHBvcnRzQW1iaWVudENvbG9yKCkgeworICByZXR1cm4gc3VwcG9ydHNfYW1iaWVudF9jb2xvcl87Cit9CisKIHZvaWQgRmFrZVBvd2VyTWFuYWdlckNsaWVudDo6Q3JlYXRlQXJjVGltZXJzKAogICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0YWcsCiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGNsb2NraWRfdCwgYmFzZTo6U2NvcGVkRkQ+PiBhcmNfdGltZXJfcmVxdWVzdHMsCmRpZmYgLS1naXQgYS9jaHJvbWVvcy9kYnVzL3Bvd2VyL2Zha2VfcG93ZXJfbWFuYWdlcl9jbGllbnQuaCBiL2Nocm9tZW9zL2RidXMvcG93ZXIvZmFrZV9wb3dlcl9tYW5hZ2VyX2NsaWVudC5oCmluZGV4IDQxOTU0ZjkuLjdlZTgyZDIzIDEwMDY0NAotLS0gYS9jaHJvbWVvcy9kYnVzL3Bvd2VyL2Zha2VfcG93ZXJfbWFuYWdlcl9jbGllbnQuaAorKysgYi9jaHJvbWVvcy9kYnVzL3Bvd2VyL2Zha2VfcG93ZXJfbWFuYWdlcl9jbGllbnQuaApAQCAtMTE4LDYgKzExOCw3IEBACiAgIHZvaWQgQmxvY2tTdXNwZW5kKGNvbnN0IGJhc2U6OlVuZ3Vlc3NhYmxlVG9rZW4mIHRva2VuLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGVidWdfaW5mbykgb3ZlcnJpZGU7CiAgIHZvaWQgVW5ibG9ja1N1c3BlbmQoY29uc3QgYmFzZTo6VW5ndWVzc2FibGVUb2tlbiYgdG9rZW4pIG92ZXJyaWRlOworICBib29sIFN1cHBvcnRzQW1iaWVudENvbG9yKCkgb3ZlcnJpZGU7CiAgIHZvaWQgQ3JlYXRlQXJjVGltZXJzKAogICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRhZywKICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxjbG9ja2lkX3QsIGJhc2U6OlNjb3BlZEZEPj4gYXJjX3RpbWVyX3JlcXVlc3RzLApAQCAtMTkwLDYgKzE5MSwxMCBAQAogICAgIGtleWJvYXJkX2JyaWdodG5lc3NfcGVyY2VudF8gPSBwZXJjZW50OwogICB9CiAKKyAgdm9pZCBzZXRfc3VwcG9ydHNfYW1iaWVudF9jb2xvcihib29sIHN1cHBvcnRzX2FtYmllbnRfY29sb3IpIHsKKyAgICBzdXBwb3J0c19hbWJpZW50X2NvbG9yXyA9IHN1cHBvcnRzX2FtYmllbnRfY29sb3I7CisgIH0KKwogICAvLyBTZXRzIHx0aWNrX2Nsb2NrfCB0byB8dGlja19jbG9ja198LgogICB2b2lkIHNldF90aWNrX2Nsb2NrKGNvbnN0IGJhc2U6OlRpY2tDbG9jayogdGlja19jbG9jaykgewogICAgIHRpY2tfY2xvY2tfID0gdGlja19jbG9jazsKQEAgLTI1NSw2ICsyNjAsMTAgQEAKICAgLy8gZXhwbGljaXRseSBieSBjYWxsaW5nIEFwcGx5UGVuZGluZ1NjcmVlbkJyaWdodG5lc3NDaGFuZ2UoKS4KICAgYm9vbCBlbnF1ZXVlX2JyaWdodG5lc3NfY2hhbmdlc19vbl9iYWNrbGlnaHRzX2ZvcmNlZF9vZmZfID0gZmFsc2U7CiAKKyAgLy8gV2hldGhlciB0aGUgZGV2aWNlIGhhcyBhbiBhbWJpZW50IGNvbG9yIHNlbnNvci4gQ2FuIGJlIHNldCB2aWEKKyAgLy8gU2V0U3VwcG9ydHNBbWJpZW50Q29sb3IoKS4KKyAgYm9vbCBzdXBwb3J0c19hbWJpZW50X2NvbG9yXyA9IGZhbHNlOworCiAgIC8vIFBlbmRpbmcgc2NyZWVuIGJyaWdodG5lc3MgY2hhbmdlcyBjYXVzZWQgYnkgU2V0QmFja2xpZ2h0c0ZvcmNlZE9mZigpLgogICAvLyBBcHBseVBlbmRpbmdTY3JlZW5CcmlnaHRuZXNzQ2hhbmdlKCkgYXBwbGllcyB0aGUgZmlyc3QgcGVuZGluZyBjaGFuZ2UuCiAgIHN0ZDo6cXVldWU8cG93ZXJfbWFuYWdlcjo6QmFja2xpZ2h0QnJpZ2h0bmVzc0NoYW5nZT4KZGlmZiAtLWdpdCBhL2Nocm9tZW9zL2RidXMvcG93ZXIvZmFrZV9wb3dlcl9tYW5hZ2VyX2NsaWVudF91bml0dGVzdC5jYyBiL2Nocm9tZW9zL2RidXMvcG93ZXIvZmFrZV9wb3dlcl9tYW5hZ2VyX2NsaWVudF91bml0dGVzdC5jYwppbmRleCA3OGIyMjcxYS4uNmI1OThkYiAxMDA2NDQKLS0tIGEvY2hyb21lb3MvZGJ1cy9wb3dlci9mYWtlX3Bvd2VyX21hbmFnZXJfY2xpZW50X3VuaXR0ZXN0LmNjCisrKyBiL2Nocm9tZW9zL2RidXMvcG93ZXIvZmFrZV9wb3dlcl9tYW5hZ2VyX2NsaWVudF91bml0dGVzdC5jYwpAQCAtMTM0LDQgKzEzNCwxMyBAQAogICBFWFBFQ1RfRkFMU0UoY2xpZW50Lkhhc09ic2VydmVyKCZ0ZXN0X29ic2VydmVyKSk7CiB9CiAKK1RFU1QoRmFrZVBvd2VyTWFuYWdlckNsaWVudFRlc3QsIEFtYmllbnRDb2xvclN1cHBvcnQpIHsKKyAgRmFrZVBvd2VyTWFuYWdlckNsaWVudCBjbGllbnQ7CisgIEVYUEVDVF9GQUxTRShjbGllbnQuU3VwcG9ydHNBbWJpZW50Q29sb3IoKSk7CisgIGNsaWVudC5zZXRfc3VwcG9ydHNfYW1iaWVudF9jb2xvcih0cnVlKTsKKyAgRVhQRUNUX1RSVUUoY2xpZW50LlN1cHBvcnRzQW1iaWVudENvbG9yKCkpOworICBjbGllbnQuc2V0X3N1cHBvcnRzX2FtYmllbnRfY29sb3IoZmFsc2UpOworICBFWFBFQ1RfRkFMU0UoY2xpZW50LlN1cHBvcnRzQW1iaWVudENvbG9yKCkpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgY2hyb21lb3MKZGlmZiAtLWdpdCBhL2Nocm9tZW9zL2RidXMvcG93ZXIvcG93ZXJfbWFuYWdlcl9jbGllbnQuY2MgYi9jaHJvbWVvcy9kYnVzL3Bvd2VyL3Bvd2VyX21hbmFnZXJfY2xpZW50LmNjCmluZGV4IGZhMjRhYjcxLi4yMTNlNTMxIDEwMDY0NAotLS0gYS9jaHJvbWVvcy9kYnVzL3Bvd2VyL3Bvd2VyX21hbmFnZXJfY2xpZW50LmNjCisrKyBiL2Nocm9tZW9zL2RidXMvcG93ZXIvcG93ZXJfbWFuYWdlcl9jbGllbnQuY2MKQEAgLTIxMSw2ICsyMTEsNyBAQAogCiAgICAgUmVnaXN0ZXJTdXNwZW5kRGVsYXlzKCk7CiAgICAgUmVxdWVzdFN0YXR1c1VwZGF0ZSgpOworICAgIENoZWNrQW1iaWVudENvbG9yU3VwcG9ydCgpOwogICB9CiAKICAgLy8gUG93ZXJNYW5hZ2VyQ2xpZW50IG92ZXJyaWRlczoKQEAgLTQ4MSw2ICs0ODIsMTAgQEAKICAgICBNYXliZVJlcG9ydFN1c3BlbmRSZWFkaW5lc3MoKTsKICAgfQogCisgIGJvb2wgU3VwcG9ydHNBbWJpZW50Q29sb3IoKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIGRldmljZV9zdXBwb3J0c19hbWJpZW50X2NvbG9yXzsKKyAgfQorCiAgIHZvaWQgQ3JlYXRlQXJjVGltZXJzKAogICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRhZywKICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxjbG9ja2lkX3QsIGJhc2U6OlNjb3BlZEZEPj4gYXJjX3RpbWVyX3JlcXVlc3RzLApAQCAtNzQ3LDYgKzc1MiwzMSBAQAogICAgIHN0ZDo6bW92ZShjYWxsYmFjaykuUnVuKHN0YXRlKTsKICAgfQogCisgIHZvaWQgQ2hlY2tBbWJpZW50Q29sb3JTdXBwb3J0KCkgeworICAgIGRidXM6Ok1ldGhvZENhbGwgbWV0aG9kX2NhbGwocG93ZXJfbWFuYWdlcjo6a1Bvd2VyTWFuYWdlckludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvd2VyX21hbmFnZXI6OmtIYXNBbWJpZW50Q29sb3JEZXZpY2VNZXRob2QpOworICAgIHBvd2VyX21hbmFnZXJfcHJveHlfLT5DYWxsTWV0aG9kKAorICAgICAgICAmbWV0aG9kX2NhbGwsIGRidXM6Ok9iamVjdFByb3h5OjpUSU1FT1VUX1VTRV9ERUZBVUxULAorICAgICAgICBiYXNlOjpCaW5kT25jZSgmUG93ZXJNYW5hZ2VyQ2xpZW50SW1wbDo6T25IYXNBbWJpZW50Q29sb3JEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgIHdlYWtfcHRyX2ZhY3RvcnlfLkdldFdlYWtQdHIoKSkpOworICB9CisKKyAgdm9pZCBPbkhhc0FtYmllbnRDb2xvckRldmljZShkYnVzOjpSZXNwb25zZSogcmVzcG9uc2UpIHsKKyAgICBpZiAoIXJlc3BvbnNlKSB7CisgICAgICBkZXZpY2Vfc3VwcG9ydHNfYW1iaWVudF9jb2xvcl8gPSBmYWxzZTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZGJ1czo6TWVzc2FnZVJlYWRlciByZWFkZXIocmVzcG9uc2UpOworICAgIGJvb2wgaXNfc3VwcG9ydGVkID0gZmFsc2U7CisgICAgaWYgKCFyZWFkZXIuUG9wQm9vbCgmaXNfc3VwcG9ydGVkKSkgeworICAgICAgUE9XRVJfTE9HKEVSUk9SKSA8PCAiRXJyb3IgcmVhZGluZyByZXNwb25zZSBmcm9tIHBvd2VyZDogIgorICAgICAgICAgICAgICAgICAgICAgICA8PCByZXNwb25zZS0+VG9TdHJpbmcoKTsKKyAgICAgIGRldmljZV9zdXBwb3J0c19hbWJpZW50X2NvbG9yXyA9IGZhbHNlOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBkZXZpY2Vfc3VwcG9ydHNfYW1iaWVudF9jb2xvcl8gPSBpc19zdXBwb3J0ZWQ7CisgIH0KKwogICB2b2lkIE9uR2V0U3dpdGNoU3RhdGVzKERCdXNNZXRob2RDYWxsYmFjazxTd2l0Y2hTdGF0ZXM+IGNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRidXM6OlJlc3BvbnNlKiByZXNwb25zZSkgewogICAgIGlmICghcmVzcG9uc2UpIHsKQEAgLTExNjIsNiArMTE5MiwxMCBAQAogICAvLyBMYXN0IHN0YXRlIHBhc3NlZCB0byBTZXRJc1Byb2plY3RpbmcoKS4KICAgYm9vbCBsYXN0X2lzX3Byb2plY3RpbmdfID0gZmFsc2U7CiAKKyAgLy8gV2hldGhlciB0aGUgZGV2aWNlIHN1cHBvcnRzIGFtYmllbnQgY29sb3IuIFRoaXMgdmFsdWUgaXMgY2hlY2tlZCB3aGVuIHRoZQorICAvLyBEQlVTIHNlcnZpY2Ugc3RhcnRzIGFuZCBpcyBjYWNoZWQuCisgIGJvb2wgZGV2aWNlX3N1cHBvcnRzX2FtYmllbnRfY29sb3JfID0gZmFsc2U7CisKICAgLy8gVGhlIGxhc3QgcHJvdG8gcmVjZWl2ZWQgZnJvbSBELUJ1czsgaW5pdGlhbGx5IGVtcHR5LgogICBiYXNlOjpPcHRpb25hbDxwb3dlcl9tYW5hZ2VyOjpQb3dlclN1cHBseVByb3BlcnRpZXM+IHByb3RvXzsKIApkaWZmIC0tZ2l0IGEvY2hyb21lb3MvZGJ1cy9wb3dlci9wb3dlcl9tYW5hZ2VyX2NsaWVudC5oIGIvY2hyb21lb3MvZGJ1cy9wb3dlci9wb3dlcl9tYW5hZ2VyX2NsaWVudC5oCmluZGV4IGNmYmIwNzguLjcyYTk1MTI2IDEwMDY0NAotLS0gYS9jaHJvbWVvcy9kYnVzL3Bvd2VyL3Bvd2VyX21hbmFnZXJfY2xpZW50LmgKKysrIGIvY2hyb21lb3MvZGJ1cy9wb3dlci9wb3dlcl9tYW5hZ2VyX2NsaWVudC5oCkBAIC0yOTEsNiArMjkxLDkgQEAKICAgLy8gcmVhZHkgZm9yIGEgc3VzcGVuZC4KICAgdmlydHVhbCB2b2lkIFVuYmxvY2tTdXNwZW5kKGNvbnN0IGJhc2U6OlVuZ3Vlc3NhYmxlVG9rZW4mIHRva2VuKSA9IDA7CiAKKyAgLy8gV2hldGhlciB0aGUgZGV2aWNlIHN1cHBvcnRzIEFtYmllbnQgY29sb3IuCisgIHZpcnR1YWwgYm9vbCBTdXBwb3J0c0FtYmllbnRDb2xvcigpID0gMDsKKwogICAvLyBDcmVhdGVzIHRpbWVycyBjb3JyZXNwb25kaW5nIHRvIGNsb2NrcyBwcmVzZW50IGluIHxhcmNfdGltZXJfcmVxdWVzdHN8LgogICAvLyBTY29wZWRGRHMgYXJlIHVzZWQgdG8gaW5kaWNhdGUgdGltZXIgZXhwaXJhdGlvbiBhcyBkZXNjcmliZWQgaW4KICAgLy8gfFN0YXJ0QXJjVGltZXJ8LiBBeXNuY2hyb25vdXNseSBydW5zIHxjYWxsYmFja3wgd2l0aCB0aGUgY3JlYXRlZCB0aW1lcnMnCmRpZmYgLS1naXQgYS9jaHJvbWVvcy9kYnVzL3Bvd2VyL3Bvd2VyX21hbmFnZXJfY2xpZW50X3VuaXR0ZXN0LmNjIGIvY2hyb21lb3MvZGJ1cy9wb3dlci9wb3dlcl9tYW5hZ2VyX2NsaWVudF91bml0dGVzdC5jYwppbmRleCBiZTk2ZWFmLi43YmMyZTg5IDEwMDY0NAotLS0gYS9jaHJvbWVvcy9kYnVzL3Bvd2VyL3Bvd2VyX21hbmFnZXJfY2xpZW50X3VuaXR0ZXN0LmNjCisrKyBiL2Nocm9tZW9zL2RidXMvcG93ZXIvcG93ZXJfbWFuYWdlcl9jbGllbnRfdW5pdHRlc3QuY2MKQEAgLTI0MSw2ICsyNDEsMTEgQEAKICAgICAgICAgKnByb3h5XywKICAgICAgICAgRG9DYWxsTWV0aG9kKEhhc01lbWJlcihwb3dlcl9tYW5hZ2VyOjprR2V0UG93ZXJTdXBwbHlQcm9wZXJ0aWVzTWV0aG9kKSwKICAgICAgICAgICAgICAgICAgICAgIF8sIF8pKTsKKyAgICAvLyBJbml0IHdpbGwgdGVzdCBmb3IgdGhlIHByZXNlbmNlIG9mIGFuIGFtYmllbnQgbGlnaHQgc2Vuc29yLgorICAgIEVYUEVDVF9DQUxMKAorICAgICAgICAqcHJveHlfLAorICAgICAgICBEb0NhbGxNZXRob2QoSGFzTWVtYmVyKHBvd2VyX21hbmFnZXI6OmtIYXNBbWJpZW50Q29sb3JEZXZpY2VNZXRob2QpLCBfLAorICAgICAgICAgICAgICAgICAgICAgXykpOwogCiAgICAgUG93ZXJNYW5hZ2VyQ2xpZW50OjpJbml0aWFsaXplKGJ1c18uZ2V0KCkpOwogICAgIGNsaWVudF8gPSBQb3dlck1hbmFnZXJDbGllbnQ6OkdldCgpOwpkaWZmIC0tZ2l0IGEvY2hyb21lb3MvZGJ1cy91cHN0YXJ0L2Zha2VfdXBzdGFydF9jbGllbnQuY2MgYi9jaHJvbWVvcy9kYnVzL3Vwc3RhcnQvZmFrZV91cHN0YXJ0X2NsaWVudC5jYwppbmRleCBhOGI1MjRjLi4yMDY1ZTU0IDEwMDY0NAotLS0gYS9jaHJvbWVvcy9kYnVzL3Vwc3RhcnQvZmFrZV91cHN0YXJ0X2NsaWVudC5jYworKysgYi9jaHJvbWVvcy9kYnVzL3Vwc3RhcnQvZmFrZV91cHN0YXJ0X2NsaWVudC5jYwpAQCAtNDAsMTQgKzQwLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHVwc3RhcnRfZW52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9pZERCdXNNZXRob2RDYWxsYmFjayBjYWxsYmFjaykgewogICBiYXNlOjpUaHJlYWRUYXNrUnVubmVySGFuZGxlOjpHZXQoKS0+UG9zdFRhc2soCi0gICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKHN0ZDo6bW92ZShjYWxsYmFjayksIHRydWUpKTsKKyAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZE9uY2Uoc3RkOjptb3ZlKGNhbGxiYWNrKSwgc3RhcnRfam9iX3Jlc3VsdF8pKTsKIH0KIAogdm9pZCBGYWtlVXBzdGFydENsaWVudDo6U3RvcEpvYihjb25zdCBzdGQ6OnN0cmluZyYgam9iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHVwc3RhcnRfZW52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2lkREJ1c01ldGhvZENhbGxiYWNrIGNhbGxiYWNrKSB7CiAgIGJhc2U6OlRocmVhZFRhc2tSdW5uZXJIYW5kbGU6OkdldCgpLT5Qb3N0VGFzaygKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZE9uY2Uoc3RkOjptb3ZlKGNhbGxiYWNrKSwgdHJ1ZSkpOworICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZShzdGQ6Om1vdmUoY2FsbGJhY2spLCBzdG9wX2pvYl9yZXN1bHRfKSk7CiB9CiAKIHZvaWQgRmFrZVVwc3RhcnRDbGllbnQ6OlN0YXJ0QXV0aFBvbGljeVNlcnZpY2UoKSB7CmRpZmYgLS1naXQgYS9jaHJvbWVvcy9kYnVzL3Vwc3RhcnQvZmFrZV91cHN0YXJ0X2NsaWVudC5oIGIvY2hyb21lb3MvZGJ1cy91cHN0YXJ0L2Zha2VfdXBzdGFydF9jbGllbnQuaAppbmRleCA3M2NjOGJkLi5lYjNkN2Y1IDEwMDY0NAotLS0gYS9jaHJvbWVvcy9kYnVzL3Vwc3RhcnQvZmFrZV91cHN0YXJ0X2NsaWVudC5oCisrKyBiL2Nocm9tZW9zL2RidXMvdXBzdGFydC9mYWtlX3Vwc3RhcnRfY2xpZW50LmgKQEAgLTQxLDcgKzQxLDEzIEBACiAgIHZvaWQgU3RhcnRXaWxjb0R0Y1NlcnZpY2UoVm9pZERCdXNNZXRob2RDYWxsYmFjayBjYWxsYmFjaykgb3ZlcnJpZGU7CiAgIHZvaWQgU3RvcFdpbGNvRHRjU2VydmljZShWb2lkREJ1c01ldGhvZENhbGxiYWNrIGNhbGxiYWNrKSBvdmVycmlkZTsKIAorICB2b2lkIHNldF9zdGFydF9qb2JfcmVzdWx0KGJvb2wgcmVzdWx0KSB7IHN0YXJ0X2pvYl9yZXN1bHRfID0gcmVzdWx0OyB9CisgIHZvaWQgc2V0X3N0b3Bfam9iX3Jlc3VsdChib29sIHJlc3VsdCkgeyBzdG9wX2pvYl9yZXN1bHRfID0gcmVzdWx0OyB9CisKICBwcml2YXRlOgorICBib29sIHN0YXJ0X2pvYl9yZXN1bHRfID0gdHJ1ZTsKKyAgYm9vbCBzdG9wX2pvYl9yZXN1bHRfID0gdHJ1ZTsKKwogICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRmFrZVVwc3RhcnRDbGllbnQpOwogfTsKIApkaWZmIC0tZ2l0IGEvY2hyb21lb3MvaW1lL2lucHV0X21ldGhvZHMudHh0IGIvY2hyb21lb3MvaW1lL2lucHV0X21ldGhvZHMudHh0CmluZGV4IDE0OTg5N2UuLjgxODAxZjk1IDEwMDY0NAotLS0gYS9jaHJvbWVvcy9pbWUvaW5wdXRfbWV0aG9kcy50eHQKKysrIGIvY2hyb21lb3MvaW1lL2lucHV0X21ldGhvZHMudHh0CkBAIC04Niw3ICs4Niw3IEBACiB4a2I6Y3o6cXdlcnR5OmN6ZSAgICAgY3oocXdlcnR5KSAgICAgY3MgICAgICAgIENTIGxvZ2luCiB4a2I6ZWU6OmVzdCAgICAgICAgICAgZWUgICAgICAgICAgICAgZXQgICAgICAgIEVFIGxvZ2luCiB4a2I6ZXM6OnNwYSAgICAgICAgICAgZXMgICAgICAgICAgICAgZXMgICAgICAgIEVTIGxvZ2luCi14a2I6ZXM6Y2F0OmNhdCAgICAgICAgZXMoY2F0KSAgICAgICAgY2EgICAgICAgIENBUyBsb2dpbgoreGtiOmVzOmNhdDpjYXQgICAgICAgIGVzKGNhdCkgICAgICAgIGNhICAgICAgICBDQVQgbG9naW4KIHhrYjpkazo6ZGFuICAgICAgICAgICBkayAgICAgICAgICAgICBkYSAgICAgICAgREsgbG9naW4KIHhrYjpmbzo6ZmFvICAgICAgICAgICBmbyAgICAgICAgICAgICBmbyAgICAgICAgRk8KIHhrYjpncjo6Z3JlICAgICAgICAgICBnciAgICAgICAgICAgICBlbCAgICAgICAgR1IKZGlmZiAtLWdpdCBhL2Nocm9tZW9zL3NlcnZpY2VzL2ltZS9pbWVfc2VydmljZV91bml0dGVzdC5jYyBiL2Nocm9tZW9zL3NlcnZpY2VzL2ltZS9pbWVfc2VydmljZV91bml0dGVzdC5jYwppbmRleCA2ZWVmOTk0Mi4uZjgyNjA1MCAxMDA2NDQKLS0tIGEvY2hyb21lb3Mvc2VydmljZXMvaW1lL2ltZV9zZXJ2aWNlX3VuaXR0ZXN0LmNjCisrKyBiL2Nocm9tZW9zL3NlcnZpY2VzL2ltZS9pbWVfc2VydmljZV91bml0dGVzdC5jYwpAQCAtMjksMTEgKzI5LDYgQEAKICAgKnN1Y2Nlc3MgPSByZXN1bHQ7CiB9CiAKLXZvaWQgVGVzdFByb2Nlc3NUZXh0Q2FsbGJhY2soc3RkOjpzdHJpbmcqIHJlc19vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiByZXNwb25zZSkgewotICAqcmVzX291dCA9IHJlc3BvbnNlOwotfQotCiB2b2lkIFRlc3RQcm9jZXNzS2V5cHJlc3NGb3JSdWxlYmFzZWRDYWxsYmFjaygKICAgICBtb2pvbTo6S2V5cHJlc3NSZXNwb25zZUZvclJ1bGViYXNlZCogcmVzX291dCwKICAgICBtb2pvbTo6S2V5cHJlc3NSZXNwb25zZUZvclJ1bGViYXNlZFB0ciByZXNwb25zZSkgewpAQCAtMTE1LDE4MiArMTEwLDYgQEAKICAgRVhQRUNUX0ZBTFNFKHN1Y2Nlc3MpOwogfQogCi1URVNUX0YoSW1lU2VydmljZVRlc3QsIE11bHRpcGxlQ2xpZW50cykgewotICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKLSAgVGVzdENsaWVudENoYW5uZWwgdGVzdF9jaGFubmVsXzE7Ci0gIFRlc3RDbGllbnRDaGFubmVsIHRlc3RfY2hhbm5lbF8yOwotICBtb2pvOjpSZW1vdGU8bW9qb206OklucHV0Q2hhbm5lbD4gcmVtb3RlX2VuZ2luZV8xOwotICBtb2pvOjpSZW1vdGU8bW9qb206OklucHV0Q2hhbm5lbD4gcmVtb3RlX2VuZ2luZV8yOwotCi0gIHJlbW90ZV9tYW5hZ2VyXy0+Q29ubmVjdFRvSW1lRW5naW5lKAotICAgICAgIm0xN246YXIiLCByZW1vdGVfZW5naW5lXzEuQmluZE5ld1BpcGVBbmRQYXNzUmVjZWl2ZXIoKSwKLSAgICAgIHRlc3RfY2hhbm5lbF8xLkNyZWF0ZVBlbmRpbmdSZW1vdGUoKSwgZXh0cmEsCi0gICAgICBiYXNlOjpCaW5kT25jZSgmQ29ubmVjdENhbGxiYWNrLCAmc3VjY2VzcykpOwotICByZW1vdGVfbWFuYWdlcl8uRmx1c2hGb3JUZXN0aW5nKCk7Ci0KLSAgcmVtb3RlX21hbmFnZXJfLT5Db25uZWN0VG9JbWVFbmdpbmUoCi0gICAgICAibTE3bjphciIsIHJlbW90ZV9lbmdpbmVfMi5CaW5kTmV3UGlwZUFuZFBhc3NSZWNlaXZlcigpLAotICAgICAgdGVzdF9jaGFubmVsXzIuQ3JlYXRlUGVuZGluZ1JlbW90ZSgpLCBleHRyYSwKLSAgICAgIGJhc2U6OkJpbmRPbmNlKCZDb25uZWN0Q2FsbGJhY2ssICZzdWNjZXNzKSk7Ci0gIHJlbW90ZV9tYW5hZ2VyXy5GbHVzaEZvclRlc3RpbmcoKTsKLQotICBzdGQ6OnN0cmluZyByZXNwb25zZTsKLSAgc3RkOjpzdHJpbmcgcHJvY2Vzc190ZXh0X2tleSA9Ci0gICAgICAie1wibWV0aG9kXCI6XCJrZXlFdmVudFwiLFwidHlwZVwiOlwia2V5ZG93blwiIgotICAgICAgIixcImNvZGVcIjpcIktleUFcIixcInNoaWZ0XCI6dHJ1ZSxcImFsdGdyXCI6ZmFsc2UsXCJjYXBzXCI6ZmFsc2V9IjsKLSAgcmVtb3RlX2VuZ2luZV8xLT5Qcm9jZXNzVGV4dCgKLSAgICAgIHByb2Nlc3NfdGV4dF9rZXksIGJhc2U6OkJpbmRPbmNlKCZUZXN0UHJvY2Vzc1RleHRDYWxsYmFjaywgJnJlc3BvbnNlKSk7Ci0gIHJlbW90ZV9lbmdpbmVfMS5GbHVzaEZvclRlc3RpbmcoKTsKLQotICByZW1vdGVfZW5naW5lXzItPlByb2Nlc3NUZXh0KAotICAgICAgcHJvY2Vzc190ZXh0X2tleSwgYmFzZTo6QmluZE9uY2UoJlRlc3RQcm9jZXNzVGV4dENhbGxiYWNrLCAmcmVzcG9uc2UpKTsKLSAgcmVtb3RlX2VuZ2luZV8yLkZsdXNoRm9yVGVzdGluZygpOwotCi0gIHN0ZDo6c3RyaW5nIHByb2Nlc3NfdGV4dF9rZXlfY291bnQgPSAie1wibWV0aG9kXCI6XCJjb3VudEtleVwifSI7Ci0gIHJlbW90ZV9lbmdpbmVfMS0+UHJvY2Vzc1RleHQoCi0gICAgICBwcm9jZXNzX3RleHRfa2V5X2NvdW50LAotICAgICAgYmFzZTo6QmluZE9uY2UoJlRlc3RQcm9jZXNzVGV4dENhbGxiYWNrLCAmcmVzcG9uc2UpKTsKLSAgcmVtb3RlX2VuZ2luZV8xLkZsdXNoRm9yVGVzdGluZygpOwotICBFWFBFQ1RfRVEoIjEiLCByZXNwb25zZSk7Ci0KLSAgcmVtb3RlX2VuZ2luZV8yLT5Qcm9jZXNzVGV4dCgKLSAgICAgIHByb2Nlc3NfdGV4dF9rZXlfY291bnQsCi0gICAgICBiYXNlOjpCaW5kT25jZSgmVGVzdFByb2Nlc3NUZXh0Q2FsbGJhY2ssICZyZXNwb25zZSkpOwotICByZW1vdGVfZW5naW5lXzIuRmx1c2hGb3JUZXN0aW5nKCk7Ci0gIEVYUEVDVF9FUSgiMSIsIHJlc3BvbnNlKTsKLX0KLQotLy8gVGVzdHMgdGhhdCB0aGUgcnVsZS1iYXNlZCBBcmFiaWMga2V5Ym9hcmQgY2FuIHdvcmsgY29ycmVjdGx5LgotVEVTVF9GKEltZVNlcnZpY2VUZXN0LCBSdWxlQmFzZWRBcmFiaWMpIHsKLSAgYm9vbCBzdWNjZXNzID0gZmFsc2U7Ci0gIFRlc3RDbGllbnRDaGFubmVsIHRlc3RfY2hhbm5lbDsKLSAgbW9qbzo6UmVtb3RlPG1vam9tOjpJbnB1dENoYW5uZWw+IHJlbW90ZV9lbmdpbmU7Ci0KLSAgcmVtb3RlX21hbmFnZXJfLT5Db25uZWN0VG9JbWVFbmdpbmUoCi0gICAgICAibTE3bjphciIsIHJlbW90ZV9lbmdpbmUuQmluZE5ld1BpcGVBbmRQYXNzUmVjZWl2ZXIoKSwKLSAgICAgIHRlc3RfY2hhbm5lbC5DcmVhdGVQZW5kaW5nUmVtb3RlKCksIGV4dHJhLAotICAgICAgYmFzZTo6QmluZE9uY2UoJkNvbm5lY3RDYWxsYmFjaywgJnN1Y2Nlc3MpKTsKLSAgcmVtb3RlX21hbmFnZXJfLkZsdXNoRm9yVGVzdGluZygpOwotICBFWFBFQ1RfVFJVRShzdWNjZXNzKTsKLQotICAvLyBUZXN0IFNoaWZ0K0tleUEuCi0gIHN0ZDo6c3RyaW5nIHJlc3BvbnNlOwotICByZW1vdGVfZW5naW5lLT5Qcm9jZXNzVGV4dCgKLSAgICAgICJ7XCJtZXRob2RcIjpcImtleUV2ZW50XCIsXCJ0eXBlXCI6XCJrZXlkb3duXCIsXCJjb2RlXCI6XCJLZXlBXCIsIgotICAgICAgIlwic2hpZnRcIjp0cnVlLFwiYWx0Z3JcIjpmYWxzZSxcImNhcHNcIjpmYWxzZX0iLAotICAgICAgYmFzZTo6QmluZE9uY2UoJlRlc3RQcm9jZXNzVGV4dENhbGxiYWNrLCAmcmVzcG9uc2UpKTsKLSAgcmVtb3RlX2VuZ2luZS5GbHVzaEZvclRlc3RpbmcoKTsKLSAgY29uc3Qgd2NoYXJfdCogZXhwZWN0ZWRfcmVzcG9uc2UgPQotICAgICAgTCJ7XCJyZXN1bHRcIjp0cnVlLFwib3BlcmF0aW9uc1wiOlt7XCJtZXRob2RcIjpcImNvbW1pdFRleHRcIiwiCi0gICAgICBMIlwiYXJndW1lbnRzXCI6W1wiXHUwNjUwXCJdfV19IjsKLSAgRVhQRUNUX0VRKGJhc2U6OldpZGVUb1VURjgoZXhwZWN0ZWRfcmVzcG9uc2UpLCByZXNwb25zZSk7Ci0KLSAgLy8gVGVzdCBLZXlCLgotICByZW1vdGVfZW5naW5lLT5Qcm9jZXNzVGV4dCgKLSAgICAgICJ7XCJtZXRob2RcIjpcImtleUV2ZW50XCIsXCJ0eXBlXCI6XCJrZXlkb3duXCIsXCJjb2RlXCI6XCJLZXlCXCIsIgotICAgICAgIlwic2hpZnRcIjpmYWxzZSxcImFsdGdyXCI6ZmFsc2UsXCJjYXBzXCI6ZmFsc2V9IiwKLSAgICAgIGJhc2U6OkJpbmRPbmNlKCZUZXN0UHJvY2Vzc1RleHRDYWxsYmFjaywgJnJlc3BvbnNlKSk7Ci0gIHJlbW90ZV9lbmdpbmUuRmx1c2hGb3JUZXN0aW5nKCk7Ci0gIGV4cGVjdGVkX3Jlc3BvbnNlID0KLSAgICAgIEwie1wicmVzdWx0XCI6dHJ1ZSxcIm9wZXJhdGlvbnNcIjpbe1wibWV0aG9kXCI6XCJjb21taXRUZXh0XCIsIgotICAgICAgTCJcImFyZ3VtZW50c1wiOltcIlx1MDY0NFx1MDYyN1wiXX1dfSI7Ci0gIEVYUEVDVF9FUShiYXNlOjpXaWRlVG9VVEY4KGV4cGVjdGVkX3Jlc3BvbnNlKSwgcmVzcG9uc2UpOwotCi0gIC8vIFRlc3QgdW5oYW5kbGVkIGtleS4KLSAgcmVtb3RlX2VuZ2luZS0+UHJvY2Vzc1RleHQoCi0gICAgICAie1wibWV0aG9kXCI6XCJrZXlFdmVudFwiLFwidHlwZVwiOlwia2V5ZG93blwiLFwiY29kZVwiOlwiRW50ZXJcIiwiCi0gICAgICAiXCJzaGlmdFwiOmZhbHNlLFwiYWx0Z3JcIjpmYWxzZSxcImNhcHNcIjpmYWxzZX0iLAotICAgICAgYmFzZTo6QmluZE9uY2UoJlRlc3RQcm9jZXNzVGV4dENhbGxiYWNrLCAmcmVzcG9uc2UpKTsKLSAgcmVtb3RlX2VuZ2luZS5GbHVzaEZvclRlc3RpbmcoKTsKLSAgRVhQRUNUX0VRKCJ7XCJyZXN1bHRcIjpmYWxzZX0iLCByZXNwb25zZSk7Ci0KLSAgLy8gVGVzdCBrZXl1cC4KLSAgcmVtb3RlX2VuZ2luZS0+UHJvY2Vzc1RleHQoCi0gICAgICAie1wibWV0aG9kXCI6XCJrZXlFdmVudFwiLFwidHlwZVwiOlwia2V5dXBcIixcImNvZGVcIjpcIkVudGVyXCIsIgotICAgICAgIlwic2hpZnRcIjpmYWxzZSxcImFsdGdyXCI6ZmFsc2UsXCJjYXBzXCI6ZmFsc2V9IiwKLSAgICAgIGJhc2U6OkJpbmRPbmNlKCZUZXN0UHJvY2Vzc1RleHRDYWxsYmFjaywgJnJlc3BvbnNlKSk7Ci0gIHJlbW90ZV9lbmdpbmUuRmx1c2hGb3JUZXN0aW5nKCk7Ci0gIEVYUEVDVF9FUSgie1wicmVzdWx0XCI6ZmFsc2V9IiwgcmVzcG9uc2UpOwotCi0gIC8vIFRlc3QgcmVzZXQuCi0gIHJlbW90ZV9lbmdpbmUtPlByb2Nlc3NUZXh0KAotICAgICAgIntcIm1ldGhvZFwiOlwicmVzZXRcIn0iLAotICAgICAgYmFzZTo6QmluZE9uY2UoJlRlc3RQcm9jZXNzVGV4dENhbGxiYWNrLCAmcmVzcG9uc2UpKTsKLSAgcmVtb3RlX2VuZ2luZS5GbHVzaEZvclRlc3RpbmcoKTsKLSAgRVhQRUNUX0VRKCJ7XCJyZXN1bHRcIjp0cnVlfSIsIHJlc3BvbnNlKTsKLQotICAvLyBUZXN0IGludmFsaWQgcmVxdWVzdC4KLSAgcmVtb3RlX2VuZ2luZS0+UHJvY2Vzc1RleHQoCi0gICAgICAie1wibWV0aG9kXCI6XCJrZXlFdmVudFwiLFwidHlwZVwiOlwia2V5ZG93blwifSIsCi0gICAgICBiYXNlOjpCaW5kT25jZSgmVGVzdFByb2Nlc3NUZXh0Q2FsbGJhY2ssICZyZXNwb25zZSkpOwotICByZW1vdGVfZW5naW5lLkZsdXNoRm9yVGVzdGluZygpOwotICBFWFBFQ1RfRVEoIntcInJlc3VsdFwiOmZhbHNlfSIsIHJlc3BvbnNlKTsKLX0KLQotLy8gVGVzdHMgdGhhdCB0aGUgcnVsZS1iYXNlZCBEZXZhUGhvbmUga2V5Ym9hcmQgY2FuIHdvcmsgY29ycmVjdGx5LgotVEVTVF9GKEltZVNlcnZpY2VUZXN0LCBSdWxlQmFzZWREZXZhUGhvbmUpIHsKLSAgYm9vbCBzdWNjZXNzID0gZmFsc2U7Ci0gIFRlc3RDbGllbnRDaGFubmVsIHRlc3RfY2hhbm5lbDsKLSAgbW9qbzo6UmVtb3RlPG1vam9tOjpJbnB1dENoYW5uZWw+IHJlbW90ZV9lbmdpbmU7Ci0KLSAgcmVtb3RlX21hbmFnZXJfLT5Db25uZWN0VG9JbWVFbmdpbmUoCi0gICAgICAibTE3bjpkZXZhX3Bob25lIiwgcmVtb3RlX2VuZ2luZS5CaW5kTmV3UGlwZUFuZFBhc3NSZWNlaXZlcigpLAotICAgICAgdGVzdF9jaGFubmVsLkNyZWF0ZVBlbmRpbmdSZW1vdGUoKSwgZXh0cmEsCi0gICAgICBiYXNlOjpCaW5kT25jZSgmQ29ubmVjdENhbGxiYWNrLCAmc3VjY2VzcykpOwotICByZW1vdGVfbWFuYWdlcl8uRmx1c2hGb3JUZXN0aW5nKCk7Ci0gIEVYUEVDVF9UUlVFKHN1Y2Nlc3MpOwotCi0gIHN0ZDo6c3RyaW5nIHJlc3BvbnNlOwotCi0gIC8vIEtleU4uCi0gIHJlbW90ZV9lbmdpbmUtPlByb2Nlc3NUZXh0KAotICAgICAgIntcIm1ldGhvZFwiOlwia2V5RXZlbnRcIixcInR5cGVcIjpcImtleWRvd25cIixcImNvZGVcIjpcIktleU5cIiwiCi0gICAgICAiXCJzaGlmdFwiOmZhbHNlLFwiYWx0Z3JcIjpmYWxzZSxcImNhcHNcIjpmYWxzZX0iLAotICAgICAgYmFzZTo6QmluZE9uY2UoJlRlc3RQcm9jZXNzVGV4dENhbGxiYWNrLCAmcmVzcG9uc2UpKTsKLSAgcmVtb3RlX2VuZ2luZS5GbHVzaEZvclRlc3RpbmcoKTsKLSAgY29uc3QgY2hhciogZXhwZWN0ZWRfcmVzcG9uc2UgPQotICAgICAgdTgie1wicmVzdWx0XCI6dHJ1ZSxcIm9wZXJhdGlvbnNcIjpbe1wibWV0aG9kXCI6XCJzZXRDb21wb3NpdGlvblwiLCIKLSAgICAgIHU4IlwiYXJndW1lbnRzXCI6W1wiXHUwOTI4XCJdfV19IjsKLSAgRVhQRUNUX0VRKGV4cGVjdGVkX3Jlc3BvbnNlLCByZXNwb25zZSk7Ci0KLSAgLy8gQmFja3NwYWNlLgotICByZW1vdGVfZW5naW5lLT5Qcm9jZXNzVGV4dCgKLSAgICAgICJ7XCJtZXRob2RcIjpcImtleUV2ZW50XCIsXCJ0eXBlXCI6XCJrZXlkb3duXCIsXCJjb2RlXCI6XCJCYWNrc3BhY2VcIiwiCi0gICAgICAiXCJzaGlmdFwiOmZhbHNlLFwiYWx0Z3JcIjpmYWxzZSxcImNhcHNcIjpmYWxzZX0iLAotICAgICAgYmFzZTo6QmluZE9uY2UoJlRlc3RQcm9jZXNzVGV4dENhbGxiYWNrLCAmcmVzcG9uc2UpKTsKLSAgcmVtb3RlX2VuZ2luZS5GbHVzaEZvclRlc3RpbmcoKTsKLSAgZXhwZWN0ZWRfcmVzcG9uc2UgPQotICAgICAgdTgie1wicmVzdWx0XCI6dHJ1ZSxcIm9wZXJhdGlvbnNcIjpbe1wibWV0aG9kXCI6XCJzZXRDb21wb3NpdGlvblwiLCIKLSAgICAgIHU4IlwiYXJndW1lbnRzXCI6W1wiXCJdfV19IjsKLSAgRVhQRUNUX0VRKGV4cGVjdGVkX3Jlc3BvbnNlLCByZXNwb25zZSk7Ci0KLSAgLy8gS2V5TiArIEtleUMuCi0gIHJlbW90ZV9lbmdpbmUtPlByb2Nlc3NUZXh0KAotICAgICAgIntcIm1ldGhvZFwiOlwia2V5RXZlbnRcIixcInR5cGVcIjpcImtleWRvd25cIixcImNvZGVcIjpcIktleU5cIiwiCi0gICAgICAiXCJzaGlmdFwiOmZhbHNlLFwiYWx0Z3JcIjpmYWxzZSxcImNhcHNcIjpmYWxzZX0iLAotICAgICAgYmFzZTo6QmluZE9uY2UoJlRlc3RQcm9jZXNzVGV4dENhbGxiYWNrLCAmcmVzcG9uc2UpKTsKLSAgcmVtb3RlX2VuZ2luZS0+UHJvY2Vzc1RleHQoCi0gICAgICAie1wibWV0aG9kXCI6XCJrZXlFdmVudFwiLFwidHlwZVwiOlwia2V5ZG93blwiLFwiY29kZVwiOlwiS2V5Q1wiLCIKLSAgICAgICJcInNoaWZ0XCI6ZmFsc2UsXCJhbHRnclwiOmZhbHNlLFwiY2Fwc1wiOmZhbHNlfSIsCi0gICAgICBiYXNlOjpCaW5kT25jZSgmVGVzdFByb2Nlc3NUZXh0Q2FsbGJhY2ssICZyZXNwb25zZSkpOwotICByZW1vdGVfZW5naW5lLkZsdXNoRm9yVGVzdGluZygpOwotICBleHBlY3RlZF9yZXNwb25zZSA9Ci0gICAgICB1OCJ7XCJyZXN1bHRcIjp0cnVlLFwib3BlcmF0aW9uc1wiOlt7XCJtZXRob2RcIjpcInNldENvbXBvc2l0aW9uXCIsIgotICAgICAgdTgiXCJhcmd1bWVudHNcIjpbXCJcdTA5MWVcdTA5NGRcdTA5MWFcIl19XX0iOwotICBFWFBFQ1RfRVEoZXhwZWN0ZWRfcmVzcG9uc2UsIHJlc3BvbnNlKTsKLQotICAvLyBTcGFjZS4KLSAgcmVtb3RlX2VuZ2luZS0+UHJvY2Vzc1RleHQoCi0gICAgICAie1wibWV0aG9kXCI6XCJrZXlFdmVudFwiLFwidHlwZVwiOlwia2V5ZG93blwiLFwiY29kZVwiOlwiU3BhY2VcIiwiCi0gICAgICAiXCJzaGlmdFwiOmZhbHNlLFwiYWx0Z3JcIjpmYWxzZSxcImNhcHNcIjpmYWxzZX0iLAotICAgICAgYmFzZTo6QmluZE9uY2UoJlRlc3RQcm9jZXNzVGV4dENhbGxiYWNrLCAmcmVzcG9uc2UpKTsKLSAgcmVtb3RlX2VuZ2luZS5GbHVzaEZvclRlc3RpbmcoKTsKLSAgZXhwZWN0ZWRfcmVzcG9uc2UgPQotICAgICAgdTgie1wicmVzdWx0XCI6dHJ1ZSxcIm9wZXJhdGlvbnNcIjpbe1wibWV0aG9kXCI6XCJjb21taXRUZXh0XCIsIgotICAgICAgdTgiXCJhcmd1bWVudHNcIjpbXCJcdTA5MWVcdTA5NGRcdTA5MWEgXCJdfV19IjsKLSAgRVhQRUNUX0VRKGV4cGVjdGVkX3Jlc3BvbnNlLCByZXNwb25zZSk7Ci19Ci0KIFRFU1RfRihJbWVTZXJ2aWNlVGVzdCwgTXVsdGlwbGVDbGllbnRzUnVsZWJhc2VkKSB7CiAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOwogICBUZXN0Q2xpZW50Q2hhbm5lbCB0ZXN0X2NoYW5uZWxfMTsKQEAgLTMzOSwxMyArMTU4LDEzIEBACiB9CiAKIC8vIFRlc3RzIHRoYXQgdGhlIHJ1bGUtYmFzZWQgQXJhYmljIGtleWJvYXJkIGNhbiB3b3JrIGNvcnJlY3RseS4KLVRFU1RfRihJbWVTZXJ2aWNlVGVzdCwgUnVsZUJhc2VkQXJhYmljS2V5cHJlc3MpIHsKK1RFU1RfRihJbWVTZXJ2aWNlVGVzdCwgUnVsZUJhc2VkQXJhYmljKSB7CiAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOwogICBUZXN0Q2xpZW50Q2hhbm5lbCB0ZXN0X2NoYW5uZWw7Ci0gIG1vam9tOjpJbnB1dENoYW5uZWxQdHIgdG9fZW5naW5lX3B0cjsKKyAgbW9qbzo6UmVtb3RlPG1vam9tOjpJbnB1dENoYW5uZWw+IHRvX2VuZ2luZV9yZW1vdGU7CiAKICAgcmVtb3RlX21hbmFnZXJfLT5Db25uZWN0VG9JbWVFbmdpbmUoCi0gICAgICAibTE3bjphciIsIG1vam86Ok1ha2VSZXF1ZXN0KCZ0b19lbmdpbmVfcHRyKSwKKyAgICAgICJtMTduOmFyIiwgdG9fZW5naW5lX3JlbW90ZS5CaW5kTmV3UGlwZUFuZFBhc3NSZWNlaXZlcigpLAogICAgICAgdGVzdF9jaGFubmVsLkNyZWF0ZVBlbmRpbmdSZW1vdGUoKSwgZXh0cmEsCiAgICAgICBiYXNlOjpCaW5kT25jZSgmQ29ubmVjdENhbGxiYWNrLCAmc3VjY2VzcykpOwogICByZW1vdGVfbWFuYWdlcl8uRmx1c2hGb3JUZXN0aW5nKCk7CkBAIC0zNTMsMTEgKzE3MiwxMSBAQAogCiAgIC8vIFRlc3QgU2hpZnQrS2V5QS4KICAgbW9qb206OktleXByZXNzUmVzcG9uc2VGb3JSdWxlYmFzZWQgcmVzcG9uc2U7Ci0gIHRvX2VuZ2luZV9wdHItPlByb2Nlc3NLZXlwcmVzc0ZvclJ1bGViYXNlZCgKKyAgdG9fZW5naW5lX3JlbW90ZS0+UHJvY2Vzc0tleXByZXNzRm9yUnVsZWJhc2VkKAogICAgICAgbW9qb206OktleXByZXNzSW5mb0ZvclJ1bGViYXNlZDo6TmV3KCJrZXlkb3duIiwgIktleUEiLCB0cnVlLCBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgICAgIGJhc2U6OkJpbmRPbmNlKCZUZXN0UHJvY2Vzc0tleXByZXNzRm9yUnVsZWJhc2VkQ2FsbGJhY2ssICZyZXNwb25zZSkpOwotICB0b19lbmdpbmVfcHRyLkZsdXNoRm9yVGVzdGluZygpOworICB0b19lbmdpbmVfcmVtb3RlLkZsdXNoRm9yVGVzdGluZygpOwogCiAgIEVYUEVDVF9FUShyZXNwb25zZS5yZXN1bHQsIHRydWUpOwogICBzdGQ6OnZlY3Rvcjxtb2pvbTo6T3BlcmF0aW9uRm9yUnVsZWJhc2VkUHRyPiBleHBlY3RlZF9vcGVyYXRpb25zOwpAQCAtMzY3LDExICsxODYsMTEgQEAKICAgRVhQRUNUX0VRKHJlc3BvbnNlLm9wZXJhdGlvbnMsIGV4cGVjdGVkX29wZXJhdGlvbnMpOwogCiAgIC8vIFRlc3QgS2V5QgotICB0b19lbmdpbmVfcHRyLT5Qcm9jZXNzS2V5cHJlc3NGb3JSdWxlYmFzZWQoCisgIHRvX2VuZ2luZV9yZW1vdGUtPlByb2Nlc3NLZXlwcmVzc0ZvclJ1bGViYXNlZCgKICAgICAgIG1vam9tOjpLZXlwcmVzc0luZm9Gb3JSdWxlYmFzZWQ6Ok5ldygia2V5ZG93biIsICJLZXlCIiwgZmFsc2UsIGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgICAgYmFzZTo6QmluZE9uY2UoJlRlc3RQcm9jZXNzS2V5cHJlc3NGb3JSdWxlYmFzZWRDYWxsYmFjaywgJnJlc3BvbnNlKSk7Ci0gIHRvX2VuZ2luZV9wdHIuRmx1c2hGb3JUZXN0aW5nKCk7CisgIHRvX2VuZ2luZV9yZW1vdGUuRmx1c2hGb3JUZXN0aW5nKCk7CiAgIEVYUEVDVF9FUShyZXNwb25zZS5yZXN1bHQsIHRydWUpOwogICBleHBlY3RlZF9vcGVyYXRpb25zID0gc3RkOjp2ZWN0b3I8bW9qb206Ok9wZXJhdGlvbkZvclJ1bGViYXNlZFB0cj4oMCk7CiAgIGV4cGVjdGVkX29wZXJhdGlvbnMucHVzaF9iYWNrKHttb2pvbTo6T3BlcmF0aW9uRm9yUnVsZWJhc2VkOjpOZXcoCkBAIC0zODAsNDEgKzE5OSw0MSBAQAogICBFWFBFQ1RfRVEocmVzcG9uc2Uub3BlcmF0aW9ucywgZXhwZWN0ZWRfb3BlcmF0aW9ucyk7CiAKICAgLy8gVGVzdCB1bmhhbmRsZWQga2V5LgotICB0b19lbmdpbmVfcHRyLT5Qcm9jZXNzS2V5cHJlc3NGb3JSdWxlYmFzZWQoCisgIHRvX2VuZ2luZV9yZW1vdGUtPlByb2Nlc3NLZXlwcmVzc0ZvclJ1bGViYXNlZCgKICAgICAgIG1vam9tOjpLZXlwcmVzc0luZm9Gb3JSdWxlYmFzZWQ6Ok5ldygia2V5ZG93biIsICJFbnRlciIsIGZhbHNlLCBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgICAgIGJhc2U6OkJpbmRPbmNlKCZUZXN0UHJvY2Vzc0tleXByZXNzRm9yUnVsZWJhc2VkQ2FsbGJhY2ssICZyZXNwb25zZSkpOwotICB0b19lbmdpbmVfcHRyLkZsdXNoRm9yVGVzdGluZygpOworICB0b19lbmdpbmVfcmVtb3RlLkZsdXNoRm9yVGVzdGluZygpOwogICBFWFBFQ1RfRVEocmVzcG9uc2UucmVzdWx0LCBmYWxzZSk7CiAKICAgLy8gVGVzdCBrZXl1cC4KLSAgdG9fZW5naW5lX3B0ci0+UHJvY2Vzc0tleXByZXNzRm9yUnVsZWJhc2VkKAorICB0b19lbmdpbmVfcmVtb3RlLT5Qcm9jZXNzS2V5cHJlc3NGb3JSdWxlYmFzZWQoCiAgICAgICBtb2pvbTo6S2V5cHJlc3NJbmZvRm9yUnVsZWJhc2VkOjpOZXcoImtleXVwIiwgIkVudGVyIiwgZmFsc2UsIGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgICAgYmFzZTo6QmluZE9uY2UoJlRlc3RQcm9jZXNzS2V5cHJlc3NGb3JSdWxlYmFzZWRDYWxsYmFjaywgJnJlc3BvbnNlKSk7Ci0gIHRvX2VuZ2luZV9wdHIuRmx1c2hGb3JUZXN0aW5nKCk7CisgIHRvX2VuZ2luZV9yZW1vdGUuRmx1c2hGb3JUZXN0aW5nKCk7CiAgIEVYUEVDVF9FUShyZXNwb25zZS5yZXN1bHQsIGZhbHNlKTsKIAogICAvLyBUT0RPKGtlaXRobGVlKSBUZXN0IHJlc2V0IGZ1bmN0aW9uCi0gIHRvX2VuZ2luZV9wdHItPlJlc2V0Rm9yUnVsZWJhc2VkKCk7CisgIHRvX2VuZ2luZV9yZW1vdGUtPlJlc2V0Rm9yUnVsZWJhc2VkKCk7CiAKICAgLy8gVGVzdCBpbnZhbGlkIHJlcXVlc3QuCi0gIHRvX2VuZ2luZV9wdHItPlByb2Nlc3NLZXlwcmVzc0ZvclJ1bGViYXNlZCgKKyAgdG9fZW5naW5lX3JlbW90ZS0+UHJvY2Vzc0tleXByZXNzRm9yUnVsZWJhc2VkKAogICAgICAgbW9qb206OktleXByZXNzSW5mb0ZvclJ1bGViYXNlZDo6TmV3KCJrZXlkb3duIiwgIiIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKSwKICAgICAgIGJhc2U6OkJpbmRPbmNlKCZUZXN0UHJvY2Vzc0tleXByZXNzRm9yUnVsZWJhc2VkQ2FsbGJhY2ssICZyZXNwb25zZSkpOwotICB0b19lbmdpbmVfcHRyLkZsdXNoRm9yVGVzdGluZygpOworICB0b19lbmdpbmVfcmVtb3RlLkZsdXNoRm9yVGVzdGluZygpOwogICBFWFBFQ1RfRVEocmVzcG9uc2UucmVzdWx0LCBmYWxzZSk7CiB9CiAKIC8vIFRlc3RzIHRoYXQgdGhlIHJ1bGUtYmFzZWQgRGV2YVBob25lIGtleWJvYXJkIGNhbiB3b3JrIGNvcnJlY3RseS4KLVRFU1RfRihJbWVTZXJ2aWNlVGVzdCwgUnVsZUJhc2VkRGV2YVBob25lS2V5cHJlc3MpIHsKK1RFU1RfRihJbWVTZXJ2aWNlVGVzdCwgUnVsZUJhc2VkRGV2YVBob25lKSB7CiAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOwogICBUZXN0Q2xpZW50Q2hhbm5lbCB0ZXN0X2NoYW5uZWw7Ci0gIG1vam9tOjpJbnB1dENoYW5uZWxQdHIgdG9fZW5naW5lX3B0cjsKKyAgbW9qbzo6UmVtb3RlPG1vam9tOjpJbnB1dENoYW5uZWw+IHRvX2VuZ2luZV9yZW1vdGU7CiAKICAgcmVtb3RlX21hbmFnZXJfLT5Db25uZWN0VG9JbWVFbmdpbmUoCi0gICAgICAibTE3bjpkZXZhX3Bob25lIiwgbW9qbzo6TWFrZVJlcXVlc3QoJnRvX2VuZ2luZV9wdHIpLAorICAgICAgIm0xN246ZGV2YV9waG9uZSIsIHRvX2VuZ2luZV9yZW1vdGUuQmluZE5ld1BpcGVBbmRQYXNzUmVjZWl2ZXIoKSwKICAgICAgIHRlc3RfY2hhbm5lbC5DcmVhdGVQZW5kaW5nUmVtb3RlKCksIGV4dHJhLAogICAgICAgYmFzZTo6QmluZE9uY2UoJkNvbm5lY3RDYWxsYmFjaywgJnN1Y2Nlc3MpKTsKICAgcmVtb3RlX21hbmFnZXJfLkZsdXNoRm9yVGVzdGluZygpOwpAQCAtNDI0LDExICsyNDMsMTEgQEAKICAgc3RkOjp2ZWN0b3I8bW9qb206Ok9wZXJhdGlvbkZvclJ1bGViYXNlZFB0cj4gZXhwZWN0ZWRfb3BlcmF0aW9uczsKIAogICAvLyBUZXN0IEtleU4uCi0gIHRvX2VuZ2luZV9wdHItPlByb2Nlc3NLZXlwcmVzc0ZvclJ1bGViYXNlZCgKKyAgdG9fZW5naW5lX3JlbW90ZS0+UHJvY2Vzc0tleXByZXNzRm9yUnVsZWJhc2VkKAogICAgICAgbW9qb206OktleXByZXNzSW5mb0ZvclJ1bGViYXNlZDo6TmV3KCJrZXlkb3duIiwgIktleU4iLCBmYWxzZSwgZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAgICBiYXNlOjpCaW5kT25jZSgmVGVzdFByb2Nlc3NLZXlwcmVzc0ZvclJ1bGViYXNlZENhbGxiYWNrLCAmcmVzcG9uc2UpKTsKLSAgdG9fZW5naW5lX3B0ci5GbHVzaEZvclRlc3RpbmcoKTsKKyAgdG9fZW5naW5lX3JlbW90ZS5GbHVzaEZvclRlc3RpbmcoKTsKIAogICBFWFBFQ1RfRVEocmVzcG9uc2UucmVzdWx0LCB0cnVlKTsKICAgZXhwZWN0ZWRfb3BlcmF0aW9ucyA9IHN0ZDo6dmVjdG9yPG1vam9tOjpPcGVyYXRpb25Gb3JSdWxlYmFzZWRQdHI+KDApOwpAQCAtNDM4LDExICsyNTcsMTEgQEAKICAgRVhQRUNUX0VRKHJlc3BvbnNlLm9wZXJhdGlvbnMsIGV4cGVjdGVkX29wZXJhdGlvbnMpOwogCiAgIC8vIEJhY2tzcGFjZS4KLSAgdG9fZW5naW5lX3B0ci0+UHJvY2Vzc0tleXByZXNzRm9yUnVsZWJhc2VkKAorICB0b19lbmdpbmVfcmVtb3RlLT5Qcm9jZXNzS2V5cHJlc3NGb3JSdWxlYmFzZWQoCiAgICAgICBtb2pvbTo6S2V5cHJlc3NJbmZvRm9yUnVsZWJhc2VkOjpOZXcoImtleWRvd24iLCAiQmFja3NwYWNlIiwgZmFsc2UsIGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgICAgYmFzZTo6QmluZE9uY2UoJlRlc3RQcm9jZXNzS2V5cHJlc3NGb3JSdWxlYmFzZWRDYWxsYmFjaywgJnJlc3BvbnNlKSk7Ci0gIHRvX2VuZ2luZV9wdHIuRmx1c2hGb3JUZXN0aW5nKCk7CisgIHRvX2VuZ2luZV9yZW1vdGUuRmx1c2hGb3JUZXN0aW5nKCk7CiAKICAgRVhQRUNUX0VRKHJlc3BvbnNlLnJlc3VsdCwgdHJ1ZSk7CiAgIGV4cGVjdGVkX29wZXJhdGlvbnMgPSBzdGQ6OnZlY3Rvcjxtb2pvbTo6T3BlcmF0aW9uRm9yUnVsZWJhc2VkUHRyPigwKTsKQEAgLTQ1MiwxNSArMjcxLDE1IEBACiAgIEVYUEVDVF9FUShyZXNwb25zZS5vcGVyYXRpb25zLCBleHBlY3RlZF9vcGVyYXRpb25zKTsKIAogICAvLyBLZXlOICsgS2V5Qy4KLSAgdG9fZW5naW5lX3B0ci0+UHJvY2Vzc0tleXByZXNzRm9yUnVsZWJhc2VkKAorICB0b19lbmdpbmVfcmVtb3RlLT5Qcm9jZXNzS2V5cHJlc3NGb3JSdWxlYmFzZWQoCiAgICAgICBtb2pvbTo6S2V5cHJlc3NJbmZvRm9yUnVsZWJhc2VkOjpOZXcoImtleWRvd24iLCAiS2V5TiIsIGZhbHNlLCBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgICAgIGJhc2U6OkJpbmRPbmNlKCZUZXN0UHJvY2Vzc0tleXByZXNzRm9yUnVsZWJhc2VkQ2FsbGJhY2ssICZyZXNwb25zZSkpOwotICB0b19lbmdpbmVfcHRyLT5Qcm9jZXNzS2V5cHJlc3NGb3JSdWxlYmFzZWQoCisgIHRvX2VuZ2luZV9yZW1vdGUtPlByb2Nlc3NLZXlwcmVzc0ZvclJ1bGViYXNlZCgKICAgICAgIG1vam9tOjpLZXlwcmVzc0luZm9Gb3JSdWxlYmFzZWQ6Ok5ldygia2V5ZG93biIsICJLZXlDIiwgZmFsc2UsIGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgICAgYmFzZTo6QmluZE9uY2UoJlRlc3RQcm9jZXNzS2V5cHJlc3NGb3JSdWxlYmFzZWRDYWxsYmFjaywgJnJlc3BvbnNlKSk7Ci0gIHRvX2VuZ2luZV9wdHIuRmx1c2hGb3JUZXN0aW5nKCk7CisgIHRvX2VuZ2luZV9yZW1vdGUuRmx1c2hGb3JUZXN0aW5nKCk7CiAKICAgRVhQRUNUX0VRKHJlc3BvbnNlLnJlc3VsdCwgdHJ1ZSk7CiAgIGV4cGVjdGVkX29wZXJhdGlvbnMgPSBzdGQ6OnZlY3Rvcjxtb2pvbTo6T3BlcmF0aW9uRm9yUnVsZWJhc2VkUHRyPigwKTsKQEAgLTQ3MSwxMSArMjkwLDExIEBACiAgIEVYUEVDVF9FUShyZXNwb25zZS5vcGVyYXRpb25zLCBleHBlY3RlZF9vcGVyYXRpb25zKTsKIAogICAvLyBTcGFjZS4KLSAgdG9fZW5naW5lX3B0ci0+UHJvY2Vzc0tleXByZXNzRm9yUnVsZWJhc2VkKAorICB0b19lbmdpbmVfcmVtb3RlLT5Qcm9jZXNzS2V5cHJlc3NGb3JSdWxlYmFzZWQoCiAgICAgICBtb2pvbTo6S2V5cHJlc3NJbmZvRm9yUnVsZWJhc2VkOjpOZXcoImtleWRvd24iLCAiU3BhY2UiLCBmYWxzZSwgZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAgICBiYXNlOjpCaW5kT25jZSgmVGVzdFByb2Nlc3NLZXlwcmVzc0ZvclJ1bGViYXNlZENhbGxiYWNrLCAmcmVzcG9uc2UpKTsKLSAgdG9fZW5naW5lX3B0ci5GbHVzaEZvclRlc3RpbmcoKTsKKyAgdG9fZW5naW5lX3JlbW90ZS5GbHVzaEZvclRlc3RpbmcoKTsKIAogICBFWFBFQ1RfRVEocmVzcG9uc2UucmVzdWx0LCB0cnVlKTsKICAgZXhwZWN0ZWRfb3BlcmF0aW9ucyA9IHN0ZDo6dmVjdG9yPG1vam9tOjpPcGVyYXRpb25Gb3JSdWxlYmFzZWRQdHI+KDApOwpkaWZmIC0tZ2l0IGEvY2hyb21lb3Mvc2VydmljZXMvaW1lL2lucHV0X2VuZ2luZS5jYyBiL2Nocm9tZW9zL3NlcnZpY2VzL2ltZS9pbnB1dF9lbmdpbmUuY2MKaW5kZXggNzE2MTM1Mi4uMGIwZWNjMSAxMDA2NDQKLS0tIGEvY2hyb21lb3Mvc2VydmljZXMvaW1lL2lucHV0X2VuZ2luZS5jYworKysgYi9jaHJvbWVvcy9zZXJ2aWNlcy9pbWUvaW5wdXRfZW5naW5lLmNjCkBAIC0xMDAsOSArMTAwLDcgQEAKIAogdm9pZCBJbnB1dEVuZ2luZTo6UHJvY2Vzc1RleHQoY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9jZXNzVGV4dENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gIGF1dG8mIGNvbnRleHQgPSBjaGFubmVsX3JlY2VpdmVyc18uY3VycmVudF9jb250ZXh0KCk7Ci0gIHN0ZDo6c3RyaW5nIHJlc3VsdCA9IFByb2Nlc3MobWVzc2FnZSwgY29udGV4dC5nZXQoKSk7Ci0gIHN0ZDo6bW92ZShjYWxsYmFjaykuUnVuKHJlc3VsdCk7CisgIE5PVElNUExFTUVOVEVEKCk7ICAvLyBUZXh0IG1lc3NhZ2Ugbm90IHVzZWQgaW4gdGhlIHJ1bGViYXNlZCBlbmdpbmUuCiB9CiAKIHZvaWQgSW5wdXRFbmdpbmU6OlByb2Nlc3NNZXNzYWdlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBtZXNzYWdlLApAQCAtMTEwLDExOCArMTA4LDYgQEAKICAgTk9USU1QTEVNRU5URUQoKTsgIC8vIFByb3RvYnVmIG1lc3NhZ2UgaXMgbm90IHVzZWQgaW4gdGhlIHJ1bGViYXNlZCBlbmdpbmUuCiB9CiAKLXN0ZDo6c3RyaW5nIElucHV0RW5naW5lOjpQcm9jZXNzKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRFbmdpbmVDb250ZXh0KiBjb250ZXh0KSB7Ci0gIGF1dG8mIGVuZ2luZSA9IGNvbnRleHQtPmVuZ2luZTsKLSAgaWYgKCFlbmdpbmUpCi0gICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7Ci0KLSAgY29uc3QgY2hhciBrRmFsc2VSZXNwb25zZVtdID0gIntcInJlc3VsdFwiOmZhbHNlfSI7Ci0KLSAgLy8gVGhlIHJlcXVlc3QgbWVzc2FnZSBpcyBpbiBKU09OIGZvcm1hdCBhczoKLSAgLy8gewotICAvLyAgICdtZXRob2QnOiA8c3RyaW5nPiwgIC8vICdyZXNldCcgb3IgJ2tleUV2ZW50JwotICAvLyAgICd0eXBlJzogPHN0cmluZz4sICAgIC8vICdrZXlkb3duJyBvciAna2V5dXAnCi0gIC8vICAgJ2NvZGUnOiA8c3RyaW5nPiwgICAgLy8gZS5nLiAnS2V5QScsICdCYWNrc3BhY2UnLCBldGMuCi0gIC8vICAgJ3NoaWZ0JzogPGJvb2xlYW4+LAotICAvLyAgICdhbHRncic6IDxib29sZWFuPiwKLSAgLy8gICAnY2Fwcyc6IDxib29sZWFuPiwKLSAgLy8gICAnY3RybCc6IDxib29sZWFuPiwKLSAgLy8gICAnYWx0JzogPGJvb2xlYW4+Ci0gIC8vIH0KLSAgLy8gVE9ETyhzaHVjaGVuKTogbWFrZSBwYXJzZXIvd3JpdGVyIHV0aWwgY2xhc3MgZm9yIHRoZSBKU09OLWJhc2VkIHByb3RvY29sLgotICBpbnQgZXJyb3JfY29kZTsKLSAgc3RkOjpzdHJpbmcgZXJyb3Jfc3RyaW5nOwotICBzdGQ6OnVuaXF1ZV9wdHI8YmFzZTo6VmFsdWU+IG1lc3NhZ2VfdmFsdWUgPQotICAgICAgYmFzZTo6SlNPTlJlYWRlcjo6UmVhZEFuZFJldHVybkVycm9yRGVwcmVjYXRlZCgKLSAgICAgICAgICBtZXNzYWdlLCBiYXNlOjpKU09OX1BBUlNFX1JGQywgJmVycm9yX2NvZGUsICZlcnJvcl9zdHJpbmcpOwotICBpZiAoIW1lc3NhZ2VfdmFsdWUpIHsKLSAgICBMT0coRVJST1IpIDw8ICJSZWFkIG1lc3NhZ2UgZXJyb3I6ICIgPDwgZXJyb3JfY29kZSA8PCAiOyAiIDw8IGVycm9yX3N0cmluZzsKLSAgICByZXR1cm4ga0ZhbHNlUmVzcG9uc2U7Ci0gIH0KLSAgYmFzZTo6VmFsdWUqIG1ldGhvZCA9IG1lc3NhZ2VfdmFsdWUtPkZpbmRLZXkoIm1ldGhvZCIpOwotICBpZiAoIW1ldGhvZCkKLSAgICByZXR1cm4ga0ZhbHNlUmVzcG9uc2U7Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIG1ldGhvZF9zdHIgPSBtZXRob2QtPkdldFN0cmluZygpOwotICBpZiAobWV0aG9kX3N0ciA9PSAiY291bnRLZXkiKSB7Ci0gICAgcmV0dXJuIHN0ZDo6dG9fc3RyaW5nKGVuZ2luZS0+cHJvY2Vzc19rZXlfY291bnQoKSk7Ci0gIH0KLQotICBpZiAobWV0aG9kX3N0ciA9PSAicmVzZXQiKSB7Ci0gICAgZW5naW5lLT5SZXNldCgpOwotICAgIHJldHVybiAie1wicmVzdWx0XCI6dHJ1ZX0iOwotICB9Ci0KLSAgaWYgKG1ldGhvZF9zdHIgPT0gImtleUV2ZW50IikgewotICAgIGJhc2U6OlZhbHVlKiB0eXBlID0gbWVzc2FnZV92YWx1ZS0+RmluZEtleSgidHlwZSIpOwotICAgIGlmICghdHlwZSB8fCB0eXBlLT5HZXRTdHJpbmcoKSAhPSAia2V5ZG93biIpCi0gICAgICByZXR1cm4ga0ZhbHNlUmVzcG9uc2U7Ci0gIH0KLQotICBiYXNlOjpWYWx1ZSogY29kZSA9IG1lc3NhZ2VfdmFsdWUtPkZpbmRLZXkoImNvZGUiKTsKLSAgYmFzZTo6VmFsdWUqIHNoaWZ0ID0gbWVzc2FnZV92YWx1ZS0+RmluZEtleSgic2hpZnQiKTsKLSAgYmFzZTo6VmFsdWUqIGFsdGdyID0gbWVzc2FnZV92YWx1ZS0+RmluZEtleSgiYWx0Z3IiKTsKLSAgYmFzZTo6VmFsdWUqIGNhcHMgPSBtZXNzYWdlX3ZhbHVlLT5GaW5kS2V5KCJjYXBzIik7Ci0gIGlmICghY29kZSB8fCAhc2hpZnQgfHwgIWFsdGdyIHx8ICFjYXBzKQotICAgIHJldHVybiBrRmFsc2VSZXNwb25zZTsKLQotICB1aW50OF90IG1vZGlmaWVycyA9IDA7Ci0gIGlmIChzaGlmdC0+R2V0Qm9vbCgpKQotICAgIG1vZGlmaWVycyB8PSBydWxlYmFzZWQ6Ok1PRElGSUVSX1NISUZUOwotICBpZiAoYWx0Z3ItPkdldEJvb2woKSkKLSAgICBtb2RpZmllcnMgfD0gcnVsZWJhc2VkOjpNT0RJRklFUl9BTFRHUjsKLSAgaWYgKGNhcHMtPkdldEJvb2woKSkKLSAgICBtb2RpZmllcnMgfD0gcnVsZWJhc2VkOjpNT0RJRklFUl9DQVBTTE9DSzsKLQotICBydWxlYmFzZWQ6OlByb2Nlc3NLZXlSZXN1bHQgcmVzID0KLSAgICAgIGVuZ2luZS0+UHJvY2Vzc0tleShjb2RlLT5HZXRTdHJpbmcoKSwgbW9kaWZpZXJzKTsKLQotICAvLyBUaGUgcmVzcG9uc2UgbWVzc2FnZSBpcyBpbiBKU09OIGZvcm1hdCBhczoKLSAgLy8gewotICAvLyAgICdyZXN1bHQnOiA8Ym9vbGVhbj4sCi0gIC8vICAgJ29wZXJhdGlvbnMnOiBbCi0gIC8vICAgICB7Ci0gIC8vICAgICAgICdtZXRob2QnOiAnY29tbWl0VGV4dHxzZXRDb21wb3NpdGlvbicsCi0gIC8vICAgICAgICdhcmd1bWVudHMnOiA8c3RyaW5nPgotICAvLyAgICAgfQotICAvLyAgIF0KLSAgLy8gfQotICBzdGQ6OnN0cmluZyByZXNwb25zZV9zdHIgPSAie1wicmVzdWx0XCI6IjsKLSAgcmVzcG9uc2Vfc3RyICs9IChyZXMua2V5X2hhbmRsZWQgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG9wczsKLSAgaWYgKCFyZXMuY29tbWl0X3RleHQuZW1wdHkoKSkgewotICAgIHN0ZDo6c3RyaW5nIGNvbW1pdF90ZXh0OwotICAgIGJhc2U6OkVzY2FwZUpTT05TdHJpbmcocmVzLmNvbW1pdF90ZXh0LCBmYWxzZSwgJmNvbW1pdF90ZXh0KTsKLSAgICBvcHMucHVzaF9iYWNrKCJ7XCJtZXRob2RcIjpcImNvbW1pdFRleHRcIixcImFyZ3VtZW50c1wiOltcIiIgKyBjb21taXRfdGV4dCArCi0gICAgICAgICAgICAgICAgICAiXCJdfSIpOwotICB9Ci0gIC8vIE5lZWQgdG8gYWRkIHRoZSBzZXRDb21wb3NpdGlvbiBvcGVyYXRpb24gdG8gdGhlIHJlc3VsdCB3aGVuIHRoZSBrZXkgaXMKLSAgLy8gaGFuZGxlZCBhbmQgY29tbWl0X3RleHQgYW5kIGNvbXBvc2l0aW9uX3RleHQgYXJlIGJvdGggZW1wdHkuCi0gIC8vIFRoYXQgaXMgdGhlIGNhc2Ugb2YgdXNpbmcgQmFja3NwYWNlIHRvIGRlbGV0ZSB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4KLSAgLy8gY29tcG9zaXRpb24uCi0gIGlmICghcmVzLmNvbXBvc2l0aW9uX3RleHQuZW1wdHkoKSB8fAotICAgICAgKHJlcy5rZXlfaGFuZGxlZCAmJiByZXMuY29tbWl0X3RleHQuZW1wdHkoKSkpIHsKLSAgICBzdGQ6OnN0cmluZyBjb21wb3NpdGlvbl90ZXh0OwotICAgIGJhc2U6OkVzY2FwZUpTT05TdHJpbmcocmVzLmNvbXBvc2l0aW9uX3RleHQsIGZhbHNlLCAmY29tcG9zaXRpb25fdGV4dCk7Ci0gICAgb3BzLnB1c2hfYmFjaygie1wibWV0aG9kXCI6XCJzZXRDb21wb3NpdGlvblwiLFwiYXJndW1lbnRzXCI6W1wiIiArCi0gICAgICAgICAgICAgICAgICBjb21wb3NpdGlvbl90ZXh0ICsgIlwiXX0iKTsKLSAgfQotICBpZiAob3BzLmVtcHR5KCkpIHsKLSAgICByZXNwb25zZV9zdHIgKz0gIn0iOwotICB9IGVsc2UgewotICAgIHJlc3BvbnNlX3N0ciArPSAiLFwib3BlcmF0aW9uc1wiOlsiOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3BzLnNpemUoKTsgKytpKSB7Ci0gICAgICBpZiAoaSA+IDApCi0gICAgICAgIHJlc3BvbnNlX3N0ciArPSAiLCI7Ci0gICAgICByZXNwb25zZV9zdHIgKz0gb3BzW2ldOwotICAgIH0KLSAgICByZXNwb25zZV9zdHIgKz0gIl19IjsKLSAgfQotCi0gIHJldHVybiByZXNwb25zZV9zdHI7Ci19Ci0KIHZvaWQgSW5wdXRFbmdpbmU6OlByb2Nlc3NLZXlwcmVzc0ZvclJ1bGViYXNlZCgKICAgICBtb2pvbTo6S2V5cHJlc3NJbmZvRm9yUnVsZWJhc2VkUHRyIGtleXByZXNzX2luZm8sCiAgICAgUHJvY2Vzc0tleXByZXNzRm9yUnVsZWJhc2VkQ2FsbGJhY2sgY2FsbGJhY2spIHsKZGlmZiAtLWdpdCBhL2Nocm9tZW9zL3NlcnZpY2VzL2ltZS9pbnB1dF9lbmdpbmUuaCBiL2Nocm9tZW9zL3NlcnZpY2VzL2ltZS9pbnB1dF9lbmdpbmUuaAppbmRleCAwODhkNjUwLi5lZGQ5NDk2NSAxMDA2NDQKLS0tIGEvY2hyb21lb3Mvc2VydmljZXMvaW1lL2lucHV0X2VuZ2luZS5oCisrKyBiL2Nocm9tZW9zL3NlcnZpY2VzL2ltZS9pbnB1dF9lbmdpbmUuaApAQCAtNjAsOSArNjAsNiBAQAogICAvLyBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGltZV9zcGVjIGlzIHN1cHBvcnRlZCBieSBydWxlYmFzZWQgZW5naW5lLgogICBib29sIElzSW1lU3VwcG9ydGVkQnlSdWxlYmFzZWQoY29uc3Qgc3RkOjpzdHJpbmcmIGltZV9zcGVjKTsKIAotICBzdGQ6OnN0cmluZyBQcm9jZXNzKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0RW5naW5lQ29udGV4dCogY29udGV4dCk7Ci0KICAgbW9qbzo6UmVjZWl2ZXJTZXQ8bW9qb206OklucHV0Q2hhbm5lbCwgc3RkOjp1bmlxdWVfcHRyPElucHV0RW5naW5lQ29udGV4dD4+CiAgICAgICBjaGFubmVsX3JlY2VpdmVyc187CiAKZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvYXJjL21vam9tL2ludGVudF9oZWxwZXIubW9qb20gYi9jb21wb25lbnRzL2FyYy9tb2pvbS9pbnRlbnRfaGVscGVyLm1vam9tCmluZGV4IDJkZTVkZGIuLmMxYzZlODYgMTAwNjQ0Ci0tLSBhL2NvbXBvbmVudHMvYXJjL21vam9tL2ludGVudF9oZWxwZXIubW9qb20KKysrIGIvY29tcG9uZW50cy9hcmMvbW9qb20vaW50ZW50X2hlbHBlci5tb2pvbQpAQCAtMiw3ICsyLDcgQEAKIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAvLwotLy8gTmV4dCBNaW5WZXJzaW9uOiAzMAorLy8gTmV4dCBNaW5WZXJzaW9uOiAzMQogCiBtb2R1bGUgYXJjLm1vam9tOwogCkBAIC01MCw2ICs1MCwxMiBAQAogICBpbnQzMiBwb3J0OwogfTsKIAorc3RydWN0IFVyaUNvbXBvbmVudHMgeworICBzdHJpbmcgc2NoZW1lOyAvLyBTY2hlbWUgdG8gY3JlYXRlIFVSSSBpbiBBUkMuCisgIHN0cmluZyBhdXRob3JpdHk7IC8vIEF1dGhvcml0eSB0byBjcmVhdGUgVVJJIGluIEFSQy4KKyAgc3RyaW5nIHBhdGg7IC8vIFBhdGggdG8gY3JlYXRlIFVSSSBpbiBBUkMuCit9OworCiBzdHJ1Y3QgSW50ZW50SW5mbyB7CiAgIHN0cmluZyBhY3Rpb247CiAgIGFycmF5PHN0cmluZz4/IGNhdGVnb3JpZXM7CkBAIC02Miw2ICs2OCwxMCBAQAogICAvLyBpbnRlbnRzIHRvIGNhcnJ5IGFkZGl0aW9uYWwgZGF0YS4gU2VlOgogICAvLyBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9jb250ZW50L0ludGVudCNwdXRFeHRyYShqYXZhLmxhbmcuU3RyaW5nLCUyMGphdmEubGFuZy5TdHJpbmcpCiAgIFtNaW5WZXJzaW9uPTIyXSBtYXA8c3RyaW5nLCBzdHJpbmc+PyBleHRyYXM7CisKKyAgLy8gT3B0aW9uYWwgVVJJIGNvbXBvbmVudHMgdG8gYnVpbGQgZGF0YSBVUkkgaW4gQVJDLiBJZiB8SW50ZW50SW5mby5kYXRhfCBpcworICAvLyBzZXQsIHRoaXMgZmllbGQgd2lsbCBiZSBpZ25vcmVkLgorICBbTWluVmVyc2lvbj0zMF0gVXJpQ29tcG9uZW50cz8gdXJpX2NvbXBvbmVudHM7CiB9OwogCiBzdHJ1Y3QgSW50ZW50RmlsdGVyIHsKQEAgLTE3NCw3ICsxODQsNyBAQAogCiAvLyBIYW5kbGVzIGludGVudHMgZnJvbSBBUkMgaW4gQ2hyb21lLgogLy8gRGVwcmVjYXRlZCBtZXRob2QgSUQ6IDQKLS8vIE5leHQgbWV0aG9kIElEOiAxMworLy8gTmV4dCBtZXRob2QgSUQ6IDE0CiBpbnRlcmZhY2UgSW50ZW50SGVscGVySG9zdCB7CiAgIC8vIENhbGxlZCB3aGVuIGljb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFja2FnZSBhcmUgbm8gbG9uZ2VyIHVwIHRvIGRhdGUuCiAgIFtNaW5WZXJzaW9uPTNdIE9uSWNvbkludmFsaWRhdGVkQDEoc3RyaW5nIHBhY2thZ2VfbmFtZSk7CmRpZmYgLS1naXQgYS9jb21wb25lbnRzL2FyYy9zZXNzaW9uL2FyY192bV9jbGllbnRfYWRhcHRlci5jYyBiL2NvbXBvbmVudHMvYXJjL3Nlc3Npb24vYXJjX3ZtX2NsaWVudF9hZGFwdGVyLmNjCmluZGV4IGNlYzE0MmZkLi43Y2I3NTI3IDEwMDY0NAotLS0gYS9jb21wb25lbnRzL2FyYy9zZXNzaW9uL2FyY192bV9jbGllbnRfYWRhcHRlci5jYworKysgYi9jb21wb25lbnRzL2FyYy9zZXNzaW9uL2FyY192bV9jbGllbnRfYWRhcHRlci5jYwpAQCAtMjUsNiArMjUsOCBAQAogbmFtZXNwYWNlIGFyYyB7CiBuYW1lc3BhY2UgewogCitjb25zdGV4cHIgY29uc3QgY2hhciBrQXJjVm1TZXJ2ZXJQcm94eUpvYk5hbWVbXSA9ICJhcmN2bV8yZHNlcnZlcl8yZHByb3h5IjsKKwogY2hyb21lb3M6OkNvbmNpZXJnZUNsaWVudCogR2V0Q29uY2llcmdlQ2xpZW50KCkgewogICByZXR1cm4gY2hyb21lb3M6OkRCdXNUaHJlYWRNYW5hZ2VyOjpHZXQoKS0+R2V0Q29uY2llcmdlQ2xpZW50KCk7CiB9CkBAIC04OCw2ICs5MCwxMiBAQAogCiAgIHZvaWQgVXBncmFkZUFyYyhjb25zdCBVcGdyYWRlQXJjQ29udGFpbmVyUmVxdWVzdCYgcmVxdWVzdCwKICAgICAgICAgICAgICAgICAgIGNocm9tZW9zOjpWb2lkREJ1c01ldGhvZENhbGxiYWNrIGNhbGxiYWNrKSBvdmVycmlkZSB7CisgICAgVkxPRygxKSA8PCAiU3RhcnRpbmcgYXJjdm0tc2VydmVyLXByb3h5IjsKKyAgICBjaHJvbWVvczo6VXBzdGFydENsaWVudDo6R2V0KCktPlN0YXJ0Sm9iKAorICAgICAgICBrQXJjVm1TZXJ2ZXJQcm94eUpvYk5hbWUsIC8qZW52aXJvbm1lbnQ9Ki97fSwKKyAgICAgICAgYmFzZTo6QmluZE9uY2UoJkFyY1ZtQ2xpZW50QWRhcHRlcjo6T25BcmNWbVNlcnZlclByb3h5Sm9iU3RhcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgd2Vha19mYWN0b3J5Xy5HZXRXZWFrUHRyKCkpKTsKKwogICAgIFZMT0coMSkgPDwgIlN0YXJ0aW5nIEFSQ1ZNIjsKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZW52ewogICAgICAgICB7IlVTRVJfSURfSEFTSD0iICsgdXNlcl9pZF9oYXNoX30sCkBAIC0xMjksNyArMTM3LDE1IEBACiAKICBwcml2YXRlOgogICB2b2lkIE9uQXJjSW5zdGFuY2VTdG9wcGVkKCkgewotICAgIFZMT0coMSkgPDwgImFyY3ZtIHN0b3BwZWQuIjsKKyAgICBWTE9HKDEpIDw8ICJBUkNWTSBzdG9wcGVkLiBTdG9wcGluZyBhcmN2bS1zZXJ2ZXItcHJveHkiOworCisgICAgLy8gVE9ETyh5dXN1a2VzKTogQ29uc2lkZXIgcmVtb3ZpbmcgdGhpcyBzdG9wIGNhbGwgb25jZSBiLzE0MjE0MDM1NSBpcworICAgIC8vIGltcGxlbWVudGVkLgorICAgIGNocm9tZW9zOjpVcHN0YXJ0Q2xpZW50OjpHZXQoKS0+U3RvcEpvYigKKyAgICAgICAga0FyY1ZtU2VydmVyUHJveHlKb2JOYW1lLCAvKmVudmlyb25tZW50PSove30sCisgICAgICAgIGJhc2U6OkJpbmRPbmNlKCZBcmNWbUNsaWVudEFkYXB0ZXI6Ok9uQXJjVm1TZXJ2ZXJQcm94eUpvYlN0b3BwZWQsCisgICAgICAgICAgICAgICAgICAgICAgIHdlYWtfZmFjdG9yeV8uR2V0V2Vha1B0cigpKSk7CisKICAgICBmb3IgKGF1dG8mIG9ic2VydmVyIDogb2JzZXJ2ZXJfbGlzdF8pCiAgICAgICBvYnNlcnZlci5BcmNJbnN0YW5jZVN0b3BwZWQoKTsKICAgfQpAQCAtMTQwLDYgKzE1NiwxNCBAQAogICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHN0b3AgYXJjdm0uIjsKICAgfQogCisgIHZvaWQgT25BcmNWbVNlcnZlclByb3h5Sm9iU3RhcnRlZChib29sIHJlc3VsdCkgeworICAgIFZMT0coMSkgPDwgIk9uQXJjVm1TZXJ2ZXJQcm94eUpvYlN0YXJ0ZWQgcmVzdWx0PSIgPDwgcmVzdWx0OworICB9CisKKyAgdm9pZCBPbkFyY1ZtU2VydmVyUHJveHlKb2JTdG9wcGVkKGJvb2wgcmVzdWx0KSB7CisgICAgVkxPRygxKSA8PCAiT25BcmNWbVNlcnZlclByb3h5Sm9iU3RvcHBlZCByZXN1bHQ9IiA8PCByZXN1bHQ7CisgIH0KKwogICAvLyBBIGhhc2ggb2YgdGhlIHByaW1hcnkgcHJvZmlsZSB1c2VyIElELgogICBzdGQ6OnN0cmluZyB1c2VyX2lkX2hhc2hfOwogCmRpZmYgLS1naXQgYS9jb21wb25lbnRzL2F1dG9maWxsL2NvbnRlbnQvcmVuZGVyZXIvYXV0b2ZpbGxfYWdlbnQuY2MgYi9jb21wb25lbnRzL2F1dG9maWxsL2NvbnRlbnQvcmVuZGVyZXIvYXV0b2ZpbGxfYWdlbnQuY2MKaW5kZXggNjVmNDJjOWMuLjg5YmUwZjYgMTAwNjQ0Ci0tLSBhL2NvbXBvbmVudHMvYXV0b2ZpbGwvY29udGVudC9yZW5kZXJlci9hdXRvZmlsbF9hZ2VudC5jYworKysgYi9jb21wb25lbnRzL2F1dG9maWxsL2NvbnRlbnQvcmVuZGVyZXIvYXV0b2ZpbGxfYWdlbnQuY2MKQEAgLTIxOSw4ICsyMTksNyBAQAogICBpZiAoZm9ybV91dGlsOjpGaW5kRm9ybUFuZEZpZWxkRm9yRm9ybUNvbnRyb2xFbGVtZW50KGVsZW1lbnRfLCAmZm9ybSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGQpKSB7CiAgICAgR2V0QXV0b2ZpbGxEcml2ZXIoKS0+VGV4dEZpZWxkRGlkU2Nyb2xsKAotICAgICAgICBmb3JtLCBmaWVsZCwKLSAgICAgICAgcmVuZGVyX2ZyYW1lKCktPkdldFJlbmRlclZpZXcoKS0+RWxlbWVudEJvdW5kc0luV2luZG93KGVsZW1lbnRfKSk7CisgICAgICAgIGZvcm0sIGZpZWxkLCByZW5kZXJfZnJhbWUoKS0+RWxlbWVudEJvdW5kc0luV2luZG93KGVsZW1lbnRfKSk7CiAgIH0KIAogICAvLyBJZ25vcmUgc3Vic2VxdWVudCBzY3JvbGwgb2Zmc2V0IGNoYW5nZXMuCkBAIC0yNjksOCArMjY4LDcgQEAKICAgaWYgKGZvcm1fdXRpbDo6RmluZEZvcm1BbmRGaWVsZEZvckZvcm1Db250cm9sRWxlbWVudChlbGVtZW50XywgJmZvcm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkKSkgewogICAgIEdldEF1dG9maWxsRHJpdmVyKCktPkZvY3VzT25Gb3JtRmllbGQoCi0gICAgICAgIGZvcm0sIGZpZWxkLAotICAgICAgICByZW5kZXJfZnJhbWUoKS0+R2V0UmVuZGVyVmlldygpLT5FbGVtZW50Qm91bmRzSW5XaW5kb3coZWxlbWVudF8pKTsKKyAgICAgICAgZm9ybSwgZmllbGQsIHJlbmRlcl9mcmFtZSgpLT5FbGVtZW50Qm91bmRzSW5XaW5kb3coZWxlbWVudF8pKTsKICAgfQogfQogCkBAIC0zNTEsOCArMzQ5LDcgQEAKICAgaWYgKGZvcm1fdXRpbDo6RmluZEZvcm1BbmRGaWVsZEZvckZvcm1Db250cm9sRWxlbWVudChlbGVtZW50LCAmZm9ybSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGQpKSB7CiAgICAgR2V0QXV0b2ZpbGxEcml2ZXIoKS0+VGV4dEZpZWxkRGlkQ2hhbmdlKAotICAgICAgICBmb3JtLCBmaWVsZCwKLSAgICAgICAgcmVuZGVyX2ZyYW1lKCktPkdldFJlbmRlclZpZXcoKS0+RWxlbWVudEJvdW5kc0luV2luZG93KGVsZW1lbnQpLAorICAgICAgICBmb3JtLCBmaWVsZCwgcmVuZGVyX2ZyYW1lKCktPkVsZW1lbnRCb3VuZHNJbldpbmRvdyhlbGVtZW50KSwKICAgICAgICAgYmFzZTo6VGltZVRpY2tzOjpOb3coKSk7CiAgIH0KIH0KQEAgLTc3Miw3ICs3NjksNyBAQAogICBHZXRBdXRvZmlsbERyaXZlcigpLT5TZXREYXRhTGlzdChkYXRhX2xpc3RfdmFsdWVzLCBkYXRhX2xpc3RfbGFiZWxzKTsKICAgR2V0QXV0b2ZpbGxEcml2ZXIoKS0+UXVlcnlGb3JtRmllbGRBdXRvZmlsbCgKICAgICAgIGF1dG9maWxsX3F1ZXJ5X2lkXywgZm9ybSwgZmllbGQsCi0gICAgICByZW5kZXJfZnJhbWUoKS0+R2V0UmVuZGVyVmlldygpLT5FbGVtZW50Qm91bmRzSW5XaW5kb3coZWxlbWVudF8pLAorICAgICAgcmVuZGVyX2ZyYW1lKCktPkVsZW1lbnRCb3VuZHNJbldpbmRvdyhlbGVtZW50XyksCiAgICAgICBhdXRvc2VsZWN0X2ZpcnN0X3N1Z2dlc3Rpb24pOwogfQogCkBAIC05OTMsOCArOTkwLDcgQEAKICAgICAgIGlmIChmb3JtX3V0aWw6OkZpbmRGb3JtQW5kRmllbGRGb3JGb3JtQ29udHJvbEVsZW1lbnQoZWxlbWVudCwgJmZvcm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZCkpIHsKICAgICAgICAgR2V0QXV0b2ZpbGxEcml2ZXIoKS0+U2VsZWN0Q29udHJvbERpZENoYW5nZSgKLSAgICAgICAgICAgIGZvcm0sIGZpZWxkLAotICAgICAgICAgICAgcmVuZGVyX2ZyYW1lKCktPkdldFJlbmRlclZpZXcoKS0+RWxlbWVudEJvdW5kc0luV2luZG93KGVsZW1lbnQpKTsKKyAgICAgICAgICAgIGZvcm0sIGZpZWxkLCByZW5kZXJfZnJhbWUoKS0+RWxlbWVudEJvdW5kc0luV2luZG93KGVsZW1lbnQpKTsKICAgICAgIH0KICAgICB9CiAgIH0KZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvYXV0b2ZpbGwvY29udGVudC9yZW5kZXJlci9wYXNzd29yZF9hdXRvZmlsbF9hZ2VudC5jYyBiL2NvbXBvbmVudHMvYXV0b2ZpbGwvY29udGVudC9yZW5kZXJlci9wYXNzd29yZF9hdXRvZmlsbF9hZ2VudC5jYwppbmRleCA4OGZmMGVhZi4uN2EzYjdjZjYgMTAwNjQ0Ci0tLSBhL2NvbXBvbmVudHMvYXV0b2ZpbGwvY29udGVudC9yZW5kZXJlci9wYXNzd29yZF9hdXRvZmlsbF9hZ2VudC5jYworKysgYi9jb21wb25lbnRzL2F1dG9maWxsL2NvbnRlbnQvcmVuZGVyZXIvcGFzc3dvcmRfYXV0b2ZpbGxfYWdlbnQuY2MKQEAgLTEzMDUsNyArMTMwNSw3IEBACiAKICAgR2V0UGFzc3dvcmRNYW5hZ2VyRHJpdmVyKCktPlNob3dQYXNzd29yZFN1Z2dlc3Rpb25zKAogICAgICAgZmllbGQudGV4dF9kaXJlY3Rpb24sIHVzZXJuYW1lX3N0cmluZywgb3B0aW9ucywKLSAgICAgIHJlbmRlcl9mcmFtZSgpLT5HZXRSZW5kZXJWaWV3KCktPkVsZW1lbnRCb3VuZHNJbldpbmRvdyh1c2VyX2lucHV0KSk7CisgICAgICByZW5kZXJfZnJhbWUoKS0+RWxlbWVudEJvdW5kc0luV2luZG93KHVzZXJfaW5wdXQpKTsKICAgdXNlcm5hbWVfcXVlcnlfcHJlZml4XyA9IHVzZXJuYW1lX3N0cmluZzsKICAgcmV0dXJuIENhblNob3dTdWdnZXN0aW9uKHBhc3N3b3JkX2luZm8uZmlsbF9kYXRhLCB1c2VybmFtZV9zdHJpbmcsIHNob3dfYWxsKTsKIH0KZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvYXV0b2ZpbGwvY29udGVudC9yZW5kZXJlci9wYXNzd29yZF9nZW5lcmF0aW9uX2FnZW50LmNjIGIvY29tcG9uZW50cy9hdXRvZmlsbC9jb250ZW50L3JlbmRlcmVyL3Bhc3N3b3JkX2dlbmVyYXRpb25fYWdlbnQuY2MKaW5kZXggNWFhZmVjMjAuLjYwYjI0MTMgMTAwNjQ0Ci0tLSBhL2NvbXBvbmVudHMvYXV0b2ZpbGwvY29udGVudC9yZW5kZXJlci9wYXNzd29yZF9nZW5lcmF0aW9uX2FnZW50LmNjCisrKyBiL2NvbXBvbmVudHMvYXV0b2ZpbGwvY29udGVudC9yZW5kZXJlci9wYXNzd29yZF9nZW5lcmF0aW9uX2FnZW50LmNjCkBAIC0zMDksNyArMzA5LDcgQEAKICAgICBMb2dNZXNzYWdlKExvZ2dlcjo6U1RSSU5HX0dFTkVSQVRJT05fUkVOREVSRVJfU0hPV19NQU5VQUxfR0VORVJBVElPTl9QT1BVUCk7CiAgICAgYXV0b2ZpbGw6OnBhc3N3b3JkX2dlbmVyYXRpb246OlBhc3N3b3JkR2VuZXJhdGlvblVJRGF0YQogICAgICAgICBwYXNzd29yZF9nZW5lcmF0aW9uX3VpX2RhdGEoCi0gICAgICAgICAgICByZW5kZXJfZnJhbWUoKS0+R2V0UmVuZGVyVmlldygpLT5FbGVtZW50Qm91bmRzSW5XaW5kb3coCisgICAgICAgICAgICByZW5kZXJfZnJhbWUoKS0+RWxlbWVudEJvdW5kc0luV2luZG93KAogICAgICAgICAgICAgICAgIGN1cnJlbnRfZ2VuZXJhdGlvbl9pdGVtXy0+Z2VuZXJhdGlvbl9lbGVtZW50XyksCiAgICAgICAgICAgICBjdXJyZW50X2dlbmVyYXRpb25faXRlbV8tPmdlbmVyYXRpb25fZWxlbWVudF8uTWF4TGVuZ3RoKCksCiAgICAgICAgICAgICBjdXJyZW50X2dlbmVyYXRpb25faXRlbV8tPmdlbmVyYXRpb25fZWxlbWVudF8uTmFtZUZvckF1dG9maWxsKCkKQEAgLTUxMyw3ICs1MTMsNyBAQAogICBMb2dNZXNzYWdlKExvZ2dlcjo6U1RSSU5HX0dFTkVSQVRJT05fUkVOREVSRVJfQVVUT01BVElDX0dFTkVSQVRJT05fQVZBSUxBQkxFKTsKICAgYXV0b2ZpbGw6OnBhc3N3b3JkX2dlbmVyYXRpb246OlBhc3N3b3JkR2VuZXJhdGlvblVJRGF0YQogICAgICAgcGFzc3dvcmRfZ2VuZXJhdGlvbl91aV9kYXRhKAotICAgICAgICAgIHJlbmRlcl9mcmFtZSgpLT5HZXRSZW5kZXJWaWV3KCktPkVsZW1lbnRCb3VuZHNJbldpbmRvdygKKyAgICAgICAgICByZW5kZXJfZnJhbWUoKS0+RWxlbWVudEJvdW5kc0luV2luZG93KAogICAgICAgICAgICAgICBjdXJyZW50X2dlbmVyYXRpb25faXRlbV8tPmdlbmVyYXRpb25fZWxlbWVudF8pLAogICAgICAgICAgIGN1cnJlbnRfZ2VuZXJhdGlvbl9pdGVtXy0+Z2VuZXJhdGlvbl9lbGVtZW50Xy5NYXhMZW5ndGgoKSwKICAgICAgICAgICBjdXJyZW50X2dlbmVyYXRpb25faXRlbV8tPmdlbmVyYXRpb25fZWxlbWVudF8uTmFtZUZvckF1dG9maWxsKCkKQEAgLTUzMiw5ICs1MzIsOCBAQAogICBpZiAoIXJlbmRlcl9mcmFtZSgpKQogICAgIHJldHVybjsKIAotICBnZng6OlJlY3RGIGJvdW5kaW5nX2JveCA9Ci0gICAgICByZW5kZXJfZnJhbWUoKS0+R2V0UmVuZGVyVmlldygpLT5FbGVtZW50Qm91bmRzSW5XaW5kb3coCi0gICAgICAgICAgY3VycmVudF9nZW5lcmF0aW9uX2l0ZW1fLT5nZW5lcmF0aW9uX2VsZW1lbnRfKTsKKyAgZ2Z4OjpSZWN0RiBib3VuZGluZ19ib3ggPSByZW5kZXJfZnJhbWUoKS0+RWxlbWVudEJvdW5kc0luV2luZG93KAorICAgICAgY3VycmVudF9nZW5lcmF0aW9uX2l0ZW1fLT5nZW5lcmF0aW9uX2VsZW1lbnRfKTsKIAogICBzdGQ6OnVuaXF1ZV9wdHI8UGFzc3dvcmRGb3JtPiBwYXNzd29yZF9mb3JtID0gQ3JlYXRlUGFzc3dvcmRGb3JtVG9QcmVzYXZlKCk7CiAgIERDSEVDSyhwYXNzd29yZF9mb3JtKTsKZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvYXV0b2ZpbGwvY29yZS9icm93c2VyL2F1dG9maWxsX21lcmdlX3VuaXR0ZXN0LmNjIGIvY29tcG9uZW50cy9hdXRvZmlsbC9jb3JlL2Jyb3dzZXIvYXV0b2ZpbGxfbWVyZ2VfdW5pdHRlc3QuY2MKaW5kZXggMWUxMDFiMS4uYjNkNWFmZiAxMDA2NDQKLS0tIGEvY29tcG9uZW50cy9hdXRvZmlsbC9jb3JlL2Jyb3dzZXIvYXV0b2ZpbGxfbWVyZ2VfdW5pdHRlc3QuY2MKKysrIGIvY29tcG9uZW50cy9hdXRvZmlsbC9jb3JlL2Jyb3dzZXIvYXV0b2ZpbGxfbWVyZ2VfdW5pdHRlc3QuY2MKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlICJjb21wb25lbnRzL2F1dG9maWxsL2NvcmUvYnJvd3Nlci9hdXRvZmlsbF90ZXN0X3V0aWxzLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9hdXRvZmlsbC9jb3JlL2Jyb3dzZXIvYXV0b2ZpbGxfdHlwZS5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvYXV0b2ZpbGwvY29yZS9icm93c2VyL2RhdGFfZHJpdmVuX3Rlc3QuaCIKKyNpbmNsdWRlICJjb21wb25lbnRzL2F1dG9maWxsL2NvcmUvYnJvd3Nlci9kYXRhX21vZGVsL2F1dG9maWxsX3Byb2ZpbGVfY29tcGFyYXRvci5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvYXV0b2ZpbGwvY29yZS9icm93c2VyL2Zvcm1fZGF0YV9pbXBvcnRlci5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvYXV0b2ZpbGwvY29yZS9icm93c2VyL2Zvcm1fc3RydWN0dXJlLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9hdXRvZmlsbC9jb3JlL2Jyb3dzZXIvZ2VvL2NvdW50cnlfbmFtZXMuaCIKQEAgLTEzOSw4ICsxNDAsOCBAQAogc3RkOjpzdHJpbmcgUGVyc29uYWxEYXRhTWFuYWdlck1vY2s6OlNhdmVJbXBvcnRlZFByb2ZpbGUoCiAgICAgY29uc3QgQXV0b2ZpbGxQcm9maWxlJiBwcm9maWxlKSB7CiAgIHN0ZDo6dmVjdG9yPEF1dG9maWxsUHJvZmlsZT4gcHJvZmlsZXM7Ci0gIHN0ZDo6c3RyaW5nIG1lcmdlZF9ndWlkID0KLSAgICAgIE1lcmdlUHJvZmlsZShwcm9maWxlLCAmcHJvZmlsZXNfLCAiZW4tVVMiLCAmcHJvZmlsZXMpOworICBzdGQ6OnN0cmluZyBtZXJnZWRfZ3VpZCA9IEF1dG9maWxsUHJvZmlsZUNvbXBhcmF0b3I6Ok1lcmdlUHJvZmlsZSgKKyAgICAgIHByb2ZpbGUsICZwcm9maWxlc18sICJlbi1VUyIsICZwcm9maWxlcyk7CiAgIGlmIChtZXJnZWRfZ3VpZCA9PSBwcm9maWxlLmd1aWQoKSkKICAgICBwcm9maWxlc18ucHVzaF9iYWNrKHN0ZDo6bWFrZV91bmlxdWU8QXV0b2ZpbGxQcm9maWxlPihwcm9maWxlKSk7CiAgIHJldHVybiBtZXJnZWRfZ3VpZDsKZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvYXV0b2ZpbGwvY29yZS9icm93c2VyL2F1dG9maWxsX21ldHJpY3MuY2MgYi9jb21wb25lbnRzL2F1dG9maWxsL2NvcmUvYnJvd3Nlci9hdXRvZmlsbF9tZXRyaWNzLmNjCmluZGV4IGUyYWQyNjk5Li5mZjZiMTJhIDEwMDY0NAotLS0gYS9jb21wb25lbnRzL2F1dG9maWxsL2NvcmUvYnJvd3Nlci9hdXRvZmlsbF9tZXRyaWNzLmNjCisrKyBiL2NvbXBvbmVudHMvYXV0b2ZpbGwvY29yZS9icm93c2VyL2F1dG9maWxsX21ldHJpY3MuY2MKQEAgLTkyMiw2ICs5MjIsMTEgQEAKIH0KIAogLy8gc3RhdGljCit2b2lkIEF1dG9maWxsTWV0cmljczo6TG9nQ2FyZFVubWFza1ByZWZsaWdodENhbGxlZCgpIHsKKyAgVU1BX0hJU1RPR1JBTV9CT09MRUFOKCJBdXRvZmlsbC5CZXR0ZXJBdXRoLkNhcmRVbm1hc2tQcmVmbGlnaHRDYWxsZWQiLCB0cnVlKTsKK30KKworLy8gc3RhdGljCiB2b2lkIEF1dG9maWxsTWV0cmljczo6TG9nVW5tYXNrUHJvbXB0RXZlbnQoVW5tYXNrUHJvbXB0RXZlbnQgZXZlbnQpIHsKICAgVU1BX0hJU1RPR1JBTV9FTlVNRVJBVElPTigiQXV0b2ZpbGwuVW5tYXNrUHJvbXB0LkV2ZW50cyIsIGV2ZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTV9VTk1BU0tfUFJPTVBUX0VWRU5UUyk7CmRpZmYgLS1naXQgYS9jb21wb25lbnRzL2F1dG9maWxsL2NvcmUvYnJvd3Nlci9hdXRvZmlsbF9tZXRyaWNzLmggYi9jb21wb25lbnRzL2F1dG9maWxsL2NvcmUvYnJvd3Nlci9hdXRvZmlsbF9tZXRyaWNzLmgKaW5kZXggOTEyZjk0Yi4uNGNhYzU2NSAxMDA2NDQKLS0tIGEvY29tcG9uZW50cy9hdXRvZmlsbC9jb3JlL2Jyb3dzZXIvYXV0b2ZpbGxfbWV0cmljcy5oCisrKyBiL2NvbXBvbmVudHMvYXV0b2ZpbGwvY29yZS9icm93c2VyL2F1dG9maWxsX21ldHJpY3MuaApAQCAtMTAzMyw2ICsxMDMzLDEwIEBACiAgIHN0YXRpYyB2b2lkIExvZ1VzZXJIYXBwaW5lc3NCeVByb2ZpbGVGb3JtVHlwZShVc2VySGFwcGluZXNzTWV0cmljIG1ldHJpYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByb2ZpbGVfZm9ybV9iaXRtYXNrKTsKIAorICAvLyBMb2dzIHRoZSBjb3VudCBvZiBjYWxscyB0byBQYXltZW50c0NsaWVudDo6R2V0VW5tYXNrRGV0YWlscygpIChha2EKKyAgLy8gR2V0RGV0YWlsc0ZvckdldFJlYWxQYW4pLgorICBzdGF0aWMgdm9pZCBMb2dDYXJkVW5tYXNrUHJlZmxpZ2h0Q2FsbGVkKCk7CisKICAgLy8gTG9ncyB8ZXZlbnR8IHRvIHRoZSB1bm1hc2sgcHJvbXB0IGV2ZW50cyBoaXN0b2dyYW0uCiAgIHN0YXRpYyB2b2lkIExvZ1VubWFza1Byb21wdEV2ZW50KFVubWFza1Byb21wdEV2ZW50IGV2ZW50KTsKIApkaWZmIC0tZ2l0IGEvY29tcG9uZW50cy9hdXRvZmlsbC9jb3JlL2Jyb3dzZXIvYXV0b2ZpbGxfbWV0cmljc191bml0dGVzdC5jYyBiL2NvbXBvbmVudHMvYXV0b2ZpbGwvY29yZS9icm93c2VyL2F1dG9maWxsX21ldHJpY3NfdW5pdHRlc3QuY2MKaW5kZXggMjliNWRmOS4uNjA0ODM4NGUgMTAwNjQ0Ci0tLSBhL2NvbXBvbmVudHMvYXV0b2ZpbGwvY29yZS9icm93c2VyL2F1dG9maWxsX21ldHJpY3NfdW5pdHRlc3QuY2MKKysrIGIvY29tcG9uZW50cy9hdXRvZmlsbC9jb3JlL2Jyb3dzZXIvYXV0b2ZpbGxfbWV0cmljc191bml0dGVzdC5jYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgImJhc2UvdGVzdC9zY29wZWRfZmVhdHVyZV9saXN0LmgiCiAjaW5jbHVkZSAiYmFzZS90ZXN0L3Rhc2tfZW52aXJvbm1lbnQuaCIKICNpbmNsdWRlICJiYXNlL3RpbWUvdGltZS5oIgorI2luY2x1ZGUgImJ1aWxkL2J1aWxkX2NvbmZpZy5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvYXV0b2ZpbGwvY29yZS9icm93c2VyL2F1dG9maWxsX2RhdGFfdXRpbC5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvYXV0b2ZpbGwvY29yZS9icm93c2VyL2F1dG9maWxsX2V4dGVybmFsX2RlbGVnYXRlLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9hdXRvZmlsbC9jb3JlL2Jyb3dzZXIvYXV0b2ZpbGxfdGVzdF91dGlscy5oIgpAQCAtMjgsNiArMjksNyBAQAogI2luY2x1ZGUgImNvbXBvbmVudHMvYXV0b2ZpbGwvY29yZS9icm93c2VyL21ldHJpY3MvY3JlZGl0X2NhcmRfZm9ybV9ldmVudF9sb2dnZXIuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL2F1dG9maWxsL2NvcmUvYnJvd3Nlci9tZXRyaWNzL2Zvcm1fZXZlbnRzLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9hdXRvZmlsbC9jb3JlL2Jyb3dzZXIvbW9ja19hdXRvY29tcGxldGVfaGlzdG9yeV9tYW5hZ2VyLmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9hdXRvZmlsbC9jb3JlL2Jyb3dzZXIvcGF5bWVudHMvY3JlZGl0X2NhcmRfYWNjZXNzX21hbmFnZXIuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL2F1dG9maWxsL2NvcmUvYnJvd3Nlci9wYXltZW50cy90ZXN0X2NyZWRpdF9jYXJkX3NhdmVfbWFuYWdlci5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvYXV0b2ZpbGwvY29yZS9icm93c2VyL3BheW1lbnRzL3Rlc3RfcGF5bWVudHNfY2xpZW50LmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9hdXRvZmlsbC9jb3JlL2Jyb3dzZXIvcGVyc29uYWxfZGF0YV9tYW5hZ2VyLmgiCkBAIC00Myw2ICs0NSw3IEBACiAjaW5jbHVkZSAiY29tcG9uZW50cy9hdXRvZmlsbC9jb3JlL2Jyb3dzZXIvd2ViZGF0YS9hdXRvZmlsbF93ZWJkYXRhX3NlcnZpY2UuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL2F1dG9maWxsL2NvcmUvY29tbW9uL2F1dG9maWxsX2Nsb2NrLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9hdXRvZmlsbC9jb3JlL2NvbW1vbi9hdXRvZmlsbF9mZWF0dXJlcy5oIgorI2luY2x1ZGUgImNvbXBvbmVudHMvYXV0b2ZpbGwvY29yZS9jb21tb24vYXV0b2ZpbGxfcGF5bWVudHNfZmVhdHVyZXMuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL2F1dG9maWxsL2NvcmUvY29tbW9uL2Zvcm1fZGF0YS5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvYXV0b2ZpbGwvY29yZS9jb21tb24vZm9ybV9maWVsZF9kYXRhLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9wcmVmcy9wcmVmX3NlcnZpY2UuaCIKQEAgLTU3LDYgKzYwLDEwIEBACiAjaW5jbHVkZSAidWkvZ2Z4L2dlb21ldHJ5L3JlY3QuaCIKICNpbmNsdWRlICJ1cmwvZ3VybC5oIgogCisjaWYgIWRlZmluZWQoT1NfSU9TKQorI2luY2x1ZGUgImNvbXBvbmVudHMvYXV0b2ZpbGwvY29yZS9icm93c2VyL3BheW1lbnRzL3Rlc3RfY3JlZGl0X2NhcmRfZmlkb19hdXRoZW50aWNhdG9yLmgiCisjZW5kaWYKKwogdXNpbmcgYmFzZTo6QVNDSUlUb1VURjE2OwogdXNpbmcgYmFzZTo6QnVja2V0OwogdXNpbmcgYmFzZTo6VGltZVRpY2tzOwpAQCAtMjY4LDYgKzI3NSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlX21hc2tlZF9zZXJ2ZXJfY3JlZGl0X2NhcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVfZnVsbF9zZXJ2ZXJfY3JlZGl0X2NhcmQpOwogCisgIC8vIElmIHNldCB0byB0cnVlLCB0aGVuIHVzZXIgaXMgY2FwYWJsZSBvZiB1c2luZyBGSURPIGF1dGhlbnRpY2F0aW9uIGZvciBjYXJkCisgIC8vIHVubWFza2luZy4KKyAgdm9pZCBTZXRGaWRvRWxpZ2liaWxpdHkoYm9vbCBpc192ZXJpZmlhYmxlKTsKKwogICAvLyBNb2NrcyBhIFJQQyByZXNwb25zZSBmcm9tIHBheW1lbnRzLgogICB2b2lkIE9uRGlkR2V0UmVhbFBhbihBdXRvZmlsbENsaWVudDo6UGF5bWVudHNScGNSZXN1bHQgcmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcmVhbF9wYW4pOwpAQCAtMzQzLDYgKzM1NCwxMyBAQAogICAgICAgYXV0b2ZpbGxfbWFuYWdlcl8uZ2V0KCksIGF1dG9maWxsX2RyaXZlcl8uZ2V0KCkpOwogICBhdXRvZmlsbF9tYW5hZ2VyXy0+U2V0RXh0ZXJuYWxEZWxlZ2F0ZShleHRlcm5hbF9kZWxlZ2F0ZV8uZ2V0KCkpOwogCisjaWYgIWRlZmluZWQoT1NfSU9TKQorICBhdXRvZmlsbF9tYW5hZ2VyXy0+Y3JlZGl0X2NhcmRfYWNjZXNzX21hbmFnZXIoKQorICAgICAgLT5zZXRfZmlkb19hdXRoZW50aWNhdG9yX2Zvcl90ZXN0aW5nKAorICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8VGVzdENyZWRpdENhcmRGSURPQXV0aGVudGljYXRvcj4oCisgICAgICAgICAgICAgIGF1dG9maWxsX2RyaXZlcl8uZ2V0KCksICZhdXRvZmlsbF9jbGllbnRfKSk7CisjZW5kaWYKKwogICAvLyBJbml0aWFsaXplIHRoZSBUZXN0UGVyc29uYWxEYXRhTWFuYWdlciB3aXRoIHNvbWUgZGVmYXVsdCBkYXRhLgogICBDcmVhdGVUZXN0QXV0b2ZpbGxQcm9maWxlcygpOwogfQpAQCAtMzkyLDYgKzQxMCwxOSBAQAogICBwZXJzb25hbF9kYXRhXy0+UmVmcmVzaCgpOwogfQogCit2b2lkIEF1dG9maWxsTWV0cmljc1Rlc3Q6OlNldEZpZG9FbGlnaWJpbGl0eShib29sIGlzX3ZlcmlmaWFibGUpIHsKKyNpZiAhZGVmaW5lZChPU19JT1MpCisgIHN0YXRpY19jYXN0PFRlc3RDcmVkaXRDYXJkRklET0F1dGhlbnRpY2F0b3IqPigKKyAgICAgIGF1dG9maWxsX21hbmFnZXJfLT5jcmVkaXRfY2FyZF9hY2Nlc3NfbWFuYWdlcigpCisgICAgICAgICAgLT5HZXRPckNyZWF0ZUZJRE9BdXRoZW50aWNhdG9yKCkpCisgICAgICAtPlNldFVzZXJWZXJpZmlhYmxlKGlzX3ZlcmlmaWFibGUpOworI2VuZGlmCisgIGF1dG9maWxsX21hbmFnZXJfLT5jcmVkaXRfY2FyZF9hY2Nlc3NfbWFuYWdlcigpCisgICAgICAtPmNhbl9mZXRjaF91bm1hc2tfZGV0YWlsc18uU2lnbmFsKCk7CisgIGF1dG9maWxsX21hbmFnZXJfLT5jcmVkaXRfY2FyZF9hY2Nlc3NfbWFuYWdlcigpLT5pc191c2VyX3ZlcmlmaWFibGVfID0KKyAgICAgIGJhc2U6Om51bGxvcHQ7Cit9CisKIHZvaWQgQXV0b2ZpbGxNZXRyaWNzVGVzdDo6T25EaWRHZXRSZWFsUGFuKAogICAgIEF1dG9maWxsQ2xpZW50OjpQYXltZW50c1JwY1Jlc3VsdCByZXN1bHQsCiAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHJlYWxfcGFuKSB7CkBAIC00MjUyLDYgKzQyODMsMTA1IEBACiAgIH0KIH0KIAorLy8gVGVzdCB0aGF0IHdlIGxvZyBwcmVmbGlnaHQgY2FsbHMgZm9yIGNyZWRpdCBjYXJkIHVubWFza2luZy4KK1RFU1RfRihBdXRvZmlsbE1ldHJpY3NUZXN0LCBDcmVkaXRDYXJkVW5tYXNraW5nUHJlZmxpZ2h0Q2FsbCkgeworICBzY29wZWRfZmVhdHVyZV9saXN0Xy5Jbml0QW5kRW5hYmxlRmVhdHVyZSgKKyAgICAgIGZlYXR1cmVzOjprQXV0b2ZpbGxDcmVkaXRDYXJkQXV0aGVudGljYXRpb24pOworICBzdGQ6OnN0cmluZyBwcmVmbGlnaHRfY2FsbF9tZXRyaWMgPQorICAgICAgIkF1dG9maWxsLkJldHRlckF1dGguQ2FyZFVubWFza1ByZWZsaWdodENhbGxlZCI7CisKKyAgLy8gU2V0IHVwIG91ciBmb3JtIGRhdGEuCisgIEZvcm1EYXRhIGZvcm07CisgIEZvcm1GaWVsZERhdGEgZmllbGQ7CisgIHN0ZDo6dmVjdG9yPFNlcnZlckZpZWxkVHlwZT4gZmllbGRfdHlwZXM7CisgIHRlc3Q6OkNyZWF0ZVRlc3RGb3JtRmllbGQoIkNyZWRpdCBjYXJkIiwgImNhcmQiLCAiIiwgInRleHQiLCAmZmllbGQpOworICBmb3JtLmZpZWxkcy5wdXNoX2JhY2soZmllbGQpOworICBmaWVsZF90eXBlcy5wdXNoX2JhY2soQ1JFRElUX0NBUkRfTlVNQkVSKTsKKworICAvLyBTaW11bGF0ZSBoYXZpbmcgc2VlbiB0aGlzIGZvcm0gb24gcGFnZSBsb2FkLgorICAvLyB8Zm9ybV9zdHJ1Y3R1cmV8IHdpbGwgYmUgb3duZWQgYnkgfGF1dG9maWxsX21hbmFnZXJffC4KKyAgYXV0b2ZpbGxfbWFuYWdlcl8tPkFkZFNlZW5Gb3JtKGZvcm0sIGZpZWxkX3R5cGVzLCBmaWVsZF90eXBlcyk7CisKKyAgeworICAgIC8vIENyZWF0ZSBsb2NhbCBjYXJkcyBhbmQgc2V0IHVzZXIgYXMgZWxpZ2libGUgZm9yIEZJRE8gYXV0aGVudGljYXRpb24uCisgICAgYmFzZTo6SGlzdG9ncmFtVGVzdGVyIGhpc3RvZ3JhbV90ZXN0ZXI7CisgICAgUmVjcmVhdGVDcmVkaXRDYXJkcyh0cnVlIC8qIGluY2x1ZGVfbG9jYWxfY3JlZGl0X2NhcmQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBpbmNsdWRlX21hc2tlZF9zZXJ2ZXJfY3JlZGl0X2NhcmQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBpbmNsdWRlX2Z1bGxfc2VydmVyX2NyZWRpdF9jYXJkICovKTsKKyAgICBTZXRGaWRvRWxpZ2liaWxpdHkodHJ1ZSk7CisgICAgYXV0b2ZpbGxfbWFuYWdlcl8tPkRpZFNob3dTdWdnZXN0aW9ucyh0cnVlIC8qIGlzX25ld19wb3B1cCAqLywgZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0uZmllbGRzWzBdKTsKKyAgICAvLyBJZiBubyBtYXNrZWQgc2VydmVyIGNhcmRzIGFyZSBhdmFpbGFibGUsIHRoZW4gbm8gcHJlZmxpZ2h0IGNhbGwgaXMgbWFkZS4KKyAgICBoaXN0b2dyYW1fdGVzdGVyLkV4cGVjdFRvdGFsQ291bnQocHJlZmxpZ2h0X2NhbGxfbWV0cmljLCAwKTsKKyAgfQorCisgIHsKKyAgICAvLyBDcmVhdGUgbWFza2VkIHNlcnZlciBjYXJkcyBhbmQgc2V0IHVzZXIgYXMgaW5lbGlnaWJsZSBmb3IgRklETworICAgIC8vIGF1dGhlbnRpY2F0aW9uLgorICAgIGJhc2U6Okhpc3RvZ3JhbVRlc3RlciBoaXN0b2dyYW1fdGVzdGVyOworICAgIFJlY3JlYXRlQ3JlZGl0Q2FyZHMoZmFsc2UgLyogaW5jbHVkZV9sb2NhbF9jcmVkaXRfY2FyZCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogaW5jbHVkZV9tYXNrZWRfc2VydmVyX2NyZWRpdF9jYXJkICovLAorICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogaW5jbHVkZV9mdWxsX3NlcnZlcl9jcmVkaXRfY2FyZCAqLyk7CisgICAgU2V0Rmlkb0VsaWdpYmlsaXR5KGZhbHNlKTsKKyAgICBhdXRvZmlsbF9tYW5hZ2VyXy0+RGlkU2hvd1N1Z2dlc3Rpb25zKHRydWUgLyogaXNfbmV3X3BvcHVwICovLCBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5maWVsZHNbMF0pOworICAgIC8vIElmIHVzZXIgaXMgbm90IHZlcmlmaWFibGUsIHRoZW4gbm8gcHJlZmxpZ2h0IGNhbGwgaXMgbWFkZS4KKyAgICBoaXN0b2dyYW1fdGVzdGVyLkV4cGVjdFRvdGFsQ291bnQocHJlZmxpZ2h0X2NhbGxfbWV0cmljLCAwKTsKKyAgfQorCisgIHsKKyAgICAvLyBDcmVhdGUgZnVsbCBzZXJ2ZXIgY2FyZHMgYW5kIHNldCB1c2VyIGFzIGVsaWdpYmxlIGZvciBGSURPCisgICAgLy8gYXV0aGVudGljYXRpb24uCisgICAgYmFzZTo6SGlzdG9ncmFtVGVzdGVyIGhpc3RvZ3JhbV90ZXN0ZXI7CisgICAgUmVjcmVhdGVDcmVkaXRDYXJkcyhmYWxzZSAvKiBpbmNsdWRlX2xvY2FsX2NyZWRpdF9jYXJkICovLAorICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogaW5jbHVkZV9tYXNrZWRfc2VydmVyX2NyZWRpdF9jYXJkICovLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBpbmNsdWRlX2Z1bGxfc2VydmVyX2NyZWRpdF9jYXJkICovKTsKKyAgICBTZXRGaWRvRWxpZ2liaWxpdHkoZmFsc2UpOworICAgIGF1dG9maWxsX21hbmFnZXJfLT5EaWRTaG93U3VnZ2VzdGlvbnModHJ1ZSAvKiBpc19uZXdfcG9wdXAgKi8sIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLmZpZWxkc1swXSk7CisgICAgLy8gSWYgbm8gbWFza2VkIHNlcnZlciBjYXJkcyBhcmUgYXZhaWxhYmxlLCB0aGVuIG5vIHByZWZsaWdodCBjYWxsIGlzIG1hZGUuCisgICAgaGlzdG9ncmFtX3Rlc3Rlci5FeHBlY3RUb3RhbENvdW50KHByZWZsaWdodF9jYWxsX21ldHJpYywgMCk7CisgIH0KKworICB7CisgICAgLy8gQ3JlYXRlIG1hc2tlZCBzZXJ2ZXIgY2FyZHMgYW5kIHNldCB1c2VyIGFzIGVsaWdpYmxlIGZvciBGSURPCisgICAgLy8gYXV0aGVudGljYXRpb24uCisgICAgYmFzZTo6SGlzdG9ncmFtVGVzdGVyIGhpc3RvZ3JhbV90ZXN0ZXI7CisgICAgUmVjcmVhdGVDcmVkaXRDYXJkcyhmYWxzZSAvKiBpbmNsdWRlX2xvY2FsX2NyZWRpdF9jYXJkICovLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBpbmNsdWRlX21hc2tlZF9zZXJ2ZXJfY3JlZGl0X2NhcmQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBpbmNsdWRlX2Z1bGxfc2VydmVyX2NyZWRpdF9jYXJkICovKTsKKyAgICBTZXRGaWRvRWxpZ2liaWxpdHkodHJ1ZSk7CisgICAgYXV0b2ZpbGxfbWFuYWdlcl8tPkRpZFNob3dTdWdnZXN0aW9ucyh0cnVlIC8qIGlzX25ld19wb3B1cCAqLywgZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0uZmllbGRzWzBdKTsKKyAgICAvLyBQcmVmbGlnaHQgY2FsbCBpcyBtYWRlIG9ubHkgaWYgYSBtYXNrZWQgc2VydmVyIGNhcmQgaXMgYXZhaWxhYmxlIGFuZCB0aGUKKyAgICAvLyB1c2VyIGlzIGVsaWdpYmxlIGZvciBGSURPIGF1dGhlbnRpY2F0aW9uIChleGNlcHQgaU9TKS4KKyNpZiBkZWZpbmVkKE9TX0lPUykKKyAgICBoaXN0b2dyYW1fdGVzdGVyLkV4cGVjdFRvdGFsQ291bnQocHJlZmxpZ2h0X2NhbGxfbWV0cmljLCAwKTsKKyNlbHNlCisgICAgaGlzdG9ncmFtX3Rlc3Rlci5FeHBlY3RUb3RhbENvdW50KHByZWZsaWdodF9jYWxsX21ldHJpYywgMSk7CisjZW5kaWYKKyAgfQorCisgIHsKKyAgICAvLyBDcmVhdGUgYWxsIHR5cGVzIG9mIGNhcmRzIGFuZCBzZXQgdXNlciBhcyBlbGlnaWJsZSBmb3IgRklETworICAgIC8vIGF1dGhlbnRpY2F0aW9uLgorICAgIGJhc2U6Okhpc3RvZ3JhbVRlc3RlciBoaXN0b2dyYW1fdGVzdGVyOworICAgIFJlY3JlYXRlQ3JlZGl0Q2FyZHModHJ1ZSAvKiBpbmNsdWRlX2xvY2FsX2NyZWRpdF9jYXJkICovLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBpbmNsdWRlX21hc2tlZF9zZXJ2ZXJfY3JlZGl0X2NhcmQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGluY2x1ZGVfZnVsbF9zZXJ2ZXJfY3JlZGl0X2NhcmQgKi8pOworICAgIFNldEZpZG9FbGlnaWJpbGl0eSh0cnVlKTsKKyAgICBhdXRvZmlsbF9tYW5hZ2VyXy0+RGlkU2hvd1N1Z2dlc3Rpb25zKHRydWUgLyogaXNfbmV3X3BvcHVwICovLCBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5maWVsZHNbMF0pOworICAgIC8vIFByZWZsaWdodCBjYWxsIGlzIG1hZGUgb25seSBpZiBhIG1hc2tlZCBzZXJ2ZXIgY2FyZCBpcyBhdmFpbGFibGUgYW5kIHRoZQorICAgIC8vIHVzZXIgaXMgZWxpZ2libGUgZm9yIEZJRE8gYXV0aGVudGljYXRpb24gKGV4Y2VwdCBpT1MpLgorI2lmIGRlZmluZWQoT1NfSU9TKQorICAgIGhpc3RvZ3JhbV90ZXN0ZXIuRXhwZWN0VG90YWxDb3VudChwcmVmbGlnaHRfY2FsbF9tZXRyaWMsIDApOworI2Vsc2UKKyAgICBoaXN0b2dyYW1fdGVzdGVyLkV4cGVjdFRvdGFsQ291bnQocHJlZmxpZ2h0X2NhbGxfbWV0cmljLCAxKTsKKyNlbmRpZgorICB9Cit9CisKIC8vIFRlc3QgdGhhdCB3ZSBsb2cgc3VibWl0dGVkIGZvcm0gZXZlbnRzIGZvciBjcmVkaXQgY2FyZHMuCiBURVNUX0YoQXV0b2ZpbGxNZXRyaWNzVGVzdCwgQ3JlZGl0Q2FyZEdldFJlYWxQYW5EdXJhdGlvbikgewogICAvLyBDcmVhdGluZyBtYXNrZWQgY2FyZApkaWZmIC0tZ2l0IGEvY29tcG9uZW50cy9hdXRvZmlsbC9jb3JlL2Jyb3dzZXIvZGF0YV9tb2RlbC9hdXRvZmlsbF9wcm9maWxlX2NvbXBhcmF0b3IuY2MgYi9jb21wb25lbnRzL2F1dG9maWxsL2NvcmUvYnJvd3Nlci9kYXRhX21vZGVsL2F1dG9maWxsX3Byb2ZpbGVfY29tcGFyYXRvci5jYwppbmRleCA5YjQxYjBiLi5hYzU3OGQzIDEwMDY0NAotLS0gYS9jb21wb25lbnRzL2F1dG9maWxsL2NvcmUvYnJvd3Nlci9kYXRhX21vZGVsL2F1dG9maWxsX3Byb2ZpbGVfY29tcGFyYXRvci5jYworKysgYi9jb21wb25lbnRzL2F1dG9maWxsL2NvcmUvYnJvd3Nlci9kYXRhX21vZGVsL2F1dG9maWxsX3Byb2ZpbGVfY29tcGFyYXRvci5jYwpAQCAtMTYsOCArMTYsMTAgQEAKICNpbmNsdWRlICJiYXNlL3N0cmluZ3MvdXRmX3N0cmluZ19jb252ZXJzaW9ucy5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvYXV0b2ZpbGwvY29yZS9icm93c2VyL2FkZHJlc3NfcmV3cml0ZXIuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL2F1dG9maWxsL2NvcmUvYnJvd3Nlci9hdXRvZmlsbF9kYXRhX3V0aWwuaCIKKyNpbmNsdWRlICJjb21wb25lbnRzL2F1dG9maWxsL2NvcmUvYnJvd3Nlci9hdXRvZmlsbF9tZXRyaWNzLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9hdXRvZmlsbC9jb3JlL2Jyb3dzZXIvZ2VvL2F1dG9maWxsX2NvdW50cnkuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL2F1dG9maWxsL2NvcmUvYnJvd3Nlci9nZW8vc3RhdGVfbmFtZXMuaCIKKyNpbmNsdWRlICJjb21wb25lbnRzL2F1dG9maWxsL2NvcmUvY29tbW9uL2F1dG9maWxsX2Nsb2NrLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvbGlicGhvbmVudW1iZXIvcGhvbmVudW1iZXJfYXBpLmgiCiAKIHVzaW5nIGJhc2U6OlVURjE2VG9VVEY4OwpAQCAtODI5LDYgKzgzMSw3MCBAQAogfQogCiAvLyBzdGF0aWMKK3N0ZDo6c3RyaW5nIEF1dG9maWxsUHJvZmlsZUNvbXBhcmF0b3I6Ok1lcmdlUHJvZmlsZSgKKyAgICBjb25zdCBBdXRvZmlsbFByb2ZpbGUmIG5ld19wcm9maWxlLAorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxBdXRvZmlsbFByb2ZpbGU+PiogZXhpc3RpbmdfcHJvZmlsZXMsCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFwcF9sb2NhbGUsCisgICAgc3RkOjp2ZWN0b3I8QXV0b2ZpbGxQcm9maWxlPiogbWVyZ2VkX3Byb2ZpbGVzKSB7CisgIG1lcmdlZF9wcm9maWxlcy0+Y2xlYXIoKTsKKworICAvLyBTb3J0IHRoZSBleGlzdGluZyBwcm9maWxlcyBpbiBkZWNyZWFzaW5nIG9yZGVyIG9mIGZyZWNlbmN5LCBzbyB0aGUgImJlc3QiCisgIC8vIHByb2ZpbGVzIGFyZSBjaGVja2VkIGZpcnN0LiBQdXQgdGhlIHZlcmlmaWVkIHByb2ZpbGVzIGxhc3Qgc28gdGhlIG5vbgorICAvLyB2ZXJpZmllZCBwcm9maWxlcyBnZXQgZGVkdXBlZCBhbW9uZyB0aGVtc2VsdmVzIGJlZm9yZSByZWFjaGluZyB0aGUgdmVyaWZpZWQKKyAgLy8gcHJvZmlsZXMuCisgIC8vIFRPRE8oY3JidWcuY29tLzYyMDUyMSk6IFJlbW92ZSB0aGUgY2hlY2sgZm9yIHZlcmlmaWVkIGZyb20gdGhlIHNvcnQuCisgIGJhc2U6OlRpbWUgY29tcGFyaXNvbl90aW1lID0gQXV0b2ZpbGxDbG9jazo6Tm93KCk7CisgIHN0ZDo6c29ydChleGlzdGluZ19wcm9maWxlcy0+YmVnaW4oKSwgZXhpc3RpbmdfcHJvZmlsZXMtPmVuZCgpLAorICAgICAgICAgICAgW2NvbXBhcmlzb25fdGltZV0oY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEF1dG9maWxsUHJvZmlsZT4mIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QXV0b2ZpbGxQcm9maWxlPiYgYikgeworICAgICAgICAgICAgICBpZiAoYS0+SXNWZXJpZmllZCgpICE9IGItPklzVmVyaWZpZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gIWEtPklzVmVyaWZpZWQoKTsKKyAgICAgICAgICAgICAgcmV0dXJuIGEtPkhhc0dyZWF0ZXJGcmVjZW5jeVRoYW4oYi5nZXQoKSwgY29tcGFyaXNvbl90aW1lKTsKKyAgICAgICAgICAgIH0pOworCisgIC8vIFNldCB0byB0cnVlIGlmIHxleGlzdGluZ19wcm9maWxlc3wgYWxyZWFkeSBjb250YWlucyBhbiBlcXVpdmFsZW50IHByb2ZpbGUuCisgIGJvb2wgbWF0Y2hpbmdfcHJvZmlsZV9mb3VuZCA9IGZhbHNlOworICBzdGQ6OnN0cmluZyBndWlkID0gbmV3X3Byb2ZpbGUuZ3VpZCgpOworCisgIC8vIElmIHdlIGhhdmUgYWxyZWFkeSBzYXZlZCB0aGlzIGFkZHJlc3MsIG1lcmdlIGluIGFueSBtaXNzaW5nIHZhbHVlcy4KKyAgLy8gT25seSBtZXJnZSB3aXRoIHRoZSBmaXJzdCBtYXRjaC4gTWVyZ2luZyB0aGUgbmV3IHByb2ZpbGUgaW50byB0aGUgZXhpc3RpbmcKKyAgLy8gb25lIHByZXNlcnZlcyB0aGUgdmFsaWRpdHkgb2YgY3JlZGl0IGNhcmQncyBiaWxsaW5nIGFkZHJlc3MgcmVmZXJlbmNlLgorICBBdXRvZmlsbFByb2ZpbGVDb21wYXJhdG9yIGNvbXBhcmF0b3IoYXBwX2xvY2FsZSk7CisgIGZvciAoY29uc3QgYXV0byYgZXhpc3RpbmdfcHJvZmlsZSA6ICpleGlzdGluZ19wcm9maWxlcykgeworICAgIGlmICghbWF0Y2hpbmdfcHJvZmlsZV9mb3VuZCAmJgorICAgICAgICBjb21wYXJhdG9yLkFyZU1lcmdlYWJsZShuZXdfcHJvZmlsZSwgKmV4aXN0aW5nX3Byb2ZpbGUpICYmCisgICAgICAgIGV4aXN0aW5nX3Byb2ZpbGUtPlNhdmVBZGRpdGlvbmFsSW5mbyhuZXdfcHJvZmlsZSwgYXBwX2xvY2FsZSkpIHsKKyAgICAgIC8vIFVudmVyaWZpZWQgcHJvZmlsZXMgc2hvdWxkIGFsd2F5cyBiZSB1cGRhdGVkIHdpdGggdGhlIG5ld2VyIGRhdGEsCisgICAgICAvLyB3aGVyZWFzIHZlcmlmaWVkIHByb2ZpbGVzIHNob3VsZCBvbmx5IGV2ZXIgYmUgb3ZlcndyaXR0ZW4gYnkgdmVyaWZpZWQKKyAgICAgIC8vIGRhdGEuICBJZiBhbiBhdXRvbWF0aWNhbGx5IGFnZ3JlZ2F0ZWQgcHJvZmlsZSB3b3VsZCBvdmVyd3JpdGUgYQorICAgICAgLy8gdmVyaWZpZWQgcHJvZmlsZSwganVzdCBkcm9wIGl0LgorICAgICAgbWF0Y2hpbmdfcHJvZmlsZV9mb3VuZCA9IHRydWU7CisgICAgICBndWlkID0gZXhpc3RpbmdfcHJvZmlsZS0+Z3VpZCgpOworCisgICAgICAvLyBXZSBzZXQgdGhlIG1vZGlmaWNhdGlvbiBkYXRlIHNvIHRoYXQgaW1tZWRpYXRlIHJlcXVlc3RzIGZvciBwcm9maWxlcworICAgICAgLy8gd2lsbCBwcm9wZXJseSByZWZsZWN0IHRoZSBmYWN0IHRoYXQgdGhpcyBwcm9maWxlIGhhcyBiZWVuIG1vZGlmaWVkCisgICAgICAvLyByZWNlbnRseS4gQWZ0ZXIgd3JpdGluZyB0byB0aGUgZGF0YWJhc2UgYW5kIHJlZnJlc2hpbmcgdGhlIGxvY2FsIGNvcGllcworICAgICAgLy8gdGhlIHByb2ZpbGUgd2lsbCBoYXZlIGEgdmVyeSBzbGlnaHRseSBuZXdlciB0aW1lIHJlZmxlY3Rpbmcgd2hhdCdzCisgICAgICAvLyBhY3R1YWxseSBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlLgorICAgICAgZXhpc3RpbmdfcHJvZmlsZS0+c2V0X21vZGlmaWNhdGlvbl9kYXRlKEF1dG9maWxsQ2xvY2s6Ok5vdygpKTsKKyAgICB9CisgICAgbWVyZ2VkX3Byb2ZpbGVzLT5wdXNoX2JhY2soKmV4aXN0aW5nX3Byb2ZpbGUpOworICB9CisKKyAgLy8gSWYgdGhlIG5ldyBwcm9maWxlIHdhcyBub3QgbWVyZ2VkIHdpdGggYW4gZXhpc3Rpbmcgb25lLCBhZGQgaXQgdG8gdGhlIGxpc3QuCisgIGlmICghbWF0Y2hpbmdfcHJvZmlsZV9mb3VuZCkgeworICAgIG1lcmdlZF9wcm9maWxlcy0+cHVzaF9iYWNrKG5ld19wcm9maWxlKTsKKyAgICAvLyBTaW1pbGFyIHRvIHVwZGF0aW5nIG1lcmdlZCBwcm9maWxlcyBhYm92ZSwgc2V0IHRoZSBtb2RpZmljYXRpb24gZGF0ZSBvbgorICAgIC8vIG5ldyBwcm9maWxlcy4KKyAgICBtZXJnZWRfcHJvZmlsZXMtPmJhY2soKS5zZXRfbW9kaWZpY2F0aW9uX2RhdGUoQXV0b2ZpbGxDbG9jazo6Tm93KCkpOworICAgIEF1dG9maWxsTWV0cmljczo6TG9nUHJvZmlsZUFjdGlvbk9uRm9ybVN1Ym1pdHRlZCgKKyAgICAgICAgQXV0b2ZpbGxNZXRyaWNzOjpORVdfUFJPRklMRV9DUkVBVEVEKTsKKyAgfQorCisgIHJldHVybiBndWlkOworfQorCisvLyBzdGF0aWMKIHN0ZDo6c2V0PGJhc2U6OlN0cmluZ1BpZWNlMTY+IEF1dG9maWxsUHJvZmlsZUNvbXBhcmF0b3I6OlVuaXF1ZVRva2VucygKICAgICBiYXNlOjpTdHJpbmdQaWVjZTE2IHMpIHsKICAgc3RkOjp2ZWN0b3I8YmFzZTo6U3RyaW5nUGllY2UxNj4gdG9rZW5zID0gYmFzZTo6U3BsaXRTdHJpbmdQaWVjZSgKZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvYXV0b2ZpbGwvY29yZS9icm93c2VyL2RhdGFfbW9kZWwvYXV0b2ZpbGxfcHJvZmlsZV9jb21wYXJhdG9yLmggYi9jb21wb25lbnRzL2F1dG9maWxsL2NvcmUvYnJvd3Nlci9kYXRhX21vZGVsL2F1dG9maWxsX3Byb2ZpbGVfY29tcGFyYXRvci5oCmluZGV4IDEyN2M4Mjg3Li41MjViZjA3IDEwMDY0NAotLS0gYS9jb21wb25lbnRzL2F1dG9maWxsL2NvcmUvYnJvd3Nlci9kYXRhX21vZGVsL2F1dG9maWxsX3Byb2ZpbGVfY29tcGFyYXRvci5oCisrKyBiL2NvbXBvbmVudHMvYXV0b2ZpbGwvY29yZS9icm93c2VyL2RhdGFfbW9kZWwvYXV0b2ZpbGxfcHJvZmlsZV9jb21wYXJhdG9yLmgKQEAgLTEzOCw2ICsxMzgsMTYgQEAKICAgLy8gQXBwIGxvY2FsZSB1c2VkIHdoZW4gdGhpcyBjb21wYXJhdG9yIGluc3RhbmNlIHdhcyBjcmVhdGVkLgogICBjb25zdCBzdGQ6OnN0cmluZyBhcHBfbG9jYWxlKCkgY29uc3QgeyByZXR1cm4gYXBwX2xvY2FsZV87IH0KIAorICAvLyBNZXJnZXMgfG5ld19wcm9maWxlfCBpbnRvIG9uZSBvZiB0aGUgfGV4aXN0aW5nX3Byb2ZpbGVzfCBpZiBwb3NzaWJsZTsKKyAgLy8gb3RoZXJ3aXNlIGFwcGVuZHMgfG5ld19wcm9maWxlfCB0byB0aGUgZW5kIG9mIHRoYXQgbGlzdC4gRmlsbHMKKyAgLy8gfG1lcmdlZF9wcm9maWxlc3wgd2l0aCB0aGUgcmVzdWx0LiBSZXR1cm5zIHRoZSB8Z3VpZHwgb2YgdGhlIG5ldyBvciB1cGRhdGVkCisgIC8vIHByb2ZpbGUuCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBNZXJnZVByb2ZpbGUoCisgICAgICBjb25zdCBBdXRvZmlsbFByb2ZpbGUmIG5ld19wcm9maWxlLAorICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEF1dG9maWxsUHJvZmlsZT4+KiBleGlzdGluZ19wcm9maWxlcywKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhcHBfbG9jYWxlLAorICAgICAgc3RkOjp2ZWN0b3I8QXV0b2ZpbGxQcm9maWxlPiogbWVyZ2VkX3Byb2ZpbGVzKTsKKwogIHByb3RlY3RlZDoKICAgLy8gVGhlIHJlc3VsdCB0eXBlIHJldHVybmVkIGJ5IENvbXBhcmVUb2tlbnMuCiAgIGVudW0gQ29tcGFyZVRva2Vuc1Jlc3VsdCB7CmRpZmYgLS1naXQgYS9jb21wb25lbnRzL2F1dG9maWxsL2NvcmUvYnJvd3Nlci9wYXltZW50cy9jcmVkaXRfY2FyZF9hY2Nlc3NfbWFuYWdlci5jYyBiL2NvbXBvbmVudHMvYXV0b2ZpbGwvY29yZS9icm93c2VyL3BheW1lbnRzL2NyZWRpdF9jYXJkX2FjY2Vzc19tYW5hZ2VyLmNjCmluZGV4IGE3YzM0ZmQ0Li5jZDdkM2Q4IDEwMDY0NAotLS0gYS9jb21wb25lbnRzL2F1dG9maWxsL2NvcmUvYnJvd3Nlci9wYXltZW50cy9jcmVkaXRfY2FyZF9hY2Nlc3NfbWFuYWdlci5jYworKysgYi9jb21wb25lbnRzL2F1dG9maWxsL2NvcmUvYnJvd3Nlci9wYXltZW50cy9jcmVkaXRfY2FyZF9hY2Nlc3NfbWFuYWdlci5jYwpAQCAtMjA5LDEyICsyMDksMTQgQEAKICAgLy8gSWYgdXNlciBpcyB2ZXJpZmlhYmxlLCB0aGVuIG1ha2UgcHJlZmxpZ2h0IGNhbGwgdG8gcGF5bWVudHMgdG8gZmV0Y2ggdW5tYXNrCiAgIC8vIGRldGFpbHMsIG90aGVyd2lzZSB0aGUgb25seSBvcHRpb24gaXMgdG8gcGVyZm9ybSBDVkMgQXV0aCwgd2hpY2ggZG9lcyBub3QKICAgLy8gcmVxdWlyZSBhbnkuIERvIG5vdGhpbmcgaWYgcmVxdWVzdCBpcyBhbHJlYWR5IGluIHByb2dyZXNzLgotICBpZiAoaXNfdXNlcl92ZXJpZmlhYmxlXyAmJiAhdW5tYXNrX2RldGFpbHNfcmVxdWVzdF9pbl9wcm9ncmVzc18pIHsKKyAgaWYgKGlzX3VzZXJfdmVyaWZpYWJsZV8udmFsdWVfb3IoZmFsc2UpICYmCisgICAgICAhdW5tYXNrX2RldGFpbHNfcmVxdWVzdF9pbl9wcm9ncmVzc18pIHsKICAgICB1bm1hc2tfZGV0YWlsc19yZXF1ZXN0X2luX3Byb2dyZXNzXyA9IHRydWU7CiAgICAgcGF5bWVudHNfY2xpZW50Xy0+R2V0VW5tYXNrRGV0YWlscygKICAgICAgICAgYmFzZTo6QmluZE9uY2UoJkNyZWRpdENhcmRBY2Nlc3NNYW5hZ2VyOjpPbkRpZEdldFVubWFza0RldGFpbHMsCiAgICAgICAgICAgICAgICAgICAgICAgIHdlYWtfcHRyX2ZhY3RvcnlfLkdldFdlYWtQdHIoKSksCiAgICAgICAgIHBlcnNvbmFsX2RhdGFfbWFuYWdlcl8tPmFwcF9sb2NhbGUoKSk7CisgICAgQXV0b2ZpbGxNZXRyaWNzOjpMb2dDYXJkVW5tYXNrUHJlZmxpZ2h0Q2FsbGVkKCk7CiAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvY29tcG9uZW50cy9hdXRvZmlsbC9jb3JlL2Jyb3dzZXIvcGF5bWVudHMvY3JlZGl0X2NhcmRfYWNjZXNzX21hbmFnZXJfdW5pdHRlc3QuY2MgYi9jb21wb25lbnRzL2F1dG9maWxsL2NvcmUvYnJvd3Nlci9wYXltZW50cy9jcmVkaXRfY2FyZF9hY2Nlc3NfbWFuYWdlcl91bml0dGVzdC5jYwppbmRleCA2M2M2ZjljNy4uMzkwM2U3YSAxMDA2NDQKLS0tIGEvY29tcG9uZW50cy9hdXRvZmlsbC9jb3JlL2Jyb3dzZXIvcGF5bWVudHMvY3JlZGl0X2NhcmRfYWNjZXNzX21hbmFnZXJfdW5pdHRlc3QuY2MKKysrIGIvY29tcG9uZW50cy9hdXRvZmlsbC9jb3JlL2Jyb3dzZXIvcGF5bWVudHMvY3JlZGl0X2NhcmRfYWNjZXNzX21hbmFnZXJfdW5pdHRlc3QuY2MKQEAgLTE5MSw2ICsxOTEsMTEgQEAKICAgICByZXR1cm4gY3JlZGl0X2NhcmRfYWNjZXNzX21hbmFnZXJfLT5pc19hdXRoZW50aWNhdGlvbl9pbl9wcm9ncmVzcygpOwogICB9CiAKKyAgdm9pZCBSZXNldFByZWZsaWdodENhbGxMaW1pdGVyKCkgeworICAgIGNyZWRpdF9jYXJkX2FjY2Vzc19tYW5hZ2VyXy0+Y2FuX2ZldGNoX3VubWFza19kZXRhaWxzXy5TaWduYWwoKTsKKyAgICBjcmVkaXRfY2FyZF9hY2Nlc3NfbWFuYWdlcl8tPmlzX3VzZXJfdmVyaWZpYWJsZV8gPSBiYXNlOjpudWxsb3B0OworICB9CisKICAgdm9pZCBDcmVhdGVMb2NhbENhcmQoc3RkOjpzdHJpbmcgZ3VpZCwgc3RkOjpzdHJpbmcgbnVtYmVyID0gc3RkOjpzdHJpbmcoKSkgewogICAgIENyZWRpdENhcmQgbG9jYWxfY2FyZCA9IENyZWRpdENhcmQoKTsKICAgICB0ZXN0OjpTZXRDcmVkaXRDYXJkSW5mbygmbG9jYWxfY2FyZCwgIkVsdmlzIFByZXNsZXkiLCBudW1iZXIuY19zdHIoKSwKQEAgLTUwNyw2ICs1MTIsNjggQEAKICAgRVhQRUNUX0VRKEFTQ0lJVG9VVEYxNihrVGVzdE51bWJlciksIGFjY2Vzc29yXy0+bnVtYmVyKCkpOwogfQogCisvLyBFbnN1cmVzIHRoYXQgQ2FyZFVubWFza1ByZWZsaWdodENhbGxlZCBtZXRyaWNzIGFyZSBsb2dnZWQgY29ycmVjdGx5LgorVEVTVF9GKENyZWRpdENhcmRBY2Nlc3NNYW5hZ2VyVGVzdCwgQ2FyZFVubWFza1ByZWZsaWdodENhbGxlZE1ldHJpYykgeworICBzdGQ6OnN0cmluZyBwcmVmbGlnaHRfY2FsbF9tZXRyaWMgPQorICAgICAgIkF1dG9maWxsLkJldHRlckF1dGguQ2FyZFVubWFza1ByZWZsaWdodENhbGxlZCI7CisKKyAgeworICAgIC8vIENyZWF0ZSBsb2NhbCBjYXJkIGFuZCBzZXQgdXNlciBhcyBlbGlnaWJsZSBmb3IgRklETyBhdXRoLgorICAgIGJhc2U6Okhpc3RvZ3JhbVRlc3RlciBoaXN0b2dyYW1fdGVzdGVyOworICAgIENyZWF0ZUxvY2FsQ2FyZChrVGVzdEdVSUQsIGtUZXN0TnVtYmVyKTsKKyNpZiAhZGVmaW5lZChPU19JT1MpCisgICAgR2V0RklET0F1dGhlbnRpY2F0b3IoKS0+U2V0VXNlclZlcmlmaWFibGUodHJ1ZSk7CisjZW5kaWYKKyAgICBSZXNldFByZWZsaWdodENhbGxMaW1pdGVyKCk7CisKKyAgICBjcmVkaXRfY2FyZF9hY2Nlc3NfbWFuYWdlcl8tPlByZXBhcmVUb0ZldGNoQ3JlZGl0Q2FyZCgpOworICAgIEludm9rZVVubWFza0RldGFpbHNUaW1lb3V0KCk7CisgICAgV2FpdEZvckNhbGxiYWNrcygpOworCisgICAgLy8gSWYgb25seSBsb2NhbCBjYXJkcyBhcmUgYXZhaWxhYmxlLCB0aGVuIG5vIHByZWZsaWdodCBjYWxsIGlzIG1hZGUuCisgICAgaGlzdG9ncmFtX3Rlc3Rlci5FeHBlY3RUb3RhbENvdW50KHByZWZsaWdodF9jYWxsX21ldHJpYywgMCk7CisgIH0KKworICB7CisgICAgLy8gQ3JlYXRlIHNlcnZlciBjYXJkIGFuZCBzZXQgdXNlciBhcyBpbmVsaWdpYmxlIGZvciBGSURPIGF1dGguCisgICAgYmFzZTo6SGlzdG9ncmFtVGVzdGVyIGhpc3RvZ3JhbV90ZXN0ZXI7CisgICAgQ3JlYXRlU2VydmVyQ2FyZChrVGVzdEdVSUQsIGtUZXN0TnVtYmVyKTsKKyNpZiAhZGVmaW5lZChPU19JT1MpCisgICAgR2V0RklET0F1dGhlbnRpY2F0b3IoKS0+U2V0VXNlclZlcmlmaWFibGUoZmFsc2UpOworI2VuZGlmCisgICAgUmVzZXRQcmVmbGlnaHRDYWxsTGltaXRlcigpOworCisgICAgY3JlZGl0X2NhcmRfYWNjZXNzX21hbmFnZXJfLT5QcmVwYXJlVG9GZXRjaENyZWRpdENhcmQoKTsKKyAgICBJbnZva2VVbm1hc2tEZXRhaWxzVGltZW91dCgpOworICAgIFdhaXRGb3JDYWxsYmFja3MoKTsKKworICAgIC8vIElmIHVzZXIgaXMgbm90IHZlcmlmaWFibGUsIHRoZW4gbm8gcHJlZmxpZ2h0IGNhbGwgaXMgbWFkZS4KKyAgICBoaXN0b2dyYW1fdGVzdGVyLkV4cGVjdFRvdGFsQ291bnQocHJlZmxpZ2h0X2NhbGxfbWV0cmljLCAwKTsKKyAgfQorCisgIHsKKyAgICAvLyBDcmVhdGUgc2VydmVyIGNhcmQgYW5kIHNldCB1c2VyIGFzIGVsaWdpYmxlIGZvciBGSURPIGF1dGguCisgICAgYmFzZTo6SGlzdG9ncmFtVGVzdGVyIGhpc3RvZ3JhbV90ZXN0ZXI7CisgICAgQ3JlYXRlU2VydmVyQ2FyZChrVGVzdEdVSUQsIGtUZXN0TnVtYmVyKTsKKyNpZiAhZGVmaW5lZChPU19JT1MpCisgICAgR2V0RklET0F1dGhlbnRpY2F0b3IoKS0+U2V0VXNlclZlcmlmaWFibGUodHJ1ZSk7CisjZW5kaWYKKyAgICBSZXNldFByZWZsaWdodENhbGxMaW1pdGVyKCk7CisKKyAgICBjcmVkaXRfY2FyZF9hY2Nlc3NfbWFuYWdlcl8tPlByZXBhcmVUb0ZldGNoQ3JlZGl0Q2FyZCgpOworICAgIEludm9rZVVubWFza0RldGFpbHNUaW1lb3V0KCk7CisgICAgV2FpdEZvckNhbGxiYWNrcygpOworCisgICAgLy8gUHJlZmxpZ2h0IGNhbGwgaXMgbWFkZSBvbmx5IGlmIGEgc2VydmVyIGNhcmQgaXMgYXZhaWxhYmxlIGFuZCB0aGUgdXNlciBpcworICAgIC8vIGVsaWdpYmxlIGZvciBGSURPIGF1dGhlbnRpY2F0aW9uLCBleGNlcHQgb24gaU9TLgorI2lmIGRlZmluZWQoT1NfSU9TKQorICAgIGhpc3RvZ3JhbV90ZXN0ZXIuRXhwZWN0VG90YWxDb3VudChwcmVmbGlnaHRfY2FsbF9tZXRyaWMsIDApOworI2Vsc2UKKyAgICBoaXN0b2dyYW1fdGVzdGVyLkV4cGVjdFRvdGFsQ291bnQocHJlZmxpZ2h0X2NhbGxfbWV0cmljLCAxKTsKKyNlbmRpZgorICB9Cit9CisKICNpZiAhZGVmaW5lZChPU19JT1MpCiAvLyBFbnN1cmVzIHRoYXQgRmV0Y2hDcmVkaXRDYXJkKCkgcmV0dXJucyB0aGUgZnVsbCBQQU4gdXBvbiBhIHN1Y2Nlc3NmdWwKIC8vIFdlYkF1dGhuIHZlcmlmaWNhdGlvbiBhbmQgcmVzcG9uc2UgZnJvbSBwYXltZW50cy4KZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvYXV0b2ZpbGwvY29yZS9icm93c2VyL3BheW1lbnRzL2NyZWRpdF9jYXJkX2ZpZG9fYXV0aGVudGljYXRvci5jYyBiL2NvbXBvbmVudHMvYXV0b2ZpbGwvY29yZS9icm93c2VyL3BheW1lbnRzL2NyZWRpdF9jYXJkX2ZpZG9fYXV0aGVudGljYXRvci5jYwppbmRleCA4NmM2MzJjOS4uZWE1ZWZjNSAxMDA2NDQKLS0tIGEvY29tcG9uZW50cy9hdXRvZmlsbC9jb3JlL2Jyb3dzZXIvcGF5bWVudHMvY3JlZGl0X2NhcmRfZmlkb19hdXRoZW50aWNhdG9yLmNjCisrKyBiL2NvbXBvbmVudHMvYXV0b2ZpbGwvY29yZS9icm93c2VyL3BheW1lbnRzL2NyZWRpdF9jYXJkX2ZpZG9fYXV0aGVudGljYXRvci5jYwpAQCAtMTI3LDggKzEyNywxMCBAQAogICAgIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKGJvb2wpPiBjYWxsYmFjaykgewogICBpZiAoYmFzZTo6RmVhdHVyZUxpc3Q6OklzRW5hYmxlZCgKICAgICAgICAgICBmZWF0dXJlczo6a0F1dG9maWxsQ3JlZGl0Q2FyZEF1dGhlbnRpY2F0aW9uKSkgewotICAgIGF1dG9maWxsX2RyaXZlcl8tPkNvbm5lY3RUb0F1dGhlbnRpY2F0b3IoCi0gICAgICAgIGF1dGhlbnRpY2F0b3JfLkJpbmROZXdQaXBlQW5kUGFzc1JlY2VpdmVyKCkpOworICAgIGlmICghYXV0aGVudGljYXRvcl8uaXNfYm91bmQoKSkgeworICAgICAgYXV0b2ZpbGxfZHJpdmVyXy0+Q29ubmVjdFRvQXV0aGVudGljYXRvcigKKyAgICAgICAgICBhdXRoZW50aWNhdG9yXy5CaW5kTmV3UGlwZUFuZFBhc3NSZWNlaXZlcigpKTsKKyAgICB9CiAgICAgYXV0aGVudGljYXRvcl8tPklzVXNlclZlcmlmeWluZ1BsYXRmb3JtQXV0aGVudGljYXRvckF2YWlsYWJsZSgKICAgICAgICAgc3RkOjptb3ZlKGNhbGxiYWNrKSk7CiAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9jb21wb25lbnRzL2F1dG9maWxsL2NvcmUvYnJvd3Nlci9wZXJzb25hbF9kYXRhX21hbmFnZXIuY2MgYi9jb21wb25lbnRzL2F1dG9maWxsL2NvcmUvYnJvd3Nlci9wZXJzb25hbF9kYXRhX21hbmFnZXIuY2MKaW5kZXggNDlkZTVmNC4uMWEyNDg4MCAxMDA2NDQKLS0tIGEvY29tcG9uZW50cy9hdXRvZmlsbC9jb3JlL2Jyb3dzZXIvcGVyc29uYWxfZGF0YV9tYW5hZ2VyLmNjCisrKyBiL2NvbXBvbmVudHMvYXV0b2ZpbGwvY29yZS9icm93c2VyL3BlcnNvbmFsX2RhdGFfbWFuYWdlci5jYwpAQCAtMTQzMCw3MCArMTQzMCw2IEBACiAgIHJldHVybiBlbXB0eV92YWxpZGl0eV9tYXA7CiB9CiAKLS8vIHN0YXRpYwotc3RkOjpzdHJpbmcgUGVyc29uYWxEYXRhTWFuYWdlcjo6TWVyZ2VQcm9maWxlKAotICAgIGNvbnN0IEF1dG9maWxsUHJvZmlsZSYgbmV3X3Byb2ZpbGUsCi0gICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEF1dG9maWxsUHJvZmlsZT4+KiBleGlzdGluZ19wcm9maWxlcywKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgYXBwX2xvY2FsZSwKLSAgICBzdGQ6OnZlY3RvcjxBdXRvZmlsbFByb2ZpbGU+KiBtZXJnZWRfcHJvZmlsZXMpIHsKLSAgbWVyZ2VkX3Byb2ZpbGVzLT5jbGVhcigpOwotCi0gIC8vIFNvcnQgdGhlIGV4aXN0aW5nIHByb2ZpbGVzIGluIGRlY3JlYXNpbmcgb3JkZXIgb2YgZnJlY2VuY3ksIHNvIHRoZSAiYmVzdCIKLSAgLy8gcHJvZmlsZXMgYXJlIGNoZWNrZWQgZmlyc3QuIFB1dCB0aGUgdmVyaWZpZWQgcHJvZmlsZXMgbGFzdCBzbyB0aGUgbm9uCi0gIC8vIHZlcmlmaWVkIHByb2ZpbGVzIGdldCBkZWR1cGVkIGFtb25nIHRoZW1zZWx2ZXMgYmVmb3JlIHJlYWNoaW5nIHRoZSB2ZXJpZmllZAotICAvLyBwcm9maWxlcy4KLSAgLy8gVE9ETyhjcmJ1Zy5jb20vNjIwNTIxKTogUmVtb3ZlIHRoZSBjaGVjayBmb3IgdmVyaWZpZWQgZnJvbSB0aGUgc29ydC4KLSAgYmFzZTo6VGltZSBjb21wYXJpc29uX3RpbWUgPSBBdXRvZmlsbENsb2NrOjpOb3coKTsKLSAgc3RkOjpzb3J0KGV4aXN0aW5nX3Byb2ZpbGVzLT5iZWdpbigpLCBleGlzdGluZ19wcm9maWxlcy0+ZW5kKCksCi0gICAgICAgICAgICBbY29tcGFyaXNvbl90aW1lXShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QXV0b2ZpbGxQcm9maWxlPiYgYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxBdXRvZmlsbFByb2ZpbGU+JiBiKSB7Ci0gICAgICAgICAgICAgIGlmIChhLT5Jc1ZlcmlmaWVkKCkgIT0gYi0+SXNWZXJpZmllZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiAhYS0+SXNWZXJpZmllZCgpOwotICAgICAgICAgICAgICByZXR1cm4gYS0+SGFzR3JlYXRlckZyZWNlbmN5VGhhbihiLmdldCgpLCBjb21wYXJpc29uX3RpbWUpOwotICAgICAgICAgICAgfSk7Ci0KLSAgLy8gU2V0IHRvIHRydWUgaWYgfGV4aXN0aW5nX3Byb2ZpbGVzfCBhbHJlYWR5IGNvbnRhaW5zIGFuIGVxdWl2YWxlbnQgcHJvZmlsZS4KLSAgYm9vbCBtYXRjaGluZ19wcm9maWxlX2ZvdW5kID0gZmFsc2U7Ci0gIHN0ZDo6c3RyaW5nIGd1aWQgPSBuZXdfcHJvZmlsZS5ndWlkKCk7Ci0KLSAgLy8gSWYgd2UgaGF2ZSBhbHJlYWR5IHNhdmVkIHRoaXMgYWRkcmVzcywgbWVyZ2UgaW4gYW55IG1pc3NpbmcgdmFsdWVzLgotICAvLyBPbmx5IG1lcmdlIHdpdGggdGhlIGZpcnN0IG1hdGNoLiBNZXJnaW5nIHRoZSBuZXcgcHJvZmlsZSBpbnRvIHRoZSBleGlzdGluZwotICAvLyBvbmUgcHJlc2VydmVzIHRoZSB2YWxpZGl0eSBvZiBjcmVkaXQgY2FyZCdzIGJpbGxpbmcgYWRkcmVzcyByZWZlcmVuY2UuCi0gIEF1dG9maWxsUHJvZmlsZUNvbXBhcmF0b3IgY29tcGFyYXRvcihhcHBfbG9jYWxlKTsKLSAgZm9yIChjb25zdCBhdXRvJiBleGlzdGluZ19wcm9maWxlIDogKmV4aXN0aW5nX3Byb2ZpbGVzKSB7Ci0gICAgaWYgKCFtYXRjaGluZ19wcm9maWxlX2ZvdW5kICYmCi0gICAgICAgIGNvbXBhcmF0b3IuQXJlTWVyZ2VhYmxlKG5ld19wcm9maWxlLCAqZXhpc3RpbmdfcHJvZmlsZSkgJiYKLSAgICAgICAgZXhpc3RpbmdfcHJvZmlsZS0+U2F2ZUFkZGl0aW9uYWxJbmZvKG5ld19wcm9maWxlLCBhcHBfbG9jYWxlKSkgewotICAgICAgLy8gVW52ZXJpZmllZCBwcm9maWxlcyBzaG91bGQgYWx3YXlzIGJlIHVwZGF0ZWQgd2l0aCB0aGUgbmV3ZXIgZGF0YSwKLSAgICAgIC8vIHdoZXJlYXMgdmVyaWZpZWQgcHJvZmlsZXMgc2hvdWxkIG9ubHkgZXZlciBiZSBvdmVyd3JpdHRlbiBieSB2ZXJpZmllZAotICAgICAgLy8gZGF0YS4gIElmIGFuIGF1dG9tYXRpY2FsbHkgYWdncmVnYXRlZCBwcm9maWxlIHdvdWxkIG92ZXJ3cml0ZSBhCi0gICAgICAvLyB2ZXJpZmllZCBwcm9maWxlLCBqdXN0IGRyb3AgaXQuCi0gICAgICBtYXRjaGluZ19wcm9maWxlX2ZvdW5kID0gdHJ1ZTsKLSAgICAgIGd1aWQgPSBleGlzdGluZ19wcm9maWxlLT5ndWlkKCk7Ci0KLSAgICAgIC8vIFdlIHNldCB0aGUgbW9kaWZpY2F0aW9uIGRhdGUgc28gdGhhdCBpbW1lZGlhdGUgcmVxdWVzdHMgZm9yIHByb2ZpbGVzCi0gICAgICAvLyB3aWxsIHByb3Blcmx5IHJlZmxlY3QgdGhlIGZhY3QgdGhhdCB0aGlzIHByb2ZpbGUgaGFzIGJlZW4gbW9kaWZpZWQKLSAgICAgIC8vIHJlY2VudGx5LiBBZnRlciB3cml0aW5nIHRvIHRoZSBkYXRhYmFzZSBhbmQgcmVmcmVzaGluZyB0aGUgbG9jYWwgY29waWVzCi0gICAgICAvLyB0aGUgcHJvZmlsZSB3aWxsIGhhdmUgYSB2ZXJ5IHNsaWdodGx5IG5ld2VyIHRpbWUgcmVmbGVjdGluZyB3aGF0J3MKLSAgICAgIC8vIGFjdHVhbGx5IHN0b3JlZCBpbiB0aGUgZGF0YWJhc2UuCi0gICAgICBleGlzdGluZ19wcm9maWxlLT5zZXRfbW9kaWZpY2F0aW9uX2RhdGUoQXV0b2ZpbGxDbG9jazo6Tm93KCkpOwotICAgIH0KLSAgICBtZXJnZWRfcHJvZmlsZXMtPnB1c2hfYmFjaygqZXhpc3RpbmdfcHJvZmlsZSk7Ci0gIH0KLQotICAvLyBJZiB0aGUgbmV3IHByb2ZpbGUgd2FzIG5vdCBtZXJnZWQgd2l0aCBhbiBleGlzdGluZyBvbmUsIGFkZCBpdCB0byB0aGUgbGlzdC4KLSAgaWYgKCFtYXRjaGluZ19wcm9maWxlX2ZvdW5kKSB7Ci0gICAgbWVyZ2VkX3Byb2ZpbGVzLT5wdXNoX2JhY2sobmV3X3Byb2ZpbGUpOwotICAgIC8vIFNpbWlsYXIgdG8gdXBkYXRpbmcgbWVyZ2VkIHByb2ZpbGVzIGFib3ZlLCBzZXQgdGhlIG1vZGlmaWNhdGlvbiBkYXRlIG9uCi0gICAgLy8gbmV3IHByb2ZpbGVzLgotICAgIG1lcmdlZF9wcm9maWxlcy0+YmFjaygpLnNldF9tb2RpZmljYXRpb25fZGF0ZShBdXRvZmlsbENsb2NrOjpOb3coKSk7Ci0gICAgQXV0b2ZpbGxNZXRyaWNzOjpMb2dQcm9maWxlQWN0aW9uT25Gb3JtU3VibWl0dGVkKAotICAgICAgICBBdXRvZmlsbE1ldHJpY3M6Ok5FV19QUk9GSUxFX0NSRUFURUQpOwotICB9Ci0KLSAgcmV0dXJuIGd1aWQ7Ci19Ci0KIGNvbnN0IHN0ZDo6c3RyaW5nJiBQZXJzb25hbERhdGFNYW5hZ2VyOjpHZXREZWZhdWx0Q291bnRyeUNvZGVGb3JOZXdBZGRyZXNzKCkKICAgICBjb25zdCB7CiAgIGlmIChkZWZhdWx0X2NvdW50cnlfY29kZV8uZW1wdHkoKSkKQEAgLTE3MTYsOCArMTY1Miw4IEBACiAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7CiAKICAgc3RkOjp2ZWN0b3I8QXV0b2ZpbGxQcm9maWxlPiBwcm9maWxlczsKLSAgc3RkOjpzdHJpbmcgZ3VpZCA9Ci0gICAgICBNZXJnZVByb2ZpbGUoaW1wb3J0ZWRfcHJvZmlsZSwgJndlYl9wcm9maWxlc18sIGFwcF9sb2NhbGVfLCAmcHJvZmlsZXMpOworICBzdGQ6OnN0cmluZyBndWlkID0gQXV0b2ZpbGxQcm9maWxlQ29tcGFyYXRvcjo6TWVyZ2VQcm9maWxlKAorICAgICAgaW1wb3J0ZWRfcHJvZmlsZSwgJndlYl9wcm9maWxlc18sIGFwcF9sb2NhbGVfLCAmcHJvZmlsZXMpOwogICBTZXRQcm9maWxlcygmcHJvZmlsZXMpOwogICByZXR1cm4gZ3VpZDsKIH0KZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvYXV0b2ZpbGwvY29yZS9icm93c2VyL3BlcnNvbmFsX2RhdGFfbWFuYWdlci5oIGIvY29tcG9uZW50cy9hdXRvZmlsbC9jb3JlL2Jyb3dzZXIvcGVyc29uYWxfZGF0YV9tYW5hZ2VyLmgKaW5kZXggMGE4M2E2Zi4uYmFjZWUwYSAxMDA2NDQKLS0tIGEvY29tcG9uZW50cy9hdXRvZmlsbC9jb3JlL2Jyb3dzZXIvcGVyc29uYWxfZGF0YV9tYW5hZ2VyLmgKKysrIGIvY29tcG9uZW50cy9hdXRvZmlsbC9jb3JlL2Jyb3dzZXIvcGVyc29uYWxfZGF0YV9tYW5hZ2VyLmgKQEAgLTMyMywxNiArMzIzLDYgQEAKIAogICBjb25zdCBzdGQ6OnN0cmluZyYgYXBwX2xvY2FsZSgpIGNvbnN0IHsgcmV0dXJuIGFwcF9sb2NhbGVfOyB9CiAKLSAgLy8gTWVyZ2VzIHxuZXdfcHJvZmlsZXwgaW50byBvbmUgb2YgdGhlIHxleGlzdGluZ19wcm9maWxlc3wgaWYgcG9zc2libGU7Ci0gIC8vIG90aGVyd2lzZSBhcHBlbmRzIHxuZXdfcHJvZmlsZXwgdG8gdGhlIGVuZCBvZiB0aGF0IGxpc3QuIEZpbGxzCi0gIC8vIHxtZXJnZWRfcHJvZmlsZXN8IHdpdGggdGhlIHJlc3VsdC4gUmV0dXJucyB0aGUgfGd1aWR8IG9mIHRoZSBuZXcgb3IgdXBkYXRlZAotICAvLyBwcm9maWxlLgotICBzdGF0aWMgc3RkOjpzdHJpbmcgTWVyZ2VQcm9maWxlKAotICAgICAgY29uc3QgQXV0b2ZpbGxQcm9maWxlJiBuZXdfcHJvZmlsZSwKLSAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxBdXRvZmlsbFByb2ZpbGU+PiogZXhpc3RpbmdfcHJvZmlsZXMsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYXBwX2xvY2FsZSwKLSAgICAgIHN0ZDo6dmVjdG9yPEF1dG9maWxsUHJvZmlsZT4qIG1lcmdlZF9wcm9maWxlcyk7Ci0KICAgLy8gUmV0dXJucyBvdXIgYmVzdCBndWVzcyBmb3IgdGhlIGNvdW50cnkgYSB1c2VyIGlzIGxpa2VseSB0byB1c2Ugd2hlbgogICAvLyBpbnB1dHRpbmcgYSBuZXcgYWRkcmVzcy4gVGhlIHZhbHVlIGlzIGNhbGN1bGF0ZWQgb25jZSBhbmQgY2FjaGVkLCBzbyBpdAogICAvLyB3aWxsIG9ubHkgdXBkYXRlIHdoZW4gQ2hyb21lIGlzIHJlc3RhcnRlZC4KZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvYXV0b2ZpbGwvY29yZS9icm93c2VyL3BlcnNvbmFsX2RhdGFfbWFuYWdlcl91bml0dGVzdC5jYyBiL2NvbXBvbmVudHMvYXV0b2ZpbGwvY29yZS9icm93c2VyL3BlcnNvbmFsX2RhdGFfbWFuYWdlcl91bml0dGVzdC5jYwppbmRleCA3OGNhYTc5Li4yNzI5ZTI5IDEwMDY0NAotLS0gYS9jb21wb25lbnRzL2F1dG9maWxsL2NvcmUvYnJvd3Nlci9wZXJzb25hbF9kYXRhX21hbmFnZXJfdW5pdHRlc3QuY2MKKysrIGIvY29tcG9uZW50cy9hdXRvZmlsbC9jb3JlL2Jyb3dzZXIvcGVyc29uYWxfZGF0YV9tYW5hZ2VyX3VuaXR0ZXN0LmNjCkBAIC00NDY3LDcgKzQ0NjcsNyBAQAogCiAgIC8vIE1lcmdlIHRoZSBpbXBvcnRlZCBwcm9maWxlIGludG8gdGhlIGV4aXN0aW5nIHByb2ZpbGVzLgogICBzdGQ6OnZlY3RvcjxBdXRvZmlsbFByb2ZpbGU+IHByb2ZpbGVzOwotICBzdGQ6OnN0cmluZyBndWlkID0gcGVyc29uYWxfZGF0YV8tPk1lcmdlUHJvZmlsZSgKKyAgc3RkOjpzdHJpbmcgZ3VpZCA9IEF1dG9maWxsUHJvZmlsZUNvbXBhcmF0b3I6Ok1lcmdlUHJvZmlsZSgKICAgICAgIGltcG9ydGVkX3Byb2ZpbGUsICZleGlzdGluZ19wcm9maWxlcywgIlVTLUVOIiwgJnByb2ZpbGVzKTsKIAogICAvLyBUaGUgbmV3IHByb2ZpbGUgc2hvdWxkIGJlIG1lcmdlZCBpbnRvIHRoZSAiZm94IiBwcm9maWxlLgpAQCAtNDUxNiw3ICs0NTE2LDcgQEAKIAogICAvLyBNZXJnZSB0aGUgaW1wb3J0ZWQgcHJvZmlsZSBpbnRvIHRoZSBleGlzdGluZyBwcm9maWxlcy4KICAgc3RkOjp2ZWN0b3I8QXV0b2ZpbGxQcm9maWxlPiBwcm9maWxlczsKLSAgc3RkOjpzdHJpbmcgZ3VpZCA9IHBlcnNvbmFsX2RhdGFfLT5NZXJnZVByb2ZpbGUoCisgIHN0ZDo6c3RyaW5nIGd1aWQgPSBBdXRvZmlsbFByb2ZpbGVDb21wYXJhdG9yOjpNZXJnZVByb2ZpbGUoCiAgICAgICBpbXBvcnRlZF9wcm9maWxlLCAmZXhpc3RpbmdfcHJvZmlsZXMsICJVUy1FTiIsICZwcm9maWxlcyk7CiAKICAgLy8gVGhlIG5ldyBwcm9maWxlIHNob3VsZCBiZSBtZXJnZWQgaW50byB0aGUgZXhpc3RpbmcgcHJvZmlsZS4KZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvY29udGVudF9zZXR0aW5ncy9jb3JlL2Jyb3dzZXIvd2Vic2l0ZV9zZXR0aW5nc19yZWdpc3RyeS5jYyBiL2NvbXBvbmVudHMvY29udGVudF9zZXR0aW5ncy9jb3JlL2Jyb3dzZXIvd2Vic2l0ZV9zZXR0aW5nc19yZWdpc3RyeS5jYwppbmRleCA2MmQ4MjRhLi5lNzYyN2YzIDEwMDY0NAotLS0gYS9jb21wb25lbnRzL2NvbnRlbnRfc2V0dGluZ3MvY29yZS9icm93c2VyL3dlYnNpdGVfc2V0dGluZ3NfcmVnaXN0cnkuY2MKKysrIGIvY29tcG9uZW50cy9jb250ZW50X3NldHRpbmdzL2NvcmUvYnJvd3Nlci93ZWJzaXRlX3NldHRpbmdzX3JlZ2lzdHJ5LmNjCkBAIC0xNTcsMTEgKzE1NywxMSBAQAogICAgICAgICAgICBXZWJzaXRlU2V0dGluZ3NJbmZvOjpTSU5HTEVfT1JJR0lOX1dJVEhfRU1CRURERURfRVhDRVBUSU9OU19TQ09QRSwKICAgICAgICAgICAgREVTS1RPUCB8IFBMQVRGT1JNX0FORFJPSUQsCiAgICAgICAgICAgIFdlYnNpdGVTZXR0aW5nc0luZm86OklOSEVSSVRfSU5fSU5DT0dOSVRPKTsKLSAgUmVnaXN0ZXIoQ09OVEVOVF9TRVRUSU5HU19UWVBFX1BBU1NXT1JEX1BST1RFQ1RJT04sICJwYXNzd29yZC1wcm90ZWN0aW9uIiwKLSAgICAgICAgICAgbnVsbHB0ciwgV2Vic2l0ZVNldHRpbmdzSW5mbzo6VU5TWU5DQUJMRSwKLSAgICAgICAgICAgV2Vic2l0ZVNldHRpbmdzSW5mbzo6Tk9UX0xPU1NZLAotICAgICAgICAgICBXZWJzaXRlU2V0dGluZ3NJbmZvOjpTSU5HTEVfT1JJR0lOX1dJVEhfRU1CRURERURfRVhDRVBUSU9OU19TQ09QRSwKLSAgICAgICAgICAgREVTS1RPUCwgV2Vic2l0ZVNldHRpbmdzSW5mbzo6SU5IRVJJVF9JTl9JTkNPR05JVE8pOworICBSZWdpc3RlcigKKyAgICAgIENPTlRFTlRfU0VUVElOR1NfVFlQRV9QQVNTV09SRF9QUk9URUNUSU9OLCAicGFzc3dvcmQtcHJvdGVjdGlvbiIsIG51bGxwdHIsCisgICAgICBXZWJzaXRlU2V0dGluZ3NJbmZvOjpVTlNZTkNBQkxFLCBXZWJzaXRlU2V0dGluZ3NJbmZvOjpOT1RfTE9TU1ksCisgICAgICBXZWJzaXRlU2V0dGluZ3NJbmZvOjpTSU5HTEVfT1JJR0lOX1dJVEhfRU1CRURERURfRVhDRVBUSU9OU19TQ09QRSwKKyAgICAgIERFU0tUT1AgfCBQTEFURk9STV9BTkRST0lELCBXZWJzaXRlU2V0dGluZ3NJbmZvOjpJTkhFUklUX0lOX0lOQ09HTklUTyk7CiAgIC8vIFNldCB3aGVuIGFuIG9yaWdpbiBpcyBhY3RpdmF0ZWQgZm9yIHN1YnJlc291cmNlIGZpbHRlcmluZyBhbmQgdGhlCiAgIC8vIGFzc29jaWF0ZWQgVUkgaXMgc2hvd24gdG8gdGhlIHVzZXIuIENsZWFyZWQgd2hlbiBhIHNpdGUgaXMgZGUtYWN0aXZhdGVkIG9yCiAgIC8vIHRoZSBmaXJzdCBVUkwgbWF0Y2hpbmcgdGhlIG9yaWdpbiBpcyByZW1vdmVkIGZyb20gaGlzdG9yeS4KZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvY3Jhc2gvY29udGVudC9hcHAvY3Jhc2hwYWRfbGludXguY2MgYi9jb21wb25lbnRzL2NyYXNoL2NvbnRlbnQvYXBwL2NyYXNocGFkX2xpbnV4LmNjCmluZGV4IDU2OTA4YzQ4Li5kZDI3Yzc3NDIgMTAwNjQ0Ci0tLSBhL2NvbXBvbmVudHMvY3Jhc2gvY29udGVudC9hcHAvY3Jhc2hwYWRfbGludXguY2MKKysrIGIvY29tcG9uZW50cy9jcmFzaC9jb250ZW50L2FwcC9jcmFzaHBhZF9saW51eC5jYwpAQCAtMjMsNiArMjMsMzIgQEAKIAogbmFtZXNwYWNlIGNyYXNoX3JlcG9ydGVyIHsKIAorbmFtZXNwYWNlIHsKKworLy8gVE9ETyhqcGVyYXphKTogVGhpcyBpcyB0aGUgZmlyc3QgY2hhbmNlIGhhbmRsZXIgdHlwZSB1c2VkIGJ5IEJyZWFrcGFkIGFuZCB2OC4KKy8vIFRoZSBDcmFzaHBhZCBGaXJzdENoYW5jZUhhbmRsZXIgdHlwZSBleHBsaWNpdGx5IGRlY2xhcmVzIHRoZSB0aGlyZCBwYXJhbWV0ZXIKKy8vIHRvIGJlIGEgdWNvbnRleHRfdCogaW5zdGVhZCBvZiBhIHZvaWQqLiBVc2luZyBhIHJlaW50ZXJwcmV0IGNhc3QgdG8gY29udmVydAorLy8gb25lIGZ1bmN0aW9uIHR5cGUgdG8gYW5vdGhlciBjYXVzZXMgY2FsbGluZyB0aGUgaGFuZGxlciB0byBmYWlsIHdpdGggU0lHSUxMCisvLyB3aGVuIENGSSBpcyBlbmFibGVkLiBVc2UgYSBoZWxwZXIgd2l0aCBDcmFzaHBhZCdzIEZpcnN0Q2hhbmNlSGFuZGxlciB0eXBlCisvLyB0byBkZWxlZ2F0ZSB0byB0aGUgcmVhbCBmaXJzdCBjaGFuY2UgaGFuZGxlciBpbnN0ZWFkIG9mIHJlLWludGVycHJldGluZyB0aGUKKy8vIGhhbmRsZXIgaXRzZWxmLiBUaGlzIGNhbiBiZSByZW1vdmVkIGlmIHRoZSB0d28gZnVuY3Rpb24gdHlwZXMgY29udmVyZ2UuCitib29sICgqZ19maXJzdF9jaGFuY2VfaGFuZGxlcikoaW50LCBzaWdpbmZvX3QqLCB2b2lkKik7CisKK2Jvb2wgRmlyc3RDaGFuY2VIYW5kbGVySGVscGVyKGludCBzaWdubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ2luZm9fdCogc2lnaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjb250ZXh0X3QqIGNvbnRleHQpIHsKKyAgcmV0dXJuIGdfZmlyc3RfY2hhbmNlX2hhbmRsZXIoc2lnbm8sIHNpZ2luZm8sIGNvbnRleHQpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKwordm9pZCBTZXRGaXJzdENoYW5jZUV4Y2VwdGlvbkhhbmRsZXIoYm9vbCAoKmhhbmRsZXIpKGludCwgc2lnaW5mb190Kiwgdm9pZCopKSB7CisgIERDSEVDSyghZ19maXJzdF9jaGFuY2VfaGFuZGxlcik7CisgIGdfZmlyc3RfY2hhbmNlX2hhbmRsZXIgPSBoYW5kbGVyOworICBjcmFzaHBhZDo6Q3Jhc2hwYWRDbGllbnQ6OlNldEZpcnN0Q2hhbmNlRXhjZXB0aW9uSGFuZGxlcigKKyAgICAgIEZpcnN0Q2hhbmNlSGFuZGxlckhlbHBlcik7Cit9CisKIC8vIFRPRE8oanBlcmF6YSk6IFJlbW92ZSBrRW5hYmxlQ3Jhc2hwYWQgYW5kIElzQ3Jhc2hwYWRFbmFibGVkKCkgd2hlbiBDcmFzaHBhZAogLy8gaXMgZnVsbHkgZW5hYmxlZCBvbiBMaW51eC4KIGNvbnN0IGNoYXIga0VuYWJsZUNyYXNocGFkW10gPSAiZW5hYmxlLWNyYXNocGFkIjsKQEAgLTMxLDExICs1Nyw2IEBACiAgIHJldHVybiBiYXNlOjpDb21tYW5kTGluZTo6Rm9yQ3VycmVudFByb2Nlc3MoKS0+SGFzU3dpdGNoKGtFbmFibGVDcmFzaHBhZCk7CiB9CiAKLXZvaWQgU2V0Rmlyc3RDaGFuY2VFeGNlcHRpb25IYW5kbGVyKGJvb2wgKCpoYW5kbGVyKShpbnQsIHNpZ2luZm9fdCosIHZvaWQqKSkgewotICBjcmFzaHBhZDo6Q3Jhc2hwYWRDbGllbnQ6OlNldEZpcnN0Q2hhbmNlRXhjZXB0aW9uSGFuZGxlcigKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y3Jhc2hwYWQ6OkNyYXNocGFkQ2xpZW50OjpGaXJzdENoYW5jZUhhbmRsZXI+KGhhbmRsZXIpKTsKLX0KLQogYm9vbCBHZXRIYW5kbGVyU29ja2V0KGludCogZmQsIHBpZF90KiBwaWQpIHsKICAgcmV0dXJuIGNyYXNocGFkOjpDcmFzaHBhZENsaWVudDo6R2V0SGFuZGxlclNvY2tldChmZCwgcGlkKTsKIH0KZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvb21uaWJveC9icm93c2VyL2F1dG9jb21wbGV0ZV9tYXRjaC5jYyBiL2NvbXBvbmVudHMvb21uaWJveC9icm93c2VyL2F1dG9jb21wbGV0ZV9tYXRjaC5jYwppbmRleCA5MTViNmY5Li42MjA2ZDNmIDEwMDY0NAotLS0gYS9jb21wb25lbnRzL29tbmlib3gvYnJvd3Nlci9hdXRvY29tcGxldGVfbWF0Y2guY2MKKysrIGIvY29tcG9uZW50cy9vbW5pYm94L2Jyb3dzZXIvYXV0b2NvbXBsZXRlX21hdGNoLmNjCkBAIC0xMTE4LDE0ICsxMTE4LDEzIEBACiB9CiAKIGJvb2wgQXV0b2NvbXBsZXRlTWF0Y2g6OlNob3VsZFNob3dUYWJNYXRjaEJ1dHRvbigpIGNvbnN0IHsKKyAgLy8gVE9ETyhwa2FzdGluZyk6IFRoaXMga2luZCBvZiBwcmVzZW50YXRpb25hbCBsb2dpYyBkb2VzIG5vdCBiZWxvbmcgb24KKyAgLy8gQXV0b2NvbXBsZXRlTWF0Y2ggYW5kIHNob3VsZCBiZSBlLmcuIGEgc3RhdGljIG1ldGhvZCBpbgorICAvLyBPbW5pYm94TWF0Y2hDZWxsVmlldyB0aGF0IHRha2VzIGFuIEF1dG9jb21wbGV0ZU1hdGNoLgogICByZXR1cm4gaGFzX3RhYl9tYXRjaCAmJiAhYXNzb2NpYXRlZF9rZXl3b3JkICYmCiAgICAgICAgICAhT21uaWJveEZpZWxkVHJpYWw6OklzVGFiU3dpdGNoU3VnZ2VzdGlvbnNEZWRpY2F0ZWRSb3dFbmFibGVkKCk7CiB9CiAKLWJvb2wgQXV0b2NvbXBsZXRlTWF0Y2g6OlNob3VsZFNob3dCdXR0b24oKSBjb25zdCB7Ci0gIHJldHVybiBTaG91bGRTaG93VGFiTWF0Y2hCdXR0b24oKTsKLX0KLQogYm9vbCBBdXRvY29tcGxldGVNYXRjaDo6SXNUYWJTd2l0Y2hTdWdnZXN0aW9uKCkgY29uc3QgewogICByZXR1cm4gKHN1YnJlbGV2YW5jZSAmIH5GQU1JTFlfU0laRV9NQVNLKSA9PSBUQUJfU1dJVENIX0ZBTUlMWV9JRDsKIH0KZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvb21uaWJveC9icm93c2VyL2F1dG9jb21wbGV0ZV9tYXRjaC5oIGIvY29tcG9uZW50cy9vbW5pYm94L2Jyb3dzZXIvYXV0b2NvbXBsZXRlX21hdGNoLmgKaW5kZXggYTc1NjEzNi4uM2ZhMzBhNiAxMDA2NDQKLS0tIGEvY29tcG9uZW50cy9vbW5pYm94L2Jyb3dzZXIvYXV0b2NvbXBsZXRlX21hdGNoLmgKKysrIGIvY29tcG9uZW50cy9vbW5pYm94L2Jyb3dzZXIvYXV0b2NvbXBsZXRlX21hdGNoLmgKQEAgLTQ0Niw5ICs0NDYsNiBAQAogICAvLyBpcyB0YWtpbmcgcHJlY2VkZW5jZS4KICAgYm9vbCBTaG91bGRTaG93VGFiTWF0Y2hCdXR0b24oKSBjb25zdDsKIAotICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHN1Z2dlc3Rpb24gc2hvdWxkIHNob3cgYSB0YWIgbWF0Y2ggYnV0dG9uIG9yIHBlZGFsLgotICBib29sIFNob3VsZFNob3dCdXR0b24oKSBjb25zdDsKLQogICAvLyBSZXR1cm5zIHdoZXRoZXIgdGhlIHN1Z2dlc3Rpb24gaXMgYnkgaXRzZWxmIGEgdGFiIHN3aXRjaCBzdWdnZXN0aW9uLgogICBib29sIElzVGFiU3dpdGNoU3VnZ2VzdGlvbigpIGNvbnN0OwogCmRpZmYgLS1naXQgYS9jb21wb25lbnRzL29tbmlib3gvYnJvd3Nlci9vbW5pYm94X2NvbnRyb2xsZXIuY2MgYi9jb21wb25lbnRzL29tbmlib3gvYnJvd3Nlci9vbW5pYm94X2NvbnRyb2xsZXIuY2MKaW5kZXggMWY4NjUxNmYuLmQ4ZWE1NTUgMTAwNjQ0Ci0tLSBhL2NvbXBvbmVudHMvb21uaWJveC9icm93c2VyL29tbmlib3hfY29udHJvbGxlci5jYworKysgYi9jb21wb25lbnRzL29tbmlib3gvYnJvd3Nlci9vbW5pYm94X2NvbnRyb2xsZXIuY2MKQEAgLTM1LDcgKzM1LDcgQEAKIAogICBpZiAoY2xpZW50Xy0+R2V0T21uaWJveENvbnRyb2xsZXJFbWl0dGVyKCkpIHsKICAgICBjbGllbnRfLT5HZXRPbW5pYm94Q29udHJvbGxlckVtaXR0ZXIoKS0+Tm90aWZ5T21uaWJveFF1ZXJ5KAotICAgICAgICBhdXRvY29tcGxldGVfY29udHJvbGxlcl8uZ2V0KCksIGlucHV0LnRleHQoKSk7CisgICAgICAgIGF1dG9jb21wbGV0ZV9jb250cm9sbGVyXy5nZXQoKSwgaW5wdXQpOwogICB9CiAKICAgLy8gV2UgZG9uJ3QgZXhwbGljaXRseSBjbGVhciBPbW5pYm94UG9wdXBNb2RlbDo6bWFudWFsbHlfc2VsZWN0ZWRfbWF0Y2gsIGFzCmRpZmYgLS1naXQgYS9jb21wb25lbnRzL29tbmlib3gvYnJvd3Nlci9vbW5pYm94X2NvbnRyb2xsZXJfZW1pdHRlci5jYyBiL2NvbXBvbmVudHMvb21uaWJveC9icm93c2VyL29tbmlib3hfY29udHJvbGxlcl9lbWl0dGVyLmNjCmluZGV4IDBlMTczMjcuLmE4ZjM2MjAzIDEwMDY0NAotLS0gYS9jb21wb25lbnRzL29tbmlib3gvYnJvd3Nlci9vbW5pYm94X2NvbnRyb2xsZXJfZW1pdHRlci5jYworKysgYi9jb21wb25lbnRzL29tbmlib3gvYnJvd3Nlci9vbW5pYm94X2NvbnRyb2xsZXJfZW1pdHRlci5jYwpAQCAtNjksOSArNjksOSBAQAogCiB2b2lkIE9tbmlib3hDb250cm9sbGVyRW1pdHRlcjo6Tm90aWZ5T21uaWJveFF1ZXJ5KAogICAgIEF1dG9jb21wbGV0ZUNvbnRyb2xsZXIqIGNvbnRyb2xsZXIsCi0gICAgY29uc3QgYmFzZTo6c3RyaW5nMTYmIGlucHV0X3RleHQpIHsKKyAgICBjb25zdCBBdXRvY29tcGxldGVJbnB1dCYgaW5wdXQpIHsKICAgZm9yIChPYnNlcnZlciYgb2JzZXJ2ZXIgOiBvYnNlcnZlcnNfKQotICAgIG9ic2VydmVyLk9uT21uaWJveFF1ZXJ5KGNvbnRyb2xsZXIsIGlucHV0X3RleHQpOworICAgIG9ic2VydmVyLk9uT21uaWJveFF1ZXJ5KGNvbnRyb2xsZXIsIGlucHV0KTsKIH0KIAogdm9pZCBPbW5pYm94Q29udHJvbGxlckVtaXR0ZXI6Ok5vdGlmeU9tbmlib3hSZXN1bHRDaGFuZ2VkKApkaWZmIC0tZ2l0IGEvY29tcG9uZW50cy9vbW5pYm94L2Jyb3dzZXIvb21uaWJveF9jb250cm9sbGVyX2VtaXR0ZXIuaCBiL2NvbXBvbmVudHMvb21uaWJveC9icm93c2VyL29tbmlib3hfY29udHJvbGxlcl9lbWl0dGVyLmgKaW5kZXggY2UyN2NiNS4uMmE3YTk5YSAxMDA2NDQKLS0tIGEvY29tcG9uZW50cy9vbW5pYm94L2Jyb3dzZXIvb21uaWJveF9jb250cm9sbGVyX2VtaXR0ZXIuaAorKysgYi9jb21wb25lbnRzL29tbmlib3gvYnJvd3Nlci9vbW5pYm94X2NvbnRyb2xsZXJfZW1pdHRlci5oCkBAIC0yMyw3ICsyMyw3IEBACiAgICAgLy8gSW52b2tlZCB3aGVuIG5ldyBhdXRvY29tcGxldGUgcXVlcmllcyBhcmUgbWFkZSBmcm9tIHRoZSBvbW5pYm94CiAgICAgLy8gY29udHJvbGxlciBvciB3aGVuIHRob3NlIHF1ZXJpZXMnIHJlc3VsdHMgY2hhbmdlLgogICAgIHZpcnR1YWwgdm9pZCBPbk9tbmlib3hRdWVyeShBdXRvY29tcGxldGVDb250cm9sbGVyKiBjb250cm9sbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpzdHJpbmcxNiYgaW5wdXRfdGV4dCkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdXRvY29tcGxldGVJbnB1dCYgaW5wdXQpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgT25PbW5pYm94UmVzdWx0Q2hhbmdlZChib29sIGRlZmF1bHRfbWF0Y2hfY2hhbmdlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdXRvY29tcGxldGVDb250cm9sbGVyKiBjb250cm9sbGVyKSA9IDA7CiAgIH07CkBAIC00Myw3ICs0Myw3IEBACiAgIC8vIE5vdGlmaWVzIHJlZ2lzdGVyZWQgb2JzZXJ2ZXJzIHdoZW4gbmV3IGF1dG9jb21wbGV0ZSBxdWVyaWVzIGFyZSBtYWRlIGZyb20KICAgLy8gdGhlIG9tbmlib3ggY29udHJvbGxlciBvciB3aGVuIHRob3NlIHF1ZXJpZXMnIHJlc3VsdHMgY2hhbmdlLgogICB2b2lkIE5vdGlmeU9tbmlib3hRdWVyeShBdXRvY29tcGxldGVDb250cm9sbGVyKiBjb250cm9sbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpzdHJpbmcxNiYgaW5wdXRfdGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1dG9jb21wbGV0ZUlucHV0JiBpbnB1dCk7CiAgIHZvaWQgTm90aWZ5T21uaWJveFJlc3VsdENoYW5nZWQoYm9vbCBkZWZhdWx0X21hdGNoX2NoYW5nZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0b2NvbXBsZXRlQ29udHJvbGxlciogY29udHJvbGxlcik7CiAKZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvb21uaWJveC9icm93c2VyL29tbmlib3hfcG9wdXBfbW9kZWwuY2MgYi9jb21wb25lbnRzL29tbmlib3gvYnJvd3Nlci9vbW5pYm94X3BvcHVwX21vZGVsLmNjCmluZGV4IDBjYTI1MmMuLjQ3NmUzOGY3IDEwMDY0NAotLS0gYS9jb21wb25lbnRzL29tbmlib3gvYnJvd3Nlci9vbW5pYm94X3BvcHVwX21vZGVsLmNjCisrKyBiL2NvbXBvbmVudHMvb21uaWJveC9icm93c2VyL29tbmlib3hfcG9wdXBfbW9kZWwuY2MKQEAgLTMzNCwxMSArMzM0LDYgQEAKICAgICAgICAgIHJlc3VsdCgpLm1hdGNoX2F0KHNlbGVjdGVkX2xpbmVfKS5TaG91bGRTaG93VGFiTWF0Y2hCdXR0b24oKTsKIH0KIAotYm9vbCBPbW5pYm94UG9wdXBNb2RlbDo6U2VsZWN0ZWRMaW5lSGFzQnV0dG9uKCkgewotICByZXR1cm4gc2VsZWN0ZWRfbGluZV8gIT0ga05vTWF0Y2ggJiYKLSAgICAgICAgIHJlc3VsdCgpLm1hdGNoX2F0KHNlbGVjdGVkX2xpbmVfKS5TaG91bGRTaG93QnV0dG9uKCk7Ci19Ci0KIGJvb2wgT21uaWJveFBvcHVwTW9kZWw6OlNlbGVjdGVkTGluZUlzVGFiU3dpdGNoU3VnZ2VzdGlvbigpIHsKICAgcmV0dXJuIHNlbGVjdGVkX2xpbmVfICE9IGtOb01hdGNoICYmCiAgICAgICAgICByZXN1bHQoKS5tYXRjaF9hdChzZWxlY3RlZF9saW5lXykuSXNUYWJTd2l0Y2hTdWdnZXN0aW9uKCk7CmRpZmYgLS1naXQgYS9jb21wb25lbnRzL29tbmlib3gvYnJvd3Nlci9vbW5pYm94X3BvcHVwX21vZGVsLmggYi9jb21wb25lbnRzL29tbmlib3gvYnJvd3Nlci9vbW5pYm94X3BvcHVwX21vZGVsLmgKaW5kZXggZjY2ZDgwM2YuLjhmOGQxZTYgMTAwNjQ0Ci0tLSBhL2NvbXBvbmVudHMvb21uaWJveC9icm93c2VyL29tbmlib3hfcG9wdXBfbW9kZWwuaAorKysgYi9jb21wb25lbnRzL29tbmlib3gvYnJvd3Nlci9vbW5pYm94X3BvcHVwX21vZGVsLmgKQEAgLTE0NiwxMCArMTQ2LDYgQEAKICAgLy8gdGFiIHN3aXRjaCBidXR0b24uCiAgIGJvb2wgU2VsZWN0ZWRMaW5lSGFzVGFiTWF0Y2goKTsKIAotICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gc2VlIGlmIGN1cnJlbnQgc2VsZWN0aW9uIGhhcyBidXR0b24gYW5kIGNhbiBhY2NlcHQKLSAgLy8gdGhlIHRhYiBrZXkuCi0gIGJvb2wgU2VsZWN0ZWRMaW5lSGFzQnV0dG9uKCk7Ci0KICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHNlZSBpZiBjdXJyZW50IHNlbGVjdGlvbiBpcyBhIHRhYiBzd2l0Y2ggc3VnZ2VzdGlvbgogICAvLyBkZWRpY2F0ZWQgcm93LgogICBib29sIFNlbGVjdGVkTGluZUlzVGFiU3dpdGNoU3VnZ2VzdGlvbigpOwpkaWZmIC0tZ2l0IGEvY29tcG9uZW50cy9vcHRpbWl6YXRpb25fZ3VpZGUvaGludHNfZmV0Y2hlci5jYyBiL2NvbXBvbmVudHMvb3B0aW1pemF0aW9uX2d1aWRlL2hpbnRzX2ZldGNoZXIuY2MKaW5kZXggZDhkZDVlNjguLmE5YjgwMTI2IDEwMDY0NAotLS0gYS9jb21wb25lbnRzL29wdGltaXphdGlvbl9ndWlkZS9oaW50c19mZXRjaGVyLmNjCisrKyBiL2NvbXBvbmVudHMvb3B0aW1pemF0aW9uX2d1aWRlL2hpbnRzX2ZldGNoZXIuY2MKQEAgLTEwMyw4ICsxMDMsMTEgQEAKICAgaWYgKHVybF9sb2FkZXJfKQogICAgIHJldHVybiBmYWxzZTsKIAotICBoaW50c19mZXRjaF9zdGFydF90aW1lXyA9IGJhc2U6OlRpbWVUaWNrczo6Tm93KCk7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBmaWx0ZXJlZF9ob3N0cyA9IEdldEhvc3RzRHVlRm9ySGludHNSZWZyZXNoKGhvc3RzKTsKKyAgaWYgKGZpbHRlcmVkX2hvc3RzLmVtcHR5KCkpCisgICAgcmV0dXJuIGZhbHNlOwogCisgIGhpbnRzX2ZldGNoX3N0YXJ0X3RpbWVfID0gYmFzZTo6VGltZVRpY2tzOjpOb3coKTsKICAgcmVxdWVzdF9jb250ZXh0XyA9IHJlcXVlc3RfY29udGV4dDsKIAogICBnZXRfaGludHNfcmVxdWVzdF8gPSBzdGQ6Om1ha2VfdW5pcXVlPHByb3RvOjpHZXRIaW50c1JlcXVlc3Q+KCk7CkBAIC0xMjAsNyArMTIzLDcgQEAKIAogICBnZXRfaGludHNfcmVxdWVzdF8tPnNldF9jb250ZXh0KHJlcXVlc3RfY29udGV4dF8pOwogCi0gIGZvciAoY29uc3QgYXV0byYgaG9zdCA6IGhvc3RzKSB7CisgIGZvciAoY29uc3QgYXV0byYgaG9zdCA6IGZpbHRlcmVkX2hvc3RzKSB7CiAgICAgcHJvdG86Okhvc3RJbmZvKiBob3N0X2luZm8gPSBnZXRfaGludHNfcmVxdWVzdF8tPmFkZF9ob3N0cygpOwogICAgIGhvc3RfaW5mby0+c2V0X2hvc3QoaG9zdCk7CiAgIH0KQEAgLTE2NSw3ICsxNjgsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi94LXByb3RvYnVmIik7CiAKICAgVU1BX0hJU1RPR1JBTV9DT1VOVFNfMTAwKAotICAgICAgIk9wdGltaXphdGlvbkd1aWRlLkhpbnRzRmV0Y2hlci5HZXRIaW50c1JlcXVlc3QuSG9zdENvdW50IiwgaG9zdHMuc2l6ZSgpKTsKKyAgICAgICJPcHRpbWl6YXRpb25HdWlkZS5IaW50c0ZldGNoZXIuR2V0SGludHNSZXF1ZXN0Lkhvc3RDb3VudCIsCisgICAgICBmaWx0ZXJlZF9ob3N0cy5zaXplKCkpOwogCiAgIC8vIHx1cmxfbG9hZGVyX3wgc2hvdWxkIG5vdCByZXRyeSBvbiA1eHggZXJyb3JzIHNpbmNlIHRoZSBzZXJ2ZXIgbWF5IGFscmVhZHkKICAgLy8gYmUgb3ZlcmxvYWRlZC4gIHx1cmxfbG9hZGVyX3wgc2hvdWxkIHJldHJ5IG9uIG5ldHdvcmsgY2hhbmdlcyBzaW5jZSB0aGUKQEAgLTE3OSw3ICsxODMsNyBAQAogICAgICAgYmFzZTo6QmluZE9uY2UoJkhpbnRzRmV0Y2hlcjo6T25VUkxMb2FkQ29tcGxldGUsIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKIAogICBoaW50c19mZXRjaGVkX2NhbGxiYWNrXyA9IHN0ZDo6bW92ZShoaW50c19mZXRjaGVkX2NhbGxiYWNrKTsKLSAgaG9zdHNfZmV0Y2hlZF8gPSBob3N0czsKKyAgaG9zdHNfZmV0Y2hlZF8gPSBmaWx0ZXJlZF9ob3N0czsKICAgcmV0dXJuIHRydWU7CiB9CiAKQEAgLTI3OSw0ICsyODMsMzIgQEAKICAgdXJsX2xvYWRlcl8ucmVzZXQoKTsKIH0KIAorc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEhpbnRzRmV0Y2hlcjo6R2V0SG9zdHNEdWVGb3JIaW50c1JlZnJlc2goCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBob3N0cykgY29uc3QgeworICBTRVFVRU5DRV9DSEVDS0VSKHNlcXVlbmNlX2NoZWNrZXJfKTsKKworICBEaWN0aW9uYXJ5UHJlZlVwZGF0ZSBob3N0c19mZXRjaGVkKAorICAgICAgcHJlZl9zZXJ2aWNlXywgcHJlZnM6OmtIaW50c0ZldGNoZXJIb3N0c1N1Y2Nlc3NmdWxseUZldGNoZWQpOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB0YXJnZXRfaG9zdHM7CisgIHRhcmdldF9ob3N0cy5yZXNlcnZlKGhvc3RzLnNpemUoKSk7CisKKyAgZm9yIChjb25zdCBhdXRvJiBob3N0IDogaG9zdHMpIHsKKyAgICBib29sIGhvc3RfaGludHNfZHVlX2Zvcl9yZWZyZXNoID0gdHJ1ZTsKKworICAgIGJhc2U6Ok9wdGlvbmFsPGRvdWJsZT4gdmFsdWUgPQorICAgICAgICBob3N0c19mZXRjaGVkLT5GaW5kRG91YmxlS2V5KEhhc2hIb3N0Rm9yRGljdGlvbmFyeShob3N0KSk7CisgICAgaWYgKHZhbHVlKSB7CisgICAgICBiYXNlOjpUaW1lIGhvc3RfdmFsaWRfdGltZSA9IGJhc2U6OlRpbWU6OkZyb21EZWx0YVNpbmNlV2luZG93c0Vwb2NoKAorICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbVNlY29uZHNEKCp2YWx1ZSkpOworICAgICAgaG9zdF9oaW50c19kdWVfZm9yX3JlZnJlc2ggPQorICAgICAgICAgIChob3N0X3ZhbGlkX3RpbWUgLSBmZWF0dXJlczo6R2V0SGludHNGZXRjaFJlZnJlc2hEdXJhdGlvbigpIDw9CisgICAgICAgICAgIHRpbWVfY2xvY2tfLT5Ob3coKSk7CisgICAgfQorICAgIGlmIChob3N0X2hpbnRzX2R1ZV9mb3JfcmVmcmVzaCkKKyAgICAgIHRhcmdldF9ob3N0cy5wdXNoX2JhY2soaG9zdCk7CisgIH0KKyAgcmV0dXJuIHRhcmdldF9ob3N0czsKK30KKwogfSAgLy8gbmFtZXNwYWNlIG9wdGltaXphdGlvbl9ndWlkZQpkaWZmIC0tZ2l0IGEvY29tcG9uZW50cy9vcHRpbWl6YXRpb25fZ3VpZGUvaGludHNfZmV0Y2hlci5oIGIvY29tcG9uZW50cy9vcHRpbWl6YXRpb25fZ3VpZGUvaGludHNfZmV0Y2hlci5oCmluZGV4IGY5YTY3MjAuLjZlZTg2YzUgMTAwNjQ0Ci0tLSBhL2NvbXBvbmVudHMvb3B0aW1pemF0aW9uX2d1aWRlL2hpbnRzX2ZldGNoZXIuaAorKysgYi9jb21wb25lbnRzL29wdGltaXphdGlvbl9ndWlkZS9oaW50c19mZXRjaGVyLmgKQEAgLTk1LDYgKzk1LDExIEBACiAgIC8vIGluIHRoZSBwcmVmLgogICB2b2lkIFVwZGF0ZUhvc3RzU3VjY2Vzc2Z1bGx5RmV0Y2hlZCgpOwogCisgIC8vIFJldHVybnMgdGhlIHN1YnNldCBvZiBob3N0cyBmcm9tIHxob3N0c3wgZm9yIHdoaWNoIHRoZSBoaW50cyBzaG91bGQgYmUKKyAgLy8gcmVmcmVzaGVkLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gR2V0SG9zdHNEdWVGb3JIaW50c1JlZnJlc2goCisgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGhvc3RzKSBjb25zdDsKKwogICAvLyBVc2VkIHRvIGhvbGQgdGhlIEdldEhpbnRzUmVxdWVzdCBiZWluZyBjb25zdHJ1Y3RlZCBhbmQgc2VudCBhcyBhIHJlbW90ZQogICAvLyByZXF1ZXN0LgogICBzdGQ6OnVuaXF1ZV9wdHI8cHJvdG86OkdldEhpbnRzUmVxdWVzdD4gZ2V0X2hpbnRzX3JlcXVlc3RfOwpkaWZmIC0tZ2l0IGEvY29tcG9uZW50cy9vcHRpbWl6YXRpb25fZ3VpZGUvaGludHNfZmV0Y2hlcl91bml0dGVzdC5jYyBiL2NvbXBvbmVudHMvb3B0aW1pemF0aW9uX2d1aWRlL2hpbnRzX2ZldGNoZXJfdW5pdHRlc3QuY2MKaW5kZXggMmMwYjcwYjIuLmFkMTM0MTcgMTAwNjQ0Ci0tLSBhL2NvbXBvbmVudHMvb3B0aW1pemF0aW9uX2d1aWRlL2hpbnRzX2ZldGNoZXJfdW5pdHRlc3QuY2MKKysrIGIvY29tcG9uZW50cy9vcHRpbWl6YXRpb25fZ3VpZGUvaGludHNfZmV0Y2hlcl91bml0dGVzdC5jYwpAQCAtOTYsNiArOTYsMTAgQEAKICAgICByZXR1cm4gdGFza19lbnZpcm9ubWVudF8uR2V0TW9ja0Nsb2NrKCk7CiAgIH0KIAorICB2b2lkIFNldFRpbWVDbG9ja0ZvclRlc3RpbmcoYmFzZTo6Q2xvY2sqIGNsb2NrKSB7CisgICAgaGludHNfZmV0Y2hlcl8tPlNldFRpbWVDbG9ja0ZvclRlc3RpbmcoY2xvY2spOworICB9CisKICBwcm90ZWN0ZWQ6CiAgIGJvb2wgRmV0Y2hIaW50cyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGhvc3RzKSB7CiAgICAgYm9vbCBzdGF0dXMgPSBoaW50c19mZXRjaGVyXy0+RmV0Y2hPcHRpbWl6YXRpb25HdWlkZVNlcnZpY2VIaW50cygKQEAgLTE1Myw3ICsxNTcsNyBAQAogICBiYXNlOjpIaXN0b2dyYW1UZXN0ZXIgaGlzdG9ncmFtX3Rlc3RlcjsKIAogICBzdGQ6OnN0cmluZyByZXNwb25zZV9jb250ZW50OwotICBFWFBFQ1RfVFJVRShGZXRjaEhpbnRzKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPigpKSk7CisgIEVYUEVDVF9UUlVFKEZldGNoSGludHMoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+eyJmb28uY29tIn0pKTsKICAgVmVyaWZ5SGFzUGVuZGluZ0ZldGNoUmVxdWVzdHMoKTsKICAgRVhQRUNUX1RSVUUoU2ltdWxhdGVSZXNwb25zZShyZXNwb25zZV9jb250ZW50LCBuZXQ6OkhUVFBfT0spKTsKICAgRVhQRUNUX1RSVUUoaGludHNfZmV0Y2hlZCgpKTsKQEAgLTE2NCwxNiArMTY4LDczIEBACiAKIC8vIFRlc3RzIHRvIGVuc3VyZSB0aGF0IG11bHRpcGxlIGhpbnQgZmV0Y2hlcyBieSB0aGUgc2FtZSBvYmplY3QgY2Fubm90IGJlIGluCiAvLyBwcm9ncmVzcyBzaW11bHRhbmVvdXNseS4KLVRFU1RfRihIaW50c0ZldGNoZXJUZXN0LCBGZXRjaEluUHJvY2VzcykgeworVEVTVF9GKEhpbnRzRmV0Y2hlclRlc3QsIEZldGNoSW5Qcm9ncmVzcykgeworICBiYXNlOjpTaW1wbGVUZXN0Q2xvY2sgdGVzdF9jbG9jazsKKyAgU2V0VGltZUNsb2NrRm9yVGVzdGluZygmdGVzdF9jbG9jayk7CisKICAgc3RkOjpzdHJpbmcgcmVzcG9uc2VfY29udGVudDsKICAgLy8gRmV0Y2ggYmFjayB0byBiYWNrIHdpdGhvdXQgd2FpdGluZyBmb3IgRmV0Y2ggdG8gY29tcGxldGUsCiAgIC8vIHxmZXRjaF9pbl9wcm9ncmVzc198IHNob3VsZCBjYXVzZSBlYXJseSBleGl0LgotICBFWFBFQ1RfVFJVRShGZXRjaEhpbnRzKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPigpKSk7Ci0gIEVYUEVDVF9GQUxTRShGZXRjaEhpbnRzKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPigpKSk7CisgIEVYUEVDVF9UUlVFKEZldGNoSGludHMoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+eyJmb28uY29tIn0pKTsKKyAgRVhQRUNUX0ZBTFNFKEZldGNoSGludHMoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+eyJiYXIuY29tIn0pKTsKIAogICAvLyBPbmNlIHJlc3BvbnNlIGFycml2ZXMsIGNoZWNrIHRvIG1ha2Ugc3VyZSBhIG5ldyBmZXRjaCBjYW4gc3RhcnQuCiAgIFNpbXVsYXRlUmVzcG9uc2UocmVzcG9uc2VfY29udGVudCwgbmV0OjpIVFRQX09LKTsKLSAgRVhQRUNUX1RSVUUoRmV0Y2hIaW50cyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4oKSkpOworICBFWFBFQ1RfVFJVRShGZXRjaEhpbnRzKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPnsiYmFyLmNvbSJ9KSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIGhpbnRzIGFyZSByZWZyZXNoZWQgYWdhaW4gZm9yIGhvc3RzIGZvciB3aG9tIGhpbnRzIHdlcmUKKy8vIGZldGNoZWQgcmVjZW50bHkuCitURVNUX0YoSGludHNGZXRjaGVyVGVzdCwgRmV0Y2hJblByb2dyZXNzX0hvc3RzSGludHNSZWZyZXNoZWQpIHsKKyAgYmFzZTo6U2ltcGxlVGVzdENsb2NrIHRlc3RfY2xvY2s7CisgIFNldFRpbWVDbG9ja0ZvclRlc3RpbmcoJnRlc3RfY2xvY2spOworCisgIHN0ZDo6c3RyaW5nIHJlc3BvbnNlX2NvbnRlbnQ7CisgIC8vIEZldGNoIGJhY2sgdG8gYmFjayB3aXRob3V0IHdhaXRpbmcgZm9yIEZldGNoIHRvIGNvbXBsZXRlLAorICAvLyB8ZmV0Y2hfaW5fcHJvZ3Jlc3NffCBzaG91bGQgY2F1c2UgZWFybHkgZXhpdC4KKyAgRVhQRUNUX1RSVUUoRmV0Y2hIaW50cyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz57ImZvby5jb20ifSkpOworICBFWFBFQ1RfRkFMU0UoRmV0Y2hIaW50cyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz57ImZvby5jb20ifSkpOworCisgIC8vIE9uY2UgcmVzcG9uc2UgYXJyaXZlcywgY2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGZldGNoIGZvciB0aGUgc2FtZSBob3N0CisgIC8vIGlzIG5vdCBzdGFydGVkIGFnYWluLgorICBTaW11bGF0ZVJlc3BvbnNlKHJlc3BvbnNlX2NvbnRlbnQsIG5ldDo6SFRUUF9PSyk7CisgIEVYUEVDVF9GQUxTRShGZXRjaEhpbnRzKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPnsiZm9vLmNvbSJ9KSk7CisgIC8vIEVuc3VyZSBhIG5ldyBmZXRjaCBmb3IgYSBkaWZmZXJlbnQgaG9zdCBjYW4gc3RhcnQuCisgIEVYUEVDVF9UUlVFKEZldGNoSGludHMoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+eyJiYXIuY29tIn0pKTsKKyAgU2ltdWxhdGVSZXNwb25zZShyZXNwb25zZV9jb250ZW50LCBuZXQ6OkhUVFBfT0spOworCisgIEVYUEVDVF9GQUxTRShGZXRjaEhpbnRzKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPnsiZm9vLmNvbSJ9KSk7CisgIEVYUEVDVF9GQUxTRShGZXRjaEhpbnRzKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPnsiYmFyLmNvbSJ9KSk7CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGhvc3RzeyJmb28uY29tIiwgImJhci5jb20ifTsKKyAgLy8gQWR2YW5jaW5nIHRoZSBjbG9jayBzbyB0aGF0IGl0J3Mgc3RpbGwgb25lIGhvdXIgYmVmb3JlIHRoZSBoaW50cyBuZWVkIHRvIGJlCisgIC8vIHJlZnJlc2hlZC4KKyAgdGVzdF9jbG9jay5BZHZhbmNlKGZlYXR1cmVzOjpTdG9yZWRGZXRjaGVkSGludHNGcmVzaG5lc3NEdXJhdGlvbigpIC0KKyAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzOjpHZXRIaW50c0ZldGNoUmVmcmVzaER1cmF0aW9uKCkgLQorICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhKCkuRnJvbUhvdXJzKDEpKTsKKworICBFWFBFQ1RfRkFMU0UoRmV0Y2hIaW50cyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz57ImZvby5jb20ifSkpOworICBFWFBFQ1RfRkFMU0UoRmV0Y2hIaW50cyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz57ImJhci5jb20ifSkpOworCisgIC8vIEFkdmFuY2luZyB0aGUgY2xvY2sgYnkgYSBsaXR0bGUgYml0IG1vcmUgdGhhbiAxIGhvdXIgc28gdGhhdCB0aGUgaGludHMgYXJlCisgIC8vIG5vdyBkdWUgZm9yIHJlZnJlc2guCisgIHRlc3RfY2xvY2suQWR2YW5jZShiYXNlOjpUaW1lRGVsdGE6OkZyb21NaW51dGVzKDYxKSk7CisKKyAgRVhQRUNUX1RSVUUoRmV0Y2hIaW50cyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz57ImZvby5jb20ifSkpOworICBFWFBFQ1RfRkFMU0UoRmV0Y2hIaW50cyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz57ImJhci5jb20ifSkpOworICBTaW11bGF0ZVJlc3BvbnNlKHJlc3BvbnNlX2NvbnRlbnQsIG5ldDo6SFRUUF9PSyk7CisKKyAgLy8gSGludHMgc2hvdWxkIG5vdCBiZSBmZXRjaGVkIGFnYWluIGZvciBmb28uY29tIHNpbmNlIHRoZXkgd2VyZSBmZXRjaGVkCisgIC8vIHJlY2VudGx5LiBIaW50cyBzaG91bGQgc3RpbGwgYmUgZmV0Y2hlZCBmb3IgYmFyLmNvbS4KKyAgRVhQRUNUX0ZBTFNFKEZldGNoSGludHMoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+eyJmb28uY29tIn0pKTsKKyAgRVhQRUNUX1RSVUUoRmV0Y2hIaW50cyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz57ImJhci5jb20ifSkpOworICBTaW11bGF0ZVJlc3BvbnNlKHJlc3BvbnNlX2NvbnRlbnQsIG5ldDo6SFRUUF9PSyk7CisKKyAgLy8gSGludHMgc2hvdWxkIG5vdCBiZSBmZXRjaGVkIGFnYWluIGZvciBmb28uY29tIGFuZCBiYXIuY29tIHNpbmNlIHRoZXkgd2VyZQorICAvLyBmZXRjaGVkIHJlY2VudGx5LiBGb3IgYmF6LmNvbSwgaGludHMgc2hvdWxkIGJlIGZldGNoZWQgYWdhaW4uCisgIEVYUEVDVF9GQUxTRShGZXRjaEhpbnRzKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPnsiZm9vLmNvbSJ9KSk7CisgIEVYUEVDVF9GQUxTRShGZXRjaEhpbnRzKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPnsiYmFyLmNvbSJ9KSk7CisgIEVYUEVDVF9UUlVFKEZldGNoSGludHMoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+eyJiYXouY29tIn0pKTsKIH0KIAogLy8gVGVzdHMgNDA0IHJlc3BvbnNlIGZyb20gcmVxdWVzdC4KQEAgLTE4Miw3ICsyNDMsNyBAQAogCiAgIHN0ZDo6c3RyaW5nIHJlc3BvbnNlX2NvbnRlbnQ7CiAKLSAgRVhQRUNUX1RSVUUoRmV0Y2hIaW50cyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4oKSkpOworICBFWFBFQ1RfVFJVRShGZXRjaEhpbnRzKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPnsiZm9vLmNvbSJ9KSk7CiAKICAgLy8gU2VuZCBhIDQwNCB0byBIaW50c0ZldGNoZXIuCiAgIFNpbXVsYXRlUmVzcG9uc2UocmVzcG9uc2VfY29udGVudCwgbmV0OjpIVFRQX05PVF9GT1VORCk7CkBAIC0xOTcsNyArMjU4LDcgQEAKICAgYmFzZTo6SGlzdG9ncmFtVGVzdGVyIGhpc3RvZ3JhbV90ZXN0ZXI7CiAKICAgc3RkOjpzdHJpbmcgcmVzcG9uc2VfY29udGVudCA9ICJub3QgcHJvdG8iOwotICBFWFBFQ1RfVFJVRShGZXRjaEhpbnRzKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPigpKSk7CisgIEVYUEVDVF9UUlVFKEZldGNoSGludHMoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+eyJmb28uY29tIn0pKTsKICAgVmVyaWZ5SGFzUGVuZGluZ0ZldGNoUmVxdWVzdHMoKTsKICAgRVhQRUNUX1RSVUUoU2ltdWxhdGVSZXNwb25zZShyZXNwb25zZV9jb250ZW50LCBuZXQ6OkhUVFBfT0spKTsKICAgRVhQRUNUX0ZBTFNFKGhpbnRzX2ZldGNoZWQoKSk7CkBAIC0yMTIsNyArMjczLDcgQEAKIAogICBTZXRDb25uZWN0aW9uT2ZmbGluZSgpOwogICBzdGQ6OnN0cmluZyByZXNwb25zZV9jb250ZW50OwotICBFWFBFQ1RfRkFMU0UoRmV0Y2hIaW50cyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4oKSkpOworICBFWFBFQ1RfRkFMU0UoRmV0Y2hIaW50cyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz57ImZvby5jb20ifSkpOwogICBFWFBFQ1RfRkFMU0UoaGludHNfZmV0Y2hlZCgpKTsKIAogICAvLyBNYWtlIHN1cmUgaGlzdG9ncmFtIG5vdCByZWNvcmRlZCBvbiBiYWQgcmVzcG9uc2UuCkBAIC0yMjAsNyArMjgxLDcgQEAKICAgICAgICJPcHRpbWl6YXRpb25HdWlkZS5IaW50c0ZldGNoZXIuR2V0SGludHNSZXF1ZXN0LkZldGNoTGF0ZW5jeSIsIDApOwogCiAgIFNldENvbm5lY3Rpb25PbmxpbmUoKTsKLSAgRVhQRUNUX1RSVUUoRmV0Y2hIaW50cyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4oKSkpOworICBFWFBFQ1RfVFJVRShGZXRjaEhpbnRzKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPnsiZm9vLmNvbSJ9KSk7CiAgIFZlcmlmeUhhc1BlbmRpbmdGZXRjaFJlcXVlc3RzKCk7CiAgIEVYUEVDVF9UUlVFKFNpbXVsYXRlUmVzcG9uc2UocmVzcG9uc2VfY29udGVudCwgbmV0OjpIVFRQX09LKSk7CiAgIEVYUEVDVF9UUlVFKGhpbnRzX2ZldGNoZWQoKSk7CmRpZmYgLS1naXQgYS9jb21wb25lbnRzL29wdGltaXphdGlvbl9ndWlkZS9vcHRpbWl6YXRpb25fZ3VpZGVfZGVjaWRlci5oIGIvY29tcG9uZW50cy9vcHRpbWl6YXRpb25fZ3VpZGUvb3B0aW1pemF0aW9uX2d1aWRlX2RlY2lkZXIuaAppbmRleCAzODUyYTFhLi5hMzhhYmJhIDEwMDY0NAotLS0gYS9jb21wb25lbnRzL29wdGltaXphdGlvbl9ndWlkZS9vcHRpbWl6YXRpb25fZ3VpZGVfZGVjaWRlci5oCisrKyBiL2NvbXBvbmVudHMvb3B0aW1pemF0aW9uX2d1aWRlL29wdGltaXphdGlvbl9ndWlkZV9kZWNpZGVyLmgKQEAgLTM5LDEwICszOSwxMiBAQAogCiBjbGFzcyBPcHRpbWl6YXRpb25HdWlkZURlY2lkZXIgewogIHB1YmxpYzoKLSAgLy8gUmVnaXN0ZXJzIHRoZSBvcHRpbWl6YXRpb24gdHlwZXMgdGhhdCBpbnRlbmQgdG8gYmUgcXVlcmllZCBkdXJpbmcgdGhlCi0gIC8vIHNlc3Npb24uCi0gIHZpcnR1YWwgdm9pZCBSZWdpc3Rlck9wdGltaXphdGlvblR5cGVzKAotICAgICAgc3RkOjp2ZWN0b3I8cHJvdG86Ok9wdGltaXphdGlvblR5cGU+IG9wdGltaXphdGlvbl90eXBlcykgPSAwOworICAvLyBSZWdpc3RlcnMgdGhlIG9wdGltaXphdGlvbiB0eXBlcyBhbmQgdGFyZ2V0cyB0aGF0IGludGVuZCB0byBiZSBxdWVyaWVkCisgIC8vIGR1cmluZyB0aGUgc2Vzc2lvbi4gSXQgaXMgZXhwZWN0ZWQgZm9yIHRoaXMgdG8gYmUgY2FsbGVkIGFmdGVyIHRoZSBicm93c2VyCisgIC8vIGhhcyBiZWVuIGluaXRpYWxpemVkLgorICB2aXJ0dWFsIHZvaWQgUmVnaXN0ZXJPcHRpbWl6YXRpb25UeXBlc0FuZFRhcmdldHMoCisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxwcm90bzo6T3B0aW1pemF0aW9uVHlwZT4mIG9wdGltaXphdGlvbl90eXBlcywKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHByb3RvOjpPcHRpbWl6YXRpb25UYXJnZXQ+JiBvcHRpbWl6YXRpb25fdGFyZ2V0cykgPSAwOwogCiAgIC8vIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBjb25kaXRpb25zIG1hdGNoIHxvcHRpbWl6YXRpb25fdGFyZ2V0fCBhbmQKICAgLy8gfG9wdGltaXphdGlvbl90eXBlfCBjYW4gYmUgYXBwbGllZCBmb3IgdGhlIFVSTCBhc3NvY2lhdGVkIHdpdGgKZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvb3B0aW1pemF0aW9uX2d1aWRlL29wdGltaXphdGlvbl9ndWlkZV9mZWF0dXJlcy5jYyBiL2NvbXBvbmVudHMvb3B0aW1pemF0aW9uX2d1aWRlL29wdGltaXphdGlvbl9ndWlkZV9mZWF0dXJlcy5jYwppbmRleCA1MjU0Njk0Li4wNzA4NzliIDEwMDY0NAotLS0gYS9jb21wb25lbnRzL29wdGltaXphdGlvbl9ndWlkZS9vcHRpbWl6YXRpb25fZ3VpZGVfZmVhdHVyZXMuY2MKKysrIGIvY29tcG9uZW50cy9vcHRpbWl6YXRpb25fZ3VpZGUvb3B0aW1pemF0aW9uX2d1aWRlX2ZlYXR1cmVzLmNjCkBAIC0xNTgsNSArMTU4LDkgQEAKICAgcmV0dXJuIG5ldDo6R2V0RWZmZWN0aXZlQ29ubmVjdGlvblR5cGVGb3JOYW1lKHBhcmFtX3ZhbHVlKTsKIH0KIAorYmFzZTo6VGltZURlbHRhIEdldEhpbnRzRmV0Y2hSZWZyZXNoRHVyYXRpb24oKSB7CisgIHJldHVybiBiYXNlOjpUaW1lRGVsdGE6OkZyb21Ib3Vycyg3Mik7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBmZWF0dXJlcwogfSAgLy8gbmFtZXNwYWNlIG9wdGltaXphdGlvbl9ndWlkZQpkaWZmIC0tZ2l0IGEvY29tcG9uZW50cy9vcHRpbWl6YXRpb25fZ3VpZGUvb3B0aW1pemF0aW9uX2d1aWRlX2ZlYXR1cmVzLmggYi9jb21wb25lbnRzL29wdGltaXphdGlvbl9ndWlkZS9vcHRpbWl6YXRpb25fZ3VpZGVfZmVhdHVyZXMuaAppbmRleCA3OGIyNjIxMDguLmE5ODE0OTllIDEwMDY0NAotLS0gYS9jb21wb25lbnRzL29wdGltaXphdGlvbl9ndWlkZS9vcHRpbWl6YXRpb25fZ3VpZGVfZmVhdHVyZXMuaAorKysgYi9jb21wb25lbnRzL29wdGltaXphdGlvbl9ndWlkZS9vcHRpbWl6YXRpb25fZ3VpZGVfZmVhdHVyZXMuaApAQCAtODAsNiArODAsMTIgQEAKIGJhc2U6Ok9wdGlvbmFsPG5ldDo6RWZmZWN0aXZlQ29ubmVjdGlvblR5cGU+CiBHZXRNYXhFZmZlY3RpdmVDb25uZWN0aW9uVHlwZUZvck5hdmlnYXRpb25IaW50c0ZldGNoKCk7CiAKKy8vIFJldHVybnMgdGhlIGR1cmF0aW9uIG9mIHRoZSB0aW1lIHdpbmRvdyBiZWZvcmUgaGludHMgZXhwaXJhdGlvbiBkdXJpbmcgd2hpY2gKKy8vIHRoZSBob3N0cyBzaG91bGQgYmUgcmVmcmVzaGVkLiBFeGFtcGxlOiBJZiB0aGUgaGludHMgZm9yIGEgaG9zdCBleHBpcmUgYXQKKy8vIHRpbWUgVCwgdGhlbiB0aGV5IGFyZSBlbGlnaWJsZSBmb3IgcmVmcmVzaCBhdCBUIC0KKy8vIEdldEhpbnRzRmV0Y2hSZWZyZXNoRHVyYXRpb24oKS4KK2Jhc2U6OlRpbWVEZWx0YSBHZXRIaW50c0ZldGNoUmVmcmVzaER1cmF0aW9uKCk7CisKIH0gIC8vIG5hbWVzcGFjZSBmZWF0dXJlcwogfSAgLy8gbmFtZXNwYWNlIG9wdGltaXphdGlvbl9ndWlkZQogCmRpZmYgLS1naXQgYS9jb21wb25lbnRzL3BhZ2VfaW5mb19zdHJpbmdzLmdyZHAgYi9jb21wb25lbnRzL3BhZ2VfaW5mb19zdHJpbmdzLmdyZHAKaW5kZXggYTE4YzdhMmQuLmM4MzNmMzIgMTAwNjQ0Ci0tLSBhL2NvbXBvbmVudHMvcGFnZV9pbmZvX3N0cmluZ3MuZ3JkcAorKysgYi9jb21wb25lbnRzL3BhZ2VfaW5mb19zdHJpbmdzLmdyZHAKQEAgLTQ3MSw2ICs0NzEsOSBAQAogICAgICAgICA8bWVzc2FnZSBuYW1lPSJJRFNfUEFHRV9JTkZPX0lHTk9SRV9QQVNTV09SRF9XQVJOSU5HX0JVVFRPTiIgZGVzYz0iSW4gVGl0bGUgQ2FzZTogVGhlIHN0cmluZyB1c2VkIGluIHRoZSBwYWdlIGluZm8gaWdub3JlIHBhc3N3b3JkIHdhcm5pbmcgYnV0dG9uLiI+CiAgICAgICAgICAgSWdub3JlCiAgICAgICAgIDwvbWVzc2FnZT4KKyAgICAgICAgPG1lc3NhZ2UgbmFtZT0iSURTX1BBR0VfSU5GT19ESVNNSVNTX1BBU1NXT1JEX1dBUk5JTkdfQlVUVE9OIiBkZXNjPSJJbiBUaXRsZSBDYXNlOiBUaGUgc3RyaW5nIHVzZWQgaW4gdGhlIHBhZ2UgaW5mbyBkaXNtaXNzIHBhc3N3b3JkIHdhcm5pbmcgYnV0dG9uLiI+CisgICAgICAgICAgRGlzbWlzcworICAgICAgICA8L21lc3NhZ2U+CiAgICAgICA8L2lmPgogICAgICAgPGlmIGV4cHI9Im5vdCB1c2VfdGl0bGVjYXNlIj4KICAgICAgICAgPG1lc3NhZ2UgbmFtZT0iSURTX1BBR0VfSU5GT19DSEFOR0VfUEFTU1dPUkRfQlVUVE9OIiBkZXNjPSJUaGUgc3RyaW5nIHVzZWQgaW4gdGhlIHBhZ2UgaW5mbyBjaGFuZ2UgcGFzc3dvcmQgYnV0dG9uLiI+CkBAIC00ODIsNyArNDg1LDEwIEBACiAgICAgICAgIDxtZXNzYWdlIG5hbWU9IklEU19QQUdFX0lORk9fSUdOT1JFX1BBU1NXT1JEX1dBUk5JTkdfQlVUVE9OIiBkZXNjPSJUaGUgc3RyaW5nIHVzZWQgaW4gdGhlIHBhZ2UgaW5mbyBpZ25vcmUgcGFzc3dvcmQgd2FybmluZyBidXR0b24uIj4KICAgICAgICAgICBJZ25vcmUKICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgPC9pZj4KKyAgICAgICAgPG1lc3NhZ2UgbmFtZT0iSURTX1BBR0VfSU5GT19ESVNNSVNTX1BBU1NXT1JEX1dBUk5JTkdfQlVUVE9OIiBkZXNjPSJUaGUgc3RyaW5nIHVzZWQgaW4gdGhlIHBhZ2UgaW5mbyBkaXNtaXNzIHBhc3N3b3JkIHdhcm5pbmcgYnV0dG9uLiI+CisgICAgICAgICAgRGlzbWlzcworICAgICAgICA8L21lc3NhZ2U+CisgICAgICAgPC9pZj4KICAgICAgIDxtZXNzYWdlIG5hbWU9IklEU19QQUdFX0lORk9fV0hJVEVMSVNUX1BBU1NXT1JEX1JFVVNFX0JVVFRPTiIgZGVzYz0iVGhlIHN0cmluZyB1c2VkIGluIHRoZSBwYWdlIGluZm8gd2hpdGVsaXN0IHBhc3N3b3JkIHJldXNlIGJ1dHRvbi4iPgogICAgICAgICBTaXRlIGlzIGxlZ2l0aW1hdGUKICAgICAgIDwvbWVzc2FnZT4KZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvcGFnZV9sb2FkX21ldHJpY3MvYnJvd3Nlci9tZXRyaWNzX3dlYl9jb250ZW50c19vYnNlcnZlcl91bml0dGVzdC5jYyBiL2NvbXBvbmVudHMvcGFnZV9sb2FkX21ldHJpY3MvYnJvd3Nlci9tZXRyaWNzX3dlYl9jb250ZW50c19vYnNlcnZlcl91bml0dGVzdC5jYwppbmRleCAxNTQxZTcxZS4uOGEyYWY4MyAxMDA2NDQKLS0tIGEvY29tcG9uZW50cy9wYWdlX2xvYWRfbWV0cmljcy9icm93c2VyL21ldHJpY3Nfd2ViX2NvbnRlbnRzX29ic2VydmVyX3VuaXR0ZXN0LmNjCisrKyBiL2NvbXBvbmVudHMvcGFnZV9sb2FkX21ldHJpY3MvYnJvd3Nlci9tZXRyaWNzX3dlYl9jb250ZW50c19vYnNlcnZlcl91bml0dGVzdC5jYwpAQCAtMzI2LDEwICszMjYsNyBAQAogICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDQwKTsKICAgc3ViZnJhbWUgPSBjb250ZW50OjpOYXZpZ2F0aW9uU2ltdWxhdG9yOjpOYXZpZ2F0ZUFuZENvbW1pdEZyb21Eb2N1bWVudCgKICAgICAgIEdVUkwoa0RlZmF1bHRUZXN0VXJsMiksIHN1YmZyYW1lKTsKLSAgY29udGVudDo6UmVuZGVyRnJhbWVIb3N0VGVzdGVyKiBzdWJmcmFtZV90ZXN0ZXIgPQotICAgICAgY29udGVudDo6UmVuZGVyRnJhbWVIb3N0VGVzdGVyOjpGb3Ioc3ViZnJhbWUpOwogICBTaW11bGF0ZVRpbWluZ1VwZGF0ZShzdWJmcmFtZV90aW1pbmcsIHN1YmZyYW1lKTsKLSAgc3ViZnJhbWVfdGVzdGVyLT5TaW11bGF0ZU5hdmlnYXRpb25TdG9wKCk7CiAKICAgQVNTRVJUX0VRKDEsIENvdW50VXBkYXRlZFN1YkZyYW1lVGltaW5nUmVwb3J0ZWQoKSk7CiAgIEVYUEVDVF9UUlVFKHN1YmZyYW1lX3RpbWluZy5FcXVhbHMoKnVwZGF0ZWRfc3ViZnJhbWVfdGltaW5ncygpLmJhY2soKSkpOwpAQCAtODIxLDEwICs4MTgsNyBAQAogICBjb250ZW50OjpSZW5kZXJGcmFtZUhvc3QqIHN1YmZyYW1lID0gcmZoX3Rlc3Rlci0+QXBwZW5kQ2hpbGQoInN1YmZyYW1lIik7CiAgIHN1YmZyYW1lID0gY29udGVudDo6TmF2aWdhdGlvblNpbXVsYXRvcjo6TmF2aWdhdGVBbmRDb21taXRGcm9tRG9jdW1lbnQoCiAgICAgICBHVVJMKGtEZWZhdWx0VGVzdFVybDIpLCBzdWJmcmFtZSk7Ci0gIGNvbnRlbnQ6OlJlbmRlckZyYW1lSG9zdFRlc3Rlciogc3ViZnJhbWVfdGVzdGVyID0KLSAgICAgIGNvbnRlbnQ6OlJlbmRlckZyYW1lSG9zdFRlc3Rlcjo6Rm9yKHN1YmZyYW1lKTsKICAgU2ltdWxhdGVUaW1pbmdVcGRhdGVXaXRob3V0RmlyaW5nRGlzcGF0Y2hUaW1lcihzdWJmcmFtZV90aW1pbmcsIHN1YmZyYW1lKTsKLSAgc3ViZnJhbWVfdGVzdGVyLT5TaW11bGF0ZU5hdmlnYXRpb25TdG9wKCk7CiAKICAgaGlzdG9ncmFtX3Rlc3Rlcl8uRXhwZWN0VG90YWxDb3VudCgKICAgICAgIHBhZ2VfbG9hZF9tZXRyaWNzOjppbnRlcm5hbDo6a0hpc3RvZ3JhbU91dE9mT3JkZXJUaW1pbmcsIDEpOwpAQCAtODY5LDEwICs4NjMsNyBAQAogICBjb250ZW50OjpSZW5kZXJGcmFtZUhvc3QqIHN1YmZyYW1lMiA9IHJmaF90ZXN0ZXItPkFwcGVuZENoaWxkKCJzdWJmcmFtZSIpOwogICBzdWJmcmFtZTIgPSBjb250ZW50OjpOYXZpZ2F0aW9uU2ltdWxhdG9yOjpOYXZpZ2F0ZUFuZENvbW1pdEZyb21Eb2N1bWVudCgKICAgICAgIEdVUkwoa0RlZmF1bHRUZXN0VXJsMiksIHN1YmZyYW1lMik7Ci0gIGNvbnRlbnQ6OlJlbmRlckZyYW1lSG9zdFRlc3Rlciogc3ViZnJhbWUyX3Rlc3RlciA9Ci0gICAgICBjb250ZW50OjpSZW5kZXJGcmFtZUhvc3RUZXN0ZXI6OkZvcihzdWJmcmFtZTIpOwogICBTaW11bGF0ZVRpbWluZ1VwZGF0ZVdpdGhvdXRGaXJpbmdEaXNwYXRjaFRpbWVyKHN1YmZyYW1lX3RpbWluZywgc3ViZnJhbWUyKTsKLSAgc3ViZnJhbWUyX3Rlc3Rlci0+U2ltdWxhdGVOYXZpZ2F0aW9uU3RvcCgpOwogCiAgIGJhc2U6OlRpbWVEZWx0YSB1cGRhdGVkX2ZpcnN0X3BhaW50ID0KICAgICAgIHVwZGF0ZWRfdGltaW5ncygpLmJhY2soKS0+cGFpbnRfdGltaW5nLT5maXJzdF9wYWludC52YWx1ZSgpOwpkaWZmIC0tZ2l0IGEvY29tcG9uZW50cy9wYWdlX2xvYWRfbWV0cmljcy9icm93c2VyL29ic2VydmVycy91c2VfY291bnRlci91a21fZmVhdHVyZXMuY2MgYi9jb21wb25lbnRzL3BhZ2VfbG9hZF9tZXRyaWNzL2Jyb3dzZXIvb2JzZXJ2ZXJzL3VzZV9jb3VudGVyL3VrbV9mZWF0dXJlcy5jYwppbmRleCBiZmU2MDhlLi45Yjk3MzVlYiAxMDA2NDQKLS0tIGEvY29tcG9uZW50cy9wYWdlX2xvYWRfbWV0cmljcy9icm93c2VyL29ic2VydmVycy91c2VfY291bnRlci91a21fZmVhdHVyZXMuY2MKKysrIGIvY29tcG9uZW50cy9wYWdlX2xvYWRfbWV0cmljcy9icm93c2VyL29ic2VydmVycy91c2VfY291bnRlci91a21fZmVhdHVyZXMuY2MKQEAgLTEzNyw2ICsxMzcsOCBAQAogICAgICAgICAgIFdlYkZlYXR1cmU6OmtUaGlyZFBhcnR5U2hhcmVkV29ya2VyLAogICAgICAgICAgIFdlYkZlYXR1cmU6OmtUaGlyZFBhcnR5QnJvYWRjYXN0Q2hhbm5lbCwKICAgICAgICAgICBXZWJGZWF0dXJlOjprSGVhdnlBZEludGVydmVudGlvbiwKKyAgICAgICAgICBXZWJGZWF0dXJlOjprR2V0R2FtZXBhZHNGcm9tQ3Jvc3NPcmlnaW5TdWJmcmFtZSwKKyAgICAgICAgICBXZWJGZWF0dXJlOjprR2V0R2FtZXBhZHNGcm9tSW5zZWN1cmVDb250ZXh0LAogICAgICAgfSkpOwogICByZXR1cm4gKm9wdF9pbl9mZWF0dXJlczsKIH0KZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvcGVyZm9ybWFuY2VfbWFuYWdlci9CVUlMRC5nbiBiL2NvbXBvbmVudHMvcGVyZm9ybWFuY2VfbWFuYWdlci9CVUlMRC5nbgppbmRleCA3N2I5ZmEyLi5iY2ZiMTc0IDEwMDY0NAotLS0gYS9jb21wb25lbnRzL3BlcmZvcm1hbmNlX21hbmFnZXIvQlVJTEQuZ24KKysrIGIvY29tcG9uZW50cy9wZXJmb3JtYW5jZV9tYW5hZ2VyL0JVSUxELmduCkBAIC03NCw5ICs3NCw5IEBACiAgIHB1YmxpY19kZXBzID0gWwogICAgICIvL2Jhc2UiLAogICAgICIvL2Jhc2UvYWxsb2NhdG9yOmJ1aWxkZmxhZ3MiLAorICAgICIvL2NvbXBvbmVudHMvcGVyZm9ybWFuY2VfbWFuYWdlci9wdWJsaWMvbW9qb20iLAogICAgICIvL2NvbnRlbnQvcHVibGljL2Jyb3dzZXIiLAogICAgICIvL3NlcnZpY2VzL21ldHJpY3MvcHVibGljL2NwcDptZXRyaWNzX2NwcCIsCi0gICAgIi8vc2VydmljZXMvcmVzb3VyY2VfY29vcmRpbmF0b3IvcHVibGljL21vam9tIiwKICAgICAiLy91cmwiLAogICBdCiB9CmRpZmYgLS1naXQgYS9jb21wb25lbnRzL3BlcmZvcm1hbmNlX21hbmFnZXIvREVQUyBiL2NvbXBvbmVudHMvcGVyZm9ybWFuY2VfbWFuYWdlci9ERVBTCmluZGV4IDJkYTM4MDkuLmVmOTAxMDYyIDEwMDY0NAotLS0gYS9jb21wb25lbnRzL3BlcmZvcm1hbmNlX21hbmFnZXIvREVQUworKysgYi9jb21wb25lbnRzL3BlcmZvcm1hbmNlX21hbmFnZXIvREVQUwpAQCAtNCw1ICs0LDQgQEAKICAgIitjb250ZW50L3B1YmxpYy90ZXN0IiwKICAgIittb2pvL3B1YmxpYyIsCiAgICIrc2VydmljZXMvbWV0cmljcy9wdWJsaWMvY3BwIiwKLSAgIitzZXJ2aWNlcy9yZXNvdXJjZV9jb29yZGluYXRvci9wdWJsaWMiLAogXQpkaWZmIC0tZ2l0IGEvY29tcG9uZW50cy9wZXJmb3JtYW5jZV9tYW5hZ2VyL2dyYXBoL2ZyYW1lX25vZGVfaW1wbC5jYyBiL2NvbXBvbmVudHMvcGVyZm9ybWFuY2VfbWFuYWdlci9ncmFwaC9mcmFtZV9ub2RlX2ltcGwuY2MKaW5kZXggMzAzNTU2ZS4uOGI2ODg0MGMgMTAwNjQ0Ci0tLSBhL2NvbXBvbmVudHMvcGVyZm9ybWFuY2VfbWFuYWdlci9ncmFwaC9mcmFtZV9ub2RlX2ltcGwuY2MKKysrIGIvY29tcG9uZW50cy9wZXJmb3JtYW5jZV9tYW5hZ2VyL2dyYXBoL2ZyYW1lX25vZGVfaW1wbC5jYwpAQCAtNDUsOCArNDUsNyBAQAogfQogCiB2b2lkIEZyYW1lTm9kZUltcGw6OkJpbmQoCi0gICAgbW9qbzo6UGVuZGluZ1JlY2VpdmVyPHJlc291cmNlX2Nvb3JkaW5hdG9yOjptb2pvbTo6RG9jdW1lbnRDb29yZGluYXRpb25Vbml0PgotICAgICAgICByZWNlaXZlcikgeworICAgIG1vam86OlBlbmRpbmdSZWNlaXZlcjxtb2pvbTo6RG9jdW1lbnRDb29yZGluYXRpb25Vbml0PiByZWNlaXZlcikgewogICAvLyBJdCBpcyBwb3NzaWJsZSB0byByZWNlaXZlIGEgbW9qbzo6UGVuZGluZ1JlY2VpdmVyPERvY3VtZW50Q29vcmRpbmF0aW9uVW5pdD4KICAgLy8gd2hlbiB8cmVjZWl2ZXJffCBpcyBhbHJlYWR5IGJvdW5kIGluIHRoZXNlIGNhc2VzOgogICAvLyAtIE5hdmlnYXRpb24gZnJvbSB0aGUgaW5pdGlhbCBlbXB0eSBkb2N1bWVudCB0byB0aGUgZmlyc3QgcmVhbCBkb2N1bWVudC4KQEAgLTYxLDggKzYwLDcgQEAKICAgZG9jdW1lbnRfLm5ldHdvcmtfYWxtb3N0X2lkbGUuU2V0QW5kTWF5YmVOb3RpZnkodGhpcywgdHJ1ZSk7CiB9CiAKLXZvaWQgRnJhbWVOb2RlSW1wbDo6U2V0TGlmZWN5Y2xlU3RhdGUoCi0gICAgcmVzb3VyY2VfY29vcmRpbmF0b3I6Om1vam9tOjpMaWZlY3ljbGVTdGF0ZSBzdGF0ZSkgewordm9pZCBGcmFtZU5vZGVJbXBsOjpTZXRMaWZlY3ljbGVTdGF0ZShtb2pvbTo6TGlmZWN5Y2xlU3RhdGUgc3RhdGUpIHsKICAgRENIRUNLX0NBTExFRF9PTl9WQUxJRF9TRVFVRU5DRShzZXF1ZW5jZV9jaGVja2VyXyk7CiAgIGxpZmVjeWNsZV9zdGF0ZV8uU2V0QW5kTWF5YmVOb3RpZnkodGhpcywgc3RhdGUpOwogfQpAQCAtNzMsNyArNzEsNyBAQAogfQogCiB2b2lkIEZyYW1lTm9kZUltcGw6OlNldE9yaWdpblRyaWFsRnJlZXplUG9saWN5KAotICAgIHJlc291cmNlX2Nvb3JkaW5hdG9yOjptb2pvbTo6SW50ZXJ2ZW50aW9uUG9saWN5IHBvbGljeSkgeworICAgIG1vam9tOjpJbnRlcnZlbnRpb25Qb2xpY3kgcG9saWN5KSB7CiAgIGRvY3VtZW50Xy5vcmlnaW5fdHJpYWxfZnJlZXplX3BvbGljeS5TZXRBbmRNYXliZU5vdGlmeSh0aGlzLCBwb2xpY3kpOwogfQogCkBAIC0xMzAsMTQgKzEyOCwxMiBAQAogICByZXR1cm4gY2hpbGRfZnJhbWVfbm9kZXNfOwogfQogCi1yZXNvdXJjZV9jb29yZGluYXRvcjo6bW9qb206OkxpZmVjeWNsZVN0YXRlIEZyYW1lTm9kZUltcGw6OmxpZmVjeWNsZV9zdGF0ZSgpCi0gICAgY29uc3QgeworbW9qb206OkxpZmVjeWNsZVN0YXRlIEZyYW1lTm9kZUltcGw6OmxpZmVjeWNsZV9zdGF0ZSgpIGNvbnN0IHsKICAgRENIRUNLX0NBTExFRF9PTl9WQUxJRF9TRVFVRU5DRShzZXF1ZW5jZV9jaGVja2VyXyk7CiAgIHJldHVybiBsaWZlY3ljbGVfc3RhdGVfLnZhbHVlKCk7CiB9CiAKLXJlc291cmNlX2Nvb3JkaW5hdG9yOjptb2pvbTo6SW50ZXJ2ZW50aW9uUG9saWN5Ci1GcmFtZU5vZGVJbXBsOjpvcmlnaW5fdHJpYWxfZnJlZXplX3BvbGljeSgpIGNvbnN0IHsKK21vam9tOjpJbnRlcnZlbnRpb25Qb2xpY3kgRnJhbWVOb2RlSW1wbDo6b3JpZ2luX3RyaWFsX2ZyZWV6ZV9wb2xpY3koKSBjb25zdCB7CiAgIERDSEVDS19DQUxMRURfT05fVkFMSURfU0VRVUVOQ0Uoc2VxdWVuY2VfY2hlY2tlcl8pOwogICByZXR1cm4gZG9jdW1lbnRfLm9yaWdpbl90cmlhbF9mcmVlemVfcG9saWN5LnZhbHVlKCk7CiB9CkBAIC00ODEsNyArNDc3LDcgQEAKICAgLy8gTmV0d29yayBpcyBidXN5IG9uIG5hdmlnYXRpb24uCiAgIG5ldHdvcmtfYWxtb3N0X2lkbGUuU2V0QW5kTWF5YmVOb3RpZnkoZnJhbWVfbm9kZSwgZmFsc2UpOwogICBvcmlnaW5fdHJpYWxfZnJlZXplX3BvbGljeS5TZXRBbmRNYXliZU5vdGlmeSgKLSAgICAgIGZyYW1lX25vZGUsIHJlc291cmNlX2Nvb3JkaW5hdG9yOjptb2pvbTo6SW50ZXJ2ZW50aW9uUG9saWN5OjprVW5rbm93bik7CisgICAgICBmcmFtZV9ub2RlLCBtb2pvbTo6SW50ZXJ2ZW50aW9uUG9saWN5OjprVW5rbm93bik7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBwZXJmb3JtYW5jZV9tYW5hZ2VyCmRpZmYgLS1naXQgYS9jb21wb25lbnRzL3BlcmZvcm1hbmNlX21hbmFnZXIvZ3JhcGgvZnJhbWVfbm9kZV9pbXBsLmggYi9jb21wb25lbnRzL3BlcmZvcm1hbmNlX21hbmFnZXIvZ3JhcGgvZnJhbWVfbm9kZV9pbXBsLmgKaW5kZXggYzRlYTFjMC4uNThiYmUxY2EgMTAwNjQ0Ci0tLSBhL2NvbXBvbmVudHMvcGVyZm9ybWFuY2VfbWFuYWdlci9ncmFwaC9mcmFtZV9ub2RlX2ltcGwuaAorKysgYi9jb21wb25lbnRzL3BlcmZvcm1hbmNlX21hbmFnZXIvZ3JhcGgvZnJhbWVfbm9kZV9pbXBsLmgKQEAgLTQ4LDcgKzQ4LDcgQEAKIGNsYXNzIEZyYW1lTm9kZUltcGwKICAgICA6IHB1YmxpYyBQdWJsaWNOb2RlSW1wbDxGcmFtZU5vZGVJbXBsLCBGcmFtZU5vZGU+LAogICAgICAgcHVibGljIFR5cGVkTm9kZUJhc2U8RnJhbWVOb2RlSW1wbCwgRnJhbWVOb2RlLCBGcmFtZU5vZGVPYnNlcnZlcj4sCi0gICAgICBwdWJsaWMgcmVzb3VyY2VfY29vcmRpbmF0b3I6Om1vam9tOjpEb2N1bWVudENvb3JkaW5hdGlvblVuaXQgeworICAgICAgcHVibGljIG1vam9tOjpEb2N1bWVudENvb3JkaW5hdGlvblVuaXQgewogIHB1YmxpYzoKICAgc3RhdGljIGNvbnN0ZXhwciBOb2RlVHlwZUVudW0gVHlwZSgpIHsgcmV0dXJuIE5vZGVUeXBlRW51bTo6a0ZyYW1lOyB9CiAKQEAgLTY3LDE1ICs2NywxMyBAQAogICAgICAgICAgICAgICAgIGludDMyX3Qgc2l0ZV9pbnN0YW5jZV9pZCk7CiAgIH5GcmFtZU5vZGVJbXBsKCkgb3ZlcnJpZGU7CiAKLSAgdm9pZCBCaW5kKG1vam86OlBlbmRpbmdSZWNlaXZlcjwKLSAgICAgICAgICAgIHJlc291cmNlX2Nvb3JkaW5hdG9yOjptb2pvbTo6RG9jdW1lbnRDb29yZGluYXRpb25Vbml0PiByZWNlaXZlcik7CisgIHZvaWQgQmluZChtb2pvOjpQZW5kaW5nUmVjZWl2ZXI8bW9qb206OkRvY3VtZW50Q29vcmRpbmF0aW9uVW5pdD4gcmVjZWl2ZXIpOwogCi0gIC8vIHJlc291cmNlX2Nvb3JkaW5hdG9yOjptb2pvbTo6RG9jdW1lbnRDb29yZGluYXRpb25Vbml0IGltcGxlbWVudGF0aW9uLgorICAvLyBtb2pvbTo6RG9jdW1lbnRDb29yZGluYXRpb25Vbml0IGltcGxlbWVudGF0aW9uLgogICB2b2lkIFNldE5ldHdvcmtBbG1vc3RJZGxlKCkgb3ZlcnJpZGU7CiAgIHZvaWQgU2V0TGlmZWN5Y2xlU3RhdGUoTGlmZWN5Y2xlU3RhdGUgc3RhdGUpIG92ZXJyaWRlOwogICB2b2lkIFNldEhhc05vbkVtcHR5QmVmb3JlVW5sb2FkKGJvb2wgaGFzX25vbmVtcHR5X2JlZm9yZXVubG9hZCkgb3ZlcnJpZGU7Ci0gIHZvaWQgU2V0T3JpZ2luVHJpYWxGcmVlemVQb2xpY3koCi0gICAgICByZXNvdXJjZV9jb29yZGluYXRvcjo6bW9qb206OkludGVydmVudGlvblBvbGljeSBwb2xpY3kpIG92ZXJyaWRlOworICB2b2lkIFNldE9yaWdpblRyaWFsRnJlZXplUG9saWN5KG1vam9tOjpJbnRlcnZlbnRpb25Qb2xpY3kgcG9saWN5KSBvdmVycmlkZTsKICAgdm9pZCBTZXRJc0FkRnJhbWUoKSBvdmVycmlkZTsKICAgdm9pZCBPbk5vblBlcnNpc3RlbnROb3RpZmljYXRpb25DcmVhdGVkKCkgb3ZlcnJpZGU7CiAKQEAgLTE3MCwxMCArMTY4LDkgQEAKIAogICAgIC8vIE9wdC1pbiBvciBvcHQtb3V0IG9mIGZyZWV6aW5nIHZpYSBvcmlnaW4gdHJpYWwuCiAgICAgT2JzZXJ2ZWRQcm9wZXJ0eTo6Tm90aWZpZXNPbmx5T25DaGFuZ2VzV2l0aFByZXZpb3VzVmFsdWU8Ci0gICAgICAgIHJlc291cmNlX2Nvb3JkaW5hdG9yOjptb2pvbTo6SW50ZXJ2ZW50aW9uUG9saWN5LAorICAgICAgICBtb2pvbTo6SW50ZXJ2ZW50aW9uUG9saWN5LAogICAgICAgICAmRnJhbWVOb2RlT2JzZXJ2ZXI6Ok9uT3JpZ2luVHJpYWxGcmVlemVQb2xpY3lDaGFuZ2VkPgotICAgICAgICBvcmlnaW5fdHJpYWxfZnJlZXplX3BvbGljeXsKLSAgICAgICAgICAgIHJlc291cmNlX2Nvb3JkaW5hdG9yOjptb2pvbTo6SW50ZXJ2ZW50aW9uUG9saWN5OjprVW5rbm93bn07CisgICAgICAgIG9yaWdpbl90cmlhbF9mcmVlemVfcG9saWN5e21vam9tOjpJbnRlcnZlbnRpb25Qb2xpY3k6OmtVbmtub3dufTsKICAgfTsKIAogICAvLyBJbnZva2VkIGJ5IHN1YmZyYW1lcyBvbiBqb2luaW5nL2xlYXZpbmcgdGhlIGdyYXBoLgpAQCAtMTg2LDggKzE4Myw3IEBACiAgIGJvb2wgSGFzRnJhbWVOb2RlSW5BbmNlc3RvcnMoRnJhbWVOb2RlSW1wbCogZnJhbWVfbm9kZSkgY29uc3Q7CiAgIGJvb2wgSGFzRnJhbWVOb2RlSW5EZXNjZW5kYW50cyhGcmFtZU5vZGVJbXBsKiBmcmFtZV9ub2RlKSBjb25zdDsKIAotICBtb2pvOjpSZWNlaXZlcjxyZXNvdXJjZV9jb29yZGluYXRvcjo6bW9qb206OkRvY3VtZW50Q29vcmRpbmF0aW9uVW5pdD4KLSAgICAgIHJlY2VpdmVyX3t0aGlzfTsKKyAgbW9qbzo6UmVjZWl2ZXI8bW9qb206OkRvY3VtZW50Q29vcmRpbmF0aW9uVW5pdD4gcmVjZWl2ZXJfe3RoaXN9OwogCiAgIEZyYW1lTm9kZUltcGwqIGNvbnN0IHBhcmVudF9mcmFtZV9ub2RlXzsKICAgUGFnZU5vZGVJbXBsKiBjb25zdCBwYWdlX25vZGVfOwpkaWZmIC0tZ2l0IGEvY29tcG9uZW50cy9wZXJmb3JtYW5jZV9tYW5hZ2VyL2dyYXBoL2ZyYW1lX25vZGVfaW1wbF91bml0dGVzdC5jYyBiL2NvbXBvbmVudHMvcGVyZm9ybWFuY2VfbWFuYWdlci9ncmFwaC9mcmFtZV9ub2RlX2ltcGxfdW5pdHRlc3QuY2MKaW5kZXggZTdmM2E5OC4uNzBhZTgyOGM3IDEwMDY0NAotLS0gYS9jb21wb25lbnRzL3BlcmZvcm1hbmNlX21hbmFnZXIvZ3JhcGgvZnJhbWVfbm9kZV9pbXBsX3VuaXR0ZXN0LmNjCisrKyBiL2NvbXBvbmVudHMvcGVyZm9ybWFuY2VfbWFuYWdlci9ncmFwaC9mcmFtZV9ub2RlX2ltcGxfdW5pdHRlc3QuY2MKQEAgLTEyOCw4ICsxMjgsNyBAQAogICBNT0NLX01FVEhPRDEoT25OZXR3b3JrQWxtb3N0SWRsZUNoYW5nZWQsIHZvaWQoY29uc3QgRnJhbWVOb2RlKikpOwogICBNT0NLX01FVEhPRDEoT25GcmFtZUxpZmVjeWNsZVN0YXRlQ2hhbmdlZCwgdm9pZChjb25zdCBGcmFtZU5vZGUqKSk7CiAgIE1PQ0tfTUVUSE9EMihPbk9yaWdpblRyaWFsRnJlZXplUG9saWN5Q2hhbmdlZCwKLSAgICAgICAgICAgICAgIHZvaWQoY29uc3QgRnJhbWVOb2RlKiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb3VyY2VfY29vcmRpbmF0b3I6Om1vam9tOjpJbnRlcnZlbnRpb25Qb2xpY3kmKSk7CisgICAgICAgICAgICAgICB2b2lkKGNvbnN0IEZyYW1lTm9kZSosIGNvbnN0IG1vam9tOjpJbnRlcnZlbnRpb25Qb2xpY3kmKSk7CiAgIE1PQ0tfTUVUSE9EMihPblVSTENoYW5nZWQsIHZvaWQoY29uc3QgRnJhbWVOb2RlKiwgY29uc3QgR1VSTCYpKTsKICAgTU9DS19NRVRIT0QxKE9uSXNBZEZyYW1lQ2hhbmdlZCwgdm9pZChjb25zdCBGcmFtZU5vZGUqKSk7CiAgIE1PQ0tfTUVUSE9EMShPbkZyYW1lSXNIb2xkaW5nV2ViTG9ja0NoYW5nZWQsIHZvaWQoY29uc3QgRnJhbWVOb2RlKikpOwpAQCAtMTg0LDggKzE4Myw3IEBACiAgIC8vIEludm9rZSAiU2V0TGlmZWN5Y2xlU3RhdGUiIGFuZCBleHBlY3QgYW4gIk9uRnJhbWVMaWZlY3ljbGVTdGF0ZUNoYW5nZWQiCiAgIC8vIGNhbGxiYWNrLgogICBFWFBFQ1RfQ0FMTChvYnMsIE9uRnJhbWVMaWZlY3ljbGVTdGF0ZUNoYW5nZWQocmF3X2ZyYW1lX25vZGUpKTsKLSAgZnJhbWVfbm9kZS0+U2V0TGlmZWN5Y2xlU3RhdGUoCi0gICAgICByZXNvdXJjZV9jb29yZGluYXRvcjo6bW9qb206OkxpZmVjeWNsZVN0YXRlOjprRnJvemVuKTsKKyAgZnJhbWVfbm9kZS0+U2V0TGlmZWN5Y2xlU3RhdGUobW9qb206OkxpZmVjeWNsZVN0YXRlOjprRnJvemVuKTsKICAgdGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXIoJm9icyk7CiAKICAgLy8gSW52b2tlICJPbk5vblBlcnNpc3RlbnROb3RpZmljYXRpb25DcmVhdGVkIiBhbmQgZXhwZWN0IGFuCmRpZmYgLS1naXQgYS9jb21wb25lbnRzL3BlcmZvcm1hbmNlX21hbmFnZXIvZ3JhcGgvbm9kZV9iYXNlLmggYi9jb21wb25lbnRzL3BlcmZvcm1hbmNlX21hbmFnZXIvZ3JhcGgvbm9kZV9iYXNlLmgKaW5kZXggNTYyOTI2YmYuLmM4ZTM2ZmNhIDEwMDY0NAotLS0gYS9jb21wb25lbnRzL3BlcmZvcm1hbmNlX21hbmFnZXIvZ3JhcGgvbm9kZV9iYXNlLmgKKysrIGIvY29tcG9uZW50cy9wZXJmb3JtYW5jZV9tYW5hZ2VyL2dyYXBoL25vZGVfYmFzZS5oCkBAIC0xOSw3ICsxOSw2IEBACiAjaW5jbHVkZSAibW9qby9wdWJsaWMvY3BwL2JpbmRpbmdzL2JpbmRpbmcuaCIKICNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvYmluZGluZ3MvaW50ZXJmYWNlX3JlcXVlc3QuaCIKICNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvYmluZGluZ3Mvc3Ryb25nX2JpbmRpbmcuaCIKLSNpbmNsdWRlICJzZXJ2aWNlcy9yZXNvdXJjZV9jb29yZGluYXRvci9wdWJsaWMvbW9qb20vY29vcmRpbmF0aW9uX3VuaXQubW9qb20uaCIKIAogbmFtZXNwYWNlIHBlcmZvcm1hbmNlX21hbmFnZXIgewogCmRpZmYgLS1naXQgYS9jb21wb25lbnRzL3BlcmZvcm1hbmNlX21hbmFnZXIvZ3JhcGgvbm9kZV9iYXNlX3VuaXR0ZXN0LmNjIGIvY29tcG9uZW50cy9wZXJmb3JtYW5jZV9tYW5hZ2VyL2dyYXBoL25vZGVfYmFzZV91bml0dGVzdC5jYwppbmRleCA0ZTM5YjZjLi4wMTE4YzJjIDEwMDY0NAotLS0gYS9jb21wb25lbnRzL3BlcmZvcm1hbmNlX21hbmFnZXIvZ3JhcGgvbm9kZV9iYXNlX3VuaXR0ZXN0LmNjCisrKyBiL2NvbXBvbmVudHMvcGVyZm9ybWFuY2VfbWFuYWdlci9ncmFwaC9ub2RlX2Jhc2VfdW5pdHRlc3QuY2MKQEAgLTgsNyArOCw2IEBACiAjaW5jbHVkZSAiY29tcG9uZW50cy9wZXJmb3JtYW5jZV9tYW5hZ2VyL2dyYXBoL3Byb2Nlc3Nfbm9kZV9pbXBsLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9wZXJmb3JtYW5jZV9tYW5hZ2VyL3Rlc3Rfc3VwcG9ydC9ncmFwaF90ZXN0X2hhcm5lc3MuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL3BlcmZvcm1hbmNlX21hbmFnZXIvdGVzdF9zdXBwb3J0L21vY2tfZ3JhcGhzLmgiCi0jaW5jbHVkZSAic2VydmljZXMvcmVzb3VyY2VfY29vcmRpbmF0b3IvcHVibGljL21vam9tL2Nvb3JkaW5hdGlvbl91bml0Lm1vam9tLmgiCiAjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCiAKIG5hbWVzcGFjZSBwZXJmb3JtYW5jZV9tYW5hZ2VyIHsKZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvcGVyZm9ybWFuY2VfbWFuYWdlci9ncmFwaC9wcm9jZXNzX25vZGVfaW1wbC5jYyBiL2NvbXBvbmVudHMvcGVyZm9ybWFuY2VfbWFuYWdlci9ncmFwaC9wcm9jZXNzX25vZGVfaW1wbC5jYwppbmRleCAxZDQ3ZWQ2Li4yODYyZTAwIDEwMDY0NAotLS0gYS9jb21wb25lbnRzL3BlcmZvcm1hbmNlX21hbmFnZXIvZ3JhcGgvcHJvY2Vzc19ub2RlX2ltcGwuY2MKKysrIGIvY29tcG9uZW50cy9wZXJmb3JtYW5jZV9tYW5hZ2VyL2dyYXBoL3Byb2Nlc3Nfbm9kZV9pbXBsLmNjCkBAIC0yOSw4ICsyOSw3IEBACiB9CiAKIHZvaWQgUHJvY2Vzc05vZGVJbXBsOjpCaW5kKAotICAgIG1vam86OlBlbmRpbmdSZWNlaXZlcjxyZXNvdXJjZV9jb29yZGluYXRvcjo6bW9qb206OlByb2Nlc3NDb29yZGluYXRpb25Vbml0PgotICAgICAgICByZWNlaXZlcikgeworICAgIG1vam86OlBlbmRpbmdSZWNlaXZlcjxtb2pvbTo6UHJvY2Vzc0Nvb3JkaW5hdGlvblVuaXQ+IHJlY2VpdmVyKSB7CiAgIC8vIEEgUmVuZGVyUHJvY2Vzc0hvc3QgY2FuIGJlIHJldXNlZCBpZiB0aGUgYmFja2luZyBwcm9jZXNzIHN1ZGRlbmx5IGRpZXMsIGluCiAgIC8vIHdoaWNoIGNhc2Ugd2Ugd2lsbCByZWNlaXZlIGEgbmV3IHJlY2VpdmVyIGZyb20gdGhlIG5ld2x5IHNwYXduZWQgcHJvY2Vzcy4KICAgcmVjZWl2ZXJfLnJlc2V0KCk7CmRpZmYgLS1naXQgYS9jb21wb25lbnRzL3BlcmZvcm1hbmNlX21hbmFnZXIvZ3JhcGgvcHJvY2Vzc19ub2RlX2ltcGwuaCBiL2NvbXBvbmVudHMvcGVyZm9ybWFuY2VfbWFuYWdlci9ncmFwaC9wcm9jZXNzX25vZGVfaW1wbC5oCmluZGV4IDQ1MTVhNjQuLmRmNTYwNDEgMTAwNjQ0Ci0tLSBhL2NvbXBvbmVudHMvcGVyZm9ybWFuY2VfbWFuYWdlci9ncmFwaC9wcm9jZXNzX25vZGVfaW1wbC5oCisrKyBiL2NvbXBvbmVudHMvcGVyZm9ybWFuY2VfbWFuYWdlci9ncmFwaC9wcm9jZXNzX25vZGVfaW1wbC5oCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSAiY29tcG9uZW50cy9wZXJmb3JtYW5jZV9tYW5hZ2VyL2dyYXBoL25vZGVfYmFzZS5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvcGVyZm9ybWFuY2VfbWFuYWdlci9ncmFwaC9wcm9wZXJ0aWVzLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9wZXJmb3JtYW5jZV9tYW5hZ2VyL3B1YmxpYy9ncmFwaC9wcm9jZXNzX25vZGUuaCIKKyNpbmNsdWRlICJjb21wb25lbnRzL3BlcmZvcm1hbmNlX21hbmFnZXIvcHVibGljL21vam9tL2Nvb3JkaW5hdGlvbl91bml0Lm1vam9tLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9wZXJmb3JtYW5jZV9tYW5hZ2VyL3B1YmxpYy9yZW5kZXJfcHJvY2Vzc19ob3N0X3Byb3h5LmgiCiAjaW5jbHVkZSAibW9qby9wdWJsaWMvY3BwL2JpbmRpbmdzL3BlbmRpbmdfcmVjZWl2ZXIuaCIKICNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvYmluZGluZ3MvcmVjZWl2ZXIuaCIKQEAgLTM4LDcgKzM5LDcgQEAKIGNsYXNzIFByb2Nlc3NOb2RlSW1wbAogICAgIDogcHVibGljIFB1YmxpY05vZGVJbXBsPFByb2Nlc3NOb2RlSW1wbCwgUHJvY2Vzc05vZGU+LAogICAgICAgcHVibGljIFR5cGVkTm9kZUJhc2U8UHJvY2Vzc05vZGVJbXBsLCBQcm9jZXNzTm9kZSwgUHJvY2Vzc05vZGVPYnNlcnZlcj4sCi0gICAgICBwdWJsaWMgcmVzb3VyY2VfY29vcmRpbmF0b3I6Om1vam9tOjpQcm9jZXNzQ29vcmRpbmF0aW9uVW5pdCB7CisgICAgICBwdWJsaWMgbW9qb206OlByb2Nlc3NDb29yZGluYXRpb25Vbml0IHsKICBwdWJsaWM6CiAgIHN0YXRpYyBjb25zdGV4cHIgTm9kZVR5cGVFbnVtIFR5cGUoKSB7IHJldHVybiBOb2RlVHlwZUVudW06OmtQcm9jZXNzOyB9CiAKQEAgLTQ2LDEwICs0Nyw5IEBACiAKICAgflByb2Nlc3NOb2RlSW1wbCgpIG92ZXJyaWRlOwogCi0gIHZvaWQgQmluZChtb2pvOjpQZW5kaW5nUmVjZWl2ZXI8Ci0gICAgICAgICAgICByZXNvdXJjZV9jb29yZGluYXRvcjo6bW9qb206OlByb2Nlc3NDb29yZGluYXRpb25Vbml0PiByZWNlaXZlcik7CisgIHZvaWQgQmluZChtb2pvOjpQZW5kaW5nUmVjZWl2ZXI8bW9qb206OlByb2Nlc3NDb29yZGluYXRpb25Vbml0PiByZWNlaXZlcik7CiAKLSAgLy8gcmVzb3VyY2VfY29vcmRpbmF0b3I6Om1vam9tOjpQcm9jZXNzQ29vcmRpbmF0aW9uVW5pdCBpbXBsZW1lbnRhdGlvbjoKKyAgLy8gbW9qb206OlByb2Nlc3NDb29yZGluYXRpb25Vbml0IGltcGxlbWVudGF0aW9uOgogICB2b2lkIFNldEV4cGVjdGVkVGFza1F1ZXVlaW5nRHVyYXRpb24oYmFzZTo6VGltZURlbHRhIGR1cmF0aW9uKSBvdmVycmlkZTsKICAgdm9pZCBTZXRNYWluVGhyZWFkVGFza0xvYWRJc0xvdyhib29sIG1haW5fdGhyZWFkX3Rhc2tfbG9hZF9pc19sb3cpIG92ZXJyaWRlOwogCkBAIC0xNDksOCArMTQ5LDcgQEAKIAogICB2b2lkIExlYXZlR3JhcGgoKSBvdmVycmlkZTsKIAotICBtb2pvOjpSZWNlaXZlcjxyZXNvdXJjZV9jb29yZGluYXRvcjo6bW9qb206OlByb2Nlc3NDb29yZGluYXRpb25Vbml0PgotICAgICAgcmVjZWl2ZXJfe3RoaXN9OworICBtb2pvOjpSZWNlaXZlcjxtb2pvbTo6UHJvY2Vzc0Nvb3JkaW5hdGlvblVuaXQ+IHJlY2VpdmVyX3t0aGlzfTsKIAogICBiYXNlOjpUaW1lRGVsdGEgY3VtdWxhdGl2ZV9jcHVfdXNhZ2VfOwogICB1aW50NjRfdCBwcml2YXRlX2Zvb3RwcmludF9rYl8gPSAwdTsKZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvcGVyZm9ybWFuY2VfbWFuYWdlci9wZXJmb3JtYW5jZV9tYW5hZ2VyX3RhYl9oZWxwZXIuY2MgYi9jb21wb25lbnRzL3BlcmZvcm1hbmNlX21hbmFnZXIvcGVyZm9ybWFuY2VfbWFuYWdlcl90YWJfaGVscGVyLmNjCmluZGV4IDE2ZGY0NTQuLmVhMmU0YTIgMTAwNjQ0Ci0tLSBhL2NvbXBvbmVudHMvcGVyZm9ybWFuY2VfbWFuYWdlci9wZXJmb3JtYW5jZV9tYW5hZ2VyX3RhYl9oZWxwZXIuY2MKKysrIGIvY29tcG9uZW50cy9wZXJmb3JtYW5jZV9tYW5hZ2VyL3BlcmZvcm1hbmNlX21hbmFnZXJfdGFiX2hlbHBlci5jYwpAQCAtMzMxLDggKzMzMSw3IEBACiAgICAgY29udGVudDo6UmVuZGVyRnJhbWVIb3N0KiByZW5kZXJfZnJhbWVfaG9zdCwKICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaW50ZXJmYWNlX25hbWUsCiAgICAgbW9qbzo6U2NvcGVkTWVzc2FnZVBpcGVIYW5kbGUqIGludGVyZmFjZV9waXBlKSB7Ci0gIGlmIChpbnRlcmZhY2VfbmFtZSAhPQotICAgICAgcmVzb3VyY2VfY29vcmRpbmF0b3I6Om1vam9tOjpEb2N1bWVudENvb3JkaW5hdGlvblVuaXQ6Ok5hbWVfKQorICBpZiAoaW50ZXJmYWNlX25hbWUgIT0gbW9qb206OkRvY3VtZW50Q29vcmRpbmF0aW9uVW5pdDo6TmFtZV8pCiAgICAgcmV0dXJuOwogCiAgIC8vIFRPRE8oaHR0cHM6Ly9jcmJ1Zy5jb20vOTg3NDQ1KTogV2h5IGVsc2UgdGhhbiBkdWUgdG8gc3BlY3VsYXRpdmUgcmVuZGVyCkBAIC0zNTUsOCArMzU0LDcgQEAKICAgfQogCiAgIFBvc3RUb0dyYXBoKEZST01fSEVSRSwgJkZyYW1lTm9kZUltcGw6OkJpbmQsIGl0LT5zZWNvbmQuZ2V0KCksCi0gICAgICAgICAgICAgIG1vam86OlBlbmRpbmdSZWNlaXZlcjwKLSAgICAgICAgICAgICAgICAgIHJlc291cmNlX2Nvb3JkaW5hdG9yOjptb2pvbTo6RG9jdW1lbnRDb29yZGluYXRpb25Vbml0PigKKyAgICAgICAgICAgICAgbW9qbzo6UGVuZGluZ1JlY2VpdmVyPG1vam9tOjpEb2N1bWVudENvb3JkaW5hdGlvblVuaXQ+KAogICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKCppbnRlcmZhY2VfcGlwZSkpKTsKIH0KIApkaWZmIC0tZ2l0IGEvY29tcG9uZW50cy9wZXJmb3JtYW5jZV9tYW5hZ2VyL3B1YmxpYy9ncmFwaC9mcmFtZV9ub2RlLmggYi9jb21wb25lbnRzL3BlcmZvcm1hbmNlX21hbmFnZXIvcHVibGljL2dyYXBoL2ZyYW1lX25vZGUuaAppbmRleCAxMTE2ZWMwNy4uMGY3MmI4NyAxMDA2NDQKLS0tIGEvY29tcG9uZW50cy9wZXJmb3JtYW5jZV9tYW5hZ2VyL3B1YmxpYy9ncmFwaC9mcmFtZV9ub2RlLmgKKysrIGIvY29tcG9uZW50cy9wZXJmb3JtYW5jZV9tYW5hZ2VyL3B1YmxpYy9ncmFwaC9mcmFtZV9ub2RlLmgKQEAgLTksOCArOSw4IEBACiAjaW5jbHVkZSAiYmFzZS9tYWNyb3MuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL3BlcmZvcm1hbmNlX21hbmFnZXIvcHVibGljL2ZyYW1lX3ByaW9yaXR5L2ZyYW1lX3ByaW9yaXR5LmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9wZXJmb3JtYW5jZV9tYW5hZ2VyL3B1YmxpYy9ncmFwaC9ub2RlLmgiCi0jaW5jbHVkZSAic2VydmljZXMvcmVzb3VyY2VfY29vcmRpbmF0b3IvcHVibGljL21vam9tL2Nvb3JkaW5hdGlvbl91bml0Lm1vam9tLmgiCi0jaW5jbHVkZSAic2VydmljZXMvcmVzb3VyY2VfY29vcmRpbmF0b3IvcHVibGljL21vam9tL2xpZmVjeWNsZS5tb2pvbS5oIgorI2luY2x1ZGUgImNvbXBvbmVudHMvcGVyZm9ybWFuY2VfbWFuYWdlci9wdWJsaWMvbW9qb20vY29vcmRpbmF0aW9uX3VuaXQubW9qb20uaCIKKyNpbmNsdWRlICJjb21wb25lbnRzL3BlcmZvcm1hbmNlX21hbmFnZXIvcHVibGljL21vam9tL2xpZmVjeWNsZS5tb2pvbS5oIgogCiBjbGFzcyBHVVJMOwogCkBAIC01Miw4ICs1Miw4IEBACiAvLyBpdC4KIGNsYXNzIEZyYW1lTm9kZSA6IHB1YmxpYyBOb2RlIHsKICBwdWJsaWM6Ci0gIHVzaW5nIExpZmVjeWNsZVN0YXRlID0gcmVzb3VyY2VfY29vcmRpbmF0b3I6Om1vam9tOjpMaWZlY3ljbGVTdGF0ZTsKLSAgdXNpbmcgSW50ZXJ2ZW50aW9uUG9saWN5ID0gcmVzb3VyY2VfY29vcmRpbmF0b3I6Om1vam9tOjpJbnRlcnZlbnRpb25Qb2xpY3k7CisgIHVzaW5nIExpZmVjeWNsZVN0YXRlID0gbW9qb206OkxpZmVjeWNsZVN0YXRlOworICB1c2luZyBJbnRlcnZlbnRpb25Qb2xpY3kgPSBtb2pvbTo6SW50ZXJ2ZW50aW9uUG9saWN5OwogICB1c2luZyBPYnNlcnZlciA9IEZyYW1lTm9kZU9ic2VydmVyOwogICB1c2luZyBQcmlvcml0eUFuZFJlYXNvbiA9IGZyYW1lX3ByaW9yaXR5OjpQcmlvcml0eUFuZFJlYXNvbjsKIApAQCAtMTU2LDcgKzE1Niw3IEBACiAvLyBpbXBsZW1lbnQgdGhlIGVudGlyZSBpbnRlcmZhY2UuCiBjbGFzcyBGcmFtZU5vZGVPYnNlcnZlciB7CiAgcHVibGljOgotICB1c2luZyBJbnRlcnZlbnRpb25Qb2xpY3kgPSByZXNvdXJjZV9jb29yZGluYXRvcjo6bW9qb206OkludGVydmVudGlvblBvbGljeTsKKyAgdXNpbmcgSW50ZXJ2ZW50aW9uUG9saWN5ID0gbW9qb206OkludGVydmVudGlvblBvbGljeTsKIAogICBGcmFtZU5vZGVPYnNlcnZlcigpOwogICB2aXJ0dWFsIH5GcmFtZU5vZGVPYnNlcnZlcigpOwpkaWZmIC0tZ2l0IGEvY29tcG9uZW50cy9wZXJmb3JtYW5jZV9tYW5hZ2VyL3B1YmxpYy9ncmFwaC9wYWdlX25vZGUuaCBiL2NvbXBvbmVudHMvcGVyZm9ybWFuY2VfbWFuYWdlci9wdWJsaWMvZ3JhcGgvcGFnZV9ub2RlLmgKaW5kZXggNDFiY2QxZTkuLmZjZjU2ZGQwIDEwMDY0NAotLS0gYS9jb21wb25lbnRzL3BlcmZvcm1hbmNlX21hbmFnZXIvcHVibGljL2dyYXBoL3BhZ2Vfbm9kZS5oCisrKyBiL2NvbXBvbmVudHMvcGVyZm9ybWFuY2VfbWFuYWdlci9wdWJsaWMvZ3JhcGgvcGFnZV9ub2RlLmgKQEAgLTEwLDEwICsxMCwxMCBAQAogI2luY2x1ZGUgImJhc2UvY29udGFpbmVycy9mbGF0X3NldC5oIgogI2luY2x1ZGUgImJhc2UvbWFjcm9zLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9wZXJmb3JtYW5jZV9tYW5hZ2VyL3B1YmxpYy9ncmFwaC9ub2RlLmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9wZXJmb3JtYW5jZV9tYW5hZ2VyL3B1YmxpYy9tb2pvbS9jb29yZGluYXRpb25fdW5pdC5tb2pvbS5oIgorI2luY2x1ZGUgImNvbXBvbmVudHMvcGVyZm9ybWFuY2VfbWFuYWdlci9wdWJsaWMvbW9qb20vbGlmZWN5Y2xlLm1vam9tLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9wZXJmb3JtYW5jZV9tYW5hZ2VyL3B1YmxpYy93ZWJfY29udGVudHNfcHJveHkuaCIKICNpbmNsdWRlICJzZXJ2aWNlcy9tZXRyaWNzL3B1YmxpYy9jcHAvdWttX3NvdXJjZV9pZC5oIgotI2luY2x1ZGUgInNlcnZpY2VzL3Jlc291cmNlX2Nvb3JkaW5hdG9yL3B1YmxpYy9tb2pvbS9jb29yZGluYXRpb25fdW5pdC5tb2pvbS5oIgotI2luY2x1ZGUgInNlcnZpY2VzL3Jlc291cmNlX2Nvb3JkaW5hdG9yL3B1YmxpYy9tb2pvbS9saWZlY3ljbGUubW9qb20uaCIKIAogY2xhc3MgR1VSTDsKIApAQCAtMjcsOCArMjcsOCBAQAogLy8gRXh0ZW5zaW9ucy4KIGNsYXNzIFBhZ2VOb2RlIDogcHVibGljIE5vZGUgewogIHB1YmxpYzoKLSAgdXNpbmcgSW50ZXJ2ZW50aW9uUG9saWN5ID0gcmVzb3VyY2VfY29vcmRpbmF0b3I6Om1vam9tOjpJbnRlcnZlbnRpb25Qb2xpY3k7Ci0gIHVzaW5nIExpZmVjeWNsZVN0YXRlID0gcmVzb3VyY2VfY29vcmRpbmF0b3I6Om1vam9tOjpMaWZlY3ljbGVTdGF0ZTsKKyAgdXNpbmcgSW50ZXJ2ZW50aW9uUG9saWN5ID0gbW9qb206OkludGVydmVudGlvblBvbGljeTsKKyAgdXNpbmcgTGlmZWN5Y2xlU3RhdGUgPSBtb2pvbTo6TGlmZWN5Y2xlU3RhdGU7CiAgIHVzaW5nIE9ic2VydmVyID0gUGFnZU5vZGVPYnNlcnZlcjsKICAgY2xhc3MgT2JzZXJ2ZXJEZWZhdWx0SW1wbDsKIApkaWZmIC0tZ2l0IGEvY29tcG9uZW50cy9wZXJmb3JtYW5jZV9tYW5hZ2VyL3B1YmxpYy9tb2pvbS9CVUlMRC5nbiBiL2NvbXBvbmVudHMvcGVyZm9ybWFuY2VfbWFuYWdlci9wdWJsaWMvbW9qb20vQlVJTEQuZ24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU5OTMyOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBvbmVudHMvcGVyZm9ybWFuY2VfbWFuYWdlci9wdWJsaWMvbW9qb20vQlVJTEQuZ24KQEAgLTAsMCArMSwxOSBAQAorIyBDb3B5cmlnaHQgMjAxOSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorIyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitpbXBvcnQoIi8vbW9qby9wdWJsaWMvdG9vbHMvYmluZGluZ3MvbW9qb20uZ25pIikKKworbW9qb21fY29tcG9uZW50KCJtb2pvbSIpIHsKKyAgb3V0cHV0X3ByZWZpeCA9ICJwZXJmb3JtYWNlX21hbmFnZXJfcHVibGljX21vam9tIgorICBtYWNyb19wcmVmaXggPSAiUEVSRk9STUFOQ0VfTUFOQUdFUl9QVUJMSUNfTU9KT00iCisKKyAgc291cmNlcyA9IFsKKyAgICAiY29vcmRpbmF0aW9uX3VuaXQubW9qb20iLAorICAgICJsaWZlY3ljbGUubW9qb20iLAorICBdCisKKyAgcHVibGljX2RlcHMgPSBbCisgICAgIi8vbW9qby9wdWJsaWMvbW9qb20vYmFzZSIsCisgIF0KK30KZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvcGVyZm9ybWFuY2VfbWFuYWdlci9wdWJsaWMvbW9qb20vT1dORVJTIGIvY29tcG9uZW50cy9wZXJmb3JtYW5jZV9tYW5hZ2VyL3B1YmxpYy9tb2pvbS9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U0YzhkNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBvbmVudHMvcGVyZm9ybWFuY2VfbWFuYWdlci9wdWJsaWMvbW9qb20vT1dORVJTCkBAIC0wLDAgKzEsNSBAQAorZmlsZTovL2NvbXBvbmVudHMvcGVyZm9ybWFuY2VfbWFuYWdlci9PV05FUlMKKworIyBGb3IgSVBDIHNlY3VyaXR5IHJldmlldworcGVyLWZpbGUgKi5tb2pvbT1zZXQgbm9wYXJlbnQKK3Blci1maWxlICoubW9qb209ZmlsZTovL2lwYy9TRUNVUklUWV9PV05FUlMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Jlc291cmNlX2Nvb3JkaW5hdG9yL3B1YmxpYy9tb2pvbS9jb29yZGluYXRpb25fdW5pdC5tb2pvbSBiL2NvbXBvbmVudHMvcGVyZm9ybWFuY2VfbWFuYWdlci9wdWJsaWMvbW9qb20vY29vcmRpbmF0aW9uX3VuaXQubW9qb20Kc2ltaWxhcml0eSBpbmRleCA5NCUKcmVuYW1lIGZyb20gc2VydmljZXMvcmVzb3VyY2VfY29vcmRpbmF0b3IvcHVibGljL21vam9tL2Nvb3JkaW5hdGlvbl91bml0Lm1vam9tCnJlbmFtZSB0byBjb21wb25lbnRzL3BlcmZvcm1hbmNlX21hbmFnZXIvcHVibGljL21vam9tL2Nvb3JkaW5hdGlvbl91bml0Lm1vam9tCmluZGV4IGJkYTY3ZmFiLi5iNTYxMDkxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9yZXNvdXJjZV9jb29yZGluYXRvci9wdWJsaWMvbW9qb20vY29vcmRpbmF0aW9uX3VuaXQubW9qb20KKysrIGIvY29tcG9uZW50cy9wZXJmb3JtYW5jZV9tYW5hZ2VyL3B1YmxpYy9tb2pvbS9jb29yZGluYXRpb25fdW5pdC5tb2pvbQpAQCAtMiwxMSArMiwxMSBAQAogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAotbW9kdWxlIHJlc291cmNlX2Nvb3JkaW5hdG9yLm1vam9tOworbW9kdWxlIHBlcmZvcm1hbmNlX21hbmFnZXIubW9qb207CiAKIGltcG9ydCAibW9qby9wdWJsaWMvbW9qb20vYmFzZS9wcm9jZXNzX2lkLm1vam9tIjsKIGltcG9ydCAibW9qby9wdWJsaWMvbW9qb20vYmFzZS90aW1lLm1vam9tIjsKLWltcG9ydCAic2VydmljZXMvcmVzb3VyY2VfY29vcmRpbmF0b3IvcHVibGljL21vam9tL2xpZmVjeWNsZS5tb2pvbSI7CitpbXBvcnQgImNvbXBvbmVudHMvcGVyZm9ybWFuY2VfbWFuYWdlci9wdWJsaWMvbW9qb20vbGlmZWN5Y2xlLm1vam9tIjsKIAogLy8gQW55IG5ldyB0eXBlIGhlcmUgbmVlZHMgdG8gYmUgbWlycm9yZWQgYmV0d2VlbiBjb29yZGluYXRpb25fdW5pdF90eXBlcy5oIGFuZAogLy8gY29vcmRpbmF0aW9uX3VuaXQubW9qb20sIGFuZCBoYXZlIG1hcHBpbmdzIGJldHdlZW4gdGhlIHR3byBkZWZpbmVkIGluCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9yZXNvdXJjZV9jb29yZGluYXRvci9wdWJsaWMvbW9qb20vbGlmZWN5Y2xlLm1vam9tIGIvY29tcG9uZW50cy9wZXJmb3JtYW5jZV9tYW5hZ2VyL3B1YmxpYy9tb2pvbS9saWZlY3ljbGUubW9qb20Kc2ltaWxhcml0eSBpbmRleCA5MCUKcmVuYW1lIGZyb20gc2VydmljZXMvcmVzb3VyY2VfY29vcmRpbmF0b3IvcHVibGljL21vam9tL2xpZmVjeWNsZS5tb2pvbQpyZW5hbWUgdG8gY29tcG9uZW50cy9wZXJmb3JtYW5jZV9tYW5hZ2VyL3B1YmxpYy9tb2pvbS9saWZlY3ljbGUubW9qb20KaW5kZXggYjc2OTFjYi4uMTJjNjY5NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvcmVzb3VyY2VfY29vcmRpbmF0b3IvcHVibGljL21vam9tL2xpZmVjeWNsZS5tb2pvbQorKysgYi9jb21wb25lbnRzL3BlcmZvcm1hbmNlX21hbmFnZXIvcHVibGljL21vam9tL2xpZmVjeWNsZS5tb2pvbQpAQCAtMiw3ICsyLDcgQEAKIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLW1vZHVsZSByZXNvdXJjZV9jb29yZGluYXRvci5tb2pvbTsKK21vZHVsZSBwZXJmb3JtYW5jZV9tYW5hZ2VyLm1vam9tOwogCiAvLyBBIGxpZmVjeWNsZSB1bml0IChhIHBhZ2UsIGZyYW1lLCB0YWIgb3IgYXBwbGljYXRpb24pIGNhbiBiZSBpbiBvbmUgb2YKIC8vIHRoZXNlIGxpZmVjeWNsZSBzdGF0ZXMuCkBAIC0xMCw0ICsxMCw0IEBACiAgIGtSdW5uaW5nLAogICBrRnJvemVuLAogICBrRGlzY2FyZGVkCi19OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK307CmRpZmYgLS1naXQgYS9jb21wb25lbnRzL3BvbGljeS9yZXNvdXJjZXMvcG9saWN5X3RlbXBsYXRlcy5qc29uIGIvY29tcG9uZW50cy9wb2xpY3kvcmVzb3VyY2VzL3BvbGljeV90ZW1wbGF0ZXMuanNvbgppbmRleCAzZjQ1MjRjLi5hY2EzYzU5IDEwMDY0NAotLS0gYS9jb21wb25lbnRzL3BvbGljeS9yZXNvdXJjZXMvcG9saWN5X3RlbXBsYXRlcy5qc29uCisrKyBiL2NvbXBvbmVudHMvcG9saWN5L3Jlc291cmNlcy9wb2xpY3lfdGVtcGxhdGVzLmpzb24KQEAgLTE4MzE2LDcgKzE4MzE2LDM1IEBACiAgICAgICBJZiB0aGlzIHBvbGljeSBpcyBub3Qgc2V0LCB0aGUgYnJvd3NlciB3aWxsIG9ubHkgYmVnaW4gYXR0ZW1wdHMgdG8gc2F2ZSBtZW1vcnkgb25jZSBpdCBoYXMgZGV0ZWN0ZWQgdGhhdCB0aGUgYW1vdW50IG9mIHBoeXNpY2FsIG1lbW9yeSBvbiBpdHMgbWFjaGluZSBpcyBsb3cuJycnLAogCiAgICAgICAnbGFiZWwnOiAnJydTZXQgbWVtb3J5IGxpbWl0IGZvciBDaHJvbWUgaW5zdGFuY2VzJycnLAotICAgIH0KKyAgICB9LAorICAgIHsKKyAgICAgICMgVE9ETyhodHRwczovL2NyYnVnLmNvbS8xMDEyNDAwKTogUmVtb3ZlIHRoaXMgcG9saWN5IGluIE04Ni4KKyAgICAgICdpZCc6IDYyNiwKKyAgICAgICduYW1lJzogJ1RMUzEzSGFyZGVuaW5nRm9yTG9jYWxBbmNob3JzRW5hYmxlZCcsCisgICAgICAnb3duZXJzJzogWydmaWxlOi8vbmV0L3NzbC9PV05FUlMnXSwKKyAgICAgICd0eXBlJzogJ21haW4nLAorICAgICAgJ3NjaGVtYSc6IHsKKyAgICAgICAgJ3R5cGUnOiAnYm9vbGVhbicsCisgICAgICB9LAorICAgICAgJ2V4YW1wbGVfdmFsdWUnOiBUcnVlLAorICAgICAgJ2ZlYXR1cmVzJzogeworICAgICAgICAnZHluYW1pY19yZWZyZXNoJzogVHJ1ZSwKKyAgICAgICAgJ3Blcl9wcm9maWxlJzogVHJ1ZSwKKyAgICAgIH0sCisgICAgICAnc3VwcG9ydGVkX29uJzogWydjaHJvbWUuKjo3OS0nLCAnY2hyb21lX29zOjc5LScsICdhbmRyb2lkOjc5LSddLAorICAgICAgJ2NhcHRpb24nOiAnJydFbmFibGUgYSBUTFMgMS4zIHNlY3VyaXR5IGZlYXR1cmUgZm9yIGxvY2FsIHRydXN0IGFuY2hvcnMuJycnLAorICAgICAgJ3RhZ3MnOiBbJ3N5c3RlbS1zZWN1cml0eSddLAorICAgICAgJ2Rlc2MnOiAnJydUaGlzIHBvbGljeSBjb250cm9scyBhIHNlY3VyaXR5IGZlYXR1cmUgaW4gVExTIDEuMyB3aGljaCBwcm90ZWN0cyBjb25uZWN0aW9ucyBhZ2FpbnN0IGRvd25ncmFkZSBhdHRhY2tzLiBJdCBpcyBiYWNrd2FyZHMtY29tcGF0aWJsZSBhbmQgd2lsbCBub3QgYWZmZWN0IGNvbm5lY3Rpb25zIHRvIGNvbXBsaWFudCBUTFMgMS4yIHNlcnZlcnMgb3IgcHJveGllcy4gSG93ZXZlciwgb2xkZXIgdmVyc2lvbnMgb2Ygc29tZSBUTFMtaW50ZXJjZXB0aW5nIHByb3hpZXMgaGF2ZSBhbiBpbXBsZW1lbnRhdGlvbiBmbGF3IHdoaWNoIGNhdXNlcyB0aGVtIHRvIGJlIGluY29tcGF0aWJsZS4KKworICAgICAgSWYgdGhpcyBwb2xpY3kgaXMgc2V0IHRvIFRydWUsIDxwaCBuYW1lPSJQUk9EVUNUX05BTUUiPiQxPGV4Pkdvb2dsZSBDaHJvbWU8L2V4PjwvcGg+IHdpbGwgZW5hYmxlIHRoZXNlIHNlY3VyaXR5IHByb3RlY3Rpb25zIGZvciBhbGwgY29ubmVjdGlvbnMuCisKKyAgICAgIElmIHRoaXMgcG9saWN5IGlzIHNldCB0byBGYWxzZSBvciBub3Qgc2V0LCA8cGggbmFtZT0iUFJPRFVDVF9OQU1FIj4kMTxleD5Hb29nbGUgQ2hyb21lPC9leD48L3BoPiB3aWxsIGRpc2FibGUgdGhlc2Ugc2VjdXJpdHkgcHJvdGVjdGlvbnMgZm9yIGNvbm5lY3Rpb25zIGF1dGhlbnRpY2F0ZWQgd2l0aCBsb2NhbGx5LWluc3RhbGxlZCBDQSBjZXJ0aWZpY2F0ZXMuIFRoZXNlIHByb3RlY3Rpb25zIGFyZSBhbHdheXMgZW5hYmxlZCBmb3IgY29ubmVjdGlvbnMgYXV0aGVudGljYXRlZCB3aXRoIHB1YmxpY2x5LXRydXN0ZWQgQ0EgY2VydGlmaWNhdGVzLgorCisgICAgICBUaGlzIHBvbGljeSBtYXkgYmUgdXNlZCB0byB0ZXN0IGZvciBhbnkgYWZmZWN0ZWQgcHJveGllcyBhbmQgdXBncmFkZSB0aGVtLiBBZmZlY3RlZCBwcm94aWVzIGFyZSBleHBlY3RlZCB0byBmYWlsIGNvbm5lY3Rpb25zIHdpdGggYW4gZXJyb3IgY29kZSBvZiBFUlJfVExTMTNfRE9XTkdSQURFX0RFVEVDVEVELiBBIGxhdGVyIHZlcnNpb24gb2YgPHBoIG5hbWU9IlBST0RVQ1RfTkFNRSI+JDE8ZXg+R29vZ2xlIENocm9tZTwvZXg+PC9waD4gd2lsbCBlbmFibGUgdGhpcyBvcHRpb24gYnkgZGVmYXVsdC4KKworICAgICAgQWZ0ZXIgaXQgaXMgZW5hYmxlZCBieSBkZWZhdWx0LCBhZG1pbmlzdHJhdG9ycyB3aG8gbmVlZCBtb3JlIHRpbWUgdG8gdXBncmFkZSBhZmZlY3RlZCBwcm94aWVzIG1heSB1c2UgdGhpcyBwb2xpY3kgdG8gdGVtcG9yYXJpbHkgZGlzYWJsZSB0aGlzIHNlY3VyaXR5IGZlYXR1cmUuIFRoaXMgcG9saWN5IHdpbGwgYmUgcmVtb3ZlZCBhZnRlciB2ZXJzaW9uIDg1LgorICAgICAgJycnCisgICAgfSwKICAgXSwKIAogICAnbWVzc2FnZXMnOiB7CkBAIC0xOTEzNyw2ICsxOTE2NSw2IEBACiAgIF0sCiAgICdwbGFjZWhvbGRlcnMnOiBbXSwKICAgJ2RlbGV0ZWRfcG9saWN5X2lkcyc6IFs0MTIsIDU0NiwgNTYyLCA1NjldLAotICAnaGlnaGVzdF9pZF9jdXJyZW50bHlfdXNlZCc6IDYyNSwKKyAgJ2hpZ2hlc3RfaWRfY3VycmVudGx5X3VzZWQnOiA2MjYsCiAgICdoaWdoZXN0X2F0b21pY19ncm91cF9pZF9jdXJyZW50bHlfdXNlZCc6IDM4CiB9CmRpZmYgLS1naXQgYS9jb21wb25lbnRzL3ByZXZpZXdzL2NvbnRlbnQvcHJldmlld3Nfb3B0aW1pemF0aW9uX2d1aWRlX2RlY2lkZXIuY2MgYi9jb21wb25lbnRzL3ByZXZpZXdzL2NvbnRlbnQvcHJldmlld3Nfb3B0aW1pemF0aW9uX2d1aWRlX2RlY2lkZXIuY2MKaW5kZXggNWIyZDc0Ny4uZTM5YmMxOCAxMDA2NDQKLS0tIGEvY29tcG9uZW50cy9wcmV2aWV3cy9jb250ZW50L3ByZXZpZXdzX29wdGltaXphdGlvbl9ndWlkZV9kZWNpZGVyLmNjCisrKyBiL2NvbXBvbmVudHMvcHJldmlld3MvY29udGVudC9wcmV2aWV3c19vcHRpbWl6YXRpb25fZ3VpZGVfZGVjaWRlci5jYwpAQCAtODksMTAgKzg5LDExIEBACiAgICAgICByZWdpc3RlcmVkX29wdGltaXphdGlvbl90eXBlc18oR2V0T3B0aW1pemF0aW9uVHlwZXNUb1JlZ2lzdGVyKCkpIHsKICAgRENIRUNLKG9wdGltaXphdGlvbl9ndWlkZV9kZWNpZGVyXyk7CiAKLSAgb3B0aW1pemF0aW9uX2d1aWRlX2RlY2lkZXJfLT5SZWdpc3Rlck9wdGltaXphdGlvblR5cGVzKAorICBvcHRpbWl6YXRpb25fZ3VpZGVfZGVjaWRlcl8tPlJlZ2lzdGVyT3B0aW1pemF0aW9uVHlwZXNBbmRUYXJnZXRzKAogICAgICAgc3RkOjp2ZWN0b3I8b3B0aW1pemF0aW9uX2d1aWRlOjpwcm90bzo6T3B0aW1pemF0aW9uVHlwZT4oCiAgICAgICAgICAgcmVnaXN0ZXJlZF9vcHRpbWl6YXRpb25fdHlwZXNfLmJlZ2luKCksCi0gICAgICAgICAgcmVnaXN0ZXJlZF9vcHRpbWl6YXRpb25fdHlwZXNfLmVuZCgpKSk7CisgICAgICAgICAgcmVnaXN0ZXJlZF9vcHRpbWl6YXRpb25fdHlwZXNfLmVuZCgpKSwKKyAgICAgIHtvcHRpbWl6YXRpb25fZ3VpZGU6OnByb3RvOjpPUFRJTUlaQVRJT05fVEFSR0VUX1BBSU5GVUxfUEFHRV9MT0FEfSk7CiB9CiAKIFByZXZpZXdzT3B0aW1pemF0aW9uR3VpZGVEZWNpZGVyOjp+UHJldmlld3NPcHRpbWl6YXRpb25HdWlkZURlY2lkZXIoKSA9IGRlZmF1bHQ7CmRpZmYgLS1naXQgYS9jb21wb25lbnRzL3ByZXZpZXdzL2NvbnRlbnQvcHJldmlld3Nfb3B0aW1pemF0aW9uX2d1aWRlX2RlY2lkZXJfdW5pdHRlc3QuY2MgYi9jb21wb25lbnRzL3ByZXZpZXdzL2NvbnRlbnQvcHJldmlld3Nfb3B0aW1pemF0aW9uX2d1aWRlX2RlY2lkZXJfdW5pdHRlc3QuY2MKaW5kZXggZDFhMTI3NS4uZjQzZmFiMSAxMDA2NDQKLS0tIGEvY29tcG9uZW50cy9wcmV2aWV3cy9jb250ZW50L3ByZXZpZXdzX29wdGltaXphdGlvbl9ndWlkZV9kZWNpZGVyX3VuaXR0ZXN0LmNjCisrKyBiL2NvbXBvbmVudHMvcHJldmlld3MvY29udGVudC9wcmV2aWV3c19vcHRpbWl6YXRpb25fZ3VpZGVfZGVjaWRlcl91bml0dGVzdC5jYwpAQCAtMjksMTIgKzI5LDE4IEBACiAgIFRlc3RPcHRpbWl6YXRpb25HdWlkZURlY2lkZXIoKSA9IGRlZmF1bHQ7CiAgIH5UZXN0T3B0aW1pemF0aW9uR3VpZGVEZWNpZGVyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwogCi0gIHZvaWQgUmVnaXN0ZXJPcHRpbWl6YXRpb25UeXBlcygKLSAgICAgIHN0ZDo6dmVjdG9yPG9wdGltaXphdGlvbl9ndWlkZTo6cHJvdG86Ok9wdGltaXphdGlvblR5cGU+Ci0gICAgICAgICAgb3B0aW1pemF0aW9uX3R5cGVzKSBvdmVycmlkZSB7CisgIHZvaWQgUmVnaXN0ZXJPcHRpbWl6YXRpb25UeXBlc0FuZFRhcmdldHMoCisgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxvcHRpbWl6YXRpb25fZ3VpZGU6OnByb3RvOjpPcHRpbWl6YXRpb25UeXBlPiYKKyAgICAgICAgICBvcHRpbWl6YXRpb25fdHlwZXMsCisgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxvcHRpbWl6YXRpb25fZ3VpZGU6OnByb3RvOjpPcHRpbWl6YXRpb25UYXJnZXQ+JgorICAgICAgICAgIG9wdGltaXphdGlvbl90YXJnZXRzKSBvdmVycmlkZSB7CiAgICAgcmVnaXN0ZXJlZF9vcHRpbWl6YXRpb25fdHlwZXNfID0KICAgICAgICAgYmFzZTo6ZmxhdF9zZXQ8b3B0aW1pemF0aW9uX2d1aWRlOjpwcm90bzo6T3B0aW1pemF0aW9uVHlwZT4oCiAgICAgICAgICAgICBvcHRpbWl6YXRpb25fdHlwZXMuYmVnaW4oKSwgb3B0aW1pemF0aW9uX3R5cGVzLmVuZCgpKTsKKworICAgIHJlZ2lzdGVyZWRfb3B0aW1pemF0aW9uX3RhcmdldHNfID0KKyAgICAgICAgYmFzZTo6ZmxhdF9zZXQ8b3B0aW1pemF0aW9uX2d1aWRlOjpwcm90bzo6T3B0aW1pemF0aW9uVGFyZ2V0PigKKyAgICAgICAgICAgIG9wdGltaXphdGlvbl90YXJnZXRzLmJlZ2luKCksIG9wdGltaXphdGlvbl90YXJnZXRzLmVuZCgpKTsKICAgfQogCiAgIC8vIFJldHVybnMgdGhlIG9wdGltaXphdGlvbiB0eXBlcyByZWdpc3RlcmVkIHdpdGggdGhlIE9wdGltaXphdGlvbiBHdWlkZQpAQCAtNDQsNiArNTAsMTMgQEAKICAgICByZXR1cm4gcmVnaXN0ZXJlZF9vcHRpbWl6YXRpb25fdHlwZXNfOwogICB9CiAKKyAgLy8gUmV0dXJucyB0aGUgb3B0aW1pemF0aW9uIHRhcmdldHMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBPcHRpbWl6YXRpb24gR3VpZGUKKyAgLy8gRGVjaWRlci4KKyAgYmFzZTo6ZmxhdF9zZXQ8b3B0aW1pemF0aW9uX2d1aWRlOjpwcm90bzo6T3B0aW1pemF0aW9uVGFyZ2V0PgorICByZWdpc3RlcmVkX29wdGltaXphdGlvbl90YXJnZXRzKCkgeworICAgIHJldHVybiByZWdpc3RlcmVkX29wdGltaXphdGlvbl90YXJnZXRzXzsKKyAgfQorCiAgIG9wdGltaXphdGlvbl9ndWlkZTo6T3B0aW1pemF0aW9uR3VpZGVEZWNpc2lvbiBDYW5BcHBseU9wdGltaXphdGlvbigKICAgICAgIGNvbnRlbnQ6Ok5hdmlnYXRpb25IYW5kbGUqIG5hdmlnYXRpb25faGFuZGxlLAogICAgICAgb3B0aW1pemF0aW9uX2d1aWRlOjpwcm90bzo6T3B0aW1pemF0aW9uVGFyZ2V0IG9wdGltaXphdGlvbl90YXJnZXQsCkBAIC04MSw2ICs5NCwxMSBAQAogICBiYXNlOjpmbGF0X3NldDxvcHRpbWl6YXRpb25fZ3VpZGU6OnByb3RvOjpPcHRpbWl6YXRpb25UeXBlPgogICAgICAgcmVnaXN0ZXJlZF9vcHRpbWl6YXRpb25fdHlwZXNfOwogCisgIC8vIFRoZSBvcHRpbWl6YXRpb24gdGFyZ2V0cyB0aGF0IHdlcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBPcHRpbWl6YXRpb24gR3VpZGUKKyAgLy8gRGVjaWRlci4KKyAgYmFzZTo6ZmxhdF9zZXQ8b3B0aW1pemF0aW9uX2d1aWRlOjpwcm90bzo6T3B0aW1pemF0aW9uVGFyZ2V0PgorICAgICAgcmVnaXN0ZXJlZF9vcHRpbWl6YXRpb25fdGFyZ2V0c187CisKICAgc3RkOjptYXA8c3RkOjp0dXBsZTxHVVJMLCBvcHRpbWl6YXRpb25fZ3VpZGU6OnByb3RvOjpPcHRpbWl6YXRpb25UeXBlPiwKICAgICAgICAgICAgc3RkOjp0dXBsZTxvcHRpbWl6YXRpb25fZ3VpZGU6Ok9wdGltaXphdGlvbkd1aWRlRGVjaXNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemF0aW9uX2d1aWRlOjpPcHRpbWl6YXRpb25NZXRhZGF0YT4+CkBAIC0xNTgsNyArMTc2LDcgQEAKIH07CiAKIFRFU1RfRihQcmV2aWV3c09wdGltaXphdGlvbkd1aWRlRGVjaWRlclRlc3QsCi0gICAgICAgSW5pdGlhbGl6YXRpb25SZWdpc3RlcnNDb3JyZWN0T3B0aW1pemF0aW9uVHlwZXMpIHsKKyAgICAgICBJbml0aWFsaXphdGlvblJlZ2lzdGVyc0NvcnJlY3RPcHRpbWl6YXRpb25UeXBlc0FuZFRhcmdldHMpIHsKICAgYmFzZTo6dGVzdDo6U2NvcGVkRmVhdHVyZUxpc3Qgc2NvcGVkX2ZlYXR1cmVfbGlzdDsKICAgc2NvcGVkX2ZlYXR1cmVfbGlzdC5Jbml0V2l0aEZlYXR1cmVzKAogICAgICAge3ByZXZpZXdzOjpmZWF0dXJlczo6a0xpdGVQYWdlU2VydmVyUHJldmlld3MsCkBAIC0xODcsNiArMjA1LDE3IEBACiAgIEVYUEVDVF9UUlVFKHJlZ2lzdGVyZWRfb3B0aW1pemF0aW9uX3R5cGVzLmZpbmQoCiAgICAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb25fZ3VpZGU6OnByb3RvOjpSRVNPVVJDRV9MT0FESU5HKSAhPQogICAgICAgICAgICAgICByZWdpc3RlcmVkX29wdGltaXphdGlvbl90eXBlcy5lbmQoKSk7CisKKyAgLy8gV2UgZXhwZWN0IHRoYXQgdGhlIFBBSU5GVUxfUEFHRV9MT0FEIG9wdGltaXphdGlvbiB0YXJnZXQgaXMgYWx3YXlzCisgIC8vIHJlZ2lzdGVyZWQuCisgIGJhc2U6OmZsYXRfc2V0PG9wdGltaXphdGlvbl9ndWlkZTo6cHJvdG86Ok9wdGltaXphdGlvblRhcmdldD4KKyAgICAgIHJlZ2lzdGVyZWRfb3B0aW1pemF0aW9uX3RhcmdldHMgPQorICAgICAgICAgIG9wdGltaXphdGlvbl9ndWlkZV9kZWNpZGVyKCktPnJlZ2lzdGVyZWRfb3B0aW1pemF0aW9uX3RhcmdldHMoKTsKKyAgRVhQRUNUX0VRKDF1LCByZWdpc3RlcmVkX29wdGltaXphdGlvbl90YXJnZXRzLnNpemUoKSk7CisgIEVYUEVDVF9UUlVFKAorICAgICAgcmVnaXN0ZXJlZF9vcHRpbWl6YXRpb25fdGFyZ2V0cy5maW5kKAorICAgICAgICAgIG9wdGltaXphdGlvbl9ndWlkZTo6cHJvdG86Ok9QVElNSVpBVElPTl9UQVJHRVRfUEFJTkZVTF9QQUdFX0xPQUQpICE9CisgICAgICByZWdpc3RlcmVkX29wdGltaXphdGlvbl90YXJnZXRzLmVuZCgpKTsKIH0KIAogVEVTVF9GKFByZXZpZXdzT3B0aW1pemF0aW9uR3VpZGVEZWNpZGVyVGVzdCwKQEAgLTIxOCw2ICsyNDcsMTcgQEAKICAgRVhQRUNUX0VRKHJlZ2lzdGVyZWRfb3B0aW1pemF0aW9uX3R5cGVzLmZpbmQoCiAgICAgICAgICAgICAgICAgb3B0aW1pemF0aW9uX2d1aWRlOjpwcm90bzo6UkVTT1VSQ0VfTE9BRElORyksCiAgICAgICAgICAgICByZWdpc3RlcmVkX29wdGltaXphdGlvbl90eXBlcy5lbmQoKSk7CisKKyAgLy8gV2UgZXhwZWN0IHRoYXQgdGhlIFBBSU5GVUxfUEFHRV9MT0FEIG9wdGltaXphdGlvbiB0YXJnZXQgaXMgYWx3YXlzCisgIC8vIHJlZ2lzdGVyZWQuCisgIGJhc2U6OmZsYXRfc2V0PG9wdGltaXphdGlvbl9ndWlkZTo6cHJvdG86Ok9wdGltaXphdGlvblRhcmdldD4KKyAgICAgIHJlZ2lzdGVyZWRfb3B0aW1pemF0aW9uX3RhcmdldHMgPQorICAgICAgICAgIG9wdGltaXphdGlvbl9ndWlkZV9kZWNpZGVyKCktPnJlZ2lzdGVyZWRfb3B0aW1pemF0aW9uX3RhcmdldHMoKTsKKyAgRVhQRUNUX0VRKDF1LCByZWdpc3RlcmVkX29wdGltaXphdGlvbl90YXJnZXRzLnNpemUoKSk7CisgIEVYUEVDVF9UUlVFKAorICAgICAgcmVnaXN0ZXJlZF9vcHRpbWl6YXRpb25fdGFyZ2V0cy5maW5kKAorICAgICAgICAgIG9wdGltaXphdGlvbl9ndWlkZTo6cHJvdG86Ok9QVElNSVpBVElPTl9UQVJHRVRfUEFJTkZVTF9QQUdFX0xPQUQpICE9CisgICAgICByZWdpc3RlcmVkX29wdGltaXphdGlvbl90YXJnZXRzLmVuZCgpKTsKIH0KIAogVEVTVF9GKFByZXZpZXdzT3B0aW1pemF0aW9uR3VpZGVEZWNpZGVyVGVzdCwKZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvcmVtb3RlX2NvY29hL2FwcF9zaGltL2FsZXJ0LmggYi9jb21wb25lbnRzL3JlbW90ZV9jb2NvYS9hcHBfc2hpbS9hbGVydC5oCmluZGV4IDM3YWVhYTM4Li5jMDhmNzg1IDEwMDY0NAotLS0gYS9jb21wb25lbnRzL3JlbW90ZV9jb2NvYS9hcHBfc2hpbS9hbGVydC5oCisrKyBiL2NvbXBvbmVudHMvcmVtb3RlX2NvY29hL2FwcF9zaGltL2FsZXJ0LmgKQEAgLTEwLDcgKzEwLDggQEAKICNpbmNsdWRlICJiYXNlL21hYy9zY29wZWRfbnNvYmplY3QuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL3JlbW90ZV9jb2NvYS9hcHBfc2hpbS9yZW1vdGVfY29jb2FfYXBwX3NoaW1fZXhwb3J0LmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9yZW1vdGVfY29jb2EvY29tbW9uL2FsZXJ0Lm1vam9tLmgiCi0jaW5jbHVkZSAibW9qby9wdWJsaWMvY3BwL2JpbmRpbmdzL2JpbmRpbmcuaCIKKyNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvYmluZGluZ3MvcGVuZGluZ19yZWNlaXZlci5oIgorI2luY2x1ZGUgIm1vam8vcHVibGljL2NwcC9iaW5kaW5ncy9yZWNlaXZlci5oIgogI2luY2x1ZGUgInVpL2dmeC90ZXh0X2VsaWRlci5oIgogCiBAY2xhc3MgQWxlcnRCcmlkZ2VIZWxwZXI7CkBAIC0yNCw3ICsyNSw3IEBACiAgcHVibGljOgogICAvLyBDcmVhdGVzIGEgbmV3IGFsZXJ0IHdoaWNoIGNvbnRyb2xzIGl0cyBvd24gbGlmZXRpbWUuIEl0IHdpbGwgZGVzdHJveSBpdHNlbGYKICAgLy8gb25jZSBpdHMgTlNBbGVydCBnb2VzIGF3YXkuCi0gIEFsZXJ0QnJpZGdlKG1vam9tOjpBbGVydEJyaWRnZVJlcXVlc3QgYnJpZGdlX3JlcXVlc3QpOworICBBbGVydEJyaWRnZShtb2pvOjpQZW5kaW5nUmVjZWl2ZXI8bW9qb206OkFsZXJ0QnJpZGdlPiBicmlkZ2VfcmVjZWl2ZXIpOwogCiAgIC8vIFNlbmQgdGhlIHNwZWNpZmllZCBkaXNwb3NpdGlvbiB2aWEgdGhlIFNob3cgY2FsbGJhY2ssIHRoZW4gZGVzdHJveSB8dGhpc3wuCiAgIHZvaWQgU2VuZFJlc3VsdEFuZERlc3Ryb3kobW9qb206OkFsZXJ0RGlzcG9zaXRpb24gZGlzcG9zaXRpb24pOwpAQCAtMzksNyArNDAsNyBAQAogCiAgIC8vIEhhbmRsZSBiZWluZyBkaXNjb25uZWN0ZWQgKGUuZywgYmVjYXVzZSB0aGUgYWxlcnQgd2FzIHByb2dyYW1tYXRpY2FsbHkKICAgLy8gZGlzbWlzc2VkKS4KLSAgdm9pZCBPbkNvbm5lY3Rpb25FcnJvcigpOworICB2b2lkIE9uTW9qb0Rpc2Nvbm5lY3QoKTsKIAogICAvLyByZW1vdGVfY29jb2E6Om1vam9tOjpBbGVydDoKICAgdm9pZCBTaG93KG1vam9tOjpBbGVydEJyaWRnZUluaXRQYXJhbXNQdHIgcGFyYW1zLApAQCAtNTUsNyArNTYsNyBAQAogICAvLyBUaGUgY2FsbGJhY2sgdG8gbWFrZSB3aGVuIHRoZSBkaWFsb2cgaGFzIGZpbmlzaGVkIHJ1bm5pbmcuCiAgIFNob3dDYWxsYmFjayBjYWxsYmFja187CiAKLSAgbW9qbzo6QmluZGluZzxyZW1vdGVfY29jb2E6Om1vam9tOjpBbGVydEJyaWRnZT4gbW9qb19iaW5kaW5nXzsKKyAgbW9qbzo6UmVjZWl2ZXI8cmVtb3RlX2NvY29hOjptb2pvbTo6QWxlcnRCcmlkZ2U+IG1vam9fcmVjZWl2ZXJfe3RoaXN9OwogICBiYXNlOjpXZWFrUHRyRmFjdG9yeTxBbGVydEJyaWRnZT4gd2Vha19mYWN0b3J5XzsKICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEFsZXJ0QnJpZGdlKTsKIH07CmRpZmYgLS1naXQgYS9jb21wb25lbnRzL3JlbW90ZV9jb2NvYS9hcHBfc2hpbS9hbGVydC5tbSBiL2NvbXBvbmVudHMvcmVtb3RlX2NvY29hL2FwcF9zaGltL2FsZXJ0Lm1tCmluZGV4IDFmZjc0NjAwLi43OGYyMDY5IDEwMDY0NAotLS0gYS9jb21wb25lbnRzL3JlbW90ZV9jb2NvYS9hcHBfc2hpbS9hbGVydC5tbQorKysgYi9jb21wb25lbnRzL3JlbW90ZV9jb2NvYS9hcHBfc2hpbS9hbGVydC5tbQpAQCAtMjU5LDEyICsyNTksMTMgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyBBbGVydEJyaWRnZToKIAotQWxlcnRCcmlkZ2U6OkFsZXJ0QnJpZGdlKG1vam9tOjpBbGVydEJyaWRnZVJlcXVlc3QgYnJpZGdlX3JlcXVlc3QpCi0gICAgOiBtb2pvX2JpbmRpbmdfKHRoaXMpLCB3ZWFrX2ZhY3RvcnlfKHRoaXMpIHsKLSAgbW9qb19iaW5kaW5nXy5CaW5kKHN0ZDo6bW92ZShicmlkZ2VfcmVxdWVzdCksCi0gICAgICAgICAgICAgICAgICAgICB1aTo6V2luZG93UmVzaXplSGVscGVyTWFjOjpHZXQoKS0+dGFza19ydW5uZXIoKSk7Ci0gIG1vam9fYmluZGluZ18uc2V0X2Nvbm5lY3Rpb25fZXJyb3JfaGFuZGxlcihiYXNlOjpCaW5kT25jZSgKLSAgICAgICZBbGVydEJyaWRnZTo6T25Db25uZWN0aW9uRXJyb3IsIHdlYWtfZmFjdG9yeV8uR2V0V2Vha1B0cigpKSk7CitBbGVydEJyaWRnZTo6QWxlcnRCcmlkZ2UoCisgICAgbW9qbzo6UGVuZGluZ1JlY2VpdmVyPG1vam9tOjpBbGVydEJyaWRnZT4gYnJpZGdlX3JlY2VpdmVyKQorICAgIDogd2Vha19mYWN0b3J5Xyh0aGlzKSB7CisgIG1vam9fcmVjZWl2ZXJfLkJpbmQoc3RkOjptb3ZlKGJyaWRnZV9yZWNlaXZlciksCisgICAgICAgICAgICAgICAgICAgICAgdWk6OldpbmRvd1Jlc2l6ZUhlbHBlck1hYzo6R2V0KCktPnRhc2tfcnVubmVyKCkpOworICBtb2pvX3JlY2VpdmVyXy5zZXRfZGlzY29ubmVjdF9oYW5kbGVyKGJhc2U6OkJpbmRPbmNlKAorICAgICAgJkFsZXJ0QnJpZGdlOjpPbk1vam9EaXNjb25uZWN0LCB3ZWFrX2ZhY3RvcnlfLkdldFdlYWtQdHIoKSkpOwogfQogCiBBbGVydEJyaWRnZTo6fkFsZXJ0QnJpZGdlKCkgewpAQCAtMjcyLDcgKzI3Myw3IEBACiAgIFtOU09iamVjdCBjYW5jZWxQcmV2aW91c1BlcmZvcm1SZXF1ZXN0c1dpdGhUYXJnZXQ6aGVscGVyXy5nZXQoKV07CiB9CiAKLXZvaWQgQWxlcnRCcmlkZ2U6Ok9uQ29ubmVjdGlvbkVycm9yKCkgewordm9pZCBBbGVydEJyaWRnZTo6T25Nb2pvRGlzY29ubmVjdCgpIHsKICAgLy8gSWYgdGhlIGFsZXJ0IGhhcyBiZWVuIHNob3duLCB0aGVuIGNsb3NlIHRoZSB3aW5kb3csIGFuZCB8dGhpc3wgd2lsbCBkZWxldGUKICAgLy8gaXRzZWxmIGFmdGVyIHRoZSB3aW5kb3cgaXMgY2xvc2VkLiBPdGhlcndpc2UsIGp1c3QgZGVsZXRlIHx0aGlzfAogICAvLyBpbW1lZGlhdGVseS4KZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvcmVtb3RlX2NvY29hL2FwcF9zaGltL2FwcGxpY2F0aW9uX2JyaWRnZS5oIGIvY29tcG9uZW50cy9yZW1vdGVfY29jb2EvYXBwX3NoaW0vYXBwbGljYXRpb25fYnJpZGdlLmgKaW5kZXggZjE5YzNhMTcuLmM2YTBiMWEgMTAwNjQ0Ci0tLSBhL2NvbXBvbmVudHMvcmVtb3RlX2NvY29hL2FwcF9zaGltL2FwcGxpY2F0aW9uX2JyaWRnZS5oCisrKyBiL2NvbXBvbmVudHMvcmVtb3RlX2NvY29hL2FwcF9zaGltL2FwcGxpY2F0aW9uX2JyaWRnZS5oCkBAIC0xMSw2ICsxMSw4IEBACiAjaW5jbHVkZSAiY29tcG9uZW50cy9yZW1vdGVfY29jb2EvY29tbW9uL25hdGl2ZV93aWRnZXRfbnNfd2luZG93Lm1vam9tLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9yZW1vdGVfY29jb2EvY29tbW9uL25hdGl2ZV93aWRnZXRfbnNfd2luZG93X2hvc3QubW9qb20uaCIKICNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvYmluZGluZ3MvYXNzb2NpYXRlZF9iaW5kaW5nLmgiCisjaW5jbHVkZSAibW9qby9wdWJsaWMvY3BwL2JpbmRpbmdzL3BlbmRpbmdfcmVjZWl2ZXIuaCIKKyNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvYmluZGluZ3MvcGVuZGluZ19yZW1vdGUuaCIKIAogbmFtZXNwYWNlIHJlbW90ZV9jb2NvYSB7CiAKQEAgLTQwLDkgKzQyLDEwIEBACiAgICAgICBXZWJDb250ZW50c05TVmlld0NyZWF0ZUNhbGxiYWNrIHdlYl9jb25lbnRzX2NyZWF0ZV9jYWxsYmFjayk7CiAKICAgLy8gbW9qb206OkFwcGxpY2F0aW9uOgotICB2b2lkIENyZWF0ZUFsZXJ0KG1vam9tOjpBbGVydEJyaWRnZVJlcXVlc3QgYnJpZGdlX3JlcXVlc3QpIG92ZXJyaWRlOwotICB2b2lkIFNob3dDb2xvclBhbmVsKG1vam9tOjpDb2xvclBhbmVsUmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgIG1vam9tOjpDb2xvclBhbmVsSG9zdFB0ciBob3N0KSBvdmVycmlkZTsKKyAgdm9pZCBDcmVhdGVBbGVydCgKKyAgICAgIG1vam86OlBlbmRpbmdSZWNlaXZlcjxtb2pvbTo6QWxlcnRCcmlkZ2U+IGJyaWRnZV9yZWNlaXZlcikgb3ZlcnJpZGU7CisgIHZvaWQgU2hvd0NvbG9yUGFuZWwobW9qbzo6UGVuZGluZ1JlY2VpdmVyPG1vam9tOjpDb2xvclBhbmVsPiByZWNlaXZlciwKKyAgICAgICAgICAgICAgICAgICAgICBtb2pvOjpQZW5kaW5nUmVtb3RlPG1vam9tOjpDb2xvclBhbmVsSG9zdD4gaG9zdCkgb3ZlcnJpZGU7CiAgIHZvaWQgQ3JlYXRlTmF0aXZlV2lkZ2V0TlNXaW5kb3coCiAgICAgICB1aW50NjRfdCBicmlkZ2VfaWQsCiAgICAgICBtb2pvbTo6TmF0aXZlV2lkZ2V0TlNXaW5kb3dBc3NvY2lhdGVkUmVxdWVzdCBicmlkZ2VfcmVxdWVzdCwKZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvcmVtb3RlX2NvY29hL2FwcF9zaGltL2FwcGxpY2F0aW9uX2JyaWRnZS5tbSBiL2NvbXBvbmVudHMvcmVtb3RlX2NvY29hL2FwcF9zaGltL2FwcGxpY2F0aW9uX2JyaWRnZS5tbQppbmRleCA2MjgxOTZlLi5lZDEyMDY4IDEwMDY0NAotLS0gYS9jb21wb25lbnRzL3JlbW90ZV9jb2NvYS9hcHBfc2hpbS9hcHBsaWNhdGlvbl9icmlkZ2UubW0KKysrIGIvY29tcG9uZW50cy9yZW1vdGVfY29jb2EvYXBwX3NoaW0vYXBwbGljYXRpb25fYnJpZGdlLm1tCkBAIC0xMCw3ICsxMCw3IEBACiAjaW5jbHVkZSAiY29tcG9uZW50cy9yZW1vdGVfY29jb2EvYXBwX3NoaW0vY29sb3JfcGFuZWxfYnJpZGdlLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9yZW1vdGVfY29jb2EvYXBwX3NoaW0vbmF0aXZlX3dpZGdldF9uc193aW5kb3dfYnJpZGdlLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9yZW1vdGVfY29jb2EvYXBwX3NoaW0vbmF0aXZlX3dpZGdldF9uc193aW5kb3dfaG9zdF9oZWxwZXIuaCIKLSNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvYmluZGluZ3Mvc3Ryb25nX2JpbmRpbmcuaCIKKyNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvYmluZGluZ3Mvc2VsZl9vd25lZF9yZWNlaXZlci5oIgogI2luY2x1ZGUgInVpL2FjY2VsZXJhdGVkX3dpZGdldF9tYWMvd2luZG93X3Jlc2l6ZV9oZWxwZXJfbWFjLmgiCiAjaW5jbHVkZSAidWkvYmFzZS9jb2NvYS9yZW1vdGVfYWNjZXNzaWJpbGl0eV9hcGkuaCIKIApAQCAtMTE2LDE1ICsxMTYsMTcgQEAKICAgd2ViX2NvbmVudHNfY3JlYXRlX2NhbGxiYWNrXyA9IHdlYl9jb25lbnRzX2NyZWF0ZV9jYWxsYmFjazsKIH0KIAotdm9pZCBBcHBsaWNhdGlvbkJyaWRnZTo6Q3JlYXRlQWxlcnQobW9qb206OkFsZXJ0QnJpZGdlUmVxdWVzdCBicmlkZ2VfcmVxdWVzdCkgewordm9pZCBBcHBsaWNhdGlvbkJyaWRnZTo6Q3JlYXRlQWxlcnQoCisgICAgbW9qbzo6UGVuZGluZ1JlY2VpdmVyPG1vam9tOjpBbGVydEJyaWRnZT4gYnJpZGdlX3JlY2VpdmVyKSB7CiAgIC8vIFRoZSByZXN1bHRpbmcgb2JqZWN0IG1hbmFnZXMgaXRzIG93biBsaWZldGltZS4KLSAgaWdub3JlX3Jlc3VsdChuZXcgQWxlcnRCcmlkZ2Uoc3RkOjptb3ZlKGJyaWRnZV9yZXF1ZXN0KSkpOworICBpZ25vcmVfcmVzdWx0KG5ldyBBbGVydEJyaWRnZShzdGQ6Om1vdmUoYnJpZGdlX3JlY2VpdmVyKSkpOwogfQogCi12b2lkIEFwcGxpY2F0aW9uQnJpZGdlOjpTaG93Q29sb3JQYW5lbChtb2pvbTo6Q29sb3JQYW5lbFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vam9tOjpDb2xvclBhbmVsSG9zdFB0ciBob3N0KSB7Ci0gIG1vam86Ok1ha2VTdHJvbmdCaW5kaW5nKHN0ZDo6bWFrZV91bmlxdWU8Q29sb3JQYW5lbEJyaWRnZT4oc3RkOjptb3ZlKGhvc3QpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHJlcXVlc3QpKTsKK3ZvaWQgQXBwbGljYXRpb25CcmlkZ2U6OlNob3dDb2xvclBhbmVsKAorICAgIG1vam86OlBlbmRpbmdSZWNlaXZlcjxtb2pvbTo6Q29sb3JQYW5lbD4gcmVjZWl2ZXIsCisgICAgbW9qbzo6UGVuZGluZ1JlbW90ZTxtb2pvbTo6Q29sb3JQYW5lbEhvc3Q+IGhvc3QpIHsKKyAgbW9qbzo6TWFrZVNlbGZPd25lZFJlY2VpdmVyKAorICAgICAgc3RkOjptYWtlX3VuaXF1ZTxDb2xvclBhbmVsQnJpZGdlPihzdGQ6Om1vdmUoaG9zdCkpLCBzdGQ6Om1vdmUocmVjZWl2ZXIpKTsKIH0KIAogdm9pZCBBcHBsaWNhdGlvbkJyaWRnZTo6Q3JlYXRlTmF0aXZlV2lkZ2V0TlNXaW5kb3coCmRpZmYgLS1naXQgYS9jb21wb25lbnRzL3JlbW90ZV9jb2NvYS9hcHBfc2hpbS9jb2xvcl9wYW5lbF9icmlkZ2UuaCBiL2NvbXBvbmVudHMvcmVtb3RlX2NvY29hL2FwcF9zaGltL2NvbG9yX3BhbmVsX2JyaWRnZS5oCmluZGV4IDBjNzY3YjRhLi5kMDYzYzVkIDEwMDY0NAotLS0gYS9jb21wb25lbnRzL3JlbW90ZV9jb2NvYS9hcHBfc2hpbS9jb2xvcl9wYW5lbF9icmlkZ2UuaAorKysgYi9jb21wb25lbnRzL3JlbW90ZV9jb2NvYS9hcHBfc2hpbS9jb2xvcl9wYW5lbF9icmlkZ2UuaApAQCAtNyw2ICs3LDggQEAKIAogI2luY2x1ZGUgImNvbXBvbmVudHMvcmVtb3RlX2NvY29hL2FwcF9zaGltL3JlbW90ZV9jb2NvYV9hcHBfc2hpbV9leHBvcnQuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL3JlbW90ZV9jb2NvYS9jb21tb24vY29sb3JfcGFuZWwubW9qb20uaCIKKyNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvYmluZGluZ3MvcGVuZGluZ19yZW1vdGUuaCIKKyNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvYmluZGluZ3MvcmVtb3RlLmgiCiAKIG5hbWVzcGFjZSByZW1vdGVfY29jb2EgewogCkBAIC0xNSw3ICsxNyw3IEBACiBjbGFzcyBSRU1PVEVfQ09DT0FfQVBQX1NISU1fRVhQT1JUIENvbG9yUGFuZWxCcmlkZ2UKICAgICA6IHB1YmxpYyByZW1vdGVfY29jb2E6Om1vam9tOjpDb2xvclBhbmVsIHsKICBwdWJsaWM6Ci0gIENvbG9yUGFuZWxCcmlkZ2UobW9qb206OkNvbG9yUGFuZWxIb3N0UHRyIGhvc3QpOworICBDb2xvclBhbmVsQnJpZGdlKG1vam86OlBlbmRpbmdSZW1vdGU8bW9qb206OkNvbG9yUGFuZWxIb3N0PiBob3N0KTsKICAgfkNvbG9yUGFuZWxCcmlkZ2UoKSBvdmVycmlkZTsKICAgbW9qb206OkNvbG9yUGFuZWxIb3N0KiBob3N0KCkgeyByZXR1cm4gaG9zdF8uZ2V0KCk7IH0KIApAQCAtMjQsNyArMjYsNyBAQAogICB2b2lkIFNldFNlbGVjdGVkQ29sb3IodWludDMyX3QgY29sb3IpIG92ZXJyaWRlOwogCiAgcHJpdmF0ZToKLSAgbW9qb206OkNvbG9yUGFuZWxIb3N0UHRyIGhvc3RfOworICBtb2pvOjpSZW1vdGU8bW9qb206OkNvbG9yUGFuZWxIb3N0PiBob3N0XzsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSByZW1vdGVfY29jb2EKZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvcmVtb3RlX2NvY29hL2FwcF9zaGltL2NvbG9yX3BhbmVsX2JyaWRnZS5tbSBiL2NvbXBvbmVudHMvcmVtb3RlX2NvY29hL2FwcF9zaGltL2NvbG9yX3BhbmVsX2JyaWRnZS5tbQppbmRleCAxMmVhZWUxLi5lYjJhODdjIDEwMDY0NAotLS0gYS9jb21wb25lbnRzL3JlbW90ZV9jb2NvYS9hcHBfc2hpbS9jb2xvcl9wYW5lbF9icmlkZ2UubW0KKysrIGIvY29tcG9uZW50cy9yZW1vdGVfY29jb2EvYXBwX3NoaW0vY29sb3JfcGFuZWxfYnJpZGdlLm1tCkBAIC0xMTYsNyArMTE2LDggQEAKIAogbmFtZXNwYWNlIHJlbW90ZV9jb2NvYSB7CiAKLUNvbG9yUGFuZWxCcmlkZ2U6OkNvbG9yUGFuZWxCcmlkZ2UobW9qb206OkNvbG9yUGFuZWxIb3N0UHRyIGhvc3QpCitDb2xvclBhbmVsQnJpZGdlOjpDb2xvclBhbmVsQnJpZGdlKAorICAgIG1vam86OlBlbmRpbmdSZW1vdGU8bW9qb206OkNvbG9yUGFuZWxIb3N0PiBob3N0KQogICAgIDogaG9zdF8oc3RkOjptb3ZlKGhvc3QpKSB7CiAgIGdfY3VycmVudF9wYW5lbF9icmlkZ2UgPSB0aGlzOwogfQpkaWZmIC0tZ2l0IGEvY29tcG9uZW50cy9yZW1vdGVfY29jb2EvY29tbW9uL2FwcGxpY2F0aW9uLm1vam9tIGIvY29tcG9uZW50cy9yZW1vdGVfY29jb2EvY29tbW9uL2FwcGxpY2F0aW9uLm1vam9tCmluZGV4IDc4NmU1ZjkyLi5mYTkwN2Y1MCAxMDA2NDQKLS0tIGEvY29tcG9uZW50cy9yZW1vdGVfY29jb2EvY29tbW9uL2FwcGxpY2F0aW9uLm1vam9tCisrKyBiL2NvbXBvbmVudHMvcmVtb3RlX2NvY29hL2NvbW1vbi9hcHBsaWNhdGlvbi5tb2pvbQpAQCAtMjYsMTAgKzI2LDExIEBACiAvLyB2YXJpb3VzIENvY29hIHR5cGVzIChOU0FsZXJ0LCBOU1dpbmRvdywgTlNWaWV3LCBldGMpIGFyZSBjcmVhdGVkLgogaW50ZXJmYWNlIEFwcGxpY2F0aW9uIHsKICAgLy8gQ3JlYXRlIGEgYnJpZGdlIGZvciBhbiBOU0FsZXJ0LiBUaGUgcmVzdWx0aW5nIG9iamVjdCBvd25zIGl0cyBvd24gbGlmZXRpbWUuCi0gIENyZWF0ZUFsZXJ0KEFsZXJ0QnJpZGdlJiBhbGVydF9icmlkZ2VfcmVxdWVzdCk7CisgIENyZWF0ZUFsZXJ0KHBlbmRpbmdfcmVjZWl2ZXI8QWxlcnRCcmlkZ2U+IGFsZXJ0X2JyaWRnZV9yZWNlaXZlcik7CiAKICAgLy8gU2hvdyB0aGUgTlNDb2xvclBhbmVsIGluIHRoaXMgYXBwbGljYXRpb24uCi0gIFNob3dDb2xvclBhbmVsKENvbG9yUGFuZWwmIHJlcXVlc3QsIENvbG9yUGFuZWxIb3N0IGhvc3QpOworICBTaG93Q29sb3JQYW5lbChwZW5kaW5nX3JlY2VpdmVyPENvbG9yUGFuZWw+IHJlY2VpdmVyLAorICAgICAgICAgICAgICAgICBwZW5kaW5nX3JlbW90ZTxDb2xvclBhbmVsSG9zdD4gaG9zdCk7CiAKICAgLy8gQ3JlYXRlIGEgd2luZG93IGZvciBhIG5hdGl2ZSB3aWRnZXQuIFRoZSByZXN1bHRpbmcgb2JqZWN0IHdpbGwgYmUgb3duZWQgYnkKICAgLy8gdGhlIGNvbm5lY3Rpb24gZm9yIHxob3N0fC4gQ2xvc2luZyB0aGF0IGNvbm5lY3Rpb24gd2lsbCByZXN1bHQgaW4gZGVsZXRpbmcKZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvc2FmZV9icm93c2luZy9wYXNzd29yZF9wcm90ZWN0aW9uL21ldHJpY3NfdXRpbC5jYyBiL2NvbXBvbmVudHMvc2FmZV9icm93c2luZy9wYXNzd29yZF9wcm90ZWN0aW9uL21ldHJpY3NfdXRpbC5jYwppbmRleCBjY2NlMmVjZC4uMjgzOTBmNyAxMDA2NDQKLS0tIGEvY29tcG9uZW50cy9zYWZlX2Jyb3dzaW5nL3Bhc3N3b3JkX3Byb3RlY3Rpb24vbWV0cmljc191dGlsLmNjCisrKyBiL2NvbXBvbmVudHMvc2FmZV9icm93c2luZy9wYXNzd29yZF9wcm90ZWN0aW9uL21ldHJpY3NfdXRpbC5jYwpAQCAtMzQsNiArMzQsOCBAQAogICAgICJQYXNzd29yZFByb3RlY3Rpb24uUmVxdWVzdE91dGNvbWUuR1N1aXRlU3luY1Bhc3N3b3JkRW50cnkiOwogY29uc3QgY2hhciBrR1N1aXRlTm9uU3luY1Bhc3N3b3JkRW50cnlSZXF1ZXN0T3V0Y29tZUhpc3RvZ3JhbVtdID0KICAgICAiUGFzc3dvcmRQcm90ZWN0aW9uLlJlcXVlc3RPdXRjb21lLkdTdWl0ZU5vblN5bmNQYXNzd29yZEVudHJ5IjsKK2NvbnN0IGNoYXIga1NhdmVkUGFzc3dvcmRFbnRyeVJlcXVlc3RPdXRjb21lSGlzdG9ncmFtW10gPQorICAgICJQYXNzd29yZFByb3RlY3Rpb24uUmVxdWVzdE91dGNvbWUuU2F2ZWRQYXNzd29yZEVudHJ5IjsKIGNvbnN0IGNoYXIga0dTdWl0ZVN5bmNQYXNzd29yZEVudHJ5VmVyZGljdEhpc3RvZ3JhbVtdID0KICAgICAiUGFzc3dvcmRQcm90ZWN0aW9uLlZlcmRpY3QuR1N1aXRlU3luY1Bhc3N3b3JkRW50cnkiOwogY29uc3QgY2hhciBrR1N1aXRlTm9uU3luY1Bhc3N3b3JkRW50cnlWZXJkaWN0SGlzdG9ncmFtW10gPQpAQCAtNDIsMTIgKzQ0LDE2IEBACiAgICAgIlBhc3N3b3JkUHJvdGVjdGlvbi5WZXJkaWN0LkdtYWlsU3luY1Bhc3N3b3JkRW50cnkiOwogY29uc3QgY2hhciBrR21haWxOb25TeW5jUGFzc3dvcmRFbnRyeVZlcmRpY3RIaXN0b2dyYW1bXSA9CiAgICAgIlBhc3N3b3JkUHJvdGVjdGlvbi5WZXJkaWN0LkdtYWlsTm9uU3luY1Bhc3N3b3JkRW50cnkiOworY29uc3QgY2hhciBrU2F2ZWRQYXNzd29yZEVudHJ5VmVyZGljdEhpc3RvZ3JhbVtdID0KKyAgICAiUGFzc3dvcmRQcm90ZWN0aW9uLlZlcmRpY3QuU2F2ZWRQYXNzd29yZEVudHJ5IjsKIGNvbnN0IGNoYXIga0dtYWlsTm9uU3luY1Bhc3N3b3JkSW50ZXJzdGl0aWFsSGlzdG9ncmFtW10gPQogICAgICJQYXNzd29yZFByb3RlY3Rpb24uSW50ZXJzdGl0aWFsQWN0aW9uLkdtYWlsTm9uU3luY1Bhc3N3b3JkRW50cnkiOwogY29uc3QgY2hhciBrR21haWxTeW5jUGFzc3dvcmRQYWdlSW5mb0hpc3RvZ3JhbVtdID0KICAgICAiUGFzc3dvcmRQcm90ZWN0aW9uLlBhZ2VJbmZvQWN0aW9uLkdtYWlsU3luY1Bhc3N3b3JkRW50cnkiOwogY29uc3QgY2hhciBrR21haWxOb25TeW5jUGFzc3dvcmRQYWdlSW5mb0hpc3RvZ3JhbVtdID0KICAgICAiUGFzc3dvcmRQcm90ZWN0aW9uLlBhZ2VJbmZvQWN0aW9uLkdtYWlsTm9uU3luY1Bhc3N3b3JkRW50cnkiOworY29uc3QgY2hhciBrU2F2ZWRQYXNzd29yZFBhZ2VJbmZvSGlzdG9ncmFtW10gPQorICAgICJQYXNzd29yZFByb3RlY3Rpb24uUGFnZUluZm9BY3Rpb24uU2F2ZWRQYXNzd29yZEVudHJ5IjsKIGNvbnN0IGNoYXIga0dtYWlsU3luY1Bhc3N3b3JkV2FybmluZ0RpYWxvZ0hpc3RvZ3JhbVtdID0KICAgICAiUGFzc3dvcmRQcm90ZWN0aW9uLk1vZGFsV2FybmluZ0RpYWxvZ0FjdGlvbi5HbWFpbFN5bmNQYXNzd29yZEVudHJ5IjsKIGNvbnN0IGNoYXIga0dtYWlsTm9uU3luY1Bhc3N3b3JkV2FybmluZ0RpYWxvZ0hpc3RvZ3JhbVtdID0KQEAgLTY5LDYgKzc1LDggQEAKICAgICAiUGFzc3dvcmRQcm90ZWN0aW9uLk1vZGFsV2FybmluZ0RpYWxvZ0FjdGlvbi5HU3VpdGVTeW5jUGFzc3dvcmRFbnRyeSI7CiBjb25zdCBjaGFyIGtHU3VpdGVOb25TeW5jUGFzc3dvcmRXYXJuaW5nRGlhbG9nSGlzdG9ncmFtW10gPQogICAgICJQYXNzd29yZFByb3RlY3Rpb24uTW9kYWxXYXJuaW5nRGlhbG9nQWN0aW9uLkdTdWl0ZU5vblN5bmNQYXNzd29yZEVudHJ5IjsKK2NvbnN0IGNoYXIga1NhdmVkUGFzc3dvcmRXYXJuaW5nRGlhbG9nSGlzdG9ncmFtW10gPQorICAgICJQYXNzd29yZFByb3RlY3Rpb24uTW9kYWxXYXJuaW5nRGlhbG9nQWN0aW9uLlNhdmVkUGFzc3dvcmRFbnRyeSI7CiBjb25zdCBjaGFyIGtOb25TeW5jUGFzc3dvcmRXYXJuaW5nRGlhbG9nSGlzdG9ncmFtW10gPQogICAgICJQYXNzd29yZFByb3RlY3Rpb24uTW9kYWxXYXJuaW5nRGlhbG9nQWN0aW9uLk5vblN5bmNQYXNzd29yZEVudHJ5IjsKIGNvbnN0IGNoYXIga1Bhc3N3b3JkT25Gb2N1c1JlcXVlc3RPdXRjb21lSGlzdG9ncmFtW10gPQpAQCAtMTIxLDYgKzEyOSwxMCBAQAogICAgICAgICAgICAgIFJldXNlZFBhc3N3b3JkQWNjb3VudFR5cGU6Ok5PTl9HQUlBX0VOVEVSUFJJU0UpIHsKICAgICBVTUFfSElTVE9HUkFNX0VOVU1FUkFUSU9OKGtFbnRlcnByaXNlUGFzc3dvcmRFbnRyeVJlcXVlc3RPdXRjb21lSGlzdG9ncmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Y29tZSk7CisgIH0gZWxzZSBpZiAocGFzc3dvcmRfYWNjb3VudF90eXBlLmFjY291bnRfdHlwZSgpID09CisgICAgICAgICAgICAgUmV1c2VkUGFzc3dvcmRBY2NvdW50VHlwZTo6U0FWRURfUEFTU1dPUkQpIHsKKyAgICBVTUFfSElTVE9HUkFNX0VOVU1FUkFUSU9OKGtTYXZlZFBhc3N3b3JkRW50cnlSZXF1ZXN0T3V0Y29tZUhpc3RvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGNvbWUpOwogICB9IGVsc2UgewogICAgIGlmIChpc19nc3VpdGVfdXNlcikgewogICAgICAgVU1BX0hJU1RPR1JBTV9FTlVNRVJBVElPTigKQEAgLTIyMiw2ICsyMzQsMTEgQEAKICAgICAgICAgVU1BX0hJU1RPR1JBTV9FTlVNRVJBVElPTigKICAgICAgICAgICAgIGtFbnRlcnByaXNlUGFzc3dvcmRFbnRyeVZlcmRpY3RIaXN0b2dyYW0sIHZlcmRpY3RfdHlwZSwKICAgICAgICAgICAgIChMb2dpblJlcHV0YXRpb25DbGllbnRSZXNwb25zZV9WZXJkaWN0VHlwZV9WZXJkaWN0VHlwZV9NQVggKyAxKSk7CisgICAgICB9IGVsc2UgaWYgKHBhc3N3b3JkX2FjY291bnRfdHlwZS5hY2NvdW50X3R5cGUoKSA9PQorICAgICAgICAgICAgICAgICBSZXVzZWRQYXNzd29yZEFjY291bnRUeXBlOjpTQVZFRF9QQVNTV09SRCkgeworICAgICAgICBVTUFfSElTVE9HUkFNX0VOVU1FUkFUSU9OKAorICAgICAgICAgICAga1NhdmVkUGFzc3dvcmRFbnRyeVZlcmRpY3RIaXN0b2dyYW0sIHZlcmRpY3RfdHlwZSwKKyAgICAgICAgICAgIChMb2dpblJlcHV0YXRpb25DbGllbnRSZXNwb25zZV9WZXJkaWN0VHlwZV9WZXJkaWN0VHlwZV9NQVggKyAxKSk7CiAgICAgICB9CiAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgpAQCAtMjc2LDYgKzI5Myw5IEBACiAgICAgICB9IGVsc2UgaWYgKHBhc3N3b3JkX2FjY291bnRfdHlwZS5hY2NvdW50X3R5cGUoKSA9PQogICAgICAgICAgICAgICAgICBSZXVzZWRQYXNzd29yZEFjY291bnRUeXBlOjpOT05fR0FJQV9FTlRFUlBSSVNFKSB7CiAgICAgICAgIFVNQV9ISVNUT0dSQU1fRU5VTUVSQVRJT04oa0VudGVycHJpc2VQYXNzd29yZFBhZ2VJbmZvSGlzdG9ncmFtLCBhY3Rpb24pOworICAgICAgfSBlbHNlIGlmIChwYXNzd29yZF9hY2NvdW50X3R5cGUuYWNjb3VudF90eXBlKCkgPT0KKyAgICAgICAgICAgICAgICAgUmV1c2VkUGFzc3dvcmRBY2NvdW50VHlwZTo6U0FWRURfUEFTU1dPUkQpIHsKKyAgICAgICAgVU1BX0hJU1RPR1JBTV9FTlVNRVJBVElPTihrU2F2ZWRQYXNzd29yZFBhZ2VJbmZvSGlzdG9ncmFtLCBhY3Rpb24pOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgVU1BX0hJU1RPR1JBTV9FTlVNRVJBVElPTihrTm9uU3luY1Bhc3N3b3JkUGFnZUluZm9IaXN0b2dyYW0sIGFjdGlvbik7CiAgICAgICAgIGlmIChpc19nc3VpdGVfdXNlcikgewpAQCAtMzAxLDYgKzMyMSw5IEBACiAgICAgICAgICAgICAgICAgIFJldXNlZFBhc3N3b3JkQWNjb3VudFR5cGU6Ok5PTl9HQUlBX0VOVEVSUFJJU0UpIHsKICAgICAgICAgVU1BX0hJU1RPR1JBTV9FTlVNRVJBVElPTihrRW50ZXJwcmlzZVBhc3N3b3JkV2FybmluZ0RpYWxvZ0hpc3RvZ3JhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24pOworICAgICAgfSBlbHNlIGlmIChwYXNzd29yZF9hY2NvdW50X3R5cGUuYWNjb3VudF90eXBlKCkgPT0KKyAgICAgICAgICAgICAgICAgUmV1c2VkUGFzc3dvcmRBY2NvdW50VHlwZTo6U0FWRURfUEFTU1dPUkQpIHsKKyAgICAgICAgVU1BX0hJU1RPR1JBTV9FTlVNRVJBVElPTihrU2F2ZWRQYXNzd29yZFdhcm5pbmdEaWFsb2dIaXN0b2dyYW0sIGFjdGlvbik7CiAgICAgICB9IGVsc2UgewogICAgICAgICBVTUFfSElTVE9HUkFNX0VOVU1FUkFUSU9OKGtOb25TeW5jUGFzc3dvcmRXYXJuaW5nRGlhbG9nSGlzdG9ncmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbik7CmRpZmYgLS1naXQgYS9jb21wb25lbnRzL3NlYXJjaF9lbmdpbmVzL3RlbXBsYXRlX3VybC5jYyBiL2NvbXBvbmVudHMvc2VhcmNoX2VuZ2luZXMvdGVtcGxhdGVfdXJsLmNjCmluZGV4IDE1YzVjY2QxZi4uOTZjOTZlMSAxMDA2NDQKLS0tIGEvY29tcG9uZW50cy9zZWFyY2hfZW5naW5lcy90ZW1wbGF0ZV91cmwuY2MKKysrIGIvY29tcG9uZW50cy9zZWFyY2hfZW5naW5lcy90ZW1wbGF0ZV91cmwuY2MKQEAgLTM4Niw2ICszODYsMTEgQEAKICAgICBxdWVyeV9wYXJhbXMucHVzaF9iYWNrKHNlYXJjaF90ZXJtc19hcmdzLmFkZGl0aW9uYWxfcXVlcnlfcGFyYW1zKTsKICAgaWYgKCFndXJsLnF1ZXJ5KCkuZW1wdHkoKSkKICAgICBxdWVyeV9wYXJhbXMucHVzaF9iYWNrKGd1cmwucXVlcnkoKSk7CisgIGlmIChvd25lcl8tPmNyZWF0ZWRfZnJvbV9wbGF5X2FwaSgpKSB7CisgICAgLy8gQXBwZW5kIGF0dHJpYnV0aW9uIHBhcmFtZXRlciB0byBxdWVyeSBvcmlnaW5hdGluZyBmcm9tIFBsYXkgQVBJIHNlYXJjaAorICAgIC8vIGVuZ2luZS4KKyAgICBxdWVyeV9wYXJhbXMucHVzaF9iYWNrKCJjaHJvbWVfZHNlX2F0dHJpYnV0aW9uPTEiKTsKKyAgfQogCiAgIGlmIChxdWVyeV9wYXJhbXMuZW1wdHkoKSkKICAgICByZXR1cm4gdXJsOwpkaWZmIC0tZ2l0IGEvY29tcG9uZW50cy9zZWFyY2hfZW5naW5lcy90ZW1wbGF0ZV91cmxfdW5pdHRlc3QuY2MgYi9jb21wb25lbnRzL3NlYXJjaF9lbmdpbmVzL3RlbXBsYXRlX3VybF91bml0dGVzdC5jYwppbmRleCBhMTlhODM0Li5hOTZjOGEwIDEwMDY0NAotLS0gYS9jb21wb25lbnRzL3NlYXJjaF9lbmdpbmVzL3RlbXBsYXRlX3VybF91bml0dGVzdC5jYworKysgYi9jb21wb25lbnRzL3NlYXJjaF9lbmdpbmVzL3RlbXBsYXRlX3VybF91bml0dGVzdC5jYwpAQCAtODAyLDYgKzgwMiwzMyBAQAogICB9CiB9CiAKKy8vIFRlc3RzIGFwcGVuZGluZyBhdHRyaWJ1dGlvbiBwYXJhbWV0ZXIgdG8gcXVlcmllcyBvcmlnaW5hdGluZyBmcm9tIFBsYXkgQVBJCisvLyBzZWFyY2ggZW5naW5lLgorVEVTVF9GKFRlbXBsYXRlVVJMVGVzdCwgUGxheUFQSUF0dHJpYnV0aW9uKSB7CisgIGNvbnN0IHN0cnVjdCBUZXN0RGF0YSB7CisgICAgY29uc3QgY2hhciogdXJsOworICAgIGJhc2U6OnN0cmluZzE2IHRlcm1zOworICAgIGJvb2wgY3JlYXRlZF9mcm9tX3BsYXlfYXBpOworICAgIGNvbnN0IGNoYXIqIG91dHB1dDsKKyAgfSB0ZXN0X2RhdGFbXSA9IHt7Imh0dHA6Ly9mb28vP3E9e3NlYXJjaFRlcm1zfSIsIEFTQ0lJVG9VVEYxNigiYmFyIiksIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2Zvby8/cT1iYXIifSwKKyAgICAgICAgICAgICAgICAgICB7Imh0dHA6Ly9mb28vP3E9e3NlYXJjaFRlcm1zfSIsIEFTQ0lJVG9VVEYxNigiYmFyIiksIHRydWUsCisgICAgICAgICAgICAgICAgICAgICJodHRwOi8vZm9vLz9xPWJhciZjaHJvbWVfZHNlX2F0dHJpYnV0aW9uPTEifX07CisgIFRlbXBsYXRlVVJMRGF0YSBkYXRhOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJhc2U6OnNpemUodGVzdF9kYXRhKTsgKytpKSB7CisgICAgZGF0YS5TZXRVUkwodGVzdF9kYXRhW2ldLnVybCk7CisgICAgZGF0YS5jcmVhdGVkX2Zyb21fcGxheV9hcGkgPSB0ZXN0X2RhdGFbaV0uY3JlYXRlZF9mcm9tX3BsYXlfYXBpOworICAgIFRlbXBsYXRlVVJMIHVybChkYXRhKTsKKyAgICBFWFBFQ1RfVFJVRSh1cmwudXJsX3JlZigpLklzVmFsaWQoc2VhcmNoX3Rlcm1zX2RhdGFfKSk7CisgICAgQVNTRVJUX1RSVUUodXJsLnVybF9yZWYoKS5TdXBwb3J0c1JlcGxhY2VtZW50KHNlYXJjaF90ZXJtc19kYXRhXykpOworICAgIEdVUkwgcmVzdWx0KHVybC51cmxfcmVmKCkuUmVwbGFjZVNlYXJjaFRlcm1zKAorICAgICAgICBUZW1wbGF0ZVVSTFJlZjo6U2VhcmNoVGVybXNBcmdzKHRlc3RfZGF0YVtpXS50ZXJtcyksCisgICAgICAgIHNlYXJjaF90ZXJtc19kYXRhXykpOworICAgIEFTU0VSVF9UUlVFKHJlc3VsdC5pc192YWxpZCgpKTsKKyAgICBFWFBFQ1RfRVEodGVzdF9kYXRhW2ldLm91dHB1dCwgcmVzdWx0LnNwZWMoKSk7CisgIH0KK30KKwogVEVTVF9GKFRlbXBsYXRlVVJMVGVzdCwgU3VnZ2VzdGlvbnMpIHsKICAgc3RydWN0IFRlc3REYXRhIHsKICAgICBjb25zdCBpbnQgYWNjZXB0ZWRfc3VnZ2VzdGlvbjsKZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvc2VydmljZXMvbGV2ZWxkYi9CVUlMRC5nbiBiL2NvbXBvbmVudHMvc2VydmljZXMvbGV2ZWxkYi9CVUlMRC5nbgppbmRleCBlZTNmYmEzYS4uNjI0Yzg4NyAxMDA2NDQKLS0tIGEvY29tcG9uZW50cy9zZXJ2aWNlcy9sZXZlbGRiL0JVSUxELmduCisrKyBiL2NvbXBvbmVudHMvc2VydmljZXMvbGV2ZWxkYi9CVUlMRC5nbgpAQCAtMjEsMjIgKzIxLDMgQEAKICAgICAiLy90aGlyZF9wYXJ0eS9sZXZlbGRhdGFiYXNlIiwKICAgXQogfQotCi10ZXN0KCJsZXZlbGRiX3NlcnZpY2VfdW5pdHRlc3RzIikgewotICBzb3VyY2VzID0gWwotICAgICJsZXZlbGRiX21vam9fdW5pdHRlc3QuY2MiLAotICBdCi0KLSAgZGVwcyA9IFsKLSAgICAiOmxpYiIsCi0gICAgIi8vYmFzZSIsCi0gICAgIi8vYmFzZS90ZXN0OnRlc3Rfc3VwcG9ydCIsCi0gICAgIi8vY29tcG9uZW50cy9zZXJ2aWNlcy9sZXZlbGRiL3B1YmxpYy9jcHAiLAotICAgICIvL2NvbXBvbmVudHMvc2VydmljZXMvbGV2ZWxkYi9wdWJsaWMvbW9qb20iLAotICAgICIvL21vam8vY29yZS90ZXN0OnJ1bl9hbGxfdW5pdHRlc3RzIiwKLSAgICAiLy9tb2pvL3B1YmxpYy9jcHAvYmluZGluZ3MiLAotICAgICIvL21vam8vcHVibGljL2NwcC9zeXN0ZW0iLAotICAgICIvL3Rlc3RpbmcvZ3Rlc3QiLAotICAgICIvL3RoaXJkX3BhcnR5L2xldmVsZGF0YWJhc2UiLAotICBdCi19CmRpZmYgLS1naXQgYS9jb21wb25lbnRzL3NlcnZpY2VzL2xldmVsZGIvbGV2ZWxkYi50eXBlbWFwIGIvY29tcG9uZW50cy9zZXJ2aWNlcy9sZXZlbGRiL2xldmVsZGIudHlwZW1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFmNWNkZi4uMDAwMDAwMAotLS0gYS9jb21wb25lbnRzL3NlcnZpY2VzL2xldmVsZGIvbGV2ZWxkYi50eXBlbWFwCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAxNyBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotIyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi1tb2pvbSA9ICIvL2NvbXBvbmVudHMvc2VydmljZXMvbGV2ZWxkYi9wdWJsaWMvbW9qb20vbGV2ZWxkYi5tb2pvbSIKLXB1YmxpY19oZWFkZXJzID0gWyAiLy90aGlyZF9wYXJ0eS9sZXZlbGRhdGFiYXNlL2Vudl9jaHJvbWl1bS5oIiBdCi10cmFpdHNfaGVhZGVycyA9IFsgIi8vY29tcG9uZW50cy9zZXJ2aWNlcy9sZXZlbGRiL2xldmVsZGJfbW9qb21fdHJhaXRzLmgiIF0KLXNvdXJjZXMgPSBbCi0gICIvL2NvbXBvbmVudHMvc2VydmljZXMvbGV2ZWxkYi9sZXZlbGRiX21vam9tX3RyYWl0cy5jYyIsCi1dCi1kZXBzID0gW10KLXB1YmxpY19kZXBzID0gWwotICAiLy9tb2pvL3B1YmxpYy9jcHAvYmluZGluZ3MiLAotICAiLy90aGlyZF9wYXJ0eS9sZXZlbGRhdGFiYXNlIiwKLV0KLXR5cGVfbWFwcGluZ3MgPSBbICJsZXZlbGRiLm1vam9tLk9wZW5PcHRpb25zPTo6bGV2ZWxkYl9lbnY6Ok9wdGlvbnMiIF0KZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvc2VydmljZXMvbGV2ZWxkYi9sZXZlbGRiX2RhdGFiYXNlX2ltcGwuY2MgYi9jb21wb25lbnRzL3NlcnZpY2VzL2xldmVsZGIvbGV2ZWxkYl9kYXRhYmFzZV9pbXBsLmNjCmluZGV4IDlmNjA0MmIuLjk5MWQxZDllIDEwMDY0NAotLS0gYS9jb21wb25lbnRzL3NlcnZpY2VzL2xldmVsZGIvbGV2ZWxkYl9kYXRhYmFzZV9pbXBsLmNjCisrKyBiL2NvbXBvbmVudHMvc2VydmljZXMvbGV2ZWxkYi9sZXZlbGRiX2RhdGFiYXNlX2ltcGwuY2MKQEAgLTMwLDcgKzMwLDcgQEAKICAgICBjb25zdCBiYXNlOjpPcHRpb25hbDxiYXNlOjp0cmFjZV9ldmVudDo6TWVtb3J5QWxsb2NhdG9yRHVtcEd1aWQ+JgogICAgICAgICBtZW1vcnlfZHVtcF9pZCwKICAgICBzY29wZWRfcmVmcHRyPGJhc2U6OlNlcXVlbmNlZFRhc2tSdW5uZXI+IGJsb2NraW5nX3Rhc2tfcnVubmVyLAotICAgIE9wZW5DYWxsYmFjayBjYWxsYmFjaykgeworICAgIFN0YXR1c0NhbGxiYWNrIGNhbGxiYWNrKSB7CiAgIHN0ZDo6dW5pcXVlX3B0cjxMZXZlbERCRGF0YWJhc2VJbXBsPiBkYihuZXcgTGV2ZWxEQkRhdGFiYXNlSW1wbCk7CiAgIHN0b3JhZ2U6OkRvbVN0b3JhZ2VEYXRhYmFzZTo6T3BlbkRpcmVjdG9yeSgKICAgICAgIGRpcmVjdG9yeSwgZGJuYW1lLCBvcHRpb25zLCBtZW1vcnlfZHVtcF9pZCwKQEAgLTQ2LDcgKzQ2LDcgQEAKICAgICAgICAgbWVtb3J5X2R1bXBfaWQsCiAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRyYWNraW5nX25hbWUsCiAgICAgc2NvcGVkX3JlZnB0cjxiYXNlOjpTZXF1ZW5jZWRUYXNrUnVubmVyPiBibG9ja2luZ190YXNrX3J1bm5lciwKLSAgICBPcGVuQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICBTdGF0dXNDYWxsYmFjayBjYWxsYmFjaykgewogICBzdGQ6OnVuaXF1ZV9wdHI8TGV2ZWxEQkRhdGFiYXNlSW1wbD4gZGIobmV3IExldmVsREJEYXRhYmFzZUltcGwpOwogICBzdG9yYWdlOjpEb21TdG9yYWdlRGF0YWJhc2U6Ok9wZW5Jbk1lbW9yeSgKICAgICAgIHRyYWNraW5nX25hbWUsIG1lbW9yeV9kdW1wX2lkLCBzdGQ6Om1vdmUoYmxvY2tpbmdfdGFza19ydW5uZXIpLApAQCAtNjEsNyArNjEsNyBAQAogCiB2b2lkIExldmVsREJEYXRhYmFzZUltcGw6OlB1dChjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYga2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHV0Q2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1c0NhbGxiYWNrIGNhbGxiYWNrKSB7CiAgIFJ1bkRhdGFiYXNlVGFzaygKICAgICAgIGJhc2U6OkJpbmRPbmNlKAogICAgICAgICAgIFtdKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBrZXksIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiB2YWx1ZSwKQEAgLTczLDcgKzczLDcgQEAKIH0KIAogdm9pZCBMZXZlbERCRGF0YWJhc2VJbXBsOjpEZWxldGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0ZUNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXNDYWxsYmFjayBjYWxsYmFjaykgewogICBSdW5EYXRhYmFzZVRhc2soYmFzZTo6QmluZE9uY2UoCiAgICAgICAgICAgICAgICAgICAgICAgW10oY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdG9yYWdlOjpEb21TdG9yYWdlRGF0YWJhc2UmIGRiKSB7CkBAIC04NCw3ICs4NCw3IEBACiB9CiAKIHZvaWQgTGV2ZWxEQkRhdGFiYXNlSW1wbDo6RGVsZXRlUHJlZml4ZWQoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGtleV9wcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0ZVByZWZpeGVkQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzQ2FsbGJhY2sgY2FsbGJhY2spIHsKICAgUnVuRGF0YWJhc2VUYXNrKGJhc2U6OkJpbmRPbmNlKAogICAgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RvcmFnZTo6RG9tU3RvcmFnZURhdGFiYXNlJiBkYikgewpAQCAtOTgsMTIgKzk4LDEyIEBACiAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoY2FsbGJhY2spKTsKIH0KIAotdm9pZCBMZXZlbERCRGF0YWJhc2VJbXBsOjpSZXdyaXRlREIoUmV3cml0ZURCQ2FsbGJhY2sgY2FsbGJhY2spIHsKK3ZvaWQgTGV2ZWxEQkRhdGFiYXNlSW1wbDo6UmV3cml0ZURCKFN0YXR1c0NhbGxiYWNrIGNhbGxiYWNrKSB7CiAgIERDSEVDSyhkYXRhYmFzZV8pOwogICBkYXRhYmFzZV8uUG9zdFRhc2tXaXRoVGhpc09iamVjdCgKICAgICAgIEZST01fSEVSRSwKICAgICAgIGJhc2U6OkJpbmRPbmNlKAotICAgICAgICAgIFtdKFJld3JpdGVEQkNhbGxiYWNrIGNhbGxiYWNrLAorICAgICAgICAgIFtdKFN0YXR1c0NhbGxiYWNrIGNhbGxiYWNrLAogICAgICAgICAgICAgIHNjb3BlZF9yZWZwdHI8YmFzZTo6U2VxdWVuY2VkVGFza1J1bm5lcj4gY2FsbGJhY2tfdGFza19ydW5uZXIsCiAgICAgICAgICAgICAgc3RvcmFnZTo6RG9tU3RvcmFnZURhdGFiYXNlKiBkYikgewogICAgICAgICAgICAgY2FsbGJhY2tfdGFza19ydW5uZXItPlBvc3RUYXNrKApAQCAtMTE2LDcgKzExNiw3IEBACiAKIHZvaWQgTGV2ZWxEQkRhdGFiYXNlSW1wbDo6V3JpdGUoCiAgICAgc3RkOjp2ZWN0b3I8bW9qb206OkJhdGNoZWRPcGVyYXRpb25QdHI+IG9wZXJhdGlvbnMsCi0gICAgV3JpdGVDYWxsYmFjayBjYWxsYmFjaykgeworICAgIFN0YXR1c0NhbGxiYWNrIGNhbGxiYWNrKSB7CiAgIFJ1bkRhdGFiYXNlVGFzaygKICAgICAgIGJhc2U6OkJpbmRPbmNlKAogICAgICAgICAgIFtdKHN0ZDo6dmVjdG9yPG1vam9tOjpCYXRjaGVkT3BlcmF0aW9uUHRyPiBvcGVyYXRpb25zLApAQCAtMjUxLDcgKzI1MSw3IEBACiB2b2lkIExldmVsREJEYXRhYmFzZUltcGw6OkNvcHlQcmVmaXhlZCgKICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgc291cmNlX2tleV9wcmVmaXgsCiAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGRlc3RpbmF0aW9uX2tleV9wcmVmaXgsCi0gICAgQ29weVByZWZpeGVkQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICBTdGF0dXNDYWxsYmFjayBjYWxsYmFjaykgewogICBSdW5EYXRhYmFzZVRhc2soYmFzZTo6QmluZE9uY2UoCiAgICAgICAgICAgICAgICAgICAgICAgW10oY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgbmV3X3ByZWZpeCwKQEAgLTI2OCw3ICsyNjgsNyBAQAogfQogCiB2b2lkIExldmVsREJEYXRhYmFzZUltcGw6Ok9uRGF0YWJhc2VPcGVuZWQoCi0gICAgT3BlbkNhbGxiYWNrIGNhbGxiYWNrLAorICAgIFN0YXR1c0NhbGxiYWNrIGNhbGxiYWNrLAogICAgIGJhc2U6OlNlcXVlbmNlQm91bmQ8c3RvcmFnZTo6RG9tU3RvcmFnZURhdGFiYXNlPiBkYXRhYmFzZSwKICAgICBsZXZlbGRiOjpTdGF0dXMgc3RhdHVzKSB7CiAgIGRhdGFiYXNlXyA9IHN0ZDo6bW92ZShkYXRhYmFzZSk7CmRpZmYgLS1naXQgYS9jb21wb25lbnRzL3NlcnZpY2VzL2xldmVsZGIvbGV2ZWxkYl9kYXRhYmFzZV9pbXBsLmggYi9jb21wb25lbnRzL3NlcnZpY2VzL2xldmVsZGIvbGV2ZWxkYl9kYXRhYmFzZV9pbXBsLmgKaW5kZXggYjk4MjA2MzIuLjhiMzJmYjQgMTAwNjQ0Ci0tLSBhL2NvbXBvbmVudHMvc2VydmljZXMvbGV2ZWxkYi9sZXZlbGRiX2RhdGFiYXNlX2ltcGwuaAorKysgYi9jb21wb25lbnRzL3NlcnZpY2VzL2xldmVsZGIvbGV2ZWxkYl9kYXRhYmFzZV9pbXBsLmgKQEAgLTIxLDE3ICsyMSwxNSBAQAogbmFtZXNwYWNlIGxldmVsZGIgewogCiAvLyBBIHRlbXBvcmFyeSB3cmFwcGVyIGFyb3VuZCB0aGUgU3RvcmFnZSBTZXJ2aWNlJ3MgRG9tU3RvcmFnZURhdGFiYXNlIGNsYXNzLAotLy8gaW1wbGVtZW50ZWQgYmVoaW5kIHRoZSBtb2pvbSBpbnRlcmZhY2UgZmFjYWRlIGNvbnN1bWVkIGJ5Ci0vLyBMb2NhbFN0b3JhZ2VDb250ZXh0TW9qbywgU2Vzc2lvblN0b3JhZ2VDb250ZXh0TW9qbywgYW5kIHJlbGF0ZWQgY2xhc3Nlcy4gTm90ZQotLy8gdGhhdCB0aGlzIGlzIG5ldmVyIHVzZWQgdGhyb3VnaCBhbiBhY3R1YWwgbWVzc2FnZSBwaXBlLCBidXQgYWx3YXlzIHZpYSBkaXJlY3QKLS8vIG1ldGhvZCBjYWxscy4KKy8vIGNvbnN1bWVkIGJ5IExvY2FsU3RvcmFnZUNvbnRleHRNb2pvLCBTZXNzaW9uU3RvcmFnZUNvbnRleHRNb2pvLCBhbmQgcmVsYXRlZAorLy8gY2xhc3Nlcy4KIC8vCiAvLyBUT0RPKGh0dHBzOi8vY3JidWcuY29tLzEwMDA5NTkpOiBEZWxldGUgdGhpcyBjbGFzcy4KLWNsYXNzIExldmVsREJEYXRhYmFzZUltcGwgOiBwdWJsaWMgbW9qb206OkxldmVsREJEYXRhYmFzZSB7CitjbGFzcyBMZXZlbERCRGF0YWJhc2VJbXBsIHsKICBwdWJsaWM6Ci0gIHVzaW5nIE9wZW5DYWxsYmFjayA9IGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKG1vam9tOjpEYXRhYmFzZUVycm9yKT47CisgIHVzaW5nIFN0YXR1c0NhbGxiYWNrID0gYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQobW9qb206OkRhdGFiYXNlRXJyb3IpPjsKIAotICB+TGV2ZWxEQkRhdGFiYXNlSW1wbCgpIG92ZXJyaWRlOworICB+TGV2ZWxEQkRhdGFiYXNlSW1wbCgpOwogCiAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8TGV2ZWxEQkRhdGFiYXNlSW1wbD4gT3BlbkRpcmVjdG9yeSgKICAgICAgIGNvbnN0IGxldmVsZGJfZW52OjpPcHRpb25zJiBvcHRpb25zLApAQCAtNDAsMTQgKzM4LDE0IEBACiAgICAgICBjb25zdCBiYXNlOjpPcHRpb25hbDxiYXNlOjp0cmFjZV9ldmVudDo6TWVtb3J5QWxsb2NhdG9yRHVtcEd1aWQ+JgogICAgICAgICAgIG1lbW9yeV9kdW1wX2lkLAogICAgICAgc2NvcGVkX3JlZnB0cjxiYXNlOjpTZXF1ZW5jZWRUYXNrUnVubmVyPiBibG9ja2luZ190YXNrX3J1bm5lciwKLSAgICAgIE9wZW5DYWxsYmFjayBjYWxsYmFjayk7CisgICAgICBTdGF0dXNDYWxsYmFjayBjYWxsYmFjayk7CiAKICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxMZXZlbERCRGF0YWJhc2VJbXBsPiBPcGVuSW5NZW1vcnkoCiAgICAgICBjb25zdCBiYXNlOjpPcHRpb25hbDxiYXNlOjp0cmFjZV9ldmVudDo6TWVtb3J5QWxsb2NhdG9yRHVtcEd1aWQ+JgogICAgICAgICAgIG1lbW9yeV9kdW1wX2lkLAogICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRyYWNraW5nX25hbWUsCiAgICAgICBzY29wZWRfcmVmcHRyPGJhc2U6OlNlcXVlbmNlZFRhc2tSdW5uZXI+IGJsb2NraW5nX3Rhc2tfcnVubmVyLAotICAgICAgT3BlbkNhbGxiYWNrIGNhbGxiYWNrKTsKKyAgICAgIFN0YXR1c0NhbGxiYWNrIGNhbGxiYWNrKTsKIAogICBiYXNlOjpTZXF1ZW5jZUJvdW5kPHN0b3JhZ2U6OkRvbVN0b3JhZ2VEYXRhYmFzZT4mIGRhdGFiYXNlKCkgewogICAgIHJldHVybiBkYXRhYmFzZV87CkBAIC01OSwyOSArNTcsNDMgQEAKICAgLy8gT3ZlcnJpZGRlbiBmcm9tIExldmVsREJEYXRhYmFzZToKICAgdm9pZCBQdXQoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGtleSwKICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHZhbHVlLAotICAgICAgICAgICBQdXRDYWxsYmFjayBjYWxsYmFjaykgb3ZlcnJpZGU7Ci0gIHZvaWQgRGVsZXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBrZXksCi0gICAgICAgICAgICAgIERlbGV0ZUNhbGxiYWNrIGNhbGxiYWNrKSBvdmVycmlkZTsKKyAgICAgICAgICAgU3RhdHVzQ2FsbGJhY2sgY2FsbGJhY2spOworCisgIHZvaWQgRGVsZXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBrZXksIFN0YXR1c0NhbGxiYWNrIGNhbGxiYWNrKTsKKwogICB2b2lkIERlbGV0ZVByZWZpeGVkKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBrZXlfcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgIERlbGV0ZVByZWZpeGVkQ2FsbGJhY2sgY2FsbGJhY2spIG92ZXJyaWRlOwotICB2b2lkIFJld3JpdGVEQihSZXdyaXRlREJDYWxsYmFjayBjYWxsYmFjaykgb3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzQ2FsbGJhY2sgY2FsbGJhY2spOworCisgIHZvaWQgUmV3cml0ZURCKFN0YXR1c0NhbGxiYWNrIGNhbGxiYWNrKTsKKwogICB2b2lkIFdyaXRlKHN0ZDo6dmVjdG9yPG1vam9tOjpCYXRjaGVkT3BlcmF0aW9uUHRyPiBvcGVyYXRpb25zLAotICAgICAgICAgICAgIFdyaXRlQ2FsbGJhY2sgY2FsbGJhY2spIG92ZXJyaWRlOwotICB2b2lkIEdldChjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYga2V5LCBHZXRDYWxsYmFjayBjYWxsYmFjaykgb3ZlcnJpZGU7CisgICAgICAgICAgICAgU3RhdHVzQ2FsbGJhY2sgY2FsbGJhY2spOworCisgIHVzaW5nIEdldENhbGxiYWNrID0gYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQobW9qb206OkRhdGFiYXNlRXJyb3Igc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+Jik+OworICB2b2lkIEdldChjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYga2V5LCBHZXRDYWxsYmFjayBjYWxsYmFjayk7CisKKyAgdXNpbmcgR2V0UHJlZml4ZWRDYWxsYmFjayA9CisgICAgICBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZChtb2pvbTo6RGF0YWJhc2VFcnJvciBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxtb2pvbTo6S2V5VmFsdWVQdHI+KT47CiAgIHZvaWQgR2V0UHJlZml4ZWQoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGtleV9wcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgR2V0UHJlZml4ZWRDYWxsYmFjayBjYWxsYmFjaykgb3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgICAgR2V0UHJlZml4ZWRDYWxsYmFjayBjYWxsYmFjayk7CisKKyAgdXNpbmcgR2V0TWFueUNhbGxiYWNrID0KKyAgICAgIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHN0ZDo6dmVjdG9yPG1vam9tOjpHZXRNYW55UmVzdWx0UHRyPik+OwogICB2b2lkIEdldE1hbnkoc3RkOjp2ZWN0b3I8bW9qb206OkdldE1hbnlSZXF1ZXN0UHRyPiBrZXlzX29yX3ByZWZpeGVzLAotICAgICAgICAgICAgICAgR2V0TWFueUNhbGxiYWNrIGNhbGxiYWNrKSBvdmVycmlkZTsKKyAgICAgICAgICAgICAgIEdldE1hbnlDYWxsYmFjayBjYWxsYmFjayk7CisKICAgdm9pZCBDb3B5UHJlZml4ZWQoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHNvdXJjZV9rZXlfcHJlZml4LAogICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgZGVzdGluYXRpb25fa2V5X3ByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgQ29weVByZWZpeGVkQ2FsbGJhY2sgY2FsbGJhY2spIG92ZXJyaWRlOworICAgICAgICAgICAgICAgICAgICBTdGF0dXNDYWxsYmFjayBjYWxsYmFjayk7CiAKICBwcml2YXRlOgogICB1c2luZyBTdGF0dXNBbmRLZXlWYWx1ZXMgPQogICAgICAgc3RkOjp0dXBsZTxTdGF0dXMsIHN0ZDo6dmVjdG9yPG1vam9tOjpLZXlWYWx1ZVB0cj4+OwogCiAgIHZvaWQgT25EYXRhYmFzZU9wZW5lZCgKLSAgICAgIE9wZW5DYWxsYmFjayBjYWxsYmFjaywKKyAgICAgIFN0YXR1c0NhbGxiYWNrIGNhbGxiYWNrLAogICAgICAgYmFzZTo6U2VxdWVuY2VCb3VuZDxzdG9yYWdlOjpEb21TdG9yYWdlRGF0YWJhc2U+IGRhdGFiYXNlLAogICAgICAgbGV2ZWxkYjo6U3RhdHVzIHN0YXR1cyk7CiAKZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvc2VydmljZXMvbGV2ZWxkYi9sZXZlbGRiX21vam9fdW5pdHRlc3QuY2MgYi9jb21wb25lbnRzL3NlcnZpY2VzL2xldmVsZGIvbGV2ZWxkYl9tb2pvX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTFlZmVmYy4uMDAwMDAwMAotLS0gYS9jb21wb25lbnRzL3NlcnZpY2VzL2xldmVsZGIvbGV2ZWxkYl9tb2pvX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotLy8KLSNpbmNsdWRlICJjb21wb25lbnRzL3NlcnZpY2VzL2xldmVsZGIvbGV2ZWxkYl9tb2pvbV90cmFpdHMuaCIKLQotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2xldmVsZGF0YWJhc2UvbGV2ZWxkYl9jaHJvbWUuaCIKLQotbmFtZXNwYWNlIHsKLQotY2xhc3MgTGV2ZWxEQlNlcnZpY2VNb2pvVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHt9OwotCi19ICAvLyBuYW1lc3BhY2UKLQotVEVTVChMZXZlbERCU2VydmljZU1vam9UZXN0LCBUZXN0U2VyaWFsaXphdGlvbikgewotICBsZXZlbGRiX2Vudjo6T3B0aW9ucyBpbnB1dDsKLSAgLy8gVHdlYWsgYWxsIGlucHV0IHZhbHVlcyB0byBoYXZlIGEgbm9uLWRlZmF1bHQgdmFsdWUuCi0gIGlucHV0LmNyZWF0ZV9pZl9taXNzaW5nID0gIWlucHV0LmNyZWF0ZV9pZl9taXNzaW5nOwotICBpbnB1dC5lcnJvcl9pZl9leGlzdHMgPSAhaW5wdXQuZXJyb3JfaWZfZXhpc3RzOwotICBpbnB1dC5wYXJhbm9pZF9jaGVja3MgPSAhaW5wdXQucGFyYW5vaWRfY2hlY2tzOwotICBpbnB1dC53cml0ZV9idWZmZXJfc2l6ZSArPSAxOwotICBpbnB1dC5tYXhfb3Blbl9maWxlcyArPSAxOwotICBpbnB1dC5ibG9ja19jYWNoZSA9IGxldmVsZGJfY2hyb21lOjpHZXRTaGFyZWRXZWJCbG9ja0NhY2hlKCk7Ci0KLSAgbGV2ZWxkYl9lbnY6Ok9wdGlvbnMgb3V0cHV0OwotICBBU1NFUlRfVFJVRShsZXZlbGRiOjptb2pvbTo6T3Blbk9wdGlvbnM6OkRlc2VyaWFsaXplKAotICAgICAgbGV2ZWxkYjo6bW9qb206Ok9wZW5PcHRpb25zOjpTZXJpYWxpemUoJmlucHV0KSwgJm91dHB1dCkpOwotCi0gIEVYUEVDVF9FUShvdXRwdXQuY3JlYXRlX2lmX21pc3NpbmcsIG91dHB1dC5jcmVhdGVfaWZfbWlzc2luZyk7Ci0gIEVYUEVDVF9FUShvdXRwdXQuZXJyb3JfaWZfZXhpc3RzLCBvdXRwdXQuZXJyb3JfaWZfZXhpc3RzKTsKLSAgRVhQRUNUX0VRKG91dHB1dC5wYXJhbm9pZF9jaGVja3MsIG91dHB1dC5wYXJhbm9pZF9jaGVja3MpOwotICBFWFBFQ1RfRVEob3V0cHV0LndyaXRlX2J1ZmZlcl9zaXplLCBvdXRwdXQud3JpdGVfYnVmZmVyX3NpemUpOwotICBFWFBFQ1RfRVEob3V0cHV0Lm1heF9vcGVuX2ZpbGVzLCBvdXRwdXQubWF4X29wZW5fZmlsZXMpOwotICBFWFBFQ1RfRVEobGV2ZWxkYl9jaHJvbWU6OkdldFNoYXJlZFdlYkJsb2NrQ2FjaGUoKSwgb3V0cHV0LmJsb2NrX2NhY2hlKTsKLX0KZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvc2VydmljZXMvbGV2ZWxkYi9sZXZlbGRiX21vam9tX3RyYWl0cy5jYyBiL2NvbXBvbmVudHMvc2VydmljZXMvbGV2ZWxkYi9sZXZlbGRiX21vam9tX3RyYWl0cy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQwM2MzNS4uMDAwMDAwMAotLS0gYS9jb21wb25lbnRzL3NlcnZpY2VzL2xldmVsZGIvbGV2ZWxkYl9tb2pvbV90cmFpdHMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJjb21wb25lbnRzL3NlcnZpY2VzL2xldmVsZGIvbGV2ZWxkYl9tb2pvbV90cmFpdHMuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2xldmVsZGF0YWJhc2UvZW52X2Nocm9taXVtLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbGV2ZWxkYXRhYmFzZS9sZXZlbGRiX2Nocm9tZS5oIgotCi1uYW1lc3BhY2UgbW9qbyB7Ci0KLWJvb2wgU3RydWN0VHJhaXRzPGxldmVsZGI6Om1vam9tOjpPcGVuT3B0aW9uc0RhdGFWaWV3LCBsZXZlbGRiX2Vudjo6T3B0aW9ucz46OgotICAgIGNyZWF0ZV9pZl9taXNzaW5nKGNvbnN0IGxldmVsZGJfZW52OjpPcHRpb25zJiBvcHRpb25zKSB7Ci0gIHJldHVybiBvcHRpb25zLmNyZWF0ZV9pZl9taXNzaW5nOwotfQotCi1ib29sIFN0cnVjdFRyYWl0czxsZXZlbGRiOjptb2pvbTo6T3Blbk9wdGlvbnNEYXRhVmlldywgbGV2ZWxkYl9lbnY6Ok9wdGlvbnM+OjoKLSAgICBlcnJvcl9pZl9leGlzdHMoY29uc3QgbGV2ZWxkYl9lbnY6Ok9wdGlvbnMmIG9wdGlvbnMpIHsKLSAgcmV0dXJuIG9wdGlvbnMuZXJyb3JfaWZfZXhpc3RzOwotfQotCi1ib29sIFN0cnVjdFRyYWl0czxsZXZlbGRiOjptb2pvbTo6T3Blbk9wdGlvbnNEYXRhVmlldywgbGV2ZWxkYl9lbnY6Ok9wdGlvbnM+OjoKLSAgICBwYXJhbm9pZF9jaGVja3MoY29uc3QgbGV2ZWxkYl9lbnY6Ok9wdGlvbnMmIG9wdGlvbnMpIHsKLSAgcmV0dXJuIG9wdGlvbnMucGFyYW5vaWRfY2hlY2tzOwotfQotCi11aW50NjRfdAotU3RydWN0VHJhaXRzPGxldmVsZGI6Om1vam9tOjpPcGVuT3B0aW9uc0RhdGFWaWV3LCBsZXZlbGRiX2Vudjo6T3B0aW9ucz46OgotICAgIHdyaXRlX2J1ZmZlcl9zaXplKGNvbnN0IGxldmVsZGJfZW52OjpPcHRpb25zJiBvcHRpb25zKSB7Ci0gIHJldHVybiBvcHRpb25zLndyaXRlX2J1ZmZlcl9zaXplOwotfQotCi1pbnQzMl90IFN0cnVjdFRyYWl0czwKLSAgICBsZXZlbGRiOjptb2pvbTo6T3Blbk9wdGlvbnNEYXRhVmlldywKLSAgICBsZXZlbGRiX2Vudjo6T3B0aW9ucz46Om1heF9vcGVuX2ZpbGVzKGNvbnN0IGxldmVsZGJfZW52OjpPcHRpb25zJiBvcHRpb25zKSB7Ci0gIHJldHVybiBvcHRpb25zLm1heF9vcGVuX2ZpbGVzOwotfQotCi1sZXZlbGRiOjptb2pvbTo6U2hhcmVkUmVhZENhY2hlCi1TdHJ1Y3RUcmFpdHM8bGV2ZWxkYjo6bW9qb206Ok9wZW5PcHRpb25zRGF0YVZpZXcsIGxldmVsZGJfZW52OjpPcHRpb25zPjo6Ci0gICAgc2hhcmVkX2Jsb2NrX3JlYWRfY2FjaGUoY29uc3QgbGV2ZWxkYl9lbnY6Ok9wdGlvbnMmIG9wdGlvbnMpIHsKLSAgLy8gVGhlIE1vam8gd3JhcHBlciBmb3IgbGV2ZWxkYiBvbmx5IHN1cHBvcnRzIHVzaW5nIG9uZSBvZiB0d28gZGlmZmVyZW50Ci0gIC8vIHNoYXJlZCBjYWNoZXMuIENocm9tZSdzIE1vam8gd3JhcHBlciBkb2VzIG5vdCBjdXJyZW50bHkgc3VwcG9ydCBjdXN0b20KLSAgLy8gY2FjaGVzLCBub3IgbnVsbHB0ciB0byBoYXZlIGxldmVsZGIgY3JlYXRlIHRoZSBibG9jayByZWFkIGNhY2hlLgotICBpZiAoIW9wdGlvbnMuYmxvY2tfY2FjaGUpIHsKLSAgICAvLyBTcGVjaWZ5IGVpdGhlciBEZWZhdWx0IG9yIFdlYi4KLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGxldmVsZGI6Om1vam9tOjpTaGFyZWRSZWFkQ2FjaGU6OkRlZmF1bHQ7Ci0gIH0KLSAgaWYgKG9wdGlvbnMuYmxvY2tfY2FjaGUgPT0gbGV2ZWxkYl9jaHJvbWU6OkdldFNoYXJlZFdlYkJsb2NrQ2FjaGUoKSkKLSAgICByZXR1cm4gbGV2ZWxkYjo6bW9qb206OlNoYXJlZFJlYWRDYWNoZTo6V2ViOwotCi0gIGxldmVsZGJfZW52OjpPcHRpb25zIGRlZmF1bHRfb3B0aW9uczsKLSAgLy8gSWYgZmFpbGluZyBzZWUgY29tbWVudCBhYm92ZS4KLSAgRENIRUNLX0VRKGRlZmF1bHRfb3B0aW9ucy5ibG9ja19jYWNoZSwgb3B0aW9ucy5ibG9ja19jYWNoZSk7Ci0KLSAgcmV0dXJuIGxldmVsZGI6Om1vam9tOjpTaGFyZWRSZWFkQ2FjaGU6OkRlZmF1bHQ7Ci19Ci0KLWJvb2wgU3RydWN0VHJhaXRzPGxldmVsZGI6Om1vam9tOjpPcGVuT3B0aW9uc0RhdGFWaWV3LCBsZXZlbGRiX2Vudjo6T3B0aW9ucz46OgotICAgIFJlYWQobGV2ZWxkYjo6bW9qb206Ok9wZW5PcHRpb25zRGF0YVZpZXcgZGF0YSwgbGV2ZWxkYl9lbnY6Ok9wdGlvbnMqIG91dCkgewotICBvdXQtPmNyZWF0ZV9pZl9taXNzaW5nID0gZGF0YS5jcmVhdGVfaWZfbWlzc2luZygpOwotICBvdXQtPmVycm9yX2lmX2V4aXN0cyA9IGRhdGEuZXJyb3JfaWZfZXhpc3RzKCk7Ci0gIG91dC0+cGFyYW5vaWRfY2hlY2tzID0gZGF0YS5wYXJhbm9pZF9jaGVja3MoKTsKLSAgb3V0LT53cml0ZV9idWZmZXJfc2l6ZSA9IGRhdGEud3JpdGVfYnVmZmVyX3NpemUoKTsKLSAgb3V0LT5tYXhfb3Blbl9maWxlcyA9IGRhdGEubWF4X29wZW5fZmlsZXMoKTsKLSAgc3dpdGNoIChkYXRhLnNoYXJlZF9ibG9ja19yZWFkX2NhY2hlKCkpIHsKLSAgICBjYXNlIGxldmVsZGI6Om1vam9tOjpTaGFyZWRSZWFkQ2FjaGU6OkRlZmF1bHQ6IHsKLSAgICAgIGxldmVsZGJfZW52OjpPcHRpb25zIG9wdGlvbnM7Ci0gICAgICBvdXQtPmJsb2NrX2NhY2hlID0gb3B0aW9ucy5ibG9ja19jYWNoZTsKLSAgICB9IGJyZWFrOwotICAgIGNhc2UgbGV2ZWxkYjo6bW9qb206OlNoYXJlZFJlYWRDYWNoZTo6V2ViOgotICAgICAgb3V0LT5ibG9ja19jYWNoZSA9IGxldmVsZGJfY2hyb21lOjpHZXRTaGFyZWRXZWJCbG9ja0NhY2hlKCk7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbW9qbwpkaWZmIC0tZ2l0IGEvY29tcG9uZW50cy9zZXJ2aWNlcy9sZXZlbGRiL2xldmVsZGJfbW9qb21fdHJhaXRzLmggYi9jb21wb25lbnRzL3NlcnZpY2VzL2xldmVsZGIvbGV2ZWxkYl9tb2pvbV90cmFpdHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJiZmFmZC4uMDAwMDAwMAotLS0gYS9jb21wb25lbnRzL3NlcnZpY2VzL2xldmVsZGIvbGV2ZWxkYl9tb2pvbV90cmFpdHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBDT01QT05FTlRTX1NFUlZJQ0VTX0xFVkVMREJfTEVWRUxEQl9NT0pPTV9UUkFJVFNfSF8KLSNkZWZpbmUgQ09NUE9ORU5UU19TRVJWSUNFU19MRVZFTERCX0xFVkVMREJfTU9KT01fVFJBSVRTX0hfCi0KLSNpbmNsdWRlICJjb21wb25lbnRzL3NlcnZpY2VzL2xldmVsZGIvcHVibGljL21vam9tL2xldmVsZGIubW9qb20uaCIKLQotbmFtZXNwYWNlIG1vam8gewotCi10ZW1wbGF0ZSA8Pgotc3RydWN0IFN0cnVjdFRyYWl0czxsZXZlbGRiOjptb2pvbTo6T3Blbk9wdGlvbnNEYXRhVmlldywgbGV2ZWxkYl9lbnY6Ok9wdGlvbnM+IHsKLSAgc3RhdGljIGJvb2wgY3JlYXRlX2lmX21pc3NpbmcoY29uc3QgbGV2ZWxkYl9lbnY6Ok9wdGlvbnMmIG9wdGlvbnMpOwotICBzdGF0aWMgYm9vbCBlcnJvcl9pZl9leGlzdHMoY29uc3QgbGV2ZWxkYl9lbnY6Ok9wdGlvbnMmIG9wdGlvbnMpOwotICBzdGF0aWMgYm9vbCBwYXJhbm9pZF9jaGVja3MoY29uc3QgbGV2ZWxkYl9lbnY6Ok9wdGlvbnMmIG9wdGlvbnMpOwotICBzdGF0aWMgdWludDY0X3Qgd3JpdGVfYnVmZmVyX3NpemUoY29uc3QgbGV2ZWxkYl9lbnY6Ok9wdGlvbnMmIG9wdGlvbnMpOwotICBzdGF0aWMgaW50MzJfdCBtYXhfb3Blbl9maWxlcyhjb25zdCBsZXZlbGRiX2Vudjo6T3B0aW9ucyYgb3B0aW9ucyk7Ci0gIHN0YXRpYyA6OmxldmVsZGI6Om1vam9tOjpTaGFyZWRSZWFkQ2FjaGUgc2hhcmVkX2Jsb2NrX3JlYWRfY2FjaGUoCi0gICAgICBjb25zdCBsZXZlbGRiX2Vudjo6T3B0aW9ucyYgb3B0aW9ucyk7Ci0gIHN0YXRpYyBib29sIFJlYWQoOjpsZXZlbGRiOjptb2pvbTo6T3Blbk9wdGlvbnNEYXRhVmlldyBkYXRhLAotICAgICAgICAgICAgICAgICAgIGxldmVsZGJfZW52OjpPcHRpb25zKiBvdXQpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1vam8KLQotI2VuZGlmICAvLyBDT01QT05FTlRTX1NFUlZJQ0VTX0xFVkVMREJfTEVWRUxEQl9NT0pPTV9UUkFJVFNfSF8KZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvc2VydmljZXMvbGV2ZWxkYi9wdWJsaWMvbW9qb20vQlVJTEQuZ24gYi9jb21wb25lbnRzL3NlcnZpY2VzL2xldmVsZGIvcHVibGljL21vam9tL0JVSUxELmduCmluZGV4IGY2NDgzOGUuLjY0MzQyMjEgMTAwNjQ0Ci0tLSBhL2NvbXBvbmVudHMvc2VydmljZXMvbGV2ZWxkYi9wdWJsaWMvbW9qb20vQlVJTEQuZ24KKysrIGIvY29tcG9uZW50cy9zZXJ2aWNlcy9sZXZlbGRiL3B1YmxpYy9tb2pvbS9CVUlMRC5nbgpAQCAtNSwxMyArNSw3IEBACiBpbXBvcnQoIi8vbW9qby9wdWJsaWMvdG9vbHMvYmluZGluZ3MvbW9qb20uZ25pIikKIAogbW9qb20oIm1vam9tIikgewotICBzdXBwb3J0X2xhenlfc2VyaWFsaXphdGlvbiA9IHRydWUKLQogICBzb3VyY2VzID0gWwogICAgICJsZXZlbGRiLm1vam9tIiwKICAgXQotCi0gIHB1YmxpY19kZXBzID0gWwotICAgICIvL21vam8vcHVibGljL21vam9tL2Jhc2UiLAotICBdCiB9CmRpZmYgLS1naXQgYS9jb21wb25lbnRzL3NlcnZpY2VzL2xldmVsZGIvcHVibGljL21vam9tL2xldmVsZGIubW9qb20gYi9jb21wb25lbnRzL3NlcnZpY2VzL2xldmVsZGIvcHVibGljL21vam9tL2xldmVsZGIubW9qb20KaW5kZXggOTM4MWViZC4uZTAwODQ4MiAxMDA2NDQKLS0tIGEvY29tcG9uZW50cy9zZXJ2aWNlcy9sZXZlbGRiL3B1YmxpYy9tb2pvbS9sZXZlbGRiLm1vam9tCisrKyBiL2NvbXBvbmVudHMvc2VydmljZXMvbGV2ZWxkYi9wdWJsaWMvbW9qb20vbGV2ZWxkYi5tb2pvbQpAQCAtNCw4ICs0LDYgQEAKIAogbW9kdWxlIGxldmVsZGIubW9qb207CiAKLWltcG9ydCAibW9qby9wdWJsaWMvbW9qb20vYmFzZS91bmd1ZXNzYWJsZV90b2tlbi5tb2pvbSI7Ci0KIGVudW0gRGF0YWJhc2VFcnJvciB7CiAgIE9LLAogICBOT1RfRk9VTkQsCkBAIC00Nyw4NSArNDUsMyBAQAogICBhcnJheTx1aW50OD4ga2V5X3ZhbHVlOwogfTsKIAotZW51bSBTaGFyZWRSZWFkQ2FjaGUgewotICBEZWZhdWx0LAotICBXZWIsCi19OwotCi0vLyBPcHRpb25zIHdoaWNoIGNvbnRyb2wgdGhlIGJlaGF2aW9yIG9mIGEgZGF0YWJhc2UuIChUaGlzIHN0cnVjdCBjb3JyZXNwb25kcwotLy8gd2l0aCB0aGUgc3RydWN0IGluIGxldmVsZGIncyBvcHRpb25zLmguKQotLy8KLS8vIE5vdGU6IFRoaXMgc3RydWN0IGRvZXMgbm90IGhhdmUgZGVmYXVsdCB2YWx1ZXMuIFRoZSB2YWx1ZXMgYXJlIHNldCBieSBhCi0vLyBzdHJ1Y3QgdHJhaXQgd2hpY2ggY29waWVzIHZhbHVlcyB0by9mcm9tIGEgbGV2ZWxkYl9lbnY6Ok9wdGlvbnMgaW5zdGFuY2UuCi1zdHJ1Y3QgT3Blbk9wdGlvbnMgewotICAvLyBUT0RPKGVyZyk6IEZpbmQgYWxsIGNvbXBhcmF0b3JzIGFuZCBjb3B5IHRoZW0gaW50byB0aGUgc2VydmljZS4KLQotICAvLyBJZiB0cnVlLCB0aGUgZGF0YWJhc2Ugd2lsbCBiZSBjcmVhdGVkIGlmIGl0IGlzIG1pc3NpbmcuCi0gIGJvb2wgY3JlYXRlX2lmX21pc3Npbmc7Ci0KLSAgLy8gSWYgdHJ1ZSwgYW4gZXJyb3IgaXMgcmFpc2VkIGlmIHRoZSBkYXRhYmFzZSBhbHJlYWR5IGV4aXN0cy4KLSAgYm9vbCBlcnJvcl9pZl9leGlzdHM7Ci0KLSAgLy8gSWYgdHJ1ZSwgdGhlIGltcGxlbWVudGF0aW9uIHdpbGwgZG8gYWdncmVzc2l2ZSBjaGVja2luZyBvZiB0aGUKLSAgLy8gZGF0YSBpdCBpcyBwcm9jZXNzaW5nIGFuZCB3aWxsIHN0b3AgZWFybHkgaWYgaXQgZGV0ZWN0cyBhbnkKLSAgLy8gZXJyb3JzLgotICBib29sIHBhcmFub2lkX2NoZWNrczsKLQotICAvLyBBbW91bnQgb2YgZGF0YSB0byBidWlsZCB1cCBpbiBtZW1vcnkgKGJhY2tlZCBieSBhbiB1bnNvcnRlZCBsb2cKLSAgLy8gb24gZGlzaykgYmVmb3JlIGNvbnZlcnRpbmcgdG8gYSBzb3J0ZWQgb24tZGlzayBmaWxlLgotICB1aW50NjQgd3JpdGVfYnVmZmVyX3NpemU7Ci0KLSAgLy8gTnVtYmVyIG9mIG9wZW4gZmlsZXMgdGhhdCBjYW4gYmUgdXNlZCBieSB0aGUgREIuCi0gIGludDMyIG1heF9vcGVuX2ZpbGVzOwotCi0gIC8vIFRoZSBzaGFyZWQgcmVhZCBjYWNoZSB0byB1c2UuCi0gIFNoYXJlZFJlYWRDYWNoZSBzaGFyZWRfYmxvY2tfcmVhZF9jYWNoZSA9IFNoYXJlZFJlYWRDYWNoZS5EZWZhdWx0OwotfTsKLQotLy8gQSBsZXZlbGRiIGRhdGFiYXNlLgotaW50ZXJmYWNlIExldmVsREJEYXRhYmFzZSB7Ci0gIC8vIEJhc2ljIEludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLy8gU2V0cyB0aGUgZGF0YWJhc2UgZW50cnkgZm9yICJrZXkiIHRvICJ2YWx1ZSIuIFJldHVybnMgT0sgb24gc3VjY2Vzcy4KLSAgUHV0KGFycmF5PHVpbnQ4PiBrZXksIGFycmF5PHVpbnQ4PiB2YWx1ZSkgPT4gKERhdGFiYXNlRXJyb3Igc3RhdHVzKTsKLQotICAvLyBSZW1vdmUgdGhlIGRhdGFiYXNlIGVudHJ5IChpZiBhbnkpIGZvciAia2V5Ii4gIFJldHVybnMgT0sgb24KLSAgLy8gc3VjY2VzcywgYW5kIGEgbm9uLU9LIHN0YXR1cyBvbiBlcnJvci4gIEl0IGlzIG5vdCBhbiBlcnJvciBpZiAia2V5IgotICAvLyBkaWQgbm90IGV4aXN0IGluIHRoZSBkYXRhYmFzZS4KLSAgRGVsZXRlKGFycmF5PHVpbnQ4PiBrZXkpID0+IChEYXRhYmFzZUVycm9yIHN0YXR1cyk7Ci0KLSAgRGVsZXRlUHJlZml4ZWQoYXJyYXk8dWludDg+IGtleV9wcmVmaXgpID0+IChEYXRhYmFzZUVycm9yIHN0YXR1cyk7Ci0KLSAgLy8gUmV3cml0ZXMgdGhlIGRhdGFiYXNlIHRvIHJlbW92ZSB0cmFjZXMgb2YgZGVsZXRlZCBlbnRyaWVzIGZyb20gZGlzay4KLSAgLy8gUmV0dXJucyBPSyBvbiBzdWNjZXNzLiBBIG5vbi1PSyBlcnJvciBtZWFucyB0aGF0IHRoZSByZXdyaXRlIGZhaWxlZC4KLSAgLy8gSWYgdGhlIHN0YXR1cyBpcyBub3QgT0ssIHRoZSBkYXRhYmFzZSBjYW4gYmVjb21lIHVudXNhYmxlIHdoaWNoIHdpbGwgY2xvc2UKLSAgLy8gdGhlIG1vam8gY29ubmVjdGlvbi4KLSAgUmV3cml0ZURCKCkgPT4gKERhdGFiYXNlRXJyb3Igc3RhdHVzKTsKLQotICAvLyBBdG9taWNhbGx5IHBlcmZvcm1zIGFsbCB8b3BlcmF0aW9uc3wuCi0gIC8vIFRoZSBERUxFVEVfUFJFRklYRURfS0VZIGFwcGxpZXMgdG8gYWxsIGtleXMgdGhhdCBleGlzdCBiZWZvcmUgdGhlc2UKLSAgLy8gb3BlcmF0aW9ucyBleGVjdXRlLiBJZiBhICdwdXQnIG9wZXJhdGlvbiBwcmVjZWRlcyBhIGRlbGV0ZSBwcmVmaXgsIHRoZW4gaXQKLSAgLy8gd2lsbCBvbmx5IGJlIGRlbGV0ZWQgaWYgaXQgd2FzIGEgcHJldmlvdXNseS1wb3B1bGF0ZWQga2V5IGluIHRoZSBkYXRhYmFzZS4KLSAgLy8gVGhlIENPUFlfUFJFRklYRURfS0VZIG9wZXJhdGlvbnMgd2lsbCBhbHdheXMgaWdub3JlIGFsbCBvdGhlciBjaGFuZ2VzIGluCi0gIC8vIHRoZSBvcGVyYXRpb25zIGJhdGNoLiBJdCB3aWxsIG5vdCBjb3B5IHJlY29yZHMgdGhhdCB3ZXJlIGluc2VydGVkIGVhcmxpZXIKLSAgLy8gaW4gdGhlIG9wZXJhdGlvbnMgbGlzdC4KLSAgV3JpdGUoYXJyYXk8QmF0Y2hlZE9wZXJhdGlvbj4gb3BlcmF0aW9ucykgPT4gKERhdGFiYXNlRXJyb3Igc3RhdHVzKTsKLQotICBHZXQoYXJyYXk8dWludDg+IGtleSkgPT4gKERhdGFiYXNlRXJyb3Igc3RhdHVzLCBhcnJheTx1aW50OD4gdmFsdWUpOwotCi0gIEdldFByZWZpeGVkKGFycmF5PHVpbnQ4PiBrZXlfcHJlZml4KQotICAgICAgPT4gKERhdGFiYXNlRXJyb3Igc3RhdHVzLCBhcnJheTxLZXlWYWx1ZT4gZGF0YSk7Ci0KLSAgLy8gR2V0IG11bHRpcGxlIGtleXMgYW5kIGtleSBwcmVmaXhlcyBhbmQgcmV0dXJuIGNvcnJlc3BvbmRpbmcgdmFsdWVzIG9yCi0gIC8vIG5vbi1PSyBlcnJvciBpbiB0aGUgc2FtZSBvcmRlci4gRWFjaCByZXF1ZXN0IGhhcyBhIGNvcnJlc3BvbmRpbmcgcmVzdWx0Ci0gIC8vIGluIHRoZSBzYW1lIGFycmF5IHBvc2l0aW9uLiBBIHJlc3VsdCBjYW4gb25seSBiZSBlaXRoZXIgYSBub24tT0sKLSAgLy8gZGIgc3RhdHVzIG9yIGEgdmFsdWUgZm9yIHRoZSBrZXkgb3Iga2V5IHByZWZpeC4KLSAgR2V0TWFueShhcnJheTxHZXRNYW55UmVxdWVzdD4ga2V5c19vcl9wcmVmaXhlcykKLSAgICAgID0+IChhcnJheTxHZXRNYW55UmVzdWx0PiBkYXRhKTsKLQotICAvLyBDb3BpZXMgYWxsIGRhdGEgZnJvbSB0aGUgc291cmNlIHByZWZpeCB0byB0aGUgZGVzdGluYXRpb24gcHJlZml4LiBVc2VmdWwKLSAgLy8gZm9yIGRlZXAgY29waWVzLgotICBDb3B5UHJlZml4ZWQoYXJyYXk8dWludDg+IHNvdXJjZV9rZXlfcHJlZml4LAotICAgICAgICAgICAgICAgYXJyYXk8dWludDg+IGRlc3RpbmF0aW9uX2tleV9wcmVmaXgpCi0gICAgICA9PiAoRGF0YWJhc2VFcnJvciBzdGF0dXMpOwotfTsKZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvc2VydmljZXMvc3RvcmFnZS9kb21fc3RvcmFnZS9kb21fc3RvcmFnZV9kYXRhYmFzZS5jYyBiL2NvbXBvbmVudHMvc2VydmljZXMvc3RvcmFnZS9kb21fc3RvcmFnZS9kb21fc3RvcmFnZV9kYXRhYmFzZS5jYwppbmRleCBlZGRkNGIxYy4uNDNlZTcxZCAxMDA2NDQKLS0tIGEvY29tcG9uZW50cy9zZXJ2aWNlcy9zdG9yYWdlL2RvbV9zdG9yYWdlL2RvbV9zdG9yYWdlX2RhdGFiYXNlLmNjCisrKyBiL2NvbXBvbmVudHMvc2VydmljZXMvc3RvcmFnZS9kb21fc3RvcmFnZS9kb21fc3RvcmFnZV9kYXRhYmFzZS5jYwpAQCAtMTg1LDYgKzE4NSw4IEBACiBEb21TdG9yYWdlRGF0YWJhc2U6On5Eb21TdG9yYWdlRGF0YWJhc2UoKSB7CiAgIGJhc2U6OnRyYWNlX2V2ZW50OjpNZW1vcnlEdW1wTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+VW5yZWdpc3RlckR1bXBQcm92aWRlcigKICAgICAgIHRoaXMpOworICBpZiAoZGVzdHJ1Y3Rpb25fY2FsbGJhY2tfKQorICAgIHN0ZDo6bW92ZShkZXN0cnVjdGlvbl9jYWxsYmFja18pLlJ1bigpOwogfQogCiAvLyBzdGF0aWMKQEAgLTMzNyw2ICszMzksOCBAQAogICAgIGxldmVsZGI6OldyaXRlQmF0Y2gqIGJhdGNoKSBjb25zdCB7CiAgIGlmICghZGJfKQogICAgIHJldHVybiBTdGF0dXM6OklPRXJyb3Ioa0ludmFsaWREYXRhYmFzZU1lc3NhZ2UpOworICBpZiAoZmFpbF9jb21taXRzX2Zvcl90ZXN0aW5nXykKKyAgICByZXR1cm4gU3RhdHVzOjpJT0Vycm9yKCJTaW11bGF0ZWQgSS9PIEVycm9yIik7CiAgIHJldHVybiBkYl8tPldyaXRlKGxldmVsZGI6OldyaXRlT3B0aW9ucygpLCBiYXRjaCk7CiB9CiAKZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvc2VydmljZXMvc3RvcmFnZS9kb21fc3RvcmFnZS9kb21fc3RvcmFnZV9kYXRhYmFzZS5oIGIvY29tcG9uZW50cy9zZXJ2aWNlcy9zdG9yYWdlL2RvbV9zdG9yYWdlL2RvbV9zdG9yYWdlX2RhdGFiYXNlLmgKaW5kZXggMThlM2U4ZS4uZmZlMTQyYzMgMTAwNjQ0Ci0tLSBhL2NvbXBvbmVudHMvc2VydmljZXMvc3RvcmFnZS9kb21fc3RvcmFnZS9kb21fc3RvcmFnZV9kYXRhYmFzZS5oCisrKyBiL2NvbXBvbmVudHMvc2VydmljZXMvc3RvcmFnZS9kb21fc3RvcmFnZS9kb21fc3RvcmFnZV9kYXRhYmFzZS5oCkBAIC0xNDYsNiArMTQ2LDEyIEBACiAgIC8vIHVzYWJsZTsgaW4gc3VjaCBjYXNlcywgYWxsIGZ1dHVyZSBvcGVyYXRpb25zIHdpbGwgcmV0dXJuIGFuIElPRXJyb3Igc3RhdHVzLgogICBTdGF0dXMgUmV3cml0ZURCKCk7CiAKKyAgdm9pZCBTZXREZXN0cnVjdGlvbkNhbGxiYWNrRm9yVGVzdGluZyhiYXNlOjpPbmNlQ2xvc3VyZSBjYWxsYmFjaykgeworICAgIGRlc3RydWN0aW9uX2NhbGxiYWNrXyA9IHN0ZDo6bW92ZShjYWxsYmFjayk7CisgIH0KKworICB2b2lkIE1ha2VBbGxDb21taXRzRmFpbEZvclRlc3RpbmcoKSB7IGZhaWxfY29tbWl0c19mb3JfdGVzdGluZ18gPSB0cnVlOyB9CisKICBwcml2YXRlOgogICBmcmllbmQgY2xhc3MgYmFzZTo6U2VxdWVuY2VCb3VuZDxEb21TdG9yYWdlRGF0YWJhc2U+OwogCkBAIC0xOTQsNiArMjAwLDEzIEBACiAgICAgICBtZW1vcnlfZHVtcF9pZF87CiAgIHN0ZDo6dW5pcXVlX3B0cjxsZXZlbGRiOjpEQj4gZGJfOwogCisgIC8vIENhdXNlcyBhbGwgY2FsbHMgdG8gfENvbW1pdCgpfCB0byBmYWlsIHdpdGggYW4gSU9FcnJvciBmb3Igc2ltdWxhdGVkCisgIC8vIGRpc2sgZmFpbHVyZXMgaW4gdGVzdGluZy4KKyAgYm9vbCBmYWlsX2NvbW1pdHNfZm9yX3Rlc3RpbmdfID0gZmFsc2U7CisKKyAgLy8gQ2FsbGJhY2sgdG8gcnVuIG9uIGRlc3RydWN0aW9uIGluIHRlc3RzLgorICBiYXNlOjpPbmNlQ2xvc3VyZSBkZXN0cnVjdGlvbl9jYWxsYmFja187CisKICAgU0VRVUVOQ0VfQ0hFQ0tFUihzZXF1ZW5jZV9jaGVja2VyXyk7CiAKICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKERvbVN0b3JhZ2VEYXRhYmFzZSk7CmRpZmYgLS1naXQgYS9jb21wb25lbnRzL3RyYW5zbGF0ZS9jb250ZW50L0RFUFMgYi9jb21wb25lbnRzL3RyYW5zbGF0ZS9jb250ZW50L0RFUFMKaW5kZXggODNjMmNlNC4uYzU3NDg2YiAxMDA2NDQKLS0tIGEvY29tcG9uZW50cy90cmFuc2xhdGUvY29udGVudC9ERVBTCisrKyBiL2NvbXBvbmVudHMvdHJhbnNsYXRlL2NvbnRlbnQvREVQUwpAQCAtMSw2ICsxLDQgQEAKIGluY2x1ZGVfcnVsZXMgPSBbCiAgICIrY29udGVudC9wdWJsaWMvY29tbW9uIiwKICAgIittb2pvL3B1YmxpYyIsCi0gICIrc2VydmljZXMvbmV0d29yay9wdWJsaWMiLAotICAiK3RoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYyIsCiBdCmRpZmYgLS1naXQgYS9jb21wb25lbnRzL3RyYW5zbGF0ZS9jb250ZW50L2Jyb3dzZXIvY29udGVudF90cmFuc2xhdGVfZHJpdmVyLmNjIGIvY29tcG9uZW50cy90cmFuc2xhdGUvY29udGVudC9icm93c2VyL2NvbnRlbnRfdHJhbnNsYXRlX2RyaXZlci5jYwppbmRleCA5NGYyZDFiLi40ZGVhYzI2IDEwMDY0NAotLS0gYS9jb21wb25lbnRzL3RyYW5zbGF0ZS9jb250ZW50L2Jyb3dzZXIvY29udGVudF90cmFuc2xhdGVfZHJpdmVyLmNjCisrKyBiL2NvbXBvbmVudHMvdHJhbnNsYXRlL2NvbnRlbnQvYnJvd3Nlci9jb250ZW50X3RyYW5zbGF0ZV9kcml2ZXIuY2MKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlICJjb21wb25lbnRzL3RyYW5zbGF0ZS9jb250ZW50L2Jyb3dzZXIvY29udGVudF9yZWNvcmRfcGFnZV9sYW5ndWFnZS5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvdHJhbnNsYXRlL2NvcmUvYnJvd3Nlci90cmFuc2xhdGVfZG93bmxvYWRfbWFuYWdlci5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvdHJhbnNsYXRlL2NvcmUvYnJvd3Nlci90cmFuc2xhdGVfbWFuYWdlci5oIgotI2luY2x1ZGUgImNvbXBvbmVudHMvdHJhbnNsYXRlL2NvcmUvY29tbW9uL3RyYW5zbGF0ZV91dGlsLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy91a20vY29udGVudC9zb3VyY2VfdXJsX3JlY29yZGVyLmgiCiAjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvYnJvd3Nlci9icm93c2VyX2NvbnRleHQuaCIKICNpbmNsdWRlICJjb250ZW50L3B1YmxpYy9icm93c2VyL25hdmlnYXRpb25fY29udHJvbGxlci5oIgpAQCAtMzAsMTQgKzI5LDEyIEBACiAjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvYnJvd3Nlci9uYXZpZ2F0aW9uX2hhbmRsZS5oIgogI2luY2x1ZGUgImNvbnRlbnQvcHVibGljL2Jyb3dzZXIvcGFnZV9uYXZpZ2F0b3IuaCIKICNpbmNsdWRlICJjb250ZW50L3B1YmxpYy9icm93c2VyL3JlbmRlcl9mcmFtZV9ob3N0LmgiCi0jaW5jbHVkZSAiY29udGVudC9wdWJsaWMvYnJvd3Nlci9yZW5kZXJfcHJvY2Vzc19ob3N0LmgiCiAjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvYnJvd3Nlci9yZW5kZXJfdmlld19ob3N0LmgiCiAjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvYnJvd3Nlci93ZWJfY29udGVudHMuaCIKICNpbmNsdWRlICJjb250ZW50L3B1YmxpYy9jb21tb24vcmVmZXJyZXIuaCIKICNpbmNsdWRlICJjb250ZW50L3B1YmxpYy9jb21tb24vd2ViX3ByZWZlcmVuY2VzLmgiCiAjaW5jbHVkZSAibmV0L2h0dHAvaHR0cF9zdGF0dXNfY29kZS5oIgogI2luY2x1ZGUgInNlcnZpY2VzL21ldHJpY3MvcHVibGljL2NwcC91a21fc291cmNlX2lkLmgiCi0jaW5jbHVkZSAic2VydmljZXMvbmV0d29yay9wdWJsaWMvbW9qb20vbmV0d29ya19jb250ZXh0Lm1vam9tLmgiCiAjaW5jbHVkZSAidXJsL2d1cmwuaCIKIAogbmFtZXNwYWNlIHRyYW5zbGF0ZSB7CkBAIC0xMjUsMjkgKzEyMiw2IEBACiAgICAgb2JzZXJ2ZXIuT25Jc1BhZ2VUcmFuc2xhdGVkQ2hhbmdlZCh3ZWJfY29udGVudHMpOwogfQogCi1uZXR3b3JrOjptb2pvbTo6VVJMTG9hZGVyRmFjdG9yeVB0cgotQ29udGVudFRyYW5zbGF0ZURyaXZlcjo6Q3JlYXRlVVJMTG9hZGVyRmFjdG9yeSgpIHsKLSAgLy8gRmluZCB0aGUgcmVuZGVyZXIgcHJvY2VzcyB0aGF0IHdpbGwgbmVlZCB0byB1c2UgdGhlIFVSTExvYWRlckZhY3RvcnkuCi0gIC8vIEN1cnJlbnRseSB0cmFuc2xhdGUgcmVxdWVzdHMgYXJlIG9ubHkgc2VudCB0byB0aGUgbWFpbiBmcmFtZSBwcm9jZXNzLgotICBjb250ZW50OjpSZW5kZXJQcm9jZXNzSG9zdCogcHJvY2VzcyA9Ci0gICAgICB3ZWJfY29udGVudHMoKS0+R2V0TWFpbkZyYW1lKCktPkdldFByb2Nlc3MoKTsKLQotICAvLyBDcmVhdGUgYSBuZXcgVVJMTG9hZGVyRmFjdG9yeSwgbG9ja2luZyB0aGUgaW5pdGlhdG9yIG9yaWdpbiB0byB0aGUgb25lCi0gIC8vIHJldHVybmVkIGJ5IEdldFRyYW5zbGF0ZVNlY3VyaXR5T3JpZ2luLgotICBuZXR3b3JrOjptb2pvbTo6VVJMTG9hZGVyRmFjdG9yeVB0ciBmYWN0b3J5OwotICB1cmw6Ok9yaWdpbiBvcmlnaW4gPSB1cmw6Ok9yaWdpbjo6Q3JlYXRlKEdldFRyYW5zbGF0ZVNlY3VyaXR5T3JpZ2luKCkpOwotCi0gIC8vIFRPRE8oY3JidWcuY29tLzk0MDA2OCk6IFNpbmNlIHRoaXMgZmFjdG9yeSB3aWxsIGJlIHJlbW92ZWQsIHNlbmRpbmcgYW4KLSAgLy8gZW1wdHkgbmV0d29yayBpc29sYXRpb24ga2V5IGZvciBub3cuCi0gIGNvbnRlbnQ6OldlYlByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0KLSAgICAgIHdlYl9jb250ZW50cygpLT5HZXRSZW5kZXJWaWV3SG9zdCgpLT5HZXRXZWJraXRQcmVmZXJlbmNlcygpOwotICBwcm9jZXNzLT5DcmVhdGVVUkxMb2FkZXJGYWN0b3J5KAotICAgICAgb3JpZ2luLCBuZXR3b3JrOjptb2pvbTo6Q3Jvc3NPcmlnaW5FbWJlZGRlclBvbGljeTo6a05vbmUsICZwcmVmZXJlbmNlcywKLSAgICAgIG5ldDo6TmV0d29ya0lzb2xhdGlvbktleSgpLCBtb2pvOjpOdWxsUmVtb3RlKCksCi0gICAgICBtb2pvOjpNYWtlUmVxdWVzdCgmZmFjdG9yeSkpOwotICByZXR1cm4gZmFjdG9yeTsKLX0KLQogdm9pZCBDb250ZW50VHJhbnNsYXRlRHJpdmVyOjpUcmFuc2xhdGVQYWdlKGludCBwYWdlX3NlcV9ubywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdHJhbnNsYXRlX3NjcmlwdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlX2xhbmcsCkBAIC0xNTcsNyArMTMxLDcgQEAKICAgICByZXR1cm47ICAvLyBUaGlzIHBhZ2UgaGFzIG5hdmlnYXRlZCBhd2F5LgogCiAgIGl0LT5zZWNvbmQtPlRyYW5zbGF0ZSgKLSAgICAgIHRyYW5zbGF0ZV9zY3JpcHQsIENyZWF0ZVVSTExvYWRlckZhY3RvcnkoKSwgc291cmNlX2xhbmcsIHRhcmdldF9sYW5nLAorICAgICAgdHJhbnNsYXRlX3NjcmlwdCwgc291cmNlX2xhbmcsIHRhcmdldF9sYW5nLAogICAgICAgYmFzZTo6QmluZE9uY2UoJkNvbnRlbnRUcmFuc2xhdGVEcml2ZXI6Ok9uUGFnZVRyYW5zbGF0ZWQsCiAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSk7CiB9CmRpZmYgLS1naXQgYS9jb21wb25lbnRzL3RyYW5zbGF0ZS9jb250ZW50L2Jyb3dzZXIvY29udGVudF90cmFuc2xhdGVfZHJpdmVyLmggYi9jb21wb25lbnRzL3RyYW5zbGF0ZS9jb250ZW50L2Jyb3dzZXIvY29udGVudF90cmFuc2xhdGVfZHJpdmVyLmgKaW5kZXggOGFjNGQxMC4uOWVlN2UxZCAxMDA2NDQKLS0tIGEvY29tcG9uZW50cy90cmFuc2xhdGUvY29udGVudC9icm93c2VyL2NvbnRlbnRfdHJhbnNsYXRlX2RyaXZlci5oCisrKyBiL2NvbXBvbmVudHMvdHJhbnNsYXRlL2NvbnRlbnQvYnJvd3Nlci9jb250ZW50X3RyYW5zbGF0ZV9kcml2ZXIuaApAQCAtMjAsNyArMjAsNiBAQAogI2luY2x1ZGUgIm1vam8vcHVibGljL2NwcC9iaW5kaW5ncy9yZWNlaXZlcl9zZXQuaCIKICNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvYmluZGluZ3MvcmVtb3RlLmgiCiAjaW5jbHVkZSAic2VydmljZXMvbWV0cmljcy9wdWJsaWMvY3BwL3VrbV9zb3VyY2VfaWQuaCIKLSNpbmNsdWRlICJzZXJ2aWNlcy9uZXR3b3JrL3B1YmxpYy9tb2pvbS91cmxfbG9hZGVyX2ZhY3RvcnkubW9qb20uaCIKIAogbmFtZXNwYWNlIGNvbnRlbnQgewogY2xhc3MgTmF2aWdhdGlvbkNvbnRyb2xsZXI7CkBAIC0xMjUsMTMgKzEyNCw2IEBACiAgcHJpdmF0ZToKICAgdm9pZCBPblBhZ2VBd2F5KGludCBwYWdlX3NlcV9ubyk7CiAKLSAgLy8gQ3JlYXRlcyBhIFVSTExvYWRlckZhY3RvcnkgdGhhdCBtYXkgYmUgdXNlZCBieSB0aGUgdHJhbnNsYXRlIHNjcmlwdHMgdGhhdAotICAvLyBnZXQgaW5qZWN0ZWQgaW50byBpc29sYXRlZCB3b3JsZHMgd2l0aGluIHRoZSBwYWdlIHRvIGJlIHRyYW5zbGF0ZWQuICBTdWNoCi0gIC8vIHNjcmlwdHMgKG9yIHJhdGhlciwgdGhlaXIgaXNvbGF0ZWQgd29ybGRzKSBhcmUgYXNzb2NpYXRlZCB3aXRoIGEKLSAgLy8gdHJhbnNsYXRlLXNwZWNpZmljIG9yaWdpbiBsaWtlIGh0dHBzOi8vdHJhbnNsYXRlLmdvb2dsZWFwaXMuY29tIGFuZCB1c2UKLSAgLy8gdGhpcyBvcmlnaW4gYXMgfHJlcXVlc3RfaW5pdGlhdG9yfCBvZiBodHRwIHJlcXVlc3RzLgotICBuZXR3b3JrOjptb2pvbTo6VVJMTG9hZGVyRmFjdG9yeVB0ciBDcmVhdGVVUkxMb2FkZXJGYWN0b3J5KCk7Ci0KICAgLy8gVGhlIG5hdmlnYXRpb24gY29udHJvbGxlciBvZiB0aGUgdGFiIHdlIGFyZSBhc3NvY2lhdGVkIHdpdGguCiAgIGNvbnRlbnQ6Ok5hdmlnYXRpb25Db250cm9sbGVyKiBuYXZpZ2F0aW9uX2NvbnRyb2xsZXJfOwogCmRpZmYgLS1naXQgYS9jb21wb25lbnRzL3RyYW5zbGF0ZS9jb250ZW50L2NvbW1vbi9CVUlMRC5nbiBiL2NvbXBvbmVudHMvdHJhbnNsYXRlL2NvbnRlbnQvY29tbW9uL0JVSUxELmduCmluZGV4IGFlNTIxMzcuLmE1YjZhNjc4IDEwMDY0NAotLS0gYS9jb21wb25lbnRzL3RyYW5zbGF0ZS9jb250ZW50L2NvbW1vbi9CVUlMRC5nbgorKysgYi9jb21wb25lbnRzL3RyYW5zbGF0ZS9jb250ZW50L2NvbW1vbi9CVUlMRC5nbgpAQCAtMTEsNyArMTEsNiBAQAogCiAgIHB1YmxpY19kZXBzID0gWwogICAgICIvL21vam8vcHVibGljL21vam9tL2Jhc2UiLAotICAgICIvL3NlcnZpY2VzL25ldHdvcmsvcHVibGljL21vam9tOm1vam9tIiwKICAgICAiLy91cmwvbW9qb206dXJsX21vam9tX2d1cmwiLAogICBdCiB9CmRpZmYgLS1naXQgYS9jb21wb25lbnRzL3RyYW5zbGF0ZS9jb250ZW50L2NvbW1vbi90cmFuc2xhdGUubW9qb20gYi9jb21wb25lbnRzL3RyYW5zbGF0ZS9jb250ZW50L2NvbW1vbi90cmFuc2xhdGUubW9qb20KaW5kZXggYmM0YTlmMC4uZmMwMThhYyAxMDA2NDQKLS0tIGEvY29tcG9uZW50cy90cmFuc2xhdGUvY29udGVudC9jb21tb24vdHJhbnNsYXRlLm1vam9tCisrKyBiL2NvbXBvbmVudHMvdHJhbnNsYXRlL2NvbnRlbnQvY29tbW9uL3RyYW5zbGF0ZS5tb2pvbQpAQCAtNiw3ICs2LDYgQEAKIAogaW1wb3J0ICJtb2pvL3B1YmxpYy9tb2pvbS9iYXNlL3RpbWUubW9qb20iOwogaW1wb3J0ICJtb2pvL3B1YmxpYy9tb2pvbS9iYXNlL3N0cmluZzE2Lm1vam9tIjsKLWltcG9ydCAic2VydmljZXMvbmV0d29yay9wdWJsaWMvbW9qb20vdXJsX2xvYWRlcl9mYWN0b3J5Lm1vam9tIjsKIGltcG9ydCAidXJsL21vam9tL3VybC5tb2pvbSI7CiAKIGVudW0gVHJhbnNsYXRlRXJyb3IgewpAQCAtNDAsMTIgKzM5LDYgQEAKICAgLy8gUmVxdWVzdHMgdGhhdCB0aGUgcGFnZSBiZSB0cmFuc2xhdGVkIGZyb20gfHNvdXJjZV9sYW5nfCB0bwogICAvLyB8dGFyZ2V0X2xhbmd8LgogICAvLwotICAvLyB8bG9hZGVyX2ZhY3RvcnlfZm9yX3RyYW5zbGF0ZV9zY3JpcHR8IHNob3VsZCBwcm92aWRlIGEgZmFjdG9yeSB0aGF0IHRoZQotICAvLyB0cmFuc2xhdGlvbiBzY3JpcHRzIGNhbiB1c2UgZm9yIG1ha2luZyBmZXRjaCByZXF1ZXN0cyBhc3NvY2lhdGVkIHdpdGggdGhlCi0gIC8vICJ0cmFuc2xhdGUiIG9yaWdpbiAodGhlIGRlZmF1bHQgZmFjdG9yeSdzIHxyZXF1ZXN0X2luaXRpYXRvcl9zaXRlX2xvY2t8IGlzCi0gIC8vIG5vdCBjb21wYXRpYmxlIHdpdGggfHJlcXVlc3RfaW5pdGlhdG9yfCBvZiBmZXRjaCByZXF1ZXN0cyBpbml0aWF0ZWQgYnkgdGhlCi0gIC8vICJ0cmFuc2xhdGUiIG9yaWdpbikuCi0gIC8vCiAgIC8vIElmIGEgVHJhbnNsYXRlIHJlcXVlc3QgaXMgYWxyZWFkeSBpbiBwcm9ncmVzcyB3aXRoIGEgbWF0Y2hpbmcKICAgLy8gfHRhcmdldF9sYW5nfCwgdGhpcyByZXF1ZXN0IHdpbGwgcmVzcG9uZCB3aXRoIHxjYW5jZWxsZWR8IHNldAogICAvLyB0byB8dHJ1ZXwuCkBAIC01NiwxMCArNDksNyBAQAogICAvLwogICAvLyBJZiB8Y2FuY2VsbGVkfCBpcyB8dHJ1ZXwgYWxsIG90aGVyIHJlc3BvbnNlIHZhbHVlcyBzaG91bGQgYmUKICAgLy8gaWdub3JlZC4KLSAgVHJhbnNsYXRlKHN0cmluZyB0cmFuc2xhdGVfc2NyaXB0LAotICAgICAgICAgICAgbmV0d29yay5tb2pvbS5VUkxMb2FkZXJGYWN0b3J5IGxvYWRlcl9mYWN0b3J5X2Zvcl90cmFuc2xhdGVfc2NyaXB0LAotICAgICAgICAgICAgc3RyaW5nIHNvdXJjZV9sYW5nLAotICAgICAgICAgICAgc3RyaW5nIHRhcmdldF9sYW5nKQorICBUcmFuc2xhdGUoc3RyaW5nIHRyYW5zbGF0ZV9zY3JpcHQsIHN0cmluZyBzb3VyY2VfbGFuZywgc3RyaW5nIHRhcmdldF9sYW5nKQogICAgICAgPT4gKGJvb2wgY2FuY2VsbGVkLCBzdHJpbmcgb3JpZ2luYWxfbGFuZywgc3RyaW5nIHRyYW5zbGF0ZWRfbGFuZywKICAgICAgICAgICBUcmFuc2xhdGVFcnJvciBlcnJvcik7CiAKZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvdHJhbnNsYXRlL2NvbnRlbnQvcmVuZGVyZXIvQlVJTEQuZ24gYi9jb21wb25lbnRzL3RyYW5zbGF0ZS9jb250ZW50L3JlbmRlcmVyL0JVSUxELmduCmluZGV4IDcyYTg4NzMuLmQwNGQ4ZDYgMTAwNjQ0Ci0tLSBhL2NvbXBvbmVudHMvdHJhbnNsYXRlL2NvbnRlbnQvcmVuZGVyZXIvQlVJTEQuZ24KKysrIGIvY29tcG9uZW50cy90cmFuc2xhdGUvY29udGVudC9yZW5kZXJlci9CVUlMRC5nbgpAQCAtMTUsNiArMTUsOCBAQAogICAgICIvL2NvbXBvbmVudHMvdHJhbnNsYXRlL2NvbnRlbnQvY29tbW9uIiwKICAgICAiLy9jb21wb25lbnRzL3RyYW5zbGF0ZS9jb3JlL2NvbW1vbiIsCiAgICAgIi8vY29tcG9uZW50cy90cmFuc2xhdGUvY29yZS9sYW5ndWFnZV9kZXRlY3Rpb24iLAorICAgICIvL2NvbnRlbnQvcHVibGljL2NvbW1vbiIsCisgICAgIi8vY29udGVudC9wdWJsaWMvcmVuZGVyZXIiLAogICAgICIvL3NlcnZpY2VzL3NlcnZpY2VfbWFuYWdlci9wdWJsaWMvY3BwIiwKICAgICAiLy90aGlyZF9wYXJ0eS9ibGluay9wdWJsaWM6YmxpbmsiLAogICAgICIvL3VybCIsCkBAIC0yMiw4ICsyNCw2IEBACiAgIF0KIAogICBwdWJsaWNfZGVwcyA9IFsKLSAgICAiLy9jb250ZW50L3B1YmxpYy9jb21tb24iLAotICAgICIvL2NvbnRlbnQvcHVibGljL3JlbmRlcmVyIiwKICAgICAiLy90aGlyZF9wYXJ0eS9ibGluay9wdWJsaWM6YmxpbmtfaGVhZGVycyIsCiAgIF0KIH0KZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvdHJhbnNsYXRlL2NvbnRlbnQvcmVuZGVyZXIvdHJhbnNsYXRlX2hlbHBlci5jYyBiL2NvbXBvbmVudHMvdHJhbnNsYXRlL2NvbnRlbnQvcmVuZGVyZXIvdHJhbnNsYXRlX2hlbHBlci5jYwppbmRleCA5NDRiZGM4ZC4uOWZkYTRhNCAxMDA2NDQKLS0tIGEvY29tcG9uZW50cy90cmFuc2xhdGUvY29udGVudC9yZW5kZXJlci90cmFuc2xhdGVfaGVscGVyLmNjCisrKyBiL2NvbXBvbmVudHMvdHJhbnNsYXRlL2NvbnRlbnQvcmVuZGVyZXIvdHJhbnNsYXRlX2hlbHBlci5jYwpAQCAtOCw3ICs4LDYgQEAKIAogI2luY2x1ZGUgImJhc2UvYmluZC5oIgogI2luY2x1ZGUgImJhc2UvY29tcGlsZXJfc3BlY2lmaWMuaCIKLSNpbmNsdWRlICJiYXNlL2ZlYXR1cmVfbGlzdC5oIgogI2luY2x1ZGUgImJhc2UvanNvbi9zdHJpbmdfZXNjYXBlLmgiCiAjaW5jbHVkZSAiYmFzZS9sb2NhdGlvbi5oIgogI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgpAQCAtMjYsNyArMjUsNiBAQAogI2luY2x1ZGUgImNvbnRlbnQvcHVibGljL3JlbmRlcmVyL3JlbmRlcl9mcmFtZS5oIgogI2luY2x1ZGUgImNvbnRlbnQvcHVibGljL3JlbmRlcmVyL3JlbmRlcl90aHJlYWQuaCIKICNpbmNsdWRlICJzZXJ2aWNlcy9zZXJ2aWNlX21hbmFnZXIvcHVibGljL2NwcC9pbnRlcmZhY2VfcHJvdmlkZXIuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvY29tbW9uL2xvYWRlci91cmxfbG9hZGVyX2ZhY3RvcnlfYnVuZGxlLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcHVibGljL3BsYXRmb3JtL3dlYl9pc29sYXRlZF93b3JsZF9pbmZvLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcHVibGljL3dlYi93ZWJfZG9jdW1lbnQuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvd2ViL3dlYl9sYW5ndWFnZV9kZXRlY3Rpb25fZGV0YWlscy5oIgpAQCAtMjgxLDE2ICsyNzksOSBAQAogLy8gbW9qb206OlBhZ2UgaW1wbGVtZW50YXRpb25zLgogdm9pZCBUcmFuc2xhdGVIZWxwZXI6OlRyYW5zbGF0ZSgKICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdHJhbnNsYXRlX3NjcmlwdCwKLSAgICBuZXR3b3JrOjptb2pvbTo6VVJMTG9hZGVyRmFjdG9yeVB0ciBsb2FkZXJfZmFjdG9yeV9mb3JfdHJhbnNsYXRlX3NjcmlwdCwKICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlX2xhbmcsCiAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldF9sYW5nLAogICAgIFRyYW5zbGF0ZUNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gIHVybDo6T3JpZ2luIHRyYW5zbGF0ZV9vcmlnaW4gPQotICAgICAgdXJsOjpPcmlnaW46OkNyZWF0ZShHZXRUcmFuc2xhdGVTZWN1cml0eU9yaWdpbigpKTsKLQotICByZW5kZXJfZnJhbWUoKS0+TWFya0luaXRpYXRvckFzUmVxdWlyaW5nU2VwYXJhdGVVUkxMb2FkZXJGYWN0b3J5KAotICAgICAgdHJhbnNsYXRlX29yaWdpbiwgc3RkOjptb3ZlKGxvYWRlcl9mYWN0b3J5X2Zvcl90cmFuc2xhdGVfc2NyaXB0KSk7Ci0KICAgV2ViTG9jYWxGcmFtZSogbWFpbl9mcmFtZSA9IHJlbmRlcl9mcmFtZSgpLT5HZXRXZWJGcmFtZSgpOwogICBpZiAoIW1haW5fZnJhbWUpIHsKICAgICAvLyBDYW5jZWxsZWQuCkBAIC0zMjcsNyArMzE4LDggQEAKICAgLy8gU2V0IHVwIHY4IGlzb2xhdGVkIHdvcmxkIHdpdGggcHJvcGVyIGNvbnRlbnQtc2VjdXJpdHktcG9saWN5IGFuZAogICAvLyBzZWN1cml0eS1vcmlnaW4uCiAgIGJsaW5rOjpXZWJJc29sYXRlZFdvcmxkSW5mbyBpbmZvOwotICBpbmZvLnNlY3VyaXR5X29yaWdpbiA9IFdlYlNlY3VyaXR5T3JpZ2luOjpDcmVhdGUodHJhbnNsYXRlX29yaWdpbi5HZXRVUkwoKSk7CisgIGluZm8uc2VjdXJpdHlfb3JpZ2luID0KKyAgICAgIFdlYlNlY3VyaXR5T3JpZ2luOjpDcmVhdGUoR2V0VHJhbnNsYXRlU2VjdXJpdHlPcmlnaW4oKSk7CiAgIGluZm8uY29udGVudF9zZWN1cml0eV9wb2xpY3kgPSBXZWJTdHJpbmc6OkZyb21VVEY4KGtDb250ZW50U2VjdXJpdHlQb2xpY3kpOwogICBtYWluX2ZyYW1lLT5TZXRJc29sYXRlZFdvcmxkSW5mbyh3b3JsZF9pZF8sIGluZm8pOwogCmRpZmYgLS1naXQgYS9jb21wb25lbnRzL3RyYW5zbGF0ZS9jb250ZW50L3JlbmRlcmVyL3RyYW5zbGF0ZV9oZWxwZXIuaCBiL2NvbXBvbmVudHMvdHJhbnNsYXRlL2NvbnRlbnQvcmVuZGVyZXIvdHJhbnNsYXRlX2hlbHBlci5oCmluZGV4IDdjY2Q0ZTIuLjk2MDkyZmMwIDEwMDY0NAotLS0gYS9jb21wb25lbnRzL3RyYW5zbGF0ZS9jb250ZW50L3JlbmRlcmVyL3RyYW5zbGF0ZV9oZWxwZXIuaAorKysgYi9jb21wb25lbnRzL3RyYW5zbGF0ZS9jb250ZW50L3JlbmRlcmVyL3RyYW5zbGF0ZV9oZWxwZXIuaApAQCAtMTgsNyArMTgsNiBAQAogI2luY2x1ZGUgImNvbnRlbnQvcHVibGljL3JlbmRlcmVyL3JlbmRlcl9mcmFtZV9vYnNlcnZlci5oIgogI2luY2x1ZGUgIm1vam8vcHVibGljL2NwcC9iaW5kaW5ncy9yZWNlaXZlci5oIgogI2luY2x1ZGUgIm1vam8vcHVibGljL2NwcC9iaW5kaW5ncy9yZW1vdGUuaCIKLSNpbmNsdWRlICJzZXJ2aWNlcy9uZXR3b3JrL3B1YmxpYy9tb2pvbS91cmxfbG9hZGVyX2ZhY3RvcnkubW9qb20uaCIKICNpbmNsdWRlICJ1cmwvZ3VybC5oIgogCiBuYW1lc3BhY2UgYmxpbmsgewpAQCAtNDYsMTIgKzQ1LDEwIEBACiAgIHZvaWQgUHJlcGFyZUZvclVybChjb25zdCBHVVJMJiB1cmwpOwogCiAgIC8vIG1vam9tOjpQYWdlIGltcGxlbWVudGF0aW9uLgotICB2b2lkIFRyYW5zbGF0ZSgKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0cmFuc2xhdGVfc2NyaXB0LAotICAgICAgbmV0d29yazo6bW9qb206OlVSTExvYWRlckZhY3RvcnlQdHIgbG9hZGVyX2ZhY3RvcnlfZm9yX3RyYW5zbGF0ZV9zY3JpcHQsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlX2xhbmcsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0X2xhbmcsCi0gICAgICBUcmFuc2xhdGVDYWxsYmFjayBjYWxsYmFjaykgb3ZlcnJpZGU7CisgIHZvaWQgVHJhbnNsYXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiB0cmFuc2xhdGVfc2NyaXB0LAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlX2xhbmcsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0YXJnZXRfbGFuZywKKyAgICAgICAgICAgICAgICAgVHJhbnNsYXRlQ2FsbGJhY2sgY2FsbGJhY2spIG92ZXJyaWRlOwogICB2b2lkIFJldmVydFRyYW5zbGF0aW9uKCkgb3ZlcnJpZGU7CiAKICBwcm90ZWN0ZWQ6CmRpZmYgLS1naXQgYS9jb21wb25lbnRzL3R5cGVtYXBzLmduaSBiL2NvbXBvbmVudHMvdHlwZW1hcHMuZ25pCmluZGV4IDIwMWM4OTUuLjg3OWU3NzkgMTAwNjQ0Ci0tLSBhL2NvbXBvbmVudHMvdHlwZW1hcHMuZ25pCisrKyBiL2NvbXBvbmVudHMvdHlwZW1hcHMuZ25pCkBAIC0xMCw3ICsxMCw2IEBACiAgICIvL2NvbXBvbmVudHMvY29udGVudF9zZXR0aW5ncy9jb3JlL2NvbW1vbi9jb250ZW50X3NldHRpbmdzLnR5cGVtYXAiLAogICAiLy9jb21wb25lbnRzL25hY2wvY29tbW9uL25hY2wudHlwZW1hcCIsCiAgICIvL2NvbXBvbmVudHMvcGFzc3dvcmRfbWFuYWdlci9jb250ZW50L2NvbW1vbi9jcmVkZW50aWFsX21hbmFnZXIudHlwZW1hcCIsCi0gICIvL2NvbXBvbmVudHMvc2VydmljZXMvbGV2ZWxkYi9sZXZlbGRiLnR5cGVtYXAiLAogICAiLy9jb21wb25lbnRzL3NwZWxsY2hlY2svY29tbW9uL3NwZWxsY2hlY2sudHlwZW1hcCIsCiAgICIvL2NvbXBvbmVudHMvdHJhbnNsYXRlL2NvbnRlbnQvY29tbW9uL3RyYW5zbGF0ZS50eXBlbWFwIiwKIF0KZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvdXBkYXRlX2NsaWVudC9wcm90b2NvbF9zZXJpYWxpemVyX2pzb25fdW5pdHRlc3QuY2MgYi9jb21wb25lbnRzL3VwZGF0ZV9jbGllbnQvcHJvdG9jb2xfc2VyaWFsaXplcl9qc29uX3VuaXR0ZXN0LmNjCmluZGV4IDRjZjI2NjZmLi5lYjlmY2EwIDEwMDY0NAotLS0gYS9jb21wb25lbnRzL3VwZGF0ZV9jbGllbnQvcHJvdG9jb2xfc2VyaWFsaXplcl9qc29uX3VuaXR0ZXN0LmNjCisrKyBiL2NvbXBvbmVudHMvdXBkYXRlX2NsaWVudC9wcm90b2NvbF9zZXJpYWxpemVyX2pzb25fdW5pdHRlc3QuY2MKQEAgLTcwLDcgKzcwLDcgQEAKICAgICAgIFIiKCJ2ZXJzaW9uIjoiMi4wIn1dLCJhcmNoIjoiXHcrIiwiZGVkdXAiOiJjciIsImRscHJlZiI6ImNhY2hlYWJsZSIsKSIKICAgICAgIFIiKCJleHRyYSI6InBhcmFtcyIsImh3Ijp7InBoeXNtZW1vcnkiOlxkK30sImxhbmciOiJsYW5nIiwpIgogICAgICAgUiIoIm5hY2xfYXJjaCI6IlstXHddKyIsIm9zIjp7ImFyY2giOiJbXywtLlx3XSsiLCJwbGF0Zm9ybSI6Ik9TIiwpIgotICAgICAgUiIoKCJzcCI6Iltcc1x3XSsiLCk/InZlcnNpb24iOiJbLS5cd10rIn0sInByb2RjaGFubmVsIjoiY2hhbm5lbCIsKSIKKyAgICAgIFIiKCgic3AiOiJbXHNcd10rIiwpPyJ2ZXJzaW9uIjoiWystLlx3XSsifSwicHJvZGNoYW5uZWwiOiJjaGFubmVsIiwpIgogICAgICAgUiIoInByb2R2ZXJzaW9uIjoiMS4wIiwicHJvdG9jb2wiOiIzLjEiLCJyZXF1ZXN0aWQiOiJ7Wy1cd117MzZ9fSIsKSIKICAgICAgIFIiKCJzZXNzaW9uaWQiOiJ7Wy1cd117MzZ9fSIsInVwZGF0ZXJjaGFubmVsIjoiY2hhbm5lbCIsKSIKICAgICAgIFIiKCJ1cGRhdGVydmVyc2lvbiI6IjEuMCIoLCJ3b3c2NCI6dHJ1ZSk/fX0pIjsKQEAgLTExNCw3ICsxMTQsNyBAQAogICAgICAgUiIoImRscHJlZiI6ImNhY2hlYWJsZSIsImRvbWFpbmpvaW5lZCI6dHJ1ZSwiZXh0cmEiOiJwYXJhbXMiLCkiCiAgICAgICBSIigiaHciOnsicGh5c21lbW9yeSI6XGQrfSwibGFuZyI6ImxhbmciLCJuYWNsX2FyY2giOiJbLVx3XSsiLCkiCiAgICAgICBSIigib3MiOnsiYXJjaCI6IlssLS5cd10rIiwicGxhdGZvcm0iOiJPUyIsKCJzcCI6Iltcc1x3XSsiLCk/KSIKLSAgICAgIFIiKCJ2ZXJzaW9uIjoiWy0uXHddKyJ9LCJwcm9kY2hhbm5lbCI6ImNoYW5uZWwiLCJwcm9kdmVyc2lvbiI6IjEuMCIsKSIKKyAgICAgIFIiKCJ2ZXJzaW9uIjoiWystLlx3XSsifSwicHJvZGNoYW5uZWwiOiJjaGFubmVsIiwicHJvZHZlcnNpb24iOiIxLjAiLCkiCiAgICAgICBSIigicHJvdG9jb2wiOiIzLjEiLCJyZXF1ZXN0aWQiOiJ7Wy1cd117MzZ9fSIsInNlc3Npb25pZCI6IntbLVx3XXszNn19IiwpIgogI2lmIEJVSUxERkxBRyhHT09HTEVfQ0hST01FX0JSQU5ESU5HKQogICAgICAgUiIoInVwZGF0ZXIiOnsiYXV0b3VwZGF0ZWNoZWNrZW5hYmxlZCI6ZmFsc2UsImlzbWFjaGluZSI6dHJ1ZSwpIgpkaWZmIC0tZ2l0IGEvY29tcG9uZW50cy91cmxfZm9ybWF0dGVyL3Nwb29mX2NoZWNrcy90b3BfZG9tYWlucy9CVUlMRC5nbiBiL2NvbXBvbmVudHMvdXJsX2Zvcm1hdHRlci9zcG9vZl9jaGVja3MvdG9wX2RvbWFpbnMvQlVJTEQuZ24KaW5kZXggZTVhYzVlZTkuLmZlNWFjYTcgMTAwNjQ0Ci0tLSBhL2NvbXBvbmVudHMvdXJsX2Zvcm1hdHRlci9zcG9vZl9jaGVja3MvdG9wX2RvbWFpbnMvQlVJTEQuZ24KKysrIGIvY29tcG9uZW50cy91cmxfZm9ybWF0dGVyL3Nwb29mX2NoZWNrcy90b3BfZG9tYWlucy9CVUlMRC5nbgpAQCAtNjksOSArNjksOSBAQAogICAgICAgICAgcmViYXNlX3BhdGgob3V0cHV0cywgcm9vdF9idWlsZF9kaXIpICsgWyAiLS1mb3JfdGVzdGluZyIgXQogfQogCi1leGVjdXRhYmxlKCJtYWtlX3RvcF9kb21haW5fbGlzdF9mb3JfZWRpdF9kaXN0YW5jZSIpIHsKK2V4ZWN1dGFibGUoIm1ha2VfdG9wX2RvbWFpbl9saXN0X3ZhcmlhYmxlcyIpIHsKICAgc291cmNlcyA9IFsKLSAgICAibWFrZV90b3BfZG9tYWluX2xpc3RfZm9yX2VkaXRfZGlzdGFuY2UuY2MiLAorICAgICJtYWtlX3RvcF9kb21haW5fbGlzdF92YXJpYWJsZXMuY2MiLAogICBdCiAgIGRlcHMgPSBbCiAgICAgIjpjb21tb24iLApAQCAtMTA4LDggKzEwOCw4IEBACiAKICMgVE9ETyhjcmJ1Zy85MTU5MjEpOiBDb21iaW5lIHRoaXMgYW5kIHRoZSBwcmV2aW91cyBvbmUgaW50byBhCiAjIGNvbXBpbGVkX2FjdGlvbl9mb3JlYWNoIHRhcmdldC4KLWNvbXBpbGVkX2FjdGlvbigiZ2VuZXJhdGVfdG9wX2RvbWFpbnNfZm9yX2VkaXRfZGlzdGFuY2UiKSB7Ci0gIHRvb2wgPSAiOm1ha2VfdG9wX2RvbWFpbl9saXN0X2Zvcl9lZGl0X2Rpc3RhbmNlIgorY29tcGlsZWRfYWN0aW9uKCJnZW5lcmF0ZV90b3BfZG9tYWluX2xpc3RfdmFyaWFibGVzX2ZpbGUiKSB7CisgIHRvb2wgPSAiOm1ha2VfdG9wX2RvbWFpbl9saXN0X3ZhcmlhYmxlcyIKIAogICAjIElucHV0cyBpbiBvcmRlciBleHBlY3RlZCBieSB0aGUgY29tbWFuZCBsaW5lIG9mIHRoZSB0b29sLgogICBpbnB1dHMgPSBbCkBAIC0xMjQsNyArMTI0LDcgQEAKIAogIyB0b3A1MDBfZG9tYWlucyBhbmQgdG9wNTAwX2RvbWFpbnNfaGVhZGVyIGFyZSBpbnRlbnRpb25hbGx5IHNlcGFyYXRlZCB0byByZW1vdmUKICMgc2VyaWFsaXplZCBidWlsZCBkZXBlbmRlbmN5IGZyb20gc29tZSB0YXJnZXRzIHRvCi0jIGdlbmVyYXRlX3RvcF9kb21haW5zX2Zvcl9lZGl0X2Rpc3RhbmNlIGFjdGlvbiB0YXJnZXQuCisjIGdlbmVyYXRlX3RvcF9kb21haW5fbGlzdF92YXJpYWJsZXMgYWN0aW9uIHRhcmdldC4KIHNvdXJjZV9zZXQoInRvcDUwMF9kb21haW5zIikgewogICAjIFRoaXMgZW1wdHkgcHVibGljIGlzIGludGVudGlvbmFsIHRvIHJlbW92ZSB1bm5lY2Vzc2FyeSBidWlsZCBkZXBlbmRlbmN5LgogICBwdWJsaWMgPSBbXQpAQCAtMTM0LDcgKzEzNCw3IEBACiAgIF0KIAogICBkZXBzID0gWwotICAgICI6Z2VuZXJhdGVfdG9wX2RvbWFpbnNfZm9yX2VkaXRfZGlzdGFuY2UiLAorICAgICI6Z2VuZXJhdGVfdG9wX2RvbWFpbl9saXN0X3ZhcmlhYmxlc19maWxlIiwKICAgICAiOnRvcDUwMF9kb21haW5zX2hlYWRlciIsCiAgIF0KIH0KZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvdXJsX2Zvcm1hdHRlci9zcG9vZl9jaGVja3MvdG9wX2RvbWFpbnMvUkVBRE1FIGIvY29tcG9uZW50cy91cmxfZm9ybWF0dGVyL3Nwb29mX2NoZWNrcy90b3BfZG9tYWlucy9SRUFETUUubWQKc2ltaWxhcml0eSBpbmRleCA2MCUKcmVuYW1lIGZyb20gY29tcG9uZW50cy91cmxfZm9ybWF0dGVyL3Nwb29mX2NoZWNrcy90b3BfZG9tYWlucy9SRUFETUUKcmVuYW1lIHRvIGNvbXBvbmVudHMvdXJsX2Zvcm1hdHRlci9zcG9vZl9jaGVja3MvdG9wX2RvbWFpbnMvUkVBRE1FLm1kCmluZGV4IGY4ODNlM2IuLmNhMmM0MWIgMTAwNjQ0Ci0tLSBhL2NvbXBvbmVudHMvdXJsX2Zvcm1hdHRlci9zcG9vZl9jaGVja3MvdG9wX2RvbWFpbnMvUkVBRE1FCisrKyBiL2NvbXBvbmVudHMvdXJsX2Zvcm1hdHRlci9zcG9vZl9jaGVja3MvdG9wX2RvbWFpbnMvUkVBRE1FLm1kCkBAIC0xLDEwICsxLDEyIEBACi0qIGRvbWFpbnMubGlzdAorIyMjIFRvcCBEb21haW5zIFV0aWxpdGllcworCisqIGBkb21haW5zLmxpc3RgCiAKICAgQSB0b3AgZG9tYWluIGxpc3QsIG9uZSBwZXIgbGluZS4gVXNlZCBhcyBhbiBpbnB1dCB0bwogICBtYWtlX3RvcF9kb21haW5fc2tlbGV0b25zLiBTZWUgaHR0cDovL2dvL2Nocm9tZS10b3AtZG9tYWlucy11cGRhdGUgZm9yIHVwZGF0ZQogICBpbnN0cnVjdGlvbnMuCiAKLSogZG9tYWlucy5za2VsZXRvbnMKKyogYGRvbWFpbnMuc2tlbGV0b25zYAogCiAgIFRoZSBjaGVja2VkLWluIG91dHB1dCBvZiBtYWtlX3RvcF9kb21haW5fc2tlbGV0b25zLiAgUHJvY2Vzc2VkIGR1cmluZyB0aGUKICAgYnVpbGQgdG8gZ2VuZXJhdGUgZG9tYWlucy10cmllLWluYy5jYywgd2hpY2ggaXMgdXNlZCBieQpAQCAtMTQsMTAgKzE2LDE5IEBACiAgICQgbmluamEgLUMgJGJ1aWxkX291dGRpciBtYWtlX3RvcF9kb21haW5fc2tlbGV0b25zCiAgICQgJGJ1aWxkX291dGRpci9tYWtlX3RvcF9kb21haW5fc2tlbGV0b25zCiAKLSogdGVzdF9kb21haW5zLmxpc3QKKyogYHRlc3RfZG9tYWlucy5saXN0YAorCiAgIEEgbGlzdCBvZiBkb21haW5zIHRvIHVzZSBpbiBJRE5Ub1VuaWNvZGUgdGVzdCBpbnN0ZWFkIG9mIHRoZSBhY3R1YWwKICAgdG9wIGRvbWFpbiBsaXN0LiBNYW51YWxseSBlZGl0ZWQgdG8gbWF0Y2ggd2hhdCdzIGluIElETlRvVW5pY29kZSB0ZXN0LgogCi0qIHRlc3RfZG9tYWlucy5za2VsZXRvbnMKKyogYHRlc3RfZG9tYWlucy5za2VsZXRvbnNgCisKICAgR2VuZXJhdGVkIG91dHB1dCBvZiB0ZXN0X2RvbWFpbnMubGlzdCBhbG9uZyB3aXRoIGRvbWFpbnMuc2tlbGV0b25zCiAgIGJ5IG1ha2VfdG9wX2RvbWFpbl9za2VsZXRvbnMuCisKKyogYHRvcF9kb21haW5fbGlzdF92YXJpYWJsZV9idWlsZGVyLmNjYCAvIGB0b3A1MDBfZG9tYWlucy5oYAorCisgIGB0b3BfZG9tYWluX2xpc3RfdmFyaWFibGVfYnVpbGRlci5jY2AgaXMgcnVuIGF0IGNvbXBpbGUgdGltZSB0byBnZW5lcmF0ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdG9wIDUwMCBkb21haW5zCisgIChjdXJyZW50bHksIHNrZWxldG9ucyBhbmQga2V5d29yZHMgYXJlIGNyZWF0ZWQgZnJvbSB0aGVzZSBkb21haW5zKS4gVGhpcworICBpbmZvcm1hdGlvbiBpcyB0aGVuIGVtYmVkZGVkIGRpcmVjdGx5IGludG8gdGhlIGNocm9tZSBiaW5hcnksIGFuZCBjYW4gYmUKKyAgYWNjZXNzZWQgdmlhIHRoZSB2YXJpYWJsZXMgaW4gdGhlIHRvcDUwMF9kb21haW5zIG5hbWVzcGFjZS4KZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvdXJsX2Zvcm1hdHRlci9zcG9vZl9jaGVja3MvdG9wX2RvbWFpbnMvbWFrZV90b3BfZG9tYWluX2xpc3RfZm9yX2VkaXRfZGlzdGFuY2UuY2MgYi9jb21wb25lbnRzL3VybF9mb3JtYXR0ZXIvc3Bvb2ZfY2hlY2tzL3RvcF9kb21haW5zL21ha2VfdG9wX2RvbWFpbl9saXN0X3ZhcmlhYmxlcy5jYwpzaW1pbGFyaXR5IGluZGV4IDYwJQpyZW5hbWUgZnJvbSBjb21wb25lbnRzL3VybF9mb3JtYXR0ZXIvc3Bvb2ZfY2hlY2tzL3RvcF9kb21haW5zL21ha2VfdG9wX2RvbWFpbl9saXN0X2Zvcl9lZGl0X2Rpc3RhbmNlLmNjCnJlbmFtZSB0byBjb21wb25lbnRzL3VybF9mb3JtYXR0ZXIvc3Bvb2ZfY2hlY2tzL3RvcF9kb21haW5zL21ha2VfdG9wX2RvbWFpbl9saXN0X3ZhcmlhYmxlcy5jYwppbmRleCA4NjZmYzU2Ny4uMTIwN2NlZSAxMDA2NDQKLS0tIGEvY29tcG9uZW50cy91cmxfZm9ybWF0dGVyL3Nwb29mX2NoZWNrcy90b3BfZG9tYWlucy9tYWtlX3RvcF9kb21haW5fbGlzdF9mb3JfZWRpdF9kaXN0YW5jZS5jYworKysgYi9jb21wb25lbnRzL3VybF9mb3JtYXR0ZXIvc3Bvb2ZfY2hlY2tzL3RvcF9kb21haW5zL21ha2VfdG9wX2RvbWFpbl9saXN0X3ZhcmlhYmxlcy5jYwpAQCAtMiw5ICsyLDIyIEBACiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCi0vLyBUaGlzIGJpbmFyeSBnZW5lcmF0ZXMgYW4gYXJyYXkgb2YgdG9wIGRvbWFpbnMgc3VpdGFibGUgZm9yIGVkaXQgZGlzdGFuY2UKLS8vIG1hdGNoaW5nLiBUaGUgaW5wdXQgaXMgdGhlIGxpc3Qgb2YgKHNrZWxldG9uLCBkb21haW4pIHBhaXJzLiBUaGUgb3V0cHV0IGlzCi0vLyB3cml0dGVuIGFzIGEgQyBhcnJheSBvZiB0aGUgZG9tYWlucy4KKy8vIFRoaXMgYmluYXJ5IGdlbmVyYXRlcyB0d28gQyBhcnJheXMgb2YgdXNlZnVsIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdG9wCisvLyBkb21haW5zLCB3aGljaCB3ZSBlbWJlZCBkaXJlY3RseSBpbnRvCisvLyB0aGUgZmluYWwgQ2hyb21lIGJpbmFyeS4gIFRoZSBpbnB1dCBpcyBhIGxpc3Qgb2YgdGhlIHRvcCBkb21haW5zLiBUaGUgZmlyc3QKKy8vIG91dHB1dCBpcyBuYW1lZCBrVG9wNTAwRWRpdERpc3RhbmNlU2tlbGV0b25zLAorLy8gY29udGFpbmluZyB0aGUgc2tlbGV0b25zIG9mIHRoZSB0b3AgNTAwIGRvbWFpbnMgc3VpdGFibGUgZm9yIHVzZSBpbiB0aGUgZWRpdAorLy8gZGlzdGFuY2UgaGV1cmlzdGljLiBUaGUgc2Vjb25kIG91dHB1dCBpcyBuYW1lZCBrVG9wNTAwS2V5d29yZHMsCisvLyBjb250YWluZyB0aGUgdG9wIDUwMCBrZXl3b3JkcyBzdWl0YWJsZSBmb3IgdXNlIHdpdGggdGhlIGtleXdvcmQgbWF0Y2hpbmcKKy8vIGhldXJpc3RpYyAoZm9yIGluc3RhbmNlLCB3d3cuZ29vZ2xlLmNvbSAtPiBnb29nbGUpLiBCb3RoIG91dHB1dHMgYXJlIHdyaXR0ZW4KKy8vIHRvIHRoZSBzYW1lIGZpbGUsIHdoaWNoIHdpbGwgYmUgZm9ybWF0dGVkIGFzIGMrKyBzb3VyY2UgZmlsZSB3aXRoIHZhbGlkCisvLyBzeW50YXguCisKKy8vIFRoZSBDLXN0cmluZ3MgaW4gYm90aCBvZiB0aGUgb3V0cHV0IGFycmF5cyBhcmUgZ3VhcmFudGVlZCB0byBiZSBpbgorLy8gbGV4aWNvZ3JhcGhpY2FsbHkgc29ydGVkIG9yZGVyLgorCisvLyBJTVBPUlRBTlQ6IFRoaXMgYmluYXJ5IGFzc2VydHMgdGhhdCB0aGVyZSBhcmUgYXQgbGVhc3QgZW5vdWdoIHNpdGVzIGluIHRoZQorLy8gaW5wdXQgZmlsZSB0byBnZW5lcmF0ZSA1MDAgc2tlbGV0b25zIGFuZCA1MDAga2V5d29yZHMuCiAKICNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxzdHJpbmc+CkBAIC05NiwzMCArMTA5LDY4IEBACiAgICAgcmV0dXJuIDE7CiAgIH0KIAotICBzaXplX3QgY291bnQgPSAwOwotICBzdGQ6OnN0cmluZyBvdXRwdXQgPQotICAgICAgUiIoI2luY2x1ZGUgImNvbXBvbmVudHMvdXJsX2Zvcm1hdHRlci9zcG9vZl9jaGVja3MvdG9wX2RvbWFpbnMvdG9wNTAwX2RvbWFpbnMuaCIKLW5hbWVzcGFjZSB0b3A1MDBfZG9tYWlucyB7Ci1jb25zdCBjaGFyKiBjb25zdCBrVG9wNTAwWzUwMF0gPSB7Ci0pIjsKKyAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHNrZWxldG9uczsKKyAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGtleXdvcmRzOworCiAgIGZvciAoc3RkOjpzdHJpbmcgbGluZSA6IGxpbmVzKSB7CisgICAgaWYgKHNrZWxldG9ucy5zaXplKCkgPj0ga1RvcE4gJiYga2V5d29yZHMuc2l6ZSgpID49IGtUb3BOKSB7CisgICAgICBicmVhazsKKyAgICB9CiAgICAgYmFzZTo6VHJpbVdoaXRlc3BhY2VBU0NJSShsaW5lLCBiYXNlOjpUUklNX0FMTCwgJmxpbmUpOwogICAgIGlmIChsaW5lLmVtcHR5KCkgfHwgbGluZVswXSA9PSAnIycpIHsKICAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBpZiAoY291bnQgPj0ga1RvcE4pCi0gICAgICBicmVhazsKLSAgICBpZiAoIXVybF9mb3JtYXR0ZXI6OnRvcF9kb21haW5zOjpJc0VkaXREaXN0YW5jZUNhbmRpZGF0ZShsaW5lKSkgewotICAgICAgY29udGludWU7CisKKyAgICBpZiAoc2tlbGV0b25zLnNpemUoKSA8IGtUb3BOICYmCisgICAgICAgIHVybF9mb3JtYXR0ZXI6OnRvcF9kb21haW5zOjpJc0VkaXREaXN0YW5jZUNhbmRpZGF0ZShsaW5lKSkgeworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgc2tlbGV0b24gPSBHZXRTa2VsZXRvbihsaW5lLCBzcG9vZl9jaGVja2VyLmdldCgpKTsKKyAgICAgIGlmIChza2VsZXRvbnMuZmluZChza2VsZXRvbikgPT0gc2tlbGV0b25zLmVuZCgpKSB7CisgICAgICAgIHNrZWxldG9ucy5pbnNlcnQoc2tlbGV0b24pOworICAgICAgfQogICAgIH0KLSAgICBjb3VudCsrOwotICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHNrZWxldG9uID0gR2V0U2tlbGV0b24obGluZSwgc3Bvb2ZfY2hlY2tlci5nZXQoKSk7Ci0gICAgb3V0cHV0ICs9ICJcIiIgKyBza2VsZXRvbiArICJcIixcbiI7CisKKyAgICBpZiAoa2V5d29yZHMuc2l6ZSgpIDwga1RvcE4pIHsKKyAgICAgIHN0ZDo6c3RyaW5nIGtleXdvcmQ7CisgICAgICBiYXNlOjpUcmltU3RyaW5nKAorICAgICAgICAgIHVybF9mb3JtYXR0ZXI6OnRvcF9kb21haW5zOjpIb3N0bmFtZVdpdGhvdXRSZWdpc3RyeShsaW5lKSwgIi4iLAorICAgICAgICAgICZrZXl3b3JkKTsKKyAgICAgIENIRUNLKGtleXdvcmQuZmluZCgnLicpID09IHN0ZDo6c3RyaW5nOjpucG9zKTsKKyAgICAgIGlmIChrZXl3b3Jkcy5maW5kKGtleXdvcmQpID09IGtleXdvcmRzLmVuZCgpKSB7CisgICAgICAgIGtleXdvcmRzLmluc2VydChrZXl3b3JkKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBDSEVDS19FUShza2VsZXRvbnMuc2l6ZSgpLCBrVG9wTik7CisgIENIRUNLX0VRKGtleXdvcmRzLnNpemUoKSwga1RvcE4pOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzb3J0ZWRfc2tlbGV0b25zKHNrZWxldG9ucy5iZWdpbigpLCBza2VsZXRvbnMuZW5kKCkpOworICBzdGQ6OnNvcnQoc29ydGVkX3NrZWxldG9ucy5iZWdpbigpLCBzb3J0ZWRfc2tlbGV0b25zLmVuZCgpKTsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc29ydGVkX2tleXdvcmRzKGtleXdvcmRzLmJlZ2luKCksIGtleXdvcmRzLmVuZCgpKTsKKyAgc3RkOjpzb3J0KHNvcnRlZF9rZXl3b3Jkcy5iZWdpbigpLCBzb3J0ZWRfa2V5d29yZHMuZW5kKCkpOworCisgIHN0ZDo6c3RyaW5nIG91dHB1dCA9CisgICAgICBSIigjaW5jbHVkZSAiY29tcG9uZW50cy91cmxfZm9ybWF0dGVyL3Nwb29mX2NoZWNrcy90b3BfZG9tYWlucy90b3A1MDBfZG9tYWlucy5oIgorbmFtZXNwYWNlIHRvcDUwMF9kb21haW5zIHsKK2NvbnN0IGNoYXIqIGNvbnN0IGtUb3A1MDBFZGl0RGlzdGFuY2VTa2VsZXRvbnNbNTAwXSA9IHsKKykiOworCisgIGZvciAoY29uc3Qgc3RkOjpzdHJpbmcmIHNrZWxldG9uIDogc29ydGVkX3NrZWxldG9ucykgeworICAgIG91dHB1dCArPSAoIlwiIiArIHNrZWxldG9uICsgIlwiIik7CisgICAgb3V0cHV0ICs9ICIsXG4iOwogICB9CiAgIG91dHB1dCArPSBSIih9OwotfSAgLy8gbmFtZXNwYWNlIHRvcDUwMF9kb21haW5zCitjb25zdCBjaGFyKiBjb25zdCBrVG9wNTAwS2V5d29yZHNbNTAwXSA9IHsKICkiOwogCisgIGZvciAoY29uc3Qgc3RkOjpzdHJpbmcmIGtleXdvcmQgOiBzb3J0ZWRfa2V5d29yZHMpIHsKKyAgICBvdXRwdXQgKz0gKCJcIiIgKyBrZXl3b3JkICsgIlwiIik7CisgICAgb3V0cHV0ICs9ICIsXG4iOworICB9CisgIG91dHB1dCArPSBSIih9OworfSAgLy8gbmFtZXNwYWNlIHRvcDUwMF9kb21haW5zKSI7CisKICAgYmFzZTo6RmlsZVBhdGggb3V0cHV0X3BhdGggPSBiYXNlOjpGaWxlUGF0aDo6RnJvbVVURjhVbnNhZmUoYXJndlsyXSk7CiAgIGlmIChiYXNlOjpXcml0ZUZpbGUob3V0cHV0X3BhdGgsIG91dHB1dC5jX3N0cigpLAogICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihvdXRwdXQuc2l6ZSgpKSkgPD0gMCkgewpkaWZmIC0tZ2l0IGEvY29tcG9uZW50cy91cmxfZm9ybWF0dGVyL3Nwb29mX2NoZWNrcy90b3BfZG9tYWlucy90b3A1MDBfZG9tYWlucy5oIGIvY29tcG9uZW50cy91cmxfZm9ybWF0dGVyL3Nwb29mX2NoZWNrcy90b3BfZG9tYWlucy90b3A1MDBfZG9tYWlucy5oCmluZGV4IDE2YjIxMWMuLmE0ZDlmODQ1IDEwMDY0NAotLS0gYS9jb21wb25lbnRzL3VybF9mb3JtYXR0ZXIvc3Bvb2ZfY2hlY2tzL3RvcF9kb21haW5zL3RvcDUwMF9kb21haW5zLmgKKysrIGIvY29tcG9uZW50cy91cmxfZm9ybWF0dGVyL3Nwb29mX2NoZWNrcy90b3BfZG9tYWlucy90b3A1MDBfZG9tYWlucy5oCkBAIC02LDcgKzYsOSBAQAogCiBuYW1lc3BhY2UgdG9wNTAwX2RvbWFpbnMgewogCi1leHRlcm4gY29uc3QgY2hhciogY29uc3Qga1RvcDUwMFs1MDBdOworZXh0ZXJuIGNvbnN0IGNoYXIqIGNvbnN0IGtUb3A1MDBFZGl0RGlzdGFuY2VTa2VsZXRvbnNbNTAwXTsKKworZXh0ZXJuIGNvbnN0IGNoYXIqIGNvbnN0IGtUb3A1MDBLZXl3b3Jkc1s1MDBdOwogCiB9ICAvLyBuYW1lc3BhY2UgdG9wNTAwX2RvbWFpbnMKIApkaWZmIC0tZ2l0IGEvY29tcG9uZW50cy91cmxfZm9ybWF0dGVyL3Nwb29mX2NoZWNrcy90b3BfZG9tYWlucy90b3BfZG9tYWluX3V0aWwuY2MgYi9jb21wb25lbnRzL3VybF9mb3JtYXR0ZXIvc3Bvb2ZfY2hlY2tzL3RvcF9kb21haW5zL3RvcF9kb21haW5fdXRpbC5jYwppbmRleCBiYjliZWFkLi43NjNlYWFkIDEwMDY0NAotLS0gYS9jb21wb25lbnRzL3VybF9mb3JtYXR0ZXIvc3Bvb2ZfY2hlY2tzL3RvcF9kb21haW5zL3RvcF9kb21haW5fdXRpbC5jYworKysgYi9jb21wb25lbnRzL3VybF9mb3JtYXR0ZXIvc3Bvb2ZfY2hlY2tzL3RvcF9kb21haW5zL3RvcF9kb21haW5fdXRpbC5jYwpAQCAtMTcsNiArMTcsMTEgQEAKIAogfSAgLy8gbmFtZXNwYWNlCiAKK2Jvb2wgSXNFZGl0RGlzdGFuY2VDYW5kaWRhdGUoY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3RuYW1lKSB7CisgIHJldHVybiAhaG9zdG5hbWUuZW1wdHkoKSAmJgorICAgICAgICAgSG9zdG5hbWVXaXRob3V0UmVnaXN0cnkoaG9zdG5hbWUpLnNpemUoKSA+PSBrTWluTGVuZ3RoRm9yRWRpdERpc3RhbmNlOworfQorCiBzdGQ6OnN0cmluZyBIb3N0bmFtZVdpdGhvdXRSZWdpc3RyeShjb25zdCBzdGQ6OnN0cmluZyYgaG9zdG5hbWUpIHsKICAgRENIRUNLKCFob3N0bmFtZS5lbXB0eSgpKTsKICAgY29uc3Qgc2l6ZV90IHJlZ2lzdHJ5X3NpemUgPQpAQCAtMjcsMTEgKzMyLDYgQEAKICAgcmV0dXJuIGhvc3RuYW1lLnN1YnN0cigwLCBob3N0bmFtZS5zaXplKCkgLSByZWdpc3RyeV9zaXplKTsKIH0KIAotYm9vbCBJc0VkaXREaXN0YW5jZUNhbmRpZGF0ZShjb25zdCBzdGQ6OnN0cmluZyYgaG9zdG5hbWUpIHsKLSAgcmV0dXJuICFob3N0bmFtZS5lbXB0eSgpICYmCi0gICAgICAgICBIb3N0bmFtZVdpdGhvdXRSZWdpc3RyeShob3N0bmFtZSkuc2l6ZSgpID49IGtNaW5MZW5ndGhGb3JFZGl0RGlzdGFuY2U7Ci19Ci0KIH0gIC8vIG5hbWVzcGFjZSB0b3BfZG9tYWlucwogCiB9ICAvLyBuYW1lc3BhY2UgdXJsX2Zvcm1hdHRlcgpkaWZmIC0tZ2l0IGEvY29tcG9uZW50cy92aXovdGVzdC90ZXN0X2NvbnRleHRfc3VwcG9ydC5jYyBiL2NvbXBvbmVudHMvdml6L3Rlc3QvdGVzdF9jb250ZXh0X3N1cHBvcnQuY2MKaW5kZXggMTczY2M0ZC4uZjJjZDZiNyAxMDA2NDQKLS0tIGEvY29tcG9uZW50cy92aXovdGVzdC90ZXN0X2NvbnRleHRfc3VwcG9ydC5jYworKysgYi9jb21wb25lbnRzL3Zpei90ZXN0L3Rlc3RfY29udGV4dF9zdXBwb3J0LmNjCkBAIC0xMzgsNyArMTM4LDcgQEAKICAgcmV0dXJuIGZhbHNlOwogfQogYm9vbCBUZXN0Q29udGV4dFN1cHBvcnQ6OkNhbkRlY29kZVdpdGhIYXJkd2FyZUFjY2VsZXJhdGlvbigKLSAgICBiYXNlOjpzcGFuPGNvbnN0IHVpbnQ4X3Q+IGVuY29kZWRfZGF0YSkgY29uc3QgeworICAgIGNvbnN0IGNjOjpJbWFnZUhlYWRlck1ldGFkYXRhKiBpbWFnZV9tZXRhZGF0YSkgY29uc3QgewogICByZXR1cm4gZmFsc2U7CiB9CiAKZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvdml6L3Rlc3QvdGVzdF9jb250ZXh0X3N1cHBvcnQuaCBiL2NvbXBvbmVudHMvdml6L3Rlc3QvdGVzdF9jb250ZXh0X3N1cHBvcnQuaAppbmRleCA4YmM2ZmUxLi4xYmIzOTNkYyAxMDA2NDQKLS0tIGEvY29tcG9uZW50cy92aXovdGVzdC90ZXN0X2NvbnRleHRfc3VwcG9ydC5oCisrKyBiL2NvbXBvbmVudHMvdml6L3Rlc3QvdGVzdF9jb250ZXh0X3N1cHBvcnQuaApAQCAtODAsNyArODAsNyBAQAogICBib29sIElzSnBlZ0RlY29kZUFjY2VsZXJhdGlvblN1cHBvcnRlZCgpIGNvbnN0IG92ZXJyaWRlOwogICBib29sIElzV2ViUERlY29kZUFjY2VsZXJhdGlvblN1cHBvcnRlZCgpIGNvbnN0IG92ZXJyaWRlOwogICBib29sIENhbkRlY29kZVdpdGhIYXJkd2FyZUFjY2VsZXJhdGlvbigKLSAgICAgIGJhc2U6OnNwYW48Y29uc3QgdWludDhfdD4gZW5jb2RlZF9kYXRhKSBjb25zdCBvdmVycmlkZTsKKyAgICAgIGNvbnN0IGNjOjpJbWFnZUhlYWRlck1ldGFkYXRhKiBpbWFnZV9tZXRhZGF0YSkgY29uc3Qgb3ZlcnJpZGU7CiAgIGJvb2wgSGFzR3JDb250ZXh0U3VwcG9ydCgpIGNvbnN0IG92ZXJyaWRlOwogICB2b2lkIFNldEdyQ29udGV4dChHckNvbnRleHQqIGdyKSBvdmVycmlkZTsKICAgdm9pZCBXaWxsQ2FsbEdMRnJvbVNraWEoKSBvdmVycmlkZTsKZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvd2ViX2NhY2hlL2Jyb3dzZXIvd2ViX2NhY2hlX21hbmFnZXIuY2MgYi9jb21wb25lbnRzL3dlYl9jYWNoZS9icm93c2VyL3dlYl9jYWNoZV9tYW5hZ2VyLmNjCmluZGV4IDc1ZjkzNzIuLjMzYzY5ZGEgMTAwNjQ0Ci0tLSBhL2NvbXBvbmVudHMvd2ViX2NhY2hlL2Jyb3dzZXIvd2ViX2NhY2hlX21hbmFnZXIuY2MKKysrIGIvY29tcG9uZW50cy93ZWJfY2FjaGUvYnJvd3Nlci93ZWJfY2FjaGVfbWFuYWdlci5jYwpAQCAtMTgsNyArMTgsNiBAQAogI2luY2x1ZGUgImJhc2UvdGltZS90aW1lLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9wcmVmcy9wcmVmX3JlZ2lzdHJ5X3NpbXBsZS5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvcHJlZnMvcHJlZl9zZXJ2aWNlLmgiCi0jaW5jbHVkZSAiY29udGVudC9wdWJsaWMvYnJvd3Nlci9yZW5kZXJfcHJvY2Vzc19ob3N0LmgiCiAjaW5jbHVkZSAic2VydmljZXMvc2VydmljZV9tYW5hZ2VyL3B1YmxpYy9jcHAvaW50ZXJmYWNlX3Byb3ZpZGVyLmgiCiAKIHVzaW5nIGJhc2U6OlRpbWU7CmRpZmYgLS1naXQgYS9jb21wb25lbnRzL3dlYl9jYWNoZS9icm93c2VyL3dlYl9jYWNoZV9tYW5hZ2VyLmggYi9jb21wb25lbnRzL3dlYl9jYWNoZS9icm93c2VyL3dlYl9jYWNoZV9tYW5hZ2VyLmgKaW5kZXggZWM1MTQ0YS4uNDZmNTQ4ZiAxMDA2NDQKLS0tIGEvY29tcG9uZW50cy93ZWJfY2FjaGUvYnJvd3Nlci93ZWJfY2FjaGVfbWFuYWdlci5oCisrKyBiL2NvbXBvbmVudHMvd2ViX2NhY2hlL2Jyb3dzZXIvd2ViX2NhY2hlX21hbmFnZXIuaApAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgImJhc2Uvc2NvcGVkX29ic2VydmVyLmgiCiAjaW5jbHVkZSAiYmFzZS90aW1lL3RpbWUuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL3dlYl9jYWNoZS9wdWJsaWMvbW9qb20vd2ViX2NhY2hlLm1vam9tLmgiCisjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvYnJvd3Nlci9yZW5kZXJfcHJvY2Vzc19ob3N0LmgiCiAjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvYnJvd3Nlci9yZW5kZXJfcHJvY2Vzc19ob3N0X2NyZWF0aW9uX29ic2VydmVyLmgiCiAjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvYnJvd3Nlci9yZW5kZXJfcHJvY2Vzc19ob3N0X29ic2VydmVyLmgiCiAjaW5jbHVkZSAibW9qby9wdWJsaWMvY3BwL2JpbmRpbmdzL3JlbW90ZS5oIgpkaWZmIC0tZ2l0IGEvY29udGVudC9hcHAvY29udGVudF9tYWluX3J1bm5lcl9pbXBsLmNjIGIvY29udGVudC9hcHAvY29udGVudF9tYWluX3J1bm5lcl9pbXBsLmNjCmluZGV4IGY3MjViOTQuLmM1M2QzMDEgMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvYXBwL2NvbnRlbnRfbWFpbl9ydW5uZXJfaW1wbC5jYworKysgYi9jb250ZW50L2FwcC9jb250ZW50X21haW5fcnVubmVyX2ltcGwuY2MKQEAgLTUyLDEwICs1MiwxMCBAQAogI2luY2x1ZGUgImNvbnRlbnQvYnJvd3Nlci9zY2hlZHVsZXIvYnJvd3Nlcl90YXNrX2V4ZWN1dG9yLmgiCiAjaW5jbHVkZSAiY29udGVudC9icm93c2VyL3N0YXJ0dXBfZGF0YV9pbXBsLmgiCiAjaW5jbHVkZSAiY29udGVudC9icm93c2VyL3N0YXJ0dXBfaGVscGVyLmgiCisjaW5jbHVkZSAiY29udGVudC9icm93c2VyL3RyYWNpbmcvbWVtb3J5X2luc3RydW1lbnRhdGlvbl91dGlsLmgiCiAjaW5jbHVkZSAiY29udGVudC9jb21tb24vY29udGVudF9jb25zdGFudHNfaW50ZXJuYWwuaCIKICNpbmNsdWRlICJjb250ZW50L2NvbW1vbi91cmxfc2NoZW1lcy5oIgogI2luY2x1ZGUgImNvbnRlbnQvcHVibGljL2FwcC9jb250ZW50X21haW5fZGVsZWdhdGUuaCIKLSNpbmNsdWRlICJjb250ZW50L3B1YmxpYy9icm93c2VyL3Jlc291cmNlX2Nvb3JkaW5hdG9yX3NlcnZpY2UuaCIKICNpbmNsdWRlICJjb250ZW50L3B1YmxpYy9icm93c2VyL3N5c3RlbV9jb25uZWN0b3IuaCIKICNpbmNsdWRlICJjb250ZW50L3B1YmxpYy9jb21tb24vY29udGVudF9jb25zdGFudHMuaCIKICNpbmNsdWRlICJjb250ZW50L3B1YmxpYy9jb21tb24vY29udGVudF9kZXNjcmlwdG9yX2tleXMuaCIKQEAgLTcwLDggKzcwLDYgQEAKICNpbmNsdWRlICJtZWRpYS9tZWRpYV9idWlsZGZsYWdzLmgiCiAjaW5jbHVkZSAicHBhcGkvYnVpbGRmbGFncy9idWlsZGZsYWdzLmgiCiAjaW5jbHVkZSAic2VydmljZXMvbmV0d29yay9wdWJsaWMvY3BwL2ZlYXR1cmVzLmgiCi0jaW5jbHVkZSAic2VydmljZXMvcmVzb3VyY2VfY29vcmRpbmF0b3IvcHVibGljL2NwcC9tZW1vcnlfaW5zdHJ1bWVudGF0aW9uL2NsaWVudF9wcm9jZXNzX2ltcGwuaCIKLSNpbmNsdWRlICJzZXJ2aWNlcy9yZXNvdXJjZV9jb29yZGluYXRvci9wdWJsaWMvbW9qb20vbWVtb3J5X2luc3RydW1lbnRhdGlvbi9tZW1vcnlfaW5zdHJ1bWVudGF0aW9uLm1vam9tLmgiCiAjaW5jbHVkZSAic2VydmljZXMvc2VydmljZV9tYW5hZ2VyL2VtYmVkZGVyL3N3aXRjaGVzLmgiCiAjaW5jbHVkZSAic2VydmljZXMvc2VydmljZV9tYW5hZ2VyL3NhbmRib3gvc2FuZGJveF90eXBlLmgiCiAjaW5jbHVkZSAic2VydmljZXMvc2VydmljZV9tYW5hZ2VyL3NhbmRib3gvc3dpdGNoZXMuaCIKQEAgLTQxNywyMyArNDE1LDYgQEAKIAogI2VuZGlmICAvLyBPU19MSU5VWAogCi0jaWYgIWRlZmluZWQoQ0hST01FX01VTFRJUExFX0RMTF9DSElMRCkKLXZvaWQgSW5pdGlhbGl6ZUJyb3dzZXJDbGllbnRQcm9jZXNzSW1wbCgpIHsKLSAgLy8gUmVnaXN0ZXJzIHRoZSBicm93c2VyIHByb2Nlc3MgYXMgYSBtZW1vcnktaW5zdHJ1bWVudGF0aW9uIGNsaWVudCwgc28KLSAgLy8gdGhhdCBkYXRhIGZvciB0aGUgYnJvd3NlciBwcm9jZXNzIHdpbGwgYmUgYXZhaWxhYmxlIGluIG1lbW9yeSBkdW1wcy4KLSAgbW9qbzo6UGVuZGluZ1JlbW90ZTxtZW1vcnlfaW5zdHJ1bWVudGF0aW9uOjptb2pvbTo6Q29vcmRpbmF0b3I+IGNvb3JkaW5hdG9yOwotICBtb2pvOjpQZW5kaW5nUmVtb3RlPG1lbW9yeV9pbnN0cnVtZW50YXRpb246Om1vam9tOjpDbGllbnRQcm9jZXNzPiBwcm9jZXNzOwotICBhdXRvIHByb2Nlc3NfcmVjZWl2ZXIgPSBwcm9jZXNzLkluaXRXaXRoTmV3UGlwZUFuZFBhc3NSZWNlaXZlcigpOwotICBHZXRNZW1vcnlJbnN0cnVtZW50YXRpb25Db29yZGluYXRvckNvbnRyb2xsZXIoKS0+UmVnaXN0ZXJDbGllbnRQcm9jZXNzKAotICAgICAgY29vcmRpbmF0b3IuSW5pdFdpdGhOZXdQaXBlQW5kUGFzc1JlY2VpdmVyKCksIHN0ZDo6bW92ZShwcm9jZXNzKSwKLSAgICAgIG1lbW9yeV9pbnN0cnVtZW50YXRpb246Om1vam9tOjpQcm9jZXNzVHlwZTo6QlJPV1NFUiwKLSAgICAgIGJhc2U6OkdldEN1cnJlbnRQcm9jSWQoKSwgLypzZXJ2aWNlX25hbWU9Ki9iYXNlOjpudWxsb3B0KTsKLSAgbWVtb3J5X2luc3RydW1lbnRhdGlvbjo6Q2xpZW50UHJvY2Vzc0ltcGw6OkNyZWF0ZUluc3RhbmNlKAotICAgICAgc3RkOjptb3ZlKHByb2Nlc3NfcmVjZWl2ZXIpLCBzdGQ6Om1vdmUoY29vcmRpbmF0b3IpLAotICAgICAgLyppc19icm93c2VyX3Byb2Nlc3M9Ki90cnVlKTsKLX0KLSNlbmRpZiAgLy8gIWRlZmluZWQoQ0hST01FX01VTFRJUExFX0RMTF9DSElMRCkKLQogfSAgLy8gbmFtZXNwYWNlCiAKIGNsYXNzIENvbnRlbnRDbGllbnRJbml0aWFsaXplciB7CkBAIC05NzUsNyArOTU2LDcgQEAKICAgICBkb3dubG9hZDo6U2V0SU9UYXNrUnVubmVyKAogICAgICAgICBzZXJ2aWNlX21hbmFnZXJfZW52aXJvbm1lbnRfLT5pcGNfdGhyZWFkKCktPnRhc2tfcnVubmVyKCkpOwogCi0gICAgSW5pdGlhbGl6ZUJyb3dzZXJDbGllbnRQcm9jZXNzSW1wbCgpOworICAgIEluaXRpYWxpemVCcm93c2VyTWVtb3J5SW5zdHJ1bWVudGF0aW9uQ2xpZW50KCk7CiAKICNpZiBkZWZpbmVkKE9TX0FORFJPSUQpCiAgICAgaWYgKHN0YXJ0X3NlcnZpY2VfbWFuYWdlcl9vbmx5KSB7CmRpZmYgLS1naXQgYS9jb250ZW50L2Jyb3dzZXIvQlVJTEQuZ24gYi9jb250ZW50L2Jyb3dzZXIvQlVJTEQuZ24KaW5kZXggNWEzMGQ4OGMuLjNkZGIyMjMgMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvYnJvd3Nlci9CVUlMRC5nbgorKysgYi9jb250ZW50L2Jyb3dzZXIvQlVJTEQuZ24KQEAgLTE4MTYsNiArMTgxNiw4IEBACiAgICAgInRyYWNpbmcvYmFja2dyb3VuZF90cmFjaW5nX3J1bGUuaCIsCiAgICAgInRyYWNpbmcvZmlsZV90cmFjaW5nX3Byb3ZpZGVyX2ltcGwuY2MiLAogICAgICJ0cmFjaW5nL2ZpbGVfdHJhY2luZ19wcm92aWRlcl9pbXBsLmgiLAorICAgICJ0cmFjaW5nL21lbW9yeV9pbnN0cnVtZW50YXRpb25fdXRpbC5jYyIsCisgICAgInRyYWNpbmcvbWVtb3J5X2luc3RydW1lbnRhdGlvbl91dGlsLmgiLAogICAgICJ0cmFjaW5nL3BlcmZldHRvX2ZpbGVfdHJhY2VyLmNjIiwKICAgICAidHJhY2luZy9wZXJmZXR0b19maWxlX3RyYWNlci5oIiwKICAgICAidHJhY2luZy90cmFjaW5nX2NvbnRyb2xsZXJfaW1wbC5jYyIsCmRpZmYgLS1naXQgYS9jb250ZW50L2Jyb3dzZXIvREVQUyBiL2NvbnRlbnQvYnJvd3Nlci9ERVBTCmluZGV4IDQ2NDA5ZmEuLmY1ZGI2ZDAgMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvYnJvd3Nlci9ERVBTCisrKyBiL2NvbnRlbnQvYnJvd3Nlci9ERVBTCkBAIC0xNyw2ICsxNyw3IEBACiAgICIrY29tcG9uZW50cy9zZXJ2aWNlcy9sZXZlbGRiIiwKICAgIitjb21wb25lbnRzL3NlcnZpY2VzL3F1YXJhbnRpbmUvdGVzdF9zdXBwb3J0LmgiLAogICAiK2NvbXBvbmVudHMvc2VydmljZXMvcXVhcmFudGluZS9xdWFyYW50aW5lLmgiLAorICAiK2NvbXBvbmVudHMvc2VydmljZXMvc3RvcmFnZSIsCiAgICIrY29tcG9uZW50cy9zZXNzaW9uX21hbmFnZXIvY29yZSIsCiAgICIrY29tcG9uZW50cy9sZXZlbGRiX3Byb3RvL3B1YmxpYyIsCiAgICIrY29tcG9uZW50cy9saW5rX2hlYWRlcl91dGlsIiwKZGlmZiAtLWdpdCBhL2NvbnRlbnQvYnJvd3Nlci9iYWNrX2ZvcndhcmRfY2FjaGVfYnJvd3NlcnRlc3QuY2MgYi9jb250ZW50L2Jyb3dzZXIvYmFja19mb3J3YXJkX2NhY2hlX2Jyb3dzZXJ0ZXN0LmNjCmluZGV4IGI1YzA5ZTkuLjI2YjNlNDMgMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvYnJvd3Nlci9iYWNrX2ZvcndhcmRfY2FjaGVfYnJvd3NlcnRlc3QuY2MKKysrIGIvY29udGVudC9icm93c2VyL2JhY2tfZm9yd2FyZF9jYWNoZV9icm93c2VydGVzdC5jYwpAQCAtMjczMSw0ICsyNzMxLDI2IEBACiAgIH0KIH0KIAorSU5fUFJPQ19CUk9XU0VSX1RFU1RfRihCYWNrRm9yd2FyZENhY2hlQnJvd3NlclRlc3QsIEVuY29kaW5nKSB7CisgIEFTU0VSVF9UUlVFKGVtYmVkZGVkX3Rlc3Rfc2VydmVyKCktPlN0YXJ0KCkpOworICBjb25zdCBHVVJMIHVybF9hKGVtYmVkZGVkX3Rlc3Rfc2VydmVyKCktPkdldFVSTCgKKyAgICAgICJhLmNvbSIsICIvYmFja19mb3J3YXJkX2NhY2hlL2NoYXJzZXRfd2luZG93cy0xMjUwLmh0bWwiKSk7CisgIGNvbnN0IEdVUkwgdXJsX2IoZW1iZWRkZWRfdGVzdF9zZXJ2ZXIoKS0+R2V0VVJMKAorICAgICAgImIuY29tIiwgIi9iYWNrX2ZvcndhcmRfY2FjaGUvY2hhcnNldF91dGYtOC5odG1sIikpOworICBjb25zdCB1cmw6Ok9yaWdpbiBvcmlnaW5fYSA9IHVybDo6T3JpZ2luOjpDcmVhdGUodXJsX2EpOworICBjb25zdCB1cmw6Ok9yaWdpbiBvcmlnaW5fYiA9IHVybDo6T3JpZ2luOjpDcmVhdGUodXJsX2IpOworCisgIEVYUEVDVF9UUlVFKE5hdmlnYXRlVG9VUkwoc2hlbGwoKSwgdXJsX2EpKTsKKyAgUmVuZGVyRnJhbWVIb3N0SW1wbCogcmZoX2EgPSBjdXJyZW50X2ZyYW1lX2hvc3QoKTsKKyAgRVhQRUNUX0VRKHdlYl9jb250ZW50cygpLT5HZXRFbmNvZGluZygpLCAid2luZG93cy0xMjUwIik7CisKKyAgRVhQRUNUX1RSVUUoTmF2aWdhdGVUb1VSTChzaGVsbCgpLCB1cmxfYikpOworICBFWFBFQ1RfVFJVRShyZmhfYS0+aXNfaW5fYmFja19mb3J3YXJkX2NhY2hlKCkpOworICBFWFBFQ1RfRVEod2ViX2NvbnRlbnRzKCktPkdldEVuY29kaW5nKCksICJVVEYtOCIpOworCisgIHdlYl9jb250ZW50cygpLT5HZXRDb250cm9sbGVyKCkuR29CYWNrKCk7CisgIEVYUEVDVF9UUlVFKFdhaXRGb3JMb2FkU3RvcChzaGVsbCgpLT53ZWJfY29udGVudHMoKSkpOworICBFWFBFQ1RfRVEod2ViX2NvbnRlbnRzKCktPkdldEVuY29kaW5nKCksICJ3aW5kb3dzLTEyNTAiKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGNvbnRlbnQKZGlmZiAtLWdpdCBhL2NvbnRlbnQvYnJvd3Nlci9iYWNrZ3JvdW5kX3N5bmMvYmFja2dyb3VuZF9zeW5jX21hbmFnZXIuY2MgYi9jb250ZW50L2Jyb3dzZXIvYmFja2dyb3VuZF9zeW5jL2JhY2tncm91bmRfc3luY19tYW5hZ2VyLmNjCmluZGV4IDY5MTBmNWEuLmU5YzYwOGQgMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvYnJvd3Nlci9iYWNrZ3JvdW5kX3N5bmMvYmFja2dyb3VuZF9zeW5jX21hbmFnZXIuY2MKKysrIGIvY29udGVudC9icm93c2VyL2JhY2tncm91bmRfc3luYy9iYWNrZ3JvdW5kX3N5bmNfbWFuYWdlci5jYwpAQCAtMTg1OSwyMyArMTg1OSwyMyBAQAogICBvcF9zY2hlZHVsZXJfLlNjaGVkdWxlT3BlcmF0aW9uKAogICAgICAgaWQsIENhY2hlU3RvcmFnZVNjaGVkdWxlck1vZGU6OmtFeGNsdXNpdmUsCiAgICAgICBDYWNoZVN0b3JhZ2VTY2hlZHVsZXJPcDo6a0JhY2tncm91bmRTeW5jLAotICAgICAgYmFzZTo6QmluZE9uY2UoCi0gICAgICAgICAgJkJhY2tncm91bmRTeW5jTWFuYWdlcjo6RmlyZVJlYWR5RXZlbnRzSW1wbCwKLSAgICAgICAgICB3ZWFrX3B0cl9mYWN0b3J5Xy5HZXRXZWFrUHRyKCksIHN5bmNfdHlwZSwgcmVzY2hlZHVsZSwKLSAgICAgICAgICBvcF9zY2hlZHVsZXJfLldyYXBDYWxsYmFja1RvUnVuTmV4dChpZCwgc3RkOjptb3ZlKGNhbGxiYWNrKSksCi0gICAgICAgICAgc3RkOjptb3ZlKGtlZXBhbGl2ZSkpKTsKKyAgICAgIGJhc2U6OkJpbmRPbmNlKCZCYWNrZ3JvdW5kU3luY01hbmFnZXI6OkZpcmVSZWFkeUV2ZW50c0ltcGwsCisgICAgICAgICAgICAgICAgICAgICB3ZWFrX3B0cl9mYWN0b3J5Xy5HZXRXZWFrUHRyKCksIHN5bmNfdHlwZSwgcmVzY2hlZHVsZSwgaWQsCisgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoY2FsbGJhY2spLCBzdGQ6Om1vdmUoa2VlcGFsaXZlKSkpOwogfQogCiB2b2lkIEJhY2tncm91bmRTeW5jTWFuYWdlcjo6RmlyZVJlYWR5RXZlbnRzSW1wbCgKICAgICBibGluazo6bW9qb206OkJhY2tncm91bmRTeW5jVHlwZSBzeW5jX3R5cGUsCiAgICAgYm9vbCByZXNjaGVkdWxlLAorICAgIGludCBzY2hlZHVsZXJfaWQsCiAgICAgYmFzZTo6T25jZUNsb3N1cmUgY2FsbGJhY2ssCiAgICAgc3RkOjp1bmlxdWVfcHRyPEJhY2tncm91bmRTeW5jRXZlbnRLZWVwQWxpdmU+IGtlZXBhbGl2ZSkgewogICBEQ0hFQ0tfQ1VSUkVOVExZX09OKFNlcnZpY2VXb3JrZXJDb250ZXh0OjpHZXRDb3JlVGhyZWFkSWQoKSk7CiAKICAgaWYgKGRpc2FibGVkXykgewotICAgIGJhc2U6OlRocmVhZFRhc2tSdW5uZXJIYW5kbGU6OkdldCgpLT5Qb3N0VGFzayhGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShjYWxsYmFjaykpOworICAgIGJhc2U6OlRocmVhZFRhc2tSdW5uZXJIYW5kbGU6OkdldCgpLT5Qb3N0VGFzaygKKyAgICAgICAgRlJPTV9IRVJFLAorICAgICAgICBvcF9zY2hlZHVsZXJfLldyYXBDYWxsYmFja1RvUnVuTmV4dChzY2hlZHVsZXJfaWQsIHN0ZDo6bW92ZShjYWxsYmFjaykpKTsKICAgICByZXR1cm47CiAgIH0KIApAQCAtMTkxNywyNyArMTkxNyw0NiBAQAogICAgIC8vIGNhbGxlZCBmcm9tIGEgd2FrZXVwIHRhc2suCiAgICAgaWYgKHJlc2NoZWR1bGUpCiAgICAgICBTY2hlZHVsZU9yQ2FuY2VsRGVsYXllZFByb2Nlc3Npbmcoc3luY190eXBlKTsKLSAgICBiYXNlOjpUaHJlYWRUYXNrUnVubmVySGFuZGxlOjpHZXQoKS0+UG9zdFRhc2soRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoY2FsbGJhY2spKTsKKyAgICBiYXNlOjpUaHJlYWRUYXNrUnVubmVySGFuZGxlOjpHZXQoKS0+UG9zdFRhc2soCisgICAgICAgIEZST01fSEVSRSwKKyAgICAgICAgb3Bfc2NoZWR1bGVyXy5XcmFwQ2FsbGJhY2tUb1J1bk5leHQoc2NoZWR1bGVyX2lkLCBzdGQ6Om1vdmUoY2FsbGJhY2spKSk7CiAgICAgcmV0dXJuOwogICB9CiAKICAgYmFzZTo6VGltZVRpY2tzIHN0YXJ0X3RpbWUgPSBiYXNlOjpUaW1lVGlja3M6Ok5vdygpOwogCi0gIC8vIEZpcmUgdGhlIHN5bmMgZXZlbnQgb2YgdGhlIHJlYWR5IHJlZ2lzdHJhdGlvbnMgYW5kIHJ1biB8Y2FsbGJhY2t8IG9uY2UKLSAgLy8gdGhleSdyZSBhbGwgZG9uZS4KKyAgLy8gSWYgd2UndmUgYmVlbiBjYWxsZWQgZnJvbSBhIHdha2UgdXAgdGFzaywgcG90ZW50aWFsbHkga2VlcCB0aGUgYnJvd3NlcgorICAvLyBhd2FrZSB0aWxsIGFsbCBldmVudHMgaGF2ZSBjb21wbGV0ZWQuIElmIG5vdCwgd2Ugb25seSBkbyBzbyB1bnRpbCBhbGwKKyAgLy8gZXZlbnRzIGhhdmUgYmVlbiBmaXJlZC4KKyAgLy8gVG8gYWxsb3cgdGhlIHxvcF9zY2hlZHVsZXJffCB0byBwcm9jZXNzIG90aGVyIHRhc2tzIGFmdGVyIHN5bmMgZXZlbnRzCisgIC8vIGhhdmUgYmVlbiBmaXJlZCwgbWFyayB0aGlzIHRhc2sgY29tcGxldGUgYWZ0ZXIgZmlyaW5nIGV2ZW50cy4KKyAgYmFzZTo6T25jZUNsb3N1cmUgZXZlbnRzX2ZpcmVkX2NhbGxiYWNrLCBldmVudHNfY29tcGxldGVkX2NhbGxiYWNrOworICBib29sIGtlZXBfYnJvd3Nlcl9hd2FrZV90aWxsX2V2ZW50c19jb21wbGV0ZSA9CisgICAgICAhcmVzY2hlZHVsZSAmJiBwYXJhbWV0ZXJzXy0+a2VlcF9icm93c2VyX2F3YWtlX3RpbGxfZXZlbnRzX2NvbXBsZXRlOworICBpZiAoa2VlcF9icm93c2VyX2F3YWtlX3RpbGxfZXZlbnRzX2NvbXBsZXRlKSB7CisgICAgZXZlbnRzX2ZpcmVkX2NhbGxiYWNrID0gTWFrZUVtcHR5Q29tcGxldGlvbihzY2hlZHVsZXJfaWQpOworICAgIGV2ZW50c19jb21wbGV0ZWRfY2FsbGJhY2sgPSBzdGQ6Om1vdmUoY2FsbGJhY2spOworICB9IGVsc2UgeworICAgIGV2ZW50c19maXJlZF9jYWxsYmFjayA9CisgICAgICAgIG9wX3NjaGVkdWxlcl8uV3JhcENhbGxiYWNrVG9SdW5OZXh0KHNjaGVkdWxlcl9pZCwgc3RkOjptb3ZlKGNhbGxiYWNrKSk7CisgICAgZXZlbnRzX2NvbXBsZXRlZF9jYWxsYmFjayA9IGJhc2U6OkRvTm90aGluZzo6T25jZSgpOworICB9CisKKyAgLy8gRmlyZSB0aGUgc3luYyBldmVudCBvZiB0aGUgcmVhZHkgcmVnaXN0cmF0aW9ucyBhbmQgcnVuCisgIC8vIHxldmVudHNfZmlyZWRfY2xvc3VyZXwgb25jZSB0aGV5J3JlIGFsbCBkb25lLgogICBiYXNlOjpSZXBlYXRpbmdDbG9zdXJlIGV2ZW50c19maXJlZF9iYXJyaWVyX2Nsb3N1cmUgPSBiYXNlOjpCYXJyaWVyQ2xvc3VyZSgKICAgICAgIHRvX2ZpcmUuc2l6ZSgpLAogICAgICAgYmFzZTo6QmluZE9uY2UoJkJhY2tncm91bmRTeW5jTWFuYWdlcjo6RmlyZVJlYWR5RXZlbnRzQWxsRXZlbnRzRmlyaW5nLAogICAgICAgICAgICAgICAgICAgICAgd2Vha19wdHJfZmFjdG9yeV8uR2V0V2Vha1B0cigpLCBzeW5jX3R5cGUsIHJlc2NoZWR1bGUsCi0gICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoY2FsbGJhY2spKSk7CisgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoZXZlbnRzX2ZpcmVkX2NhbGxiYWNrKSkpOwogCiAgIC8vIFJlY29yZCB0aGUgdG90YWwgdGltZSB0YWtlbiBhZnRlciBhbGwgZXZlbnRzIGhhdmUgcnVuIHRvIGNvbXBsZXRpb24uCiAgIGJhc2U6OlJlcGVhdGluZ0Nsb3N1cmUgZXZlbnRzX2NvbXBsZXRlZF9iYXJyaWVyX2Nsb3N1cmUgPQogICAgICAgYmFzZTo6QmFycmllckNsb3N1cmUoCiAgICAgICAgICAgdG9fZmlyZS5zaXplKCksCi0gICAgICAgICAgYmFzZTo6QmluZE9uY2UoJk9uQWxsU3luY0V2ZW50c0NvbXBsZXRlZCwgc3luY190eXBlLCBzdGFydF90aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICFyZXNjaGVkdWxlLCB0b19maXJlLnNpemUoKSkpOworICAgICAgICAgIGJhc2U6OkJpbmRPbmNlKCZCYWNrZ3JvdW5kU3luY01hbmFnZXI6Ok9uQWxsU3luY0V2ZW50c0NvbXBsZXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jX3R5cGUsIHN0YXJ0X3RpbWUsICFyZXNjaGVkdWxlLCB0b19maXJlLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoZXZlbnRzX2NvbXBsZXRlZF9jYWxsYmFjaykpKTsKIAogICBmb3IgKGF1dG8mIHJlZ2lzdHJhdGlvbl9pbmZvIDogdG9fZmlyZSkgewogICAgIGNvbnN0IEJhY2tncm91bmRTeW5jUmVnaXN0cmF0aW9uKiByZWdpc3RyYXRpb24gPQpAQCAtMjAzNiw2ICsyMDU1LDcgQEAKIAogICBpZiAocmVzY2hlZHVsZSkKICAgICBTY2hlZHVsZU9yQ2FuY2VsRGVsYXllZFByb2Nlc3Npbmcoc3luY190eXBlKTsKKwogICBiYXNlOjpUaHJlYWRUYXNrUnVubmVySGFuZGxlOjpHZXQoKS0+UG9zdFRhc2soRlJPTV9IRVJFLCBzdGQ6Om1vdmUoY2FsbGJhY2spKTsKIH0KIApAQCAtMjI3NywxMSArMjI5NywxMyBAQAogICAgIEJhY2tncm91bmRTeW5jVHlwZSBzeW5jX3R5cGUsCiAgICAgY29uc3QgYmFzZTo6VGltZVRpY2tzJiBzdGFydF90aW1lLAogICAgIGJvb2wgZnJvbV93YWtldXBfdGFzaywKLSAgICBpbnQgbnVtYmVyX29mX2JhdGNoZWRfc3luY19ldmVudHMpIHsKKyAgICBpbnQgbnVtYmVyX29mX2JhdGNoZWRfc3luY19ldmVudHMsCisgICAgYmFzZTo6T25jZUNsb3N1cmUgY2FsbGJhY2spIHsKICAgLy8gUmVjb3JkIHRoZSBjb21iaW5lZCB0aW1lIHRha2VuIGJ5IGFsbCBzeW5jIGV2ZW50cy4KICAgQmFja2dyb3VuZFN5bmNNZXRyaWNzOjpSZWNvcmRCYXRjaFN5bmNFdmVudENvbXBsZXRlKAogICAgICAgc3luY190eXBlLCBiYXNlOjpUaW1lVGlja3M6Ok5vdygpIC0gc3RhcnRfdGltZSwgZnJvbV93YWtldXBfdGFzaywKICAgICAgIG51bWJlcl9vZl9iYXRjaGVkX3N5bmNfZXZlbnRzKTsKKyAgYmFzZTo6VGhyZWFkVGFza1J1bm5lckhhbmRsZTo6R2V0KCktPlBvc3RUYXNrKEZST01fSEVSRSwgc3RkOjptb3ZlKGNhbGxiYWNrKSk7CiB9CiAKIHZvaWQgQmFja2dyb3VuZFN5bmNNYW5hZ2VyOjpPblJlZ2lzdHJhdGlvbkRlbGV0ZWRJbXBsKApkaWZmIC0tZ2l0IGEvY29udGVudC9icm93c2VyL2JhY2tncm91bmRfc3luYy9iYWNrZ3JvdW5kX3N5bmNfbWFuYWdlci5oIGIvY29udGVudC9icm93c2VyL2JhY2tncm91bmRfc3luYy9iYWNrZ3JvdW5kX3N5bmNfbWFuYWdlci5oCmluZGV4IGM3OTU0NTEuLmEzN2VmYTggMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvYnJvd3Nlci9iYWNrZ3JvdW5kX3N5bmMvYmFja2dyb3VuZF9zeW5jX21hbmFnZXIuaAorKysgYi9jb250ZW50L2Jyb3dzZXIvYmFja2dyb3VuZF9zeW5jL2JhY2tncm91bmRfc3luY19tYW5hZ2VyLmgKQEAgLTE0Nyw3ICsxNDcsNyBAQAogICAvLyBTY2FucyB0aGUgbGlzdCBvZiBhdmFpbGFibGUgZXZlbnRzIGFuZCBmaXJlcyB0aG9zZSBvZiB0eXBlIHxzeW5jX3R5cGV8IHRoYXQKICAgLy8gYXJlIHJlYWR5IHRvIGZpcmUuIEZvciB0aG9zZSB0aGF0IGNhbid0IHlldCBiZSBmaXJlZCwgd2FrZXVwIGFsYXJtcyBhcmUKICAgLy8gc2V0LiBPbmNlIGFsbCBvZiB0aGlzIGlzIGRvbmUsIGludm9rZXMgfGNhbGxiYWNrfC4KLSAgdm9pZCBGaXJlUmVhZHlFdmVudHMoCisgIHZpcnR1YWwgdm9pZCBGaXJlUmVhZHlFdmVudHMoCiAgICAgICBibGluazo6bW9qb206OkJhY2tncm91bmRTeW5jVHlwZSBzeW5jX3R5cGUsCiAgICAgICBib29sIHJlc2NoZWR1bGUsCiAgICAgICBiYXNlOjpPbmNlQ2xvc3VyZSBjYWxsYmFjaywKQEAgLTMzOSw5ICszMzksMTggQEAKICAgdm9pZCBTY2hlZHVsZURlbGF5ZWRQcm9jZXNzaW5nT2ZSZWdpc3RyYXRpb25zKAogICAgICAgYmxpbms6Om1vam9tOjpCYWNrZ3JvdW5kU3luY1R5cGUgc3luY190eXBlKTsKIAorICAvLyBGaXJlcyByZWFkeSBldmVudHMgZm9yIHxzeW5jX3R5cGV8LgorICAvLyB8cmVzY2hlZHVsZXwgaXMgdHJ1ZSB3aGVuIGl0J3Mgb2sgdG8gc2NoZWR1bGUgYmFja2dyb3VuZCBwcm9jZXNzaW5nIGZyb20KKyAgLy8gdGhpcyBtZXRob2QsIGZhbHNlIG90aGVyd2lzZS4KKyAgLy8gfHNjaGVkdWxlcl9pZHwgaXMgYW4gaWQgdW5pcXVlIHRvIHRoZSB8b3Bfc2NoZWR1bGVyX3wgdGFzay4gSXQncyBwYXNzZWQgdG8KKyAgLy8gY29ycmVjdGx5IG1hcmsgdGhpcyBvcGVyYXRpb24gYXMgZmluaXNoZWQgd2l0aCB0aGUgfG9wX3NjaGVkdWxlcl98IGFuZCBydW4KKyAgLy8gdGhlIG5leHQgb3BlcmF0aW9uIHNjaGVkdWxlZC4KKyAgLy8gfGtlZXBhbGl2ZXwgaXMgdXNlZCB0byBrZWVwIHRoZSBicm93c2VyIGFsaXZlIHVudGlsIHRoZSBmaXJzdCBhdHRlbXB0IHRvCisgIC8vIGZpcmUgYSBzeW5jIGV2ZW50IGhhcyBiZWVuIG1hZGUuCiAgIHZvaWQgRmlyZVJlYWR5RXZlbnRzSW1wbCgKICAgICAgIGJsaW5rOjptb2pvbTo6QmFja2dyb3VuZFN5bmNUeXBlIHN5bmNfdHlwZSwKICAgICAgIGJvb2wgcmVzY2hlZHVsZSwKKyAgICAgIGludCBzY2hlZHVsZXJfaWQsCiAgICAgICBiYXNlOjpPbmNlQ2xvc3VyZSBjYWxsYmFjaywKICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxCYWNrZ3JvdW5kU3luY0V2ZW50S2VlcEFsaXZlPiBrZWVwYWxpdmUpOwogCkBAIC0zODYsNyArMzk1LDggQEAKICAgICAgIGJsaW5rOjptb2pvbTo6QmFja2dyb3VuZFN5bmNUeXBlIHN5bmNfdHlwZSwKICAgICAgIGNvbnN0IGJhc2U6OlRpbWVUaWNrcyYgc3RhcnRfdGltZSwKICAgICAgIGJvb2wgZnJvbV93YWtldXBfdGFzaywKLSAgICAgIGludCBudW1iZXJfb2ZfYmF0Y2hlZF9zeW5jX2V2ZW50cyk7CisgICAgICBpbnQgbnVtYmVyX29mX2JhdGNoZWRfc3luY19ldmVudHMsCisgICAgICBiYXNlOjpPbmNlQ2xvc3VyZSBjYWxsYmFjayk7CiAKICAgLy8gT25SZWdpc3RyYXRpb25EZWxldGVkIGNhbGxiYWNrcwogICB2b2lkIE9uUmVnaXN0cmF0aW9uRGVsZXRlZEltcGwoaW50NjRfdCBzd19yZWdpc3RyYXRpb25faWQsCmRpZmYgLS1naXQgYS9jb250ZW50L2Jyb3dzZXIvYmFja2dyb3VuZF9zeW5jL2JhY2tncm91bmRfc3luY19tYW5hZ2VyX3VuaXR0ZXN0LmNjIGIvY29udGVudC9icm93c2VyL2JhY2tncm91bmRfc3luYy9iYWNrZ3JvdW5kX3N5bmNfbWFuYWdlcl91bml0dGVzdC5jYwppbmRleCBkOWJjZjcyLi41ZjY5OTQyIDEwMDY0NAotLS0gYS9jb250ZW50L2Jyb3dzZXIvYmFja2dyb3VuZF9zeW5jL2JhY2tncm91bmRfc3luY19tYW5hZ2VyX3VuaXR0ZXN0LmNjCisrKyBiL2NvbnRlbnQvYnJvd3Nlci9iYWNrZ3JvdW5kX3N5bmMvYmFja2dyb3VuZF9zeW5jX21hbmFnZXJfdW5pdHRlc3QuY2MKQEAgLTY3Miw2ICs2NzIsMTUgQEAKICAgICBTZXR1cEJhY2tncm91bmRTeW5jTWFuYWdlcigpOwogICB9CiAKKyAgdm9pZCBTZXRLZWVwQnJvd3NlckF3YWtlVGlsbEV2ZW50c0NvbXBsZXRlQW5kUmVzdGFydE1hbmFnZXIoCisgICAgICBib29sIGtlZXBfYnJvd3Nlcl9hd2FrZV90aWxsX2V2ZW50c19jb21wbGV0ZSkgeworICAgIEJhY2tncm91bmRTeW5jUGFyYW1ldGVycyogcGFyYW1ldGVycyA9CisgICAgICAgIEdldENvbnRyb2xsZXIoKS0+YmFja2dyb3VuZF9zeW5jX3BhcmFtZXRlcnMoKTsKKyAgICBwYXJhbWV0ZXJzLT5rZWVwX2Jyb3dzZXJfYXdha2VfdGlsbF9ldmVudHNfY29tcGxldGUgPQorICAgICAgICBrZWVwX2Jyb3dzZXJfYXdha2VfdGlsbF9ldmVudHNfY29tcGxldGU7CisgICAgU2V0dXBCYWNrZ3JvdW5kU3luY01hbmFnZXIoKTsKKyAgfQorCiAgIHZvaWQgRmlyZVJlYWR5RXZlbnRzKCkgeyB0ZXN0X2JhY2tncm91bmRfc3luY19tYW5hZ2VyKCktPk9uTmV0d29ya0NoYW5nZWQoKTsgfQogCiAgIGJvb2wgQXJlT3B0aW9uQ29uZGl0aW9uc01ldCgpIHsKQEAgLTEzODQsNiArMTM5MywzMyBAQAogICBFWFBFQ1RfRkFMU0UoR2V0UmVnaXN0cmF0aW9uKHN5bmNfb3B0aW9uc18xXykpOwogfQogCitURVNUX0YoQmFja2dyb3VuZFN5bmNNYW5hZ2VyVGVzdCwgUnVuQ2FsbGJhY2tBZnRlckV2ZW50c0NvbXBsZXRlKSB7CisgIFNldEtlZXBCcm93c2VyQXdha2VUaWxsRXZlbnRzQ29tcGxldGVBbmRSZXN0YXJ0TWFuYWdlcigKKyAgICAgIC8qIGtlZXBfYnJvd3Nlcl9hd2FrZV90aWxsX2V2ZW50c19jb21wbGV0ZT0gKi8gdHJ1ZSk7CisgIEluaXREZWxheWVkU3luY0V2ZW50VGVzdCgpOworCisgIC8vIFRoaXMgZW5zdXJlcyBvdGhlciBpbnZvY2F0aW9ucyBvZiBGaXJlUmVhZHlFdmVudHMgd29uJ3QgY29tcGxldGUgdGhlCisgIC8vIHJlZ2lzdHJhdGlvbi4KKyAgdGVzdF9iYWNrZ3JvdW5kX3N5bmNfbWFuYWdlcigpLT5TdXNwZW5kRmlyaW5nRXZlbnRzKCk7CisKKyAgRVhQRUNUX1RSVUUoUmVnaXN0ZXIoc3luY19vcHRpb25zXzFfKSk7CisKKyAgYm9vbCBjYWxsYmFja19jYWxsZWQgPSBmYWxzZTsKKyAgdGVzdF9iYWNrZ3JvdW5kX3N5bmNfbWFuYWdlcigpLT5SZXN1bWVGaXJpbmdFdmVudHMoKTsKKyAgdGVzdF9iYWNrZ3JvdW5kX3N5bmNfbWFuYWdlcigpLT5GaXJlUmVhZHlFdmVudHMoCisgICAgICBibGluazo6bW9qb206OkJhY2tncm91bmRTeW5jVHlwZTo6T05FX1NIT1QsCisgICAgICAvKiByZXNjaGVkdWxlPSAqLyBmYWxzZSwKKyAgICAgIGJhc2U6OkJpbmRPbmNlKFtdKGJvb2wqIGNhbGxiYWNrX2NhbGxlZCkgeyAqY2FsbGJhY2tfY2FsbGVkID0gdHJ1ZTsgfSwKKyAgICAgICAgICAgICAgICAgICAgICZjYWxsYmFja19jYWxsZWQpKTsKKworICBiYXNlOjpSdW5Mb29wKCkuUnVuVW50aWxJZGxlKCk7CisKKyAgQVNTRVJUX0ZBTFNFKGNhbGxiYWNrX2NhbGxlZCk7CisgIHN0ZDo6bW92ZShzeW5jX2ZpcmVkX2NhbGxiYWNrXykuUnVuKGJsaW5rOjpTZXJ2aWNlV29ya2VyU3RhdHVzQ29kZTo6a09rKTsKKyAgYmFzZTo6UnVuTG9vcCgpLlJ1blVudGlsSWRsZSgpOworICBFWFBFQ1RfVFJVRShjYWxsYmFja19jYWxsZWQpOworfQorCiBURVNUX0YoQmFja2dyb3VuZFN5bmNNYW5hZ2VyVGVzdCwgUmVyZWdpc3Rlck1pZFN5bmNGaXJzdEF0dGVtcHRTdWNjZWVkcykgewogICBJbml0RGVsYXllZFN5bmNFdmVudFRlc3QoKTsKICAgUmVnaXN0ZXJBbmRWZXJpZnlTeW5jRXZlbnREZWxheWVkKHN5bmNfb3B0aW9uc18xXyk7CmRpZmYgLS1naXQgYS9jb250ZW50L2Jyb3dzZXIvYmx1ZXRvb3RoL2JsdWV0b290aF9kZXZpY2VfY2hvb3Nlcl9jb250cm9sbGVyLmNjIGIvY29udGVudC9icm93c2VyL2JsdWV0b290aC9ibHVldG9vdGhfZGV2aWNlX2Nob29zZXJfY29udHJvbGxlci5jYwppbmRleCA2NzI2ZWYzLi43MTMzYTAzIDEwMDY0NAotLS0gYS9jb250ZW50L2Jyb3dzZXIvYmx1ZXRvb3RoL2JsdWV0b290aF9kZXZpY2VfY2hvb3Nlcl9jb250cm9sbGVyLmNjCisrKyBiL2NvbnRlbnQvYnJvd3Nlci9ibHVldG9vdGgvYmx1ZXRvb3RoX2RldmljZV9jaG9vc2VyX2NvbnRyb2xsZXIuY2MKQEAgLTIzNSwxMCArMjM1LDExIEBACiAgICAgICBkaXNjb3Zlcnlfc2Vzc2lvbl90aW1lcl8oCiAgICAgICAgICAgRlJPTV9IRVJFLAogICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbVNlY29uZHMoc2Nhbl9kdXJhdGlvbl8pLAotICAgICAgICAgIGJhc2U6OkJpbmQoJkJsdWV0b290aERldmljZUNob29zZXJDb250cm9sbGVyOjpTdG9wRGV2aWNlRGlzY292ZXJ5LAotICAgICAgICAgICAgICAgICAgICAgLy8gYmFzZTo6VGltZXIgZ3VhcmFudGVlcyBpdCB3b24ndCBjYWxsIGJhY2sgYWZ0ZXIgaXRzCi0gICAgICAgICAgICAgICAgICAgICAvLyBkZXN0cnVjdG9yIHN0YXJ0cy4KLSAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpKSB7CisgICAgICAgICAgYmFzZTo6QmluZFJlcGVhdGluZygKKyAgICAgICAgICAgICAgJkJsdWV0b290aERldmljZUNob29zZXJDb250cm9sbGVyOjpTdG9wRGV2aWNlRGlzY292ZXJ5LAorICAgICAgICAgICAgICAvLyBiYXNlOjpUaW1lciBndWFyYW50ZWVzIGl0IHdvbid0IGNhbGwgYmFjayBhZnRlciBpdHMKKyAgICAgICAgICAgICAgLy8gZGVzdHJ1Y3RvciBzdGFydHMuCisgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpKSB7CiAgIENIRUNLKGFkYXB0ZXJfKTsKIH0KIApAQCAtMzEzLDkgKzMxNCw5IEBACiAgICAgcmV0dXJuOwogICB9CiAKLSAgQmx1ZXRvb3RoQ2hvb3Nlcjo6RXZlbnRIYW5kbGVyIGNob29zZXJfZXZlbnRfaGFuZGxlciA9Ci0gICAgICBiYXNlOjpCaW5kKCZCbHVldG9vdGhEZXZpY2VDaG9vc2VyQ29udHJvbGxlcjo6T25CbHVldG9vdGhDaG9vc2VyRXZlbnQsCi0gICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpOworICBCbHVldG9vdGhDaG9vc2VyOjpFdmVudEhhbmRsZXIgY2hvb3Nlcl9ldmVudF9oYW5kbGVyID0gYmFzZTo6QmluZFJlcGVhdGluZygKKyAgICAgICZCbHVldG9vdGhEZXZpY2VDaG9vc2VyQ29udHJvbGxlcjo6T25CbHVldG9vdGhDaG9vc2VyRXZlbnQsCisgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKTsKIAogICBpZiAoV2ViQ29udGVudHNEZWxlZ2F0ZSogZGVsZWdhdGUgPSB3ZWJfY29udGVudHNfLT5HZXREZWxlZ2F0ZSgpKSB7CiAgICAgY2hvb3Nlcl8gPSBkZWxlZ2F0ZS0+UnVuQmx1ZXRvb3RoQ2hvb3NlcihyZW5kZXJfZnJhbWVfaG9zdF8sCmRpZmYgLS1naXQgYS9jb250ZW50L2Jyb3dzZXIvYmx1ZXRvb3RoL2JsdWV0b290aF9kZXZpY2Vfc2Nhbm5pbmdfcHJvbXB0X2NvbnRyb2xsZXIuY2MgYi9jb250ZW50L2Jyb3dzZXIvYmx1ZXRvb3RoL2JsdWV0b290aF9kZXZpY2Vfc2Nhbm5pbmdfcHJvbXB0X2NvbnRyb2xsZXIuY2MKaW5kZXggMjc2ZjUyZi4uMzlmZTY5ZSAxMDA2NDQKLS0tIGEvY29udGVudC9icm93c2VyL2JsdWV0b290aC9ibHVldG9vdGhfZGV2aWNlX3NjYW5uaW5nX3Byb21wdF9jb250cm9sbGVyLmNjCisrKyBiL2NvbnRlbnQvYnJvd3Nlci9ibHVldG9vdGgvYmx1ZXRvb3RoX2RldmljZV9zY2FubmluZ19wcm9tcHRfY29udHJvbGxlci5jYwpAQCAtMjgsOSArMjgsMTAgQEAKIH0KIAogdm9pZCBCbHVldG9vdGhEZXZpY2VTY2FubmluZ1Byb21wdENvbnRyb2xsZXI6OlNob3dQZXJtaXNzaW9uUHJvbXB0KCkgewotICBCbHVldG9vdGhTY2FubmluZ1Byb21wdDo6RXZlbnRIYW5kbGVyIHByb21wdF9ldmVudF9oYW5kbGVyID0gYmFzZTo6QmluZCgKLSAgICAgICZCbHVldG9vdGhEZXZpY2VTY2FubmluZ1Byb21wdENvbnRyb2xsZXI6Ok9uQmx1ZXRvb3RoU2Nhbm5pbmdQcm9tcHRFdmVudCwKLSAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpOworICBCbHVldG9vdGhTY2FubmluZ1Byb21wdDo6RXZlbnRIYW5kbGVyIHByb21wdF9ldmVudF9oYW5kbGVyID0KKyAgICAgIGJhc2U6OkJpbmRSZXBlYXRpbmcoJkJsdWV0b290aERldmljZVNjYW5uaW5nUHJvbXB0Q29udHJvbGxlcjo6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbkJsdWV0b290aFNjYW5uaW5nUHJvbXB0RXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpOwogICBXZWJDb250ZW50c0RlbGVnYXRlKiBkZWxlZ2F0ZSA9CiAgICAgICBXZWJDb250ZW50czo6RnJvbVJlbmRlckZyYW1lSG9zdChyZW5kZXJfZnJhbWVfaG9zdF8pLT5HZXREZWxlZ2F0ZSgpOwogICBpZiAoZGVsZWdhdGUpIHsKZGlmZiAtLWdpdCBhL2NvbnRlbnQvYnJvd3Nlci9icm9hZGNhc3RfY2hhbm5lbC9icm9hZGNhc3RfY2hhbm5lbF9wcm92aWRlci5jYyBiL2NvbnRlbnQvYnJvd3Nlci9icm9hZGNhc3RfY2hhbm5lbC9icm9hZGNhc3RfY2hhbm5lbF9wcm92aWRlci5jYwppbmRleCAzNGE1ZGYxMzEuLmQ5Y2FlYWEgMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvYnJvd3Nlci9icm9hZGNhc3RfY2hhbm5lbC9icm9hZGNhc3RfY2hhbm5lbF9wcm92aWRlci5jYworKysgYi9jb250ZW50L2Jyb3dzZXIvYnJvYWRjYXN0X2NoYW5uZWwvYnJvYWRjYXN0X2NoYW5uZWxfcHJvdmlkZXIuY2MKQEAgLTM0LDcgKzM0LDggQEAKICAgY29uc3QgdXJsOjpPcmlnaW4mIG9yaWdpbigpIGNvbnN0IHsgcmV0dXJuIG9yaWdpbl87IH0KICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXzsgfQogCi0gIHZvaWQgc2V0X2Nvbm5lY3Rpb25fZXJyb3JfaGFuZGxlcihjb25zdCBiYXNlOjpDbG9zdXJlJiBlcnJvcl9oYW5kbGVyKSB7CisgIHZvaWQgc2V0X2Nvbm5lY3Rpb25fZXJyb3JfaGFuZGxlcigKKyAgICAgIGNvbnN0IGJhc2U6OlJlcGVhdGluZ0Nsb3N1cmUmIGVycm9yX2hhbmRsZXIpIHsKICAgICByZWNlaXZlcl8uc2V0X2Rpc2Nvbm5lY3RfaGFuZGxlcihlcnJvcl9oYW5kbGVyKTsKICAgICBjbGllbnRfLnNldF9kaXNjb25uZWN0X2hhbmRsZXIoZXJyb3JfaGFuZGxlcik7CiAgIH0KQEAgLTk4LDggKzk5LDggQEAKICAgc3RkOjp1bmlxdWVfcHRyPENvbm5lY3Rpb24+IGMobmV3IENvbm5lY3Rpb24ob3JpZ2luLCBuYW1lLCBzdGQ6Om1vdmUoY2xpZW50KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGNvbm5lY3Rpb24pLCB0aGlzKSk7CiAgIGMtPnNldF9jb25uZWN0aW9uX2Vycm9yX2hhbmRsZXIoCi0gICAgICBiYXNlOjpCaW5kKCZCcm9hZGNhc3RDaGFubmVsUHJvdmlkZXI6OlVucmVnaXN0ZXJDb25uZWN0aW9uLAotICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpLCBjLmdldCgpKSk7CisgICAgICBiYXNlOjpCaW5kUmVwZWF0aW5nKCZCcm9hZGNhc3RDaGFubmVsUHJvdmlkZXI6OlVucmVnaXN0ZXJDb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpLCBjLmdldCgpKSk7CiAgIGNvbm5lY3Rpb25zX1tvcmlnaW5dLmluc2VydChzdGQ6Om1ha2VfcGFpcihuYW1lLCBzdGQ6Om1vdmUoYykpKTsKIH0KIApkaWZmIC0tZ2l0IGEvY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL2RvbV9zdG9yYWdlX2NvbnRleHRfd3JhcHBlci5jYyBiL2NvbnRlbnQvYnJvd3Nlci9kb21fc3RvcmFnZS9kb21fc3RvcmFnZV9jb250ZXh0X3dyYXBwZXIuY2MKaW5kZXggZWMwNGIyZi4uNTk3ZGQ3ZiAxMDA2NDQKLS0tIGEvY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL2RvbV9zdG9yYWdlX2NvbnRleHRfd3JhcHBlci5jYworKysgYi9jb250ZW50L2Jyb3dzZXIvZG9tX3N0b3JhZ2UvZG9tX3N0b3JhZ2VfY29udGV4dF93cmFwcGVyLmNjCkBAIC00MzUsMTcgKzQzNSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHJlY2VpdmVyKSkpOwogfQogCi12b2lkIERPTVN0b3JhZ2VDb250ZXh0V3JhcHBlcjo6U2V0TG9jYWxTdG9yYWdlRGF0YWJhc2VGYWN0b3J5Rm9yVGVzdGluZygKLSAgICBiYXNlOjpSZXBlYXRpbmdDYWxsYmFjazxzdGQ6OnVuaXF1ZV9wdHI8bGV2ZWxkYjo6bW9qb206OkxldmVsREJEYXRhYmFzZT4oKT4KLSAgICAgICAgZmFjdG9yeSkgewotICAvLyBiYXNlOjpVbnJldGFpbmVkIGlzIHNhZmUgaGVyZSwgYmVjYXVzZSB0aGUgbW9qb19zdGF0ZV8gd29uJ3QgYmUgZGVsZXRlZAotICAvLyB1bnRpbCBhIFNodXRkb3duQW5kRGVsZXRlIHRhc2sgaGFzIGJlZW4gcmFuIG9uIHRoZSBtb2pvX3Rhc2tfcnVubmVyXywgYW5kCi0gIC8vIGFzIHNvb24gYXMgdGhhdCB0YXNrIGlzIHBvc3RlZCwgbW9qb19zdGF0ZV8gaXMgc2V0IHRvIG51bGwsIHByZXZlbnRpbmcKLSAgLy8gZnVydGhlciB0YXNrcyBmcm9tIGJlaW5nIHF1ZXVlZC4KK3ZvaWQgRE9NU3RvcmFnZUNvbnRleHRXcmFwcGVyOjpTZXRMb2NhbFN0b3JhZ2VEYXRhYmFzZU9wZW5DYWxsYmFja0ZvclRlc3RpbmcoCisgICAgTG9jYWxTdG9yYWdlRGF0YWJhc2VPcGVuQ2FsbGJhY2sgY2FsbGJhY2spIHsKICAgbW9qb190YXNrX3J1bm5lcl8tPlBvc3RUYXNrKAogICAgICAgRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZE9uY2UoJkxvY2FsU3RvcmFnZUNvbnRleHRNb2pvOjpTZXREYXRhYmFzZUZhY3RvcnlGb3JUZXN0aW5nLAotICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChtb2pvX3N0YXRlXyksIHN0ZDo6bW92ZShmYWN0b3J5KSkpOworICAgICAgYmFzZTo6QmluZE9uY2UoCisgICAgICAgICAgJkxvY2FsU3RvcmFnZUNvbnRleHRNb2pvOjpTZXREYXRhYmFzZU9wZW5DYWxsYmFja0ZvclRlc3RpbmcsCisgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChtb2pvX3N0YXRlXyksCisgICAgICAgICAgYmFzZTo6QmluZE9uY2Uoc3RkOjptb3ZlKGNhbGxiYWNrKSwgbW9qb19zdGF0ZV8pKSk7CiB9CiAKIHNjb3BlZF9yZWZwdHI8U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2VJbXBsPgpkaWZmIC0tZ2l0IGEvY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL2RvbV9zdG9yYWdlX2NvbnRleHRfd3JhcHBlci5oIGIvY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL2RvbV9zdG9yYWdlX2NvbnRleHRfd3JhcHBlci5oCmluZGV4IDcyODdhOGU2NC4uNWFiNmRiOTIgMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvYnJvd3Nlci9kb21fc3RvcmFnZS9kb21fc3RvcmFnZV9jb250ZXh0X3dyYXBwZXIuaAorKysgYi9jb250ZW50L2Jyb3dzZXIvZG9tX3N0b3JhZ2UvZG9tX3N0b3JhZ2VfY29udGV4dF93cmFwcGVyLmgKQEAgLTgsNiArOCw3IEBACiAjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPHN0cmluZz4KIAorI2luY2x1ZGUgImJhc2UvZmlsZXMvZmlsZV9wYXRoLmgiCiAjaW5jbHVkZSAiYmFzZS9tYWNyb3MuaCIKICNpbmNsdWRlICJiYXNlL21lbW9yeS9tZW1vcnlfcHJlc3N1cmVfbGlzdGVuZXIuaCIKICNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgpAQCAtMTA0LDkgKzEwNSwxMCBAQAogICAgICAgbW9qbzo6UmVwb3J0QmFkTWVzc2FnZUNhbGxiYWNrIGJhZF9tZXNzYWdlX2NhbGxiYWNrLAogICAgICAgbW9qbzo6UGVuZGluZ1JlY2VpdmVyPGJsaW5rOjptb2pvbTo6U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2U+IHJlY2VpdmVyKTsKIAotICB2b2lkIFNldExvY2FsU3RvcmFnZURhdGFiYXNlRmFjdG9yeUZvclRlc3RpbmcoCi0gICAgICBiYXNlOjpSZXBlYXRpbmdDYWxsYmFjazwKLSAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8bGV2ZWxkYjo6bW9qb206OkxldmVsREJEYXRhYmFzZT4oKT4pOworICB1c2luZyBMb2NhbFN0b3JhZ2VEYXRhYmFzZU9wZW5DYWxsYmFjayA9CisgICAgICBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZChMb2NhbFN0b3JhZ2VDb250ZXh0TW9qbyopPjsKKyAgdm9pZCBTZXRMb2NhbFN0b3JhZ2VEYXRhYmFzZU9wZW5DYWxsYmFja0ZvclRlc3RpbmcoCisgICAgICBMb2NhbFN0b3JhZ2VEYXRhYmFzZU9wZW5DYWxsYmFjayBjYWxsYmFjayk7CiAKICAgU2Vzc2lvblN0b3JhZ2VDb250ZXh0TW9qbyogbW9qb19zZXNzaW9uX3N0YXRlKCkgewogICAgIHJldHVybiBtb2pvX3Nlc3Npb25fc3RhdGVfOwpkaWZmIC0tZ2l0IGEvY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL2xvY2FsX3N0b3JhZ2VfY29udGV4dF9tb2pvLmNjIGIvY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL2xvY2FsX3N0b3JhZ2VfY29udGV4dF9tb2pvLmNjCmluZGV4IGI1MWI3YWIuLmI0MmIwYTkgMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvYnJvd3Nlci9kb21fc3RvcmFnZS9sb2NhbF9zdG9yYWdlX2NvbnRleHRfbW9qby5jYworKysgYi9jb250ZW50L2Jyb3dzZXIvZG9tX3N0b3JhZ2UvbG9jYWxfc3RvcmFnZV9jb250ZXh0X21vam8uY2MKQEAgLTEwMiw3ICsxMDIsOCBAQAogdm9pZCBNaWdyYXRlU3RvcmFnZUhlbHBlcigKICAgICBiYXNlOjpGaWxlUGF0aCBkYl9wYXRoLAogICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8YmFzZTo6U2luZ2xlVGhyZWFkVGFza1J1bm5lcj4gcmVwbHlfdGFza19ydW5uZXIsCi0gICAgYmFzZTo6Q2FsbGJhY2s8dm9pZChzdGQ6OnVuaXF1ZV9wdHI8U3RvcmFnZUFyZWFJbXBsOjpWYWx1ZU1hcD4pPiBjYWxsYmFjaykgeworICAgIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHN0ZDo6dW5pcXVlX3B0cjxTdG9yYWdlQXJlYUltcGw6OlZhbHVlTWFwPik+CisgICAgICAgIGNhbGxiYWNrKSB7CiAgIERPTVN0b3JhZ2VEYXRhYmFzZSBkYihkYl9wYXRoKTsKICAgRE9NU3RvcmFnZVZhbHVlc01hcCBtYXA7CiAgIGRiLlJlYWRBbGxWYWx1ZXMoJm1hcCk7CkBAIC0yODIsNyArMjgzLDcgQEAKICAgICAgICAgICBiYXNlOjpCaW5kT25jZSgKICAgICAgICAgICAgICAgJk1pZ3JhdGVTdG9yYWdlSGVscGVyLCBzcWxfZGJfcGF0aCgpLAogICAgICAgICAgICAgICBiYXNlOjpUaHJlYWRUYXNrUnVubmVySGFuZGxlOjpHZXQoKSwKLSAgICAgICAgICAgICAgYmFzZTo6QmluZCgmQ2FsbE1pZ3JhdGlvbkNhbGJhY2ssIGJhc2U6OlBhc3NlZCgmY2FsbGJhY2spKSkpOworICAgICAgICAgICAgICBiYXNlOjpCaW5kT25jZSgmQ2FsbE1pZ3JhdGlvbkNhbGJhY2ssIGJhc2U6OlBhc3NlZCgmY2FsbGJhY2spKSkpOwogICAgICAgcmV0dXJuOwogICAgIH0KICAgICBzdGQ6Om1vdmUoY2FsbGJhY2spLlJ1bihudWxscHRyKTsKQEAgLTY3NCw2ICs2NzUsMTEgQEAKICAgcmV0dXJuIHJlc3VsdDsKIH0KIAordm9pZCBMb2NhbFN0b3JhZ2VDb250ZXh0TW9qbzo6U2V0RGF0YWJhc2VPcGVuQ2FsbGJhY2tGb3JUZXN0aW5nKAorICAgIGJhc2U6Ok9uY2VDbG9zdXJlIGNhbGxiYWNrKSB7CisgIFJ1bldoZW5Db25uZWN0ZWQoc3RkOjptb3ZlKGNhbGxiYWNrKSk7Cit9CisKIExvY2FsU3RvcmFnZUNvbnRleHRNb2pvOjp+TG9jYWxTdG9yYWdlQ29udGV4dE1vam8oKSB7CiAgIERDSEVDS19FUShjb25uZWN0aW9uX3N0YXRlXywgQ09OTkVDVElPTl9TSFVURE9XTik7CiAgIGJhc2U6OnRyYWNlX2V2ZW50OjpNZW1vcnlEdW1wTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+VW5yZWdpc3RlckR1bXBQcm92aWRlcigKQEAgLTcwMSwxMyArNzA3LDYgQEAKIHZvaWQgTG9jYWxTdG9yYWdlQ29udGV4dE1vam86OkluaXRpYXRlQ29ubmVjdGlvbihib29sIGluX21lbW9yeV9vbmx5KSB7CiAgIERDSEVDS19FUShjb25uZWN0aW9uX3N0YXRlXywgQ09OTkVDVElPTl9JTl9QUk9HUkVTUyk7CiAKLSAgaWYgKGRhdGFiYXNlX2ZhY3RvcnlfZm9yX3Rlc3RpbmdfKSB7Ci0gICAgaW5fbWVtb3J5XyA9IHRydWU7Ci0gICAgZGF0YWJhc2VfID0gZGF0YWJhc2VfZmFjdG9yeV9mb3JfdGVzdGluZ18uUnVuKCk7Ci0gICAgT25EYXRhYmFzZU9wZW5lZChsZXZlbGRiOjptb2pvbTo6RGF0YWJhc2VFcnJvcjo6T0spOwotICAgIHJldHVybjsKLSAgfQotCiAgIGlmICghZGlyZWN0b3J5Xy5lbXB0eSgpICYmIGRpcmVjdG9yeV8uSXNBYnNvbHV0ZSgpICYmICFpbl9tZW1vcnlfb25seSkgewogICAgIC8vIFdlIHdlcmUgZ2l2ZW4gYSBzdWJkaXJlY3RvcnkgdG8gd3JpdGUgdG8sIHNvIHVzZSBhIGRpc2stYmFja2VkIGRhdGFiYXNlLgogICAgIGxldmVsZGJfZW52OjpPcHRpb25zIG9wdGlvbnM7CmRpZmYgLS1naXQgYS9jb250ZW50L2Jyb3dzZXIvZG9tX3N0b3JhZ2UvbG9jYWxfc3RvcmFnZV9jb250ZXh0X21vam8uaCBiL2NvbnRlbnQvYnJvd3Nlci9kb21fc3RvcmFnZS9sb2NhbF9zdG9yYWdlX2NvbnRleHRfbW9qby5oCmluZGV4IDk5ZGRmNTM5Li42NmFmYWRhIDEwMDY0NAotLS0gYS9jb250ZW50L2Jyb3dzZXIvZG9tX3N0b3JhZ2UvbG9jYWxfc3RvcmFnZV9jb250ZXh0X21vam8uaAorKysgYi9jb250ZW50L2Jyb3dzZXIvZG9tX3N0b3JhZ2UvbG9jYWxfc3RvcmFnZV9jb250ZXh0X21vam8uaApAQCAtMTUsOSArMTUsMTIgQEAKICNpbmNsdWRlICJiYXNlL2ZpbGVzL2ZpbGVfcGF0aC5oIgogI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCiAjaW5jbHVkZSAiYmFzZS9zZXF1ZW5jZWRfdGFza19ydW5uZXIuaCIKKyNpbmNsdWRlICJiYXNlL3RocmVhZGluZy9zZXF1ZW5jZV9ib3VuZC5oIgogI2luY2x1ZGUgImJhc2UvdHJhY2VfZXZlbnQvbWVtb3J5X2FsbG9jYXRvcl9kdW1wLmgiCiAjaW5jbHVkZSAiYmFzZS90cmFjZV9ldmVudC9tZW1vcnlfZHVtcF9wcm92aWRlci5oIgorI2luY2x1ZGUgImNvbXBvbmVudHMvc2VydmljZXMvbGV2ZWxkYi9sZXZlbGRiX2RhdGFiYXNlX2ltcGwuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL3NlcnZpY2VzL2xldmVsZGIvcHVibGljL21vam9tL2xldmVsZGIubW9qb20uaCIKKyNpbmNsdWRlICJjb21wb25lbnRzL3NlcnZpY2VzL3N0b3JhZ2UvZG9tX3N0b3JhZ2UvZG9tX3N0b3JhZ2VfZGF0YWJhc2UuaCIKICNpbmNsdWRlICJjb250ZW50L2Jyb3dzZXIvZG9tX3N0b3JhZ2UvZG9tX3N0b3JhZ2VfdGFza19ydW5uZXIuaCIKICNpbmNsdWRlICJjb250ZW50L2NvbW1vbi9jb250ZW50X2V4cG9ydC5oIgogI2luY2x1ZGUgImNvbnRlbnQvcHVibGljL2Jyb3dzZXIvYnJvd3Nlcl90aHJlYWQuaCIKQEAgLTk1LDEyICs5OCw2IEBACiAgIC8vIENsZWFycyB1bnVzZWQgc3RvcmFnZSBhcmVhcywgd2hlbiB0aHJlc2hvbGRzIGFyZSByZWFjaGVkLgogICB2b2lkIFB1cmdlVW51c2VkQXJlYXNJZk5lZWRlZCgpOwogCi0gIHVzaW5nIERhdGFiYXNlRmFjdG9yeSA9IGJhc2U6OlJlcGVhdGluZ0NhbGxiYWNrPAotICAgICAgc3RkOjp1bmlxdWVfcHRyPGxldmVsZGI6Om1vam9tOjpMZXZlbERCRGF0YWJhc2U+KCk+OwotICB2b2lkIFNldERhdGFiYXNlRmFjdG9yeUZvclRlc3RpbmcoRGF0YWJhc2VGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICBkYXRhYmFzZV9mYWN0b3J5X2Zvcl90ZXN0aW5nXyA9IHN0ZDo6bW92ZShmYWN0b3J5KTsKLSAgfQotCiAgIC8vIGJhc2U6OnRyYWNlX2V2ZW50OjpNZW1vcnlEdW1wUHJvdmlkZXIgaW1wbGVtZW50YXRpb24uCiAgIGJvb2wgT25NZW1vcnlEdW1wKGNvbnN0IGJhc2U6OnRyYWNlX2V2ZW50OjpNZW1vcnlEdW1wQXJncyYgYXJncywKICAgICAgICAgICAgICAgICAgICAgYmFzZTo6dHJhY2VfZXZlbnQ6OlByb2Nlc3NNZW1vcnlEdW1wKiBwbWQpIG92ZXJyaWRlOwpAQCAtMTEyLDYgKzEwOSwxNyBAQAogICAgIHJldHVybiB0YXNrX3J1bm5lcl87CiAgIH0KIAorICAvLyBBY2Nlc3MgdGhlIHVuZGVybHlpbmcgRG9tU3RvcmFnZURhdGFiYXNlLiBNYXkgYmUgbnVsbCBpZiB0aGUgZGF0YWJhc2UgaXMKKyAgLy8gbm90IHlldCBvcGVuLgorICBjb25zdCBiYXNlOjpTZXF1ZW5jZUJvdW5kPHN0b3JhZ2U6OkRvbVN0b3JhZ2VEYXRhYmFzZT4mCisgIEdldERhdGFiYXNlRm9yVGVzdGluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gZGF0YWJhc2VfLT5kYXRhYmFzZSgpOworICB9CisKKyAgLy8gV2FpdCBmb3IgdGhlIGRhdGFiYXNlIHRvIGJlIG9wZW5lZCwgb3IgZm9yIG9wZW5pbmcgdG8gZmFpbC4gSWYgdGhlIGRhdGFiYXNlCisgIC8vIGlzIGFscmVhZHkgb3BlbmVkLCB8Y2FsbGJhY2t8IGlzIGludm9rZWQgaW1tZWRpYXRlbHkuCisgIHZvaWQgU2V0RGF0YWJhc2VPcGVuQ2FsbGJhY2tGb3JUZXN0aW5nKGJhc2U6Ok9uY2VDbG9zdXJlIGNhbGxiYWNrKTsKKwogIHByaXZhdGU6CiAgIGZyaWVuZCBjbGFzcyBET01TdG9yYWdlQnJvd3NlclRlc3Q7CiAKQEAgLTE4Myw3ICsxOTEsNyBAQAogCiAgIGJhc2U6OnRyYWNlX2V2ZW50OjpNZW1vcnlBbGxvY2F0b3JEdW1wR3VpZCBtZW1vcnlfZHVtcF9pZF87CiAKLSAgc3RkOjp1bmlxdWVfcHRyPGxldmVsZGI6Om1vam9tOjpMZXZlbERCRGF0YWJhc2U+IGRhdGFiYXNlXzsKKyAgc3RkOjp1bmlxdWVfcHRyPGxldmVsZGI6OkxldmVsREJEYXRhYmFzZUltcGw+IGRhdGFiYXNlXzsKICAgYm9vbCB0cmllZF90b19yZWNyZWF0ZV9kdXJpbmdfb3Blbl8gPSBmYWxzZTsKICAgYm9vbCBpbl9tZW1vcnlfID0gZmFsc2U7CiAKQEAgLTIwNSw4ICsyMTMsNiBAQAogICAvLyBOYW1lIG9mIGFuIGV4dHJhIGhpc3RvZ3JhbSB0byBsb2cgb3BlbiByZXN1bHRzIHRvLCBpZiBub3QgbnVsbC4KICAgY29uc3QgY2hhciogb3Blbl9yZXN1bHRfaGlzdG9ncmFtXyA9IG51bGxwdHI7CiAKLSAgRGF0YWJhc2VGYWN0b3J5IGRhdGFiYXNlX2ZhY3RvcnlfZm9yX3Rlc3RpbmdfOwotCiAgIGJhc2U6OldlYWtQdHJGYWN0b3J5PExvY2FsU3RvcmFnZUNvbnRleHRNb2pvPiB3ZWFrX3B0cl9mYWN0b3J5X3t0aGlzfTsKIH07CiAKZGlmZiAtLWdpdCBhL2NvbnRlbnQvYnJvd3Nlci9kb21fc3RvcmFnZS9sb2NhbF9zdG9yYWdlX2NvbnRleHRfbW9qb191bml0dGVzdC5jYyBiL2NvbnRlbnQvYnJvd3Nlci9kb21fc3RvcmFnZS9sb2NhbF9zdG9yYWdlX2NvbnRleHRfbW9qb191bml0dGVzdC5jYwppbmRleCA3NTIyZWFmLi5jYTEzM2JmIDEwMDY0NAotLS0gYS9jb250ZW50L2Jyb3dzZXIvZG9tX3N0b3JhZ2UvbG9jYWxfc3RvcmFnZV9jb250ZXh0X21vam9fdW5pdHRlc3QuY2MKKysrIGIvY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL2xvY2FsX3N0b3JhZ2VfY29udGV4dF9tb2pvX3VuaXR0ZXN0LmNjCkBAIC02LDYgKzYsNyBAQAogCiAjaW5jbHVkZSAiYmFzZS9iaW5kLmgiCiAjaW5jbHVkZSAiYmFzZS9iaW5kX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJiYXNlL2NvbnRhaW5lcnMvc3Bhbi5oIgogI2luY2x1ZGUgImJhc2UvZmlsZXMvZmlsZV9lbnVtZXJhdG9yLmgiCiAjaW5jbHVkZSAiYmFzZS9maWxlcy9maWxlX3V0aWwuaCIKICNpbmNsdWRlICJiYXNlL2ZpbGVzL3Njb3BlZF90ZW1wX2Rpci5oIgpAQCAtMTgsMTMgKzE5LDExIEBACiAjaW5jbHVkZSAiY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL2RvbV9zdG9yYWdlX2RhdGFiYXNlLmgiCiAjaW5jbHVkZSAiY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL2RvbV9zdG9yYWdlX3Rhc2tfcnVubmVyLmgiCiAjaW5jbHVkZSAiY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL2RvbV9zdG9yYWdlX3R5cGVzLmgiCi0jaW5jbHVkZSAiY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL3Rlc3QvZmFrZV9sZXZlbGRiX2RhdGFiYXNlX2Vycm9yX29uX3dyaXRlLmgiCiAjaW5jbHVkZSAiY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL3Rlc3Qvc3RvcmFnZV9hcmVhX3Rlc3RfdXRpbC5oIgogI2luY2x1ZGUgImNvbnRlbnQvcHVibGljL2Jyb3dzZXIvYnJvd3Nlcl90aHJlYWQuaCIKICNpbmNsdWRlICJjb250ZW50L3B1YmxpYy9icm93c2VyL3N0b3JhZ2VfdXNhZ2VfaW5mby5oIgogI2luY2x1ZGUgImNvbnRlbnQvcHVibGljL3Rlc3QvYnJvd3Nlcl90YXNrX2Vudmlyb25tZW50LmgiCiAjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvdGVzdC90ZXN0X3V0aWxzLmgiCi0jaW5jbHVkZSAiY29udGVudC90ZXN0L2Zha2VfbGV2ZWxkYl9kYXRhYmFzZS5oIgogI2luY2x1ZGUgIm1vam8vcHVibGljL2NwcC9iaW5kaW5ncy9hc3NvY2lhdGVkX2JpbmRpbmcuaCIKICNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvYmluZGluZ3MvYXNzb2NpYXRlZF9yZWNlaXZlci5oIgogI2luY2x1ZGUgIm1vam8vcHVibGljL2NwcC9iaW5kaW5ncy9hc3NvY2lhdGVkX3JlbW90ZS5oIgpAQCAtNDIsNyArNDEsNiBAQAogbmFtZXNwYWNlIGNvbnRlbnQgewogCiBuYW1lc3BhY2UgewotdXNpbmcgdGVzdDo6RmFrZUxldmVsREJEYXRhYmFzZUVycm9yT25Xcml0ZTsKIAogdm9pZCBHZXRTdG9yYWdlVXNhZ2VDYWxsYmFjayhjb25zdCBiYXNlOjpSZXBlYXRpbmdDbG9zdXJlJiBjYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3RvcmFnZVVzYWdlSW5mbz4qIG91dF9yZXN1bHQsCkBAIC0xMTQsNiArMTEyLDEwIEBACiAgICAgaWYgKGNvbnRleHRfKQogICAgICAgU2h1dGRvd25Db250ZXh0KCk7CiAKKyAgICAvLyBFbnN1cmUgYW55IG9wZW5lZCBkYXRhYmFzZSBpcyByZWFsbHkgY2xvc2VkIGJlZm9yZSBhdHRlbXB0aW5nIHRvIGRlbGV0ZQorICAgIC8vIGl0cyBzdG9yYWdlIHBhdGguCisgICAgUnVuVW50aWxJZGxlKCk7CisKICAgICBFWFBFQ1RfVFJVRSh0ZW1wX3BhdGhfLkRlbGV0ZSgpKTsKICAgfQogCkBAIC0xMjQsMTAgKzEyNiw2IEBACiAgICAgICAgICAgdGFza19ydW5uZXJfLCB0ZW1wX3BhdGhfLkdldFBhdGgoKSwKICAgICAgICAgICBiYXNlOjpGaWxlUGF0aChGSUxFX1BBVEhfTElURVJBTCgibGV2ZWxkYiIpKSwKICAgICAgICAgICBzcGVjaWFsX3N0b3JhZ2VfcG9saWN5KCkpOwotICAgICAgY29udGV4dF8tPlNldERhdGFiYXNlRmFjdG9yeUZvclRlc3RpbmcoYmFzZTo6QmluZExhbWJkYUZvclRlc3RpbmcoCi0gICAgICAgICAgWyZdKCkgLT4gc3RkOjp1bmlxdWVfcHRyPGxldmVsZGI6Om1vam9tOjpMZXZlbERCRGF0YWJhc2U+IHsKLSAgICAgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEZha2VMZXZlbERCRGF0YWJhc2U+KCZtb2NrX2RhdGFfKTsKLSAgICAgICAgICB9KSk7CiAgICAgfQogCiAgICAgcmV0dXJuIGNvbnRleHRfOwpAQCAtMTM2LDIxICsxMzQsNzAgQEAKICAgdm9pZCBTaHV0ZG93bkNvbnRleHQoKSB7CiAgICAgY29udGV4dF8tPlNodXRkb3duQW5kRGVsZXRlKCk7CiAgICAgY29udGV4dF8gPSBudWxscHRyOwotICAgIGJhc2U6OlJ1bkxvb3AoKS5SdW5VbnRpbElkbGUoKTsKKyAgICBSdW5VbnRpbElkbGUoKTsKICAgfQogCiAgIE1vY2tTcGVjaWFsU3RvcmFnZVBvbGljeSogc3BlY2lhbF9zdG9yYWdlX3BvbGljeSgpIHsKICAgICByZXR1cm4gbW9ja19zcGVjaWFsX3N0b3JhZ2VfcG9saWN5Xy5nZXQoKTsKICAgfQogCi0gIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBzdGQ6OnZlY3Rvcjx1aW50OF90Pj4mIG1vY2tfZGF0YSgpIHsKLSAgICByZXR1cm4gbW9ja19kYXRhXzsKKyAgdm9pZCBXYWl0Rm9yRGF0YWJhc2VPcGVuKCkgeworICAgIGJhc2U6OlJ1bkxvb3AgbG9vcDsKKyAgICBjb250ZXh0KCktPlNldERhdGFiYXNlT3BlbkNhbGxiYWNrRm9yVGVzdGluZyhsb29wLlF1aXRDbG9zdXJlKCkpOworICAgIGxvb3AuUnVuKCk7CiAgIH0KIAotICB2b2lkIGNsZWFyX21vY2tfZGF0YSgpIHsgbW9ja19kYXRhXy5jbGVhcigpOyB9CisgIHZvaWQgU2V0RGF0YWJhc2VFbnRyeShiYXNlOjpTdHJpbmdQaWVjZSBrZXksIGJhc2U6OlN0cmluZ1BpZWNlIHZhbHVlKSB7CisgICAgV2FpdEZvckRhdGFiYXNlT3BlbigpOworICAgIGJhc2U6OlJ1bkxvb3AgbG9vcDsKKyAgICBjb250ZXh0KCktPkdldERhdGFiYXNlRm9yVGVzdGluZygpLlBvc3RUYXNrV2l0aFRoaXNPYmplY3QoCisgICAgICAgIEZST01fSEVSRSwKKyAgICAgICAgYmFzZTo6QmluZExhbWJkYUZvclRlc3RpbmcoWyZdKGNvbnN0IHN0b3JhZ2U6OkRvbVN0b3JhZ2VEYXRhYmFzZSYgZGIpIHsKKyAgICAgICAgICBsZXZlbGRiOjpTdGF0dXMgc3RhdHVzID0KKyAgICAgICAgICAgICAgZGIuUHV0KGJhc2U6OmFzX2J5dGVzKGJhc2U6Om1ha2Vfc3BhbihrZXkpKSwKKyAgICAgICAgICAgICAgICAgICAgIGJhc2U6OmFzX2J5dGVzKGJhc2U6Om1ha2Vfc3Bhbih2YWx1ZSkpKTsKKyAgICAgICAgICBBU1NFUlRfVFJVRShzdGF0dXMub2soKSk7CisgICAgICAgICAgbG9vcC5RdWl0KCk7CisgICAgICAgIH0pKTsKKyAgICBsb29wLlJ1bigpOworICB9CiAKLSAgdm9pZCBzZXRfbW9ja19kYXRhKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICAgIG1vY2tfZGF0YV9bU3RkU3RyaW5nVG9VaW50OFZlY3RvcihrZXkpXSA9IFN0ZFN0cmluZ1RvVWludDhWZWN0b3IodmFsdWUpOworICB2b2lkIENsZWFyRGF0YWJhc2UoKSB7CisgICAgV2FpdEZvckRhdGFiYXNlT3BlbigpOworICAgIGJhc2U6OlJ1bkxvb3AgbG9vcDsKKyAgICBjb250ZXh0KCktPkdldERhdGFiYXNlRm9yVGVzdGluZygpLlBvc3RUYXNrV2l0aFRoaXNPYmplY3QoCisgICAgICAgIEZST01fSEVSRSwKKyAgICAgICAgYmFzZTo6QmluZExhbWJkYUZvclRlc3RpbmcoWyZdKGNvbnN0IHN0b3JhZ2U6OkRvbVN0b3JhZ2VEYXRhYmFzZSYgZGIpIHsKKyAgICAgICAgICBsZXZlbGRiOjpXcml0ZUJhdGNoIGJhdGNoOworICAgICAgICAgIGxldmVsZGI6OlN0YXR1cyBzdGF0dXMgPSBkYi5EZWxldGVQcmVmaXhlZCh7fSwgJmJhdGNoKTsKKyAgICAgICAgICBBU1NFUlRfVFJVRShzdGF0dXMub2soKSk7CisgICAgICAgICAgc3RhdHVzID0gZGIuQ29tbWl0KCZiYXRjaCk7CisgICAgICAgICAgQVNTRVJUX1RSVUUoc3RhdHVzLm9rKCkpOworICAgICAgICAgIGxvb3AuUXVpdCgpOworICAgICAgICB9KSk7CisgICAgbG9vcC5SdW4oKTsKKyAgfQorCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gR2V0RGF0YWJhc2VDb250ZW50cygpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdG9yYWdlOjpEb21TdG9yYWdlRGF0YWJhc2U6OktleVZhbHVlUGFpcj4gZW50cmllczsKKyAgICBXYWl0Rm9yRGF0YWJhc2VPcGVuKCk7CisgICAgYmFzZTo6UnVuTG9vcCBsb29wOworICAgIGNvbnRleHQoKS0+R2V0RGF0YWJhc2VGb3JUZXN0aW5nKCkuUG9zdFRhc2tXaXRoVGhpc09iamVjdCgKKyAgICAgICAgRlJPTV9IRVJFLAorICAgICAgICBiYXNlOjpCaW5kTGFtYmRhRm9yVGVzdGluZyhbJl0oY29uc3Qgc3RvcmFnZTo6RG9tU3RvcmFnZURhdGFiYXNlJiBkYikgeworICAgICAgICAgIGxldmVsZGI6OlN0YXR1cyBzdGF0dXMgPSBkYi5HZXRQcmVmaXhlZCh7fSwgJmVudHJpZXMpOworICAgICAgICAgIEFTU0VSVF9UUlVFKHN0YXR1cy5vaygpKTsKKyAgICAgICAgICBsb29wLlF1aXQoKTsKKyAgICAgICAgfSkpOworICAgIGxvb3AuUnVuKCk7CisKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGNvbnRlbnRzOworICAgIGZvciAoYXV0byYgZW50cnkgOiBlbnRyaWVzKSB7CisgICAgICBjb250ZW50cy5lbXBsYWNlKHN0ZDo6c3RyaW5nKGVudHJ5LmtleS5iZWdpbigpLCBlbnRyeS5rZXkuZW5kKCkpLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhlbnRyeS52YWx1ZS5iZWdpbigpLCBlbnRyeS52YWx1ZS5lbmQoKSkpOworICAgIH0KKworICAgIHJldHVybiBjb250ZW50czsKICAgfQogCiAgIHN0ZDo6dmVjdG9yPFN0b3JhZ2VVc2FnZUluZm8+IEdldFN0b3JhZ2VVc2FnZVN5bmMoKSB7CkBAIC0xNzgsNiArMjI1LDkgQEAKICAgfQogCiAgIGNvbnN0IGJhc2U6OkZpbGVQYXRoJiB0ZW1wX3BhdGgoKSBjb25zdCB7IHJldHVybiB0ZW1wX3BhdGhfLkdldFBhdGgoKTsgfQorCisgIC8vIFB1bXBzIGJvdGggdGhlIG1haW4tdGhyZWFkIHNlcXVlbmNlIGFuZCB0aGUgYmFja2dyb3VuZCBkYXRhYmFzZSBzZXF1ZW5jZQorICAvLyB1bnRpbCBib3RoIGFyZSBpZGxlLgogICB2b2lkIFJ1blVudGlsSWRsZSgpIHsgdGFza19lbnZpcm9ubWVudF8uUnVuVW50aWxJZGxlKCk7IH0KIAogICB2b2lkIERvVGVzdFB1dChMb2NhbFN0b3JhZ2VDb250ZXh0TW9qbyogY29udGV4dCwKQEAgLTI0Myw3ICsyOTMsNiBAQAogCiAgIEJyb3dzZXJUYXNrRW52aXJvbm1lbnQgdGFza19lbnZpcm9ubWVudF87CiAgIGJhc2U6OlNjb3BlZFRlbXBEaXIgdGVtcF9wYXRoXzsKLSAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBtb2NrX2RhdGFfOwogCiAgIHNjb3BlZF9yZWZwdHI8TW9ja0RPTVN0b3JhZ2VUYXNrUnVubmVyPiB0YXNrX3J1bm5lcl87CiAKQEAgLTI2MSwxNCArMzEwLDE1IEBACiAgIG1vam86OlJlbW90ZTxibGluazo6bW9qb206OlN0b3JhZ2VBcmVhPiBhcmVhOwogICBjb250ZXh0KCktPk9wZW5Mb2NhbFN0b3JhZ2UodXJsOjpPcmlnaW46OkNyZWF0ZShHVVJMKCJodHRwOi8vZm9vYmFyLmNvbSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZWEuQmluZE5ld1BpcGVBbmRQYXNzUmVjZWl2ZXIoKSk7CisKICAgYXJlYS0+UHV0KGtleSwgdmFsdWUsIGJhc2U6Om51bGxvcHQsICJzb3VyY2UiLCBiYXNlOjpEb05vdGhpbmcoKSk7CiAgIGFyZWEucmVzZXQoKTsKIAotICBiYXNlOjpSdW5Mb29wKCkuUnVuVW50aWxJZGxlKCk7CisgIFJ1blVudGlsSWRsZSgpOwogCiAgIC8vIFNob3VsZCBoYXZlIHRocmVlIHJvd3Mgb2YgZGF0YSwgb25lIGZvciB0aGUgdmVyc2lvbiwgb25lIGZvciB0aGUgYWN0dWFsCiAgIC8vIGRhdGEgYW5kIG9uZSBmb3IgbWV0YWRhdGEuCi0gIEFTU0VSVF9FUSgzdSwgbW9ja19kYXRhKCkuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDN1LCBHZXREYXRhYmFzZUNvbnRlbnRzKCkuc2l6ZSgpKTsKIH0KIAogVEVTVF9GKExvY2FsU3RvcmFnZUNvbnRleHRNb2pvVGVzdCwgT3JpZ2luc0FyZUluZGVwZW5kZW50KSB7CkBAIC0yODAsNiArMzMwLDcgQEAKIAogICBtb2pvOjpSZW1vdGU8Ymxpbms6Om1vam9tOjpTdG9yYWdlQXJlYT4gYXJlYTsKICAgY29udGV4dCgpLT5PcGVuTG9jYWxTdG9yYWdlKG9yaWdpbjEsIGFyZWEuQmluZE5ld1BpcGVBbmRQYXNzUmVjZWl2ZXIoKSk7CisKICAgYXJlYS0+UHV0KGtleTEsIHZhbHVlLCBiYXNlOjpudWxsb3B0LCAic291cmNlIiwgYmFzZTo6RG9Ob3RoaW5nKCkpOwogICBhcmVhLnJlc2V0KCk7CiAKQEAgLTI4Nyw4ICszMzgsOCBAQAogICBhcmVhLT5QdXQoa2V5MiwgdmFsdWUsIGJhc2U6Om51bGxvcHQsICJzb3VyY2UiLCBiYXNlOjpEb05vdGhpbmcoKSk7CiAgIGFyZWEucmVzZXQoKTsKIAotICBiYXNlOjpSdW5Mb29wKCkuUnVuVW50aWxJZGxlKCk7Ci0gIEFTU0VSVF9FUSg1dSwgbW9ja19kYXRhKCkuc2l6ZSgpKTsKKyAgUnVuVW50aWxJZGxlKCk7CisgIEVYUEVDVF9FUSg1dSwgR2V0RGF0YWJhc2VDb250ZW50cygpLnNpemUoKSk7CiB9CiAKIFRFU1RfRihMb2NhbFN0b3JhZ2VDb250ZXh0TW9qb1Rlc3QsIFdyYXBwZXJPdXRsaXZlc01vam9Db25uZWN0aW9uKSB7CkBAIC0zMDMsMTMgKzM1NCwxNCBAQAogICBjb250ZXh0KCktPk9wZW5Mb2NhbFN0b3JhZ2Uoa09yaWdpbiwgYXJlYS5CaW5kTmV3UGlwZUFuZFBhc3NSZWNlaXZlcigpKTsKICAgY29udGV4dCgpLT5PcGVuTG9jYWxTdG9yYWdlKGtPcmlnaW4sIGR1bW15X2FyZWEuQmluZE5ld1BpcGVBbmRQYXNzUmVjZWl2ZXIoKSk7CiAgIGFyZWEtPlB1dChrZXksIHZhbHVlLCBiYXNlOjpudWxsb3B0LCAic291cmNlIiwgYmFzZTo6RG9Ob3RoaW5nKCkpOworCiAgIGFyZWEucmVzZXQoKTsKICAgZHVtbXlfYXJlYS5yZXNldCgpOwotICBiYXNlOjpSdW5Mb29wKCkuUnVuVW50aWxJZGxlKCk7CisgIFJ1blVudGlsSWRsZSgpOwogCiAgIC8vIENsZWFyIGFsbCB0aGUgZGF0YSBmcm9tIHRoZSBiYWNraW5nIGRhdGFiYXNlLgotICBFWFBFQ1RfRkFMU0UobW9ja19kYXRhKCkuZW1wdHkoKSk7Ci0gIGNsZWFyX21vY2tfZGF0YSgpOworICBFWFBFQ1RfRkFMU0UoR2V0RGF0YWJhc2VDb250ZW50cygpLmVtcHR5KCkpOworICBDbGVhckRhdGFiYXNlKCk7CiAKICAgLy8gRGF0YSBzaG91bGQgc3RpbGwgYmUgcmVhZGFibGUsIGJlY2F1c2UgZGVzcGl0ZSBjbG9zaW5nIHRoZSBhcmVhCiAgIC8vIGNvbm5lY3Rpb24gYWJvdmUsIHRoZSBhY3R1YWwgYXJlYSBpbnN0YW5jZSBzaG91bGQgaGF2ZSBiZWVuIGtlcHQgYWxpdmUuCkBAIC0zMzEsMTIgKzM4MywxMyBAQAogICBjb250ZXh0KCktPk9wZW5Mb2NhbFN0b3JhZ2UodXJsOjpPcmlnaW46OkNyZWF0ZShHVVJMKCJodHRwOi8vZm9vYmFyLmNvbSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZWEuQmluZE5ld1BpcGVBbmRQYXNzUmVjZWl2ZXIoKSk7CiAgIGFyZWEtPlB1dChrZXksIHZhbHVlLCBiYXNlOjpudWxsb3B0LCAic291cmNlIiwgYmFzZTo6RG9Ob3RoaW5nKCkpOworCiAgIGFyZWEucmVzZXQoKTsKLSAgYmFzZTo6UnVuTG9vcCgpLlJ1blVudGlsSWRsZSgpOworICBSdW5VbnRpbElkbGUoKTsKIAogICAvLyBDbGVhciBhbGwgdGhlIGRhdGEgZnJvbSB0aGUgYmFja2luZyBkYXRhYmFzZS4KLSAgRVhQRUNUX0ZBTFNFKG1vY2tfZGF0YSgpLmVtcHR5KCkpOwotICBjbGVhcl9tb2NrX2RhdGEoKTsKKyAgRVhQRUNUX0ZBTFNFKEdldERhdGFiYXNlQ29udGVudHMoKS5lbXB0eSgpKTsKKyAgQ2xlYXJEYXRhYmFzZSgpOwogCiAgIC8vIE5vdyBvcGVuIG1hbnkgbmV3IGFyZWFzIChmb3IgZGlmZmVyZW50IG9yaWdpbnMpIHRvIHRyaWdnZXIgY2xlYW4gdXAuCiAgIGZvciAoaW50IGkgPSAxOyBpIDw9IDEwMDsgKytpKSB7CkBAIC0zNDYsMjkgKzM5OSwzNyBAQAogICAgIGFyZWEucmVzZXQoKTsKICAgfQogCisgIFJ1blVudGlsSWRsZSgpOworCiAgIC8vIEFuZCBtYWtlIHN1cmUgY2FjaGVzIHdlcmUgYWN0dWFsbHkgY2xlYXJlZC4KICAgRVhQRUNUX0VRKGJhc2U6Om51bGxvcHQsIERvVGVzdEdldChrZXkpKTsKIH0KIAogVEVTVF9GKExvY2FsU3RvcmFnZUNvbnRleHRNb2pvVGVzdCwgVmFsaWRWZXJzaW9uKSB7Ci0gIHNldF9tb2NrX2RhdGEoIlZFUlNJT04iLCAiMSIpOwotICBzZXRfbW9ja19kYXRhKHN0ZDo6c3RyaW5nKCJfaHR0cDovL2Zvb2Jhci5jb20iKSArICdceDAwJyArICJrZXkiLCAidmFsdWUiKTsKKyAgU2V0RGF0YWJhc2VFbnRyeSgiVkVSU0lPTiIsICIxIik7CisgIFNldERhdGFiYXNlRW50cnkoc3RkOjpzdHJpbmcoIl9odHRwOi8vZm9vYmFyLmNvbSIpICsgJ1x4MDAnICsgImtleSIsICJ2YWx1ZSIpOworICBTaHV0ZG93bkNvbnRleHQoKTsKIAogICBFWFBFQ1RfRVEoU3RkU3RyaW5nVG9VaW50OFZlY3RvcigidmFsdWUiKSwKICAgICAgICAgICAgIERvVGVzdEdldChTdGRTdHJpbmdUb1VpbnQ4VmVjdG9yKCJrZXkiKSkpOwogfQogCiBURVNUX0YoTG9jYWxTdG9yYWdlQ29udGV4dE1vam9UZXN0LCBJbnZhbGlkVmVyc2lvbikgewotICBzZXRfbW9ja19kYXRhKCJWRVJTSU9OIiwgImZvb2JhciIpOwotICBzZXRfbW9ja19kYXRhKHN0ZDo6c3RyaW5nKCJfaHR0cDovL2Zvb2Jhci5jb20iKSArICdceDAwJyArICJrZXkiLCAidmFsdWUiKTsKKyAgU2V0RGF0YWJhc2VFbnRyeSgiVkVSU0lPTiIsICJmb29iYXIiKTsKKyAgU2V0RGF0YWJhc2VFbnRyeShzdGQ6OnN0cmluZygiX2h0dHA6Ly9mb29iYXIuY29tIikgKyAnXHgwMCcgKyAia2V5IiwgInZhbHVlIik7CisKKyAgLy8gRm9yY2UgdGhlIGNvbnRleHQgdG8gcmVsb2FkIHRoZSBkYXRhYmFzZSwgd2hpY2ggc2hvdWxkIGZhaWwgZHVlIHRvIGludmFsaWQKKyAgLy8gdmVyc2lvbiBkYXRhLgorICBTaHV0ZG93bkNvbnRleHQoKTsKKwogICBFWFBFQ1RfRVEoYmFzZTo6bnVsbG9wdCwgRG9UZXN0R2V0KFN0ZFN0cmluZ1RvVWludDhWZWN0b3IoImtleSIpKSk7CiB9CiAKIFRFU1RfRihMb2NhbFN0b3JhZ2VDb250ZXh0TW9qb1Rlc3QsIFZlcnNpb25Pbmx5V3JpdHRlbk9uQ29tbWl0KSB7CiAgIEVYUEVDVF9FUShiYXNlOjpudWxsb3B0LCBEb1Rlc3RHZXQoU3RkU3RyaW5nVG9VaW50OFZlY3Rvcigia2V5IikpKTsKIAotICBiYXNlOjpSdW5Mb29wKCkuUnVuVW50aWxJZGxlKCk7Ci0gIEVYUEVDVF9UUlVFKG1vY2tfZGF0YSgpLmVtcHR5KCkpOworICBSdW5VbnRpbElkbGUoKTsKKyAgRVhQRUNUX1RSVUUoR2V0RGF0YWJhc2VDb250ZW50cygpLmVtcHR5KCkpOwogfQogCiBURVNUX0YoTG9jYWxTdG9yYWdlQ29udGV4dE1vam9UZXN0LCBHZXRTdG9yYWdlVXNhZ2VfTm9EYXRhKSB7CkBAIC0zODcsNiArNDQ4LDcgQEAKIAogICBtb2pvOjpSZW1vdGU8Ymxpbms6Om1vam9tOjpTdG9yYWdlQXJlYT4gYXJlYTsKICAgY29udGV4dCgpLT5PcGVuTG9jYWxTdG9yYWdlKG9yaWdpbjEsIGFyZWEuQmluZE5ld1BpcGVBbmRQYXNzUmVjZWl2ZXIoKSk7CisKICAgYXJlYS0+UHV0KGtleTEsIHZhbHVlLCBiYXNlOjpudWxsb3B0LCAic291cmNlIiwgYmFzZTo6RG9Ob3RoaW5nKCkpOwogICBhcmVhLT5QdXQoa2V5MiwgdmFsdWUsIGJhc2U6Om51bGxvcHQsICJzb3VyY2UiLCBiYXNlOjpEb05vdGhpbmcoKSk7CiAgIGFyZWEucmVzZXQoKTsKQEAgLTM5Niw3ICs0NTgsNyBAQAogICBhcmVhLnJlc2V0KCk7CiAKICAgLy8gTWFrZSBzdXJlIGFsbCBkYXRhIGdldHMgY29tbWl0dGVkIHRvIGRpc2suCi0gIGJhc2U6OlJ1bkxvb3AoKS5SdW5VbnRpbElkbGUoKTsKKyAgUnVuVW50aWxJZGxlKCk7CiAKICAgYmFzZTo6VGltZSBhZnRlcl93cml0ZSA9IGJhc2U6OlRpbWU6Ok5vdygpOwogCkBAIC00MjEsNiArNDgzLDcgQEAKIAogICBtb2pvOjpSZW1vdGU8Ymxpbms6Om1vam9tOjpTdG9yYWdlQXJlYT4gYXJlYTsKICAgY29udGV4dCgpLT5PcGVuTG9jYWxTdG9yYWdlKG9yaWdpbjEsIGFyZWEuQmluZE5ld1BpcGVBbmRQYXNzUmVjZWl2ZXIoKSk7CisKICAgYXJlYS0+UHV0KGtleSwgdmFsdWUsIGJhc2U6Om51bGxvcHQsICJzb3VyY2UiLCBiYXNlOjpEb05vdGhpbmcoKSk7CiAgIGFyZWEucmVzZXQoKTsKICAgY29udGV4dCgpLT5PcGVuTG9jYWxTdG9yYWdlKG9yaWdpbjIsIGFyZWEuQmluZE5ld1BpcGVBbmRQYXNzUmVjZWl2ZXIoKSk7CkBAIC00MzEsMTggKzQ5NCwxNyBAQAogICBhcmVhLnJlc2V0KCk7CiAKICAgLy8gTWFrZSBzdXJlIGFsbCBkYXRhIGdldHMgY29tbWl0dGVkIHRvIGRpc2suCi0gIGJhc2U6OlJ1bkxvb3AoKS5SdW5VbnRpbElkbGUoKTsKKyAgUnVuVW50aWxJZGxlKCk7CiAKICAgLy8gRGF0YSBmcm9tIG9yaWdpbjIgc2hvdWxkIGV4aXN0LCBpbmNsdWRpbmcgbWV0YS1kYXRhLCBidXQgbm90aGluZyBzaG91bGQKICAgLy8gZXhpc3QgZm9yIG9yaWdpbjEuCi0gIEVYUEVDVF9FUSgzdSwgbW9ja19kYXRhKCkuc2l6ZSgpKTsKLSAgZm9yIChjb25zdCBhdXRvJiBpdCA6IG1vY2tfZGF0YSgpKSB7Ci0gICAgaWYgKFVpbnQ4VmVjdG9yVG9TdGRTdHJpbmcoaXQuZmlyc3QpID09ICJWRVJTSU9OIikKKyAgYXV0byBjb250ZW50cyA9IEdldERhdGFiYXNlQ29udGVudHMoKTsKKyAgRVhQRUNUX0VRKDN1LCBjb250ZW50cy5zaXplKCkpOworICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogY29udGVudHMpIHsKKyAgICBpZiAoZW50cnkuZmlyc3QgPT0gIlZFUlNJT04iKQogICAgICAgY29udGludWU7Ci0gICAgRVhQRUNUX0VRKHN0ZDo6c3RyaW5nOjpucG9zLAotICAgICAgICAgICAgICBVaW50OFZlY3RvclRvU3RkU3RyaW5nKGl0LmZpcnN0KS5maW5kKG9yaWdpbjEuU2VyaWFsaXplKCkpKTsKLSAgICBFWFBFQ1RfTkUoc3RkOjpzdHJpbmc6Om5wb3MsCi0gICAgICAgICAgICAgIFVpbnQ4VmVjdG9yVG9TdGRTdHJpbmcoaXQuZmlyc3QpLmZpbmQob3JpZ2luMi5TZXJpYWxpemUoKSkpOworICAgIEVYUEVDVF9FUShzdGQ6OnN0cmluZzo6bnBvcywgZW50cnkuZmlyc3QuZmluZChvcmlnaW4xLlNlcmlhbGl6ZSgpKSk7CisgICAgRVhQRUNUX05FKHN0ZDo6c3RyaW5nOjpucG9zLCBlbnRyeS5maXJzdC5maW5kKG9yaWdpbjIuU2VyaWFsaXplKCkpKTsKICAgfQogfQogCkBAIC00NTQsNiArNTE2LDcgQEAKIAogICBtb2pvOjpSZW1vdGU8Ymxpbms6Om1vam9tOjpTdG9yYWdlQXJlYT4gYXJlYTsKICAgY29udGV4dCgpLT5PcGVuTG9jYWxTdG9yYWdlKG9yaWdpbjEsIGFyZWEuQmluZE5ld1BpcGVBbmRQYXNzUmVjZWl2ZXIoKSk7CisKICAgYXJlYS0+UHV0KGtleSwgdmFsdWUsIGJhc2U6Om51bGxvcHQsICJzb3VyY2UiLCBiYXNlOjpEb05vdGhpbmcoKSk7CiAgIGFyZWEucmVzZXQoKTsKICAgY29udGV4dCgpLT5PcGVuTG9jYWxTdG9yYWdlKG9yaWdpbjIsIGFyZWEuQmluZE5ld1BpcGVBbmRQYXNzUmVjZWl2ZXIoKSk7CkBAIC00NjUsMzAgKzUyOCwzMCBAQAogICBhcmVhLnJlc2V0KCk7CiAKICAgLy8gTWFrZSBzdXJlIGFsbCBkYXRhIGdldHMgY29tbWl0dGVkIHRvIGRpc2suCi0gIGJhc2U6OlJ1bkxvb3AoKS5SdW5VbnRpbElkbGUoKTsKKyAgUnVuVW50aWxJZGxlKCk7CiAKICAgLy8gRGF0YSBmcm9tIG9yaWdpbjIgc2hvdWxkIGV4aXN0LCBpbmNsdWRpbmcgbWV0YS1kYXRhLCBidXQgbm90aGluZyBzaG91bGQKICAgLy8gZXhpc3QgZm9yIG9yaWdpbjEuCi0gIEVYUEVDVF9FUSgzdSwgbW9ja19kYXRhKCkuc2l6ZSgpKTsKLSAgZm9yIChjb25zdCBhdXRvJiBpdCA6IG1vY2tfZGF0YSgpKSB7Ci0gICAgaWYgKFVpbnQ4VmVjdG9yVG9TdGRTdHJpbmcoaXQuZmlyc3QpID09ICJWRVJTSU9OIikKKyAgYXV0byBjb250ZW50cyA9IEdldERhdGFiYXNlQ29udGVudHMoKTsKKyAgRVhQRUNUX0VRKDN1LCBjb250ZW50cy5zaXplKCkpOworICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogY29udGVudHMpIHsKKyAgICBpZiAoZW50cnkuZmlyc3QgPT0gIlZFUlNJT04iKQogICAgICAgY29udGludWU7Ci0gICAgRVhQRUNUX0VRKHN0ZDo6c3RyaW5nOjpucG9zLAotICAgICAgICAgICAgICBVaW50OFZlY3RvclRvU3RkU3RyaW5nKGl0LmZpcnN0KS5maW5kKG9yaWdpbjEuU2VyaWFsaXplKCkpKTsKLSAgICBFWFBFQ1RfTkUoc3RkOjpzdHJpbmc6Om5wb3MsCi0gICAgICAgICAgICAgIFVpbnQ4VmVjdG9yVG9TdGRTdHJpbmcoaXQuZmlyc3QpLmZpbmQob3JpZ2luMi5TZXJpYWxpemUoKSkpOworICAgIEVYUEVDVF9FUShzdGQ6OnN0cmluZzo6bnBvcywgZW50cnkuZmlyc3QuZmluZChvcmlnaW4xLlNlcmlhbGl6ZSgpKSk7CisgICAgRVhQRUNUX05FKHN0ZDo6c3RyaW5nOjpucG9zLCBlbnRyeS5maXJzdC5maW5kKG9yaWdpbjIuU2VyaWFsaXplKCkpKTsKICAgfQogfQogCiBURVNUX0YoTG9jYWxTdG9yYWdlQ29udGV4dE1vam9UZXN0LCBEZWxldGVTdG9yYWdlKSB7Ci0gIHNldF9tb2NrX2RhdGEoIlZFUlNJT04iLCAiMSIpOwotICBzZXRfbW9ja19kYXRhKHN0ZDo6c3RyaW5nKCJfaHR0cDovL2Zvb2Jhci5jb20iKSArICdceDAwJyArICJrZXkiLCAidmFsdWUiKTsKKyAgU2V0RGF0YWJhc2VFbnRyeSgiVkVSU0lPTiIsICIxIik7CisgIFNldERhdGFiYXNlRW50cnkoc3RkOjpzdHJpbmcoIl9odHRwOi8vZm9vYmFyLmNvbSIpICsgJ1x4MDAnICsgImtleSIsICJ2YWx1ZSIpOworICBTaHV0ZG93bkNvbnRleHQoKTsKIAogICBiYXNlOjpSdW5Mb29wIHJ1bl9sb29wOwogICBjb250ZXh0KCktPkRlbGV0ZVN0b3JhZ2UodXJsOjpPcmlnaW46OkNyZWF0ZShHVVJMKCJodHRwOi8vZm9vYmFyLmNvbSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9sb29wLlF1aXRDbG9zdXJlKCkpOwogICBydW5fbG9vcC5SdW4oKTsKLSAgRVhQRUNUX0VRKDF1LCBtb2NrX2RhdGEoKS5zaXplKCkpOworICBFWFBFQ1RfRVEoMXUsIEdldERhdGFiYXNlQ29udGVudHMoKS5zaXplKCkpOwogfQogCiBURVNUX0YoTG9jYWxTdG9yYWdlQ29udGV4dE1vam9UZXN0LCBEZWxldGVTdG9yYWdlV2l0aG91dENvbm5lY3Rpb24pIHsKQEAgLTQ5OSw2ICs1NjIsNyBAQAogCiAgIG1vam86OlJlbW90ZTxibGluazo6bW9qb206OlN0b3JhZ2VBcmVhPiBhcmVhOwogICBjb250ZXh0KCktPk9wZW5Mb2NhbFN0b3JhZ2Uob3JpZ2luMSwgYXJlYS5CaW5kTmV3UGlwZUFuZFBhc3NSZWNlaXZlcigpKTsKKwogICBhcmVhLT5QdXQoa2V5LCB2YWx1ZSwgYmFzZTo6bnVsbG9wdCwgInNvdXJjZSIsIGJhc2U6OkRvTm90aGluZygpKTsKICAgYXJlYS5yZXNldCgpOwogCkBAIC01MDcsMjIgKzU3MSwyMSBAQAogICBhcmVhLnJlc2V0KCk7CiAKICAgLy8gTWFrZSBzdXJlIGFsbCBkYXRhIGdldHMgY29tbWl0dGVkIHRvIGRpc2suCi0gIGJhc2U6OlJ1bkxvb3AoKS5SdW5VbnRpbElkbGUoKTsKLSAgRVhQRUNUX0ZBTFNFKG1vY2tfZGF0YSgpLmVtcHR5KCkpOworICBSdW5VbnRpbElkbGUoKTsKKyAgRVhQRUNUX0ZBTFNFKEdldERhdGFiYXNlQ29udGVudHMoKS5lbXB0eSgpKTsKIAogICBjb250ZXh0KCktPkRlbGV0ZVN0b3JhZ2Uob3JpZ2luMSwgYmFzZTo6RG9Ob3RoaW5nKCkpOwotICBiYXNlOjpSdW5Mb29wKCkuUnVuVW50aWxJZGxlKCk7CisgIFJ1blVudGlsSWRsZSgpOwogCiAgIC8vIERhdGEgZnJvbSBvcmlnaW4yIHNob3VsZCBleGlzdCwgaW5jbHVkaW5nIG1ldGEtZGF0YSwgYnV0IG5vdGhpbmcgc2hvdWxkCiAgIC8vIGV4aXN0IGZvciBvcmlnaW4xLgotICBFWFBFQ1RfRVEoM3UsIG1vY2tfZGF0YSgpLnNpemUoKSk7Ci0gIGZvciAoY29uc3QgYXV0byYgaXQgOiBtb2NrX2RhdGEoKSkgewotICAgIGlmIChVaW50OFZlY3RvclRvU3RkU3RyaW5nKGl0LmZpcnN0KSA9PSAiVkVSU0lPTiIpCisgIGF1dG8gY29udGVudHMgPSBHZXREYXRhYmFzZUNvbnRlbnRzKCk7CisgIEVYUEVDVF9FUSgzdSwgY29udGVudHMuc2l6ZSgpKTsKKyAgZm9yIChjb25zdCBhdXRvJiBlbnRyeSA6IGNvbnRlbnRzKSB7CisgICAgaWYgKGVudHJ5LmZpcnN0ID09ICJWRVJTSU9OIikKICAgICAgIGNvbnRpbnVlOwotICAgIEVYUEVDVF9FUShzdGQ6OnN0cmluZzo6bnBvcywKLSAgICAgICAgICAgICAgVWludDhWZWN0b3JUb1N0ZFN0cmluZyhpdC5maXJzdCkuZmluZChvcmlnaW4xLlNlcmlhbGl6ZSgpKSk7Ci0gICAgRVhQRUNUX05FKHN0ZDo6c3RyaW5nOjpucG9zLAotICAgICAgICAgICAgICBVaW50OFZlY3RvclRvU3RkU3RyaW5nKGl0LmZpcnN0KS5maW5kKG9yaWdpbjIuU2VyaWFsaXplKCkpKTsKKyAgICBFWFBFQ1RfRVEoc3RkOjpzdHJpbmc6Om5wb3MsIGVudHJ5LmZpcnN0LmZpbmQob3JpZ2luMS5TZXJpYWxpemUoKSkpOworICAgIEVYUEVDVF9ORShzdGQ6OnN0cmluZzo6bnBvcywgZW50cnkuZmlyc3QuZmluZChvcmlnaW4yLlNlcmlhbGl6ZSgpKSk7CiAgIH0KIH0KIApAQCAtNTM0LDYgKzU5Nyw3IEBACiAKICAgbW9qbzo6UmVtb3RlPGJsaW5rOjptb2pvbTo6U3RvcmFnZUFyZWE+IGFyZWE7CiAgIGNvbnRleHQoKS0+T3BlbkxvY2FsU3RvcmFnZShvcmlnaW4xLCBhcmVhLkJpbmROZXdQaXBlQW5kUGFzc1JlY2VpdmVyKCkpOworCiAgIGFyZWEtPlB1dChrZXksIHZhbHVlLCBiYXNlOjpudWxsb3B0LCAic291cmNlIiwgYmFzZTo6RG9Ob3RoaW5nKCkpOwogICBhcmVhLnJlc2V0KCk7CiAKQEAgLTU0MiwxNiArNjA2LDE2IEBACiAgIGFyZWEucmVzZXQoKTsKIAogICAvLyBNYWtlIHN1cmUgYWxsIGRhdGEgZ2V0cyBjb21taXR0ZWQgdG8gZGlzay4KLSAgYmFzZTo6UnVuTG9vcCgpLlJ1blVudGlsSWRsZSgpOwotICBFWFBFQ1RfRkFMU0UobW9ja19kYXRhKCkuZW1wdHkoKSk7CisgIFJ1blVudGlsSWRsZSgpOworICBFWFBFQ1RfRkFMU0UoR2V0RGF0YWJhc2VDb250ZW50cygpLmVtcHR5KCkpOwogCiAgIFRlc3RMZXZlbERCT2JzZXJ2ZXIgb2JzZXJ2ZXI7CiAgIGNvbnRleHQoKS0+T3BlbkxvY2FsU3RvcmFnZShvcmlnaW4xLCBhcmVhLkJpbmROZXdQaXBlQW5kUGFzc1JlY2VpdmVyKCkpOwogICBhcmVhLT5BZGRPYnNlcnZlcihvYnNlcnZlci5CaW5kKCkpOwotICBiYXNlOjpSdW5Mb29wKCkuUnVuVW50aWxJZGxlKCk7CisgIFJ1blVudGlsSWRsZSgpOwogCiAgIGNvbnRleHQoKS0+RGVsZXRlU3RvcmFnZShvcmlnaW4xLCBiYXNlOjpEb05vdGhpbmcoKSk7Ci0gIGJhc2U6OlJ1bkxvb3AoKS5SdW5VbnRpbElkbGUoKTsKKyAgUnVuVW50aWxJZGxlKCk7CiAKICAgQVNTRVJUX0VRKDF1LCBvYnNlcnZlci5vYnNlcnZhdGlvbnMoKS5zaXplKCkpOwogICBFWFBFQ1RfRVEoVGVzdExldmVsREJPYnNlcnZlcjo6T2JzZXJ2YXRpb246OmtEZWxldGVBbGwsCkBAIC01NTksMTQgKzYyMywxMyBAQAogCiAgIC8vIERhdGEgZnJvbSBvcmlnaW4yIHNob3VsZCBleGlzdCwgaW5jbHVkaW5nIG1ldGEtZGF0YSwgYnV0IG5vdGhpbmcgc2hvdWxkCiAgIC8vIGV4aXN0IGZvciBvcmlnaW4xLgotICBFWFBFQ1RfRVEoM3UsIG1vY2tfZGF0YSgpLnNpemUoKSk7Ci0gIGZvciAoY29uc3QgYXV0byYgaXQgOiBtb2NrX2RhdGEoKSkgewotICAgIGlmIChVaW50OFZlY3RvclRvU3RkU3RyaW5nKGl0LmZpcnN0KSA9PSAiVkVSU0lPTiIpCisgIGF1dG8gY29udGVudHMgPSBHZXREYXRhYmFzZUNvbnRlbnRzKCk7CisgIEVYUEVDVF9FUSgzdSwgY29udGVudHMuc2l6ZSgpKTsKKyAgZm9yIChjb25zdCBhdXRvJiBlbnRyeSA6IGNvbnRlbnRzKSB7CisgICAgaWYgKGVudHJ5LmZpcnN0ID09ICJWRVJTSU9OIikKICAgICAgIGNvbnRpbnVlOwotICAgIEVYUEVDVF9FUShzdGQ6OnN0cmluZzo6bnBvcywKLSAgICAgICAgICAgICAgVWludDhWZWN0b3JUb1N0ZFN0cmluZyhpdC5maXJzdCkuZmluZChvcmlnaW4xLlNlcmlhbGl6ZSgpKSk7Ci0gICAgRVhQRUNUX05FKHN0ZDo6c3RyaW5nOjpucG9zLAotICAgICAgICAgICAgICBVaW50OFZlY3RvclRvU3RkU3RyaW5nKGl0LmZpcnN0KS5maW5kKG9yaWdpbjIuU2VyaWFsaXplKCkpKTsKKyAgICBFWFBFQ1RfRVEoc3RkOjpzdHJpbmc6Om5wb3MsIGVudHJ5LmZpcnN0LmZpbmQob3JpZ2luMS5TZXJpYWxpemUoKSkpOworICAgIEVYUEVDVF9ORShzdGQ6OnN0cmluZzo6bnBvcywgZW50cnkuZmlyc3QuZmluZChvcmlnaW4yLlNlcmlhbGl6ZSgpKSk7CiAgIH0KIH0KIApAQCAtNTc4LDYgKzY0MSw3IEBACiAKICAgbW9qbzo6UmVtb3RlPGJsaW5rOjptb2pvbTo6U3RvcmFnZUFyZWE+IGFyZWE7CiAgIGNvbnRleHQoKS0+T3BlbkxvY2FsU3RvcmFnZShvcmlnaW4xLCBhcmVhLkJpbmROZXdQaXBlQW5kUGFzc1JlY2VpdmVyKCkpOworCiAgIGFyZWEtPlB1dChrZXksIHZhbHVlLCBiYXNlOjpudWxsb3B0LCAic291cmNlIiwgYmFzZTo6RG9Ob3RoaW5nKCkpOwogICBhcmVhLnJlc2V0KCk7CiAKQEAgLTU4NiwxOCArNjUwLDE4IEBACiAgIGFyZWEucmVzZXQoKTsKIAogICAvLyBNYWtlIHN1cmUgYWxsIGRhdGEgZ2V0cyBjb21taXR0ZWQgdG8gZGlzay4KLSAgYmFzZTo6UnVuTG9vcCgpLlJ1blVudGlsSWRsZSgpOwotICBFWFBFQ1RfRkFMU0UobW9ja19kYXRhKCkuZW1wdHkoKSk7CisgIFJ1blVudGlsSWRsZSgpOworICBFWFBFQ1RfRkFMU0UoR2V0RGF0YWJhc2VDb250ZW50cygpLmVtcHR5KCkpOwogCiAgIFRlc3RMZXZlbERCT2JzZXJ2ZXIgb2JzZXJ2ZXI7CiAgIGNvbnRleHQoKS0+T3BlbkxvY2FsU3RvcmFnZShvcmlnaW4xLCBhcmVhLkJpbmROZXdQaXBlQW5kUGFzc1JlY2VpdmVyKCkpOwogICBhcmVhLT5BZGRPYnNlcnZlcihvYnNlcnZlci5CaW5kKCkpOwogICBhcmVhLT5QdXQoU3RkU3RyaW5nVG9VaW50OFZlY3Rvcigia2V5MiIpLCB2YWx1ZSwgYmFzZTo6bnVsbG9wdCwgInNvdXJjZSIsCiAgICAgICAgICAgICBiYXNlOjpEb05vdGhpbmcoKSk7Ci0gIGJhc2U6OlJ1bkxvb3AoKS5SdW5VbnRpbElkbGUoKTsKKyAgUnVuVW50aWxJZGxlKCk7CiAKICAgY29udGV4dCgpLT5EZWxldGVTdG9yYWdlKG9yaWdpbjEsIGJhc2U6OkRvTm90aGluZygpKTsKLSAgYmFzZTo6UnVuTG9vcCgpLlJ1blVudGlsSWRsZSgpOworICBSdW5VbnRpbElkbGUoKTsKIAogICBBU1NFUlRfRVEoMnUsIG9ic2VydmVyLm9ic2VydmF0aW9ucygpLnNpemUoKSk7CiAgIEVYUEVDVF9FUShUZXN0TGV2ZWxEQk9ic2VydmVyOjpPYnNlcnZhdGlvbjo6a0FkZCwKQEAgLTYwNywxNCArNjcxLDEzIEBACiAKICAgLy8gRGF0YSBmcm9tIG9yaWdpbjIgc2hvdWxkIGV4aXN0LCBpbmNsdWRpbmcgbWV0YS1kYXRhLCBidXQgbm90aGluZyBzaG91bGQKICAgLy8gZXhpc3QgZm9yIG9yaWdpbjEuCi0gIEVYUEVDVF9FUSgzdSwgbW9ja19kYXRhKCkuc2l6ZSgpKTsKLSAgZm9yIChjb25zdCBhdXRvJiBpdCA6IG1vY2tfZGF0YSgpKSB7Ci0gICAgaWYgKFVpbnQ4VmVjdG9yVG9TdGRTdHJpbmcoaXQuZmlyc3QpID09ICJWRVJTSU9OIikKKyAgYXV0byBjb250ZW50cyA9IEdldERhdGFiYXNlQ29udGVudHMoKTsKKyAgRVhQRUNUX0VRKDN1LCBjb250ZW50cy5zaXplKCkpOworICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogY29udGVudHMpIHsKKyAgICBpZiAoZW50cnkuZmlyc3QgPT0gIlZFUlNJT04iKQogICAgICAgY29udGludWU7Ci0gICAgRVhQRUNUX0VRKHN0ZDo6c3RyaW5nOjpucG9zLAotICAgICAgICAgICAgICBVaW50OFZlY3RvclRvU3RkU3RyaW5nKGl0LmZpcnN0KS5maW5kKG9yaWdpbjEuU2VyaWFsaXplKCkpKTsKLSAgICBFWFBFQ1RfTkUoc3RkOjpzdHJpbmc6Om5wb3MsCi0gICAgICAgICAgICAgIFVpbnQ4VmVjdG9yVG9TdGRTdHJpbmcoaXQuZmlyc3QpLmZpbmQob3JpZ2luMi5TZXJpYWxpemUoKSkpOworICAgIEVYUEVDVF9FUShzdGQ6OnN0cmluZzo6bnBvcywgZW50cnkuZmlyc3QuZmluZChvcmlnaW4xLlNlcmlhbGl6ZSgpKSk7CisgICAgRVhQRUNUX05FKHN0ZDo6c3RyaW5nOjpucG9zLCBlbnRyeS5maXJzdC5maW5kKG9yaWdpbjIuU2VyaWFsaXplKCkpKTsKICAgfQogfQogCkBAIC02NDksMTUgKzcxMiwyMSBAQAogICBhcmVhLT5HZXQoc3RkOjp2ZWN0b3I8dWludDhfdD4oKSwgYmFzZTo6RG9Ob3RoaW5nKCkpOwogICBhcmVhLnJlc2V0KCk7CiAgIGR1bW15X2FyZWEucmVzZXQoKTsKLSAgYmFzZTo6UnVuTG9vcCgpLlJ1blVudGlsSWRsZSgpOwotICBFWFBFQ1RfVFJVRShtb2NrX2RhdGEoKS5lbXB0eSgpKTsKKyAgUnVuVW50aWxJZGxlKCk7CisKKyAgRVhQRUNUX1RSVUUoR2V0RGF0YWJhc2VDb250ZW50cygpLmVtcHR5KCkpOwogCiAgIC8vIE9wZW5pbmcgb3JpZ2luMSBhbmQgYWNjZXNzaW5nIGl0cyBkYXRhIHNob3VsZCBtaWdyYXRlIGl0cyBzdG9yYWdlLgogICBjb250ZXh0KCktPk9wZW5Mb2NhbFN0b3JhZ2Uob3JpZ2luMSwgYXJlYS5CaW5kTmV3UGlwZUFuZFBhc3NSZWNlaXZlcigpKTsKICAgY29udGV4dCgpLT5PcGVuTG9jYWxTdG9yYWdlKG9yaWdpbjEsIGR1bW15X2FyZWEuQmluZE5ld1BpcGVBbmRQYXNzUmVjZWl2ZXIoKSk7Ci0gIGFyZWEtPkdldChzdGQ6OnZlY3Rvcjx1aW50OF90PigpLCBiYXNlOjpEb05vdGhpbmcoKSk7Ci0gIGJhc2U6OlJ1bkxvb3AoKS5SdW5VbnRpbElkbGUoKTsKLSAgRVhQRUNUX0ZBTFNFKG1vY2tfZGF0YSgpLmVtcHR5KCkpOworCisgIGJhc2U6OlJ1bkxvb3AgbG9vcDsKKyAgYXJlYS0+R2V0KHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KCksCisgICAgICAgICAgICBiYXNlOjpCaW5kTGFtYmRhRm9yVGVzdGluZygKKyAgICAgICAgICAgICAgICBbJl0oYm9vbCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mKSB7IGxvb3AuUXVpdCgpOyB9KSk7CisgIGxvb3AuUnVuKCk7CisKKyAgRVhQRUNUX0ZBTFNFKEdldERhdGFiYXNlQ29udGVudHMoKS5lbXB0eSgpKTsKIAogICB7CiAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVzdWx0OwpAQCAtNjkwLDE5ICs3NTksMTkgQEAKIH0KIAogVEVTVF9GKExvY2FsU3RvcmFnZUNvbnRleHRNb2pvVGVzdCwgRml4VXApIHsKLSAgc2V0X21vY2tfZGF0YSgiVkVSU0lPTiIsICIxIik7CisgIFNldERhdGFiYXNlRW50cnkoIlZFUlNJT04iLCAiMSIpOwogICAvLyBBZGQgbW9jayBkYXRhIGZvciB0aGUgImtleSIga2V5LCB3aXRoIGJvdGggcG9zc2libGUgZW5jb2RpbmdzIGZvciBrZXkuCiAgIC8vIFdlIGV4cGVjdCB0aGUgdmFsdWUgb2YgdGhlIGNvcnJlY3RseSBlbmNvZGVkIGtleSB0byB0YWtlIHByZWNlZGVuY2Ugb3ZlcgogICAvLyB0aGUgaW5jb3JyZWN0bHkgZW5jb2RlZCBrZXkgKGFuZCBleHBlY3QgdGhlIGluY29ycmVjdGx5IGVuY29kZWQga2V5IHRvIGJlCiAgIC8vIGRlbGV0ZWQuCi0gIHNldF9tb2NrX2RhdGEoc3RkOjpzdHJpbmcoIl9odHRwOi8vZm9vYmFyLmNvbSIpICsgJ1x4MDAnICsgIlx4MDFrZXkiLAotICAgICAgICAgICAgICAgICJ2YWx1ZTEiKTsKLSAgc2V0X21vY2tfZGF0YSgKKyAgU2V0RGF0YWJhc2VFbnRyeShzdGQ6OnN0cmluZygiX2h0dHA6Ly9mb29iYXIuY29tIikgKyAnXHgwMCcgKyAiXHgwMWtleSIsCisgICAgICAgICAgICAgICAgICAgInZhbHVlMSIpOworICBTZXREYXRhYmFzZUVudHJ5KAogICAgICAgRW5jb2RlS2V5QXNVVEYxNigiaHR0cDovL2Zvb2Jhci5jb20iLCBiYXNlOjpBU0NJSVRvVVRGMTYoImtleSIpKSwKICAgICAgICJ2YWx1ZTIiKTsKICAgLy8gQWxzbyBhZGQgbW9jayBkYXRhIGZvciB0aGUgImZvbyIga2V5LCB0aGlzIHRpbWUgb25seSB3aXRoIHRoZSBpbmNvcnJlYwogICAvLyBlbmNvZGluZy4gVGhpcyBzaG91bGQgYmUgdXBkYXRlZCB0byB0aGUgY29ycmVjdCBlbmNvZGluZy4KLSAgc2V0X21vY2tfZGF0YSgKKyAgU2V0RGF0YWJhc2VFbnRyeSgKICAgICAgIEVuY29kZUtleUFzVVRGMTYoImh0dHA6Ly9mb29iYXIuY29tIiwgYmFzZTo6QVNDSUlUb1VURjE2KCJmb28iKSksCiAgICAgICAidmFsdWUzIik7CiAKQEAgLTczMywxMSArODAyLDEwIEBACiAKICAgLy8gRXhwZWN0IDQgcm93cyBpbiB0aGUgZGF0YWJhc2U6IFZFUlNJT04sIG1ldGEtZGF0YSBmb3IgdGhlIG9yaWdpbiwgYW5kIHR3bwogICAvLyByb3dzIG9mIGFjdHVhbCBkYXRhLgotICBFWFBFQ1RfRVEoNHUsIG1vY2tfZGF0YSgpLnNpemUoKSk7Ci0gIEVYUEVDVF9FUShsZXZlbGRiOjpTdGRTdHJpbmdUb1VpbnQ4VmVjdG9yKCJ2YWx1ZTEiKSwKLSAgICAgICAgICAgIG1vY2tfZGF0YSgpLnJiZWdpbigpLT5zZWNvbmQpOwotICBFWFBFQ1RfRVEobGV2ZWxkYjo6U3RkU3RyaW5nVG9VaW50OFZlY3RvcigidmFsdWUzIiksCi0gICAgICAgICAgICBzdGQ6Om5leHQobW9ja19kYXRhKCkucmJlZ2luKCkpLT5zZWNvbmQpOworICBhdXRvIGNvbnRlbnRzID0gR2V0RGF0YWJhc2VDb250ZW50cygpOworICBFWFBFQ1RfRVEoNHUsIGNvbnRlbnRzLnNpemUoKSk7CisgIEVYUEVDVF9FUSgidmFsdWUxIiwgY29udGVudHMucmJlZ2luKCktPnNlY29uZCk7CisgIEVYUEVDVF9FUSgidmFsdWUzIiwgc3RkOjpuZXh0KGNvbnRlbnRzLnJiZWdpbigpKS0+c2Vjb25kKTsKIH0KIAogVEVTVF9GKExvY2FsU3RvcmFnZUNvbnRleHRNb2pvVGVzdCwgU2h1dGRvd25DbGVhcnNEYXRhKSB7CkBAIC03NDksNiArODE3LDcgQEAKIAogICBtb2pvOjpSZW1vdGU8Ymxpbms6Om1vam9tOjpTdG9yYWdlQXJlYT4gYXJlYTsKICAgY29udGV4dCgpLT5PcGVuTG9jYWxTdG9yYWdlKG9yaWdpbjEsIGFyZWEuQmluZE5ld1BpcGVBbmRQYXNzUmVjZWl2ZXIoKSk7CisKICAgYXJlYS0+UHV0KGtleTEsIHZhbHVlLCBiYXNlOjpudWxsb3B0LCAic291cmNlIiwgYmFzZTo6RG9Ob3RoaW5nKCkpOwogICBhcmVhLT5QdXQoa2V5MiwgdmFsdWUsIGJhc2U6Om51bGxvcHQsICJzb3VyY2UiLCBiYXNlOjpEb05vdGhpbmcoKSk7CiAgIGFyZWEucmVzZXQoKTsKQEAgLTc1OCwyMSArODI3LDIwIEBACiAgIGFyZWEucmVzZXQoKTsKIAogICAvLyBNYWtlIHN1cmUgYWxsIGRhdGEgZ2V0cyBjb21taXR0ZWQgdG8gdGhlIERCLgotICBiYXNlOjpSdW5Mb29wKCkuUnVuVW50aWxJZGxlKCk7CisgIFJ1blVudGlsSWRsZSgpOwogCiAgIHNwZWNpYWxfc3RvcmFnZV9wb2xpY3koKS0+QWRkU2Vzc2lvbk9ubHkob3JpZ2luMS5HZXRVUkwoKSk7CiAgIFNodXRkb3duQ29udGV4dCgpOwogCiAgIC8vIERhdGEgZnJvbSBvcmlnaW4yIHNob3VsZCBleGlzdCwgaW5jbHVkaW5nIG1ldGEtZGF0YSwgYnV0IG5vdGhpbmcgc2hvdWxkCiAgIC8vIGV4aXN0IGZvciBvcmlnaW4xLgotICBFWFBFQ1RfRVEoM3UsIG1vY2tfZGF0YSgpLnNpemUoKSk7Ci0gIGZvciAoY29uc3QgYXV0byYgaXQgOiBtb2NrX2RhdGEoKSkgewotICAgIGlmIChVaW50OFZlY3RvclRvU3RkU3RyaW5nKGl0LmZpcnN0KSA9PSAiVkVSU0lPTiIpCisgIGF1dG8gY29udGVudHMgPSBHZXREYXRhYmFzZUNvbnRlbnRzKCk7CisgIEVYUEVDVF9FUSgzdSwgY29udGVudHMuc2l6ZSgpKTsKKyAgZm9yIChjb25zdCBhdXRvJiBlbnRyeSA6IGNvbnRlbnRzKSB7CisgICAgaWYgKGVudHJ5LmZpcnN0ID09ICJWRVJTSU9OIikKICAgICAgIGNvbnRpbnVlOwotICAgIEVYUEVDVF9FUShzdGQ6OnN0cmluZzo6bnBvcywKLSAgICAgICAgICAgICAgVWludDhWZWN0b3JUb1N0ZFN0cmluZyhpdC5maXJzdCkuZmluZChvcmlnaW4xLlNlcmlhbGl6ZSgpKSk7Ci0gICAgRVhQRUNUX05FKHN0ZDo6c3RyaW5nOjpucG9zLAotICAgICAgICAgICAgICBVaW50OFZlY3RvclRvU3RkU3RyaW5nKGl0LmZpcnN0KS5maW5kKG9yaWdpbjIuU2VyaWFsaXplKCkpKTsKKyAgICBFWFBFQ1RfRVEoc3RkOjpzdHJpbmc6Om5wb3MsIGVudHJ5LmZpcnN0LmZpbmQob3JpZ2luMS5TZXJpYWxpemUoKSkpOworICAgIEVYUEVDVF9ORShzdGQ6OnN0cmluZzo6bnBvcywgZW50cnkuZmlyc3QuZmluZChvcmlnaW4yLlNlcmlhbGl6ZSgpKSk7CiAgIH0KIH0KIApAQCAtOTY2LDcgKzEwMzQsNiBAQAogfQogCiBURVNUX0YoTG9jYWxTdG9yYWdlQ29udGV4dE1vam9UZXN0LCBSZWNyZWF0ZU9uQ29tbWl0RmFpbHVyZSkgewotICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50OF90Piwgc3RkOjp2ZWN0b3I8dWludDhfdD4+IHRlc3RfZGF0YTsKICAgYmFzZTo6RmlsZVBhdGggdGVzdF9wYXRoKEZJTEVfUEFUSF9MSVRFUkFMKCJ0ZXN0X3BhdGgiKSk7CiAgIGF1dG8qIGNvbnRleHQgPSBuZXcgTG9jYWxTdG9yYWdlQ29udGV4dE1vam8oCiAgICAgICB0ZW1wX3BhdGgoKSwgYmFzZTo6VGhyZWFkVGFza1J1bm5lckhhbmRsZTo6R2V0KCksIG51bGxwdHIsCkBAIC05NzQsMjEgKzEwNDEsMTEgQEAKIAogICBiYXNlOjpPcHRpb25hbDxiYXNlOjpSdW5Mb29wPiBvcGVuX2xvb3A7CiAgIGJhc2U6Ok9wdGlvbmFsPGJhc2U6OlJ1bkxvb3A+IGRlc3RydWN0aW9uX2xvb3A7Ci0gIGJvb2wgZmlyc3RfZGF0YWJhc2VfZGVzdHJveWVkID0gZmFsc2U7CiAgIHNpemVfdCBudW1fZGF0YWJhc2Vfb3Blbl9yZXF1ZXN0cyA9IDA7Ci0gIGNvbnRleHQtPlNldERhdGFiYXNlRmFjdG9yeUZvclRlc3RpbmcoYmFzZTo6QmluZExhbWJkYUZvclRlc3RpbmcoCi0gICAgICBbJl0oKSAtPiBzdGQ6OnVuaXF1ZV9wdHI8bGV2ZWxkYjo6bW9qb206OkxldmVsREJEYXRhYmFzZT4gewotICAgICAgICArK251bV9kYXRhYmFzZV9vcGVuX3JlcXVlc3RzOwotICAgICAgICBhdXRvIGRiID0gc3RkOjptYWtlX3VuaXF1ZTxGYWtlTGV2ZWxEQkRhdGFiYXNlRXJyb3JPbldyaXRlPigmdGVzdF9kYXRhKTsKLSAgICAgICAgZGItPlNldERlc3RydWN0aW9uQ2FsbGJhY2soYmFzZTo6QmluZExhbWJkYUZvclRlc3RpbmcoWyZdIHsKLSAgICAgICAgICBmaXJzdF9kYXRhYmFzZV9kZXN0cm95ZWQgPSB0cnVlOwotICAgICAgICAgIGlmIChkZXN0cnVjdGlvbl9sb29wKQotICAgICAgICAgICAgZGVzdHJ1Y3Rpb25fbG9vcC0+UXVpdCgpOwotICAgICAgICB9KSk7Ci0gICAgICAgIGlmIChvcGVuX2xvb3ApCi0gICAgICAgICAgb3Blbl9sb29wLT5RdWl0KCk7Ci0gICAgICAgIHJldHVybiBkYjsKLSAgICAgIH0pKTsKKyAgY29udGV4dC0+U2V0RGF0YWJhc2VPcGVuQ2FsbGJhY2tGb3JUZXN0aW5nKGJhc2U6OkJpbmRMYW1iZGFGb3JUZXN0aW5nKFsmXSB7CisgICAgKytudW1fZGF0YWJhc2Vfb3Blbl9yZXF1ZXN0czsKKyAgICBvcGVuX2xvb3AtPlF1aXQoKTsKKyAgfSkpOwogCiAgIGF1dG8ga2V5ID0gU3RkU3RyaW5nVG9VaW50OFZlY3Rvcigia2V5Iik7CiAgIGF1dG8gdmFsdWUgPSBTdGRTdHJpbmdUb1VpbnQ4VmVjdG9yKCJ2YWx1ZSIpOwpAQCAtMTAyMiwxOCArMTA3OSwyNSBAQAogICAvLyBkZXN0cm95ZWQsIHdoaWNoIHNob3VsZCBoYXBwZW4gYWZ0ZXIgbWFueSBjb21taXQgZmFpbHVyZXMuCiAgIGRlc3RydWN0aW9uX2xvb3AuZW1wbGFjZSgpOwogCi0gIC8vIEFsc28gcHJlcGFyZSBmb3IgYW5vdGhlciBkYXRhYmFzZSBjb25uZWN0aW9uLCBuZXh0IHRpbWUgcHJvdmlkaW5nIGEKLSAgLy8gZnVuY3Rpb25pbmcgZGF0YWJhc2UuCisgIGJvb2wgZmlyc3RfZGF0YWJhc2VfZGVzdHJveWVkID0gZmFsc2U7CisgIGNvbnRleHQtPkdldERhdGFiYXNlRm9yVGVzdGluZygpLlBvc3RUYXNrV2l0aFRoaXNPYmplY3QoCisgICAgICBGUk9NX0hFUkUsCisgICAgICBiYXNlOjpCaW5kTGFtYmRhRm9yVGVzdGluZyhbJl0oc3RvcmFnZTo6RG9tU3RvcmFnZURhdGFiYXNlKiBkYikgeworICAgICAgICBkYi0+TWFrZUFsbENvbW1pdHNGYWlsRm9yVGVzdGluZygpOworICAgICAgICBkYi0+U2V0RGVzdHJ1Y3Rpb25DYWxsYmFja0ZvclRlc3RpbmcoYmFzZTo6QmluZExhbWJkYUZvclRlc3RpbmcoWyZdIHsKKyAgICAgICAgICBmaXJzdF9kYXRhYmFzZV9kZXN0cm95ZWQgPSB0cnVlOworICAgICAgICAgIGRlc3RydWN0aW9uX2xvb3AtPlF1aXQoKTsKKyAgICAgICAgfSkpOworICAgICAgfSkpOworCisgIC8vIEFsc28gcHJlcGFyZSBmb3IgYW5vdGhlciBkYXRhYmFzZSBjb25uZWN0aW9uLCB0aGlzIHRpbWUgd2l0aG91dCBtYWtpbmcKKyAgLy8gY29tbWl0cyBmYWlsLgogICBvcGVuX2xvb3AuZW1wbGFjZSgpOwogICBudW1fZGF0YWJhc2Vfb3Blbl9yZXF1ZXN0cyA9IDA7Ci0gIGNvbnRleHQtPlNldERhdGFiYXNlRmFjdG9yeUZvclRlc3RpbmcoYmFzZTo6QmluZExhbWJkYUZvclRlc3RpbmcoCi0gICAgICBbJl0oKSAtPiBzdGQ6OnVuaXF1ZV9wdHI8bGV2ZWxkYjo6bW9qb206OkxldmVsREJEYXRhYmFzZT4gewotICAgICAgICArK251bV9kYXRhYmFzZV9vcGVuX3JlcXVlc3RzOwotICAgICAgICBhdXRvIGRiID0gc3RkOjptYWtlX3VuaXF1ZTxGYWtlTGV2ZWxEQkRhdGFiYXNlPigmdGVzdF9kYXRhKTsKLSAgICAgICAgaWYgKG9wZW5fbG9vcCkKLSAgICAgICAgICBvcGVuX2xvb3AtPlF1aXQoKTsKLSAgICAgICAgcmV0dXJuIGRiOwotICAgICAgfSkpOworICBjb250ZXh0LT5TZXREYXRhYmFzZU9wZW5DYWxsYmFja0ZvclRlc3RpbmcoYmFzZTo6QmluZExhbWJkYUZvclRlc3RpbmcoWyZdIHsKKyAgICArK251bV9kYXRhYmFzZV9vcGVuX3JlcXVlc3RzOworICAgIG9wZW5fbG9vcC0+UXVpdCgpOworICB9KSk7CiAKICAgLy8gU3RhcnQgYSBwdXQgb3BlcmF0aW9uIG9uIHRoZSB0aGlyZCBjb25uZWN0aW9uIGJlZm9yZSBzdGFydGluZyB0byBjb21taXQKICAgLy8gYSBsb3Qgb2YgZGF0YSBvbiB0aGUgZmlyc3Qgb3JpZ2luLiBUaGlzIHB1dCBvcGVyYXRpb24gc2hvdWxkIHJlc3VsdCBpbiBhCkBAIC0xMDQ0LDE3ICsxMTA4LDE0IEBACiAgIC8vIFJlcGVhdGVkbHkgd3JpdGUgZGF0YSB0byB0aGUgZGF0YWJhc2UsIHRvIHRyaWdnZXIgZW5vdWdoIGNvbW1pdCBlcnJvcnMuCiAgIHNpemVfdCB2YWx1ZXNfd3JpdHRlbiA9IDA7CiAgIHdoaWxlIChhcmVhMS5pc19jb25uZWN0ZWQoKSkgewotICAgIGJhc2U6OlJ1bkxvb3AgcHV0X2xvb3A7CiAgICAgLy8gRXZlcnkgd3JpdGUgbmVlZHMgdG8gYmUgZGlmZmVyZW50IHRvIG1ha2Ugc3VyZSB0aGVyZSBhY3R1YWxseSBpcyBhCi0gICAgLy8gY2hhbmdlIHRvIGNvbW1pdC4KICAgICB2YWx1ZVswXSsrOwotICAgIGFyZWExLnNldF9kaXNjb25uZWN0X2hhbmRsZXIocHV0X2xvb3AuUXVpdENsb3N1cmUoKSk7CiAgICAgYXJlYTEtPlB1dChrZXksIHZhbHVlLCBiYXNlOjpudWxsb3B0LCAic291cmNlIiwKICAgICAgICAgICAgICAgIGJhc2U6OkJpbmRMYW1iZGFGb3JUZXN0aW5nKFsmXShib29sIHN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgRVhQRUNUX1RSVUUoc3VjY2Vzcyk7CiAgICAgICAgICAgICAgICAgIHZhbHVlc193cml0dGVuKys7CiAgICAgICAgICAgICAgICB9KSk7Ci0gICAgcHV0X2xvb3AuUnVuVW50aWxJZGxlKCk7CisgICAgUnVuVW50aWxJZGxlKCk7CiAgICAgLy8gQW5kIHdlIG5lZWQgdG8gZmx1c2ggYWZ0ZXIgZXZlcnkgY2hhbmdlLiBPdGhlcndpc2UgY2hhbmdlcyBnZXQgYmF0Y2hlZCB1cAogICAgIC8vIGFuZCBvbmx5IG9uZSBjb21taXQgaXMgZG9uZSBzb21lIHRpbWUgbGF0ZXIuCiAgICAgY29udGV4dC0+Rmx1c2hPcmlnaW5Gb3JUZXN0aW5nKApAQCAtMTEwMSw3ICsxMTYyLDYgQEAKICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByZXN1bHQ7CiAgICAgRVhQRUNUX1RSVUUoRG9UZXN0R2V0KGNvbnRleHQsIGtleSwgJnJlc3VsdCkpOwogICAgIEVYUEVDVF9FUSh2YWx1ZSwgcmVzdWx0KTsKLSAgICBFWFBFQ1RfRkFMU0UodGVzdF9kYXRhLmVtcHR5KCkpOwogICB9CiAKICAgLy8gT2JzZXJ2ZXJzIHNob3VsZCBoYXZlIHNlZW4gb25lIEFkZCBldmVudCBhbmQgYSBudW1iZXIgb2YgQ2hhbmdlIGV2ZW50cyBmb3IKQEAgLTExMTMsMTEgKzExNzMsMTEgQEAKICAgICAgICAgICAgICAgb2JzZXJ2ZXIyLm9ic2VydmF0aW9ucygpW2ldLnR5cGUpOwogICAgIEVYUEVDVF9FUShVaW50OFZlY3RvclRvU3RkU3RyaW5nKGtleSksIG9ic2VydmVyMi5vYnNlcnZhdGlvbnMoKVtpXS5rZXkpOwogICB9CisKKyAgY29udGV4dC0+U2h1dGRvd25BbmREZWxldGUoKTsKIH0KIAogVEVTVF9GKExvY2FsU3RvcmFnZUNvbnRleHRNb2pvVGVzdCwgRG9udFJlY3JlYXRlT25SZXBlYXRlZENvbW1pdEZhaWx1cmUpIHsKLSAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiB0ZXN0X2RhdGE7Ci0KICAgYmFzZTo6RmlsZVBhdGggdGVzdF9wYXRoKEZJTEVfUEFUSF9MSVRFUkFMKCJ0ZXN0X3BhdGgiKSk7CiAgIGF1dG8qIGNvbnRleHQgPSBuZXcgTG9jYWxTdG9yYWdlQ29udGV4dE1vam8oCiAgICAgICB0ZW1wX3BhdGgoKSwgYmFzZTo6VGhyZWFkVGFza1J1bm5lckhhbmRsZTo6R2V0KCksIG51bGxwdHIsCkBAIC0xMTI3LDE2ICsxMTg3LDEwIEBACiAgIGJhc2U6Ok9wdGlvbmFsPGJhc2U6OlJ1bkxvb3A+IG9wZW5fbG9vcDsKICAgc2l6ZV90IG51bV9kYXRhYmFzZV9vcGVuX3JlcXVlc3RzID0gMDsKICAgc2l6ZV90IG51bV9kYXRhYmFzZXNfZGVzdHJveWVkID0gMDsKLSAgY29udGV4dC0+U2V0RGF0YWJhc2VGYWN0b3J5Rm9yVGVzdGluZyhiYXNlOjpCaW5kTGFtYmRhRm9yVGVzdGluZygKLSAgICAgIFsmXSgpIC0+IHN0ZDo6dW5pcXVlX3B0cjxsZXZlbGRiOjptb2pvbTo6TGV2ZWxEQkRhdGFiYXNlPiB7Ci0gICAgICAgICsrbnVtX2RhdGFiYXNlX29wZW5fcmVxdWVzdHM7Ci0gICAgICAgIGF1dG8gZGIgPSBzdGQ6Om1ha2VfdW5pcXVlPEZha2VMZXZlbERCRGF0YWJhc2VFcnJvck9uV3JpdGU+KCZ0ZXN0X2RhdGEpOwotICAgICAgICBkYi0+U2V0RGVzdHJ1Y3Rpb25DYWxsYmFjaygKLSAgICAgICAgICAgIGJhc2U6OkJpbmRMYW1iZGFGb3JUZXN0aW5nKFsmXSB7ICsrbnVtX2RhdGFiYXNlc19kZXN0cm95ZWQ7IH0pKTsKLSAgICAgICAgaWYgKG9wZW5fbG9vcCkKLSAgICAgICAgICBvcGVuX2xvb3AtPlF1aXQoKTsKLSAgICAgICAgcmV0dXJuIGRiOwotICAgICAgfSkpOworICBjb250ZXh0LT5TZXREYXRhYmFzZU9wZW5DYWxsYmFja0ZvclRlc3RpbmcoYmFzZTo6QmluZExhbWJkYUZvclRlc3RpbmcoWyZdIHsKKyAgICArK251bV9kYXRhYmFzZV9vcGVuX3JlcXVlc3RzOworICAgIG9wZW5fbG9vcC0+UXVpdCgpOworICB9KSk7CiAgIG9wZW5fbG9vcC5lbXBsYWNlKCk7CiAKICAgYXV0byBrZXkgPSBTdGRTdHJpbmdUb1VpbnQ4VmVjdG9yKCJrZXkiKTsKQEAgLTExNDgsNiArMTIwMiwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZWEuQmluZE5ld1BpcGVBbmRQYXNzUmVjZWl2ZXIoKSk7CiAgIG9wZW5fbG9vcC0+UnVuKCk7CiAKKyAgLy8gRW5zdXJlIHRoYXQgYWxsIGNvbW1pdHMgZmFpbCBvbiB0aGUgZGF0YWJhc2UsIGFuZCB0aGF0IHdlIG9ic2VydmUgaXRzCisgIC8vIGRlc3RydWN0aW9uLgorICBjb250ZXh0LT5HZXREYXRhYmFzZUZvclRlc3RpbmcoKS5Qb3N0VGFza1dpdGhUaGlzT2JqZWN0KAorICAgICAgRlJPTV9IRVJFLAorICAgICAgYmFzZTo6QmluZExhbWJkYUZvclRlc3RpbmcoWyZdKHN0b3JhZ2U6OkRvbVN0b3JhZ2VEYXRhYmFzZSogZGIpIHsKKyAgICAgICAgZGItPk1ha2VBbGxDb21taXRzRmFpbEZvclRlc3RpbmcoKTsKKyAgICAgICAgZGItPlNldERlc3RydWN0aW9uQ2FsbGJhY2tGb3JUZXN0aW5nKAorICAgICAgICAgICAgYmFzZTo6QmluZExhbWJkYUZvclRlc3RpbmcoWyZdIHsgKytudW1fZGF0YWJhc2VzX2Rlc3Ryb3llZDsgfSkpOworICAgICAgfSkpOworCiAgIC8vIFZlcmlmeSBvbmUgYXR0ZW1wdCB3YXMgbWFkZSB0byBvcGVuIHRoZSBkYXRhYmFzZS4KICAgQVNTRVJUX0VRKDF1LCBudW1fZGF0YWJhc2Vfb3Blbl9yZXF1ZXN0cyk7CiAKQEAgLTExNTksMTggKzEyMjMsMTUgQEAKICAgLy8gUmVwZWF0ZWRseSB3cml0ZSBkYXRhIHRvIHRoZSBkYXRhYmFzZSwgdG8gdHJpZ2dlciBlbm91Z2ggY29tbWl0IGVycm9ycy4KICAgYmFzZTo6T3B0aW9uYWw8c3RkOjp2ZWN0b3I8dWludDhfdD4+IG9sZF92YWx1ZTsKICAgd2hpbGUgKGFyZWEuaXNfY29ubmVjdGVkKCkpIHsKLSAgICBiYXNlOjpSdW5Mb29wIHB1dF9sb29wOwogICAgIC8vIEV2ZXJ5IHdyaXRlIG5lZWRzIHRvIGJlIGRpZmZlcmVudCB0byBtYWtlIHN1cmUgdGhlcmUgYWN0dWFsbHkgaXMgYQogICAgIC8vIGNoYW5nZSB0byBjb21taXQuCiAgICAgdmFsdWVbMF0rKzsKLSAgICBhcmVhLnNldF9kaXNjb25uZWN0X2hhbmRsZXIocHV0X2xvb3AuUXVpdENsb3N1cmUoKSk7CiAgICAgYXJlYS0+UHV0KGtleSwgdmFsdWUsIG9sZF92YWx1ZSwgInNvdXJjZSIsCiAgICAgICAgICAgICAgIGJhc2U6OkJpbmRMYW1iZGFGb3JUZXN0aW5nKFsmXShib29sIHN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICBFWFBFQ1RfVFJVRShzdWNjZXNzKTsKLSAgICAgICAgICAgICAgICBwdXRfbG9vcC5RdWl0KCk7CiAgICAgICAgICAgICAgIH0pKTsKICAgICBvbGRfdmFsdWUgPSBzdGQ6OnZlY3Rvcjx1aW50OF90Pih2YWx1ZSk7Ci0gICAgcHV0X2xvb3AuUnVuVW50aWxJZGxlKCk7CisgICAgUnVuVW50aWxJZGxlKCk7CiAgICAgLy8gQW5kIHdlIG5lZWQgdG8gZmx1c2ggYWZ0ZXIgZXZlcnkgY2hhbmdlLiBPdGhlcndpc2UgY2hhbmdlcyBnZXQgYmF0Y2hlZCB1cAogICAgIC8vIGFuZCBvbmx5IG9uZSBjb21taXQgaXMgZG9uZSBzb21lIHRpbWUgbGF0ZXIuCiAgICAgY29udGV4dC0+Rmx1c2hPcmlnaW5Gb3JUZXN0aW5nKApAQCAtMTE4MSw5ICsxMjQyLDE3IEBACiAgIC8vIFdhaXQgZm9yIExvY2FsU3RvcmFnZUNvbnRleHRNb2pvIHRvIHRyeSB0byByZWNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLCBhbmQKICAgLy8gY29ubmVjdCB0aGF0IG5ldyByZXF1ZXN0IHdpdGggYSBkYXRhYmFzZSBpbXBsZW1lbnRhdGlvbiB0aGF0IGFsd2F5cyBmYWlscwogICAvLyBvbiB3cml0ZS4KKyAgY29udGV4dC0+U2V0RGF0YWJhc2VPcGVuQ2FsbGJhY2tGb3JUZXN0aW5nKGJhc2U6OkJpbmRMYW1iZGFGb3JUZXN0aW5nKFsmXSB7CisgICAgKytudW1fZGF0YWJhc2Vfb3Blbl9yZXF1ZXN0czsKKyAgICBvcGVuX2xvb3AtPlF1aXQoKTsKKyAgfSkpOwogICBvcGVuX2xvb3AtPlJ1bigpOwogICBFWFBFQ1RfRVEoMnUsIG51bV9kYXRhYmFzZV9vcGVuX3JlcXVlc3RzKTsKICAgRVhQRUNUX0VRKDF1LCBudW1fZGF0YWJhc2VzX2Rlc3Ryb3llZCk7CisgIGNvbnRleHQtPkdldERhdGFiYXNlRm9yVGVzdGluZygpLlBvc3RUYXNrV2l0aFRoaXNPYmplY3QoCisgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKFtdKHN0b3JhZ2U6OkRvbVN0b3JhZ2VEYXRhYmFzZSogZGIpIHsKKyAgICAgICAgZGItPk1ha2VBbGxDb21taXRzRmFpbEZvclRlc3RpbmcoKTsKKyAgICAgIH0pKTsKIAogICAvLyBSZWNvbm5lY3QgYSBhcmVhIHRvIHRoZSBkYXRhYmFzZSwgYW5kIHJlcGVhdGVkbHkgd3JpdGUgZGF0YSB0byBpdCBhZ2Fpbi4KICAgLy8gVGhpcyB0aW1lIGFsbCBzaG91bGQganVzdCBrZWVwIGdldHRpbmcgd3JpdHRlbiwgYW5kIGNvbW1pdCBlcnJvcnMgYXJlCkBAIC0xMTkyLDE3ICsxMjYxLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYS5CaW5kTmV3UGlwZUFuZFBhc3NSZWNlaXZlcigpKTsKICAgb2xkX3ZhbHVlID0gYmFzZTo6bnVsbG9wdDsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2NDsgKytpKSB7Ci0gICAgYmFzZTo6UnVuTG9vcCBwdXRfbG9vcDsKICAgICAvLyBFdmVyeSB3cml0ZSBuZWVkcyB0byBiZSBkaWZmZXJlbnQgdG8gbWFrZSBzdXJlIHRoZXJlIGFjdHVhbGx5IGlzIGEKICAgICAvLyBjaGFuZ2UgdG8gY29tbWl0LgogICAgIHZhbHVlWzBdKys7Ci0gICAgYXJlYS5zZXRfZGlzY29ubmVjdF9oYW5kbGVyKHB1dF9sb29wLlF1aXRDbG9zdXJlKCkpOwogICAgIGFyZWEtPlB1dChrZXksIHZhbHVlLCBvbGRfdmFsdWUsICJzb3VyY2UiLAogICAgICAgICAgICAgICBiYXNlOjpCaW5kTGFtYmRhRm9yVGVzdGluZyhbJl0oYm9vbCBzdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgRVhQRUNUX1RSVUUoc3VjY2Vzcyk7Ci0gICAgICAgICAgICAgICAgcHV0X2xvb3AuUXVpdCgpOwogICAgICAgICAgICAgICB9KSk7Ci0gICAgcHV0X2xvb3AuUnVuVW50aWxJZGxlKCk7CisgICAgUnVuVW50aWxJZGxlKCk7CiAgICAgb2xkX3ZhbHVlID0gdmFsdWU7CiAgICAgLy8gQW5kIHdlIG5lZWQgdG8gZmx1c2ggYWZ0ZXIgZXZlcnkgY2hhbmdlLiBPdGhlcndpc2UgY2hhbmdlcyBnZXQgYmF0Y2hlZCB1cAogICAgIC8vIGFuZCBvbmx5IG9uZSBjb21taXQgaXMgZG9uZSBzb21lIHRpbWUgbGF0ZXIuCkBAIC0xMjExLDggKzEyNzcsMTAgQEAKICAgfQogCiAgIC8vIFNob3VsZCBzdGlsbCBiZSBjb25uZWN0ZWQgYWZ0ZXIgYWxsIHRoYXQuCi0gIGJhc2U6OlJ1bkxvb3AoKS5SdW5VbnRpbElkbGUoKTsKKyAgUnVuVW50aWxJZGxlKCk7CiAgIEVYUEVDVF9UUlVFKGFyZWEuaXNfY29ubmVjdGVkKCkpOworCisgIGNvbnRleHQtPlNodXRkb3duQW5kRGVsZXRlKCk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBjb250ZW50CmRpZmYgLS1naXQgYS9jb250ZW50L2Jyb3dzZXIvZG9tX3N0b3JhZ2Uvc2Vzc2lvbl9zdG9yYWdlX2FyZWFfaW1wbF91bml0dGVzdC5jYyBiL2NvbnRlbnQvYnJvd3Nlci9kb21fc3RvcmFnZS9zZXNzaW9uX3N0b3JhZ2VfYXJlYV9pbXBsX3VuaXR0ZXN0LmNjCmluZGV4IDZjMDJjMTEuLjg1ZDQyM2FiIDEwMDY0NAotLS0gYS9jb250ZW50L2Jyb3dzZXIvZG9tX3N0b3JhZ2Uvc2Vzc2lvbl9zdG9yYWdlX2FyZWFfaW1wbF91bml0dGVzdC5jYworKysgYi9jb250ZW50L2Jyb3dzZXIvZG9tX3N0b3JhZ2Uvc2Vzc2lvbl9zdG9yYWdlX2FyZWFfaW1wbF91bml0dGVzdC5jYwpAQCAtMjMsNyArMjMsNiBAQAogI2luY2x1ZGUgImNvbnRlbnQvYnJvd3Nlci9kb21fc3RvcmFnZS9zZXNzaW9uX3N0b3JhZ2VfbWV0YWRhdGEuaCIKICNpbmNsdWRlICJjb250ZW50L2Jyb3dzZXIvZG9tX3N0b3JhZ2UvdGVzdC9zdG9yYWdlX2FyZWFfdGVzdF91dGlsLmgiCiAjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvdGVzdC9icm93c2VyX3Rhc2tfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb250ZW50L3Rlc3QvZmFrZV9sZXZlbGRiX2RhdGFiYXNlLmgiCiAjaW5jbHVkZSAiY29udGVudC90ZXN0L2dtb2NrX3V0aWwuaCIKICNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvYmluZGluZ3MvYXNzb2NpYXRlZF9yZWNlaXZlci5oIgogI2luY2x1ZGUgIm1vam8vcHVibGljL2NwcC9iaW5kaW5ncy9hc3NvY2lhdGVkX3JlbW90ZS5oIgpAQCAtOTYsNyArOTUsNyBAQAogICBjb25zdCBzdGQ6OnN0cmluZyB0ZXN0X25hbWVzcGFjZV9pZDJfOwogICBjb25zdCB1cmw6Ok9yaWdpbiB0ZXN0X29yaWdpbjFfOwogICBjb25zdCB1cmw6Ok9yaWdpbiB0ZXN0X29yaWdpbjJfOwotICBzdGQ6OnVuaXF1ZV9wdHI8bGV2ZWxkYjo6bW9qb206OkxldmVsREJEYXRhYmFzZT4gbGV2ZWxkYl9kYXRhYmFzZV87CisgIHN0ZDo6dW5pcXVlX3B0cjxsZXZlbGRiOjpMZXZlbERCRGF0YWJhc2VJbXBsPiBsZXZlbGRiX2RhdGFiYXNlXzsKICAgU2Vzc2lvblN0b3JhZ2VNZXRhZGF0YSBtZXRhZGF0YV87CiAKICAgdGVzdGluZzo6U3RyaWN0TW9jazxNb2NrTGlzdGVuZXI+IGxpc3RlbmVyXzsKZGlmZiAtLWdpdCBhL2NvbnRlbnQvYnJvd3Nlci9kb21fc3RvcmFnZS9zZXNzaW9uX3N0b3JhZ2VfY29udGV4dF9tb2pvLmNjIGIvY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL3Nlc3Npb25fc3RvcmFnZV9jb250ZXh0X21vam8uY2MKaW5kZXggZDEzNmI0NS4uMWE5YTY0NCAxMDA2NDQKLS0tIGEvY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL3Nlc3Npb25fc3RvcmFnZV9jb250ZXh0X21vam8uY2MKKysrIGIvY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL3Nlc3Npb25fc3RvcmFnZV9jb250ZXh0X21vam8uY2MKQEAgLTUzNSw2ICs1MzUsMTEgQEAKICAgaXQtPnNlY29uZC0+Rmx1c2hPcmlnaW5Gb3JUZXN0aW5nKG9yaWdpbik7CiB9CiAKK3ZvaWQgU2Vzc2lvblN0b3JhZ2VDb250ZXh0TW9qbzo6U2V0RGF0YWJhc2VPcGVuQ2FsbGJhY2tGb3JUZXN0aW5nKAorICAgIGJhc2U6Ok9uY2VDbG9zdXJlIGNhbGxiYWNrKSB7CisgIFJ1bldoZW5Db25uZWN0ZWQoc3RkOjptb3ZlKGNhbGxiYWNrKSk7Cit9CisKIHNjb3BlZF9yZWZwdHI8U2Vzc2lvblN0b3JhZ2VNZXRhZGF0YTo6TWFwRGF0YT4KIFNlc3Npb25TdG9yYWdlQ29udGV4dE1vam86OlJlZ2lzdGVyTmV3QXJlYU1hcCgKICAgICBTZXNzaW9uU3RvcmFnZU1ldGFkYXRhOjpOYW1lc3BhY2VFbnRyeSBuYW1lc3BhY2VfZW50cnksCkBAIC02OTgsMTMgKzcwMyw2IEBACiB2b2lkIFNlc3Npb25TdG9yYWdlQ29udGV4dE1vam86OkluaXRpYXRlQ29ubmVjdGlvbihib29sIGluX21lbW9yeV9vbmx5KSB7CiAgIERDSEVDS19FUShjb25uZWN0aW9uX3N0YXRlXywgQ09OTkVDVElPTl9JTl9QUk9HUkVTUyk7CiAKLSAgaWYgKGRhdGFiYXNlX2ZhY3RvcnlfZm9yX3Rlc3RpbmdfKSB7Ci0gICAgZGF0YWJhc2VfID0gZGF0YWJhc2VfZmFjdG9yeV9mb3JfdGVzdGluZ18uUnVuKCk7Ci0gICAgaW5fbWVtb3J5XyA9IHRydWU7Ci0gICAgT25EYXRhYmFzZU9wZW5lZChsZXZlbGRiOjptb2pvbTo6RGF0YWJhc2VFcnJvcjo6T0spOwotICAgIHJldHVybjsKLSAgfQotCiAgIGlmIChiYWNraW5nX21vZGVfICE9IEJhY2tpbmdNb2RlOjprTm9EaXNrICYmICFpbl9tZW1vcnlfb25seSAmJgogICAgICAgIXBhcnRpdGlvbl9kaXJlY3RvcnlfLmVtcHR5KCkpIHsKICAgICAvLyBXZSB3ZXJlIGdpdmVuIGEgc3ViZGlyZWN0b3J5IHRvIHdyaXRlIHRvLCBzbyB1c2UgYSBkaXNrIGJhY2tlZCBkYXRhYmFzZS4KZGlmZiAtLWdpdCBhL2NvbnRlbnQvYnJvd3Nlci9kb21fc3RvcmFnZS9zZXNzaW9uX3N0b3JhZ2VfY29udGV4dF9tb2pvLmggYi9jb250ZW50L2Jyb3dzZXIvZG9tX3N0b3JhZ2Uvc2Vzc2lvbl9zdG9yYWdlX2NvbnRleHRfbW9qby5oCmluZGV4IDVlZjAyMmJhLi40MzhiOGFjIDEwMDY0NAotLS0gYS9jb250ZW50L2Jyb3dzZXIvZG9tX3N0b3JhZ2Uvc2Vzc2lvbl9zdG9yYWdlX2NvbnRleHRfbW9qby5oCisrKyBiL2NvbnRlbnQvYnJvd3Nlci9kb21fc3RvcmFnZS9zZXNzaW9uX3N0b3JhZ2VfY29udGV4dF9tb2pvLmgKQEAgLTE4LDggKzE4LDExIEBACiAjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKICNpbmNsdWRlICJiYXNlL21lbW9yeS93ZWFrX3B0ci5oIgogI2luY2x1ZGUgImJhc2Uvb3B0aW9uYWwuaCIKKyNpbmNsdWRlICJiYXNlL3RocmVhZGluZy9zZXF1ZW5jZV9ib3VuZC5oIgogI2luY2x1ZGUgImJhc2UvdHJhY2VfZXZlbnQvbWVtb3J5X2FsbG9jYXRvcl9kdW1wLmgiCiAjaW5jbHVkZSAiYmFzZS90cmFjZV9ldmVudC9tZW1vcnlfZHVtcF9wcm92aWRlci5oIgorI2luY2x1ZGUgImNvbXBvbmVudHMvc2VydmljZXMvbGV2ZWxkYi9sZXZlbGRiX2RhdGFiYXNlX2ltcGwuaCIKKyNpbmNsdWRlICJjb21wb25lbnRzL3NlcnZpY2VzL3N0b3JhZ2UvZG9tX3N0b3JhZ2UvZG9tX3N0b3JhZ2VfZGF0YWJhc2UuaCIKICNpbmNsdWRlICJjb250ZW50L2Jyb3dzZXIvZG9tX3N0b3JhZ2Uvc2Vzc2lvbl9zdG9yYWdlX2RhdGFfbWFwLmgiCiAjaW5jbHVkZSAiY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL3Nlc3Npb25fc3RvcmFnZV9tZXRhZGF0YS5oIgogI2luY2x1ZGUgImNvbnRlbnQvYnJvd3Nlci9kb21fc3RvcmFnZS9zZXNzaW9uX3N0b3JhZ2VfbmFtZXNwYWNlX2ltcGxfbW9qby5oIgpAQCAtMTMyLDIxICsxMzUsMjQgQEAKICAgYm9vbCBPbk1lbW9yeUR1bXAoY29uc3QgYmFzZTo6dHJhY2VfZXZlbnQ6Ok1lbW9yeUR1bXBBcmdzJiBhcmdzLAogICAgICAgICAgICAgICAgICAgICBiYXNlOjp0cmFjZV9ldmVudDo6UHJvY2Vzc01lbW9yeUR1bXAqIHBtZCkgb3ZlcnJpZGU7CiAKLSAgdXNpbmcgRGF0YWJhc2VGYWN0b3J5ID0gYmFzZTo6UmVwZWF0aW5nQ2FsbGJhY2s8Ci0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8bGV2ZWxkYjo6bW9qb206OkxldmVsREJEYXRhYmFzZT4oKT47Ci0gIHZvaWQgU2V0RGF0YWJhc2VGYWN0b3J5Rm9yVGVzdGluZyhEYXRhYmFzZUZhY3RvcnkgZmFjdG9yeSkgewotICAgIGRhdGFiYXNlX2ZhY3RvcnlfZm9yX3Rlc3RpbmdfID0gc3RkOjptb3ZlKGZhY3RvcnkpOwotICB9Ci0KICAgdm9pZCBQcmV0ZW5kVG9Db25uZWN0Rm9yVGVzdGluZygpOwogCi0gIGxldmVsZGI6Om1vam9tOjpMZXZlbERCRGF0YWJhc2UqIERhdGFiYXNlRm9yVGVzdGluZygpIHsKLSAgICByZXR1cm4gZGF0YWJhc2VfLmdldCgpOwotICB9CisgIGxldmVsZGI6OkxldmVsREJEYXRhYmFzZUltcGwqIERhdGFiYXNlRm9yVGVzdGluZygpIHsgcmV0dXJuIGRhdGFiYXNlXy5nZXQoKTsgfQogCiAgIHZvaWQgRmx1c2hBcmVhRm9yVGVzdGluZyhjb25zdCBzdGQ6OnN0cmluZyYgbmFtZXNwYWNlX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsOjpPcmlnaW4mIG9yaWdpbik7CiAKKyAgLy8gQWNjZXNzIHRoZSB1bmRlcmx5aW5nIERvbVN0b3JhZ2VEYXRhYmFzZS4gTWF5IGJlIG51bGwgaWYgdGhlIGRhdGFiYXNlIGlzCisgIC8vIG5vdCB5ZXQgb3Blbi4KKyAgY29uc3QgYmFzZTo6U2VxdWVuY2VCb3VuZDxzdG9yYWdlOjpEb21TdG9yYWdlRGF0YWJhc2U+JgorICBHZXREYXRhYmFzZUZvclRlc3RpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIGRhdGFiYXNlXy0+ZGF0YWJhc2UoKTsKKyAgfQorCisgIC8vIFdhaXQgZm9yIHRoZSBkYXRhYmFzZSB0byBiZSBvcGVuZWQsIG9yIGZvciBvcGVuaW5nIHRvIGZhaWwuIElmIHRoZSBkYXRhYmFzZQorICAvLyBpcyBhbHJlYWR5IG9wZW5lZCwgfGNhbGxiYWNrfCBpcyBpbnZva2VkIGltbWVkaWF0ZWx5LgorICB2b2lkIFNldERhdGFiYXNlT3BlbkNhbGxiYWNrRm9yVGVzdGluZyhiYXNlOjpPbmNlQ2xvc3VyZSBjYWxsYmFjayk7CisKICBwcml2YXRlOgogICBmcmllbmQgY2xhc3MgRE9NU3RvcmFnZUJyb3dzZXJUZXN0OwogICBGUklFTkRfVEVTVF9BTExfUFJFRklYRVMoU2Vzc2lvblN0b3JhZ2VDb250ZXh0TW9qb1Rlc3QsCkBAIC0yNTAsNyArMjU2LDcgQEAKIAogICBiYXNlOjp0cmFjZV9ldmVudDo6TWVtb3J5QWxsb2NhdG9yRHVtcEd1aWQgbWVtb3J5X2R1bXBfaWRfOwogCi0gIHN0ZDo6dW5pcXVlX3B0cjxsZXZlbGRiOjptb2pvbTo6TGV2ZWxEQkRhdGFiYXNlPiBkYXRhYmFzZV87CisgIHN0ZDo6dW5pcXVlX3B0cjxsZXZlbGRiOjpMZXZlbERCRGF0YWJhc2VJbXBsPiBkYXRhYmFzZV87CiAgIGJvb2wgaW5fbWVtb3J5XyA9IGZhbHNlOwogICBib29sIHRyaWVkX3RvX3JlY3JlYXRlX2R1cmluZ19vcGVuXyA9IGZhbHNlOwogCkBAIC0yODEsOCArMjg3LDYgQEAKICAgLy8gTmFtZSBvZiBhbiBleHRyYSBoaXN0b2dyYW0gdG8gbG9nIG9wZW4gcmVzdWx0cyB0bywgaWYgbm90IG51bGwuCiAgIGNvbnN0IGNoYXIqIG9wZW5fcmVzdWx0X2hpc3RvZ3JhbV8gPSBudWxscHRyOwogCi0gIERhdGFiYXNlRmFjdG9yeSBkYXRhYmFzZV9mYWN0b3J5X2Zvcl90ZXN0aW5nXzsKLQogICBiYXNlOjpXZWFrUHRyRmFjdG9yeTxTZXNzaW9uU3RvcmFnZUNvbnRleHRNb2pvPiB3ZWFrX3B0cl9mYWN0b3J5X3t0aGlzfTsKIH07CiAKZGlmZiAtLWdpdCBhL2NvbnRlbnQvYnJvd3Nlci9kb21fc3RvcmFnZS9zZXNzaW9uX3N0b3JhZ2VfY29udGV4dF9tb2pvX3VuaXR0ZXN0LmNjIGIvY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL3Nlc3Npb25fc3RvcmFnZV9jb250ZXh0X21vam9fdW5pdHRlc3QuY2MKaW5kZXggZjU4MjZmMDYuLjFiN2ViOTcgMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvYnJvd3Nlci9kb21fc3RvcmFnZS9zZXNzaW9uX3N0b3JhZ2VfY29udGV4dF9tb2pvX3VuaXR0ZXN0LmNjCisrKyBiL2NvbnRlbnQvYnJvd3Nlci9kb21fc3RvcmFnZS9zZXNzaW9uX3N0b3JhZ2VfY29udGV4dF9tb2pvX3VuaXR0ZXN0LmNjCkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSAiY29udGVudC9icm93c2VyL2NoaWxkX3Byb2Nlc3Nfc2VjdXJpdHlfcG9saWN5X2ltcGwuaCIKICNpbmNsdWRlICJjb250ZW50L2Jyb3dzZXIvZG9tX3N0b3JhZ2UvZG9tX3N0b3JhZ2VfdHlwZXMuaCIKICNpbmNsdWRlICJjb250ZW50L2Jyb3dzZXIvZG9tX3N0b3JhZ2Uvc2Vzc2lvbl9zdG9yYWdlX2RhdGFiYXNlLmgiCi0jaW5jbHVkZSAiY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL3Rlc3QvZmFrZV9sZXZlbGRiX2RhdGFiYXNlX2Vycm9yX29uX3dyaXRlLmgiCiAjaW5jbHVkZSAiY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL3Rlc3Qvc3RvcmFnZV9hcmVhX3Rlc3RfdXRpbC5oIgogI2luY2x1ZGUgImNvbnRlbnQvcHVibGljL2Jyb3dzZXIvc2Vzc2lvbl9zdG9yYWdlX3VzYWdlX2luZm8uaCIKICNpbmNsdWRlICJjb250ZW50L3B1YmxpYy90ZXN0L2Jyb3dzZXJfdGFza19lbnZpcm9ubWVudC5oIgpAQCAtNjYsNyArNjUsNyBAQAogCiAgICAgLy8gVGhlcmUgbWF5IGJlIHBlbmRpbmcgdGFza3MgdG8gY2xlYW4gdXAgZmlsZXMgaW4gdGhlIHRlbXAgZGlyLiBNYWtlIHN1cmUKICAgICAvLyB0aGV5IHJ1biBzbyB0ZW1wIGRpciBkZWxldGlvbiBjYW4gc3VjY2VlZC4KLSAgICB0YXNrX2Vudmlyb25tZW50Xy5SdW5VbnRpbElkbGUoKTsKKyAgICBSdW5VbnRpbElkbGUoKTsKIAogICAgIEVYUEVDVF9UUlVFKHRlbXBfZGlyXy5EZWxldGUoKSk7CiAgIH0KQEAgLTExMyw3ICsxMTIsNyBAQAogICB2b2lkIFNodXRkb3duQ29udGV4dCgpIHsKICAgICBjb250ZXh0Xy0+U2h1dGRvd25BbmREZWxldGUoKTsKICAgICBjb250ZXh0XyA9IG51bGxwdHI7Ci0gICAgYmFzZTo6UnVuTG9vcCgpLlJ1blVudGlsSWRsZSgpOworICAgIFJ1blVudGlsSWRsZSgpOwogICB9CiAKICAgc3RkOjp2ZWN0b3I8U2Vzc2lvblN0b3JhZ2VVc2FnZUluZm8+IEdldFN0b3JhZ2VVc2FnZVN5bmMoKSB7CkBAIC02NTgsMjIgKzY1NywxNCBAQAogICB1cmw6Ok9yaWdpbiBvcmlnaW4yID0gdXJsOjpPcmlnaW46OkNyZWF0ZShHVVJMKCJodHRwOi8vYXNmLmNvbSIpKTsKICAgdXJsOjpPcmlnaW4gb3JpZ2luMyA9IHVybDo6T3JpZ2luOjpDcmVhdGUoR1VSTCgiaHR0cDovL2V4YW1wbGUuY29tIikpOwogCi0gIC8vIEVuc3VyZSB0aGF0IHRoZSBmaXJzdCBvcGVuZWQgZGF0YWJhc2UgYWx3YXlzIGZhaWxzIHRvIHdyaXRlIGRhdGEuCi0gIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gdGVzdF9kYXRhOwogICBiYXNlOjpPcHRpb25hbDxiYXNlOjpSdW5Mb29wPiBvcGVuX2xvb3A7CiAgIHNpemVfdCBudW1fZGF0YWJhc2Vfb3Blbl9yZXF1ZXN0cyA9IDA7CiAgIHNpemVfdCBudW1fZGF0YWJhc2VzX2Rlc3Ryb3llZCA9IDA7Ci0gIGNvbnRleHQoKS0+U2V0RGF0YWJhc2VGYWN0b3J5Rm9yVGVzdGluZyhiYXNlOjpCaW5kTGFtYmRhRm9yVGVzdGluZygKLSAgICAgIFsmXSgpIC0+IHN0ZDo6dW5pcXVlX3B0cjxsZXZlbGRiOjptb2pvbTo6TGV2ZWxEQkRhdGFiYXNlPiB7Ci0gICAgICAgICsrbnVtX2RhdGFiYXNlX29wZW5fcmVxdWVzdHM7Ci0gICAgICAgIGF1dG8gZGIgPQotICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTx0ZXN0OjpGYWtlTGV2ZWxEQkRhdGFiYXNlRXJyb3JPbldyaXRlPigmdGVzdF9kYXRhKTsKLSAgICAgICAgZGItPlNldERlc3RydWN0aW9uQ2FsbGJhY2soCi0gICAgICAgICAgICBiYXNlOjpCaW5kTGFtYmRhRm9yVGVzdGluZyhbJl0geyArK251bV9kYXRhYmFzZXNfZGVzdHJveWVkOyB9KSk7Ci0gICAgICAgIGlmIChvcGVuX2xvb3ApCi0gICAgICAgICAgb3Blbl9sb29wLT5RdWl0KCk7Ci0gICAgICAgIHJldHVybiBkYjsKLSAgICAgIH0pKTsKKyAgY29udGV4dCgpLT5TZXREYXRhYmFzZU9wZW5DYWxsYmFja0ZvclRlc3RpbmcoYmFzZTo6QmluZExhbWJkYUZvclRlc3RpbmcoWyZdIHsKKyAgICArK251bV9kYXRhYmFzZV9vcGVuX3JlcXVlc3RzOworICAgIG9wZW5fbG9vcC0+UXVpdCgpOworICB9KSk7CisKICAgb3Blbl9sb29wLmVtcGxhY2UoKTsKIAogICAvLyBPcGVuIHRocmVlIGNvbm5lY3Rpb25zIHRvIHRoZSBkYXRhYmFzZS4KQEAgLTY5MSw2ICs2ODIsMTUgQEAKICAgc3NfbmFtZXNwYWNlLT5PcGVuQXJlYShvcmlnaW4zLCBhcmVhX28zLkJpbmROZXdFbmRwb2ludEFuZFBhc3NSZWNlaXZlcigpKTsKICAgb3Blbl9sb29wLT5SdW4oKTsKIAorICAvLyBFbnN1cmUgdGhhdCB0aGUgZmlyc3Qgb3BlbmVkIGRhdGFiYXNlIGFsd2F5cyBmYWlscyB0byB3cml0ZSBkYXRhLgorICBjb250ZXh0KCktPkdldERhdGFiYXNlRm9yVGVzdGluZygpLlBvc3RUYXNrV2l0aFRoaXNPYmplY3QoCisgICAgICBGUk9NX0hFUkUsCisgICAgICBiYXNlOjpCaW5kTGFtYmRhRm9yVGVzdGluZyhbJl0oc3RvcmFnZTo6RG9tU3RvcmFnZURhdGFiYXNlKiBkYikgeworICAgICAgICBkYi0+TWFrZUFsbENvbW1pdHNGYWlsRm9yVGVzdGluZygpOworICAgICAgICBkYi0+U2V0RGVzdHJ1Y3Rpb25DYWxsYmFja0ZvclRlc3RpbmcoCisgICAgICAgICAgICBiYXNlOjpCaW5kTGFtYmRhRm9yVGVzdGluZyhbJl0geyArK251bV9kYXRhYmFzZXNfZGVzdHJveWVkOyB9KSk7CisgICAgICB9KSk7CisKICAgLy8gVmVyaWZ5IG9uZSBhdHRlbXB0IHdhcyBtYWRlIHRvIG9wZW4gdGhlIGRhdGFiYXNlLgogICBBU1NFUlRfRVEoMXUsIG51bV9kYXRhYmFzZV9vcGVuX3JlcXVlc3RzKTsKIApAQCAtNzAyLDE0ICs3MDIsMTAgQEAKICAgLy8gQWxzbyBwcmVwYXJlIGZvciBhbm90aGVyIGRhdGFiYXNlIGNvbm5lY3Rpb24sIG5leHQgdGltZSBwcm92aWRpbmcgYQogICAvLyBmdW5jdGlvbmluZyBkYXRhYmFzZS4KICAgb3Blbl9sb29wLmVtcGxhY2UoKTsKLSAgY29udGV4dCgpLT5TZXREYXRhYmFzZUZhY3RvcnlGb3JUZXN0aW5nKGJhc2U6OkJpbmRMYW1iZGFGb3JUZXN0aW5nKAotICAgICAgWyZdKCkgLT4gc3RkOjp1bmlxdWVfcHRyPGxldmVsZGI6Om1vam9tOjpMZXZlbERCRGF0YWJhc2U+IHsKLSAgICAgICAgKytudW1fZGF0YWJhc2Vfb3Blbl9yZXF1ZXN0czsKLSAgICAgICAgYXV0byBkYiA9IHN0ZDo6bWFrZV91bmlxdWU8RmFrZUxldmVsREJEYXRhYmFzZT4oJnRlc3RfZGF0YSk7Ci0gICAgICAgIGlmIChvcGVuX2xvb3ApCi0gICAgICAgICAgb3Blbl9sb29wLT5RdWl0KCk7Ci0gICAgICAgIHJldHVybiBkYjsKLSAgICAgIH0pKTsKKyAgY29udGV4dCgpLT5TZXREYXRhYmFzZU9wZW5DYWxsYmFja0ZvclRlc3RpbmcoYmFzZTo6QmluZExhbWJkYUZvclRlc3RpbmcoWyZdIHsKKyAgICArK251bV9kYXRhYmFzZV9vcGVuX3JlcXVlc3RzOworICAgIG9wZW5fbG9vcC0+UXVpdCgpOworICB9KSk7CiAKICAgLy8gU3RhcnQgYSBwdXQgb3BlcmF0aW9uIG9uIHRoZSB0aGlyZCBjb25uZWN0aW9uIGJlZm9yZSBzdGFydGluZyB0byBjb21taXQKICAgLy8gYSBsb3Qgb2YgZGF0YSBvbiB0aGUgZmlyc3Qgb3JpZ2luLiBUaGlzIHB1dCBvcGVyYXRpb24gc2hvdWxkIHJlc3VsdCBpbiBhCkBAIC03MjQsMTkgKzcyMCwxNiBAQAogICBpbnQgaSA9IDA7CiAgIHdoaWxlIChhcmVhX28xLmlzX2Nvbm5lY3RlZCgpKSB7CiAgICAgKytpOwotICAgIGJhc2U6OlJ1bkxvb3AgcHV0X2xvb3A7CiAgICAgLy8gRXZlcnkgd3JpdGUgbmVlZHMgdG8gYmUgZGlmZmVyZW50IHRvIG1ha2Ugc3VyZSB0aGVyZSBhY3R1YWxseSBpcyBhCiAgICAgLy8gY2hhbmdlIHRvIGNvbW1pdC4KICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBvbGRfdmFsdWUgPSB2YWx1ZTsKICAgICB2YWx1ZVswXSsrOwotICAgIGFyZWFfbzEuc2V0X2Rpc2Nvbm5lY3RfaGFuZGxlcihwdXRfbG9vcC5RdWl0Q2xvc3VyZSgpKTsKLQogICAgIGFyZWFfbzEtPlB1dChsZXZlbGRiOjpTdHJpbmdQaWVjZVRvVWludDhWZWN0b3IoImtleSIpLCB2YWx1ZSwgYmFzZTo6bnVsbG9wdCwKICAgICAgICAgICAgICAgICAgInNvdXJjZSIsIGJhc2U6OkJpbmRMYW1iZGFGb3JUZXN0aW5nKFsmXShib29sIHN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICBFWFBFQ1RfVFJVRShzdWNjZXNzKTsKICAgICAgICAgICAgICAgICAgfSkpOwogICAgIGFyZWFfbzEuRmx1c2hGb3JUZXN0aW5nKCk7Ci0gICAgcHV0X2xvb3AuUnVuVW50aWxJZGxlKCk7CisgICAgUnVuVW50aWxJZGxlKCk7CiAgICAgLy8gQW5kIHdlIG5lZWQgdG8gZmx1c2ggYWZ0ZXIgZXZlcnkgY2hhbmdlLiBPdGhlcndpc2UgY2hhbmdlcyBnZXQgYmF0Y2hlZCB1cAogICAgIC8vIGFuZCBvbmx5IG9uZSBjb21taXQgaXMgZG9uZSBzb21lIHRpbWUgbGF0ZXIuCiAgICAgY29udGV4dCgpLT5GbHVzaEFyZWFGb3JUZXN0aW5nKG5hbWVzcGFjZV9pZCwgb3JpZ2luMSk7CkBAIC03OTMsMjIgKzc4NiwxMyBAQAogICBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfaWQgPSBiYXNlOjpHZW5lcmF0ZUdVSUQoKTsKICAgdXJsOjpPcmlnaW4gb3JpZ2luMSA9IHVybDo6T3JpZ2luOjpDcmVhdGUoR1VSTCgiaHR0cDovL2Zvb2Jhci5jb20iKSk7CiAKLSAgLy8gRW5zdXJlIHRoYXQgYW55IG9wZW5lZCBkYXRhYmFzZSBhbHdheXMgZmFpbHMgdG8gd3JpdGUgZGF0YS4KLSAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiB0ZXN0X2RhdGE7CiAgIGJhc2U6Ok9wdGlvbmFsPGJhc2U6OlJ1bkxvb3A+IG9wZW5fbG9vcDsKICAgc2l6ZV90IG51bV9kYXRhYmFzZV9vcGVuX3JlcXVlc3RzID0gMDsKICAgc2l6ZV90IG51bV9kYXRhYmFzZXNfZGVzdHJveWVkID0gMDsKLSAgY29udGV4dCgpLT5TZXREYXRhYmFzZUZhY3RvcnlGb3JUZXN0aW5nKGJhc2U6OkJpbmRMYW1iZGFGb3JUZXN0aW5nKAotICAgICAgWyZdKCkgLT4gc3RkOjp1bmlxdWVfcHRyPGxldmVsZGI6Om1vam9tOjpMZXZlbERCRGF0YWJhc2U+IHsKLSAgICAgICAgKytudW1fZGF0YWJhc2Vfb3Blbl9yZXF1ZXN0czsKLSAgICAgICAgYXV0byBkYiA9Ci0gICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPHRlc3Q6OkZha2VMZXZlbERCRGF0YWJhc2VFcnJvck9uV3JpdGU+KCZ0ZXN0X2RhdGEpOwotICAgICAgICBkYi0+U2V0RGVzdHJ1Y3Rpb25DYWxsYmFjaygKLSAgICAgICAgICAgIGJhc2U6OkJpbmRMYW1iZGFGb3JUZXN0aW5nKFsmXSB7ICsrbnVtX2RhdGFiYXNlc19kZXN0cm95ZWQ7IH0pKTsKLSAgICAgICAgaWYgKG9wZW5fbG9vcCkKLSAgICAgICAgICBvcGVuX2xvb3AtPlF1aXQoKTsKLSAgICAgICAgcmV0dXJuIGRiOwotICAgICAgfSkpOworICBjb250ZXh0KCktPlNldERhdGFiYXNlT3BlbkNhbGxiYWNrRm9yVGVzdGluZyhiYXNlOjpCaW5kTGFtYmRhRm9yVGVzdGluZyhbJl0geworICAgICsrbnVtX2RhdGFiYXNlX29wZW5fcmVxdWVzdHM7CisgICAgb3Blbl9sb29wLT5RdWl0KCk7CisgIH0pKTsKICAgb3Blbl9sb29wLmVtcGxhY2UoKTsKIAogICAvLyBPcGVuIHRocmVlIGNvbm5lY3Rpb25zIHRvIHRoZSBkYXRhYmFzZS4KQEAgLTgyMiw2ICs4MDYsMTUgQEAKICAgc3NfbmFtZXNwYWNlLT5PcGVuQXJlYShvcmlnaW4xLCBhcmVhLkJpbmROZXdFbmRwb2ludEFuZFBhc3NSZWNlaXZlcigpKTsKICAgb3Blbl9sb29wLT5SdW4oKTsKIAorICAvLyBFbnN1cmUgdGhhdCB0aGlzIGRhdGFiYXNlIGFsd2F5cyBmYWlscyB0byB3cml0ZSBkYXRhLgorICBjb250ZXh0KCktPkdldERhdGFiYXNlRm9yVGVzdGluZygpLlBvc3RUYXNrV2l0aFRoaXNPYmplY3QoCisgICAgICBGUk9NX0hFUkUsCisgICAgICBiYXNlOjpCaW5kTGFtYmRhRm9yVGVzdGluZyhbJl0oc3RvcmFnZTo6RG9tU3RvcmFnZURhdGFiYXNlKiBkYikgeworICAgICAgICBkYi0+TWFrZUFsbENvbW1pdHNGYWlsRm9yVGVzdGluZygpOworICAgICAgICBkYi0+U2V0RGVzdHJ1Y3Rpb25DYWxsYmFja0ZvclRlc3RpbmcoCisgICAgICAgICAgICBiYXNlOjpCaW5kTGFtYmRhRm9yVGVzdGluZyhbJl0geyArK251bV9kYXRhYmFzZXNfZGVzdHJveWVkOyB9KSk7CisgICAgICB9KSk7CisKICAgLy8gVmVyaWZ5IG9uZSBhdHRlbXB0IHdhcyBtYWRlIHRvIG9wZW4gdGhlIGRhdGFiYXNlLgogICBFWFBFQ1RfRVEoMXUsIG51bV9kYXRhYmFzZV9vcGVuX3JlcXVlc3RzKTsKIApAQCAtODI5LDIyICs4MjIsMjcgQEAKICAgLy8gcmVjb25uZWN0IHRvIHRoZSBkYXRhYmFzZSwgd2hpY2ggc2hvdWxkIGhhcHBlbiBhZnRlciBzZXZlcmFsIGNvbW1pdAogICAvLyBlcnJvcnMuCiAgIG9wZW5fbG9vcC5lbXBsYWNlKCk7CisgIGNvbnRleHQoKS0+U2V0RGF0YWJhc2VPcGVuQ2FsbGJhY2tGb3JUZXN0aW5nKGJhc2U6OkJpbmRMYW1iZGFGb3JUZXN0aW5nKFsmXSB7CisgICAgKytudW1fZGF0YWJhc2Vfb3Blbl9yZXF1ZXN0czsKKyAgICBvcGVuX2xvb3AtPlF1aXQoKTsKKworICAgIC8vIEVuc3VyZSB0aGF0IHRoaXMgZGF0YWJhc2UgYWxzbyBhbHdheXMgZmFpbHMgdG8gd3JpdGUgZGF0YS4KKyAgICBjb250ZXh0KCktPkdldERhdGFiYXNlRm9yVGVzdGluZygpLlBvc3QoCisgICAgICAgIEZST01fSEVSRSwgJnN0b3JhZ2U6OkRvbVN0b3JhZ2VEYXRhYmFzZTo6TWFrZUFsbENvbW1pdHNGYWlsRm9yVGVzdGluZyk7CisgIH0pKTsKIAogICAvLyBSZXBlYXRlZGx5IHdyaXRlIGRhdGEgdG8gdGhlIGRhdGFiYXNlLCB0byB0cmlnZ2VyIGVub3VnaCBjb21taXQgZXJyb3JzLgogICBhdXRvIHZhbHVlID0gbGV2ZWxkYjo6U3RyaW5nUGllY2VUb1VpbnQ4VmVjdG9yKCJhdmFsdWUiKTsKICAgYmFzZTo6T3B0aW9uYWw8c3RkOjp2ZWN0b3I8dWludDhfdD4+IG9sZF92YWx1ZSA9IGJhc2U6Om51bGxvcHQ7CiAgIHdoaWxlIChhcmVhLmlzX2Nvbm5lY3RlZCgpKSB7Ci0gICAgYmFzZTo6UnVuTG9vcCBwdXRfbG9vcDsKICAgICAvLyBFdmVyeSB3cml0ZSBuZWVkcyB0byBiZSBkaWZmZXJlbnQgdG8gbWFrZSBzdXJlIHRoZXJlIGFjdHVhbGx5IGlzIGEKICAgICAvLyBjaGFuZ2UgdG8gY29tbWl0LgotICAgIGFyZWEuc2V0X2Rpc2Nvbm5lY3RfaGFuZGxlcihwdXRfbG9vcC5RdWl0Q2xvc3VyZSgpKTsKICAgICBhcmVhLT5QdXQobGV2ZWxkYjo6U3RyaW5nUGllY2VUb1VpbnQ4VmVjdG9yKCJrZXkiKSwgdmFsdWUsIG9sZF92YWx1ZSwKICAgICAgICAgICAgICAgInNvdXJjZSIsIGJhc2U6OkJpbmRMYW1iZGFGb3JUZXN0aW5nKFsmXShib29sIHN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICBFWFBFQ1RfVFJVRShzdWNjZXNzKTsKLSAgICAgICAgICAgICAgICBwdXRfbG9vcC5RdWl0KCk7CiAgICAgICAgICAgICAgIH0pKTsKICAgICBhcmVhLkZsdXNoRm9yVGVzdGluZygpOwotICAgIHB1dF9sb29wLlJ1blVudGlsSWRsZSgpOworICAgIFJ1blVudGlsSWRsZSgpOwogICAgIC8vIEFuZCB3ZSBuZWVkIHRvIGZsdXNoIGFmdGVyIGV2ZXJ5IGNoYW5nZS4gT3RoZXJ3aXNlIGNoYW5nZXMgZ2V0IGJhdGNoZWQgdXAKICAgICAvLyBhbmQgb25seSBvbmUgY29tbWl0IGlzIGRvbmUgc29tZSB0aW1lIGxhdGVyLgogICAgIGNvbnRleHQoKS0+Rmx1c2hBcmVhRm9yVGVzdGluZyhuYW1lc3BhY2VfaWQsIG9yaWdpbjEpOwpAQCAtODYyLDggKzg2MCw2IEBACiAgIEVYUEVDVF9FUSgydSwgbnVtX2RhdGFiYXNlX29wZW5fcmVxdWVzdHMpOwogICBFWFBFQ1RfRVEoMXUsIG51bV9kYXRhYmFzZXNfZGVzdHJveWVkKTsKIAotICBjb250ZXh0KCktPlNldERhdGFiYXNlRmFjdG9yeUZvclRlc3RpbmcoYmFzZTo6TnVsbENhbGxiYWNrKCkpOwotCiAgIC8vIFJlY29ubmVjdCBhIGFyZWEgdG8gdGhlIGRhdGFiYXNlLCBhbmQgcmVwZWF0ZWRseSB3cml0ZSBkYXRhIHRvIGl0IGFnYWluLgogICAvLyBUaGlzIHRpbWUgYWxsIHNob3VsZCBqdXN0IGtlZXAgZ2V0dGluZyB3cml0dGVuLCBhbmQgY29tbWl0IGVycm9ycyBhcmUKICAgLy8gZ2V0dGluZyBpZ25vcmVkLgpAQCAtODc1LDE3ICs4NzEsMTQgQEAKIAogICBvbGRfdmFsdWUgPSBiYXNlOjpudWxsb3B0OwogICBmb3IgKGludCBpID0gMDsgaSA8IDY0OyArK2kpIHsKLSAgICBiYXNlOjpSdW5Mb29wIHB1dF9sb29wOwogICAgIC8vIEV2ZXJ5IHdyaXRlIG5lZWRzIHRvIGJlIGRpZmZlcmVudCB0byBtYWtlIHN1cmUgdGhlcmUgYWN0dWFsbHkgaXMgYQogICAgIC8vIGNoYW5nZSB0byBjb21taXQuCi0gICAgYXJlYS5zZXRfZGlzY29ubmVjdF9oYW5kbGVyKHB1dF9sb29wLlF1aXRDbG9zdXJlKCkpOwogICAgIGFyZWEtPlB1dChsZXZlbGRiOjpTdHJpbmdQaWVjZVRvVWludDhWZWN0b3IoImtleSIpLCB2YWx1ZSwgb2xkX3ZhbHVlLAogICAgICAgICAgICAgICAic291cmNlIiwgYmFzZTo6QmluZExhbWJkYUZvclRlc3RpbmcoWyZdKGJvb2wgc3VjY2VzcykgewogICAgICAgICAgICAgICAgIEVYUEVDVF9UUlVFKHN1Y2Nlc3MpOwotICAgICAgICAgICAgICAgIHB1dF9sb29wLlF1aXQoKTsKICAgICAgICAgICAgICAgfSkpOwogICAgIGFyZWEuRmx1c2hGb3JUZXN0aW5nKCk7Ci0gICAgcHV0X2xvb3AuUnVuVW50aWxJZGxlKCk7CisgICAgUnVuVW50aWxJZGxlKCk7CiAgICAgLy8gQW5kIHdlIG5lZWQgdG8gZmx1c2ggYWZ0ZXIgZXZlcnkgY2hhbmdlLiBPdGhlcndpc2UgY2hhbmdlcyBnZXQgYmF0Y2hlZCB1cAogICAgIC8vIGFuZCBvbmx5IG9uZSBjb21taXQgaXMgZG9uZSBzb21lIHRpbWUgbGF0ZXIuCiAgICAgY29udGV4dCgpLT5GbHVzaEFyZWFGb3JUZXN0aW5nKG5hbWVzcGFjZV9pZCwgb3JpZ2luMSk7CkBAIC04OTUsNyArODg4LDcgQEAKICAgfQogCiAgIC8vIFNob3VsZCBzdGlsbCBiZSBjb25uZWN0ZWQgYWZ0ZXIgYWxsIHRoYXQuCi0gIGJhc2U6OlJ1bkxvb3AoKS5SdW5VbnRpbElkbGUoKTsKKyAgUnVuVW50aWxJZGxlKCk7CiAgIEVYUEVDVF9UUlVFKGFyZWEuaXNfY29ubmVjdGVkKCkpOwogCiAgIGNvbnRleHQoKS0+RGVsZXRlU2Vzc2lvbk5hbWVzcGFjZShuYW1lc3BhY2VfaWQsIGZhbHNlKTsKQEAgLTEwMTgsNyArMTAxMSw3IEBACiAgICAgc3NfbmFtZXNwYWNlMS0+T3BlbkFyZWEodXJsOjpPcmlnaW46OkNyZWF0ZShHVVJMKGJhc2U6OlN0cmluZ1ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9leGFtcGxlLmNvbTolZCIsIGkpKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYS5CaW5kTmV3RW5kcG9pbnRBbmRQYXNzUmVjZWl2ZXIoKSk7Ci0gICAgYmFzZTo6UnVuTG9vcCgpLlJ1blVudGlsSWRsZSgpOworICAgIFJ1blVudGlsSWRsZSgpOwogICAgIHNzX25hbWVzcGFjZTEucmVzZXQoKTsKICAgICBhcmVhLnJlc2V0KCk7CiAgIH0KQEAgLTEyMzUsNyArMTIyOCw3IEBACiAgIGFyZWFfbjIucmVzZXQoKTsKICAgc3NfbmFtZXNwYWNlMi5yZXNldCgpOwogCi0gIGJhc2U6OlJ1bkxvb3AoKS5SdW5VbnRpbElkbGUoKTsKKyAgUnVuVW50aWxJZGxlKCk7CiAKICAgLy8gVmVyaWZ5IHRoaXMgZG9lc24ndCBjcmFzaCBvciBoYW5nLgogICBjb250ZXh0KCktPlB1cmdlTWVtb3J5KCk7CmRpZmYgLS1naXQgYS9jb250ZW50L2Jyb3dzZXIvZG9tX3N0b3JhZ2Uvc2Vzc2lvbl9zdG9yYWdlX2RhdGFfbWFwLmNjIGIvY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL3Nlc3Npb25fc3RvcmFnZV9kYXRhX21hcC5jYwppbmRleCAzM2NlZDBjLi40OWUzMTY4IDEwMDY0NAotLS0gYS9jb250ZW50L2Jyb3dzZXIvZG9tX3N0b3JhZ2Uvc2Vzc2lvbl9zdG9yYWdlX2RhdGFfbWFwLmNjCisrKyBiL2NvbnRlbnQvYnJvd3Nlci9kb21fc3RvcmFnZS9zZXNzaW9uX3N0b3JhZ2VfZGF0YV9tYXAuY2MKQEAgLTE1LDcgKzE1LDcgQEAKIHNjb3BlZF9yZWZwdHI8U2Vzc2lvblN0b3JhZ2VEYXRhTWFwPiBTZXNzaW9uU3RvcmFnZURhdGFNYXA6OkNyZWF0ZUZyb21EaXNrKAogICAgIExpc3RlbmVyKiBsaXN0ZW5lciwKICAgICBzY29wZWRfcmVmcHRyPFNlc3Npb25TdG9yYWdlTWV0YWRhdGE6Ok1hcERhdGE+IG1hcF9kYXRhLAotICAgIGxldmVsZGI6Om1vam9tOjpMZXZlbERCRGF0YWJhc2UqIGRhdGFiYXNlKSB7CisgICAgbGV2ZWxkYjo6TGV2ZWxEQkRhdGFiYXNlSW1wbCogZGF0YWJhc2UpIHsKICAgcmV0dXJuIGJhc2U6OldyYXBSZWZDb3VudGVkKG5ldyBTZXNzaW9uU3RvcmFnZURhdGFNYXAoCiAgICAgICBsaXN0ZW5lciwgc3RkOjptb3ZlKG1hcF9kYXRhKSwgZGF0YWJhc2UsIGZhbHNlKSk7CiB9CkBAIC0yNCw3ICsyNCw3IEBACiBzY29wZWRfcmVmcHRyPFNlc3Npb25TdG9yYWdlRGF0YU1hcD4gU2Vzc2lvblN0b3JhZ2VEYXRhTWFwOjpDcmVhdGVFbXB0eSgKICAgICBMaXN0ZW5lciogbGlzdGVuZXIsCiAgICAgc2NvcGVkX3JlZnB0cjxTZXNzaW9uU3RvcmFnZU1ldGFkYXRhOjpNYXBEYXRhPiBtYXBfZGF0YSwKLSAgICBsZXZlbGRiOjptb2pvbTo6TGV2ZWxEQkRhdGFiYXNlKiBkYXRhYmFzZSkgeworICAgIGxldmVsZGI6OkxldmVsREJEYXRhYmFzZUltcGwqIGRhdGFiYXNlKSB7CiAgIHJldHVybiBiYXNlOjpXcmFwUmVmQ291bnRlZCgKICAgICAgIG5ldyBTZXNzaW9uU3RvcmFnZURhdGFNYXAobGlzdGVuZXIsIHN0ZDo6bW92ZShtYXBfZGF0YSksIGRhdGFiYXNlLCB0cnVlKSk7CiB9CkBAIC01MCw3ICs1MCw3IEBACiBTZXNzaW9uU3RvcmFnZURhdGFNYXA6OlNlc3Npb25TdG9yYWdlRGF0YU1hcCgKICAgICBMaXN0ZW5lciogbGlzdGVuZXIsCiAgICAgc2NvcGVkX3JlZnB0cjxTZXNzaW9uU3RvcmFnZU1ldGFkYXRhOjpNYXBEYXRhPiBtYXBfZGF0YSwKLSAgICBsZXZlbGRiOjptb2pvbTo6TGV2ZWxEQkRhdGFiYXNlKiBkYXRhYmFzZSwKKyAgICBsZXZlbGRiOjpMZXZlbERCRGF0YWJhc2VJbXBsKiBkYXRhYmFzZSwKICAgICBib29sIGlzX2VtcHR5KQogICAgIDogbGlzdGVuZXJfKGxpc3RlbmVyKSwKICAgICAgIG1hcF9kYXRhXyhzdGQ6Om1vdmUobWFwX2RhdGEpKSwKZGlmZiAtLWdpdCBhL2NvbnRlbnQvYnJvd3Nlci9kb21fc3RvcmFnZS9zZXNzaW9uX3N0b3JhZ2VfZGF0YV9tYXAuaCBiL2NvbnRlbnQvYnJvd3Nlci9kb21fc3RvcmFnZS9zZXNzaW9uX3N0b3JhZ2VfZGF0YV9tYXAuaAppbmRleCBiYzFmMmM1MC4uNDc4ODM1Y2IgMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvYnJvd3Nlci9kb21fc3RvcmFnZS9zZXNzaW9uX3N0b3JhZ2VfZGF0YV9tYXAuaAorKysgYi9jb250ZW50L2Jyb3dzZXIvZG9tX3N0b3JhZ2Uvc2Vzc2lvbl9zdG9yYWdlX2RhdGFfbWFwLmgKQEAgLTE2LDYgKzE2LDEwIEBACiAjaW5jbHVkZSAiY29udGVudC9jb21tb24vY29udGVudF9leHBvcnQuaCIKICNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvYmluZGluZ3MvYXNzb2NpYXRlZF9iaW5kaW5nLmgiCiAKK25hbWVzcGFjZSBsZXZlbGRiIHsKK2NsYXNzIExldmVsREJEYXRhYmFzZUltcGw7Cit9CisKIG5hbWVzcGFjZSBjb250ZW50IHsKIAogLy8gSG9sZHMgdGhlIFN0b3JhZ2VBcmVhIGZvciBhIHNlc3Npb24gc3RvcmFnZSBkYXRhIG1hcC4gRXZlcnkKQEAgLTQ0LDEyICs0OCwxMiBAQAogICBzdGF0aWMgc2NvcGVkX3JlZnB0cjxTZXNzaW9uU3RvcmFnZURhdGFNYXA+IENyZWF0ZUZyb21EaXNrKAogICAgICAgTGlzdGVuZXIqIGxpc3RlbmVyLAogICAgICAgc2NvcGVkX3JlZnB0cjxTZXNzaW9uU3RvcmFnZU1ldGFkYXRhOjpNYXBEYXRhPiBtYXBfZGF0YSwKLSAgICAgIGxldmVsZGI6Om1vam9tOjpMZXZlbERCRGF0YWJhc2UqIGRhdGFiYXNlKTsKKyAgICAgIGxldmVsZGI6OkxldmVsREJEYXRhYmFzZUltcGwqIGRhdGFiYXNlKTsKIAogICBzdGF0aWMgc2NvcGVkX3JlZnB0cjxTZXNzaW9uU3RvcmFnZURhdGFNYXA+IENyZWF0ZUVtcHR5KAogICAgICAgTGlzdGVuZXIqIGxpc3RlbmVyLAogICAgICAgc2NvcGVkX3JlZnB0cjxTZXNzaW9uU3RvcmFnZU1ldGFkYXRhOjpNYXBEYXRhPiBtYXBfZGF0YSwKLSAgICAgIGxldmVsZGI6Om1vam9tOjpMZXZlbERCRGF0YWJhc2UqIGRhdGFiYXNlKTsKKyAgICAgIGxldmVsZGI6OkxldmVsREJEYXRhYmFzZUltcGwqIGRhdGFiYXNlKTsKIAogICBzdGF0aWMgc2NvcGVkX3JlZnB0cjxTZXNzaW9uU3RvcmFnZURhdGFNYXA+IENyZWF0ZUNsb25lKAogICAgICAgTGlzdGVuZXIqIGxpc3RlbmVyLApAQCAtODMsNyArODcsNyBAQAogICBTZXNzaW9uU3RvcmFnZURhdGFNYXAoCiAgICAgICBMaXN0ZW5lciogbGlzdGVuZXIsCiAgICAgICBzY29wZWRfcmVmcHRyPFNlc3Npb25TdG9yYWdlTWV0YWRhdGE6Ok1hcERhdGE+IG1hcF9lbnRyeSwKLSAgICAgIGxldmVsZGI6Om1vam9tOjpMZXZlbERCRGF0YWJhc2UqIGRhdGFiYXNlLAorICAgICAgbGV2ZWxkYjo6TGV2ZWxEQkRhdGFiYXNlSW1wbCogZGF0YWJhc2UsCiAgICAgICBib29sIGlzX2VtcHR5KTsKICAgU2Vzc2lvblN0b3JhZ2VEYXRhTWFwKAogICAgICAgTGlzdGVuZXIqIGxpc3RlbmVyLApkaWZmIC0tZ2l0IGEvY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL3Nlc3Npb25fc3RvcmFnZV9kYXRhX21hcF91bml0dGVzdC5jYyBiL2NvbnRlbnQvYnJvd3Nlci9kb21fc3RvcmFnZS9zZXNzaW9uX3N0b3JhZ2VfZGF0YV9tYXBfdW5pdHRlc3QuY2MKaW5kZXggYmMyY2U3N2MuLmI4YTdlMTIxIDEwMDY0NAotLS0gYS9jb250ZW50L2Jyb3dzZXIvZG9tX3N0b3JhZ2Uvc2Vzc2lvbl9zdG9yYWdlX2RhdGFfbWFwX3VuaXR0ZXN0LmNjCisrKyBiL2NvbnRlbnQvYnJvd3Nlci9kb21fc3RvcmFnZS9zZXNzaW9uX3N0b3JhZ2VfZGF0YV9tYXBfdW5pdHRlc3QuY2MKQEAgLTgsMTIgKzgsMTYgQEAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlICJiYXNlL2JpbmQuaCIKKyNpbmNsdWRlICJiYXNlL2NvbnRhaW5lcnMvc3Bhbi5oIgogI2luY2x1ZGUgImJhc2UvbWVtb3J5L3B0cl91dGlsLmgiCiAjaW5jbHVkZSAiYmFzZS9ydW5fbG9vcC5oIgorI2luY2x1ZGUgImJhc2UvdGFzay9wb3N0X3Rhc2suaCIKKyNpbmNsdWRlICJiYXNlL3Rlc3QvYmluZF90ZXN0X3V0aWwuaCIKICNpbmNsdWRlICJiYXNlL3Rlc3QvdGFza19lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvbXBvbmVudHMvc2VydmljZXMvbGV2ZWxkYi9sZXZlbGRiX2RhdGFiYXNlX2ltcGwuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL3NlcnZpY2VzL2xldmVsZGIvcHVibGljL2NwcC91dGlsLmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9zZXJ2aWNlcy9zdG9yYWdlL2RvbV9zdG9yYWdlL2RvbV9zdG9yYWdlX2RhdGFiYXNlLmgiCiAjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvdGVzdC9icm93c2VyX3Rhc2tfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb250ZW50L3Rlc3QvZmFrZV9sZXZlbGRiX2RhdGFiYXNlLmgiCiAjaW5jbHVkZSAibW9qby9wdWJsaWMvY3BwL2JpbmRpbmdzL2Fzc29jaWF0ZWRfcmVtb3RlLmgiCiAjaW5jbHVkZSAibW9qby9wdWJsaWMvY3BwL2JpbmRpbmdzL3BlbmRpbmdfYXNzb2NpYXRlZF9yZW1vdGUuaCIKICNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvYmluZGluZ3Mvc2VsZl9vd25lZF9hc3NvY2lhdGVkX3JlY2VpdmVyLmgiCkBAIC0yNiw2ICszMCwxMCBAQAogdXNpbmcgbGV2ZWxkYjo6U3RkU3RyaW5nVG9VaW50OFZlY3RvcjsKIHVzaW5nIGxldmVsZGI6OlVpbnQ4VmVjdG9yVG9TdGRTdHJpbmc7CiAKK2Jhc2U6OnNwYW48Y29uc3QgdWludDhfdD4gTWFrZUJ5dGVzKGJhc2U6OlN0cmluZ1BpZWNlIHN0cikgeworICByZXR1cm4gYmFzZTo6YXNfYnl0ZXMoYmFzZTo6bWFrZV9zcGFuKHN0cikpOworfQorCiBjbGFzcyBNb2NrTGlzdGVuZXIgOiBwdWJsaWMgU2Vzc2lvblN0b3JhZ2VEYXRhTWFwOjpMaXN0ZW5lciB7CiAgcHVibGljOgogICBNb2NrTGlzdGVuZXIoKSB7fQpAQCAtNzksMjMgKzg3LDU4IEBACiBjbGFzcyBTZXNzaW9uU3RvcmFnZURhdGFNYXBUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewogIHB1YmxpYzoKICAgU2Vzc2lvblN0b3JhZ2VEYXRhTWFwVGVzdCgpCi0gICAgICA6IHRlc3Rfb3JpZ2luXyh1cmw6Ok9yaWdpbjo6Q3JlYXRlKEdVUkwoImh0dHA6Ly9ob3N0MS5jb206MSIpKSksCi0gICAgICAgIGRhdGFiYXNlXygmbW9ja19kYXRhXykgewotICAgIC8vIFNob3VsZCBzaG93IHVwIGluIGZpcnN0IG1hcC4KLSAgICBtb2NrX2RhdGFfW1N0ZFN0cmluZ1RvVWludDhWZWN0b3IoIm1hcC0xLWtleTEiKV0gPQotICAgICAgICBTdGRTdHJpbmdUb1VpbnQ4VmVjdG9yKCJkYXRhMSIpOwotICAgIC8vIER1bW15IGRhdGEgdG8gdmVyaWZ5IHdlIGRvbid0IGRlbGV0ZSBldmVyeXRoaW5nLgotICAgIG1vY2tfZGF0YV9bU3RkU3RyaW5nVG9VaW50OFZlY3RvcigibWFwLTMta2V5MSIpXSA9Ci0gICAgICAgIFN0ZFN0cmluZ1RvVWludDhWZWN0b3IoImRhdGEzIik7CisgICAgICA6IHRlc3Rfb3JpZ2luXyh1cmw6Ok9yaWdpbjo6Q3JlYXRlKEdVUkwoImh0dHA6Ly9ob3N0MS5jb206MSIpKSkgeworICAgIGJhc2U6OlJ1bkxvb3AgbG9vcDsKKyAgICBkYXRhYmFzZV8gPSBsZXZlbGRiOjpMZXZlbERCRGF0YWJhc2VJbXBsOjpPcGVuSW5NZW1vcnkoCisgICAgICAgIGJhc2U6Om51bGxvcHQsICJTZXNzaW9uU3RvcmFnZURhdGFNYXBUZXN0IiwKKyAgICAgICAgYmFzZTo6Q3JlYXRlU2VxdWVuY2VkVGFza1J1bm5lcih7YmFzZTo6TWF5QmxvY2soKSwgYmFzZTo6VGhyZWFkUG9vbCgpfSksCisgICAgICAgIGJhc2U6OkJpbmRMYW1iZGFGb3JUZXN0aW5nKFsmXShsZXZlbGRiOjptb2pvbTo6RGF0YWJhc2VFcnJvciBlcnJvcikgeworICAgICAgICAgIEFTU0VSVF9FUShsZXZlbGRiOjptb2pvbTo6RGF0YWJhc2VFcnJvcjo6T0ssIGVycm9yKTsKKyAgICAgICAgICBsb29wLlF1aXQoKTsKKyAgICAgICAgfSkpOworICAgIGxvb3AuUnVuKCk7CisKKyAgICBkYXRhYmFzZV8tPmRhdGFiYXNlKCkuUG9zdFRhc2tXaXRoVGhpc09iamVjdCgKKyAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZShbXShjb25zdCBzdG9yYWdlOjpEb21TdG9yYWdlRGF0YWJhc2UmIGRiKSB7CisgICAgICAgICAgLy8gU2hvdWxkIHNob3cgdXAgaW4gZmlyc3QgbWFwLgorICAgICAgICAgIGxldmVsZGI6OlN0YXR1cyBzdGF0dXMgPQorICAgICAgICAgICAgICBkYi5QdXQoTWFrZUJ5dGVzKCJtYXAtMS1rZXkxIiksIE1ha2VCeXRlcygiZGF0YTEiKSk7CisgICAgICAgICAgQVNTRVJUX1RSVUUoc3RhdHVzLm9rKCkpOworCisgICAgICAgICAgLy8gRHVtbXkgZGF0YSB0byB2ZXJpZnkgd2UgZG9uJ3QgZGVsZXRlIGV2ZXJ5dGhpbmcuCisgICAgICAgICAgc3RhdHVzID0gZGIuUHV0KE1ha2VCeXRlcygibWFwLTMta2V5MSIpLCBNYWtlQnl0ZXMoImRhdGEzIikpOworICAgICAgICAgIEFTU0VSVF9UUlVFKHN0YXR1cy5vaygpKTsKKyAgICAgICAgfSkpOwogICB9Ci0gIH5TZXNzaW9uU3RvcmFnZURhdGFNYXBUZXN0KCkgb3ZlcnJpZGUge30KKworICB+U2Vzc2lvblN0b3JhZ2VEYXRhTWFwVGVzdCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IEdldERhdGFiYXNlQ29udGVudHMoKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RvcmFnZTo6RG9tU3RvcmFnZURhdGFiYXNlOjpLZXlWYWx1ZVBhaXI+IGVudHJpZXM7CisgICAgYmFzZTo6UnVuTG9vcCBsb29wOworICAgIGRhdGFiYXNlXy0+ZGF0YWJhc2UoKS5Qb3N0VGFza1dpdGhUaGlzT2JqZWN0KAorICAgICAgICBGUk9NX0hFUkUsCisgICAgICAgIGJhc2U6OkJpbmRMYW1iZGFGb3JUZXN0aW5nKFsmXShjb25zdCBzdG9yYWdlOjpEb21TdG9yYWdlRGF0YWJhc2UmIGRiKSB7CisgICAgICAgICAgbGV2ZWxkYjo6U3RhdHVzIHN0YXR1cyA9IGRiLkdldFByZWZpeGVkKHt9LCAmZW50cmllcyk7CisgICAgICAgICAgQVNTRVJUX1RSVUUoc3RhdHVzLm9rKCkpOworICAgICAgICAgIGxvb3AuUXVpdCgpOworICAgICAgICB9KSk7CisgICAgbG9vcC5SdW4oKTsKKworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gY29udGVudHM7CisgICAgZm9yIChhdXRvJiBlbnRyeSA6IGVudHJpZXMpIHsKKyAgICAgIGNvbnRlbnRzLmVtcGxhY2Uoc3RkOjpzdHJpbmcoZW50cnkua2V5LmJlZ2luKCksIGVudHJ5LmtleS5lbmQoKSksCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKGVudHJ5LnZhbHVlLmJlZ2luKCksIGVudHJ5LnZhbHVlLmVuZCgpKSk7CisgICAgfQorCisgICAgcmV0dXJuIGNvbnRlbnRzOworICB9CiAKICBwcm90ZWN0ZWQ6CiAgIEJyb3dzZXJUYXNrRW52aXJvbm1lbnQgdGFza19lbnZpcm9ubWVudF87CiAgIHRlc3Rpbmc6OlN0cmljdE1vY2s8TW9ja0xpc3RlbmVyPiBsaXN0ZW5lcl87CiAgIHVybDo6T3JpZ2luIHRlc3Rfb3JpZ2luXzsKLSAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBtb2NrX2RhdGFfOwotICBGYWtlTGV2ZWxEQkRhdGFiYXNlIGRhdGFiYXNlXzsKKyAgc3RkOjp1bmlxdWVfcHRyPGxldmVsZGI6OkxldmVsREJEYXRhYmFzZUltcGw+IGRhdGFiYXNlXzsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZQpAQCAtMTEwLDcgKzE1Myw3IEBACiAgICAgICAgICAgJmxpc3RlbmVyXywKICAgICAgICAgICBiYXNlOjpNYWtlUmVmQ291bnRlZDxTZXNzaW9uU3RvcmFnZU1ldGFkYXRhOjpNYXBEYXRhPigxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfb3JpZ2luXyksCi0gICAgICAgICAgJmRhdGFiYXNlXyk7CisgICAgICAgICAgZGF0YWJhc2VfLmdldCgpKTsKIAogICBib29sIHN1Y2Nlc3M7CiAgIHN0ZDo6dmVjdG9yPGJsaW5rOjptb2pvbTo6S2V5VmFsdWVQdHI+IGRhdGE7CkBAIC0xMzEsNyArMTc0LDcgQEAKIAogICAvLyBUZXN0IGRhdGEgaXMgbm90IGNsZWFyZWQgb24gZGVsZXRpb24uCiAgIG1hcCA9IG51bGxwdHI7Ci0gIEVYUEVDVF9FUSgydSwgbW9ja19kYXRhXy5zaXplKCkpOworICBFWFBFQ1RfRVEoMnUsIEdldERhdGFiYXNlQ29udGVudHMoKS5zaXplKCkpOwogfQogCiBURVNUX0YoU2Vzc2lvblN0b3JhZ2VEYXRhTWFwVGVzdCwgRXhwbGljaXRseUVtcHR5KSB7CkBAIC0xNDIsNyArMTg1LDcgQEAKICAgc2NvcGVkX3JlZnB0cjxTZXNzaW9uU3RvcmFnZURhdGFNYXA+IG1hcCA9IFNlc3Npb25TdG9yYWdlRGF0YU1hcDo6Q3JlYXRlRW1wdHkoCiAgICAgICAmbGlzdGVuZXJfLAogICAgICAgYmFzZTo6TWFrZVJlZkNvdW50ZWQ8U2Vzc2lvblN0b3JhZ2VNZXRhZGF0YTo6TWFwRGF0YT4oMSwgdGVzdF9vcmlnaW5fKSwKLSAgICAgICZkYXRhYmFzZV8pOworICAgICAgZGF0YWJhc2VfLmdldCgpKTsKIAogICBib29sIHN1Y2Nlc3M7CiAgIHN0ZDo6dmVjdG9yPGJsaW5rOjptb2pvbTo6S2V5VmFsdWVQdHI+IGRhdGE7CkBAIC0xNjEsNyArMjA0LDcgQEAKIAogICAvLyBUZXN0IGRhdGEgaXMgbm90IGNsZWFyZWQgb24gZGVsZXRpb24uCiAgIG1hcCA9IG51bGxwdHI7Ci0gIEVYUEVDVF9FUSgydSwgbW9ja19kYXRhXy5zaXplKCkpOworICBFWFBFQ1RfRVEoMnUsIEdldERhdGFiYXNlQ29udGVudHMoKS5zaXplKCkpOwogfQogCiBURVNUX0YoU2Vzc2lvblN0b3JhZ2VEYXRhTWFwVGVzdCwgQ2xvbmUpIHsKQEAgLTE3NCw3ICsyMTcsNyBAQAogICAgICAgICAgICZsaXN0ZW5lcl8sCiAgICAgICAgICAgYmFzZTo6TWFrZVJlZkNvdW50ZWQ8U2Vzc2lvblN0b3JhZ2VNZXRhZGF0YTo6TWFwRGF0YT4oMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X29yaWdpbl8pLAotICAgICAgICAgICZkYXRhYmFzZV8pOworICAgICAgICAgIGRhdGFiYXNlXy5nZXQoKSk7CiAKICAgRVhQRUNUX0NBTEwobGlzdGVuZXJfLAogICAgICAgICAgICAgICBPbkRhdGFNYXBDcmVhdGlvbihTdGRTdHJpbmdUb1VpbnQ4VmVjdG9yKCIyIiksIHRlc3Rpbmc6Ol8pKQpAQCAtMjA1LDkgKzI0OCw3IEBACiAgIEVYUEVDVF9FUShTdGRTdHJpbmdUb1VpbnQ4VmVjdG9yKCJkYXRhMSIpLCBkYXRhWzBdLT52YWx1ZSk7CiAKICAgLy8gVGVzdCB0aGF0IHRoZSBkYXRhIHdhcyBjb3BpZWQuCi0gIEVYUEVDVF9FUShTdGRTdHJpbmdUb1VpbnQ4VmVjdG9yKCJkYXRhMSIpLAotICAgICAgICAgICAgbW9ja19kYXRhX1tTdGRTdHJpbmdUb1VpbnQ4VmVjdG9yKCJtYXAtMi1rZXkxIildKTsKLQorICBFWFBFQ1RfRVEoImRhdGExIiwgR2V0RGF0YWJhc2VDb250ZW50cygpWyJtYXAtMi1rZXkxIl0pOwogICBFWFBFQ1RfQ0FMTChsaXN0ZW5lcl8sIE9uRGF0YU1hcERlc3RydWN0aW9uKFN0ZFN0cmluZ1RvVWludDhWZWN0b3IoIjEiKSkpCiAgICAgICAuVGltZXMoMSk7CiAgIEVYUEVDVF9DQUxMKGxpc3RlbmVyXywgT25EYXRhTWFwRGVzdHJ1Y3Rpb24oU3RkU3RyaW5nVG9VaW50OFZlY3RvcigiMiIpKSkKQEAgLTIxNiw3ICsyNTcsNyBAQAogICAvLyBUZXN0IGRhdGEgaXMgbm90IGNsZWFyZWQgb24gZGVsZXRpb24uCiAgIG1hcDEgPSBudWxscHRyOwogICBtYXAyID0gbnVsbHB0cjsKLSAgRVhQRUNUX0VRKDN1LCBtb2NrX2RhdGFfLnNpemUoKSk7CisgIEVYUEVDVF9FUSgzdSwgR2V0RGF0YWJhc2VDb250ZW50cygpLnNpemUoKSk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBjb250ZW50CmRpZmYgLS1naXQgYS9jb250ZW50L2Jyb3dzZXIvZG9tX3N0b3JhZ2Uvc2Vzc2lvbl9zdG9yYWdlX21ldGFkYXRhX3VuaXR0ZXN0LmNjIGIvY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL3Nlc3Npb25fc3RvcmFnZV9tZXRhZGF0YV91bml0dGVzdC5jYwppbmRleCA0M2IxZDA1Li43NDk1ZGU3MiAxMDA2NDQKLS0tIGEvY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL3Nlc3Npb25fc3RvcmFnZV9tZXRhZGF0YV91bml0dGVzdC5jYworKysgYi9jb250ZW50L2Jyb3dzZXIvZG9tX3N0b3JhZ2Uvc2Vzc2lvbl9zdG9yYWdlX21ldGFkYXRhX3VuaXR0ZXN0LmNjCkBAIC0xMiwxMiArMTIsMTQgQEAKICNpbmNsdWRlICJiYXNlL3N0bF91dGlsLmgiCiAjaW5jbHVkZSAiYmFzZS9zdHJpbmdzL3N0cmluZzE2LmgiCiAjaW5jbHVkZSAiYmFzZS9zdHJpbmdzL3V0Zl9zdHJpbmdfY29udmVyc2lvbnMuaCIKKyNpbmNsdWRlICJiYXNlL3Rhc2svcG9zdF90YXNrLmgiCisjaW5jbHVkZSAiYmFzZS90ZXN0L2JpbmRfdGVzdF91dGlsLmgiCiAjaW5jbHVkZSAiYmFzZS90ZXN0L3Rhc2tfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb21wb25lbnRzL3NlcnZpY2VzL2xldmVsZGIvbGV2ZWxkYl9kYXRhYmFzZV9pbXBsLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9zZXJ2aWNlcy9sZXZlbGRiL3B1YmxpYy9jcHAvdXRpbC5oIgogI2luY2x1ZGUgImNvbnRlbnQvYnJvd3Nlci9kb21fc3RvcmFnZS9kb21fc3RvcmFnZV90eXBlcy5oIgogI2luY2x1ZGUgImNvbnRlbnQvYnJvd3Nlci9kb21fc3RvcmFnZS9zZXNzaW9uX3N0b3JhZ2VfZGF0YWJhc2UuaCIKICNpbmNsdWRlICJjb250ZW50L2Jyb3dzZXIvaW5kZXhlZF9kYi9sZXZlbGRiL2xldmVsZGJfZW52LmgiCi0jaW5jbHVkZSAiY29udGVudC90ZXN0L2Zha2VfbGV2ZWxkYl9kYXRhYmFzZS5oIgogI2luY2x1ZGUgIm1vam8vcHVibGljL2NwcC9iaW5kaW5ncy9zdHJvbmdfYXNzb2NpYXRlZF9iaW5kaW5nLmgiCiAjaW5jbHVkZSAidGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLmgiCiAjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCkBAIC0zNCwyMiArMzYsMTAgQEAKIHVzaW5nIGxldmVsZGI6OlVpbnQ4VmVjdG9yVG9TdGRTdHJpbmc7CiB1c2luZyBsZXZlbGRiOjptb2pvbTo6RGF0YWJhc2VFcnJvcjsKIAotdm9pZCBHZXRDYWxsYmFjayhzdGQ6OnZlY3Rvcjx1aW50OF90PiogdmFsdWVfb3V0LAotICAgICAgICAgICAgICAgICBEYXRhYmFzZUVycm9yIGVycm9yLAotICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgdmFsdWUpIHsKLSAgKnZhbHVlX291dCA9IHZhbHVlOwotfQotCiB2b2lkIEVycm9yQ2FsbGJhY2soRGF0YWJhc2VFcnJvciogZXJyb3Jfb3V0LCBEYXRhYmFzZUVycm9yIGVycm9yKSB7CiAgICplcnJvcl9vdXQgPSBlcnJvcjsKIH0KIAotdm9pZCBHZXRBbGxDYWxsYmFjayhzdGQ6OnZlY3RvcjxsZXZlbGRiOjptb2pvbTo6S2V5VmFsdWVQdHI+KiB2YWx1ZXNfb3V0LAotICAgICAgICAgICAgICAgICAgICBEYXRhYmFzZUVycm9yIGVycm9yLAotICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxsZXZlbGRiOjptb2pvbTo6S2V5VmFsdWVQdHI+IHZhbHVlcykgewotICAqdmFsdWVzX291dCA9IHN0ZDo6bW92ZSh2YWx1ZXMpOwotfQotCiBjbGFzcyBTZXNzaW9uU3RvcmFnZU1ldGFkYXRhVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKICBwdWJsaWM6CiAgIFNlc3Npb25TdG9yYWdlTWV0YWRhdGFUZXN0KCkKQEAgLTU3LDggKzQ3LDE1IEBACiAgICAgICAgIHRlc3RfbmFtZXNwYWNlMl9pZF8oYmFzZTo6R2VuZXJhdGVHVUlEKCkpLAogICAgICAgICB0ZXN0X25hbWVzcGFjZTNfaWRfKGJhc2U6OkdlbmVyYXRlR1VJRCgpKSwKICAgICAgICAgdGVzdF9vcmlnaW4xXyh1cmw6Ok9yaWdpbjo6Q3JlYXRlKEdVUkwoImh0dHA6Ly9ob3N0MToxLyIpKSksCi0gICAgICAgIHRlc3Rfb3JpZ2luMl8odXJsOjpPcmlnaW46OkNyZWF0ZShHVVJMKCJodHRwOi8vaG9zdDI6Mi8iKSkpLAotICAgICAgICBkYXRhYmFzZV8oJm1vY2tfZGF0YV8pIHsKKyAgICAgICAgdGVzdF9vcmlnaW4yXyh1cmw6Ok9yaWdpbjo6Q3JlYXRlKEdVUkwoImh0dHA6Ly9ob3N0MjoyLyIpKSkgeworICAgIGJhc2U6OlJ1bkxvb3AgbG9vcDsKKyAgICBkYXRhYmFzZV8gPSBsZXZlbGRiOjpMZXZlbERCRGF0YWJhc2VJbXBsOjpPcGVuSW5NZW1vcnkoCisgICAgICAgIGJhc2U6Om51bGxvcHQsICJTZXNzaW9uU3RvcmFnZU1ldGFkYXRhVGVzdCIsCisgICAgICAgIGJhc2U6OkNyZWF0ZVNlcXVlbmNlZFRhc2tSdW5uZXIoe2Jhc2U6Ok1heUJsb2NrKCksIGJhc2U6OlRocmVhZFBvb2woKX0pLAorICAgICAgICBiYXNlOjpCaW5kTGFtYmRhRm9yVGVzdGluZygKKyAgICAgICAgICAgIFsmXShsZXZlbGRiOjptb2pvbTo6RGF0YWJhc2VFcnJvcikgeyBsb29wLlF1aXQoKTsgfSkpOworICAgIGxvb3AuUnVuKCk7CisKICAgICBuZXh0X21hcF9pZF9rZXlfID0gc3RkOjp2ZWN0b3I8dWludDhfdD4oCiAgICAgICAgIHN0ZDo6YmVnaW4oU2Vzc2lvblN0b3JhZ2VNZXRhZGF0YTo6a05leHRNYXBJZEtleUJ5dGVzKSwKICAgICAgICAgc3RkOjplbmQoU2Vzc2lvblN0b3JhZ2VNZXRhZGF0YTo6a05leHRNYXBJZEtleUJ5dGVzKSk7CkBAIC03MiwxOCArNjksMzYgQEAKICAgflNlc3Npb25TdG9yYWdlTWV0YWRhdGFUZXN0KCkgb3ZlcnJpZGUge30KIAogICB2b2lkIFJlYWRNZXRhZGF0YUZyb21EYXRhYmFzZShTZXNzaW9uU3RvcmFnZU1ldGFkYXRhKiBtZXRhZGF0YSkgewotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlOwotICAgIGRhdGFiYXNlXy5HZXQoZGF0YWJhc2VfdmVyc2lvbl9rZXlfLCBiYXNlOjpCaW5kT25jZSgmR2V0Q2FsbGJhY2ssICZ2YWx1ZSkpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlcnNpb25fdmFsdWU7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbmV4dF9tYXBfaWRfdmFsdWU7CisgICAgc3RkOjp2ZWN0b3I8c3RvcmFnZTo6RG9tU3RvcmFnZURhdGFiYXNlOjpLZXlWYWx1ZVBhaXI+IG5hbWVzcGFjZV9lbnRyaWVzOworCisgICAgYmFzZTo6UnVuTG9vcCBsb29wOworICAgIGRhdGFiYXNlXy0+ZGF0YWJhc2UoKS5Qb3N0VGFza1dpdGhUaGlzT2JqZWN0KAorICAgICAgICBGUk9NX0hFUkUsCisgICAgICAgIGJhc2U6OkJpbmRMYW1iZGFGb3JUZXN0aW5nKFsmXShjb25zdCBzdG9yYWdlOjpEb21TdG9yYWdlRGF0YWJhc2UmIGRiKSB7CisgICAgICAgICAgRVhQRUNUX1RSVUUoZGIuR2V0KGRhdGFiYXNlX3ZlcnNpb25fa2V5XywgJnZlcnNpb25fdmFsdWUpLm9rKCkpOworICAgICAgICAgIEVYUEVDVF9UUlVFKGRiLkdldChuZXh0X21hcF9pZF9rZXlfLCAmbmV4dF9tYXBfaWRfdmFsdWUpLm9rKCkpOworICAgICAgICAgIEVYUEVDVF9UUlVFKAorICAgICAgICAgICAgICBkYi5HZXRQcmVmaXhlZChuYW1lc3BhY2VzX3ByZWZpeF9rZXlfLCAmbmFtZXNwYWNlX2VudHJpZXMpLm9rKCkpOworICAgICAgICAgIGxvb3AuUXVpdCgpOworICAgICAgICB9KSk7CisgICAgbG9vcC5SdW4oKTsKKwogICAgIHN0ZDo6dmVjdG9yPGxldmVsZGI6Om1vam9tOjpCYXRjaGVkT3BlcmF0aW9uUHRyPiBtaWdyYXRpb25fb3BlcmF0aW9uczsKLSAgICBFWFBFQ1RfVFJVRShtZXRhZGF0YS0+UGFyc2VEYXRhYmFzZVZlcnNpb24odmFsdWUsICZtaWdyYXRpb25fb3BlcmF0aW9ucykpOwotICAgIEVYUEVDVF9UUlVFKG1pZ3JhdGlvbl9vcGVyYXRpb25zLmVtcHR5KCkpOwotICAgIGRhdGFiYXNlXy5HZXQobmV4dF9tYXBfaWRfa2V5XywgYmFzZTo6QmluZE9uY2UoJkdldENhbGxiYWNrLCAmdmFsdWUpKTsKLSAgICBtZXRhZGF0YS0+UGFyc2VOZXh0TWFwSWQodmFsdWUpOwotICAgIHN0ZDo6dmVjdG9yPGxldmVsZGI6Om1vam9tOjpLZXlWYWx1ZVB0cj4gdmFsdWVzOwotICAgIGRhdGFiYXNlXy5HZXRQcmVmaXhlZChuYW1lc3BhY2VzX3ByZWZpeF9rZXlfLAotICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kT25jZSgmR2V0QWxsQ2FsbGJhY2ssICZ2YWx1ZXMpKTsKICAgICBFWFBFQ1RfVFJVRSgKLSAgICAgICAgbWV0YWRhdGEtPlBhcnNlTmFtZXNwYWNlcyhzdGQ6Om1vdmUodmFsdWVzKSwgJm1pZ3JhdGlvbl9vcGVyYXRpb25zKSk7CisgICAgICAgIG1ldGFkYXRhLT5QYXJzZURhdGFiYXNlVmVyc2lvbih2ZXJzaW9uX3ZhbHVlLCAmbWlncmF0aW9uX29wZXJhdGlvbnMpKTsKKyAgICBFWFBFQ1RfVFJVRShtaWdyYXRpb25fb3BlcmF0aW9ucy5lbXB0eSgpKTsKKworICAgIG1ldGFkYXRhLT5QYXJzZU5leHRNYXBJZChuZXh0X21hcF9pZF92YWx1ZSk7CisKKyAgICBzdGQ6OnZlY3RvcjxsZXZlbGRiOjptb2pvbTo6S2V5VmFsdWVQdHI+IG5hbWVzcGFjZV92YWx1ZXM7CisgICAgZm9yIChhdXRvJiBlbnRyeSA6IG5hbWVzcGFjZV9lbnRyaWVzKSB7CisgICAgICBuYW1lc3BhY2VfdmFsdWVzLnB1c2hfYmFjaygKKyAgICAgICAgICBsZXZlbGRiOjptb2pvbTo6S2V5VmFsdWU6Ok5ldyhlbnRyeS5rZXksIGVudHJ5LnZhbHVlKSk7CisgICAgfQorICAgIEVYUEVDVF9UUlVFKG1ldGFkYXRhLT5QYXJzZU5hbWVzcGFjZXMoc3RkOjptb3ZlKG5hbWVzcGFjZV92YWx1ZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pZ3JhdGlvbl9vcGVyYXRpb25zKSk7CiAgICAgRVhQRUNUX1RSVUUobWlncmF0aW9uX29wZXJhdGlvbnMuZW1wdHkoKSk7CiAgIH0KIApAQCAtOTksMjkgKzExNCw3MSBAQAogICAgIC8vIHwgbmFtZXNwYWNlLTxndWlkIDI+LWh0dHA6Ly9ob3N0MjoyLyAgICAgfCA0ICAgICAgICAgICAgICAgICAgfAogICAgIC8vIHwgbmV4dC1tYXAtaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA1ICAgICAgICAgICAgICAgICAgfAogICAgIC8vIHwgdmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxICAgICAgICAgICAgICAgICAgfAotICAgIG1vY2tfZGF0YV9bU3RkU3RyaW5nVG9VaW50OFZlY3RvcigKLSAgICAgICAgc3RkOjpzdHJpbmcoIm5hbWVzcGFjZS0iKSArIHRlc3RfbmFtZXNwYWNlMV9pZF8gKyAiLSIgKwotICAgICAgICB0ZXN0X29yaWdpbjFfLkdldFVSTCgpLnNwZWMoKSldID0gU3RkU3RyaW5nVG9VaW50OFZlY3RvcigiMSIpOwotICAgIG1vY2tfZGF0YV9bU3RkU3RyaW5nVG9VaW50OFZlY3RvcigKLSAgICAgICAgc3RkOjpzdHJpbmcoIm5hbWVzcGFjZS0iKSArIHRlc3RfbmFtZXNwYWNlMV9pZF8gKyAiLSIgKwotICAgICAgICB0ZXN0X29yaWdpbjJfLkdldFVSTCgpLnNwZWMoKSldID0gU3RkU3RyaW5nVG9VaW50OFZlY3RvcigiMyIpOwotICAgIG1vY2tfZGF0YV9bU3RkU3RyaW5nVG9VaW50OFZlY3RvcigKLSAgICAgICAgc3RkOjpzdHJpbmcoIm5hbWVzcGFjZS0iKSArIHRlc3RfbmFtZXNwYWNlMl9pZF8gKyAiLSIgKwotICAgICAgICB0ZXN0X29yaWdpbjFfLkdldFVSTCgpLnNwZWMoKSldID0gU3RkU3RyaW5nVG9VaW50OFZlY3RvcigiMSIpOwotICAgIG1vY2tfZGF0YV9bU3RkU3RyaW5nVG9VaW50OFZlY3RvcigKLSAgICAgICAgc3RkOjpzdHJpbmcoIm5hbWVzcGFjZS0iKSArIHRlc3RfbmFtZXNwYWNlMl9pZF8gKyAiLSIgKwotICAgICAgICB0ZXN0X29yaWdpbjJfLkdldFVSTCgpLnNwZWMoKSldID0gU3RkU3RyaW5nVG9VaW50OFZlY3RvcigiNCIpOworICAgIGJhc2U6OlJ1bkxvb3AgbG9vcDsKKyAgICBkYXRhYmFzZV8tPmRhdGFiYXNlKCkuUG9zdFRhc2tXaXRoVGhpc09iamVjdCgKKyAgICAgICAgRlJPTV9IRVJFLAorICAgICAgICBiYXNlOjpCaW5kTGFtYmRhRm9yVGVzdGluZyhbJl0oY29uc3Qgc3RvcmFnZTo6RG9tU3RvcmFnZURhdGFiYXNlJiBkYikgeworICAgICAgICAgIGRiLlB1dChTdGRTdHJpbmdUb1VpbnQ4VmVjdG9yKHN0ZDo6c3RyaW5nKCJuYW1lc3BhY2UtIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfbmFtZXNwYWNlMV9pZF8gKyAiLSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfb3JpZ2luMV8uR2V0VVJMKCkuc3BlYygpKSwKKyAgICAgICAgICAgICAgICAgU3RkU3RyaW5nVG9VaW50OFZlY3RvcigiMSIpKTsKKyAgICAgICAgICBkYi5QdXQoU3RkU3RyaW5nVG9VaW50OFZlY3RvcihzdGQ6OnN0cmluZygibmFtZXNwYWNlLSIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X25hbWVzcGFjZTFfaWRfICsgIi0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X29yaWdpbjJfLkdldFVSTCgpLnNwZWMoKSksCisgICAgICAgICAgICAgICAgIFN0ZFN0cmluZ1RvVWludDhWZWN0b3IoIjMiKSk7CisgICAgICAgICAgZGIuUHV0KFN0ZFN0cmluZ1RvVWludDhWZWN0b3Ioc3RkOjpzdHJpbmcoIm5hbWVzcGFjZS0iKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9uYW1lc3BhY2UyX2lkXyArICItIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9vcmlnaW4xXy5HZXRVUkwoKS5zcGVjKCkpLAorICAgICAgICAgICAgICAgICBTdGRTdHJpbmdUb1VpbnQ4VmVjdG9yKCIxIikpOworICAgICAgICAgIGRiLlB1dChTdGRTdHJpbmdUb1VpbnQ4VmVjdG9yKHN0ZDo6c3RyaW5nKCJuYW1lc3BhY2UtIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfbmFtZXNwYWNlMl9pZF8gKyAiLSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfb3JpZ2luMl8uR2V0VVJMKCkuc3BlYygpKSwKKyAgICAgICAgICAgICAgICAgU3RkU3RyaW5nVG9VaW50OFZlY3RvcigiNCIpKTsKIAotICAgIG1vY2tfZGF0YV9bbmV4dF9tYXBfaWRfa2V5X10gPSBTdGRTdHJpbmdUb1VpbnQ4VmVjdG9yKCI1Iik7CisgICAgICAgICAgZGIuUHV0KG5leHRfbWFwX2lkX2tleV8sIFN0ZFN0cmluZ1RvVWludDhWZWN0b3IoIjUiKSk7CiAKLSAgICBtb2NrX2RhdGFfW1N0ZFN0cmluZ1RvVWludDhWZWN0b3IoIm1hcC0xLWtleTEiKV0gPQotICAgICAgICBTdGRTdHJpbmdUb1VpbnQ4VmVjdG9yKCJkYXRhMSIpOwotICAgIG1vY2tfZGF0YV9bU3RkU3RyaW5nVG9VaW50OFZlY3RvcigibWFwLTMta2V5MSIpXSA9Ci0gICAgICAgIFN0ZFN0cmluZ1RvVWludDhWZWN0b3IoImRhdGEzIik7Ci0gICAgbW9ja19kYXRhX1tTdGRTdHJpbmdUb1VpbnQ4VmVjdG9yKCJtYXAtNC1rZXkxIildID0KLSAgICAgICAgU3RkU3RyaW5nVG9VaW50OFZlY3RvcigiZGF0YTQiKTsKKyAgICAgICAgICBkYi5QdXQoU3RkU3RyaW5nVG9VaW50OFZlY3RvcigibWFwLTEta2V5MSIpLAorICAgICAgICAgICAgICAgICBTdGRTdHJpbmdUb1VpbnQ4VmVjdG9yKCJkYXRhMSIpKTsKKyAgICAgICAgICBkYi5QdXQoU3RkU3RyaW5nVG9VaW50OFZlY3RvcigibWFwLTMta2V5MSIpLAorICAgICAgICAgICAgICAgICBTdGRTdHJpbmdUb1VpbnQ4VmVjdG9yKCJkYXRhMyIpKTsKKyAgICAgICAgICBkYi5QdXQoU3RkU3RyaW5nVG9VaW50OFZlY3RvcigibWFwLTQta2V5MSIpLAorICAgICAgICAgICAgICAgICBTdGRTdHJpbmdUb1VpbnQ4VmVjdG9yKCJkYXRhNCIpKTsKIAotICAgIG1vY2tfZGF0YV9bZGF0YWJhc2VfdmVyc2lvbl9rZXlfXSA9IFN0ZFN0cmluZ1RvVWludDhWZWN0b3IoIjEiKTsKKyAgICAgICAgICBkYi5QdXQoZGF0YWJhc2VfdmVyc2lvbl9rZXlfLCBTdGRTdHJpbmdUb1VpbnQ4VmVjdG9yKCIxIikpOworICAgICAgICAgIGxvb3AuUXVpdCgpOworICAgICAgICB9KSk7CisgICAgbG9vcC5SdW4oKTsKKyAgfQorCisgIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gR2V0RGF0YWJhc2VDb250ZW50cygpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdG9yYWdlOjpEb21TdG9yYWdlRGF0YWJhc2U6OktleVZhbHVlUGFpcj4gZW50cmllczsKKyAgICBiYXNlOjpSdW5Mb29wIGxvb3A7CisgICAgZGF0YWJhc2VfLT5kYXRhYmFzZSgpLlBvc3RUYXNrV2l0aFRoaXNPYmplY3QoCisgICAgICAgIEZST01fSEVSRSwKKyAgICAgICAgYmFzZTo6QmluZExhbWJkYUZvclRlc3RpbmcoWyZdKGNvbnN0IHN0b3JhZ2U6OkRvbVN0b3JhZ2VEYXRhYmFzZSYgZGIpIHsKKyAgICAgICAgICBsZXZlbGRiOjpTdGF0dXMgc3RhdHVzID0gZGIuR2V0UHJlZml4ZWQoe30sICZlbnRyaWVzKTsKKyAgICAgICAgICBBU1NFUlRfVFJVRShzdGF0dXMub2soKSk7CisgICAgICAgICAgbG9vcC5RdWl0KCk7CisgICAgICAgIH0pKTsKKyAgICBsb29wLlJ1bigpOworCisgICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBjb250ZW50czsKKyAgICBmb3IgKGF1dG8mIGVudHJ5IDogZW50cmllcykKKyAgICAgIGNvbnRlbnRzLmVtcGxhY2UoZW50cnkua2V5LCBlbnRyeS52YWx1ZSk7CisgICAgcmV0dXJuIGNvbnRlbnRzOworICB9CisKKyAgdm9pZCBXcml0ZUJhdGNoKAorICAgICAgc3RkOjp2ZWN0b3I8bGV2ZWxkYjo6bW9qb206OkJhdGNoZWRPcGVyYXRpb25QdHI+IG9wZXJhdGlvbnMsCisgICAgICBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZChsZXZlbGRiOjptb2pvbTo6RGF0YWJhc2VFcnJvcik+IGNhbGxiYWNrKSB7CisgICAgYmFzZTo6UnVuTG9vcCBsb29wOworICAgIGRhdGFiYXNlXy0+V3JpdGUoCisgICAgICAgIHN0ZDo6bW92ZShvcGVyYXRpb25zKSwKKyAgICAgICAgYmFzZTo6QmluZExhbWJkYUZvclRlc3RpbmcoWyZdKGxldmVsZGI6Om1vam9tOjpEYXRhYmFzZUVycm9yIGVycm9yKSB7CisgICAgICAgICAgc3RkOjptb3ZlKGNhbGxiYWNrKS5SdW4oZXJyb3IpOworICAgICAgICAgIGxvb3AuUXVpdCgpOworICAgICAgICB9KSk7CisgICAgbG9vcC5SdW4oKTsKICAgfQogCiAgcHJvdGVjdGVkOgpAQCAtMTMxLDggKzE4OCw3IEBACiAgIHN0ZDo6c3RyaW5nIHRlc3RfbmFtZXNwYWNlM19pZF87CiAgIHVybDo6T3JpZ2luIHRlc3Rfb3JpZ2luMV87CiAgIHVybDo6T3JpZ2luIHRlc3Rfb3JpZ2luMl87Ci0gIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gbW9ja19kYXRhXzsKLSAgRmFrZUxldmVsREJEYXRhYmFzZSBkYXRhYmFzZV87CisgIHN0ZDo6dW5pcXVlX3B0cjxsZXZlbGRiOjpMZXZlbERCRGF0YWJhc2VJbXBsPiBkYXRhYmFzZV87CiAKICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YWJhc2VfdmVyc2lvbl9rZXlfOwogICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBuZXh0X21hcF9pZF9rZXlfOwpAQCAtMTQ1LDEyICsyMDEsMTIgQEAKICAgICAgIG1ldGFkYXRhLlNldHVwTmV3RGF0YWJhc2UoKTsKIAogICBEYXRhYmFzZUVycm9yIGVycm9yOwotICBkYXRhYmFzZV8uV3JpdGUoc3RkOjptb3ZlKG9wZXJhdGlvbnMpLAotICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZE9uY2UoJkVycm9yQ2FsbGJhY2ssICZlcnJvcikpOworICBXcml0ZUJhdGNoKHN0ZDo6bW92ZShvcGVyYXRpb25zKSwgYmFzZTo6QmluZE9uY2UoJkVycm9yQ2FsbGJhY2ssICZlcnJvcikpOwogICBFWFBFQ1RfRVEoRGF0YWJhc2VFcnJvcjo6T0ssIGVycm9yKTsKIAotICBFWFBFQ1RfRVEoU3RkU3RyaW5nVG9VaW50OFZlY3RvcigiMSIpLCBtb2NrX2RhdGFfW2RhdGFiYXNlX3ZlcnNpb25fa2V5X10pOwotICBFWFBFQ1RfRVEoU3RkU3RyaW5nVG9VaW50OFZlY3RvcigiMCIpLCBtb2NrX2RhdGFfW25leHRfbWFwX2lkX2tleV9dKTsKKyAgYXV0byBjb250ZW50cyA9IEdldERhdGFiYXNlQ29udGVudHMoKTsKKyAgRVhQRUNUX0VRKFN0ZFN0cmluZ1RvVWludDhWZWN0b3IoIjEiKSwgY29udGVudHNbZGF0YWJhc2VfdmVyc2lvbl9rZXlfXSk7CisgIEVYUEVDVF9FUShTdGRTdHJpbmdUb1VpbnQ4VmVjdG9yKCIwIiksIGNvbnRlbnRzW25leHRfbWFwX2lkX2tleV9dKTsKIH0KIAogVEVTVF9GKFNlc3Npb25TdG9yYWdlTWV0YWRhdGFUZXN0LCBMb2FkaW5nRGF0YSkgewpAQCAtMjA1LDE2ICsyNjEsMTYgQEAKICAgICAgICAgICAgICAgICAgICAtPlJlZmVyZW5jZUNvdW50KCkpOwogCiAgIERhdGFiYXNlRXJyb3IgZXJyb3I7Ci0gIGRhdGFiYXNlXy5Xcml0ZShzdGQ6Om1vdmUob3BlcmF0aW9ucyksCi0gICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kT25jZSgmRXJyb3JDYWxsYmFjaywgJmVycm9yKSk7CisgIFdyaXRlQmF0Y2goc3RkOjptb3ZlKG9wZXJhdGlvbnMpLCBiYXNlOjpCaW5kT25jZSgmRXJyb3JDYWxsYmFjaywgJmVycm9yKSk7CiAgIEVYUEVDVF9FUShEYXRhYmFzZUVycm9yOjpPSywgZXJyb3IpOwogCiAgIC8vIFZlcmlmeSBtZXRhZGF0YSB3YXMgd3JpdHRlbiB0byBkaXNrLgotICBFWFBFQ1RfRVEoU3RkU3RyaW5nVG9VaW50OFZlY3RvcigiNiIpLCBtb2NrX2RhdGFfW25leHRfbWFwX2lkX2tleV9dKTsKKyAgYXV0byBjb250ZW50cyA9IEdldERhdGFiYXNlQ29udGVudHMoKTsKKyAgRVhQRUNUX0VRKFN0ZFN0cmluZ1RvVWludDhWZWN0b3IoIjYiKSwgY29udGVudHNbbmV4dF9tYXBfaWRfa2V5X10pOwogICBFWFBFQ1RfRVEoU3RkU3RyaW5nVG9VaW50OFZlY3RvcigiNSIpLAotICAgICAgICAgICAgbW9ja19kYXRhX1tTdGRTdHJpbmdUb1VpbnQ4VmVjdG9yKHN0ZDo6c3RyaW5nKCJuYW1lc3BhY2UtIikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfbmFtZXNwYWNlMV9pZF8gKyAiLSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfb3JpZ2luMV8uR2V0VVJMKCkuc3BlYygpKV0pOworICAgICAgICAgICAgY29udGVudHNbU3RkU3RyaW5nVG9VaW50OFZlY3RvcihzdGQ6OnN0cmluZygibmFtZXNwYWNlLSIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9uYW1lc3BhY2UxX2lkXyArICItIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfb3JpZ2luMV8uR2V0VVJMKCkuc3BlYygpKV0pOwogfQogCiBURVNUX0YoU2Vzc2lvblN0b3JhZ2VNZXRhZGF0YVRlc3QsIFNoYWxsb3dDb3BpZXMpIHsKQEAgLTIyOSw4ICsyODUsNyBAQAogICBtZXRhZGF0YS5SZWdpc3RlclNoYWxsb3dDbG9uZWROYW1lc3BhY2UobnMxX2VudHJ5LCBuczNfZW50cnksICZvcGVyYXRpb25zKTsKIAogICBEYXRhYmFzZUVycm9yIGVycm9yOwotICBkYXRhYmFzZV8uV3JpdGUoc3RkOjptb3ZlKG9wZXJhdGlvbnMpLAotICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZE9uY2UoJkVycm9yQ2FsbGJhY2ssICZlcnJvcikpOworICBXcml0ZUJhdGNoKHN0ZDo6bW92ZShvcGVyYXRpb25zKSwgYmFzZTo6QmluZE9uY2UoJkVycm9yQ2FsbGJhY2ssICZlcnJvcikpOwogICBFWFBFQ1RfRVEoRGF0YWJhc2VFcnJvcjo6T0ssIGVycm9yKTsKIAogICAvLyBWZXJpZnkgaW4tbWVtb3J5IG1ldGFkYXRhIGlzIGNvcnJlY3QuCkBAIC0yNDYsMTQgKzMwMSwxNSBAQAogICBFWFBFQ1RfRVEoMiwgbnMzX2VudHJ5LT5zZWNvbmRbdGVzdF9vcmlnaW4yX10tPlJlZmVyZW5jZUNvdW50KCkpOwogCiAgIC8vIFZlcmlmeSBtZXRhZGF0YSB3YXMgd3JpdHRlbiB0byBkaXNrLgorICBhdXRvIGNvbnRlbnRzID0gR2V0RGF0YWJhc2VDb250ZW50cygpOwogICBFWFBFQ1RfRVEoU3RkU3RyaW5nVG9VaW50OFZlY3RvcigiMSIpLAotICAgICAgICAgICAgbW9ja19kYXRhX1tTdGRTdHJpbmdUb1VpbnQ4VmVjdG9yKHN0ZDo6c3RyaW5nKCJuYW1lc3BhY2UtIikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfbmFtZXNwYWNlM19pZF8gKyAiLSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfb3JpZ2luMV8uR2V0VVJMKCkuc3BlYygpKV0pOworICAgICAgICAgICAgY29udGVudHNbU3RkU3RyaW5nVG9VaW50OFZlY3RvcihzdGQ6OnN0cmluZygibmFtZXNwYWNlLSIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9uYW1lc3BhY2UzX2lkXyArICItIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfb3JpZ2luMV8uR2V0VVJMKCkuc3BlYygpKV0pOwogICBFWFBFQ1RfRVEoU3RkU3RyaW5nVG9VaW50OFZlY3RvcigiMyIpLAotICAgICAgICAgICAgbW9ja19kYXRhX1tTdGRTdHJpbmdUb1VpbnQ4VmVjdG9yKHN0ZDo6c3RyaW5nKCJuYW1lc3BhY2UtIikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfbmFtZXNwYWNlM19pZF8gKyAiLSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfb3JpZ2luMl8uR2V0VVJMKCkuc3BlYygpKV0pOworICAgICAgICAgICAgY29udGVudHNbU3RkU3RyaW5nVG9VaW50OFZlY3RvcihzdGQ6OnN0cmluZygibmFtZXNwYWNlLSIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9uYW1lc3BhY2UzX2lkXyArICItIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfb3JpZ2luMl8uR2V0VVJMKCkuc3BlYygpKV0pOwogfQogCiBURVNUX0YoU2Vzc2lvblN0b3JhZ2VNZXRhZGF0YVRlc3QsIERlbGV0ZU5hbWVzcGFjZSkgewpAQCAtMjY0LDggKzMyMCw3IEBACiAgIHN0ZDo6dmVjdG9yPGxldmVsZGI6Om1vam9tOjpCYXRjaGVkT3BlcmF0aW9uUHRyPiBvcGVyYXRpb25zOwogICBtZXRhZGF0YS5EZWxldGVOYW1lc3BhY2UodGVzdF9uYW1lc3BhY2UxX2lkXywgJm9wZXJhdGlvbnMpOwogICBEYXRhYmFzZUVycm9yIGVycm9yOwotICBkYXRhYmFzZV8uV3JpdGUoc3RkOjptb3ZlKG9wZXJhdGlvbnMpLAotICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZE9uY2UoJkVycm9yQ2FsbGJhY2ssICZlcnJvcikpOworICBXcml0ZUJhdGNoKHN0ZDo6bW92ZShvcGVyYXRpb25zKSwgYmFzZTo6QmluZE9uY2UoJkVycm9yQ2FsbGJhY2ssICZlcnJvcikpOwogICBFWFBFQ1RfRVEoRGF0YWJhc2VFcnJvcjo6T0ssIGVycm9yKTsKIAogICBFWFBFQ1RfRkFMU0UoCkBAIC0yNzcsMTcgKzMzMiwxNyBAQAogICBFWFBFQ1RfRVEoMSwgbnMyX2VudHJ5LT5zZWNvbmRbdGVzdF9vcmlnaW4yX10tPlJlZmVyZW5jZUNvdW50KCkpOwogCiAgIC8vIFZlcmlmeSBtZXRhZGF0YSBhbmQgZGF0YSB3YXMgZGVsZXRlZCBmcm9tIGRpc2suCisgIGF1dG8gY29udGVudHMgPSBHZXREYXRhYmFzZUNvbnRlbnRzKCk7CiAgIEVYUEVDVF9GQUxTRShiYXNlOjpDb250YWlucygKLSAgICAgIG1vY2tfZGF0YV8sCisgICAgICBjb250ZW50cywKICAgICAgIFN0ZFN0cmluZ1RvVWludDhWZWN0b3Ioc3RkOjpzdHJpbmcoIm5hbWVzcGFjZS0iKSArIHRlc3RfbmFtZXNwYWNlMV9pZF8gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLSIgKyB0ZXN0X29yaWdpbjFfLkdldFVSTCgpLnNwZWMoKSkpKTsKICAgRVhQRUNUX0ZBTFNFKGJhc2U6OkNvbnRhaW5zKAotICAgICAgbW9ja19kYXRhXywKKyAgICAgIGNvbnRlbnRzLAogICAgICAgU3RkU3RyaW5nVG9VaW50OFZlY3RvcihzdGQ6OnN0cmluZygibmFtZXNwYWNlLSIpICsgdGVzdF9uYW1lc3BhY2UxX2lkXyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItIiArIHRlc3Rfb3JpZ2luMl8uR2V0VVJMKCkuc3BlYygpKSkpOwotICBFWFBFQ1RfRkFMU0UoCi0gICAgICBiYXNlOjpDb250YWlucyhtb2NrX2RhdGFfLCBTdGRTdHJpbmdUb1VpbnQ4VmVjdG9yKCJtYXAtMy1rZXkxIikpKTsKLSAgRVhQRUNUX1RSVUUoYmFzZTo6Q29udGFpbnMobW9ja19kYXRhXywgU3RkU3RyaW5nVG9VaW50OFZlY3RvcigibWFwLTEta2V5MSIpKSk7CisgIEVYUEVDVF9GQUxTRShiYXNlOjpDb250YWlucyhjb250ZW50cywgU3RkU3RyaW5nVG9VaW50OFZlY3RvcigibWFwLTMta2V5MSIpKSk7CisgIEVYUEVDVF9UUlVFKGJhc2U6OkNvbnRhaW5zKGNvbnRlbnRzLCBTdGRTdHJpbmdUb1VpbnQ4VmVjdG9yKCJtYXAtMS1rZXkxIikpKTsKIH0KIAogVEVTVF9GKFNlc3Npb25TdG9yYWdlTWV0YWRhdGFUZXN0LCBEZWxldGVBcmVhKSB7CkBAIC0yOTksOCArMzU0LDcgQEAKICAgc3RkOjp2ZWN0b3I8bGV2ZWxkYjo6bW9qb206OkJhdGNoZWRPcGVyYXRpb25QdHI+IG9wZXJhdGlvbnM7CiAgIG1ldGFkYXRhLkRlbGV0ZUFyZWEodGVzdF9uYW1lc3BhY2UxX2lkXywgdGVzdF9vcmlnaW4xXywgJm9wZXJhdGlvbnMpOwogICBEYXRhYmFzZUVycm9yIGVycm9yOwotICBkYXRhYmFzZV8uV3JpdGUoc3RkOjptb3ZlKG9wZXJhdGlvbnMpLAotICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZE9uY2UoJkVycm9yQ2FsbGJhY2ssICZlcnJvcikpOworICBXcml0ZUJhdGNoKHN0ZDo6bW92ZShvcGVyYXRpb25zKSwgYmFzZTo6QmluZE9uY2UoJkVycm9yQ2FsbGJhY2ssICZlcnJvcikpOwogICBFWFBFQ1RfRVEoRGF0YWJhc2VFcnJvcjo6T0ssIGVycm9yKTsKIAogICAvLyBWZXJpZnkgaW4tbWVtb3J5IG1ldGFkYXRhIGlzIGNvcnJlY3QuCkBAIC0zMTIsMjIgKzM2NiwyMiBAQAogICBFWFBFQ1RfRVEoMSwgbnMyX2VudHJ5LT5zZWNvbmRbdGVzdF9vcmlnaW4yX10tPlJlZmVyZW5jZUNvdW50KCkpOwogCiAgIC8vIFZlcmlmeSBvbmx5IHRoZSBhcHBsaWNhYmxlIGRhdGEgd2FzIGRlbGV0ZWQuCisgIGF1dG8gY29udGVudHMgPSBHZXREYXRhYmFzZUNvbnRlbnRzKCk7CiAgIEVYUEVDVF9GQUxTRShiYXNlOjpDb250YWlucygKLSAgICAgIG1vY2tfZGF0YV8sCisgICAgICBjb250ZW50cywKICAgICAgIFN0ZFN0cmluZ1RvVWludDhWZWN0b3Ioc3RkOjpzdHJpbmcoIm5hbWVzcGFjZS0iKSArIHRlc3RfbmFtZXNwYWNlMV9pZF8gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLSIgKyB0ZXN0X29yaWdpbjFfLkdldFVSTCgpLnNwZWMoKSkpKTsKICAgRVhQRUNUX1RSVUUoYmFzZTo6Q29udGFpbnMoCi0gICAgICBtb2NrX2RhdGFfLAorICAgICAgY29udGVudHMsCiAgICAgICBTdGRTdHJpbmdUb1VpbnQ4VmVjdG9yKHN0ZDo6c3RyaW5nKCJuYW1lc3BhY2UtIikgKyB0ZXN0X25hbWVzcGFjZTFfaWRfICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0iICsgdGVzdF9vcmlnaW4yXy5HZXRVUkwoKS5zcGVjKCkpKSk7Ci0gIEVYUEVDVF9UUlVFKGJhc2U6OkNvbnRhaW5zKG1vY2tfZGF0YV8sIFN0ZFN0cmluZ1RvVWludDhWZWN0b3IoIm1hcC0xLWtleTEiKSkpOwotICBFWFBFQ1RfVFJVRShiYXNlOjpDb250YWlucyhtb2NrX2RhdGFfLCBTdGRTdHJpbmdUb1VpbnQ4VmVjdG9yKCJtYXAtNC1rZXkxIikpKTsKKyAgRVhQRUNUX1RSVUUoYmFzZTo6Q29udGFpbnMoY29udGVudHMsIFN0ZFN0cmluZ1RvVWludDhWZWN0b3IoIm1hcC0xLWtleTEiKSkpOworICBFWFBFQ1RfVFJVRShiYXNlOjpDb250YWlucyhjb250ZW50cywgU3RkU3RyaW5nVG9VaW50OFZlY3RvcigibWFwLTQta2V5MSIpKSk7CiAKICAgLy8gTm93IGRlbGV0ZSBhbiBhcmVhIHdpdGggYSB1bmlxdWUgbWFwLgogICBvcGVyYXRpb25zLmNsZWFyKCk7CiAgIG1ldGFkYXRhLkRlbGV0ZUFyZWEodGVzdF9uYW1lc3BhY2UyX2lkXywgdGVzdF9vcmlnaW4yXywgJm9wZXJhdGlvbnMpOwotICBkYXRhYmFzZV8uV3JpdGUoc3RkOjptb3ZlKG9wZXJhdGlvbnMpLAotICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZE9uY2UoJkVycm9yQ2FsbGJhY2ssICZlcnJvcikpOworICBXcml0ZUJhdGNoKHN0ZDo6bW92ZShvcGVyYXRpb25zKSwgYmFzZTo6QmluZE9uY2UoJkVycm9yQ2FsbGJhY2ssICZlcnJvcikpOwogICBFWFBFQ1RfRVEoRGF0YWJhc2VFcnJvcjo6T0ssIGVycm9yKTsKIAogICAvLyBWZXJpZnkgaW4tbWVtb3J5IG1ldGFkYXRhIGlzIGNvcnJlY3QuCkBAIC0zMzcsMTggKzM5MSwxOCBAQAogICBFWFBFQ1RfRkFMU0UoYmFzZTo6Q29udGFpbnMobnMyX2VudHJ5LT5zZWNvbmQsIHRlc3Rfb3JpZ2luMl8pKTsKIAogICAvLyBWZXJpZnkgb25seSB0aGUgYXBwbGljYWJsZSBkYXRhIHdhcyBkZWxldGVkLgorICBjb250ZW50cyA9IEdldERhdGFiYXNlQ29udGVudHMoKTsKICAgRVhQRUNUX1RSVUUoYmFzZTo6Q29udGFpbnMoCi0gICAgICBtb2NrX2RhdGFfLAorICAgICAgY29udGVudHMsCiAgICAgICBTdGRTdHJpbmdUb1VpbnQ4VmVjdG9yKHN0ZDo6c3RyaW5nKCJuYW1lc3BhY2UtIikgKyB0ZXN0X25hbWVzcGFjZTJfaWRfICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0iICsgdGVzdF9vcmlnaW4xXy5HZXRVUkwoKS5zcGVjKCkpKSk7CiAgIEVYUEVDVF9GQUxTRShiYXNlOjpDb250YWlucygKLSAgICAgIG1vY2tfZGF0YV8sCisgICAgICBjb250ZW50cywKICAgICAgIFN0ZFN0cmluZ1RvVWludDhWZWN0b3Ioc3RkOjpzdHJpbmcoIm5hbWVzcGFjZS0iKSArIHRlc3RfbmFtZXNwYWNlMl9pZF8gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLSIgKyB0ZXN0X29yaWdpbjJfLkdldFVSTCgpLnNwZWMoKSkpKTsKLSAgRVhQRUNUX1RSVUUoYmFzZTo6Q29udGFpbnMobW9ja19kYXRhXywgU3RkU3RyaW5nVG9VaW50OFZlY3RvcigibWFwLTEta2V5MSIpKSk7Ci0gIEVYUEVDVF9UUlVFKGJhc2U6OkNvbnRhaW5zKG1vY2tfZGF0YV8sIFN0ZFN0cmluZ1RvVWludDhWZWN0b3IoIm1hcC0zLWtleTEiKSkpOwotICBFWFBFQ1RfRkFMU0UoCi0gICAgICBiYXNlOjpDb250YWlucyhtb2NrX2RhdGFfLCBTdGRTdHJpbmdUb1VpbnQ4VmVjdG9yKCJtYXAtNC1rZXkxIikpKTsKKyAgRVhQRUNUX1RSVUUoYmFzZTo6Q29udGFpbnMoY29udGVudHMsIFN0ZFN0cmluZ1RvVWludDhWZWN0b3IoIm1hcC0xLWtleTEiKSkpOworICBFWFBFQ1RfVFJVRShiYXNlOjpDb250YWlucyhjb250ZW50cywgU3RkU3RyaW5nVG9VaW50OFZlY3RvcigibWFwLTMta2V5MSIpKSk7CisgIEVYUEVDVF9GQUxTRShiYXNlOjpDb250YWlucyhjb250ZW50cywgU3RkU3RyaW5nVG9VaW50OFZlY3RvcigibWFwLTQta2V5MSIpKSk7CiB9CiAKIGNsYXNzIFNlc3Npb25TdG9yYWdlTWV0YWRhdGFNaWdyYXRpb25UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewpkaWZmIC0tZ2l0IGEvY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL3Nlc3Npb25fc3RvcmFnZV9uYW1lc3BhY2VfaW1wbF9tb2pvLmNjIGIvY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL3Nlc3Npb25fc3RvcmFnZV9uYW1lc3BhY2VfaW1wbF9tb2pvLmNjCmluZGV4IDgwZDQzOTEuLmVkNmQwYjNkIDEwMDY0NAotLS0gYS9jb250ZW50L2Jyb3dzZXIvZG9tX3N0b3JhZ2Uvc2Vzc2lvbl9zdG9yYWdlX25hbWVzcGFjZV9pbXBsX21vam8uY2MKKysrIGIvY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL3Nlc3Npb25fc3RvcmFnZV9uYW1lc3BhY2VfaW1wbF9tb2pvLmNjCkBAIC01OCw3ICs1OCw3IEBACiB9CiAKIHZvaWQgU2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2VJbXBsTW9qbzo6UG9wdWxhdGVGcm9tTWV0YWRhdGEoCi0gICAgbGV2ZWxkYjo6bW9qb206OkxldmVsREJEYXRhYmFzZSogZGF0YWJhc2UsCisgICAgbGV2ZWxkYjo6TGV2ZWxEQkRhdGFiYXNlSW1wbCogZGF0YWJhc2UsCiAgICAgU2Vzc2lvblN0b3JhZ2VNZXRhZGF0YTo6TmFtZXNwYWNlRW50cnkgbmFtZXNwYWNlX21ldGFkYXRhKSB7CiAgIERDSEVDSyghSXNQb3B1bGF0ZWQoKSk7CiAgIGRhdGFiYXNlXyA9IGRhdGFiYXNlOwpAQCAtODUsNyArODUsNyBAQAogfQogCiB2b2lkIFNlc3Npb25TdG9yYWdlTmFtZXNwYWNlSW1wbE1vam86OlBvcHVsYXRlQXNDbG9uZSgKLSAgICBsZXZlbGRiOjptb2pvbTo6TGV2ZWxEQkRhdGFiYXNlKiBkYXRhYmFzZSwKKyAgICBsZXZlbGRiOjpMZXZlbERCRGF0YWJhc2VJbXBsKiBkYXRhYmFzZSwKICAgICBTZXNzaW9uU3RvcmFnZU1ldGFkYXRhOjpOYW1lc3BhY2VFbnRyeSBuYW1lc3BhY2VfbWV0YWRhdGEsCiAgICAgY29uc3QgT3JpZ2luQXJlYXMmIGFyZWFzX3RvX2Nsb25lKSB7CiAgIERDSEVDSyghSXNQb3B1bGF0ZWQoKSk7CkBAIC0yMjcsNyArMjI3LDcgQEAKIH0KIAogdm9pZCBTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZUltcGxNb2pvOjpDbG9uZUFsbE5hbWVzcGFjZXNXYWl0aW5nRm9yQ2xvbmUoCi0gICAgbGV2ZWxkYjo6bW9qb206OkxldmVsREJEYXRhYmFzZSogZGF0YWJhc2UsCisgICAgbGV2ZWxkYjo6TGV2ZWxEQkRhdGFiYXNlSW1wbCogZGF0YWJhc2UsCiAgICAgU2Vzc2lvblN0b3JhZ2VNZXRhZGF0YSogbWV0YWRhdGEsCiAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFNlc3Npb25TdG9yYWdlTmFtZXNwYWNlSW1wbE1vam8+PiYKZGlmZiAtLWdpdCBhL2NvbnRlbnQvYnJvd3Nlci9kb21fc3RvcmFnZS9zZXNzaW9uX3N0b3JhZ2VfbmFtZXNwYWNlX2ltcGxfbW9qby5oIGIvY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL3Nlc3Npb25fc3RvcmFnZV9uYW1lc3BhY2VfaW1wbF9tb2pvLmgKaW5kZXggMzhmMDlmOC4uYTBlYjQ1ZSAxMDA2NDQKLS0tIGEvY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL3Nlc3Npb25fc3RvcmFnZV9uYW1lc3BhY2VfaW1wbF9tb2pvLmgKKysrIGIvY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL3Nlc3Npb25fc3RvcmFnZV9uYW1lc3BhY2VfaW1wbF9tb2pvLmgKQEAgLTIwLDYgKzIwLDEwIEBACiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcHVibGljL21vam9tL2RvbV9zdG9yYWdlL3Nlc3Npb25fc3RvcmFnZV9uYW1lc3BhY2UubW9qb20uaCIKICNpbmNsdWRlICJ1cmwvb3JpZ2luLmgiCiAKK25hbWVzcGFjZSBsZXZlbGRiIHsKK2NsYXNzIExldmVsREJEYXRhYmFzZUltcGw7Cit9CisKIG5hbWVzcGFjZSBjb250ZW50IHsKIAogLy8gSW1wbGVtZW50cyB0aGUgbW9qbyBpbnRlcmZhY2UgU2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UuIFN0b3JlcyBkYXRhIG1hcHMgcGVyCkBAIC0xMjIsMTQgKzEyNiwxNCBAQAogICAvLyBDYWxsZWQgd2hlbiB0aGlzIGlzIGEgbmV3IG5hbWVzcGFjZSwgb3Igd2hlbiB0aGUgbmFtZXNwYWNlIHdhcyBsb2FkZWQgZnJvbQogICAvLyBkaXNrLiBTaG91bGQgYmUgY2FsbGVkIGJlZm9yZSB8QmluZHwuCiAgIHZvaWQgUG9wdWxhdGVGcm9tTWV0YWRhdGEoCi0gICAgICBsZXZlbGRiOjptb2pvbTo6TGV2ZWxEQkRhdGFiYXNlKiBkYXRhYmFzZSwKKyAgICAgIGxldmVsZGI6OkxldmVsREJEYXRhYmFzZUltcGwqIGRhdGFiYXNlLAogICAgICAgU2Vzc2lvblN0b3JhZ2VNZXRhZGF0YTo6TmFtZXNwYWNlRW50cnkgbmFtZXNwYWNlX21ldGFkYXRhKTsKIAogICAvLyBDYW4gZWl0aGVyIGJlIGNhbGxlZCBiZWZvcmUgfEJpbmR8LCBvciBpZiB0aGUgc291cmNlIG5hbWVzcGFjZSBpc24ndAogICAvLyBhdmFpbGFibGUgeWV0LCB8U2V0V2FpdGluZ0ZvckNsb25lUG9wdWxhdGlvbnwgY2FuIGJlIGNhbGxlZC4gVGhlbiB8QmluZHwKICAgLy8gd2lsbCB3b3JrLCBhbmQgaG9sZCBvbnRvIHRoZSByZXF1ZXN0IHVudGlsIGFmdGVyIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KICAgdm9pZCBQb3B1bGF0ZUFzQ2xvbmUoCi0gICAgICBsZXZlbGRiOjptb2pvbTo6TGV2ZWxEQkRhdGFiYXNlKiBkYXRhYmFzZSwKKyAgICAgIGxldmVsZGI6OkxldmVsREJEYXRhYmFzZUltcGwqIGRhdGFiYXNlLAogICAgICAgU2Vzc2lvblN0b3JhZ2VNZXRhZGF0YTo6TmFtZXNwYWNlRW50cnkgbmFtZXNwYWNlX21ldGFkYXRhLAogICAgICAgY29uc3QgT3JpZ2luQXJlYXMmIGFyZWFzX3RvX2Nsb25lKTsKIApAQCAtMTg0LDcgKzE4OCw3IEBACiAgIC8vICogSWYgdGhlIHBhcmVudCBpcyBwb3B1bGF0ZWQKICAgLy8gKiBJZiB0aGUgcGFyZW50IGhhcyBhIHBhcmVudC4KICAgdm9pZCBDbG9uZUFsbE5hbWVzcGFjZXNXYWl0aW5nRm9yQ2xvbmUoCi0gICAgICBsZXZlbGRiOjptb2pvbTo6TGV2ZWxEQkRhdGFiYXNlKiBkYXRhYmFzZSwKKyAgICAgIGxldmVsZGI6OkxldmVsREJEYXRhYmFzZUltcGwqIGRhdGFiYXNlLAogICAgICAgU2Vzc2lvblN0b3JhZ2VNZXRhZGF0YSogbWV0YWRhdGEsCiAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywKICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZUltcGxNb2pvPj4mCkBAIC0yMDAsNyArMjA0LDcgQEAKIAogICBjb25zdCBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfaWRfOwogICBTZXNzaW9uU3RvcmFnZU1ldGFkYXRhOjpOYW1lc3BhY2VFbnRyeSBuYW1lc3BhY2VfZW50cnlfOwotICBsZXZlbGRiOjptb2pvbTo6TGV2ZWxEQkRhdGFiYXNlKiBkYXRhYmFzZV8gPSBudWxscHRyOworICBsZXZlbGRiOjpMZXZlbERCRGF0YWJhc2VJbXBsKiBkYXRhYmFzZV8gPSBudWxscHRyOwogCiAgIFNlc3Npb25TdG9yYWdlRGF0YU1hcDo6TGlzdGVuZXIqIGRhdGFfbWFwX2xpc3RlbmVyXzsKICAgU2Vzc2lvblN0b3JhZ2VBcmVhSW1wbDo6UmVnaXN0ZXJOZXdBcmVhTWFwIHJlZ2lzdGVyX25ld19tYXBfY2FsbGJhY2tfOwpkaWZmIC0tZ2l0IGEvY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL3Nlc3Npb25fc3RvcmFnZV9uYW1lc3BhY2VfaW1wbF9tb2pvX3VuaXR0ZXN0LmNjIGIvY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL3Nlc3Npb25fc3RvcmFnZV9uYW1lc3BhY2VfaW1wbF9tb2pvX3VuaXR0ZXN0LmNjCmluZGV4IDFhN2M4NGMuLmQ5Y2IyODBmIDEwMDY0NAotLS0gYS9jb250ZW50L2Jyb3dzZXIvZG9tX3N0b3JhZ2Uvc2Vzc2lvbl9zdG9yYWdlX25hbWVzcGFjZV9pbXBsX21vam9fdW5pdHRlc3QuY2MKKysrIGIvY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL3Nlc3Npb25fc3RvcmFnZV9uYW1lc3BhY2VfaW1wbF9tb2pvX3VuaXR0ZXN0LmNjCkBAIC00LDEyICs0LDE3IEBACiAKICNpbmNsdWRlICJjb250ZW50L2Jyb3dzZXIvZG9tX3N0b3JhZ2Uvc2Vzc2lvbl9zdG9yYWdlX25hbWVzcGFjZV9pbXBsX21vam8uaCIKIAorI2luY2x1ZGUgImJhc2UvYmFycmllcl9jbG9zdXJlLmgiCiAjaW5jbHVkZSAiYmFzZS9iaW5kLmgiCiAjaW5jbHVkZSAiYmFzZS9iaW5kX2hlbHBlcnMuaCIKICNpbmNsdWRlICJiYXNlL2d1aWQuaCIKICNpbmNsdWRlICJiYXNlL21lbW9yeS9wdHJfdXRpbC5oIgogI2luY2x1ZGUgImJhc2UvcnVuX2xvb3AuaCIKKyNpbmNsdWRlICJiYXNlL3Rhc2svcG9zdF90YXNrLmgiCisjaW5jbHVkZSAiYmFzZS90ZXN0L2JpbmRfdGVzdF91dGlsLmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9zZXJ2aWNlcy9sZXZlbGRiL2xldmVsZGJfZGF0YWJhc2VfaW1wbC5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvc2VydmljZXMvbGV2ZWxkYi9wdWJsaWMvY3BwL3V0aWwuaCIKKyNpbmNsdWRlICJjb21wb25lbnRzL3NlcnZpY2VzL3N0b3JhZ2UvZG9tX3N0b3JhZ2UvZG9tX3N0b3JhZ2VfZGF0YWJhc2UuaCIKICNpbmNsdWRlICJjb250ZW50L2Jyb3dzZXIvY2hpbGRfcHJvY2Vzc19zZWN1cml0eV9wb2xpY3lfaW1wbC5oIgogI2luY2x1ZGUgImNvbnRlbnQvYnJvd3Nlci9kb21fc3RvcmFnZS9zZXNzaW9uX3N0b3JhZ2VfZGF0YV9tYXAuaCIKICNpbmNsdWRlICJjb250ZW50L2Jyb3dzZXIvZG9tX3N0b3JhZ2Uvc2Vzc2lvbl9zdG9yYWdlX21ldGFkYXRhLmgiCkBAIC0xNyw3ICsyMiw2IEBACiAjaW5jbHVkZSAiY29udGVudC9icm93c2VyL3NpdGVfaW5zdGFuY2VfaW1wbC5oIgogI2luY2x1ZGUgImNvbnRlbnQvcHVibGljL3Rlc3QvYnJvd3Nlcl90YXNrX2Vudmlyb25tZW50LmgiCiAjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvdGVzdC90ZXN0X2Jyb3dzZXJfY29udGV4dC5oIgotI2luY2x1ZGUgImNvbnRlbnQvdGVzdC9mYWtlX2xldmVsZGJfZGF0YWJhc2UuaCIKICNpbmNsdWRlICJjb250ZW50L3Rlc3QvZ21vY2tfdXRpbC5oIgogI2luY2x1ZGUgIm1vam8vY29yZS9lbWJlZGRlci9lbWJlZGRlci5oIgogI2luY2x1ZGUgIm1vam8vcHVibGljL2NwcC9iaW5kaW5ncy9hc3NvY2lhdGVkX3JlbW90ZS5oIgpAQCAtNTYsMjIgKzYwLDQ2IEBACiAgICAgICAgIHRlc3RfbmFtZXNwYWNlX2lkMl8oYmFzZTo6R2VuZXJhdGVHVUlEKCkpLAogICAgICAgICB0ZXN0X29yaWdpbjFfKHVybDo6T3JpZ2luOjpDcmVhdGUoR1VSTCgiaHR0cHM6Ly9ob3N0MS5jb20vIikpKSwKICAgICAgICAgdGVzdF9vcmlnaW4yXyh1cmw6Ok9yaWdpbjo6Q3JlYXRlKEdVUkwoImh0dHBzOi8vaG9zdDIuY29tLyIpKSksCi0gICAgICAgIHRlc3Rfb3JpZ2luM18odXJsOjpPcmlnaW46OkNyZWF0ZShHVVJMKCJodHRwczovL2hvc3QzLmNvbS8iKSkpLAotICAgICAgICBkYXRhYmFzZV8oJm1vY2tfZGF0YV8pIHt9CisgICAgICAgIHRlc3Rfb3JpZ2luM18odXJsOjpPcmlnaW46OkNyZWF0ZShHVVJMKCJodHRwczovL2hvc3QzLmNvbS8iKSkpIHt9CiAgIH5TZXNzaW9uU3RvcmFnZU5hbWVzcGFjZUltcGxNb2pvVGVzdCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKIAorICB2b2lkIFdyaXRlQmF0Y2goc3RkOjp2ZWN0b3I8bGV2ZWxkYjo6bW9qb206OkJhdGNoZWRPcGVyYXRpb25QdHI+IG9wZXJhdGlvbnMpIHsKKyAgICBiYXNlOjpSdW5Mb29wIGxvb3AoYmFzZTo6UnVuTG9vcDo6VHlwZTo6a05lc3RhYmxlVGFza3NBbGxvd2VkKTsKKyAgICBkYXRhYmFzZV8tPldyaXRlKHN0ZDo6bW92ZShvcGVyYXRpb25zKSwKKyAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmRMYW1iZGFGb3JUZXN0aW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgIFsmXShsZXZlbGRiOjptb2pvbTo6RGF0YWJhc2VFcnJvcikgeyBsb29wLlF1aXQoKTsgfSkpOworICAgIGxvb3AuUnVuKCk7CisgIH0KKwogICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewogICAgIC8vIENyZWF0ZSBhIGRhdGFiYXNlIHRoYXQgYWxyZWFkeSBoYXMgYSBuYW1lc3BhY2Ugc2F2ZWQuCisgICAgYmFzZTo6UnVuTG9vcCBsb29wOworICAgIGRhdGFiYXNlXyA9IGxldmVsZGI6OkxldmVsREJEYXRhYmFzZUltcGw6Ok9wZW5Jbk1lbW9yeSgKKyAgICAgICAgYmFzZTo6bnVsbG9wdCwgIlNlc3Npb25TdG9yYWdlTmFtZXNwYWNlSW1wbE1vam9UZXN0IiwKKyAgICAgICAgYmFzZTo6Q3JlYXRlU2VxdWVuY2VkVGFza1J1bm5lcih7YmFzZTo6TWF5QmxvY2soKSwgYmFzZTo6VGhyZWFkUG9vbCgpfSksCisgICAgICAgIGJhc2U6OkJpbmRMYW1iZGFGb3JUZXN0aW5nKAorICAgICAgICAgICAgWyZdKGxldmVsZGI6Om1vam9tOjpEYXRhYmFzZUVycm9yKSB7IGxvb3AuUXVpdCgpOyB9KSk7CisgICAgbG9vcC5SdW4oKTsKKwogICAgIG1ldGFkYXRhXy5TZXR1cE5ld0RhdGFiYXNlKCk7CiAgICAgc3RkOjp2ZWN0b3I8bGV2ZWxkYjo6bW9qb206OkJhdGNoZWRPcGVyYXRpb25QdHI+IHNhdmVfb3BlcmF0aW9uczsKICAgICBhdXRvIGVudHJ5ID0gbWV0YWRhdGFfLkdldE9yQ3JlYXRlTmFtZXNwYWNlRW50cnkodGVzdF9uYW1lc3BhY2VfaWQxXyk7CiAgICAgYXV0byBtYXBfaWQgPQogICAgICAgICBtZXRhZGF0YV8uUmVnaXN0ZXJOZXdNYXAoZW50cnksIHRlc3Rfb3JpZ2luMV8sICZzYXZlX29wZXJhdGlvbnMpOwogICAgIERDSEVDSyhtYXBfaWQtPktleVByZWZpeCgpID09IFN0ZFN0cmluZ1RvVWludDhWZWN0b3IoIm1hcC0wLSIpKTsKLSAgICBkYXRhYmFzZV8uV3JpdGUoc3RkOjptb3ZlKHNhdmVfb3BlcmF0aW9ucyksIGJhc2U6OkRvTm90aGluZygpKTsKKyAgICBXcml0ZUJhdGNoKHN0ZDo6bW92ZShzYXZlX29wZXJhdGlvbnMpKTsKKwogICAgIC8vIFB1dCBzb21lIGRhdGEgaW4gb25lIG9mIHRoZSBtYXBzLgotICAgIG1vY2tfZGF0YV9bU3RkU3RyaW5nVG9VaW50OFZlY3RvcigibWFwLTAta2V5MSIpXSA9Ci0gICAgICAgIFN0ZFN0cmluZ1RvVWludDhWZWN0b3IoImRhdGExIik7CisgICAgYmFzZTo6UnVuTG9vcCBwdXRfbG9vcDsKKyAgICBkYXRhYmFzZV8tPmRhdGFiYXNlKCkuUG9zdFRhc2tXaXRoVGhpc09iamVjdCgKKyAgICAgICAgRlJPTV9IRVJFLAorICAgICAgICBiYXNlOjpCaW5kTGFtYmRhRm9yVGVzdGluZyhbJl0oY29uc3Qgc3RvcmFnZTo6RG9tU3RvcmFnZURhdGFiYXNlJiBkYikgeworICAgICAgICAgIEFTU0VSVF9UUlVFKGRiLlB1dChTdGRTdHJpbmdUb1VpbnQ4VmVjdG9yKCJtYXAtMC1rZXkxIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0ZFN0cmluZ1RvVWludDhWZWN0b3IoImRhdGExIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5vaygpKTsKKyAgICAgICAgICBwdXRfbG9vcC5RdWl0KCk7CisgICAgICAgIH0pKTsKKyAgICBwdXRfbG9vcC5SdW4oKTsKIAogICAgIGF1dG8qIHNlY3VyaXR5X3BvbGljeSA9IENoaWxkUHJvY2Vzc1NlY3VyaXR5UG9saWN5SW1wbDo6R2V0SW5zdGFuY2UoKTsKICAgICBzZWN1cml0eV9wb2xpY3ktPkFkZChrVGVzdFByb2Nlc3NJZE9yaWdpbjEsICZicm93c2VyX2NvbnRleHRfKTsKQEAgLTEyNyw3ICsxNTUsNyBAQAogICAgIHN0ZDo6dmVjdG9yPGxldmVsZGI6Om1vam9tOjpCYXRjaGVkT3BlcmF0aW9uUHRyPiBzYXZlX29wZXJhdGlvbnM7CiAgICAgYXV0byBtYXBfZGF0YSA9CiAgICAgICAgIG1ldGFkYXRhXy5SZWdpc3Rlck5ld01hcChuYW1lc3BhY2VfZW50cnksIG9yaWdpbiwgJnNhdmVfb3BlcmF0aW9ucyk7Ci0gICAgZGF0YWJhc2VfLldyaXRlKHN0ZDo6bW92ZShzYXZlX29wZXJhdGlvbnMpLCBiYXNlOjpEb05vdGhpbmcoKSk7CisgICAgV3JpdGVCYXRjaChzdGQ6Om1vdmUoc2F2ZV9vcGVyYXRpb25zKSk7CiAgICAgcmV0dXJuIG1hcF9kYXRhOwogICB9CiAKQEAgLTE0MSwxNyArMTY5LDE4IEBACiAgICAgICAgIG1ldGFkYXRhXy5HZXRPckNyZWF0ZU5hbWVzcGFjZUVudHJ5KGRlc3RpbmF0aW9uX25hbWVzcGFjZSk7CiAgICAgbWV0YWRhdGFfLlJlZ2lzdGVyU2hhbGxvd0Nsb25lZE5hbWVzcGFjZShzb3VyY2VfbmFtZXNwYWNlLCBuYW1lc3BhY2VfZW50cnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2F2ZV9vcGVyYXRpb25zKTsKLSAgICBkYXRhYmFzZV8uV3JpdGUoc3RkOjptb3ZlKHNhdmVfb3BlcmF0aW9ucyksIGJhc2U6OkRvTm90aGluZygpKTsKKyAgICBXcml0ZUJhdGNoKHN0ZDo6bW92ZShzYXZlX29wZXJhdGlvbnMpKTsKIAogICAgIGF1dG8gaXQgPSBuYW1lc3BhY2VzXy5maW5kKGRlc3RpbmF0aW9uX25hbWVzcGFjZSk7CiAgICAgaWYgKGl0ID09IG5hbWVzcGFjZXNfLmVuZCgpKSB7CiAgICAgICBhdXRvKiBuYW1lc3BhY2VfaW1wbCA9CiAgICAgICAgICAgQ3JlYXRlU2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2VJbXBsTW9qbyhkZXN0aW5hdGlvbl9uYW1lc3BhY2UpOwotICAgICAgbmFtZXNwYWNlX2ltcGwtPlBvcHVsYXRlQXNDbG9uZSgmZGF0YWJhc2VfLCBuYW1lc3BhY2VfZW50cnksCisgICAgICBuYW1lc3BhY2VfaW1wbC0+UG9wdWxhdGVBc0Nsb25lKGRhdGFiYXNlXy5nZXQoKSwgbmFtZXNwYWNlX2VudHJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmVhc190b19jbG9uZSk7CiAgICAgICByZXR1cm47CiAgICAgfQotICAgIGl0LT5zZWNvbmQtPlBvcHVsYXRlQXNDbG9uZSgmZGF0YWJhc2VfLCBuYW1lc3BhY2VfZW50cnksIGFyZWFzX3RvX2Nsb25lKTsKKyAgICBpdC0+c2Vjb25kLT5Qb3B1bGF0ZUFzQ2xvbmUoZGF0YWJhc2VfLmdldCgpLCBuYW1lc3BhY2VfZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZWFzX3RvX2Nsb25lKTsKICAgfQogCiAgIHNjb3BlZF9yZWZwdHI8U2Vzc2lvblN0b3JhZ2VEYXRhTWFwPiBNYXliZUdldEV4aXN0aW5nRGF0YU1hcEZvcklkKApAQCAtMTc5LDggKzIwOCw3IEBACiAgICAgICBkYXRhX21hcHNfOwogCiAgIHRlc3Rpbmc6OlN0cmljdE1vY2s8TW9ja0xpc3RlbmVyPiBsaXN0ZW5lcl87Ci0gIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gbW9ja19kYXRhXzsKLSAgRmFrZUxldmVsREJEYXRhYmFzZSBkYXRhYmFzZV87CisgIHN0ZDo6dW5pcXVlX3B0cjxsZXZlbGRiOjpMZXZlbERCRGF0YWJhc2VJbXBsPiBkYXRhYmFzZV87CiB9OwogCiBURVNUX0YoU2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2VJbXBsTW9qb1Rlc3QsIE1ldGFkYXRhTG9hZCkgewpAQCAtMTkzLDcgKzIyMSw4IEBACiAgICAgICAuVGltZXMoMSk7CiAKICAgbmFtZXNwYWNlX2ltcGwtPlBvcHVsYXRlRnJvbU1ldGFkYXRhKAotICAgICAgJmRhdGFiYXNlXywgbWV0YWRhdGFfLkdldE9yQ3JlYXRlTmFtZXNwYWNlRW50cnkodGVzdF9uYW1lc3BhY2VfaWQxXykpOworICAgICAgZGF0YWJhc2VfLmdldCgpLAorICAgICAgbWV0YWRhdGFfLkdldE9yQ3JlYXRlTmFtZXNwYWNlRW50cnkodGVzdF9uYW1lc3BhY2VfaWQxXykpOwogCiAgIG1vam86OlJlbW90ZTxibGluazo6bW9qb206OlNlc3Npb25TdG9yYWdlTmFtZXNwYWNlPiBzc19uYW1lc3BhY2U7CiAgIG5hbWVzcGFjZV9pbXBsLT5CaW5kKHNzX25hbWVzcGFjZS5CaW5kTmV3UGlwZUFuZFBhc3NSZWNlaXZlcigpLApAQCAtMjI2LDcgKzI1NSw4IEBACiAgICAgICAuVGltZXMoMSk7CiAKICAgbmFtZXNwYWNlX2ltcGwtPlBvcHVsYXRlRnJvbU1ldGFkYXRhKAotICAgICAgJmRhdGFiYXNlXywgbWV0YWRhdGFfLkdldE9yQ3JlYXRlTmFtZXNwYWNlRW50cnkodGVzdF9uYW1lc3BhY2VfaWQxXykpOworICAgICAgZGF0YWJhc2VfLmdldCgpLAorICAgICAgbWV0YWRhdGFfLkdldE9yQ3JlYXRlTmFtZXNwYWNlRW50cnkodGVzdF9uYW1lc3BhY2VfaWQxXykpOwogCiAgIG1vam86OlJlbW90ZTxibGluazo6bW9qb206OlNlc3Npb25TdG9yYWdlTmFtZXNwYWNlPiBzc19uYW1lc3BhY2U7CiAgIG5hbWVzcGFjZV9pbXBsLT5CaW5kKHNzX25hbWVzcGFjZS5CaW5kTmV3UGlwZUFuZFBhc3NSZWNlaXZlcigpLApAQCAtMjM2LDkgKzI2NiwxMyBAQAogICBzc19uYW1lc3BhY2UtPk9wZW5BcmVhKHRlc3Rfb3JpZ2luMV8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxkYl8xLkJpbmROZXdFbmRwb2ludEFuZFBhc3NSZWNlaXZlcigpKTsKIAotICBFWFBFQ1RfQ0FMTChsaXN0ZW5lcl8sIE9uQ29tbWl0UmVzdWx0KERhdGFiYXNlRXJyb3I6Ok9LKSkuVGltZXMoMSk7CisgIGJhc2U6OlJ1bkxvb3AgY29tbWl0X2xvb3A7CisgIEVYUEVDVF9DQUxMKGxpc3RlbmVyXywgT25Db21taXRSZXN1bHQoRGF0YWJhc2VFcnJvcjo6T0spKQorICAgICAgLlRpbWVzKDEpCisgICAgICAuV2lsbE9uY2UodGVzdGluZzo6SW52b2tlKFsmXShhdXRvIGVycm9yKSB7IGNvbW1pdF9sb29wLlF1aXQoKTsgfSkpOwogICB0ZXN0OjpQdXRTeW5jKGxldmVsZGJfMS5nZXQoKSwgU3RkU3RyaW5nVG9VaW50OFZlY3Rvcigia2V5MiIpLAogICAgICAgICAgICAgICAgIFN0ZFN0cmluZ1RvVWludDhWZWN0b3IoImRhdGEyIiksIGJhc2U6Om51bGxvcHQsICIiKTsKKyAgY29tbWl0X2xvb3AuUnVuKCk7CiAKICAgc3RkOjp2ZWN0b3I8Ymxpbms6Om1vam9tOjpLZXlWYWx1ZVB0cj4gZGF0YTsKICAgRVhQRUNUX1RSVUUodGVzdDo6R2V0QWxsU3luYyhsZXZlbGRiXzEuZ2V0KCksICZkYXRhKSk7CkBAIC0yNTIsNiArMjg2LDcgQEAKIAogICBFWFBFQ1RfQ0FMTChsaXN0ZW5lcl8sIE9uRGF0YU1hcERlc3RydWN0aW9uKFN0ZFN0cmluZ1RvVWludDhWZWN0b3IoIjAiKSkpCiAgICAgICAuVGltZXMoMSk7CisKICAgbmFtZXNwYWNlc18uY2xlYXIoKTsKIH0KIApAQCAtMjY3LDcgKzMwMiw4IEBACiAgICAgICAuVGltZXMoMSk7CiAKICAgbmFtZXNwYWNlX2ltcGwxLT5Qb3B1bGF0ZUZyb21NZXRhZGF0YSgKLSAgICAgICZkYXRhYmFzZV8sIG1ldGFkYXRhXy5HZXRPckNyZWF0ZU5hbWVzcGFjZUVudHJ5KHRlc3RfbmFtZXNwYWNlX2lkMV8pKTsKKyAgICAgIGRhdGFiYXNlXy5nZXQoKSwKKyAgICAgIG1ldGFkYXRhXy5HZXRPckNyZWF0ZU5hbWVzcGFjZUVudHJ5KHRlc3RfbmFtZXNwYWNlX2lkMV8pKTsKIAogICBtb2pvOjpSZW1vdGU8Ymxpbms6Om1vam9tOjpTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZT4gc3NfbmFtZXNwYWNlMTsKICAgbmFtZXNwYWNlX2ltcGwxLT5CaW5kKHNzX25hbWVzcGFjZTEuQmluZE5ld1BpcGVBbmRQYXNzUmVjZWl2ZXIoKSwKQEAgLTI4NSwxMiArMzIxLDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsZGJfMi5CaW5kTmV3RW5kcG9pbnRBbmRQYXNzUmVjZWl2ZXIoKSk7CiAKICAgLy8gRG8gYSBwdXQgaW4gdGhlIGNsb25lZCBuYW1lc3BhY2UuCi0gIEVYUEVDVF9DQUxMKGxpc3RlbmVyXywgT25Db21taXRSZXN1bHQoRGF0YWJhc2VFcnJvcjo6T0spKS5UaW1lcygyKTsKKyAgYmFzZTo6UnVuTG9vcCBjb21taXRfbG9vcDsKKyAgYXV0byBjb21taXRfY2FsbGJhY2sgPSBiYXNlOjpCYXJyaWVyQ2xvc3VyZSgyLCBjb21taXRfbG9vcC5RdWl0Q2xvc3VyZSgpKTsKKyAgRVhQRUNUX0NBTEwobGlzdGVuZXJfLCBPbkNvbW1pdFJlc3VsdChEYXRhYmFzZUVycm9yOjpPSykpCisgICAgICAuVGltZXMoMikKKyAgICAgIC5XaWxsUmVwZWF0ZWRseSgKKyAgICAgICAgICB0ZXN0aW5nOjpJbnZva2UoWyZdKGF1dG8gZXJyb3IpIHsgY29tbWl0X2NhbGxiYWNrLlJ1bigpOyB9KSk7CiAgIEVYUEVDVF9DQUxMKGxpc3RlbmVyXywKICAgICAgICAgICAgICAgT25EYXRhTWFwQ3JlYXRpb24oU3RkU3RyaW5nVG9VaW50OFZlY3RvcigiMSIpLCB0ZXN0aW5nOjpfKSkKICAgICAgIC5UaW1lcygxKTsKICAgdGVzdDo6UHV0U3luYyhsZXZlbGRiXzIuZ2V0KCksIFN0ZFN0cmluZ1RvVWludDhWZWN0b3IoImtleTIiKSwKICAgICAgICAgICAgICAgICBTdGRTdHJpbmdUb1VpbnQ4VmVjdG9yKCJkYXRhMiIpLCBiYXNlOjpudWxsb3B0LCAiIik7CisgIGNvbW1pdF9sb29wLlJ1bigpOwogCiAgIHN0ZDo6dmVjdG9yPGJsaW5rOjptb2pvbTo6S2V5VmFsdWVQdHI+IGRhdGE7CiAgIEVYUEVDVF9UUlVFKHRlc3Q6OkdldEFsbFN5bmMobGV2ZWxkYl8yLmdldCgpLCAmZGF0YSkpOwpAQCAtMzIzLDcgKzM2NSw4IEBACiAgICAgICAuVGltZXMoMSk7CiAKICAgbmFtZXNwYWNlX2ltcGwxLT5Qb3B1bGF0ZUZyb21NZXRhZGF0YSgKLSAgICAgICZkYXRhYmFzZV8sIG1ldGFkYXRhXy5HZXRPckNyZWF0ZU5hbWVzcGFjZUVudHJ5KHRlc3RfbmFtZXNwYWNlX2lkMV8pKTsKKyAgICAgIGRhdGFiYXNlXy5nZXQoKSwKKyAgICAgIG1ldGFkYXRhXy5HZXRPckNyZWF0ZU5hbWVzcGFjZUVudHJ5KHRlc3RfbmFtZXNwYWNlX2lkMV8pKTsKIAogICBtb2pvOjpSZW1vdGU8Ymxpbms6Om1vam9tOjpTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZT4gc3NfbmFtZXNwYWNlMTsKICAgbmFtZXNwYWNlX2ltcGwxLT5CaW5kKHNzX25hbWVzcGFjZTEuQmluZE5ld1BpcGVBbmRQYXNzUmVjZWl2ZXIoKSwKQEAgLTM1Myw5ICszOTYsMTMgQEAKICAgQVNTRVJUX1RSVUUobmFtZXNwYWNlX2ltcGwyLT5Jc1BvcHVsYXRlZCgpKTsKIAogICAvLyBEbyBhIHB1dCBpbiB0aGUgY2xvbmVkIG5hbWVzcGFjZS4KLSAgRVhQRUNUX0NBTEwobGlzdGVuZXJfLCBPbkNvbW1pdFJlc3VsdChEYXRhYmFzZUVycm9yOjpPSykpLlRpbWVzKDEpOworICBiYXNlOjpSdW5Mb29wIGNvbW1pdF9sb29wOworICBFWFBFQ1RfQ0FMTChsaXN0ZW5lcl8sIE9uQ29tbWl0UmVzdWx0KERhdGFiYXNlRXJyb3I6Ok9LKSkKKyAgICAgIC5UaW1lcygxKQorICAgICAgLldpbGxPbmNlKHRlc3Rpbmc6Okludm9rZShbJl0oYXV0byBlcnJvcikgeyBjb21taXRfbG9vcC5RdWl0KCk7IH0pKTsKICAgdGVzdDo6UHV0U3luYyhsZXZlbGRiX24yX28yLmdldCgpLCBTdGRTdHJpbmdUb1VpbnQ4VmVjdG9yKCJrZXkyIiksCiAgICAgICAgICAgICAgICAgU3RkU3RyaW5nVG9VaW50OFZlY3RvcigiZGF0YTIiKSwgYmFzZTo6bnVsbG9wdCwgIiIpOworICBjb21taXRfbG9vcC5SdW4oKTsKIAogICBzdGQ6OnZlY3RvcjxibGluazo6bW9qb206OktleVZhbHVlUHRyPiBkYXRhOwogICBFWFBFQ1RfVFJVRSh0ZXN0OjpHZXRBbGxTeW5jKGxldmVsZGJfbjJfbzEuZ2V0KCksICZkYXRhKSk7CkBAIC0zODcsNyArNDM0LDggQEAKICAgICAgIC5UaW1lcygxKTsKIAogICBuYW1lc3BhY2VfaW1wbC0+UG9wdWxhdGVGcm9tTWV0YWRhdGEoCi0gICAgICAmZGF0YWJhc2VfLCBtZXRhZGF0YV8uR2V0T3JDcmVhdGVOYW1lc3BhY2VFbnRyeSh0ZXN0X25hbWVzcGFjZV9pZDFfKSk7CisgICAgICBkYXRhYmFzZV8uZ2V0KCksCisgICAgICBtZXRhZGF0YV8uR2V0T3JDcmVhdGVOYW1lc3BhY2VFbnRyeSh0ZXN0X25hbWVzcGFjZV9pZDFfKSk7CiAKICAgbW9qbzo6UmVtb3RlPGJsaW5rOjptb2pvbTo6U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2U+IHNzX25hbWVzcGFjZTsKICAgbmFtZXNwYWNlX2ltcGwtPkJpbmQoc3NfbmFtZXNwYWNlLkJpbmROZXdQaXBlQW5kUGFzc1JlY2VpdmVyKCksCkBAIC00MDksOCArNDU3LDEyIEBACiAgIEVYUEVDVF9DQUxMKG1vY2tfb2JzZXJ2ZXIsIEFsbERlbGV0ZWQoIlxuIikpCiAgICAgICAuV2lsbE9uY2UoYmFzZTo6dGVzdDo6UnVuQ2xvc3VyZShsb29wLlF1aXRDbG9zdXJlKCkpKTsKIAotICBFWFBFQ1RfQ0FMTChsaXN0ZW5lcl8sIE9uQ29tbWl0UmVzdWx0KERhdGFiYXNlRXJyb3I6Ok9LKSkuVGltZXMoMSk7CisgIGJhc2U6OlJ1bkxvb3AgY29tbWl0X2xvb3A7CisgIEVYUEVDVF9DQUxMKGxpc3RlbmVyXywgT25Db21taXRSZXN1bHQoRGF0YWJhc2VFcnJvcjo6T0spKQorICAgICAgLlRpbWVzKDEpCisgICAgICAuV2lsbE9uY2UodGVzdGluZzo6SW52b2tlKFsmXShhdXRvIGVycm9yKSB7IGNvbW1pdF9sb29wLlF1aXQoKTsgfSkpOwogICBuYW1lc3BhY2VfaW1wbC0+UmVtb3ZlT3JpZ2luRGF0YSh0ZXN0X29yaWdpbjFfLCBiYXNlOjpEb05vdGhpbmcoKSk7CisgIGNvbW1pdF9sb29wLlJ1bigpOwogCiAgIHN0ZDo6dmVjdG9yPGJsaW5rOjptb2pvbTo6S2V5VmFsdWVQdHI+IGRhdGE7CiAgIEVYUEVDVF9UUlVFKHRlc3Q6OkdldEFsbFN5bmMobGV2ZWxkYl8xLmdldCgpLCAmZGF0YSkpOwpAQCAtNDMzLDcgKzQ4NSw4IEBACiAgICAgICAuVGltZXMoMSk7CiAKICAgbmFtZXNwYWNlX2ltcGwtPlBvcHVsYXRlRnJvbU1ldGFkYXRhKAotICAgICAgJmRhdGFiYXNlXywgbWV0YWRhdGFfLkdldE9yQ3JlYXRlTmFtZXNwYWNlRW50cnkodGVzdF9uYW1lc3BhY2VfaWQxXykpOworICAgICAgZGF0YWJhc2VfLmdldCgpLAorICAgICAgbWV0YWRhdGFfLkdldE9yQ3JlYXRlTmFtZXNwYWNlRW50cnkodGVzdF9uYW1lc3BhY2VfaWQxXykpOwogCiAgIGJhc2U6OlJ1bkxvb3AgbG9vcDsKICAgRVhQRUNUX0NBTEwobGlzdGVuZXJfLCBPbkNvbW1pdFJlc3VsdChEYXRhYmFzZUVycm9yOjpPSykpCkBAIC00NTcsNyArNTEwLDggQEAKICAgICAgIC5UaW1lcygxKTsKIAogICBuYW1lc3BhY2VfaW1wbC0+UG9wdWxhdGVGcm9tTWV0YWRhdGEoCi0gICAgICAmZGF0YWJhc2VfLCBtZXRhZGF0YV8uR2V0T3JDcmVhdGVOYW1lc3BhY2VFbnRyeSh0ZXN0X25hbWVzcGFjZV9pZDFfKSk7CisgICAgICBkYXRhYmFzZV8uZ2V0KCksCisgICAgICBtZXRhZGF0YV8uR2V0T3JDcmVhdGVOYW1lc3BhY2VFbnRyeSh0ZXN0X25hbWVzcGFjZV9pZDFfKSk7CiAKICAgbW9qbzo6UmVtb3RlPGJsaW5rOjptb2pvbTo6U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2U+IHNzX25hbWVzcGFjZTsKICAgbmFtZXNwYWNlX2ltcGwtPkJpbmQoc3NfbmFtZXNwYWNlLkJpbmROZXdQaXBlQW5kUGFzc1JlY2VpdmVyKCksCkBAIC00ODQsNyArNTM4LDggQEAKICAgICAgIC5UaW1lcygxKTsKIAogICBuYW1lc3BhY2VfaW1wbC0+UG9wdWxhdGVGcm9tTWV0YWRhdGEoCi0gICAgICAmZGF0YWJhc2VfLCBtZXRhZGF0YV8uR2V0T3JDcmVhdGVOYW1lc3BhY2VFbnRyeSh0ZXN0X25hbWVzcGFjZV9pZDFfKSk7CisgICAgICBkYXRhYmFzZV8uZ2V0KCksCisgICAgICBtZXRhZGF0YV8uR2V0T3JDcmVhdGVOYW1lc3BhY2VFbnRyeSh0ZXN0X25hbWVzcGFjZV9pZDFfKSk7CiAKICAgbW9qbzo6UmVtb3RlPGJsaW5rOjptb2pvbTo6U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2U+IHNzX25hbWVzcGFjZTsKICAgbmFtZXNwYWNlX2ltcGwtPkJpbmQoc3NfbmFtZXNwYWNlLkJpbmROZXdQaXBlQW5kUGFzc1JlY2VpdmVyKCksCkBAIC01MTcsNyArNTcyLDggQEAKICAgICAgIC5UaW1lcygxKTsKIAogICBuYW1lc3BhY2VfaW1wbC0+UG9wdWxhdGVGcm9tTWV0YWRhdGEoCi0gICAgICAmZGF0YWJhc2VfLCBtZXRhZGF0YV8uR2V0T3JDcmVhdGVOYW1lc3BhY2VFbnRyeSh0ZXN0X25hbWVzcGFjZV9pZDFfKSk7CisgICAgICBkYXRhYmFzZV8uZ2V0KCksCisgICAgICBtZXRhZGF0YV8uR2V0T3JDcmVhdGVOYW1lc3BhY2VFbnRyeSh0ZXN0X25hbWVzcGFjZV9pZDFfKSk7CiAKICAgbW9qbzo6UmVtb3RlPGJsaW5rOjptb2pvbTo6U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2U+IHNzX25hbWVzcGFjZV9vMTsKICAgbmFtZXNwYWNlX2ltcGwtPkJpbmQoc3NfbmFtZXNwYWNlX28xLkJpbmROZXdQaXBlQW5kUGFzc1JlY2VpdmVyKCksCkBAIC01NjEsNyArNjE3LDggQEAKICAgICAgIC5XaWxsT25jZSh0ZXN0aW5nOjpTYXZlQXJnPDE+KCZkYXRhX21hcCkpOwogCiAgIG5hbWVzcGFjZV9pbXBsLT5Qb3B1bGF0ZUZyb21NZXRhZGF0YSgKLSAgICAgICZkYXRhYmFzZV8sIG1ldGFkYXRhXy5HZXRPckNyZWF0ZU5hbWVzcGFjZUVudHJ5KHRlc3RfbmFtZXNwYWNlX2lkMV8pKTsKKyAgICAgIGRhdGFiYXNlXy5nZXQoKSwKKyAgICAgIG1ldGFkYXRhXy5HZXRPckNyZWF0ZU5hbWVzcGFjZUVudHJ5KHRlc3RfbmFtZXNwYWNlX2lkMV8pKTsKIAogICBtb2pvOjpSZW1vdGU8Ymxpbms6Om1vam9tOjpTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZT4gc3NfbmFtZXNwYWNlOwogICBuYW1lc3BhY2VfaW1wbC0+QmluZChzc19uYW1lc3BhY2UuQmluZE5ld1BpcGVBbmRQYXNzUmVjZWl2ZXIoKSwKZGlmZiAtLWdpdCBhL2NvbnRlbnQvYnJvd3Nlci9kb21fc3RvcmFnZS9zdG9yYWdlX2FyZWFfaW1wbC5jYyBiL2NvbnRlbnQvYnJvd3Nlci9kb21fc3RvcmFnZS9zdG9yYWdlX2FyZWFfaW1wbC5jYwppbmRleCA3YjNjZWVjLi5lNDA1YjAxIDEwMDY0NAotLS0gYS9jb250ZW50L2Jyb3dzZXIvZG9tX3N0b3JhZ2Uvc3RvcmFnZV9hcmVhX2ltcGwuY2MKKysrIGIvY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL3N0b3JhZ2VfYXJlYV9pbXBsLmNjCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX3Rhc2tfcnVubmVyX2hhbmRsZS5oIgogI2luY2x1ZGUgImJhc2UvdHJhY2VfZXZlbnQvbWVtb3J5X2R1bXBfbWFuYWdlci5oIgogI2luY2x1ZGUgImJhc2UvdHJhY2VfZXZlbnQvcHJvY2Vzc19tZW1vcnlfZHVtcC5oIgorI2luY2x1ZGUgImNvbXBvbmVudHMvc2VydmljZXMvbGV2ZWxkYi9sZXZlbGRiX2RhdGFiYXNlX2ltcGwuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL3NlcnZpY2VzL2xldmVsZGIvcHVibGljL2NwcC91dGlsLmgiCiAjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvYnJvd3Nlci9icm93c2VyX3RocmVhZC5oIgogI2luY2x1ZGUgIm1vam8vcHVibGljL2NwcC9iaW5kaW5ncy9hc3NvY2lhdGVkX3JlbW90ZS5oIgpAQCAtNTgsNyArNTksNyBAQAogU3RvcmFnZUFyZWFJbXBsOjpDb21taXRCYXRjaDo6Q29tbWl0QmF0Y2goKSA6IGNsZWFyX2FsbF9maXJzdChmYWxzZSkge30KIFN0b3JhZ2VBcmVhSW1wbDo6Q29tbWl0QmF0Y2g6On5Db21taXRCYXRjaCgpIHt9CiAKLVN0b3JhZ2VBcmVhSW1wbDo6U3RvcmFnZUFyZWFJbXBsKGxldmVsZGI6Om1vam9tOjpMZXZlbERCRGF0YWJhc2UqIGRhdGFiYXNlLAorU3RvcmFnZUFyZWFJbXBsOjpTdG9yYWdlQXJlYUltcGwobGV2ZWxkYjo6TGV2ZWxEQkRhdGFiYXNlSW1wbCogZGF0YWJhc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVsZWdhdGUqIGRlbGVnYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykKQEAgLTY3LDcgKzY4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZSwKICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zKSB7fQogCi1TdG9yYWdlQXJlYUltcGw6OlN0b3JhZ2VBcmVhSW1wbChsZXZlbGRiOjptb2pvbTo6TGV2ZWxEQkRhdGFiYXNlKiBkYXRhYmFzZSwKK1N0b3JhZ2VBcmVhSW1wbDo6U3RvcmFnZUFyZWFJbXBsKGxldmVsZGI6OkxldmVsREJEYXRhYmFzZUltcGwqIGRhdGFiYXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVsZWdhdGUqIGRlbGVnYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykKZGlmZiAtLWdpdCBhL2NvbnRlbnQvYnJvd3Nlci9kb21fc3RvcmFnZS9zdG9yYWdlX2FyZWFfaW1wbC5oIGIvY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL3N0b3JhZ2VfYXJlYV9pbXBsLmgKaW5kZXggNWE1NGM2Yi4uMjhiYzAzOSAxMDA2NDQKLS0tIGEvY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL3N0b3JhZ2VfYXJlYV9pbXBsLmgKKysrIGIvY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL3N0b3JhZ2VfYXJlYV9pbXBsLmgKQEAgLTI5LDExICsyOSwxNSBAQAogfQogfSAgLy8gbmFtZXNwYWNlIGJhc2UKIAorbmFtZXNwYWNlIGxldmVsZGIgeworY2xhc3MgTGV2ZWxEQkRhdGFiYXNlSW1wbDsKK30KKwogbmFtZXNwYWNlIGNvbnRlbnQgewogCi0vLyBUaGlzIGlzIGEgd3JhcHBlciBhcm91bmQgYSBsZXZlbGRiOjptb2pvbTo6TGV2ZWxEQkRhdGFiYXNlLiBNdWx0aXBsZQotLy8gaW50ZXJmYWNlIHBvaW50ZXJzIGNhbiBiZSBib3VuZCB0byB0aGUgc2FtZSBvYmplY3QuIFRoZSB3cmFwcGVyIGFkZHMgYSBjb3VwbGUKLS8vIG9mIGZlYXR1cmVzIG5vdCBmb3VuZCBkaXJlY3RseSBpbiBsZXZlbGRiLgorLy8gVGhpcyBpcyBhIHdyYXBwZXIgYXJvdW5kIGEgbGV2ZWxkYjo6TGV2ZWxEQkRhdGFiYXNlSW1wbC4gTXVsdGlwbGUgaW50ZXJmYWNlCisvLyBlbmRwb2ludHMgY2FuIGJlIGJvdW5kIHRvIHRoZSBzYW1lIG9iamVjdC4gVGhlIHdyYXBwZXIgYWRkcyBhIGNvdXBsZSBvZgorLy8gZmVhdHVyZXMgbm90IGZvdW5kIGRpcmVjdGx5IGluIGxldmVsZGI6CiAvLyAxKSBBZGRzIHRoZSBnaXZlbiBwcmVmaXgsIGlmIGFueSwgdG8gYWxsIGtleXMuIFRoaXMgYWxsb3dzIHRoZSBzaGFyaW5nIG9mIG9uZQogLy8gICAgZGF0YWJhc2UgYWNyb3NzIG1hbnksIHBvc3NpYmx5IHVudHJ1c3RlZCwgY29uc3VtZXJzIGFuZCBlbnN1cmluZyB0aGF0IHRoZXkKIC8vICAgIGNhbid0IGFjY2VzcyBlYWNoIG90aGVyJ3MgdmFsdWVzLgpAQCAtOTEsMTEgKzk1LDExIEBACiAKICAgLy8gfERlbGVnYXRlOjpPbk5vQmluZGluZ3N8IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhpcyBvYmplY3QgaGFzIG5vIG1vcmUKICAgLy8gYmluZGluZ3MgYW5kIGFsbCBwZW5kaW5nIG1vZGlmaWNhdGlvbnMgaGF2ZSBiZWVuIHByb2Nlc3NlZC4KLSAgU3RvcmFnZUFyZWFJbXBsKGxldmVsZGI6Om1vam9tOjpMZXZlbERCRGF0YWJhc2UqIGRhdGFiYXNlLAorICBTdG9yYWdlQXJlYUltcGwobGV2ZWxkYjo6TGV2ZWxEQkRhdGFiYXNlSW1wbCogZGF0YWJhc2UsCiAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHJlZml4LAogICAgICAgICAgICAgICAgICAgRGVsZWdhdGUqIGRlbGVnYXRlLAogICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7Ci0gIFN0b3JhZ2VBcmVhSW1wbChsZXZlbGRiOjptb2pvbTo6TGV2ZWxEQkRhdGFiYXNlKiBkYXRhYmFzZSwKKyAgU3RvcmFnZUFyZWFJbXBsKGxldmVsZGI6OkxldmVsREJEYXRhYmFzZUltcGwqIGRhdGFiYXNlLAogICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcHJlZml4LAogICAgICAgICAgICAgICAgICAgRGVsZWdhdGUqIGRlbGVnYXRlLAogICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CkBAIC0xNTIsNyArMTU2LDcgQEAKIAogICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcHJlZml4KCkgeyByZXR1cm4gcHJlZml4XzsgfQogCi0gIGxldmVsZGI6Om1vam9tOjpMZXZlbERCRGF0YWJhc2UqIGRhdGFiYXNlKCkgeyByZXR1cm4gZGF0YWJhc2VfOyB9CisgIGxldmVsZGI6OkxldmVsREJEYXRhYmFzZUltcGwqIGRhdGFiYXNlKCkgeyByZXR1cm4gZGF0YWJhc2VfOyB9CiAKICAgLy8gQ29tbWVuY2UgYWdncmVzc2l2ZSBmbHVzaGluZy4gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGVhcmx5IGR1cmluZyBzdGFydHVwLAogICAvLyBiZWZvcmUgYW55IGxvY2FsU3RvcmFnZSB3cml0aW5nLiBDdXJyZW50bHkgc2NoZWR1bGVkIHdyaXRlcyB3aWxsIG5vdCBiZQpAQCAtMzIyLDcgKzMyNiw3IEBACiAgIG1vam86OlJlY2VpdmVyU2V0PGJsaW5rOjptb2pvbTo6U3RvcmFnZUFyZWE+IHJlY2VpdmVyc187CiAgIG1vam86OkFzc29jaWF0ZWRSZW1vdGVTZXQ8Ymxpbms6Om1vam9tOjpTdG9yYWdlQXJlYU9ic2VydmVyPiBvYnNlcnZlcnNfOwogICBEZWxlZ2F0ZSogZGVsZWdhdGVfOwotICBsZXZlbGRiOjptb2pvbTo6TGV2ZWxEQkRhdGFiYXNlKiBkYXRhYmFzZV87CisgIGxldmVsZGI6OkxldmVsREJEYXRhYmFzZUltcGwqIGRhdGFiYXNlXzsKIAogICAvLyBGb3IgY29tbWl0cyB0byB3b3JrIGNvcnJlY3RseSB0aGUgbWFwIGxvYWRlZCBzdGF0ZSAoa2V5cyB2cyBrZXlzICYgdmFsdWVzKQogICAvLyBtdXN0IHN0YXkgY29uc2lzdGVudCBmb3IgYSBnaXZlbiBjb21taXQgYmF0Y2guCmRpZmYgLS1naXQgYS9jb250ZW50L2Jyb3dzZXIvZG9tX3N0b3JhZ2Uvc3RvcmFnZV9hcmVhX2ltcGxfdW5pdHRlc3QuY2MgYi9jb250ZW50L2Jyb3dzZXIvZG9tX3N0b3JhZ2Uvc3RvcmFnZV9hcmVhX2ltcGxfdW5pdHRlc3QuY2MKaW5kZXggYWQ3OTlmOTUuLjk2M2RiNjUgMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvYnJvd3Nlci9kb21fc3RvcmFnZS9zdG9yYWdlX2FyZWFfaW1wbF91bml0dGVzdC5jYworKysgYi9jb250ZW50L2Jyb3dzZXIvZG9tX3N0b3JhZ2Uvc3RvcmFnZV9hcmVhX2ltcGxfdW5pdHRlc3QuY2MKQEAgLTcsMTkgKzcsMjIgQEAKICNpbmNsdWRlICJiYXNlL2F0b21pY19yZWZfY291bnQuaCIKICNpbmNsdWRlICJiYXNlL2JpbmQuaCIKICNpbmNsdWRlICJiYXNlL2JpbmRfaGVscGVycy5oIgorI2luY2x1ZGUgImJhc2UvY29udGFpbmVycy9zcGFuLmgiCiAjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcHRyX3V0aWwuaCIKICNpbmNsdWRlICJiYXNlL3J1bl9sb29wLmgiCiAjaW5jbHVkZSAiYmFzZS9zdHJpbmdzL3N0cmluZ19udW1iZXJfY29udmVyc2lvbnMuaCIKICNpbmNsdWRlICJiYXNlL3Rhc2svcG9zdF90YXNrLmgiCiAjaW5jbHVkZSAiYmFzZS90YXNrX3J1bm5lcl91dGlsLmgiCisjaW5jbHVkZSAiYmFzZS90ZXN0L2JpbmRfdGVzdF91dGlsLmgiCiAjaW5jbHVkZSAiYmFzZS90ZXN0L3Rlc3Rfc2ltcGxlX3Rhc2tfcnVubmVyLmgiCiAjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkLmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9zZXJ2aWNlcy9sZXZlbGRiL2xldmVsZGJfZGF0YWJhc2VfaW1wbC5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvc2VydmljZXMvbGV2ZWxkYi9wdWJsaWMvY3BwL3V0aWwuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL3NlcnZpY2VzL2xldmVsZGIvcHVibGljL21vam9tL2xldmVsZGIubW9qb20uaCIKKyNpbmNsdWRlICJjb21wb25lbnRzL3NlcnZpY2VzL3N0b3JhZ2UvZG9tX3N0b3JhZ2UvZG9tX3N0b3JhZ2VfZGF0YWJhc2UuaCIKICNpbmNsdWRlICJjb250ZW50L2Jyb3dzZXIvZG9tX3N0b3JhZ2UvdGVzdC9zdG9yYWdlX2FyZWFfdGVzdF91dGlsLmgiCiAjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvdGVzdC9icm93c2VyX3Rhc2tfZW52aXJvbm1lbnQuaCIKICNpbmNsdWRlICJjb250ZW50L3Rlc3QvYmFycmllcl9idWlsZGVyLmgiCi0jaW5jbHVkZSAiY29udGVudC90ZXN0L2Zha2VfbGV2ZWxkYl9kYXRhYmFzZS5oIgogI2luY2x1ZGUgIm1vam8vcHVibGljL2NwcC9iaW5kaW5ncy9hc3NvY2lhdGVkX3JlY2VpdmVyLmgiCiAjaW5jbHVkZSAibW9qby9wdWJsaWMvY3BwL2JpbmRpbmdzL3JlbW90ZS5oIgogI2luY2x1ZGUgInRlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay5oIgpAQCAtNDAsOCArNDMsOCBAQAogICByZXR1cm4gbGV2ZWxkYjo6VWludDhWZWN0b3JUb1N0ZFN0cmluZyhpbnB1dCk7CiB9CiAKLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFRvQnl0ZXMoY29uc3Qgc3RkOjpzdHJpbmcmIGlucHV0KSB7Ci0gIHJldHVybiBsZXZlbGRiOjpTdGRTdHJpbmdUb1VpbnQ4VmVjdG9yKGlucHV0KTsKK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFRvQnl0ZXMoYmFzZTo6U3RyaW5nUGllY2UgaW5wdXQpIHsKKyAgcmV0dXJuIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KGlucHV0LmJlZ2luKCksIGlucHV0LmVuZCgpKTsKIH0KIAogY2xhc3MgTW9ja0RlbGVnYXRlIDogcHVibGljIFN0b3JhZ2VBcmVhSW1wbDo6RGVsZWdhdGUgewpAQCAtMTIyLDQxICsxMjUsODYgQEAKICAgICBib29sIHNob3VsZF9zZW5kX29sZF92YWx1ZTsKICAgfTsKIAotICBTdG9yYWdlQXJlYUltcGxUZXN0KCkgOiBkYl8oJm1vY2tfZGF0YV8pIHsKKyAgU3RvcmFnZUFyZWFJbXBsVGVzdCgpIHsKKyAgICBiYXNlOjpSdW5Mb29wIGxvb3A7CisgICAgZGJfID0gbGV2ZWxkYjo6TGV2ZWxEQkRhdGFiYXNlSW1wbDo6T3BlbkluTWVtb3J5KAorICAgICAgICBiYXNlOjpudWxsb3B0LCAiU3RvcmFnZUFyZWFJbXBsVGVzdCIsCisgICAgICAgIGJhc2U6OkNyZWF0ZVNlcXVlbmNlZFRhc2tSdW5uZXIoe2Jhc2U6Ok1heUJsb2NrKCksIGJhc2U6OlRocmVhZFBvb2woKX0pLAorICAgICAgICBiYXNlOjpCaW5kTGFtYmRhRm9yVGVzdGluZygKKyAgICAgICAgICAgIFsmXShsZXZlbGRiOjptb2pvbTo6RGF0YWJhc2VFcnJvciBlcnJvcikgeyBsb29wLlF1aXQoKTsgfSkpOworICAgIGxvb3AuUnVuKCk7CisKICAgICBTdG9yYWdlQXJlYUltcGw6Ok9wdGlvbnMgb3B0aW9ucyA9CiAgICAgICAgIEdldERlZmF1bHRUZXN0aW5nT3B0aW9ucyhDYWNoZU1vZGU6OktFWVNfT05MWV9XSEVOX1BPU1NJQkxFKTsKLSAgICBzdG9yYWdlX2FyZWFfID0gc3RkOjptYWtlX3VuaXF1ZTxTdG9yYWdlQXJlYUltcGw+KCZkYl8sIHRlc3RfcHJlZml4XywKKyAgICBzdG9yYWdlX2FyZWFfID0gc3RkOjptYWtlX3VuaXF1ZTxTdG9yYWdlQXJlYUltcGw+KGRiXy5nZXQoKSwgdGVzdF9wcmVmaXhfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlbGVnYXRlXywgb3B0aW9ucyk7CiAKLSAgICBzZXRfbW9ja19kYXRhKHRlc3RfcHJlZml4XyArIHRlc3Rfa2V5MV8sIHRlc3RfdmFsdWUxXyk7Ci0gICAgc2V0X21vY2tfZGF0YSh0ZXN0X3ByZWZpeF8gKyB0ZXN0X2tleTJfLCB0ZXN0X3ZhbHVlMl8pOwotICAgIHNldF9tb2NrX2RhdGEoIjEyMyIsICJiYWRkYXRhIik7CisgICAgU2V0RGF0YWJhc2VFbnRyeSh0ZXN0X3ByZWZpeF8gKyB0ZXN0X2tleTFfLCB0ZXN0X3ZhbHVlMV8pOworICAgIFNldERhdGFiYXNlRW50cnkodGVzdF9wcmVmaXhfICsgdGVzdF9rZXkyXywgdGVzdF92YWx1ZTJfKTsKKyAgICBTZXREYXRhYmFzZUVudHJ5KCIxMjMiLCAiYmFkZGF0YSIpOwogCiAgICAgc3RvcmFnZV9hcmVhXy0+QmluZChzdG9yYWdlX2FyZWFfcmVtb3RlXy5CaW5kTmV3UGlwZUFuZFBhc3NSZWNlaXZlcigpKTsKICAgICBzdG9yYWdlX2FyZWFfcmVtb3RlXy0+QWRkT2JzZXJ2ZXIoCiAgICAgICAgIG9ic2VydmVyX3JlY2VpdmVyXy5CaW5kTmV3RW5kcG9pbnRBbmRQYXNzUmVtb3RlKCkpOwogICB9CiAKLSAgflN0b3JhZ2VBcmVhSW1wbFRlc3QoKSBvdmVycmlkZSB7fQorICB+U3RvcmFnZUFyZWFJbXBsVGVzdCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKIAotICB2b2lkIHNldF9tb2NrX2RhdGEoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gICAgbW9ja19kYXRhX1tUb0J5dGVzKGtleSldID0gVG9CeXRlcyh2YWx1ZSk7CisgIHZvaWQgU2V0RGF0YWJhc2VFbnRyeShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHZhbHVlKSB7CisgICAgYmFzZTo6UnVuTG9vcCBsb29wOworICAgIGRiXy0+ZGF0YWJhc2UoKS5Qb3N0VGFza1dpdGhUaGlzT2JqZWN0KAorICAgICAgICBGUk9NX0hFUkUsCisgICAgICAgIGJhc2U6OkJpbmRMYW1iZGFGb3JUZXN0aW5nKFsmXShjb25zdCBzdG9yYWdlOjpEb21TdG9yYWdlRGF0YWJhc2UmIGRiKSB7CisgICAgICAgICAgQVNTRVJUX1RSVUUoZGIuUHV0KGtleSwgdmFsdWUpLm9rKCkpOworICAgICAgICAgIGxvb3AuUXVpdCgpOworICAgICAgICB9KSk7CisgICAgbG9vcC5SdW4oKTsKICAgfQogCi0gIHZvaWQgc2V0X21vY2tfZGF0YShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYga2V5LAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHZhbHVlKSB7Ci0gICAgbW9ja19kYXRhX1trZXldID0gdmFsdWU7CisgIHZvaWQgU2V0RGF0YWJhc2VFbnRyeShiYXNlOjpTdHJpbmdQaWVjZSBrZXksIGJhc2U6OlN0cmluZ1BpZWNlIHZhbHVlKSB7CisgICAgU2V0RGF0YWJhc2VFbnRyeShUb0J5dGVzKGtleSksIFRvQnl0ZXModmFsdWUpKTsKICAgfQogCi0gIGJvb2wgaGFzX21vY2tfZGF0YShjb25zdCBzdGQ6OnN0cmluZyYga2V5KSB7Ci0gICAgcmV0dXJuIG1vY2tfZGF0YV8uZmluZChUb0J5dGVzKGtleSkpICE9IG1vY2tfZGF0YV8uZW5kKCk7CisgIHN0ZDo6c3RyaW5nIEdldERhdGFiYXNlRW50cnkoYmFzZTo6U3RyaW5nUGllY2Uga2V5KSB7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWU7CisgICAgYmFzZTo6UnVuTG9vcCBsb29wOworICAgIGRiXy0+ZGF0YWJhc2UoKS5Qb3N0VGFza1dpdGhUaGlzT2JqZWN0KAorICAgICAgICBGUk9NX0hFUkUsCisgICAgICAgIGJhc2U6OkJpbmRMYW1iZGFGb3JUZXN0aW5nKFsmXShjb25zdCBzdG9yYWdlOjpEb21TdG9yYWdlRGF0YWJhc2UmIGRiKSB7CisgICAgICAgICAgQVNTRVJUX1RSVUUoZGIuR2V0KFRvQnl0ZXMoa2V5KSwgJnZhbHVlKS5vaygpKTsKKyAgICAgICAgICBsb29wLlF1aXQoKTsKKyAgICAgICAgfSkpOworICAgIGxvb3AuUnVuKCk7CisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKHZhbHVlLmJlZ2luKCksIHZhbHVlLmVuZCgpKTsKICAgfQogCi0gIHN0ZDo6c3RyaW5nIGdldF9tb2NrX2RhdGEoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSkgewotICAgIHJldHVybiBoYXNfbW9ja19kYXRhKGtleSkgPyBUb1N0cmluZyhtb2NrX2RhdGFfW1RvQnl0ZXMoa2V5KV0pIDogIiI7CisgIGJvb2wgSGFzRGF0YWJhc2VFbnRyeShiYXNlOjpTdHJpbmdQaWVjZSBrZXkpIHsKKyAgICBiYXNlOjpSdW5Mb29wIGxvb3A7CisgICAgbGV2ZWxkYjo6U3RhdHVzIHN0YXR1czsKKyAgICBkYl8tPmRhdGFiYXNlKCkuUG9zdFRhc2tXaXRoVGhpc09iamVjdCgKKyAgICAgICAgRlJPTV9IRVJFLAorICAgICAgICBiYXNlOjpCaW5kTGFtYmRhRm9yVGVzdGluZyhbJl0oY29uc3Qgc3RvcmFnZTo6RG9tU3RvcmFnZURhdGFiYXNlJiBkYikgeworICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlOworICAgICAgICAgIHN0YXR1cyA9IGRiLkdldChUb0J5dGVzKGtleSksICZ2YWx1ZSk7CisgICAgICAgICAgbG9vcC5RdWl0KCk7CisgICAgICAgIH0pKTsKKyAgICBsb29wLlJ1bigpOworICAgIHJldHVybiBzdGF0dXMub2soKTsKICAgfQogCi0gIHZvaWQgY2xlYXJfbW9ja19kYXRhKCkgeyBtb2NrX2RhdGFfLmNsZWFyKCk7IH0KKyAgdm9pZCBDbGVhckRhdGFiYXNlKCkgeworICAgIGJhc2U6OlJ1bkxvb3AgbG9vcDsKKyAgICBkYl8tPmRhdGFiYXNlKCkuUG9zdFRhc2tXaXRoVGhpc09iamVjdCgKKyAgICAgICAgRlJPTV9IRVJFLAorICAgICAgICBiYXNlOjpCaW5kTGFtYmRhRm9yVGVzdGluZyhbJl0oY29uc3Qgc3RvcmFnZTo6RG9tU3RvcmFnZURhdGFiYXNlJiBkYikgeworICAgICAgICAgIGxldmVsZGI6OldyaXRlQmF0Y2ggYmF0Y2g7CisgICAgICAgICAgQVNTRVJUX1RSVUUoZGIuRGVsZXRlUHJlZml4ZWQoe30sICZiYXRjaCkub2soKSk7CisgICAgICAgICAgQVNTRVJUX1RSVUUoZGIuQ29tbWl0KCZiYXRjaCkub2soKSk7CisgICAgICAgICAgbG9vcC5RdWl0KCk7CisgICAgICAgIH0pKTsKKyAgICBsb29wLlJ1bigpOworICB9CiAKICAgYmxpbms6Om1vam9tOjpTdG9yYWdlQXJlYSogc3RvcmFnZV9hcmVhKCkgewogICAgIHJldHVybiBzdG9yYWdlX2FyZWFfcmVtb3RlXy5nZXQoKTsKQEAgLTIzNSw3ICsyODMsNyBAQAogICBjb25zdCBzdGQ6OnZlY3RvcjxPYnNlcnZhdGlvbj4mIG9ic2VydmF0aW9ucygpIHsgcmV0dXJuIG9ic2VydmF0aW9uc187IH0KIAogICBNb2NrRGVsZWdhdGUqIGRlbGVnYXRlKCkgeyByZXR1cm4gJmRlbGVnYXRlXzsgfQotICBsZXZlbGRiOjptb2pvbTo6TGV2ZWxEQkRhdGFiYXNlKiBkYXRhYmFzZSgpIHsgcmV0dXJuICZkYl87IH0KKyAgbGV2ZWxkYjo6TGV2ZWxEQkRhdGFiYXNlSW1wbCogZGF0YWJhc2UoKSB7IHJldHVybiBkYl8uZ2V0KCk7IH0KIAogICB2b2lkIHNob3VsZF9yZWNvcmRfc2VuZF9vbGRfdmFsdWVfb2JzZXJ2YXRpb25zKGJvb2wgdmFsdWUpIHsKICAgICBzaG91bGRfcmVjb3JkX3NlbmRfb2xkX3ZhbHVlX29ic2VydmF0aW9uc18gPSB2YWx1ZTsKQEAgLTI5MSw4ICszMzksNyBAQAogICB9CiAKICAgQnJvd3NlclRhc2tFbnZpcm9ubWVudCB0YXNrX2Vudmlyb25tZW50XzsKLSAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBtb2NrX2RhdGFfOwotICBGYWtlTGV2ZWxEQkRhdGFiYXNlIGRiXzsKKyAgc3RkOjp1bmlxdWVfcHRyPGxldmVsZGI6OkxldmVsREJEYXRhYmFzZUltcGw+IGRiXzsKICAgTW9ja0RlbGVnYXRlIGRlbGVnYXRlXzsKICAgc3RkOjp1bmlxdWVfcHRyPFN0b3JhZ2VBcmVhSW1wbD4gc3RvcmFnZV9hcmVhXzsKICAgbW9qbzo6UmVtb3RlPGJsaW5rOjptb2pvbTo6U3RvcmFnZUFyZWE+IHN0b3JhZ2VfYXJlYV9yZW1vdGVfOwpAQCAtNDM3LDEzICs0ODQsMTMgQEAKICAgRVhQRUNUX1RSVUUocHV0X3N1Y2Nlc3MyKTsKICAgRVhQRUNUX1RSVUUocHV0X3N1Y2Nlc3MzKTsKIAotICBFWFBFQ1RfRkFMU0UoaGFzX21vY2tfZGF0YSh0ZXN0X3ByZWZpeF8gKyBrZXkyKSk7CisgIEVYUEVDVF9GQUxTRShIYXNEYXRhYmFzZUVudHJ5KHRlc3RfcHJlZml4XyArIGtleTIpKTsKIAogICBCbG9ja2luZ0NvbW1pdCgpOwotICBFWFBFQ1RfVFJVRShoYXNfbW9ja19kYXRhKHRlc3RfcHJlZml4XyArIGtleTEpKTsKLSAgRVhQRUNUX0VRKHZhbHVlMSwgZ2V0X21vY2tfZGF0YSh0ZXN0X3ByZWZpeF8gKyBrZXkxKSk7Ci0gIEVYUEVDVF9UUlVFKGhhc19tb2NrX2RhdGEodGVzdF9wcmVmaXhfICsga2V5MikpOwotICBFWFBFQ1RfRVEodmFsdWUyLCBnZXRfbW9ja19kYXRhKHRlc3RfcHJlZml4XyArIGtleTIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzRGF0YWJhc2VFbnRyeSh0ZXN0X3ByZWZpeF8gKyBrZXkxKSk7CisgIEVYUEVDVF9FUSh2YWx1ZTEsIEdldERhdGFiYXNlRW50cnkodGVzdF9wcmVmaXhfICsga2V5MSkpOworICBFWFBFQ1RfVFJVRShIYXNEYXRhYmFzZUVudHJ5KHRlc3RfcHJlZml4XyArIGtleTIpKTsKKyAgRVhQRUNUX0VRKHZhbHVlMiwgR2V0RGF0YWJhc2VFbnRyeSh0ZXN0X3ByZWZpeF8gKyBrZXkyKSk7CiB9CiAKIFRFU1RfUChTdG9yYWdlQXJlYUltcGxQYXJhbVRlc3QsIFB1dE9ic2VydmF0aW9ucykgewpAQCAtNDg0LDcgKzUzMSw3IEBACiAgIHN0b3JhZ2VfYXJlYV9pbXBsKCktPlNldENhY2hlTW9kZUZvclRlc3RpbmcoR2V0UGFyYW0oKSk7CiAgIHN0ZDo6c3RyaW5nIGtleSA9ICJuZXdrZXkiOwogICBzdGQ6OnN0cmluZyB2YWx1ZSA9ICJmb28iOwotICBzZXRfbW9ja19kYXRhKHRlc3RfcHJlZml4XyArIGtleSwgdmFsdWUpOworICBTZXREYXRhYmFzZUVudHJ5KHRlc3RfcHJlZml4XyArIGtleSwgdmFsdWUpOwogCiAgIEVYUEVDVF9UUlVFKERlbGV0ZVN5bmMoVG9CeXRlcyhrZXkpLCBUb0J5dGVzKHZhbHVlKSkpOwogICBBU1NFUlRfRVEoMXUsIG9ic2VydmF0aW9ucygpLnNpemUoKSk7CkBAIC00OTMsMTAgKzU0MCwxMCBAQAogICBFWFBFQ1RfRVEodmFsdWUsIG9ic2VydmF0aW9ucygpWzBdLm9sZF92YWx1ZSk7CiAgIEVYUEVDVF9FUSh0ZXN0X3NvdXJjZV8sIG9ic2VydmF0aW9ucygpWzBdLnNvdXJjZSk7CiAKLSAgRVhQRUNUX1RSVUUoaGFzX21vY2tfZGF0YSh0ZXN0X3ByZWZpeF8gKyBrZXkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzRGF0YWJhc2VFbnRyeSh0ZXN0X3ByZWZpeF8gKyBrZXkpKTsKIAogICBCbG9ja2luZ0NvbW1pdCgpOwotICBFWFBFQ1RfRkFMU0UoaGFzX21vY2tfZGF0YSh0ZXN0X3ByZWZpeF8gKyBrZXkpKTsKKyAgRVhQRUNUX0ZBTFNFKEhhc0RhdGFiYXNlRW50cnkodGVzdF9wcmVmaXhfICsga2V5KSk7CiB9CiAKIFRFU1RfUChTdG9yYWdlQXJlYUltcGxQYXJhbVRlc3QsIERlbGV0ZUFsbFdpdGhvdXRMb2FkZWRNYXApIHsKQEAgLTUwNCwyMCArNTUxLDIwIEBACiAgIHN0ZDo6c3RyaW5nIGtleSA9ICJuZXdrZXkiOwogICBzdGQ6OnN0cmluZyB2YWx1ZSA9ICJmb28iOwogICBzdGQ6OnN0cmluZyBkdW1teV9rZXkgPSAiZm9vYmFyIjsKLSAgc2V0X21vY2tfZGF0YShkdW1teV9rZXksIHZhbHVlKTsKLSAgc2V0X21vY2tfZGF0YSh0ZXN0X3ByZWZpeF8gKyBrZXksIHZhbHVlKTsKKyAgU2V0RGF0YWJhc2VFbnRyeShkdW1teV9rZXksIHZhbHVlKTsKKyAgU2V0RGF0YWJhc2VFbnRyeSh0ZXN0X3ByZWZpeF8gKyBrZXksIHZhbHVlKTsKIAogICBFWFBFQ1RfVFJVRShEZWxldGVBbGxTeW5jKCkpOwogICBBU1NFUlRfRVEoMXUsIG9ic2VydmF0aW9ucygpLnNpemUoKSk7CiAgIEVYUEVDVF9FUShPYnNlcnZhdGlvbjo6a0RlbGV0ZUFsbCwgb2JzZXJ2YXRpb25zKClbMF0udHlwZSk7CiAgIEVYUEVDVF9FUSh0ZXN0X3NvdXJjZV8sIG9ic2VydmF0aW9ucygpWzBdLnNvdXJjZSk7CiAKLSAgRVhQRUNUX1RSVUUoaGFzX21vY2tfZGF0YSh0ZXN0X3ByZWZpeF8gKyBrZXkpKTsKLSAgRVhQRUNUX1RSVUUoaGFzX21vY2tfZGF0YShkdW1teV9rZXkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzRGF0YWJhc2VFbnRyeSh0ZXN0X3ByZWZpeF8gKyBrZXkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzRGF0YWJhc2VFbnRyeShkdW1teV9rZXkpKTsKIAogICBCbG9ja2luZ0NvbW1pdCgpOwotICBFWFBFQ1RfRkFMU0UoaGFzX21vY2tfZGF0YSh0ZXN0X3ByZWZpeF8gKyBrZXkpKTsKLSAgRVhQRUNUX1RSVUUoaGFzX21vY2tfZGF0YShkdW1teV9rZXkpKTsKKyAgRVhQRUNUX0ZBTFNFKEhhc0RhdGFiYXNlRW50cnkodGVzdF9wcmVmaXhfICsga2V5KSk7CisgIEVYUEVDVF9UUlVFKEhhc0RhdGFiYXNlRW50cnkoZHVtbXlfa2V5KSk7CiAKICAgLy8gRGVsZXRpbmcgYWxsIGFnYWluIHNob3VsZCBzdGlsbCB3b3JrLCBidXQgbm90IGNhdXNlIGFuIG9ic2VydmF0aW9uLgogICBFWFBFQ1RfVFJVRShEZWxldGVBbGxTeW5jKCkpOwpAQCAtNTMzLDcgKzU4MCw3IEBACiAgIHN0ZDo6c3RyaW5nIGtleSA9ICJuZXdrZXkiOwogICBzdGQ6OnN0cmluZyB2YWx1ZSA9ICJmb28iOwogICBzdGQ6OnN0cmluZyBkdW1teV9rZXkgPSAiZm9vYmFyIjsKLSAgc2V0X21vY2tfZGF0YShkdW1teV9rZXksIHZhbHVlKTsKKyAgU2V0RGF0YWJhc2VFbnRyeShkdW1teV9rZXksIHZhbHVlKTsKIAogICBFWFBFQ1RfVFJVRShQdXRTeW5jKFRvQnl0ZXMoa2V5KSwgVG9CeXRlcyh2YWx1ZSksIGJhc2U6Om51bGxvcHQpKTsKIApAQCAtNTQyLDExICs1ODksMTEgQEAKICAgRVhQRUNUX0VRKE9ic2VydmF0aW9uOjprRGVsZXRlQWxsLCBvYnNlcnZhdGlvbnMoKVsxXS50eXBlKTsKICAgRVhQRUNUX0VRKHRlc3Rfc291cmNlXywgb2JzZXJ2YXRpb25zKClbMV0uc291cmNlKTsKIAotICBFWFBFQ1RfVFJVRShoYXNfbW9ja19kYXRhKGR1bW15X2tleSkpOworICBFWFBFQ1RfVFJVRShIYXNEYXRhYmFzZUVudHJ5KGR1bW15X2tleSkpOwogCiAgIEJsb2NraW5nQ29tbWl0KCk7Ci0gIEVYUEVDVF9GQUxTRShoYXNfbW9ja19kYXRhKHRlc3RfcHJlZml4XyArIGtleSkpOwotICBFWFBFQ1RfVFJVRShoYXNfbW9ja19kYXRhKGR1bW15X2tleSkpOworICBFWFBFQ1RfRkFMU0UoSGFzRGF0YWJhc2VFbnRyeSh0ZXN0X3ByZWZpeF8gKyBrZXkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzRGF0YWJhc2VFbnRyeShkdW1teV9rZXkpKTsKIH0KIAogVEVTVF9QKFN0b3JhZ2VBcmVhSW1wbFBhcmFtVGVzdCwgRGVsZXRlQWxsV2l0aFBlbmRpbmdNYXBMb2FkKSB7CkBAIC01NTQsNyArNjAxLDcgQEAKICAgc3RkOjpzdHJpbmcga2V5ID0gIm5ld2tleSI7CiAgIHN0ZDo6c3RyaW5nIHZhbHVlID0gImZvbyI7CiAgIHN0ZDo6c3RyaW5nIGR1bW15X2tleSA9ICJmb29iYXIiOwotICBzZXRfbW9ja19kYXRhKGR1bW15X2tleSwgdmFsdWUpOworICBTZXREYXRhYmFzZUVudHJ5KGR1bW15X2tleSwgdmFsdWUpOwogCiAgIHN0b3JhZ2VfYXJlYSgpLT5QdXQoVG9CeXRlcyhrZXkpLCBUb0J5dGVzKHZhbHVlKSwgYmFzZTo6bnVsbG9wdCwga1Rlc3RTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6RG9Ob3RoaW5nKCkpOwpAQCAtNTY0LDE2ICs2MTEsMTYgQEAKICAgRVhQRUNUX0VRKE9ic2VydmF0aW9uOjprRGVsZXRlQWxsLCBvYnNlcnZhdGlvbnMoKVsxXS50eXBlKTsKICAgRVhQRUNUX0VRKHRlc3Rfc291cmNlXywgb2JzZXJ2YXRpb25zKClbMV0uc291cmNlKTsKIAotICBFWFBFQ1RfVFJVRShoYXNfbW9ja19kYXRhKGR1bW15X2tleSkpOworICBFWFBFQ1RfVFJVRShIYXNEYXRhYmFzZUVudHJ5KGR1bW15X2tleSkpOwogCiAgIEJsb2NraW5nQ29tbWl0KCk7Ci0gIEVYUEVDVF9GQUxTRShoYXNfbW9ja19kYXRhKHRlc3RfcHJlZml4XyArIGtleSkpOwotICBFWFBFQ1RfVFJVRShoYXNfbW9ja19kYXRhKGR1bW15X2tleSkpOworICBFWFBFQ1RfRkFMU0UoSGFzRGF0YWJhc2VFbnRyeSh0ZXN0X3ByZWZpeF8gKyBrZXkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzRGF0YWJhc2VFbnRyeShkdW1teV9rZXkpKTsKIH0KIAogVEVTVF9QKFN0b3JhZ2VBcmVhSW1wbFBhcmFtVGVzdCwgRGVsZXRlQWxsV2l0aG91dExvYWRlZEVtcHR5TWFwKSB7CiAgIHN0b3JhZ2VfYXJlYV9pbXBsKCktPlNldENhY2hlTW9kZUZvclRlc3RpbmcoR2V0UGFyYW0oKSk7Ci0gIGNsZWFyX21vY2tfZGF0YSgpOworICBDbGVhckRhdGFiYXNlKCk7CiAKICAgRVhQRUNUX1RSVUUoRGVsZXRlQWxsU3luYygpKTsKICAgQVNTRVJUX0VRKDB1LCBvYnNlcnZhdGlvbnMoKS5zaXplKCkpOwpAQCAtNjA3LDcgKzY1NCw3IEBACiAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlKGtUZXN0U2l6ZUxpbWl0LCA0KTsKICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gb2xkX3ZhbHVlID0gdmFsdWU7CiAKLSAgc2V0X21vY2tfZGF0YSh0ZXN0X3ByZWZpeF8gKyBrZXksIFRvU3RyaW5nKHZhbHVlKSk7CisgIFNldERhdGFiYXNlRW50cnkodGVzdF9wcmVmaXhfICsga2V5LCBUb1N0cmluZyh2YWx1ZSkpOwogCiAgIC8vIFB1dCB3aXRoIHNhbWUgZGF0YSBzaG91bGQgc3VjY2VlZC4KICAgRVhQRUNUX1RSVUUoUHV0U3luYyhUb0J5dGVzKGtleSksIHZhbHVlLCBiYXNlOjpudWxsb3B0KSk7CkBAIC02NDEsNyArNjg4LDcgQEAKICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWUgPSBUb0J5dGVzKCJ2YWx1ZSIpOwogICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBvbGRfdmFsdWUgPSB2YWx1ZTsKIAotICBzZXRfbW9ja19kYXRhKHRlc3RfcHJlZml4XyArIFRvU3RyaW5nKGtleSksIFRvU3RyaW5nKHZhbHVlKSk7CisgIFNldERhdGFiYXNlRW50cnkodGVzdF9wcmVmaXhfICsgVG9TdHJpbmcoa2V5KSwgVG9TdHJpbmcodmFsdWUpKTsKIAogICAvLyBQdXQgd2l0aCBzYW1lIGRhdGEgc2l6ZSBzaG91bGQgc3VjY2VlZC4KICAgdmFsdWVbMF0gPSAnWCc7CkBAIC03MDksOSArNzU2LDkgQEAKICAgRVhQRUNUX0VRKHRlc3Rfa2V5MV8sIFRvU3RyaW5nKGRhdGFbMV0tPmtleSkpOwogICBFWFBFQ1RfRVEoImZvbyIsIFRvU3RyaW5nKGRhdGFbMV0tPnZhbHVlKSk7CiAKLSAgRVhQRUNUX0ZBTFNFKGhhc19tb2NrX2RhdGEodGVzdF9wcmVmaXhfICsgdGVzdF9rZXkyXykpOwotICBFWFBFQ1RfRVEoImZvbyIsIGdldF9tb2NrX2RhdGEodGVzdF9wcmVmaXhfICsgdGVzdF9rZXkxXykpOwotICBFWFBFQ1RfRVEoImJsYSIsIGdldF9tb2NrX2RhdGEodGVzdF9wcmVmaXhfICsgdGVzdF9wcmVmaXhfKSk7CisgIEVYUEVDVF9GQUxTRShIYXNEYXRhYmFzZUVudHJ5KHRlc3RfcHJlZml4XyArIHRlc3Rfa2V5Ml8pKTsKKyAgRVhQRUNUX0VRKCJmb28iLCBHZXREYXRhYmFzZUVudHJ5KHRlc3RfcHJlZml4XyArIHRlc3Rfa2V5MV8pKTsKKyAgRVhQRUNUX0VRKCJibGEiLCBHZXREYXRhYmFzZUVudHJ5KHRlc3RfcHJlZml4XyArIHRlc3RfcHJlZml4XykpOwogfQogCiBURVNUX0YoU3RvcmFnZUFyZWFJbXBsVGVzdCwgU2V0T25seUtleXNXaXRob3V0RGF0YWJhc2UpIHsKQEAgLTc5Miw3ICs4MzksNyBAQAogCiAgIEJsb2NraW5nQ29tbWl0KCk7CiAKLSAgRVhQRUNUX0VRKCJmb28yIiwgZ2V0X21vY2tfZGF0YSh0ZXN0X3ByZWZpeF8gKyB0ZXN0X2tleTJfKSk7CisgIEVYUEVDVF9FUSgiZm9vMiIsIEdldERhdGFiYXNlRW50cnkodGVzdF9wcmVmaXhfICsgdGVzdF9rZXkyXykpOwogICBpZiAoR2V0UGFyYW0oKSA9PSBDYWNoZU1vZGU6OktFWVNfQU5EX1ZBTFVFUykKICAgICBFWFBFQ1RfRVEoMnUsIHN0b3JhZ2VfYXJlYV9pbXBsKCktPmtleXNfdmFsdWVzX21hcF8uc2l6ZSgpKTsKICAgZWxzZQpAQCAtODE1LDEwICs4NjIsMTAgQEAKICAgICBFWFBFQ1RfRVEodmFsdWUzLCBpdC0+c2Vjb25kKTsKICAgfQogCi0gIGNsZWFyX21vY2tfZGF0YSgpOworICBDbGVhckRhdGFiYXNlKCk7CiAgIEVYUEVDVF9UUlVFKHN0b3JhZ2VfYXJlYV9pbXBsKCktPmhhc19jaGFuZ2VzX3RvX2NvbW1pdCgpKTsKICAgQmxvY2tpbmdDb21taXQoKTsKLSAgRVhQRUNUX0VRKCJmb29iYXIiLCBnZXRfbW9ja19kYXRhKHRlc3RfcHJlZml4XyArIHRlc3Rfa2V5Ml8pKTsKKyAgRVhQRUNUX0VRKCJmb29iYXIiLCBHZXREYXRhYmFzZUVudHJ5KHRlc3RfcHJlZml4XyArIHRlc3Rfa2V5Ml8pKTsKICAgRVhQRUNUX0ZBTFNFKHN0b3JhZ2VfYXJlYV9pbXBsKCktPmhhc19jaGFuZ2VzX3RvX2NvbW1pdCgpKTsKIH0KIApAQCAtODM4LDcgKzg4NSw2IEBACiAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CiAKICAgYmFzZTo6UnVuTG9vcCBsb29wOwotCiAgIGJvb2wgcHV0X3Jlc3VsdDEgPSBmYWxzZTsKICAgYm9vbCBwdXRfcmVzdWx0MiA9IGZhbHNlOwogICB7CkBAIC04NTksNyArOTA1LDcgQEAKIAogICAvLyBHZXRBbGwgdHJpZ2dlcnMgYSBjb21taXQgd2hlbiBpdCdzIHN3aXRjaGluZyBtYXAgdHlwZXMuCiAgIEVYUEVDVF9UUlVFKHB1dF9yZXN1bHQxKTsKLSAgRVhQRUNUX0VRKCJmb28iLCBnZXRfbW9ja19kYXRhKHRlc3RfcHJlZml4XyArIHRlc3Rfa2V5Ml8pKTsKKyAgRVhQRUNUX0VRKCJmb28iLCBHZXREYXRhYmFzZUVudHJ5KHRlc3RfcHJlZml4XyArIHRlc3Rfa2V5Ml8pKTsKIAogICBsb29wLlJ1bigpOwogCkBAIC04NzYsMTIgKzkyMiwxMiBAQAogICBFWFBFQ1RfVFJVRShnZXRfYWxsX3N1Y2Nlc3MpOwogCiAgIC8vIFRoZSBsYXN0ICJwdXQiIGlzbid0IGNvbW1pdHRlZCB5ZXQuCi0gIEVYUEVDVF9FUSgiZm9vIiwgZ2V0X21vY2tfZGF0YSh0ZXN0X3ByZWZpeF8gKyB0ZXN0X2tleTJfKSk7CisgIEVYUEVDVF9FUSgiZm9vIiwgR2V0RGF0YWJhc2VFbnRyeSh0ZXN0X3ByZWZpeF8gKyB0ZXN0X2tleTJfKSk7CiAKICAgQVNTRVJUX1RSVUUoc3RvcmFnZV9hcmVhX2ltcGwoKS0+aGFzX2NoYW5nZXNfdG9fY29tbWl0KCkpOwogICBCbG9ja2luZ0NvbW1pdCgpOwogCi0gIEVYUEVDVF9FUSgiZm9vYmFyIiwgZ2V0X21vY2tfZGF0YSh0ZXN0X3ByZWZpeF8gKyB0ZXN0X2tleTJfKSk7CisgIEVYUEVDVF9FUSgiZm9vYmFyIiwgR2V0RGF0YWJhc2VFbnRyeSh0ZXN0X3ByZWZpeF8gKyB0ZXN0X2tleTJfKSk7CiB9CiAKIFRFU1RfRihTdG9yYWdlQXJlYUltcGxUZXN0LCBHZXRBbGxBZnRlclNldENhY2hlTW9kZSkgewpAQCAtOTQ4LDEyICs5OTQsMTIgQEAKIAogICAvLyBHZXRBbGwgc2hvdWxkbid0IHRyaWdnZXIgYSBjb21taXQgYmVmb3JlIGl0IHJ1bnMgbm93IGJlY2F1c2UgdGhlIHZhbHVlCiAgIC8vIG1hcCBzaG91bGQgYmUgbG9hZGluZy4KLSAgRVhQRUNUX0VRKCJmb29iYXIiLCBnZXRfbW9ja19kYXRhKHRlc3RfcHJlZml4XyArIHRlc3Rfa2V5Ml8pKTsKKyAgRVhQRUNUX0VRKCJmb29iYXIiLCBHZXREYXRhYmFzZUVudHJ5KHRlc3RfcHJlZml4XyArIHRlc3Rfa2V5Ml8pKTsKIAogICBBU1NFUlRfVFJVRShzdG9yYWdlX2FyZWFfaW1wbCgpLT5oYXNfY2hhbmdlc190b19jb21taXQoKSk7CiAgIEJsb2NraW5nQ29tbWl0KCk7CiAKLSAgRVhQRUNUX0ZBTFNFKGhhc19tb2NrX2RhdGEodGVzdF9wcmVmaXhfICsgdGVzdF9rZXkyXykpOworICBFWFBFQ1RfRkFMU0UoSGFzRGF0YWJhc2VFbnRyeSh0ZXN0X3ByZWZpeF8gKyB0ZXN0X2tleTJfKSk7CiB9CiAKIFRFU1RfRihTdG9yYWdlQXJlYUltcGxUZXN0LCBTZXRDYWNoZU1vZGVDb25zaXN0ZW50KSB7CkBAIC05NjYsNyArMTAxMiw3IEBACiAgICAgICAgICAgICAgIENhY2hlTW9kZTo6S0VZU19PTkxZX1dIRU5fUE9TU0lCTEUpOwogCiAgIC8vIENsZWFyIHRoZSBkYXRhYmFzZSBiZWZvcmUgdGhlIGFyZWEgbG9hZHMgZGF0YS4KLSAgY2xlYXJfbW9ja19kYXRhKCk7CisgIENsZWFyRGF0YWJhc2UoKTsKIAogICBFWFBFQ1RfVFJVRShQdXRTeW5jKGtleSwgdmFsdWUsIGJhc2U6Om51bGxvcHQpKTsKICAgRVhQRUNUX1RSVUUoc3RvcmFnZV9hcmVhX2ltcGwoKS0+aGFzX2NoYW5nZXNfdG9fY29tbWl0KCkpOwpAQCAtMTEwNiwxNiArMTE1MiwxNiBAQAogICBCbG9ja2luZ0NvbW1pdCgmZm9yazFfZGVsZWdhdGUsIGZvcmsxLmdldCgpKTsKIAogICAvLyB0ZXN0X2tleTFfIHZhbHVlcy4KLSAgRVhQRUNUX0VRKHZhbHVlMywgZ2V0X21vY2tfZGF0YSh0ZXN0X3ByZWZpeF8gKyB0ZXN0X2tleTFfKSk7Ci0gIEVYUEVDVF9FUSh0ZXN0X3ZhbHVlMV8sIGdldF9tb2NrX2RhdGEodGVzdF9jb3B5X3ByZWZpeDFfICsgdGVzdF9rZXkxXykpOwotICBFWFBFQ1RfRVEodGVzdF92YWx1ZTFfLCBnZXRfbW9ja19kYXRhKHRlc3RfY29weV9wcmVmaXgyXyArIHRlc3Rfa2V5MV8pKTsKLSAgRVhQRUNUX0VRKHZhbHVlMywgZ2V0X21vY2tfZGF0YSh0ZXN0X2NvcHlfcHJlZml4M18gKyB0ZXN0X2tleTFfKSk7CisgIEVYUEVDVF9FUSh2YWx1ZTMsIEdldERhdGFiYXNlRW50cnkodGVzdF9wcmVmaXhfICsgdGVzdF9rZXkxXykpOworICBFWFBFQ1RfRVEodGVzdF92YWx1ZTFfLCBHZXREYXRhYmFzZUVudHJ5KHRlc3RfY29weV9wcmVmaXgxXyArIHRlc3Rfa2V5MV8pKTsKKyAgRVhQRUNUX0VRKHRlc3RfdmFsdWUxXywgR2V0RGF0YWJhc2VFbnRyeSh0ZXN0X2NvcHlfcHJlZml4Ml8gKyB0ZXN0X2tleTFfKSk7CisgIEVYUEVDVF9FUSh2YWx1ZTMsIEdldERhdGFiYXNlRW50cnkodGVzdF9jb3B5X3ByZWZpeDNfICsgdGVzdF9rZXkxXykpOwogCiAgIC8vIHRlc3Rfa2V5Ml8gdmFsdWVzLgotICBFWFBFQ1RfRVEodGVzdF92YWx1ZTJfLCBnZXRfbW9ja19kYXRhKHRlc3RfcHJlZml4XyArIHRlc3Rfa2V5Ml8pKTsKLSAgRVhQRUNUX0VRKHZhbHVlNSwgZ2V0X21vY2tfZGF0YSh0ZXN0X2NvcHlfcHJlZml4MV8gKyB0ZXN0X2tleTJfKSk7Ci0gIEVYUEVDVF9FUSh2YWx1ZTQsIGdldF9tb2NrX2RhdGEodGVzdF9jb3B5X3ByZWZpeDJfICsgdGVzdF9rZXkyXykpOwotICBFWFBFQ1RfRVEodGVzdF92YWx1ZTJfLCBnZXRfbW9ja19kYXRhKHRlc3RfY29weV9wcmVmaXgzXyArIHRlc3Rfa2V5Ml8pKTsKKyAgRVhQRUNUX0VRKHRlc3RfdmFsdWUyXywgR2V0RGF0YWJhc2VFbnRyeSh0ZXN0X3ByZWZpeF8gKyB0ZXN0X2tleTJfKSk7CisgIEVYUEVDVF9FUSh2YWx1ZTUsIEdldERhdGFiYXNlRW50cnkodGVzdF9jb3B5X3ByZWZpeDFfICsgdGVzdF9rZXkyXykpOworICBFWFBFQ1RfRVEodmFsdWU0LCBHZXREYXRhYmFzZUVudHJ5KHRlc3RfY29weV9wcmVmaXgyXyArIHRlc3Rfa2V5Ml8pKTsKKyAgRVhQRUNUX0VRKHRlc3RfdmFsdWUyXywgR2V0RGF0YWJhc2VFbnRyeSh0ZXN0X2NvcHlfcHJlZml4M18gKyB0ZXN0X2tleTJfKSk7CiB9CiAKIFRFU1RfUChTdG9yYWdlQXJlYUltcGxQYXJhbVRlc3QsIFByZWZpeEZvcmtBZnRlckxvYWQpIHsKQEAgLTExMzYsNyArMTE4Miw3IEBACiAKICAgQmxvY2tpbmdDb21taXQoZGVsZWdhdGUoKSwgc3RvcmFnZV9hcmVhX2ltcGwoKSk7CiAKLSAgRVhQRUNUX0VRKGtWYWx1ZSwgZ2V0X21vY2tfZGF0YSh0ZXN0X2NvcHlfcHJlZml4MV8gKyB0ZXN0X2tleTFfKSk7CisgIEVYUEVDVF9FUShrVmFsdWUsIEdldERhdGFiYXNlRW50cnkodGVzdF9jb3B5X3ByZWZpeDFfICsgdGVzdF9rZXkxXykpOwogfQogCiBuYW1lc3BhY2UgewpAQCAtMTI4MCwxMiArMTMyNiwxMiBAQAogICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHByZWZpeCA9IGFyZWFzW2ldLT5wcmVmaXgoKTsKICAgICBzdGQ6OnN0cmluZyBrZXkxID0gVG9TdHJpbmcocHJlZml4KSArIGtLZXkxOwogICAgIHN0ZDo6c3RyaW5nIGtleTIgPSBUb1N0cmluZyhwcmVmaXgpICsga0tleTI7Ci0gICAgRVhQRUNUX0VRKCEhc3RhdGUudmFsMSwgaGFzX21vY2tfZGF0YShrZXkxKSk7CisgICAgRVhQRUNUX0VRKCEhc3RhdGUudmFsMSwgSGFzRGF0YWJhc2VFbnRyeShrZXkxKSk7CiAgICAgaWYgKHN0YXRlLnZhbDEpCi0gICAgICBFWFBFQ1RfRVEoVG9TdHJpbmcoc3RhdGUudmFsMS52YWx1ZSgpKSwgZ2V0X21vY2tfZGF0YShrZXkxKSk7Ci0gICAgRVhQRUNUX0VRKCEhc3RhdGUudmFsMiwgaGFzX21vY2tfZGF0YShrZXkyKSk7CisgICAgICBFWFBFQ1RfRVEoVG9TdHJpbmcoc3RhdGUudmFsMS52YWx1ZSgpKSwgR2V0RGF0YWJhc2VFbnRyeShrZXkxKSk7CisgICAgRVhQRUNUX0VRKCEhc3RhdGUudmFsMiwgSGFzRGF0YWJhc2VFbnRyeShrZXkyKSk7CiAgICAgaWYgKHN0YXRlLnZhbDIpCi0gICAgICBFWFBFQ1RfRVEoVG9TdHJpbmcoc3RhdGUudmFsMi52YWx1ZSgpKSwgZ2V0X21vY2tfZGF0YShrZXkyKSk7CisgICAgICBFWFBFQ1RfRVEoVG9TdHJpbmcoc3RhdGUudmFsMi52YWx1ZSgpKSwgR2V0RGF0YWJhc2VFbnRyeShrZXkyKSk7CiAKICAgICBFWFBFQ1RfRkFMU0UoYXJlYXNbaV0tPmhhc19wZW5kaW5nX2xvYWRfdGFza3MoKSkgPDwgaTsKICAgfQpAQCAtMTI5Niw3ICsxMzQyLDcgQEAKICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4ga1ZhbHVlVmVjID0gVG9CeXRlcyhrVmFsdWUpOwogCiAgIC8vIFNldCBmYWtlIGRhdGEgdG8gZW5zdXJlIHRoYXQgb3VyIHNob3J0Y3V0IGRvZXNuJ3QgcmVhZCBpdC4KLSAgc2V0X21vY2tfZGF0YSh0ZXN0X2NvcHlfcHJlZml4MV8gKyB0ZXN0X2tleTFfLCBrVmFsdWUpOworICBTZXREYXRhYmFzZUVudHJ5KHRlc3RfY29weV9wcmVmaXgxXyArIHRlc3Rfa2V5MV8sIGtWYWx1ZSk7CiAKICAgLy8gQ3JlYXRlIGFuIGVtcHR5IG1hcCB0aGF0IHdpbGwgaGF2ZSBubyBkYXRhIGluIGl0LgogICBTdG9yYWdlQXJlYUltcGw6Ok9wdGlvbnMgb3B0aW9ucyA9CkBAIC0xMzE0LDcgKzEzNjAsNyBAQAogICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrVmFsdWVWZWMgPSBUb0J5dGVzKGtWYWx1ZSk7CiAKICAgLy8gU2V0IGZha2UgZGF0YSB0byBlbnN1cmUgdGhhdCBvdXIgc2hvcnRjdXQgZG9lc24ndCByZWFkIGl0LgotICBzZXRfbW9ja19kYXRhKHRlc3RfY29weV9wcmVmaXgxXyArIHRlc3Rfa2V5MV8sIGtWYWx1ZSk7CisgIFNldERhdGFiYXNlRW50cnkodGVzdF9jb3B5X3ByZWZpeDFfICsgdGVzdF9rZXkxXywga1ZhbHVlKTsKIAogICAvLyBDcmVhdGUgYW4gZW1wdHkgbWFwIHRoYXQgd2lsbCBoYXZlIG5vIGRhdGEgaW4gaXQuCiAgIFN0b3JhZ2VBcmVhSW1wbDo6T3B0aW9ucyBvcHRpb25zID0KZGlmZiAtLWdpdCBhL2NvbnRlbnQvYnJvd3Nlci9kb21fc3RvcmFnZS90ZXN0L2Zha2VfbGV2ZWxkYl9kYXRhYmFzZV9lcnJvcl9vbl93cml0ZS5jYyBiL2NvbnRlbnQvYnJvd3Nlci9kb21fc3RvcmFnZS90ZXN0L2Zha2VfbGV2ZWxkYl9kYXRhYmFzZV9lcnJvcl9vbl93cml0ZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRhOGJlOS4uMDAwMDAwMAotLS0gYS9jb250ZW50L2Jyb3dzZXIvZG9tX3N0b3JhZ2UvdGVzdC9mYWtlX2xldmVsZGJfZGF0YWJhc2VfZXJyb3Jfb25fd3JpdGUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxOCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJjb250ZW50L2Jyb3dzZXIvZG9tX3N0b3JhZ2UvdGVzdC9mYWtlX2xldmVsZGJfZGF0YWJhc2VfZXJyb3Jfb25fd3JpdGUuaCIKLQotI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy9zZXF1ZW5jZWRfdGFza19ydW5uZXJfaGFuZGxlLmgiCi0KLW5hbWVzcGFjZSBjb250ZW50IHsKLW5hbWVzcGFjZSB0ZXN0IHsKLQotRmFrZUxldmVsREJEYXRhYmFzZUVycm9yT25Xcml0ZTo6RmFrZUxldmVsREJEYXRhYmFzZUVycm9yT25Xcml0ZSgKLSAgICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50OF90Piwgc3RkOjp2ZWN0b3I8dWludDhfdD4+KiBtb2NrX2RhdGEpCi0gICAgOiBGYWtlTGV2ZWxEQkRhdGFiYXNlKG1vY2tfZGF0YSkge30KLQotRmFrZUxldmVsREJEYXRhYmFzZUVycm9yT25Xcml0ZTo6fkZha2VMZXZlbERCRGF0YWJhc2VFcnJvck9uV3JpdGUoKSA9IGRlZmF1bHQ7Ci0KLXZvaWQgRmFrZUxldmVsREJEYXRhYmFzZUVycm9yT25Xcml0ZTo6V3JpdGUoCi0gICAgc3RkOjp2ZWN0b3I8bGV2ZWxkYjo6bW9qb206OkJhdGNoZWRPcGVyYXRpb25QdHI+IG9wZXJhdGlvbnMsCi0gICAgV3JpdGVDYWxsYmFjayBjYWxsYmFjaykgewotICBiYXNlOjpTZXF1ZW5jZWRUYXNrUnVubmVySGFuZGxlOjpHZXQoKS0+UG9zdFRhc2soCi0gICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKHN0ZDo6bW92ZShjYWxsYmFjayksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsZGI6Om1vam9tOjpEYXRhYmFzZUVycm9yOjpJT19FUlJPUikpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotfSAgLy8gbmFtZXNwYWNlIGNvbnRlbnQKZGlmZiAtLWdpdCBhL2NvbnRlbnQvYnJvd3Nlci9kb21fc3RvcmFnZS90ZXN0L2Zha2VfbGV2ZWxkYl9kYXRhYmFzZV9lcnJvcl9vbl93cml0ZS5oIGIvY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL3Rlc3QvZmFrZV9sZXZlbGRiX2RhdGFiYXNlX2Vycm9yX29uX3dyaXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZGEyYmEuLjAwMDAwMDAKLS0tIGEvY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL3Rlc3QvZmFrZV9sZXZlbGRiX2RhdGFiYXNlX2Vycm9yX29uX3dyaXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxOCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgQ09OVEVOVF9CUk9XU0VSX0RPTV9TVE9SQUdFX1RFU1RfRkFLRV9MRVZFTERCX0RBVEFCQVNFX0VSUk9SX09OX1dSSVRFX0hfCi0jZGVmaW5lIENPTlRFTlRfQlJPV1NFUl9ET01fU1RPUkFHRV9URVNUX0ZBS0VfTEVWRUxEQl9EQVRBQkFTRV9FUlJPUl9PTl9XUklURV9IXwotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImNvbnRlbnQvdGVzdC9mYWtlX2xldmVsZGJfZGF0YWJhc2UuaCIKLQotbmFtZXNwYWNlIGNvbnRlbnQgewotbmFtZXNwYWNlIHRlc3QgewotCi0vLyBSZXBvcnRzIGFuIGVycm9yIG9uIGV2ZXJ5IHxXcml0ZXwgY2FsbC4KLWNsYXNzIEZha2VMZXZlbERCRGF0YWJhc2VFcnJvck9uV3JpdGUgOiBwdWJsaWMgRmFrZUxldmVsREJEYXRhYmFzZSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBGYWtlTGV2ZWxEQkRhdGFiYXNlRXJyb3JPbldyaXRlKAotICAgICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiogbW9ja19kYXRhKTsKLSAgfkZha2VMZXZlbERCRGF0YWJhc2VFcnJvck9uV3JpdGUoKSBvdmVycmlkZTsKLQotICB2b2lkIFdyaXRlKHN0ZDo6dmVjdG9yPGxldmVsZGI6Om1vam9tOjpCYXRjaGVkT3BlcmF0aW9uUHRyPiBvcGVyYXRpb25zLAotICAgICAgICAgICAgIFdyaXRlQ2FsbGJhY2sgY2FsbGJhY2spIG92ZXJyaWRlOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3QKLX0gIC8vIG5hbWVzcGFjZSBjb250ZW50Ci0KLSNlbmRpZiAgLy8gQ09OVEVOVF9CUk9XU0VSX0RPTV9TVE9SQUdFX1RFU1RfRkFLRV9MRVZFTERCX0RBVEFCQVNFX0VSUk9SX09OX1dSSVRFX0hfCmRpZmYgLS1naXQgYS9jb250ZW50L2Jyb3dzZXIvZnJhbWVfaG9zdC9yZW5kZXJfZnJhbWVfaG9zdF9kZWxlZ2F0ZS5oIGIvY29udGVudC9icm93c2VyL2ZyYW1lX2hvc3QvcmVuZGVyX2ZyYW1lX2hvc3RfZGVsZWdhdGUuaAppbmRleCBlNzg2ZDQ4Li5lYmJhNGE2YiAxMDA2NDQKLS0tIGEvY29udGVudC9icm93c2VyL2ZyYW1lX2hvc3QvcmVuZGVyX2ZyYW1lX2hvc3RfZGVsZWdhdGUuaAorKysgYi9jb250ZW50L2Jyb3dzZXIvZnJhbWVfaG9zdC9yZW5kZXJfZnJhbWVfaG9zdF9kZWxlZ2F0ZS5oCkBAIC0yMTAsMTEgKzIxMCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpzdHJpbmcxNiYgdGl0bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjppMThuOjpUZXh0RGlyZWN0aW9uIHRpdGxlX2RpcmVjdGlvbikge30KIAotICAvLyBUaGUgcGFnZSdzIGVuY29kaW5nIHdhcyBjaGFuZ2VkIGFuZCBzaG91bGQgYmUgdXBkYXRlZC4gT25seSBjYWxsZWQgZm9yIHRoZQotICAvLyB0b3AtbGV2ZWwgZnJhbWUuCi0gIHZpcnR1YWwgdm9pZCBVcGRhdGVFbmNvZGluZyhSZW5kZXJGcmFtZUhvc3QqIHJlbmRlcl9mcmFtZV9ob3N0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGVuY29kaW5nKSB7fQotCiAgIC8vIFJldHVybiB0aGlzIG9iamVjdCBjYXN0IHRvIGEgV2ViQ29udGVudHMsIGlmIGl0IGlzIG9uZS4gSWYgdGhlIG9iamVjdCBpcwogICAvLyBub3QgYSBXZWJDb250ZW50cywgcmV0dXJucyBOVUxMLgogICB2aXJ0dWFsIFdlYkNvbnRlbnRzKiBHZXRBc1dlYkNvbnRlbnRzKCk7CmRpZmYgLS1naXQgYS9jb250ZW50L2Jyb3dzZXIvZnJhbWVfaG9zdC9yZW5kZXJfZnJhbWVfaG9zdF9pbXBsLmNjIGIvY29udGVudC9icm93c2VyL2ZyYW1lX2hvc3QvcmVuZGVyX2ZyYW1lX2hvc3RfaW1wbC5jYwppbmRleCAxZThjNjgyLi5kZjIzMDQxIDEwMDY0NAotLS0gYS9jb250ZW50L2Jyb3dzZXIvZnJhbWVfaG9zdC9yZW5kZXJfZnJhbWVfaG9zdF9pbXBsLmNjCisrKyBiL2NvbnRlbnQvYnJvd3Nlci9mcmFtZV9ob3N0L3JlbmRlcl9mcmFtZV9ob3N0X2ltcGwuY2MKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlICJiYXNlL2RlYnVnL2FsaWFzLmgiCiAjaW5jbHVkZSAiYmFzZS9kZWJ1Zy9kdW1wX3dpdGhvdXRfY3Jhc2hpbmcuaCIKICNpbmNsdWRlICJiYXNlL2hhc2gvaGFzaC5oIgorI2luY2x1ZGUgImJhc2UvaTE4bi9jaGFyYWN0ZXJfZW5jb2RpbmcuaCIKICNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKICNpbmNsdWRlICJiYXNlL21lbW9yeS9wdHJfdXRpbC5oIgogI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCkBAIC0xMzA0LDEzICsxMzA1LDE1IEBACiAgICAgICBzdGQ6Om1vdmUoZGVmYXVsdF9mYWN0b3J5X3JlcXVlc3QpKTsKIH0KIAotdm9pZCBSZW5kZXJGcmFtZUhvc3RJbXBsOjpNYXJrSW5pdGlhdG9yc0FzUmVxdWlyaW5nU2VwYXJhdGVVUkxMb2FkZXJGYWN0b3J5KAotICAgIGJhc2U6OmZsYXRfc2V0PHVybDo6T3JpZ2luPiByZXF1ZXN0X2luaXRpYXRvcnMsCit2b2lkIFJlbmRlckZyYW1lSG9zdEltcGw6Ok1hcmtJc29sYXRlZFdvcmxkc0FzUmVxdWlyaW5nU2VwYXJhdGVVUkxMb2FkZXJGYWN0b3J5KAorICAgIGJhc2U6OmZsYXRfc2V0PHVybDo6T3JpZ2luPiBpc29sYXRlZF93b3JsZF9vcmlnaW5zLAogICAgIGJvb2wgcHVzaF90b19yZW5kZXJlcl9ub3cpIHsKLSAgc2l6ZV90IG9sZF9zaXplID0gaW5pdGlhdG9yc19yZXF1aXJpbmdfc2VwYXJhdGVfdXJsX2xvYWRlcl9mYWN0b3J5Xy5zaXplKCk7Ci0gIGluaXRpYXRvcnNfcmVxdWlyaW5nX3NlcGFyYXRlX3VybF9sb2FkZXJfZmFjdG9yeV8uaW5zZXJ0KAotICAgICAgcmVxdWVzdF9pbml0aWF0b3JzLmJlZ2luKCksIHJlcXVlc3RfaW5pdGlhdG9ycy5lbmQoKSk7Ci0gIHNpemVfdCBuZXdfc2l6ZSA9IGluaXRpYXRvcnNfcmVxdWlyaW5nX3NlcGFyYXRlX3VybF9sb2FkZXJfZmFjdG9yeV8uc2l6ZSgpOworICBzaXplX3Qgb2xkX3NpemUgPQorICAgICAgaXNvbGF0ZWRfd29ybGRzX3JlcXVpcmluZ19zZXBhcmF0ZV91cmxfbG9hZGVyX2ZhY3RvcnlfLnNpemUoKTsKKyAgaXNvbGF0ZWRfd29ybGRzX3JlcXVpcmluZ19zZXBhcmF0ZV91cmxfbG9hZGVyX2ZhY3RvcnlfLmluc2VydCgKKyAgICAgIGlzb2xhdGVkX3dvcmxkX29yaWdpbnMuYmVnaW4oKSwgaXNvbGF0ZWRfd29ybGRfb3JpZ2lucy5lbmQoKSk7CisgIHNpemVfdCBuZXdfc2l6ZSA9CisgICAgICBpc29sYXRlZF93b3JsZHNfcmVxdWlyaW5nX3NlcGFyYXRlX3VybF9sb2FkZXJfZmFjdG9yeV8uc2l6ZSgpOwogICBib29sIGluc2VydGlvbl90b29rX3BsYWNlID0gKG9sZF9zaXplICE9IG5ld19zaXplKTsKIAogICAvLyBQdXNoIHRoZSB1cGRhdGVkIHNldCBvZiBmYWN0b3JpZXMgdG8gdGhlIHJlbmRlcmVyLCBidXQgb25seSBpZgpAQCAtMTMyNyw4ICsxMzMwLDggQEAKICAgICBzdGQ6OnVuaXF1ZV9wdHI8Ymxpbms6OlVSTExvYWRlckZhY3RvcnlCdW5kbGVJbmZvPgogICAgICAgICBzdWJyZXNvdXJjZV9sb2FkZXJfZmFjdG9yaWVzID0KICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8Ymxpbms6OlVSTExvYWRlckZhY3RvcnlCdW5kbGVJbmZvPigpOwotICAgIHN1YnJlc291cmNlX2xvYWRlcl9mYWN0b3JpZXMtPnBlbmRpbmdfaW5pdGlhdG9yX3NwZWNpZmljX2ZhY3RvcmllcygpID0KLSAgICAgICAgQ3JlYXRlSW5pdGlhdG9yU3BlY2lmaWNVUkxMb2FkZXJGYWN0b3JpZXMocmVxdWVzdF9pbml0aWF0b3JzKTsKKyAgICBzdWJyZXNvdXJjZV9sb2FkZXJfZmFjdG9yaWVzLT5wZW5kaW5nX2lzb2xhdGVkX3dvcmxkX2ZhY3RvcmllcygpID0KKyAgICAgICAgQ3JlYXRlVVJMTG9hZGVyRmFjdG9yaWVzRm9ySXNvbGF0ZWRXb3JsZHMoaXNvbGF0ZWRfd29ybGRfb3JpZ2lucyk7CiAgICAgR2V0TmF2aWdhdGlvbkNvbnRyb2woKS0+VXBkYXRlU3VicmVzb3VyY2VMb2FkZXJGYWN0b3JpZXMoCiAgICAgICAgIHN0ZDo6bW92ZShzdWJyZXNvdXJjZV9sb2FkZXJfZmFjdG9yaWVzKSk7CiAgIH0KQEAgLTEzNDUsMTAgKzEzNDgsMTAgQEAKIH0KIAogYmxpbms6OlVSTExvYWRlckZhY3RvcnlCdW5kbGVJbmZvOjpPcmlnaW5NYXAKLVJlbmRlckZyYW1lSG9zdEltcGw6OkNyZWF0ZUluaXRpYXRvclNwZWNpZmljVVJMTG9hZGVyRmFjdG9yaWVzKAotICAgIGNvbnN0IGJhc2U6OmZsYXRfc2V0PHVybDo6T3JpZ2luPiYgaW5pdGlhdG9yX29yaWdpbnMpIHsKK1JlbmRlckZyYW1lSG9zdEltcGw6OkNyZWF0ZVVSTExvYWRlckZhY3Rvcmllc0Zvcklzb2xhdGVkV29ybGRzKAorICAgIGNvbnN0IGJhc2U6OmZsYXRfc2V0PHVybDo6T3JpZ2luPiYgaXNvbGF0ZWRfd29ybGRfb3JpZ2lucykgewogICBibGluazo6VVJMTG9hZGVyRmFjdG9yeUJ1bmRsZUluZm86Ok9yaWdpbk1hcCByZXN1bHQ7Ci0gIGZvciAoY29uc3QgdXJsOjpPcmlnaW4mIGluaXRpYXRvciA6IGluaXRpYXRvcl9vcmlnaW5zKSB7CisgIGZvciAoY29uc3QgdXJsOjpPcmlnaW4mIGluaXRpYXRvciA6IGlzb2xhdGVkX3dvcmxkX29yaWdpbnMpIHsKICAgICBuZXR3b3JrOjptb2pvbTo6VVJMTG9hZGVyRmFjdG9yeVB0ckluZm8gZmFjdG9yeV9pbmZvOwogICAgIENyZWF0ZU5ldHdvcmtTZXJ2aWNlRGVmYXVsdEZhY3RvcnlBbmRPYnNlcnZlKAogICAgICAgICBpbml0aWF0b3IsIG5ldHdvcmtfaXNvbGF0aW9uX2tleV8sIG1vam86Ok1ha2VSZXF1ZXN0KCZmYWN0b3J5X2luZm8pKTsKQEAgLTMxNjQsOCArMzE2Nyw4IEBACiAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxibGluazo6VVJMTG9hZGVyRmFjdG9yeUJ1bmRsZUluZm8+KAogICAgICAgICAgICAgICBzdGQ6Om1vdmUoZGVmYXVsdF9mYWN0b3J5X2luZm8pLAogICAgICAgICAgICAgICBibGluazo6VVJMTG9hZGVyRmFjdG9yeUJ1bmRsZUluZm86OlNjaGVtZU1hcCgpLAotICAgICAgICAgICAgICBDcmVhdGVJbml0aWF0b3JTcGVjaWZpY1VSTExvYWRlckZhY3RvcmllcygKLSAgICAgICAgICAgICAgICAgIGluaXRpYXRvcnNfcmVxdWlyaW5nX3NlcGFyYXRlX3VybF9sb2FkZXJfZmFjdG9yeV8pLAorICAgICAgICAgICAgICBDcmVhdGVVUkxMb2FkZXJGYWN0b3JpZXNGb3JJc29sYXRlZFdvcmxkcygKKyAgICAgICAgICAgICAgICAgIGlzb2xhdGVkX3dvcmxkc19yZXF1aXJpbmdfc2VwYXJhdGVfdXJsX2xvYWRlcl9mYWN0b3J5XyksCiAgICAgICAgICAgICAgIGJ5cGFzc19yZWRpcmVjdF9jaGVja3MpOwogICBHZXROYXZpZ2F0aW9uQ29udHJvbCgpLT5VcGRhdGVTdWJyZXNvdXJjZUxvYWRlckZhY3RvcmllcygKICAgICAgIHN0ZDo6bW92ZShzdWJyZXNvdXJjZV9sb2FkZXJfZmFjdG9yaWVzKSk7CkBAIC0zMzI3LDcgKzMzMzAsMTIgQEAKIHZvaWQgUmVuZGVyRnJhbWVIb3N0SW1wbDo6VXBkYXRlRW5jb2RpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGVuY29kaW5nX25hbWUpIHsKICAgLy8gVGhpcyBtZXNzYWdlIGlzIG9ubHkgc2VudCBmb3IgdG9wLWxldmVsIGZyYW1lcy4gVE9ETyhhdmkpOiB3aGVuIGZyYW1lIHRyZWUKICAgLy8gbWlycm9yaW5nIHdvcmtzIGNvcnJlY3RseSwgYWRkIGEgY2hlY2sgaGVyZSB0byBlbmZvcmNlIGl0LgotICBkZWxlZ2F0ZV8tPlVwZGF0ZUVuY29kaW5nKHRoaXMsIGVuY29kaW5nX25hbWUpOworICBpZiAoZW5jb2RpbmdfbmFtZSA9PSBsYXN0X3JlcG9ydGVkX2VuY29kaW5nXykKKyAgICByZXR1cm47CisgIGxhc3RfcmVwb3J0ZWRfZW5jb2RpbmdfID0gZW5jb2RpbmdfbmFtZTsKKworICBjYW5vbmljYWxfZW5jb2RpbmdfID0KKyAgICAgIGJhc2U6OkdldENhbm9uaWNhbEVuY29kaW5nTmFtZUJ5QWxpYXNOYW1lKGVuY29kaW5nX25hbWUpOwogfQogCiB2b2lkIFJlbmRlckZyYW1lSG9zdEltcGw6OkZyYW1lU2l6ZUNoYW5nZWQoY29uc3QgZ2Z4OjpTaXplJiBmcmFtZV9zaXplKSB7CkBAIC0zNTE3LDYgKzM1MjUsMTYgQEAKICAgICBmcmFtZV8tPlVwZGF0ZUJyb3dzZXJDb250cm9sc1N0YXRlKGNvbnN0cmFpbnRzLCBjdXJyZW50LCBhbmltYXRlKTsKIH0KIAordm9pZCBSZW5kZXJGcmFtZUhvc3RJbXBsOjpSZWxvYWQoKSB7CisgIGlmICghSXNSZW5kZXJGcmFtZUxpdmUoKSkKKyAgICByZXR1cm47CisKKyAgLy8gVE9ETyhodHRwczovL2NyYnVnLmNvbS85OTU0MjgpLiBUaGlzIElQQyBpcyBkZXByZWNhdGVkLiBOYXZpZ2F0aW9ucyBhcmUKKyAgLy8gaGFuZGxlZCBmcm9tIHRoZSBicm93c2VyIHByb2Nlc3MuIFRoZXJlIGlzIG5vIG5lZWQgdG8gc2VuZCBhbiBJUEMgdG8gdGhlCisgIC8vIHJlbmRlcmVyIHByb2Nlc3MgZm9yIHRoaXMuCisgIFNlbmQobmV3IEZyYW1lTXNnX1JlbG9hZChHZXRSb3V0aW5nSUQoKSkpOworfQorCiB2b2lkIFJlbmRlckZyYW1lSG9zdEltcGw6OlNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRzVG9NYW5hZ2VyKAogICAgIGNvbnN0IEFYRXZlbnROb3RpZmljYXRpb25EZXRhaWxzJiBkZXRhaWxzKSB7CiAgIGlmIChicm93c2VyX2FjY2Vzc2liaWxpdHlfbWFuYWdlcl8gJiYKQEAgLTQxMDksOCArNDEyNyw4IEBACiAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPGJsaW5rOjpVUkxMb2FkZXJGYWN0b3J5QnVuZGxlSW5mbz4oCiAgICAgICBzdGQ6Om1vdmUocGVuZGluZ19kZWZhdWx0X2ZhY3RvcnkpLAogICAgICAgYmxpbms6OlVSTExvYWRlckZhY3RvcnlCdW5kbGVJbmZvOjpTY2hlbWVNYXAoKSwKLSAgICAgIENyZWF0ZUluaXRpYXRvclNwZWNpZmljVVJMTG9hZGVyRmFjdG9yaWVzKAotICAgICAgICAgIGluaXRpYXRvcnNfcmVxdWlyaW5nX3NlcGFyYXRlX3VybF9sb2FkZXJfZmFjdG9yeV8pLAorICAgICAgQ3JlYXRlVVJMTG9hZGVyRmFjdG9yaWVzRm9ySXNvbGF0ZWRXb3JsZHMoCisgICAgICAgICAgaXNvbGF0ZWRfd29ybGRzX3JlcXVpcmluZ19zZXBhcmF0ZV91cmxfbG9hZGVyX2ZhY3RvcnlfKSwKICAgICAgIGJ5cGFzc19yZWRpcmVjdF9jaGVja3MpOwogfQogCkBAIC01MzUyLDkgKzUzNzAsOSBAQAogICAgICAgICAgIGZhY3RvcnkuZmlyc3QsIHN0ZDo6bW92ZShwZW5kaW5nX2ZhY3RvcnlfcHJveHkpKTsKICAgICB9CiAKLSAgICBzdWJyZXNvdXJjZV9sb2FkZXJfZmFjdG9yaWVzLT5wZW5kaW5nX2luaXRpYXRvcl9zcGVjaWZpY19mYWN0b3JpZXMoKSA9Ci0gICAgICAgIENyZWF0ZUluaXRpYXRvclNwZWNpZmljVVJMTG9hZGVyRmFjdG9yaWVzKAotICAgICAgICAgICAgaW5pdGlhdG9yc19yZXF1aXJpbmdfc2VwYXJhdGVfdXJsX2xvYWRlcl9mYWN0b3J5Xyk7CisgICAgc3VicmVzb3VyY2VfbG9hZGVyX2ZhY3Rvcmllcy0+cGVuZGluZ19pc29sYXRlZF93b3JsZF9mYWN0b3JpZXMoKSA9CisgICAgICAgIENyZWF0ZVVSTExvYWRlckZhY3Rvcmllc0Zvcklzb2xhdGVkV29ybGRzKAorICAgICAgICAgICAgaXNvbGF0ZWRfd29ybGRzX3JlcXVpcmluZ19zZXBhcmF0ZV91cmxfbG9hZGVyX2ZhY3RvcnlfKTsKICAgfQogCiAgIC8vIEl0IGlzIGltcGVyYXRpdmUgdGhhdCBjcm9zcy1kb2N1bWVudCBuYXZpZ2F0aW9ucyBhbHdheXMgcHJvdmlkZSBhIHNldCBvZgpkaWZmIC0tZ2l0IGEvY29udGVudC9icm93c2VyL2ZyYW1lX2hvc3QvcmVuZGVyX2ZyYW1lX2hvc3RfaW1wbC5oIGIvY29udGVudC9icm93c2VyL2ZyYW1lX2hvc3QvcmVuZGVyX2ZyYW1lX2hvc3RfaW1wbC5oCmluZGV4IDIwNjQwODMuLjc4MjdmNjcgMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvYnJvd3Nlci9mcmFtZV9ob3N0L3JlbmRlcl9mcmFtZV9ob3N0X2ltcGwuaAorKysgYi9jb250ZW50L2Jyb3dzZXIvZnJhbWVfaG9zdC9yZW5kZXJfZnJhbWVfaG9zdF9pbXBsLmgKQEAgLTMwMCw4ICszMDAsOCBAQAogICAgICAgY29uc3QgYmxpbms6OldlYk1lZGlhUGxheWVyQWN0aW9uJiBhY3Rpb24pIG92ZXJyaWRlOwogICBib29sIENyZWF0ZU5ldHdvcmtTZXJ2aWNlRGVmYXVsdEZhY3RvcnkoCiAgICAgICBuZXR3b3JrOjptb2pvbTo6VVJMTG9hZGVyRmFjdG9yeVJlcXVlc3QgZGVmYXVsdF9mYWN0b3J5X3JlcXVlc3QpIG92ZXJyaWRlOwotICB2b2lkIE1hcmtJbml0aWF0b3JzQXNSZXF1aXJpbmdTZXBhcmF0ZVVSTExvYWRlckZhY3RvcnkoCi0gICAgICBiYXNlOjpmbGF0X3NldDx1cmw6Ok9yaWdpbj4gcmVxdWVzdF9pbml0aWF0b3JzLAorICB2b2lkIE1hcmtJc29sYXRlZFdvcmxkc0FzUmVxdWlyaW5nU2VwYXJhdGVVUkxMb2FkZXJGYWN0b3J5KAorICAgICAgYmFzZTo6ZmxhdF9zZXQ8dXJsOjpPcmlnaW4+IGlzb2xhdGVkX3dvcmxkX29yaWdpbnMsCiAgICAgICBib29sIHB1c2hfdG9fcmVuZGVyZXJfbm93KSBvdmVycmlkZTsKICAgYm9vbCBJc1NhbmRib3hlZChibGluazo6V2ViU2FuZGJveEZsYWdzIGZsYWdzKSBvdmVycmlkZTsKICAgdm9pZCBGbHVzaE5ldHdvcmtBbmROYXZpZ2F0aW9uSW50ZXJmYWNlc0ZvclRlc3RpbmcoKSBvdmVycmlkZTsKQEAgLTMxMyw2ICszMTMsNyBAQAogICB2b2lkIFVwZGF0ZUJyb3dzZXJDb250cm9sc1N0YXRlKEJyb3dzZXJDb250cm9sc1N0YXRlIGNvbnN0cmFpbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJyb3dzZXJDb250cm9sc1N0YXRlIGN1cnJlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbmltYXRlKSBvdmVycmlkZTsKKyAgdm9pZCBSZWxvYWQoKSBvdmVycmlkZTsKIAogICB2b2lkIFNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRzVG9NYW5hZ2VyKAogICAgICAgY29uc3QgQVhFdmVudE5vdGlmaWNhdGlvbkRldGFpbHMmIGRldGFpbHMpOwpAQCAtMTE3OCw2ICsxMTc5LDggQEAKICAgLy8gTmF2aWdhdGlvbkVudHJ5IHRoaXMgUmVuZGVyRnJhbWVIb3N0SW1wbCBjb21taXR0ZWQuCiAgIEJhY2tGb3J3YXJkQ2FjaGVNZXRyaWNzKiBHZXRCYWNrRm9yd2FyZENhY2hlTWV0cmljcygpOwogCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBHZXRFbmNvZGluZygpIGNvbnN0IHsgcmV0dXJuIGNhbm9uaWNhbF9lbmNvZGluZ187IH0KKwogICBiYXNlOjpXZWFrUHRyPFJlbmRlckZyYW1lSG9zdEltcGw+IEdldFdlYWtQdHIoKTsKIAogIHByb3RlY3RlZDoKQEAgLTE4MTIsMTEgKzE4MTUsMTAgQEAKICAgc3RkOjp1bmlxdWVfcHRyPGJhc2U6OnRyYWNlX2V2ZW50OjpUcmFjZWRWYWx1ZT4gQ29tbWl0QXNUcmFjZWRWYWx1ZSgKICAgICAgIEZyYW1lSG9zdE1zZ19EaWRDb21taXRQcm92aXNpb25hbExvYWRfUGFyYW1zKiB2YWxpZGF0ZWRfcGFyYW1zKSBjb25zdDsKIAotICAvLyBDcmVhdGVzIGluaXRpYXRvci1zcGVjaWZpYyBVUkxMb2FkZXJGYWN0b3J5IG9iamVjdHMgZm9yCi0gIC8vIHxpbml0aWF0b3Jfb3JpZ2luc3wuCisgIC8vIENyZWF0ZXMgVVJMTG9hZGVyRmFjdG9yeSBvYmplY3RzIGZvciB8aXNvbGF0ZWRfd29ybGRfb3JpZ2luc3wuCiAgIGJsaW5rOjpVUkxMb2FkZXJGYWN0b3J5QnVuZGxlSW5mbzo6T3JpZ2luTWFwCi0gIENyZWF0ZUluaXRpYXRvclNwZWNpZmljVVJMTG9hZGVyRmFjdG9yaWVzKAotICAgICAgY29uc3QgYmFzZTo6ZmxhdF9zZXQ8dXJsOjpPcmlnaW4+JiBpbml0aWF0b3Jfb3JpZ2lucyk7CisgIENyZWF0ZVVSTExvYWRlckZhY3Rvcmllc0Zvcklzb2xhdGVkV29ybGRzKAorICAgICAgY29uc3QgYmFzZTo6ZmxhdF9zZXQ8dXJsOjpPcmlnaW4+JiBpc29sYXRlZF93b3JsZF9vcmlnaW5zKTsKIAogICAvLyBCYXNlZCBvbiB0aGUgdGVybWluYXRpb24gfHN0YXR1c3wgYW5kIHxleGl0X2NvZGV8LCBtYXkgZ2VuZXJhdGUgYSBjcmFzaAogICAvLyByZXBvcnQgdG8gYmUgcm91dGVkIHRvIHRoZSBSZXBvcnRpbmcgQVBJLgpAQCAtMjM2NiwxNCArMjM2OCwxNSBAQAogCiAgIC8vIFdoZXRoZXIgVXBkYXRlU3VicmVzb3VyY2VMb2FkZXJGYWN0b3JpZXMgc2hvdWxkIHJlY3JlYXRlIHRoZSBkZWZhdWx0CiAgIC8vIFVSTExvYWRlckZhY3Rvcnkgd2hlbiBoYW5kbGluZyBhIE5ldHdvcmtTZXJ2aWNlIGNyYXNoLiAgSW4gY2FzZSB0aGUgZnJhbWUKLSAgLy8gaXMgY292ZXJlZCBieSBBcHBDYWNoZSwgb25seSBpbml0aWF0b3Itc3BlY2lmaWMgZmFjdG9yaWVzIG5lZWQgdG8gYmUKKyAgLy8gaXMgY292ZXJlZCBieSBBcHBDYWNoZSwgb25seSBpc29sYXRlZC13b3JsZC1zcGVjaWZpYyBmYWN0b3JpZXMgbmVlZCB0byBiZQogICAvLyByZWZyZXNoZWQsIGJ1dCB0aGUgbWFpbiwgQXBwQ2FjaGUtc3BlY2lmaWMgZmFjdG9yeSBzaG91bGRuJ3QgYmUgcmVmcmVzaGVkLgogICBib29sIHJlY3JlYXRlX2RlZmF1bHRfdXJsX2xvYWRlcl9mYWN0b3J5X2FmdGVyX25ldHdvcmtfc2VydmljZV9jcmFzaF8gPSBmYWxzZTsKIAotICAvLyBTZXQgb2YgcmVxdWVzdC1pbml0aWF0b3Itb3JpZ2lucyB0aGF0IHJlcXVpcmUgYSBzZXBhcmF0ZSBVUkxMb2FkZXJGYWN0b3J5CisgIC8vIFNldCBvZiBpc29sYXRlZCB3b3JsZCBvcmlnaW5zIHRoYXQgcmVxdWlyZSBhIHNlcGFyYXRlIFVSTExvYWRlckZhY3RvcnkKICAgLy8gKGUuZy4gZm9yIGhhbmRsaW5nIHJlcXVlc3RzIGluaXRpYXRlZCBieSBleHRlbnNpb24gY29udGVudCBzY3JpcHRzIHRoYXQKICAgLy8gcmVxdWlyZSByZWxheGVkIENPUlMvQ09SQiBydWxlcykuCi0gIGJhc2U6OmZsYXRfc2V0PHVybDo6T3JpZ2luPiBpbml0aWF0b3JzX3JlcXVpcmluZ19zZXBhcmF0ZV91cmxfbG9hZGVyX2ZhY3RvcnlfOworICBiYXNlOjpmbGF0X3NldDx1cmw6Ok9yaWdpbj4KKyAgICAgIGlzb2xhdGVkX3dvcmxkc19yZXF1aXJpbmdfc2VwYXJhdGVfdXJsX2xvYWRlcl9mYWN0b3J5XzsKIAogICAvLyBIb2xkcyB0aGUgcmVuZGVyZXIgZ2VuZXJhdGVkIElEIGFuZCBnbG9iYWwgcmVxdWVzdCBJRCBmb3IgdGhlIG1haW4gZnJhbWUKICAgLy8gcmVxdWVzdC4KQEAgLTI0MjYsNiArMjQyOSwxMiBAQAogICAvLyBicm93c2VyIHNpZGUgc3RhdGUgYXMgdGhpcyB2YWx1ZSBpcyB1c2VkIGluIHNlY3VyaXR5IGNoZWNrcy4KICAgYm9vbCBpc19taHRtbF9kb2N1bWVudF8gPSBmYWxzZTsKIAorICAvLyBUaGUgbGFzdCByZXBvcnRlZCBjaGFyYWN0ZXIgZW5jb2RpbmcsIG5vdCBjYW5vbmljYWxpemVkLgorICBzdGQ6OnN0cmluZyBsYXN0X3JlcG9ydGVkX2VuY29kaW5nXzsKKworICAvLyBUaGUgY2Fub25pY2FsaXplZCBjaGFyYWN0ZXIgZW5jb2RpbmcuCisgIHN0ZDo6c3RyaW5nIGNhbm9uaWNhbF9lbmNvZGluZ187CisKICAgLy8gVXNlZCB0byBpbnRlcmNlcHQgRGlkQ29tbWl0KiBjYWxscyBpbiB0ZXN0cy4KICAgQ29tbWl0Q2FsbGJhY2tJbnRlcmNlcHRvciogY29tbWl0X2NhbGxiYWNrX2ludGVyY2VwdG9yXzsKIApkaWZmIC0tZ2l0IGEvY29udGVudC9icm93c2VyL2dlb2xvY2F0aW9uL2dlb2xvY2F0aW9uX3NlcnZpY2VfaW1wbF91bml0dGVzdC5jYyBiL2NvbnRlbnQvYnJvd3Nlci9nZW9sb2NhdGlvbi9nZW9sb2NhdGlvbl9zZXJ2aWNlX2ltcGxfdW5pdHRlc3QuY2MKaW5kZXggZTllNjM4Yy4uNDU4MDRlNSAxMDA2NDQKLS0tIGEvY29udGVudC9icm93c2VyL2dlb2xvY2F0aW9uL2dlb2xvY2F0aW9uX3NlcnZpY2VfaW1wbF91bml0dGVzdC5jYworKysgYi9jb250ZW50L2Jyb3dzZXIvZ2VvbG9jYXRpb24vZ2VvbG9jYXRpb25fc2VydmljZV9pbXBsX3VuaXR0ZXN0LmNjCkBAIC0xNTEsNyArMTUxLDcgQEAKIH0gIC8vIG5hbWVzcGFjZQogCiBURVNUX0YoR2VvbG9jYXRpb25TZXJ2aWNlVGVzdCwgUGVybWlzc2lvbkdyYW50ZWRQb2xpY3lWaW9sYXRpb24pIHsKLSAgLy8gVGhlIGVtYmVkZGVkIGZyYW1lIGlzIG5vdCB3aGl0ZWxpc3RlZC4KKyAgLy8gVGhlIGVtYmVkZGVkIGZyYW1lIGlzIG5vdCBhbGxvd2VkLgogICBDcmVhdGVFbWJlZGRlZEZyYW1lQW5kR2VvbG9jYXRpb25TZXJ2aWNlKC8qYWxsb3dfdmlhX2ZlYXR1cmVfcG9saWN5PSovZmFsc2UpOwogCiAgIHBlcm1pc3Npb25fbWFuYWdlcigpLT5TZXRSZXF1ZXN0Q2FsbGJhY2soCkBAIC0xNzUsNyArMTc1LDcgQEAKIH0KIAogVEVTVF9GKEdlb2xvY2F0aW9uU2VydmljZVRlc3QsIFBlcm1pc3Npb25HcmFudGVkTm9Qb2xpY3lWaW9sYXRpb24pIHsKLSAgLy8gV2hpdGVsaXN0IHRoZSBlbWJlZGRlZCBmcmFtZS4KKyAgLy8gQWxsb3cgdGhlIGVtYmVkZGVkIGZyYW1lLgogICBDcmVhdGVFbWJlZGRlZEZyYW1lQW5kR2VvbG9jYXRpb25TZXJ2aWNlKC8qYWxsb3dfdmlhX2ZlYXR1cmVfcG9saWN5PSovdHJ1ZSk7CiAKICAgcGVybWlzc2lvbl9tYW5hZ2VyKCktPlNldFJlcXVlc3RDYWxsYmFjaygKZGlmZiAtLWdpdCBhL2NvbnRlbnQvYnJvd3Nlci9sb2FkZXIvbG9hZGVyX2Jyb3dzZXJ0ZXN0LmNjIGIvY29udGVudC9icm93c2VyL2xvYWRlci9sb2FkZXJfYnJvd3NlcnRlc3QuY2MKaW5kZXggMmIzMzRmZTIuLjg5YjJhN2Y4IDEwMDY0NAotLS0gYS9jb250ZW50L2Jyb3dzZXIvbG9hZGVyL2xvYWRlcl9icm93c2VydGVzdC5jYworKysgYi9jb250ZW50L2Jyb3dzZXIvbG9hZGVyL2xvYWRlcl9icm93c2VydGVzdC5jYwpAQCAtMjk1LDcgKzI5NSw3IEBACiAgIGlmIChJc0luUHJvY2Vzc05ldHdvcmtTZXJ2aWNlKCkpCiAgICAgcmV0dXJuOwogCi0gIGVtYmVkZGVkX3Rlc3Rfc2VydmVyKCktPlJlZ2lzdGVyUmVxdWVzdEhhbmRsZXIoYmFzZTo6QmluZCgKKyAgZW1iZWRkZWRfdGVzdF9zZXJ2ZXIoKS0+UmVnaXN0ZXJSZXF1ZXN0SGFuZGxlcihiYXNlOjpCaW5kUmVwZWF0aW5nKAogICAgICAgJkNhbmNlbE9uUmVxdWVzdCwgIi9odW5nIiwKICAgICAgIHNoZWxsKCktPndlYl9jb250ZW50cygpLT5HZXRNYWluRnJhbWUoKS0+R2V0UHJvY2VzcygpLT5HZXRJRCgpLAogICAgICAgYmFzZTo6QmluZFJlcGVhdGluZygmQnJvd3NlclRlc3RCYXNlOjpTaW11bGF0ZU5ldHdvcmtTZXJ2aWNlQ3Jhc2gsCkBAIC0zNzYsNyArMzc2LDcgQEAKIElOX1BST0NfQlJPV1NFUl9URVNUX0YoTG9hZGVyQnJvd3NlclRlc3QsIENyb3NzU2l0ZU5vVW5sb2FkT24yMDQpIHsKICAgY29uc3QgY2hhciBrTm9Db250ZW50UGF0aFtdID0gIi9ub2NvbnRlbnQiOwogICBlbWJlZGRlZF90ZXN0X3NlcnZlcigpLT5SZWdpc3RlclJlcXVlc3RIYW5kbGVyKAotICAgICAgYmFzZTo6QmluZCgmTm9Db250ZW50UmVzcG9uc2VIYW5kbGVyLCBrTm9Db250ZW50UGF0aCkpOworICAgICAgYmFzZTo6QmluZFJlcGVhdGluZygmTm9Db250ZW50UmVzcG9uc2VIYW5kbGVyLCBrTm9Db250ZW50UGF0aCkpOwogCiAgIEFTU0VSVF9UUlVFKGVtYmVkZGVkX3Rlc3Rfc2VydmVyKCktPlN0YXJ0KCkpOwogCkBAIC01NjYsNyArNTY2LDcgQEAKIC8vIG5hdmlnYXRpb25zLgogSU5fUFJPQ19CUk9XU0VSX1RFU1RfRihMb2FkZXJCcm93c2VyVGVzdCwgQ29va2llUG9saWN5KSB7CiAgIGVtYmVkZGVkX3Rlc3Rfc2VydmVyKCktPlJlZ2lzdGVyUmVxdWVzdEhhbmRsZXIoCi0gICAgICBiYXNlOjpCaW5kKCZIYW5kbGVSZWRpcmVjdFJlcXVlc3QsICIvcmVkaXJlY3Q/IikpOworICAgICAgYmFzZTo6QmluZFJlcGVhdGluZygmSGFuZGxlUmVkaXJlY3RSZXF1ZXN0LCAiL3JlZGlyZWN0PyIpKTsKICAgQVNTRVJUX1RSVUUoZW1iZWRkZWRfdGVzdF9zZXJ2ZXIoKS0+U3RhcnQoKSk7CiAKICAgc3RkOjpzdHJpbmcgc2V0X2Nvb2tpZV91cmwoYmFzZTo6U3RyaW5nUHJpbnRmKApkaWZmIC0tZ2l0IGEvY29udGVudC9icm93c2VyL2xvYWRlci9yZWxvYWRfY2FjaGVfY29udHJvbF9icm93c2VydGVzdC5jYyBiL2NvbnRlbnQvYnJvd3Nlci9sb2FkZXIvcmVsb2FkX2NhY2hlX2NvbnRyb2xfYnJvd3NlcnRlc3QuY2MKaW5kZXggZjVkODdmYS4uNzAyZWY5NCAxMDA2NDQKLS0tIGEvY29udGVudC9icm93c2VyL2xvYWRlci9yZWxvYWRfY2FjaGVfY29udHJvbF9icm93c2VydGVzdC5jYworKysgYi9jb250ZW50L2Jyb3dzZXIvbG9hZGVyL3JlbG9hZF9jYWNoZV9jb250cm9sX2Jyb3dzZXJ0ZXN0LmNjCkBAIC03Myw3ICs3Myw3IEBACiAgICAgLy8gYSByZWdpc3RlcmVkIEhhbmRsZUZpbGVSZXF1ZXN0IGZvciAiY29udGVudC90ZXN0L2RhdGEiLgogICAgIC8vIEJlY2F1c2UgdGhlIGhhbmRsZXIgaXMgcmVnaXN0ZXJlZCBhcyB0aGUgZmlyc3QgaGFuZGxlciwgTW9uaXRvckhhbmRsZXIKICAgICAvLyBpcyBuZWVkZWQgdG8gY2FwdHVyZSBhbGwgcmVxdWVzdHMuCi0gICAgZW1iZWRkZWRfdGVzdF9zZXJ2ZXIoKS0+UmVnaXN0ZXJSZXF1ZXN0TW9uaXRvcihiYXNlOjpCaW5kKAorICAgIGVtYmVkZGVkX3Rlc3Rfc2VydmVyKCktPlJlZ2lzdGVyUmVxdWVzdE1vbml0b3IoYmFzZTo6QmluZFJlcGVhdGluZygKICAgICAgICAgJlJlbG9hZENhY2hlQ29udHJvbEJyb3dzZXJUZXN0OjpNb25pdG9yUmVxdWVzdEhhbmRsZXIsCiAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKIApkaWZmIC0tZ2l0IGEvY29udGVudC9icm93c2VyL21lZGlhL21lZGlhX2RldmljZXNfcGVybWlzc2lvbl9jaGVja2VyX3VuaXR0ZXN0LmNjIGIvY29udGVudC9icm93c2VyL21lZGlhL21lZGlhX2RldmljZXNfcGVybWlzc2lvbl9jaGVja2VyX3VuaXR0ZXN0LmNjCmluZGV4IDQwZDlkODAuLmU0NzIwMGIgMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvYnJvd3Nlci9tZWRpYS9tZWRpYV9kZXZpY2VzX3Blcm1pc3Npb25fY2hlY2tlcl91bml0dGVzdC5jYworKysgYi9jb250ZW50L2Jyb3dzZXIvbWVkaWEvbWVkaWFfZGV2aWNlc19wZXJtaXNzaW9uX2NoZWNrZXJfdW5pdHRlc3QuY2MKQEAgLTUzLDExICs1MywxMSBAQAogICB2b2lkIFJlZnJlc2hQYWdlQW5kU2V0SGVhZGVyUG9saWN5KGJsaW5rOjptb2pvbTo6RmVhdHVyZVBvbGljeUZlYXR1cmUgZmVhdHVyZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuYWJsZWQpIHsKICAgICBOYXZpZ2F0ZUFuZENvbW1pdChvcmlnaW5fLkdldFVSTCgpKTsKLSAgICBzdGQ6OnZlY3Rvcjx1cmw6Ok9yaWdpbj4gd2hpdGVsaXN0OworICAgIHN0ZDo6dmVjdG9yPHVybDo6T3JpZ2luPiBhbGxvd2xpc3Q7CiAgICAgaWYgKGVuYWJsZWQpCi0gICAgICB3aGl0ZWxpc3QucHVzaF9iYWNrKG9yaWdpbl8pOworICAgICAgYWxsb3dsaXN0LnB1c2hfYmFjayhvcmlnaW5fKTsKICAgICBSZW5kZXJGcmFtZUhvc3RUZXN0ZXI6OkZvcihtYWluX3JmaCgpKQotICAgICAgICAtPlNpbXVsYXRlRmVhdHVyZVBvbGljeUhlYWRlcihmZWF0dXJlLCB3aGl0ZWxpc3QpOworICAgICAgICAtPlNpbXVsYXRlRmVhdHVyZVBvbGljeUhlYWRlcihmZWF0dXJlLCBhbGxvd2xpc3QpOwogICB9CiAKICAgYm9vbCBDaGVja1Blcm1pc3Npb24oYmxpbms6Ok1lZGlhRGV2aWNlVHlwZSBkZXZpY2VfdHlwZSkgewpkaWZmIC0tZ2l0IGEvY29udGVudC9icm93c2VyL25hdGl2ZV9maWxlX3N5c3RlbS9maWxlX3N5c3RlbV9jaG9vc2VyX2Jyb3dzZXJ0ZXN0LmNjIGIvY29udGVudC9icm93c2VyL25hdGl2ZV9maWxlX3N5c3RlbS9maWxlX3N5c3RlbV9jaG9vc2VyX2Jyb3dzZXJ0ZXN0LmNjCmluZGV4IDc3N2MxOGI4Li5lODUwMjgyIDEwMDY0NAotLS0gYS9jb250ZW50L2Jyb3dzZXIvbmF0aXZlX2ZpbGVfc3lzdGVtL2ZpbGVfc3lzdGVtX2Nob29zZXJfYnJvd3NlcnRlc3QuY2MKKysrIGIvY29udGVudC9icm93c2VyL25hdGl2ZV9maWxlX3N5c3RlbS9maWxlX3N5c3RlbV9jaG9vc2VyX2Jyb3dzZXJ0ZXN0LmNjCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvYnJvd3Nlci9yZW5kZXJfcHJvY2Vzc19ob3N0LmgiCiAjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvYnJvd3Nlci9zdG9yYWdlX3BhcnRpdGlvbi5oIgogI2luY2x1ZGUgImNvbnRlbnQvcHVibGljL2NvbW1vbi9jb250ZW50X3N3aXRjaGVzLmgiCisjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvdGVzdC9iYWNrX2ZvcndhcmRfY2FjaGVfdXRpbC5oIgogI2luY2x1ZGUgImNvbnRlbnQvcHVibGljL3Rlc3QvYnJvd3Nlcl90ZXN0X3V0aWxzLmgiCiAjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvdGVzdC9jb250ZW50X2Jyb3dzZXJfdGVzdC5oIgogI2luY2x1ZGUgImNvbnRlbnQvcHVibGljL3Rlc3QvY29udGVudF9icm93c2VyX3Rlc3RfdXRpbHMuaCIKQEAgLTM5OSw0ICs0MDAsMjYgQEAKICAgICAgICAgICAgIGRpYWxvZ19wYXJhbXMuZmlsZV90eXBlcy0+ZXh0ZW5zaW9uX2Rlc2NyaXB0aW9uX292ZXJyaWRlc1sxXSk7CiB9CiAKK0lOX1BST0NfQlJPV1NFUl9URVNUX0YoRmlsZVN5c3RlbUNob29zZXJCcm93c2VyVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgTmF0aXZlRmlsZVN5c3RlbVVzYWdlRGlzYWJsZXNCYWNrRm9yd2FyZENhY2hlKSB7CisgIEJhY2tGb3J3YXJkQ2FjaGVEaXNhYmxlZFRlc3RlciB0ZXN0ZXI7CisKKyAgY29uc3QgYmFzZTo6RmlsZVBhdGggdGVzdF9maWxlID0gQ3JlYXRlVGVzdEZpbGUoImZpbGUgY29udGVudHMiKTsKKyAgU2VsZWN0RmlsZURpYWxvZ1BhcmFtcyBkaWFsb2dfcGFyYW1zOworICB1aTo6U2VsZWN0RmlsZURpYWxvZzo6U2V0RmFjdG9yeSgKKyAgICAgIG5ldyBGYWtlU2VsZWN0RmlsZURpYWxvZ0ZhY3Rvcnkoe3Rlc3RfZmlsZX0sICZkaWFsb2dfcGFyYW1zKSk7CisgIEFTU0VSVF9UUlVFKAorICAgICAgTmF2aWdhdGVUb1VSTChzaGVsbCgpLCBlbWJlZGRlZF90ZXN0X3NlcnZlcigpLT5HZXRVUkwoIi90aXRsZTEuaHRtbCIpKSk7CisgIEVYUEVDVF9FUSh0ZXN0X2ZpbGUuQmFzZU5hbWUoKS5Bc1VURjhVbnNhZmUoKSwKKyAgICAgICAgICAgIEV2YWxKcyhzaGVsbCgpLAorICAgICAgICAgICAgICAgICAgICIoYXN5bmMgKCkgPT4geyIKKyAgICAgICAgICAgICAgICAgICAiICBsZXQgZSA9IGF3YWl0IHNlbGYuY2hvb3NlRmlsZVN5c3RlbUVudHJpZXMoKTsiCisgICAgICAgICAgICAgICAgICAgIiAgc2VsZi5zZWxlY3RlZF9lbnRyeSA9IGU7IgorICAgICAgICAgICAgICAgICAgICIgIHJldHVybiBlLm5hbWU7IH0pKCkiKSk7CisgIEVYUEVDVF9UUlVFKHRlc3Rlci5Jc0Rpc2FibGVkRm9yRnJhbWVXaXRoUmVhc29uKAorICAgICAgc2hlbGwoKS0+d2ViX2NvbnRlbnRzKCktPkdldE1haW5GcmFtZSgpLT5HZXRQcm9jZXNzKCktPkdldElEKCksCisgICAgICBzaGVsbCgpLT53ZWJfY29udGVudHMoKS0+R2V0TWFpbkZyYW1lKCktPkdldFJvdXRpbmdJRCgpLAorICAgICAgIk5hdGl2ZUZpbGVTeXN0ZW0iKSk7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBjb250ZW50CmRpZmYgLS1naXQgYS9jb250ZW50L2Jyb3dzZXIvbmF0aXZlX2ZpbGVfc3lzdGVtL25hdGl2ZV9maWxlX3N5c3RlbV9oYW5kbGVfYmFzZS5jYyBiL2NvbnRlbnQvYnJvd3Nlci9uYXRpdmVfZmlsZV9zeXN0ZW0vbmF0aXZlX2ZpbGVfc3lzdGVtX2hhbmRsZV9iYXNlLmNjCmluZGV4IGI5MmU2NzNlLi42MzAwMjY1IDEwMDY0NAotLS0gYS9jb250ZW50L2Jyb3dzZXIvbmF0aXZlX2ZpbGVfc3lzdGVtL25hdGl2ZV9maWxlX3N5c3RlbV9oYW5kbGVfYmFzZS5jYworKysgYi9jb250ZW50L2Jyb3dzZXIvbmF0aXZlX2ZpbGVfc3lzdGVtL25hdGl2ZV9maWxlX3N5c3RlbV9oYW5kbGVfYmFzZS5jYwpAQCAtNyw2ICs3LDcgQEAKICNpbmNsdWRlICJiYXNlL3Rhc2svcG9zdF90YXNrLmgiCiAjaW5jbHVkZSAiY29udGVudC9icm93c2VyL25hdGl2ZV9maWxlX3N5c3RlbS9uYXRpdmVfZmlsZV9zeXN0ZW1fZXJyb3IuaCIKICNpbmNsdWRlICJjb250ZW50L2Jyb3dzZXIvd2ViX2NvbnRlbnRzL3dlYl9jb250ZW50c19pbXBsLmgiCisjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvYnJvd3Nlci9iYWNrX2ZvcndhcmRfY2FjaGUuaCIKICNpbmNsdWRlICJjb250ZW50L3B1YmxpYy9icm93c2VyL2Jyb3dzZXJfdGFza190cmFpdHMuaCIKICNpbmNsdWRlICJjb250ZW50L3B1YmxpYy9icm93c2VyL3dlYl9jb250ZW50c19vYnNlcnZlci5oIgogCkBAIC0yNCw2ICsyNSwxMCBAQAogICAgICAgICBpc19kaXJlY3RvcnlfKGlzX2RpcmVjdG9yeSksCiAgICAgICAgIGRpcmVjdG9yeV9wYXRoXyhkaXJlY3RvcnlfcGF0aCkgewogICAgIERDSEVDS19DVVJSRU5UTFlfT04oQnJvd3NlclRocmVhZDo6VUkpOworICAgIC8vIERpc2FibGUgYmFjay1mb3J3YXJkIGNhY2hlIGFzIG5hdGl2ZSBmaWxlIHN5c3RlbSdzIHVzYWdlIG9mCisgICAgLy8gUmVuZGVyRnJhbWVIb3N0OjpJc0N1cnJlbnQgYXQgdGhlIG1vbWVudCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIGJmY2FjaGUuCisgICAgQmFja0ZvcndhcmRDYWNoZTo6RGlzYWJsZUZvclJlbmRlckZyYW1lSG9zdCgKKyAgICAgICAgR2xvYmFsRnJhbWVSb3V0aW5nSWQocHJvY2Vzc19pZCwgZnJhbWVfaWQpLCAiTmF0aXZlRmlsZVN5c3RlbSIpOwogICAgIGlmICh3ZWJfY29udGVudHMoKSkgewogICAgICAgd2ViX2NvbnRlbnRzKCktPkluY3JlbWVudE5hdGl2ZUZpbGVTeXN0ZW1IYW5kbGVDb3VudCgpOwogICAgICAgaWYgKGlzX2RpcmVjdG9yeV8pCmRpZmYgLS1naXQgYS9jb250ZW50L2Jyb3dzZXIvcGVybWlzc2lvbnMvcGVybWlzc2lvbl9jb250cm9sbGVyX2ltcGwuY2MgYi9jb250ZW50L2Jyb3dzZXIvcGVybWlzc2lvbnMvcGVybWlzc2lvbl9jb250cm9sbGVyX2ltcGwuY2MKaW5kZXggYTAxOGJjYmYuLjA5ZmU0YzUgMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvYnJvd3Nlci9wZXJtaXNzaW9ucy9wZXJtaXNzaW9uX2NvbnRyb2xsZXJfaW1wbC5jYworKysgYi9jb250ZW50L2Jyb3dzZXIvcGVybWlzc2lvbnMvcGVybWlzc2lvbl9jb250cm9sbGVyX2ltcGwuY2MKQEAgLTEyNSw3ICsxMjUsNyBAQAogICBHVVJMIGVtYmVkZGluZ19vcmlnaW47CiAgIGludCByZW5kZXJfZnJhbWVfaWQgPSAtMTsKICAgaW50IHJlbmRlcl9wcm9jZXNzX2lkID0gLTE7Ci0gIGJhc2U6OkNhbGxiYWNrPHZvaWQoYmxpbms6Om1vam9tOjpQZXJtaXNzaW9uU3RhdHVzKT4gY2FsbGJhY2s7CisgIGJhc2U6OlJlcGVhdGluZ0NhbGxiYWNrPHZvaWQoYmxpbms6Om1vam9tOjpQZXJtaXNzaW9uU3RhdHVzKT4gY2FsbGJhY2s7CiAgIGludCBkZWxlZ2F0ZV9zdWJzY3JpcHRpb25faWQ7CiB9OwogCkBAIC0xNjYsNyArMTY2LDcgQEAKIAogdm9pZCBQZXJtaXNzaW9uQ29udHJvbGxlckltcGw6Ok5vdGlmeUNoYW5nZWRTdWJzY3JpcHRpb25zKAogICAgIGNvbnN0IFN1YnNjcmlwdGlvbnNTdGF0dXNNYXAmIG9sZF9zdGF0dXNlcykgewotICBzdGQ6OnZlY3RvcjxiYXNlOjpDbG9zdXJlPiBjYWxsYmFja3M7CisgIHN0ZDo6dmVjdG9yPGJhc2U6Ok9uY2VDbG9zdXJlPiBjYWxsYmFja3M7CiAgIGZvciAoY29uc3QgYXV0byYgaXQgOiBvbGRfc3RhdHVzZXMpIHsKICAgICBhdXRvIGtleSA9IGl0LmZpcnN0OwogICAgIFN1YnNjcmlwdGlvbiogc3Vic2NyaXB0aW9uID0gc3Vic2NyaXB0aW9uc18uTG9va3VwKGtleSk7CkBAIC0xNzYsMTAgKzE3NiwxMCBAQAogICAgIGJsaW5rOjptb2pvbTo6UGVybWlzc2lvblN0YXR1cyBuZXdfc3RhdHVzID0KICAgICAgICAgR2V0U3Vic2NyaXB0aW9uQ3VycmVudFZhbHVlKCpzdWJzY3JpcHRpb24pOwogICAgIGlmIChuZXdfc3RhdHVzICE9IG9sZF9zdGF0dXMpCi0gICAgICBjYWxsYmFja3MucHVzaF9iYWNrKGJhc2U6OkJpbmQoc3Vic2NyaXB0aW9uLT5jYWxsYmFjaywgbmV3X3N0YXR1cykpOworICAgICAgY2FsbGJhY2tzLnB1c2hfYmFjayhiYXNlOjpCaW5kT25jZShzdWJzY3JpcHRpb24tPmNhbGxiYWNrLCBuZXdfc3RhdHVzKSk7CiAgIH0KLSAgZm9yIChjb25zdCBhdXRvJiBjYWxsYmFjayA6IGNhbGxiYWNrcykKLSAgICBjYWxsYmFjay5SdW4oKTsKKyAgZm9yIChhdXRvJiBjYWxsYmFjayA6IGNhbGxiYWNrcykKKyAgICBzdGQ6Om1vdmUoY2FsbGJhY2spLlJ1bigpOwogfQogCiBQZXJtaXNzaW9uQ29udHJvbGxlckltcGw6Ok92ZXJyaWRlU3RhdHVzCkBAIC0yNTYsMjUgKzI1NiwyNiBAQAogICAgIFJlbmRlckZyYW1lSG9zdCogcmVuZGVyX2ZyYW1lX2hvc3QsCiAgICAgY29uc3QgR1VSTCYgcmVxdWVzdGluZ19vcmlnaW4sCiAgICAgYm9vbCB1c2VyX2dlc3R1cmUsCi0gICAgY29uc3QgYmFzZTo6Q2FsbGJhY2s8dm9pZChibGluazo6bW9qb206OlBlcm1pc3Npb25TdGF0dXMpPiYgY2FsbGJhY2spIHsKKyAgICBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZChibGluazo6bW9qb206OlBlcm1pc3Npb25TdGF0dXMpPiBjYWxsYmFjaykgewogICBOb3RpZnlTY2hlZHVsZXJBYm91dFBlcm1pc3Npb25SZXF1ZXN0KHJlbmRlcl9mcmFtZV9ob3N0LCBwZXJtaXNzaW9uKTsKIAogICBiYXNlOjpPcHRpb25hbDxibGluazo6bW9qb206OlBlcm1pc3Npb25TdGF0dXM+IHN0YXR1c19vdmVycmlkZSA9CiAgICAgICBkZXZ0b29sc19wZXJtaXNzaW9uX292ZXJyaWRlc18uR2V0KHVybDo6T3JpZ2luOjpDcmVhdGUocmVxdWVzdGluZ19vcmlnaW4pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uKTsKICAgaWYgKHN0YXR1c19vdmVycmlkZS5oYXNfdmFsdWUoKSkgewotICAgIGNhbGxiYWNrLlJ1bigqc3RhdHVzX292ZXJyaWRlKTsKKyAgICBzdGQ6Om1vdmUoY2FsbGJhY2spLlJ1bigqc3RhdHVzX292ZXJyaWRlKTsKICAgICByZXR1cm4ga05vUGVuZGluZ09wZXJhdGlvbjsKICAgfQogCiAgIFBlcm1pc3Npb25Db250cm9sbGVyRGVsZWdhdGUqIGRlbGVnYXRlID0KICAgICAgIGJyb3dzZXJfY29udGV4dF8tPkdldFBlcm1pc3Npb25Db250cm9sbGVyRGVsZWdhdGUoKTsKICAgaWYgKCFkZWxlZ2F0ZSkgewotICAgIGNhbGxiYWNrLlJ1bihibGluazo6bW9qb206OlBlcm1pc3Npb25TdGF0dXM6OkRFTklFRCk7CisgICAgc3RkOjptb3ZlKGNhbGxiYWNrKS5SdW4oYmxpbms6Om1vam9tOjpQZXJtaXNzaW9uU3RhdHVzOjpERU5JRUQpOwogICAgIHJldHVybiBrTm9QZW5kaW5nT3BlcmF0aW9uOwogICB9CiAgIHJldHVybiBkZWxlZ2F0ZS0+UmVxdWVzdFBlcm1pc3Npb24ocGVybWlzc2lvbiwgcmVuZGVyX2ZyYW1lX2hvc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGluZ19vcmlnaW4sIHVzZXJfZ2VzdHVyZSwgY2FsbGJhY2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Rpbmdfb3JpZ2luLCB1c2VyX2dlc3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGNhbGxiYWNrKSk7CiB9CiAKIGludCBQZXJtaXNzaW9uQ29udHJvbGxlckltcGw6OlJlcXVlc3RQZXJtaXNzaW9ucygKQEAgLTI4Miw4ICsyODMsOCBAQAogICAgIFJlbmRlckZyYW1lSG9zdCogcmVuZGVyX2ZyYW1lX2hvc3QsCiAgICAgY29uc3QgR1VSTCYgcmVxdWVzdGluZ19vcmlnaW4sCiAgICAgYm9vbCB1c2VyX2dlc3R1cmUsCi0gICAgY29uc3QgYmFzZTo6Q2FsbGJhY2s8Ci0gICAgICAgIHZvaWQoY29uc3Qgc3RkOjp2ZWN0b3I8Ymxpbms6Om1vam9tOjpQZXJtaXNzaW9uU3RhdHVzPiYpPiYgY2FsbGJhY2spIHsKKyAgICBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZChjb25zdCBzdGQ6OnZlY3RvcjxibGluazo6bW9qb206OlBlcm1pc3Npb25TdGF0dXM+Jik+CisgICAgICAgIGNhbGxiYWNrKSB7CiAgIGZvciAoUGVybWlzc2lvblR5cGUgcGVybWlzc2lvbiA6IHBlcm1pc3Npb25zKQogICAgIE5vdGlmeVNjaGVkdWxlckFib3V0UGVybWlzc2lvblJlcXVlc3QocmVuZGVyX2ZyYW1lX2hvc3QsIHBlcm1pc3Npb24pOwogCkBAIC0zODIsNyArMzgzLDggQEAKICAgICBQZXJtaXNzaW9uVHlwZSBwZXJtaXNzaW9uLAogICAgIFJlbmRlckZyYW1lSG9zdCogcmVuZGVyX2ZyYW1lX2hvc3QsCiAgICAgY29uc3QgR1VSTCYgcmVxdWVzdGluZ19vcmlnaW4sCi0gICAgY29uc3QgYmFzZTo6Q2FsbGJhY2s8dm9pZChibGluazo6bW9qb206OlBlcm1pc3Npb25TdGF0dXMpPiYgY2FsbGJhY2spIHsKKyAgICBjb25zdCBiYXNlOjpSZXBlYXRpbmdDYWxsYmFjazx2b2lkKGJsaW5rOjptb2pvbTo6UGVybWlzc2lvblN0YXR1cyk+JgorICAgICAgICBjYWxsYmFjaykgewogICBhdXRvIHN1YnNjcmlwdGlvbiA9IHN0ZDo6bWFrZV91bmlxdWU8U3Vic2NyaXB0aW9uPigpOwogICBzdWJzY3JpcHRpb24tPnBlcm1pc3Npb24gPSBwZXJtaXNzaW9uOwogICBzdWJzY3JpcHRpb24tPmNhbGxiYWNrID0gY2FsbGJhY2s7CkBAIC00MDgsNyArNDEwLDcgQEAKICAgICBzdWJzY3JpcHRpb24tPmRlbGVnYXRlX3N1YnNjcmlwdGlvbl9pZCA9CiAgICAgICAgIGRlbGVnYXRlLT5TdWJzY3JpYmVQZXJtaXNzaW9uU3RhdHVzQ2hhbmdlKAogICAgICAgICAgICAgcGVybWlzc2lvbiwgcmVuZGVyX2ZyYW1lX2hvc3QsIHJlcXVlc3Rpbmdfb3JpZ2luLAotICAgICAgICAgICAgYmFzZTo6QmluZCgKKyAgICAgICAgICAgIGJhc2U6OkJpbmRSZXBlYXRpbmcoCiAgICAgICAgICAgICAgICAgJlBlcm1pc3Npb25Db250cm9sbGVySW1wbDo6T25EZWxlZ2F0ZVBlcm1pc3Npb25TdGF0dXNDaGFuZ2UsCiAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSwgc3Vic2NyaXB0aW9uLmdldCgpKSk7CiAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9jb250ZW50L2Jyb3dzZXIvcGVybWlzc2lvbnMvcGVybWlzc2lvbl9jb250cm9sbGVyX2ltcGwuaCBiL2NvbnRlbnQvYnJvd3Nlci9wZXJtaXNzaW9ucy9wZXJtaXNzaW9uX2NvbnRyb2xsZXJfaW1wbC5oCmluZGV4IDg2ZjEyMWMuLjBjNWU2NTIgMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvYnJvd3Nlci9wZXJtaXNzaW9ucy9wZXJtaXNzaW9uX2NvbnRyb2xsZXJfaW1wbC5oCisrKyBiL2NvbnRlbnQvYnJvd3Nlci9wZXJtaXNzaW9ucy9wZXJtaXNzaW9uX2NvbnRyb2xsZXJfaW1wbC5oCkBAIC01NywxNSArNTcsMTUgQEAKICAgICAgIFJlbmRlckZyYW1lSG9zdCogcmVuZGVyX2ZyYW1lX2hvc3QsCiAgICAgICBjb25zdCBHVVJMJiByZXF1ZXN0aW5nX29yaWdpbiwKICAgICAgIGJvb2wgdXNlcl9nZXN0dXJlLAotICAgICAgY29uc3QgYmFzZTo6Q2FsbGJhY2s8dm9pZChibGluazo6bW9qb206OlBlcm1pc3Npb25TdGF0dXMpPiYgY2FsbGJhY2spOworICAgICAgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQoYmxpbms6Om1vam9tOjpQZXJtaXNzaW9uU3RhdHVzKT4gY2FsbGJhY2spOwogCiAgIGludCBSZXF1ZXN0UGVybWlzc2lvbnMoCiAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxQZXJtaXNzaW9uVHlwZT4mIHBlcm1pc3Npb24sCiAgICAgICBSZW5kZXJGcmFtZUhvc3QqIHJlbmRlcl9mcmFtZV9ob3N0LAogICAgICAgY29uc3QgR1VSTCYgcmVxdWVzdGluZ19vcmlnaW4sCiAgICAgICBib29sIHVzZXJfZ2VzdHVyZSwKLSAgICAgIGNvbnN0IGJhc2U6OkNhbGxiYWNrPAotICAgICAgICAgIHZvaWQoY29uc3Qgc3RkOjp2ZWN0b3I8Ymxpbms6Om1vam9tOjpQZXJtaXNzaW9uU3RhdHVzPiYpPiYgY2FsbGJhY2spOworICAgICAgYmFzZTo6T25jZUNhbGxiYWNrPAorICAgICAgICAgIHZvaWQoY29uc3Qgc3RkOjp2ZWN0b3I8Ymxpbms6Om1vam9tOjpQZXJtaXNzaW9uU3RhdHVzPiYpPiBjYWxsYmFjayk7CiAKICAgdm9pZCBSZXNldFBlcm1pc3Npb24oUGVybWlzc2lvblR5cGUgcGVybWlzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1VSTCYgcmVxdWVzdGluZ19vcmlnaW4sCkBAIC03NSw3ICs3NSw4IEBACiAgICAgICBQZXJtaXNzaW9uVHlwZSBwZXJtaXNzaW9uLAogICAgICAgUmVuZGVyRnJhbWVIb3N0KiByZW5kZXJfZnJhbWVfaG9zdCwKICAgICAgIGNvbnN0IEdVUkwmIHJlcXVlc3Rpbmdfb3JpZ2luLAotICAgICAgY29uc3QgYmFzZTo6Q2FsbGJhY2s8dm9pZChibGluazo6bW9qb206OlBlcm1pc3Npb25TdGF0dXMpPiYgY2FsbGJhY2spOworICAgICAgY29uc3QgYmFzZTo6UmVwZWF0aW5nQ2FsbGJhY2s8dm9pZChibGluazo6bW9qb206OlBlcm1pc3Npb25TdGF0dXMpPiYKKyAgICAgICAgICBjYWxsYmFjayk7CiAKICAgdm9pZCBVbnN1YnNjcmliZVBlcm1pc3Npb25TdGF0dXNDaGFuZ2UoaW50IHN1YnNjcmlwdGlvbl9pZCk7CiAKZGlmZiAtLWdpdCBhL2NvbnRlbnQvYnJvd3Nlci9wZXJtaXNzaW9ucy9wZXJtaXNzaW9uX2NvbnRyb2xsZXJfaW1wbF91bml0dGVzdC5jYyBiL2NvbnRlbnQvYnJvd3Nlci9wZXJtaXNzaW9ucy9wZXJtaXNzaW9uX2NvbnRyb2xsZXJfaW1wbF91bml0dGVzdC5jYwppbmRleCBjNDA4YjE4Yy4uMjY4NWU3NDkgMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvYnJvd3Nlci9wZXJtaXNzaW9ucy9wZXJtaXNzaW9uX2NvbnRyb2xsZXJfaW1wbF91bml0dGVzdC5jYworKysgYi9jb250ZW50L2Jyb3dzZXIvcGVybWlzc2lvbnMvcGVybWlzc2lvbl9jb250cm9sbGVyX2ltcGxfdW5pdHRlc3QuY2MKQEAgLTIzLDggKzIzLDggQEAKIG5hbWVzcGFjZSB7CiB1c2luZyA6OnRlc3Rpbmc6OlVudXNlZDsKIHVzaW5nIE92ZXJyaWRlU3RhdHVzID0gUGVybWlzc2lvbkNvbnRyb2xsZXJJbXBsOjpPdmVycmlkZVN0YXR1czsKLXVzaW5nIFJlcXVlc3RzQ2FsbGJhY2sgPQotICAgIGJhc2U6OkNhbGxiYWNrPHZvaWQoY29uc3Qgc3RkOjp2ZWN0b3I8Ymxpbms6Om1vam9tOjpQZXJtaXNzaW9uU3RhdHVzPiYpPjsKK3VzaW5nIFJlcXVlc3RzQ2FsbGJhY2sgPSBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZCgKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxibGluazo6bW9qb206OlBlcm1pc3Npb25TdGF0dXM+Jik+OwogCiBjb25zdGV4cHIgY2hhciBrVGVzdFVybFtdID0gImh0dHBzOi8vZ29vZ2xlLmNvbSI7CiAKZGlmZiAtLWdpdCBhL2NvbnRlbnQvYnJvd3Nlci9wZXJtaXNzaW9ucy9wZXJtaXNzaW9uX3NlcnZpY2VfaW1wbC5jYyBiL2NvbnRlbnQvYnJvd3Nlci9wZXJtaXNzaW9ucy9wZXJtaXNzaW9uX3NlcnZpY2VfaW1wbC5jYwppbmRleCA0ZmZmY2RkLi5jNjM0NWUwIDEwMDY0NAotLS0gYS9jb250ZW50L2Jyb3dzZXIvcGVybWlzc2lvbnMvcGVybWlzc2lvbl9zZXJ2aWNlX2ltcGwuY2MKKysrIGIvY29udGVudC9icm93c2VyL3Blcm1pc3Npb25zL3Blcm1pc3Npb25fc2VydmljZV9pbXBsLmNjCkBAIC0yMTEsMTMgKzIxMSwxMyBAQAogICAgICAgc3RkOjptYWtlX3VuaXF1ZTxQZW5kaW5nUmVxdWVzdD4odHlwZXMsIHN0ZDo6bW92ZShjYWxsYmFjaykpOwogCiAgIGludCBwZW5kaW5nX3JlcXVlc3RfaWQgPSBwZW5kaW5nX3JlcXVlc3RzXy5BZGQoc3RkOjptb3ZlKHBlbmRpbmdfcmVxdWVzdCkpOwotICBpbnQgaWQgPQotICAgICAgUGVybWlzc2lvbkNvbnRyb2xsZXJJbXBsOjpGcm9tQnJvd3NlckNvbnRleHQoYnJvd3Nlcl9jb250ZXh0KQotICAgICAgICAgIC0+UmVxdWVzdFBlcm1pc3Npb25zKAotICAgICAgICAgICAgICB0eXBlcywgY29udGV4dF8tPnJlbmRlcl9mcmFtZV9ob3N0KCksIG9yaWdpbl8uR2V0VVJMKCksCi0gICAgICAgICAgICAgIHVzZXJfZ2VzdHVyZSwKLSAgICAgICAgICAgICAgYmFzZTo6QmluZCgmUGVybWlzc2lvblNlcnZpY2VJbXBsOjpPblJlcXVlc3RQZXJtaXNzaW9uc1Jlc3BvbnNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHdlYWtfZmFjdG9yeV8uR2V0V2Vha1B0cigpLCBwZW5kaW5nX3JlcXVlc3RfaWQpKTsKKyAgaW50IGlkID0gUGVybWlzc2lvbkNvbnRyb2xsZXJJbXBsOjpGcm9tQnJvd3NlckNvbnRleHQoYnJvd3Nlcl9jb250ZXh0KQorICAgICAgICAgICAgICAgLT5SZXF1ZXN0UGVybWlzc2lvbnMoCisgICAgICAgICAgICAgICAgICAgdHlwZXMsIGNvbnRleHRfLT5yZW5kZXJfZnJhbWVfaG9zdCgpLCBvcmlnaW5fLkdldFVSTCgpLAorICAgICAgICAgICAgICAgICAgIHVzZXJfZ2VzdHVyZSwKKyAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kT25jZSgKKyAgICAgICAgICAgICAgICAgICAgICAgJlBlcm1pc3Npb25TZXJ2aWNlSW1wbDo6T25SZXF1ZXN0UGVybWlzc2lvbnNSZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgd2Vha19mYWN0b3J5Xy5HZXRXZWFrUHRyKCksIHBlbmRpbmdfcmVxdWVzdF9pZCkpOwogCiAgIC8vIENoZWNrIGlmIHRoZSByZXF1ZXN0IHN0aWxsIGV4aXN0cy4gSXQgbWF5IGhhdmUgYmVlbiByZW1vdmVkIGJ5IHRoZQogICAvLyB0aGUgcmVzcG9uc2UgY2FsbGJhY2suCmRpZmYgLS1naXQgYS9jb250ZW50L2Jyb3dzZXIvcmVuZGVyZXJfaG9zdC9jb21wb3NpdG9yX2ltcGxfYW5kcm9pZC5jYyBiL2NvbnRlbnQvYnJvd3Nlci9yZW5kZXJlcl9ob3N0L2NvbXBvc2l0b3JfaW1wbF9hbmRyb2lkLmNjCmluZGV4IDlkYjg2ZTFmLi5lNDhkMTUwIDEwMDY0NAotLS0gYS9jb250ZW50L2Jyb3dzZXIvcmVuZGVyZXJfaG9zdC9jb21wb3NpdG9yX2ltcGxfYW5kcm9pZC5jYworKysgYi9jb250ZW50L2Jyb3dzZXIvcmVuZGVyZXJfaG9zdC9jb21wb3NpdG9yX2ltcGxfYW5kcm9pZC5jYwpAQCAtNTM4LDYgKzUzOCwxMCBAQAogICBob3N0Xy0+U2V0TmVlZHNBbmltYXRlKCk7CiB9CiAKK3ZvaWQgQ29tcG9zaXRvckltcGw6OlNldE5lZWRzUmVkcmF3KCkgeworICBob3N0Xy0+U2V0TmVlZHNSZWRyYXdSZWN0KGhvc3RfLT5kZXZpY2Vfdmlld3BvcnRfcmVjdCgpKTsKK30KKwogdm9pZCBDb21wb3NpdG9ySW1wbDo6RGlkVXBkYXRlTGF5ZXJzKCkgewogICAvLyBEdW1wIHByb3BlcnR5IHRyZWVzIGFuZCBsYXllcnMgaWYgcnVuIHdpdGg6CiAgIC8vICAgLS12bW9kdWxlPWNvbXBvc2l0b3JfaW1wbF9hbmRyb2lkPTMKZGlmZiAtLWdpdCBhL2NvbnRlbnQvYnJvd3Nlci9yZW5kZXJlcl9ob3N0L2NvbXBvc2l0b3JfaW1wbF9hbmRyb2lkLmggYi9jb250ZW50L2Jyb3dzZXIvcmVuZGVyZXJfaG9zdC9jb21wb3NpdG9yX2ltcGxfYW5kcm9pZC5oCmluZGV4IGM3OTkyOTkuLjU4NTczYTAxIDEwMDY0NAotLS0gYS9jb250ZW50L2Jyb3dzZXIvcmVuZGVyZXJfaG9zdC9jb21wb3NpdG9yX2ltcGxfYW5kcm9pZC5oCisrKyBiL2NvbnRlbnQvYnJvd3Nlci9yZW5kZXJlcl9ob3N0L2NvbXBvc2l0b3JfaW1wbF9hbmRyb2lkLmgKQEAgLTk4LDYgKzk4LDcgQEAKICAgdm9pZCBTZXRXaW5kb3dCb3VuZHMoY29uc3QgZ2Z4OjpTaXplJiBzaXplKSBvdmVycmlkZTsKICAgdm9pZCBTZXRSZXF1aXJlc0FscGhhQ2hhbm5lbChib29sIGZsYWcpIG92ZXJyaWRlOwogICB2b2lkIFNldE5lZWRzQ29tcG9zaXRlKCkgb3ZlcnJpZGU7CisgIHZvaWQgU2V0TmVlZHNSZWRyYXcoKSBvdmVycmlkZTsKICAgdWk6OlVJUmVzb3VyY2VQcm92aWRlciYgR2V0VUlSZXNvdXJjZVByb3ZpZGVyKCkgb3ZlcnJpZGU7CiAgIHVpOjpSZXNvdXJjZU1hbmFnZXImIEdldFJlc291cmNlTWFuYWdlcigpIG92ZXJyaWRlOwogICB2b2lkIENhY2hlQmFja0J1ZmZlckZvckN1cnJlbnRTdXJmYWNlKCkgb3ZlcnJpZGU7CmRpZmYgLS1naXQgYS9jb250ZW50L2Jyb3dzZXIvcmVuZGVyZXJfaG9zdC9pbnB1dC9zY3JvbGxfbGF0ZW5jeV9icm93c2VydGVzdC5jYyBiL2NvbnRlbnQvYnJvd3Nlci9yZW5kZXJlcl9ob3N0L2lucHV0L3Njcm9sbF9sYXRlbmN5X2Jyb3dzZXJ0ZXN0LmNjCmluZGV4IDE0YzJhNTkuLmNiZTRkYzggMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvYnJvd3Nlci9yZW5kZXJlcl9ob3N0L2lucHV0L3Njcm9sbF9sYXRlbmN5X2Jyb3dzZXJ0ZXN0LmNjCisrKyBiL2NvbnRlbnQvYnJvd3Nlci9yZW5kZXJlcl9ob3N0L2lucHV0L3Njcm9sbF9sYXRlbmN5X2Jyb3dzZXJ0ZXN0LmNjCkBAIC0yNzQsMTIgKzI3NCw5IEBACiAgIHZvaWQgU2V0VXBDb21tYW5kTGluZShiYXNlOjpDb21tYW5kTGluZSogY29tbWFuZF9saW5lKSBvdmVycmlkZSB7CiAgICAgU2Nyb2xsTGF0ZW5jeUJyb3dzZXJUZXN0OjpTZXRVcENvbW1hbmRMaW5lKGNvbW1hbmRfbGluZSk7CiAgICAgY29tbWFuZF9saW5lLT5BcHBlbmRTd2l0Y2goOjpzd2l0Y2hlczo6a0Rpc2FibGVTbW9vdGhTY3JvbGxpbmcpOwotICAgIC8vIEVuYWJsZSB8a1Njcm9sbGJhckluamVjdFNjcm9sbEdlc3R1cmVzfCwgYXMgdGhlc2UgdGVzdHMgZGVwZW5kIG9uIGl0Ci0gICAgLy8gYmVpbmcgb24uIERpc2FibGUga092ZXJsYXlTY3JvbGxiYXIgc2luY2Ugb3ZlcmxheSBzY3JvbGxiYXJzIGFyZSBub3QKKyAgICAvLyBEaXNhYmxlIGtPdmVybGF5U2Nyb2xsYmFyIHNpbmNlIG92ZXJsYXkgc2Nyb2xsYmFycyBhcmUgbm90CiAgICAgLy8gaGl0LXRlc3RhYmxlICh0aHVzIGlucHV0IGlzIG5vdCByb3V0ZWQgdG8gc2Nyb2xsYmFycykuCi0gICAgc2NvcGVkX2ZlYXR1cmVfbGlzdF8uSW5pdFdpdGhGZWF0dXJlcygKLSAgICAgICAge2JsaW5rOjpmZWF0dXJlczo6a1Njcm9sbGJhckluamVjdFNjcm9sbEdlc3R1cmVzfSwKLSAgICAgICAge2ZlYXR1cmVzOjprT3ZlcmxheVNjcm9sbGJhcn0pOworICAgIHNjb3BlZF9mZWF0dXJlX2xpc3RfLkluaXRBbmREaXNhYmxlRmVhdHVyZSh7ZmVhdHVyZXM6OmtPdmVybGF5U2Nyb2xsYmFyfSk7CiAgIH0KIAogICB+U2Nyb2xsTGF0ZW5jeVNjcm9sbGJhckJyb3dzZXJUZXN0KCkgb3ZlcnJpZGUge30KZGlmZiAtLWdpdCBhL2NvbnRlbnQvYnJvd3Nlci9yZW5kZXJlcl9ob3N0L2lucHV0L3RpbWVvdXRfbW9uaXRvci5oIGIvY29udGVudC9icm93c2VyL3JlbmRlcmVyX2hvc3QvaW5wdXQvdGltZW91dF9tb25pdG9yLmgKaW5kZXggZGRlYzdjMS4uZmY3YWU2ZCAxMDA2NDQKLS0tIGEvY29udGVudC9icm93c2VyL3JlbmRlcmVyX2hvc3QvaW5wdXQvdGltZW91dF9tb25pdG9yLmgKKysrIGIvY29udGVudC9icm93c2VyL3JlbmRlcmVyX2hvc3QvaW5wdXQvdGltZW91dF9tb25pdG9yLmgKQEAgLTE2LDcgKzE2LDcgQEAKIC8vIFV0aWxpdHkgY2xhc3MgZm9yIGhhbmRsaW5nIGEgdGltZW91dCBjYWxsYmFjayB3aXRoIHBlcmlvZGljIHN0YXJ0cyBhbmQgc3RvcHMuCiBjbGFzcyBDT05URU5UX0VYUE9SVCBUaW1lb3V0TW9uaXRvciB7CiAgcHVibGljOgotICB0eXBlZGVmIGJhc2U6OkNsb3N1cmUgVGltZW91dEhhbmRsZXI7CisgIHR5cGVkZWYgYmFzZTo6UmVwZWF0aW5nQ2xvc3VyZSBUaW1lb3V0SGFuZGxlcjsKIAogICBleHBsaWNpdCBUaW1lb3V0TW9uaXRvcihjb25zdCBUaW1lb3V0SGFuZGxlciYgdGltZW91dF9oYW5kbGVyKTsKICAgflRpbWVvdXRNb25pdG9yKCk7CmRpZmYgLS1naXQgYS9jb250ZW50L2Jyb3dzZXIvcmVuZGVyZXJfaG9zdC9tZWRpYS9tZWRpYV9zdHJlYW1fdWlfcHJveHlfdW5pdHRlc3QuY2MgYi9jb250ZW50L2Jyb3dzZXIvcmVuZGVyZXJfaG9zdC9tZWRpYS9tZWRpYV9zdHJlYW1fdWlfcHJveHlfdW5pdHRlc3QuY2MKaW5kZXggOTg4OTY3NC4uMmU5MmNlNCAxMDA2NDQKLS0tIGEvY29udGVudC9icm93c2VyL3JlbmRlcmVyX2hvc3QvbWVkaWEvbWVkaWFfc3RyZWFtX3VpX3Byb3h5X3VuaXR0ZXN0LmNjCisrKyBiL2NvbnRlbnQvYnJvd3Nlci9yZW5kZXJlcl9ob3N0L21lZGlhL21lZGlhX3N0cmVhbV91aV9wcm94eV91bml0dGVzdC5jYwpAQCAtMzc0LDkgKzM3NCw5IEBACiAgIHZvaWQgUmVmcmVzaFBhZ2VBbmRTZXRIZWFkZXJQb2xpY3koCiAgICAgICBibGluazo6bW9qb206OkZlYXR1cmVQb2xpY3lGZWF0dXJlIGZlYXR1cmUpIHsKICAgICBOYXZpZ2F0ZUFuZENvbW1pdChtYWluX3JmaCgpLT5HZXRMYXN0Q29tbWl0dGVkVVJMKCkpOwotICAgIHN0ZDo6dmVjdG9yPHVybDo6T3JpZ2luPiBlbXB0eV93aGl0ZWxpc3Q7CisgICAgc3RkOjp2ZWN0b3I8dXJsOjpPcmlnaW4+IGVtcHR5X2FsbG93bGlzdDsKICAgICBSZW5kZXJGcmFtZUhvc3RUZXN0ZXI6OkZvcihtYWluX3JmaCgpKQotICAgICAgICAtPlNpbXVsYXRlRmVhdHVyZVBvbGljeUhlYWRlcihmZWF0dXJlLCBlbXB0eV93aGl0ZWxpc3QpOworICAgICAgICAtPlNpbXVsYXRlRmVhdHVyZVBvbGljeUhlYWRlcihmZWF0dXJlLCBlbXB0eV9hbGxvd2xpc3QpOwogICB9CiAKICAgdm9pZCBHZXRSZXN1bHRGb3JSZXF1ZXN0KHN0ZDo6dW5pcXVlX3B0cjxNZWRpYVN0cmVhbVJlcXVlc3Q+IHJlcXVlc3QsCmRpZmYgLS1naXQgYS9jb250ZW50L2Jyb3dzZXIvc2VydmljZV93b3JrZXIvZW1iZWRkZWRfd29ya2VyX2luc3RhbmNlLmNjIGIvY29udGVudC9icm93c2VyL3NlcnZpY2Vfd29ya2VyL2VtYmVkZGVkX3dvcmtlcl9pbnN0YW5jZS5jYwppbmRleCBmNGJhMDY5Li4zNTk2ZWUzNiAxMDA2NDQKLS0tIGEvY29udGVudC9icm93c2VyL3NlcnZpY2Vfd29ya2VyL2VtYmVkZGVkX3dvcmtlcl9pbnN0YW5jZS5jYworKysgYi9jb250ZW50L2Jyb3dzZXIvc2VydmljZV93b3JrZXIvZW1iZWRkZWRfd29ya2VyX2luc3RhbmNlLmNjCkBAIC04NjUsNiArODY1LDE2IEBACiAgICAgICBwcm9jZXNzX2lkKCksIE1ha2VSZXF1ZXN0KCZwYXJhbXMtPnByb3ZpZGVyX2luZm8tPmludGVyZmFjZV9wcm92aWRlciksCiAgICAgICBwYXJhbXMtPnByb3ZpZGVyX2luZm8tPmJyb3dzZXJfaW50ZXJmYWNlX2Jyb2tlcgogICAgICAgICAgIC5Jbml0V2l0aE5ld1BpcGVBbmRQYXNzUmVjZWl2ZXIoKSk7CisKKyAgLy8gVE9ETyhiYXNoaSk6IENyZWF0ZSBjb3JyZWN0IG91dHNpZGUgZmV0Y2ggY2xpZW50IHNldHRpbmdzIG9iamVjdC4gV2UgbmVlZAorICAvLyB0byBwbHVtYiBwYXJlbnQncyBmZXRjaCBjbGllbnQgc2V0dGluZ3Mgb2JqZWN0IGZyb20gcmVuZGVyZXIuCisgIC8vIFNlZSBjcmJ1Zy5jb20vOTM3MTc3LgorICBwYXJhbXMtPm91dHNpZGVfZmV0Y2hfY2xpZW50X3NldHRpbmdzX29iamVjdCA9CisgICAgICBibGluazo6bW9qb206OkZldGNoQ2xpZW50U2V0dGluZ3NPYmplY3Q6Ok5ldygKKyAgICAgICAgICBuZXR3b3JrOjptb2pvbTo6UmVmZXJyZXJQb2xpY3k6OmtEZWZhdWx0LAorICAgICAgICAgIC8qb3V0Z29pbmdfcmVmZXJyZXI9Ki9wYXJhbXMtPnNjcmlwdF91cmwsCisgICAgICAgICAgYmxpbms6Om1vam9tOjpJbnNlY3VyZVJlcXVlc3RzUG9saWN5OjprRG9Ob3RVcGdyYWRlKTsKKwogICBjbGllbnRfLT5TdGFydFdvcmtlcihzdGQ6Om1vdmUocGFyYW1zKSk7CiAKICAgc3RhcnRpbmdfcGhhc2VfID0gaXNfc2NyaXB0X3N0cmVhbWluZyA/IFNDUklQVF9TVFJFQU1JTkcgOiBTRU5UX1NUQVJUX1dPUktFUjsKZGlmZiAtLWdpdCBhL2NvbnRlbnQvYnJvd3Nlci9zdG9yYWdlX3BhcnRpdGlvbl9pbXBsX3VuaXR0ZXN0LmNjIGIvY29udGVudC9icm93c2VyL3N0b3JhZ2VfcGFydGl0aW9uX2ltcGxfdW5pdHRlc3QuY2MKaW5kZXggOGU4M2Y5ZWQuLmRlOWM4ZjUgMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvYnJvd3Nlci9zdG9yYWdlX3BhcnRpdGlvbl9pbXBsX3VuaXR0ZXN0LmNjCisrKyBiL2NvbnRlbnQvYnJvd3Nlci9zdG9yYWdlX3BhcnRpdGlvbl9pbXBsX3VuaXR0ZXN0LmNjCkBAIC0xNyw4ICsxNywxMCBAQAogI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZC5oIgogI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF90YXNrX3J1bm5lcl9oYW5kbGUuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL3NlcnZpY2VzL2xldmVsZGIvcHVibGljL2NwcC91dGlsLmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9zZXJ2aWNlcy9zdG9yYWdlL2RvbV9zdG9yYWdlL2RvbV9zdG9yYWdlX2RhdGFiYXNlLmgiCiAjaW5jbHVkZSAiY29udGVudC9icm93c2VyL2NvZGVfY2FjaGUvZ2VuZXJhdGVkX2NvZGVfY2FjaGUuaCIKICNpbmNsdWRlICJjb250ZW50L2Jyb3dzZXIvY29kZV9jYWNoZS9nZW5lcmF0ZWRfY29kZV9jYWNoZV9jb250ZXh0LmgiCisjaW5jbHVkZSAiY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL2xvY2FsX3N0b3JhZ2VfY29udGV4dF9tb2pvLmgiCiAjaW5jbHVkZSAiY29udGVudC9icm93c2VyL2RvbV9zdG9yYWdlL2xvY2FsX3N0b3JhZ2VfZGF0YWJhc2UucGIuaCIKICNpbmNsdWRlICJjb250ZW50L2Jyb3dzZXIvZ3B1L3NoYWRlcl9jYWNoZV9mYWN0b3J5LmgiCiAjaW5jbHVkZSAiY29udGVudC9icm93c2VyL3N0b3JhZ2VfcGFydGl0aW9uX2ltcGwuaCIKQEAgLTMxLDcgKzMzLDYgQEAKICNpbmNsdWRlICJjb250ZW50L3B1YmxpYy90ZXN0L3Rlc3RfYnJvd3Nlcl9jb250ZXh0LmgiCiAjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvdGVzdC90ZXN0X2Jyb3dzZXJfdGhyZWFkLmgiCiAjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvdGVzdC90ZXN0X3V0aWxzLmgiCi0jaW5jbHVkZSAiY29udGVudC90ZXN0L2Zha2VfbGV2ZWxkYl9kYXRhYmFzZS5oIgogI2luY2x1ZGUgIm5ldC9iYXNlL3Rlc3RfY29tcGxldGlvbl9jYWxsYmFjay5oIgogI2luY2x1ZGUgIm5ldC9jb29raWVzL2Nhbm9uaWNhbF9jb29raWUuaCIKICNpbmNsdWRlICJuZXQvY29va2llcy9jb29raWVfc3RvcmUuaCIKQEAgLTE5MSwxMSArMTkyLDIxIEBACiAKIGNsYXNzIFJlbW92ZUxvY2FsU3RvcmFnZVRlc3RlciB7CiAgcHVibGljOgotICBleHBsaWNpdCBSZW1vdmVMb2NhbFN0b3JhZ2VUZXN0ZXIoVGVzdEJyb3dzZXJDb250ZXh0KiBwcm9maWxlKQotICAgICAgOiBkb21fc3RvcmFnZV9jb250ZXh0XyhudWxscHRyKSB7CisgIFJlbW92ZUxvY2FsU3RvcmFnZVRlc3Rlcihjb250ZW50OjpCcm93c2VyVGFza0Vudmlyb25tZW50KiB0YXNrX2Vudmlyb25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdEJyb3dzZXJDb250ZXh0KiBwcm9maWxlKQorICAgICAgOiB0YXNrX2Vudmlyb25tZW50Xyh0YXNrX2Vudmlyb25tZW50KSwgZG9tX3N0b3JhZ2VfY29udGV4dF8obnVsbHB0cikgewogICAgIGRvbV9zdG9yYWdlX2NvbnRleHRfID0KLSAgICAgICAgY29udGVudDo6QnJvd3NlckNvbnRleHQ6OkdldERlZmF1bHRTdG9yYWdlUGFydGl0aW9uKHByb2ZpbGUpLT4KLSAgICAgICAgICAgIEdldERPTVN0b3JhZ2VDb250ZXh0KCk7CisgICAgICAgIGNvbnRlbnQ6OkJyb3dzZXJDb250ZXh0OjpHZXREZWZhdWx0U3RvcmFnZVBhcnRpdGlvbihwcm9maWxlKQorICAgICAgICAgICAgLT5HZXRET01TdG9yYWdlQ29udGV4dCgpOworICB9CisKKyAgflJlbW92ZUxvY2FsU3RvcmFnZVRlc3RlcigpIHsKKyAgICAvLyBUZXN0cyB3aGljaCBicmluZyB1cCBhIHJlYWwgTG9jYWwgU3RvcmFnZSBjb250ZXh0IG5lZWQgdG8gc2h1dCBpdCBkb3duCisgICAgLy8gYW5kIHdhaXQgZm9yIHRoZSBkYXRhYmFzZSB0byBiZSBjbG9zZWQgYmVmb3JlIHRlcm1pbmF0aW5nOyBvdGhlcndpc2UgdGhlCisgICAgLy8gVGVzdEJyb3dzZXJDb250ZXh0IG1heSBmYWlsIHRvIGRlbGV0ZSBpdHMgdGVtcCBkaXIsIGFuZCBpdCB3aWxsIG5vdCBiZQorICAgIC8vIGhhcHB5IGFib3V0IHRoYXQuCisgICAgc3RhdGljX2Nhc3Q8RE9NU3RvcmFnZUNvbnRleHRXcmFwcGVyKj4oZG9tX3N0b3JhZ2VfY29udGV4dF8pLT5TaHV0ZG93bigpOworICAgIHRhc2tfZW52aXJvbm1lbnRfLT5SdW5VbnRpbElkbGUoKTsKICAgfQogCiAgIC8vIFJldHVybnMgdHJ1ZSwgaWYgdGhlIGdpdmVuIG9yaWdpbiBVUkwgZXhpc3RzLgpAQCAtMjE0LDM1ICsyMjUsNDUgQEAKICAgICAvLyBzdG9yZXMgZGF0YSBpbiB0aGUgZGF0YWJhc2UuCiAKICAgICBzdGF0aWNfY2FzdDxET01TdG9yYWdlQ29udGV4dFdyYXBwZXIqPihkb21fc3RvcmFnZV9jb250ZXh0XykKLSAgICAgICAgLT5TZXRMb2NhbFN0b3JhZ2VEYXRhYmFzZUZhY3RvcnlGb3JUZXN0aW5nKGJhc2U6OkJpbmRMYW1iZGFGb3JUZXN0aW5nKAotICAgICAgICAgICAgWyZdKCkgLT4gc3RkOjp1bmlxdWVfcHRyPGxldmVsZGI6Om1vam9tOjpMZXZlbERCRGF0YWJhc2U+IHsKLSAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8RmFrZUxldmVsREJEYXRhYmFzZT4oJm1vY2tfZGF0YV8pOworICAgICAgICAtPlNldExvY2FsU3RvcmFnZURhdGFiYXNlT3BlbkNhbGxiYWNrRm9yVGVzdGluZygKKyAgICAgICAgICAgIGJhc2U6OkJpbmRMYW1iZGFGb3JUZXN0aW5nKFsmXShMb2NhbFN0b3JhZ2VDb250ZXh0TW9qbyogY29udGV4dCkgeworICAgICAgICAgICAgICBjb250ZXh0LT5HZXREYXRhYmFzZUZvclRlc3RpbmcoKS5Qb3N0VGFza1dpdGhUaGlzT2JqZWN0KAorICAgICAgICAgICAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZSgmUG9wdWxhdGVEYXRhYmFzZSkpOwogICAgICAgICAgICAgfSkpOworICB9CiAKKyAgc3RhdGljIHZvaWQgUG9wdWxhdGVEYXRhYmFzZShjb25zdCBzdG9yYWdlOjpEb21TdG9yYWdlRGF0YWJhc2UmIGRiKSB7CiAgICAgTG9jYWxTdG9yYWdlT3JpZ2luTWV0YURhdGEgZGF0YTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50OF90Piwgc3RkOjp2ZWN0b3I8dWludDhfdD4+IGVudHJpZXM7CiAKICAgICBiYXNlOjpUaW1lIG5vdyA9IGJhc2U6OlRpbWU6Ok5vdygpOwogICAgIGRhdGEuc2V0X2xhc3RfbW9kaWZpZWQobm93LlRvSW50ZXJuYWxWYWx1ZSgpKTsKICAgICBkYXRhLnNldF9zaXplX2J5dGVzKDE2KTsKLSAgICBtb2NrX2RhdGFfW0NyZWF0ZU1ldGFEYXRhS2V5KGtPcmlnaW4xKV0gPQotICAgICAgICBsZXZlbGRiOjpTdGRTdHJpbmdUb1VpbnQ4VmVjdG9yKGRhdGEuU2VyaWFsaXplQXNTdHJpbmcoKSk7Ci0gICAgbW9ja19kYXRhX1tDcmVhdGVEYXRhS2V5KGtPcmlnaW4xKV0gPSB7fTsKKyAgICBBU1NFUlRfVFJVRSgKKyAgICAgICAgZGIuUHV0KENyZWF0ZU1ldGFEYXRhS2V5KGtPcmlnaW4xKSwKKyAgICAgICAgICAgICAgIGxldmVsZGI6OlN0ZFN0cmluZ1RvVWludDhWZWN0b3IoZGF0YS5TZXJpYWxpemVBc1N0cmluZygpKSkKKyAgICAgICAgICAgIC5vaygpKTsKKyAgICBBU1NFUlRfVFJVRShkYi5QdXQoQ3JlYXRlRGF0YUtleShrT3JpZ2luMSksIHt9KS5vaygpKTsKIAogICAgIGJhc2U6OlRpbWUgb25lX2RheV9hZ28gPSBub3cgLSBiYXNlOjpUaW1lRGVsdGE6OkZyb21EYXlzKDEpOwogICAgIGRhdGEuc2V0X2xhc3RfbW9kaWZpZWQob25lX2RheV9hZ28uVG9JbnRlcm5hbFZhbHVlKCkpOwotICAgIG1vY2tfZGF0YV9bQ3JlYXRlTWV0YURhdGFLZXkoa09yaWdpbjIpXSA9Ci0gICAgICAgIGxldmVsZGI6OlN0ZFN0cmluZ1RvVWludDhWZWN0b3IoZGF0YS5TZXJpYWxpemVBc1N0cmluZygpKTsKLSAgICBtb2NrX2RhdGFfW0NyZWF0ZURhdGFLZXkoa09yaWdpbjIpXSA9IHt9OworICAgIEFTU0VSVF9UUlVFKAorICAgICAgICBkYi5QdXQoQ3JlYXRlTWV0YURhdGFLZXkoa09yaWdpbjIpLAorICAgICAgICAgICAgICAgbGV2ZWxkYjo6U3RkU3RyaW5nVG9VaW50OFZlY3RvcihkYXRhLlNlcmlhbGl6ZUFzU3RyaW5nKCkpKQorICAgICAgICAgICAgLm9rKCkpOworICAgIEFTU0VSVF9UUlVFKGRiLlB1dChDcmVhdGVEYXRhS2V5KGtPcmlnaW4yKSwge30pLm9rKCkpOwogCiAgICAgYmFzZTo6VGltZSBzaXh0eV9kYXlzX2FnbyA9IG5vdyAtIGJhc2U6OlRpbWVEZWx0YTo6RnJvbURheXMoNjApOwogICAgIGRhdGEuc2V0X2xhc3RfbW9kaWZpZWQoc2l4dHlfZGF5c19hZ28uVG9JbnRlcm5hbFZhbHVlKCkpOwotICAgIG1vY2tfZGF0YV9bQ3JlYXRlTWV0YURhdGFLZXkoa09yaWdpbjMpXSA9Ci0gICAgICAgIGxldmVsZGI6OlN0ZFN0cmluZ1RvVWludDhWZWN0b3IoZGF0YS5TZXJpYWxpemVBc1N0cmluZygpKTsKLSAgICBtb2NrX2RhdGFfW0NyZWF0ZURhdGFLZXkoa09yaWdpbjMpXSA9IHt9OworICAgIEFTU0VSVF9UUlVFKAorICAgICAgICBkYi5QdXQoQ3JlYXRlTWV0YURhdGFLZXkoa09yaWdpbjMpLAorICAgICAgICAgICAgICAgbGV2ZWxkYjo6U3RkU3RyaW5nVG9VaW50OFZlY3RvcihkYXRhLlNlcmlhbGl6ZUFzU3RyaW5nKCkpKQorICAgICAgICAgICAgLm9rKCkpOworICAgIEFTU0VSVF9UUlVFKGRiLlB1dChDcmVhdGVEYXRhS2V5KGtPcmlnaW4zKSwge30pLm9rKCkpOwogICB9CiAKICBwcml2YXRlOgotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBDcmVhdGVEYXRhS2V5KGNvbnN0IHVybDo6T3JpZ2luJiBvcmlnaW4pIHsKKyAgc3RhdGljIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IENyZWF0ZURhdGFLZXkoY29uc3QgdXJsOjpPcmlnaW4mIG9yaWdpbikgewogICAgIGF1dG8gc2VyaWFsaXplZF9vcmlnaW4gPQogICAgICAgICBsZXZlbGRiOjpTdGRTdHJpbmdUb1VpbnQ4VmVjdG9yKG9yaWdpbi5TZXJpYWxpemUoKSk7CiAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5ID0geydfJ307CkBAIC0yNTIsNyArMjczLDcgQEAKICAgICByZXR1cm4ga2V5OwogICB9CiAKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gQ3JlYXRlTWV0YURhdGFLZXkoY29uc3QgdXJsOjpPcmlnaW4mIG9yaWdpbikgeworICBzdGF0aWMgc3RkOjp2ZWN0b3I8dWludDhfdD4gQ3JlYXRlTWV0YURhdGFLZXkoY29uc3QgdXJsOjpPcmlnaW4mIG9yaWdpbikgewogICAgIGNvbnN0IHVpbnQ4X3Qga01ldGFQcmVmaXhbXSA9IHsnTScsICdFJywgJ1QnLCAnQScsICc6J307CiAgICAgYXV0byBzZXJpYWxpemVkX29yaWdpbiA9CiAgICAgICAgIGxldmVsZGI6OlN0ZFN0cmluZ1RvVWludDhWZWN0b3Iob3JpZ2luLlNlcmlhbGl6ZSgpKTsKQEAgLTI3NiwxMCArMjk3LDkgQEAKICAgfQogCiAgIC8vIFdlIGRvbid0IG93biB0aGVzZSBwb2ludGVycy4KKyAgY29udGVudDo6QnJvd3NlclRhc2tFbnZpcm9ubWVudCogY29uc3QgdGFza19lbnZpcm9ubWVudF87CiAgIGNvbnRlbnQ6OkRPTVN0b3JhZ2VDb250ZXh0KiBkb21fc3RvcmFnZV9jb250ZXh0XzsKIAotICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50OF90Piwgc3RkOjp2ZWN0b3I8dWludDhfdD4+IG1vY2tfZGF0YV87Ci0KICAgc3RkOjp2ZWN0b3I8Y29udGVudDo6U3RvcmFnZVVzYWdlSW5mbz4gaW5mb3NfOwogCiAgIEF3YWl0Q29tcGxldGlvbkhlbHBlciBhd2FpdF9jb21wbGV0aW9uXzsKQEAgLTU4NiwyMSArNjA2LDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlRpbWU6Ok1heCgpLCBsb29wX3RvX3F1aXQtPlF1aXRDbG9zdXJlKCkpOwogfQogCi12b2lkIENsZWFyUXVvdGFEYXRhRm9yT3JpZ2luKAotICAgIGNvbnRlbnQ6OlN0b3JhZ2VQYXJ0aXRpb24qIHBhcnRpdGlvbiwKLSAgICBjb25zdCBHVVJMJiByZW1vdmVfb3JpZ2luLAotICAgIGNvbnN0IGJhc2U6OlRpbWUgZGVsZXRlX2JlZ2luLAotICAgIGJhc2U6OlJ1bkxvb3AqIGxvb3BfdG9fcXVpdCkgewordm9pZCBDbGVhclF1b3RhRGF0YUZvck9yaWdpbihjb250ZW50OjpTdG9yYWdlUGFydGl0aW9uKiBwYXJ0aXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdVUkwmIHJlbW92ZV9vcmlnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OlRpbWUgZGVsZXRlX2JlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpSdW5Mb29wKiBsb29wX3RvX3F1aXQpIHsKICAgcGFydGl0aW9uLT5DbGVhckRhdGEoa0FsbFF1b3RhUmVtb3ZlTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVBhcnRpdGlvbjo6UVVPVEFfTUFOQUdFRF9TVE9SQUdFX01BU0tfQUxMLAogICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfb3JpZ2luLCBkZWxldGVfYmVnaW4sIGJhc2U6OlRpbWU6Ok1heCgpLAogICAgICAgICAgICAgICAgICAgICAgICBsb29wX3RvX3F1aXQtPlF1aXRDbG9zdXJlKCkpOwogfQogCi12b2lkIENsZWFyUXVvdGFEYXRhRm9yTm9uUGVyc2lzdGVudCgKLSAgICBjb250ZW50OjpTdG9yYWdlUGFydGl0aW9uKiBwYXJ0aXRpb24sCi0gICAgY29uc3QgYmFzZTo6VGltZSBkZWxldGVfYmVnaW4sCi0gICAgYmFzZTo6UnVuTG9vcCogbG9vcF90b19xdWl0KSB7Cit2b2lkIENsZWFyUXVvdGFEYXRhRm9yTm9uUGVyc2lzdGVudChjb250ZW50OjpTdG9yYWdlUGFydGl0aW9uKiBwYXJ0aXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpUaW1lIGRlbGV0ZV9iZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlJ1bkxvb3AqIGxvb3BfdG9fcXVpdCkgewogICBwYXJ0aXRpb24tPkNsZWFyRGF0YShrQWxsUXVvdGFSZW1vdmVNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICB+U3RvcmFnZVBhcnRpdGlvbjo6UVVPVEFfTUFOQUdFRF9TVE9SQUdFX01BU0tfUEVSU0lTVEVOVCwKICAgICAgICAgICAgICAgICAgICAgICAgR1VSTCgpLCBkZWxldGVfYmVnaW4sIGJhc2U6OlRpbWU6Ok1heCgpLApAQCAtNjQ0LDggKzY2Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9sb29wLT5RdWl0Q2xvc3VyZSgpKTsKIH0KIAotdm9pZCBDbGVhckRhdGEoY29udGVudDo6U3RvcmFnZVBhcnRpdGlvbiogcGFydGl0aW9uLAotICAgICAgICAgICAgICAgYmFzZTo6UnVuTG9vcCogcnVuX2xvb3ApIHsKK3ZvaWQgQ2xlYXJEYXRhKGNvbnRlbnQ6OlN0b3JhZ2VQYXJ0aXRpb24qIHBhcnRpdGlvbiwgYmFzZTo6UnVuTG9vcCogcnVuX2xvb3ApIHsKICAgYmFzZTo6VGltZSB0aW1lOwogICBwYXJ0aXRpb24tPkNsZWFyRGF0YShTdG9yYWdlUGFydGl0aW9uOjpSRU1PVkVfREFUQV9NQVNLX1NIQURFUl9DQUNIRSwKICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVBhcnRpdGlvbjo6UVVPVEFfTUFOQUdFRF9TVE9SQUdFX01BU0tfQUxMLCBHVVJMKCksCkBAIC03MDMsOCArNzIwLDEwIEBACiAgICAgcmV0dXJuIHF1b3RhX21hbmFnZXJfLmdldCgpOwogICB9CiAKLSAgVGVzdEJyb3dzZXJDb250ZXh0KiBicm93c2VyX2NvbnRleHQoKSB7Ci0gICAgcmV0dXJuIGJyb3dzZXJfY29udGV4dF8uZ2V0KCk7CisgIFRlc3RCcm93c2VyQ29udGV4dCogYnJvd3Nlcl9jb250ZXh0KCkgeyByZXR1cm4gYnJvd3Nlcl9jb250ZXh0Xy5nZXQoKTsgfQorCisgIGNvbnRlbnQ6OkJyb3dzZXJUYXNrRW52aXJvbm1lbnQqIHRhc2tfZW52aXJvbm1lbnQoKSB7CisgICAgcmV0dXJuICZ0YXNrX2Vudmlyb25tZW50XzsKICAgfQogCiAgcHJpdmF0ZToKQEAgLTc0OSw5ICs3NjgsNyBAQAogCiAgIHNpemVfdCBTaXplKCkgeyByZXR1cm4gY2FjaGVfLT5TaXplKCk7IH0KIAotICBUZXN0QnJvd3NlckNvbnRleHQqIGJyb3dzZXJfY29udGV4dCgpIHsKLSAgICByZXR1cm4gYnJvd3Nlcl9jb250ZXh0Xy5nZXQoKTsKLSAgfQorICBUZXN0QnJvd3NlckNvbnRleHQqIGJyb3dzZXJfY29udGV4dCgpIHsgcmV0dXJuIGJyb3dzZXJfY29udGV4dF8uZ2V0KCk7IH0KIAogIHByaXZhdGU6CiAgIGNvbnRlbnQ6OkJyb3dzZXJUYXNrRW52aXJvbm1lbnQgdGFza19lbnZpcm9ubWVudF87CkBAIC04MzUsOCArODUyLDcgQEAKIAogICBTdG9yYWdlUGFydGl0aW9uSW1wbCogcGFydGl0aW9uID0gc3RhdGljX2Nhc3Q8U3RvcmFnZVBhcnRpdGlvbkltcGwqPigKICAgICAgIEJyb3dzZXJDb250ZXh0OjpHZXREZWZhdWx0U3RvcmFnZVBhcnRpdGlvbihicm93c2VyX2NvbnRleHQoKSkpOwotICBwYXJ0aXRpb24tPk92ZXJyaWRlUXVvdGFNYW5hZ2VyRm9yVGVzdGluZygKLSAgICAgIEdldE1vY2tNYW5hZ2VyKCkpOworICBwYXJ0aXRpb24tPk92ZXJyaWRlUXVvdGFNYW5hZ2VyRm9yVGVzdGluZyhHZXRNb2NrTWFuYWdlcigpKTsKIAogICBiYXNlOjpSdW5Mb29wIHJ1bl9sb29wOwogICBiYXNlOjpUaHJlYWRUYXNrUnVubmVySGFuZGxlOjpHZXQoKS0+UG9zdFRhc2soCkBAIC04NjIsOCArODc4LDcgQEAKIAogICBTdG9yYWdlUGFydGl0aW9uSW1wbCogcGFydGl0aW9uID0gc3RhdGljX2Nhc3Q8U3RvcmFnZVBhcnRpdGlvbkltcGwqPigKICAgICAgIEJyb3dzZXJDb250ZXh0OjpHZXREZWZhdWx0U3RvcmFnZVBhcnRpdGlvbihicm93c2VyX2NvbnRleHQoKSkpOwotICBwYXJ0aXRpb24tPk92ZXJyaWRlUXVvdGFNYW5hZ2VyRm9yVGVzdGluZygKLSAgICAgIEdldE1vY2tNYW5hZ2VyKCkpOworICBwYXJ0aXRpb24tPk92ZXJyaWRlUXVvdGFNYW5hZ2VyRm9yVGVzdGluZyhHZXRNb2NrTWFuYWdlcigpKTsKIAogICBiYXNlOjpSdW5Mb29wIHJ1bl9sb29wOwogICBiYXNlOjpUaHJlYWRUYXNrUnVubmVySGFuZGxlOjpHZXQoKS0+UG9zdFRhc2soCkBAIC04ODksOCArOTA0LDcgQEAKIAogICBTdG9yYWdlUGFydGl0aW9uSW1wbCogcGFydGl0aW9uID0gc3RhdGljX2Nhc3Q8U3RvcmFnZVBhcnRpdGlvbkltcGwqPigKICAgICAgIEJyb3dzZXJDb250ZXh0OjpHZXREZWZhdWx0U3RvcmFnZVBhcnRpdGlvbihicm93c2VyX2NvbnRleHQoKSkpOwotICBwYXJ0aXRpb24tPk92ZXJyaWRlUXVvdGFNYW5hZ2VyRm9yVGVzdGluZygKLSAgICAgIEdldE1vY2tNYW5hZ2VyKCkpOworICBwYXJ0aXRpb24tPk92ZXJyaWRlUXVvdGFNYW5hZ2VyRm9yVGVzdGluZyhHZXRNb2NrTWFuYWdlcigpKTsKIAogICBiYXNlOjpSdW5Mb29wIHJ1bl9sb29wOwogICBiYXNlOjpUaHJlYWRUYXNrUnVubmVySGFuZGxlOjpHZXQoKS0+UG9zdFRhc2soCkBAIC05MTQsOCArOTI4LDcgQEAKIFRFU1RfRihTdG9yYWdlUGFydGl0aW9uSW1wbFRlc3QsIFJlbW92ZVF1b3RhTWFuYWdlZERhdGFGb3JldmVyTmVpdGhlcikgewogICBTdG9yYWdlUGFydGl0aW9uSW1wbCogcGFydGl0aW9uID0gc3RhdGljX2Nhc3Q8U3RvcmFnZVBhcnRpdGlvbkltcGwqPigKICAgICAgIEJyb3dzZXJDb250ZXh0OjpHZXREZWZhdWx0U3RvcmFnZVBhcnRpdGlvbihicm93c2VyX2NvbnRleHQoKSkpOwotICBwYXJ0aXRpb24tPk92ZXJyaWRlUXVvdGFNYW5hZ2VyRm9yVGVzdGluZygKLSAgICAgIEdldE1vY2tNYW5hZ2VyKCkpOworICBwYXJ0aXRpb24tPk92ZXJyaWRlUXVvdGFNYW5hZ2VyRm9yVGVzdGluZyhHZXRNb2NrTWFuYWdlcigpKTsKIAogICBiYXNlOjpSdW5Mb29wIHJ1bl9sb29wOwogICBiYXNlOjpUaHJlYWRUYXNrUnVubmVySGFuZGxlOjpHZXQoKS0+UG9zdFRhc2soCkBAIC05NDEsOCArOTU0LDcgQEAKIAogICBTdG9yYWdlUGFydGl0aW9uSW1wbCogcGFydGl0aW9uID0gc3RhdGljX2Nhc3Q8U3RvcmFnZVBhcnRpdGlvbkltcGwqPigKICAgICAgIEJyb3dzZXJDb250ZXh0OjpHZXREZWZhdWx0U3RvcmFnZVBhcnRpdGlvbihicm93c2VyX2NvbnRleHQoKSkpOwotICBwYXJ0aXRpb24tPk92ZXJyaWRlUXVvdGFNYW5hZ2VyRm9yVGVzdGluZygKLSAgICAgIEdldE1vY2tNYW5hZ2VyKCkpOworICBwYXJ0aXRpb24tPk92ZXJyaWRlUXVvdGFNYW5hZ2VyRm9yVGVzdGluZyhHZXRNb2NrTWFuYWdlcigpKTsKIAogICBiYXNlOjpSdW5Mb29wIHJ1bl9sb29wOwogICBiYXNlOjpUaHJlYWRUYXNrUnVubmVySGFuZGxlOjpHZXQoKS0+UG9zdFRhc2soCkBAIC05NjksOCArOTgxLDcgQEAKIAogICBTdG9yYWdlUGFydGl0aW9uSW1wbCogcGFydGl0aW9uID0gc3RhdGljX2Nhc3Q8U3RvcmFnZVBhcnRpdGlvbkltcGwqPigKICAgICAgIEJyb3dzZXJDb250ZXh0OjpHZXREZWZhdWx0U3RvcmFnZVBhcnRpdGlvbihicm93c2VyX2NvbnRleHQoKSkpOwotICBwYXJ0aXRpb24tPk92ZXJyaWRlUXVvdGFNYW5hZ2VyRm9yVGVzdGluZygKLSAgICAgIEdldE1vY2tNYW5hZ2VyKCkpOworICBwYXJ0aXRpb24tPk92ZXJyaWRlUXVvdGFNYW5hZ2VyRm9yVGVzdGluZyhHZXRNb2NrTWFuYWdlcigpKTsKIAogICBiYXNlOjpSdW5Mb29wIHJ1bl9sb29wOwogICBiYXNlOjpUaHJlYWRUYXNrUnVubmVySGFuZGxlOjpHZXQoKS0+UG9zdFRhc2soCkBAIC0xMDAwLDggKzEwMTEsNyBAQAogICBiYXNlOjpSdW5Mb29wIHJ1bl9sb29wOwogICBTdG9yYWdlUGFydGl0aW9uSW1wbCogcGFydGl0aW9uID0gc3RhdGljX2Nhc3Q8U3RvcmFnZVBhcnRpdGlvbkltcGwqPigKICAgICAgIEJyb3dzZXJDb250ZXh0OjpHZXREZWZhdWx0U3RvcmFnZVBhcnRpdGlvbihicm93c2VyX2NvbnRleHQoKSkpOwotICBwYXJ0aXRpb24tPk92ZXJyaWRlUXVvdGFNYW5hZ2VyRm9yVGVzdGluZygKLSAgICAgIEdldE1vY2tNYW5hZ2VyKCkpOworICBwYXJ0aXRpb24tPk92ZXJyaWRlUXVvdGFNYW5hZ2VyRm9yVGVzdGluZyhHZXRNb2NrTWFuYWdlcigpKTsKICAgYmFzZTo6VGhyZWFkVGFza1J1bm5lckhhbmRsZTo6R2V0KCktPlBvc3RUYXNrKAogICAgICAgRlJPTV9IRVJFLAogICAgICAgYmFzZTo6QmluZE9uY2UoJkNsZWFyUXVvdGFEYXRhRm9yTm9uUGVyc2lzdGVudCwgcGFydGl0aW9uLApAQCAtMTAzMyw4ICsxMDQzLDcgQEAKIAogICBTdG9yYWdlUGFydGl0aW9uSW1wbCogcGFydGl0aW9uID0gc3RhdGljX2Nhc3Q8U3RvcmFnZVBhcnRpdGlvbkltcGwqPigKICAgICAgIEJyb3dzZXJDb250ZXh0OjpHZXREZWZhdWx0U3RvcmFnZVBhcnRpdGlvbihicm93c2VyX2NvbnRleHQoKSkpOwotICBwYXJ0aXRpb24tPk92ZXJyaWRlUXVvdGFNYW5hZ2VyRm9yVGVzdGluZygKLSAgICAgIEdldE1vY2tNYW5hZ2VyKCkpOworICBwYXJ0aXRpb24tPk92ZXJyaWRlUXVvdGFNYW5hZ2VyRm9yVGVzdGluZyhHZXRNb2NrTWFuYWdlcigpKTsKICAgcGFydGl0aW9uLT5PdmVycmlkZVNwZWNpYWxTdG9yYWdlUG9saWN5Rm9yVGVzdGluZyhtb2NrX3BvbGljeS5nZXQoKSk7CiAKICAgYmFzZTo6UnVuTG9vcCBydW5fbG9vcDsKQEAgLTEwNzEsOCArMTA4MCw3IEBACiAgIGJhc2U6OlJ1bkxvb3AgcnVuX2xvb3A7CiAgIFN0b3JhZ2VQYXJ0aXRpb25JbXBsKiBwYXJ0aXRpb24gPSBzdGF0aWNfY2FzdDxTdG9yYWdlUGFydGl0aW9uSW1wbCo+KAogICAgICAgQnJvd3NlckNvbnRleHQ6OkdldERlZmF1bHRTdG9yYWdlUGFydGl0aW9uKGJyb3dzZXJfY29udGV4dCgpKSk7Ci0gIHBhcnRpdGlvbi0+T3ZlcnJpZGVRdW90YU1hbmFnZXJGb3JUZXN0aW5nKAotICAgICAgR2V0TW9ja01hbmFnZXIoKSk7CisgIHBhcnRpdGlvbi0+T3ZlcnJpZGVRdW90YU1hbmFnZXJGb3JUZXN0aW5nKEdldE1vY2tNYW5hZ2VyKCkpOwogICBwYXJ0aXRpb24tPk92ZXJyaWRlU3BlY2lhbFN0b3JhZ2VQb2xpY3lGb3JUZXN0aW5nKG1vY2tfcG9saWN5LmdldCgpKTsKICAgYmFzZTo6VGhyZWFkVGFza1J1bm5lckhhbmRsZTo6R2V0KCktPlBvc3RUYXNrKAogICAgICAgRlJPTV9IRVJFLApAQCAtMTEwMiw4ICsxMTEwLDcgQEAKICAgYmFzZTo6UnVuTG9vcCBydW5fbG9vcDsKICAgU3RvcmFnZVBhcnRpdGlvbkltcGwqIHBhcnRpdGlvbiA9IHN0YXRpY19jYXN0PFN0b3JhZ2VQYXJ0aXRpb25JbXBsKj4oCiAgICAgICBCcm93c2VyQ29udGV4dDo6R2V0RGVmYXVsdFN0b3JhZ2VQYXJ0aXRpb24oYnJvd3Nlcl9jb250ZXh0KCkpKTsKLSAgcGFydGl0aW9uLT5PdmVycmlkZVF1b3RhTWFuYWdlckZvclRlc3RpbmcoCi0gICAgICBHZXRNb2NrTWFuYWdlcigpKTsKKyAgcGFydGl0aW9uLT5PdmVycmlkZVF1b3RhTWFuYWdlckZvclRlc3RpbmcoR2V0TW9ja01hbmFnZXIoKSk7CiAgIGJhc2U6OlRocmVhZFRhc2tSdW5uZXJIYW5kbGU6OkdldCgpLT5Qb3N0VGFzaygKICAgICAgIEZST01fSEVSRSwKICAgICAgIGJhc2U6OkJpbmRPbmNlKCZDbGVhclF1b3RhRGF0YVdpdGhPcmlnaW5NYXRjaGVyLCBwYXJ0aXRpb24sCkBAIC0xMTc2LDcgKzExODMsNyBAQAogICAgICAgbmV3IE1vY2tTcGVjaWFsU3RvcmFnZVBvbGljeTsKICAgbW9ja19wb2xpY3ktPkFkZFByb3RlY3RlZChrT3JpZ2luMS5HZXRVUkwoKSk7CiAKLSAgUmVtb3ZlTG9jYWxTdG9yYWdlVGVzdGVyIHRlc3Rlcihicm93c2VyX2NvbnRleHQoKSk7CisgIFJlbW92ZUxvY2FsU3RvcmFnZVRlc3RlciB0ZXN0ZXIodGFza19lbnZpcm9ubWVudCgpLCBicm93c2VyX2NvbnRleHQoKSk7CiAKICAgdGVzdGVyLkFkZERPTVN0b3JhZ2VUZXN0RGF0YSgpOwogICBFWFBFQ1RfVFJVRSh0ZXN0ZXIuRE9NU3RvcmFnZUV4aXN0c0Zvck9yaWdpbihrT3JpZ2luMSkpOwpAQCAtMTIxMSw3ICsxMjE4LDcgQEAKICAgICAgIG5ldyBNb2NrU3BlY2lhbFN0b3JhZ2VQb2xpY3k7CiAgIG1vY2tfcG9saWN5LT5BZGRQcm90ZWN0ZWQoa09yaWdpbjEuR2V0VVJMKCkpOwogCi0gIFJlbW92ZUxvY2FsU3RvcmFnZVRlc3RlciB0ZXN0ZXIoYnJvd3Nlcl9jb250ZXh0KCkpOworICBSZW1vdmVMb2NhbFN0b3JhZ2VUZXN0ZXIgdGVzdGVyKHRhc2tfZW52aXJvbm1lbnQoKSwgYnJvd3Nlcl9jb250ZXh0KCkpOwogCiAgIHRlc3Rlci5BZGRET01TdG9yYWdlVGVzdERhdGEoKTsKICAgRVhQRUNUX1RSVUUodGVzdGVyLkRPTVN0b3JhZ2VFeGlzdHNGb3JPcmlnaW4oa09yaWdpbjEpKTsKQEAgLTEyNDUsNyArMTI1Miw3IEBACiB9CiAKIFRFU1RfRihTdG9yYWdlUGFydGl0aW9uSW1wbFRlc3QsIFJlbW92ZUxvY2FsU3RvcmFnZUZvckxhc3RXZWVrKSB7Ci0gIFJlbW92ZUxvY2FsU3RvcmFnZVRlc3RlciB0ZXN0ZXIoYnJvd3Nlcl9jb250ZXh0KCkpOworICBSZW1vdmVMb2NhbFN0b3JhZ2VUZXN0ZXIgdGVzdGVyKHRhc2tfZW52aXJvbm1lbnQoKSwgYnJvd3Nlcl9jb250ZXh0KCkpOwogCiAgIHRlc3Rlci5BZGRET01TdG9yYWdlVGVzdERhdGEoKTsKICAgRVhQRUNUX1RSVUUodGVzdGVyLkRPTVN0b3JhZ2VFeGlzdHNGb3JPcmlnaW4oa09yaWdpbjEpKTsKZGlmZiAtLWdpdCBhL2NvbnRlbnQvYnJvd3Nlci90cmFjaW5nL21lbW9yeV9pbnN0cnVtZW50YXRpb25fYnJvd3NlcnRlc3QuY2MgYi9jb250ZW50L2Jyb3dzZXIvdHJhY2luZy9tZW1vcnlfaW5zdHJ1bWVudGF0aW9uX2Jyb3dzZXJ0ZXN0LmNjCmluZGV4IDBhZmVlYWQuLjAyODNmNmYgMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvYnJvd3Nlci90cmFjaW5nL21lbW9yeV9pbnN0cnVtZW50YXRpb25fYnJvd3NlcnRlc3QuY2MKKysrIGIvY29udGVudC9icm93c2VyL3RyYWNpbmcvbWVtb3J5X2luc3RydW1lbnRhdGlvbl9icm93c2VydGVzdC5jYwpAQCAtNzksOSArNzksOCBAQAogCiAvLyAqU0FOIGZha2Ugc29tZSBzeXMgY2FsbHMgd2UgbmVlZCBtZWFuaW5nIHdlIG5ldmVyIGdldCBkdW1wcyBmb3IgdGhlCiAvLyBwcm9jZXNzZXMuCi0vLyBGbGFrZXMgb24gQW5kcm9pZC4gY3JidWcuY29tLzk3MDA1OAogI2lmIGRlZmluZWQoTUVNT1JZX1NBTklUSVpFUikgfHwgZGVmaW5lZChBRERSRVNTX1NBTklUSVpFUikgfHwgXAotICAgIGRlZmluZWQoVEhSRUFEX1NBTklUSVpFUikgfHwgZGVmaW5lZChPU19BTkRST0lEKQorICAgIGRlZmluZWQoVEhSRUFEX1NBTklUSVpFUikKICNkZWZpbmUgTUFZQkVfUHJpdmF0ZUZvb3RwcmludENvbXB1dGF0aW9uIERJU0FCTEVEX1ByaXZhdGVGb290cHJpbnRDb21wdXRhdGlvbgogI2Vsc2UKICNkZWZpbmUgTUFZQkVfUHJpdmF0ZUZvb3RwcmludENvbXB1dGF0aW9uIFByaXZhdGVGb290cHJpbnRDb21wdXRhdGlvbgpkaWZmIC0tZ2l0IGEvY29udGVudC9icm93c2VyL3RyYWNpbmcvbWVtb3J5X2luc3RydW1lbnRhdGlvbl91dGlsLmNjIGIvY29udGVudC9icm93c2VyL3RyYWNpbmcvbWVtb3J5X2luc3RydW1lbnRhdGlvbl91dGlsLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYjAxZDQxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGVudC9icm93c2VyL3RyYWNpbmcvbWVtb3J5X2luc3RydW1lbnRhdGlvbl91dGlsLmNjCkBAIC0wLDAgKzEsMjYgQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgImNvbnRlbnQvYnJvd3Nlci90cmFjaW5nL21lbW9yeV9pbnN0cnVtZW50YXRpb25fdXRpbC5oIgorCisjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvYnJvd3Nlci9yZXNvdXJjZV9jb29yZGluYXRvcl9zZXJ2aWNlLmgiCisjaW5jbHVkZSAic2VydmljZXMvcmVzb3VyY2VfY29vcmRpbmF0b3IvcHVibGljL2NwcC9tZW1vcnlfaW5zdHJ1bWVudGF0aW9uL2NsaWVudF9wcm9jZXNzX2ltcGwuaCIKKyNpbmNsdWRlICJzZXJ2aWNlcy9yZXNvdXJjZV9jb29yZGluYXRvci9wdWJsaWMvbW9qb20vbWVtb3J5X2luc3RydW1lbnRhdGlvbi9tZW1vcnlfaW5zdHJ1bWVudGF0aW9uLm1vam9tLmgiCisKK25hbWVzcGFjZSBjb250ZW50IHsKKwordm9pZCBJbml0aWFsaXplQnJvd3Nlck1lbW9yeUluc3RydW1lbnRhdGlvbkNsaWVudCgpIHsKKyAgbW9qbzo6UGVuZGluZ1JlbW90ZTxtZW1vcnlfaW5zdHJ1bWVudGF0aW9uOjptb2pvbTo6Q29vcmRpbmF0b3I+IGNvb3JkaW5hdG9yOworICBtb2pvOjpQZW5kaW5nUmVtb3RlPG1lbW9yeV9pbnN0cnVtZW50YXRpb246Om1vam9tOjpDbGllbnRQcm9jZXNzPiBwcm9jZXNzOworICBhdXRvIHByb2Nlc3NfcmVjZWl2ZXIgPSBwcm9jZXNzLkluaXRXaXRoTmV3UGlwZUFuZFBhc3NSZWNlaXZlcigpOworICBHZXRNZW1vcnlJbnN0cnVtZW50YXRpb25Db29yZGluYXRvckNvbnRyb2xsZXIoKS0+UmVnaXN0ZXJDbGllbnRQcm9jZXNzKAorICAgICAgY29vcmRpbmF0b3IuSW5pdFdpdGhOZXdQaXBlQW5kUGFzc1JlY2VpdmVyKCksIHN0ZDo6bW92ZShwcm9jZXNzKSwKKyAgICAgIG1lbW9yeV9pbnN0cnVtZW50YXRpb246Om1vam9tOjpQcm9jZXNzVHlwZTo6QlJPV1NFUiwKKyAgICAgIGJhc2U6OkdldEN1cnJlbnRQcm9jSWQoKSwgLypzZXJ2aWNlX25hbWU9Ki9iYXNlOjpudWxsb3B0KTsKKyAgbWVtb3J5X2luc3RydW1lbnRhdGlvbjo6Q2xpZW50UHJvY2Vzc0ltcGw6OkNyZWF0ZUluc3RhbmNlKAorICAgICAgc3RkOjptb3ZlKHByb2Nlc3NfcmVjZWl2ZXIpLCBzdGQ6Om1vdmUoY29vcmRpbmF0b3IpLAorICAgICAgLyppc19icm93c2VyX3Byb2Nlc3M9Ki90cnVlKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNvbnRlbnQKZGlmZiAtLWdpdCBhL2NvbnRlbnQvYnJvd3Nlci90cmFjaW5nL21lbW9yeV9pbnN0cnVtZW50YXRpb25fdXRpbC5oIGIvY29udGVudC9icm93c2VyL3RyYWNpbmcvbWVtb3J5X2luc3RydW1lbnRhdGlvbl91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVmYzI3ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250ZW50L2Jyb3dzZXIvdHJhY2luZy9tZW1vcnlfaW5zdHJ1bWVudGF0aW9uX3V0aWwuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxOSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpZm5kZWYgQ09OVEVOVF9CUk9XU0VSX1RSQUNJTkdfTUVNT1JZX0lOU1RSVU1FTlRBVElPTl9VVElMX0hfCisjZGVmaW5lIENPTlRFTlRfQlJPV1NFUl9UUkFDSU5HX01FTU9SWV9JTlNUUlVNRU5UQVRJT05fVVRJTF9IXworCisjaW5jbHVkZSAiY29udGVudC9jb21tb24vY29udGVudF9leHBvcnQuaCIKKworbmFtZXNwYWNlIGNvbnRlbnQgeworCisvLyBSZWdpc3RlcnMgdGhlIGJyb3dzZXIgcHJvY2VzcyBhcyBhIG1lbW9yeS1pbnN0cnVtZW50YXRpb24gY2xpZW50LCBzbyB0aGF0CisvLyBkYXRhIGZvciB0aGUgYnJvd3NlciBwcm9jZXNzIHdpbGwgYmUgYXZhaWxhYmxlIGluIG1lbW9yeSBkdW1wcy4KK3ZvaWQgQ09OVEVOVF9FWFBPUlQgSW5pdGlhbGl6ZUJyb3dzZXJNZW1vcnlJbnN0cnVtZW50YXRpb25DbGllbnQoKTsKKworfSAgLy8gbmFtZXNwYWNlIGNvbnRlbnQKKworI2VuZGlmICAvLyBDT05URU5UX0JST1dTRVJfVFJBQ0lOR19NRU1PUllfSU5TVFJVTUVOVEFUSU9OX1VUSUxfSF8KZGlmZiAtLWdpdCBhL2NvbnRlbnQvYnJvd3Nlci90cmFjaW5nL21lbW9yeV90cmFjaW5nX2Jyb3dzZXJ0ZXN0LmNjIGIvY29udGVudC9icm93c2VyL3RyYWNpbmcvbWVtb3J5X3RyYWNpbmdfYnJvd3NlcnRlc3QuY2MKaW5kZXggMmJmMzllNWQuLjJmNDdlNTQgMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvYnJvd3Nlci90cmFjaW5nL21lbW9yeV90cmFjaW5nX2Jyb3dzZXJ0ZXN0LmNjCisrKyBiL2NvbnRlbnQvYnJvd3Nlci90cmFjaW5nL21lbW9yeV90cmFjaW5nX2Jyb3dzZXJ0ZXN0LmNjCkBAIC0xODAsMTAgKzE4MCw5IEBACiAvLyBpbnRlbmRlZCB0byBnaXZlIGNvdmVyYWdlIHRvIEFuZHJvaWQgV2ViVmlldy4KICNpZiBkZWZpbmVkKE9TX0FORFJPSUQpCiAKLS8vIEZsYWt5IG9uIEFuZHJvaWQuIGNyYnVnLmNvbS85NzAwNTgKLWNsYXNzIERJU0FCTEVEX1NpbmdsZVByb2Nlc3NNZW1vcnlUcmFjaW5nVGVzdCA6IHB1YmxpYyBNZW1vcnlUcmFjaW5nVGVzdCB7CitjbGFzcyBTaW5nbGVQcm9jZXNzTWVtb3J5VHJhY2luZ1Rlc3QgOiBwdWJsaWMgTWVtb3J5VHJhY2luZ1Rlc3QgewogIHB1YmxpYzoKLSAgRElTQUJMRURfU2luZ2xlUHJvY2Vzc01lbW9yeVRyYWNpbmdUZXN0KCkge30KKyAgU2luZ2xlUHJvY2Vzc01lbW9yeVRyYWNpbmdUZXN0KCkge30KIAogICB2b2lkIFNldFVwQ29tbWFuZExpbmUoYmFzZTo6Q29tbWFuZExpbmUqIGNvbW1hbmRfbGluZSkgb3ZlcnJpZGUgewogICAgIGNvbW1hbmRfbGluZS0+QXBwZW5kU3dpdGNoKHN3aXRjaGVzOjprU2luZ2xlUHJvY2Vzcyk7CkBAIC0xOTEsMTUgKzE5MCwxNSBAQAogfTsKIAogLy8gaHR0cHM6Ly9jcmJ1Zy5jb20vNzg4Nzg4Ci0jaWYgZGVmaW5lZChBRERSRVNTX1NBTklUSVpFUikKKyNpZiBkZWZpbmVkKE9TX0FORFJPSUQpICYmIGRlZmluZWQoQUREUkVTU19TQU5JVElaRVIpCiAjZGVmaW5lIE1BWUJFX0Jyb3dzZXJJbml0aWF0ZWRTaW5nbGVEdW1wIERJU0FCTEVEX0Jyb3dzZXJJbml0aWF0ZWRTaW5nbGVEdW1wCiAjZWxzZQogI2RlZmluZSBNQVlCRV9Ccm93c2VySW5pdGlhdGVkU2luZ2xlRHVtcCBCcm93c2VySW5pdGlhdGVkU2luZ2xlRHVtcAotI2VuZGlmICAvLyBkZWZpbmVkKEFERFJFU1NfU0FOSVRJWkVSKQorI2VuZGlmICAvLyBkZWZpbmVkKE9TX0FORFJPSUQpICYmIGRlZmluZWQoQUREUkVTU19TQU5JVElaRVIpCiAKIC8vIENoZWNrcyB0aGF0IGEgbWVtb3J5IGR1bXAgaW5pdGlhdGVkIGZyb20gYSB0aGUgbWFpbiBicm93c2VyIHRocmVhZCBlbmRzIHVwIGluCiAvLyBhIHNpbmdsZSBkdW1wIGV2ZW4gaW4gc2luZ2xlIHByb2Nlc3MgbW9kZS4KLUlOX1BST0NfQlJPV1NFUl9URVNUX0YoRElTQUJMRURfU2luZ2xlUHJvY2Vzc01lbW9yeVRyYWNpbmdUZXN0LAorSU5fUFJPQ19CUk9XU0VSX1RFU1RfRihTaW5nbGVQcm9jZXNzTWVtb3J5VHJhY2luZ1Rlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgIE1BWUJFX0Jyb3dzZXJJbml0aWF0ZWRTaW5nbGVEdW1wKSB7CiAgIE5hdmlnYXRlKHNoZWxsKCkpOwogCkBAIC0yMTQsMTYgKzIxMywxNiBAQAogfQogCiAvLyBodHRwczovL2NyYnVnLmNvbS83ODg3ODgKLSNpZiBkZWZpbmVkKEFERFJFU1NfU0FOSVRJWkVSKQorI2lmIGRlZmluZWQoT1NfQU5EUk9JRCkgJiYgZGVmaW5lZChBRERSRVNTX1NBTklUSVpFUikKICNkZWZpbmUgTUFZQkVfUmVuZGVyZXJJbml0aWF0ZWRTaW5nbGVEdW1wIERJU0FCTEVEX1JlbmRlcmVySW5pdGlhdGVkU2luZ2xlRHVtcAogI2Vsc2UKICNkZWZpbmUgTUFZQkVfUmVuZGVyZXJJbml0aWF0ZWRTaW5nbGVEdW1wIFJlbmRlcmVySW5pdGlhdGVkU2luZ2xlRHVtcAotI2VuZGlmICAvLyBkZWZpbmVkKEFERFJFU1NfU0FOSVRJWkVSKQorI2VuZGlmICAvLyBkZWZpbmVkKE9TX0FORFJPSUQpICYmIGRlZmluZWQoQUREUkVTU19TQU5JVElaRVIpCiAKIC8vIENoZWNrcyB0aGF0IGEgbWVtb3J5IGR1bXAgaW5pdGlhdGVkIGZyb20gYSByZW5kZXJlciB0aHJlYWQgZW5kcyB1cCBpbiBhCiAvLyBzaW5nbGUgZHVtcCBldmVuIGluIHNpbmdsZSBwcm9jZXNzIG1vZGUuCi1JTl9QUk9DX0JST1dTRVJfVEVTVF9GKERJU0FCTEVEX1NpbmdsZVByb2Nlc3NNZW1vcnlUcmFjaW5nVGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgRElTQUJMRURfUmVuZGVyZXJJbml0aWF0ZWRTaW5nbGVEdW1wKSB7CitJTl9QUk9DX0JST1dTRVJfVEVTVF9GKFNpbmdsZVByb2Nlc3NNZW1vcnlUcmFjaW5nVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgTUFZQkVfUmVuZGVyZXJJbml0aWF0ZWRTaW5nbGVEdW1wKSB7CiAgIE5hdmlnYXRlKHNoZWxsKCkpOwogCiAgIEVYUEVDVF9DQUxMKCptb2NrX2R1bXBfcHJvdmlkZXJfLCBPbk1lbW9yeUR1bXAoXyxfKSkuV2lsbE9uY2UoUmV0dXJuKHRydWUpKTsKQEAgLTIzNywxMiArMjM2LDEyIEBACiB9CiAKIC8vIGh0dHBzOi8vY3JidWcuY29tLzc4ODc4OAotI2lmIGRlZmluZWQoQUREUkVTU19TQU5JVElaRVIpCisjaWYgZGVmaW5lZChPU19BTkRST0lEKSAmJiBkZWZpbmVkKEFERFJFU1NfU0FOSVRJWkVSKQogI2RlZmluZSBNQVlCRV9NYW55SW50ZXJsZWF2ZWREdW1wcyBESVNBQkxFRF9NYW55SW50ZXJsZWF2ZWREdW1wcwogI2Vsc2UKICNkZWZpbmUgTUFZQkVfTWFueUludGVybGVhdmVkRHVtcHMgTWFueUludGVybGVhdmVkRHVtcHMKLSNlbmRpZiAgLy8gZGVmaW5lZChBRERSRVNTX1NBTklUSVpFUikKLUlOX1BST0NfQlJPV1NFUl9URVNUX0YoRElTQUJMRURfU2luZ2xlUHJvY2Vzc01lbW9yeVRyYWNpbmdUZXN0LAorI2VuZGlmICAvLyBkZWZpbmVkKE9TX0FORFJPSUQpICYmIGRlZmluZWQoQUREUkVTU19TQU5JVElaRVIpCitJTl9QUk9DX0JST1dTRVJfVEVTVF9GKFNpbmdsZVByb2Nlc3NNZW1vcnlUcmFjaW5nVGVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgTUFZQkVfTWFueUludGVybGVhdmVkRHVtcHMpIHsKICAgTmF2aWdhdGUoc2hlbGwoKSk7CiAKQEAgLTI3Miw4ICsyNzEsNyBAQAogLy8gdGhhdCBwZXJpb2RpYyBkdW1wIHJlcXVlc3RzIGZhaWwgaW4gY2FzZSB0aGVyZSBpcyBhbHJlYWR5IGEgcmVxdWVzdCBpbiB0aGUKIC8vIHF1ZXVlIHdpdGggdGhlIHNhbWUgbGV2ZWwgb2YgZGV0YWlsLgogLy8gRmxha3kgZmFpbHVyZXMgb24gYWxsIHBsYXRmb3Jtcy4gaHR0cHM6Ly9jcmJ1Zy5jb20vNzUyNjEzCi1JTl9QUk9DX0JST1dTRVJfVEVTVF9GKERJU0FCTEVEX1NpbmdsZVByb2Nlc3NNZW1vcnlUcmFjaW5nVGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgRElTQUJMRURfUXVldWVkRHVtcHMpIHsKK0lOX1BST0NfQlJPV1NFUl9URVNUX0YoU2luZ2xlUHJvY2Vzc01lbW9yeVRyYWNpbmdUZXN0LCBESVNBQkxFRF9RdWV1ZWREdW1wcykgewogICBOYXZpZ2F0ZShzaGVsbCgpKTsKIAogICBFbmFibGVNZW1vcnlUcmFjaW5nKCk7CkBAIC0zMzksNyArMzM3LDcgQEAKICNlbmRpZiAgLy8gZGVmaW5lZChPU19BTkRST0lEKQogCiAvLyBGbGFreSBvbiBNYWMuIGNyYnVnLmNvbS84MDk4MDkKLSNpZiBkZWZpbmVkKE9TX01BQ09TWCkgfHwgZGVmaW5lZChPU19BTkRST0lEKQorI2lmIGRlZmluZWQoT1NfTUFDT1NYKQogI2RlZmluZSBNQVlCRV9Ccm93c2VySW5pdGlhdGVkRHVtcCBESVNBQkxFRF9Ccm93c2VySW5pdGlhdGVkRHVtcAogI2Vsc2UKICNkZWZpbmUgTUFZQkVfQnJvd3NlckluaXRpYXRlZER1bXAgQnJvd3NlckluaXRpYXRlZER1bXAKZGlmZiAtLWdpdCBhL2NvbnRlbnQvYnJvd3Nlci90cmFjaW5nL3RyYWNpbmdfY29udHJvbGxlcl9pbXBsLmNjIGIvY29udGVudC9icm93c2VyL3RyYWNpbmcvdHJhY2luZ19jb250cm9sbGVyX2ltcGwuY2MKaW5kZXggZjUwNDZkZC4uMmRiNGU3MSAxMDA2NDQKLS0tIGEvY29udGVudC9icm93c2VyL3RyYWNpbmcvdHJhY2luZ19jb250cm9sbGVyX2ltcGwuY2MKKysrIGIvY29udGVudC9icm93c2VyL3RyYWNpbmcvdHJhY2luZ19jb250cm9sbGVyX2ltcGwuY2MKQEAgLTM5LDYgKzM5LDggQEAKICNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvc3lzdGVtL2RhdGFfcGlwZS5oIgogI2luY2x1ZGUgIm5ldC9iYXNlL25ldHdvcmtfY2hhbmdlX25vdGlmaWVyLmgiCiAjaW5jbHVkZSAic2VydmljZXMvc2VydmljZV9tYW5hZ2VyL3B1YmxpYy9jcHAvY29ubmVjdG9yLmgiCisjaW5jbHVkZSAic2VydmljZXMvdHJhY2luZy9wdWJsaWMvY3BwL3BlcmZldHRvL2phdmFfaGVhcF9wcm9maWxlci9qYXZhX2hlYXBfcHJvZmlsZXIuaCIKKyNpbmNsdWRlICJzZXJ2aWNlcy90cmFjaW5nL3B1YmxpYy9jcHAvcGVyZmV0dG8vcGVyZmV0dG9fdHJhY2VkX3Byb2Nlc3MuaCIKICNpbmNsdWRlICJzZXJ2aWNlcy90cmFjaW5nL3B1YmxpYy9jcHAvdHJhY2VfZXZlbnRfYWdlbnQuaCIKICNpbmNsdWRlICJzZXJ2aWNlcy90cmFjaW5nL3B1YmxpYy9jcHAvdHJhY2VkX3Byb2Nlc3NfaW1wbC5oIgogI2luY2x1ZGUgInNlcnZpY2VzL3RyYWNpbmcvcHVibGljL2NwcC90cmFjaW5nX2ZlYXR1cmVzLmgiCkBAIC0yMTAsNiArMjEyLDggQEAKICAgICAgICAgYmFzZTo6QmluZFJlcGVhdGluZygmVHJhY2luZ0RlbGVnYXRlOjpHZW5lcmF0ZU1ldGFkYXRhRGljdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKGRlbGVnYXRlXy5nZXQoKSkpKTsKICAgfQorICB0cmFjaW5nOjpQZXJmZXR0b1RyYWNlZFByb2Nlc3M6OkdldCgpLT5BZGREYXRhU291cmNlKAorICAgICAgdHJhY2luZzo6SmF2YUhlYXBQcm9maWxlcjo6R2V0SW5zdGFuY2UoKSk7CiB9CiAKIHZvaWQgVHJhY2luZ0NvbnRyb2xsZXJJbXBsOjpDb25uZWN0VG9TZXJ2aWNlSWZOZWVkZWQoKSB7CmRpZmYgLS1naXQgYS9jb250ZW50L2Jyb3dzZXIvd2ViX2NvbnRlbnRzL3dlYl9jb250ZW50c19pbXBsLmNjIGIvY29udGVudC9icm93c2VyL3dlYl9jb250ZW50cy93ZWJfY29udGVudHNfaW1wbC5jYwppbmRleCA5MWM5YTFjLi4wNjYwZmRkOCAxMDA2NDQKLS0tIGEvY29udGVudC9icm93c2VyL3dlYl9jb250ZW50cy93ZWJfY29udGVudHNfaW1wbC5jYworKysgYi9jb250ZW50L2Jyb3dzZXIvd2ViX2NvbnRlbnRzL3dlYl9jb250ZW50c19pbXBsLmNjCkBAIC0xNSw3ICsxNSw2IEBACiAjaW5jbHVkZSAiYmFzZS9kZWJ1Zy9kdW1wX3dpdGhvdXRfY3Jhc2hpbmcuaCIKICNpbmNsdWRlICJiYXNlL2ZlYXR1cmVfbGlzdC5oIgogI2luY2x1ZGUgImJhc2UvZmlsZXMvZmlsZV9wYXRoLmgiCi0jaW5jbHVkZSAiYmFzZS9pMThuL2NoYXJhY3Rlcl9lbmNvZGluZy5oIgogI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgogI2luY2x1ZGUgImJhc2UvbG9jYXRpb24uaCIKICNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKQEAgLTE0NDgsNyArMTQ0Nyw3IEBACiB9CiAKIGNvbnN0IHN0ZDo6c3RyaW5nJiBXZWJDb250ZW50c0ltcGw6OkdldEVuY29kaW5nKCkgewotICByZXR1cm4gY2Fub25pY2FsX2VuY29kaW5nXzsKKyAgcmV0dXJuIEdldE1haW5GcmFtZSgpLT5HZXRFbmNvZGluZygpOwogfQogCiBib29sIFdlYkNvbnRlbnRzSW1wbDo6V2FzRGlzY2FyZGVkKCkgewpAQCAtMzY3NSwxMCArMzY3NCw3IEBACiAgIGlmICghZm9jdXNlZF9mcmFtZSkKICAgICByZXR1cm47CiAKLSAgLy8gVE9ETyhodHRwczovL2NyYnVnLmNvbS85OTU0MjgpLiBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQuIE5hdmlnYXRpb25zCi0gIC8vIGFyZSBoYW5kbGVkIGZyb20gdGhlIGJyb3dzZXIgcHJvY2Vzcy4gVGhlcmUgaXMgbm8gbmVlZCB0byBzZW5kIGFuIElQQyB0bwotICAvLyB0aGUgcmVuZGVyZXIgcHJvY2VzcyBmb3IgdGhpcy4KLSAgZm9jdXNlZF9mcmFtZS0+U2VuZChuZXcgRnJhbWVNc2dfUmVsb2FkKGZvY3VzZWRfZnJhbWUtPkdldFJvdXRpbmdJRCgpKSk7CisgIGZvY3VzZWRfZnJhbWUtPlJlbG9hZCgpOwogfQogCiBzdGQ6OnZlY3Rvcjxtb2pvOjpSZW1vdGU8Ymxpbms6Om1vam9tOjpQYXVzZVN1YnJlc291cmNlTG9hZGluZ0hhbmRsZT4+CkBAIC02MTg0LDExICs2MTgwLDYgQEAKICAgVXBkYXRlVGl0bGVGb3JFbnRyeShlbnRyeSwgdGl0bGUpOwogfQogCi12b2lkIFdlYkNvbnRlbnRzSW1wbDo6VXBkYXRlRW5jb2RpbmcoUmVuZGVyRnJhbWVIb3N0KiByZW5kZXJfZnJhbWVfaG9zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZW5jb2RpbmcpIHsKLSAgU2V0RW5jb2RpbmcoZW5jb2RpbmcpOwotfQotCiB2b2lkIFdlYkNvbnRlbnRzSW1wbDo6RG9jdW1lbnRBdmFpbGFibGVJbk1haW5GcmFtZSgKICAgICBSZW5kZXJWaWV3SG9zdCogcmVuZGVyX3ZpZXdfaG9zdCkgewogICBmb3IgKGF1dG8mIG9ic2VydmVyIDogb2JzZXJ2ZXJzXykKQEAgLTY3NzIsMTQgKzY3NjMsNiBAQAogICBpc19zaG93aW5nX2JlZm9yZV91bmxvYWRfZGlhbG9nXyA9IGZhbHNlOwogfQogCi12b2lkIFdlYkNvbnRlbnRzSW1wbDo6U2V0RW5jb2RpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGVuY29kaW5nKSB7Ci0gIGlmIChlbmNvZGluZyA9PSBsYXN0X3JlcG9ydGVkX2VuY29kaW5nXykKLSAgICByZXR1cm47Ci0gIGxhc3RfcmVwb3J0ZWRfZW5jb2RpbmdfID0gZW5jb2Rpbmc7Ci0KLSAgY2Fub25pY2FsX2VuY29kaW5nXyA9IGJhc2U6OkdldENhbm9uaWNhbEVuY29kaW5nTmFtZUJ5QWxpYXNOYW1lKGVuY29kaW5nKTsKLX0KLQogYm9vbCBXZWJDb250ZW50c0ltcGw6OklzSGlkZGVuKCkgewogICByZXR1cm4gIUlzQmVpbmdDYXB0dXJlZCgpICYmIHZpc2liaWxpdHlfICE9IFZpc2liaWxpdHk6OlZJU0lCTEU7CiB9CmRpZmYgLS1naXQgYS9jb250ZW50L2Jyb3dzZXIvd2ViX2NvbnRlbnRzL3dlYl9jb250ZW50c19pbXBsLmggYi9jb250ZW50L2Jyb3dzZXIvd2ViX2NvbnRlbnRzL3dlYl9jb250ZW50c19pbXBsLmgKaW5kZXggYjYzYjBkMC4uNDdkZTU4NCAxMDA2NDQKLS0tIGEvY29udGVudC9icm93c2VyL3dlYl9jb250ZW50cy93ZWJfY29udGVudHNfaW1wbC5oCisrKyBiL2NvbnRlbnQvYnJvd3Nlci93ZWJfY29udGVudHMvd2ViX2NvbnRlbnRzX2ltcGwuaApAQCAtNTUyLDggKzU1Miw2IEBACiAgIHZvaWQgVXBkYXRlVGl0bGUoUmVuZGVyRnJhbWVIb3N0KiByZW5kZXJfZnJhbWVfaG9zdCwKICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpzdHJpbmcxNiYgdGl0bGUsCiAgICAgICAgICAgICAgICAgICAgYmFzZTo6aTE4bjo6VGV4dERpcmVjdGlvbiB0aXRsZV9kaXJlY3Rpb24pIG92ZXJyaWRlOwotICB2b2lkIFVwZGF0ZUVuY29kaW5nKFJlbmRlckZyYW1lSG9zdCogcmVuZGVyX2ZyYW1lX2hvc3QsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGVuY29kaW5nKSBvdmVycmlkZTsKICAgV2ViQ29udGVudHMqIEdldEFzV2ViQ29udGVudHMoKSBvdmVycmlkZTsKICAgYm9vbCBJc05ldmVyVmlzaWJsZSgpIG92ZXJyaWRlOwogICB1aTo6QVhNb2RlIEdldEFjY2Vzc2liaWxpdHlNb2RlKCkgb3ZlcnJpZGU7CkBAIC0xNDY2LDggKzE0NjQsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX21haW5fZnJhbWUpOwogICB2b2lkIE5vdGlmeURpc2Nvbm5lY3RlZCgpOwogCi0gIHZvaWQgU2V0RW5jb2RpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGVuY29kaW5nKTsKLQogICAvLyBUT0RPKGNyZWlzKTogVGhpcyBzaG91bGQgdGFrZSBpbiBhIEZyYW1lVHJlZU5vZGUgdG8ga25vdyB3aGljaCBub2RlJ3MKICAgLy8gcmVuZGVyIG1hbmFnZXIgdG8gcmV0dXJuLiAgRm9yIG5vdywgd2UganVzdCByZXR1cm4gdGhlIHJvb3Qncy4KICAgUmVuZGVyRnJhbWVIb3N0TWFuYWdlciogR2V0UmVuZGVyTWFuYWdlcigpIGNvbnN0OwpAQCAtMTYzNywxMiArMTYzMyw2IEBACiAgIC8vIHVzZWQgdG8gY2hlY2sgd2hldGhlciB3ZSBjYW4gZG8gc29tZXRoaW5nIGZvciBzb21lIHNwZWNpYWwgY29udGVudHMuCiAgIHN0ZDo6c3RyaW5nIGNvbnRlbnRzX21pbWVfdHlwZV87CiAKLSAgLy8gVGhlIGxhc3QgcmVwb3J0ZWQgY2hhcmFjdGVyIGVuY29kaW5nLCBub3QgY2Fub25pY2FsaXplZC4KLSAgc3RkOjpzdHJpbmcgbGFzdF9yZXBvcnRlZF9lbmNvZGluZ187Ci0KLSAgLy8gVGhlIGNhbm9uaWNhbGl6ZWQgY2hhcmFjdGVyIGVuY29kaW5nLgotICBzdGQ6OnN0cmluZyBjYW5vbmljYWxfZW5jb2RpbmdfOwotCiAgIC8vIFdoZXRoZXIgdGhlIGluaXRpYWwgZW1wdHkgcGFnZSBoYXMgYmVlbiBhY2Nlc3NlZCBieSBhbm90aGVyIHBhZ2UsIG1ha2luZyBpdAogICAvLyB1bnNhZmUgdG8gc2hvdyB0aGUgcGVuZGluZyBVUkwuIFVzdWFsbHkgZmFsc2UgdW5sZXNzIGFub3RoZXIgd2luZG93IHRyaWVzCiAgIC8vIHRvIG1vZGlmeSB0aGUgYmxhbmsgcGFnZS4gIEFsd2F5cyBmYWxzZSBhZnRlciB0aGUgZmlyc3QgY29tbWl0LgpkaWZmIC0tZ2l0IGEvY29udGVudC9icm93c2VyL3dlYnVpL3dlYl91aV91cmxfbG9hZGVyX2ZhY3RvcnkuY2MgYi9jb250ZW50L2Jyb3dzZXIvd2VidWkvd2ViX3VpX3VybF9sb2FkZXJfZmFjdG9yeS5jYwppbmRleCAzOWVkYzg3Li4xZTI2YTRlIDEwMDY0NAotLS0gYS9jb250ZW50L2Jyb3dzZXIvd2VidWkvd2ViX3VpX3VybF9sb2FkZXJfZmFjdG9yeS5jYworKysgYi9jb250ZW50L2Jyb3dzZXIvd2VidWkvd2ViX3VpX3VybF9sb2FkZXJfZmFjdG9yeS5jYwpAQCAtODEsMTcgKzgxLDI2IEBACiAKICAgdWludDMyX3Qgb3V0cHV0X3NpemUgPSBieXRlcy0+c2l6ZSgpOwogCi0gIG1vam86OkRhdGFQaXBlIGRhdGFfcGlwZShvdXRwdXRfc2l6ZSk7CisgIE1vam9DcmVhdGVEYXRhUGlwZU9wdGlvbnMgb3B0aW9uczsKKyAgb3B0aW9ucy5zdHJ1Y3Rfc2l6ZSA9IHNpemVvZihNb2pvQ3JlYXRlRGF0YVBpcGVPcHRpb25zKTsKKyAgb3B0aW9ucy5mbGFncyA9IE1PSk9fQ1JFQVRFX0RBVEFfUElQRV9GTEFHX05PTkU7CisgIG9wdGlvbnMuZWxlbWVudF9udW1fYnl0ZXMgPSAxOworICBvcHRpb25zLmNhcGFjaXR5X251bV9ieXRlcyA9IG91dHB1dF9zaXplOworICBtb2pvOjpTY29wZWREYXRhUGlwZVByb2R1Y2VySGFuZGxlIHBpcGVfcHJvZHVjZXJfaGFuZGxlOworICBtb2pvOjpTY29wZWREYXRhUGlwZUNvbnN1bWVySGFuZGxlIHBpcGVfY29uc3VtZXJfaGFuZGxlOworICBNb2pvUmVzdWx0IGNyZWF0ZV9yZXN1bHQgPSBtb2pvOjpDcmVhdGVEYXRhUGlwZSgKKyAgICAgICZvcHRpb25zLCAmcGlwZV9wcm9kdWNlcl9oYW5kbGUsICZwaXBlX2NvbnN1bWVyX2hhbmRsZSk7CisgIENIRUNLX0VRKGNyZWF0ZV9yZXN1bHQsIE1PSk9fUkVTVUxUX09LKTsKIAogICB2b2lkKiBidWZmZXIgPSBudWxscHRyOwogICB1aW50MzJfdCBudW1fYnl0ZXMgPSBvdXRwdXRfc2l6ZTsKLSAgTW9qb1Jlc3VsdCByZXN1bHQgPSBkYXRhX3BpcGUucHJvZHVjZXJfaGFuZGxlLT5CZWdpbldyaXRlRGF0YSgKKyAgTW9qb1Jlc3VsdCByZXN1bHQgPSBwaXBlX3Byb2R1Y2VyX2hhbmRsZS0+QmVnaW5Xcml0ZURhdGEoCiAgICAgICAmYnVmZmVyLCAmbnVtX2J5dGVzLCBNT0pPX1dSSVRFX0RBVEFfRkxBR19OT05FKTsKICAgQ0hFQ0tfRVEocmVzdWx0LCBNT0pPX1JFU1VMVF9PSyk7CiAgIENIRUNLX0dFKG51bV9ieXRlcywgb3V0cHV0X3NpemUpOwogCiAgIG1lbWNweShidWZmZXIsIGJ5dGVzLT5mcm9udCgpLCBvdXRwdXRfc2l6ZSk7Ci0gIHJlc3VsdCA9IGRhdGFfcGlwZS5wcm9kdWNlcl9oYW5kbGUtPkVuZFdyaXRlRGF0YShvdXRwdXRfc2l6ZSk7CisgIHJlc3VsdCA9IHBpcGVfcHJvZHVjZXJfaGFuZGxlLT5FbmRXcml0ZURhdGEob3V0cHV0X3NpemUpOwogICBDSEVDS19FUShyZXN1bHQsIE1PSk9fUkVTVUxUX09LKTsKIAogICAvLyBGb3IgbWVkaWEgY29udGVudCwgfGNvbnRlbnRfbGVuZ3RofCBtdXN0IGJlIGtub3duIHVwZnJvbnQgZm9yIGRhdGEgdGhhdCBpcwpAQCAtMTA0LDcgKzExMyw3IEBACiAgIGNsaWVudC5CaW5kKHN0ZDo6bW92ZShjbGllbnRfaW5mbykpOwogICBjbGllbnQtPk9uUmVjZWl2ZVJlc3BvbnNlKGhlYWRlcnMtPmhlYWQpOwogCi0gIGNsaWVudC0+T25TdGFydExvYWRpbmdSZXNwb25zZUJvZHkoc3RkOjptb3ZlKGRhdGFfcGlwZS5jb25zdW1lcl9oYW5kbGUpKTsKKyAgY2xpZW50LT5PblN0YXJ0TG9hZGluZ1Jlc3BvbnNlQm9keShzdGQ6Om1vdmUocGlwZV9jb25zdW1lcl9oYW5kbGUpKTsKICAgbmV0d29yazo6VVJMTG9hZGVyQ29tcGxldGlvblN0YXR1cyBzdGF0dXMobmV0OjpPSyk7CiAgIHN0YXR1cy5lbmNvZGVkX2RhdGFfbGVuZ3RoID0gb3V0cHV0X3NpemU7CiAgIHN0YXR1cy5lbmNvZGVkX2JvZHlfbGVuZ3RoID0gb3V0cHV0X3NpemU7CmRpZmYgLS1naXQgYS9jb250ZW50L2NoaWxkL3J1bnRpbWVfZmVhdHVyZXMuY2MgYi9jb250ZW50L2NoaWxkL3J1bnRpbWVfZmVhdHVyZXMuY2MKaW5kZXggYjgwMThmNS4uMzVjMzg4OWUgMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvY2hpbGQvcnVudGltZV9mZWF0dXJlcy5jYworKysgYi9jb250ZW50L2NoaWxkL3J1bnRpbWVfZmVhdHVyZXMuY2MKQEAgLTMzNyw2ICszMzcsMTAgQEAKICAgV2ViUnVudGltZUZlYXR1cmVzOjpFbmFibGVJbXBsaWNpdFJvb3RTY3JvbGxlcigKICAgICAgIGJhc2U6OkZlYXR1cmVMaXN0OjpJc0VuYWJsZWQoYmxpbms6OmZlYXR1cmVzOjprSW1wbGljaXRSb290U2Nyb2xsZXIpKTsKIAorICBpZiAoYmFzZTo6RmVhdHVyZUxpc3Q6OklzRW5hYmxlZCgKKyAgICAgICAgICBibGluazo6ZmVhdHVyZXM6OmtDU1NPTVZpZXdTY3JvbGxDb29yZGluYXRlcykpCisgICAgV2ViUnVudGltZUZlYXR1cmVzOjpFbmFibGVDU1NPTVZpZXdTY3JvbGxDb29yZGluYXRlcyh0cnVlKTsKKwogICBXZWJSdW50aW1lRmVhdHVyZXM6OkVuYWJsZVRleHRGcmFnbWVudEFuY2hvcigKICAgICAgIGJhc2U6OkZlYXR1cmVMaXN0OjpJc0VuYWJsZWQoYmxpbms6OmZlYXR1cmVzOjprVGV4dEZyYWdtZW50QW5jaG9yKSk7CiAKZGlmZiAtLWdpdCBhL2NvbnRlbnQvcHVibGljL2FuZHJvaWQvamF2YS9zcmMvb3JnL2Nocm9taXVtL2NvbnRlbnQvYXBwL0tpbGxDaGlsZFVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlci5qYXZhIGIvY29udGVudC9wdWJsaWMvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY29udGVudC9hcHAvS2lsbENoaWxkVW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyLmphdmEKaW5kZXggMjJmNzg5N2YuLmViMmU4MGMgMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvcHVibGljL2FuZHJvaWQvamF2YS9zcmMvb3JnL2Nocm9taXVtL2NvbnRlbnQvYXBwL0tpbGxDaGlsZFVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlci5qYXZhCisrKyBiL2NvbnRlbnQvcHVibGljL2FuZHJvaWQvamF2YS9zcmMvb3JnL2Nocm9taXVtL2NvbnRlbnQvYXBwL0tpbGxDaGlsZFVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlci5qYXZhCkBAIC0zNSwxMiArMzUsMTMgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiY2hlY2tzdHlsZTpTeXN0ZW1FeGl0Q2hlY2siKSAvLyBBbGxvd2VkIHNpbmNlIHRoZSBnb2FsIGlzIHRvIG1pbWljIEFuZHJvaWQuCiAgICAgcHVibGljIHZvaWQgdW5jYXVnaHRFeGNlcHRpb24oVGhyZWFkIHQsIFRocm93YWJsZSBlKSB7CiAgICAgICAgIC8vIE5ldmVyIHJlLWVudGVyLgogICAgICAgICBpZiAobUNyYXNoaW5nKSByZXR1cm47CiAgICAgICAgIG1DcmFzaGluZyA9IHRydWU7CiAKLSAgICAgICAgLy8gQ29weWVkIGZyb20gQW5kcm9pZCBLaWxsQXBwbGljYXRpb25IYW5kbGVyIGluIFJ1bnRpbWVJbml0LmphdmEuIFRoaXMgaXMgaG93IHRoZSBkZWZhdWx0CisgICAgICAgIC8vIENvcGllZCBmcm9tIEFuZHJvaWQgS2lsbEFwcGxpY2F0aW9uSGFuZGxlciBpbiBSdW50aW1lSW5pdC5qYXZhLiBUaGlzIGlzIGhvdyB0aGUgZGVmYXVsdAogICAgICAgICAvLyBBbmRyb2lkIGhhbmRsZXIga2lsbHMgdGhpcyBwcm9jZXNzLgogICAgICAgICBQcm9jZXNzLmtpbGxQcm9jZXNzKFByb2Nlc3MubXlQaWQoKSk7CiAgICAgICAgIFN5c3RlbS5leGl0KDEwKTsKZGlmZiAtLWdpdCBhL2NvbnRlbnQvcHVibGljL2FwcC9jb250ZW50X2Jyb3dzZXJfbWFuaWZlc3QuY2MgYi9jb250ZW50L3B1YmxpYy9hcHAvY29udGVudF9icm93c2VyX21hbmlmZXN0LmNjCmluZGV4IDU2MGE3NGYuLjNiYmVjNGQgMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvcHVibGljL2FwcC9jb250ZW50X2Jyb3dzZXJfbWFuaWZlc3QuY2MKKysrIGIvY29udGVudC9wdWJsaWMvYXBwL2NvbnRlbnRfYnJvd3Nlcl9tYW5pZmVzdC5jYwpAQCAtOTIsNyArOTIsNyBAQAogICAgICAgICAgICAgICAgICAgIm5ldHdvcmsubW9qb20uUDJQU29ja2V0TWFuYWdlciIsCiAgICAgICAgICAgICAgICAgICAibmV0d29yay5tb2pvbS5NZG5zUmVzcG9uZGVyIiwKICAgICAgICAgICAgICAgICAgICJuZXR3b3JrLm1vam9tLlVSTExvYWRlckZhY3RvcnkiLAotICAgICAgICAgICAgICAgICAgInJlc291cmNlX2Nvb3JkaW5hdG9yLm1vam9tLlByb2Nlc3NDb29yZGluYXRpb25Vbml0IiwKKyAgICAgICAgICAgICAgICAgICJwZXJmb3JtYW5jZV9tYW5hZ2VyLm1vam9tLlByb2Nlc3NDb29yZGluYXRpb25Vbml0IiwKICAgICAgICAgICAgICAgICAgICJ2aXoubW9qb20uQ29tcG9zaXRpbmdNb2RlUmVwb3J0ZXIiLAogICAgICAgICAgICAgICAgICAgInZpei5tb2pvbS5HcHUiLAogICAgICAgICAgICAgICB9KQpAQCAtMjIyLDcgKzIyMiw3IEBACiAgICAgICAgICAgICAgICAgICAibW9qb20uUHJvY2Vzc0ludGVybmFsc0hhbmRsZXIiLAogICAgICAgICAgICAgICAgICAgIm5ldHdvcmsubW9qb20uUmVzdHJpY3RlZENvb2tpZU1hbmFnZXIiLAogICAgICAgICAgICAgICAgICAgImJsaW5rLm1vam9tLldlYlNvY2tldENvbm5lY3RvciIsCi0gICAgICAgICAgICAgICAgICAicmVzb3VyY2VfY29vcmRpbmF0b3IubW9qb20uRG9jdW1lbnRDb29yZGluYXRpb25Vbml0IiwKKyAgICAgICAgICAgICAgICAgICJwZXJmb3JtYW5jZV9tYW5hZ2VyLm1vam9tLkRvY3VtZW50Q29vcmRpbmF0aW9uVW5pdCIsCiAgICAgICAgICAgICAgICAgICAidml6Lm1vam9tLkdwdSJ9KQogICAgICAgICAgIC5SZXF1aXJlSW50ZXJmYWNlRmlsdGVyQ2FwYWJpbGl0eV9EZXByZWNhdGVkKAogICAgICAgICAgICAgICBtb2pvbTo6a1JlbmRlcmVyU2VydmljZU5hbWUsICJuYXZpZ2F0aW9uOmZyYW1lIiwgImJyb3dzZXIiKQpkaWZmIC0tZ2l0IGEvY29udGVudC9wdWJsaWMvYnJvd3Nlci9hbmRyb2lkL2NvbXBvc2l0b3IuaCBiL2NvbnRlbnQvcHVibGljL2Jyb3dzZXIvYW5kcm9pZC9jb21wb3NpdG9yLmgKaW5kZXggYzhmZDY4MS4uMThhMmRhMiAxMDA2NDQKLS0tIGEvY29udGVudC9wdWJsaWMvYnJvd3Nlci9hbmRyb2lkL2NvbXBvc2l0b3IuaAorKysgYi9jb250ZW50L3B1YmxpYy9icm93c2VyL2FuZHJvaWQvY29tcG9zaXRvci5oCkBAIC04Myw2ICs4Myw5IEBACiAgIC8vIENvbXBvc2l0ZSAqd2l0aG91dCogaGF2aW5nIG1vZGlmaWVkIHRoZSBsYXllciB0cmVlLgogICB2aXJ0dWFsIHZvaWQgU2V0TmVlZHNDb21wb3NpdGUoKSA9IDA7CiAKKyAgLy8gUmVxdWVzdCBhIGRyYXcgYW5kIHN3YXAgZXZlbiBpZiB0aGVyZSBpcyBubyBjaGFuZ2UgdG8gdGhlIGxheWVyIHRyZWUuCisgIHZpcnR1YWwgdm9pZCBTZXROZWVkc1JlZHJhdygpID0gMDsKKwogICAvLyBSZXR1cm5zIHRoZSBVSSByZXNvdXJjZSBwcm92aWRlciBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbXBvc2l0b3IuCiAgIHZpcnR1YWwgdWk6OlVJUmVzb3VyY2VQcm92aWRlciYgR2V0VUlSZXNvdXJjZVByb3ZpZGVyKCkgPSAwOwogCmRpZmYgLS1naXQgYS9jb250ZW50L3B1YmxpYy9icm93c2VyL2JhY2tncm91bmRfc3luY19wYXJhbWV0ZXJzLmNjIGIvY29udGVudC9wdWJsaWMvYnJvd3Nlci9iYWNrZ3JvdW5kX3N5bmNfcGFyYW1ldGVycy5jYwppbmRleCA4NDA1MzYwLi42N2E4YTE5IDEwMDY0NAotLS0gYS9jb250ZW50L3B1YmxpYy9icm93c2VyL2JhY2tncm91bmRfc3luY19wYXJhbWV0ZXJzLmNjCisrKyBiL2NvbnRlbnQvcHVibGljL2Jyb3dzZXIvYmFja2dyb3VuZF9zeW5jX3BhcmFtZXRlcnMuY2MKQEAgLTIzLDYgKzIzLDcgQEAKICNpZiBkZWZpbmVkKE9TX0FORFJPSUQpCiAgICAgICByZWx5X29uX2FuZHJvaWRfbmV0d29ya19kZXRlY3Rpb24oZmFsc2UpLAogI2VuZGlmCisgICAgICBrZWVwX2Jyb3dzZXJfYXdha2VfdGlsbF9ldmVudHNfY29tcGxldGUoZmFsc2UpLAogICAgICAgbWF4X3N5bmNfYXR0ZW1wdHMoa01heFN5bmNBdHRlbXB0cyksCiAgICAgICBtYXhfc3luY19hdHRlbXB0c193aXRoX25vdGlmaWNhdGlvbl9wZXJtaXNzaW9uKGtNYXhTeW5jQXR0ZW1wdHMpLAogICAgICAgaW5pdGlhbF9yZXRyeV9kZWxheShrSW5pdGlhbFJldHJ5RGVsYXkpLApAQCAtMzIsNiArMzMsOSBAQAogICAgICAgbWluX3BlcmlvZGljX3N5bmNfZXZlbnRzX2ludGVydmFsKGtNaW5QZXJpb2RpY1N5bmNFdmVudHNJbnRlcnZhbCkgewogfQogCitCYWNrZ3JvdW5kU3luY1BhcmFtZXRlcnM6OkJhY2tncm91bmRTeW5jUGFyYW1ldGVycygKKyAgICBjb25zdCBCYWNrZ3JvdW5kU3luY1BhcmFtZXRlcnMmIG90aGVyKSA9IGRlZmF1bHQ7CisKIGJvb2wgQmFja2dyb3VuZFN5bmNQYXJhbWV0ZXJzOjpvcGVyYXRvcj09KAogICAgIGNvbnN0IEJhY2tncm91bmRTeW5jUGFyYW1ldGVycyYgb3RoZXIpIGNvbnN0IHsKICAgcmV0dXJuIGRpc2FibGUgPT0gb3RoZXIuZGlzYWJsZSAmJgpAQCAtMzksNiArNDMsOCBAQAogICAgICAgICAgcmVseV9vbl9hbmRyb2lkX25ldHdvcmtfZGV0ZWN0aW9uID09CiAgICAgICAgICAgICAgb3RoZXIucmVseV9vbl9hbmRyb2lkX25ldHdvcmtfZGV0ZWN0aW9uICYmCiAjZW5kaWYKKyAgICAgICAgIGtlZXBfYnJvd3Nlcl9hd2FrZV90aWxsX2V2ZW50c19jb21wbGV0ZSA9PQorICAgICAgICAgICAgIG90aGVyLmtlZXBfYnJvd3Nlcl9hd2FrZV90aWxsX2V2ZW50c19jb21wbGV0ZSAmJgogICAgICAgICAgbWF4X3N5bmNfYXR0ZW1wdHMgPT0gb3RoZXIubWF4X3N5bmNfYXR0ZW1wdHMgJiYKICAgICAgICAgIG1heF9zeW5jX2F0dGVtcHRzX3dpdGhfbm90aWZpY2F0aW9uX3Blcm1pc3Npb24gPT0KICAgICAgICAgICAgICBvdGhlci5tYXhfc3luY19hdHRlbXB0c193aXRoX25vdGlmaWNhdGlvbl9wZXJtaXNzaW9uICYmCmRpZmYgLS1naXQgYS9jb250ZW50L3B1YmxpYy9icm93c2VyL2JhY2tncm91bmRfc3luY19wYXJhbWV0ZXJzLmggYi9jb250ZW50L3B1YmxpYy9icm93c2VyL2JhY2tncm91bmRfc3luY19wYXJhbWV0ZXJzLmgKaW5kZXggYThhMDI4Ni4uMzFhODBmYyAxMDA2NDQKLS0tIGEvY29udGVudC9wdWJsaWMvYnJvd3Nlci9iYWNrZ3JvdW5kX3N5bmNfcGFyYW1ldGVycy5oCisrKyBiL2NvbnRlbnQvcHVibGljL2Jyb3dzZXIvYmFja2dyb3VuZF9zeW5jX3BhcmFtZXRlcnMuaApAQCAtMTUsNiArMTUsNyBAQAogCiBzdHJ1Y3QgQ09OVEVOVF9FWFBPUlQgQmFja2dyb3VuZFN5bmNQYXJhbWV0ZXJzIHsKICAgQmFja2dyb3VuZFN5bmNQYXJhbWV0ZXJzKCk7CisgIEJhY2tncm91bmRTeW5jUGFyYW1ldGVycyhjb25zdCBCYWNrZ3JvdW5kU3luY1BhcmFtZXRlcnMmIG90aGVyKTsKICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEJhY2tncm91bmRTeW5jUGFyYW1ldGVycyYgb3RoZXIpIGNvbnN0OwogCiAgIC8vIFRydWUgaWYgdGhlIG1hbmFnZXIgc2hvdWxkIGJlIGRpc2FibGVkIGFuZCByZWdpc3RyYXRpb24gYXR0ZW1wdHMgc2hvdWxkCkBAIC0yNiw2ICsyNywxMSBAQAogICBib29sIHJlbHlfb25fYW5kcm9pZF9uZXR3b3JrX2RldGVjdGlvbjsKICNlbmRpZgogCisgIC8vIElmIHRydWUsIHdlIGtlZXAgdGhlIGJyb3dzZXIgYXdha2UgdGlsbCBhbGwgKHBlcmlvZGljKXN5bmMgZXZlbnRzIGZpcmVkCisgIC8vIGhhdmUgY29tcGxldGVkLiBJZiBmYWxzZSwgd2Ugb25seSBrZWVwIHRoZSBicm93c2VyIGF3YWtlIHRpbGwgYWxsIHJlYWR5CisgIC8vIChwZXJpb2RpYylzeW5jIGV2ZW50cyBoYXZlIGJlZW4gZmlyZWQuCisgIGJvb2wga2VlcF9icm93c2VyX2F3YWtlX3RpbGxfZXZlbnRzX2NvbXBsZXRlOworCiAgIC8vIFRoZSBudW1iZXIgb2YgYXR0ZW1wdHMgdGhlIEJhY2tncm91bmRTeW5jTWFuYWdlciB3aWxsIG1ha2UgdG8gZmlyZSBhbgogICAvLyBldmVudCBiZWZvcmUgZ2l2aW5nIHVwLgogICBpbnQgbWF4X3N5bmNfYXR0ZW1wdHM7CmRpZmYgLS1naXQgYS9jb250ZW50L3B1YmxpYy9icm93c2VyL2NvbnRlbnRfYnJvd3Nlcl9jbGllbnQuaCBiL2NvbnRlbnQvcHVibGljL2Jyb3dzZXIvY29udGVudF9icm93c2VyX2NsaWVudC5oCmluZGV4IDVkODA4ODcuLjc2YmU0ZmMgMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvcHVibGljL2Jyb3dzZXIvY29udGVudF9icm93c2VyX2NsaWVudC5oCisrKyBiL2NvbnRlbnQvcHVibGljL2Jyb3dzZXIvY29udGVudF9icm93c2VyX2NsaWVudC5oCkBAIC0zNDAsOSArMzQwLDEwIEBACiAgIC8vIC0gVGhlIGRlZmF1bHQgZmFjdG9yeSB0byBiZSB1c2VkIGJ5IGEgZnJhbWUuICBJbiB0aGlzIGNhc2UKICAgLy8gICB8cmVxdWVzdF9pbml0aWF0b3J8IGlzIHRoZSBvcmlnaW4gYmVpbmcgY29tbWl0dGVkIGluIHRoZSBmcmFtZSAob3IgdGhlCiAgIC8vICAgbGFzdCBvcmlnaW4gY29tbWl0dGVkIGluIHRoZSBmcmFtZSkuCi0gIC8vIC0gVGhlIGluaXRpYXRvci1zcGVjaWZpYyBmYWN0b3J5IHRvIGJlIHVzZWQgYnkgYSBmcmFtZS4gIFRoaXMgaGFwcGVucyBmb3IKLSAgLy8gICBvcmlnaW5zIGNvdmVyZWQgdmlhCi0gIC8vICAgUmVuZGVyRnJhbWVIb3N0OjpNYXJrSW5pdGlhdG9yQXNSZXF1aXJpbmdTZXBhcmF0ZVVSTExvYWRlckZhY3RvcnkuCisgIC8vIC0gQW4gaXNvbGF0ZWQtd29ybGQtc3BlY2lmaWMgZmFjdG9yeSB0byBiZSB1c2VkIGJ5IGEgZnJhbWUuICBUaGlzIGhhcHBlbnMKKyAgLy8gICBmb3Igb3JpZ2lucyBjb3ZlcmVkIHZpYQorICAvLyAgIFJlbmRlckZyYW1lSG9zdDo6TWFya0lzb2xhdGVkV29ybGRBc1JlcXVpcmluZ1NlcGFyYXRlVVJMTG9hZGVyRmFjdG9yeS4KKyAgLy8gICBJbiB0aGlzIGNhc2UgfHJlcXVlc3RfaW5pdGlhdG9yfCBpcyB0aGUgb3JpZ2luIG9mIHRoZSBpc29sYXRlZCB3b3JsZC4KICAgLy8KICAgLy8gVGhpcyBtZXRob2QgYWxsb3dzIHRoZSAvL2NvbnRlbnQgZW1iZWRkZXIgdG8gcHJvdmlkZSBhIFVSTExvYWRlckZhY3RvcnkKICAgLy8gd2l0aCB8cmVxdWVzdF9pbml0aWF0b3J8LXNwZWNpZmljIHByb3BlcnRpZXMgKGUuZy4gd2l0aCByZWxheGVkCmRpZmYgLS1naXQgYS9jb250ZW50L3B1YmxpYy9icm93c2VyL3JlbmRlcl9mcmFtZV9ob3N0LmggYi9jb250ZW50L3B1YmxpYy9icm93c2VyL3JlbmRlcl9mcmFtZV9ob3N0LmgKaW5kZXggOTA4NDdlNTMuLjBiZWFhMjcgMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvcHVibGljL2Jyb3dzZXIvcmVuZGVyX2ZyYW1lX2hvc3QuaAorKysgYi9jb250ZW50L3B1YmxpYy9icm93c2VyL3JlbmRlcl9mcmFtZV9ob3N0LmgKQEAgLTM1NywxMiArMzU3LDEyIEBACiAgICAgICBuZXR3b3JrOjptb2pvbTo6VVJMTG9hZGVyRmFjdG9yeVJlcXVlc3QgZGVmYXVsdF9mYWN0b3J5X3JlcXVlc3QpID0gMDsKIAogICAvLyBSZXF1ZXN0cyB0aGF0IGZ1dHVyZSBVUkxMb2FkZXJGYWN0b3J5QnVuZGxlKHMpIHNlbnQgdG8gdGhlIHJlbmRlcmVyIHNob3VsZAotICAvLyB1c2UgYSBzZXBhcmF0ZSBVUkxMb2FkZXJGYWN0b3J5IGZvciByZXF1ZXN0cyBpbml0aWF0ZWQgYnkgYW55IG9mIHRoZQotICAvLyBvcmlnaW5zIGxpc3RlZCBpbiB8cmVxdWVzdF9pbml0aWF0b3JzfC4gIFRoZSBVUkxMb2FkZXJGYWN0b3J5KHMpIGZvciBlYWNoCisgIC8vIHVzZSBhIHNlcGFyYXRlIFVSTExvYWRlckZhY3RvcnkgZm9yIHJlcXVlc3RzIGluaXRpYXRlZCBieSBpc29sYXRlZCB3b3JsZHMKKyAgLy8gbGlzdGVkIGluIHxpc29sYXRlZF93b3JsZF9vcmlnaW5zfC4gIFRoZSBVUkxMb2FkZXJGYWN0b3J5KHMpIGZvciBlYWNoCiAgIC8vIG9yaWdpbiB3aWxsIGJlIGNyZWF0ZWQgdmlhCiAgIC8vIENvbnRlbnRCcm93c2VyQ2xpZW50OjpDcmVhdGVVUkxMb2FkZXJGYWN0b3J5Rm9yTmV0d29ya1JlcXVlc3RzIG1ldGhvZC4KLSAgdmlydHVhbCB2b2lkIE1hcmtJbml0aWF0b3JzQXNSZXF1aXJpbmdTZXBhcmF0ZVVSTExvYWRlckZhY3RvcnkoCi0gICAgICBiYXNlOjpmbGF0X3NldDx1cmw6Ok9yaWdpbj4gcmVxdWVzdF9pbml0aWF0b3JzLAorICB2aXJ0dWFsIHZvaWQgTWFya0lzb2xhdGVkV29ybGRzQXNSZXF1aXJpbmdTZXBhcmF0ZVVSTExvYWRlckZhY3RvcnkoCisgICAgICBiYXNlOjpmbGF0X3NldDx1cmw6Ok9yaWdpbj4gaXNvbGF0ZWRfd29ybGRfb3JpZ2lucywKICAgICAgIGJvb2wgcHVzaF90b19yZW5kZXJlcl9ub3cpID0gMDsKIAogICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHNhbmRib3ggZmxhZyB8ZmxhZ3N8IGlzIGluIGVmZmVjdCBvbiB0aGlzIGZyYW1lLgpAQCAtNDI1LDYgKzQyNSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnJvd3NlckNvbnRyb2xzU3RhdGUgY3VycmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYW5pbWF0ZSkgPSAwOwogCisgIC8vIFJlbG9hZHMgdGhlIGZyYW1lIGlmIGl0IGlzIGxpdmUuIEl0IGluaXRpYXRlcyBhIHJlbG9hZCBidXQgZG9lc24ndCB3YWl0IGZvcgorICAvLyBpdCB0byBmaW5pc2guCisgIHZpcnR1YWwgdm9pZCBSZWxvYWQoKSA9IDA7CisKICBwcml2YXRlOgogICAvLyBUaGlzIGludGVyZmFjZSBzaG91bGQgb25seSBiZSBpbXBsZW1lbnRlZCBpbnNpZGUgY29udGVudC4KICAgZnJpZW5kIGNsYXNzIFJlbmRlckZyYW1lSG9zdEltcGw7CmRpZmYgLS1naXQgYS9jb250ZW50L3B1YmxpYy9icm93c2VyL3NpdGVfaXNvbGF0aW9uX3BvbGljeS5jYyBiL2NvbnRlbnQvcHVibGljL2Jyb3dzZXIvc2l0ZV9pc29sYXRpb25fcG9saWN5LmNjCmluZGV4IGY4ODU5OGMuLjM3MjNmMzMgMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvcHVibGljL2Jyb3dzZXIvc2l0ZV9pc29sYXRpb25fcG9saWN5LmNjCisrKyBiL2NvbnRlbnQvcHVibGljL2Jyb3dzZXIvc2l0ZV9pc29sYXRpb25fcG9saWN5LmNjCkBAIC00NSw2ICs0NSw4IEBACiAgIH0KICNlbmRpZgogCisgIC8vIENoZWNrIHdpdGggdGhlIGVtYmVkZGVyLiAgSW4gcGFydGljdWxhciwgY2hyb21lLyB1c2VzIHRoaXMgdG8gZGlzYWJsZSBzaXRlCisgIC8vIGlzb2xhdGlvbiB3aGVuIGJlbG93IGEgbWVtb3J5IHRocmVzaG9sZC4KICAgcmV0dXJuIEdldENvbnRlbnRDbGllbnQoKSAmJgogICAgICAgICAgR2V0Q29udGVudENsaWVudCgpLT5icm93c2VyKCktPlNob3VsZERpc2FibGVTaXRlSXNvbGF0aW9uKCk7CiB9CkBAIC05MCw2ICs5MiwxNiBAQAogCiAvLyBzdGF0aWMKIGJvb2wgU2l0ZUlzb2xhdGlvblBvbGljeTo6SXNTdHJpY3RPcmlnaW5Jc29sYXRpb25FbmFibGVkKCkgeworICAvLyBJZiB0aGUgZmVhdHVyZSBpcyBleHBsaWNpdGx5IGVuYWJsZWQgYnkgdGhlIHVzZXIgKGUuZy4sIGZyb20KKyAgLy8gY2hyb21lOi8vZmxhZ3MpLCBob25vciB0aGlzIHJlZ2FyZGxlc3Mgb2YgY2hlY2tzIHRvIGRpc2FibGUgc2l0ZSBpc29sYXRpb24KKyAgLy8gYmVsb3cuICBUaGlzIG1lYW5zIHRoaXMgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIG1lbW9yeSB0aHJlc2hvbGRzIG9yCisgIC8vIHN3aXRjaGVzIHRvIGRpc2FibGUgc2l0ZSBpc29sYXRpb24uCisgIGlmIChiYXNlOjpGZWF0dXJlTGlzdDo6R2V0SW5zdGFuY2UoKS0+SXNGZWF0dXJlT3ZlcnJpZGRlbkZyb21Db21tYW5kTGluZSgKKyAgICAgICAgICBmZWF0dXJlczo6a1N0cmljdE9yaWdpbklzb2xhdGlvbi5uYW1lLAorICAgICAgICAgIGJhc2U6OkZlYXR1cmVMaXN0OjpPVkVSUklERV9FTkFCTEVfRkVBVFVSRSkpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCiAgIC8vIFRPRE8od2ptYWNsZWFuKTogRmlndXJlIG91dCB3aGF0IHNob3VsZCBoYXBwZW4gd2hlbiB0aGlzIGZlYXR1cmUgaXMKICAgLy8gY29tYmluZWQgd2l0aCAtLWlzb2xhdGUtb3JpZ2lucy4KICAgaWYgKElzU2l0ZUlzb2xhdGlvbkRpc2FibGVkKCkpCmRpZmYgLS1naXQgYS9jb250ZW50L3B1YmxpYy9jb21tb24vY29udGVudF9mZWF0dXJlcy5jYyBiL2NvbnRlbnQvcHVibGljL2NvbW1vbi9jb250ZW50X2ZlYXR1cmVzLmNjCmluZGV4IDYzMzcyY2EuLjQ5NzcwYWUgMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvcHVibGljL2NvbW1vbi9jb250ZW50X2ZlYXR1cmVzLmNjCisrKyBiL2NvbnRlbnQvcHVibGljL2NvbW1vbi9jb250ZW50X2ZlYXR1cmVzLmNjCkBAIC0yOCw5ICsyOCwxMCBAQAogICAgIGJhc2U6OkZFQVRVUkVfRElTQUJMRURfQllfREVGQVVMVH07CiAKIC8vIEFsbG93cyBwb3B1cHMgZHVyaW5nIHBhZ2UgdW5sb2FkaW5nLgotLy8gVE9ETyhodHRwczovL2NyYnVnLmNvbS85Mzc1NjkpOiBSZW1vdmUgdGhpcyBpbiBDaHJvbWUgODIuCisvLyBUT0RPKGh0dHBzOi8vY3JidWcuY29tLzEwMTA1MDkpOiBTZXQgdG8gRElTQUJMRURfQllfREVGQVVMVCBpbiBDaHJvbWUgODAuCisvLyBUT0RPKGh0dHBzOi8vY3JidWcuY29tLzkzNzU2OSk6IFJlbW92ZSB0aGlzIGVudGlyZWx5IGluIENocm9tZSA4Mi4KIGNvbnN0IGJhc2U6OkZlYXR1cmUga0FsbG93UG9wdXBzRHVyaW5nUGFnZVVubG9hZHsKLSAgICAiQWxsb3dQb3B1cHNEdXJpbmdQYWdlVW5sb2FkIiwgYmFzZTo6RkVBVFVSRV9ESVNBQkxFRF9CWV9ERUZBVUxUfTsKKyAgICAiQWxsb3dQb3B1cHNEdXJpbmdQYWdlVW5sb2FkIiwgYmFzZTo6RkVBVFVSRV9FTkFCTEVEX0JZX0RFRkFVTFR9OwogCiAvLyBBY2NlcHRzIE9yaWdpbi1TaWduZWQgSFRUUCBFeGNoYW5nZXMgdG8gYmUgc2lnbmVkIHdpdGggY2VydGlmaWNhdGVzCiAvLyB0aGF0IGRvIG5vdCBoYXZlIENhblNpZ25IdHRwRXhjaGFuZ2VzRHJhZnQgZXh0ZW5zaW9uLgpkaWZmIC0tZ2l0IGEvY29udGVudC9wdWJsaWMvcmVuZGVyZXIvcmVuZGVyX2ZyYW1lLmggYi9jb250ZW50L3B1YmxpYy9yZW5kZXJlci9yZW5kZXJfZnJhbWUuaAppbmRleCBjM2ZkMDc3Yi4uZDU4NDg0NyAxMDA2NDQKLS0tIGEvY29udGVudC9wdWJsaWMvcmVuZGVyZXIvcmVuZGVyX2ZyYW1lLmgKKysrIGIvY29udGVudC9wdWJsaWMvcmVuZGVyZXIvcmVuZGVyX2ZyYW1lLmgKQEAgLTIwLDcgKzIwLDYgQEAKICNpbmNsdWRlICJwcGFwaS9idWlsZGZsYWdzL2J1aWxkZmxhZ3MuaCIKICNpbmNsdWRlICJzZXJ2aWNlcy9uZXR3b3JrL3B1YmxpYy9tb2pvbS91cmxfbG9hZGVyX2ZhY3RvcnkubW9qb20uaCIKICNpbmNsdWRlICJzZXJ2aWNlcy9zZXJ2aWNlX21hbmFnZXIvcHVibGljL2NwcC9iaW5kZXJfcmVnaXN0cnkuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvY29tbW9uL2xvYWRlci91cmxfbG9hZGVyX2ZhY3RvcnlfYnVuZGxlLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcHVibGljL21vam9tL2RldnRvb2xzL2NvbnNvbGVfbWVzc2FnZS5tb2pvbS5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYy9tb2pvbS9mcmFtZS9kb2N1bWVudF9pbnRlcmZhY2VfYnJva2VyLm1vam9tLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcHVibGljL3BsYXRmb3JtL3Rhc2tfdHlwZS5oIgpAQCAtMzIsMTQgKzMxLDE3IEBACiBjbGFzcyBBc3NvY2lhdGVkSW50ZXJmYWNlUHJvdmlkZXI7CiBjbGFzcyBBc3NvY2lhdGVkSW50ZXJmYWNlUmVnaXN0cnk7CiBjbGFzcyBCcm93c2VySW50ZXJmYWNlQnJva2VyUHJveHk7CitjbGFzcyBXZWJFbGVtZW50OwogY2xhc3MgV2ViRnJhbWU7CiBjbGFzcyBXZWJMb2NhbEZyYW1lOwogY2xhc3MgV2ViUGx1Z2luOwogc3RydWN0IFdlYlBsdWdpblBhcmFtczsKK3N0cnVjdCBXZWJSZWN0OwogfQogCiBuYW1lc3BhY2UgZ2Z4IHsKIGNsYXNzIFJhbmdlOworY2xhc3MgUmVjdEY7CiBjbGFzcyBTaXplOwogfQogCkBAIC0yOTIsMTYgKzI5NCw2IEBACiAgIHZpcnR1YWwgdm9pZCBTZXRSZW5kZXJGcmFtZU1lZGlhUGxheWJhY2tPcHRpb25zKAogICAgICAgY29uc3QgUmVuZGVyRnJhbWVNZWRpYVBsYXliYWNrT3B0aW9ucyYgb3B0cykgPSAwOwogCi0gIC8vIFJlcXVlc3RzIHRoYXQgZmV0Y2hlcyBpbml0aWF0ZWQgYnkgfGluaXRpYXRvcl9vcmlnaW58IHNob3VsZCBnbyB0aHJvdWdoIHRoZQotICAvLyBwcm92aWRlZCB8dXJsX2xvYWRlcl9mYWN0b3J5fC4gIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlCi0gIC8vIGV4ZWN1dGluZyBzY3JpcHRzIGluIGEgaXNvbGF0ZWQgd29ybGQgLSBzdWNoIHNjcmlwdHMgYXJlIHR5cGljYWxseQotICAvLyBhc3NvY2lhdGVkIHdpdGggYSBzZWN1cml0eSBvcmlnaW4gZGlmZmVyZW50IGZyb20gdGhlIG1haW4gd29ybGQgKGFuZAotICAvLyB0aGVyZWZvcmUgZmV0Y2hlcyBmcm9tIHN1Y2ggc2NyaXB0cyBzZXQgfHJlcXVlc3RfaW5pdGlhdG9yfCB0aGF0IGlzCi0gIC8vIGluY29tcGF0aWJsZSB3aXRoIHxyZXF1ZXN0X2luaXRpYXRvcl9zaXRlX2xvY2t8LgotICB2aXJ0dWFsIHZvaWQgTWFya0luaXRpYXRvckFzUmVxdWlyaW5nU2VwYXJhdGVVUkxMb2FkZXJGYWN0b3J5KAotICAgICAgY29uc3QgdXJsOjpPcmlnaW4mIGluaXRpYXRvcl9vcmlnaW4sCi0gICAgICBuZXR3b3JrOjptb2pvbTo6VVJMTG9hZGVyRmFjdG9yeVB0ciB1cmxfbG9hZGVyX2ZhY3RvcnkpID0gMDsKLQogICAvLyBTeW5jaHJvbm91c2x5IHBlcmZvcm1zIHRoZSBjb21wbGV0ZSBzZXQgb2YgZG9jdW1lbnQgbGlmZWN5Y2xlIHBoYXNlcywKICAgLy8gaW5jbHVkaW5nIHVwZGF0ZXMgdG8gdGhlIGNvbXBvc2l0b3Igc3RhdGUgYW5kIHJhc3Rlcml6YXRpb24sIHRoZW4gc2VuZGluZwogICAvLyBhIGZyYW1lIHRvIHRoZSB2aXogZGlzcGxheSBjb21wb3NpdG9yLiBEb2VzIG5vdGhpbmcgaWYgUmVuZGVyRnJhbWUgaXMgbm90CkBAIC0zMTEsNiArMzAzLDE3IEBACiAgIC8vIFNldHMgdGhhdCBjcm9zcyBicm93c2luZyBpbnN0YW5jZSBmcmFtZSBsb29rdXAgaXMgYWxsb3dlZC4KICAgdmlydHVhbCB2b2lkIFNldEFsbG93c0Nyb3NzQnJvd3NpbmdJbnN0YW5jZUZyYW1lTG9va3VwKCkgPSAwOwogCisgIC8vIFJldHVybnMgdGhlIGJvdW5kcyBvZiB8ZWxlbWVudHwgaW4gV2luZG93IGNvb3JkaW5hdGVzIHdoaWNoIGFyZSBkZXZpY2UKKyAgLy8gc2NhbGUgaW5kZXBlbmRlbnQuIFRoZSBib3VuZHMgaGF2ZSBiZWVuIGFkanVzdGVkIHRvIGluY2x1ZGUgYW55CisgIC8vIHRyYW5zZm9ybWF0aW9ucywgaW5jbHVkaW5nIHBhZ2Ugc2NhbGUuIFRoaXMgZnVuY3Rpb24gd2lsbCB1cGRhdGUgdGhlIGxheW91dAorICAvLyBpZiByZXF1aXJlZC4KKyAgdmlydHVhbCBnZng6OlJlY3RGIEVsZW1lbnRCb3VuZHNJbldpbmRvdygKKyAgICAgIGNvbnN0IGJsaW5rOjpXZWJFbGVtZW50JiBlbGVtZW50KSA9IDA7CisKKyAgLy8gQ29udmVydHMgdGhlIHxyZWN0fCB0byBXaW5kb3cgY29vcmRpbmF0ZXMgd2hpY2ggYXJlIGRldmljZSBzY2FsZQorICAvLyBpbmRlcGVuZGVudC4KKyAgdmlydHVhbCB2b2lkIENvbnZlcnRWaWV3cG9ydFRvV2luZG93KGJsaW5rOjpXZWJSZWN0KiByZWN0KSA9IDA7CisKICBwcm90ZWN0ZWQ6CiAgIH5SZW5kZXJGcmFtZSgpIG92ZXJyaWRlIHt9CiAKZGlmZiAtLWdpdCBhL2NvbnRlbnQvcHVibGljL3JlbmRlcmVyL3JlbmRlcl92aWV3LmggYi9jb250ZW50L3B1YmxpYy9yZW5kZXJlci9yZW5kZXJfdmlldy5oCmluZGV4IDg3YmM0MjUuLmE3Y2I2NDFmIDEwMDY0NAotLS0gYS9jb250ZW50L3B1YmxpYy9yZW5kZXJlci9yZW5kZXJfdmlldy5oCisrKyBiL2NvbnRlbnQvcHVibGljL3JlbmRlcmVyL3JlbmRlcl92aWV3LmgKQEAgLTEzLDEzICsxMywxMCBAQAogI2luY2x1ZGUgImJ1aWxkL2J1aWxkX2NvbmZpZy5oIgogI2luY2x1ZGUgImNvbnRlbnQvY29tbW9uL2NvbnRlbnRfZXhwb3J0LmgiCiAjaW5jbHVkZSAiaXBjL2lwY19zZW5kZXIuaCIKLSNpbmNsdWRlICJ1aS9nZngvZ2VvbWV0cnkvcmVjdF9mLmgiCiAjaW5jbHVkZSAidWkvZ2Z4L25hdGl2ZV93aWRnZXRfdHlwZXMuaCIKIAogbmFtZXNwYWNlIGJsaW5rIHsKLWNsYXNzIFdlYkVsZW1lbnQ7CiBjbGFzcyBXZWJWaWV3Owotc3RydWN0IFdlYlJlY3Q7CiB9ICAvLyBuYW1lc3BhY2UgYmxpbmsKIAogbmFtZXNwYWNlIGNvbnRlbnQgewpAQCAtOTAsMTYgKzg3LDYgQEAKICAgLy8gUmV0dXJucyB8cmVuZGVyZXJfcHJlZmVyZW5jZXNfLmFjY2VwdF9sYW5ndWFnZXN8IHZhbHVlLgogICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nJiBHZXRBY2NlcHRMYW5ndWFnZXMoKSA9IDA7CiAKLSAgLy8gQ29udmVydHMgdGhlIHxyZWN0fCBmcm9tIFZpZXdwb3J0IGNvb3JkaW5hdGVzIHRvIFdpbmRvdyBjb29yZGluYXRlcy4KLSAgLy8gU2VlIGJsaW5rOjpXZWJXaWRnZXRDbGllbnQ6OmNvbnZlcnRWaWV3cG9ydFRvV2luZG93IGZvciBtb3JlIGRldGFpbHMuCi0gIHZpcnR1YWwgdm9pZCBDb252ZXJ0Vmlld3BvcnRUb1dpbmRvd1ZpYVdpZGdldChibGluazo6V2ViUmVjdCogcmVjdCkgPSAwOwotCi0gIC8vIFJldHVybnMgdGhlIGJvdW5kcyBvZiB8ZWxlbWVudHwgaW4gV2luZG93IGNvb3JkaW5hdGVzLiBUaGUgYm91bmRzIGhhdmUgYmVlbgotICAvLyBhZGp1c3RlZCB0byBpbmNsdWRlIGFueSB0cmFuc2Zvcm1hdGlvbnMsIGluY2x1ZGluZyBwYWdlIHNjYWxlLgotICAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgdXBkYXRlIHRoZSBsYXlvdXQgaWYgcmVxdWlyZWQuCi0gIHZpcnR1YWwgZ2Z4OjpSZWN0RiBFbGVtZW50Qm91bmRzSW5XaW5kb3coY29uc3QgYmxpbms6OldlYkVsZW1lbnQmIGVsZW1lbnQpCi0gICAgICA9IDA7Ci0KICBwcm90ZWN0ZWQ6CiAgIH5SZW5kZXJWaWV3KCkgb3ZlcnJpZGUge30KIApkaWZmIC0tZ2l0IGEvY29udGVudC9wdWJsaWMvdGVzdC9icm93c2VyX3Rlc3RfYmFzZS5jYyBiL2NvbnRlbnQvcHVibGljL3Rlc3QvYnJvd3Nlcl90ZXN0X2Jhc2UuY2MKaW5kZXggOTUyYjJlZi4uYTIxYTljMiAxMDA2NDQKLS0tIGEvY29udGVudC9wdWJsaWMvdGVzdC9icm93c2VyX3Rlc3RfYmFzZS5jYworKysgYi9jb250ZW50L3B1YmxpYy90ZXN0L2Jyb3dzZXJfdGVzdF9iYXNlLmNjCkBAIC0zOCw2ICszOCw3IEBACiAjaW5jbHVkZSAiY29udGVudC9icm93c2VyL3NjaGVkdWxlci9icm93c2VyX3Rhc2tfZXhlY3V0b3IuaCIKICNpbmNsdWRlICJjb250ZW50L2Jyb3dzZXIvc3RhcnR1cF9kYXRhX2ltcGwuaCIKICNpbmNsdWRlICJjb250ZW50L2Jyb3dzZXIvc3RhcnR1cF9oZWxwZXIuaCIKKyNpbmNsdWRlICJjb250ZW50L2Jyb3dzZXIvdHJhY2luZy9tZW1vcnlfaW5zdHJ1bWVudGF0aW9uX3V0aWwuaCIKICNpbmNsdWRlICJjb250ZW50L2Jyb3dzZXIvdHJhY2luZy90cmFjaW5nX2NvbnRyb2xsZXJfaW1wbC5oIgogI2luY2x1ZGUgImNvbnRlbnQvcHVibGljL2FwcC9jb250ZW50X21haW4uaCIKICNpbmNsdWRlICJjb250ZW50L3B1YmxpYy9icm93c2VyL2Jyb3dzZXJfdGFza190cmFpdHMuaCIKQEAgLTQyNCw2ICs0MjUsNyBAQAogICAgIFN0YXJ0QnJvd3NlclRocmVhZFBvb2woKTsKICAgICBCcm93c2VyVGFza0V4ZWN1dG9yOjpQb3N0RmVhdHVyZUxpc3RTZXR1cCgpOwogICAgIHRyYWNpbmc6OkluaXRUcmFjaW5nUG9zdFRocmVhZFBvb2xTdGFydEFuZEZlYXR1cmVMaXN0KCk7CisgICAgSW5pdGlhbGl6ZUJyb3dzZXJNZW1vcnlJbnN0cnVtZW50YXRpb25DbGllbnQoKTsKICAgfQogCiAgIGF1dG8gZGlzY2FyZGFibGVfc2hhcmVkX21lbW9yeV9tYW5hZ2VyID0KZGlmZiAtLWdpdCBhL2NvbnRlbnQvcHVibGljL3Rlc3QvdGVzdF9yZW5kZXJlcl9ob3N0LmggYi9jb250ZW50L3B1YmxpYy90ZXN0L3Rlc3RfcmVuZGVyZXJfaG9zdC5oCmluZGV4IDY2NTQ0ZjIuLjQ0ZjFlNDU2IDEwMDY0NAotLS0gYS9jb250ZW50L3B1YmxpYy90ZXN0L3Rlc3RfcmVuZGVyZXJfaG9zdC5oCisrKyBiL2NvbnRlbnQvcHVibGljL3Rlc3QvdGVzdF9yZW5kZXJlcl9ob3N0LmgKQEAgLTkxLDkgKzkxLDYgQEAKICAgLy8gR2l2ZXMgdGVzdHMgYWNjZXNzIHRvIFJlbmRlckZyYW1lSG9zdEltcGw6Ok9uRGV0YWNoLiBEZXN0cm95cyB8dGhpc3wuCiAgIHZpcnR1YWwgdm9pZCBEZXRhY2goKSA9IDA7CiAKLSAgLy8gU2ltdWxhdGVzIGEgbmF2aWdhdGlvbiBzdG9wcGluZyBpbiB0aGUgUmVuZGVyRnJhbWVIb3N0LgotICB2aXJ0dWFsIHZvaWQgU2ltdWxhdGVOYXZpZ2F0aW9uU3RvcCgpID0gMDsKLQogICAvLyBDYWxscyBPbkJlZm9yZVVubG9hZEFDSyBvbiB0aGlzIFJlbmRlckZyYW1lSG9zdCB3aXRoIHRoZSBnaXZlbiBwYXJhbWV0ZXIuCiAgIHZpcnR1YWwgdm9pZCBTZW5kQmVmb3JlVW5sb2FkQUNLKGJvb2wgcHJvY2VlZCkgPSAwOwogCkBAIC0xMDIsMTIgKzk5LDEyIEBACiAgIHZpcnR1YWwgdm9pZCBTaW11bGF0ZVN3YXBPdXRBQ0soKSA9IDA7CiAKICAgLy8gU2V0IHRoZSBmZWF0dXJlIHBvbGljeSBoZWFkZXIgZm9yIHRoZSBSZW5kZXJGcmFtZUhvc3QgZm9yIHRlc3QuIEN1cnJlbnRseQotICAvLyB0aGlzIGlzIGxpbWl0ZWQgdG8gc2V0dGluZyBhIHdoaXRlbGlzdCBmb3IgYSBzaW5nbGUgZmVhdHVyZS4gVGhpcyBmdW5jdGlvbgorICAvLyB0aGlzIGlzIGxpbWl0ZWQgdG8gc2V0dGluZyBhbiBhbGxvd2xpc3QgZm9yIGEgc2luZ2xlIGZlYXR1cmUuIFRoaXMgZnVuY3Rpb24KICAgLy8gY2FuIGJlIGdlbmVyYWxpemVkIGFzIG5lZWRlZC4gU2V0dGluZyBhIGhlYWRlciBwb2xpY3kgc2hvdWxkIG9ubHkgYmUgZG9uZQogICAvLyBvbmNlIHBlciBuYXZpZ2F0aW9uIG9mIHRoZSBSRkguCiAgIHZpcnR1YWwgdm9pZCBTaW11bGF0ZUZlYXR1cmVQb2xpY3lIZWFkZXIoCiAgICAgICBibGluazo6bW9qb206OkZlYXR1cmVQb2xpY3lGZWF0dXJlIGZlYXR1cmUsCi0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1cmw6Ok9yaWdpbj4mIHdoaXRlbGlzdCkgPSAwOworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dXJsOjpPcmlnaW4+JiBhbGxvd2xpc3QpID0gMDsKIAogICAvLyBHZXRzIGFsbCB0aGUgY29uc29sZSBtZXNzYWdlcyByZXF1ZXN0ZWQgdmlhCiAgIC8vIFJlbmRlckZyYW1lSG9zdDo6QWRkTWVzc2FnZVRvQ29uc29sZSBpbiB0aGlzIGZyYW1lLgpkaWZmIC0tZ2l0IGEvY29udGVudC9wdWJsaWMvdGVzdC93ZWJfdGVzdF9zdXBwb3J0LmggYi9jb250ZW50L3B1YmxpYy90ZXN0L3dlYl90ZXN0X3N1cHBvcnQuaAppbmRleCBlOWJmZTgyLi5lZjBlZjJjIDEwMDY0NAotLS0gYS9jb250ZW50L3B1YmxpYy90ZXN0L3dlYl90ZXN0X3N1cHBvcnQuaAorKysgYi9jb250ZW50L3B1YmxpYy90ZXN0L3dlYl90ZXN0X3N1cHBvcnQuaApAQCAtODYsOSArODYsNiBAQAogLy8gU2V0IHRoZSBkZXZpY2Ugc2NhbGUgZmFjdG9yIGFuZCBmb3JjZSB0aGUgY29tcG9zaXRvciB0byByZXNpemUuCiB2b2lkIFNldERldmljZVNjYWxlRmFjdG9yKFJlbmRlclZpZXcqIHJlbmRlcl92aWV3LCBmbG9hdCBmYWN0b3IpOwogCi0vLyBHZXQgdGhlIHdpbmRvdyB0byB2aWV3cG9ydCBzY2FsZS4KLWZsb2F0IEdldFdpbmRvd1RvVmlld3BvcnRTY2FsZShSZW5kZXJWaWV3KiByZW5kZXJfdmlldyk7Ci0KIC8vIENvbnZlcnRzIHxldmVudHwgZnJvbSBzY3JlZW4gY29vcmRpbmF0ZXMgdG8gY29vcmRpbmF0ZXMgdXNlZCBieSB0aGUgd2lkZ2V0CiAvLyBhc3NvY2lhdGVkIHdpdGggdGhlIHx3ZWJfd2lkZ2V0X3Rlc3RfcHJveHl8LiAgUmV0dXJucyBudWxscHRyIGlmIG5vCiAvLyB0cmFuc2Zvcm1hdGlvbiB3YXMgbmVjZXNzYXJ5IChlLmcuIGZvciBhIGtleWJvYXJkIGV2ZW50IE9SIGlmIHdpZGdldCByZXF1aXJlcwpkaWZmIC0tZ2l0IGEvY29udGVudC9yZW5kZXJlci9CVUlMRC5nbiBiL2NvbnRlbnQvcmVuZGVyZXIvQlVJTEQuZ24KaW5kZXggNWMyZGY4YzQ5Li41MGIyN2VjIDEwMDY0NAotLS0gYS9jb250ZW50L3JlbmRlcmVyL0JVSUxELmduCisrKyBiL2NvbnRlbnQvcmVuZGVyZXIvQlVJTEQuZ24KQEAgLTMyNiw2ICszMjYsOCBAQAogICAgICJ3b3JrZXIvZGVkaWNhdGVkX3dvcmtlcl9ob3N0X2ZhY3RvcnlfY2xpZW50LmgiLAogICAgICJ3b3JrZXIvZW1iZWRkZWRfc2hhcmVkX3dvcmtlcl9zdHViLmNjIiwKICAgICAid29ya2VyL2VtYmVkZGVkX3NoYXJlZF93b3JrZXJfc3R1Yi5oIiwKKyAgICAid29ya2VyL2ZldGNoX2NsaWVudF9zZXR0aW5nc19vYmplY3RfaGVscGVycy5jYyIsCisgICAgIndvcmtlci9mZXRjaF9jbGllbnRfc2V0dGluZ3Nfb2JqZWN0X2hlbHBlcnMuaCIsCiAgICAgIndvcmtlci9zaGFyZWRfd29ya2VyX2ZhY3RvcnlfaW1wbC5jYyIsCiAgICAgIndvcmtlci9zaGFyZWRfd29ya2VyX2ZhY3RvcnlfaW1wbC5oIiwKICAgICAid29ya2VyL3dvcmtlcl90aHJlYWRfcmVnaXN0cnkuY2MiLApkaWZmIC0tZ2l0IGEvY29udGVudC9yZW5kZXJlci9sb2FkZXIvY2hpbGRfdXJsX2xvYWRlcl9mYWN0b3J5X2J1bmRsZS5jYyBiL2NvbnRlbnQvcmVuZGVyZXIvbG9hZGVyL2NoaWxkX3VybF9sb2FkZXJfZmFjdG9yeV9idW5kbGUuY2MKaW5kZXggNmJkZWEwNi4uM2U1YTFlOGQgMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvcmVuZGVyZXIvbG9hZGVyL2NoaWxkX3VybF9sb2FkZXJfZmFjdG9yeV9idW5kbGUuY2MKKysrIGIvY29udGVudC9yZW5kZXJlci9sb2FkZXIvY2hpbGRfdXJsX2xvYWRlcl9mYWN0b3J5X2J1bmRsZS5jYwpAQCAtMTIwLDcgKzEyMCw3IEBACiAgICAgOiBVUkxMb2FkZXJGYWN0b3J5QnVuZGxlSW5mbygKICAgICAgICAgICBzdGQ6Om1vdmUoYmFzZV9mYWN0b3JpZXMtPnBlbmRpbmdfZGVmYXVsdF9mYWN0b3J5KCkpLAogICAgICAgICAgIHN0ZDo6bW92ZShiYXNlX2ZhY3Rvcmllcy0+cGVuZGluZ19zY2hlbWVfc3BlY2lmaWNfZmFjdG9yaWVzKCkpLAotICAgICAgICAgIHN0ZDo6bW92ZShiYXNlX2ZhY3Rvcmllcy0+cGVuZGluZ19pbml0aWF0b3Jfc3BlY2lmaWNfZmFjdG9yaWVzKCkpLAorICAgICAgICAgIHN0ZDo6bW92ZShiYXNlX2ZhY3Rvcmllcy0+cGVuZGluZ19pc29sYXRlZF93b3JsZF9mYWN0b3JpZXMoKSksCiAgICAgICAgICAgYmFzZV9mYWN0b3JpZXMtPmJ5cGFzc19yZWRpcmVjdF9jaGVja3MoKSkgewogICBwZW5kaW5nX2FwcGNhY2hlX2ZhY3RvcnlfID0KICAgICAgIHN0ZDo6bW92ZShiYXNlX2ZhY3Rvcmllcy0+cGVuZGluZ19hcHBjYWNoZV9mYWN0b3J5KCkpOwpAQCAtMTMyLDE2ICsxMzIsMTUgQEAKICAgICBtb2pvOjpQZW5kaW5nUmVtb3RlPG5ldHdvcms6Om1vam9tOjpVUkxMb2FkZXJGYWN0b3J5PgogICAgICAgICBwZW5kaW5nX2FwcGNhY2hlX2ZhY3RvcnksCiAgICAgU2NoZW1lTWFwIHBlbmRpbmdfc2NoZW1lX3NwZWNpZmljX2ZhY3RvcmllcywKLSAgICBPcmlnaW5NYXAgcGVuZGluZ19pbml0aWF0b3Jfc3BlY2lmaWNfZmFjdG9yaWVzLAorICAgIE9yaWdpbk1hcCBwZW5kaW5nX2lzb2xhdGVkX3dvcmxkX2ZhY3RvcmllcywKICAgICBuZXR3b3JrOjptb2pvbTo6VVJMTG9hZGVyRmFjdG9yeVB0ckluZm8gZGlyZWN0X25ldHdvcmtfZmFjdG9yeV9pbmZvLAogICAgIG1vam86OlBlbmRpbmdSZW1vdGU8bmV0d29yazo6bW9qb206OlVSTExvYWRlckZhY3Rvcnk+CiAgICAgICAgIHBlbmRpbmdfcHJlZmV0Y2hfbG9hZGVyX2ZhY3RvcnksCiAgICAgYm9vbCBieXBhc3NfcmVkaXJlY3RfY2hlY2tzKQotICAgIDogVVJMTG9hZGVyRmFjdG9yeUJ1bmRsZUluZm8oCi0gICAgICAgICAgc3RkOjptb3ZlKHBlbmRpbmdfZGVmYXVsdF9mYWN0b3J5KSwKLSAgICAgICAgICBzdGQ6Om1vdmUocGVuZGluZ19zY2hlbWVfc3BlY2lmaWNfZmFjdG9yaWVzKSwKLSAgICAgICAgICBzdGQ6Om1vdmUocGVuZGluZ19pbml0aWF0b3Jfc3BlY2lmaWNfZmFjdG9yaWVzKSwKLSAgICAgICAgICBieXBhc3NfcmVkaXJlY3RfY2hlY2tzKSwKKyAgICA6IFVSTExvYWRlckZhY3RvcnlCdW5kbGVJbmZvKHN0ZDo6bW92ZShwZW5kaW5nX2RlZmF1bHRfZmFjdG9yeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocGVuZGluZ19zY2hlbWVfc3BlY2lmaWNfZmFjdG9yaWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShwZW5kaW5nX2lzb2xhdGVkX3dvcmxkX2ZhY3RvcmllcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXBhc3NfcmVkaXJlY3RfY2hlY2tzKSwKICAgICAgIGRpcmVjdF9uZXR3b3JrX2ZhY3RvcnlfaW5mb18oc3RkOjptb3ZlKGRpcmVjdF9uZXR3b3JrX2ZhY3RvcnlfaW5mbykpLAogICAgICAgcGVuZGluZ19wcmVmZXRjaF9sb2FkZXJfZmFjdG9yeV8oCiAgICAgICAgICAgc3RkOjptb3ZlKHBlbmRpbmdfcHJlZmV0Y2hfbG9hZGVyX2ZhY3RvcnkpKSB7CkBAIC0xNTcsOCArMTU2LDggQEAKICAgb3RoZXItPnBlbmRpbmdfYXBwY2FjaGVfZmFjdG9yeV8gPSBzdGQ6Om1vdmUocGVuZGluZ19hcHBjYWNoZV9mYWN0b3J5Xyk7CiAgIG90aGVyLT5wZW5kaW5nX3NjaGVtZV9zcGVjaWZpY19mYWN0b3JpZXNfID0KICAgICAgIHN0ZDo6bW92ZShwZW5kaW5nX3NjaGVtZV9zcGVjaWZpY19mYWN0b3JpZXNfKTsKLSAgb3RoZXItPnBlbmRpbmdfaW5pdGlhdG9yX3NwZWNpZmljX2ZhY3Rvcmllc18gPQotICAgICAgc3RkOjptb3ZlKHBlbmRpbmdfaW5pdGlhdG9yX3NwZWNpZmljX2ZhY3Rvcmllc18pOworICBvdGhlci0+cGVuZGluZ19pc29sYXRlZF93b3JsZF9mYWN0b3JpZXNfID0KKyAgICAgIHN0ZDo6bW92ZShwZW5kaW5nX2lzb2xhdGVkX3dvcmxkX2ZhY3Rvcmllc18pOwogICBvdGhlci0+ZGlyZWN0X25ldHdvcmtfZmFjdG9yeV9pbmZvXyA9IHN0ZDo6bW92ZShkaXJlY3RfbmV0d29ya19mYWN0b3J5X2luZm9fKTsKICAgb3RoZXItPnBlbmRpbmdfcHJlZmV0Y2hfbG9hZGVyX2ZhY3RvcnlfID0KICAgICAgIHN0ZDo6bW92ZShwZW5kaW5nX3ByZWZldGNoX2xvYWRlcl9mYWN0b3J5Xyk7CkBAIC0zMjcsNyArMzI2LDcgQEAKICAgICAgIHN0ZDo6bW92ZShkZWZhdWx0X2ZhY3RvcnlfcGVuZGluZ19yZW1vdGUpLAogICAgICAgc3RkOjptb3ZlKGFwcGNhY2hlX2ZhY3RvcnlfcGVuZGluZ19yZW1vdGUpLAogICAgICAgQ2xvbmVSZW1vdGVNYXBUb1BlbmRpbmdSZW1vdGVNYXAoc2NoZW1lX3NwZWNpZmljX2ZhY3Rvcmllc18pLAotICAgICAgQ2xvbmVSZW1vdGVNYXBUb1BlbmRpbmdSZW1vdGVNYXAoaW5pdGlhdG9yX3NwZWNpZmljX2ZhY3Rvcmllc18pLAorICAgICAgQ2xvbmVSZW1vdGVNYXBUb1BlbmRpbmdSZW1vdGVNYXAoaXNvbGF0ZWRfd29ybGRfZmFjdG9yaWVzXyksCiAgICAgICBzdGQ6Om1vdmUoZGlyZWN0X25ldHdvcmtfZmFjdG9yeV9pbmZvKSwKICAgICAgIHN0ZDo6bW92ZShwZW5kaW5nX3ByZWZldGNoX2xvYWRlcl9mYWN0b3J5KSwgYnlwYXNzX3JlZGlyZWN0X2NoZWNrc18pOwogfQpAQCAtMzU5LDggKzM1OCw3IEBACiAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPENoaWxkVVJMTG9hZGVyRmFjdG9yeUJ1bmRsZUluZm8+KAogICAgICAgc3RkOjptb3ZlKHBlbmRpbmdfZGVmYXVsdF9mYWN0b3J5KSwgc3RkOjptb3ZlKHBlbmRpbmdfYXBwY2FjaGVfZmFjdG9yeSksCiAgICAgICBCb3VuZFJlbW90ZU1hcFRvUGVuZGluZ1JlbW90ZU1hcChzdGQ6Om1vdmUoc2NoZW1lX3NwZWNpZmljX2ZhY3Rvcmllc18pKSwKLSAgICAgIEJvdW5kUmVtb3RlTWFwVG9QZW5kaW5nUmVtb3RlTWFwKAotICAgICAgICAgIHN0ZDo6bW92ZShpbml0aWF0b3Jfc3BlY2lmaWNfZmFjdG9yaWVzXykpLAorICAgICAgQm91bmRSZW1vdGVNYXBUb1BlbmRpbmdSZW1vdGVNYXAoc3RkOjptb3ZlKGlzb2xhdGVkX3dvcmxkX2ZhY3Rvcmllc18pKSwKICAgICAgIHN0ZDo6bW92ZShkaXJlY3RfbmV0d29ya19mYWN0b3J5X2luZm8pLAogICAgICAgc3RkOjptb3ZlKHBlbmRpbmdfcHJlZmV0Y2hfbG9hZGVyX2ZhY3RvcnkpLCBieXBhc3NfcmVkaXJlY3RfY2hlY2tzXyk7CiB9CmRpZmYgLS1naXQgYS9jb250ZW50L3JlbmRlcmVyL2xvYWRlci9jaGlsZF91cmxfbG9hZGVyX2ZhY3RvcnlfYnVuZGxlLmggYi9jb250ZW50L3JlbmRlcmVyL2xvYWRlci9jaGlsZF91cmxfbG9hZGVyX2ZhY3RvcnlfYnVuZGxlLmgKaW5kZXggODgzMWQzMzcuLjljMDcxNmUgMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvcmVuZGVyZXIvbG9hZGVyL2NoaWxkX3VybF9sb2FkZXJfZmFjdG9yeV9idW5kbGUuaAorKysgYi9jb250ZW50L3JlbmRlcmVyL2xvYWRlci9jaGlsZF91cmxfbG9hZGVyX2ZhY3RvcnlfYnVuZGxlLmgKQEAgLTQxLDcgKzQxLDcgQEAKICAgICAgIG1vam86OlBlbmRpbmdSZW1vdGU8bmV0d29yazo6bW9qb206OlVSTExvYWRlckZhY3Rvcnk+CiAgICAgICAgICAgcGVuZGluZ19kZWZhdWx0X25ldHdvcmtfZmFjdG9yeSwKICAgICAgIFNjaGVtZU1hcCBwZW5kaW5nX3NjaGVtZV9zcGVjaWZpY19mYWN0b3JpZXMsCi0gICAgICBPcmlnaW5NYXAgcGVuZGluZ19pbml0aWF0b3Jfc3BlY2lmaWNfZmFjdG9yaWVzLAorICAgICAgT3JpZ2luTWFwIHBlbmRpbmdfaXNvbGF0ZWRfd29ybGRfZmFjdG9yaWVzLAogICAgICAgbmV0d29yazo6bW9qb206OlVSTExvYWRlckZhY3RvcnlQdHJJbmZvIGRpcmVjdF9uZXR3b3JrX2ZhY3RvcnlfaW5mbywKICAgICAgIG1vam86OlBlbmRpbmdSZW1vdGU8bmV0d29yazo6bW9qb206OlVSTExvYWRlckZhY3Rvcnk+CiAgICAgICAgICAgcGVuZGluZ19wcmVmZXRjaF9sb2FkZXJfZmFjdG9yeSwKZGlmZiAtLWdpdCBhL2NvbnRlbnQvcmVuZGVyZXIvbG9hZGVyL3RyYWNrZWRfY2hpbGRfdXJsX2xvYWRlcl9mYWN0b3J5X2J1bmRsZS5jYyBiL2NvbnRlbnQvcmVuZGVyZXIvbG9hZGVyL3RyYWNrZWRfY2hpbGRfdXJsX2xvYWRlcl9mYWN0b3J5X2J1bmRsZS5jYwppbmRleCBkY2I0OGFhLi40Nzk0NjdkIDEwMDY0NAotLS0gYS9jb250ZW50L3JlbmRlcmVyL2xvYWRlci90cmFja2VkX2NoaWxkX3VybF9sb2FkZXJfZmFjdG9yeV9idW5kbGUuY2MKKysrIGIvY29udGVudC9yZW5kZXJlci9sb2FkZXIvdHJhY2tlZF9jaGlsZF91cmxfbG9hZGVyX2ZhY3RvcnlfYnVuZGxlLmNjCkBAIC0yMCw3ICsyMCw3IEBACiAgICAgbW9qbzo6UGVuZGluZ1JlbW90ZTxuZXR3b3JrOjptb2pvbTo6VVJMTG9hZGVyRmFjdG9yeT4KICAgICAgICAgcGVuZGluZ19hcHBjYWNoZV9mYWN0b3J5LAogICAgIFNjaGVtZU1hcCBwZW5kaW5nX3NjaGVtZV9zcGVjaWZpY19mYWN0b3JpZXMsCi0gICAgT3JpZ2luTWFwIHBlbmRpbmdfaW5pdGlhdG9yX3NwZWNpZmljX2ZhY3RvcmllcywKKyAgICBPcmlnaW5NYXAgcGVuZGluZ19pc29sYXRlZF93b3JsZF9mYWN0b3JpZXMsCiAgICAgbmV0d29yazo6bW9qb206OlVSTExvYWRlckZhY3RvcnlQdHJJbmZvIGRpcmVjdF9uZXR3b3JrX2ZhY3RvcnlfaW5mbywKICAgICBtb2pvOjpQZW5kaW5nUmVtb3RlPG5ldHdvcms6Om1vam9tOjpVUkxMb2FkZXJGYWN0b3J5PgogICAgICAgICBwZW5kaW5nX3ByZWZldGNoX2xvYWRlcl9mYWN0b3J5LApAQCAtMzAsNyArMzAsNyBAQAogICAgICAgICAgIHN0ZDo6bW92ZShwZW5kaW5nX2RlZmF1bHRfZmFjdG9yeSksCiAgICAgICAgICAgc3RkOjptb3ZlKHBlbmRpbmdfYXBwY2FjaGVfZmFjdG9yeSksCiAgICAgICAgICAgc3RkOjptb3ZlKHBlbmRpbmdfc2NoZW1lX3NwZWNpZmljX2ZhY3RvcmllcyksCi0gICAgICAgICAgc3RkOjptb3ZlKHBlbmRpbmdfaW5pdGlhdG9yX3NwZWNpZmljX2ZhY3RvcmllcyksCisgICAgICAgICAgc3RkOjptb3ZlKHBlbmRpbmdfaXNvbGF0ZWRfd29ybGRfZmFjdG9yaWVzKSwKICAgICAgICAgICBzdGQ6Om1vdmUoZGlyZWN0X25ldHdvcmtfZmFjdG9yeV9pbmZvKSwKICAgICAgICAgICBzdGQ6Om1vdmUocGVuZGluZ19wcmVmZXRjaF9sb2FkZXJfZmFjdG9yeSksCiAgICAgICAgICAgYnlwYXNzX3JlZGlyZWN0X2NoZWNrcyksCkBAIC00Niw4ICs0Niw4IEBACiAgIG90aGVyLT5wZW5kaW5nX2FwcGNhY2hlX2ZhY3RvcnlfID0gc3RkOjptb3ZlKHBlbmRpbmdfYXBwY2FjaGVfZmFjdG9yeV8pOwogICBvdGhlci0+cGVuZGluZ19zY2hlbWVfc3BlY2lmaWNfZmFjdG9yaWVzXyA9CiAgICAgICBzdGQ6Om1vdmUocGVuZGluZ19zY2hlbWVfc3BlY2lmaWNfZmFjdG9yaWVzXyk7Ci0gIG90aGVyLT5wZW5kaW5nX2luaXRpYXRvcl9zcGVjaWZpY19mYWN0b3JpZXNfID0KLSAgICAgIHN0ZDo6bW92ZShwZW5kaW5nX2luaXRpYXRvcl9zcGVjaWZpY19mYWN0b3JpZXNfKTsKKyAgb3RoZXItPnBlbmRpbmdfaXNvbGF0ZWRfd29ybGRfZmFjdG9yaWVzXyA9CisgICAgICBzdGQ6Om1vdmUocGVuZGluZ19pc29sYXRlZF93b3JsZF9mYWN0b3JpZXNfKTsKICAgb3RoZXItPmRpcmVjdF9uZXR3b3JrX2ZhY3RvcnlfaW5mb18gPSBzdGQ6Om1vdmUoZGlyZWN0X25ldHdvcmtfZmFjdG9yeV9pbmZvXyk7CiAgIG90aGVyLT5wZW5kaW5nX3ByZWZldGNoX2xvYWRlcl9mYWN0b3J5XyA9CiAgICAgICBzdGQ6Om1vdmUocGVuZGluZ19wcmVmZXRjaF9sb2FkZXJfZmFjdG9yeV8pOwpAQCAtODgsNyArODgsNyBAQAogICAgICAgc3RkOjptb3ZlKHBlbmRpbmdfZmFjdG9yaWVzLT5wZW5kaW5nX2RlZmF1bHRfZmFjdG9yeSgpKSwKICAgICAgIHN0ZDo6bW92ZShwZW5kaW5nX2ZhY3Rvcmllcy0+cGVuZGluZ19hcHBjYWNoZV9mYWN0b3J5KCkpLAogICAgICAgc3RkOjptb3ZlKHBlbmRpbmdfZmFjdG9yaWVzLT5wZW5kaW5nX3NjaGVtZV9zcGVjaWZpY19mYWN0b3JpZXMoKSksCi0gICAgICBzdGQ6Om1vdmUocGVuZGluZ19mYWN0b3JpZXMtPnBlbmRpbmdfaW5pdGlhdG9yX3NwZWNpZmljX2ZhY3RvcmllcygpKSwKKyAgICAgIHN0ZDo6bW92ZShwZW5kaW5nX2ZhY3Rvcmllcy0+cGVuZGluZ19pc29sYXRlZF93b3JsZF9mYWN0b3JpZXMoKSksCiAgICAgICBzdGQ6Om1vdmUocGVuZGluZ19mYWN0b3JpZXMtPmRpcmVjdF9uZXR3b3JrX2ZhY3RvcnlfaW5mbygpKSwKICAgICAgIHN0ZDo6bW92ZShwZW5kaW5nX2ZhY3Rvcmllcy0+cGVuZGluZ19wcmVmZXRjaF9sb2FkZXJfZmFjdG9yeSgpKSwKICAgICAgIHN0ZDo6bW92ZShtYWluX3RocmVhZF9ob3N0X2J1bmRsZV9jbG9uZSksCkBAIC0xNTQsNyArMTU0LDcgQEAKICAgICAgIHN0ZDo6bW92ZShwZW5kaW5nX2ZhY3Rvcmllcy0+cGVuZGluZ19kZWZhdWx0X2ZhY3RvcnkoKSksCiAgICAgICBzdGQ6Om1vdmUocGVuZGluZ19mYWN0b3JpZXMtPnBlbmRpbmdfYXBwY2FjaGVfZmFjdG9yeSgpKSwKICAgICAgIHN0ZDo6bW92ZShwZW5kaW5nX2ZhY3Rvcmllcy0+cGVuZGluZ19zY2hlbWVfc3BlY2lmaWNfZmFjdG9yaWVzKCkpLAotICAgICAgc3RkOjptb3ZlKHBlbmRpbmdfZmFjdG9yaWVzLT5wZW5kaW5nX2luaXRpYXRvcl9zcGVjaWZpY19mYWN0b3JpZXMoKSksCisgICAgICBzdGQ6Om1vdmUocGVuZGluZ19mYWN0b3JpZXMtPnBlbmRpbmdfaXNvbGF0ZWRfd29ybGRfZmFjdG9yaWVzKCkpLAogICAgICAgc3RkOjptb3ZlKHBlbmRpbmdfZmFjdG9yaWVzLT5kaXJlY3RfbmV0d29ya19mYWN0b3J5X2luZm8oKSksCiAgICAgICBzdGQ6Om1vdmUocGVuZGluZ19mYWN0b3JpZXMtPnBlbmRpbmdfcHJlZmV0Y2hfbG9hZGVyX2ZhY3RvcnkoKSksCiAgICAgICBzdGQ6Om1vdmUobWFpbl90aHJlYWRfaG9zdF9idW5kbGVfY2xvbmUpLApAQCAtMTc3LDcgKzE3Nyw3IEBACiAgICAgICBzdGQ6Om1vdmUocGVuZGluZ19mYWN0b3JpZXMtPnBlbmRpbmdfZGVmYXVsdF9mYWN0b3J5KCkpLAogICAgICAgc3RkOjptb3ZlKHBlbmRpbmdfZmFjdG9yaWVzLT5wZW5kaW5nX2FwcGNhY2hlX2ZhY3RvcnkoKSksCiAgICAgICBzdGQ6Om1vdmUocGVuZGluZ19mYWN0b3JpZXMtPnBlbmRpbmdfc2NoZW1lX3NwZWNpZmljX2ZhY3RvcmllcygpKSwKLSAgICAgIHN0ZDo6bW92ZShwZW5kaW5nX2ZhY3Rvcmllcy0+cGVuZGluZ19pbml0aWF0b3Jfc3BlY2lmaWNfZmFjdG9yaWVzKCkpLAorICAgICAgc3RkOjptb3ZlKHBlbmRpbmdfZmFjdG9yaWVzLT5wZW5kaW5nX2lzb2xhdGVkX3dvcmxkX2ZhY3RvcmllcygpKSwKICAgICAgIHN0ZDo6bW92ZShwZW5kaW5nX2ZhY3Rvcmllcy0+ZGlyZWN0X25ldHdvcmtfZmFjdG9yeV9pbmZvKCkpLAogICAgICAgc3RkOjptb3ZlKHBlbmRpbmdfZmFjdG9yaWVzLT5wZW5kaW5nX3ByZWZldGNoX2xvYWRlcl9mYWN0b3J5KCkpLAogICAgICAgc3RkOjptb3ZlKG1haW5fdGhyZWFkX2hvc3RfYnVuZGxlX2Nsb25lKSwKZGlmZiAtLWdpdCBhL2NvbnRlbnQvcmVuZGVyZXIvbG9hZGVyL3RyYWNrZWRfY2hpbGRfdXJsX2xvYWRlcl9mYWN0b3J5X2J1bmRsZS5oIGIvY29udGVudC9yZW5kZXJlci9sb2FkZXIvdHJhY2tlZF9jaGlsZF91cmxfbG9hZGVyX2ZhY3RvcnlfYnVuZGxlLmgKaW5kZXggZDc1YjcwYy4uOTk0ZjEzNyAxMDA2NDQKLS0tIGEvY29udGVudC9yZW5kZXJlci9sb2FkZXIvdHJhY2tlZF9jaGlsZF91cmxfbG9hZGVyX2ZhY3RvcnlfYnVuZGxlLmgKKysrIGIvY29udGVudC9yZW5kZXJlci9sb2FkZXIvdHJhY2tlZF9jaGlsZF91cmxfbG9hZGVyX2ZhY3RvcnlfYnVuZGxlLmgKQEAgLTM1LDcgKzM1LDcgQEAKICAgICAgIG1vam86OlBlbmRpbmdSZW1vdGU8bmV0d29yazo6bW9qb206OlVSTExvYWRlckZhY3Rvcnk+CiAgICAgICAgICAgcGVuZGluZ19hcHBjYWNoZV9mYWN0b3J5LAogICAgICAgU2NoZW1lTWFwIHBlbmRpbmdfc2NoZW1lX3NwZWNpZmljX2ZhY3RvcmllcywKLSAgICAgIE9yaWdpbk1hcCBwZW5kaW5nX2luaXRpYXRvcl9zcGVjaWZpY19mYWN0b3JpZXMsCisgICAgICBPcmlnaW5NYXAgcGVuZGluZ19pc29sYXRlZF93b3JsZF9mYWN0b3JpZXMsCiAgICAgICBuZXR3b3JrOjptb2pvbTo6VVJMTG9hZGVyRmFjdG9yeVB0ckluZm8gZGlyZWN0X25ldHdvcmtfZmFjdG9yeV9pbmZvLAogICAgICAgbW9qbzo6UGVuZGluZ1JlbW90ZTxuZXR3b3JrOjptb2pvbTo6VVJMTG9hZGVyRmFjdG9yeT4KICAgICAgICAgICBwZW5kaW5nX3ByZWZldGNoX2xvYWRlcl9mYWN0b3J5LApkaWZmIC0tZ2l0IGEvY29udGVudC9yZW5kZXJlci9wYWdlX3Byb3BlcnRpZXMuY2MgYi9jb250ZW50L3JlbmRlcmVyL3BhZ2VfcHJvcGVydGllcy5jYwppbmRleCBkYTc0MmNhLi41ZDYyMzdmIDEwMDY0NAotLS0gYS9jb250ZW50L3JlbmRlcmVyL3BhZ2VfcHJvcGVydGllcy5jYworKysgYi9jb250ZW50L3JlbmRlcmVyL3BhZ2VfcHJvcGVydGllcy5jYwpAQCAtMTksNDMgKzE5LDYgQEAKICAgc2NyZWVuX21ldHJpY3NfZW11bGF0b3JfID0gc3RkOjptb3ZlKGVtdWxhdG9yKTsKIH0KIAotdm9pZCBQYWdlUHJvcGVydGllczo6Q29udmVydFZpZXdwb3J0VG9XaW5kb3coYmxpbms6OldlYlJlY3QqIHJlY3QpIHsKLSAgaWYgKGNvbXBvc2l0b3JfZGVwc18tPklzVXNlWm9vbUZvckRTRkVuYWJsZWQoKSkgewotICAgIGZsb2F0IHJldmVyc2UgPSAxIC8gR2V0T3JpZ2luYWxTY3JlZW5JbmZvKCkuZGV2aWNlX3NjYWxlX2ZhY3RvcjsKLSAgICAvLyBUT0RPKG9zaGltYSk6IFdlIG1heSBuZWVkIHRvIGFsbG93IHBpeGVsIHByZWNpc2lvbiBoZXJlIGFzIHRoZSB0aGUKLSAgICAvLyBhbmNob3IgZWxlbWVudCBjYW4gYmUgcGxhY2VkIGF0IGhhbGYgcGl4ZWwuCi0gICAgZ2Z4OjpSZWN0IHdpbmRvd19yZWN0ID0gZ2Z4OjpTY2FsZVRvRW5jbG9zZWRSZWN0KGdmeDo6UmVjdCgqcmVjdCksIHJldmVyc2UpOwotICAgIHJlY3QtPnggPSB3aW5kb3dfcmVjdC54KCk7Ci0gICAgcmVjdC0+eSA9IHdpbmRvd19yZWN0LnkoKTsKLSAgICByZWN0LT53aWR0aCA9IHdpbmRvd19yZWN0LndpZHRoKCk7Ci0gICAgcmVjdC0+aGVpZ2h0ID0gd2luZG93X3JlY3QuaGVpZ2h0KCk7Ci0gIH0KLX0KLQotdm9pZCBQYWdlUHJvcGVydGllczo6Q29udmVydFZpZXdwb3J0VG9XaW5kb3coYmxpbms6OldlYkZsb2F0UmVjdCogcmVjdCkgewotICBpZiAoY29tcG9zaXRvcl9kZXBzXy0+SXNVc2Vab29tRm9yRFNGRW5hYmxlZCgpKSB7Ci0gICAgcmVjdC0+eCAvPSBHZXRPcmlnaW5hbFNjcmVlbkluZm8oKS5kZXZpY2Vfc2NhbGVfZmFjdG9yOwotICAgIHJlY3QtPnkgLz0gR2V0T3JpZ2luYWxTY3JlZW5JbmZvKCkuZGV2aWNlX3NjYWxlX2ZhY3RvcjsKLSAgICByZWN0LT53aWR0aCAvPSBHZXRPcmlnaW5hbFNjcmVlbkluZm8oKS5kZXZpY2Vfc2NhbGVfZmFjdG9yOwotICAgIHJlY3QtPmhlaWdodCAvPSBHZXRPcmlnaW5hbFNjcmVlbkluZm8oKS5kZXZpY2Vfc2NhbGVfZmFjdG9yOwotICB9Ci19Ci0KLXZvaWQgUGFnZVByb3BlcnRpZXM6OkNvbnZlcnRXaW5kb3dUb1ZpZXdwb3J0KGJsaW5rOjpXZWJGbG9hdFJlY3QqIHJlY3QpIHsKLSAgaWYgKGNvbXBvc2l0b3JfZGVwc18tPklzVXNlWm9vbUZvckRTRkVuYWJsZWQoKSkgewotICAgIHJlY3QtPnggKj0gR2V0T3JpZ2luYWxTY3JlZW5JbmZvKCkuZGV2aWNlX3NjYWxlX2ZhY3RvcjsKLSAgICByZWN0LT55ICo9IEdldE9yaWdpbmFsU2NyZWVuSW5mbygpLmRldmljZV9zY2FsZV9mYWN0b3I7Ci0gICAgcmVjdC0+d2lkdGggKj0gR2V0T3JpZ2luYWxTY3JlZW5JbmZvKCkuZGV2aWNlX3NjYWxlX2ZhY3RvcjsKLSAgICByZWN0LT5oZWlnaHQgKj0gR2V0T3JpZ2luYWxTY3JlZW5JbmZvKCkuZGV2aWNlX3NjYWxlX2ZhY3RvcjsKLSAgfQotfQotCi1jb25zdCBTY3JlZW5JbmZvJiBQYWdlUHJvcGVydGllczo6R2V0T3JpZ2luYWxTY3JlZW5JbmZvKCkgY29uc3QgewotICByZXR1cm4gU2NyZWVuTWV0cmljc0VtdWxhdG9yKCkKLSAgICAgICAgICAgICA/IFNjcmVlbk1ldHJpY3NFbXVsYXRvcigpLT5vcmlnaW5hbF9zY3JlZW5faW5mbygpCi0gICAgICAgICAgICAgOiBHZXRTY3JlZW5JbmZvKCk7Ci19Ci0KIENvbXBvc2l0b3JEZXBlbmRlbmNpZXMqIFBhZ2VQcm9wZXJ0aWVzOjpHZXRDb21wb3NpdG9yRGVwZW5kZW5jaWVzKCkgewogICByZXR1cm4gY29tcG9zaXRvcl9kZXBzXzsKIH0KZGlmZiAtLWdpdCBhL2NvbnRlbnQvcmVuZGVyZXIvcGFnZV9wcm9wZXJ0aWVzLmggYi9jb250ZW50L3JlbmRlcmVyL3BhZ2VfcHJvcGVydGllcy5oCmluZGV4IDVlNzdkMjEuLjBhZjE0NmUgMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvcmVuZGVyZXIvcGFnZV9wcm9wZXJ0aWVzLmgKKysrIGIvY29udGVudC9yZW5kZXJlci9wYWdlX3Byb3BlcnRpZXMuaApAQCAtOCwxMSArOCw2IEBACiAjaW5jbHVkZSAiY29udGVudC9jb21tb24vY29udGVudF9leHBvcnQuaCIKICNpbmNsdWRlICJjb250ZW50L3B1YmxpYy9jb21tb24vc2NyZWVuX2luZm8uaCIKIAotbmFtZXNwYWNlIGJsaW5rIHsKLXN0cnVjdCBXZWJGbG9hdFJlY3Q7Ci1zdHJ1Y3QgV2ViUmVjdDsKLX0gIC8vIG5hbWVzcGFjZSBibGluawotCiBuYW1lc3BhY2UgY29udGVudCB7CiAKIGNsYXNzIENvbXBvc2l0b3JEZXBlbmRlbmNpZXM7CkBAIC01MSwxMyArNDYsNiBAQAogICB2b2lkIFNldFNjcmVlbk1ldHJpY3NFbXVsYXRvcigKICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxSZW5kZXJXaWRnZXRTY3JlZW5NZXRyaWNzRW11bGF0b3I+IGVtdWxhdG9yKTsKIAotICB2b2lkIENvbnZlcnRWaWV3cG9ydFRvV2luZG93KGJsaW5rOjpXZWJSZWN0KiByZWN0KTsKLSAgdm9pZCBDb252ZXJ0Vmlld3BvcnRUb1dpbmRvdyhibGluazo6V2ViRmxvYXRSZWN0KiByZWN0KTsKLSAgdm9pZCBDb252ZXJ0V2luZG93VG9WaWV3cG9ydChibGluazo6V2ViRmxvYXRSZWN0KiByZWN0KTsKLQotICAvLyBXaGVuIGVtdWxhdGVkLCB0aGlzIHJldHVybnMgdGhlIG9yaWdpbmFsIChub24tZW11bGF0ZWQpIFNjcmVlbkluZm8uCi0gIGNvbnN0IFNjcmVlbkluZm8mIEdldE9yaWdpbmFsU2NyZWVuSW5mbygpIGNvbnN0OwotCiAgIENvbXBvc2l0b3JEZXBlbmRlbmNpZXMqIEdldENvbXBvc2l0b3JEZXBlbmRlbmNpZXMoKTsKIAogIHByaXZhdGU6CmRpZmYgLS1naXQgYS9jb250ZW50L3JlbmRlcmVyL3BlcHBlci9wZXBwZXJfcGx1Z2luX2luc3RhbmNlX2ltcGwuY2MgYi9jb250ZW50L3JlbmRlcmVyL3BlcHBlci9wZXBwZXJfcGx1Z2luX2luc3RhbmNlX2ltcGwuY2MKaW5kZXggOTMwZmNmMC4uNjNmYThjMiAxMDA2NDQKLS0tIGEvY29udGVudC9yZW5kZXJlci9wZXBwZXIvcGVwcGVyX3BsdWdpbl9pbnN0YW5jZV9pbXBsLmNjCisrKyBiL2NvbnRlbnQvcmVuZGVyZXIvcGVwcGVyL3BlcHBlcl9wbHVnaW5faW5zdGFuY2VfaW1wbC5jYwpAQCAtMTA5LDYgKzEwOSw3IEBACiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcHVibGljL3BsYXRmb3JtL3dlYl91cmxfcmVxdWVzdC5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYy93ZWIvd2ViX2RvY3VtZW50LmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcHVibGljL3dlYi93ZWJfZG9jdW1lbnRfbG9hZGVyLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcHVibGljL3dlYi93ZWJfZnJhbWVfd2lkZ2V0LmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcHVibGljL3dlYi93ZWJfaW1lX3RleHRfc3Bhbi5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYy93ZWIvd2ViX2xvY2FsX2ZyYW1lLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcHVibGljL3dlYi93ZWJfcGx1Z2luX2NvbnRhaW5lci5oIgpkaWZmIC0tZ2l0IGEvY29udGVudC9yZW5kZXJlci9yZW5kZXJfZnJhbWVfaW1wbC5jYyBiL2NvbnRlbnQvcmVuZGVyZXIvcmVuZGVyX2ZyYW1lX2ltcGwuY2MKaW5kZXggZTg4YjlkMy4uYjhjMDA0NiAxMDA2NDQKLS0tIGEvY29udGVudC9yZW5kZXJlci9yZW5kZXJfZnJhbWVfaW1wbC5jYworKysgYi9jb250ZW50L3JlbmRlcmVyL3JlbmRlcl9mcmFtZV9pbXBsLmNjCkBAIC0xNDg1LDcgKzE0ODUsNyBAQAogICBhdXRvKiB3ZWJfZnJhbWVfd2lkZ2V0ID0KICAgICAgIGJsaW5rOjpXZWJGcmFtZVdpZGdldDo6Q3JlYXRlRm9yTWFpbkZyYW1lKHJlbmRlcl93aWRnZXQsIHdlYl9mcmFtZSk7CiAKLSAgcmVuZGVyX3dpZGdldC0+SW5pdEZvck1haW5GcmFtZShzdGQ6Om1vdmUoc2hvd19jYWxsYmFjayksIHdlYl9mcmFtZV93aWRnZXQpOworICByZW5kZXJfd2lkZ2V0LT5Jbml0Rm9yTWFpbkZyYW1lKHN0ZDo6bW92ZShzaG93X2NhbGxiYWNrKSk7CiAgIHJlbmRlcl92aWV3LT5BdHRhY2hXZWJGcmFtZVdpZGdldCh3ZWJfZnJhbWVfd2lkZ2V0KTsKIAogICByZW5kZXJfd2lkZ2V0LT5TeW5jaHJvbml6ZVZpc3VhbFByb3BlcnRpZXNGcm9tUmVuZGVyVmlldygKQEAgLTM5OTIsMTggKzM5OTIsNiBAQAogICB9CiB9CiAKLXZvaWQgUmVuZGVyRnJhbWVJbXBsOjpNYXJrSW5pdGlhdG9yQXNSZXF1aXJpbmdTZXBhcmF0ZVVSTExvYWRlckZhY3RvcnkoCi0gICAgY29uc3QgdXJsOjpPcmlnaW4mIGluaXRpYXRvcl9vcmlnaW4sCi0gICAgbmV0d29yazo6bW9qb206OlVSTExvYWRlckZhY3RvcnlQdHIgdXJsX2xvYWRlcl9mYWN0b3J5KSB7Ci0gIC8vIFNldCB1cCB8bG9hZGVyX2ZhY3Rvcmllc198IHRvIGJlIHVwZGF0ZWQgYnkgdGhlCi0gIC8vIFVwZGF0ZVN1YnJlc291cmNlTG9hZGVyRmFjdG9yaWVzKCkgYmVsb3cuCi0gIEdldExvYWRlckZhY3RvcnlCdW5kbGUoKTsKLSAgYXV0byBmYWN0b3J5X2J1bmRsZSA9IHN0ZDo6bWFrZV91bmlxdWU8Ymxpbms6OlVSTExvYWRlckZhY3RvcnlCdW5kbGVJbmZvPigpOwotICBmYWN0b3J5X2J1bmRsZS0+cGVuZGluZ19pbml0aWF0b3Jfc3BlY2lmaWNfZmFjdG9yaWVzKClbaW5pdGlhdG9yX29yaWdpbl0gPQotICAgICAgdXJsX2xvYWRlcl9mYWN0b3J5LlBhc3NJbnRlcmZhY2UoKTsKLSAgVXBkYXRlU3VicmVzb3VyY2VMb2FkZXJGYWN0b3JpZXMoc3RkOjptb3ZlKGZhY3RvcnlfYnVuZGxlKSk7Ci19Ci0KIHZvaWQgUmVuZGVyRnJhbWVJbXBsOjpCaW5kRGV2VG9vbHNBZ2VudCgKICAgICBtb2pvOjpQZW5kaW5nQXNzb2NpYXRlZFJlbW90ZTxibGluazo6bW9qb206OkRldlRvb2xzQWdlbnRIb3N0PiBob3N0LAogICAgIG1vam86OlBlbmRpbmdBc3NvY2lhdGVkUmVjZWl2ZXI8Ymxpbms6Om1vam9tOjpEZXZUb29sc0FnZW50PiByZWNlaXZlcikgewpAQCAtNDQ2OCw3ICs0NDU2LDYgQEAKICAgICAvLyB0aGlzICJzd2FwIG91dCIsIHRoZSBwb2ludGVyIGlzIG1vdmVkIG9mZiB0byB0aGUgc2lkZSB1bnRpbCBpdCBpcwogICAgIC8vIHN3YXBwZWQgYmFjayBpbi4gVGhlIHJlbmRlcmVyIGlzIHRoZW4gdG9sZCB0aGF0IHRoZSBXZWJGcmFtZVdpZGdldCBpcwogICAgIC8vIGRyb3BwZWQgd2hpY2ggc2hvdWxkIHJlbW92ZSBhbGwgcmVmZXJlbmNlIHRvIHRoaXMgb2JqZWN0LgotICAgIHJlbmRlcl92aWV3Xy0+TWFrZU1haW5GcmFtZVJlbmRlcldpZGdldFVuZGVhZCgpOwogICAgIHJlbmRlcl92aWV3Xy0+RGV0YWNoV2ViRnJhbWVXaWRnZXQoKTsKICAgfSBlbHNlIGlmIChyZW5kZXJfd2lkZ2V0XykgewogICAgIERDSEVDSyhvd25lZF9yZW5kZXJfd2lkZ2V0Xyk7CkBAIC01MjI5LDggKzUyMTYsNyBAQAogICAgIC8vIGluY2x1ZGUgdGhlIGRldmljZSBzY2FsZSBmYWN0b3IsIGJ1dCBub3QgZW11bGF0aW9uIHNjYWxlLiBIZXJlIHdlIGNvbnZlcnQKICAgICAvLyB0aGVtIHRvIERJUCBjb29yZGlhdGVzIHJlbGF0aXZlIHRvIHRoZSBXaW5kb3dTY3JlZW5SZWN0LgogICAgIGJsaW5rOjpXZWJSZWN0IHBvc2l0aW9uX2luX3dpbmRvdyhwYXJhbXMueCwgcGFyYW1zLnksIDAsIDApOwotICAgIHJlbmRlcl92aWV3Xy0+cGFnZV9wcm9wZXJ0aWVzKCktPkNvbnZlcnRWaWV3cG9ydFRvV2luZG93KAotICAgICAgICAmcG9zaXRpb25faW5fd2luZG93KTsKKyAgICBHZXRMb2NhbFJvb3RSZW5kZXJXaWRnZXQoKS0+Q29udmVydFZpZXdwb3J0VG9XaW5kb3coJnBvc2l0aW9uX2luX3dpbmRvdyk7CiAgICAgaWYgKHJlbmRlcl92aWV3Xy0+cGFnZV9wcm9wZXJ0aWVzKCktPlNjcmVlbk1ldHJpY3NFbXVsYXRvcigpKSB7CiAgICAgICBjb25zdCBmbG9hdCBzY2FsZSA9CiAgICAgICAgICAgcmVuZGVyX3ZpZXdfLT5wYWdlX3Byb3BlcnRpZXMoKS0+U2NyZWVuTWV0cmljc0VtdWxhdG9yKCktPnNjYWxlKCk7CkBAIC03NjMyLDQgKzc2MTgsMTUgQEAKICAgd2ViX3VybF9sb2FkZXJfZmFjdG9yeV9vdmVycmlkZV9mb3JfdGVzdF8gPSBzdGQ6Om1vdmUoZmFjdG9yeSk7CiB9CiAKK2dmeDo6UmVjdEYgUmVuZGVyRnJhbWVJbXBsOjpFbGVtZW50Qm91bmRzSW5XaW5kb3coCisgICAgY29uc3QgYmxpbms6OldlYkVsZW1lbnQmIGVsZW1lbnQpIHsKKyAgYmxpbms6OldlYlJlY3QgYm91bmRpbmdfYm94X2luX3dpbmRvdyA9IGVsZW1lbnQuQm91bmRzSW5WaWV3cG9ydCgpOworICBHZXRMb2NhbFJvb3RSZW5kZXJXaWRnZXQoKS0+Q29udmVydFZpZXdwb3J0VG9XaW5kb3coJmJvdW5kaW5nX2JveF9pbl93aW5kb3cpOworICByZXR1cm4gZ2Z4OjpSZWN0Rihib3VuZGluZ19ib3hfaW5fd2luZG93KTsKK30KKwordm9pZCBSZW5kZXJGcmFtZUltcGw6OkNvbnZlcnRWaWV3cG9ydFRvV2luZG93KGJsaW5rOjpXZWJSZWN0KiByZWN0KSB7CisgIEdldExvY2FsUm9vdFJlbmRlcldpZGdldCgpLT5Db252ZXJ0Vmlld3BvcnRUb1dpbmRvdyhyZWN0KTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGNvbnRlbnQKZGlmZiAtLWdpdCBhL2NvbnRlbnQvcmVuZGVyZXIvcmVuZGVyX2ZyYW1lX2ltcGwuaCBiL2NvbnRlbnQvcmVuZGVyZXIvcmVuZGVyX2ZyYW1lX2ltcGwuaAppbmRleCAyMzUxYjRhLi5jNjYwYWU0IDEwMDY0NAotLS0gYS9jb250ZW50L3JlbmRlcmVyL3JlbmRlcl9mcmFtZV9pbXBsLmgKKysrIGIvY29udGVudC9yZW5kZXJlci9yZW5kZXJfZnJhbWVfaW1wbC5oCkBAIC01MDYsNiArNTA2LDggQEAKICAgICAgIGNvbnN0IFJlbmRlckZyYW1lTWVkaWFQbGF5YmFja09wdGlvbnMmIG9wdHMpIG92ZXJyaWRlOwogICB2b2lkIFVwZGF0ZUFsbExpZmVjeWNsZVBoYXNlc0FuZENvbXBvc2l0ZUZvclRlc3RpbmcoKSBvdmVycmlkZTsKICAgdm9pZCBTZXRBbGxvd3NDcm9zc0Jyb3dzaW5nSW5zdGFuY2VGcmFtZUxvb2t1cCgpIG92ZXJyaWRlOworICBnZng6OlJlY3RGIEVsZW1lbnRCb3VuZHNJbldpbmRvdyhjb25zdCBibGluazo6V2ViRWxlbWVudCYgZWxlbWVudCkgb3ZlcnJpZGU7CisgIHZvaWQgQ29udmVydFZpZXdwb3J0VG9XaW5kb3coYmxpbms6OldlYlJlY3QqIHJlY3QpIG92ZXJyaWRlOwogCiAgIC8vIGJsaW5rOjptb2pvbTo6QXV0b3BsYXlDb25maWd1cmF0aW9uQ2xpZW50IGltcGxlbWVudGF0aW9uOgogICB2b2lkIEFkZEF1dG9wbGF5RmxhZ3MoY29uc3QgdXJsOjpPcmlnaW4mIG9yaWdpbiwKQEAgLTYxOCw5ICs2MjAsNiBAQAogICB2b2lkIFVwZGF0ZVN1YnJlc291cmNlTG9hZGVyRmFjdG9yaWVzKAogICAgICAgc3RkOjp1bmlxdWVfcHRyPGJsaW5rOjpVUkxMb2FkZXJGYWN0b3J5QnVuZGxlSW5mbz4KICAgICAgICAgICBzdWJyZXNvdXJjZV9sb2FkZXJfZmFjdG9yaWVzKSBvdmVycmlkZTsKLSAgdm9pZCBNYXJrSW5pdGlhdG9yQXNSZXF1aXJpbmdTZXBhcmF0ZVVSTExvYWRlckZhY3RvcnkoCi0gICAgICBjb25zdCB1cmw6Ok9yaWdpbiYgaW5pdGlhdG9yX29yaWdpbiwKLSAgICAgIG5ldHdvcms6Om1vam9tOjpVUkxMb2FkZXJGYWN0b3J5UHRyIHVybF9sb2FkZXJfZmFjdG9yeSkgb3ZlcnJpZGU7CiAgIHZvaWQgQmluZERldlRvb2xzQWdlbnQoCiAgICAgICBtb2pvOjpQZW5kaW5nQXNzb2NpYXRlZFJlbW90ZTxibGluazo6bW9qb206OkRldlRvb2xzQWdlbnRIb3N0PiBob3N0LAogICAgICAgbW9qbzo6UGVuZGluZ0Fzc29jaWF0ZWRSZWNlaXZlcjxibGluazo6bW9qb206OkRldlRvb2xzQWdlbnQ+IHJlY2VpdmVyKQpkaWZmIC0tZ2l0IGEvY29udGVudC9yZW5kZXJlci9yZW5kZXJfdmlld19pbXBsLmNjIGIvY29udGVudC9yZW5kZXJlci9yZW5kZXJfdmlld19pbXBsLmNjCmluZGV4IDcyZjhhYzIuLjNhYjA4NzNjIDEwMDY0NAotLS0gYS9jb250ZW50L3JlbmRlcmVyL3JlbmRlcl92aWV3X2ltcGwuY2MKKysrIGIvY29udGVudC9yZW5kZXJlci9yZW5kZXJfdmlld19pbXBsLmNjCkBAIC01MTYsMTAgKzUxNiw3IEBACiAgICAgICAgIHBhZ2VfcHJvcGVydGllcygpLCBwYXJhbXMtPnZpc3VhbF9wcm9wZXJ0aWVzLmRpc3BsYXlfbW9kZSwKICAgICAgICAgLyppc191bmRlYWQ9Ki90cnVlLCBwYXJhbXMtPm5ldmVyX3Zpc2libGUpOwogICAgIHVuZGVhZF9yZW5kZXJfd2lkZ2V0Xy0+c2V0X2RlbGVnYXRlKHRoaXMpOwotICAgIC8vIFdlIGludGVudGlvbmFsbHkgcGFzcyBpbiBhIG51bGwgd2Vid2lkZ2V0IHNpbmNlIGl0IHNob3VsZG4ndCBiZSBuZWVkZWQKLSAgICAvLyBmb3IgcmVtb3RlIGZyYW1lcy4KLSAgICB1bmRlYWRfcmVuZGVyX3dpZGdldF8tPkluaXRGb3JNYWluRnJhbWUoc3RkOjptb3ZlKHNob3dfY2FsbGJhY2spLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKndlYl9mcmFtZV93aWRnZXQ9Ki9udWxscHRyKTsKKyAgICB1bmRlYWRfcmVuZGVyX3dpZGdldF8tPkluaXRGb3JNYWluRnJhbWUoc3RkOjptb3ZlKHNob3dfY2FsbGJhY2spKTsKIAogICAgIFJlbmRlckZyYW1lUHJveHk6OkNyZWF0ZUZyYW1lUHJveHkocGFyYW1zLT5wcm94eV9yb3V0aW5nX2lkLCBHZXRSb3V0aW5nSUQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5lcl9mcmFtZSwgTVNHX1JPVVRJTkdfTk9ORSwKQEAgLTU1Niw3ICs1NTMsNiBAQAogCiBSZW5kZXJWaWV3SW1wbDo6flJlbmRlclZpZXdJbXBsKCkgewogICBEQ0hFQ0soZGVzdHJveWluZ18pOyAgLy8gQWx3YXlzIGRlbGV0ZWQgdGhyb3VnaCBEZXN0cm95KCkuCi0gIERDSEVDSyghZnJhbWVfd2lkZ2V0Xyk7CiAKICAgZ19yb3V0aW5nX2lkX3ZpZXdfbWFwLkdldCgpLmVyYXNlKHJvdXRpbmdfaWRfKTsKICAgUmVuZGVyVGhyZWFkOjpHZXQoKS0+UmVtb3ZlUm91dGUocm91dGluZ19pZF8pOwpAQCAtMTA3MywxMyArMTA2OSw4IEBACiAgIC8vIGEgbWFpbiBmcmFtZS4gU28gaXQgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIHNlZSB0aGlzIGhhcHBlbmluZyB3aGVuIHRoZXJlIGlzCiAgIC8vIG5vIGxvY2FsIG1haW4gZnJhbWUuCiAgIGlmIChjbG9zZV9yZW5kZXJfd2lkZ2V0X2hlcmUpIHsKLSAgICBpZiAodW5kZWFkX3JlbmRlcl93aWRnZXRfKSB7Ci0gICAgICBSZW5kZXJXaWRnZXQqIGNsb3Npbmdfd2lkZ2V0ID0gdW5kZWFkX3JlbmRlcl93aWRnZXRfLmdldCgpOwotICAgICAgY2xvc2luZ193aWRnZXQtPkNsb3NlRm9yRnJhbWUoc3RkOjptb3ZlKHVuZGVhZF9yZW5kZXJfd2lkZ2V0XykpOwotICAgIH0gZWxzZSB7Ci0gICAgICBSZW5kZXJXaWRnZXQqIGNsb3Npbmdfd2lkZ2V0ID0gcmVuZGVyX3dpZGdldF8uZ2V0KCk7Ci0gICAgICBjbG9zaW5nX3dpZGdldC0+Q2xvc2VGb3JGcmFtZShzdGQ6Om1vdmUocmVuZGVyX3dpZGdldF8pKTsKLSAgICB9CisgICAgUmVuZGVyV2lkZ2V0KiBjbG9zaW5nX3dpZGdldCA9IHVuZGVhZF9yZW5kZXJfd2lkZ2V0Xy5nZXQoKTsKKyAgICBjbG9zaW5nX3dpZGdldC0+Q2xvc2VGb3JGcmFtZShzdGQ6Om1vdmUodW5kZWFkX3JlbmRlcl93aWRnZXRfKSk7CiAgIH0KIAogICBkZWxldGUgdGhpczsKQEAgLTExNTAsNyArMTE0MSw4IEBACiAKIHZvaWQgUmVuZGVyVmlld0ltcGw6OlNjcm9sbEZvY3VzZWROb2RlSW50b1ZpZXdGb3JXaWRnZXQoKSB7CiAgIGlmIChXZWJMb2NhbEZyYW1lKiBmb2N1c2VkX2ZyYW1lID0gR2V0V2ViVmlldygpLT5Gb2N1c2VkRnJhbWUoKSkgewotICAgIGF1dG8qIGZyYW1lX3dpZGdldCA9IGZvY3VzZWRfZnJhbWUtPkxvY2FsUm9vdCgpLT5GcmFtZVdpZGdldCgpOworICAgIGJsaW5rOjpXZWJGcmFtZVdpZGdldCogZnJhbWVfd2lkZ2V0ID0KKyAgICAgICAgZm9jdXNlZF9mcmFtZS0+TG9jYWxSb290KCktPkZyYW1lV2lkZ2V0KCk7CiAgICAgZnJhbWVfd2lkZ2V0LT5TY3JvbGxGb2N1c2VkRWRpdGFibGVFbGVtZW50SW50b1ZpZXcoKTsKICAgfQogfQpAQCAtMTU0OCw5ICsxNTQwLDEwIEBACiB9CiAKIHZvaWQgUmVuZGVyVmlld0ltcGw6OkF0dGFjaFdlYkZyYW1lV2lkZ2V0KGJsaW5rOjpXZWJGcmFtZVdpZGdldCogZnJhbWVfd2lkZ2V0KSB7Ci0gIC8vIFRoZSBwcmV2aW91cyBXZWJGcmFtZVdpZGdldCBtdXN0IGFscmVhZHkgYmUgZGV0YWNoZWQgYnkgQ2xvc2VGb3JGcmFtZSgpLgotICBEQ0hFQ0soIWZyYW1lX3dpZGdldF8pOwotICBmcmFtZV93aWRnZXRfID0gZnJhbWVfd2lkZ2V0OworICAvLyBUaGUgcHJldmlvdXMgV2ViRnJhbWVXaWRnZXQgbXVzdCBhbHJlYWR5IGJlIGRldGFjaGVkIGJ5CisgIC8vIERldGFjaFdlYkZyYW1lV2lkZ2V0KCkuCisgIERDSEVDSyghcmVuZGVyX3dpZGdldF8tPkdldFdlYldpZGdldCgpKTsKKwogICByZW5kZXJfd2lkZ2V0Xy0+U2V0V2ViV2lkZ2V0SW50ZXJuYWwoZnJhbWVfd2lkZ2V0KTsKIAogICAvLyBJbml0aWFsaXphdGlvbiBmb3IgdGhlIFdlYkZyYW1lV2lkZ2V0IHRoYXQgc2hvdWxkIG9ubHkgb2NjdXIgZm9yIHRoZSBtYWluCkBAIC0xNTYzLDM5ICsxNTU2LDMyIEBACiB9CiAKIHZvaWQgUmVuZGVyVmlld0ltcGw6OkRldGFjaFdlYkZyYW1lV2lkZ2V0KCkgewotICBEQ0hFQ0soZnJhbWVfd2lkZ2V0Xyk7CisgIC8vIFRoZXJlIGlzIGEgV2ViRnJhbWVXaWRnZXQgcHJldmlvdXNseSBhdHRhY2hlZCBieSBBdHRhY2hXZWJGcmFtZVdpZGdldCgpLgorICBEQ0hFQ0socmVuZGVyX3dpZGdldF8tPkdldFdlYldpZGdldCgpKTsKIAogICBpZiAoZGVzdHJveWluZ18pIHsKICAgICAvLyBXZSBhcmUgaW5zaWRlIFJlbmRlclZpZXdJbXBsOjpEZXN0cm95KCkgYW5kIHRoZSBtYWluIGZyYW1lIGlzIGJlaW5nCiAgICAgLy8gZGV0YWNoZWQgYXMgcGFydCBvZiBzaHV0ZG93bi4gU28gd2UgY2FuIGRlc3Ryb3kgdGhlIFJlbmRlcldpZGdldC4KIAotICAgIC8vIFRoZSBSZW5kZXJXaWRnZXQgd2lsbCBiZSBjbG9zZWQsIGFuZCBpdCB3aWxsIGNsb3NlIHRoZSBXZWJXaWRnZXQgc3RvcmVkCi0gICAgLy8gaW4gfGZyYW1lX3dpZGdldF98LiBXZSBqdXN0IHdhbnQgdG8gZHJvcCByYXcgcG9pbnRlciBoZXJlLgotICAgIGZyYW1lX3dpZGdldF8gPSBudWxscHRyOwotICAgIGlmICh1bmRlYWRfcmVuZGVyX3dpZGdldF8pIHsKLSAgICAgIFJlbmRlcldpZGdldCogY2xvc2luZ193aWRnZXQgPSB1bmRlYWRfcmVuZGVyX3dpZGdldF8uZ2V0KCk7Ci0gICAgICBjbG9zaW5nX3dpZGdldC0+Q2xvc2VGb3JGcmFtZShzdGQ6Om1vdmUodW5kZWFkX3JlbmRlcl93aWRnZXRfKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFJlbmRlcldpZGdldCogY2xvc2luZ193aWRnZXQgPSByZW5kZXJfd2lkZ2V0Xy5nZXQoKTsKLSAgICAgIGNsb3Npbmdfd2lkZ2V0LT5DbG9zZUZvckZyYW1lKHN0ZDo6bW92ZShyZW5kZXJfd2lkZ2V0XykpOwotICAgIH0KKyAgICAvLyBXZSBwYXNzIG93bmVyc2hpcCBvZiB8cmVuZGVyX3dpZGdldF98IHRvIGl0c2VsZi4gR3JhYiBhIHJhdyBwb2ludGVyIHRvCisgICAgLy8gY2FsbCB0aGUgQ2xvc2UoKSBtZXRob2Qgb24gc28gd2UgZG9uJ3QgaGF2ZSB0byBiZSBhIEMrKyBleHBlcnQgdG8ga25vdworICAgIC8vIHdoZXRoZXIgd2Ugd2lsbCBlbmQgdXAgd2l0aCBhIG51bGxwdHIgd2hlcmUgd2UgZGlkbid0IGludGVuZCBkdWUgdG8gb3JkZXIKKyAgICAvLyBvZiBleGVjdXRpb24uCisgICAgUmVuZGVyV2lkZ2V0KiBjbG9zaW5nX3dpZGdldCA9IHJlbmRlcl93aWRnZXRfLmdldCgpOworICAgIGNsb3Npbmdfd2lkZ2V0LT5DbG9zZUZvckZyYW1lKHN0ZDo6bW92ZShyZW5kZXJfd2lkZ2V0XykpOwogICB9IGVsc2UgewogICAgIC8vIFdlIGFyZSBub3QgaW5zaWRlIFJlbmRlclZpZXdJbXBsOjpEZXN0cm95KCksIHRoZSBtYWluIGZyYW1lIGlzIGJlaW5nCiAgICAgLy8gZGV0YWNoZWQgYW5kIHJlcGxhY2VkIHdpdGggYSByZW1vdGUgZnJhbWUgcHJveHkuIFdlIGNhbid0IGNsb3NlIHRoZQogICAgIC8vIFJlbmRlcldpZGdldCwgYW5kIGl0IGlzIG1hcmtlZCB1bmRlYWQgaW5zdGVhZCwgYnV0IHdlIGRvIG5lZWQgdG8gY2xvc2UKICAgICAvLyB0aGUgV2ViRnJhbWVXaWRnZXQgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBSZW5kZXJXaWRnZXQuCi0KLSAgICBSZW5kZXJXaWRnZXQqIHJlbmRlcl93aWRnZXQgPSByZW5kZXJfd2lkZ2V0Xy5nZXQoKTsKLSAgICBpZiAoIXJlbmRlcl93aWRnZXQpCi0gICAgICByZW5kZXJfd2lkZ2V0ID0gdW5kZWFkX3JlbmRlcl93aWRnZXRfLmdldCgpOwotCi0gICAgRENIRUNLKHJlbmRlcl93aWRnZXQtPklzVW5kZWFkT3JQcm92aXNpb25hbCgpKTsKKyAgICByZW5kZXJfd2lkZ2V0Xy0+U2V0SXNVbmRlYWQodHJ1ZSk7CiAgICAgLy8gVGhlIFdlYldpZGdldCBuZWVkcyB0byBiZSBjbG9zZWQgZXZlbiB0aG91Z2ggdGhlIFJlbmRlcldpZGdldCB3b24ndCBiZQotICAgIC8vIGhlcmUgKHNpbmNlIGl0IGlzIG1hcmtlZCB1bmRlYWQgaW5zdGVhZCkuCi0gICAgZnJhbWVfd2lkZ2V0Xy0+Q2xvc2UoKTsKLSAgICBmcmFtZV93aWRnZXRfID0gbnVsbHB0cjsKKyAgICAvLyBjbG9zZWQgaGVyZSAoc2luY2UgaXQgaXMgbWFya2VkIHVuZGVhZCBpbnN0ZWFkKS4KKyAgICByZW5kZXJfd2lkZ2V0Xy0+R2V0V2ViV2lkZ2V0KCktPkNsb3NlKCk7CiAgICAgLy8gVGhpcyBqdXN0IGNsZWFycyB0aGUgd2Vid2lkZ2V0X2ludGVybmFsXyBtZW1iZXIgZnJvbSBSZW5kZXJXaWRnZXQuCi0gICAgcmVuZGVyX3dpZGdldC0+U2V0V2ViV2lkZ2V0SW50ZXJuYWwobnVsbHB0cik7CisgICAgcmVuZGVyX3dpZGdldF8tPlNldFdlYldpZGdldEludGVybmFsKG51bGxwdHIpOworCisgICAgdW5kZWFkX3JlbmRlcl93aWRnZXRfID0gc3RkOjptb3ZlKHJlbmRlcl93aWRnZXRfKTsKICAgfQogfQogCkBAIC0xODEyLDE2ICsxNzk4LDE0IEBACiAgIHJldHVybiB0cnVlOwogfQogCi0vLyBUT0RPKGh0dHBzOi8vY3JidWcuY29tLzEwMTA1MDkpOiBSZS1lbmFibGUgdGhpcyBpbiBDaHJvbWUgODAuCiAvLyBUT0RPKGh0dHBzOi8vY3JidWcuY29tLzkzNzU2OSk6IFJlbW92ZSB0aGlzIGluIENocm9tZSA4Mi4KIGJvb2wgUmVuZGVyVmlld0ltcGw6OkFsbG93UG9wdXBzRHVyaW5nUGFnZVVubG9hZCgpIHsKLSAgcmV0dXJuIHRydWU7Ci0jaWYgMAorICAvLyBUaGUgc3dpdGNoIHZlcnNpb24gaXMgZm9yIGVuYWJsaW5nIHZpYSBlbnRlcnByaXNlIHBvbGljeS4gVGhlIGZlYXR1cmUKKyAgLy8gdmVyc2lvbiBpcyBmb3IgZW5hYmxpbmcgdmlhIGFib3V0OmZsYWdzIGFuZCBGaW5jaCBwb2xpY3kuCiAgIGNvbnN0IGJhc2U6OkNvbW1hbmRMaW5lJiBjb21tYW5kX2xpbmUgPQogICAgICAgKmJhc2U6OkNvbW1hbmRMaW5lOjpGb3JDdXJyZW50UHJvY2VzcygpOwogICByZXR1cm4gY29tbWFuZF9saW5lLkhhc1N3aXRjaChzd2l0Y2hlczo6a0FsbG93UG9wdXBzRHVyaW5nUGFnZVVubG9hZCkgfHwKICAgICAgICAgIGJhc2U6OkZlYXR1cmVMaXN0OjpJc0VuYWJsZWQoZmVhdHVyZXM6OmtBbGxvd1BvcHVwc0R1cmluZ1BhZ2VVbmxvYWQpOwotI2VuZGlmCiB9CiAKIGJvb2wgUmVuZGVyVmlld0ltcGw6OkNhblVwZGF0ZUxheW91dCgpIHsKQEAgLTE4NjIsMzggKzE4NDYsMjYgQEAKIAogI2VuZGlmCiAKLXZvaWQgUmVuZGVyVmlld0ltcGw6OkNvbnZlcnRWaWV3cG9ydFRvV2luZG93VmlhV2lkZ2V0KGJsaW5rOjpXZWJSZWN0KiByZWN0KSB7Ci0gIHBhZ2VfcHJvcGVydGllc18uQ29udmVydFZpZXdwb3J0VG9XaW5kb3cocmVjdCk7Ci19Ci0KLWdmeDo6UmVjdEYgUmVuZGVyVmlld0ltcGw6OkVsZW1lbnRCb3VuZHNJbldpbmRvdygKLSAgICBjb25zdCBibGluazo6V2ViRWxlbWVudCYgZWxlbWVudCkgewotICBibGluazo6V2ViUmVjdCBib3VuZGluZ19ib3hfaW5fd2luZG93ID0gZWxlbWVudC5Cb3VuZHNJblZpZXdwb3J0KCk7Ci0gIHBhZ2VfcHJvcGVydGllc18uQ29udmVydFZpZXdwb3J0VG9XaW5kb3coJmJvdW5kaW5nX2JveF9pbl93aW5kb3cpOwotICByZXR1cm4gZ2Z4OjpSZWN0Rihib3VuZGluZ19ib3hfaW5fd2luZG93KTsKLX0KLQogdm9pZCBSZW5kZXJWaWV3SW1wbDo6VXBkYXRlUHJlZmVycmVkU2l6ZSgpIHsKICAgLy8gV2UgZG9uJ3QgYWx3YXlzIHdhbnQgdG8gc2VuZCB0aGUgY2hhbmdlIG1lc3NhZ2VzIG92ZXIgSVBDLCBvbmx5IGlmIHdlJ3ZlCiAgIC8vIGJlZW4gcHV0IGluIHRoYXQgbW9kZSBieSBnZXR0aW5nIGEgfFZpZXdNc2dfRW5hYmxlUHJlZmVycmVkU2l6ZUNoYW5nZWRNb2RlfAogICAvLyBtZXNzYWdlLgotICBpZiAoIXNlbmRfcHJlZmVycmVkX3NpemVfY2hhbmdlc18gfHwgIXdlYnZpZXcoKSkKKyAgaWYgKCFzZW5kX3ByZWZlcnJlZF9zaXplX2NoYW5nZXNfIHx8ICF3ZWJ2aWV3KCkgfHwgIW1haW5fcmVuZGVyX2ZyYW1lXykKICAgICByZXR1cm47CiAKICAgaWYgKCFuZWVkc19wcmVmZXJyZWRfc2l6ZV91cGRhdGVfKQogICAgIHJldHVybjsKICAgbmVlZHNfcHJlZmVycmVkX3NpemVfdXBkYXRlXyA9IGZhbHNlOwogCi0gIGJsaW5rOjpXZWJTaXplIHRtcF9zaXplID0gd2VidmlldygpLT5Db250ZW50c1ByZWZlcnJlZE1pbmltdW1TaXplKCk7Ci0gIGJsaW5rOjpXZWJSZWN0IHRtcF9yZWN0KDAsIDAsIHRtcF9zaXplLndpZHRoLCB0bXBfc2l6ZS5oZWlnaHQpOwotICBwYWdlX3Byb3BlcnRpZXNfLkNvbnZlcnRWaWV3cG9ydFRvV2luZG93KCZ0bXBfcmVjdCk7Ci0gIGdmeDo6U2l6ZSBzaXplKHRtcF9yZWN0LndpZHRoLCB0bXBfcmVjdC5oZWlnaHQpOwotICBpZiAoc2l6ZSA9PSBwcmVmZXJyZWRfc2l6ZV8pCi0gICAgcmV0dXJuOworICBibGluazo6V2ViU2l6ZSB3ZWJfc2l6ZSA9IHdlYnZpZXcoKS0+Q29udGVudHNQcmVmZXJyZWRNaW5pbXVtU2l6ZSgpOworICBibGluazo6V2ViUmVjdCB3ZWJfcmVjdCgwLCAwLCB3ZWJfc2l6ZS53aWR0aCwgd2ViX3NpemUuaGVpZ2h0KTsKKyAgcmVuZGVyX3dpZGdldF8tPkNvbnZlcnRWaWV3cG9ydFRvV2luZG93KCZ3ZWJfcmVjdCk7CisgIGdmeDo6U2l6ZSBzaXplKHdlYl9yZWN0LndpZHRoLCB3ZWJfcmVjdC5oZWlnaHQpOwogCi0gIHByZWZlcnJlZF9zaXplXyA9IHNpemU7Ci0gIFNlbmQobmV3IFZpZXdIb3N0TXNnX0RpZENvbnRlbnRzUHJlZmVycmVkU2l6ZUNoYW5nZShHZXRSb3V0aW5nSUQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZlcnJlZF9zaXplXykpOworICBpZiAoc2l6ZSAhPSBwcmVmZXJyZWRfc2l6ZV8pIHsKKyAgICBwcmVmZXJyZWRfc2l6ZV8gPSBzaXplOworICAgIFNlbmQobmV3IFZpZXdIb3N0TXNnX0RpZENvbnRlbnRzUHJlZmVycmVkU2l6ZUNoYW5nZShHZXRSb3V0aW5nSUQoKSwgc2l6ZSkpOworICB9CiB9CiAKIGJsaW5rOjpXZWJTdHJpbmcgUmVuZGVyVmlld0ltcGw6OkFjY2VwdExhbmd1YWdlcygpIHsKQEAgLTE5NTcsMTEgKzE5MjksNiBAQAogICAvLyBkb2VzIG5vdCBjaGFuZ2Ugd2hlbiB0ZXN0cyBvdmVycmlkZSB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgUGFnZS4KIH0KIAotdm9pZCBSZW5kZXJWaWV3SW1wbDo6TWFrZU1haW5GcmFtZVJlbmRlcldpZGdldFVuZGVhZCgpIHsKLSAgcmVuZGVyX3dpZGdldF8tPlNldElzVW5kZWFkKHRydWUpOwotICB1bmRlYWRfcmVuZGVyX3dpZGdldF8gPSBzdGQ6Om1vdmUocmVuZGVyX3dpZGdldF8pOwotfQotCiB2b2lkIFJlbmRlclZpZXdJbXBsOjpSZXZpdmVVbmRlYWRNYWluRnJhbWVSZW5kZXJXaWRnZXQoKSB7CiAgIHJlbmRlcl93aWRnZXRfID0gc3RkOjptb3ZlKHVuZGVhZF9yZW5kZXJfd2lkZ2V0Xyk7CiAgIHJlbmRlcl93aWRnZXRfLT5TZXRJc1VuZGVhZChmYWxzZSk7CmRpZmYgLS1naXQgYS9jb250ZW50L3JlbmRlcmVyL3JlbmRlcl92aWV3X2ltcGwuaCBiL2NvbnRlbnQvcmVuZGVyZXIvcmVuZGVyX3ZpZXdfaW1wbC5oCmluZGV4IGEyYzdhODMxLi5lMzlmOWYzYiAxMDA2NDQKLS0tIGEvY29udGVudC9yZW5kZXJlci9yZW5kZXJfdmlld19pbXBsLmgKKysrIGIvY29udGVudC9yZW5kZXJlci9yZW5kZXJfdmlld19pbXBsLmgKQEAgLTQ5LDcgKzQ5LDYgQEAKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvd2ViL3dlYl9heF9vYmplY3QuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvd2ViL3dlYl9jb25zb2xlX21lc3NhZ2UuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvd2ViL3dlYl9lbGVtZW50LmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcHVibGljL3dlYi93ZWJfZnJhbWVfd2lkZ2V0LmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcHVibGljL3dlYi93ZWJfaGlzdG9yeV9pdGVtLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcHVibGljL3dlYi93ZWJfbmF2aWdhdGlvbl90eXBlLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcHVibGljL3dlYi93ZWJfbm9kZS5oIgpAQCAtNjEsNiArNjAsNyBAQAogI2luY2x1ZGUgInVpL3N1cmZhY2UvdHJhbnNwb3J0X2RpYi5oIgogCiBuYW1lc3BhY2UgYmxpbmsgeworY2xhc3MgV2ViRnJhbWVXaWRnZXQ7CiBjbGFzcyBXZWJVUkxSZXF1ZXN0Owogc3RydWN0IFBsdWdpbkFjdGlvbjsKIHN0cnVjdCBXZWJXaW5kb3dGZWF0dXJlczsKQEAgLTMwMyw4ICszMDMsNiBAQAogI2lmIGRlZmluZWQoT1NfQU5EUk9JRCkgfHwgZGVmaW5lZChPU19DSFJPTUVPUykKICAgdmlydHVhbCB2b2lkIGRpZFNjcm9sbFdpdGhLZXlib2FyZChjb25zdCBibGluazo6V2ViU2l6ZSYgZGVsdGEpOwogI2VuZGlmCi0gIHZvaWQgQ29udmVydFZpZXdwb3J0VG9XaW5kb3dWaWFXaWRnZXQoYmxpbms6OldlYlJlY3QqIHJlY3QpIG92ZXJyaWRlOwotICBnZng6OlJlY3RGIEVsZW1lbnRCb3VuZHNJbldpbmRvdyhjb25zdCBibGluazo6V2ViRWxlbWVudCYgZWxlbWVudCkgb3ZlcnJpZGU7CiAKICAgLy8gUGxlYXNlIGRvIG5vdCBhZGQgeW91ciBzdHVmZiByYW5kb21seSB0byB0aGUgZW5kIGhlcmUuIElmIHRoZXJlIGlzIGFuCiAgIC8vIGFwcHJvcHJpYXRlIHNlY3Rpb24sIGFkZCBpdCB0aGVyZS4gSWYgbm90LCB0aGVyZSBhcmUgc29tZSByYW5kb20gZnVuY3Rpb25zCkBAIC0zMjgsMTAgKzMyNiw4IEBACiAgIC8vIGJlIGFibGUgdG8gc3BlY2lmeSB8aW5pdGlhbF9zZXR0aW5nfCB3aGVyZSBJUEMgaGFuZGxlcnMgZG8gbm90LgogICB2b2lkIEFwcGx5UGFnZUhpZGRlbihib29sIGhpZGRlbiwgYm9vbCBpbml0aWFsX3NldHRpbmcpOwogCi0gIC8vIFRoZXNlIGZ1bmN0aW9ucyB0YWtlIHRoZSBtYWluIGZyYW1lJ3MgUmVuZGVyV2lkZ2V0IGFuZCB0byBtYWtlIGl0Ci0gIC8vIGluYWNjZXNzaWJsZSBmb3Igb3V0LW9mLXByb2Nlc3MgbWFpbiBmcmFtZXMgYW5kIHRoZW4gYnJpbmdzIGl0IGJhY2sKLSAgLy8gaWYgdGhlIG1haW4gZnJhbWUgY29tZXMgYmFjayBpbnRvIHRoZSBjdXJyZW50IHByb2Nlc3MuCi0gIHZvaWQgTWFrZU1haW5GcmFtZVJlbmRlcldpZGdldFVuZGVhZCgpOworICAvLyBJbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IFJlbmRlcldpZGdldCwgdGhpcyByZXZpdmVzIHRoZSB1bmRlYWQKKyAgLy8gUmVuZGVyV2lkZ2V0IGZvciB1c2Ugd2l0aCBhIG5ldyBsb2NhbCBtYWluIGZyYW1lLgogICB2b2lkIFJldml2ZVVuZGVhZE1haW5GcmFtZVJlbmRlcldpZGdldCgpOwogCiAgcHJpdmF0ZToKQEAgLTY4OSwxMCArNjg1LDYgQEAKIAogICBSZW5kZXJGcmFtZUltcGwqIG1haW5fcmVuZGVyX2ZyYW1lXyA9IG51bGxwdHI7CiAKLSAgLy8gTm90ZTogUmVuZGVyVmlld0ltcGwgaXMgcHVsbGluZyBkb3VibGUgZHV0eTogaXQncyB0aGUgUmVuZGVyV2lkZ2V0IGZvciB0aGUKLSAgLy8gInZpZXciLCBidXQgaXQncyBhbHNvIHRoZSBSZW5kZXJXaWRnZXQgZm9yIHRoZSBtYWluIGZyYW1lLgotICBibGluazo6V2ViRnJhbWVXaWRnZXQqIGZyYW1lX3dpZGdldF8gPSBudWxscHRyOwotCiAjaWYgZGVmaW5lZChPU19BTkRST0lEKQogICAvLyBBbmRyb2lkIFNwZWNpZmljIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApkaWZmIC0tZ2l0IGEvY29udGVudC9yZW5kZXJlci9yZW5kZXJfd2lkZ2V0LmNjIGIvY29udGVudC9yZW5kZXJlci9yZW5kZXJfd2lkZ2V0LmNjCmluZGV4IDE0MTQxODkuLmEzZWRhM2YgMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvcmVuZGVyZXIvcmVuZGVyX3dpZGdldC5jYworKysgYi9jb250ZW50L3JlbmRlcmVyL3JlbmRlcl93aWRnZXQuY2MKQEAgLTUxNiw5ICs1MTYsOCBAQAogICBJbml0KHN0ZDo6bW92ZShzaG93X2NhbGxiYWNrKSwgd2ViX3dpZGdldCk7CiB9CiAKLXZvaWQgUmVuZGVyV2lkZ2V0OjpJbml0Rm9yTWFpbkZyYW1lKFNob3dDYWxsYmFjayBzaG93X2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxpbms6OldlYkZyYW1lV2lkZ2V0KiB3ZWJfZnJhbWVfd2lkZ2V0KSB7Ci0gIEluaXQoc3RkOjptb3ZlKHNob3dfY2FsbGJhY2spLCB3ZWJfZnJhbWVfd2lkZ2V0KTsKK3ZvaWQgUmVuZGVyV2lkZ2V0OjpJbml0Rm9yTWFpbkZyYW1lKFNob3dDYWxsYmFjayBzaG93X2NhbGxiYWNrKSB7CisgIEluaXQoc3RkOjptb3ZlKHNob3dfY2FsbGJhY2spLCAvKndlYl9mcmFtZV93aWRnZXQ9Ki9udWxscHRyKTsKIH0KIAogdm9pZCBSZW5kZXJXaWRnZXQ6OkluaXRGb3JDaGlsZExvY2FsUm9vdCgKQEAgLTUzOCw4ICs1MzcsNiBAQAogICBEQ0hFQ0soIXdlYndpZGdldF8pOwogICBEQ0hFQ0tfTkUocm91dGluZ19pZF8sIE1TR19ST1VUSU5HX05PTkUpOwogCi0gIFJlbmRlclRocmVhZEltcGwqIHJlbmRlcl90aHJlYWRfaW1wbCA9IFJlbmRlclRocmVhZEltcGw6OmN1cnJlbnQoKTsKLQogICBpbnB1dF9oYW5kbGVyXyA9IHN0ZDo6bWFrZV91bmlxdWU8UmVuZGVyV2lkZ2V0SW5wdXRIYW5kbGVyPih0aGlzLCB0aGlzKTsKIAogICBMYXllclRyZWVWaWV3KiBsYXllcl90cmVlX3ZpZXcgPSBJbml0aWFsaXplTGF5ZXJUcmVlVmlldygpOwpAQCAtNTUwLDkgKzU0Nyw5IEBACiAgIGlmICh3ZWJfd2lkZ2V0KQogICAgIHdlYl93aWRnZXQtPlNldEFuaW1hdGlvbkhvc3QobGF5ZXJfdHJlZV92aWV3LT5hbmltYXRpb25faG9zdCgpKTsKIAotICBibGluazo6c2NoZWR1bGVyOjpXZWJUaHJlYWRTY2hlZHVsZXIqIG1haW5fdGhyZWFkX3NjaGVkdWxlciA9IG51bGxwdHI7Ci0gIGlmIChyZW5kZXJfdGhyZWFkX2ltcGwpCi0gICAgbWFpbl90aHJlYWRfc2NoZWR1bGVyID0gcmVuZGVyX3RocmVhZF9pbXBsLT5HZXRXZWJNYWluVGhyZWFkU2NoZWR1bGVyKCk7CisgIGJsaW5rOjpzY2hlZHVsZXI6OldlYlRocmVhZFNjaGVkdWxlciogbWFpbl90aHJlYWRfc2NoZWR1bGVyID0KKyAgICAgIGNvbXBvc2l0b3JfZGVwc18tPkdldFdlYk1haW5UaHJlYWRTY2hlZHVsZXIoKTsKKwogICBibGluazo6c2NoZWR1bGVyOjpXZWJUaHJlYWRTY2hlZHVsZXIqIGNvbXBvc2l0b3JfdGhyZWFkX3NjaGVkdWxlciA9CiAgICAgICBibGluazo6c2NoZWR1bGVyOjpXZWJUaHJlYWRTY2hlZHVsZXI6OkNvbXBvc2l0b3JUaHJlYWRTY2hlZHVsZXIoKTsKICAgc2NvcGVkX3JlZnB0cjxiYXNlOjpTaW5nbGVUaHJlYWRUYXNrUnVubmVyPiBjb21wb3NpdG9yX2lucHV0X3Rhc2tfcnVubmVyOwpAQCAtNTY0LDYgKzU2MSwxMCBAQAogICAgICAgICBjb21wb3NpdG9yX3RocmVhZF9zY2hlZHVsZXItPklucHV0VGFza1J1bm5lcigpOwogICB9CiAKKyAgaW5wdXRfZXZlbnRfcXVldWVfID0gYmFzZTo6TWFrZVJlZkNvdW50ZWQ8TWFpblRocmVhZEV2ZW50UXVldWU+KAorICAgICAgdGhpcywgbWFpbl90aHJlYWRfc2NoZWR1bGVyLT5JbnB1dFRhc2tSdW5uZXIoKSwgbWFpbl90aHJlYWRfc2NoZWR1bGVyLAorICAgICAgLyphbGxvd19yYWZfYWxpZ25lZF9pbnB1dD0qLyFjb21wb3NpdG9yX25ldmVyX3Zpc2libGVfKTsKKwogICAvLyBXZSBvbmx5IHVzZSBhbiBleHRlcm5hbCBpbnB1dCBoYW5kbGVyIGZvciBmcmFtZSBSZW5kZXJXaWRnZXRzIGJlY2F1c2Ugb25seQogICAvLyBmcmFtZXMgdXNlIHRoZSBjb21wb3NpdG9yIGZvciBpbnB1dCBoYW5kbGluZy4gT3RoZXIga2luZHMgb2YgUmVuZGVyV2lkZ2V0cwogICAvLyAoZS5nLiAgcG9wdXBzLCBwbHVnaW5zKSBtdXN0IGZvcndhcmQgdGhlaXIgaW5wdXQgZGlyZWN0bHkgdGhyb3VnaApAQCAtMTIzNyw3ICsxMjM4LDcgQEAKICAgLy8gc2luZ2xlLXRocmVhZCBtb2RlIGZvciB0ZXN0aW5nLgogICBib29sIHJlY29yZF9tYWluX2ZyYW1lX21ldHJpY3MgPQogICAgICAgISFjb21wb3NpdG9yX2RlcHNfLT5HZXRDb21wb3NpdG9ySW1wbFRocmVhZFRhc2tSdW5uZXIoKTsKLSAgaWYgKGlucHV0X2V2ZW50X3F1ZXVlXykgeworICB7CiAgICAgYmFzZTo6T3B0aW9uYWw8U2NvcGVkVWttUmFmQWxpZ25lZElucHV0VGltZXI+IHVrbV90aW1lcjsKICAgICBpZiAocmVjb3JkX21haW5fZnJhbWVfbWV0cmljcykgewogICAgICAgdWttX3RpbWVyLmVtcGxhY2UoR2V0V2ViV2lkZ2V0KCkpOwpAQCAtMTk2OCwxNiArMTk2OSw2IEBACiAgIGlmICghaXNfaGlkZGVuXyAmJiAhaXNfdW5kZWFkXykKICAgICBTdGFydFN0b3BDb21wb3NpdG9yKCk7CiAKLSAgRENIRUNLX05FKE1TR19ST1VUSU5HX05PTkUsIHJvdXRpbmdfaWRfKTsKLQotICBSZW5kZXJUaHJlYWRJbXBsKiByZW5kZXJfdGhyZWFkID0gUmVuZGVyVGhyZWFkSW1wbDo6Y3VycmVudCgpOwotICBpZiAocmVuZGVyX3RocmVhZCkgewotICAgIGlucHV0X2V2ZW50X3F1ZXVlXyA9IGJhc2U6Ok1ha2VSZWZDb3VudGVkPE1haW5UaHJlYWRFdmVudFF1ZXVlPigKLSAgICAgICAgdGhpcywgcmVuZGVyX3RocmVhZC0+R2V0V2ViTWFpblRocmVhZFNjaGVkdWxlcigpLT5JbnB1dFRhc2tSdW5uZXIoKSwKLSAgICAgICAgcmVuZGVyX3RocmVhZC0+R2V0V2ViTWFpblRocmVhZFNjaGVkdWxlcigpLAotICAgICAgICAvKmFsbG93X3JhZl9hbGlnbmVkX2lucHV0PSovIWNvbXBvc2l0b3JfbmV2ZXJfdmlzaWJsZV8pOwotICB9Ci0KICAgcmV0dXJuIGxheWVyX3RyZWVfdmlld18uZ2V0KCk7CiB9CiAKQEAgLTIwNjMsOCArMjA1NCw3IEBACiAKICAgLy8gU3RvcCBoYW5kbGluZyBtYWluIHRocmVhZCBpbnB1dCBldmVudHMgaW1tZWRpYXRlbHkgc28gd2UgZG9uJ3QgaGF2ZSB0aGVtCiAgIC8vIHJ1bm5pbmcgd2hpbGUgdGhpbmdzIGFyZSBwYXJ0bHkgc2h1dCBkb3duLgotICBpZiAoaW5wdXRfZXZlbnRfcXVldWVfKQotICAgIGlucHV0X2V2ZW50X3F1ZXVlXy0+Q2xlYXJDbGllbnQoKTsKKyAgaW5wdXRfZXZlbnRfcXVldWVfLT5DbGVhckNsaWVudCgpOwogCiAgIC8vIFRoZSB8d2Vid2lkZ2V0X3wgd2lsbCBiZSBudWxsIHdoZW4gdGhlIG1haW4gZnJhbWUgUmVuZGVyV2lkZ2V0IGlzIHVuZGVhZC4KICAgaWYgKHdlYndpZGdldF8pCkBAIC0yNTk0LDE1ICsyNTg0LDM0IEBACiB9CiAKIHZvaWQgUmVuZGVyV2lkZ2V0OjpDb252ZXJ0Vmlld3BvcnRUb1dpbmRvdyhibGluazo6V2ViUmVjdCogcmVjdCkgewotICByZXR1cm4gcGFnZV9wcm9wZXJ0aWVzXy0+Q29udmVydFZpZXdwb3J0VG9XaW5kb3cocmVjdCk7CisgIGlmIChjb21wb3NpdG9yX2RlcHNfLT5Jc1VzZVpvb21Gb3JEU0ZFbmFibGVkKCkpIHsKKyAgICBmbG9hdCByZXZlcnNlID0gMSAvIEdldE9yaWdpbmFsU2NyZWVuSW5mbygpLmRldmljZV9zY2FsZV9mYWN0b3I7CisgICAgLy8gVE9ETyhvc2hpbWEpOiBXZSBtYXkgbmVlZCB0byBhbGxvdyBwaXhlbCBwcmVjaXNpb24gaGVyZSBhcyB0aGUgdGhlCisgICAgLy8gYW5jaG9yIGVsZW1lbnQgY2FuIGJlIHBsYWNlZCBhdCBoYWxmIHBpeGVsLgorICAgIGdmeDo6UmVjdCB3aW5kb3dfcmVjdCA9IGdmeDo6U2NhbGVUb0VuY2xvc2VkUmVjdChnZng6OlJlY3QoKnJlY3QpLCByZXZlcnNlKTsKKyAgICByZWN0LT54ID0gd2luZG93X3JlY3QueCgpOworICAgIHJlY3QtPnkgPSB3aW5kb3dfcmVjdC55KCk7CisgICAgcmVjdC0+d2lkdGggPSB3aW5kb3dfcmVjdC53aWR0aCgpOworICAgIHJlY3QtPmhlaWdodCA9IHdpbmRvd19yZWN0LmhlaWdodCgpOworICB9CiB9CiAKIHZvaWQgUmVuZGVyV2lkZ2V0OjpDb252ZXJ0Vmlld3BvcnRUb1dpbmRvdyhibGluazo6V2ViRmxvYXRSZWN0KiByZWN0KSB7Ci0gIHJldHVybiBwYWdlX3Byb3BlcnRpZXNfLT5Db252ZXJ0Vmlld3BvcnRUb1dpbmRvdyhyZWN0KTsKKyAgaWYgKGNvbXBvc2l0b3JfZGVwc18tPklzVXNlWm9vbUZvckRTRkVuYWJsZWQoKSkgeworICAgIHJlY3QtPnggLz0gR2V0T3JpZ2luYWxTY3JlZW5JbmZvKCkuZGV2aWNlX3NjYWxlX2ZhY3RvcjsKKyAgICByZWN0LT55IC89IEdldE9yaWdpbmFsU2NyZWVuSW5mbygpLmRldmljZV9zY2FsZV9mYWN0b3I7CisgICAgcmVjdC0+d2lkdGggLz0gR2V0T3JpZ2luYWxTY3JlZW5JbmZvKCkuZGV2aWNlX3NjYWxlX2ZhY3RvcjsKKyAgICByZWN0LT5oZWlnaHQgLz0gR2V0T3JpZ2luYWxTY3JlZW5JbmZvKCkuZGV2aWNlX3NjYWxlX2ZhY3RvcjsKKyAgfQogfQogCiB2b2lkIFJlbmRlcldpZGdldDo6Q29udmVydFdpbmRvd1RvVmlld3BvcnQoYmxpbms6OldlYkZsb2F0UmVjdCogcmVjdCkgewotICByZXR1cm4gcGFnZV9wcm9wZXJ0aWVzXy0+Q29udmVydFdpbmRvd1RvVmlld3BvcnQocmVjdCk7CisgIGlmIChjb21wb3NpdG9yX2RlcHNfLT5Jc1VzZVpvb21Gb3JEU0ZFbmFibGVkKCkpIHsKKyAgICByZWN0LT54ICo9IEdldE9yaWdpbmFsU2NyZWVuSW5mbygpLmRldmljZV9zY2FsZV9mYWN0b3I7CisgICAgcmVjdC0+eSAqPSBHZXRPcmlnaW5hbFNjcmVlbkluZm8oKS5kZXZpY2Vfc2NhbGVfZmFjdG9yOworICAgIHJlY3QtPndpZHRoICo9IEdldE9yaWdpbmFsU2NyZWVuSW5mbygpLmRldmljZV9zY2FsZV9mYWN0b3I7CisgICAgcmVjdC0+aGVpZ2h0ICo9IEdldE9yaWdpbmFsU2NyZWVuSW5mbygpLmRldmljZV9zY2FsZV9mYWN0b3I7CisgIH0KIH0KIAogdm9pZCBSZW5kZXJXaWRnZXQ6Ok9uUmVxdWVzdFRleHRJbnB1dFN0YXRlVXBkYXRlKCkgewpAQCAtMzM3NSw4ICszMzg0LDcgQEAKIH0KIAogdm9pZCBSZW5kZXJXaWRnZXQ6OlNldEhhc1BvaW50ZXJSYXdVcGRhdGVFdmVudEhhbmRsZXJzKGJvb2wgaGFzX2hhbmRsZXJzKSB7Ci0gIGlmIChpbnB1dF9ldmVudF9xdWV1ZV8pCi0gICAgaW5wdXRfZXZlbnRfcXVldWVfLT5IYXNQb2ludGVyUmF3VXBkYXRlRXZlbnRIYW5kbGVycyhoYXNfaGFuZGxlcnMpOworICBpbnB1dF9ldmVudF9xdWV1ZV8tPkhhc1BvaW50ZXJSYXdVcGRhdGVFdmVudEhhbmRsZXJzKGhhc19oYW5kbGVycyk7CiB9CiAKIHZvaWQgUmVuZGVyV2lkZ2V0OjpTZXRIYXNUb3VjaEV2ZW50SGFuZGxlcnMoYm9vbCBoYXNfaGFuZGxlcnMpIHsKQEAgLTMzOTQsMTMgKzM0MDIsMTEgQEAKIH0KIAogdm9pZCBSZW5kZXJXaWRnZXQ6OlNldE5lZWRzTG93TGF0ZW5jeUlucHV0KGJvb2wgbmVlZHNfbG93X2xhdGVuY3kpIHsKLSAgaWYgKGlucHV0X2V2ZW50X3F1ZXVlXykKLSAgICBpbnB1dF9ldmVudF9xdWV1ZV8tPlNldE5lZWRzTG93TGF0ZW5jeShuZWVkc19sb3dfbGF0ZW5jeSk7CisgIGlucHV0X2V2ZW50X3F1ZXVlXy0+U2V0TmVlZHNMb3dMYXRlbmN5KG5lZWRzX2xvd19sYXRlbmN5KTsKIH0KIAogdm9pZCBSZW5kZXJXaWRnZXQ6OlNldE5lZWRzVW5idWZmZXJlZElucHV0Rm9yRGVidWdnZXIoYm9vbCB1bmJ1ZmZlcmVkKSB7Ci0gIGlmIChpbnB1dF9ldmVudF9xdWV1ZV8pCi0gICAgaW5wdXRfZXZlbnRfcXVldWVfLT5TZXROZWVkc1VuYnVmZmVyZWRJbnB1dEZvckRlYnVnZ2VyKHVuYnVmZmVyZWQpOworICBpbnB1dF9ldmVudF9xdWV1ZV8tPlNldE5lZWRzVW5idWZmZXJlZElucHV0Rm9yRGVidWdnZXIodW5idWZmZXJlZCk7CiB9CiAKIHZvaWQgUmVuZGVyV2lkZ2V0OjpBbmltYXRlRG91YmxlVGFwWm9vbUluTWFpbkZyYW1lKApAQCAtMzY3NSw4ICszNjgxLDcgQEAKIH0KIAogdm9pZCBSZW5kZXJXaWRnZXQ6OlJlcXVlc3RVbmJ1ZmZlcmVkSW5wdXRFdmVudHMoKSB7Ci0gIGlmIChpbnB1dF9ldmVudF9xdWV1ZV8pCi0gICAgaW5wdXRfZXZlbnRfcXVldWVfLT5SZXF1ZXN0VW5idWZmZXJlZElucHV0RXZlbnRzKCk7CisgIGlucHV0X2V2ZW50X3F1ZXVlXy0+UmVxdWVzdFVuYnVmZmVyZWRJbnB1dEV2ZW50cygpOwogfQogCiB2b2lkIFJlbmRlcldpZGdldDo6U2V0VG91Y2hBY3Rpb24oY2M6OlRvdWNoQWN0aW9uIHRvdWNoX2FjdGlvbikgewpAQCAtMzcyNSw3ICszNzMwLDkgQEAKIH0KIAogY29uc3QgU2NyZWVuSW5mbyYgUmVuZGVyV2lkZ2V0OjpHZXRPcmlnaW5hbFNjcmVlbkluZm8oKSBjb25zdCB7Ci0gIHJldHVybiBwYWdlX3Byb3BlcnRpZXNfLT5HZXRPcmlnaW5hbFNjcmVlbkluZm8oKTsKKyAgaWYgKHBhZ2VfcHJvcGVydGllc18tPlNjcmVlbk1ldHJpY3NFbXVsYXRvcigpKQorICAgIHJldHVybiBwYWdlX3Byb3BlcnRpZXNfLT5TY3JlZW5NZXRyaWNzRW11bGF0b3IoKS0+b3JpZ2luYWxfc2NyZWVuX2luZm8oKTsKKyAgcmV0dXJuIHBhZ2VfcHJvcGVydGllc18tPkdldFNjcmVlbkluZm8oKTsKIH0KIAogZ2Z4OjpQb2ludEYgUmVuZGVyV2lkZ2V0OjpDb252ZXJ0V2luZG93UG9pbnRUb1ZpZXdwb3J0KApkaWZmIC0tZ2l0IGEvY29udGVudC9yZW5kZXJlci9yZW5kZXJfd2lkZ2V0LmggYi9jb250ZW50L3JlbmRlcmVyL3JlbmRlcl93aWRnZXQuaAppbmRleCAxM2NmZDFlYi4uYmU1OTU1ZjAgMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvcmVuZGVyZXIvcmVuZGVyX3dpZGdldC5oCisrKyBiL2NvbnRlbnQvcmVuZGVyZXIvcmVuZGVyX3dpZGdldC5oCkBAIC0yMzksOSArMjM5LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxpbms6OldlYldpZGdldCogd2ViX3dpZGdldCk7CiAKICAgLy8gSW5pdGlhbGl6ZSBhIG5ldyBSZW5kZXJXaWRnZXQgdGhhdCB3aWxsIGJlIGF0dGFjaGVkIHRvIGEgUmVuZGVyRnJhbWUgKHZpYQotICAvLyB0aGUgV2ViRnJhbWVXaWRnZXQpLCBmb3IgYSBmcmFtZSB0aGF0IGlzIGEgbWFpbiBmcmFtZS4KLSAgdm9pZCBJbml0Rm9yTWFpbkZyYW1lKFNob3dDYWxsYmFjayBzaG93X2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgYmxpbms6OldlYkZyYW1lV2lkZ2V0KiB3ZWJfZnJhbWVfd2lkZ2V0KTsKKyAgLy8gdGhlIFdlYkZyYW1lV2lkZ2V0KSwgZm9yIGEgZnJhbWUgdGhhdCBpcyBhIG1haW4gZnJhbWUuIEF0IHRoZSB0aW1lIG9mCisgIC8vIGluaXRpYWxpemF0aW9uLCB0aGUgV2ViV2lkZ2V0IGlzIG5vdCBhbHdheXMgYXZhaWxhYmxlLCBhbmQgaXQgd2lsbCBiZSBzZXQKKyAgLy8gb25jZSB0aGUgbWFpbiBmcmFtZSBpcyBhdHRhY2hlZC4KKyAgdm9pZCBJbml0Rm9yTWFpbkZyYW1lKFNob3dDYWxsYmFjayBzaG93X2NhbGxiYWNrKTsKIAogICAvLyBJbml0aWFsaXplIGEgbmV3IFJlbmRlcldpZGdldCB0aGF0IHdpbGwgYmUgYXR0YWNoZWQgdG8gYSBSZW5kZXJGcmFtZSAodmlhCiAgIC8vIHRoZSBXZWJGcmFtZVdpZGdldCksIGZvciBhIGZyYW1lIHRoYXQgaXMgYSBsb2NhbCByb290LCBidXQgbm90IHRoZSBtYWluCmRpZmYgLS1naXQgYS9jb250ZW50L3JlbmRlcmVyL3JlbmRlcl93aWRnZXRfdW5pdHRlc3QuY2MgYi9jb250ZW50L3JlbmRlcmVyL3JlbmRlcl93aWRnZXRfdW5pdHRlc3QuY2MKaW5kZXggODdlM2RjMS4uN2U5N2IwOTMgMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvcmVuZGVyZXIvcmVuZGVyX3dpZGdldF91bml0dGVzdC5jYworKysgYi9jb250ZW50L3JlbmRlcmVyL3JlbmRlcl93aWRnZXRfdW5pdHRlc3QuY2MKQEAgLTI5OCw2ICsyOTgsOCBAQAogICB3aWRnZXQoKS0+RGlkQ2hhbmdlQ3Vyc29yKGN1cnNvcl9pbmZvKTsKICAgRVhQRUNUX0VRKHdpZGdldCgpLT5zaW5rKCktPm1lc3NhZ2VfY291bnQoKSwgMFUpOwogCisgIEVYUEVDVF9DQUxMKCp3aWRnZXQoKS0+bW9ja193ZWJ3aWRnZXQoKSwgSGFuZGxlSW5wdXRFdmVudChfKSkKKyAgICAgIC5XaWxsT25jZSg6OnRlc3Rpbmc6OlJldHVybihibGluazo6V2ViSW5wdXRFdmVudFJlc3VsdDo6a05vdEhhbmRsZWQpKTsKICAgd2lkZ2V0KCktPlNlbmRJbnB1dEV2ZW50KFN5bnRoZXRpY1dlYk1vdXNlRXZlbnRCdWlsZGVyOjpCdWlsZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGluazo6V2ViSW5wdXRFdmVudDo6VHlwZTo6a01vdXNlTGVhdmUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlZEV2ZW50Q2FsbGJhY2soKSk7CmRpZmYgLS1naXQgYS9jb250ZW50L3JlbmRlcmVyL3NlcnZpY2Vfd29ya2VyL2VtYmVkZGVkX3dvcmtlcl9pbnN0YW5jZV9jbGllbnRfaW1wbC5jYyBiL2NvbnRlbnQvcmVuZGVyZXIvc2VydmljZV93b3JrZXIvZW1iZWRkZWRfd29ya2VyX2luc3RhbmNlX2NsaWVudF9pbXBsLmNjCmluZGV4IDBhNjM1OWQxLi5hY2JiN2NlIDEwMDY0NAotLS0gYS9jb250ZW50L3JlbmRlcmVyL3NlcnZpY2Vfd29ya2VyL2VtYmVkZGVkX3dvcmtlcl9pbnN0YW5jZV9jbGllbnRfaW1wbC5jYworKysgYi9jb250ZW50L3JlbmRlcmVyL3NlcnZpY2Vfd29ya2VyL2VtYmVkZGVkX3dvcmtlcl9pbnN0YW5jZV9jbGllbnRfaW1wbC5jYwpAQCAtMTc1LDYgKzE3NSwxNiBAQAogICAgICAgICAgID8gYmxpbms6OldlYkVtYmVkZGVkV29ya2VyU3RhcnREYXRhOjprV2FpdEZvckRlYnVnZ2VyCiAgICAgICAgICAgOiBibGluazo6V2ViRW1iZWRkZWRXb3JrZXJTdGFydERhdGE6OmtEb250V2FpdEZvckRlYnVnZ2VyOwogICBzdGFydF9kYXRhLT5kZXZ0b29sc193b3JrZXJfdG9rZW4gPSBwYXJhbXMuZGV2dG9vbHNfd29ya2VyX3Rva2VuOworCisgIC8vIFRPRE8oYmFzaGkpOiBDb25zaWRlciB0byBoYXZlIGEgaGVscGVyIGZ1bmN0aW9uIHRvIGNvbnZlcnQKKyAgLy8gbW9qb206OkZldGNoQ2xpZW50U2V0dGluZ3NPYmplY3QgdG8gV2ViRmV0Y2hDbGllbnRTZXR0aW5nc09iamVjdC4KKyAgc3RhcnRfZGF0YS0+b3V0c2lkZV9mZXRjaF9jbGllbnRfc2V0dGluZ3Nfb2JqZWN0LnJlZmVycmVyX3BvbGljeSA9CisgICAgICBwYXJhbXMub3V0c2lkZV9mZXRjaF9jbGllbnRfc2V0dGluZ3Nfb2JqZWN0LT5yZWZlcnJlcl9wb2xpY3k7CisgIHN0YXJ0X2RhdGEtPm91dHNpZGVfZmV0Y2hfY2xpZW50X3NldHRpbmdzX29iamVjdC5vdXRnb2luZ19yZWZlcnJlciA9CisgICAgICBwYXJhbXMub3V0c2lkZV9mZXRjaF9jbGllbnRfc2V0dGluZ3Nfb2JqZWN0LT5vdXRnb2luZ19yZWZlcnJlcjsKKyAgc3RhcnRfZGF0YS0+b3V0c2lkZV9mZXRjaF9jbGllbnRfc2V0dGluZ3Nfb2JqZWN0Lmluc2VjdXJlX3JlcXVlc3RzX3BvbGljeSA9CisgICAgICBwYXJhbXMub3V0c2lkZV9mZXRjaF9jbGllbnRfc2V0dGluZ3Nfb2JqZWN0LT5pbnNlY3VyZV9yZXF1ZXN0c19wb2xpY3k7CisKICAgcmV0dXJuIHN0YXJ0X2RhdGE7CiB9CiAKZGlmZiAtLWdpdCBhL2NvbnRlbnQvcmVuZGVyZXIvdGV4dF9pbnB1dF9jbGllbnRfb2JzZXJ2ZXIuY2MgYi9jb250ZW50L3JlbmRlcmVyL3RleHRfaW5wdXRfY2xpZW50X29ic2VydmVyLmNjCmluZGV4IDcxMjc2ZjYuLmNjYzllZDUgMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvcmVuZGVyZXIvdGV4dF9pbnB1dF9jbGllbnRfb2JzZXJ2ZXIuY2MKKysrIGIvY29udGVudC9yZW5kZXJlci90ZXh0X2lucHV0X2NsaWVudF9vYnNlcnZlci5jYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYy9wbGF0Zm9ybS93ZWJfcmVjdC5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYy9wbGF0Zm9ybS93ZWJfc3RyaW5nLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcHVibGljL3dlYi9tYWMvd2ViX3N1YnN0cmluZ191dGlsLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcHVibGljL3dlYi93ZWJfZnJhbWVfd2lkZ2V0LmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcHVibGljL3dlYi93ZWJfbG9jYWxfZnJhbWUuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvd2ViL3dlYl92aWV3LmgiCiAjaW5jbHVkZSAidWkvZ2Z4L2dlb21ldHJ5L3JlY3QuaCIKZGlmZiAtLWdpdCBhL2NvbnRlbnQvcmVuZGVyZXIvd29ya2VyL2RlZGljYXRlZF93b3JrZXJfaG9zdF9mYWN0b3J5X2NsaWVudC5jYyBiL2NvbnRlbnQvcmVuZGVyZXIvd29ya2VyL2RlZGljYXRlZF93b3JrZXJfaG9zdF9mYWN0b3J5X2NsaWVudC5jYwppbmRleCBmODBmZTQ3Li45NGNhY2M5MCAxMDA2NDQKLS0tIGEvY29udGVudC9yZW5kZXJlci93b3JrZXIvZGVkaWNhdGVkX3dvcmtlcl9ob3N0X2ZhY3RvcnlfY2xpZW50LmNjCisrKyBiL2NvbnRlbnQvcmVuZGVyZXIvd29ya2VyL2RlZGljYXRlZF93b3JrZXJfaG9zdF9mYWN0b3J5X2NsaWVudC5jYwpAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlICJjb250ZW50L3JlbmRlcmVyL2xvYWRlci9uYXZpZ2F0aW9uX3Jlc3BvbnNlX292ZXJyaWRlX3BhcmFtZXRlcnMuaCIKICNpbmNsdWRlICJjb250ZW50L3JlbmRlcmVyL2xvYWRlci93ZWJfd29ya2VyX2ZldGNoX2NvbnRleHRfaW1wbC5oIgogI2luY2x1ZGUgImNvbnRlbnQvcmVuZGVyZXIvc2VydmljZV93b3JrZXIvc2VydmljZV93b3JrZXJfcHJvdmlkZXJfY29udGV4dC5oIgorI2luY2x1ZGUgImNvbnRlbnQvcmVuZGVyZXIvd29ya2VyL2ZldGNoX2NsaWVudF9zZXR0aW5nc19vYmplY3RfaGVscGVycy5oIgogI2luY2x1ZGUgIm1vam8vcHVibGljL2NwcC9iaW5kaW5ncy9wZW5kaW5nX3JlbW90ZS5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYy9jb21tb24vZmVhdHVyZXMuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvbW9qb20vYmxvYi9ibG9iX3VybF9zdG9yZS5tb2pvbS5oIgpAQCAtNTUsMjAgKzU2LDkgQEAKICAgICBtb2pvOjpTY29wZWRNZXNzYWdlUGlwZUhhbmRsZSBibG9iX3VybF90b2tlbikgewogICBEQ0hFQ0soYmFzZTo6RmVhdHVyZUxpc3Q6OklzRW5hYmxlZChibGluazo6ZmVhdHVyZXM6OmtQbHpEZWRpY2F0ZWRXb3JrZXIpKTsKIAotICAvLyBUT0RPKGJhc2hpKTogQ3JlYXRlIGEgaGVscGVyIGZ1bmN0aW9uIHRoYXQgY29udmVydHMKLSAgLy8gV2ViRmV0Y2hDbGllbnRTZXR0aW5nc09iamVjdCB0byBtb2pvbTo6RmV0Y2hDbGllbnRTZXR0aW5nc09iamVjdC4KLSAgYXV0byBvdXRzaWRlX2ZldGNoX2NsaWVudF9zZXR0aW5nc19vYmplY3QgPQotICAgICAgYmxpbms6Om1vam9tOjpGZXRjaENsaWVudFNldHRpbmdzT2JqZWN0OjpOZXcoKTsKLSAgb3V0c2lkZV9mZXRjaF9jbGllbnRfc2V0dGluZ3Nfb2JqZWN0LT5yZWZlcnJlcl9wb2xpY3kgPQotICAgICAgZmV0Y2hfY2xpZW50X3NldHRpbmdzX29iamVjdC5yZWZlcnJlcl9wb2xpY3k7Ci0gIG91dHNpZGVfZmV0Y2hfY2xpZW50X3NldHRpbmdzX29iamVjdC0+b3V0Z29pbmdfcmVmZXJyZXIgPQotICAgICAgZmV0Y2hfY2xpZW50X3NldHRpbmdzX29iamVjdC5vdXRnb2luZ19yZWZlcnJlcjsKLSAgb3V0c2lkZV9mZXRjaF9jbGllbnRfc2V0dGluZ3Nfb2JqZWN0LT5pbnNlY3VyZV9yZXF1ZXN0c19wb2xpY3kgPQotICAgICAgZmV0Y2hfY2xpZW50X3NldHRpbmdzX29iamVjdC5pbnNlY3VyZV9yZXF1ZXN0c19wb2xpY3k7Ci0KICAgZmFjdG9yeV8tPkNyZWF0ZVdvcmtlckhvc3RBbmRTdGFydFNjcmlwdExvYWQoCiAgICAgICBzY3JpcHRfdXJsLCBzY3JpcHRfb3JpZ2luLCBjcmVkZW50aWFsc19tb2RlLAotICAgICAgc3RkOjptb3ZlKG91dHNpZGVfZmV0Y2hfY2xpZW50X3NldHRpbmdzX29iamVjdCksCisgICAgICBGZXRjaENsaWVudFNldHRpbmdzT2JqZWN0RnJvbVdlYlRvTW9qb20oZmV0Y2hfY2xpZW50X3NldHRpbmdzX29iamVjdCksCiAgICAgICBtb2pvOjpQZW5kaW5nUmVtb3RlPGJsaW5rOjptb2pvbTo6QmxvYlVSTFRva2VuPigKICAgICAgICAgICBzdGQ6Om1vdmUoYmxvYl91cmxfdG9rZW4pLCBibGluazo6bW9qb206OkJsb2JVUkxUb2tlbjo6VmVyc2lvbl8pLAogICAgICAgcmVjZWl2ZXJfLkJpbmROZXdQaXBlQW5kUGFzc1JlbW90ZSgpLApkaWZmIC0tZ2l0IGEvY29udGVudC9yZW5kZXJlci93b3JrZXIvZmV0Y2hfY2xpZW50X3NldHRpbmdzX29iamVjdF9oZWxwZXJzLmNjIGIvY29udGVudC9yZW5kZXJlci93b3JrZXIvZmV0Y2hfY2xpZW50X3NldHRpbmdzX29iamVjdF9oZWxwZXJzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNDIyZDIyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGVudC9yZW5kZXJlci93b3JrZXIvZmV0Y2hfY2xpZW50X3NldHRpbmdzX29iamVjdF9oZWxwZXJzLmNjCkBAIC0wLDAgKzEsMjAgQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgImNvbnRlbnQvcmVuZGVyZXIvd29ya2VyL2ZldGNoX2NsaWVudF9zZXR0aW5nc19vYmplY3RfaGVscGVycy5oIgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcHVibGljL3BsYXRmb3JtL3dlYl9mZXRjaF9jbGllbnRfc2V0dGluZ3Nfb2JqZWN0LmgiCisKK25hbWVzcGFjZSBjb250ZW50IHsKKworYmxpbms6Om1vam9tOjpGZXRjaENsaWVudFNldHRpbmdzT2JqZWN0UHRyCitGZXRjaENsaWVudFNldHRpbmdzT2JqZWN0RnJvbVdlYlRvTW9qb20oCisgICAgY29uc3QgYmxpbms6OldlYkZldGNoQ2xpZW50U2V0dGluZ3NPYmplY3QmIHdlYl9zZXR0aW5nc19vYmplY3QpIHsKKyAgcmV0dXJuIGJsaW5rOjptb2pvbTo6RmV0Y2hDbGllbnRTZXR0aW5nc09iamVjdDo6TmV3KAorICAgICAgd2ViX3NldHRpbmdzX29iamVjdC5yZWZlcnJlcl9wb2xpY3ksCisgICAgICB3ZWJfc2V0dGluZ3Nfb2JqZWN0Lm91dGdvaW5nX3JlZmVycmVyLAorICAgICAgd2ViX3NldHRpbmdzX29iamVjdC5pbnNlY3VyZV9yZXF1ZXN0c19wb2xpY3kpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY29udGVudApkaWZmIC0tZ2l0IGEvY29udGVudC9yZW5kZXJlci93b3JrZXIvZmV0Y2hfY2xpZW50X3NldHRpbmdzX29iamVjdF9oZWxwZXJzLmggYi9jb250ZW50L3JlbmRlcmVyL3dvcmtlci9mZXRjaF9jbGllbnRfc2V0dGluZ3Nfb2JqZWN0X2hlbHBlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmE1MDVkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGVudC9yZW5kZXJlci93b3JrZXIvZmV0Y2hfY2xpZW50X3NldHRpbmdzX29iamVjdF9oZWxwZXJzLmgKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTkgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaWZuZGVmIENPTlRFTlRfUkVOREVSRVJfV09SS0VSX0ZFVENIX0NMSUVOVF9TRVRUSU5HU19PQkpFQ1RfSEVMUEVSU19IXworI2RlZmluZSBDT05URU5UX1JFTkRFUkVSX1dPUktFUl9GRVRDSF9DTElFTlRfU0VUVElOR1NfT0JKRUNUX0hFTFBFUlNfSF8KKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYy9tb2pvbS9sb2FkZXIvZmV0Y2hfY2xpZW50X3NldHRpbmdzX29iamVjdC5tb2pvbS5oIgorCituYW1lc3BhY2UgYmxpbmsgeworc3RydWN0IFdlYkZldGNoQ2xpZW50U2V0dGluZ3NPYmplY3Q7Cit9ICAvLyBuYW1lc3BhY2UgYmxpbmsKKworbmFtZXNwYWNlIGNvbnRlbnQgeworCisvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBjb252ZXJ0aW5nIEZldGNoQ2xpZW50U2V0dGluZ3NPYmplY3QgdmFyaWFudHMuCisvLyBUT0RPKGJhc2hpKTogUmVtb3ZlIHRoZXNlIGhlbHBlcnMgd2hlbiB0aGUgT25pb24gU291cCBpcyBkb25lLgorCitibGluazo6bW9qb206OkZldGNoQ2xpZW50U2V0dGluZ3NPYmplY3RQdHIKK0ZldGNoQ2xpZW50U2V0dGluZ3NPYmplY3RGcm9tV2ViVG9Nb2pvbSgKKyAgICBjb25zdCBibGluazo6V2ViRmV0Y2hDbGllbnRTZXR0aW5nc09iamVjdCYgd2ViX3NldHRpbmdzX29iamVjdCk7CisKK30gIC8vIG5hbWVzcGFjZSBjb250ZW50CisKKyNlbmRpZiAgLy8gQ09OVEVOVF9SRU5ERVJFUl9XT1JLRVJfRkVUQ0hfQ0xJRU5UX1NFVFRJTkdTX09CSkVDVF9IRUxQRVJTX0hfCmRpZmYgLS1naXQgYS9jb250ZW50L3NoZWxsL2Jyb3dzZXIvc2hlbGxfZGV2dG9vbHNfYmluZGluZ3MuY2MgYi9jb250ZW50L3NoZWxsL2Jyb3dzZXIvc2hlbGxfZGV2dG9vbHNfYmluZGluZ3MuY2MKaW5kZXggZDg0MTA1Ny4uMmVlMzIzMiAxMDA2NDQKLS0tIGEvY29udGVudC9zaGVsbC9icm93c2VyL3NoZWxsX2RldnRvb2xzX2JpbmRpbmdzLmNjCisrKyBiL2NvbnRlbnQvc2hlbGwvYnJvd3Nlci9zaGVsbF9kZXZ0b29sc19iaW5kaW5ncy5jYwpAQCAtNTUsOSArNTUsMTcgQEAKIH0KIAogc3RkOjp1bmlxdWVfcHRyPGJhc2U6OkRpY3Rpb25hcnlWYWx1ZT4gQnVpbGRPYmplY3RGb3JSZXNwb25zZSgKLSAgICBjb25zdCBuZXQ6Okh0dHBSZXNwb25zZUhlYWRlcnMqIHJoKSB7CisgICAgY29uc3QgbmV0OjpIdHRwUmVzcG9uc2VIZWFkZXJzKiByaCwKKyAgICBib29sIHN1Y2Nlc3MpIHsKICAgYXV0byByZXNwb25zZSA9IHN0ZDo6bWFrZV91bmlxdWU8YmFzZTo6RGljdGlvbmFyeVZhbHVlPigpOwotICByZXNwb25zZS0+U2V0SW50ZWdlcigic3RhdHVzQ29kZSIsIHJoID8gcmgtPnJlc3BvbnNlX2NvZGUoKSA6IDIwMCk7CisgIGludCByZXNwb25zZUNvZGUgPSAyMDA7CisgIGlmIChyaCkgeworICAgIHJlc3BvbnNlQ29kZSA9IHJoLT5yZXNwb25zZV9jb2RlKCk7CisgIH0gZWxzZSBpZiAoIXN1Y2Nlc3MpIHsKKyAgICAvLyBJbiBjYXNlIG9mIG5vIGhlYWRlcnMsIGFzc3VtZSBmaWxlOi8vIFVSTCBhbmQgZmFpbGVkIHRvIGxvYWQKKyAgICByZXNwb25zZUNvZGUgPSA0MDQ7CisgIH0KKyAgcmVzcG9uc2UtPlNldEludGVnZXIoInN0YXR1c0NvZGUiLCByZXNwb25zZUNvZGUpOwogCiAgIGF1dG8gaGVhZGVycyA9IHN0ZDo6bWFrZV91bmlxdWU8YmFzZTo6RGljdGlvbmFyeVZhbHVlPigpOwogICBzaXplX3QgaXRlcmF0b3IgPSAwOwpAQCAtMTE4LDcgKzEyNiw3IEBACiAgIH0KIAogICB2b2lkIE9uQ29tcGxldGUoYm9vbCBzdWNjZXNzKSBvdmVycmlkZSB7Ci0gICAgYXV0byByZXNwb25zZSA9IEJ1aWxkT2JqZWN0Rm9yUmVzcG9uc2UocmVzcG9uc2VfaGVhZGVyc18uZ2V0KCkpOworICAgIGF1dG8gcmVzcG9uc2UgPSBCdWlsZE9iamVjdEZvclJlc3BvbnNlKHJlc3BvbnNlX2hlYWRlcnNfLmdldCgpLCBzdWNjZXNzKTsKICAgICBiaW5kaW5nc18tPlNlbmRNZXNzYWdlQWNrKHJlcXVlc3RfaWRfLCByZXNwb25zZS5nZXQoKSk7CiAgICAgYmluZGluZ3NfLT5sb2FkZXJzXy5lcmFzZShiaW5kaW5nc18tPmxvYWRlcnNfLmZpbmQodGhpcykpOwogICB9CmRpZmYgLS1naXQgYS9jb250ZW50L3NoZWxsL3JlbmRlcmVyL3dlYl90ZXN0L2JsaW5rX3Rlc3RfcnVubmVyLmNjIGIvY29udGVudC9zaGVsbC9yZW5kZXJlci93ZWJfdGVzdC9ibGlua190ZXN0X3J1bm5lci5jYwppbmRleCBiNmUwNTJjLi5jMTM0YmJhIDEwMDY0NAotLS0gYS9jb250ZW50L3NoZWxsL3JlbmRlcmVyL3dlYl90ZXN0L2JsaW5rX3Rlc3RfcnVubmVyLmNjCisrKyBiL2NvbnRlbnQvc2hlbGwvcmVuZGVyZXIvd2ViX3Rlc3QvYmxpbmtfdGVzdF9ydW5uZXIuY2MKQEAgLTMyNywxMCArMzI3LDYgQEAKICAgY29udGVudDo6U2V0RGV2aWNlU2NhbGVGYWN0b3IocmVuZGVyX3ZpZXcoKSwgZmFjdG9yKTsKIH0KIAotZmxvYXQgQmxpbmtUZXN0UnVubmVyOjpHZXRXaW5kb3dUb1ZpZXdwb3J0U2NhbGUoKSB7Ci0gIHJldHVybiBjb250ZW50OjpHZXRXaW5kb3dUb1ZpZXdwb3J0U2NhbGUocmVuZGVyX3ZpZXcoKSk7Ci19Ci0KIHN0ZDo6dW5pcXVlX3B0cjxibGluazo6V2ViSW5wdXRFdmVudD4KIEJsaW5rVGVzdFJ1bm5lcjo6VHJhbnNmb3JtU2NyZWVuVG9XaWRnZXRDb29yZGluYXRlcygKICAgICB0ZXN0X3J1bm5lcjo6V2ViV2lkZ2V0VGVzdFByb3h5KiB3ZWJfd2lkZ2V0X3Rlc3RfcHJveHksCmRpZmYgLS1naXQgYS9jb250ZW50L3NoZWxsL3JlbmRlcmVyL3dlYl90ZXN0L2JsaW5rX3Rlc3RfcnVubmVyLmggYi9jb250ZW50L3NoZWxsL3JlbmRlcmVyL3dlYl90ZXN0L2JsaW5rX3Rlc3RfcnVubmVyLmgKaW5kZXggMGE2NTRjMC4uZmVlYWZmMSAxMDA2NDQKLS0tIGEvY29udGVudC9zaGVsbC9yZW5kZXJlci93ZWJfdGVzdC9ibGlua190ZXN0X3J1bm5lci5oCisrKyBiL2NvbnRlbnQvc2hlbGwvcmVuZGVyZXIvd2ViX3Rlc3QvYmxpbmtfdGVzdF9ydW5uZXIuaApAQCAtOTEsNyArOTEsNiBAQAogICB2b2lkIFNpbXVsYXRlV2ViQ29udGVudEluZGV4RGVsZXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCkgb3ZlcnJpZGU7CiAgIHZvaWQgU2V0RGV2aWNlU2NhbGVGYWN0b3IoZmxvYXQgZmFjdG9yKSBvdmVycmlkZTsKICAgdm9pZCBTZXREZXZpY2VDb2xvclNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSBvdmVycmlkZTsKLSAgZmxvYXQgR2V0V2luZG93VG9WaWV3cG9ydFNjYWxlKCkgb3ZlcnJpZGU7CiAgIHN0ZDo6dW5pcXVlX3B0cjxibGluazo6V2ViSW5wdXRFdmVudD4gVHJhbnNmb3JtU2NyZWVuVG9XaWRnZXRDb29yZGluYXRlcygKICAgICAgIHRlc3RfcnVubmVyOjpXZWJXaWRnZXRUZXN0UHJveHkqIHdlYl93aWRnZXRfdGVzdF9wcm94eSwKICAgICAgIGNvbnN0IGJsaW5rOjpXZWJJbnB1dEV2ZW50JiBldmVudCkgb3ZlcnJpZGU7CmRpZmYgLS1naXQgYS9jb250ZW50L3NoZWxsL3Rlc3RfcnVubmVyL2V2ZW50X3NlbmRlci5jYyBiL2NvbnRlbnQvc2hlbGwvdGVzdF9ydW5uZXIvZXZlbnRfc2VuZGVyLmNjCmluZGV4IDEyMTE4ODcuLjA1M2QyYTI5IDEwMDY0NAotLS0gYS9jb250ZW50L3NoZWxsL3Rlc3RfcnVubmVyL2V2ZW50X3NlbmRlci5jYworKysgYi9jb250ZW50L3NoZWxsL3Rlc3RfcnVubmVyL2V2ZW50X3NlbmRlci5jYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgIm5ldC9iYXNlL2ZpbGVuYW1lX3V0aWwuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvcGxhdGZvcm0vdXJsX2NvbnZlcnNpb24uaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvcGxhdGZvcm0vd2ViX2NvYWxlc2NlZF9pbnB1dF9ldmVudC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYy9wbGF0Zm9ybS93ZWJfZmxvYXRfcmVjdC5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYy9wbGF0Zm9ybS93ZWJfZ2VzdHVyZV9ldmVudC5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYy9wbGF0Zm9ybS93ZWJfa2V5Ym9hcmRfZXZlbnQuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvcGxhdGZvcm0vd2ViX3BvaW50ZXJfcHJvcGVydGllcy5oIgpAQCAtMjAwOSwxMiArMjAxMCwxOSBAQAogCiAgIGNvbnN0IFdlYlBvaW50JiBsYXN0X3BvcyA9CiAgICAgICBjdXJyZW50X3BvaW50ZXJfc3RhdGVfW2tSYXdNb3VzZVBvaW50ZXJJZF0ubGFzdF9wb3NfOwotICBmbG9hdCBzY2FsZSA9IGRlbGVnYXRlKCktPkdldFdpbmRvd1RvVmlld3BvcnRTY2FsZSgpOwotICBXZWJGbG9hdFBvaW50IHNjYWxlZF9sYXN0X3BvcyhsYXN0X3Bvcy54ICogc2NhbGUsIGxhc3RfcG9zLnkgKiBzY2FsZSk7CisKKyAgLy8gQ29tcHV0ZSB0aGUgc2NhbGUgZnJvbSB3aW5kb3cgKGRzZi1pbmRlcGVuZGVudCkgdG8gYmxpbmsgKGRzZi1kZXBlbmRlbnQKKyAgLy8gdW5kZXIgVXNlWm9vbUZvckRTRikuCisgIGJsaW5rOjpXZWJGbG9hdFJlY3QgcmVjdCgwLCAwLCAxLjBmLCAwLjApOworICB3ZWJfd2lkZ2V0X3Rlc3RfcHJveHlfLT5Db252ZXJ0V2luZG93VG9WaWV3cG9ydCgmcmVjdCk7CisgIGZsb2F0IHNjYWxlX3RvX2JsaW5rX2Nvb3JkcyA9IHJlY3Qud2lkdGg7CisKKyAgV2ViRmxvYXRQb2ludCBsYXN0X3Bvc19mb3JfYmxpbmsobGFzdF9wb3MueCAqIHNjYWxlX3RvX2JsaW5rX2Nvb3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9wb3MueSAqIHNjYWxlX3RvX2JsaW5rX2Nvb3Jkcyk7CiAKICAgLy8gUHJvdmlkZSBhIGRyYWcgc291cmNlLgotICBtYWluRnJhbWVXaWRnZXQoKS0+RHJhZ1RhcmdldERyYWdFbnRlcihjdXJyZW50X2RyYWdfZGF0YV8sIHNjYWxlZF9sYXN0X3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVkX2xhc3RfcG9zLAorICBtYWluRnJhbWVXaWRnZXQoKS0+RHJhZ1RhcmdldERyYWdFbnRlcihjdXJyZW50X2RyYWdfZGF0YV8sIGxhc3RfcG9zX2Zvcl9ibGluaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9wb3NfZm9yX2JsaW5rLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2RyYWdfZWZmZWN0c19hbGxvd2VkXywgMCk7CiAgIC8vIHxpc19kcmFnX21vZGVffCBzYXZlcyBldmVudHMgYW5kIHRoZW4gcmVwbGF5cyB0aGVtIGxhdGVyLiBXZSBkb24ndAogICAvLyBuZWVkL3dhbnQgdGhhdC4KQEAgLTI3NjUsMTAgKzI3NzMsMTYgQEAKIAogICBXZWJQYWdlUG9wdXAqIHBvcHVwID0gdmlldygpLT5HZXRQYWdlUG9wdXAoKTsKICAgaWYgKHBvcHVwICYmICFXZWJJbnB1dEV2ZW50OjpJc0tleWJvYXJkRXZlbnRUeXBlKHJhd19ldmVudC5HZXRUeXBlKCkpKSB7CisgICAgLy8gQ29tcHV0ZSB0aGUgc2NhbGUgZnJvbSB3aW5kb3cgKGRzZi1pbmRlcGVuZGVudCkgdG8gYmxpbmsgKGRzZi1kZXBlbmRlbnQKKyAgICAvLyB1bmRlciBVc2Vab29tRm9yRFNGKS4KKyAgICBibGluazo6V2ViRmxvYXRSZWN0IHJlY3QoMCwgMCwgMS4wZiwgMC4wKTsKKyAgICB3ZWJfd2lkZ2V0X3Rlc3RfcHJveHlfLT5Db252ZXJ0V2luZG93VG9WaWV3cG9ydCgmcmVjdCk7CisgICAgZmxvYXQgc2NhbGVfdG9fYmxpbmtfY29vcmRzID0gcmVjdC53aWR0aDsKKwogICAgIC8vIHVpOjpTY2FsZVdlYklucHV0RXZlbnQgcmV0dXJucyBudWxscHRyIHdoZW4gdGhlIHNjYWxlIGlzIDEuMGYgYXMgdGhlCiAgICAgLy8gZXZlbnQgZG9lcyBub3QgaGF2ZSB0byBiZSBjb252ZXJ0ZWQuCi0gICAgc3RkOjp1bmlxdWVfcHRyPFdlYklucHV0RXZlbnQ+IHNjYWxlZF9ldmVudCA9IHVpOjpTY2FsZVdlYklucHV0RXZlbnQoCi0gICAgICAgIHJhd19ldmVudCwgZGVsZWdhdGUoKS0+R2V0V2luZG93VG9WaWV3cG9ydFNjYWxlKCkpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxXZWJJbnB1dEV2ZW50PiBzY2FsZWRfZXZlbnQgPQorICAgICAgICB1aTo6U2NhbGVXZWJJbnB1dEV2ZW50KHJhd19ldmVudCwgc2NhbGVfdG9fYmxpbmtfY29vcmRzKTsKICAgICBjb25zdCBXZWJJbnB1dEV2ZW50KiBwb3B1cF9mcmllbmRseV9ldmVudCA9CiAgICAgICAgIHNjYWxlZF9ldmVudC5nZXQoKSA/IHNjYWxlZF9ldmVudC5nZXQoKSA6ICZyYXdfZXZlbnQ7CiAgICAgcmV0dXJuIHBvcHVwLT5IYW5kbGVJbnB1dEV2ZW50KApkaWZmIC0tZ2l0IGEvY29udGVudC9zaGVsbC90ZXN0X3J1bm5lci93ZWJfdGVzdF9kZWxlZ2F0ZS5oIGIvY29udGVudC9zaGVsbC90ZXN0X3J1bm5lci93ZWJfdGVzdF9kZWxlZ2F0ZS5oCmluZGV4IDViNDFhZGUuLmQ4NDk0MzIgMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvc2hlbGwvdGVzdF9ydW5uZXIvd2ViX3Rlc3RfZGVsZWdhdGUuaAorKysgYi9jb250ZW50L3NoZWxsL3Rlc3RfcnVubmVyL3dlYl90ZXN0X2RlbGVnYXRlLmgKQEAgLTEyOSwxMSArMTI5LDYgQEAKICAgLy8gQ29udHJvbHMgdGhlIGRldmljZSBzY2FsZSBmYWN0b3Igb2YgdGhlIG1haW4gV2ViVmlldyBmb3IgaGlkcGkgdGVzdHMuCiAgIHZpcnR1YWwgdm9pZCBTZXREZXZpY2VTY2FsZUZhY3RvcihmbG9hdCBmYWN0b3IpID0gMDsKIAotICAvLyBXaGVuIHVzZS16b29tLWZvci1kc2YgbW9kZSBpcyBlbmFibGVkLCB0aGlzIHJldHVybnMgdGhlIHNjYWxlIHRvCi0gIC8vIGNvbnZlcnQgZnJvbSB3aW5kb3cgY29vcmRpbmF0ZXMgdG8gdmlld3BvcnQgY29vcmRpbmF0ZXMuIFdoZW4KLSAgLy8gdXNlLXpvb20tZm9yLWRzZiBpcyBkaXNhYmxlZCwgdGhpcyByZXR1cm4gYWx3YXlzIDEuMGYuCi0gIHZpcnR1YWwgZmxvYXQgR2V0V2luZG93VG9WaWV3cG9ydFNjYWxlKCkgPSAwOwotCiAgIC8vIENvbnZlcnRzIHxldmVudHwgZnJvbSBzY3JlZW4gY29vcmRpbmF0ZXMgdXNlZCBieSB0ZXN0X3J1bm5lcjo6RXZlbnRTZW5kZXIKICAgLy8gaW50byBjb29yZGluYXRlcyB0aGF0IGFyZSB1bmRlcnN0b29kIGJ5IHRoZSB3aWRnZXQgYXNzb2NpYXRlZCB3aXRoCiAgIC8vIHx3ZWJfd2lkZ2V0X3Rlc3RfcHJveHl8LiAgUmV0dXJucyBudWxscHRyIGlmIG5vIHRyYW5zZm9ybWF0aW9uIHdhcwpkaWZmIC0tZ2l0IGEvY29udGVudC9zaGVsbC90ZXN0X3J1bm5lci93ZWJfd2lkZ2V0X3Rlc3RfcHJveHkuY2MgYi9jb250ZW50L3NoZWxsL3Rlc3RfcnVubmVyL3dlYl93aWRnZXRfdGVzdF9wcm94eS5jYwppbmRleCA1M2EyZGY3Li4zZGI1OTQzIDEwMDY0NAotLS0gYS9jb250ZW50L3NoZWxsL3Rlc3RfcnVubmVyL3dlYl93aWRnZXRfdGVzdF9wcm94eS5jYworKysgYi9jb250ZW50L3NoZWxsL3Rlc3RfcnVubmVyL3dlYl93aWRnZXRfdGVzdF9wcm94eS5jYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgImNvbnRlbnQvc2hlbGwvdGVzdF9ydW5uZXIvd2ViX3Rlc3RfZGVsZWdhdGUuaCIKICNpbmNsdWRlICJjb250ZW50L3NoZWxsL3Rlc3RfcnVubmVyL3dlYl90ZXN0X2ludGVyZmFjZXMuaCIKICNpbmNsdWRlICJjb250ZW50L3NoZWxsL3Rlc3RfcnVubmVyL3dlYl92aWV3X3Rlc3RfcHJveHkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvd2ViL3dlYl9mcmFtZV93aWRnZXQuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvd2ViL3dlYl9sb2NhbF9mcmFtZS5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYy93ZWIvd2ViX3BhZ2VfcG9wdXAuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvd2ViL3dlYl92aWV3LmgiCmRpZmYgLS1naXQgYS9jb250ZW50L3Rlc3QvQlVJTEQuZ24gYi9jb250ZW50L3Rlc3QvQlVJTEQuZ24KaW5kZXggZWZmNjlkOC4uNDI5NDQ5MWEgMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvdGVzdC9CVUlMRC5nbgorKysgYi9jb250ZW50L3Rlc3QvQlVJTEQuZ24KQEAgLTI1Nyw4ICsyNTcsNiBAQAogICAgICJkd3JpdGVfZm9udF9mYWtlX3NlbmRlcl93aW4uaCIsCiAgICAgImZha2VfY29tcG9zaXRvcl9kZXBlbmRlbmNpZXMuY2MiLAogICAgICJmYWtlX2NvbXBvc2l0b3JfZGVwZW5kZW5jaWVzLmgiLAotICAgICJmYWtlX2xldmVsZGJfZGF0YWJhc2UuY2MiLAotICAgICJmYWtlX2xldmVsZGJfZGF0YWJhc2UuaCIsCiAgICAgImZha2VfbW9qb19tZXNzYWdlX2Rpc3BhdGNoX2NvbnRleHQuaCIsCiAgICAgImZha2VfbmV0d29yay5jYyIsCiAgICAgImZha2VfbmV0d29yay5oIiwKQEAgLTE2MTAsOCArMTYwOCw2IEBACiAgICAgIi4uL2Jyb3dzZXIvZG9tX3N0b3JhZ2Uvc2Vzc2lvbl9zdG9yYWdlX21ldGFkYXRhX3VuaXR0ZXN0LmNjIiwKICAgICAiLi4vYnJvd3Nlci9kb21fc3RvcmFnZS9zZXNzaW9uX3N0b3JhZ2VfbmFtZXNwYWNlX2ltcGxfbW9qb191bml0dGVzdC5jYyIsCiAgICAgIi4uL2Jyb3dzZXIvZG9tX3N0b3JhZ2Uvc3RvcmFnZV9hcmVhX2ltcGxfdW5pdHRlc3QuY2MiLAotICAgICIuLi9icm93c2VyL2RvbV9zdG9yYWdlL3Rlc3QvZmFrZV9sZXZlbGRiX2RhdGFiYXNlX2Vycm9yX29uX3dyaXRlLmNjIiwKLSAgICAiLi4vYnJvd3Nlci9kb21fc3RvcmFnZS90ZXN0L2Zha2VfbGV2ZWxkYl9kYXRhYmFzZV9lcnJvcl9vbl93cml0ZS5oIiwKICAgICAiLi4vYnJvd3Nlci9kb21fc3RvcmFnZS90ZXN0L3N0b3JhZ2VfYXJlYV90ZXN0X3V0aWwuY2MiLAogICAgICIuLi9icm93c2VyL2RvbV9zdG9yYWdlL3Rlc3Qvc3RvcmFnZV9hcmVhX3Rlc3RfdXRpbC5oIiwKICAgICAiLi4vYnJvd3Nlci9kb3dubG9hZC9kb3dubG9hZF9tYW5hZ2VyX2ltcGxfdW5pdHRlc3QuY2MiLApkaWZmIC0tZ2l0IGEvY29udGVudC90ZXN0L2RhdGEvYWNjZXNzaWJpbGl0eS9odG1sL3RhYmxlLWxheW91dC1leHBlY3RlZC11aWEtd2luLnR4dCBiL2NvbnRlbnQvdGVzdC9kYXRhL2FjY2Vzc2liaWxpdHkvaHRtbC90YWJsZS1sYXlvdXQtZXhwZWN0ZWQtdWlhLXdpbi50eHQKaW5kZXggOGUxMzk2Zi4uYTNmMjc5ZCAxMDA2NDQKLS0tIGEvY29udGVudC90ZXN0L2RhdGEvYWNjZXNzaWJpbGl0eS9odG1sL3RhYmxlLWxheW91dC1leHBlY3RlZC11aWEtd2luLnR4dAorKysgYi9jb250ZW50L3Rlc3QvZGF0YS9hY2Nlc3NpYmlsaXR5L2h0bWwvdGFibGUtbGF5b3V0LWV4cGVjdGVkLXVpYS13aW4udHh0CkBAIC0xLDIzICsxLDIzIEBACiBkb2N1bWVudCBOYW1lPSdUYWJsZSBleGFtcGxlICMyJwotKytncmlkIEdyaWQuQ29sdW1uQ291bnQ9MCBHcmlkLlJvd0NvdW50PTAgVGFibGUuUm93T3JDb2x1bW5NYWpvcj0nUm93TWFqb3InCisrK2dyaWQgR3JpZC5Db2x1bW5Db3VudD0zIEdyaWQuUm93Q291bnQ9MyBUYWJsZS5Sb3dPckNvbHVtbk1ham9yPSdSb3dNYWpvcicKICsrKytyb3cKICsrKysrK2dyaWRjZWxsIE5hbWU9JzEnIEdyaWRJdGVtLkNvbHVtbj0wIEdyaWRJdGVtLkNvbHVtblNwYW49MSBHcmlkSXRlbS5Sb3c9MCBHcmlkSXRlbS5Sb3dTcGFuPTEKICsrKysrKysrZGVzY3JpcHRpb24gTmFtZT0nMScKLSsrKysrK2dyaWRjZWxsIE5hbWU9JzInIEdyaWRJdGVtLkNvbHVtbj0wIEdyaWRJdGVtLkNvbHVtblNwYW49MSBHcmlkSXRlbS5Sb3c9MCBHcmlkSXRlbS5Sb3dTcGFuPTEKKysrKysrK2dyaWRjZWxsIE5hbWU9JzInIEdyaWRJdGVtLkNvbHVtbj0xIEdyaWRJdGVtLkNvbHVtblNwYW49MSBHcmlkSXRlbS5Sb3c9MCBHcmlkSXRlbS5Sb3dTcGFuPTEKICsrKysrKysrZGVzY3JpcHRpb24gTmFtZT0nMicKLSsrKysrK2dyaWRjZWxsIE5hbWU9JzMnIEdyaWRJdGVtLkNvbHVtbj0wIEdyaWRJdGVtLkNvbHVtblNwYW49MSBHcmlkSXRlbS5Sb3c9MCBHcmlkSXRlbS5Sb3dTcGFuPTEKKysrKysrK2dyaWRjZWxsIE5hbWU9JzMnIEdyaWRJdGVtLkNvbHVtbj0yIEdyaWRJdGVtLkNvbHVtblNwYW49MSBHcmlkSXRlbS5Sb3c9MCBHcmlkSXRlbS5Sb3dTcGFuPTEKICsrKysrKysrZGVzY3JpcHRpb24gTmFtZT0nMycKICsrKytyb3cKLSsrKysrK2dyaWRjZWxsIE5hbWU9JzQnIEdyaWRJdGVtLkNvbHVtbj0wIEdyaWRJdGVtLkNvbHVtblNwYW49MSBHcmlkSXRlbS5Sb3c9MCBHcmlkSXRlbS5Sb3dTcGFuPTEKKysrKysrK2dyaWRjZWxsIE5hbWU9JzQnIEdyaWRJdGVtLkNvbHVtbj0wIEdyaWRJdGVtLkNvbHVtblNwYW49MSBHcmlkSXRlbS5Sb3c9MSBHcmlkSXRlbS5Sb3dTcGFuPTEKICsrKysrKysrZGVzY3JpcHRpb24gTmFtZT0nNCcKLSsrKysrK2dyaWRjZWxsIE5hbWU9JzUnIEdyaWRJdGVtLkNvbHVtbj0wIEdyaWRJdGVtLkNvbHVtblNwYW49MSBHcmlkSXRlbS5Sb3c9MCBHcmlkSXRlbS5Sb3dTcGFuPTEKKysrKysrK2dyaWRjZWxsIE5hbWU9JzUnIEdyaWRJdGVtLkNvbHVtbj0xIEdyaWRJdGVtLkNvbHVtblNwYW49MSBHcmlkSXRlbS5Sb3c9MSBHcmlkSXRlbS5Sb3dTcGFuPTEKICsrKysrKysrZGVzY3JpcHRpb24gTmFtZT0nNScKLSsrKysrK2dyaWRjZWxsIE5hbWU9JzYnIEdyaWRJdGVtLkNvbHVtbj0wIEdyaWRJdGVtLkNvbHVtblNwYW49MSBHcmlkSXRlbS5Sb3c9MCBHcmlkSXRlbS5Sb3dTcGFuPTEKKysrKysrK2dyaWRjZWxsIE5hbWU9JzYnIEdyaWRJdGVtLkNvbHVtbj0yIEdyaWRJdGVtLkNvbHVtblNwYW49MSBHcmlkSXRlbS5Sb3c9MSBHcmlkSXRlbS5Sb3dTcGFuPTEKICsrKysrKysrZGVzY3JpcHRpb24gTmFtZT0nNicKICsrKytyb3cKLSsrKysrK2dyaWRjZWxsIE5hbWU9JzcnIEdyaWRJdGVtLkNvbHVtbj0wIEdyaWRJdGVtLkNvbHVtblNwYW49MSBHcmlkSXRlbS5Sb3c9MCBHcmlkSXRlbS5Sb3dTcGFuPTEKKysrKysrK2dyaWRjZWxsIE5hbWU9JzcnIEdyaWRJdGVtLkNvbHVtbj0wIEdyaWRJdGVtLkNvbHVtblNwYW49MSBHcmlkSXRlbS5Sb3c9MiBHcmlkSXRlbS5Sb3dTcGFuPTEKICsrKysrKysrZGVzY3JpcHRpb24gTmFtZT0nNycKLSsrKysrK2dyaWRjZWxsIE5hbWU9JzgnIEdyaWRJdGVtLkNvbHVtbj0wIEdyaWRJdGVtLkNvbHVtblNwYW49MSBHcmlkSXRlbS5Sb3c9MCBHcmlkSXRlbS5Sb3dTcGFuPTEKKysrKysrK2dyaWRjZWxsIE5hbWU9JzgnIEdyaWRJdGVtLkNvbHVtbj0xIEdyaWRJdGVtLkNvbHVtblNwYW49MSBHcmlkSXRlbS5Sb3c9MiBHcmlkSXRlbS5Sb3dTcGFuPTEKICsrKysrKysrZGVzY3JpcHRpb24gTmFtZT0nOCcKLSsrKysrK2dyaWRjZWxsIE5hbWU9JzknIEdyaWRJdGVtLkNvbHVtbj0wIEdyaWRJdGVtLkNvbHVtblNwYW49MSBHcmlkSXRlbS5Sb3c9MCBHcmlkSXRlbS5Sb3dTcGFuPTEKKysrKysrK2dyaWRjZWxsIE5hbWU9JzknIEdyaWRJdGVtLkNvbHVtbj0yIEdyaWRJdGVtLkNvbHVtblNwYW49MSBHcmlkSXRlbS5Sb3c9MiBHcmlkSXRlbS5Sb3dTcGFuPTEKICsrKysrKysrZGVzY3JpcHRpb24gTmFtZT0nOScKZGlmZiAtLWdpdCBhL2NvbnRlbnQvdGVzdC9kYXRhL2JhY2tfZm9yd2FyZF9jYWNoZS9jaGFyc2V0X3V0Zi04Lmh0bWwgYi9jb250ZW50L3Rlc3QvZGF0YS9iYWNrX2ZvcndhcmRfY2FjaGUvY2hhcnNldF91dGYtOC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZDA0NDBmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGVudC90ZXN0L2RhdGEvYmFja19mb3J3YXJkX2NhY2hlL2NoYXJzZXRfdXRmLTguaHRtbApAQCAtMCwwICsxLDggQEAKKzwhRE9DVFlQRSBodG1sPgorPGh0bWw+CisgIDxoZWFkPgorICAgIDxtZXRhIGNoYXJzZXQ9IlVURi04Ij4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvY29udGVudC90ZXN0L2RhdGEvYmFja19mb3J3YXJkX2NhY2hlL2NoYXJzZXRfd2luZG93cy0xMjUwLmh0bWwgYi9jb250ZW50L3Rlc3QvZGF0YS9iYWNrX2ZvcndhcmRfY2FjaGUvY2hhcnNldF93aW5kb3dzLTEyNTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTBmNDNhYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRlbnQvdGVzdC9kYXRhL2JhY2tfZm9yd2FyZF9jYWNoZS9jaGFyc2V0X3dpbmRvd3MtMTI1MC5odG1sCkBAIC0wLDAgKzEsOCBAQAorPCFET0NUWVBFIGh0bWw+Cis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPG1ldGEgY2hhcnNldD0id2luZG93cy0xMjUwIj4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvY29udGVudC90ZXN0L2Zha2VfbGV2ZWxkYl9kYXRhYmFzZS5jYyBiL2NvbnRlbnQvdGVzdC9mYWtlX2xldmVsZGJfZGF0YWJhc2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYmU5ZGNkLi4wMDAwMDAwCi0tLSBhL2NvbnRlbnQvdGVzdC9mYWtlX2xldmVsZGJfZGF0YWJhc2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAiY29udGVudC90ZXN0L2Zha2VfbGV2ZWxkYl9kYXRhYmFzZS5oIgotCi0jaW5jbHVkZSA8aXRlcmF0b3I+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLQotI2luY2x1ZGUgImJhc2UvYmluZC5oIgotI2luY2x1ZGUgImJhc2Uvc3RyaW5ncy9zdHJpbmdfcGllY2UuaCIKLSNpbmNsdWRlICJiYXNlL3N0cmluZ3Mvc3RyaW5nX3V0aWwuaCIKLQotbmFtZXNwYWNlIGNvbnRlbnQgewotCi1uYW1lc3BhY2UgewotdXNpbmcgbGV2ZWxkYjo6bW9qb206OkJhdGNoZWRPcGVyYXRpb247Ci11c2luZyBsZXZlbGRiOjptb2pvbTo6QmF0Y2hlZE9wZXJhdGlvblB0cjsKLQotbGV2ZWxkYjo6bW9qb206OktleVZhbHVlUHRyIENyZWF0ZUtleVZhbHVlKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZSkgewotICBsZXZlbGRiOjptb2pvbTo6S2V5VmFsdWVQdHIgcmVzdWx0ID0gbGV2ZWxkYjo6bW9qb206OktleVZhbHVlOjpOZXcoKTsKLSAgcmVzdWx0LT5rZXkgPSBzdGQ6Om1vdmUoa2V5KTsKLSAgcmVzdWx0LT52YWx1ZSA9IHN0ZDo6bW92ZSh2YWx1ZSk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLWJhc2U6OlN0cmluZ1BpZWNlIEFzU3RyaW5nUGllY2UoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGRhdGEpIHsKLSAgcmV0dXJuIGJhc2U6OlN0cmluZ1BpZWNlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGRhdGEuZGF0YSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuc2l6ZSgpKTsKLX0KLQotYm9vbCBTdGFydHNXaXRoKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBrZXksCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHByZWZpeCkgewotICByZXR1cm4gYmFzZTo6U3RhcnRzV2l0aChBc1N0cmluZ1BpZWNlKGtleSksIEFzU3RyaW5nUGllY2UocHJlZml4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6Q29tcGFyZUNhc2U6OlNFTlNJVElWRSk7Ci19Ci0KLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHN1Y2Nlc3NvcihzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKSB7Ci0gIGZvciAodW5zaWduZWQgaSA9IGRhdGEuc2l6ZSgpOyBpID4gMDsgLS1pKSB7Ci0gICAgaWYgKGRhdGFbaSAtIDFdIDwgMjU1KSB7Ci0gICAgICBkYXRhW2kgLSAxXSsrOwotICAgICAgcmV0dXJuIGRhdGE7Ci0gICAgfQotICB9Ci0gIE5PVFJFQUNIRUQoKTsKLSAgcmV0dXJuIGRhdGE7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1GYWtlTGV2ZWxEQkRhdGFiYXNlOjpGYWtlTGV2ZWxEQkRhdGFiYXNlKAotICAgIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBzdGQ6OnZlY3Rvcjx1aW50OF90Pj4qIG1vY2tfZGF0YSkKLSAgICA6IG1vY2tfZGF0YV8oKm1vY2tfZGF0YSkge30KLQotRmFrZUxldmVsREJEYXRhYmFzZTo6fkZha2VMZXZlbERCRGF0YWJhc2UoKSB7Ci0gIGlmIChkZXN0cnVjdGlvbl9jYWxsYmFja18pCi0gICAgc3RkOjptb3ZlKGRlc3RydWN0aW9uX2NhbGxiYWNrXykuUnVuKCk7Ci19Ci0KLXZvaWQgRmFrZUxldmVsREJEYXRhYmFzZTo6UHV0KGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdXRDYWxsYmFjayBjYWxsYmFjaykgewotICBtb2NrX2RhdGFfW2tleV0gPSB2YWx1ZTsKLSAgc3RkOjptb3ZlKGNhbGxiYWNrKS5SdW4obGV2ZWxkYjo6bW9qb206OkRhdGFiYXNlRXJyb3I6Ok9LKTsKLX0KLQotdm9pZCBGYWtlTGV2ZWxEQkRhdGFiYXNlOjpEZWxldGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0ZUNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gIG1vY2tfZGF0YV8uZXJhc2Uoa2V5KTsKLSAgc3RkOjptb3ZlKGNhbGxiYWNrKS5SdW4obGV2ZWxkYjo6bW9qb206OkRhdGFiYXNlRXJyb3I6Ok9LKTsKLX0KLQotdm9pZCBGYWtlTGV2ZWxEQkRhdGFiYXNlOjpEZWxldGVQcmVmaXhlZChjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYga2V5X3ByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRlUHJlZml4ZWRDYWxsYmFjayBjYWxsYmFjaykgewotICBtb2NrX2RhdGFfLmVyYXNlKG1vY2tfZGF0YV8ubG93ZXJfYm91bmQoa2V5X3ByZWZpeCksCi0gICAgICAgICAgICAgICAgICAgbW9ja19kYXRhXy5sb3dlcl9ib3VuZChzdWNjZXNzb3Ioa2V5X3ByZWZpeCkpKTsKLSAgc3RkOjptb3ZlKGNhbGxiYWNrKS5SdW4obGV2ZWxkYjo6bW9qb206OkRhdGFiYXNlRXJyb3I6Ok9LKTsKLX0KLQotdm9pZCBGYWtlTGV2ZWxEQkRhdGFiYXNlOjpSZXdyaXRlREIoUmV3cml0ZURCQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgc3RkOjptb3ZlKGNhbGxiYWNrKS5SdW4obGV2ZWxkYjo6bW9qb206OkRhdGFiYXNlRXJyb3I6Ok9LKTsKLX0KLQotdm9pZCBGYWtlTGV2ZWxEQkRhdGFiYXNlOjpXcml0ZSgKLSAgICBzdGQ6OnZlY3RvcjxsZXZlbGRiOjptb2pvbTo6QmF0Y2hlZE9wZXJhdGlvblB0cj4gb3BlcmF0aW9ucywKLSAgICBXcml0ZUNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gIC8vIFJlcGxhY2UgcHJlZml4IGRlbGV0ZSBhbmQgcHJlZml4IGNvcHkgd2l0aCBvcGVyYXRpb25zIGZpcnN0LCBhbmQgdGhlbgotICAvLyBleGVjdXRlIGFsbCBvcGVyYXRpb25zLiBUaGlzIG1vZGVscyBob3cgdGhlIGxldmVsZGIgV3JpdGVCYXRjaCB3b3Jrcy4KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvcGVyYXRpb25zLnNpemUoKTsgKytpKSB7Ci0gICAgY29uc3QgYXV0byYgb3AgPSBvcGVyYXRpb25zW2ldOwotICAgIHN3aXRjaCAob3AtPnR5cGUpIHsKLSAgICAgIGNhc2UgbGV2ZWxkYjo6bW9qb206OkJhdGNoT3BlcmF0aW9uVHlwZTo6UFVUX0tFWToKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGxldmVsZGI6Om1vam9tOjpCYXRjaE9wZXJhdGlvblR5cGU6OkRFTEVURV9LRVk6Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBsZXZlbGRiOjptb2pvbTo6QmF0Y2hPcGVyYXRpb25UeXBlOjpERUxFVEVfUFJFRklYRURfS0VZOiB7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPGxldmVsZGI6Om1vam9tOjpCYXRjaGVkT3BlcmF0aW9uUHRyPiBjaGFuZ2VzOwotICAgICAgICBmb3IgKGF1dG8gbWFwX2l0ID0gbW9ja19kYXRhXy5sb3dlcl9ib3VuZChvcC0+a2V5KTsKLSAgICAgICAgICAgICBtYXBfaXQgIT0gbW9ja19kYXRhXy5sb3dlcl9ib3VuZChzdWNjZXNzb3Iob3AtPmtleSkpOyArK21hcF9pdCkgewotICAgICAgICAgIEJhdGNoZWRPcGVyYXRpb25QdHIgaXRlbSA9IEJhdGNoZWRPcGVyYXRpb246Ok5ldygpOwotICAgICAgICAgIGl0ZW0tPnR5cGUgPSBsZXZlbGRiOjptb2pvbTo6QmF0Y2hPcGVyYXRpb25UeXBlOjpERUxFVEVfS0VZOwotICAgICAgICAgIGl0ZW0tPmtleSA9IG1hcF9pdC0+Zmlyc3Q7Ci0gICAgICAgICAgY2hhbmdlcy5wdXNoX2JhY2soc3RkOjptb3ZlKGl0ZW0pKTsKLSAgICAgICAgfQotICAgICAgICBzaXplX3QgZGlmZiA9IGNoYW5nZXMuc2l6ZSgpOwotICAgICAgICBvcGVyYXRpb25zLmluc2VydChvcGVyYXRpb25zLmJlZ2luKCkgKyBpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfbW92ZV9pdGVyYXRvcihjaGFuZ2VzLmJlZ2luKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfbW92ZV9pdGVyYXRvcihjaGFuZ2VzLmVuZCgpKSk7Ci0gICAgICAgIGkgKz0gZGlmZjsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBjYXNlIGxldmVsZGI6Om1vam9tOjpCYXRjaE9wZXJhdGlvblR5cGU6OkNPUFlfUFJFRklYRURfS0VZOiB7Ci0gICAgICAgIERDSEVDSyhvcC0+dmFsdWUpOwotICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjp2ZWN0b3I8dWludDhfdD4sIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+Pj4KLSAgICAgICAgICAgIGNvcHlfY2hhbmdlcyA9IENvcHlQcmVmaXhlZEhlbHBlcihvcC0+a2V5LCAqb3AtPnZhbHVlKTsKLSAgICAgICAgc3RkOjp2ZWN0b3I8bGV2ZWxkYjo6bW9qb206OkJhdGNoZWRPcGVyYXRpb25QdHI+IGNoYW5nZXM7Ci0gICAgICAgIGZvciAoYXV0byYgY2hhbmdlIDogY29weV9jaGFuZ2VzKSB7Ci0gICAgICAgICAgQmF0Y2hlZE9wZXJhdGlvblB0ciBpdGVtID0gQmF0Y2hlZE9wZXJhdGlvbjo6TmV3KCk7Ci0gICAgICAgICAgaXRlbS0+dHlwZSA9IGxldmVsZGI6Om1vam9tOjpCYXRjaE9wZXJhdGlvblR5cGU6OlBVVF9LRVk7Ci0gICAgICAgICAgaXRlbS0+a2V5ID0gc3RkOjptb3ZlKGNoYW5nZS5maXJzdCk7Ci0gICAgICAgICAgaXRlbS0+dmFsdWUgPSBzdGQ6Om1vdmUoY2hhbmdlLnNlY29uZCk7Ci0gICAgICAgICAgY2hhbmdlcy5wdXNoX2JhY2soc3RkOjptb3ZlKGl0ZW0pKTsKLSAgICAgICAgfQotICAgICAgICBzaXplX3QgZGlmZiA9IGNoYW5nZXMuc2l6ZSgpOwotICAgICAgICBvcGVyYXRpb25zLmluc2VydChvcGVyYXRpb25zLmJlZ2luKCkgKyBpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfbW92ZV9pdGVyYXRvcihjaGFuZ2VzLmJlZ2luKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfbW92ZV9pdGVyYXRvcihjaGFuZ2VzLmVuZCgpKSk7Ci0gICAgICAgIGkgKz0gZGlmZjsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZm9yIChjb25zdCBhdXRvJiBvcCA6IG9wZXJhdGlvbnMpIHsKLSAgICBzd2l0Y2ggKG9wLT50eXBlKSB7Ci0gICAgICBjYXNlIGxldmVsZGI6Om1vam9tOjpCYXRjaE9wZXJhdGlvblR5cGU6OlBVVF9LRVk6Ci0gICAgICAgIERDSEVDSyhvcC0+dmFsdWUpOwotICAgICAgICBtb2NrX2RhdGFfW29wLT5rZXldID0gKm9wLT52YWx1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGxldmVsZGI6Om1vam9tOjpCYXRjaE9wZXJhdGlvblR5cGU6OkRFTEVURV9LRVk6Ci0gICAgICAgIG1vY2tfZGF0YV8uZXJhc2Uob3AtPmtleSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBsZXZlbGRiOjptb2pvbTo6QmF0Y2hPcGVyYXRpb25UeXBlOjpERUxFVEVfUFJFRklYRURfS0VZOgotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgbGV2ZWxkYjo6bW9qb206OkJhdGNoT3BlcmF0aW9uVHlwZTo6Q09QWV9QUkVGSVhFRF9LRVk6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIHN0ZDo6bW92ZShjYWxsYmFjaykuUnVuKGxldmVsZGI6Om1vam9tOjpEYXRhYmFzZUVycm9yOjpPSyk7Ci19Ci0KLXZvaWQgRmFrZUxldmVsREJEYXRhYmFzZTo6R2V0KGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRDYWxsYmFjayBjYWxsYmFjaykgewotICBpZiAobW9ja19kYXRhXy5maW5kKGtleSkgIT0gbW9ja19kYXRhXy5lbmQoKSkgewotICAgIHN0ZDo6bW92ZShjYWxsYmFjaykuUnVuKGxldmVsZGI6Om1vam9tOjpEYXRhYmFzZUVycm9yOjpPSywgbW9ja19kYXRhX1trZXldKTsKLSAgfSBlbHNlIHsKLSAgICBzdGQ6Om1vdmUoY2FsbGJhY2spLlJ1bihsZXZlbGRiOjptb2pvbTo6RGF0YWJhc2VFcnJvcjo6Tk9UX0ZPVU5ELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KCkpOwotICB9Ci19Ci0KLXZvaWQgRmFrZUxldmVsREJEYXRhYmFzZTo6R2V0UHJlZml4ZWQoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGtleV9wcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFByZWZpeGVkQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgc3RkOjp2ZWN0b3I8bGV2ZWxkYjo6bW9qb206OktleVZhbHVlUHRyPiBkYXRhOwotICBmb3IgKGNvbnN0IGF1dG8mIHJvdyA6IG1vY2tfZGF0YV8pIHsKLSAgICBpZiAoU3RhcnRzV2l0aChyb3cuZmlyc3QsIGtleV9wcmVmaXgpKSB7Ci0gICAgICBkYXRhLnB1c2hfYmFjayhDcmVhdGVLZXlWYWx1ZShyb3cuZmlyc3QsIHJvdy5zZWNvbmQpKTsKLSAgICB9Ci0gIH0KLSAgc3RkOjptb3ZlKGNhbGxiYWNrKS5SdW4obGV2ZWxkYjo6bW9qb206OkRhdGFiYXNlRXJyb3I6Ok9LLCBzdGQ6Om1vdmUoZGF0YSkpOwotfQotCi12b2lkIEZha2VMZXZlbERCRGF0YWJhc2U6OkdldE1hbnkoCi0gICAgc3RkOjp2ZWN0b3I8bGV2ZWxkYjo6bW9qb206OkdldE1hbnlSZXF1ZXN0UHRyPiBrZXlzX29yX3ByZWZpeGVzLAotICAgIEdldE1hbnlDYWxsYmFjayBjYWxsYmFjaykgewotICBzdGQ6OnZlY3RvcjxsZXZlbGRiOjptb2pvbTo6R2V0TWFueVJlc3VsdFB0cj4gZGF0YTsKLSAgZm9yIChjb25zdCBhdXRvJiByZXF1ZXN0IDoga2V5c19vcl9wcmVmaXhlcykgewotICAgIGxldmVsZGI6Om1vam9tOjpHZXRNYW55UmVzdWx0UHRyIHJlc3VsdCA9Ci0gICAgICAgIGxldmVsZGI6Om1vam9tOjpHZXRNYW55UmVzdWx0OjpOZXcoKTsKLSAgICBsZXZlbGRiOjpTdGF0dXMgc3RhdHVzOwotCi0gICAgaWYgKHJlcXVlc3QtPmlzX2tleSgpKSB7Ci0gICAgICBjb25zdCBhdXRvJiBrZXkgPSByZXF1ZXN0LT5nZXRfa2V5KCk7Ci0gICAgICBpZiAobW9ja19kYXRhXy5maW5kKGtleSkgIT0gbW9ja19kYXRhXy5lbmQoKSkKLSAgICAgICAgcmVzdWx0LT5zZXRfa2V5X3ZhbHVlKG1vY2tfZGF0YV9ba2V5XSk7Ci0gICAgICBlbHNlCi0gICAgICAgIHJlc3VsdC0+c2V0X3N0YXR1cyhsZXZlbGRiOjptb2pvbTo6RGF0YWJhc2VFcnJvcjo6Tk9UX0ZPVU5EKTsKLSAgICB9IGVsc2UgewotICAgICAgY29uc3QgYXV0byYga2V5X3ByZWZpeCA9IHJlcXVlc3QtPmdldF9rZXlfcHJlZml4KCk7Ci0gICAgICBzdGQ6OnZlY3RvcjxsZXZlbGRiOjptb2pvbTo6S2V5VmFsdWVQdHI+IHZhbHVlczsKLQotICAgICAgZm9yIChjb25zdCBhdXRvJiByb3cgOiBtb2NrX2RhdGFfKSB7Ci0gICAgICAgIGlmIChTdGFydHNXaXRoKHJvdy5maXJzdCwga2V5X3ByZWZpeCkpCi0gICAgICAgICAgdmFsdWVzLnB1c2hfYmFjayhDcmVhdGVLZXlWYWx1ZShyb3cuZmlyc3QsIHJvdy5zZWNvbmQpKTsKLSAgICAgIH0KLQotICAgICAgcmVzdWx0LT5zZXRfa2V5X3ByZWZpeF92YWx1ZXMoc3RkOjptb3ZlKHZhbHVlcykpOwotICAgIH0KLQotICAgIGRhdGEucHVzaF9iYWNrKHN0ZDo6bW92ZShyZXN1bHQpKTsKLSAgfQotICBzdGQ6Om1vdmUoY2FsbGJhY2spLlJ1bihzdGQ6Om1vdmUoZGF0YSkpOwotfQotCi12b2lkIEZha2VMZXZlbERCRGF0YWJhc2U6OkNvcHlQcmVmaXhlZCgKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgc291cmNlX2tleV9wcmVmaXgsCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGRlc3RpbmF0aW9uX2tleV9wcmVmaXgsCi0gICAgQ29weVByZWZpeGVkQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBzdGQ6OnZlY3Rvcjx1aW50OF90Pj4+IGNoYW5nZXMgPQotICAgICAgQ29weVByZWZpeGVkSGVscGVyKHNvdXJjZV9rZXlfcHJlZml4LCBkZXN0aW5hdGlvbl9rZXlfcHJlZml4KTsKLSAgbW9ja19kYXRhXy5pbnNlcnQoY2hhbmdlcy5iZWdpbigpLCBjaGFuZ2VzLmVuZCgpKTsKLSAgc3RkOjptb3ZlKGNhbGxiYWNrKS5SdW4obGV2ZWxkYjo6bW9qb206OkRhdGFiYXNlRXJyb3I6Ok9LKTsKLX0KLQotc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBzdGQ6OnZlY3Rvcjx1aW50OF90Pj4+Ci1GYWtlTGV2ZWxEQkRhdGFiYXNlOjpDb3B5UHJlZml4ZWRIZWxwZXIoCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHNvdXJjZV9rZXlfcHJlZml4LAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBkZXN0aW5hdGlvbl9rZXlfcHJlZml4KSB7Ci0gIHNpemVfdCBzb3VyY2Vfa2V5X3ByZWZpeF9zaXplID0gc291cmNlX2tleV9wcmVmaXguc2l6ZSgpOwotICBzaXplX3QgZGVzdGluYXRpb25fa2V5X3ByZWZpeF9zaXplID0gZGVzdGluYXRpb25fa2V5X3ByZWZpeC5zaXplKCk7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnZlY3Rvcjx1aW50OF90Piwgc3RkOjp2ZWN0b3I8dWludDhfdD4+PgotICAgICAgd3JpdGVfYmF0Y2g7Ci0gIGZvciAoYXV0byBtYXBfaXQgPSBtb2NrX2RhdGFfLmxvd2VyX2JvdW5kKHNvdXJjZV9rZXlfcHJlZml4KTsKLSAgICAgICBtYXBfaXQgIT0gbW9ja19kYXRhXy5sb3dlcl9ib3VuZChzdWNjZXNzb3Ioc291cmNlX2tleV9wcmVmaXgpKTsKLSAgICAgICArK21hcF9pdCkgewotICAgIHNpemVfdCBleGNlc3Nfa2V5ID0gbWFwX2l0LT5maXJzdC5zaXplKCkgLSBzb3VyY2Vfa2V5X3ByZWZpeF9zaXplOwotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG5ld19rZXkoZGVzdGluYXRpb25fa2V5X3ByZWZpeF9zaXplICsgZXhjZXNzX2tleSk7Ci0gICAgc3RkOjpjb3B5KGRlc3RpbmF0aW9uX2tleV9wcmVmaXguYmVnaW4oKSwgZGVzdGluYXRpb25fa2V5X3ByZWZpeC5lbmQoKSwKLSAgICAgICAgICAgICAgbmV3X2tleS5iZWdpbigpKTsKLSAgICBzdGQ6OmNvcHkobWFwX2l0LT5maXJzdC5iZWdpbigpICsgc291cmNlX2tleV9wcmVmaXhfc2l6ZSwKLSAgICAgICAgICAgICAgbWFwX2l0LT5maXJzdC5lbmQoKSwKLSAgICAgICAgICAgICAgbmV3X2tleS5iZWdpbigpICsgZGVzdGluYXRpb25fa2V5X3ByZWZpeF9zaXplKTsKLSAgICB3cml0ZV9iYXRjaC5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKG5ld19rZXkpLCBtYXBfaXQtPnNlY29uZCk7Ci0gIH0KLQotICByZXR1cm4gd3JpdGVfYmF0Y2g7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBjb250ZW50CmRpZmYgLS1naXQgYS9jb250ZW50L3Rlc3QvZmFrZV9sZXZlbGRiX2RhdGFiYXNlLmggYi9jb250ZW50L3Rlc3QvZmFrZV9sZXZlbGRiX2RhdGFiYXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MWNmZjMuLjAwMDAwMDAKLS0tIGEvY29udGVudC90ZXN0L2Zha2VfbGV2ZWxkYl9kYXRhYmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIENPTlRFTlRfVEVTVF9GQUtFX0xFVkVMREJfREFUQUJBU0VfSF8KLSNkZWZpbmUgQ09OVEVOVF9URVNUX0ZBS0VfTEVWRUxEQl9EQVRBQkFTRV9IXwotCi0jaW5jbHVkZSAiYmFzZS9jYWxsYmFjay5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiY29tcG9uZW50cy9zZXJ2aWNlcy9sZXZlbGRiL3B1YmxpYy9tb2pvbS9sZXZlbGRiLm1vam9tLmgiCi0KLW5hbWVzcGFjZSBjb250ZW50IHsKLQotLy8gU2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBsZXZlbGRiOjptb2pvbTo6TGV2ZWxEQkRhdGFiYXNlIGludGVyZmFjZSB0aGF0Ci0vLyBpcyBiYWNrZWQgYnkgYSBzdGQ6Om1hcC4KLQotY2xhc3MgRmFrZUxldmVsREJEYXRhYmFzZSA6IHB1YmxpYyBsZXZlbGRiOjptb2pvbTo6TGV2ZWxEQkRhdGFiYXNlIHsKLSBwdWJsaWM6Ci0gIC8vIHxtb2NrX2RhdGF8IG11c3Qgbm90IGJlIG51bGwgYW5kIG11c3Qgb3V0bGl2ZSB0aGlzIE1vY2tMZXZlbERCRGF0YWJhc2UKLSAgLy8gaW5zdGFuY2UuIEFsbCBjYWxsYmFja3MgYXJlIGNhbGxlZCBzeW5jaHJvbm91c2x5LgotICBleHBsaWNpdCBGYWtlTGV2ZWxEQkRhdGFiYXNlKAotICAgICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiogbW9ja19kYXRhKTsKLSAgfkZha2VMZXZlbERCRGF0YWJhc2UoKSBvdmVycmlkZTsKLQotICB2b2lkIFNldERlc3RydWN0aW9uQ2FsbGJhY2soYmFzZTo6T25jZUNsb3N1cmUgY2FsbGJhY2spIHsKLSAgICBkZXN0cnVjdGlvbl9jYWxsYmFja18gPSBzdGQ6Om1vdmUoY2FsbGJhY2spOwotICB9Ci0KLSAgLy8gTGV2ZWxEQkRhdGFiYXNlOgotICB2b2lkIFB1dChjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYga2V5LAotICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgdmFsdWUsCi0gICAgICAgICAgIFB1dENhbGxiYWNrIGNhbGxiYWNrKSBvdmVycmlkZTsKLSAgdm9pZCBEZWxldGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGtleSwKLSAgICAgICAgICAgICAgRGVsZXRlQ2FsbGJhY2sgY2FsbGJhY2spIG92ZXJyaWRlOwotICB2b2lkIERlbGV0ZVByZWZpeGVkKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBrZXlfcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgIERlbGV0ZVByZWZpeGVkQ2FsbGJhY2sgY2FsbGJhY2spIG92ZXJyaWRlOwotICB2b2lkIFJld3JpdGVEQihSZXdyaXRlREJDYWxsYmFjayBjYWxsYmFjaykgb3ZlcnJpZGU7Ci0gIHZvaWQgV3JpdGUoc3RkOjp2ZWN0b3I8bGV2ZWxkYjo6bW9qb206OkJhdGNoZWRPcGVyYXRpb25QdHI+IG9wZXJhdGlvbnMsCi0gICAgICAgICAgICAgV3JpdGVDYWxsYmFjayBjYWxsYmFjaykgb3ZlcnJpZGU7Ci0gIHZvaWQgR2V0KGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBrZXksIEdldENhbGxiYWNrIGNhbGxiYWNrKSBvdmVycmlkZTsKLSAgdm9pZCBHZXRQcmVmaXhlZChjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYga2V5X3ByZWZpeCwKLSAgICAgICAgICAgICAgICAgICBHZXRQcmVmaXhlZENhbGxiYWNrIGNhbGxiYWNrKSBvdmVycmlkZTsKLSAgdm9pZCBHZXRNYW55KHN0ZDo6dmVjdG9yPGxldmVsZGI6Om1vam9tOjpHZXRNYW55UmVxdWVzdFB0cj4ga2V5c19vcl9wcmVmaXhlcywKLSAgICAgICAgICAgICAgIEdldE1hbnlDYWxsYmFjayBjYWxsYmFjaykgb3ZlcnJpZGU7Ci0gIHZvaWQgQ29weVByZWZpeGVkKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzb3VyY2Vfa2V5X3ByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGRlc3RpbmF0aW9uX2tleV9wcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgIENvcHlQcmVmaXhlZENhbGxiYWNrIGNhbGxiYWNrKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnZlY3Rvcjx1aW50OF90Piwgc3RkOjp2ZWN0b3I8dWludDhfdD4+PgotICBDb3B5UHJlZml4ZWRIZWxwZXIoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHNvdXJjZV9rZXlfcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGRlc3RpbmF0aW9uX2tleV9wcmVmaXgpOwotCi0gIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBzdGQ6OnZlY3Rvcjx1aW50OF90Pj4mIG1vY2tfZGF0YV87Ci0gIGJhc2U6Ok9uY2VDbG9zdXJlIGRlc3RydWN0aW9uX2NhbGxiYWNrXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBjb250ZW50Ci0KLSNlbmRpZiAgLy8gQ09OVEVOVF9URVNUX0ZBS0VfTEVWRUxEQl9EQVRBQkFTRV9IXwpkaWZmIC0tZ2l0IGEvY29udGVudC90ZXN0L2dwdS9ncHVfdGVzdHMvd2ViZ2xfY29uZm9ybWFuY2VfcmV2aXNpb24udHh0IGIvY29udGVudC90ZXN0L2dwdS9ncHVfdGVzdHMvd2ViZ2xfY29uZm9ybWFuY2VfcmV2aXNpb24udHh0CmluZGV4IDU1NDZjYzkuLjAzNTEwODAgMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvdGVzdC9ncHUvZ3B1X3Rlc3RzL3dlYmdsX2NvbmZvcm1hbmNlX3JldmlzaW9uLnR4dAorKysgYi9jb250ZW50L3Rlc3QvZ3B1L2dwdV90ZXN0cy93ZWJnbF9jb25mb3JtYW5jZV9yZXZpc2lvbi50eHQKQEAgLTEsMyArMSwzIEBACiAjIEFVVE9HRU5FUkFURUQgRklMRSAtIERPIE5PVCBFRElUCiAjIFNFRSByb2xsX3dlYmdsX2NvbmZvcm1hbmNlLnB5Ci1DdXJyZW50IHdlYmdsIHJldmlzaW9uIDdjNGU2N2ZmMTE3ZDZjNjQwZTZkZDE3OTg5YWZlMmZiN2RhN2VlY2IKK0N1cnJlbnQgd2ViZ2wgcmV2aXNpb24gMjcwMWMxMzA4MzllZGJlYjIyNjczNWIwNzc1OTY2YjY0MjNkOWU4MwpkaWZmIC0tZ2l0IGEvY29udGVudC90ZXN0L25hdmlnYXRpb25fc2ltdWxhdG9yX2ltcGwuY2MgYi9jb250ZW50L3Rlc3QvbmF2aWdhdGlvbl9zaW11bGF0b3JfaW1wbC5jYwppbmRleCBlYTNjMzFmLi45NjZmY2QxIDEwMDY0NAotLS0gYS9jb250ZW50L3Rlc3QvbmF2aWdhdGlvbl9zaW11bGF0b3JfaW1wbC5jYworKysgYi9jb250ZW50L3Rlc3QvbmF2aWdhdGlvbl9zaW11bGF0b3JfaW1wbC5jYwpAQCAtMTM0MSw4ICsxMzQxLDcgQEAKIAogdm9pZCBOYXZpZ2F0aW9uU2ltdWxhdG9ySW1wbDo6U3RvcExvYWRpbmcoKSB7CiAgIENIRUNLKHJlbmRlcl9mcmFtZV9ob3N0Xyk7Ci0gIHJlbmRlcl9mcmFtZV9ob3N0Xy0+T25NZXNzYWdlUmVjZWl2ZWQoCi0gICAgICBGcmFtZUhvc3RNc2dfRGlkU3RvcExvYWRpbmcocmVuZGVyX2ZyYW1lX2hvc3RfLT5HZXRSb3V0aW5nSUQoKSkpOworICByZW5kZXJfZnJhbWVfaG9zdF8tPlNpbXVsYXRlTG9hZGluZ0NvbXBsZXRlZCgpOwogfQogCiB2b2lkIE5hdmlnYXRpb25TaW11bGF0b3JJbXBsOjpGYWlsTG9hZGluZygKZGlmZiAtLWdpdCBhL2NvbnRlbnQvdGVzdC90ZXN0X2JhY2tncm91bmRfc3luY19tYW5hZ2VyLmNjIGIvY29udGVudC90ZXN0L3Rlc3RfYmFja2dyb3VuZF9zeW5jX21hbmFnZXIuY2MKaW5kZXggNmVlMWMyMi4uNzkwNzZlZjY1IDEwMDY0NAotLS0gYS9jb250ZW50L3Rlc3QvdGVzdF9iYWNrZ3JvdW5kX3N5bmNfbWFuYWdlci5jYworKysgYi9jb250ZW50L3Rlc3QvdGVzdF9iYWNrZ3JvdW5kX3N5bmNfbWFuYWdlci5jYwpAQCAtMTAwLDYgKzEwMCwyMCBAQAogICBzdGQ6Om1vdmUoY2FsbGJhY2spLlJ1bihoYXNfbWFpbl9mcmFtZV9wcm92aWRlcl9ob3N0Xyk7CiB9CiAKK3ZvaWQgVGVzdEJhY2tncm91bmRTeW5jTWFuYWdlcjo6RmlyZVJlYWR5RXZlbnRzKAorICAgIGJsaW5rOjptb2pvbTo6QmFja2dyb3VuZFN5bmNUeXBlIHN5bmNfdHlwZSwKKyAgICBib29sIHJlc2NoZWR1bGUsCisgICAgYmFzZTo6T25jZUNsb3N1cmUgY2FsbGJhY2ssCisgICAgc3RkOjp1bmlxdWVfcHRyPEJhY2tncm91bmRTeW5jRXZlbnRLZWVwQWxpdmU+IGtlZXBhbGl2ZSkgeworICBpZiAoZG9udF9maXJlX3N5bmNfZXZlbnRzXykgeworICAgIGJhc2U6OlRocmVhZFRhc2tSdW5uZXJIYW5kbGU6OkdldCgpLT5Qb3N0VGFzayhGUk9NX0hFUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShjYWxsYmFjaykpOworICB9IGVsc2UgeworICAgIEJhY2tncm91bmRTeW5jTWFuYWdlcjo6RmlyZVJlYWR5RXZlbnRzKAorICAgICAgICBzeW5jX3R5cGUsIHJlc2NoZWR1bGUsIHN0ZDo6bW92ZShjYWxsYmFjayksIHN0ZDo6bW92ZShrZWVwYWxpdmUpKTsKKyAgfQorfQorCiB2b2lkIFRlc3RCYWNrZ3JvdW5kU3luY01hbmFnZXI6OlN0b3JlRGF0YUluQmFja2VuZENvbnRpbnVlKAogICAgIGludDY0X3Qgc3dfcmVnaXN0cmF0aW9uX2lkLAogICAgIGNvbnN0IHVybDo6T3JpZ2luJiBvcmlnaW4sCmRpZmYgLS1naXQgYS9jb250ZW50L3Rlc3QvdGVzdF9iYWNrZ3JvdW5kX3N5bmNfbWFuYWdlci5oIGIvY29udGVudC90ZXN0L3Rlc3RfYmFja2dyb3VuZF9zeW5jX21hbmFnZXIuaAppbmRleCBkNDAzODVlLi40NWNmOTBiIDEwMDY0NAotLS0gYS9jb250ZW50L3Rlc3QvdGVzdF9iYWNrZ3JvdW5kX3N5bmNfbWFuYWdlci5oCisrKyBiL2NvbnRlbnQvdGVzdC90ZXN0X2JhY2tncm91bmRfc3luY19tYW5hZ2VyLmgKQEAgLTk5LDYgKzk5LDE3IEBACiAgICAgICBibGluazo6bW9qb206OkJhY2tncm91bmRTeW5jVHlwZSBzeW5jX3R5cGUsCiAgICAgICBiYXNlOjpUaW1lIGxhc3RfYnJvd3Nlcl93YWtldXBfZm9yX3BlcmlvZGljX3N5bmMpIG92ZXJyaWRlOwogCisgIC8vIE92ZXJyaWRlIHRvIGRvIG5vdCBmaXJlIGFueSBzeW5jIGV2ZW50cyB3aGVuIGZpcmluZyBpcyBkaXNhYmxlZC4KKyAgdm9pZCBGaXJlUmVhZHlFdmVudHMoYmxpbms6Om1vam9tOjpCYWNrZ3JvdW5kU3luY1R5cGUgc3luY190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlc2NoZWR1bGUsCisgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6Ok9uY2VDbG9zdXJlIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QmFja2dyb3VuZFN5bmNFdmVudEtlZXBBbGl2ZT4ga2VlcGFsaXZlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpIG92ZXJyaWRlOworCisgIHZvaWQgU3VzcGVuZEZpcmluZ0V2ZW50cygpIHsgZG9udF9maXJlX3N5bmNfZXZlbnRzXyA9IHRydWU7IH0KKworICB2b2lkIFJlc3VtZUZpcmluZ0V2ZW50cygpIHsgZG9udF9maXJlX3N5bmNfZXZlbnRzXyA9IGZhbHNlOyB9CisKICBwcm90ZWN0ZWQ6CiAgIC8vIE92ZXJyaWRlIHRvIGFsbG93IGRlbGF5cyB0byBiZSBpbmplY3RlZCBieSB0ZXN0cy4KICAgdm9pZCBTdG9yZURhdGFJbkJhY2tlbmQoCkBAIC0xNDcsNiArMTU4LDcgQEAKICAgYm9vbCBkZWxheV9iYWNrZW5kXyA9IGZhbHNlOwogICBib29sIGhhc19tYWluX2ZyYW1lX3Byb3ZpZGVyX2hvc3RfID0gdHJ1ZTsKICAgYm9vbCBsYXN0X2NoYW5jZV8gPSBmYWxzZTsKKyAgYm9vbCBkb250X2ZpcmVfc3luY19ldmVudHNfID0gZmFsc2U7CiAgIGJhc2U6Ok9uY2VDbG9zdXJlIGNvbnRpbnVhdGlvbl87CiAgIERpc3BhdGNoU3luY0NhbGxiYWNrIGRpc3BhdGNoX3N5bmNfY2FsbGJhY2tfOwogICBEaXNwYXRjaFN5bmNDYWxsYmFjayBkaXNwYXRjaF9wZXJpb2RpY19zeW5jX2NhbGxiYWNrXzsKZGlmZiAtLWdpdCBhL2NvbnRlbnQvdGVzdC90ZXN0X3JlbmRlcl9mcmFtZV9ob3N0LmNjIGIvY29udGVudC90ZXN0L3Rlc3RfcmVuZGVyX2ZyYW1lX2hvc3QuY2MKaW5kZXggNDQyMmZiZS4uZWRhMmRiZmUgMTAwNjQ0Ci0tLSBhL2NvbnRlbnQvdGVzdC90ZXN0X3JlbmRlcl9mcmFtZV9ob3N0LmNjCisrKyBiL2NvbnRlbnQvdGVzdC90ZXN0X3JlbmRlcl9mcmFtZV9ob3N0LmNjCkBAIC0yMTksMTYgKzIxOSw2IEBACiAgIFNlbmROYXZpZ2F0ZVdpdGhQYXJhbXMoJnBhcmFtcywgd2FzX3dpdGhpbl9zYW1lX2RvY3VtZW50KTsKIH0KIAotdm9pZCBUZXN0UmVuZGVyRnJhbWVIb3N0OjpTaW11bGF0ZU5hdmlnYXRpb25TdG9wKCkgewotICBpZiAoaXNfbG9hZGluZygpKSB7Ci0gICAgT25EaWRTdG9wTG9hZGluZygpOwotICB9IGVsc2UgewotICAgIC8vIEV2ZW4gaWYgdGhlIFJlbmRlckZyYW1lSG9zdCBpcyBub3QgbG9hZGluZywgdGhlcmUgbWF5IHN0aWxsIGJlIGFuCi0gICAgLy8gb25nb2luZyBuYXZpZ2F0aW9uIGluIHRoZSBGcmFtZVRyZWVOb2RlLiBDYW5jZWwgdGhpcyBvbmUgYXMgd2VsbC4KLSAgICBmcmFtZV90cmVlX25vZGUoKS0+UmVzZXROYXZpZ2F0aW9uUmVxdWVzdChmYWxzZSwgdHJ1ZSk7Ci0gIH0KLX0KLQogdm9pZCBUZXN0UmVuZGVyRnJhbWVIb3N0OjpTZW5kQmVmb3JlVW5sb2FkQUNLKGJvb2wgcHJvY2VlZCkgewogICBiYXNlOjpUaW1lVGlja3Mgbm93ID0gYmFzZTo6VGltZVRpY2tzOjpOb3coKTsKICAgT25CZWZvcmVVbmxvYWRBQ0socHJvY2VlZCwgbm93LCBub3cpOwpAQCAtMjQxLDEyICsyMzEsMTIgQEAKIC8vIFRPRE8obG9vbnliZWFyKTogQWRkIGEgdGVzdCBmb3Igbm9uLWJvb2wgdHlwZSBQb2xpY3lWYWx1ZS4KIHZvaWQgVGVzdFJlbmRlckZyYW1lSG9zdDo6U2ltdWxhdGVGZWF0dXJlUG9saWN5SGVhZGVyKAogICAgIGJsaW5rOjptb2pvbTo6RmVhdHVyZVBvbGljeUZlYXR1cmUgZmVhdHVyZSwKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1cmw6Ok9yaWdpbj4mIHdoaXRlbGlzdCkgeworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVybDo6T3JpZ2luPiYgYWxsb3dsaXN0KSB7CiAgIGJsaW5rOjpQYXJzZWRGZWF0dXJlUG9saWN5IGhlYWRlcigxKTsKICAgaGVhZGVyWzBdLmZlYXR1cmUgPSBmZWF0dXJlOwogICBoZWFkZXJbMF0uZmFsbGJhY2tfdmFsdWUgPSBibGluazo6UG9saWN5VmFsdWUoZmFsc2UpOwogICBoZWFkZXJbMF0ub3BhcXVlX3ZhbHVlID0gYmxpbms6OlBvbGljeVZhbHVlKGZhbHNlKTsKLSAgZm9yIChjb25zdCBhdXRvJiBvcmlnaW4gOiB3aGl0ZWxpc3QpIHsKKyAgZm9yIChjb25zdCBhdXRvJiBvcmlnaW4gOiBhbGxvd2xpc3QpIHsKICAgICBoZWFkZXJbMF0udmFsdWVzLmluc2VydChzdGQ6OnBhaXI8dXJsOjpPcmlnaW4sIGJsaW5rOjpQb2xpY3lWYWx1ZT4oCiAgICAgICAgIG9yaWdpbiwgYmxpbms6OlBvbGljeVZhbHVlKHRydWUpKSk7CiAgIH0KQEAgLTcwMyw0ICs2OTMsOCBAQAogICAgICAgLkluaXRXaXRoTmV3UGlwZUFuZFBhc3NSZWNlaXZlcigpOwogfQogCit2b2lkIFRlc3RSZW5kZXJGcmFtZUhvc3Q6OlNpbXVsYXRlTG9hZGluZ0NvbXBsZXRlZCgpIHsKKyAgT25EaWRTdG9wTG9hZGluZygpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgY29udGVudApkaWZmIC0tZ2l0IGEvY29udGVudC90ZXN0L3Rlc3RfcmVuZGVyX2ZyYW1lX2hvc3QuaCBiL2NvbnRlbnQvdGVzdC90ZXN0X3JlbmRlcl9mcmFtZV9ob3N0LmgKaW5kZXggNjA0MzIzNy4uOGZjYzY0OCAxMDA2NDQKLS0tIGEvY29udGVudC90ZXN0L3Rlc3RfcmVuZGVyX2ZyYW1lX2hvc3QuaAorKysgYi9jb250ZW50L3Rlc3QvdGVzdF9yZW5kZXJfZnJhbWVfaG9zdC5oCkBAIC04Miw3ICs4Miw2IEBACiAgIHZvaWQgSW5pdGlhbGl6ZVJlbmRlckZyYW1lSWZOZWVkZWQoKSBvdmVycmlkZTsKICAgVGVzdFJlbmRlckZyYW1lSG9zdCogQXBwZW5kQ2hpbGQoY29uc3Qgc3RkOjpzdHJpbmcmIGZyYW1lX25hbWUpIG92ZXJyaWRlOwogICB2b2lkIERldGFjaCgpIG92ZXJyaWRlOwotICB2b2lkIFNpbXVsYXRlTmF2aWdhdGlvblN0b3AoKSBvdmVycmlkZTsKICAgdm9pZCBTZW5kTmF2aWdhdGVXaXRoVHJhbnNpdGlvbihpbnQgbmF2X2VudHJ5X2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGlkX2NyZWF0ZV9uZXdfZW50cnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1VSTCYgdXJsLApAQCAtOTEsNyArOTAsNyBAQAogICB2b2lkIFNpbXVsYXRlU3dhcE91dEFDSygpIG92ZXJyaWRlOwogICB2b2lkIFNpbXVsYXRlRmVhdHVyZVBvbGljeUhlYWRlcigKICAgICAgIGJsaW5rOjptb2pvbTo6RmVhdHVyZVBvbGljeUZlYXR1cmUgZmVhdHVyZSwKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVybDo6T3JpZ2luPiYgd2hpdGVsaXN0KSBvdmVycmlkZTsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVybDo6T3JpZ2luPiYgYWxsb3dsaXN0KSBvdmVycmlkZTsKICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBHZXRDb25zb2xlTWVzc2FnZXMoKSBvdmVycmlkZTsKIAogICB2b2lkIFNlbmROYXZpZ2F0ZShpbnQgbmF2X2VudHJ5X2lkLApAQCAtMjA4LDYgKzIwNywxMCBAQAogICAgIHJldHVybiBuYXZpZ2F0aW9uX3JlcXVlc3RzXzsKICAgfQogCisgIC8vIFNpbXVsYXRlcyBSZW5kZXJGcmFtZUhvc3QgZmluaXNoaW5nIGxvYWRpbmcgYW5kIGRpc3BhdGNoaW5nIGFsbCByZWxldmFudAorICAvLyBjYWxsYmFja3MuCisgIHZvaWQgU2ltdWxhdGVMb2FkaW5nQ29tcGxldGVkKCk7CisKICBwcm90ZWN0ZWQ6CiAgIHZvaWQgU2VuZENvbW1pdE5hdmlnYXRpb24oCiAgICAgICBtb2pvbTo6TmF2aWdhdGlvbkNsaWVudCogbmF2aWdhdGlvbl9jbGllbnQsCmRpZmYgLS1naXQgYS9jb250ZW50L3Rlc3Qvd2ViX3Rlc3Rfc3VwcG9ydC5jYyBiL2NvbnRlbnQvdGVzdC93ZWJfdGVzdF9zdXBwb3J0LmNjCmluZGV4IDJiNjE4N2MyLi5lZTc5YTczIDEwMDY0NAotLS0gYS9jb250ZW50L3Rlc3Qvd2ViX3Rlc3Rfc3VwcG9ydC5jYworKysgYi9jb250ZW50L3Rlc3Qvd2ViX3Rlc3Rfc3VwcG9ydC5jYwpAQCAtMTE0LDEyICsxMTQsNiBAQAogICByZXR1cm4gcmVuZGVyX2ZyYW1lX3Byb3h5OwogfQogCi1mbG9hdCBHZXRXaW5kb3dUb1ZpZXdwb3J0U2NhbGUoUmVuZGVyV2lkZ2V0KiByZW5kZXJfd2lkZ2V0KSB7Ci0gIGJsaW5rOjpXZWJGbG9hdFJlY3QgcmVjdCgwLCAwLCAxLjBmLCAwLjApOwotICByZW5kZXJfd2lkZ2V0LT5Db252ZXJ0V2luZG93VG9WaWV3cG9ydCgmcmVjdCk7Ci0gIHJldHVybiByZWN0LndpZHRoOwotfQotCiAjaWYgZGVmaW5lZChPU19XSU4pCiAvLyBEaXJlY3RXcml0ZSBvbmx5IGhhcyBhY2Nlc3MgdG8gJVdJTkRJUiVcRm9udHMgYnkgZGVmYXVsdC4gRm9yIGRldmVsb3BlcgogLy8gc2lkZS1sb2FkaW5nLCBzdXBwb3J0IGtSZWdpc3RlckZvbnRGaWxlcyB0byBhbGxvdyBhY2Nlc3MgdG8gYWRkaXRpb25hbCBmb250cy4KQEAgLTIyMywxMyArMjE3LDYgQEAKICAgcmVuZGVyX3ZpZXdfaW1wbC0+R2V0V2lkZ2V0KCktPlNldERldmljZVNjYWxlRmFjdG9yRm9yVGVzdGluZyhmYWN0b3IpOwogfQogCi1mbG9hdCBHZXRXaW5kb3dUb1ZpZXdwb3J0U2NhbGUoUmVuZGVyVmlldyogcmVuZGVyX3ZpZXcpIHsKLSAgUmVuZGVyVmlld0ltcGwqIHJlbmRlcl92aWV3X2ltcGwgPSBzdGF0aWNfY2FzdDxSZW5kZXJWaWV3SW1wbCo+KHJlbmRlcl92aWV3KTsKLSAgYmxpbms6OldlYkZsb2F0UmVjdCByZWN0KDAsIDAsIDEuMGYsIDAuMCk7Ci0gIHJlbmRlcl92aWV3X2ltcGwtPnBhZ2VfcHJvcGVydGllcygpLT5Db252ZXJ0V2luZG93VG9WaWV3cG9ydCgmcmVjdCk7Ci0gIHJldHVybiByZWN0LndpZHRoOwotfQotCiBzdGQ6OnVuaXF1ZV9wdHI8Ymxpbms6OldlYklucHV0RXZlbnQ+IFRyYW5zZm9ybVNjcmVlblRvV2lkZ2V0Q29vcmRpbmF0ZXMoCiAgICAgdGVzdF9ydW5uZXI6OldlYldpZGdldFRlc3RQcm94eSogd2ViX3dpZGdldF90ZXN0X3Byb3h5LAogICAgIGNvbnN0IGJsaW5rOjpXZWJJbnB1dEV2ZW50JiBldmVudCkgewpAQCAtMjM4LDggKzIyNSwxMyBAQAogICBSZW5kZXJXaWRnZXQqIHJlbmRlcl93aWRnZXQgPQogICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyV2lkZ2V0Kj4od2ViX3dpZGdldF90ZXN0X3Byb3h5KTsKIAorICAvLyBDb21wdXRlIHRoZSBzY2FsZSBmcm9tIHdpbmRvdyAoZHNmLWluZGVwZW5kZW50KSB0byBibGluayAoZHNmLWRlcGVuZGVudAorICAvLyB1bmRlciBVc2Vab29tRm9yRFNGKS4KKyAgYmxpbms6OldlYkZsb2F0UmVjdCByZWN0KDAsIDAsIDEuMGYsIDAuMCk7CisgIHJlbmRlcl93aWRnZXQtPkNvbnZlcnRXaW5kb3dUb1ZpZXdwb3J0KCZyZWN0KTsKKyAgZmxvYXQgc2NhbGUgPSByZWN0LndpZHRoOworCiAgIGJsaW5rOjpXZWJSZWN0IHZpZXdfcmVjdCA9IHJlbmRlcl93aWRnZXQtPlZpZXdSZWN0KCk7Ci0gIGZsb2F0IHNjYWxlID0gR2V0V2luZG93VG9WaWV3cG9ydFNjYWxlKHJlbmRlcl93aWRnZXQpOwogICBnZng6OlZlY3RvcjJkIGRlbHRhKC12aWV3X3JlY3QueCwgLXZpZXdfcmVjdC55KTsKICAgcmV0dXJuIHVpOjpUcmFuc2xhdGVBbmRTY2FsZVdlYklucHV0RXZlbnQoZXZlbnQsIGRlbHRhLCBzY2FsZSk7CiB9CmRpZmYgLS1naXQgYS9kZXZpY2UvdnIvYnVpbGRmbGFncy9idWlsZGZsYWdzLmduaSBiL2RldmljZS92ci9idWlsZGZsYWdzL2J1aWxkZmxhZ3MuZ25pCmluZGV4IGZjMmY1ZTcuLmI5NTg2MTQgMTAwNjQ0Ci0tLSBhL2RldmljZS92ci9idWlsZGZsYWdzL2J1aWxkZmxhZ3MuZ25pCisrKyBiL2RldmljZS92ci9idWlsZGZsYWdzL2J1aWxkZmxhZ3MuZ25pCkBAIC00NywxMCArNDcsNCBAQAogICAjIFRPRE8oY3JidWcuY29tLzg0MzM3NCk6IEFSIHNob3VsZCBub3QgZGVwZW5kIG9uIHxlbmFibGVfdnJ8LgogICBlbmFibGVfYXJjb3JlID0gZW5hYmxlX3ZyICYmIGlzX2FuZHJvaWQgJiYgIWlzX2Nocm9tZWNhc3QgJiYKICAgICAgICAgICAgICAgICAgIChjdXJyZW50X2NwdSA9PSAiYXJtIiB8fCBjdXJyZW50X2NwdSA9PSAiYXJtNjQiKQotCi0gICMgV2hldGhlciB0byBjcmVhdGUgQVIgbW9kdWxlIGFzIGFuIGFzeW5jaHJvbm91cyBERk0uCi0gIGFzeW5jX2FyID0gZmFsc2UKLQotICAjIFdoZXRoZXIgdG8gY3JlYXRlIFZSIG1vZHVsZSBhcyBhbiBhc3luY2hyb25vdXMgREZNLgotICBhc3luY192ciA9IGZhbHNlCiB9CmRpZmYgLS1naXQgYS9kZXZpY2UvdnIvaXNvbGF0ZWRfZ2FtZXBhZF9kYXRhX2ZldGNoZXIuY2MgYi9kZXZpY2UvdnIvaXNvbGF0ZWRfZ2FtZXBhZF9kYXRhX2ZldGNoZXIuY2MKaW5kZXggNTAxNzNmMzkuLjU1ZWEwZWIgMTAwNjQ0Ci0tLSBhL2RldmljZS92ci9pc29sYXRlZF9nYW1lcGFkX2RhdGFfZmV0Y2hlci5jYworKysgYi9kZXZpY2UvdnIvaXNvbGF0ZWRfZ2FtZXBhZF9kYXRhX2ZldGNoZXIuY2MKQEAgLTc3LDggKzc3LDkgQEAKIAogc3RkOjp1bmlxdWVfcHRyPEdhbWVwYWREYXRhRmV0Y2hlcj4KIElzb2xhdGVkR2FtZXBhZERhdGFGZXRjaGVyOjpGYWN0b3J5OjpDcmVhdGVEYXRhRmV0Y2hlcigpIHsKLSAgZGV2aWNlOjptb2pvbTo6SXNvbGF0ZWRYUkdhbWVwYWRQcm92aWRlclB0ciBwcm92aWRlcjsKLSAgZmFjdG9yeV8tPkdldElzb2xhdGVkWFJHYW1lcGFkUHJvdmlkZXIobW9qbzo6TWFrZVJlcXVlc3QoJnByb3ZpZGVyKSk7CisgIG1vam86OlBlbmRpbmdSZW1vdGU8ZGV2aWNlOjptb2pvbTo6SXNvbGF0ZWRYUkdhbWVwYWRQcm92aWRlcj4gcHJvdmlkZXI7CisgIGZhY3RvcnlfLT5HZXRJc29sYXRlZFhSR2FtZXBhZFByb3ZpZGVyKAorICAgICAgcHJvdmlkZXIuSW5pdFdpdGhOZXdQaXBlQW5kUGFzc1JlY2VpdmVyKCkpOwogICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxJc29sYXRlZEdhbWVwYWREYXRhRmV0Y2hlcj4oZGlzcGxheV9pZF8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocHJvdmlkZXIpKTsKIH0KQEAgLTg5LDExICs5MCwxMSBAQAogCiBJc29sYXRlZEdhbWVwYWREYXRhRmV0Y2hlcjo6SXNvbGF0ZWRHYW1lcGFkRGF0YUZldGNoZXIoCiAgICAgZGV2aWNlOjptb2pvbTo6WFJEZXZpY2VJZCBkaXNwbGF5X2lkLAotICAgIGRldmljZTo6bW9qb206Oklzb2xhdGVkWFJHYW1lcGFkUHJvdmlkZXJQdHIgcHJvdmlkZXIpCisgICAgbW9qbzo6UGVuZGluZ1JlbW90ZTxkZXZpY2U6Om1vam9tOjpJc29sYXRlZFhSR2FtZXBhZFByb3ZpZGVyPiBwcm92aWRlcikKICAgICA6IGRpc3BsYXlfaWRfKGRpc3BsYXlfaWQpIHsKICAgLy8gV2UgYmluZCBwcm92aWRlcl8gb24gdGhlIHBvbGluZyB0aHJlYWQsIGJ1dCB3ZSdyZSBjcmVhdGVkIG9uIHRoZSBtYWluIFVJCiAgIC8vIHRocmVhZC4KLSAgcHJvdmlkZXJfaW5mb18gPSBwcm92aWRlci5QYXNzSW50ZXJmYWNlKCk7CisgIHBlbmRpbmdfcHJvdmlkZXJfID0gc3RkOjptb3ZlKHByb3ZpZGVyKTsKIH0KIAogSXNvbGF0ZWRHYW1lcGFkRGF0YUZldGNoZXI6On5Jc29sYXRlZEdhbWVwYWREYXRhRmV0Y2hlcigpID0gZGVmYXVsdDsKQEAgLTE2Miw4ICsxNjMsOCBAQAogfQogCiB2b2lkIElzb2xhdGVkR2FtZXBhZERhdGFGZXRjaGVyOjpHZXRHYW1lcGFkRGF0YShib29sIGRldmljZXNfY2hhbmdlZF9oaW50KSB7Ci0gIGlmICghcHJvdmlkZXJfICYmIHByb3ZpZGVyX2luZm9fKSB7Ci0gICAgcHJvdmlkZXJfLkJpbmQoc3RkOjptb3ZlKHByb3ZpZGVyX2luZm9fKSk7CisgIGlmICghcHJvdmlkZXJfICYmIHBlbmRpbmdfcHJvdmlkZXJfKSB7CisgICAgcHJvdmlkZXJfLkJpbmQoc3RkOjptb3ZlKHBlbmRpbmdfcHJvdmlkZXJfKSk7CiAgIH0KIAogICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgcHJvdmlkZXIsIHdlIGNhbid0IGdpdmUgb3V0IGRhdGEuCmRpZmYgLS1naXQgYS9kZXZpY2UvdnIvaXNvbGF0ZWRfZ2FtZXBhZF9kYXRhX2ZldGNoZXIuaCBiL2RldmljZS92ci9pc29sYXRlZF9nYW1lcGFkX2RhdGFfZmV0Y2hlci5oCmluZGV4IDM5NTExNDAuLjg0MDJjMjEgMTAwNjQ0Ci0tLSBhL2RldmljZS92ci9pc29sYXRlZF9nYW1lcGFkX2RhdGFfZmV0Y2hlci5oCisrKyBiL2RldmljZS92ci9pc29sYXRlZF9nYW1lcGFkX2RhdGFfZmV0Y2hlci5oCkBAIC04LDYgKzgsOCBAQAogI2luY2x1ZGUgImRldmljZS9nYW1lcGFkL2dhbWVwYWRfZGF0YV9mZXRjaGVyLmgiCiAjaW5jbHVkZSAiZGV2aWNlL3ZyL3B1YmxpYy9tb2pvbS9pc29sYXRlZF94cl9zZXJ2aWNlLm1vam9tLmgiCiAjaW5jbHVkZSAiZGV2aWNlL3ZyL3ZyX2RldmljZS5oIgorI2luY2x1ZGUgIm1vam8vcHVibGljL2NwcC9iaW5kaW5ncy9wZW5kaW5nX3JlbW90ZS5oIgorI2luY2x1ZGUgIm1vam8vcHVibGljL2NwcC9iaW5kaW5ncy9yZW1vdGUuaCIKIAogbmFtZXNwYWNlIGRldmljZSB7CiAKQEAgLTMzLDcgKzM1LDcgQEAKIAogICBJc29sYXRlZEdhbWVwYWREYXRhRmV0Y2hlcigKICAgICAgIGRldmljZTo6bW9qb206OlhSRGV2aWNlSWQgZGlzcGxheV9pZCwKLSAgICAgIGRldmljZTo6bW9qb206Oklzb2xhdGVkWFJHYW1lcGFkUHJvdmlkZXJQdHIgcHJvdmlkZXIpOworICAgICAgbW9qbzo6UGVuZGluZ1JlbW90ZTxkZXZpY2U6Om1vam9tOjpJc29sYXRlZFhSR2FtZXBhZFByb3ZpZGVyPiBwcm92aWRlcik7CiAgIH5Jc29sYXRlZEdhbWVwYWREYXRhRmV0Y2hlcigpIG92ZXJyaWRlOwogCiAgIEdhbWVwYWRTb3VyY2Ugc291cmNlKCkgb3ZlcnJpZGU7CkBAIC00OSwxMCArNTEsMTAgQEAKICAgYm9vbCBoYXZlX291dHN0YW5kaW5nX3JlcXVlc3RfID0gZmFsc2U7CiAgIHN0ZDo6c2V0PHVuc2lnbmVkIGludD4gYWN0aXZlX2dhbWVwYWRzXzsKICAgZGV2aWNlOjptb2pvbTo6WFJHYW1lcGFkRGF0YVB0ciBkYXRhXzsKLSAgZGV2aWNlOjptb2pvbTo6SXNvbGF0ZWRYUkdhbWVwYWRQcm92aWRlclB0cgorICBtb2pvOjpSZW1vdGU8ZGV2aWNlOjptb2pvbTo6SXNvbGF0ZWRYUkdhbWVwYWRQcm92aWRlcj4KICAgICAgIHByb3ZpZGVyXzsgIC8vIEJvdW5kIG9uIHRoZSBwb2xsaW5nIHRocmVhZC4KLSAgZGV2aWNlOjptb2pvbTo6SXNvbGF0ZWRYUkdhbWVwYWRQcm92aWRlclB0ckluZm8KLSAgICAgIHByb3ZpZGVyX2luZm9fOyAgLy8gUmVjZWl2ZWQgb24gdGhlIFVJIHRocmVhZCwgYm91bmQgd2hlbiBwb2xsZWQuCisgIG1vam86OlBlbmRpbmdSZW1vdGU8ZGV2aWNlOjptb2pvbTo6SXNvbGF0ZWRYUkdhbWVwYWRQcm92aWRlcj4KKyAgICAgIHBlbmRpbmdfcHJvdmlkZXJfOyAgLy8gUmVjZWl2ZWQgb24gdGhlIFVJIHRocmVhZCwgYm91bmQgd2hlbiBwb2xsZWQuCiAKICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKElzb2xhdGVkR2FtZXBhZERhdGFGZXRjaGVyKTsKIH07CmRpZmYgLS1naXQgYS9kZXZpY2UvdnIvb2N1bHVzL29jdWx1c19kZXZpY2UuY2MgYi9kZXZpY2UvdnIvb2N1bHVzL29jdWx1c19kZXZpY2UuY2MKaW5kZXggMjgwNTA5MDguLjYyYzNlZTQ4IDEwMDY0NAotLS0gYS9kZXZpY2UvdnIvb2N1bHVzL29jdWx1c19kZXZpY2UuY2MKKysrIGIvZGV2aWNlL3ZyL29jdWx1cy9vY3VsdXNfZGV2aWNlLmNjCkBAIC0xNTQsMjAgKzE1NCwyMCBAQAogICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIC8vIElmIHdlIGhhdmUgYSBwZW5kaW5nIGdhbWVwYWQgcHJvdmlkZXIgcmVxdWVzdCB3aGVuIHN0YXJ0aW5nIHRoZSByZW5kZXIKLSAgICAvLyBsb29wLCBwb3N0IHRoZSByZXF1ZXN0IG92ZXIgdG8gdGhlIHJlbmRlciBsb29wIHRvIGJlIGJvdW5kLgotICAgIGlmIChwcm92aWRlcl9yZXF1ZXN0XykgeworICAgIC8vIElmIHdlIGhhdmUgYSBwZW5kaW5nIGdhbWVwYWQgcHJvdmlkZXIgcmVjZWl2ZXIgd2hlbiBzdGFydGluZyB0aGUgcmVuZGVyCisgICAgLy8gbG9vcCwgcG9zdCB0aGUgcmVjZWl2ZXIgb3ZlciB0byB0aGUgcmVuZGVyIGxvb3AgdG8gYmUgYm91bmQuCisgICAgaWYgKHByb3ZpZGVyX3JlY2VpdmVyXykgewogICAgICAgcmVuZGVyX2xvb3BfLT50YXNrX3J1bm5lcigpLT5Qb3N0VGFzaygKICAgICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKCZYUkNvbXBvc2l0b3JDb21tb246OlJlcXVlc3RHYW1lcGFkUHJvdmlkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHJlbmRlcl9sb29wXy5nZXQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocHJvdmlkZXJfcmVxdWVzdF8pKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocHJvdmlkZXJfcmVjZWl2ZXJfKSkpOwogICAgIH0KIAotICAgIGlmIChvdmVybGF5X3JlcXVlc3RfKSB7CisgICAgaWYgKG92ZXJsYXlfcmVjZWl2ZXJfKSB7CiAgICAgICByZW5kZXJfbG9vcF8tPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAogICAgICAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZE9uY2UoJlhSQ29tcG9zaXRvckNvbW1vbjo6UmVxdWVzdE92ZXJsYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHJlbmRlcl9sb29wXy5nZXQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUob3ZlcmxheV9yZXF1ZXN0XykpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShvdmVybGF5X3JlY2VpdmVyXykpKTsKICAgICB9CiAgIH0KIApAQCAtMjkwLDMwICsyOTAsMzAgQEAKIH0KIAogdm9pZCBPY3VsdXNEZXZpY2U6OkdldElzb2xhdGVkWFJHYW1lcGFkUHJvdmlkZXIoCi0gICAgbW9qb206Oklzb2xhdGVkWFJHYW1lcGFkUHJvdmlkZXJSZXF1ZXN0IHByb3ZpZGVyX3JlcXVlc3QpIHsKLSAgLy8gV2UgYmluZCB0aGUgcHJvdmlkZXJfcmVxdWVzdCBvbiB0aGUgcmVuZGVyIGxvb3AgdGhyZWFkLCBzbyBnYW1lcGFkIGRhdGEgaXMKKyAgICBtb2pvOjpQZW5kaW5nUmVjZWl2ZXI8bW9qb206Oklzb2xhdGVkWFJHYW1lcGFkUHJvdmlkZXI+IHByb3ZpZGVyX3JlY2VpdmVyKSB7CisgIC8vIFdlIGJpbmQgdGhlIHByb3ZpZGVyX3JlY2VpdmVyIG9uIHRoZSByZW5kZXIgbG9vcCB0aHJlYWQsIHNvIGdhbWVwYWQgZGF0YSBpcwogICAvLyB1cGRhdGVkIGF0IHRoZSByZW5kZXJpbmcgcmF0ZS4KLSAgLy8gSWYgd2UgaGF2ZW4ndCBzdGFydGVkIHRoZSByZW5kZXIgbG9vcCB5ZXQsIHBvc3Rwb25lIGJpbmRpbmcgdGhlIHJlcXVlc3QKKyAgLy8gSWYgd2UgaGF2ZW4ndCBzdGFydGVkIHRoZSByZW5kZXIgbG9vcCB5ZXQsIHBvc3Rwb25lIGJpbmRpbmcgdGhlIHJlY2VpdmVyCiAgIC8vIHVudGlsIHdlIGRvLgogICBpZiAocmVuZGVyX2xvb3BfLT5Jc1J1bm5pbmcoKSkgewogICAgIHJlbmRlcl9sb29wXy0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soCiAgICAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZE9uY2UoJlhSQ29tcG9zaXRvckNvbW1vbjo6UmVxdWVzdEdhbWVwYWRQcm92aWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHJlbmRlcl9sb29wXy5nZXQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHByb3ZpZGVyX3JlcXVlc3QpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHByb3ZpZGVyX3JlY2VpdmVyKSkpOwogICB9IGVsc2UgewotICAgIHByb3ZpZGVyX3JlcXVlc3RfID0gc3RkOjptb3ZlKHByb3ZpZGVyX3JlcXVlc3QpOworICAgIHByb3ZpZGVyX3JlY2VpdmVyXyA9IHN0ZDo6bW92ZShwcm92aWRlcl9yZWNlaXZlcik7CiAgIH0KIH0KIAogdm9pZCBPY3VsdXNEZXZpY2U6OkNyZWF0ZUltbWVyc2l2ZU92ZXJsYXkoCi0gICAgbW9qb206OkltbWVyc2l2ZU92ZXJsYXlSZXF1ZXN0IG92ZXJsYXlfcmVxdWVzdCkgeworICAgIG1vam86OlBlbmRpbmdSZWNlaXZlcjxtb2pvbTo6SW1tZXJzaXZlT3ZlcmxheT4gb3ZlcmxheV9yZWNlaXZlcikgewogICBpZiAocmVuZGVyX2xvb3BfLT5Jc1J1bm5pbmcoKSkgewogICAgIHJlbmRlcl9sb29wXy0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soCiAgICAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZE9uY2UoJlhSQ29tcG9zaXRvckNvbW1vbjo6UmVxdWVzdE92ZXJsYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChyZW5kZXJfbG9vcF8uZ2V0KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShvdmVybGF5X3JlcXVlc3QpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKG92ZXJsYXlfcmVjZWl2ZXIpKSk7CiAgIH0gZWxzZSB7Ci0gICAgb3ZlcmxheV9yZXF1ZXN0XyA9IHN0ZDo6bW92ZShvdmVybGF5X3JlcXVlc3QpOworICAgIG92ZXJsYXlfcmVjZWl2ZXJfID0gc3RkOjptb3ZlKG92ZXJsYXlfcmVjZWl2ZXIpOwogICB9CiB9CiAKZGlmZiAtLWdpdCBhL2RldmljZS92ci9vY3VsdXMvb2N1bHVzX2RldmljZS5oIGIvZGV2aWNlL3ZyL29jdWx1cy9vY3VsdXNfZGV2aWNlLmgKaW5kZXggYTQ0NzU0YS4uM2VmZTJkOCAxMDA2NDQKLS0tIGEvZGV2aWNlL3ZyL29jdWx1cy9vY3VsdXNfZGV2aWNlLmgKKysrIGIvZGV2aWNlL3ZyL29jdWx1cy9vY3VsdXNfZGV2aWNlLmgKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlICJkZXZpY2UvdnIvcHVibGljL21vam9tL3ZyX3NlcnZpY2UubW9qb20uaCIKICNpbmNsdWRlICJkZXZpY2UvdnIvdnJfZGV2aWNlX2Jhc2UuaCIKICNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvYmluZGluZ3MvYmluZGluZy5oIgorI2luY2x1ZGUgIm1vam8vcHVibGljL2NwcC9iaW5kaW5ncy9wZW5kaW5nX3JlY2VpdmVyLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvbGlib3ZyL3NyYy9JbmNsdWRlL09WUl9DQVBJLmgiCiAKIG5hbWVzcGFjZSBkZXZpY2UgewpAQCAtNTIsMTEgKzUzLDEyIEBACiAKICAgLy8gbW9qb206Oklzb2xhdGVkWFJHYW1lcGFkUHJvdmlkZXJGYWN0b3J5CiAgIHZvaWQgR2V0SXNvbGF0ZWRYUkdhbWVwYWRQcm92aWRlcigKLSAgICAgIG1vam9tOjpJc29sYXRlZFhSR2FtZXBhZFByb3ZpZGVyUmVxdWVzdCBwcm92aWRlcl9yZXF1ZXN0KSBvdmVycmlkZTsKKyAgICAgIG1vam86OlBlbmRpbmdSZWNlaXZlcjxtb2pvbTo6SXNvbGF0ZWRYUkdhbWVwYWRQcm92aWRlcj4gcHJvdmlkZXJfcmVjZWl2ZXIpCisgICAgICBvdmVycmlkZTsKIAogICAvLyBYUkNvbXBvc2l0b3JIb3N0CiAgIHZvaWQgQ3JlYXRlSW1tZXJzaXZlT3ZlcmxheSgKLSAgICAgIG1vam9tOjpJbW1lcnNpdmVPdmVybGF5UmVxdWVzdCBvdmVybGF5X3JlcXVlc3QpIG92ZXJyaWRlOworICAgICAgbW9qbzo6UGVuZGluZ1JlY2VpdmVyPG1vam9tOjpJbW1lcnNpdmVPdmVybGF5PiBvdmVybGF5X3JlY2VpdmVyKSBvdmVycmlkZTsKIAogICB2b2lkIE9uUHJlc2VudGF0aW9uRW5kZWQoKTsKICAgYm9vbCBFbnN1cmVWYWxpZERpc3BsYXlJbmZvKCk7CkBAIC03MiwxMCArNzQsMTAgQEAKICAgbW9qbzo6QmluZGluZzxtb2pvbTo6WFJTZXNzaW9uQ29udHJvbGxlcj4gZXhjbHVzaXZlX2NvbnRyb2xsZXJfYmluZGluZ187CiAgIG1vam86OkJpbmRpbmc8bW9qb206Oklzb2xhdGVkWFJHYW1lcGFkUHJvdmlkZXJGYWN0b3J5PgogICAgICAgZ2FtZXBhZF9wcm92aWRlcl9mYWN0b3J5X2JpbmRpbmdfOwotICBtb2pvbTo6SXNvbGF0ZWRYUkdhbWVwYWRQcm92aWRlclJlcXVlc3QgcHJvdmlkZXJfcmVxdWVzdF87CisgIG1vam86OlBlbmRpbmdSZWNlaXZlcjxtb2pvbTo6SXNvbGF0ZWRYUkdhbWVwYWRQcm92aWRlcj4gcHJvdmlkZXJfcmVjZWl2ZXJfOwogCiAgIG1vam86OkJpbmRpbmc8bW9qb206OlhSQ29tcG9zaXRvckhvc3Q+IGNvbXBvc2l0b3JfaG9zdF9iaW5kaW5nXzsKLSAgbW9qb206OkltbWVyc2l2ZU92ZXJsYXlSZXF1ZXN0IG92ZXJsYXlfcmVxdWVzdF87CisgIG1vam86OlBlbmRpbmdSZWNlaXZlcjxtb2pvbTo6SW1tZXJzaXZlT3ZlcmxheT4gb3ZlcmxheV9yZWNlaXZlcl87CiAKICAgYmFzZTo6V2Vha1B0ckZhY3Rvcnk8T2N1bHVzRGV2aWNlPiB3ZWFrX3B0cl9mYWN0b3J5XzsKIApkaWZmIC0tZ2l0IGEvZGV2aWNlL3ZyL29wZW52ci9vcGVudnJfZGV2aWNlLmNjIGIvZGV2aWNlL3ZyL29wZW52ci9vcGVudnJfZGV2aWNlLmNjCmluZGV4IDNhMmNlZDYuLjQyZWQzOTc2IDEwMDY0NAotLS0gYS9kZXZpY2UvdnIvb3BlbnZyL29wZW52cl9kZXZpY2UuY2MKKysrIGIvZGV2aWNlL3ZyL29wZW52ci9vcGVudnJfZGV2aWNlLmNjCkBAIC0xODEsMTggKzE4MSwxOCBAQAogICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGlmIChwcm92aWRlcl9yZXF1ZXN0XykgeworICAgIGlmIChwcm92aWRlcl9yZWNlaXZlcl8pIHsKICAgICAgIHJlbmRlcl9sb29wXy0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soCiAgICAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZSgmWFJDb21wb3NpdG9yQ29tbW9uOjpSZXF1ZXN0R2FtZXBhZFByb3ZpZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChyZW5kZXJfbG9vcF8uZ2V0KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHByb3ZpZGVyX3JlcXVlc3RfKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHByb3ZpZGVyX3JlY2VpdmVyXykpKTsKICAgICB9CiAKLSAgICBpZiAob3ZlcmxheV9yZXF1ZXN0XykgeworICAgIGlmIChvdmVybGF5X3JlY2VpdmVyXykgewogICAgICAgcmVuZGVyX2xvb3BfLT50YXNrX3J1bm5lcigpLT5Qb3N0VGFzaygKICAgICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKCZYUkNvbXBvc2l0b3JDb21tb246OlJlcXVlc3RPdmVybGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChyZW5kZXJfbG9vcF8uZ2V0KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKG92ZXJsYXlfcmVxdWVzdF8pKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUob3ZlcmxheV9yZWNlaXZlcl8pKSk7CiAgICAgfQogICB9CiAKQEAgLTI4MCwyNiArMjgwLDI2IEBACiB9CiAKIHZvaWQgT3BlblZSRGV2aWNlOjpHZXRJc29sYXRlZFhSR2FtZXBhZFByb3ZpZGVyKAotICAgIG1vam9tOjpJc29sYXRlZFhSR2FtZXBhZFByb3ZpZGVyUmVxdWVzdCBwcm92aWRlcl9yZXF1ZXN0KSB7CisgICAgbW9qbzo6UGVuZGluZ1JlY2VpdmVyPG1vam9tOjpJc29sYXRlZFhSR2FtZXBhZFByb3ZpZGVyPiBwcm92aWRlcl9yZWNlaXZlcikgewogICBpZiAocmVuZGVyX2xvb3BfLT5Jc1J1bm5pbmcoKSkgewogICAgIHJlbmRlcl9sb29wXy0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soCiAgICAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZE9uY2UoJlhSQ29tcG9zaXRvckNvbW1vbjo6UmVxdWVzdEdhbWVwYWRQcm92aWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHJlbmRlcl9sb29wXy5nZXQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHByb3ZpZGVyX3JlcXVlc3QpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHByb3ZpZGVyX3JlY2VpdmVyKSkpOwogICB9IGVsc2UgewotICAgIHByb3ZpZGVyX3JlcXVlc3RfID0gc3RkOjptb3ZlKHByb3ZpZGVyX3JlcXVlc3QpOworICAgIHByb3ZpZGVyX3JlY2VpdmVyXyA9IHN0ZDo6bW92ZShwcm92aWRlcl9yZWNlaXZlcik7CiAgIH0KIH0KIAogdm9pZCBPcGVuVlJEZXZpY2U6OkNyZWF0ZUltbWVyc2l2ZU92ZXJsYXkoCi0gICAgbW9qb206OkltbWVyc2l2ZU92ZXJsYXlSZXF1ZXN0IG92ZXJsYXlfcmVxdWVzdCkgeworICAgIG1vam86OlBlbmRpbmdSZWNlaXZlcjxtb2pvbTo6SW1tZXJzaXZlT3ZlcmxheT4gb3ZlcmxheV9yZWNlaXZlcikgewogICBpZiAocmVuZGVyX2xvb3BfLT5Jc1J1bm5pbmcoKSkgewogICAgIHJlbmRlcl9sb29wXy0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soCiAgICAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZE9uY2UoJlhSQ29tcG9zaXRvckNvbW1vbjo6UmVxdWVzdE92ZXJsYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChyZW5kZXJfbG9vcF8uZ2V0KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShvdmVybGF5X3JlcXVlc3QpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKG92ZXJsYXlfcmVjZWl2ZXIpKSk7CiAgIH0gZWxzZSB7Ci0gICAgb3ZlcmxheV9yZXF1ZXN0XyA9IHN0ZDo6bW92ZShvdmVybGF5X3JlcXVlc3QpOworICAgIG92ZXJsYXlfcmVjZWl2ZXJfID0gc3RkOjptb3ZlKG92ZXJsYXlfcmVjZWl2ZXIpOwogICB9CiB9CiAKZGlmZiAtLWdpdCBhL2RldmljZS92ci9vcGVudnIvb3BlbnZyX2RldmljZS5oIGIvZGV2aWNlL3ZyL29wZW52ci9vcGVudnJfZGV2aWNlLmgKaW5kZXggZDg1MmVlYTE5Li44NDg1ZjJjIDEwMDY0NAotLS0gYS9kZXZpY2UvdnIvb3BlbnZyL29wZW52cl9kZXZpY2UuaAorKysgYi9kZXZpY2UvdnIvb3BlbnZyL29wZW52cl9kZXZpY2UuaApAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgImRldmljZS92ci9wdWJsaWMvbW9qb20vdnJfc2VydmljZS5tb2pvbS5oIgogI2luY2x1ZGUgImRldmljZS92ci92cl9kZXZpY2VfYmFzZS5oIgogI2luY2x1ZGUgIm1vam8vcHVibGljL2NwcC9iaW5kaW5ncy9iaW5kaW5nLmgiCisjaW5jbHVkZSAibW9qby9wdWJsaWMvY3BwL2JpbmRpbmdzL3BlbmRpbmdfcmVjZWl2ZXIuaCIKIAogbmFtZXNwYWNlIGRldmljZSB7CiAKQEAgLTU2LDExICs1NywxMiBAQAogCiAgIC8vIG1vam9tOjpJc29sYXRlZFhSR2FtZXBhZFByb3ZpZGVyRmFjdG9yeQogICB2b2lkIEdldElzb2xhdGVkWFJHYW1lcGFkUHJvdmlkZXIoCi0gICAgICBtb2pvbTo6SXNvbGF0ZWRYUkdhbWVwYWRQcm92aWRlclJlcXVlc3QgcHJvdmlkZXJfcmVxdWVzdCkgb3ZlcnJpZGU7CisgICAgICBtb2pvOjpQZW5kaW5nUmVjZWl2ZXI8bW9qb206Oklzb2xhdGVkWFJHYW1lcGFkUHJvdmlkZXI+IHByb3ZpZGVyX3JlY2VpdmVyKQorICAgICAgb3ZlcnJpZGU7CiAKICAgLy8gWFJDb21wb3NpdG9ySG9zdAogICB2b2lkIENyZWF0ZUltbWVyc2l2ZU92ZXJsYXkoCi0gICAgICBtb2pvbTo6SW1tZXJzaXZlT3ZlcmxheVJlcXVlc3Qgb3ZlcmxheV9yZXF1ZXN0KSBvdmVycmlkZTsKKyAgICAgIG1vam86OlBlbmRpbmdSZWNlaXZlcjxtb2pvbTo6SW1tZXJzaXZlT3ZlcmxheT4gb3ZlcmxheV9yZWNlaXZlcikgb3ZlcnJpZGU7CiAKICAgdm9pZCBPblByZXNlbnRpbmdDb250cm9sbGVyTW9qb0Nvbm5lY3Rpb25FcnJvcigpOwogICB2b2lkIE9uUHJlc2VudGF0aW9uRW5kZWQoKTsKQEAgLTc2LDEwICs3OCwxMCBAQAogCiAgIG1vam86OkJpbmRpbmc8bW9qb206Oklzb2xhdGVkWFJHYW1lcGFkUHJvdmlkZXJGYWN0b3J5PgogICAgICAgZ2FtZXBhZF9wcm92aWRlcl9mYWN0b3J5X2JpbmRpbmdfOwotICBtb2pvbTo6SXNvbGF0ZWRYUkdhbWVwYWRQcm92aWRlclJlcXVlc3QgcHJvdmlkZXJfcmVxdWVzdF87CisgIG1vam86OlBlbmRpbmdSZWNlaXZlcjxtb2pvbTo6SXNvbGF0ZWRYUkdhbWVwYWRQcm92aWRlcj4gcHJvdmlkZXJfcmVjZWl2ZXJfOwogCiAgIG1vam86OkJpbmRpbmc8bW9qb206OlhSQ29tcG9zaXRvckhvc3Q+IGNvbXBvc2l0b3JfaG9zdF9iaW5kaW5nXzsKLSAgbW9qb206OkltbWVyc2l2ZU92ZXJsYXlSZXF1ZXN0IG92ZXJsYXlfcmVxdWVzdF87CisgIG1vam86OlBlbmRpbmdSZWNlaXZlcjxtb2pvbTo6SW1tZXJzaXZlT3ZlcmxheT4gb3ZlcmxheV9yZWNlaXZlcl87CiAKICAgYmFzZTo6V2Vha1B0ckZhY3Rvcnk8T3BlblZSRGV2aWNlPiB3ZWFrX3B0cl9mYWN0b3J5X3t0aGlzfTsKIApkaWZmIC0tZ2l0IGEvZGV2aWNlL3ZyL29wZW54ci9vcGVueHJfZGV2aWNlLmNjIGIvZGV2aWNlL3ZyL29wZW54ci9vcGVueHJfZGV2aWNlLmNjCmluZGV4IDk4NWQ3YWQ3Li4yZDJjOTVkIDEwMDY0NAotLS0gYS9kZXZpY2UvdnIvb3BlbnhyL29wZW54cl9kZXZpY2UuY2MKKysrIGIvZGV2aWNlL3ZyL29wZW54ci9vcGVueHJfZGV2aWNlLmNjCkBAIC0xMzYsMTggKzEzNiwxOCBAQAogICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGlmIChwcm92aWRlcl9yZXF1ZXN0XykgeworICAgIGlmIChwcm92aWRlcl9yZWNlaXZlcl8pIHsKICAgICAgIHJlbmRlcl9sb29wXy0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soCiAgICAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZSgmWFJDb21wb3NpdG9yQ29tbW9uOjpSZXF1ZXN0R2FtZXBhZFByb3ZpZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChyZW5kZXJfbG9vcF8uZ2V0KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHByb3ZpZGVyX3JlcXVlc3RfKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHByb3ZpZGVyX3JlY2VpdmVyXykpKTsKICAgICB9CiAKLSAgICBpZiAob3ZlcmxheV9yZXF1ZXN0XykgeworICAgIGlmIChvdmVybGF5X3JlY2VpdmVyXykgewogICAgICAgcmVuZGVyX2xvb3BfLT50YXNrX3J1bm5lcigpLT5Qb3N0VGFzaygKICAgICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKCZYUkNvbXBvc2l0b3JDb21tb246OlJlcXVlc3RPdmVybGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChyZW5kZXJfbG9vcF8uZ2V0KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKG92ZXJsYXlfcmVxdWVzdF8pKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUob3ZlcmxheV9yZWNlaXZlcl8pKSk7CiAgICAgfQogICB9CiAKQEAgLTIxNywyOCArMjE3LDI4IEBACiB9CiAKIHZvaWQgT3BlblhyRGV2aWNlOjpHZXRJc29sYXRlZFhSR2FtZXBhZFByb3ZpZGVyKAotICAgIG1vam9tOjpJc29sYXRlZFhSR2FtZXBhZFByb3ZpZGVyUmVxdWVzdCBwcm92aWRlcl9yZXF1ZXN0KSB7CisgICAgbW9qbzo6UGVuZGluZ1JlY2VpdmVyPG1vam9tOjpJc29sYXRlZFhSR2FtZXBhZFByb3ZpZGVyPiBwcm92aWRlcl9yZWNlaXZlcikgewogICBFbnN1cmVSZW5kZXJMb29wKCk7CiAgIGlmIChyZW5kZXJfbG9vcF8tPklzUnVubmluZygpKSB7CiAgICAgcmVuZGVyX2xvb3BfLT50YXNrX3J1bm5lcigpLT5Qb3N0VGFzaygKICAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZSgmWFJDb21wb3NpdG9yQ29tbW9uOjpSZXF1ZXN0R2FtZXBhZFByb3ZpZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQocmVuZGVyX2xvb3BfLmdldCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocHJvdmlkZXJfcmVxdWVzdCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocHJvdmlkZXJfcmVjZWl2ZXIpKSk7CiAgIH0gZWxzZSB7Ci0gICAgcHJvdmlkZXJfcmVxdWVzdF8gPSBzdGQ6Om1vdmUocHJvdmlkZXJfcmVxdWVzdCk7CisgICAgcHJvdmlkZXJfcmVjZWl2ZXJfID0gc3RkOjptb3ZlKHByb3ZpZGVyX3JlY2VpdmVyKTsKICAgfQogfQogCiB2b2lkIE9wZW5YckRldmljZTo6Q3JlYXRlSW1tZXJzaXZlT3ZlcmxheSgKLSAgICBtb2pvbTo6SW1tZXJzaXZlT3ZlcmxheVJlcXVlc3Qgb3ZlcmxheV9yZXF1ZXN0KSB7CisgICAgbW9qbzo6UGVuZGluZ1JlY2VpdmVyPG1vam9tOjpJbW1lcnNpdmVPdmVybGF5PiBvdmVybGF5X3JlY2VpdmVyKSB7CiAgIEVuc3VyZVJlbmRlckxvb3AoKTsKICAgaWYgKHJlbmRlcl9sb29wXy0+SXNSdW5uaW5nKCkpIHsKICAgICByZW5kZXJfbG9vcF8tPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAogICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKCZYUkNvbXBvc2l0b3JDb21tb246OlJlcXVlc3RPdmVybGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQocmVuZGVyX2xvb3BfLmdldCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUob3ZlcmxheV9yZXF1ZXN0KSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShvdmVybGF5X3JlY2VpdmVyKSkpOwogICB9IGVsc2UgewotICAgIG92ZXJsYXlfcmVxdWVzdF8gPSBzdGQ6Om1vdmUob3ZlcmxheV9yZXF1ZXN0KTsKKyAgICBvdmVybGF5X3JlY2VpdmVyXyA9IHN0ZDo6bW92ZShvdmVybGF5X3JlY2VpdmVyKTsKICAgfQogfQogCmRpZmYgLS1naXQgYS9kZXZpY2UvdnIvb3BlbnhyL29wZW54cl9kZXZpY2UuaCBiL2RldmljZS92ci9vcGVueHIvb3BlbnhyX2RldmljZS5oCmluZGV4IDNmNDcwNmMxOS4uZTk2YWZlYSAxMDA2NDQKLS0tIGEvZGV2aWNlL3ZyL29wZW54ci9vcGVueHJfZGV2aWNlLmgKKysrIGIvZGV2aWNlL3ZyL29wZW54ci9vcGVueHJfZGV2aWNlLmgKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlICJiYXNlL21hY3Jvcy5oIgogI2luY2x1ZGUgImRldmljZS92ci9wdWJsaWMvbW9qb20vdnJfc2VydmljZS5tb2pvbS5oIgogI2luY2x1ZGUgImRldmljZS92ci92cl9kZXZpY2VfYmFzZS5oIgorI2luY2x1ZGUgIm1vam8vcHVibGljL2NwcC9iaW5kaW5ncy9wZW5kaW5nX3JlY2VpdmVyLmgiCiAKIG5hbWVzcGFjZSBkZXZpY2UgewogCkBAIC00MSwxMSArNDIsMTIgQEAKIAogICAvLyBtb2pvbTo6SXNvbGF0ZWRYUkdhbWVwYWRQcm92aWRlckZhY3RvcnkKICAgdm9pZCBHZXRJc29sYXRlZFhSR2FtZXBhZFByb3ZpZGVyKAotICAgICAgbW9qb206Oklzb2xhdGVkWFJHYW1lcGFkUHJvdmlkZXJSZXF1ZXN0IHByb3ZpZGVyX3JlcXVlc3QpIG92ZXJyaWRlOworICAgICAgbW9qbzo6UGVuZGluZ1JlY2VpdmVyPG1vam9tOjpJc29sYXRlZFhSR2FtZXBhZFByb3ZpZGVyPiBwcm92aWRlcl9yZWNlaXZlcikKKyAgICAgIG92ZXJyaWRlOwogCiAgIC8vIFhSQ29tcG9zaXRvckhvc3QKICAgdm9pZCBDcmVhdGVJbW1lcnNpdmVPdmVybGF5KAotICAgICAgbW9qb206OkltbWVyc2l2ZU92ZXJsYXlSZXF1ZXN0IG92ZXJsYXlfcmVxdWVzdCkgb3ZlcnJpZGU7CisgICAgICBtb2pvOjpQZW5kaW5nUmVjZWl2ZXI8bW9qb206OkltbWVyc2l2ZU92ZXJsYXk+IG92ZXJsYXlfcmVjZWl2ZXIpIG92ZXJyaWRlOwogCiAgIHZvaWQgRW5zdXJlUmVuZGVyTG9vcCgpOwogCkBAIC02MCwxMCArNjIsMTAgQEAKIAogICBtb2pvOjpCaW5kaW5nPG1vam9tOjpJc29sYXRlZFhSR2FtZXBhZFByb3ZpZGVyRmFjdG9yeT4KICAgICAgIGdhbWVwYWRfcHJvdmlkZXJfZmFjdG9yeV9iaW5kaW5nXzsKLSAgbW9qb206Oklzb2xhdGVkWFJHYW1lcGFkUHJvdmlkZXJSZXF1ZXN0IHByb3ZpZGVyX3JlcXVlc3RfOworICBtb2pvOjpQZW5kaW5nUmVjZWl2ZXI8bW9qb206Oklzb2xhdGVkWFJHYW1lcGFkUHJvdmlkZXI+IHByb3ZpZGVyX3JlY2VpdmVyXzsKIAogICBtb2pvOjpCaW5kaW5nPG1vam9tOjpYUkNvbXBvc2l0b3JIb3N0PiBjb21wb3NpdG9yX2hvc3RfYmluZGluZ187Ci0gIG1vam9tOjpJbW1lcnNpdmVPdmVybGF5UmVxdWVzdCBvdmVybGF5X3JlcXVlc3RfOworICBtb2pvOjpQZW5kaW5nUmVjZWl2ZXI8bW9qb206OkltbWVyc2l2ZU92ZXJsYXk+IG92ZXJsYXlfcmVjZWl2ZXJfOwogCiAgIGJhc2U6OldlYWtQdHJGYWN0b3J5PE9wZW5YckRldmljZT4gd2Vha19wdHJfZmFjdG9yeV87CiAKZGlmZiAtLWdpdCBhL2RldmljZS92ci9wdWJsaWMvbW9qb20vaXNvbGF0ZWRfeHJfc2VydmljZS5tb2pvbSBiL2RldmljZS92ci9wdWJsaWMvbW9qb20vaXNvbGF0ZWRfeHJfc2VydmljZS5tb2pvbQppbmRleCA0NWNmMjdiLi5iZDVkOWI3IDEwMDY0NAotLS0gYS9kZXZpY2UvdnIvcHVibGljL21vam9tL2lzb2xhdGVkX3hyX3NlcnZpY2UubW9qb20KKysrIGIvZGV2aWNlL3ZyL3B1YmxpYy9tb2pvbS9pc29sYXRlZF94cl9zZXJ2aWNlLm1vam9tCkBAIC0xNTMsNyArMTUzLDggQEAKICAgLy8gR2V0IHRoZSBJc29sYXRlZFhSR2FtZXBhZFByb3ZpZGVyIGZvciBhIHNwZWNpZmljIFhSIHJ1bnRpbWUgQVBJIChPY3VsdXMsIG9yCiAgIC8vIE9wZW5WUiwgd2hpY2ggYXJlIGN1cnJlbnRseSB0aGUgb25seSB0d28gdGhhdCBhcmUgaG9zdGVkIG91dHNpZGUgb2YgdGhlCiAgIC8vIGJyb3dzZXIgcHJvY2VzcykuCi0gIEdldElzb2xhdGVkWFJHYW1lcGFkUHJvdmlkZXIoSXNvbGF0ZWRYUkdhbWVwYWRQcm92aWRlciYgcHJvdmlkZXIpOworICBHZXRJc29sYXRlZFhSR2FtZXBhZFByb3ZpZGVyKAorICAgICAgcGVuZGluZ19yZWNlaXZlcjxJc29sYXRlZFhSR2FtZXBhZFByb3ZpZGVyPiBwcm92aWRlcik7CiB9OwogCiAvLyBSZXByZXNlbnRzIGFuIG92ZXJsYXkgdGhhdCB0aGUgYnJvd3NlciBtYXkgc2hvdyBvbiB0b3Agb2Ygb3IgaW5zdGVhZCBvZiBXZWJYUgpAQCAtMTg3LDcgKzE4OCw3IEBACiAvLyBvYnRhaW4gYW4gSW1tZXJzaXZlT3ZlcmxheSB0byBzaG93IG92ZXJsYXkgVUkuICBUaGUgb2J0YWluZWQgb3ZlcmxheSB3aWxsCiAvLyBkaXNjb25uZWN0IHdoZW4gcHJlc2VudGF0aW9uIGVuZHMuCiBpbnRlcmZhY2UgWFJDb21wb3NpdG9ySG9zdCB7Ci0gIENyZWF0ZUltbWVyc2l2ZU92ZXJsYXkoSW1tZXJzaXZlT3ZlcmxheSYgb3ZlcmxheSk7CisgIENyZWF0ZUltbWVyc2l2ZU92ZXJsYXkocGVuZGluZ19yZWNlaXZlcjxJbW1lcnNpdmVPdmVybGF5PiBvdmVybGF5KTsKIH07CiAKIC8vIE5vdGlmeSB0aGUgYnJvd3NlciBwcm9jZXNzIGFib3V0IGEgc2V0IG9mIHJ1bnRpbWVzLiAgVGhlIGJyb3dzZXIgcHJvY2VzcwpAQCAtMjE5LDcgKzIyMCw3IEBACiAgIC8vIFJlZ2lzdGVyIGEgY2xpZW50LCBhbmQgdHJpZ2dlcnMgT25EZXZpY2VBZGRlZCBmb3IgYWxsIGF2YWlsYWJsZSBydW50aW1lcywKICAgLy8gZm9sbG93ZWQgYnkgT25EZXZpY2VzRW51bWVyYXRlZC4KICAgLy8gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uY2UuCi0gIFJlcXVlc3REZXZpY2VzKElzb2xhdGVkWFJSdW50aW1lUHJvdmlkZXJDbGllbnQgY2xpZW50KTsKKyAgUmVxdWVzdERldmljZXMocGVuZGluZ19yZW1vdGU8SXNvbGF0ZWRYUlJ1bnRpbWVQcm92aWRlckNsaWVudD4gY2xpZW50KTsKIH07CiAKIC8vIFRoZSBtYWluIGludGVyZmFjZSBmb3IgdGhlIFhSIERldmljZSBTZXJ2aWNlLgpkaWZmIC0tZ2l0IGEvZGV2aWNlL3ZyL3B1YmxpYy9tb2pvbS92cl9zZXJ2aWNlLm1vam9tIGIvZGV2aWNlL3ZyL3B1YmxpYy9tb2pvbS92cl9zZXJ2aWNlLm1vam9tCmluZGV4IDM2MTE0M2YuLjNiMjUwYTEgMTAwNjQ0Ci0tLSBhL2RldmljZS92ci9wdWJsaWMvbW9qb20vdnJfc2VydmljZS5tb2pvbQorKysgYi9kZXZpY2UvdnIvcHVibGljL21vam9tL3ZyX3NlcnZpY2UubW9qb20KQEAgLTQ1NSw2ICs0NTUsMTUgQEAKICAgR2V0SW1tZXJzaXZlVlJEaXNwbGF5SW5mbygpID0+IChWUkRpc3BsYXlJbmZvPyBpbmZvKTsKIAogICBFeGl0UHJlc2VudCgpOworCisgIC8vIFVzZWQgZm9yIHRoZSByZW5kZXJlciBwcm9jZXNzIHRvIGluZGljYXRlIHRoYXQgaXQgaXMgdGhyb3R0bGluZyBmcmFtZQorICAvLyByZXF1ZXN0cyBmcm9tIHRoZSBwYWdlLCBhbmQgdGh1cyBpdCAobm90IHRoZSBwYWdlKSBpcyByZXNwb25zaWJsZSBmb3IgYW55CisgIC8vIGRyb3AgaW4gZnJhbWUgcmF0ZSBvciBkZWxheSBpbiBwb3N0aW5nIGZyYW1lcy4gVGhpcyBpcyBtYWlubHkgbWVhbnQgdG8gYmUKKyAgLy8gaW5mb3JtYXRpb25hbCBmb3IgdGhlIGJyb3dzZXIgcHJvY2Vzcywgc28gdGhhdCBpdCBjYW4gZGVjaWRlIGlmIG9yIHdoYXQgVUkKKyAgLy8gdG8gc2hvdyBpZiBpdCBzZWVtcyBsaWtlIHRoZSBmcmFtZSByYXRlIGlzIHRvbyBsb3cgb3IgaGFzIHN0YWxsZWQuIFRoZQorICAvLyByZW5kZXJlciBjYW4gKGFuZCBtYXkpIHN0aWxsIGRlY2lkZSB0byBzdWJtaXQgZnJhbWVzIGFuZCB0aGF0IHNob3VsZCBub3QgYmUKKyAgLy8gdHJlYXRlZCBhcyBpbGxlZ2FsIG9yIGNsZWFyIHRoZSB0aHJvdHRsZWQgc3RhdGUuCisgIFNldEZyYW1lc1Rocm90dGxlZChib29sIHRocm90dGxlZCk7CiB9OwogCiAvLyBUaGUgaW50ZXJmYWNlIGZvciB0aGUgcmVuZGVyZXIgdG8gbGlzdGVuIHRvIHRvcCBsZXZlbCBYUiBldmVudHMsIGV2ZW50cyB0aGF0CmRpZmYgLS1naXQgYS9kZXZpY2UvdnIvd2luZG93cy9jb21wb3NpdG9yX2Jhc2UuY2MgYi9kZXZpY2UvdnIvd2luZG93cy9jb21wb3NpdG9yX2Jhc2UuY2MKaW5kZXggM2I3ODEwMy4uZjhiNzdiNiAxMDA2NDQKLS0tIGEvZGV2aWNlL3ZyL3dpbmRvd3MvY29tcG9zaXRvcl9iYXNlLmNjCisrKyBiL2RldmljZS92ci93aW5kb3dzL2NvbXBvc2l0b3JfYmFzZS5jYwpAQCAtNDQsOSArNDQsNyBAQAogICAgIDogYmFzZTo6VGhyZWFkKCJXaW5kb3dzWFJDb21wb3NpdG9yIiksCiAgICAgICBtYWluX3RocmVhZF90YXNrX3J1bm5lcl8oYmFzZTo6VGhyZWFkVGFza1J1bm5lckhhbmRsZTo6R2V0KCkpLAogICAgICAgd2VieHJfanNfdGltZV8oa1NsaWRpbmdBdmVyYWdlU2l6ZSksCi0gICAgICB3ZWJ4cl9ncHVfdGltZV8oa1NsaWRpbmdBdmVyYWdlU2l6ZSksCi0gICAgICBnYW1lcGFkX3Byb3ZpZGVyXyh0aGlzKSwKLSAgICAgIG92ZXJsYXlfYmluZGluZ18odGhpcykgeworICAgICAgd2VieHJfZ3B1X3RpbWVfKGtTbGlkaW5nQXZlcmFnZVNpemUpIHsKICAgRENIRUNLKG1haW5fdGhyZWFkX3Rhc2tfcnVubmVyXyk7CiB9CiAKQEAgLTEzOCwyMiArMTM2LDIyIEBACiAgIHdlYnhyX2hhc19wb3NlXyA9IGZhbHNlOwogICBwcmVzZW50YXRpb25fcmVjZWl2ZXJfLnJlc2V0KCk7CiAgIGZyYW1lX2RhdGFfcmVjZWl2ZXJfLnJlc2V0KCk7Ci0gIGdhbWVwYWRfcHJvdmlkZXJfLkNsb3NlKCk7Ci0gIG92ZXJsYXlfYmluZGluZ18uQ2xvc2UoKTsKKyAgZ2FtZXBhZF9wcm92aWRlcl9yZWNlaXZlcl8ucmVzZXQoKTsKKyAgb3ZlcmxheV9yZWNlaXZlcl8ucmVzZXQoKTsKICAgaW5wdXRfZXZlbnRfbGlzdGVuZXJfID0gbnVsbHB0cjsKICAgU3RvcFJ1bnRpbWUoKTsKIH0KIAogdm9pZCBYUkNvbXBvc2l0b3JDb21tb246OlJlcXVlc3RHYW1lcGFkUHJvdmlkZXIoCi0gICAgbW9qb206Oklzb2xhdGVkWFJHYW1lcGFkUHJvdmlkZXJSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgZ2FtZXBhZF9wcm92aWRlcl8uQ2xvc2UoKTsKLSAgZ2FtZXBhZF9wcm92aWRlcl8uQmluZChzdGQ6Om1vdmUocmVxdWVzdCkpOworICAgIG1vam86OlBlbmRpbmdSZWNlaXZlcjxtb2pvbTo6SXNvbGF0ZWRYUkdhbWVwYWRQcm92aWRlcj4gcmVjZWl2ZXIpIHsKKyAgZ2FtZXBhZF9wcm92aWRlcl9yZWNlaXZlcl8ucmVzZXQoKTsKKyAgZ2FtZXBhZF9wcm92aWRlcl9yZWNlaXZlcl8uQmluZChzdGQ6Om1vdmUocmVjZWl2ZXIpKTsKIH0KIAogdm9pZCBYUkNvbXBvc2l0b3JDb21tb246OlJlcXVlc3RPdmVybGF5KAotICAgIG1vam9tOjpJbW1lcnNpdmVPdmVybGF5UmVxdWVzdCByZXF1ZXN0KSB7Ci0gIG92ZXJsYXlfYmluZGluZ18uQ2xvc2UoKTsKLSAgb3ZlcmxheV9iaW5kaW5nXy5CaW5kKHN0ZDo6bW92ZShyZXF1ZXN0KSk7CisgICAgbW9qbzo6UGVuZGluZ1JlY2VpdmVyPG1vam9tOjpJbW1lcnNpdmVPdmVybGF5PiByZWNlaXZlcikgeworICBvdmVybGF5X3JlY2VpdmVyXy5yZXNldCgpOworICBvdmVybGF5X3JlY2VpdmVyXy5CaW5kKHN0ZDo6bW92ZShyZWNlaXZlcikpOwogCiAgIC8vIFdlYlhSIGlzIHZpc2libGUgYW5kIG92ZXJsYXkgaGlkZGVuIGJ5IGRlZmF1bHQgdW50aWwgdGhlIG92ZXJsYXkgb3ZlcnJpZGVzCiAgIC8vIHRoaXMuCkBAIC0yNzIsNyArMjcwLDcgQEAKIAogICAvLyBLaWxsIG91dHN0YW5kaW5nIG92ZXJsYXlzOgogICBvdmVybGF5X3Zpc2libGVfID0gZmFsc2U7Ci0gIG92ZXJsYXlfYmluZGluZ18uQ2xvc2UoKTsKKyAgb3ZlcmxheV9yZWNlaXZlcl8ucmVzZXQoKTsKIAogICB0ZXh0dXJlX2hlbHBlcl8uU2V0U291cmNlQW5kT3ZlcmxheVZpc2libGUoZmFsc2UsIGZhbHNlKTsKIApkaWZmIC0tZ2l0IGEvZGV2aWNlL3ZyL3dpbmRvd3MvY29tcG9zaXRvcl9iYXNlLmggYi9kZXZpY2UvdnIvd2luZG93cy9jb21wb3NpdG9yX2Jhc2UuaAppbmRleCBlZDVjMDRlLi4zOTdkNzQ3IDEwMDY0NAotLS0gYS9kZXZpY2UvdnIvd2luZG93cy9jb21wb3NpdG9yX2Jhc2UuaAorKysgYi9kZXZpY2UvdnIvd2luZG93cy9jb21wb3NpdG9yX2Jhc2UuaApAQCAtMTMsNyArMTMsNyBAQAogI2luY2x1ZGUgImRldmljZS92ci91dGlsL2Zwc19tZXRlci5oIgogI2luY2x1ZGUgImRldmljZS92ci91dGlsL3NsaWRpbmdfYXZlcmFnZS5oIgogI2luY2x1ZGUgImRldmljZS92ci92cl9kZXZpY2UuaCIKLSNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvYmluZGluZ3MvYmluZGluZy5oIgorI2luY2x1ZGUgIm1vam8vcHVibGljL2NwcC9iaW5kaW5ncy9wZW5kaW5nX3JlY2VpdmVyLmgiCiAjaW5jbHVkZSAibW9qby9wdWJsaWMvY3BwL2JpbmRpbmdzL3JlY2VpdmVyLmgiCiAjaW5jbHVkZSAibW9qby9wdWJsaWMvY3BwL2JpbmRpbmdzL3JlbW90ZS5oIgogI2luY2x1ZGUgIm1vam8vcHVibGljL2NwcC9zeXN0ZW0vcGxhdGZvcm1faGFuZGxlLmgiCkBAIC03Niw4ICs3Niw5IEBACiAgICAgICBkZXZpY2U6Om1vam9tOjpYUkVudmlyb25tZW50SW50ZWdyYXRpb25Qcm92aWRlckFzc29jaWF0ZWRSZXF1ZXN0CiAgICAgICAgICAgZW52aXJvbm1lbnRfcHJvdmlkZXIpIGZpbmFsOwogCi0gIHZvaWQgUmVxdWVzdEdhbWVwYWRQcm92aWRlcihtb2pvbTo6SXNvbGF0ZWRYUkdhbWVwYWRQcm92aWRlclJlcXVlc3QgcmVxdWVzdCk7Ci0gIHZvaWQgUmVxdWVzdE92ZXJsYXkobW9qb206OkltbWVyc2l2ZU92ZXJsYXlSZXF1ZXN0IHJlcXVlc3QpOworICB2b2lkIFJlcXVlc3RHYW1lcGFkUHJvdmlkZXIoCisgICAgICBtb2pvOjpQZW5kaW5nUmVjZWl2ZXI8bW9qb206Oklzb2xhdGVkWFJHYW1lcGFkUHJvdmlkZXI+IHJlY2VpdmVyKTsKKyAgdm9pZCBSZXF1ZXN0T3ZlcmxheShtb2pvOjpQZW5kaW5nUmVjZWl2ZXI8bW9qb206OkltbWVyc2l2ZU92ZXJsYXk+IHJlY2VpdmVyKTsKIAogIHByb3RlY3RlZDoKICAgdmlydHVhbCBib29sIFVzZXNJbnB1dEV2ZW50aW5nKCk7CkBAIC0xODEsOCArMTgyLDkgQEAKICAgbW9qb206Oklzb2xhdGVkWFJHYW1lcGFkUHJvdmlkZXI6OlJlcXVlc3RVcGRhdGVDYWxsYmFjayBnYW1lcGFkX2NhbGxiYWNrXzsKICAgbW9qbzo6UmVjZWl2ZXI8bW9qb206OlhSUHJlc2VudGF0aW9uUHJvdmlkZXI+IHByZXNlbnRhdGlvbl9yZWNlaXZlcl97dGhpc307CiAgIG1vam86OlJlY2VpdmVyPG1vam9tOjpYUkZyYW1lRGF0YVByb3ZpZGVyPiBmcmFtZV9kYXRhX3JlY2VpdmVyX3t0aGlzfTsKLSAgbW9qbzo6QmluZGluZzxtb2pvbTo6SXNvbGF0ZWRYUkdhbWVwYWRQcm92aWRlcj4gZ2FtZXBhZF9wcm92aWRlcl87Ci0gIG1vam86OkJpbmRpbmc8bW9qb206OkltbWVyc2l2ZU92ZXJsYXk+IG92ZXJsYXlfYmluZGluZ187CisgIG1vam86OlJlY2VpdmVyPG1vam9tOjpJc29sYXRlZFhSR2FtZXBhZFByb3ZpZGVyPiBnYW1lcGFkX3Byb3ZpZGVyX3JlY2VpdmVyX3sKKyAgICAgIHRoaXN9OworICBtb2pvOjpSZWNlaXZlcjxtb2pvbTo6SW1tZXJzaXZlT3ZlcmxheT4gb3ZlcmxheV9yZWNlaXZlcl97dGhpc307CiAgIG1vam9tOjpYUlZpc2liaWxpdHlTdGF0ZSB2aXNpYmlsaXR5X3N0YXRlXyA9CiAgICAgICBtb2pvbTo6WFJWaXNpYmlsaXR5U3RhdGU6OlZJU0lCTEU7CiAKZGlmZiAtLWdpdCBhL2RldmljZS92ci93aW5kb3dzX21peGVkX3JlYWxpdHkvbWl4ZWRfcmVhbGl0eV9kZXZpY2UuY2MgYi9kZXZpY2UvdnIvd2luZG93c19taXhlZF9yZWFsaXR5L21peGVkX3JlYWxpdHlfZGV2aWNlLmNjCmluZGV4IDFlZTIyNzguLjE0ZWM2NjQgMTAwNjQ0Ci0tLSBhL2RldmljZS92ci93aW5kb3dzX21peGVkX3JlYWxpdHkvbWl4ZWRfcmVhbGl0eV9kZXZpY2UuY2MKKysrIGIvZGV2aWNlL3ZyL3dpbmRvd3NfbWl4ZWRfcmVhbGl0eS9taXhlZF9yZWFsaXR5X2RldmljZS5jYwpAQCAtMTA4LDE4ICsxMDgsMTggQEAKICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpZiAocHJvdmlkZXJfcmVxdWVzdF8pIHsKKyAgICBpZiAocHJvdmlkZXJfcmVjZWl2ZXJfKSB7CiAgICAgICByZW5kZXJfbG9vcF8tPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAogICAgICAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZE9uY2UoJlhSQ29tcG9zaXRvckNvbW1vbjo6UmVxdWVzdEdhbWVwYWRQcm92aWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQocmVuZGVyX2xvb3BfLmdldCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShwcm92aWRlcl9yZXF1ZXN0XykpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShwcm92aWRlcl9yZWNlaXZlcl8pKSk7CiAgICAgfQogCi0gICAgaWYgKG92ZXJsYXlfcmVxdWVzdF8pIHsKKyAgICBpZiAob3ZlcmxheV9yZWNlaXZlcl8pIHsKICAgICAgIHJlbmRlcl9sb29wXy0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soCiAgICAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZSgmWFJDb21wb3NpdG9yQ29tbW9uOjpSZXF1ZXN0T3ZlcmxheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQocmVuZGVyX2xvb3BfLmdldCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShvdmVybGF5X3JlcXVlc3RfKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKG92ZXJsYXlfcmVjZWl2ZXJfKSkpOwogICAgIH0KICAgfQogCkBAIC0xODQsMzAgKzE4NCwzMCBAQAogfQogCiB2b2lkIE1peGVkUmVhbGl0eURldmljZTo6R2V0SXNvbGF0ZWRYUkdhbWVwYWRQcm92aWRlcigKLSAgICBtb2pvbTo6SXNvbGF0ZWRYUkdhbWVwYWRQcm92aWRlclJlcXVlc3QgcHJvdmlkZXJfcmVxdWVzdCkgeworICAgIG1vam86OlBlbmRpbmdSZWNlaXZlcjxtb2pvbTo6SXNvbGF0ZWRYUkdhbWVwYWRQcm92aWRlcj4gcHJvdmlkZXJfcmVjZWl2ZXIpIHsKICAgaWYgKCFyZW5kZXJfbG9vcF8pCiAgICAgQ3JlYXRlUmVuZGVyTG9vcCgpOwogICBpZiAocmVuZGVyX2xvb3BfLT5Jc1J1bm5pbmcoKSkgewogICAgIHJlbmRlcl9sb29wXy0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soCiAgICAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZE9uY2UoJlhSQ29tcG9zaXRvckNvbW1vbjo6UmVxdWVzdEdhbWVwYWRQcm92aWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHJlbmRlcl9sb29wXy5nZXQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHByb3ZpZGVyX3JlcXVlc3QpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHByb3ZpZGVyX3JlY2VpdmVyKSkpOwogICB9IGVsc2UgewotICAgIHByb3ZpZGVyX3JlcXVlc3RfID0gc3RkOjptb3ZlKHByb3ZpZGVyX3JlcXVlc3QpOworICAgIHByb3ZpZGVyX3JlY2VpdmVyXyA9IHN0ZDo6bW92ZShwcm92aWRlcl9yZWNlaXZlcik7CiAgIH0KIH0KIAogdm9pZCBNaXhlZFJlYWxpdHlEZXZpY2U6OkNyZWF0ZUltbWVyc2l2ZU92ZXJsYXkoCi0gICAgbW9qb206OkltbWVyc2l2ZU92ZXJsYXlSZXF1ZXN0IG92ZXJsYXlfcmVxdWVzdCkgeworICAgIG1vam86OlBlbmRpbmdSZWNlaXZlcjxtb2pvbTo6SW1tZXJzaXZlT3ZlcmxheT4gb3ZlcmxheV9yZWNlaXZlcikgewogICBpZiAoIXJlbmRlcl9sb29wXykKICAgICBDcmVhdGVSZW5kZXJMb29wKCk7CiAgIGlmIChyZW5kZXJfbG9vcF8tPklzUnVubmluZygpKSB7CiAgICAgcmVuZGVyX2xvb3BfLT50YXNrX3J1bm5lcigpLT5Qb3N0VGFzaygKICAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZSgmWFJDb21wb3NpdG9yQ29tbW9uOjpSZXF1ZXN0T3ZlcmxheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHJlbmRlcl9sb29wXy5nZXQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKG92ZXJsYXlfcmVxdWVzdCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUob3ZlcmxheV9yZWNlaXZlcikpKTsKICAgfSBlbHNlIHsKLSAgICBvdmVybGF5X3JlcXVlc3RfID0gc3RkOjptb3ZlKG92ZXJsYXlfcmVxdWVzdCk7CisgICAgb3ZlcmxheV9yZWNlaXZlcl8gPSBzdGQ6Om1vdmUob3ZlcmxheV9yZWNlaXZlcik7CiAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvZGV2aWNlL3ZyL3dpbmRvd3NfbWl4ZWRfcmVhbGl0eS9taXhlZF9yZWFsaXR5X2RldmljZS5oIGIvZGV2aWNlL3ZyL3dpbmRvd3NfbWl4ZWRfcmVhbGl0eS9taXhlZF9yZWFsaXR5X2RldmljZS5oCmluZGV4IDhiMTNhNTQuLmZkOTE4M2E2IDEwMDY0NAotLS0gYS9kZXZpY2UvdnIvd2luZG93c19taXhlZF9yZWFsaXR5L21peGVkX3JlYWxpdHlfZGV2aWNlLmgKKysrIGIvZGV2aWNlL3ZyL3dpbmRvd3NfbWl4ZWRfcmVhbGl0eS9taXhlZF9yZWFsaXR5X2RldmljZS5oCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSAiZGV2aWNlL3ZyL3ZyX2RldmljZV9iYXNlLmgiCiAjaW5jbHVkZSAiZGV2aWNlL3ZyL3dpbmRvd3MvY29tcG9zaXRvcl9iYXNlLmgiCiAjaW5jbHVkZSAibW9qby9wdWJsaWMvY3BwL2JpbmRpbmdzL2JpbmRpbmcuaCIKKyNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvYmluZGluZ3MvcGVuZGluZ19yZWNlaXZlci5oIgogCiBuYW1lc3BhY2UgZGV2aWNlIHsKIApAQCAtNDAsMTEgKzQxLDEyIEBACiAKICAgLy8gbW9qb206Oklzb2xhdGVkWFJHYW1lcGFkUHJvdmlkZXJGYWN0b3J5CiAgIHZvaWQgR2V0SXNvbGF0ZWRYUkdhbWVwYWRQcm92aWRlcigKLSAgICAgIG1vam9tOjpJc29sYXRlZFhSR2FtZXBhZFByb3ZpZGVyUmVxdWVzdCBwcm92aWRlcl9yZXF1ZXN0KSBvdmVycmlkZTsKKyAgICAgIG1vam86OlBlbmRpbmdSZWNlaXZlcjxtb2pvbTo6SXNvbGF0ZWRYUkdhbWVwYWRQcm92aWRlcj4gcHJvdmlkZXJfcmVjZWl2ZXIpCisgICAgICBvdmVycmlkZTsKIAogICAvLyBYUkNvbXBvc2l0b3JIb3N0CiAgIHZvaWQgQ3JlYXRlSW1tZXJzaXZlT3ZlcmxheSgKLSAgICAgIG1vam9tOjpJbW1lcnNpdmVPdmVybGF5UmVxdWVzdCBvdmVybGF5X3JlcXVlc3QpIG92ZXJyaWRlOworICAgICAgbW9qbzo6UGVuZGluZ1JlY2VpdmVyPG1vam9tOjpJbW1lcnNpdmVPdmVybGF5PiBvdmVybGF5X3JlY2VpdmVyKSBvdmVycmlkZTsKIAogICB2b2lkIENyZWF0ZVJlbmRlckxvb3AoKTsKICAgdm9pZCBTaHV0ZG93bigpOwpAQCAtNTgsMTAgKzYwLDEwIEBACiAKICAgbW9qbzo6QmluZGluZzxtb2pvbTo6SXNvbGF0ZWRYUkdhbWVwYWRQcm92aWRlckZhY3Rvcnk+CiAgICAgICBnYW1lcGFkX3Byb3ZpZGVyX2ZhY3RvcnlfYmluZGluZ187Ci0gIG1vam9tOjpJc29sYXRlZFhSR2FtZXBhZFByb3ZpZGVyUmVxdWVzdCBwcm92aWRlcl9yZXF1ZXN0XzsKKyAgbW9qbzo6UGVuZGluZ1JlY2VpdmVyPG1vam9tOjpJc29sYXRlZFhSR2FtZXBhZFByb3ZpZGVyPiBwcm92aWRlcl9yZWNlaXZlcl87CiAKICAgbW9qbzo6QmluZGluZzxtb2pvbTo6WFJDb21wb3NpdG9ySG9zdD4gY29tcG9zaXRvcl9ob3N0X2JpbmRpbmdfOwotICBtb2pvbTo6SW1tZXJzaXZlT3ZlcmxheVJlcXVlc3Qgb3ZlcmxheV9yZXF1ZXN0XzsKKyAgbW9qbzo6UGVuZGluZ1JlY2VpdmVyPG1vam9tOjpJbW1lcnNpdmVPdmVybGF5PiBvdmVybGF5X3JlY2VpdmVyXzsKIAogICBtb2pvOjpCaW5kaW5nPG1vam9tOjpYUlNlc3Npb25Db250cm9sbGVyPiBleGNsdXNpdmVfY29udHJvbGxlcl9iaW5kaW5nXzsKIApkaWZmIC0tZ2l0IGEvZG9jcy9SRUFETUUubWQgYi9kb2NzL1JFQURNRS5tZAppbmRleCA5NDI4ZWRmLi4yMDcyZmJlIDEwMDY0NAotLS0gYS9kb2NzL1JFQURNRS5tZAorKysgYi9kb2NzL1JFQURNRS5tZApAQCAtMTczLDYgKzE3Myw3IEBACiAgICAgQ2FwdHVyZSBzdGFjayB0cmFjZXMgb24gbGF5b3V0IHRlc3QgY3Jhc2hlcyB3aXRob3V0IGFuIGF0dGFjaGVkIGRlYnVnZ2VyCiAqICAgW1Rlc3QgRGVzY3JpcHRpb25zXSh0ZXN0aW5nL3Rlc3RfZGVzY3JpcHRpb25zLm1kKSAtIFVuaXQgdGVzdCB0YXJnZXRzIHRoYXQgY2FuIGJlCiAgICAgYnVpbHQsIHdpdGggYXNzb2NpYXRlZCBkZXNjaXB0aW9ucy4KKyogICBbRnV6eiBUZXN0aW5nXSguLi90ZXN0aW5nL2xpYmZ1enplci9SRUFETUUubWQpIC0gRnV6eiB0ZXN0aW5nIGluIENocm9taXVtLgogKiAgIFtJUEMgRnV6emVyXSh0ZXN0aW5nL2lwY19mdXp6ZXIubWQpIC0gRnV6eiB0ZXN0aW5nIG9mIENocm9taXVtIElQQyBpbnRlcmZhY2VzLgogKiAgIFtSdW5uaW5nIENocm9tZSB0ZXN0cyB3aXRoIEFkZHJlc3NTYW5pdGl6ZXIgKGFzYW4pIGFuZCBMZWFrU2FuaXRpemVyIChsc2FuKV0odGVzdGluZy9saW51eF9ydW5uaW5nX2FzYW5fdGVzdHMubWQpIC0KICAgICBSdW4gQ2hyb21lIHRlc3RzIHdpdGggQVNBTiBhbmQgTFNBTiBidWlsZHMgdG8gZGV0ZWN0IGFkZHJlc3NhYmlsaXR5IGlzc3VlcyBhbmQgbWVtb3J5IGxlYWtzLgpkaWZmIC0tZ2l0IGEvZG9jcy9uZXR3b3JrX3RyYWZmaWNfYW5ub3RhdGlvbnMubWQgYi9kb2NzL25ldHdvcmtfdHJhZmZpY19hbm5vdGF0aW9ucy5tZAppbmRleCA0MjdlYjE4ZS4uMTI1MTRiNSAxMDA2NDQKLS0tIGEvZG9jcy9uZXR3b3JrX3RyYWZmaWNfYW5ub3RhdGlvbnMubWQKKysrIGIvZG9jcy9uZXR3b3JrX3RyYWZmaWNfYW5ub3RhdGlvbnMubWQKQEAgLTExNyw3ICsxMTcsNyBAQAogICAgICB0aGUgc291cmNlIGNvZGUgaGFzIGhhcmRjb2RlZCB0aGF0IHRoZSByZXF1ZXN0IGdvZXMgdG8gR29vZ2xlIChlLmcuIGZvcgogICAgICBaZXJvU3VnZ2VzdCksIHVzZSAgYEdPT0dMRV9PV05FRF9TRVJWSUNFYC4gSWYgdGhlIHJlcXVlc3QgY2FuIGdvIHRvIG90aGVyCiAgICAgIGRvbWFpbnMgYW5kIGlzIHBlcmNlaXZlZCBhcyBhIHBhcnQgb2YgYSB3ZWJzaXRlIHJhdGhlciB0aGFuIGEgbmF0aXZlCi0gICAgIGJyb3dzZXIgZmVhdHVyZSwgdXNlIGBXRUJTSVRFYC4gVXNlIGBMT0NBTGAgaWYgdGhlIHJlcXVlcyBpcyBwcm9jZXNzZWQKKyAgICAgYnJvd3NlciBmZWF0dXJlLCB1c2UgYFdFQlNJVEVgLiBVc2UgYExPQ0FMYCBpZiB0aGUgcmVxdWVzdCBpcyBwcm9jZXNzZWQKICAgICAgbG9jYWxseSBhbmQgZG9lc24ndCBnbyB0byBuZXR3b3JrLCBvdGhlcndpc2UgdXNlIGBPVEhFUmAuIElmIGBPVEhFUmAgaXMKICAgICAgdXNlZCwgcGxlYXNlIGFkZCBwbGFpbiB0ZXh0IGRlc2NyaXB0aW9uIGluIGBkZXN0aW5hdGlvbl9vdGhlcmAKICAgICAgZmllbGQuCkBAIC0zMDIsOSArMzAyLDkgQEAKICMjIyBXYXRlcmZhbGwgdGVzdHMKIFR3byBjb21taXQgcXVldWUgdHJ5Ym90cyB0ZXN0IHRyYWZmaWMgYW5ub3RhdGlvbnMgb24gY2hhbmdlZCBmaWxlcyB1c2luZyB0aGUKIHNjcmlwdHMgaW4gYHRvb2xzL3RyYWZmaWNfYW5ub3RhdGlvbi9zY3JpcHRzYC4gVG8gcnVuIHRoZXNlIHRlc3RzIGZhc3RlciBhbmQgdG8KLWF2b2lkIHNwYW1taW5nIHRoZSBjb21taXQgcXVldWUgaWYgYW4gdW5mb3Jlc2VlbiBlcnJvciBoYXMgaGFwcGVkIGluIGRvd25zdHJlYW0KLXNjcmlwdHMgb3IgdG9vbHMsIHRoZXkgYXJlIHJ1biBpbiBlcnJvciByZXNpbGllbnQgbW9kZSwgb25seSBvbiBjaGFuZ2VkIGZpbGVzLAotYW5kIHVzaW5nIGhldXJpc3RpY3MgdG8gZGVjaWRlIHdoaWNoIGZpbGVzIHRvIHByb2Nlc3MuCithdm9pZCBzcGFtbWluZyB0aGUgY29tbWl0IHF1ZXVlIGlmIGFuIHVuZm9yZXNlZW4gZXJyb3IgaGFzIGhhcHBlbmVkIGluCitkb3duc3RyZWFtIHNjcmlwdHMgb3IgdG9vbHMsIHRoZXkgYXJlIHJ1biBpbiBlcnJvciByZXNpbGllbnQgbW9kZSwgb25seSBvbgorY2hhbmdlZCBmaWxlcywgYW5kIHVzaW5nIGhldXJpc3RpY3MgdG8gZGVjaWRlIHdoaWNoIGZpbGVzIHRvIHByb2Nlc3MuCiBBbiBGWUkgYm90IHJ1bnMgbW9yZSBkZXRhaWxlZCB0ZXN0cyBvbiB0aGUgd2hvbGUgcmVwb3NpdG9yeSBhbmQgd2l0aCBkaWZmZXJlbnQKIHN3aXRjaGVzLCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgaGV1cmlzdGljcyB0aGF0IHRyeWJvdCB0ZXN0cyB1c2UgYW5kIHRoZSBsaW1pdGVkCiBzY29wZSBvZiB0ZXN0cyBoYXZlIG5vdCBuZWdsZWN0ZWQgYW55IGlzc3Vlcy4KQEAgLTQzNCw0ICs0MzQsNCBAQAogCiBGb3Igc2VyaWFsaXphdGlvbiBvZiBuZXR3b3JrIHRyYWZmaWMgYW5ub3RhdGlvbiBhbmQgcGFydGlhbCBuZXR3b3JrIHRyYWZmaWMKIGFubm90YXRpb24gdGFncywgeW91IGNhbiB1c2UgdGhlIG11dGFibGUgbW9qbyBpbnRlcmZhY2VzIGRlZmluZWQgaW4KLWAvc2VydmljZXMvbmV0d29yay9wdWJsaWMvbW9qb21gLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2Avc2VydmljZXMvbmV0d29yay9wdWJsaWMvbW9qb21gLgpkaWZmIC0tZ2l0IGEvZG9jcy9zcGVlZC9hcGtfc2l6ZV9yZWdyZXNzaW9ucy5tZCBiL2RvY3Mvc3BlZWQvYXBrX3NpemVfcmVncmVzc2lvbnMubWQKaW5kZXggZTY5ZmE2MS4uOGI3YTdmYSAxMDA2NDQKLS0tIGEvZG9jcy9zcGVlZC9hcGtfc2l6ZV9yZWdyZXNzaW9ucy5tZAorKysgYi9kb2NzL3NwZWVkL2Fwa19zaXplX3JlZ3Jlc3Npb25zLm1kCkBAIC0xMDYsNzQgKzEwNiwxMyBAQAogCiAjIyBTdGVwIDI6IEFuYWx5emUKIAotIyMjIEdyb3d0aCBpcyBmcm9tIFRyYW5zbGF0aW9ucwotCi0gKiBUaGVyZSBpcyBsaWtlbHkgbm90aGluZyB0aGF0IGNhbiBiZSBkb25lLiBUcmFuc2xhdGlvbnMgYXJlIGV4cGVuc2l2ZS4KLSAqIENsb3NlIGFzIGBXb24ndCBGaXhgLgotCi0jIyMgR3Jvd3RoIGlzIGZyb20gTmF0aXZlIFJlc291cmNlcyAocGFrIGZpbGVzKQotCi0gKiBFbnN1cmUgYGNvbXByZXNzPSJnemlwImAgb3IgYGNvbXByZXNzPSJicm90bGkiYCBpcyB1c2VkIGZvciBhbGwKLSAgIGhpZ2hseS1jb21wcmVzc2libGUgKGUuZy4gdGV4dCkgcmVzb3VyY2VzLgotICAgKiBCcm90bGkgY29tcHJlc3NlcyBtb3JlIGJ1dCBpcyBtdWNoIHNsb3dlciB0byBkZWNvbXByZXNzLiBVc2UgYnJvdGxpIG9ubHkKLSAgICAgd2hlbiBwZXJmb3JtYW5jZSBkb2Vzbid0IG1hdHRlciBtdWNoIChlLmcuIGludGVybmFscyBwYWdlcykuCi0gKiBMb29rIGF0IHRoZSBTdXBlclNpemUgcmVwb3J0cyBmcm9tIHRoZSB0cnlib3QgdG8gbG9vayBmb3IgdW5leHBlY3RlZAotICAgcmVzb3VyY2VzLCBvciB1bnJlYXNvbmFibHkgbGFyZ2Ugc3ltYm9scy4KLQotIyMjIEdyb3d0aCBpcyBmcm9tIEltYWdlcwotCi0gKiBXb3VsZCBbYSBWZWN0b3JEcmF3YWJsZV0oaHR0cHM6Ly9jb2RlcmV2aWV3LmNocm9taXVtLm9yZy8yODU3ODkzMDAzLykgYmUgYmV0dGVyPwotICAgKiBJZiBzbywgdHJ5IG9wdGltaXppbmcgaXQgd2l0aCBbYXZvY2Fkb10oaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9OTgyMzAyKS4KLSAqIFdvdWxkICoqbG9zc3kqKiBjb21wcmVzc2lvbiBtYWtlIHNlbnNlIChvZnRlbiB0cnVlIGZvciBsYXJnZSBpbWFnZXMpPwotICAgKiBUaGVuIFt1c2UgbG9zc3kgd2VicF0oaHR0cHM6Ly9jb2RlcmV2aWV3LmNocm9taXVtLm9yZy8yNjE1MjQzMDAyLykuCi0gICAqIEFuZCBvbWl0IHNvbWUgZGVuc2l0aWVzIChlLmcuIGFkZCBvbmx5IGFuIHh4aGRwaSB2ZXJzaW9uKS4KLSAqIFdvdWxkICoqbmVhci1sb3NzbGVzcyoqIGNvbXByZXNzaW9uIG1ha2Ugc2Vuc2UgKHRyeSBpdCBhbmQgc2VlKT8KLSAgICogW1VzZSBwbmdxdWFudF0oaHR0cHM6Ly9wbmdxdWFudC5vcmcpIHRvIHJlZHVjZSB0aGUgY29sb3IgZGVwdGggd2l0aG91dCBhCi0gICAgIHBlcmNlcHR1YWwgZGlmZmVyZW5jZSAodXNlIG9uZSBvZiB0aGUgR1VJIHRvb2xzIHRvIGNvbXBhcmUgYmVmb3JlL2FmdGVycykuCi0gKiBBcmUgdGhlICoqbG9zc2xlc3MqKiBpbWFnZXMgZnVsbHkgb3B0aW1pemVkPwotICAgKiBVc2UgW3Rvb2xzL3Jlc291cmNlcy9vcHRpbWl6ZS1wbmctZmlsZXMuc2hdKGh0dHBzOi8vY3MuY2hyb21pdW0ub3JnL2Nocm9taXVtL3NyYy90b29scy9yZXNvdXJjZXMvb3B0aW1pemUtcG5nLWZpbGVzLnNoKS4KLSAgICogVGhlcmUgaXMgc29tZSBbR29vZ2xlci1zcGVjaWZpYyBndWlkYW5jZV0oaHR0cHM6Ly9nb3RvLmdvb2dsZS5jb20vY2xhbmsvZW5naW5lZXJpbmcvYmVzdC1wcmFjdGljZXMvYWRkaW5nLWltYWdlLWFzc2V0cykgYXMgd2VsbC4KLQotIyMjIyBXaGF0IEJ1aWxkLVRpbWUgSW1hZ2UgT3B0aW1pemF0aW9ucyBhcmUgVGhlcmU/Ci0gKiBGb3Igbm9uLW5pbmVwYXRjaCBpbWFnZXMsIGBkcmF3YWJsZS14eHhoZHBpYCBhcmUgb21pdHRlZCAodGhleSBhcmUgbm90Ci0gICBwZXJjZXB0aWJseSBkaWZmZXJlbnQgZnJvbSB4eGhkcGkgaW4gbW9zdCBjYXNlcykuCi0gKiBGb3Igbm9uLW5pbmVwYXRjaCBpbWFnZXMgd2l0aGluIHJlcy8gZGlyZWN0b3JpZXMgKG5vdCBmb3IgLnBhayBmaWxlIGltYWdlcyksCi0gICB0aGV5IGFyZSBjb252ZXJ0ZWQgdG8gd2VicC4KLSAgICogVXNlIHRoZSBgYW5kcm9pZC1iaW5hcnktc2l6ZWAgdHJ5Ym90IHRvIHNlZSB0aGUgc2l6ZSBvZiB0aGUgaW1hZ2VzIGFzIHdlYnAsCi0gICAgIG9yIGp1c3QgYnVpbGQgYENocm9tZVB1YmxpYy5hcGtgIGFuZCB1c2UgYHVuemlwIC1sYCB0byBzZWUgdGhlIHNpemUgb2YgdGhlCi0gICAgIGltYWdlcyB3aXRoaW4gdGhlIGJ1aWx0IGFway4KLQotIyMjIEdyb3d0aCBpcyBmcm9tIE5hdGl2ZSBDb2RlCi0KLSAqIExvb2sgYXQgdGhlIFN1cGVyU2l6ZSByZXBvcnRzIGZyb20gdGhlIHRyeWJvdCB0byBsb29rIGZvciB1bmV4cGVjdGVkIHN5bWJvbHMsCi0gICBvciB1bnJlYXNvbmFibHkgbGFyZ2Ugc3ltYm9scy4KLSAqIElmIHRoZSBkaWZmIGxvb2tzIHJlYXNvbmFibGUsIGNsb3NlIGFzIGBXb24ndCBGaXhgLgotICogT3RoZXJ3aXNlLCB0cnkgdG8gcmVmYWN0b3IgYSBiaXQgKGUuZy4KLSBbbW92ZSBjb2RlIG91dCBvZiB0ZW1wbGF0ZXNdKGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTcxNjM5MykpLgotICAgKiBVc2UgWy8vdG9vbHMvYmluYXJ5X3NpemUvZGlhZ25vc2VfYmxvYXQucHldKGh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMvKy9tYXN0ZXIvdG9vbHMvYmluYXJ5X3NpemUvUkVBRE1FLm1kKQotICAgICBvciB0aGUgYW5kcm9pZC1iaW5hcnktc2l6ZSB0cnlib3QgdG8gc3BvdC1jaGVjayB5b3VyIGxvY2FsIGNoYW5nZXMuCi0gKiBJZiBzeW1ib2xzIGFyZSBsYXJnZXIgdGhhbiBleHBlY3RlZCwgdXNlIHRoZSBgRGlzYXNzZW1ibGUoKWAgZmVhdHVyZSBvZgotICAgYHN1cGVyc2l6ZSBjb25zb2xlYCB0byBzZWUgd2hhdCBpcyBnb2luZyBvbi4KLQotIyMjIEdyb3d0aCBpcyBmcm9tIEphdmEgQ29kZQotCi0gKiBMb29rIGF0IHRoZSBTdXBlclNpemUgcmVwb3J0cyBmcm9tIHRoZSB0cnlib3QgdG8gbG9vayBmb3IgdW5leHBlY3RlZCBtZXRob2RzLgotICogRW5zdXJlIGFueSBuZXcgSmF2YSBkZXBzIGFyZSBhcyBzcGVjaWZpYyBhcyBwb3NzaWJsZS4KLQotIyMjIEdyb3d0aCBpcyBmcm9tICJvdGhlciBsaWIgc2l6ZSIgb3IgIlVua25vd24gZmlsZXMgc2l6ZSIKLQotICogRmlsZSBhIGJ1ZyB1bmRlciBbVG9vbHMgPiBCaW5hcnlTaXplXShodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2xpc3Q/cT1jb21wb25lbnQlM0FUb29scyUzRUJpbmFyeVNpemUpCi0gICB3aXRoIGEgbGluayB0byB5b3VyIGNvbW1pdC4KLQotIyMjIFlvdSBXb3VsZCBMaWtlIEFzc2lzdGFuY2UKLQotICogRmVlbCBmcmVlIHRvIGVtYWlsIFtiaW5hcnktc2l6ZUBjaHJvbWl1bS5vcmddKGh0dHBzOi8vZ3JvdXBzLmdvb2dsZS5jb20vYS9jaHJvbWl1bS5vcmcvZm9ydW0vIyFmb3J1bS9iaW5hcnktc2l6ZSkuCitTZWUgW29wdGltaXphdGlvbiBhZHZpY2VdKC8vZG9jcy9zcGVlZC9iaW5hcnlfc2l6ZS9vcHRpbWl6YXRpb25fYWR2aWNlLm1kKS4KIAogIyMgU3RlcCAzOiBHaXZlIFVwIDovCiAKIElmIHlvdSBoYXZlIHNwZW50IE8oZGF5cykgdHJ5aW5nIHRvIHJlZHVjZSB0aGUgc2l6ZSBvdmVyaGVhZCBvZiB5b3VyIHBhdGNoIGFuZAotYXJlIHByZXR0eSBzdXJlIHRoYXQgeW91ciBpbXBsZW1lbnRhdGlvbiBpcyBlZmZpY2llbnQsIHRoZW4gYWRkIGEgY29tbWVudCB0byB0aGUKLWJ1ZyB3aXRoIHRoZSBmb2xsb3dpbmc6CithcmUgcHJldHR5IHN1cmUgdGhhdCB5b3VyIGltcGxlbWVudGF0aW9uIGlzIG9wdGltYWwoaXNoKSwgdGhlbiBhZGQgYSBjb21tZW50IHRvCit0aGUgYnVnIHdpdGggdGhlIGZvbGxvd2luZzoKIAogMSkgQSBkZXNjcmlwdGlvbiBvZiB3aGVyZSB0aGUgc2l6ZSBpcyBjb21pbmcgZnJvbSAoc2hvdyB0aGF0IHlvdSBzcGVudCB0aGUgdGltZQogICAgdG8gdW5kZXJzdGFuZCB3aHkgeW91ciBjb2RlIHRyYW5zbGF0ZWQgdG8gYSBsYXJnZSBiaW5hcnkgc2l6ZSkuCmRpZmYgLS1naXQgYS9kb2NzL3NwZWVkL2JpbmFyeV9zaXplL29wdGltaXphdGlvbl9hZHZpY2UubWQgYi9kb2NzL3NwZWVkL2JpbmFyeV9zaXplL29wdGltaXphdGlvbl9hZHZpY2UubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE3MGU4NgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3Mvc3BlZWQvYmluYXJ5X3NpemUvb3B0aW1pemF0aW9uX2FkdmljZS5tZApAQCAtMCwwICsxLDE1MiBAQAorIyBPcHRpbWl6aW5nIENocm9tZSdzIEJpbmFyeSBTaXplCisKKyA+CisgPiBUaGlzIGFkdmljZSBmb2N1c2VzIG9uIEFuZHJvaWQuCisgPgorCitbVE9DXQorCisjIyBIb3cgVG8gVGVsbCBpZiBJdCdzIFdvcnRoIFNwZW5kaW5nIFRpbWUgb24gQmluYXJ5IFNpemU/CisKKyAqIEJpbmFyeSBzaXplIGlzIGEgc2hhcmVkIHJlc291cmNlLCBhbmQgdGh1cyBpdHMgZ3Jvd3RoIGlzIGxhcmdlbHkgZHVlIHRvIHRoZQorICAgdHJhZ2VkeSBvZiB0aGUgY29tbW9ucy4KKyAqIEl0IHR5cGljYWxseSB0YWtlcyBhYm91dCBhIHdlZWsgb2YgZW5naW5lZXJpbmcgdGltZSB0byByZWR1Y2UgQW5kcm9pZCdzCisgICBiaW5hcnkgc2l6ZSBieSA1MGtiLgorICogQXMgb2YgMjAxOSwgQ2hyb21lIGZvciBBbmRyb2lkIChhcm0zMikgZ3Jvd3MgYnkgYWJvdXQgMTAwa2IgcGVyIHdlZWsuCisKKyMjIE9wdGltaXppbmcgVHJhbnNsYXRpb25zIChTdHJpbmdzKQorCisgKiBVc2UgW0FuZHJvaWQgU3lzdGVtIHN0cmluZ3NdKGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL1Iuc3RyaW5nLmh0bWwpIHdoZXJlIGFwcHJvcHJpYXRlCisgKiBFbnN1cmUgdGhhdCBzdHJpbmdzIGluIC5ncmQgZmlsZXMgbmVlZCB0byBiZSB0aGVyZS4gRm9yIHN0cmluZ3MgdGhhdCBkbworICAgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZCwgcHV0IHRoZW0gZGlyZWN0bHkgaW4gc291cmNlIGNvZGUuCisKKyMjIE9wdGltaXppbmcgTm9uLUltYWdlIE5hdGl2ZSBSZXNvdXJjZXMgaW4gLnBhayBGaWxlcworCisgKiBFbnN1cmUgYGNvbXByZXNzPSJnemlwImAgb3IgYGNvbXByZXNzPSJicm90bGkiYCBpcyB1c2VkIGZvciBhbGwKKyAgIGhpZ2hseS1jb21wcmVzc2libGUgKGUuZy4gdGV4dCkgcmVzb3VyY2VzLgorICAgKiBCcm90bGkgY29tcHJlc3NlcyBtb3JlIGJ1dCBpcyBtdWNoIHNsb3dlciB0byBkZWNvbXByZXNzLiBVc2UgYnJvdGxpIG9ubHkKKyAgICAgd2hlbiBwZXJmb3JtYW5jZSBkb2Vzbid0IG1hdHRlciAoZS5nLiBpbnRlcm5hbHMgcGFnZXMpLgorICogTG9vayBhdCB0aGUgU3VwZXJTaXplIHJlcG9ydHMgZnJvbSB0aGUgYW5kcm9pZC1iaW5hcnktc2l6ZSB0cnlib3QgdG8gbG9vayBmb3IKKyAgIHVuZXhwZWN0ZWQgcmVzb3VyY2VzLCBvciB1bnJlYXNvbmFibHkgbGFyZ2Ugc3ltYm9scy4KKworIyMgT3B0aW1pemluZyBJbWFnZXMKKworICogV291bGQgYSB2ZWN0b3IgaW1hZ2Ugd29yaz8KKyAgICogRm9yIGltYWdlcyB1c2VkIGluIG5hdGl2ZSBjb2RlOiBbVmVjdG9ySWNvbl0oaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYy8rL0hFQUQvY29tcG9uZW50cy92ZWN0b3JfaWNvbnMvUkVBRE1FLm1kKS4KKyAgICogRm9yIEFuZHJvaWQgZHJhd2FibGVzOiBbVmVjdG9yRHJhd2FibGVdKGh0dHBzOi8vY29kZXJldmlldy5jaHJvbWl1bS5vcmcvMjg1Nzg5MzAwMy8pLgorICAgICAqIE9wdGltaXplIHZlY3RvciBkcmF3YWJsZXMgd2l0aCBbYXZvY2Fkb10oaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9OTgyMzAyKS4KKyAqIFdvdWxkICoqbG9zc3kqKiBjb21wcmVzc2lvbiBtYWtlIHNlbnNlIChvZnRlbiB0cnVlIGZvciBsYXJnZSBpbWFnZXMpPworICAgKiBJZiBzbywgW3VzZSBsb3NzeSB3ZWJwXShodHRwczovL2NvZGVyZXZpZXcuY2hyb21pdW0ub3JnLzI2MTUyNDMwMDIvKS4KKyAgICogQW5kIG9taXQgc29tZSBkZW5zaXRpZXMgKGUuZy4gYWRkIG9ubHkgYW4geHhoZHBpIHZlcnNpb24pLgorICogV291bGQgKipuZWFyLWxvc3NsZXNzKiogY29tcHJlc3Npb24gbWFrZSBzZW5zZT8KKyAgICogVGhpcyBjYW4gb2Z0ZW4gcmVkdWNlIHNpemUgYnkgPjUwJSB3aXRob3V0IGEgcGVyY2VwdGlibGUgZGlmZmVyZW5jZS4KKyAgICogW1VzZSBwbmdxdWFudF0oaHR0cHM6Ly9wbmdxdWFudC5vcmcpIHRvIHRyeSB0aGlzIG91dCAodXNlIG9uZSBvZiB0aGUgR1VJCisgICAgIHRvb2xzIHRvIGNvbXBhcmUgYmVmb3JlL2FmdGVyKS4KKyAqIEFyZSB0aGUgKipsb3NzbGVzcyoqIGltYWdlcyBmdWxseSBvcHRpbWl6ZWQ/CisgICAqIFVzZSBbdG9vbHMvcmVzb3VyY2VzL29wdGltaXplLXBuZy1maWxlcy5zaF0oaHR0cHM6Ly9jcy5jaHJvbWl1bS5vcmcvY2hyb21pdW0vc3JjL3Rvb2xzL3Jlc291cmNlcy9vcHRpbWl6ZS1wbmctZmlsZXMuc2gpLgorICAgKiBUaGVyZSBpcyBzb21lIFtHb29nbGVyLXNwZWNpZmljIGd1aWRhbmNlXShodHRwczovL2dvdG8uZ29vZ2xlLmNvbS9jbGFuay9lbmdpbmVlcmluZy9iZXN0LXByYWN0aWNlcy9hZGRpbmctaW1hZ2UtYXNzZXRzKSBhcyB3ZWxsLgorCisjIyMgV2hhdCBCdWlsZC1UaW1lIEltYWdlIE9wdGltaXphdGlvbnMgYXJlIFRoZXJlPworICogRm9yIG5vbi1uaW5lcGF0Y2ggaW1hZ2VzLCBgZHJhd2FibGUteHh4aGRwaWAgYXJlIG9taXR0ZWQgKHRoZXkgYXJlIG5vdAorICAgcGVyY2VwdGlibHkgZGlmZmVyZW50IGZyb20geHhoZHBpIGluIG1vc3QgY2FzZXMpLgorICogRm9yIG5vbi1uaW5lcGF0Y2ggaW1hZ2VzIHdpdGhpbiByZXMvIGRpcmVjdG9yaWVzIChub3QgZm9yIC5wYWsgZmlsZSBpbWFnZXMpLAorICAgdGhleSBhcmUgY29udmVydGVkIHRvIHdlYnAuCisgICAqIFVzZSB0aGUgYGFuZHJvaWQtYmluYXJ5LXNpemVgIHRyeWJvdCB0byBzZWUgdGhlIHNpemUgb2YgdGhlIGltYWdlcyBhcyB3ZWJwLAorICAgICBvciBqdXN0IGJ1aWxkIGBDaHJvbWVQdWJsaWMuYXBrYCBhbmQgdXNlIGB1bnppcCAtbGAgdG8gc2VlIHRoZSBzaXplIG9mIHRoZQorICAgICBpbWFnZXMgd2l0aGluIHRoZSBidWlsdCBhcGsuCisKKyMjIE9wdGltaXppbmcgQ29kZQorCitJbiBtb3N0IHBhcnRzIG9mIHRoZSBjb2RlYmFzZSwgeW91IHNob3VsZCB0cnkgdG8gb3B0aW1pemUgeW91ciBjb2RlIGZvciBiaW5hcnkKK3NpemUgcmF0aGVyIHRoYW4gcGVyZm9ybWFuY2UuIE1vc3QgY29kZSBydW5zICJmYXN0IGVub3VnaCIgYW5kIG9ubHkgbmVlZHMgdG8gYmUKK3BlcmZvcm1hbmNlLW9wdGltaXplZCBpZiBpZGVudGlmaWVkIGFzIGEgaG90IHNwb3QuIEluZGl2aWR1YWwgY29kZSBzaXplIGFmZmVjdHMKK292ZXJhbGwgYmluYXJ5IHNpemUgbm8gbWF0dGVyIHRoZSB1dGlsaXR5IG9mIHRoZSBjb2RlLgorCitXaGF0IHRoaXMgKmNvdWxkKiBtZWFuIGluIHByYWN0aWNlPworICogVXNlIGEgbGluZWFyIHNlYXJjaCBvdmVyIGFuIGFycmF5IHJhdGhlciB0aGFuIGEgYmluYXJ5IHNlYXJjaCBvdmVyIGEgc29ydGVkCisgICBvbmUuCisgKiBSZXVzZSBjb21tb24gY29kZSByYXRoZXIgdGhhbiB3cml0aW5nIG9wdGltaXplZCBwdXJwb3NlLXNwZWNpZmljIGNvZGUuCisKK1ByYWN0aWNhbCBhZHZpY2U6CisgKiBXaGVuIG1ha2luZyBjaGFuZ2VzLCBsb29rIGF0IHN5bWJvbCBicmVha2Rvd25zIHdpdGggU3VwZXJTaXplIHJlcG9ydHMgZnJvbQorICAgdGhlIFthbmRyb2lkLWJpbmFyeS1zaXplIHRyeWJvdF1bc2l6ZS10cnlib3RdLgorICAgKiBPciB1c2UgWy8vdG9vbHMvYmluYXJ5X3NpemUvZGlhZ25vc2VfYmxvYXQucHldW2RpYWdub3NlX2Jsb2F0XSB0byBjcmVhdGUKKyAgICAgZGlmZnMgbG9jYWxseS4KKyAqIEVuc3VyZSBubyBzeW1ib2xzIGV4aXN0cyB0aGF0IGFyZSB1c2VkIG9ubHkgYnkgdGVzdHMuCisgKiBCZSBjb25jaXNlIHdpdGggc3RyaW5ncyB1c2VkIGZvciBlcnJvciBoYW5kbGluZy4KKyAgICogSWRlbnRpY2FsIHN0cmluZ3MgdGhyb3VnaG91dCB0aGUgY29kZWJhc2UgYXJlIGRlLWR1cGVkLiBUYWtlIGFkdmFudGFnZSBvZgorICAgICB0aGlzIGZvciBlcnJvci1yZWxhdGVkIHN0cmluZ3MuCisgKiBJZiB0aGVyZSdzIGEgbm90YWJsZSBpbmNyZWFzZSBpbiBgLmRhdGEucmVsLnJvYDoKKyAgICogRW5zdXJlIHRoZXJlIGFyZSBub3QgW2V4Y2Vzc2l2ZSByZWxvY2F0aW9uc11bcmVsb2NhdGlvbnNdLgorICogSWYgdGhlcmUncyBhIG5vdGFibGUgaW5jcmVhc2UgaW4gYC5yb2RhdGFgOgorICAgKiBTZWUgaWYgaXQgd291bGQgbWFrZSBzZW5zZSB0byBjb21wcmVzcyBsYXJnZSBzeW1ib2xzIGhlcmUgYnkgbW92aW5nIHRoZW0gdG8KKyAgICAgLnBhayBmaWxlcy4KKyAgICogR3V0LWNoZWNrIHRoYXQgYWxsIHVuaXF1ZSBzdHJpbmcgbGl0ZXJhbHMgYmVpbmcgYWRkZWQgYXJlIGFjdHVhbGx5IHVzZWZ1bC4KKyAqIElmIHRoZXJlJ3MgYSBub3RhYmxlIGluY3JlYXNlIGluIGAudGV4dGA6CisgICAqIElmIHRoZXJlIGFyZSBhIGxvdCBvZiBzeW1ib2xzIGZyb20gQysrIHRlbXBsYXRlcywgdHJ5IG1vdmluZyBmdW5jdGlvbnMKKyAgICAgdGhhdCBkb24ndCB1c2UgdGVtcGxhdGUgcGFyYW1ldGVycyB0bworICAgICBbbm9uLXRlbXBsYXRlZCBoZWxwZXIgZnVuY3Rpb25zXVt0ZW1wbGF0ZV9ibG9hdF0pLgorICAgICAqIEFuZCBleHRyYWN0IHBhcnRzIG9mIGZ1bmN0aW9ucyB0aGF0IGRvbid0IHVzZSB0aGVtIGludG8gaGVscGVyIGZ1bmN0aW9ucy4KKyAgICogVHJ5IHRvIGxldmVyYWdlIGlkZW50aWNhbC1jb2RlLWZvbGRpbmcgYXMgbXVjaCBhcyBwb3NzaWJsZSBieSBtYWtpbmcgdGhlCisgICAgIHNoYXBlIG9mIHlvdXIgY29kZSBjb25zaXN0ZW50LgorICAgICAqIEUuZy4gVXNlIFBPRHMgd2hlcmV2ZXIgcG9zc2libGUsIGFuZCBlc3BlY2lhbGx5IGluIGNvbnRhaW5lcnMuIFRoZXkgd2lsbAorICAgICAgIGxpa2VseSBjb21waWxlIGRvd24gdG8gdGhlIHNhbWUgY29kZSBhcyBvdGhlciBwcmUtZXhpc3RpbmcgUE9Ecy4KKyAgICAgICAqIFRyeSBhbHNvIHRvIHVzZSBjb25zaXN0ZW50IGZpZWxkIG9yZGVyaW5nIHdpdGhpbiBQT0RzLgorICAgICAqIEUuZy4gYSBgc3RkOjp2ZWN0b3JgIG9mIGJhcmUgcG9pbnRlcnMgd2lsbCB2ZXJ5IGxpa2VseSBieSBJQ0YnZWQsIGJ1dCBvbmUKKyAgICAgICB0aGF0IHVzZXMgc21hcnQgcG9pbnRlcnMgZ2V0cyB0eXBlLXNwZWNpZmljIGRlc3RydWN0b3IgbG9naWMgaW5saW5lZCBpbnRvCisgICAgICAgaXQuCisgICAgICogVGhpcyBhZHZpY2UgaXMgZXNwZWNpYWxseSBhcHBsaWNhYmxlIHRvIGdlbmVyYXRlZCBjb2RlLgorICAgKiBJZiBzeW1ib2xzIGFyZSBsYXJnZXIgdGhhbiBleHBlY3RlZCwgdXNlIHRoZSBgRGlzYXNzZW1ibGUoKWAgZmVhdHVyZSBvZgorICAgICBbYHN1cGVyc2l6ZSBjb25zb2xlYF1bc3VwZXJzaXplLWNvbnNvbGVdIHRvIHNlZSB3aGF0IGlzIGdvaW5nIG9uLgorICAgICAqIFdhdGNoIG91dCBmb3IgaW5saW5lZCBjb25zdHJ1Y3RvcnMgJiBkZXN0cnVjdG9ycy4gRS5nLiBoYXZpbmcgcGFyYW1ldGVycworICAgICAgIHRoYXQgYXJlIHBhc3NlZCBieSB2YWx1ZSBmb3JjZXMgY2FsbGVycyB0byBjb25zdHJ1Y3Qgb2JqZWN0cyBiZWZvcmUKKyAgICAgICBjYWxsaW5nLgorICAgICAgICogRS5nLiBGb3IgZnJlcXVlbnRseSBjYWxsZWQgZnVuY3Rpb25zLCBpdCBjYW4gbWFrZSBzZW5zZSB0byBwcm92aWRlCisgICAgICAgICBzZXBhcmF0ZSBgY29uc3QgY2hhciAqYCBhbmQgYGNvbnN0IHN0ZDo6c3RyaW5nJmAgb3ZlcmxvYWRzIHJhdGhlciB0aGFuCisgICAgICAgICBhIHNpbmdsZSBgYmFzZTo6U3RyaW5nUGllY2VgLgorCitBbmRyb2lkLXNwZWNpZmljIGFkdmljZToKKyAqIFByZWZlciBmZXdlciBsYXJnZSBKTkkgY2FsbHMgb3ZlciBtYW55IHNtYWxsIEpOSSBjYWxscy4KKyAqIE1pbmltaXplIHRoZSB1c2Ugb2YgY2xhc3MgaW5pdGlhbGl6ZXJzIChgPGNsaW5pdD4oKWApLgorICAgKiBJZiBSOCBjYW5ub3QgZGV0ZXJtaW5lIHRoYXQgdGhleSBhcmUgInRyaXZpYWwiLCB0aGV5IHdpbGwgcHJldmVudAorICAgICBpbmxpbmluZyBvZiBzdGF0aWMgbWVtYmVycyBvbiB0aGUgY2xhc3MuCisgICAqIEluIEMrKywgc3RhdGljIG9iamVjdHMgYXJlIGNyZWF0ZWQgYXQgY29tcGlsZSB0aW1lLCBidXQgaW4gSmF2YSB0aGV5CisgICAgIGFyZSBjcmVhdGVkIGJ5IGV4ZWN1dGluZyBjb2RlIHdpdGhpbiBgPGNsaW5pdD4oKWAuIFRoZXJlIGlzIG9mdGVuIGxpdHRsZQorICAgICBhZHZhbnRhZ2UgdG8gaW5pdGlhbGl6aW5nIGNsYXNzIGZpZWxkcyBzdGF0aWNhbGx5IHZzLiB1cG9uIGZpcnN0IHVzZS4KKyAqIERvbid0IHVzZSBkZWZhdWx0IGludGVyZmFjZSBtZXRob2RzIG9uIGludGVyZmFjZXMgd2l0aCBtdWx0aXBsZSBpbXBsZW1lbnRlcnMuCisgICAqIERlc3VnYXJpbmcgY2F1c2VzIHRoZSBtZXRob2RzIHRvIGJlIGFkZGVkIHRvIGV2ZXJ5IGltcGxlbWVudG9yIHNlcGFyYXRlbHkuCisgICAqIEl0J3MgbW9yZSBlZmZpY2llbnQgdG8gdXNlIGEgYmFzZSBjbGFzcyB0byBhZGQgZGVmYXVsdCBtZXRob2RzLgorICogVXNlIGNvbmZpZy1zcGVjaWZpYyByZXNvdXJjZSBkaXJlY3RvcmllcyBzcGFyaW5nbHkuCisgICAqIEludHJvZHVjaW5nIGEgbmV3IGNvbmZpZyBoYXMgW2EgbGFyZ2UgY29zdF1bYXJzYy1ibG9hdF0uCisgKiBVc2UgYFN0cmluZy5mb3JtYXQoKWAgaW5zdGVhZCBvZiBjb25jYXRlbmF0aW9uLgorICAgKiBDb25jYXRlbmF0aW9uIGNhdXNlcyBhIGxvdCBvZiBTdHJpbmdCdWlsZGVyIGNvZGUgdG8gYmUgZ2VuZXJhdGVkLgorICogVHJ5IHRvIHVzZSBkZWZhdWx0IHZhbHVlcyBmb3IgZmllbGRzIHJhdGhlciB0aGFuIGV4cGxpY2l0IGluaXRpYWxpemF0aW9uLgorICAgKiBFLmcuIE5hbWUgYm9vbGVhbnMgc3VjaCB0aGF0IHRoZXkgc3RhcnQgYXMgImZhbHNlIi4KKyAgICogRS5nLiBVc2UgaW50ZWdlciBzZW50aW5lbHMgdGhhdCBoYXZlIGluaXRpYWwgc3RhdGUgYXMgMC4KKyAqIE1pbmltaXplIHRoZSBudW1iZXIgb2YgY2FsbGJhY2tzIC8gbGFtYmRhcyB0aGF0IGVhY2ggQVBJIHJlcXVpcmVzLgorICAgKiBFYWNoIGNhbGxiYWNrIC8gbGFtYmRhIGlzIHN5bnRhY3RpYyBzdWdhciBmb3IgYW4gYW5vbnltb3VzIGNsYXNzLCBhbmQgYWxsCisgICAgIGNsYXNzZXMgaGF2ZSBhIGNvbnN0cnVjdG9yIGluIGFkZGl0aW9uIHRvIHRoZSBjYWxsYmFjayBtZXRob2QuCisgICAqIEUuZy4gcmF0aGVyIHRoYW4gaGF2ZSBgb25GYWlsdXJlKClgIHZzIGBvblN1Y2Nlc3MoKWAsIGhhdmUgYW4KKyAgICAgYG9uRmluaXNoZWQoYm9vbClgLgorICAgKiBFLmcuIHJhdGhlciB0aGFuIGhhdmUgYG9uVGV4dENoYW5nZWQoKWAsIGBvbkRhdGVDaGFuZ2VkKClgLCAuLi4sIGhhdmUgYQorICAgICBzaW5nbGUgYG9uQ2hhbmdlZCgpYCB0aGF0IGFzc3VtZXMgZXZlcnl0aGluZyBjaGFuZ2VkLgorCitbc2l6ZS10cnlib3RdOiAvL3Rvb2xzL2JpbmFyeV9zaXplL1JFQURNRS5tZCNCaW5hcnktU2l6ZS1Ucnlib3QtYW5kcm9pZF9iaW5hcnlfc2l6ZQorW2RpYWdub3NlX2Jsb2F0XTogLy90b29scy9iaW5hcnlfc2l6ZS9SRUFETUUubWQjZGlhZ25vc2VfYmxvYXRfcHkKK1tyZWxvY2F0aW9uc106IC8vZG9jcy9uYXRpdmVfcmVsb2NhdGlvbnMubWQKK1t0ZW1wbGF0ZV9ibG9hdF06IGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTcxNjM5MworW3N1cGVyc2l6ZS1jb25zb2xlXTogLy90b29scy9iaW5hcnlfc2l6ZS9SRUFETUUubWQjVXNhZ2VfY29uc29sZQorW2Fyc2MtYmxvYXRdOiBodHRwczovL21lZGl1bS5jb20vYW5kcm9pZGRldmVsb3BlcnMvc21hbGxlcmFway1wYXJ0LTMtcmVtb3ZpbmctdW51c2VkLXJlc291cmNlcy0xNTExZjllM2Y3NjEjMGI3MgorCisjIyBPcHRpbWl6aW5nIFRoaXJkLVBhcnR5IEFuZHJvaWQgRGVwZW5kZW5jaWVzCisKKyAqIExvb2sgdGhyb3VnaCBTdXBlclNpemUgc3ltYm9scyB0byBzZWUgd2hldGhlciB1bndhbnRlZCBmdW5jdGlvbmFsaXR5CisgICBpcyBiZWluZyBwdWxsZWQgaW4uCisgICAqIFVzZSBQcm9HdWFyZCdzIGAtd2h5YXJleW91a2VlcGluZ2AgdG8gc2VlIHdoeSB1bndhbnRlZCBzeW1ib2xzIGFyZSBrZXB0LgorICAgKiBUcnkgYWRkaW5nIGAtYXNzdW1lbm9zaWRlZWZmZWN0c2AgcnVsZXMgdG8gc3RyaXAgb3V0IHVud2FudGVkIGNhbGxzLgorICogQ29uc2lkZXIgcmVtb3ZpbmcgYWxsIHJlc291cmNlcyB2aWEgYHN0cmlwX3Jlc291cmNlcyA9IHRydWVgLgorICogUmVtb3ZlIHNwZWNpZmljIGRyYXdhYmxlcyB2aWEgYHJlc291cmNlX2JsYWNrbGlzdF9yZWdleGAuCisKKyMjIFNpemUgT3B0aW1pemF0aW9uIEhlbHAKKworICogRmVlbCBmcmVlIHRvIGVtYWlsIFtiaW5hcnktc2l6ZUBjaHJvbWl1bS5vcmddKGh0dHBzOi8vZ3JvdXBzLmdvb2dsZS5jb20vYS9jaHJvbWl1bS5vcmcvZm9ydW0vIyFmb3J1bS9iaW5hcnktc2l6ZSkuCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2Jyb3dzZXIvYXBpL2F1dG9tYXRpb25faW50ZXJuYWwvYXV0b21hdGlvbl9ldmVudF9yb3V0ZXIuY2MgYi9leHRlbnNpb25zL2Jyb3dzZXIvYXBpL2F1dG9tYXRpb25faW50ZXJuYWwvYXV0b21hdGlvbl9ldmVudF9yb3V0ZXIuY2MKaW5kZXggNjdmNmIyMS4uZjZjYTMyMDkgMTAwNjQ0Ci0tLSBhL2V4dGVuc2lvbnMvYnJvd3Nlci9hcGkvYXV0b21hdGlvbl9pbnRlcm5hbC9hdXRvbWF0aW9uX2V2ZW50X3JvdXRlci5jYworKysgYi9leHRlbnNpb25zL2Jyb3dzZXIvYXBpL2F1dG9tYXRpb25faW50ZXJuYWwvYXV0b21hdGlvbl9ldmVudF9yb3V0ZXIuY2MKQEAgLTE1LDcgKzE1LDYgQEAKICNpbmNsdWRlICJjb250ZW50L3B1YmxpYy9icm93c2VyL25vdGlmaWNhdGlvbl9zZXJ2aWNlLmgiCiAjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvYnJvd3Nlci9ub3RpZmljYXRpb25fc291cmNlLmgiCiAjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvYnJvd3Nlci9ub3RpZmljYXRpb25fdHlwZXMuaCIKLSNpbmNsdWRlICJjb250ZW50L3B1YmxpYy9icm93c2VyL3JlbmRlcl9wcm9jZXNzX2hvc3QuaCIKICNpbmNsdWRlICJleHRlbnNpb25zL2Jyb3dzZXIvYXBpL2F1dG9tYXRpb25faW50ZXJuYWwvYXV0b21hdGlvbl9pbnRlcm5hbF9hcGlfZGVsZWdhdGUuaCIKICNpbmNsdWRlICJleHRlbnNpb25zL2Jyb3dzZXIvYXBpL2V4dGVuc2lvbnNfYXBpX2NsaWVudC5oIgogI2luY2x1ZGUgImV4dGVuc2lvbnMvYnJvd3Nlci9ldmVudF9yb3V0ZXIuaCIKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYnJvd3Nlci9hcGkvYXV0b21hdGlvbl9pbnRlcm5hbC9hdXRvbWF0aW9uX2V2ZW50X3JvdXRlci5oIGIvZXh0ZW5zaW9ucy9icm93c2VyL2FwaS9hdXRvbWF0aW9uX2ludGVybmFsL2F1dG9tYXRpb25fZXZlbnRfcm91dGVyLmgKaW5kZXggOTc3ZDM3OC4uYTlmZDFlNCAxMDA2NDQKLS0tIGEvZXh0ZW5zaW9ucy9icm93c2VyL2FwaS9hdXRvbWF0aW9uX2ludGVybmFsL2F1dG9tYXRpb25fZXZlbnRfcm91dGVyLmgKKysrIGIvZXh0ZW5zaW9ucy9icm93c2VyL2FwaS9hdXRvbWF0aW9uX2ludGVybmFsL2F1dG9tYXRpb25fZXZlbnRfcm91dGVyLmgKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlICJiYXNlL21lbW9yeS9zaW5nbGV0b24uaCIKICNpbmNsdWRlICJiYXNlL3Njb3BlZF9vYnNlcnZlci5oIgogI2luY2x1ZGUgImNvbnRlbnQvcHVibGljL2Jyb3dzZXIvYXhfZXZlbnRfbm90aWZpY2F0aW9uX2RldGFpbHMuaCIKKyNpbmNsdWRlICJjb250ZW50L3B1YmxpYy9icm93c2VyL3JlbmRlcl9wcm9jZXNzX2hvc3QuaCIKICNpbmNsdWRlICJjb250ZW50L3B1YmxpYy9icm93c2VyL3JlbmRlcl9wcm9jZXNzX2hvc3Rfb2JzZXJ2ZXIuaCIKICNpbmNsdWRlICJleHRlbnNpb25zL2Jyb3dzZXIvYXBpL2F1dG9tYXRpb25faW50ZXJuYWwvYXV0b21hdGlvbl9ldmVudF9yb3V0ZXJfaW50ZXJmYWNlLmgiCiAjaW5jbHVkZSAiZXh0ZW5zaW9ucy9jb21tb24vYXBpL2F1dG9tYXRpb25faW50ZXJuYWwuaCIKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYnJvd3Nlci9ndWVzdF92aWV3L3dlYl92aWV3L3dlYl92aWV3X2d1ZXN0LmNjIGIvZXh0ZW5zaW9ucy9icm93c2VyL2d1ZXN0X3ZpZXcvd2ViX3ZpZXcvd2ViX3ZpZXdfZ3Vlc3QuY2MKaW5kZXggNGI2OWNhNDkuLjNlNzNlZWYgMTAwNjQ0Ci0tLSBhL2V4dGVuc2lvbnMvYnJvd3Nlci9ndWVzdF92aWV3L3dlYl92aWV3L3dlYl92aWV3X2d1ZXN0LmNjCisrKyBiL2V4dGVuc2lvbnMvYnJvd3Nlci9ndWVzdF92aWV3L3dlYl92aWV3L3dlYl92aWV3X2d1ZXN0LmNjCkBAIC04MzgsMTAgKzgzOCwxMCBAQAogICAvLyBmYWN0b3JpZXMgYXJlIHB1c2hlZCBzbGlnaHRseSBsYXRlciAtIGR1cmluZyB0aGUgY29tbWl0LgogICBjb25zdGV4cHIgYm9vbCBrUHVzaFRvUmVuZGVyZXJOb3cgPSBmYWxzZTsKIAotICAvLyB8cmVxdWVzdF9pbml0aWF0b3J8IGluIGZldGNoZXMgaW5pdGlhdGVkIGJ5IGNvbnRlbnQgc2NyaXB0cyBzaG91bGQgdXNlIHRoZQotICAvLyBvcmlnaW4gb2YgdGhlIDx3ZWJ2aWV3PiBlbWJlZGRlci4KKyAgLy8gQ29udGVudCBzY3JpcHRzIHJ1biBpbiBhbiBpc29sYXRlZCB3b3JsZCBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbiBvZiB0aGUKKyAgLy8gPHdlYnZpZXc+IGVtYmVkZGVyLgogICBuYXZpZ2F0aW9uX2hhbmRsZS0+R2V0UmVuZGVyRnJhbWVIb3N0KCkKLSAgICAgIC0+TWFya0luaXRpYXRvcnNBc1JlcXVpcmluZ1NlcGFyYXRlVVJMTG9hZGVyRmFjdG9yeSgKKyAgICAgIC0+TWFya0lzb2xhdGVkV29ybGRzQXNSZXF1aXJpbmdTZXBhcmF0ZVVSTExvYWRlckZhY3RvcnkoCiAgICAgICAgICAge293bmVyX3dlYl9jb250ZW50cygpLT5HZXRNYWluRnJhbWUoKS0+R2V0TGFzdENvbW1pdHRlZE9yaWdpbigpfSwKICAgICAgICAgICBrUHVzaFRvUmVuZGVyZXJOb3cpOwogfQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9icm93c2VyL3VybF9sb2FkZXJfZmFjdG9yeV9tYW5hZ2VyLmNjIGIvZXh0ZW5zaW9ucy9icm93c2VyL3VybF9sb2FkZXJfZmFjdG9yeV9tYW5hZ2VyLmNjCmluZGV4IGViZDA5ZDMuLjA0MWMwN2Q2IDEwMDY0NAotLS0gYS9leHRlbnNpb25zL2Jyb3dzZXIvdXJsX2xvYWRlcl9mYWN0b3J5X21hbmFnZXIuY2MKKysrIGIvZXh0ZW5zaW9ucy9icm93c2VyL3VybF9sb2FkZXJfZmFjdG9yeV9tYW5hZ2VyLmNjCkBAIC0zNDEsMTIgKzM0MSwxMiBAQAogICByZXR1cm4gZmFjdG9yeV9pbmZvOwogfQogCi12b2lkIE1hcmtJbml0aWF0b3JzQXNSZXF1aXJpbmdTZXBhcmF0ZVVSTExvYWRlckZhY3RvcnkoCit2b2lkIE1hcmtJc29sYXRlZFdvcmxkc0FzUmVxdWlyaW5nU2VwYXJhdGVVUkxMb2FkZXJGYWN0b3J5KAogICAgIGNvbnRlbnQ6OlJlbmRlckZyYW1lSG9zdCogZnJhbWUsCiAgICAgc3RkOjp2ZWN0b3I8dXJsOjpPcmlnaW4+IHJlcXVlc3RfaW5pdGlhdG9ycywKICAgICBib29sIHB1c2hfdG9fcmVuZGVyZXJfbm93KSB7CiAgIERDSEVDSyghcmVxdWVzdF9pbml0aWF0b3JzLmVtcHR5KCkpOwotICBmcmFtZS0+TWFya0luaXRpYXRvcnNBc1JlcXVpcmluZ1NlcGFyYXRlVVJMTG9hZGVyRmFjdG9yeSgKKyAgZnJhbWUtPk1hcmtJc29sYXRlZFdvcmxkc0FzUmVxdWlyaW5nU2VwYXJhdGVVUkxMb2FkZXJGYWN0b3J5KAogICAgICAgc3RkOjptb3ZlKHJlcXVlc3RfaW5pdGlhdG9ycyksIHB1c2hfdG9fcmVuZGVyZXJfbm93KTsKIH0KIApAQCAtNDgwLDcgKzQ4MCw3IEBACiAgICAgLy8gZmFjdG9yaWVzIGFyZSBwdXNoZWQgc2xpZ2h0bHkgbGF0ZXIgLSBkdXJpbmcgdGhlIGNvbW1pdC4KICAgICBjb25zdGV4cHIgYm9vbCBrUHVzaFRvUmVuZGVyZXJOb3cgPSBmYWxzZTsKIAotICAgIE1hcmtJbml0aWF0b3JzQXNSZXF1aXJpbmdTZXBhcmF0ZVVSTExvYWRlckZhY3RvcnkoCisgICAgTWFya0lzb2xhdGVkV29ybGRzQXNSZXF1aXJpbmdTZXBhcmF0ZVVSTExvYWRlckZhY3RvcnkoCiAgICAgICAgIGZyYW1lLCBzdGQ6Om1vdmUoaW5pdGlhdG9yc19yZXF1aXJpbmdfc2VwYXJhdGVfZmFjdG9yeSksCiAgICAgICAgIGtQdXNoVG9SZW5kZXJlck5vdyk7CiAgIH0KQEAgLTUxMSw3ICs1MTEsNyBAQAogICAvLyBsZWdhY3kgSVBDIHBpcGUgKHJhY2luZXNzIHdpbGwgYmUgaW50cm9kdWNlZCBpZiB0aGF0IGV2ZXIgY2hhbmdlcykuCiAgIGNvbnN0ZXhwciBib29sIGtQdXNoVG9SZW5kZXJlck5vdyA9IHRydWU7CiAKLSAgTWFya0luaXRpYXRvcnNBc1JlcXVpcmluZ1NlcGFyYXRlVVJMTG9hZGVyRmFjdG9yeSgKKyAgTWFya0lzb2xhdGVkV29ybGRzQXNSZXF1aXJpbmdTZXBhcmF0ZVVSTExvYWRlckZhY3RvcnkoCiAgICAgICBmcmFtZSwge3VybDo6T3JpZ2luOjpDcmVhdGUoZXh0ZW5zaW9uLT51cmwoKSl9LCBrUHVzaFRvUmVuZGVyZXJOb3cpOwogfQogCkBAIC01NDIsNyArNTQyLDcgQEAKICAgICAgIHJlZ2lzdHJ5LT5lbmFibGVkX2V4dGVuc2lvbnMoKS5HZXRCeUlEKHByZWN1cnNvcl9vcmlnaW4uaG9zdCgpKTsKICAgaWYgKCFleHRlbnNpb24pIHsKICAgICAvLyBUaGlzIG1heSBoYXBwZW4gaWYgYW4gZXh0ZW5zaW9uIGdldHMgZGlzYWJsZWQgYmV0d2VlbiB0aGUgdGltZQotICAgIC8vIFJlbmRlckZyYW1lSG9zdDo6TWFya0luaXRpYXRvckFzUmVxdWlyaW5nU2VwYXJhdGVVUkxMb2FkZXJGYWN0b3J5IGlzCisgICAgLy8gUmVuZGVyRnJhbWVIb3N0OjpNYXJrSXNvbGF0ZWRXb3JsZEFzUmVxdWlyaW5nU2VwYXJhdGVVUkxMb2FkZXJGYWN0b3J5IGlzCiAgICAgLy8gY2FsbGVkIGFuZCB0aGUgdGltZQogICAgIC8vIENvbnRlbnRCcm93c2VyQ2xpZW50OjpDcmVhdGVVUkxMb2FkZXJGYWN0b3J5IGlzIGNhbGxlZC4KICAgICByZXR1cm4gbmV0d29yazo6bW9qb206OlVSTExvYWRlckZhY3RvcnlQdHJJbmZvKCk7CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL3JlbmRlcmVyL0RFUFMgYi9leHRlbnNpb25zL3JlbmRlcmVyL0RFUFMKaW5kZXggZDJhMTNhNy4uMTM0Y2FiOSAxMDA2NDQKLS0tIGEvZXh0ZW5zaW9ucy9yZW5kZXJlci9ERVBTCisrKyBiL2V4dGVuc2lvbnMvcmVuZGVyZXIvREVQUwpAQCAtNSwxMCArNSw2IEBACiAgICIrZ2luIiwKICAgIituZXQvYmFzZS9iYWNrb2ZmX2VudHJ5LmgiLAogCi0gICMgRm9yIG5ldDo6TE9BRF9NQVlCRV9VU0VSX0dFU1RVUkUuIFdpbGwgYmUgcmVtb3ZlZCBhcwotICAjIHBlciBjcmJ1Zy5jb20vNTE2NDk1Ci0gICIrbmV0L2Jhc2UvbG9hZF9mbGFncy5oIiwKLQogICAiK3RoaXJkX3BhcnR5L3NraWEvaW5jbHVkZS9jb3JlIiwKICAgIit0aGlyZF9wYXJ0eS9jbGRfMyIsCiAKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvcmVuZGVyZXIvZXh0ZW5zaW9uX2ZyYW1lX2hlbHBlci5jYyBiL2V4dGVuc2lvbnMvcmVuZGVyZXIvZXh0ZW5zaW9uX2ZyYW1lX2hlbHBlci5jYwppbmRleCA4N2M3YTE5Li45MDFiNzg0IDEwMDY0NAotLS0gYS9leHRlbnNpb25zL3JlbmRlcmVyL2V4dGVuc2lvbl9mcmFtZV9oZWxwZXIuY2MKKysrIGIvZXh0ZW5zaW9ucy9yZW5kZXJlci9leHRlbnNpb25fZnJhbWVfaGVscGVyLmNjCkBAIC01MDksOCArNTA5LDcgQEAKICAgICAgIHJlbmRlcl9mcmFtZSgpLT5HZXRXZWJGcmFtZSgpLT5HZXREb2N1bWVudCgpLkRyYWdnYWJsZVJlZ2lvbnMoKTsKICAgc3RkOjp2ZWN0b3I8RHJhZ2dhYmxlUmVnaW9uPiByZWdpb25zOwogICBmb3IgKGJsaW5rOjpXZWJEcmFnZ2FibGVSZWdpb24mIHdlYnJlZ2lvbiA6IHdlYnJlZ2lvbnMpIHsKLSAgICByZW5kZXJfZnJhbWUoKS0+R2V0UmVuZGVyVmlldygpLT5Db252ZXJ0Vmlld3BvcnRUb1dpbmRvd1ZpYVdpZGdldCgKLSAgICAgICAgJndlYnJlZ2lvbi5ib3VuZHMpOworICAgIHJlbmRlcl9mcmFtZSgpLT5Db252ZXJ0Vmlld3BvcnRUb1dpbmRvdygmd2VicmVnaW9uLmJvdW5kcyk7CiAKICAgICByZWdpb25zLnB1c2hfYmFjayhEcmFnZ2FibGVSZWdpb24oKSk7CiAgICAgRHJhZ2dhYmxlUmVnaW9uJiByZWdpb24gPSByZWdpb25zLmJhY2soKTsKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvcmVuZGVyZXIvZXh0ZW5zaW9uX3Rocm90dGxlX2VudHJ5LmNjIGIvZXh0ZW5zaW9ucy9yZW5kZXJlci9leHRlbnNpb25fdGhyb3R0bGVfZW50cnkuY2MKaW5kZXggMTk5NDczYi4uYTQ4ZmQ3YyAxMDA2NDQKLS0tIGEvZXh0ZW5zaW9ucy9yZW5kZXJlci9leHRlbnNpb25fdGhyb3R0bGVfZW50cnkuY2MKKysrIGIvZXh0ZW5zaW9ucy9yZW5kZXJlci9leHRlbnNpb25fdGhyb3R0bGVfZW50cnkuY2MKQEAgLTEzLDcgKzEzLDYgQEAKICNpbmNsdWRlICJiYXNlL3JhbmRfdXRpbC5oIgogI2luY2x1ZGUgImJhc2Uvc3RyaW5ncy9zdHJpbmdfbnVtYmVyX2NvbnZlcnNpb25zLmgiCiAjaW5jbHVkZSAiYmFzZS92YWx1ZXMuaCIKLSNpbmNsdWRlICJuZXQvYmFzZS9sb2FkX2ZsYWdzLmgiCiAKIG5hbWVzcGFjZSBleHRlbnNpb25zIHsKIApAQCAtNDQsMzQgKzQzLDI0IEBACiBjb25zdCBpbnQgRXh0ZW5zaW9uVGhyb3R0bGVFbnRyeTo6a0RlZmF1bHRFbnRyeUxpZmV0aW1lTXMgPSAyICogNjAgKiAxMDAwOwogCiBFeHRlbnNpb25UaHJvdHRsZUVudHJ5OjpFeHRlbnNpb25UaHJvdHRsZUVudHJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiB1cmxfaWQpCi0gICAgOiBFeHRlbnNpb25UaHJvdHRsZUVudHJ5KHVybF9pZCwgZmFsc2UpIHt9Ci0KLUV4dGVuc2lvblRocm90dGxlRW50cnk6OkV4dGVuc2lvblRocm90dGxlRW50cnkoCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHVybF9pZCwKLSAgICBib29sIGlnbm9yZV91c2VyX2dlc3R1cmVfbG9hZF9mbGFnX2Zvcl90ZXN0cykKICAgICA6IHNsaWRpbmdfd2luZG93X3BlcmlvZF8oCiAgICAgICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKGtEZWZhdWx0U2xpZGluZ1dpbmRvd1BlcmlvZE1zKSksCiAgICAgICBtYXhfc2VuZF90aHJlc2hvbGRfKGtEZWZhdWx0TWF4U2VuZFRocmVzaG9sZCksCiAgICAgICBpc19iYWNrb2ZmX2Rpc2FibGVkXyhmYWxzZSksCiAgICAgICBiYWNrb2ZmX2VudHJ5XygmYmFja29mZl9wb2xpY3lfKSwKLSAgICAgIHVybF9pZF8odXJsX2lkKSwKLSAgICAgIGlnbm9yZV91c2VyX2dlc3R1cmVfbG9hZF9mbGFnX2Zvcl90ZXN0c18oCi0gICAgICAgICAgaWdub3JlX3VzZXJfZ2VzdHVyZV9sb2FkX2ZsYWdfZm9yX3Rlc3RzKSB7CisgICAgICB1cmxfaWRfKHVybF9pZCkgewogICBJbml0aWFsaXplKCk7CiB9CiAKIEV4dGVuc2lvblRocm90dGxlRW50cnk6OkV4dGVuc2lvblRocm90dGxlRW50cnkoCiAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHVybF9pZCwKLSAgICBjb25zdCBuZXQ6OkJhY2tvZmZFbnRyeTo6UG9saWN5KiBiYWNrb2ZmX3BvbGljeSwKLSAgICBib29sIGlnbm9yZV91c2VyX2dlc3R1cmVfbG9hZF9mbGFnX2Zvcl90ZXN0cykKKyAgICBjb25zdCBuZXQ6OkJhY2tvZmZFbnRyeTo6UG9saWN5KiBiYWNrb2ZmX3BvbGljeSkKICAgICA6IHNsaWRpbmdfd2luZG93X3BlcmlvZF8oCiAgICAgICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKGtEZWZhdWx0U2xpZGluZ1dpbmRvd1BlcmlvZE1zKSksCiAgICAgICBtYXhfc2VuZF90aHJlc2hvbGRfKGtEZWZhdWx0TWF4U2VuZFRocmVzaG9sZCksCiAgICAgICBpc19iYWNrb2ZmX2Rpc2FibGVkXyhmYWxzZSksCiAgICAgICBiYWNrb2ZmX2VudHJ5XygmYmFja29mZl9wb2xpY3lfKSwKLSAgICAgIHVybF9pZF8odXJsX2lkKSwKLSAgICAgIGlnbm9yZV91c2VyX2dlc3R1cmVfbG9hZF9mbGFnX2Zvcl90ZXN0c18oCi0gICAgICAgICAgaWdub3JlX3VzZXJfZ2VzdHVyZV9sb2FkX2ZsYWdfZm9yX3Rlc3RzKSB7CisgICAgICB1cmxfaWRfKHVybF9pZCkgewogICBEQ0hFQ0tfR0UoYmFja29mZl9wb2xpY3ktPmluaXRpYWxfZGVsYXlfbXMsIDApOwogICBEQ0hFQ0tfR1QoYmFja29mZl9wb2xpY3ktPm11bHRpcGx5X2ZhY3RvciwgMCk7CiAgIERDSEVDS19HRShiYWNrb2ZmX3BvbGljeS0+aml0dGVyX2ZhY3RvciwgMC4wKTsKQEAgLTk3LDE1ICs4NiwxMCBAQAogICBpc19iYWNrb2ZmX2Rpc2FibGVkXyA9IHRydWU7CiB9CiAKLWJvb2wgRXh0ZW5zaW9uVGhyb3R0bGVFbnRyeTo6U2hvdWxkUmVqZWN0UmVxdWVzdChpbnQgcmVxdWVzdF9sb2FkX2ZsYWdzKSBjb25zdCB7Ci0gIGJvb2wgcmVqZWN0X3JlcXVlc3QgPSBmYWxzZTsKLSAgaWYgKCFpc19iYWNrb2ZmX2Rpc2FibGVkXyAmJgotICAgICAgKGlnbm9yZV91c2VyX2dlc3R1cmVfbG9hZF9mbGFnX2Zvcl90ZXN0c18gfHwKLSAgICAgICAhRXhwbGljaXRVc2VyUmVxdWVzdChyZXF1ZXN0X2xvYWRfZmxhZ3MpKSAmJgotICAgICAgR2V0QmFja29mZkVudHJ5KCktPlNob3VsZFJlamVjdFJlcXVlc3QoKSkgewotICAgIHJlamVjdF9yZXF1ZXN0ID0gdHJ1ZTsKLSAgfQotICByZXR1cm4gcmVqZWN0X3JlcXVlc3Q7Citib29sIEV4dGVuc2lvblRocm90dGxlRW50cnk6OlNob3VsZFJlamVjdFJlcXVlc3QoKSBjb25zdCB7CisgIGlmIChpc19iYWNrb2ZmX2Rpc2FibGVkXykKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiBHZXRCYWNrb2ZmRW50cnkoKS0+U2hvdWxkUmVqZWN0UmVxdWVzdCgpOwogfQogCiBpbnQ2NF90IEV4dGVuc2lvblRocm90dGxlRW50cnk6OlJlc2VydmVTZW5kaW5nVGltZUZvck5leHRSZXF1ZXN0KApAQCAtMjI2LDkgKzIxMCw0IEBACiAgIHJldHVybiAmYmFja29mZl9lbnRyeV87CiB9CiAKLS8vIHN0YXRpYwotYm9vbCBFeHRlbnNpb25UaHJvdHRsZUVudHJ5OjpFeHBsaWNpdFVzZXJSZXF1ZXN0KGNvbnN0IGludCBsb2FkX2ZsYWdzKSB7Ci0gIHJldHVybiAobG9hZF9mbGFncyAmIG5ldDo6TE9BRF9NQVlCRV9VU0VSX0dFU1RVUkUpICE9IDA7Ci19Ci0KIH0gIC8vIG5hbWVzcGFjZSBleHRlbnNpb25zCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL3JlbmRlcmVyL2V4dGVuc2lvbl90aHJvdHRsZV9lbnRyeS5oIGIvZXh0ZW5zaW9ucy9yZW5kZXJlci9leHRlbnNpb25fdGhyb3R0bGVfZW50cnkuaAppbmRleCA5Njk5Y2U5Li5kY2Q3NmE2IDEwMDY0NAotLS0gYS9leHRlbnNpb25zL3JlbmRlcmVyL2V4dGVuc2lvbl90aHJvdHRsZV9lbnRyeS5oCisrKyBiL2V4dGVuc2lvbnMvcmVuZGVyZXIvZXh0ZW5zaW9uX3Rocm90dGxlX2VudHJ5LmgKQEAgLTU3LDE3ICs1NywxMSBAQAogICAvLyB8dXJsX2lkfCBpcyBhIHVuaXF1ZSBlbnRyeSBJRC4KICAgZXhwbGljaXQgRXh0ZW5zaW9uVGhyb3R0bGVFbnRyeShjb25zdCBzdGQ6OnN0cmluZyYgdXJsX2lkKTsKIAotICAvLyBTYW1lIGFzIGFib3ZlLCBidXQgZXhwb3NlcyB0aGUgb3B0aW9uIHRvIGlnbm9yZQotICAvLyBuZXQ6OkxPQURfTUFZQkVfVVNFUl9HRVNUVVJFIGZsYWcgb2YgdGhlIHJlcXVlc3QuCi0gIEV4dGVuc2lvblRocm90dGxlRW50cnkoY29uc3Qgc3RkOjpzdHJpbmcmIHVybF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlnbm9yZV91c2VyX2dlc3R1cmVfbG9hZF9mbGFnX2Zvcl90ZXN0cyk7Ci0KICAgLy8gVGhlIGxpZmUgc3BhbiBvZiBpbnN0YW5jZXMgY3JlYXRlZCB3aXRoIHRoaXMgY29uc3RydWN0b3IgaXMgc2V0IHRvCiAgIC8vIGluZmluaXRlLCBhbmQgdGhlIG51bWJlciBvZiBpbml0aWFsIGVycm9ycyB0byBpZ25vcmUgaXMgc2V0IHRvIDAuCiAgIC8vIEl0IGlzIG9ubHkgdXNlZCBieSB1bml0IHRlc3RzLgogICBFeHRlbnNpb25UaHJvdHRsZUVudHJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiB1cmxfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0OjpCYWNrb2ZmRW50cnk6OlBvbGljeSogYmFja29mZl9wb2xpY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpZ25vcmVfdXNlcl9nZXN0dXJlX2xvYWRfZmxhZ19mb3JfdGVzdHMpOworICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldDo6QmFja29mZkVudHJ5OjpQb2xpY3kqIGJhY2tvZmZfcG9saWN5KTsKIAogICB2aXJ0dWFsIH5FeHRlbnNpb25UaHJvdHRsZUVudHJ5KCk7CiAKQEAgLTc5LDE1ICs3Myw4IEBACiAgIHZvaWQgRGlzYWJsZUJhY2tvZmZUaHJvdHRsaW5nKCk7CiAKICAgLy8gUmV0dXJucyB0cnVlIHdoZW4gd2UgaGF2ZSBlbmNvdW50ZXJlZCBzZXJ2ZXIgZXJyb3JzIGFuZCBhcmUgZG9pbmcKLSAgLy8gZXhwb25lbnRpYWwgYmFjay1vZmYsIHVubGVzcyB8cmVxdWVzdF9sb2FkX2ZsYWdzfCBpbmRpY2F0ZXMgdGhlCi0gIC8vIHJlcXVlc3QgaXMgbGlrZWx5IHRvIGJlIHVzZXItaW5pdGlhdGVkLCBvciB0aGUgTmV0d29ya0RlbGVnYXRlIHJldHVybnMKLSAgLy8gZmFsc2UgZm9yIHxDYW5UaHJvdHRsZVJlcXVlc3QocmVxdWVzdCl8LgotICAvLwotICAvLyBVUkxSZXF1ZXN0SHR0cEpvYiBjaGVja3MgdGhpcyBtZXRob2QgcHJpb3IgdG8gZXZlcnkgcmVxdWVzdDsgaXQKLSAgLy8gY2FuY2VscyByZXF1ZXN0cyBpZiB0aGlzIG1ldGhvZCByZXR1cm5zIHRydWUuCi0gIC8vCi0gIC8vIE5vdGU6IFNlZSBsb2FkX2ZsYWdzLmggZm9yIG1vcmUgZGV0YWlsIG9uIHxyZXF1ZXN0X2xvYWRfZmxhZ3N8LgotICBib29sIFNob3VsZFJlamVjdFJlcXVlc3QoaW50IHJlcXVlc3RfbG9hZF9mbGFncykgY29uc3Q7CisgIC8vIGV4cG9uZW50aWFsIGJhY2stb2ZmLgorICBib29sIFNob3VsZFJlamVjdFJlcXVlc3QoKSBjb25zdDsKIAogICAvLyBDYWxjdWxhdGVzIGEgcmVjb21tZW5kZWQgc2VuZGluZyB0aW1lIGZvciB0aGUgbmV4dCByZXF1ZXN0IGFuZCByZXNlcnZlcyBpdC4KICAgLy8gVGhlIHNlbmRpbmcgdGltZSBpcyBub3QgZWFybGllciB0aGFuIHRoZSBjdXJyZW50IGV4cG9uZW50aWFsIGJhY2stb2ZmCkBAIC0xMzMsMTEgKzEyMCw2IEBACiAgIHZpcnR1YWwgY29uc3QgbmV0OjpCYWNrb2ZmRW50cnkqIEdldEJhY2tvZmZFbnRyeSgpIGNvbnN0OwogICB2aXJ0dWFsIG5ldDo6QmFja29mZkVudHJ5KiBHZXRCYWNrb2ZmRW50cnkoKTsKIAotICAvLyBSZXR1cm5zIHRydWUgaWYgfGxvYWRfZmxhZ3N8IGNvbnRhaW5zIGEgZmxhZyB0aGF0IGluZGljYXRlcyBhbgotICAvLyBleHBsaWNpdCByZXF1ZXN0IGJ5IHRoZSB1c2VyIHRvIGxvYWQgdGhlIHJlc291cmNlLiBXZSBuZXZlcgotICAvLyB0aHJvdHRsZSByZXF1ZXN0cyB3aXRoIHN1Y2ggbG9hZCBmbGFncy4KLSAgc3RhdGljIGJvb2wgRXhwbGljaXRVc2VyUmVxdWVzdChjb25zdCBpbnQgbG9hZF9mbGFncyk7Ci0KICAgLy8gVXNlZCBieSB0ZXN0cy4KICAgYmFzZTo6VGltZVRpY2tzIHNsaWRpbmdfd2luZG93X3JlbGVhc2VfdGltZSgpIGNvbnN0IHsKICAgICByZXR1cm4gc2xpZGluZ193aW5kb3dfcmVsZWFzZV90aW1lXzsKQEAgLTE3Myw4ICsxNTUsNiBAQAogICAvLyBDYW5vbmljYWxpemVkIFVSTCBzdHJpbmcgdGhhdCB0aGlzIGVudHJ5IGlzIGZvcjsgdXNlZCBmb3IgbG9nZ2luZyBvbmx5LgogICBjb25zdCBzdGQ6OnN0cmluZyB1cmxfaWRfOwogCi0gIGJvb2wgaWdub3JlX3VzZXJfZ2VzdHVyZV9sb2FkX2ZsYWdfZm9yX3Rlc3RzXzsKLQogICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRXh0ZW5zaW9uVGhyb3R0bGVFbnRyeSk7CiB9OwogCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL3JlbmRlcmVyL2V4dGVuc2lvbl90aHJvdHRsZV9tYW5hZ2VyLmNjIGIvZXh0ZW5zaW9ucy9yZW5kZXJlci9leHRlbnNpb25fdGhyb3R0bGVfbWFuYWdlci5jYwppbmRleCAwN2QzYmI4YS4uODU0ZmZkODggMTAwNjQ0Ci0tLSBhL2V4dGVuc2lvbnMvcmVuZGVyZXIvZXh0ZW5zaW9uX3Rocm90dGxlX21hbmFnZXIuY2MKKysrIGIvZXh0ZW5zaW9ucy9yZW5kZXJlci9leHRlbnNpb25fdGhyb3R0bGVfbWFuYWdlci5jYwpAQCAtMjMsOCArMjMsNyBAQAogY29uc3QgdW5zaWduZWQgaW50IEV4dGVuc2lvblRocm90dGxlTWFuYWdlcjo6a1JlcXVlc3RzQmV0d2VlbkNvbGxlY3RpbmcgPSAyMDA7CiAKIEV4dGVuc2lvblRocm90dGxlTWFuYWdlcjo6RXh0ZW5zaW9uVGhyb3R0bGVNYW5hZ2VyKCkKLSAgICA6IHJlcXVlc3RzX3NpbmNlX2xhc3RfZ2NfKDApLAotICAgICAgaWdub3JlX3VzZXJfZ2VzdHVyZV9sb2FkX2ZsYWdfZm9yX3Rlc3RzXyhmYWxzZSkgeworICAgIDogcmVxdWVzdHNfc2luY2VfbGFzdF9nY18oMCkgewogICB1cmxfaWRfcmVwbGFjZW1lbnRzXy5DbGVhclBhc3N3b3JkKCk7CiAgIHVybF9pZF9yZXBsYWNlbWVudHNfLkNsZWFyVXNlcm5hbWUoKTsKICAgdXJsX2lkX3JlcGxhY2VtZW50c18uQ2xlYXJRdWVyeSgpOwpAQCAtNjgsMTIgKzY3LDEwIEBACiAgIC8vIENyZWF0ZSB0aGUgZW50cnkgaWYgbmVlZGVkLgogICBpZiAoIWVudHJ5KSB7CiAgICAgaWYgKGJhY2tvZmZfcG9saWN5X2Zvcl90ZXN0c18pIHsKLSAgICAgIGVudHJ5LnJlc2V0KAotICAgICAgICAgIG5ldyBFeHRlbnNpb25UaHJvdHRsZUVudHJ5KHVybF9pZCwgYmFja29mZl9wb2xpY3lfZm9yX3Rlc3RzXy5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVfdXNlcl9nZXN0dXJlX2xvYWRfZmxhZ19mb3JfdGVzdHNfKSk7CisgICAgICBlbnRyeSA9IHN0ZDo6bWFrZV91bmlxdWU8RXh0ZW5zaW9uVGhyb3R0bGVFbnRyeT4oCisgICAgICAgICAgdXJsX2lkLCBiYWNrb2ZmX3BvbGljeV9mb3JfdGVzdHNfLmdldCgpKTsKICAgICB9IGVsc2UgewotICAgICAgZW50cnkucmVzZXQobmV3IEV4dGVuc2lvblRocm90dGxlRW50cnkoCi0gICAgICAgICAgdXJsX2lkLCBpZ25vcmVfdXNlcl9nZXN0dXJlX2xvYWRfZmxhZ19mb3JfdGVzdHNfKSk7CisgICAgICBlbnRyeSA9IHN0ZDo6bWFrZV91bmlxdWU8RXh0ZW5zaW9uVGhyb3R0bGVFbnRyeT4odXJsX2lkKTsKICAgICB9CiAKICAgICAvLyBXZSBvbmx5IGRpc2FibGUgYmFjay1vZmYgdGhyb3R0bGluZyBvbiBhbiBlbnRyeSB0aGF0IHdlIGhhdmUKQEAgLTkwLDE2ICs4NywxMyBAQAogICByZXR1cm4gZW50cnkuZ2V0KCk7CiB9CiAKLWJvb2wgRXh0ZW5zaW9uVGhyb3R0bGVNYW5hZ2VyOjpTaG91bGRSZWplY3RSZXF1ZXN0KGNvbnN0IEdVUkwmIHJlcXVlc3RfdXJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlcXVlc3RfbG9hZF9mbGFncykgeworYm9vbCBFeHRlbnNpb25UaHJvdHRsZU1hbmFnZXI6OlNob3VsZFJlamVjdFJlcXVlc3QoY29uc3QgR1VSTCYgcmVxdWVzdF91cmwpIHsKICAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLSAgcmV0dXJuIFJlZ2lzdGVyUmVxdWVzdFVybChyZXF1ZXN0X3VybCkKLSAgICAgIC0+U2hvdWxkUmVqZWN0UmVxdWVzdChyZXF1ZXN0X2xvYWRfZmxhZ3MpOworICByZXR1cm4gUmVnaXN0ZXJSZXF1ZXN0VXJsKHJlcXVlc3RfdXJsKS0+U2hvdWxkUmVqZWN0UmVxdWVzdCgpOwogfQogCiBib29sIEV4dGVuc2lvblRocm90dGxlTWFuYWdlcjo6U2hvdWxkUmVqZWN0UmVkaXJlY3QoCiAgICAgY29uc3QgR1VSTCYgcmVxdWVzdF91cmwsCi0gICAgaW50IHJlcXVlc3RfbG9hZF9mbGFncywKICAgICBjb25zdCBuZXQ6OlJlZGlyZWN0SW5mbyYgcmVkaXJlY3RfaW5mbykgewogICB7CiAgICAgLy8gQW4gZW50cnkgR0Mgd2hlbiByZXF1ZXN0cyBhcmUgb3V0c3RhbmRpbmcgY2FuIHB1cmdlIGVudHJpZXMgc28gY2hlY2sKQEAgLTEwOSw3ICsxMDMsNyBAQAogICAgIGlmIChpdCAhPSB1cmxfZW50cmllc18uZW5kKCkpCiAgICAgICBpdC0+c2Vjb25kLT5VcGRhdGVXaXRoUmVzcG9uc2UocmVkaXJlY3RfaW5mby5zdGF0dXNfY29kZSk7CiAgIH0KLSAgcmV0dXJuIFNob3VsZFJlamVjdFJlcXVlc3QocmVkaXJlY3RfaW5mby5uZXdfdXJsLCByZXF1ZXN0X2xvYWRfZmxhZ3MpOworICByZXR1cm4gU2hvdWxkUmVqZWN0UmVxdWVzdChyZWRpcmVjdF9pbmZvLm5ld191cmwpOwogfQogCiB2b2lkIEV4dGVuc2lvblRocm90dGxlTWFuYWdlcjo6V2lsbFByb2Nlc3NSZXNwb25zZSgKQEAgLTE1MSwxMiArMTQ1LDYgQEAKICAgdXJsX2VudHJpZXNfLmVyYXNlKHVybF9pZCk7CiB9CiAKLXZvaWQgRXh0ZW5zaW9uVGhyb3R0bGVNYW5hZ2VyOjpTZXRJZ25vcmVVc2VyR2VzdHVyZUxvYWRGbGFnRm9yVGVzdHMoCi0gICAgYm9vbCBpZ25vcmVfdXNlcl9nZXN0dXJlX2xvYWRfZmxhZ19mb3JfdGVzdHMpIHsKLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLSAgaWdub3JlX3VzZXJfZ2VzdHVyZV9sb2FkX2ZsYWdfZm9yX3Rlc3RzXyA9IHRydWU7Ci19Ci0KIHZvaWQgRXh0ZW5zaW9uVGhyb3R0bGVNYW5hZ2VyOjpTZXRPbmxpbmUoYm9vbCBpc19vbmxpbmUpIHsKICAgLy8gV2hlbiB3ZSBzd2l0Y2ggZnJvbSBvbmxpbmUgdG8gb2ZmbGluZSBvciBjaGFuZ2UgSVAgYWRkcmVzc2VzLCB3ZQogICAvLyBjbGVhciBhbGwgYmFjay1vZmYgaGlzdG9yeS4gVGhpcyBpcyBhIHByZWNhdXRpb24gaW4gY2FzZSB0aGUgY2hhbmdlIGluCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL3JlbmRlcmVyL2V4dGVuc2lvbl90aHJvdHRsZV9tYW5hZ2VyLmggYi9leHRlbnNpb25zL3JlbmRlcmVyL2V4dGVuc2lvbl90aHJvdHRsZV9tYW5hZ2VyLmgKaW5kZXggMDY4Y2Y0NC4uZjIyYzk5Y2MgMTAwNjQ0Ci0tLSBhL2V4dGVuc2lvbnMvcmVuZGVyZXIvZXh0ZW5zaW9uX3Rocm90dGxlX21hbmFnZXIuaAorKysgYi9leHRlbnNpb25zL3JlbmRlcmVyL2V4dGVuc2lvbl90aHJvdHRsZV9tYW5hZ2VyLmgKQEAgLTQ5LDE1ICs0OSwxMiBAQAogICBzdGQ6OnVuaXF1ZV9wdHI8Ymxpbms6OlVSTExvYWRlclRocm90dGxlPiBNYXliZUNyZWF0ZVVSTExvYWRlclRocm90dGxlKAogICAgICAgY29uc3QgYmxpbms6OldlYlVSTFJlcXVlc3QmIHJlcXVlc3QpOwogCi0gIC8vIERldGVybWluZSBpZiBhIHJlcXVlc3QgdG8gfHJlcXVlc3RfdXJsfCB3aXRoIHRoZSBnaXZlbiB8cmVxdWVzdF9sb2FkX2ZsYWdzfAotICAvLyAoc2VlIG5ldC9iYXNlL2xvYWRfZmxhZ3MuaCkgc2hvdWxkIGJlIHJlamVjdGVkLgotICBib29sIFNob3VsZFJlamVjdFJlcXVlc3QoY29uc3QgR1VSTCYgcmVxdWVzdF91cmwsIGludCByZXF1ZXN0X2xvYWRfZmxhZ3MpOworICAvLyBEZXRlcm1pbmUgaWYgYSByZXF1ZXN0IHRvIHxyZXF1ZXN0X3VybHwgc2hvdWxkIGJlIHJlamVjdGVkLgorICBib29sIFNob3VsZFJlamVjdFJlcXVlc3QoY29uc3QgR1VSTCYgcmVxdWVzdF91cmwpOwogCi0gIC8vIERldGVybWluZSBpZiBhIHJlZGlyZWN0IGZyb20gdGhlIG9yaWdpbmFsIHxyZXF1ZXN0X3VybHwgd2l0aCB0aGUgb3JpZ2luYWwKLSAgLy8gfHJlcXVlc3RfbG9hZF9mbGFnc3wgKHNlZSBuZXQvYmFzZS9sb2FkX2ZsYWdzLmgpIHNob3VsZCBiZSBhbGxvd2VkIHRvIGJlCi0gIC8vIHJlZGlyZWN0ZWQgYXMgc3BlY2lmaWVkIGJ5IHxyZWRpcmVjdF9pbmZvfC4KKyAgLy8gRGV0ZXJtaW5lIGlmIGEgcmVkaXJlY3QgZnJvbSB0aGUgb3JpZ2luYWwgfHJlcXVlc3RfdXJsfCBzaG91bGQgYmUgYWxsb3dlZAorICAvLyB0byBiZSByZWRpcmVjdGVkIGFzIHNwZWNpZmllZCBieSB8cmVkaXJlY3RfaW5mb3wuCiAgIGJvb2wgU2hvdWxkUmVqZWN0UmVkaXJlY3QoY29uc3QgR1VSTCYgcmVxdWVzdF91cmwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlcXVlc3RfbG9hZF9mbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXQ6OlJlZGlyZWN0SW5mbyYgcmVkaXJlY3RfaW5mbyk7CiAKICAgLy8gTXVzdCBiZSBjYWxsZWQgd2hlbiB0aGUgfHJlc3BvbnNlX2hlYWR8IGZvciBhIHJlcXVlc3QgaGFzIGJlZW4gcmVjZWl2ZWQuCkBAIC03NiwxMyArNzMsNiBAQAogICB2b2lkIE92ZXJyaWRlRW50cnlGb3JUZXN0cyhjb25zdCBHVVJMJiB1cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxFeHRlbnNpb25UaHJvdHRsZUVudHJ5PiBlbnRyeSk7CiAKLSAgLy8gU2V0cyB3aGV0aGVyIHRvIGlnbm9yZSBuZXQ6OkxPQURfTUFZQkVfVVNFUl9HRVNUVVJFIG9mIHRoZSByZXF1ZXN0IGZvcgotICAvLyB0ZXN0aW5nLiBPdGhlcndpc2UsIHJlcXVlc3RzIHdpbGwgbm90IGJlIHRocm90dGxlZCB3aGVuIHRoZXkgbWF5IGhhdmUgYmVlbgotICAvLyB0aHJvdHRsZWQgaW4gcmVzcG9uc2UgdG8gYSByZWNlbnQgdXNlciBnZXN0dXJlLCB0aG91Z2ggdGhleSdyZSBzdGlsbAotICAvLyBjb3VudGVkIGZvciB0aGUgcHVycG9zZSBvZiB0aHJvdHRsaW5nIG90aGVyIHJlcXVlc3RzLgotICB2b2lkIFNldElnbm9yZVVzZXJHZXN0dXJlTG9hZEZsYWdGb3JUZXN0cygKLSAgICAgIGJvb2wgaWdub3JlX3VzZXJfZ2VzdHVyZV9sb2FkX2ZsYWdfZm9yX3Rlc3RzKTsKLQogICBpbnQgR2V0TnVtYmVyT2ZFbnRyaWVzRm9yVGVzdHMoKSBjb25zdCB7IHJldHVybiB1cmxfZW50cmllc18uc2l6ZSgpOyB9CiAKICBwcm90ZWN0ZWQ6CkBAIC0xMzMsOCArMTIzLDYgQEAKICAgLy8gVmFsaWQgYWZ0ZXIgY29uc3RydWN0aW9uLgogICBHVVJMOjpSZXBsYWNlbWVudHMgdXJsX2lkX3JlcGxhY2VtZW50c187CiAKLSAgYm9vbCBpZ25vcmVfdXNlcl9nZXN0dXJlX2xvYWRfZmxhZ19mb3JfdGVzdHNfOwotCiAgIC8vIFRoaXMgaXMgbnVsbCB3aGVuIGl0IGlzIG5vdCBzZXQgZm9yIHRlc3RzLgogICBzdGQ6OnVuaXF1ZV9wdHI8bmV0OjpCYWNrb2ZmRW50cnk6OlBvbGljeT4gYmFja29mZl9wb2xpY3lfZm9yX3Rlc3RzXzsKIApkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9yZW5kZXJlci9leHRlbnNpb25fdGhyb3R0bGVfc2ltdWxhdGlvbl91bml0dGVzdC5jYyBiL2V4dGVuc2lvbnMvcmVuZGVyZXIvZXh0ZW5zaW9uX3Rocm90dGxlX3NpbXVsYXRpb25fdW5pdHRlc3QuY2MKaW5kZXggMzVkMjVlMy4uZWEyYzQ4OSAxMDA2NDQKLS0tIGEvZXh0ZW5zaW9ucy9yZW5kZXJlci9leHRlbnNpb25fdGhyb3R0bGVfc2ltdWxhdGlvbl91bml0dGVzdC5jYworKysgYi9leHRlbnNpb25zL3JlbmRlcmVyL2V4dGVuc2lvbl90aHJvdHRsZV9zaW11bGF0aW9uX3VuaXR0ZXN0LmNjCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSAiYmFzZS90aW1lL3RpbWUuaCIKICNpbmNsdWRlICJleHRlbnNpb25zL3JlbmRlcmVyL2V4dGVuc2lvbl90aHJvdHRsZV9lbnRyeS5oIgogI2luY2x1ZGUgImV4dGVuc2lvbnMvcmVuZGVyZXIvZXh0ZW5zaW9uX3Rocm90dGxlX3Rlc3Rfc3VwcG9ydC5oIgotI2luY2x1ZGUgIm5ldC9iYXNlL2xvYWRfZmxhZ3MuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKIAogdXNpbmcgYmFzZTo6VGltZURlbHRhOwpAQCAtNDA1LDcgKzQwNCw3IEBACiAKICAgICBpZiAodGhyb3R0bGVyX2VudHJ5Xy0+SW1wbEdldFRpbWVOb3coKSAtIHRpbWVfb2ZfbGFzdF9hdHRlbXB0XyA+CiAgICAgICAgIGVmZmVjdGl2ZV9kZWxheSkgewotICAgICAgaWYgKCF0aHJvdHRsZXJfZW50cnlfLT5TaG91bGRSZWplY3RSZXF1ZXN0KG5ldDo6TE9BRF9OT1JNQUwpKSB7CisgICAgICBpZiAoIXRocm90dGxlcl9lbnRyeV8tPlNob3VsZFJlamVjdFJlcXVlc3QoKSkgewogICAgICAgICBpbnQgc3RhdHVzX2NvZGUgPSBzZXJ2ZXJfLT5IYW5kbGVSZXF1ZXN0KCk7CiAgICAgICAgIHRocm90dGxlcl9lbnRyeV8tPlVwZGF0ZVdpdGhSZXNwb25zZShzdGF0dXNfY29kZSk7CiAKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvcmVuZGVyZXIvZXh0ZW5zaW9uX3Rocm90dGxlX3VuaXR0ZXN0LmNjIGIvZXh0ZW5zaW9ucy9yZW5kZXJlci9leHRlbnNpb25fdGhyb3R0bGVfdW5pdHRlc3QuY2MKaW5kZXggODNlNTZhNWUzLi5hOWJiZTMyIDEwMDY0NAotLS0gYS9leHRlbnNpb25zL3JlbmRlcmVyL2V4dGVuc2lvbl90aHJvdHRsZV91bml0dGVzdC5jYworKysgYi9leHRlbnNpb25zL3JlbmRlcmVyL2V4dGVuc2lvbl90aHJvdHRsZV91bml0dGVzdC5jYwpAQCAtMTEsNyArMTEsNiBAQAogI2luY2x1ZGUgImV4dGVuc2lvbnMvcmVuZGVyZXIvZXh0ZW5zaW9uX3Rocm90dGxlX2VudHJ5LmgiCiAjaW5jbHVkZSAiZXh0ZW5zaW9ucy9yZW5kZXJlci9leHRlbnNpb25fdGhyb3R0bGVfbWFuYWdlci5oIgogI2luY2x1ZGUgImV4dGVuc2lvbnMvcmVuZGVyZXIvZXh0ZW5zaW9uX3Rocm90dGxlX3Rlc3Rfc3VwcG9ydC5oIgotI2luY2x1ZGUgIm5ldC9iYXNlL2xvYWRfZmxhZ3MuaCIKICNpbmNsdWRlICJuZXQvdXJsX3JlcXVlc3QvcmVkaXJlY3RfaW5mby5oIgogI2luY2x1ZGUgInNlcnZpY2VzL25ldHdvcmsvcHVibGljL2NwcC9yZXNvdXJjZV9yZXNwb25zZS5oIgogI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgpAQCAtNjAsMTAgKzU5LDYgQEAKIAogICBCYWNrb2ZmRW50cnkqIEdldEJhY2tvZmZFbnRyeSgpIG92ZXJyaWRlIHsgcmV0dXJuICZiYWNrb2ZmX2VudHJ5XzsgfQogCi0gIHN0YXRpYyBib29sIEV4cGxpY2l0VXNlclJlcXVlc3QoaW50IGxvYWRfZmxhZ3MpIHsKLSAgICByZXR1cm4gRXh0ZW5zaW9uVGhyb3R0bGVFbnRyeTo6RXhwbGljaXRVc2VyUmVxdWVzdChsb2FkX2ZsYWdzKTsKLSAgfQotCiAgIHZvaWQgUmVzZXRUb0JsYW5rKGNvbnN0IFRpbWVUaWNrcyYgdGltZV9ub3cpIHsKICAgICBmYWtlX2Nsb2NrXy5zZXRfbm93KHRpbWVfbm93KTsKIApAQCAtMTc2LDI1ICsxNzEsMTYgQEAKIFRFU1RfRihFeHRlbnNpb25UaHJvdHRsZUVudHJ5VGVzdCwgQ2FuVGhyb3R0bGVSZXF1ZXN0KSB7CiAgIGVudHJ5Xy0+c2V0X2V4cG9uZW50aWFsX2JhY2tvZmZfcmVsZWFzZV90aW1lKGVudHJ5Xy0+SW1wbEdldFRpbWVOb3coKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcygxKSk7Ci0KLSAgRVhQRUNUX1RSVUUoZW50cnlfLT5TaG91bGRSZWplY3RSZXF1ZXN0KG5ldDo6TE9BRF9OT1JNQUwpKTsKKyAgRVhQRUNUX1RSVUUoZW50cnlfLT5TaG91bGRSZWplY3RSZXF1ZXN0KCkpOwogfQogCi1URVNUX0YoRXh0ZW5zaW9uVGhyb3R0bGVFbnRyeVRlc3QsIEludGVyZmFjZUR1cmluZ0V4cG9uZW50aWFsQmFja29mZikgewotICBlbnRyeV8tPnNldF9leHBvbmVudGlhbF9iYWNrb2ZmX3JlbGVhc2VfdGltZShlbnRyeV8tPkltcGxHZXRUaW1lTm93KCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoMSkpOwotICBFWFBFQ1RfVFJVRShlbnRyeV8tPlNob3VsZFJlamVjdFJlcXVlc3QobmV0OjpMT0FEX05PUk1BTCkpOwotCi0gIC8vIEFsc28gZW5kLXRvLWVuZCB0ZXN0IHRoZSBsb2FkIGZsYWdzIGV4Y2VwdGlvbnMuCi0gIEVYUEVDVF9GQUxTRShlbnRyeV8tPlNob3VsZFJlamVjdFJlcXVlc3QobmV0OjpMT0FEX01BWUJFX1VTRVJfR0VTVFVSRSkpOwotfQotCi1URVNUX0YoRXh0ZW5zaW9uVGhyb3R0bGVFbnRyeVRlc3QsIEludGVyZmFjZU5vdER1cmluZ0V4cG9uZW50aWFsQmFja29mZikgeworVEVTVF9GKEV4dGVuc2lvblRocm90dGxlRW50cnlUZXN0LAorICAgICAgIENhblRocm90dGxlUmVxdWVzdE5vdER1cmluZ0V4cG9uZW50aWFsQmFja29mZikgewogICBlbnRyeV8tPnNldF9leHBvbmVudGlhbF9iYWNrb2ZmX3JlbGVhc2VfdGltZShlbnRyeV8tPkltcGxHZXRUaW1lTm93KCkpOwotICBFWFBFQ1RfRkFMU0UoZW50cnlfLT5TaG91bGRSZWplY3RSZXF1ZXN0KG5ldDo6TE9BRF9OT1JNQUwpKTsKKyAgRVhQRUNUX0ZBTFNFKGVudHJ5Xy0+U2hvdWxkUmVqZWN0UmVxdWVzdCgpKTsKICAgZW50cnlfLT5zZXRfZXhwb25lbnRpYWxfYmFja29mZl9yZWxlYXNlX3RpbWUoZW50cnlfLT5JbXBsR2V0VGltZU5vdygpIC0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDEpKTsKLSAgRVhQRUNUX0ZBTFNFKGVudHJ5Xy0+U2hvdWxkUmVqZWN0UmVxdWVzdChuZXQ6OkxPQURfTk9STUFMKSk7CisgIEVYUEVDVF9GQUxTRShlbnRyeV8tPlNob3VsZFJlamVjdFJlcXVlc3QoKSk7CiB9CiAKIFRFU1RfRihFeHRlbnNpb25UaHJvdHRsZUVudHJ5VGVzdCwgSW50ZXJmYWNlVXBkYXRlRmFpbHVyZSkgewpAQCAtMjk2LDE0ICsyODIsNiBAQAogICBFWFBFQ1RfRVEodGltZV80LCBlbnRyeV8tPnNsaWRpbmdfd2luZG93X3JlbGVhc2VfdGltZSgpKTsKIH0KIAotVEVTVF9GKEV4dGVuc2lvblRocm90dGxlRW50cnlUZXN0LCBFeHBsaWNpdFVzZXJSZXF1ZXN0KSB7Ci0gIEFTU0VSVF9GQUxTRShNb2NrRXh0ZW5zaW9uVGhyb3R0bGVFbnRyeTo6RXhwbGljaXRVc2VyUmVxdWVzdCgwKSk7Ci0gIEFTU0VSVF9UUlVFKE1vY2tFeHRlbnNpb25UaHJvdHRsZUVudHJ5OjpFeHBsaWNpdFVzZXJSZXF1ZXN0KAotICAgICAgbmV0OjpMT0FEX01BWUJFX1VTRVJfR0VTVFVSRSkpOwotICBBU1NFUlRfRkFMU0UoTW9ja0V4dGVuc2lvblRocm90dGxlRW50cnk6OkV4cGxpY2l0VXNlclJlcXVlc3QoCi0gICAgICB+bmV0OjpMT0FEX01BWUJFX1VTRVJfR0VTVFVSRSkpOwotfQotCiBURVNUKEV4dGVuc2lvblRocm90dGxlTWFuYWdlclRlc3QsIElzVXJsU3RhbmRhcmRpc2VkKSB7CiAgIE1vY2tFeHRlbnNpb25UaHJvdHRsZU1hbmFnZXIgbWFuYWdlcjsKICAgR3VybEFuZFN0cmluZyB0ZXN0X3ZhbHVlc1tdID0gewpAQCAtMzY2LDExICszNDQsMTEgQEAKICAgLy8gQSBsb2NhbGhvc3QgZW50cnkgc2hvdWxkIGFsd2F5cyBiZSBvcHRlZCBvdXQuCiAgIEV4dGVuc2lvblRocm90dGxlRW50cnkqIGxvY2FsaG9zdF9lbnRyeSA9CiAgICAgICBtYW5hZ2VyLlJlZ2lzdGVyUmVxdWVzdFVybChHVVJMKCJodHRwOi8vbG9jYWxob3N0L2hlbGxvIikpOwotICBFWFBFQ1RfRkFMU0UobG9jYWxob3N0X2VudHJ5LT5TaG91bGRSZWplY3RSZXF1ZXN0KG5ldDo6TE9BRF9OT1JNQUwpKTsKKyAgRVhQRUNUX0ZBTFNFKGxvY2FsaG9zdF9lbnRyeS0+U2hvdWxkUmVqZWN0UmVxdWVzdCgpKTsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7CiAgICAgbG9jYWxob3N0X2VudHJ5LT5VcGRhdGVXaXRoUmVzcG9uc2UoNTAzKTsKICAgfQotICBFWFBFQ1RfRkFMU0UobG9jYWxob3N0X2VudHJ5LT5TaG91bGRSZWplY3RSZXF1ZXN0KG5ldDo6TE9BRF9OT1JNQUwpKTsKKyAgRVhQRUNUX0ZBTFNFKGxvY2FsaG9zdF9lbnRyeS0+U2hvdWxkUmVqZWN0UmVxdWVzdCgpKTsKIAogICAvLyBXZSdyZSBub3QgbW9ja2luZyBvdXQgR2V0VGltZU5vdygpIGluIHRoaXMgc2NlbmFyaW8KICAgLy8gc28gYWRkIGEgMTAwIG1zIGJ1ZmZlciB0byBhdm9pZCBmbGFraW5lc3MgKHRoYXQgc2hvdWxkIGFsd2F5cwpAQCAtMzg4LDcgKzM2Niw3IEBACiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAxMDsgKytqKSB7CiAgICAgICBlbnRyeV9iZWZvcmUtPlVwZGF0ZVdpdGhSZXNwb25zZSg1MDMpOwogICAgIH0KLSAgICBFWFBFQ1RfVFJVRShlbnRyeV9iZWZvcmUtPlNob3VsZFJlamVjdFJlcXVlc3QobmV0OjpMT0FEX05PUk1BTCkpOworICAgIEVYUEVDVF9UUlVFKGVudHJ5X2JlZm9yZS0+U2hvdWxkUmVqZWN0UmVxdWVzdCgpKTsKIAogICAgIHN3aXRjaCAoaSkgewogICAgICAgY2FzZSAwOgpAQCAtNDAzLDIwICszODEsMTkgQEAKIAogICAgIEV4dGVuc2lvblRocm90dGxlRW50cnkqIGVudHJ5X2FmdGVyID0KICAgICAgICAgbWFuYWdlci5SZWdpc3RlclJlcXVlc3RVcmwoR1VSTCgiaHR0cDovL3d3dy5leGFtcGxlLmNvbS8iKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGVudHJ5X2FmdGVyLT5TaG91bGRSZWplY3RSZXF1ZXN0KG5ldDo6TE9BRF9OT1JNQUwpKTsKKyAgICBFWFBFQ1RfRkFMU0UoZW50cnlfYWZ0ZXItPlNob3VsZFJlamVjdFJlcXVlc3QoKSk7CiAgIH0KIH0KIAogVEVTVChFeHRlbnNpb25UaHJvdHRsZU1hbmFnZXJUZXN0LCBVc2VBZnRlck5ldHdvcmtDaGFuZ2UpIHsKICAgTW9ja0V4dGVuc2lvblRocm90dGxlTWFuYWdlciBtYW5hZ2VyOwogICBjb25zdCBHVVJMIHRlc3RfdXJsKCJodHRwOi8vd3d3LmV4YW1wbGUuY29tLyIpOwotICBFWFBFQ1RfRkFMU0UobWFuYWdlci5TaG91bGRSZWplY3RSZXF1ZXN0KHRlc3RfdXJsLCBuZXQ6OkxPQURfTk9STUFMKSk7CisgIEVYUEVDVF9GQUxTRShtYW5hZ2VyLlNob3VsZFJlamVjdFJlcXVlc3QodGVzdF91cmwpKTsKICAgbWFuYWdlci5TZXRPbmxpbmUoLyppc19vbmxpbmU9Ki9mYWxzZSk7CiAgIG1hbmFnZXIuU2V0T25saW5lKC8qaXNfb25saW5lPSovdHJ1ZSk7CiAgIG5ldDo6UmVkaXJlY3RJbmZvIHJlZGlyZWN0X2luZm87CiAgIHJlZGlyZWN0X2luZm8ubmV3X3VybCA9IEdVUkwoImh0dHA6Ly93d3cubmV3c2l0ZS5jb20iKTsKLSAgRVhQRUNUX0ZBTFNFKAotICAgICAgbWFuYWdlci5TaG91bGRSZWplY3RSZWRpcmVjdCh0ZXN0X3VybCwgbmV0OjpMT0FEX05PUk1BTCwgcmVkaXJlY3RfaW5mbykpOworICBFWFBFQ1RfRkFMU0UobWFuYWdlci5TaG91bGRSZWplY3RSZWRpcmVjdCh0ZXN0X3VybCwgcmVkaXJlY3RfaW5mbykpOwogICBtYW5hZ2VyLlNldE9ubGluZSgvKmlzX29ubGluZT0qL2ZhbHNlKTsKICAgbWFuYWdlci5TZXRPbmxpbmUoLyppc19vbmxpbmU9Ki90cnVlKTsKICAgbmV0d29yazo6UmVzb3VyY2VSZXNwb25zZUhlYWQgcmVzcG9uc2VfaGVhZDsKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvcmVuZGVyZXIvZXh0ZW5zaW9uX3VybF9sb2FkZXJfdGhyb3R0bGUuY2MgYi9leHRlbnNpb25zL3JlbmRlcmVyL2V4dGVuc2lvbl91cmxfbG9hZGVyX3Rocm90dGxlLmNjCmluZGV4IGFhY2Y0MzEuLjUwNTllMmMgMTAwNjQ0Ci0tLSBhL2V4dGVuc2lvbnMvcmVuZGVyZXIvZXh0ZW5zaW9uX3VybF9sb2FkZXJfdGhyb3R0bGUuY2MKKysrIGIvZXh0ZW5zaW9ucy9yZW5kZXJlci9leHRlbnNpb25fdXJsX2xvYWRlcl90aHJvdHRsZS5jYwpAQCAtMjYsOCArMjYsNyBAQAogICAgIG5ldHdvcms6OlJlc291cmNlUmVxdWVzdCogcmVxdWVzdCwKICAgICBib29sKiBkZWZlcikgewogICBzdGFydF9yZXF1ZXN0X3VybF8gPSByZXF1ZXN0LT51cmw7Ci0gIHJlcXVlc3RfbG9hZF9mbGFnc18gPSByZXF1ZXN0LT5sb2FkX2ZsYWdzOwotICBpZiAobWFuYWdlcl8tPlNob3VsZFJlamVjdFJlcXVlc3Qoc3RhcnRfcmVxdWVzdF91cmxfLCByZXF1ZXN0X2xvYWRfZmxhZ3NfKSkKKyAgaWYgKG1hbmFnZXJfLT5TaG91bGRSZWplY3RSZXF1ZXN0KHN0YXJ0X3JlcXVlc3RfdXJsXykpCiAgICAgZGVsZWdhdGVfLT5DYW5jZWxXaXRoRXJyb3IobmV0OjpFUlJfVEVNUE9SQVJJTFlfVEhST1RUTEVELCBrQ2FuY2VsUmVhc29uKTsKIH0KIApAQCAtMzcsOCArMzYsNyBAQAogICAgIGJvb2wqIC8qIGRlZmVyICovLAogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogLyogdG9fYmVfcmVtb3ZlZF9yZXF1ZXN0X2hlYWRlcnMgKi8sCiAgICAgbmV0OjpIdHRwUmVxdWVzdEhlYWRlcnMqIC8qIG1vZGlmaWVkX3JlcXVlc3RfaGVhZGVycyAqLykgewotICBpZiAobWFuYWdlcl8tPlNob3VsZFJlamVjdFJlZGlyZWN0KHN0YXJ0X3JlcXVlc3RfdXJsXywgcmVxdWVzdF9sb2FkX2ZsYWdzXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVkaXJlY3RfaW5mbykpIHsKKyAgaWYgKG1hbmFnZXJfLT5TaG91bGRSZWplY3RSZWRpcmVjdChzdGFydF9yZXF1ZXN0X3VybF8sICpyZWRpcmVjdF9pbmZvKSkgewogICAgIGRlbGVnYXRlXy0+Q2FuY2VsV2l0aEVycm9yKG5ldDo6RVJSX1RFTVBPUkFSSUxZX1RIUk9UVExFRCwga0NhbmNlbFJlYXNvbik7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvcmVuZGVyZXIvZXh0ZW5zaW9uX3VybF9sb2FkZXJfdGhyb3R0bGUuaCBiL2V4dGVuc2lvbnMvcmVuZGVyZXIvZXh0ZW5zaW9uX3VybF9sb2FkZXJfdGhyb3R0bGUuaAppbmRleCAwZDRiZWI2Li5jMTJjODM2IDEwMDY0NAotLS0gYS9leHRlbnNpb25zL3JlbmRlcmVyL2V4dGVuc2lvbl91cmxfbG9hZGVyX3Rocm90dGxlLmgKKysrIGIvZXh0ZW5zaW9ucy9yZW5kZXJlci9leHRlbnNpb25fdXJsX2xvYWRlcl90aHJvdHRsZS5oCkBAIC00Myw3ICs0Myw2IEBACiAgIHZvaWQgRGV0YWNoRnJvbUN1cnJlbnRTZXF1ZW5jZSgpIG92ZXJyaWRlOwogCiAgIEV4dGVuc2lvblRocm90dGxlTWFuYWdlciogbWFuYWdlcl8gPSBudWxscHRyOwotICBpbnQgcmVxdWVzdF9sb2FkX2ZsYWdzXyA9IDA7CiAgIEdVUkwgc3RhcnRfcmVxdWVzdF91cmxfOwogCiAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihFeHRlbnNpb25VUkxMb2FkZXJUaHJvdHRsZSk7CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL3JlbmRlcmVyL2d1ZXN0X3ZpZXcvbWltZV9oYW5kbGVyX3ZpZXcvbWltZV9oYW5kbGVyX3ZpZXdfY29udGFpbmVyX21hbmFnZXIuY2MgYi9leHRlbnNpb25zL3JlbmRlcmVyL2d1ZXN0X3ZpZXcvbWltZV9oYW5kbGVyX3ZpZXcvbWltZV9oYW5kbGVyX3ZpZXdfY29udGFpbmVyX21hbmFnZXIuY2MKaW5kZXggODI4MTlhOC4uZDFkZmFjZSAxMDA2NDQKLS0tIGEvZXh0ZW5zaW9ucy9yZW5kZXJlci9ndWVzdF92aWV3L21pbWVfaGFuZGxlcl92aWV3L21pbWVfaGFuZGxlcl92aWV3X2NvbnRhaW5lcl9tYW5hZ2VyLmNjCisrKyBiL2V4dGVuc2lvbnMvcmVuZGVyZXIvZ3Vlc3Rfdmlldy9taW1lX2hhbmRsZXJfdmlldy9taW1lX2hhbmRsZXJfdmlld19jb250YWluZXJfbWFuYWdlci5jYwpAQCAtOTksMTEgKzk5LDEwIEBACiAgICAgICAvLyBUaGlzIHNob3VsZCB0cmFuc2xhdGUgaW50byBhIHNhbWUgZG9jdW1lbnQgbmF2aWdhdGlvbi4KICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICAvLyBNYWtlIHN1cmUgd2UncmUgbm90IGVsaWdpYmxlIHRvIHNlbGYtZGVsZXRlLgotICAgIERDSEVDSyghaW50ZXJuYWxfaWRfLmVtcHR5KCkpOwogICAgIC8vIElmIHRoZXJlIGlzIGFscmVhZHkgYSBNSFZGQyBmb3IgdGhpcyB8cGx1Z2luX2VsZW1lbnR8LCBkZXN0cm95IGl0LgogICAgIFJlbW92ZUZyYW1lQ29udGFpbmVyRm9yUmVhc29uKG9sZF9mcmFtZV9jb250YWluZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU1BVHlwZTo6a1JlbW92ZUZyYW1lQ29udGFpbmVyVXBkYXRlUGx1Z2luKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTUFUeXBlOjprUmVtb3ZlRnJhbWVDb250YWluZXJVcGRhdGVQbHVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiByZXRhaW5fbWFuYWdlciAqLyk7CiAgIH0KICAgUmVjb3JkSW50ZXJhY3Rpb24oVU1BVHlwZTo6a0NyZWF0ZUZyYW1lQ29udGFpbmVyKTsKICAgYXV0byBmcmFtZV9jb250YWluZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPE1pbWVIYW5kbGVyVmlld0ZyYW1lQ29udGFpbmVyPigKQEAgLTE4Niw3ICsxODUsNyBAQAogdm9pZCBNaW1lSGFuZGxlclZpZXdDb250YWluZXJNYW5hZ2VyOjpEZXN0cm95RnJhbWVDb250YWluZXIoCiAgICAgaW50MzJfdCBlbGVtZW50X2luc3RhbmNlX2lkKSB7CiAgIGlmIChhdXRvKiBmcmFtZV9jb250YWluZXIgPSBHZXRGcmFtZUNvbnRhaW5lcihlbGVtZW50X2luc3RhbmNlX2lkKSkKLSAgICBSZW1vdmVGcmFtZUNvbnRhaW5lcihmcmFtZV9jb250YWluZXIpOworICAgIFJlbW92ZUZyYW1lQ29udGFpbmVyKGZyYW1lX2NvbnRhaW5lciwgZmFsc2UgLyogcmV0YWluIG1hbmFnZXIgKi8pOwogfQogCiB2b2lkIE1pbWVIYW5kbGVyVmlld0NvbnRhaW5lck1hbmFnZXI6OkRpZExvYWQoaW50MzJfdCBlbGVtZW50X2luc3RhbmNlX2lkLApAQCAtMjU1LDE0ICsyNTQsMTYgQEAKIAogdm9pZCBNaW1lSGFuZGxlclZpZXdDb250YWluZXJNYW5hZ2VyOjpSZW1vdmVGcmFtZUNvbnRhaW5lckZvclJlYXNvbigKICAgICBNaW1lSGFuZGxlclZpZXdGcmFtZUNvbnRhaW5lciogZnJhbWVfY29udGFpbmVyLAotICAgIE1pbWVIYW5kbGVyVmlld1VNQVR5cGVzOjpUeXBlIGV2ZW50KSB7Ci0gIGlmICghUmVtb3ZlRnJhbWVDb250YWluZXIoZnJhbWVfY29udGFpbmVyKSkKKyAgICBNaW1lSGFuZGxlclZpZXdVTUFUeXBlczo6VHlwZSBldmVudCwKKyAgICBib29sIHJldGFpbl9tYW5hZ2VyKSB7CisgIGlmICghUmVtb3ZlRnJhbWVDb250YWluZXIoZnJhbWVfY29udGFpbmVyLCByZXRhaW5fbWFuYWdlcikpCiAgICAgcmV0dXJuOwogICBSZWNvcmRJbnRlcmFjdGlvbihldmVudCk7CiB9CiAKIGJvb2wgTWltZUhhbmRsZXJWaWV3Q29udGFpbmVyTWFuYWdlcjo6UmVtb3ZlRnJhbWVDb250YWluZXIoCi0gICAgTWltZUhhbmRsZXJWaWV3RnJhbWVDb250YWluZXIqIGZyYW1lX2NvbnRhaW5lcikgeworICAgIE1pbWVIYW5kbGVyVmlld0ZyYW1lQ29udGFpbmVyKiBmcmFtZV9jb250YWluZXIsCisgICAgYm9vbCByZXRhaW5fbWFuYWdlcikgewogICBhdXRvIGl0ID0gc3RkOjpmaW5kX2lmKGZyYW1lX2NvbnRhaW5lcnNfLmNiZWdpbigpLCBmcmFtZV9jb250YWluZXJzXy5jZW5kKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgWyZmcmFtZV9jb250YWluZXJdKGNvbnN0IGF1dG8mIGl0ZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVyLmdldCgpID09IGZyYW1lX2NvbnRhaW5lcjsKQEAgLTI3MSw3ICsyNzIsNyBAQAogICAgIHJldHVybiBmYWxzZTsKICAgZnJhbWVfY29udGFpbmVyc18uZXJhc2UoaXQpOwogCi0gIGlmICghZnJhbWVfY29udGFpbmVyc18uc2l6ZSgpICYmIGludGVybmFsX2lkXy5lbXB0eSgpKSB7CisgIGlmICghZnJhbWVfY29udGFpbmVyc18uc2l6ZSgpICYmIGludGVybmFsX2lkXy5lbXB0eSgpICYmICFyZXRhaW5fbWFuYWdlcikgewogICAgIC8vIFRoZXJlIGFyZSBubyBmcmFtZSBjb250YWluZXJzIGxlZnQsIGFuZCB3ZSdyZSBub3Qgc2VydmluZyBhIGZ1bGwtcGFnZQogICAgIC8vIE1pbWVIYW5kbGVyVmlldywgc28gd2UgcmVtb3ZlIG91cnNlbHZlcyBmcm9tIHRoZSBtYXAuCiAgICAgYXV0byYgbWFwID0gKkdldFJlbmRlckZyYW1lTWFwKCk7CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL3JlbmRlcmVyL2d1ZXN0X3ZpZXcvbWltZV9oYW5kbGVyX3ZpZXcvbWltZV9oYW5kbGVyX3ZpZXdfY29udGFpbmVyX21hbmFnZXIuaCBiL2V4dGVuc2lvbnMvcmVuZGVyZXIvZ3Vlc3Rfdmlldy9taW1lX2hhbmRsZXJfdmlldy9taW1lX2hhbmRsZXJfdmlld19jb250YWluZXJfbWFuYWdlci5oCmluZGV4IDA5NWJlODYuLjQwZWE3YWE0IDEwMDY0NAotLS0gYS9leHRlbnNpb25zL3JlbmRlcmVyL2d1ZXN0X3ZpZXcvbWltZV9oYW5kbGVyX3ZpZXcvbWltZV9oYW5kbGVyX3ZpZXdfY29udGFpbmVyX21hbmFnZXIuaAorKysgYi9leHRlbnNpb25zL3JlbmRlcmVyL2d1ZXN0X3ZpZXcvbWltZV9oYW5kbGVyX3ZpZXcvbWltZV9oYW5kbGVyX3ZpZXdfY29udGFpbmVyX21hbmFnZXIuaApAQCAtODEsMTAgKzgxLDExIEBACiAgIC8vIFJlbW92ZXMgdGhlIHxmcmFtZV9jb250YWluZXJ8IGZyb20gfGZyYW1lX2NvbnRhaW5lcnNffCBhbmQgZGVzdHJveXMgaXQuIFRoZQogICAvLyB8cmVhc29ufCBpcyBlbWl0dGVkIGZvciBVTUEuCiAgIC8vIE5vdGU6IENhbGxpbmcgdGhpcyBmdW5jdGlvbiBtYXkgZGVsZXRlIHx0aGlzfCBpZiB3ZSBhcmUgcmVtb3ZpbmcgdGhlIGxhc3QKLSAgLy8gZnJhbWUgY29udGFpbmVyLgorICAvLyBmcmFtZSBjb250YWluZXIsIHVubGVzcyB8cmV0YWluX21hbmFnZXJ8IGlzIHNldCB0byB0cnVlLgogICB2b2lkIFJlbW92ZUZyYW1lQ29udGFpbmVyRm9yUmVhc29uKAogICAgICAgTWltZUhhbmRsZXJWaWV3RnJhbWVDb250YWluZXIqIGZyYW1lX2NvbnRhaW5lciwKLSAgICAgIE1pbWVIYW5kbGVyVmlld1VNQVR5cGVzOjpUeXBlIHJlYXNvbik7CisgICAgICBNaW1lSGFuZGxlclZpZXdVTUFUeXBlczo6VHlwZSByZWFzb24sCisgICAgICBib29sIHJldGFpbl9tYW5hZ2VyKTsKICAgTWltZUhhbmRsZXJWaWV3RnJhbWVDb250YWluZXIqIEdldEZyYW1lQ29udGFpbmVyKAogICAgICAgY29uc3QgYmxpbms6OldlYkVsZW1lbnQmIHBsdWdpbl9lbGVtZW50KTsKICAgTWltZUhhbmRsZXJWaWV3RnJhbWVDb250YWluZXIqIEdldEZyYW1lQ29udGFpbmVyKGludDMyX3QgZWxlbWVudF9pbnN0YW5jZV9pZCk7CkBAIC0xMTcsOCArMTE4LDkgQEAKICAgYm9vbCBJc1Jlc291cmNlQWNjZXNzaWJsZUJ5U291cmNlKCkgY29uc3Qgb3ZlcnJpZGU7CiAKICAgLy8gTm90ZTogQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIG1heSBkZWxldGUgfHRoaXN8IGlmIHdlIGFyZSByZW1vdmluZyB0aGUgbGFzdAotICAvLyBmcmFtZSBjb250YWluZXIuCi0gIGJvb2wgUmVtb3ZlRnJhbWVDb250YWluZXIoTWltZUhhbmRsZXJWaWV3RnJhbWVDb250YWluZXIqIGZyYW1lX2NvbnRhaW5lcik7CisgIC8vIGZyYW1lIGNvbnRhaW5lciwgdW5sZXNzIHxyZXRhaW5fbWFuYWdlcnwgaXMgc2V0IHRvIHRydWUuCisgIGJvb2wgUmVtb3ZlRnJhbWVDb250YWluZXIoTWltZUhhbmRsZXJWaWV3RnJhbWVDb250YWluZXIqIGZyYW1lX2NvbnRhaW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJldGFpbl9tYW5hZ2VyKTsKICAgLy8gbWltZV9oYW5kbGVyOjpCZWZvcmVVbmxvYWRDb250cm9sIGltcGxlbWVudGF0aW9uLgogICB2b2lkIFNldFNob3dCZWZvcmVVbmxvYWREaWFsb2coCiAgICAgICBib29sIHNob3dfZGlhbG9nLApkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9yZW5kZXJlci9ndWVzdF92aWV3L21pbWVfaGFuZGxlcl92aWV3L21pbWVfaGFuZGxlcl92aWV3X2ZyYW1lX2NvbnRhaW5lci5jYyBiL2V4dGVuc2lvbnMvcmVuZGVyZXIvZ3Vlc3Rfdmlldy9taW1lX2hhbmRsZXJfdmlldy9taW1lX2hhbmRsZXJfdmlld19mcmFtZV9jb250YWluZXIuY2MKaW5kZXggMTQxN2ZiOS4uMjczMWNkNSAxMDA2NDQKLS0tIGEvZXh0ZW5zaW9ucy9yZW5kZXJlci9ndWVzdF92aWV3L21pbWVfaGFuZGxlcl92aWV3L21pbWVfaGFuZGxlcl92aWV3X2ZyYW1lX2NvbnRhaW5lci5jYworKysgYi9leHRlbnNpb25zL3JlbmRlcmVyL2d1ZXN0X3ZpZXcvbWltZV9oYW5kbGVyX3ZpZXcvbWltZV9oYW5kbGVyX3ZpZXdfZnJhbWVfY29udGFpbmVyLmNjCkBAIC01OSw3ICs1OSw4IEBACiBib29sIE1pbWVIYW5kbGVyVmlld0ZyYW1lQ29udGFpbmVyOjpBcmVGcmFtZXNBbGl2ZSgpIHsKICAgaWYgKCFHZXRDb250ZW50RnJhbWUoKSB8fCAhR2V0Q29udGVudEZyYW1lKCktPkZpcnN0Q2hpbGQoKSkgewogICAgIGNvbnRhaW5lcl9tYW5hZ2VyXy0+UmVtb3ZlRnJhbWVDb250YWluZXJGb3JSZWFzb24oCi0gICAgICAgIHRoaXMsIFVNQVR5cGVzOjprUmVtb3ZlRnJhbWVDb250YWluZXJVbmV4cGVjdGVkRnJhbWVzKTsKKyAgICAgICAgdGhpcywgVU1BVHlwZXM6OmtSZW1vdmVGcmFtZUNvbnRhaW5lclVuZXhwZWN0ZWRGcmFtZXMsCisgICAgICAgIGZhbHNlIC8qIHJldGFpbl9tYW5hZ2VyICovKTsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KICAgcmV0dXJuIHRydWU7CkBAIC04NSw3ICs4Niw4IEBACiAgICAgfQogICB9CiAgIGNvbnRhaW5lcl9tYW5hZ2VyXy0+UmVtb3ZlRnJhbWVDb250YWluZXJGb3JSZWFzb24oCi0gICAgICB0aGlzLCBVTUFUeXBlczo6a1JlbW92ZUZyYW1lQ29udGFpbmVyVW5leHBlY3RlZEZyYW1lcyk7CisgICAgICB0aGlzLCBVTUFUeXBlczo6a1JlbW92ZUZyYW1lQ29udGFpbmVyVW5leHBlY3RlZEZyYW1lcywKKyAgICAgIGZhbHNlIC8qIHJldGFpbl9tYW5hZ2VyICovKTsKICAgcmV0dXJuIGZhbHNlOwogfQogCmRpZmYgLS1naXQgYS9mdWNoc2lhL2VuZ2luZS9CVUlMRC5nbiBiL2Z1Y2hzaWEvZW5naW5lL0JVSUxELmduCmluZGV4IGUyZjEzOTViLi40YThiMDY2IDEwMDY0NAotLS0gYS9mdWNoc2lhL2VuZ2luZS9CVUlMRC5nbgorKysgYi9mdWNoc2lhL2VuZ2luZS9CVUlMRC5nbgpAQCAtMjY5LDYgKzI2OSw3IEBACiAgICAgImJyb3dzZXIvY29va2llX21hbmFnZXJfaW1wbF91bml0dGVzdC5jYyIsCiAgICAgImJyb3dzZXIvZnJhbWVfaW1wbF91bml0dGVzdC5jYyIsCiAgICAgImJyb3dzZXIvdXJsX3JlcXVlc3RfcmV3cml0ZV9ydWxlc19tYW5hZ2VyX3VuaXR0ZXN0LmNjIiwKKyAgICAiY29tbW9uL3dlYl9lbmdpbmVfdXJsX2xvYWRlcl90aHJvdHRsZV91bml0dGVzdC5jYyIsCiAgICAgImNvbnRleHRfcHJvdmlkZXJfaW1wbF91bml0dGVzdC5jYyIsCiAgICAgImZha2VfY29udGV4dC5jYyIsCiAgICAgImZha2VfY29udGV4dC5oIiwKZGlmZiAtLWdpdCBhL2Z1Y2hzaWEvZW5naW5lL2NvbW1vbi93ZWJfZW5naW5lX3VybF9sb2FkZXJfdGhyb3R0bGUuY2MgYi9mdWNoc2lhL2VuZ2luZS9jb21tb24vd2ViX2VuZ2luZV91cmxfbG9hZGVyX3Rocm90dGxlLmNjCmluZGV4IDE1MWNhNDE1Li4xNGZmMmQ3IDEwMDY0NAotLS0gYS9mdWNoc2lhL2VuZ2luZS9jb21tb24vd2ViX2VuZ2luZV91cmxfbG9hZGVyX3Rocm90dGxlLmNjCisrKyBiL2Z1Y2hzaWEvZW5naW5lL2NvbW1vbi93ZWJfZW5naW5lX3VybF9sb2FkZXJfdGhyb3R0bGUuY2MKQEAgLTkxLDE3ICs5MSwzNSBAQAogICB9CiB9CiAKK2Jvb2wgSG9zdE1hdGNoZXMoY29uc3QgYmFzZTo6U3RyaW5nUGllY2UmIHVybF9ob3N0LAorICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpTdHJpbmdQaWVjZSYgcnVsZV9ob3N0KSB7CisgIGNvbnN0IGJhc2U6OlN0cmluZ1BpZWNlIGtXaWxkY2FyZCgiKi4iKTsKKyAgaWYgKGJhc2U6OlN0YXJ0c1dpdGgocnVsZV9ob3N0LCBrV2lsZGNhcmQsIGJhc2U6OkNvbXBhcmVDYXNlOjpTRU5TSVRJVkUpKSB7CisgICAgLy8gfHJ1bGVfaG9zdHwgc3RhcnRzIHdpdGggYSB3aWxkY2FyZCAoZS5nLiAiKi50ZXN0Lnh5eiIpLiBDaGVjayBpZgorICAgIC8vIHx1cmxfaG9zdHwgZW5kcyB3aXRoICIudGVzdC54eXoiLiBUaGUgIi4iIGNoYXJhY3RlciBpcyBpbmNsdWRlZCBoZXJlIHRvCisgICAgLy8gcHJldmVudCBhY2NpZGVudGFsbHkgbWF0Y2hpbmcgIm5vdGF0ZXN0Lnh5eiIuCisgICAgaWYgKGJhc2U6OkVuZHNXaXRoKHVybF9ob3N0LCBydWxlX2hvc3Quc3Vic3RyKDEpLAorICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpDb21wYXJlQ2FzZTo6U0VOU0lUSVZFKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gQ2hlY2sgfHVybF9ob3N0fCBpcyBleGFjdGx5IHxydWxlX2hvc3R8IHdpdGhvdXQgdGhlIHdpbGRjYXJkLiBpLmUuIGlmCisgICAgLy8gfHJ1bGVfaG9zdHwgaXMgIioudGVzdC54eXoiLCBjaGVjayB8dXJsX2hvc3R8IGlzIGV4YWN0bHkgInRlc3QueHl6Ii4KKyAgICByZXR1cm4gYmFzZTo6Q29tcGFyZUNhc2VJbnNlbnNpdGl2ZUFTQ0lJKHVybF9ob3N0LCBydWxlX2hvc3Quc3Vic3RyKDIpKSA9PQorICAgICAgICAgICAwOworICB9CisgIHJldHVybiBiYXNlOjpDb21wYXJlQ2FzZUluc2Vuc2l0aXZlQVNDSUkodXJsX2hvc3QsIHJ1bGVfaG9zdCkgPT0gMDsKK30KKwogdm9pZCBBcHBseVJ1bGUobmV0d29yazo6UmVzb3VyY2VSZXF1ZXN0KiByZXF1ZXN0LAogICAgICAgICAgICAgICAgY29uc3QgbW9qb206OlVybFJlcXVlc3RSZXdyaXRlUnVsZVB0ciYgcnVsZSkgewogICBjb25zdCBHVVJMJiB1cmwgPSByZXF1ZXN0LT51cmw7CiAKICAgaWYgKHJ1bGUtPmhvc3RzX2ZpbHRlcikgewogICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGhvc3QgOiBydWxlLT5ob3N0c19maWx0ZXIudmFsdWUoKSkgewotICAgICAgaWYgKHVybC5ob3N0KCkuY29tcGFyZShob3N0KSA9PSAwKSB7Ci0gICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICBmb3IgKGNvbnN0IGJhc2U6OlN0cmluZ1BpZWNlIGhvc3QgOiBydWxlLT5ob3N0c19maWx0ZXIudmFsdWUoKSkgeworICAgICAgaWYgKChmb3VuZCA9IEhvc3RNYXRjaGVzKHVybC5ob3N0KCksIGhvc3QpKSkKICAgICAgICAgYnJlYWs7Ci0gICAgICB9CiAgICAgfQogICAgIGlmICghZm91bmQpCiAgICAgICByZXR1cm47CmRpZmYgLS1naXQgYS9mdWNoc2lhL2VuZ2luZS9jb21tb24vd2ViX2VuZ2luZV91cmxfbG9hZGVyX3Rocm90dGxlLmggYi9mdWNoc2lhL2VuZ2luZS9jb21tb24vd2ViX2VuZ2luZV91cmxfbG9hZGVyX3Rocm90dGxlLmgKaW5kZXggZjlmZmRjZjMuLjdlZDZjODUgMTAwNjQ0Ci0tLSBhL2Z1Y2hzaWEvZW5naW5lL2NvbW1vbi93ZWJfZW5naW5lX3VybF9sb2FkZXJfdGhyb3R0bGUuaAorKysgYi9mdWNoc2lhL2VuZ2luZS9jb21tb24vd2ViX2VuZ2luZV91cmxfbG9hZGVyX3Rocm90dGxlLmgKQEAgLTksMTEgKzksMTMgQEAKIAogI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCiAjaW5jbHVkZSAiZnVjaHNpYS9lbmdpbmUvdXJsX3JlcXVlc3RfcmV3cml0ZS5tb2pvbS5oIgorI2luY2x1ZGUgImZ1Y2hzaWEvZW5naW5lL3dlYl9lbmdpbmVfZXhwb3J0LmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcHVibGljL2NvbW1vbi9sb2FkZXIvdXJsX2xvYWRlcl90aHJvdHRsZS5oIgogCiAvLyBJbXBsZW1lbnRzIGEgVVJMTG9hZGVyVGhyb3R0bGUgZm9yIHRoZSBXZWJFbmdpbmUuIEFwcGxpZXMgbmV0d29yayByZXF1ZXN0CiAvLyByZXdyaXRlcyBwcm92aWRlZCB0aHJvdWdoIHRoZSBmdWNoc2lhLndlYi5TZXRVcmxSZXF1ZXN0UmV3cml0ZVJ1bGVzIEZJREwgQVBJLgotY2xhc3MgV2ViRW5naW5lVVJMTG9hZGVyVGhyb3R0bGUgOiBwdWJsaWMgYmxpbms6OlVSTExvYWRlclRocm90dGxlIHsKK2NsYXNzIFdFQl9FTkdJTkVfRVhQT1JUIFdlYkVuZ2luZVVSTExvYWRlclRocm90dGxlCisgICAgOiBwdWJsaWMgYmxpbms6OlVSTExvYWRlclRocm90dGxlIHsKICBwdWJsaWM6CiAgIHVzaW5nIFVybFJlcXVlc3RSZXdyaXRlUnVsZXMgPQogICAgICAgYmFzZTo6UmVmQ291bnRlZERhdGE8c3RkOjp2ZWN0b3I8bW9qb206OlVybFJlcXVlc3RSZXdyaXRlUnVsZVB0cj4+OwpAQCAtMzMsMTMgKzM1LDEzIEBACiAgICAgICBDYWNoZWRSdWxlc1Byb3ZpZGVyKiBjYWNoZWRfcnVsZXNfcHJvdmlkZXIpOwogICB+V2ViRW5naW5lVVJMTG9hZGVyVGhyb3R0bGUoKSBvdmVycmlkZTsKIAotIHByaXZhdGU6CiAgIC8vIGJsaW5rOjpVUkxMb2FkZXJUaHJvdHRsZSBpbXBsZW1lbnRhdGlvbi4KICAgdm9pZCBEZXRhY2hGcm9tQ3VycmVudFNlcXVlbmNlKCkgb3ZlcnJpZGU7CiAgIHZvaWQgV2lsbFN0YXJ0UmVxdWVzdChuZXR3b3JrOjpSZXNvdXJjZVJlcXVlc3QqIHJlcXVlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBkZWZlcikgb3ZlcnJpZGU7CiAgIGJvb2wgbWFrZXNfdW5zYWZlX3JlZGlyZWN0KCkgb3ZlcnJpZGU7CiAKKyBwcml2YXRlOgogICBDYWNoZWRSdWxlc1Byb3ZpZGVyKiBjb25zdCBjYWNoZWRfcnVsZXNfcHJvdmlkZXJfOwogCiAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihXZWJFbmdpbmVVUkxMb2FkZXJUaHJvdHRsZSk7CmRpZmYgLS1naXQgYS9mdWNoc2lhL2VuZ2luZS9jb21tb24vd2ViX2VuZ2luZV91cmxfbG9hZGVyX3Rocm90dGxlX3VuaXR0ZXN0LmNjIGIvZnVjaHNpYS9lbmdpbmUvY29tbW9uL3dlYl9lbmdpbmVfdXJsX2xvYWRlcl90aHJvdHRsZV91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2UzNzBiCi0tLSAvZGV2L251bGwKKysrIGIvZnVjaHNpYS9lbmdpbmUvY29tbW9uL3dlYl9lbmdpbmVfdXJsX2xvYWRlcl90aHJvdHRsZV91bml0dGVzdC5jYwpAQCAtMCwwICsxLDkyIEBACisvLyBDb3B5cmlnaHQgMjAxOSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJmdWNoc2lhL2VuZ2luZS9jb21tb24vd2ViX2VuZ2luZV91cmxfbG9hZGVyX3Rocm90dGxlLmgiCisKKyNpbmNsdWRlICJiYXNlL3Rlc3QvdGFza19lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgeworCitjbGFzcyBUZXN0Q2FjaGVkUnVsZXNQcm92aWRlcgorICAgIDogcHVibGljIFdlYkVuZ2luZVVSTExvYWRlclRocm90dGxlOjpDYWNoZWRSdWxlc1Byb3ZpZGVyIHsKKyBwdWJsaWM6CisgIFRlc3RDYWNoZWRSdWxlc1Byb3ZpZGVyKCkgPSBkZWZhdWx0OworICB+VGVzdENhY2hlZFJ1bGVzUHJvdmlkZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgdm9pZCBTZXRDYWNoZWRSdWxlcygKKyAgICAgIHNjb3BlZF9yZWZwdHI8V2ViRW5naW5lVVJMTG9hZGVyVGhyb3R0bGU6OlVybFJlcXVlc3RSZXdyaXRlUnVsZXM+CisgICAgICAgICAgY2FjaGVkX3J1bGVzKSB7CisgICAgY2FjaGVkX3J1bGVzXyA9IGNhY2hlZF9ydWxlczsKKyAgfQorCisgIC8vIFdlYkVuZ2luZVVSTExvYWRlclRocm90dGxlOjpDYWNoZWRSdWxlc1Byb3ZpZGVyIGltcGxlbWVudGF0aW9uLgorICBzY29wZWRfcmVmcHRyPFdlYkVuZ2luZVVSTExvYWRlclRocm90dGxlOjpVcmxSZXF1ZXN0UmV3cml0ZVJ1bGVzPgorICBHZXRDYWNoZWRSdWxlcygpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gY2FjaGVkX3J1bGVzXzsKKyAgfQorCisgcHJpdmF0ZToKKyAgc2NvcGVkX3JlZnB0cjxXZWJFbmdpbmVVUkxMb2FkZXJUaHJvdHRsZTo6VXJsUmVxdWVzdFJld3JpdGVSdWxlcz4KKyAgICAgIGNhY2hlZF9ydWxlc187CisKKyAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFRlc3RDYWNoZWRSdWxlc1Byb3ZpZGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZQorCitjbGFzcyBXZWJFbmdpbmVVUkxMb2FkZXJUaHJvdHRsZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICBXZWJFbmdpbmVVUkxMb2FkZXJUaHJvdHRsZVRlc3QoKQorICAgICAgOiB0YXNrX2Vudmlyb25tZW50XyhiYXNlOjp0ZXN0OjpUYXNrRW52aXJvbm1lbnQ6Ok1haW5UaHJlYWRUeXBlOjpJTykge30KKyAgfldlYkVuZ2luZVVSTExvYWRlclRocm90dGxlVGVzdCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworIHByb3RlY3RlZDoKKyAgYmFzZTo6dGVzdDo6U2luZ2xlVGhyZWFkVGFza0Vudmlyb25tZW50IHRhc2tfZW52aXJvbm1lbnRfOworfTsKKworLy8gVGVzdHMgcnVsZXMgYXJlIHByb3Blcmx5IGFwcGxpZWQgd2hlbiB3aWxkY2FyZC1maWx0ZXJpbmcgaXMgdXNlZCBvbiBob3N0cy4KK1RFU1RfRihXZWJFbmdpbmVVUkxMb2FkZXJUaHJvdHRsZVRlc3QsIFdpbGRjYXJkSG9zdHMpIHsKKyAgbW9qb206OlVybFJlcXVlc3RSZXdyaXRlQWRkSGVhZGVyc1B0ciBhZGRfaGVhZGVycyA9CisgICAgICBtb2pvbTo6VXJsUmVxdWVzdFJld3JpdGVBZGRIZWFkZXJzOjpOZXcoKTsKKyAgYWRkX2hlYWRlcnMtPmhlYWRlcnMuU2V0SGVhZGVyKCJIZWFkZXIiLCAiVmFsdWUiKTsKKyAgbW9qb206OlVybFJlcXVlc3RSZXdyaXRlUHRyIHJld3JpdGUgPQorICAgICAgbW9qb206OlVybFJlcXVlc3RSZXdyaXRlOjpOZXdBZGRIZWFkZXJzKHN0ZDo6bW92ZShhZGRfaGVhZGVycykpOworICBzdGQ6OnZlY3Rvcjxtb2pvbTo6VXJsUmVxdWVzdFJld3JpdGVQdHI+IHJld3JpdGVzOworICByZXdyaXRlcy5wdXNoX2JhY2soc3RkOjptb3ZlKHJld3JpdGUpKTsKKyAgbW9qb206OlVybFJlcXVlc3RSZXdyaXRlUnVsZVB0ciBydWxlID0gbW9qb206OlVybFJlcXVlc3RSZXdyaXRlUnVsZTo6TmV3KCk7CisgIHJ1bGUtPmhvc3RzX2ZpbHRlciA9IGJhc2U6Ok9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPj4oeyIqLnRlc3QubmV0In0pOworICBydWxlLT5yZXdyaXRlcyA9IHN0ZDo6bW92ZShyZXdyaXRlcyk7CisKKyAgc3RkOjp2ZWN0b3I8bW9qb206OlVybFJlcXVlc3RSZXdyaXRlUnVsZVB0cj4gcnVsZXM7CisgIHJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1vdmUocnVsZSkpOworCisgIFRlc3RDYWNoZWRSdWxlc1Byb3ZpZGVyIHByb3ZpZGVyOworICBwcm92aWRlci5TZXRDYWNoZWRSdWxlcygKKyAgICAgIGJhc2U6Ok1ha2VSZWZDb3VudGVkPFdlYkVuZ2luZVVSTExvYWRlclRocm90dGxlOjpVcmxSZXF1ZXN0UmV3cml0ZVJ1bGVzPigKKyAgICAgICAgICBzdGQ6Om1vdmUocnVsZXMpKSk7CisKKyAgV2ViRW5naW5lVVJMTG9hZGVyVGhyb3R0bGUgdGhyb3R0bGUoJnByb3ZpZGVyKTsKKyAgYm9vbCBkZWZlciA9IGZhbHNlOworCisgIG5ldHdvcms6OlJlc291cmNlUmVxdWVzdCByZXF1ZXN0MTsKKyAgcmVxdWVzdDEudXJsID0gR1VSTCgiaHR0cDovL3Rlc3QubmV0Iik7CisgIHRocm90dGxlLldpbGxTdGFydFJlcXVlc3QoJnJlcXVlc3QxLCAmZGVmZXIpOworICBFWFBFQ1RfVFJVRShyZXF1ZXN0MS5oZWFkZXJzLkhhc0hlYWRlcigiSGVhZGVyIikpOworCisgIG5ldHdvcms6OlJlc291cmNlUmVxdWVzdCByZXF1ZXN0MjsKKyAgcmVxdWVzdDIudXJsID0gR1VSTCgiaHR0cDovL3N1YmRvbWFpbi50ZXN0Lm5ldCIpOworICB0aHJvdHRsZS5XaWxsU3RhcnRSZXF1ZXN0KCZyZXF1ZXN0MiwgJmRlZmVyKTsKKyAgRVhQRUNUX1RSVUUocmVxdWVzdDIuaGVhZGVycy5IYXNIZWFkZXIoIkhlYWRlciIpKTsKKworICBuZXR3b3JrOjpSZXNvdXJjZVJlcXVlc3QgcmVxdWVzdDM7CisgIHJlcXVlc3QzLnVybCA9IEdVUkwoImh0dHA6Ly9kb21haW50ZXN0Lm5ldCIpOworICB0aHJvdHRsZS5XaWxsU3RhcnRSZXF1ZXN0KCZyZXF1ZXN0MywgJmRlZmVyKTsKKyAgRVhQRUNUX0ZBTFNFKHJlcXVlc3QzLmhlYWRlcnMuSGFzSGVhZGVyKCJIZWFkZXIiKSk7CisKKyAgbmV0d29yazo6UmVzb3VyY2VSZXF1ZXN0IHJlcXVlc3Q0OworICByZXF1ZXN0NC51cmwgPSBHVVJMKCJodHRwOi8vb3RoZXJkb21haW4ubmV0Iik7CisgIHRocm90dGxlLldpbGxTdGFydFJlcXVlc3QoJnJlcXVlc3Q0LCAmZGVmZXIpOworICBFWFBFQ1RfRkFMU0UocmVxdWVzdDQuaGVhZGVycy5IYXNIZWFkZXIoIkhlYWRlciIpKTsKK30KZGlmZiAtLWdpdCBhL2dwdS9jb21tYW5kX2J1ZmZlci9jbGllbnQvY29udGV4dF9zdXBwb3J0LmggYi9ncHUvY29tbWFuZF9idWZmZXIvY2xpZW50L2NvbnRleHRfc3VwcG9ydC5oCmluZGV4IGY2YjdhYjIuLjk5YjFmZDcgMTAwNjQ0Ci0tLSBhL2dwdS9jb21tYW5kX2J1ZmZlci9jbGllbnQvY29udGV4dF9zdXBwb3J0LmgKKysrIGIvZ3B1L2NvbW1hbmRfYnVmZmVyL2NsaWVudC9jb250ZXh0X3N1cHBvcnQuaApAQCAtOSw3ICs5LDYgQEAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCi0jaW5jbHVkZSAiYmFzZS9jb250YWluZXJzL3NwYW4uaCIKICNpbmNsdWRlICJ1aS9nZngvb3ZlcmxheV90cmFuc2Zvcm0uaCIKICNpbmNsdWRlICJ1aS9nZngvcHJlc2VudGF0aW9uX2ZlZWRiYWNrLmgiCiAKQEAgLTIxLDYgKzIwLDEwIEBACiBjbGFzcyBSZWN0RjsKIH0KIAorbmFtZXNwYWNlIGNjIHsKK3N0cnVjdCBJbWFnZUhlYWRlck1ldGFkYXRhOworfQorCiBuYW1lc3BhY2UgZ3B1IHsKIAogc3RydWN0IFN3YXBCdWZmZXJzQ29tcGxldGVQYXJhbXM7CkBAIC0xNDEsMTEgKzE0NCwxMiBAQAogICAvLyBEZXRlcm1pbmVzIGlmIGhhcmR3YXJlIGRlY29kZSBhY2NlbGVyYXRpb24gaXMgc3VwcG9ydGVkIGZvciBXZWJQIGltYWdlcy4KICAgdmlydHVhbCBib29sIElzV2ViUERlY29kZUFjY2VsZXJhdGlvblN1cHBvcnRlZCgpIGNvbnN0ID0gMDsKIAotICAvLyBEZXRlcm1pbmVzIGlmIGFuIGVuY29kZWQgaW1hZ2UgY2FuIGJlIGRlY29kZWQgdXNpbmcgaGFyZHdhcmUgZGVjb2RlCi0gIC8vIGFjY2VsZXJhdGlvbi4gSWYgdGhpcyBtZXRob2QgcmV0dXJucyB0cnVlLCB0aGVuIHRoZSBjbGllbnQgY2FuIGJlIGNvbmZpZGVudAotICAvLyB0aGF0IGEgY2FsbCB0byBSYXN0ZXJJbnRlcmZhY2U6OlNjaGVkdWxlSW1hZ2VEZWNvZGUoKSB3aWxsIHN1Y2NlZWQuCisgIC8vIERldGVybWluZXMgaWYgfGltYWdlX21ldGFkYXRhfCBjb3JyZXNwb25kcyB0byBhbiBpbWFnZSB0aGF0IGNhbiBiZSBkZWNvZGVkCisgIC8vIHVzaW5nIGhhcmR3YXJlIGRlY29kZSBhY2NlbGVyYXRpb24uIElmIHRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSwgdGhlbiB0aGUKKyAgLy8gY2xpZW50IGNhbiBiZSBjb25maWRlbnQgdGhhdCBhIGNhbGwgdG8KKyAgLy8gUmFzdGVySW50ZXJmYWNlOjpTY2hlZHVsZUltYWdlRGVjb2RlKCkgd2lsbCBzdWNjZWVkLgogICB2aXJ0dWFsIGJvb2wgQ2FuRGVjb2RlV2l0aEhhcmR3YXJlQWNjZWxlcmF0aW9uKAotICAgICAgYmFzZTo6c3Bhbjxjb25zdCB1aW50OF90PiBlbmNvZGVkX2RhdGEpIGNvbnN0ID0gMDsKKyAgICAgIGNvbnN0IGNjOjpJbWFnZUhlYWRlck1ldGFkYXRhKiBpbWFnZV9tZXRhZGF0YSkgY29uc3QgPSAwOwogCiAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29udGV4dCBwcm92aWRlciBhdXRvbWF0aWNhbGx5IG1hbmFnZXMgY2FsbHMgdG8KICAgLy8gR3JDb250ZXh0OjpyZXNldENvbnRleHQgdW5kZXIgdGhlIGhvb2QgdG8gcHJldmVudCBHTCBzdGF0ZSBzeW5jaHJvbml6YXRpb24KZGlmZiAtLWdpdCBhL2dwdS9jb21tYW5kX2J1ZmZlci9jbGllbnQvZ2xlczJfaW1wbGVtZW50YXRpb24uY2MgYi9ncHUvY29tbWFuZF9idWZmZXIvY2xpZW50L2dsZXMyX2ltcGxlbWVudGF0aW9uLmNjCmluZGV4IGZhZjY5MDUuLjkxNGQ2ZjEyIDEwMDY0NAotLS0gYS9ncHUvY29tbWFuZF9idWZmZXIvY2xpZW50L2dsZXMyX2ltcGxlbWVudGF0aW9uLmNjCisrKyBiL2dwdS9jb21tYW5kX2J1ZmZlci9jbGllbnQvZ2xlczJfaW1wbGVtZW50YXRpb24uY2MKQEAgLTY3ODgsNyArNjc4OCw3IEBACiB9CiAKIGJvb2wgR0xFUzJJbXBsZW1lbnRhdGlvbjo6Q2FuRGVjb2RlV2l0aEhhcmR3YXJlQWNjZWxlcmF0aW9uKAotICAgIGJhc2U6OnNwYW48Y29uc3QgdWludDhfdD4gZW5jb2RlZF9kYXRhKSBjb25zdCB7CisgICAgY29uc3QgY2M6OkltYWdlSGVhZGVyTWV0YWRhdGEqIGltYWdlX21ldGFkYXRhKSBjb25zdCB7CiAgIE5PVFJFQUNIRUQoKTsKICAgcmV0dXJuIGZhbHNlOwogfQpkaWZmIC0tZ2l0IGEvZ3B1L2NvbW1hbmRfYnVmZmVyL2NsaWVudC9nbGVzMl9pbXBsZW1lbnRhdGlvbi5oIGIvZ3B1L2NvbW1hbmRfYnVmZmVyL2NsaWVudC9nbGVzMl9pbXBsZW1lbnRhdGlvbi5oCmluZGV4IDFiODQxZjIuLjlmM2Q4YjJiIDEwMDY0NAotLS0gYS9ncHUvY29tbWFuZF9idWZmZXIvY2xpZW50L2dsZXMyX2ltcGxlbWVudGF0aW9uLmgKKysrIGIvZ3B1L2NvbW1hbmRfYnVmZmVyL2NsaWVudC9nbGVzMl9pbXBsZW1lbnRhdGlvbi5oCkBAIC0xNDcsNyArMTQ3LDcgQEAKICAgYm9vbCBJc0pwZWdEZWNvZGVBY2NlbGVyYXRpb25TdXBwb3J0ZWQoKSBjb25zdCBvdmVycmlkZTsKICAgYm9vbCBJc1dlYlBEZWNvZGVBY2NlbGVyYXRpb25TdXBwb3J0ZWQoKSBjb25zdCBvdmVycmlkZTsKICAgYm9vbCBDYW5EZWNvZGVXaXRoSGFyZHdhcmVBY2NlbGVyYXRpb24oCi0gICAgICBiYXNlOjpzcGFuPGNvbnN0IHVpbnQ4X3Q+IGVuY29kZWRfZGF0YSkgY29uc3Qgb3ZlcnJpZGU7CisgICAgICBjb25zdCBjYzo6SW1hZ2VIZWFkZXJNZXRhZGF0YSogaW1hZ2VfbWV0YWRhdGEpIGNvbnN0IG92ZXJyaWRlOwogCiAgIC8vIEludGVyZmFjZUJhc2UgaW1wbGVtZW50YXRpb24uCiAgIHZvaWQgR2VuU3luY1Rva2VuQ0hST01JVU0oR0xieXRlKiBzeW5jX3Rva2VuKSBvdmVycmlkZTsKZGlmZiAtLWdpdCBhL2dwdS9jb21tYW5kX2J1ZmZlci9jbGllbnQvaW1hZ2VfZGVjb2RlX2FjY2VsZXJhdG9yX2ludGVyZmFjZS5oIGIvZ3B1L2NvbW1hbmRfYnVmZmVyL2NsaWVudC9pbWFnZV9kZWNvZGVfYWNjZWxlcmF0b3JfaW50ZXJmYWNlLmgKaW5kZXggMWE5NGUwZS4uN2VjODgxNyAxMDA2NDQKLS0tIGEvZ3B1L2NvbW1hbmRfYnVmZmVyL2NsaWVudC9pbWFnZV9kZWNvZGVfYWNjZWxlcmF0b3JfaW50ZXJmYWNlLmgKKysrIGIvZ3B1L2NvbW1hbmRfYnVmZmVyL2NsaWVudC9pbWFnZV9kZWNvZGVfYWNjZWxlcmF0b3JfaW50ZXJmYWNlLmgKQEAgLTExLDYgKzExLDEwIEBACiAjaW5jbHVkZSAiZ3B1L2NvbW1hbmRfYnVmZmVyL2NvbW1vbi9jb21tYW5kX2J1ZmZlcl9pZC5oIgogI2luY2x1ZGUgImdwdS9jb21tYW5kX2J1ZmZlci9jb21tb24vc3luY190b2tlbi5oIgogCituYW1lc3BhY2UgY2Mgeworc3RydWN0IEltYWdlSGVhZGVyTWV0YWRhdGE7Cit9CisKIG5hbWVzcGFjZSBnZnggewogY2xhc3MgQ29sb3JTcGFjZTsKIGNsYXNzIFNpemU7CkBAIC0yNSw3ICsyOSw3IEBACiAgIHZpcnR1YWwgfkltYWdlRGVjb2RlQWNjZWxlcmF0b3JJbnRlcmZhY2UoKSB7fQogCiAgIHZpcnR1YWwgYm9vbCBJc0ltYWdlU3VwcG9ydGVkKAotICAgICAgYmFzZTo6c3Bhbjxjb25zdCB1aW50OF90PiBlbmNvZGVkX2RhdGEpIGNvbnN0ID0gMDsKKyAgICAgIGNvbnN0IGNjOjpJbWFnZUhlYWRlck1ldGFkYXRhKiBpbWFnZV9tZXRhZGF0YSkgY29uc3QgPSAwOwogCiAgIHZpcnR1YWwgYm9vbCBJc0pwZWdEZWNvZGVBY2NlbGVyYXRpb25TdXBwb3J0ZWQoKSBjb25zdCA9IDA7CiAKZGlmZiAtLWdpdCBhL2dwdS9jb21tYW5kX2J1ZmZlci9jbGllbnQvcmFzdGVyX2ltcGxlbWVudGF0aW9uLmNjIGIvZ3B1L2NvbW1hbmRfYnVmZmVyL2NsaWVudC9yYXN0ZXJfaW1wbGVtZW50YXRpb24uY2MKaW5kZXggMzU0MGQwNy4uOTNkYTNmNDUgMTAwNjQ0Ci0tLSBhL2dwdS9jb21tYW5kX2J1ZmZlci9jbGllbnQvcmFzdGVyX2ltcGxlbWVudGF0aW9uLmNjCisrKyBiL2dwdS9jb21tYW5kX2J1ZmZlci9jbGllbnQvcmFzdGVyX2ltcGxlbWVudGF0aW9uLmNjCkBAIC01NTQsOSArNTU0LDkgQEAKIH0KIAogYm9vbCBSYXN0ZXJJbXBsZW1lbnRhdGlvbjo6Q2FuRGVjb2RlV2l0aEhhcmR3YXJlQWNjZWxlcmF0aW9uKAotICAgIGJhc2U6OnNwYW48Y29uc3QgdWludDhfdD4gZW5jb2RlZF9kYXRhKSBjb25zdCB7CisgICAgY29uc3QgY2M6OkltYWdlSGVhZGVyTWV0YWRhdGEqIGltYWdlX21ldGFkYXRhKSBjb25zdCB7CiAgIHJldHVybiBpbWFnZV9kZWNvZGVfYWNjZWxlcmF0b3JfICYmCi0gICAgICAgICBpbWFnZV9kZWNvZGVfYWNjZWxlcmF0b3JfLT5Jc0ltYWdlU3VwcG9ydGVkKGVuY29kZWRfZGF0YSk7CisgICAgICAgICBpbWFnZV9kZWNvZGVfYWNjZWxlcmF0b3JfLT5Jc0ltYWdlU3VwcG9ydGVkKGltYWdlX21ldGFkYXRhKTsKIH0KIAogY29uc3Qgc3RkOjpzdHJpbmcmIFJhc3RlckltcGxlbWVudGF0aW9uOjpHZXRMb2dQcmVmaXgoKSBjb25zdCB7CmRpZmYgLS1naXQgYS9ncHUvY29tbWFuZF9idWZmZXIvY2xpZW50L3Jhc3Rlcl9pbXBsZW1lbnRhdGlvbi5oIGIvZ3B1L2NvbW1hbmRfYnVmZmVyL2NsaWVudC9yYXN0ZXJfaW1wbGVtZW50YXRpb24uaAppbmRleCAwODI1YTlhLi5mOGJlYjU4IDEwMDY0NAotLS0gYS9ncHUvY29tbWFuZF9idWZmZXIvY2xpZW50L3Jhc3Rlcl9pbXBsZW1lbnRhdGlvbi5oCisrKyBiL2dwdS9jb21tYW5kX2J1ZmZlci9jbGllbnQvcmFzdGVyX2ltcGxlbWVudGF0aW9uLmgKQEAgLTE4Niw3ICsxODYsNyBAQAogICBib29sIElzSnBlZ0RlY29kZUFjY2VsZXJhdGlvblN1cHBvcnRlZCgpIGNvbnN0IG92ZXJyaWRlOwogICBib29sIElzV2ViUERlY29kZUFjY2VsZXJhdGlvblN1cHBvcnRlZCgpIGNvbnN0IG92ZXJyaWRlOwogICBib29sIENhbkRlY29kZVdpdGhIYXJkd2FyZUFjY2VsZXJhdGlvbigKLSAgICAgIGJhc2U6OnNwYW48Y29uc3QgdWludDhfdD4gZW5jb2RlZF9kYXRhKSBjb25zdCBvdmVycmlkZTsKKyAgICAgIGNvbnN0IGNjOjpJbWFnZUhlYWRlck1ldGFkYXRhKiBpbWFnZV9tZXRhZGF0YSkgY29uc3Qgb3ZlcnJpZGU7CiAKICAgLy8gSW50ZXJmYWNlQmFzZSBpbXBsZW1lbnRhdGlvbi4KICAgdm9pZCBHZW5TeW5jVG9rZW5DSFJPTUlVTShHTGJ5dGUqIHN5bmNfdG9rZW4pIG92ZXJyaWRlOwpkaWZmIC0tZ2l0IGEvZ3B1L2NvbW1hbmRfYnVmZmVyL2NsaWVudC9yYXN0ZXJfaW1wbGVtZW50YXRpb25fZ2xlc191bml0dGVzdC5jYyBiL2dwdS9jb21tYW5kX2J1ZmZlci9jbGllbnQvcmFzdGVyX2ltcGxlbWVudGF0aW9uX2dsZXNfdW5pdHRlc3QuY2MKaW5kZXggZjE5MWIwYS4uZDUwZTQyOCAxMDA2NDQKLS0tIGEvZ3B1L2NvbW1hbmRfYnVmZmVyL2NsaWVudC9yYXN0ZXJfaW1wbGVtZW50YXRpb25fZ2xlc191bml0dGVzdC5jYworKysgYi9ncHUvY29tbWFuZF9idWZmZXIvY2xpZW50L3Jhc3Rlcl9pbXBsZW1lbnRhdGlvbl9nbGVzX3VuaXR0ZXN0LmNjCkBAIC0yMjksNyArMjI5LDcgQEAKICAgYm9vbCBJc0pwZWdEZWNvZGVBY2NlbGVyYXRpb25TdXBwb3J0ZWQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQogICBib29sIElzV2ViUERlY29kZUFjY2VsZXJhdGlvblN1cHBvcnRlZCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CiAgIGJvb2wgQ2FuRGVjb2RlV2l0aEhhcmR3YXJlQWNjZWxlcmF0aW9uKAotICAgICAgYmFzZTo6c3Bhbjxjb25zdCB1aW50OF90PiBlbmNvZGVkX2RhdGEpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgIGNvbnN0IGNjOjpJbWFnZUhlYWRlck1ldGFkYXRhKiBpbWFnZV9tZXRhZGF0YSkgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiBmYWxzZTsKICAgfQogICBib29sIEhhc0dyQ29udGV4dFN1cHBvcnQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQpkaWZmIC0tZ2l0IGEvZ3B1L2NvbW1hbmRfYnVmZmVyL2NsaWVudC93ZWJncHVfaW1wbGVtZW50YXRpb24uY2MgYi9ncHUvY29tbWFuZF9idWZmZXIvY2xpZW50L3dlYmdwdV9pbXBsZW1lbnRhdGlvbi5jYwppbmRleCAxZmUwMGQzLi40MDkzODc0IDEwMDY0NAotLS0gYS9ncHUvY29tbWFuZF9idWZmZXIvY2xpZW50L3dlYmdwdV9pbXBsZW1lbnRhdGlvbi5jYworKysgYi9ncHUvY29tbWFuZF9idWZmZXIvY2xpZW50L3dlYmdwdV9pbXBsZW1lbnRhdGlvbi5jYwpAQCAtMTczLDcgKzE3Myw3IEBACiAgIHJldHVybiBmYWxzZTsKIH0KIGJvb2wgV2ViR1BVSW1wbGVtZW50YXRpb246OkNhbkRlY29kZVdpdGhIYXJkd2FyZUFjY2VsZXJhdGlvbigKLSAgICBiYXNlOjpzcGFuPGNvbnN0IHVpbnQ4X3Q+IGVuY29kZWRfZGF0YSkgY29uc3QgeworICAgIGNvbnN0IGNjOjpJbWFnZUhlYWRlck1ldGFkYXRhKiBpbWFnZV9tZXRhZGF0YSkgY29uc3QgewogICBOT1RSRUFDSEVEKCk7CiAgIHJldHVybiBmYWxzZTsKIH0KZGlmZiAtLWdpdCBhL2dwdS9jb21tYW5kX2J1ZmZlci9jbGllbnQvd2ViZ3B1X2ltcGxlbWVudGF0aW9uLmggYi9ncHUvY29tbWFuZF9idWZmZXIvY2xpZW50L3dlYmdwdV9pbXBsZW1lbnRhdGlvbi5oCmluZGV4IDRjNTY5MjQuLjk4MmExYzNiIDEwMDY0NAotLS0gYS9ncHUvY29tbWFuZF9idWZmZXIvY2xpZW50L3dlYmdwdV9pbXBsZW1lbnRhdGlvbi5oCisrKyBiL2dwdS9jb21tYW5kX2J1ZmZlci9jbGllbnQvd2ViZ3B1X2ltcGxlbWVudGF0aW9uLmgKQEAgLTg2LDcgKzg2LDcgQEAKICAgYm9vbCBJc0pwZWdEZWNvZGVBY2NlbGVyYXRpb25TdXBwb3J0ZWQoKSBjb25zdCBvdmVycmlkZTsKICAgYm9vbCBJc1dlYlBEZWNvZGVBY2NlbGVyYXRpb25TdXBwb3J0ZWQoKSBjb25zdCBvdmVycmlkZTsKICAgYm9vbCBDYW5EZWNvZGVXaXRoSGFyZHdhcmVBY2NlbGVyYXRpb24oCi0gICAgICBiYXNlOjpzcGFuPGNvbnN0IHVpbnQ4X3Q+IGVuY29kZWRfZGF0YSkgY29uc3Qgb3ZlcnJpZGU7CisgICAgICBjb25zdCBjYzo6SW1hZ2VIZWFkZXJNZXRhZGF0YSogaW1hZ2VfbWV0YWRhdGEpIGNvbnN0IG92ZXJyaWRlOwogCiAgIC8vIEludGVyZmFjZUJhc2UgaW1wbGVtZW50YXRpb24uCiAgIHZvaWQgR2VuU3luY1Rva2VuQ0hST01JVU0oR0xieXRlKiBzeW5jX3Rva2VuKSBvdmVycmlkZTsKZGlmZiAtLWdpdCBhL2dwdS9pcGMvY2xpZW50L0JVSUxELmduIGIvZ3B1L2lwYy9jbGllbnQvQlVJTEQuZ24KaW5kZXggYWQ5MjQxNi4uYTBjZTg5MyAxMDA2NDQKLS0tIGEvZ3B1L2lwYy9jbGllbnQvQlVJTEQuZ24KKysrIGIvZ3B1L2lwYy9jbGllbnQvQlVJTEQuZ24KQEAgLTMzLDExICszMywxMSBAQAogICBdCiAgIGRlcHMgPSBbCiAgICAgIi8vYmFzZSIsCisgICAgIi8vY2MvcGFpbnQiLAogICAgICIvL2dwdS9jb21tYW5kX2J1ZmZlci9jbGllbnQ6Y2xpZW50X3NvdXJjZXMiLAogICAgICIvL2dwdS9jb21tYW5kX2J1ZmZlci9jb21tb246Y29tbW9uX3NvdXJjZXMiLAogICAgICIvL2dwdS9jb25maWc6Y29uZmlnX3NvdXJjZXMiLAogICAgICIvL2dwdS9pcGMvY29tbW9uOmlwY19jb21tb25fc291cmNlcyIsCi0gICAgIi8vbWVkaWEvcGFyc2VycyIsCiAgICAgIi8vbW9qby9wdWJsaWMvY3BwL3N5c3RlbSIsCiAgICAgIi8vdWkvZ2Z4OmNvbG9yX3NwYWNlIiwKICAgICAiLy91aS9nZngvZ2VvbWV0cnkiLApkaWZmIC0tZ2l0IGEvZ3B1L2lwYy9jbGllbnQvREVQUyBiL2dwdS9pcGMvY2xpZW50L0RFUFMKaW5kZXggYjZhZWY4ZC4uNWEzZGNjYyAxMDA2NDQKLS0tIGEvZ3B1L2lwYy9jbGllbnQvREVQUworKysgYi9ncHUvaXBjL2NsaWVudC9ERVBTCkBAIC0xMSw5ICsxMSw3IEBACiAgICAgIitjb21wb25lbnRzL3Zpei90ZXN0L3Rlc3RfZ3B1X21lbW9yeV9idWZmZXJfbWFuYWdlci5oIiwKICAgXSwKICAgImltYWdlX2RlY29kZV9hY2NlbGVyYXRvcl9wcm94eS5jYyI6IFsKLSAgICAiK21lZGlhL3BhcnNlcnMvanBlZ19wYXJzZXIuaCIsCi0gICAgIittZWRpYS9wYXJzZXJzL3ZwOF9wYXJzZXIuaCIsCi0gICAgIittZWRpYS9wYXJzZXJzL3dlYnBfcGFyc2VyLmgiLAorICAgICIrY2MvcGFpbnQvcGFpbnRfaW1hZ2UuaCIsCiAgIF0sCiAgICJyYXN0ZXJfaW5fcHJvY2Vzc19jb250ZXh0X3Rlc3RzLmNjIjogWwogICAgICIrY29tcG9uZW50cy92aXovY29tbW9uL3Jlc291cmNlcy9yZXNvdXJjZV9mb3JtYXQuaCIsCmRpZmYgLS1naXQgYS9ncHUvaXBjL2NsaWVudC9pbWFnZV9kZWNvZGVfYWNjZWxlcmF0b3JfcHJveHkuY2MgYi9ncHUvaXBjL2NsaWVudC9pbWFnZV9kZWNvZGVfYWNjZWxlcmF0b3JfcHJveHkuY2MKaW5kZXggY2ZiNTE0My4uNzYwMjkwMDcgMTAwNjQ0Ci0tLSBhL2dwdS9pcGMvY2xpZW50L2ltYWdlX2RlY29kZV9hY2NlbGVyYXRvcl9wcm94eS5jYworKysgYi9ncHUvaXBjL2NsaWVudC9pbWFnZV9kZWNvZGVfYWNjZWxlcmF0b3JfcHJveHkuY2MKQEAgLTQsMjMgKzQsMTggQEAKIAogI2luY2x1ZGUgImdwdS9pcGMvY2xpZW50L2ltYWdlX2RlY29kZV9hY2NlbGVyYXRvcl9wcm94eS5oIgogCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHV0aWxpdHk+CiAjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAiYmFzZS9udW1lcmljcy9zYWZlX2NvbnZlcnNpb25zLmgiCisjaW5jbHVkZSAiY2MvcGFpbnQvcGFpbnRfaW1hZ2UuaCIKICNpbmNsdWRlICJncHUvY29tbWFuZF9idWZmZXIvY29tbW9uL2NvbnN0YW50cy5oIgogI2luY2x1ZGUgImdwdS9jb25maWcvZ3B1X2luZm8uaCIKICNpbmNsdWRlICJncHUvaXBjL2NsaWVudC9ncHVfY2hhbm5lbF9ob3N0LmgiCiAjaW5jbHVkZSAiZ3B1L2lwYy9jb21tb24vY29tbWFuZF9idWZmZXJfaWQuaCIKICNpbmNsdWRlICJncHUvaXBjL2NvbW1vbi9ncHVfbWVzc2FnZXMuaCIKLSNpbmNsdWRlICJtZWRpYS9wYXJzZXJzL2pwZWdfcGFyc2VyLmgiCi0jaW5jbHVkZSAibWVkaWEvcGFyc2Vycy92cDhfcGFyc2VyLmgiCi0jaW5jbHVkZSAibWVkaWEvcGFyc2Vycy93ZWJwX3BhcnNlci5oIgogI2luY2x1ZGUgInVpL2dmeC9jb2xvcl9zcGFjZS5oIgogI2luY2x1ZGUgInVpL2dmeC9nZW9tZXRyeS9zaXplLmgiCiAKQEAgLTI4LDEyNiArMjMsNjcgQEAKIAogbmFtZXNwYWNlIHsKIAotYm9vbCBJc0pwZWdJbWFnZShiYXNlOjpzcGFuPGNvbnN0IHVpbnQ4X3Q+IGVuY29kZWRfZGF0YSkgewotICBpZiAoZW5jb2RlZF9kYXRhLnNpemUoKSA8IDN1KQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIG1lbWNtcCgiXHhGRlx4RDhceEZGIiwgZW5jb2RlZF9kYXRhLmRhdGEoKSwgM3UpID09IDA7Ci19CisvLyBUT0RPKGNyYnVnLmNvbS85ODQ5NzEpOiBmb3IgV2ViUHMgd2UgbWF5IG5lZWQgdG8gY29tcHV0ZSB0aGUgY29kZWQgc2l6ZQorLy8gaW5zdGVhZCBhbmQgY2hlY2sgdGhhdCBhZ2FpbnN0IHRoZSBzdXBwb3J0ZWQgZGltZW5zaW9ucy4KK2Jvb2wgSXNTdXBwb3J0ZWRJbWFnZVNpemUoCisgICAgY29uc3QgY2M6OkltYWdlSGVhZGVyTWV0YWRhdGEqIGltYWdlX2RhdGEsCisgICAgY29uc3QgSW1hZ2VEZWNvZGVBY2NlbGVyYXRvclN1cHBvcnRlZFByb2ZpbGUmIHN1cHBvcnRlZF9wcm9maWxlKSB7CisgIERDSEVDSyhpbWFnZV9kYXRhKTsKIAotSW1hZ2VEZWNvZGVBY2NlbGVyYXRvclR5cGUgR2V0SW1hZ2VUeXBlKAotICAgIGJhc2U6OnNwYW48Y29uc3QgdWludDhfdD4gZW5jb2RlZF9kYXRhKSB7Ci0gIHN0YXRpY19hc3NlcnQoc3RhdGljX2Nhc3Q8aW50PihJbWFnZURlY29kZUFjY2VsZXJhdG9yVHlwZTo6a01heFZhbHVlKSA9PSAyLAotICAgICAgICAgICAgICAgICJHZXRJbWFnZVR5cGUoKSBtdXN0IGJlIGFkYXB0ZWQgdG8gc3VwcG9ydCBhbGwgaW1hZ2UgdHlwZXMgaW4gIgotICAgICAgICAgICAgICAgICJJbWFnZURlY29kZUFjY2VsZXJhdG9yVHlwZSIpOworICBnZng6OlNpemUgaW1hZ2Vfc2l6ZTsKKyAgaWYgKGltYWdlX2RhdGEtPmNvZGVkX3NpemUuaGFzX3ZhbHVlKCkpCisgICAgaW1hZ2Vfc2l6ZSA9IGltYWdlX2RhdGEtPmNvZGVkX3NpemUudmFsdWUoKTsKKyAgZWxzZQorICAgIGltYWdlX3NpemUgPSBpbWFnZV9kYXRhLT5pbWFnZV9zaXplOwogCi0gIGlmIChJc0pwZWdJbWFnZShlbmNvZGVkX2RhdGEpKQotICAgIHJldHVybiBJbWFnZURlY29kZUFjY2VsZXJhdG9yVHlwZTo6a0pwZWc7Ci0KLSAgaWYgKG1lZGlhOjpJc0xvc3N5V2ViUEltYWdlKGVuY29kZWRfZGF0YSkpCi0gICAgcmV0dXJuIEltYWdlRGVjb2RlQWNjZWxlcmF0b3JUeXBlOjprV2ViUDsKLQotICByZXR1cm4gSW1hZ2VEZWNvZGVBY2NlbGVyYXRvclR5cGU6OmtVbmtub3duOwotfQotCi1ib29sIEdldEpwZWdTdWJzYW1wbGluZyhjb25zdCBtZWRpYTo6SnBlZ1BhcnNlUmVzdWx0JiBwYXJzZV9yZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBJbWFnZURlY29kZUFjY2VsZXJhdG9yU3Vic2FtcGxpbmcqIHN1YnNhbXBsaW5nKSB7Ci0gIHN0YXRpY19hc3NlcnQoCi0gICAgICBzdGF0aWNfY2FzdDxpbnQ+KEltYWdlRGVjb2RlQWNjZWxlcmF0b3JTdWJzYW1wbGluZzo6a01heFZhbHVlKSA9PSAyLAotICAgICAgIkdldEpwZWdTdWJzYW1wbGluZygpIG11c3QgYmUgYWRhcHRlZCB0byBzdXBwb3J0IGFsbCAiCi0gICAgICAic3Vic2FtcGxpbmcgZmFjdG9ycyBpbiBJbWFnZURlY29kZUFjY2VsZXJhdG9yU3Vic2FtcGxpbmciKTsKLQotICAvLyBDdXJyZW50bHksIG9ubHkgMyBjb21wb25lbnRzIGFyZSBzdXBwb3J0ZWQgKHRoaXMgZXhjbHVkZXMsIGZvciBleGFtcGxlLAotICAvLyBncmF5c2NhbGUgYW5kIENNWUsgSlBFR3MpLgotICBpZiAocGFyc2VfcmVzdWx0LmZyYW1lX2hlYWRlci5udW1fY29tcG9uZW50cyAhPSAzdSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgY29uc3QgdWludDhfdCBjb21wMF9oID0KLSAgICAgIHBhcnNlX3Jlc3VsdC5mcmFtZV9oZWFkZXIuY29tcG9uZW50c1swXS5ob3Jpem9udGFsX3NhbXBsaW5nX2ZhY3RvcjsKLSAgY29uc3QgdWludDhfdCBjb21wMF92ID0KLSAgICAgIHBhcnNlX3Jlc3VsdC5mcmFtZV9oZWFkZXIuY29tcG9uZW50c1swXS52ZXJ0aWNhbF9zYW1wbGluZ19mYWN0b3I7Ci0gIGNvbnN0IHVpbnQ4X3QgY29tcDFfaCA9Ci0gICAgICBwYXJzZV9yZXN1bHQuZnJhbWVfaGVhZGVyLmNvbXBvbmVudHNbMV0uaG9yaXpvbnRhbF9zYW1wbGluZ19mYWN0b3I7Ci0gIGNvbnN0IHVpbnQ4X3QgY29tcDFfdiA9Ci0gICAgICBwYXJzZV9yZXN1bHQuZnJhbWVfaGVhZGVyLmNvbXBvbmVudHNbMV0udmVydGljYWxfc2FtcGxpbmdfZmFjdG9yOwotICBjb25zdCB1aW50OF90IGNvbXAyX2ggPQotICAgICAgcGFyc2VfcmVzdWx0LmZyYW1lX2hlYWRlci5jb21wb25lbnRzWzJdLmhvcml6b250YWxfc2FtcGxpbmdfZmFjdG9yOwotICBjb25zdCB1aW50OF90IGNvbXAyX3YgPQotICAgICAgcGFyc2VfcmVzdWx0LmZyYW1lX2hlYWRlci5jb21wb25lbnRzWzJdLnZlcnRpY2FsX3NhbXBsaW5nX2ZhY3RvcjsKLQotICBpZiAoY29tcDFfaCAhPSAxdSB8fCBjb21wMV92ICE9IDF1IHx8IGNvbXAyX2ggIT0gMXUgfHwgY29tcDJfdiAhPSAxdSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGNvbXAwX2ggPT0gMnUgJiYgY29tcDBfdiA9PSAydSkgewotICAgICpzdWJzYW1wbGluZyA9IEltYWdlRGVjb2RlQWNjZWxlcmF0b3JTdWJzYW1wbGluZzo6azQyMDsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIGlmIChjb21wMF9oID09IDJ1ICYmIGNvbXAwX3YgPT0gMXUpIHsKLSAgICAqc3Vic2FtcGxpbmcgPSBJbWFnZURlY29kZUFjY2VsZXJhdG9yU3Vic2FtcGxpbmc6Oms0MjI7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSBpZiAoY29tcDBfaCA9PSAxdSAmJiBjb21wMF92ID09IDF1KSB7Ci0gICAgKnN1YnNhbXBsaW5nID0gSW1hZ2VEZWNvZGVBY2NlbGVyYXRvclN1YnNhbXBsaW5nOjprNDQ0OwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIGltYWdlX3NpemUud2lkdGgoKSA+PQorICAgICAgICAgICAgIHN1cHBvcnRlZF9wcm9maWxlLm1pbl9lbmNvZGVkX2RpbWVuc2lvbnMud2lkdGgoKSAmJgorICAgICAgICAgaW1hZ2Vfc2l6ZS5oZWlnaHQoKSA+PQorICAgICAgICAgICAgIHN1cHBvcnRlZF9wcm9maWxlLm1pbl9lbmNvZGVkX2RpbWVuc2lvbnMuaGVpZ2h0KCkgJiYKKyAgICAgICAgIGltYWdlX3NpemUud2lkdGgoKSA8PQorICAgICAgICAgICAgIHN1cHBvcnRlZF9wcm9maWxlLm1heF9lbmNvZGVkX2RpbWVuc2lvbnMud2lkdGgoKSAmJgorICAgICAgICAgaW1hZ2Vfc2l6ZS5oZWlnaHQoKSA8PQorICAgICAgICAgICAgIHN1cHBvcnRlZF9wcm9maWxlLm1heF9lbmNvZGVkX2RpbWVuc2lvbnMuaGVpZ2h0KCk7CiB9CiAKIGJvb2wgSXNTdXBwb3J0ZWRKcGVnSW1hZ2UoCi0gICAgYmFzZTo6c3Bhbjxjb25zdCB1aW50OF90PiBlbmNvZGVkX2RhdGEsCisgICAgY29uc3QgY2M6OkltYWdlSGVhZGVyTWV0YWRhdGEqIGltYWdlX2RhdGEsCiAgICAgY29uc3QgSW1hZ2VEZWNvZGVBY2NlbGVyYXRvclN1cHBvcnRlZFByb2ZpbGUmIHN1cHBvcnRlZF9wcm9maWxlKSB7Ci0gIERDSEVDSyhJc0pwZWdJbWFnZShlbmNvZGVkX2RhdGEpKTsKKyAgRENIRUNLKGltYWdlX2RhdGEpOworICBEQ0hFQ0tfRVEoY2M6OkltYWdlVHlwZTo6a0pQRUcsIGltYWdlX2RhdGEtPmltYWdlX3R5cGUpOwogICBEQ0hFQ0tfRVEoSW1hZ2VEZWNvZGVBY2NlbGVyYXRvclR5cGU6OmtKcGVnLCBzdXBwb3J0ZWRfcHJvZmlsZS5pbWFnZV90eXBlKTsKIAotICAvLyBGaXJzdCwgcGFyc2UgdGhlIEpQRUcgZmlsZS4gVGhpcyBmYWlscyBmb3IgcHJvZ3Jlc3NpdmUgSlBFR3MgKHdoaWNoIHdlCi0gIC8vIGRvbid0IHN1cHBvcnQgYW55d2F5KS4KLSAgbWVkaWE6OkpwZWdQYXJzZVJlc3VsdCBwYXJzZV9yZXN1bHQ7Ci0gIGlmICghbWVkaWE6OlBhcnNlSnBlZ1BpY3R1cmUoZW5jb2RlZF9kYXRhLmRhdGEoKSwgZW5jb2RlZF9kYXRhLnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2VfcmVzdWx0KSkgeworICBEQ0hFQ0soaW1hZ2VfZGF0YS0+anBlZ19pc19wcm9ncmVzc2l2ZS5oYXNfdmFsdWUoKSk7CisgIGlmIChpbWFnZV9kYXRhLT5qcGVnX2lzX3Byb2dyZXNzaXZlLnZhbHVlKCkpCiAgICAgcmV0dXJuIGZhbHNlOwotICB9CiAKLSAgLy8gTm93LCBjaGVjayB0aGUgY2hyb21hIHN1YnNhbXBsaW5nIGZvcm1hdC4KKyAgLy8gQ2hlY2sgdGhlIGNocm9tYSBzdWJzYW1wbGluZyBmb3JtYXQuCisgIHN0YXRpY19hc3NlcnQoCisgICAgICAvLyBUT0RPKGFuZHJlc2NqKTogcmVmYWN0b3IgdG8gaW5zdGVhZCBoYXZlIGEgc3RhdGljX2Fzc2VydCBhdCB0aGUKKyAgICAgIC8vIGRlY2xhcmF0aW9uIHNpdGUgb2YgSW1hZ2VEZWNvZGVBY2NlbGVyYXRvclN1YnNhbXBsaW5nIHRvIG1ha2Ugc3VyZSBpdAorICAgICAgLy8gaGFzIHRoZSBzYW1lIG51bWJlciBvZiBlbnRyaWVzIGFzIGNjOjpZVVZTdWJzYW1wbGluZy4KKyAgICAgIHN0YXRpY19jYXN0PGludD4oSW1hZ2VEZWNvZGVBY2NlbGVyYXRvclN1YnNhbXBsaW5nOjprTWF4VmFsdWUpID09IDIsCisgICAgICAiSXNTdXBwb3J0ZWRKcGVnSW1hZ2UoKSBtdXN0IGJlIGFkYXB0ZWQgdG8gc3VwcG9ydCBhbGwgc3Vic2FtcGxpbmcgIgorICAgICAgImZhY3RvcnMgaW4gSW1hZ2VEZWNvZGVBY2NlbGVyYXRvclN1YnNhbXBsaW5nIik7CiAgIEltYWdlRGVjb2RlQWNjZWxlcmF0b3JTdWJzYW1wbGluZyBzdWJzYW1wbGluZzsKLSAgaWYgKCFHZXRKcGVnU3Vic2FtcGxpbmcocGFyc2VfcmVzdWx0LCAmc3Vic2FtcGxpbmcpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKHN0ZDo6ZmluZChzdXBwb3J0ZWRfcHJvZmlsZS5zdWJzYW1wbGluZ3MuY2JlZ2luKCksCi0gICAgICAgICAgICAgICAgc3VwcG9ydGVkX3Byb2ZpbGUuc3Vic2FtcGxpbmdzLmNlbmQoKSwKLSAgICAgICAgICAgICAgICBzdWJzYW1wbGluZykgPT0gc3VwcG9ydGVkX3Byb2ZpbGUuc3Vic2FtcGxpbmdzLmNlbmQoKSkgewotICAgIHJldHVybiBmYWxzZTsKKyAgc3dpdGNoIChpbWFnZV9kYXRhLT55dXZfc3Vic2FtcGxpbmcpIHsKKyAgICBjYXNlIGNjOjpZVVZTdWJzYW1wbGluZzo6azQyMDoKKyAgICAgIHN1YnNhbXBsaW5nID0gSW1hZ2VEZWNvZGVBY2NlbGVyYXRvclN1YnNhbXBsaW5nOjprNDIwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBjYzo6WVVWU3Vic2FtcGxpbmc6Oms0MjI6CisgICAgICBzdWJzYW1wbGluZyA9IEltYWdlRGVjb2RlQWNjZWxlcmF0b3JTdWJzYW1wbGluZzo6azQyMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgY2M6OllVVlN1YnNhbXBsaW5nOjprNDQ0OgorICAgICAgc3Vic2FtcGxpbmcgPSBJbWFnZURlY29kZUFjY2VsZXJhdG9yU3Vic2FtcGxpbmc6Oms0NDQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLy8gQ3VycmVudGx5IG5vdCBzdXBwb3J0aW5nIGFueSBvdGhlciBzdWJzYW1wbGluZyBmb3JtYXQuCisgICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAotICAvLyBOb3csIGNoZWNrIHRoZSBkaW1lbnNpb25zLgotICBjb25zdCBpbnQgZW5jb2RlZF93aWR0aCA9Ci0gICAgICBiYXNlOjpzdHJpY3RfY2FzdDxpbnQ+KHBhcnNlX3Jlc3VsdC5mcmFtZV9oZWFkZXIuY29kZWRfd2lkdGgpOwotICBjb25zdCBpbnQgZW5jb2RlZF9oZWlnaHQgPQotICAgICAgYmFzZTo6c3RyaWN0X2Nhc3Q8aW50PihwYXJzZV9yZXN1bHQuZnJhbWVfaGVhZGVyLmNvZGVkX2hlaWdodCk7Ci0gIGlmIChlbmNvZGVkX3dpZHRoIDwgc3VwcG9ydGVkX3Byb2ZpbGUubWluX2VuY29kZWRfZGltZW5zaW9ucy53aWR0aCgpIHx8Ci0gICAgICBlbmNvZGVkX2hlaWdodCA8IHN1cHBvcnRlZF9wcm9maWxlLm1pbl9lbmNvZGVkX2RpbWVuc2lvbnMuaGVpZ2h0KCkgfHwKLSAgICAgIGVuY29kZWRfd2lkdGggPiBzdXBwb3J0ZWRfcHJvZmlsZS5tYXhfZW5jb2RlZF9kaW1lbnNpb25zLndpZHRoKCkgfHwKLSAgICAgIGVuY29kZWRfaGVpZ2h0ID4gc3VwcG9ydGVkX3Byb2ZpbGUubWF4X2VuY29kZWRfZGltZW5zaW9ucy5oZWlnaHQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIElzU3VwcG9ydGVkV2ViUEltYWdlKAotICAgIGJhc2U6OnNwYW48Y29uc3QgdWludDhfdD4gZW5jb2RlZF9kYXRhLAotICAgIGNvbnN0IEltYWdlRGVjb2RlQWNjZWxlcmF0b3JTdXBwb3J0ZWRQcm9maWxlJiBzdXBwb3J0ZWRfcHJvZmlsZSkgewotICBEQ0hFQ0sobWVkaWE6OklzTG9zc3lXZWJQSW1hZ2UoZW5jb2RlZF9kYXRhKSk7Ci0gIERDSEVDS19FUShJbWFnZURlY29kZUFjY2VsZXJhdG9yVHlwZTo6a1dlYlAsIHN1cHBvcnRlZF9wcm9maWxlLmltYWdlX3R5cGUpOwotCi0gIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxtZWRpYTo6VnA4RnJhbWVIZWFkZXI+IHBhcnNlX3Jlc3VsdCA9Ci0gICAgICBtZWRpYTo6UGFyc2VXZWJQSW1hZ2UoZW5jb2RlZF9kYXRhKTsKLSAgaWYgKCFwYXJzZV9yZXN1bHQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8vIFRPRE8oY3JidWcuY29tLzk4NDk3MSk6IHdlIG1heSBuZWVkIHRvIGNvbXB1dGUgdGhlIGNvZGVkIHNpemUgaW5zdGVhZCBhbmQKLSAgLy8gY2hlY2sgdGhhdCBhZ2FpbnN0IHRoZSBzdXBwb3J0ZWQgZGltZW5zaW9ucy4KLSAgY29uc3QgaW50IHdpZHRoID0gYmFzZTo6c3RyaWN0X2Nhc3Q8aW50PihwYXJzZV9yZXN1bHQtPndpZHRoKTsKLSAgY29uc3QgaW50IGhlaWdodCA9IGJhc2U6OnN0cmljdF9jYXN0PGludD4ocGFyc2VfcmVzdWx0LT5oZWlnaHQpOwotICByZXR1cm4gd2lkdGggPj0gc3VwcG9ydGVkX3Byb2ZpbGUubWluX2VuY29kZWRfZGltZW5zaW9ucy53aWR0aCgpICYmCi0gICAgICAgICBoZWlnaHQgPj0gc3VwcG9ydGVkX3Byb2ZpbGUubWluX2VuY29kZWRfZGltZW5zaW9ucy5oZWlnaHQoKSAmJgotICAgICAgICAgd2lkdGggPD0gc3VwcG9ydGVkX3Byb2ZpbGUubWF4X2VuY29kZWRfZGltZW5zaW9ucy53aWR0aCgpICYmCi0gICAgICAgICBoZWlnaHQgPD0gc3VwcG9ydGVkX3Byb2ZpbGUubWF4X2VuY29kZWRfZGltZW5zaW9ucy5oZWlnaHQoKTsKKyAgcmV0dXJuIHN0ZDo6ZmluZChzdXBwb3J0ZWRfcHJvZmlsZS5zdWJzYW1wbGluZ3MuY2JlZ2luKCksCisgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkX3Byb2ZpbGUuc3Vic2FtcGxpbmdzLmNlbmQoKSwKKyAgICAgICAgICAgICAgICAgICBzdWJzYW1wbGluZykgIT0gc3VwcG9ydGVkX3Byb2ZpbGUuc3Vic2FtcGxpbmdzLmNlbmQoKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlCkBAIC0xNTksMTMgKzk1LDM5IEBACiBJbWFnZURlY29kZUFjY2VsZXJhdG9yUHJveHk6On5JbWFnZURlY29kZUFjY2VsZXJhdG9yUHJveHkoKSB7fQogCiBib29sIEltYWdlRGVjb2RlQWNjZWxlcmF0b3JQcm94eTo6SXNJbWFnZVN1cHBvcnRlZCgKLSAgICBiYXNlOjpzcGFuPGNvbnN0IHVpbnQ4X3Q+IGVuY29kZWRfZGF0YSkgY29uc3QgeworICAgIGNvbnN0IGNjOjpJbWFnZUhlYWRlck1ldGFkYXRhKiBpbWFnZV9tZXRhZGF0YSkgY29uc3QgewogICBEQ0hFQ0soaG9zdF8pOwogCi0gIGNvbnN0IEltYWdlRGVjb2RlQWNjZWxlcmF0b3JUeXBlIGltYWdlX3R5cGUgPSBHZXRJbWFnZVR5cGUoZW5jb2RlZF9kYXRhKTsKLSAgaWYgKGltYWdlX3R5cGUgPT0gSW1hZ2VEZWNvZGVBY2NlbGVyYXRvclR5cGU6OmtVbmtub3duKQorICBpZiAoIWltYWdlX21ldGFkYXRhKQogICAgIHJldHVybiBmYWxzZTsKIAorICAvLyBJbWFnZSBpcyBzdXBwb3J0ZWQgb25seSBpZiBhbGwgdGhlIGVuY29kZWQgZGF0YSB3YXMgcmVjZWl2ZWQgcHJpb3IgdG8gYW55CisgIC8vIGRlY29kaW5nIHdvcmsuIE90aGVyd2lzZSwgaXQgbWVhbnMgdGhhdCB0aGUgc29mdHdhcmUgZGVjb2RlciBoYXMgYWxyZWFkeQorICAvLyBzdGFydGVkIGRlY29kaW5nIHRoZSBpbWFnZSwgc28gd2UganVzdCBsZXQgaXQgZmluaXNoLgorICBpZiAoIWltYWdlX21ldGFkYXRhLT5hbGxfZGF0YV9yZWNlaXZlZF9wcmlvcl90b19kZWNvZGUpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIEltYWdlIGlzIHN1cHBvcnRlZCBvbmx5IGlmIHRoZSBpbWFnZSBkb2Vzbid0IGhhdmUgYW4gZW1iZWRkZWQgY29sb3Igc3BhY2UuCisgIC8vIFRoaXMgaXMgYmVjYXVzZSB3ZSBkb24ndCBjdXJyZW50bHkgc2VuZCB0aGUgZW1iZWRkZWQgY29sb3IgcHJvZmlsZSB3aXRoIHRoZQorICAvLyBkZWNvZGUgcmVxdWVzdC4KKyAgaWYgKGltYWdlX21ldGFkYXRhLT5oYXNfZW1iZWRkZWRfY29sb3JfcHJvZmlsZSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgc3RhdGljX2Fzc2VydChzdGF0aWNfY2FzdDxpbnQ+KEltYWdlRGVjb2RlQWNjZWxlcmF0b3JUeXBlOjprTWF4VmFsdWUpID09IDIsCisgICAgICAgICAgICAgICAgIklzSW1hZ2VTdXBwb3J0ZWQoKSBtdXN0IGJlIGFkYXB0ZWQgdG8gc3VwcG9ydCBhbGwgaW1hZ2UgdHlwZXMgIgorICAgICAgICAgICAgICAgICJpbiBJbWFnZURlY29kZUFjY2VsZXJhdG9yVHlwZSIpOworICBJbWFnZURlY29kZUFjY2VsZXJhdG9yVHlwZSBpbWFnZV90eXBlID0gSW1hZ2VEZWNvZGVBY2NlbGVyYXRvclR5cGU6OmtVbmtub3duOworICBzd2l0Y2ggKGltYWdlX21ldGFkYXRhLT5pbWFnZV90eXBlKSB7CisgICAgY2FzZSBjYzo6SW1hZ2VUeXBlOjprSlBFRzoKKyAgICAgIGltYWdlX3R5cGUgPSBJbWFnZURlY29kZUFjY2VsZXJhdG9yVHlwZTo6a0pwZWc7CisgICAgICBicmVhazsKKyAgICBjYXNlIGNjOjpJbWFnZVR5cGU6OmtXRUJQOgorICAgICAgaW1hZ2VfdHlwZSA9IEltYWdlRGVjb2RlQWNjZWxlcmF0b3JUeXBlOjprV2ViUDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKwogICAvLyBGaW5kIHRoZSBpbWFnZSBkZWNvZGUgYWNjZWxlcmF0b3Igc3VwcG9ydGVkIHByb2ZpbGUgYWNjb3JkaW5nIHRvIHRoZSB0eXBlCiAgIC8vIG9mIHRoZSBpbWFnZS4KICAgY29uc3Qgc3RkOjp2ZWN0b3I8SW1hZ2VEZWNvZGVBY2NlbGVyYXRvclN1cHBvcnRlZFByb2ZpbGU+JiBwcm9maWxlcyA9CkBAIC0xNzgsMTQgKzE0MCwyMCBAQAogICBpZiAocHJvZmlsZV9pdCA9PSBwcm9maWxlcy5jZW5kKCkpCiAgICAgcmV0dXJuIGZhbHNlOwogCisgIC8vIFZlcmlmeSB0aGF0IHRoZSBpbWFnZSBzaXplIGlzIHN1cHBvcnRlZC4KKyAgaWYgKCFJc1N1cHBvcnRlZEltYWdlU2l6ZShpbWFnZV9tZXRhZGF0YSwgKnByb2ZpbGVfaXQpKQorICAgIHJldHVybiBmYWxzZTsKKwogICAvLyBWYWxpZGF0ZSB0aGUgaW1hZ2UgYWNjb3JkaW5nIHRvIHRoYXQgcHJvZmlsZS4KICAgc3dpdGNoIChpbWFnZV90eXBlKSB7CiAgICAgY2FzZSBJbWFnZURlY29kZUFjY2VsZXJhdG9yVHlwZTo6a0pwZWc6Ci0gICAgICByZXR1cm4gSXNTdXBwb3J0ZWRKcGVnSW1hZ2UoZW5jb2RlZF9kYXRhLCAqcHJvZmlsZV9pdCk7CisgICAgICByZXR1cm4gSXNTdXBwb3J0ZWRKcGVnSW1hZ2UoaW1hZ2VfbWV0YWRhdGEsICpwcm9maWxlX2l0KTsKICAgICBjYXNlIEltYWdlRGVjb2RlQWNjZWxlcmF0b3JUeXBlOjprV2ViUDoKLSAgICAgIHJldHVybiBJc1N1cHBvcnRlZFdlYlBJbWFnZShlbmNvZGVkX2RhdGEsICpwcm9maWxlX2l0KTsKKyAgICAgIERDSEVDSyhpbWFnZV9tZXRhZGF0YS0+d2VicF9pc19ub25fZXh0ZW5kZWRfbG9zc3kuaGFzX3ZhbHVlKCkpOworICAgICAgcmV0dXJuIGltYWdlX21ldGFkYXRhLT53ZWJwX2lzX25vbl9leHRlbmRlZF9sb3NzeS52YWx1ZSgpOwogICAgIGNhc2UgSW1hZ2VEZWNvZGVBY2NlbGVyYXRvclR5cGU6OmtVbmtub3duOgotICAgICAgLy8gTm8gT3AuIFNob3VsZCBub3QgcmVhY2ggZHVlIHRvIGEgY2hlY2sgYWJvdmUuCisgICAgICAvLyBTaG91bGQgbm90IHJlYWNoIGR1ZSB0byBhIGNoZWNrIGFib3ZlLgorICAgICAgTk9UUkVBQ0hFRCgpOwogICAgICAgYnJlYWs7CiAgIH0KICAgcmV0dXJuIGZhbHNlOwpAQCAtMjI0LDcgKzE5Miw2IEBACiAgIERDSEVDSyhob3N0Xyk7CiAgIERDSEVDS19FUShob3N0Xy0+Y2hhbm5lbF9pZCgpLAogICAgICAgICAgICAgQ2hhbm5lbElkRnJvbUNvbW1hbmRCdWZmZXJJZChyYXN0ZXJfZGVjb2Rlcl9jb21tYW5kX2J1ZmZlcl9pZCkpOwotICBEQ0hFQ0soSXNJbWFnZVN1cHBvcnRlZChlbmNvZGVkX2RhdGEpKTsKIAogICBHcHVDaGFubmVsTXNnX1NjaGVkdWxlSW1hZ2VEZWNvZGVfUGFyYW1zIHBhcmFtczsKICAgcGFyYW1zLmVuY29kZWRfZGF0YSA9CmRpZmYgLS1naXQgYS9ncHUvaXBjL2NsaWVudC9pbWFnZV9kZWNvZGVfYWNjZWxlcmF0b3JfcHJveHkuaCBiL2dwdS9pcGMvY2xpZW50L2ltYWdlX2RlY29kZV9hY2NlbGVyYXRvcl9wcm94eS5oCmluZGV4IDM4ZDAyMWUuLmE0N2RmNWQgMTAwNjQ0Ci0tLSBhL2dwdS9pcGMvY2xpZW50L2ltYWdlX2RlY29kZV9hY2NlbGVyYXRvcl9wcm94eS5oCisrKyBiL2dwdS9pcGMvY2xpZW50L2ltYWdlX2RlY29kZV9hY2NlbGVyYXRvcl9wcm94eS5oCkBAIC01MCwxMSArNTAsMTIgQEAKICAgSW1hZ2VEZWNvZGVBY2NlbGVyYXRvclByb3h5KEdwdUNoYW5uZWxIb3N0KiBob3N0LCBpbnQzMl90IHJvdXRlX2lkKTsKICAgfkltYWdlRGVjb2RlQWNjZWxlcmF0b3JQcm94eSgpIG92ZXJyaWRlOwogCi0gIC8vIERldGVybWluZXMgaWYgYW4gZW5jb2RlZCBpbWFnZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIGhhcmR3YXJlIGFjY2VsZXJhdG9yLgotICAvLyBUaGUgU2NoZWR1bGVJbWFnZURlY29kZSgpIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgZm9yIGltYWdlcyBmb3Igd2hpY2gKLSAgLy8gSXNJbWFnZVN1cHBvcnRlZCgpIHJldHVybnMgdHJ1ZS4gT3RoZXJ3aXNlLCB0aGUgY2xpZW50IGZhY2VzIGEgR1BVIGNoYW5uZWwKLSAgLy8gdGVhcmRvd24gaWYgdGhlIGRlY29kZSBmYWlscy4KLSAgYm9vbCBJc0ltYWdlU3VwcG9ydGVkKGJhc2U6OnNwYW48Y29uc3QgdWludDhfdD4gZW5jb2RlZF9kYXRhKSBjb25zdCBvdmVycmlkZTsKKyAgLy8gRGV0ZXJtaW5lcyBpZiB8aW1hZ2VfbWV0YWRhdGF8IGNvcnJlc3BvbmRzIHRvIGFuIGltYWdlIHRoYXQgY2FuIGJlIGRlY29kZWQKKyAgLy8gdXNpbmcgaGFyZHdhcmUgZGVjb2RlIGFjY2VsZXJhdGlvbi4gVGhlIFNjaGVkdWxlSW1hZ2VEZWNvZGUoKSBtZXRob2Qgc2hvdWxkCisgIC8vIG9ubHkgYmUgY2FsbGVkIGZvciBpbWFnZXMgZm9yIHdoaWNoIElzSW1hZ2VTdXBwb3J0ZWQoKSByZXR1cm5zIHRydWUuCisgIC8vIE90aGVyd2lzZSwgdGhlIGNsaWVudCBmYWNlcyBhIEdQVSBjaGFubmVsIHRlYXJkb3duIGlmIHRoZSBkZWNvZGUgZmFpbHMuCisgIGJvb2wgSXNJbWFnZVN1cHBvcnRlZCgKKyAgICAgIGNvbnN0IGNjOjpJbWFnZUhlYWRlck1ldGFkYXRhKiBpbWFnZV9tZXRhZGF0YSkgY29uc3Qgb3ZlcnJpZGU7CiAKICAgLy8gRGV0ZXJtaW5lcyBpZiBoYXJkd2FyZSBkZWNvZGUgYWNjZWxlcmF0aW9uIGlzIHN1cHBvcnRlZCBmb3IgSlBFRyBpbWFnZXMuCiAgIGJvb2wgSXNKcGVnRGVjb2RlQWNjZWxlcmF0aW9uU3VwcG9ydGVkKCkgY29uc3Qgb3ZlcnJpZGU7CmRpZmYgLS1naXQgYS9ncHUvaXBjL2NvbW1vbi9ncHVfbWVtb3J5X2J1ZmZlcl9pbXBsX3Rlc3RfdGVtcGxhdGUuaCBiL2dwdS9pcGMvY29tbW9uL2dwdV9tZW1vcnlfYnVmZmVyX2ltcGxfdGVzdF90ZW1wbGF0ZS5oCmluZGV4IDI5N2ExNTkuLjkwN2I1NWMgMTAwNjQ0Ci0tLSBhL2dwdS9pcGMvY29tbW9uL2dwdV9tZW1vcnlfYnVmZmVyX2ltcGxfdGVzdF90ZW1wbGF0ZS5oCisrKyBiL2dwdS9pcGMvY29tbW9uL2dwdV9tZW1vcnlfYnVmZmVyX2ltcGxfdGVzdF90ZW1wbGF0ZS5oCkBAIC0xNCw3ICsxNCw3IEBACiAjaW5jbHVkZSA8bWVtb3J5PgogCiAjaW5jbHVkZSAiYmFzZS9iaW5kLmgiCi0jaW5jbHVkZSAiYmFzZS90YXNrL3NpbmdsZV90aHJlYWRfdGFza19leGVjdXRvci5oIgorI2luY2x1ZGUgImJhc2UvdGVzdC90YXNrX2Vudmlyb25tZW50LmgiCiAjaW5jbHVkZSAiYnVpbGQvYnVpbGRfY29uZmlnLmgiCiAjaW5jbHVkZSAiZ3B1L2lwYy9jb21tb24vZ3B1X21lbW9yeV9idWZmZXJfc3VwcG9ydC5oIgogI2luY2x1ZGUgIm1vam8vcHVibGljL2NwcC9iYXNlL3NoYXJlZF9tZW1vcnlfbW9qb21fdHJhaXRzLmgiCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSAidWkvZ2Z4L2J1ZmZlcl9mb3JtYXRfdXRpbC5oIgogI2luY2x1ZGUgInVpL2dmeC9tb2pvbS9idWZmZXJfdHlwZXNfbW9qb21fdHJhaXRzLmgiCiAKLSNpZiBkZWZpbmVkKE9TX1dJTikKKyNpZiBkZWZpbmVkKE9TX1dJTikgfHwgZGVmaW5lZChVU0VfT1pPTkUpCiAjaW5jbHVkZSAidWkvZ2wvaW5pdC9nbF9mYWN0b3J5LmgiCiAjaW5jbHVkZSAidWkvZ2wvdGVzdC9nbF9zdXJmYWNlX3Rlc3Rfc3VwcG9ydC5oIgogI2VuZGlmCkBAIC01MCwxMiArNTAsMTYgQEAKICAgICByZXR1cm4gJmdwdV9tZW1vcnlfYnVmZmVyX3N1cHBvcnRfOwogICB9CiAKLSNpZiBkZWZpbmVkKE9TX1dJTikKKyNpZiBkZWZpbmVkKE9TX1dJTikgfHwgZGVmaW5lZChVU0VfT1pPTkUpCiAgIC8vIE92ZXJyaWRkZW4gZnJvbSB0ZXN0aW5nOjpUZXN0OgogICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeyBnbDo6R0xTdXJmYWNlVGVzdFN1cHBvcnQ6OkluaXRpYWxpemVPbmVPZmYoKTsgfQogICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeyBnbDo6aW5pdDo6U2h1dGRvd25HTChmYWxzZSk7IH0KICNlbmRpZgogCisgcHJvdGVjdGVkOgorICBiYXNlOjp0ZXN0OjpUYXNrRW52aXJvbm1lbnQgdGFza19lbnZpcm9ubWVudF97CisgICAgICBiYXNlOjp0ZXN0OjpUYXNrRW52aXJvbm1lbnQ6Ok1haW5UaHJlYWRUeXBlOjpVSX07CisKICBwcml2YXRlOgogICBHcHVNZW1vcnlCdWZmZXJTdXBwb3J0IGdwdV9tZW1vcnlfYnVmZmVyX3N1cHBvcnRfOwogCkBAIC0yOTcsNyArMzAxLDYgQEAKIH0KIAogVFlQRURfVEVTVF9QKEdwdU1lbW9yeUJ1ZmZlckltcGxUZXN0LCBTZXJpYWxpemVBbmREZXNlcmlhbGl6ZSkgewotICBiYXNlOjpTaW5nbGVUaHJlYWRUYXNrRXhlY3V0b3IgbWFpbl90YXNrX2V4ZWN1dG9yOwogICBjb25zdCBnZng6OlNpemUga0J1ZmZlclNpemUoOCwgOCk7CiAgIGNvbnN0IGdmeDo6R3B1TWVtb3J5QnVmZmVyVHlwZSBrQnVmZmVyVHlwZSA9IFR5cGVQYXJhbTo6a0J1ZmZlclR5cGU7CiAKZGlmZiAtLWdpdCBhL2dwdS9pcGMvc2VydmljZS9CVUlMRC5nbiBiL2dwdS9pcGMvc2VydmljZS9CVUlMRC5nbgppbmRleCA5Njg1MWEzNjMuLjA4MmFjOTMgMTAwNjQ0Ci0tLSBhL2dwdS9pcGMvc2VydmljZS9CVUlMRC5nbgorKysgYi9ncHUvaXBjL3NlcnZpY2UvQlVJTEQuZ24KQEAgLTE1MCw2ICsxNTAsNyBAQAogICAgICIvL3Rlc3RpbmcvZ3Rlc3Q6Z3Rlc3QiLAogICBdCiAgIGRlcHMgPSBbCisgICAgIi8vYmFzZS90ZXN0OnRlc3Rfc3VwcG9ydCIsCiAgICAgIi8vZ3B1L2lwYy9jb21tb24iLAogICAgICIvL3VpL2dsOnRlc3Rfc3VwcG9ydCIsCiAgIF0KZGlmZiAtLWdpdCBhL2dwdS9pcGMvc2VydmljZS9ncHVfbWVtb3J5X2J1ZmZlcl9mYWN0b3J5X3Rlc3RfdGVtcGxhdGUuaCBiL2dwdS9pcGMvc2VydmljZS9ncHVfbWVtb3J5X2J1ZmZlcl9mYWN0b3J5X3Rlc3RfdGVtcGxhdGUuaAppbmRleCAzNDIyN2FjLi45MDBmZDJhNiAxMDA2NDQKLS0tIGEvZ3B1L2lwYy9zZXJ2aWNlL2dwdV9tZW1vcnlfYnVmZmVyX2ZhY3RvcnlfdGVzdF90ZW1wbGF0ZS5oCisrKyBiL2dwdS9pcGMvc2VydmljZS9ncHVfbWVtb3J5X2J1ZmZlcl9mYWN0b3J5X3Rlc3RfdGVtcGxhdGUuaApAQCAtOCwxNCArOCwxNSBAQAogI2lmbmRlZiBHUFVfSVBDX1NFUlZJQ0VfR1BVX01FTU9SWV9CVUZGRVJfRkFDVE9SWV9URVNUX1RFTVBMQVRFX0hfCiAjZGVmaW5lIEdQVV9JUENfU0VSVklDRV9HUFVfTUVNT1JZX0JVRkZFUl9GQUNUT1JZX1RFU1RfVEVNUExBVEVfSF8KIAorI2luY2x1ZGUgImJhc2UvdGVzdC90YXNrX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiYnVpbGQvYnVpbGRfY29uZmlnLmgiCiAjaW5jbHVkZSAiZ3B1L2lwYy9jb21tb24vZ3B1X21lbW9yeV9idWZmZXJfc3VwcG9ydC5oIgogI2luY2x1ZGUgImdwdS9pcGMvc2VydmljZS9ncHVfbWVtb3J5X2J1ZmZlcl9mYWN0b3J5LmgiCiAjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCiAjaW5jbHVkZSAidWkvZ2Z4L2J1ZmZlcl9mb3JtYXRfdXRpbC5oIgogCi0jaWYgZGVmaW5lZChPU19XSU4pCisjaWYgZGVmaW5lZChPU19XSU4pIHx8IGRlZmluZWQoVVNFX09aT05FKQogI2luY2x1ZGUgImJhc2UvY29tbWFuZF9saW5lLmgiCi0jaW5jbHVkZSAiYnVpbGQvYnVpbGRfY29uZmlnLmgiCiAjaW5jbHVkZSAidWkvZ2wvZ2xfc3dpdGNoZXMuaCIKICNpbmNsdWRlICJ1aS9nbC9pbml0L2dsX2ZhY3RvcnkuaCIKICNpbmNsdWRlICJ1aS9nbC90ZXN0L2dsX3N1cmZhY2VfdGVzdF9zdXBwb3J0LmgiCkBAIC0yNiwxOCArMjcsMjMgQEAKIHRlbXBsYXRlIDx0eXBlbmFtZSBHcHVNZW1vcnlCdWZmZXJGYWN0b3J5VHlwZT4KIGNsYXNzIEdwdU1lbW9yeUJ1ZmZlckZhY3RvcnlUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewogIHB1YmxpYzoKLSNpZiBkZWZpbmVkKE9TX1dJTikKKyNpZiBkZWZpbmVkKE9TX1dJTikgfHwgZGVmaW5lZChVU0VfT1pPTkUpCiAgIC8vIE92ZXJyaWRkZW4gZnJvbSB0ZXN0aW5nOjpUZXN0OgogICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworI2lmIGRlZmluZWQoT1NfV0lOKQogICAgIC8vIFRoaXMgdGVzdCBvbmx5IHdvcmtzIHdpdGggaGFyZHdhcmUgcmVuZGVyaW5nLgogICAgIERDSEVDSyhiYXNlOjpDb21tYW5kTGluZTo6Rm9yQ3VycmVudFByb2Nlc3MoKS0+SGFzU3dpdGNoKAogICAgICAgICBzd2l0Y2hlczo6a1VzZUdwdUluVGVzdHMpKTsKKyNlbmRpZgogICAgIGdsOjpHTFN1cmZhY2VUZXN0U3VwcG9ydDo6SW5pdGlhbGl6ZU9uZU9mZigpOwogICB9CiAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7IGdsOjppbml0OjpTaHV0ZG93bkdMKGZhbHNlKTsgfQotI2VuZGlmCisjZW5kaWYgIC8vIGRlZmluZWQoT1NfV0lOKSB8fCBkZWZpbmVkKFVTRV9PWk9ORSkKIAogIHByb3RlY3RlZDoKKyAgYmFzZTo6dGVzdDo6VGFza0Vudmlyb25tZW50IHRhc2tfZW52aXJvbm1lbnRfeworICAgICAgYmFzZTo6dGVzdDo6VGFza0Vudmlyb25tZW50OjpNYWluVGhyZWFkVHlwZTo6VUl9OworCiAgIEdwdU1lbW9yeUJ1ZmZlckZhY3RvcnlUeXBlIGZhY3RvcnlfOwogfTsKIApkaWZmIC0tZ2l0IGEvaW9zL2J1aWxkL2JvdHMvc2NyaXB0cy90ZXN0X3J1bm5lci5weSBiL2lvcy9idWlsZC9ib3RzL3NjcmlwdHMvdGVzdF9ydW5uZXIucHkKaW5kZXggYjQ0NGZmOTI0Li4wMWRjNjFmIDEwMDY0NAotLS0gYS9pb3MvYnVpbGQvYm90cy9zY3JpcHRzL3Rlc3RfcnVubmVyLnB5CisrKyBiL2lvcy9idWlsZC9ib3RzL3NjcmlwdHMvdGVzdF9ydW5uZXIucHkKQEAgLTEwODMsNiArMTA4MywxMiBAQAogICAgIGZvciB0ZXN0X2FyZyBpbiBzZWxmLnRlc3RfYXJnczoKICAgICAgIGNtZC5leHRlbmQoWyctYycsIHRlc3RfYXJnXSkKIAorICAgICAgIyBJZiAtLXJ1bi13aXRoLWN1c3RvbS13ZWJraXQgaXMgcGFzc2VkIGFzIGEgdGVzdCBhcmcsIHNldAorICAgICAgIyBEWUxEX0ZSQU1FV09SS19QQVRIIHRvIHBvaW50IHRvIHRoZSBlbWJlZGRlZCBjdXN0b20gd2Via2l0IGZyYW1ld29ya3MuCisgICAgICBpZiB0ZXN0X2FyZyA9PSAnLS1ydW4td2l0aC1jdXN0b20td2Via2l0JzoKKyAgICAgICAgY21kLmV4dGVuZChbJy1lJywgJ0RZTERfRlJBTUVXT1JLX1BBVEg9JyArCisgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihzZWxmLmFwcF9wYXRoLCAnV2ViS2l0RnJhbWV3b3JrcycpXSkKKwogICAgIGlmIHNlbGYueGN0ZXN0X3BhdGg6CiAgICAgICBzZWxmLnNoYXJkaW5nX2NtZCA9IGNtZFs6XQogICAgICAgaWYgdGVzdF9maWx0ZXI6CmRpZmYgLS1naXQgYS9pb3MvYnVpbGQvYm90cy9zY3JpcHRzL3hjb2RlYnVpbGRfcnVubmVyLnB5IGIvaW9zL2J1aWxkL2JvdHMvc2NyaXB0cy94Y29kZWJ1aWxkX3J1bm5lci5weQppbmRleCA0ZDA3NWZlLi5lMGEwZDE0IDEwMDY0NAotLS0gYS9pb3MvYnVpbGQvYm90cy9zY3JpcHRzL3hjb2RlYnVpbGRfcnVubmVyLnB5CisrKyBiL2lvcy9idWlsZC9ib3RzL3NjcmlwdHMveGNvZGVidWlsZF9ydW5uZXIucHkKQEAgLTE3NSw2ICsxNzUsMTcgQEAKICAgICAgIEEgbm9kZSB3aXRoIGZpbGxlZCByZXF1aXJlZCBmaWVsZHMgYWJvdXQgZWd0ZXN0cy4KICAgICAiIiIKICAgICBtb2R1bGUgPSBzZWxmLm1vZHVsZV9uYW1lICsgJ19tb2R1bGUnCisKKyAgICAjIElmIC0tcnVuLXdpdGgtY3VzdG9tLXdlYmtpdCBpcyBwYXNzZWQgYXMgYSB0ZXN0IGFyZywgc2V0IHVwCisgICAgIyBEWUxEX0ZSQU1FV09SS19QQVRIIHRvIGxvYWQgdGhlIGN1c3RvbSB3ZWJraXQgbW9kdWxlcy4KKyAgICBkeWxkX2ZyYW1ld29ya19wYXRoID0gc2VsZi5wcm9qZWN0X3BhdGggKyAnOicKKyAgICBpZiAnLS1ydW4td2l0aC1jdXN0b20td2Via2l0JyBpbiBzZWxmLnRlc3RfYXJnczoKKyAgICAgIGlmIHNlbGYuaG9zdF9hcHBfcGF0aDoKKyAgICAgICAgd2Via2l0X3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5ob3N0X2FwcF9wYXRoLCAnV2ViS2l0RnJhbWV3b3JrcycpCisgICAgICBlbHNlOgorICAgICAgICB3ZWJraXRfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLmVndGVzdHNfcGF0aCwgJ1dlYktpdEZyYW1ld29ya3MnKQorICAgICAgZHlsZF9mcmFtZXdvcmtfcGF0aCA9IGR5bGRfZnJhbWV3b3JrX3BhdGggKyB3ZWJraXRfcGF0aCArICc6JworCiAgICAgbW9kdWxlX2RhdGEgPSB7CiAgICAgICAgICdUZXN0QnVuZGxlUGF0aCc6ICdfX1RFU1RIT1NUX18lcycgJSBzZWxmLl94Y3Rlc3RfcGF0aCgpLAogICAgICAgICAnVGVzdEhvc3RQYXRoJzogJyVzJyAlIHNlbGYuZWd0ZXN0c19wYXRoLApAQCAtMTgzLDcgKzE5NCw3IEBACiAgICAgICAgICAgICAgICAgJ19fUExBVEZPUk1TX18vaVBob25lU2ltdWxhdG9yLnBsYXRmb3JtL0RldmVsb3Blci8nCiAgICAgICAgICAgICAgICAgJ3Vzci9saWIvbGliWENUZXN0QnVuZGxlSW5qZWN0LmR5bGliJyksCiAgICAgICAgICAgICAnRFlMRF9MSUJSQVJZX1BBVEgnOiBzZWxmLnByb2plY3RfcGF0aCwKLSAgICAgICAgICAgICdEWUxEX0ZSQU1FV09SS19QQVRIJzogc2VsZi5wcm9qZWN0X3BhdGggKyAnOicsCisgICAgICAgICAgICAnRFlMRF9GUkFNRVdPUktfUEFUSCc6IGR5bGRfZnJhbWV3b3JrX3BhdGgsCiAgICAgICAgICAgICAnWENJbmplY3RCdW5kbGVJbnRvJzogJ19fVEVTVEhPU1RfXy8lcycgJSBzZWxmLm1vZHVsZV9uYW1lCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2lvcy9jaHJvbWUvYXBwL0JVSUxELmduIGIvaW9zL2Nocm9tZS9hcHAvQlVJTEQuZ24KaW5kZXggMjI0MThkNy4uNDI3OGUwYSAxMDA2NDQKLS0tIGEvaW9zL2Nocm9tZS9hcHAvQlVJTEQuZ24KKysrIGIvaW9zL2Nocm9tZS9hcHAvQlVJTEQuZ24KQEAgLTI3OCwxMCArMjc4LDggQEAKICAgICAiTWVkaWFQbGF5ZXIuZnJhbWV3b3JrIiwKICAgXQogCi0gIGFsbG93X2NpcmN1bGFyX2luY2x1ZGVzX2Zyb20gPSBbCi0gICAgIi8vaW9zL2Nocm9tZS9hcHAvYXBwbGljYXRpb25fZGVsZWdhdGU6YXBwbGljYXRpb25fZGVsZWdhdGVfaW50ZXJuYWwiLAotICAgICIvL2lvcy9jaHJvbWUvYnJvd3Nlci91aS9tYWluOnNjZW5lIiwKLSAgXQorICBhbGxvd19jaXJjdWxhcl9pbmNsdWRlc19mcm9tID0KKyAgICAgIFsgIi8vaW9zL2Nocm9tZS9hcHAvYXBwbGljYXRpb25fZGVsZWdhdGU6YXBwbGljYXRpb25fZGVsZWdhdGVfaW50ZXJuYWwiIF0KIH0KIAogc291cmNlX3NldCgibW9kZSIpIHsKZGlmZiAtLWdpdCBhL2lvcy9jaHJvbWUvYXBwL21haW5fYXBwbGljYXRpb25fZGVsZWdhdGUubW0gYi9pb3MvY2hyb21lL2FwcC9tYWluX2FwcGxpY2F0aW9uX2RlbGVnYXRlLm1tCmluZGV4IDdkYWFlNWIuLjg2MjE4YTggMTAwNjQ0Ci0tLSBhL2lvcy9jaHJvbWUvYXBwL21haW5fYXBwbGljYXRpb25fZGVsZWdhdGUubW0KKysrIGIvaW9zL2Nocm9tZS9hcHAvbWFpbl9hcHBsaWNhdGlvbl9kZWxlZ2F0ZS5tbQpAQCAtOTIsMTEgKzkyLDE0IEBACiB9CiAKIC0gKFVJV2luZG93Kil3aW5kb3cgewotICByZXR1cm4gc2VsZi5zY2VuZVN0YXRlLndpbmRvdzsKKyAgcmV0dXJuIFtfbWFpbkNvbnRyb2xsZXIgd2luZG93XTsKIH0KIAogLSAodm9pZClzZXRXaW5kb3c6KFVJV2luZG93KiluZXdXaW5kb3cgewotICBOT1RSRUFDSEVEKCkgPDwgIlNob3VsZCBub3QgYmUgY2FsbGVkLCB1c2UgW1NjZW5lU3RhdGUgd2luZG93XSBpbnN0ZWFkIjsKKyAgRENIRUNLKG5ld1dpbmRvdyk7CisgIFtfbWFpbkNvbnRyb2xsZXIgc2V0V2luZG93Om5ld1dpbmRvd107CisgIC8vIHNlbGYud2luZG93IGhhcyBiZWVuIHNldCBieSB0aGlzIHRpbWUuIF9hcHBTdGF0ZSB3aW5kb3cgY2FuIG5vdyBiZSBzZXQuCisgIFtfYXBwU3RhdGUgc2V0V2luZG93Om5ld1dpbmRvd107CiB9CiAKICNwcmFnbWEgbWFyayAtIFVJQXBwbGljYXRpb25EZWxlZ2F0ZSBtZXRob2RzIC0KQEAgLTExMCwxMCArMTEzLDkgQEAKIC0gKEJPT0wpYXBwbGljYXRpb246KFVJQXBwbGljYXRpb24qKWFwcGxpY2F0aW9uCiAgICAgZGlkRmluaXNoTGF1bmNoaW5nV2l0aE9wdGlvbnM6KE5TRGljdGlvbmFyeSopbGF1bmNoT3B0aW9ucyB7CiAgIHN0YXJ0dXBfbG9nZ2Vyczo6UmVnaXN0ZXJBcHBEaWRGaW5pc2hMYXVuY2hpbmdUaW1lKCk7Ci0KLSAgX21haW5Db250cm9sbGVyLndpbmRvdyA9IHNlbGYud2luZG93OwotICAvLyBzZWxmLndpbmRvdyBoYXMgYmVlbiBzZXQgYnkgdGhpcyB0aW1lLiBfYXBwU3RhdGUgd2luZG93IGNhbiBub3cgYmUgc2V0LgotICBfYXBwU3RhdGUud2luZG93ID0gc2VsZi53aW5kb3c7CisgIC8vIE1haW4gd2luZG93IG11c3QgYmUgQ2hyb21lT3ZlcmxheVdpbmRvdyBvciBhIHN1YmNsYXNzIG9mIGl0LgorICBzZWxmLndpbmRvdyA9IFtbQ2hyb21lT3ZlcmxheVdpbmRvdyBhbGxvY10KKyAgICAgIGluaXRXaXRoRnJhbWU6W1tVSVNjcmVlbiBtYWluU2NyZWVuXSBib3VuZHNdXTsKIAogICBCT09MIGluQmFja2dyb3VuZCA9CiAgICAgICBbYXBwbGljYXRpb24gYXBwbGljYXRpb25TdGF0ZV0gPT0gVUlBcHBsaWNhdGlvblN0YXRlQmFja2dyb3VuZDsKZGlmZiAtLWdpdCBhL2lvcy9jaHJvbWUvYnJvd3Nlci91aS9icm93c2VyX3ZpZXcvYnJvd3Nlcl9jb29yZGluYXRvci5tbSBiL2lvcy9jaHJvbWUvYnJvd3Nlci91aS9icm93c2VyX3ZpZXcvYnJvd3Nlcl9jb29yZGluYXRvci5tbQppbmRleCBhZThjNzBmMi4uNjljZjY0YmIgMTAwNjQ0Ci0tLSBhL2lvcy9jaHJvbWUvYnJvd3Nlci91aS9icm93c2VyX3ZpZXcvYnJvd3Nlcl9jb29yZGluYXRvci5tbQorKysgYi9pb3MvY2hyb21lL2Jyb3dzZXIvdWkvYnJvd3Nlcl92aWV3L2Jyb3dzZXJfY29vcmRpbmF0b3IubW0KQEAgLTUyLDcgKzUyLDYgQEAKICNpbmNsdWRlICJpb3MvY2hyb21lL2Jyb3dzZXIvd2ViX3N0YXRlX2xpc3Qvd2ViX3N0YXRlX2xpc3QuaCIKICNpbXBvcnQgImlvcy9jaHJvbWUvYnJvd3Nlci93ZWJfc3RhdGVfbGlzdC93ZWJfc3RhdGVfbGlzdF9vYnNlcnZlcl9icmlkZ2UuaCIKICNpbmNsdWRlICJpb3MvY2hyb21lL2dyaXQvaW9zX3N0cmluZ3MuaCIKLSNpbmNsdWRlICJuZXQvdXJsX3JlcXVlc3QvdXJsX3JlcXVlc3RfY29udGV4dF9nZXR0ZXIuaCIKICNpbmNsdWRlICJ1aS9iYXNlL2wxMG4vbDEwbl91dGlsX21hYy5oIgogCiAjaWYgIWRlZmluZWQoX19oYXNfZmVhdHVyZSkgfHwgIV9faGFzX2ZlYXR1cmUob2JqY19hcmMpCkBAIC0zMjQsOCArMzIzLDcgQEAKICAgICAgIGluaXRXaXRoQmFzZVZpZXdDb250cm9sbGVyOnNlbGYudmlld0NvbnRyb2xsZXJdOwogICBzZWxmLnBhc3N3b3JkQnJlYWNoQ29vcmRpbmF0b3IuZGlzcGF0Y2hlciA9IHNlbGYuZGlzcGF0Y2hlcjsKIAotICBzZWxmLnByaW50Q29udHJvbGxlciA9IFtbUHJpbnRDb250cm9sbGVyIGFsbG9jXQotICAgICAgaW5pdFdpdGhDb250ZXh0R2V0dGVyOnNlbGYuYnJvd3NlclN0YXRlLT5HZXRSZXF1ZXN0Q29udGV4dCgpXTsKKyAgc2VsZi5wcmludENvbnRyb2xsZXIgPSBbW1ByaW50Q29udHJvbGxlciBhbGxvY10gaW5pdF07CiAKICAgc2VsZi5xclNjYW5uZXJDb29yZGluYXRvciA9IFtbUVJTY2FubmVyTGVnYWN5Q29vcmRpbmF0b3IgYWxsb2NdCiAgICAgICBpbml0V2l0aEJhc2VWaWV3Q29udHJvbGxlcjpzZWxmLnZpZXdDb250cm9sbGVyXTsKZGlmZiAtLWdpdCBhL2lvcy9jaHJvbWUvYnJvd3Nlci91aS9tYWluL0JVSUxELmduIGIvaW9zL2Nocm9tZS9icm93c2VyL3VpL21haW4vQlVJTEQuZ24KaW5kZXggM2JmZmZmNS4uZGUxNTYzMyAxMDA2NDQKLS0tIGEvaW9zL2Nocm9tZS9icm93c2VyL3VpL21haW4vQlVJTEQuZ24KKysrIGIvaW9zL2Nocm9tZS9icm93c2VyL3VpL21haW4vQlVJTEQuZ24KQEAgLTIxLDcgKzIxLDYgQEAKICAgICAiLy9pb3MvY2hyb21lL2Jyb3dzZXIvdGFiczp0YWJzIiwKICAgICAiLy9pb3MvY2hyb21lL2Jyb3dzZXIvdWkvY29tbWFuZHM6Y29tbWFuZHMiLAogICAgICIvL2lvcy9jaHJvbWUvYnJvd3Nlci91aS90YWJfZ3JpZCIsCi0gICAgIi8vaW9zL2Nocm9tZS9icm93c2VyL3VpL3V0aWw6bXVsdGl3aW5kb3dfdXRpbCIsCiAgIF0KIAogICBsaWJzID0gWyAiVUlLaXQuZnJhbWV3b3JrIiBdCmRpZmYgLS1naXQgYS9pb3MvY2hyb21lL2Jyb3dzZXIvdWkvbWFpbi9zY2VuZV9jb250cm9sbGVyLm1tIGIvaW9zL2Nocm9tZS9icm93c2VyL3VpL21haW4vc2NlbmVfY29udHJvbGxlci5tbQppbmRleCBhZTI0MjYxLi45NDMwYjVlYiAxMDA2NDQKLS0tIGEvaW9zL2Nocm9tZS9icm93c2VyL3VpL21haW4vc2NlbmVfY29udHJvbGxlci5tbQorKysgYi9pb3MvY2hyb21lL2Jyb3dzZXIvdWkvbWFpbi9zY2VuZV9jb250cm9sbGVyLm1tCkBAIC00LDEwICs0LDYgQEAKIAogI2ltcG9ydCAiaW9zL2Nocm9tZS9icm93c2VyL3VpL21haW4vc2NlbmVfY29udHJvbGxlci5oIgogCi0jaW1wb3J0ICJiYXNlL2xvZ2dpbmcuaCIKLSNpbXBvcnQgImlvcy9jaHJvbWUvYXBwL2Nocm9tZV9vdmVybGF5X3dpbmRvdy5oIgotI2ltcG9ydCAiaW9zL2Nocm9tZS9icm93c2VyL3VpL3V0aWwvbXVsdGlfd2luZG93X3N1cHBvcnQuaCIKLQogI2lmICFkZWZpbmVkKF9faGFzX2ZlYXR1cmUpIHx8ICFfX2hhc19mZWF0dXJlKG9iamNfYXJjKQogI2Vycm9yICJUaGlzIGZpbGUgcmVxdWlyZXMgQVJDIHN1cHBvcnQuIgogI2VuZGlmCkBAIC0xOSwxNCArMTUsNiBAQAogICBpZiAoc2VsZikgewogICAgIF9zY2VuZVN0YXRlID0gc2NlbmVTdGF0ZTsKICAgICBbX3NjZW5lU3RhdGUgYWRkT2JzZXJ2ZXI6c2VsZl07Ci0gICAgLy8gVGhlIHdpbmRvdyBpcyBuZWNlc3NhcnkgdmVyeSBlYXJseSBpbiB0aGUgYXBwL3NjZW5lIGxpZmVjeWNsZSwgc28gaXQKLSAgICAvLyBzaG91bGQgYmUgY3JlYXRlZCByaWdodCBhd2F5LgotICAgIGlmICghc2VsZi5zY2VuZVN0YXRlLndpbmRvdykgewotICAgICAgRENIRUNLKCFJc011bHRpd2luZG93U3VwcG9ydGVkKCkpCi0gICAgICAgICAgPDwgIlRoZSB3aW5kb3cgbXVzdCBiZSBjcmVhdGVkIGJ5IHRoZSBzY2VuZSBkZWxlZ2F0ZSI7Ci0gICAgICBzZWxmLnNjZW5lU3RhdGUud2luZG93ID0gW1tDaHJvbWVPdmVybGF5V2luZG93IGFsbG9jXQotICAgICAgICAgIGluaXRXaXRoRnJhbWU6W1tVSVNjcmVlbiBtYWluU2NyZWVuXSBib3VuZHNdXTsKLSAgICB9CiAgIH0KICAgcmV0dXJuIHNlbGY7CiB9CmRpZmYgLS1naXQgYS9pb3MvY2hyb21lL2Jyb3dzZXIvdWkvbWFpbi9zY2VuZV9kZWxlZ2F0ZS5tbSBiL2lvcy9jaHJvbWUvYnJvd3Nlci91aS9tYWluL3NjZW5lX2RlbGVnYXRlLm1tCmluZGV4IGJjODI5NDY0Li43NjU3MDc1MCAxMDA2NDQKLS0tIGEvaW9zL2Nocm9tZS9icm93c2VyL3VpL21haW4vc2NlbmVfZGVsZWdhdGUubW0KKysrIGIvaW9zL2Nocm9tZS9icm93c2VyL3VpL21haW4vc2NlbmVfZGVsZWdhdGUubW0KQEAgLTQsOSArNCw2IEBACiAKICNpbXBvcnQgImlvcy9jaHJvbWUvYnJvd3Nlci91aS9tYWluL3NjZW5lX2RlbGVnYXRlLmgiCiAKLSNpbmNsdWRlICJiYXNlL21hYy9mb3VuZGF0aW9uX3V0aWwuaCIKLSNpbXBvcnQgImlvcy9jaHJvbWUvYXBwL2Nocm9tZV9vdmVybGF5X3dpbmRvdy5oIgotCiAjaWYgIWRlZmluZWQoX19oYXNfZmVhdHVyZSkgfHwgIV9faGFzX2ZlYXR1cmUob2JqY19hcmMpCiAjZXJyb3IgIlRoaXMgZmlsZSByZXF1aXJlcyBBUkMgc3VwcG9ydC4iCiAjZW5kaWYKQEAgLTIxLDE4ICsxOCw3IEBACiAgIHJldHVybiBfc2NlbmVTdGF0ZTsKIH0KIAotI3ByYWdtYSBtYXJrIC0gVUlXaW5kb3dTY2VuZURlbGVnYXRlCi0KLS8vIFRoaXMgZ2V0dGVyIGlzIGNhbGxlZCB3aGVuIHRoZSBTY2VuZURlbGVnYXRlIGlzIGNyZWF0ZWQuIFJldHVybmluZyBhCi0vLyBDaHJvbWVPdmVybGF5V2luZG93IGFsbG93cyBVSUtpdCB0byB1c2UgdGhhdCBhcyB0aGUgbWFpbiB3aW5kb3cgZm9yIHRoaXMKLS8vIHNjZW5lLgotLSAoVUlXaW5kb3cqKXdpbmRvdyB7Ci0gIGlmICghX3dpbmRvdykgewotICAgIC8vIFNpemluZyBvZiB0aGUgd2luZG93IGlzIGhhbmRsZWQgYnkgVUlLaXQuCi0gICAgX3dpbmRvdyA9IFtbQ2hyb21lT3ZlcmxheVdpbmRvdyBhbGxvY10gaW5pdF07Ci0gIH0KLSAgcmV0dXJuIF93aW5kb3c7Ci19CisjcHJhZ21hIG1hcmsgLSBVSVNjZW5lRGVsZWdhdGUKIAogI3ByYWdtYSBtYXJrIENvbm5lY3RpbmcgYW5kIERpc2Nvbm5lY3RpbmcgdGhlIFNjZW5lCiAKQEAgLTQwLDcgKzI2LDYgQEAKICAgICB3aWxsQ29ubmVjdFRvU2Vzc2lvbjooVUlTY2VuZVNlc3Npb24qKXNlc3Npb24KICAgICAgICAgICAgICAgICAgb3B0aW9uczooVUlTY2VuZUNvbm5lY3Rpb25PcHRpb25zKiljb25uZWN0aW9uT3B0aW9ucwogICAgIEFQSV9BVkFJTEFCTEUoaW9zKDEzKSkgewotICBzZWxmLnNjZW5lU3RhdGUuc2NlbmUgPSBiYXNlOjptYWM6Ok9iakNDYXN0U3RyaWN0PFVJV2luZG93U2NlbmU+KHNjZW5lKTsKICAgc2VsZi5zY2VuZVN0YXRlLmFjdGl2YXRpb25MZXZlbCA9IFNjZW5lQWN0aXZhdGlvbkxldmVsQmFja2dyb3VuZDsKIH0KIApkaWZmIC0tZ2l0IGEvaW9zL2Nocm9tZS9icm93c2VyL3VpL21haW4vc2NlbmVfc3RhdGUuaCBiL2lvcy9jaHJvbWUvYnJvd3Nlci91aS9tYWluL3NjZW5lX3N0YXRlLmgKaW5kZXggYzcyZmZlMi4uZDQxN2VkYSAxMDA2NDQKLS0tIGEvaW9zL2Nocm9tZS9icm93c2VyL3VpL21haW4vc2NlbmVfc3RhdGUuaAorKysgYi9pb3MvY2hyb21lL2Jyb3dzZXIvdWkvbWFpbi9zY2VuZV9zdGF0ZS5oCkBAIC00NCw5ICs0NCw3IEBACiBAcHJvcGVydHkobm9uYXRvbWljLCBhc3NpZ24pIFNjZW5lQWN0aXZhdGlvbkxldmVsIGFjdGl2YXRpb25MZXZlbDsKIAogLy8gV2luZG93IGZvciB0aGUgYXNzb2NpYXRlZCBzY2VuZSwgaWYgYW55LgotQHByb3BlcnR5KG5vbmF0b21pYywgc3Ryb25nKSBVSVdpbmRvdyogd2luZG93OwotCi1AcHJvcGVydHkobm9uYXRvbWljLCBzdHJvbmcpIFVJV2luZG93U2NlbmUqIHNjZW5lIEFQSV9BVkFJTEFCTEUoaW9zKDEzKSk7CitAcHJvcGVydHkobm9uYXRvbWljLCB3ZWFrKSBVSVdpbmRvdyogd2luZG93OwogCiAvLyBBZGRzIGFuIG9ic2VydmVyIHRvIHRoaXMgc2NlbmUgc3RhdGUuIFRoZSBvYnNlcnZlcnMgd2lsbCBiZSBub3RpZmllZCBhYm91dAogLy8gc2NlbmUgc3RhdGUgY2hhbmdlcyBwZXIgU2NlbmVTdGF0ZU9ic2VydmVyIHByb3RvY29sLgpkaWZmIC0tZ2l0IGEvaW9zL2Nocm9tZS9icm93c2VyL3VpL21haW4vc2NlbmVfc3RhdGUubW0gYi9pb3MvY2hyb21lL2Jyb3dzZXIvdWkvbWFpbi9zY2VuZV9zdGF0ZS5tbQppbmRleCAyZWI3MDllLi4yODZhNzYyMzEgMTAwNjQ0Ci0tLSBhL2lvcy9jaHJvbWUvYnJvd3Nlci91aS9tYWluL3NjZW5lX3N0YXRlLm1tCisrKyBiL2lvcy9jaHJvbWUvYnJvd3Nlci91aS9tYWluL3NjZW5lX3N0YXRlLm1tCkBAIC01LDggKzUsNiBAQAogI2ltcG9ydCAiaW9zL2Nocm9tZS9icm93c2VyL3VpL21haW4vc2NlbmVfc3RhdGUuaCIKIAogI2ltcG9ydCAiYmFzZS9pb3MvY3JiX3Byb3RvY29sX29ic2VydmVycy5oIgotI2ltcG9ydCAiaW9zL2Nocm9tZS9hcHAvY2hyb21lX292ZXJsYXlfd2luZG93LmgiCi0jaW1wb3J0ICJpb3MvY2hyb21lL2Jyb3dzZXIvdWkvdXRpbC9tdWx0aV93aW5kb3dfc3VwcG9ydC5oIgogCiAjaWYgIWRlZmluZWQoX19oYXNfZmVhdHVyZSkgfHwgIV9faGFzX2ZlYXR1cmUob2JqY19hcmMpCiAjZXJyb3IgIlRoaXMgZmlsZSByZXF1aXJlcyBBUkMgc3VwcG9ydC4iCkBAIC0yOCw3ICsyNiw2IEBACiBAZW5kCiAKIEBpbXBsZW1lbnRhdGlvbiBTY2VuZVN0YXRlCi1Ac3ludGhlc2l6ZSB3aW5kb3cgPSBfd2luZG93OwogCiAtIChpbnN0YW5jZXR5cGUpaW5pdCB7CiAgIHNlbGYgPSBbc3VwZXIgaW5pdF07CkBAIC01MSwzMCArNDgsNiBAQAogCiAjcHJhZ21hIG1hcmsgLSBTZXR0ZXJzICYgR2V0dGVycy4KIAotLSAodm9pZClzZXRXaW5kb3c6KFVJV2luZG93Kil3aW5kb3cgewotICBpZiAoSXNNdWx0aXdpbmRvd1N1cHBvcnRlZCgpKSB7Ci0gICAgLy8gTm8gbmVlZCB0byBzZXQgYW55dGhpbmcsIGluc3RlYWQgdGhlIGdldHRlciBpcyBiYWNrZWQgYnkgc2NlbmUud2luZG93cwotICAgIC8vIHByb3BlcnR5LgotICAgIHJldHVybjsKLSAgfQotICBfd2luZG93ID0gd2luZG93OwotfQotCi0tIChVSVdpbmRvdyopd2luZG93IHsKLSAgaWYgKElzTXVsdGl3aW5kb3dTdXBwb3J0ZWQoKSkgewotICAgIFVJV2luZG93KiBtYWluV2luZG93ID0gbmlsOwotICAgIGlmIChAYXZhaWxhYmxlKGlvcyAxMywgKikpIHsKLSAgICAgIGZvciAoVUlXaW5kb3cqIHdpbmRvdyBpbiBzZWxmLnNjZW5lLndpbmRvd3MpIHsKLSAgICAgICAgaWYgKFt3aW5kb3cgaXNLaW5kT2ZDbGFzczpbQ2hyb21lT3ZlcmxheVdpbmRvdyBjbGFzc11dKSB7Ci0gICAgICAgICAgbWFpbldpbmRvdyA9IHdpbmRvdzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbWFpbldpbmRvdzsKLSAgfQotICByZXR1cm4gX3dpbmRvdzsKLX0KLQogLSAodm9pZClzZXRBY3RpdmF0aW9uTGV2ZWw6KFNjZW5lQWN0aXZhdGlvbkxldmVsKW5ld0xldmVsIHsKICAgaWYgKF9hY3RpdmF0aW9uTGV2ZWwgPT0gbmV3TGV2ZWwpIHsKICAgICByZXR1cm47CmRpZmYgLS1naXQgYS9pb3MvY2hyb21lL2Jyb3dzZXIvdWkvcHJpbnQvcHJpbnRfY29udHJvbGxlci5oIGIvaW9zL2Nocm9tZS9icm93c2VyL3VpL3ByaW50L3ByaW50X2NvbnRyb2xsZXIuaAppbmRleCAxNjM5NjY5Li5iODczZjMwIDEwMDY0NAotLS0gYS9pb3MvY2hyb21lL2Jyb3dzZXIvdWkvcHJpbnQvcHJpbnRfY29udHJvbGxlci5oCisrKyBiL2lvcy9jaHJvbWUvYnJvd3Nlci91aS9wcmludC9wcmludF9jb250cm9sbGVyLmgKQEAgLTcsMjIgKzcsMTEgQEAKIAogI2ltcG9ydCA8VUlLaXQvVUlLaXQuaD4KIAotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCiAjaW1wb3J0ICJpb3MvY2hyb21lL2Jyb3dzZXIvd2ViL3dlYl9zdGF0ZV9wcmludGVyLmgiCiAKLW5hbWVzcGFjZSBuZXQgewotY2xhc3MgVVJMUmVxdWVzdENvbnRleHRHZXR0ZXI7Ci19ICAvLyBuYW1lc3BhY2UgbmV0Ci0KIC8vIEludGVyZmFjZSBmb3IgcHJpbnRpbmcuCiBAaW50ZXJmYWNlIFByaW50Q29udHJvbGxlciA6IE5TT2JqZWN0IDxXZWJTdGF0ZVByaW50ZXI+CiAKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aENvbnRleHRHZXR0ZXI6Ci0gICAgKHNjb3BlZF9yZWZwdHI8bmV0OjpVUkxSZXF1ZXN0Q29udGV4dEdldHRlcj4pZ2V0dGVyCi0gICAgTlNfREVTSUdOQVRFRF9JTklUSUFMSVpFUjsKLQotLSAoaW5zdGFuY2V0eXBlKWluaXQgTlNfVU5BVkFJTEFCTEU7Ci0KIC8vIFNob3dzIHByaW50IFVJIGZvciB8dmlld3wgd2l0aCB8dGl0bGV8LgogLSAodm9pZClwcmludFZpZXc6KFVJVmlldyopdmlldyB3aXRoVGl0bGU6KE5TU3RyaW5nKil0aXRsZTsKIApkaWZmIC0tZ2l0IGEvaW9zL2Nocm9tZS9icm93c2VyL3VpL3ByaW50L3ByaW50X2NvbnRyb2xsZXIubW0gYi9pb3MvY2hyb21lL2Jyb3dzZXIvdWkvcHJpbnQvcHJpbnRfY29udHJvbGxlci5tbQppbmRleCAxYmI2NjVhLi44ZWJlZGZlIDEwMDY0NAotLS0gYS9pb3MvY2hyb21lL2Jyb3dzZXIvdWkvcHJpbnQvcHJpbnRfY29udHJvbGxlci5tbQorKysgYi9pb3MvY2hyb21lL2Jyb3dzZXIvdWkvcHJpbnQvcHJpbnRfY29udHJvbGxlci5tbQpAQCAtNCwxNTYgKzQsMTkgQEAKIAogI2ltcG9ydCAiaW9zL2Nocm9tZS9icm93c2VyL3VpL3ByaW50L3ByaW50X2NvbnRyb2xsZXIuaCIKIAotI2ltcG9ydCA8TW9iaWxlQ29yZVNlcnZpY2VzL1VUVHlwZS5oPgotI2ltcG9ydCA8V2ViS2l0L1dlYktpdC5oPgotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAiYmFzZS9iaW5kLmgiCi0jaW5jbHVkZSAiYmFzZS9jYWxsYmFja19oZWxwZXJzLmgiCi0jaW5jbHVkZSAiYmFzZS9sb2NhdGlvbi5oIgogI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJhc2UvbWFjL2ZvdW5kYXRpb25fdXRpbC5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCiAjaW5jbHVkZSAiYmFzZS9tZXRyaWNzL3VzZXJfbWV0cmljcy5oIgotI2luY2x1ZGUgImJhc2UvbWV0cmljcy91c2VyX21ldHJpY3NfYWN0aW9uLmgiCi0jaW5jbHVkZSAiYmFzZS90YXNrL3Bvc3RfdGFzay5oIgotI2luY2x1ZGUgImNvbXBvbmVudHMvc3RyaW5ncy9ncml0L2NvbXBvbmVudHNfc3RyaW5ncy5oIgogI2ltcG9ydCAiaW9zL2Nocm9tZS9icm93c2VyL3RhYnMvdGFiX3RpdGxlX3V0aWwuaCIKLSNpbXBvcnQgImlvcy9jaHJvbWUvYnJvd3Nlci91aS9hbGVydF9jb29yZGluYXRvci9hbGVydF9jb29yZGluYXRvci5oIgotI2ltcG9ydCAiaW9zL2Nocm9tZS9icm93c2VyL3VpL2FsZXJ0X2Nvb3JkaW5hdG9yL2xvYWRpbmdfYWxlcnRfY29vcmRpbmF0b3IuaCIKLSNpbmNsdWRlICJpb3MvY2hyb21lL2dyaXQvaW9zX3N0cmluZ3MuaCIKICNpbXBvcnQgImlvcy93ZWIvcHVibGljL3dlYl9zdGF0ZS5oIgotI2ltcG9ydCAibmV0L2Jhc2UvbWFjL3VybF9jb252ZXJzaW9ucy5oIgotI2luY2x1ZGUgIm5ldC9odHRwL2h0dHBfcmVzcG9uc2VfaGVhZGVycy5oIgotI2luY2x1ZGUgIm5ldC91cmxfcmVxdWVzdC91cmxfZmV0Y2hlci5oIgotI2luY2x1ZGUgIm5ldC91cmxfcmVxdWVzdC91cmxfZmV0Y2hlcl9kZWxlZ2F0ZS5oIgotI2luY2x1ZGUgIm5ldC91cmxfcmVxdWVzdC91cmxfcmVxdWVzdF9jb250ZXh0X2dldHRlci5oIgotI2luY2x1ZGUgInVpL2Jhc2UvbDEwbi9sMTBuX3V0aWxfbWFjLmgiCiAKICNpZiAhZGVmaW5lZChfX2hhc19mZWF0dXJlKSB8fCAhX19oYXNfZmVhdHVyZShvYmpjX2FyYykKICNlcnJvciAiVGhpcyBmaWxlIHJlcXVpcmVzIEFSQyBzdXBwb3J0LiIKICNlbmRpZgogCi11c2luZyBuZXQ6OlVSTEZldGNoZXI7Ci11c2luZyBuZXQ6OlVSTEZldGNoZXJEZWxlZ2F0ZTsKLXVzaW5nIG5ldDo6VVJMUmVxdWVzdENvbnRleHRHZXR0ZXI7Ci0KLUBpbnRlcmZhY2UgUHJpbnRDb250cm9sbGVyICgpCi0KLS8vIFByZXNlbnRzIGEgVUlQcmludEludGVyYWN0aW9uQ29udHJvbGxlciB3aXRoIGEgZGVmYXVsdCBjb21wbGV0aW9uIGhhbmRsZXIuCi0vLyB8aXNQREZ8IGluZGljYXRlcyBpZiB8cHJpbnRJbnRlcmFjdGlvbkNvbnRyb2xsZXJ8IGlzIGJlaW5nIHByZXNlbnRlZCB0byBwcmludAotLy8gYSBQREYuCi0rICh2b2lkKWRpc3BsYXlQcmludEludGVyYWN0aW9uQ29udHJvbGxlcjoKLSAgICAgICAgICAgIChVSVByaW50SW50ZXJhY3Rpb25Db250cm9sbGVyKilwcmludEludGVyYWN0aW9uQ29udHJvbGxlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JQREY6KEJPT0wpaXNQREY7Ci0KLS8vIFNob3dzIGEgZGlhbG9nIG9uIHx2aWV3Q29udHJvbGxlcnwgaW5kaWNhdGluZyB0aGF0IHRoZSBwcmludCBwcmV2aWV3IGlzIGJlaW5nCi0vLyBwcmVwYXJlZC4gVGhlIGRpYWxvZyB3aWxsIGFwcGVhciBvbmx5IGlmIHRoZSBkb3dubG9hZCBoYXMgbm90IGNvbXBsZXRlZCBvcgotLy8gYmVlbiBjYW5jZWxsZWQgfGtQREZEb3dubG9hZERpYWxvZ0RlbGF5fCBzZWNvbmRzIGFmdGVyIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KLS0gKHZvaWQpc2hvd1BERkRvd25sb2FkaW5nRGlhbG9nOihVSVZpZXdDb250cm9sbGVyKil2aWV3Q29udHJvbGxlcjsKLQotLy8gRGlzbWlzc2VzIHRoZSBkaWFsb2cgd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIHByaW50IHByZXZpZXcgaXMgYmVpbmcKLS8vIHByZXBhcmVkLgotLSAodm9pZClkaXNtaXNzUERGRG93bmxvYWRpbmdEaWFsb2c7Ci0KLS8vIFNob3dzIGFuIGRpYWxvZyBvbiB8dmlld0NvbnRyb2xsZXJ8IGluZGljYXRpbmcgdGhhdCB0aGVyZSB3YXMgYW4gZXJyb3Igd2hlbgotLy8gcHJlcGFyaW5nIHRoZSBwcmludCBwcmV2aWV3LCBhbmQgcHJvdmlkaW5nIHRoZSBhYmlsaXR5IHRvIHJldHJ5LiB8VVJMfCBpcyB0aGUKLS8vIFVSTCBvZiB0aGUgUERGIHdoaWNoIGhhZCBhbiBlcnJvci4KLS0gKHZvaWQpc2hvd1BERkRvd25sb2FkRXJyb3JXaXRoVVJMOihjb25zdCBHVVJMKVVSTAotICAgICAgICAgICAgICAgICAgICAgdmlld0NvbnRyb2xsZXI6KFVJVmlld0NvbnRyb2xsZXIqKXZpZXdDb250cm9sbGVyOwotCi0vLyBIYW5kbGVzIGRvd25sb2FkaW5nIHRoZSBmaWxlIGF0IHxVUkx8IGFuZCBwcmVzZW50cyBkaWFsb2dzIG9uCi0vLyB8dmlld0NvbnRyb2xsZXJ8IGlmIG5lY2Vzc2FyeS4KLS0gKHZvaWQpZG93bmxvYWRQREZGaWxlV2l0aFVSTDooY29uc3QgR1VSTCYpVVJMCi0gICAgICAgICAgICAgICAgdmlld0NvbnRyb2xsZXI6KFVJVmlld0NvbnRyb2xsZXIqKXZpZXdDb250cm9sbGVyOwotCi0vLyBBY2Nlc3NlcyB0aGUgcmVzdWx0IG9mIHRoZSBQREYgZG93bmxvYWQsIGFuZCBpZiBzdWNjZXNzZnVsLCBwcmVzZW50cyB0aGUKLS8vIEFpclByaW50IG1lbnUgd2l0aCB0aGUgZG93bmxvYWRlZCBQREYuIEl0IGFsc28gZW5zdXJlcyB0aGF0IHRoZQotLy8gUERGRG93bmxvYWRpbmdEaWFsb2cgaXMgZGlzbWlzc2VkLCBhbmQgcHJlc2VudHMgYW4gZXJyb3IgZGlhbG9nIG9uCi0vLyB8dmlld0NvbnRyb2xsZXJ8IGlmIHRoZSBkb3dubG9hZCBmYWlscy4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGJ5Ci0vLyB0aGUgVVJMRmV0Y2hlckRlbGVnYXRlLgotLSAodm9pZClmaW5pc2hlZERvd25sb2FkaW5nUERGOihVSVZpZXdDb250cm9sbGVyKil2aWV3Q29udHJvbGxlcjsKLQotQGVuZAotCi1uYW1lc3BhY2UgewotCi0vLyBUaGUgTUlNRSB0eXBlIG9mIGEgUERGIGZpbGUgY29udGFpbmVkIGluIGEgV2ViIHZpZXcuCi1jb25zdCBjaGFyIGtQREZNaW1lVHlwZVtdID0gImFwcGxpY2F0aW9uL3BkZiI7Ci0KLS8vIERlbGF5IGFmdGVyIGRvd25sb2FkaW5nIGJlZ2lucyB0aGF0IHRoZSB8X1BERkRvd25sb2FkaW5nRGlhbG9nfCBhcHBlYXJzLgotY29uc3QgaW50NjRfdCBrUERGRG93bmxvYWREaWFsb2dEZWxheSA9IDE7Ci0KLS8vIEEgZGVsZWdhdGUgZm9yIHRoZSBVUkxGZXRjaGVyIHRvIHRlbGwgb3duaW5nIFByaW50Q29udHJvbGxlciB0aGF0IHRoZQotLy8gZG93bmxvYWQgaXMgY29tcGxldGUuCi1jbGFzcyBQcmludFBERkZldGNoZXJEZWxlZ2F0ZSA6IHB1YmxpYyBVUkxGZXRjaGVyRGVsZWdhdGUgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgUHJpbnRQREZGZXRjaGVyRGVsZWdhdGUoUHJpbnRDb250cm9sbGVyKiBvd25lcikgOiBvd25lcl8ob3duZXIpIHt9Ci0gIHZvaWQgT25VUkxGZXRjaENvbXBsZXRlKGNvbnN0IFVSTEZldGNoZXIqIHNvdXJjZSkgb3ZlcnJpZGUgewotICAgIERDSEVDSyh2aWV3X2NvbnRyb2xsZXJfKTsKLSAgICBbb3duZXJfIGZpbmlzaGVkRG93bmxvYWRpbmdQREY6dmlld19jb250cm9sbGVyX107Ci0gIH0KLQotICAvLyBUaGUgVmlld0NvbnRyb2xsZXIgdXNlZCB0byBkaXNwbGF5IGFuIGVycm9yIGlmIHRoZSBkb3dubG9hZCBmYWlsZWQuCi0gIHZvaWQgU2V0Vmlld0NvbnRyb2xsZXIoVUlWaWV3Q29udHJvbGxlciogdmlld19jb250cm9sbGVyKSB7Ci0gICAgdmlld19jb250cm9sbGVyXyA9IHZpZXdfY29udHJvbGxlcjsKLSAgfQotCi0gcHJpdmF0ZToKLSAgX193ZWFrIFByaW50Q29udHJvbGxlciogb3duZXJfOwotICBfX3dlYWsgVUlWaWV3Q29udHJvbGxlciogdmlld19jb250cm9sbGVyXzsKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFByaW50UERGRmV0Y2hlckRlbGVnYXRlKTsKLX07Ci19ICAvLyBuYW1lc3BhY2UKLQotQGltcGxlbWVudGF0aW9uIFByaW50Q29udHJvbGxlciB7Ci0gIC8vIFVSTEZldGNoZXIgdG8gZG93bmxvYWQgdGhlIFBERiBwb2ludGVkIHRvIGJ5IHRoZSBXS1dlYlZpZXcuCi0gIHN0ZDo6dW5pcXVlX3B0cjxVUkxGZXRjaGVyPiBfZmV0Y2hlcjsKLQotICAvLyBBIGRlbGVnYXRlIHRvIGJyaWRnZSBiZXR3ZWVuIFByaW50Q29udHJvbGxlciBhbmQgdGhlIFVSTEZldGNoZXIgY2FsbGJhY2suCi0gIHN0ZDo6dW5pcXVlX3B0cjxQcmludFBERkZldGNoZXJEZWxlZ2F0ZT4gX2ZldGNoZXJEZWxlZ2F0ZTsKLQotICAvLyBDb250ZXh0IGdldHRlciByZXF1aXJlZCBieSB0aGUgVVJMRmV0Y2hlci4KLSAgc2NvcGVkX3JlZnB0cjxVUkxSZXF1ZXN0Q29udGV4dEdldHRlcj4gX3JlcXVlc3RDb250ZXh0R2V0dGVyOwotCi0gIC8vIEEgZGlhbG9nIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSBwcmludCBwcmV2aWV3IGlzIGJlaW5nIHByZXBhcmVkLiBJdAotICAvLyBvZmZlcnMgYSBjYW5jZWwgYnV0dG9uIHdoaWNoIHdpbGwgY2FuY2VsIHRoZSBkb3dubG9hZC4gSXQgaXMgY3JlYXRlZCB3aGVuCi0gIC8vIGRvd25sb2FkaW5nIGJlZ2lucyBhbmQgaXMgcmVsZWFzZWQgd2hlbiBkb3dubG9hZGluZyBlbmRzIChlaXRoZXIgZHVlIHRvCi0gIC8vIGNhbmNlbGxhdGlvbiBvciBjb21wbGV0aW9uKS4KLSAgTG9hZGluZ0FsZXJ0Q29vcmRpbmF0b3IqIF9QREZEb3dubG9hZGluZ0RpYWxvZzsKLQotICAvLyBBIGRpYWxvZyB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgcHJpbnQgcHJldmlldyBmYWlsZWQuCi0gIEFsZXJ0Q29vcmRpbmF0b3IqIF9QREZEb3dubG9hZGluZ0Vycm9yRGlhbG9nOwotfQotCi0jcHJhZ21hIG1hcmsgLSBDbGFzcyBtZXRob2RzLgotCi0rICh2b2lkKWRpc3BsYXlQcmludEludGVyYWN0aW9uQ29udHJvbGxlcjoKLSAgICAgICAgICAgIChVSVByaW50SW50ZXJhY3Rpb25Db250cm9sbGVyKilwcmludEludGVyYWN0aW9uQ29udHJvbGxlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JQREY6KEJPT0wpaXNQREYgewotICB2b2lkICheY29tcGxldGlvbkhhbmRsZXIpKFVJUHJpbnRJbnRlcmFjdGlvbkNvbnRyb2xsZXIqLCBCT09MLCBOU0Vycm9yKikgPSBeKAotICAgICAgVUlQcmludEludGVyYWN0aW9uQ29udHJvbGxlciogcHJpbnRJbnRlcmFjdGlvbkNvbnRyb2xsZXIsIEJPT0wgY29tcGxldGVkLAotICAgICAgTlNFcnJvciogZXJyb3IpIHsKLSAgICBpZiAoZXJyb3IpCi0gICAgICBETE9HKEVSUk9SKSA8PCAiQWlyIHByaW50aW5nIGVycm9yOiAiIDw8IGVycm9yLmRlc2NyaXB0aW9uOwotICB9OwotICBbcHJpbnRJbnRlcmFjdGlvbkNvbnRyb2xsZXIgcHJlc2VudEFuaW1hdGVkOllFUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25IYW5kbGVyOmNvbXBsZXRpb25IYW5kbGVyXTsKLX0KK0BpbXBsZW1lbnRhdGlvbiBQcmludENvbnRyb2xsZXIKIAogI3ByYWdtYSBtYXJrIC0gUHVibGljIE1ldGhvZHMKIAotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ29udGV4dEdldHRlcjoKLSAgICAoc2NvcGVkX3JlZnB0cjxuZXQ6OlVSTFJlcXVlc3RDb250ZXh0R2V0dGVyPilnZXR0ZXIgewotICBzZWxmID0gW3N1cGVyIGluaXRdOwotICBpZiAoc2VsZikgewotICAgIF9yZXF1ZXN0Q29udGV4dEdldHRlciA9IHN0ZDo6bW92ZShnZXR0ZXIpOwotICAgIF9mZXRjaGVyRGVsZWdhdGUucmVzZXQobmV3IFByaW50UERGRmV0Y2hlckRlbGVnYXRlKHNlbGYpKTsKLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQogLSAodm9pZClwcmludFZpZXc6KFVJVmlldyopdmlldyB3aXRoVGl0bGU6KE5TU3RyaW5nKil0aXRsZSB7CiAgIGJhc2U6OlJlY29yZEFjdGlvbihiYXNlOjpVc2VyTWV0cmljc0FjdGlvbigiTW9iaWxlUHJpbnRNZW51QWlyUHJpbnQiKSk7CiAgIFVJUHJpbnRJbnRlcmFjdGlvbkNvbnRyb2xsZXIqIHByaW50SW50ZXJhY3Rpb25Db250cm9sbGVyID0KQEAgLTE2NywxNSArMzAsMTggQEAKICAgW3JlbmRlcmVyIGFkZFByaW50Rm9ybWF0dGVyOlt2aWV3IHZpZXdQcmludEZvcm1hdHRlcl0KICAgICAgICAgc3RhcnRpbmdBdFBhZ2VBdEluZGV4OjBdOwogICBwcmludEludGVyYWN0aW9uQ29udHJvbGxlci5wcmludFBhZ2VSZW5kZXJlciA9IHJlbmRlcmVyOwotICBbUHJpbnRDb250cm9sbGVyIGRpc3BsYXlQcmludEludGVyYWN0aW9uQ29udHJvbGxlcjpwcmludEludGVyYWN0aW9uQ29udHJvbGxlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvclBERjpOT107CisKKyAgW3ByaW50SW50ZXJhY3Rpb25Db250cm9sbGVyCisgICAgICAgIHByZXNlbnRBbmltYXRlZDpZRVMKKyAgICAgIGNvbXBsZXRpb25IYW5kbGVyOl4oCisgICAgICAgICAgVUlQcmludEludGVyYWN0aW9uQ29udHJvbGxlciogcHJpbnRJbnRlcmFjdGlvbkNvbnRyb2xsZXIsCisgICAgICAgICAgQk9PTCBjb21wbGV0ZWQsIE5TRXJyb3IqIGVycm9yKSB7CisgICAgICAgIGlmIChlcnJvcikKKyAgICAgICAgICBETE9HKEVSUk9SKSA8PCAiQWlyIHByaW50aW5nIGVycm9yOiAiIDw8IGVycm9yLmRlc2NyaXB0aW9uOworICAgICAgfV07CiB9CiAKIC0gKHZvaWQpZGlzbWlzc0FuaW1hdGVkOihCT09MKWFuaW1hdGVkIHsKLSAgX2ZldGNoZXIucmVzZXQoKTsKLSAgW3NlbGYgZGlzbWlzc1BERkRvd25sb2FkaW5nRGlhbG9nXTsKLSAgW19QREZEb3dubG9hZGluZ0Vycm9yRGlhbG9nIHN0b3BdOwotICBfUERGRG93bmxvYWRpbmdFcnJvckRpYWxvZyA9IG5pbDsKICAgW1tVSVByaW50SW50ZXJhY3Rpb25Db250cm9sbGVyIHNoYXJlZFByaW50Q29udHJvbGxlcl0KICAgICAgIGRpc21pc3NBbmltYXRlZDphbmltYXRlZF07CiB9CkBAIC0xODcsMTExICs1Myw0IEBACiAgICAgICAgIHdpdGhUaXRsZTp0YWJfdXRpbDo6R2V0VGFiVGl0bGUod2ViU3RhdGUpXTsKIH0KIAotI3ByYWdtYSBtYXJrIC0gUHJpdmF0ZSBNZXRob2RzCi0KLS0gKHZvaWQpc2hvd1BERkRvd25sb2FkaW5nRGlhbG9nOihVSVZpZXdDb250cm9sbGVyKil2aWV3Q29udHJvbGxlciB7Ci0gIGlmIChfUERGRG93bmxvYWRpbmdEaWFsb2cpCi0gICAgcmV0dXJuOwotCi0gIE5TU3RyaW5nKiB0aXRsZSA9IGwxMG5fdXRpbDo6R2V0TlNTdHJpbmcoSURTX0lPU19QUklOVF9QREZfUFJFUEFSQVRJT04pOwotCi0gIF9fd2VhayBQcmludENvbnRyb2xsZXIqIHdlYWtTZWxmID0gc2VsZjsKLSAgUHJvY2VkdXJhbEJsb2NrIGNhbmNlbEhhbmRsZXIgPSBeewotICAgIFByaW50Q29udHJvbGxlciogc3Ryb25nU2VsZiA9IHdlYWtTZWxmOwotICAgIGlmIChzdHJvbmdTZWxmKQotICAgICAgc3Ryb25nU2VsZi0+X2ZldGNoZXIucmVzZXQoKTsKLSAgfTsKLQotICBfUERGRG93bmxvYWRpbmdEaWFsb2cgPSBbW0xvYWRpbmdBbGVydENvb3JkaW5hdG9yIGFsbG9jXQotICAgICAgaW5pdFdpdGhCYXNlVmlld0NvbnRyb2xsZXI6dmlld0NvbnRyb2xsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOnRpdGxlCi0gICAgICAgICAgICAgICAgICAgY2FuY2VsSGFuZGxlcjpjYW5jZWxIYW5kbGVyXTsKLQotICBkaXNwYXRjaF9hZnRlcigKLSAgICAgIGRpc3BhdGNoX3RpbWUoRElTUEFUQ0hfVElNRV9OT1csIGtQREZEb3dubG9hZERpYWxvZ0RlbGF5ICogTlNFQ19QRVJfU0VDKSwKLSAgICAgIGRpc3BhdGNoX2dldF9tYWluX3F1ZXVlKCksIF57Ci0gICAgICAgIFByaW50Q29udHJvbGxlciogc3Ryb25nU2VsZiA9IHdlYWtTZWxmOwotICAgICAgICBpZiAoIXN0cm9uZ1NlbGYpCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgICBbc3Ryb25nU2VsZi0+X1BERkRvd25sb2FkaW5nRGlhbG9nIHN0YXJ0XTsKLSAgICAgIH0pOwotfQotCi0tICh2b2lkKWRpc21pc3NQREZEb3dubG9hZGluZ0RpYWxvZyB7Ci0gIFtfUERGRG93bmxvYWRpbmdEaWFsb2cgc3RvcF07Ci0gIF9QREZEb3dubG9hZGluZ0RpYWxvZyA9IG5pbDsKLX0KLQotLSAodm9pZClzaG93UERGRG93bmxvYWRFcnJvcldpdGhVUkw6KGNvbnN0IEdVUkwpVVJMCi0gICAgICAgICAgICAgICAgICAgICB2aWV3Q29udHJvbGxlcjooVUlWaWV3Q29udHJvbGxlciopdmlld0NvbnRyb2xsZXIgewotICBOU1N0cmluZyogdGl0bGUgPSBsMTBuX3V0aWw6OkdldE5TU3RyaW5nKElEU19JT1NfUFJJTlRfUERGX0VSUk9SX1RJVExFKTsKLSAgTlNTdHJpbmcqIG1lc3NhZ2UgPSBsMTBuX3V0aWw6OkdldE5TU3RyaW5nKElEU19JT1NfUFJJTlRfUERGX0VSUk9SX1NVQlRJVExFKTsKLQotICBfUERGRG93bmxvYWRpbmdFcnJvckRpYWxvZyA9Ci0gICAgICBbW0FsZXJ0Q29vcmRpbmF0b3IgYWxsb2NdIGluaXRXaXRoQmFzZVZpZXdDb250cm9sbGVyOnZpZXdDb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOnRpdGxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOm1lc3NhZ2VdOwotCi0gIF9fd2VhayBQcmludENvbnRyb2xsZXIqIHdlYWtTZWxmID0gc2VsZjsKLQotICBbX1BERkRvd25sb2FkaW5nRXJyb3JEaWFsb2cKLSAgICAgIGFkZEl0ZW1XaXRoVGl0bGU6bDEwbl91dGlsOjpHZXROU1N0cmluZyhJRFNfSU9TX1BSSU5UX1BERl9UUllfQUdBSU4pCi0gICAgICAgICAgICAgICAgYWN0aW9uOl57Ci0gICAgICAgICAgICAgICAgICBbd2Vha1NlbGYgZG93bmxvYWRQREZGaWxlV2l0aFVSTDpVUkwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdDb250cm9sbGVyOnZpZXdDb250cm9sbGVyXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIHN0eWxlOlVJQWxlcnRBY3Rpb25TdHlsZURlZmF1bHRdOwotCi0gIFtfUERGRG93bmxvYWRpbmdFcnJvckRpYWxvZwotICAgICAgYWRkSXRlbVdpdGhUaXRsZTpsMTBuX3V0aWw6OkdldE5TU3RyaW5nKElEU19DQU5DRUwpCi0gICAgICAgICAgICAgICAgYWN0aW9uOm5pbAotICAgICAgICAgICAgICAgICBzdHlsZTpVSUFsZXJ0QWN0aW9uU3R5bGVDYW5jZWxdOwotCi0gIFtfUERGRG93bmxvYWRpbmdFcnJvckRpYWxvZyBzdGFydF07Ci19Ci0KLS0gKHZvaWQpZG93bmxvYWRQREZGaWxlV2l0aFVSTDooY29uc3QgR1VSTCYpVVJMCi0gICAgICAgICAgICAgICAgdmlld0NvbnRyb2xsZXI6KFVJVmlld0NvbnRyb2xsZXIqKXZpZXdDb250cm9sbGVyIHsKLSAgRENIRUNLKCFfZmV0Y2hlcik7Ci0gIF9mZXRjaGVyRGVsZWdhdGUtPlNldFZpZXdDb250cm9sbGVyKHZpZXdDb250cm9sbGVyKTsKLSAgX2ZldGNoZXIgPSBVUkxGZXRjaGVyOjpDcmVhdGUoVVJMLCBVUkxGZXRjaGVyOjpHRVQsIF9mZXRjaGVyRGVsZWdhdGUuZ2V0KCkpOwotICBfZmV0Y2hlci0+U2V0UmVxdWVzdENvbnRleHQoX3JlcXVlc3RDb250ZXh0R2V0dGVyLmdldCgpKTsKLSAgX2ZldGNoZXItPlN0YXJ0KCk7Ci0gIFtzZWxmIHNob3dQREZEb3dubG9hZGluZ0RpYWxvZzp2aWV3Q29udHJvbGxlcl07Ci19Ci0KLS0gKHZvaWQpZmluaXNoZWREb3dubG9hZGluZ1BERjooVUlWaWV3Q29udHJvbGxlciopdmlld0NvbnRyb2xsZXIgewotICBbc2VsZiBkaXNtaXNzUERGRG93bmxvYWRpbmdEaWFsb2ddOwotICBEQ0hFQ0soX2ZldGNoZXIpOwotICBiYXNlOjpTY29wZWRDbG9zdXJlUnVubmVyIGZldGNoZXJSZXNldHRlcihiYXNlOjpCaW5kT25jZSheewotICAgIF9mZXRjaGVyLnJlc2V0KCk7Ci0gIH0pKTsKLSAgaW50IHJlc3BvbnNlQ29kZSA9IF9mZXRjaGVyLT5HZXRSZXNwb25zZUNvZGUoKTsKLSAgc3RkOjpzdHJpbmcgcmVzcG9uc2U7Ci0gIHN0ZDo6c3RyaW5nIE1JTUVUeXBlOwotICAvLyBJZiB0aGUgcmVxdWVzdCBpcyBub3Qgc3VjY2Vzc2Z1bCBvciBkb2VzIG5vdCBtYXRjaCBhIFBERgotICAvLyBNSU1FIHR5cGUsIHNob3cgYW4gZXJyb3IuCi0gIGlmICghX2ZldGNoZXItPkdldFN0YXR1cygpLmlzX3N1Y2Nlc3MoKSB8fCByZXNwb25zZUNvZGUgIT0gMjAwIHx8Ci0gICAgICAhX2ZldGNoZXItPkdldFJlc3BvbnNlQXNTdHJpbmcoJnJlc3BvbnNlKSB8fAotICAgICAgIV9mZXRjaGVyLT5HZXRSZXNwb25zZUhlYWRlcnMoKS0+R2V0TWltZVR5cGUoJk1JTUVUeXBlKSB8fAotICAgICAgTUlNRVR5cGUgIT0ga1BERk1pbWVUeXBlKSB7Ci0gICAgW3NlbGYgc2hvd1BERkRvd25sb2FkRXJyb3JXaXRoVVJMOl9mZXRjaGVyLT5HZXRPcmlnaW5hbFVSTCgpCi0gICAgICAgICAgICAgICAgICAgICAgIHZpZXdDb250cm9sbGVyOnZpZXdDb250cm9sbGVyXTsKLSAgICByZXR1cm47Ci0gIH0KLSAgTlNEYXRhKiBkYXRhID0KLSAgICAgIFtOU0RhdGEgZGF0YVdpdGhCeXRlczpyZXNwb25zZS5jX3N0cigpIGxlbmd0aDpyZXNwb25zZS5sZW5ndGgoKV07Ci0gIC8vIElmIHRoZSBkYXRhIGNhbm5vdCBiZSBwcmludGVkLCBzaG93IGFuIGVycm9yLgotICBpZiAoIVtVSVByaW50SW50ZXJhY3Rpb25Db250cm9sbGVyIGNhblByaW50RGF0YTpkYXRhXSkgewotICAgIFtzZWxmIHNob3dQREZEb3dubG9hZEVycm9yV2l0aFVSTDpfZmV0Y2hlci0+R2V0T3JpZ2luYWxVUkwoKQotICAgICAgICAgICAgICAgICAgICAgICB2aWV3Q29udHJvbGxlcjp2aWV3Q29udHJvbGxlcl07Ci0gICAgcmV0dXJuOwotICB9Ci0gIFVJUHJpbnRJbnRlcmFjdGlvbkNvbnRyb2xsZXIqIHByaW50SW50ZXJhY3Rpb25Db250cm9sbGVyID0KLSAgICAgIFtVSVByaW50SW50ZXJhY3Rpb25Db250cm9sbGVyIHNoYXJlZFByaW50Q29udHJvbGxlcl07Ci0gIHByaW50SW50ZXJhY3Rpb25Db250cm9sbGVyLnByaW50aW5nSXRlbSA9IGRhdGE7Ci0gIFtQcmludENvbnRyb2xsZXIgZGlzcGxheVByaW50SW50ZXJhY3Rpb25Db250cm9sbGVyOnByaW50SW50ZXJhY3Rpb25Db250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yUERGOllFU107Ci19Ci0KIEBlbmQKZGlmZiAtLWdpdCBhL2lvcy9jaHJvbWUvYnJvd3Nlci91aS9zYWRfdGFiL0JVSUxELmduIGIvaW9zL2Nocm9tZS9icm93c2VyL3VpL3NhZF90YWIvQlVJTEQuZ24KaW5kZXggYmRhZTQ1Ni4uYTZlZDg1MyAxMDA2NDQKLS0tIGEvaW9zL2Nocm9tZS9icm93c2VyL3VpL3NhZF90YWIvQlVJTEQuZ24KKysrIGIvaW9zL2Nocm9tZS9icm93c2VyL3VpL3NhZF90YWIvQlVJTEQuZ24KQEAgLTc2LDYgKzc2LDcgQEAKIH0KIAogc291cmNlX3NldCgiZWdfdGVzdHMiKSB7CisgIGRlZmluZXMgPSBbICJDSFJPTUVfRUFSTF9HUkVZXzEiIF0KICAgY29uZmlncyArPSBbICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjplbmFibGVfYXJjIiBdCiAgIHRlc3Rvbmx5ID0gdHJ1ZQogICBzb3VyY2VzID0gWwpAQCAtOTcsMyArOTgsMzAgQEAKICAgXQogICBsaWJzID0gWyAiWENUZXN0LmZyYW1ld29yayIgXQogfQorCitzb3VyY2Vfc2V0KCJlZzJfdGVzdHMiKSB7CisgIGRlZmluZXMgPSBbICJDSFJPTUVfRUFSTF9HUkVZXzIiIF0KKyAgY29uZmlncyArPSBbCisgICAgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOmVuYWJsZV9hcmMiLAorICAgICIvL2J1aWxkL2NvbmZpZy9pb3M6eGN0ZXN0X2NvbmZpZyIsCisgIF0KKyAgdGVzdG9ubHkgPSB0cnVlCisgIHNvdXJjZXMgPSBbCisgICAgInNhZF90YWJfdmlld19lZ3Rlc3QubW0iLAorICBdCisKKyAgZGVwcyA9IFsKKyAgICAiLy9jb21wb25lbnRzL3N0cmluZ3MiLAorICAgICIvL2lvcy9jaHJvbWUvYXBwL3N0cmluZ3MiLAorICAgICIvL2lvcy9jaHJvbWUvYnJvd3Nlci91aS9wb3B1cF9tZW51OmNvbnN0YW50cyIsCisgICAgIi8vaW9zL2Nocm9tZS90ZXN0OmVnX3Rlc3Rfc3VwcG9ydCtlZzIiLAorICAgICIvL2lvcy9jaHJvbWUvdGVzdC9lYXJsX2dyZXk6ZWdfdGVzdF9zdXBwb3J0K2VnMiIsCisgICAgIi8vaW9zL3Rlc3Rpbmc6ZW1iZWRkZWRfdGVzdF9zZXJ2ZXJfc3VwcG9ydCIsCisgICAgIi8vaW9zL3Rlc3RpbmcvZWFybF9ncmV5OmVnX3Rlc3Rfc3VwcG9ydCtlZzIiLAorICAgICIvL2lvcy90aGlyZF9wYXJ0eS9lYXJsX2dyZXkyOnRlc3RfbGliIiwKKyAgICAiLy9pb3Mvd2ViL3B1YmxpYy90ZXN0L2h0dHBfc2VydmVyIiwKKyAgICAiLy91aS9iYXNlIiwKKyAgXQorCisgIGxpYnMgPSBbICJVSUtpdC5mcmFtZXdvcmsiIF0KK30KZGlmZiAtLWdpdCBhL2lvcy9jaHJvbWUvYnJvd3Nlci91aS9zYWRfdGFiL3NhZF90YWJfdmlld19lZ3Rlc3QubW0gYi9pb3MvY2hyb21lL2Jyb3dzZXIvdWkvc2FkX3RhYi9zYWRfdGFiX3ZpZXdfZWd0ZXN0Lm1tCmluZGV4IDAzYzJiMDIuLmI1YjE3OTAgMTAwNjQ0Ci0tLSBhL2lvcy9jaHJvbWUvYnJvd3Nlci91aS9zYWRfdGFiL3NhZF90YWJfdmlld19lZ3Rlc3QubW0KKysrIGIvaW9zL2Nocm9tZS9icm93c2VyL3VpL3NhZF90YWIvc2FkX3RhYl92aWV3X2VndGVzdC5tbQpAQCAtMiwxNiArMiwxNCBAQAogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAotI2ltcG9ydCA8RWFybEdyZXkvRWFybEdyZXkuaD4KLSNpbXBvcnQgPFhDVGVzdC9YQ1Rlc3QuaD4KLQogI2luY2x1ZGUgImNvbXBvbmVudHMvc3RyaW5ncy9ncml0L2NvbXBvbmVudHNfc3RyaW5ncy5oIgogI2ltcG9ydCAiaW9zL2Nocm9tZS9icm93c2VyL3VpL3BvcHVwX21lbnUvcG9wdXBfbWVudV9jb25zdGFudHMuaCIKLSNpbXBvcnQgImlvcy9jaHJvbWUvdGVzdC9hcHAvY2hyb21lX3Rlc3RfdXRpbC5oIgorI2ltcG9ydCAiaW9zL2Nocm9tZS90ZXN0L2VhcmxfZ3JleS9jaHJvbWVfYWN0aW9ucy5oIgogI2ltcG9ydCAiaW9zL2Nocm9tZS90ZXN0L2VhcmxfZ3JleS9jaHJvbWVfZWFybF9ncmV5LmgiCiAjaW1wb3J0ICJpb3MvY2hyb21lL3Rlc3QvZWFybF9ncmV5L2Nocm9tZV9lYXJsX2dyZXlfdWkuaCIKICNpbXBvcnQgImlvcy9jaHJvbWUvdGVzdC9lYXJsX2dyZXkvY2hyb21lX21hdGNoZXJzLmgiCiAjaW1wb3J0ICJpb3MvY2hyb21lL3Rlc3QvZWFybF9ncmV5L2Nocm9tZV90ZXN0X2Nhc2UuaCIKKyNpbXBvcnQgImlvcy90ZXN0aW5nL2VhcmxfZ3JleS9lYXJsX2dyZXlfdGVzdC5oIgogI2ltcG9ydCAiaW9zL3dlYi9wdWJsaWMvdGVzdC9odHRwX3NlcnZlci9odHRwX3NlcnZlci5oIgogI2luY2x1ZGUgImlvcy93ZWIvcHVibGljL3Rlc3QvaHR0cF9zZXJ2ZXIvaHR0cF9zZXJ2ZXJfdXRpbC5oIgogI2luY2x1ZGUgInVpL2Jhc2UvbDEwbi9sMTBuX3V0aWxfbWFjLmgiCkBAIC0yNCw1MyArMjIsMzYgQEAKIC8vIFJldHVybnMgbWF0Y2hlciB0aGF0IGxvb2tzIGZvciB0ZXh0IGluIFVJTGFiZWwsIFVJVGV4dFZpZXcsIGFuZCBVSVRleHRGaWVsZAogLy8gb2JqZWN0cywgY2hlY2tpbmcgaWYgdGhlaXIgZGlzcGxheWVkIHN0cmluZ3MgY29udGFpbiB0aGUgcHJvdmlkZWQgfHRleHR8LgogaWQ8R1JFWU1hdGNoZXI+IENvbnRhaW5zVGV4dChOU1N0cmluZyogdGV4dCkgewotICBNYXRjaGVzQmxvY2sgbWF0Y2hlcyA9IF5CT09MKGlkIGVsZW1lbnQpIHsKKyAgR1JFWU1hdGNoZXNCbG9jayBtYXRjaGVzID0gXkJPT0woaWQgZWxlbWVudCkgewogICAgIHJldHVybiBbW2VsZW1lbnQgdGV4dF0gY29udGFpbnNTdHJpbmc6dGV4dF07CiAgIH07Ci0gIERlc2NyaWJlVG9CbG9jayBkZXNjcmliZSA9IF52b2lkKGlkPEdSRVlEZXNjcmlwdGlvbj4gZGVzY3JpcHRpb24pIHsKKyAgR1JFWURlc2NyaWJlVG9CbG9jayBkZXNjcmliZSA9IF52b2lkKGlkPEdSRVlEZXNjcmlwdGlvbj4gZGVzY3JpcHRpb24pIHsKICAgICBbZGVzY3JpcHRpb24gYXBwZW5kVGV4dDpbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAImhhc1RleHQoJyVAJykiLCB0ZXh0XV07CiAgIH07CiAgIGlkPEdSRVlNYXRjaGVyPiBtYXRjaGVyID0KICAgICAgIFtbR1JFWUVsZW1lbnRNYXRjaGVyQmxvY2sgYWxsb2NdIGluaXRXaXRoTWF0Y2hlc0Jsb2NrOm1hdGNoZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbkJsb2NrOmRlc2NyaWJlXTsKLSAgcmV0dXJuIGdyZXlfYWxsT2YoZ3JleV9hbnlPZihncmV5X2tpbmRPZkNsYXNzKFtVSUxhYmVsIGNsYXNzXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JleV9raW5kT2ZDbGFzcyhbVUlUZXh0RmllbGQgY2xhc3NdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmV5X2tpbmRPZkNsYXNzKFtVSVRleHRWaWV3IGNsYXNzXSksIG5pbCksCisgIHJldHVybiBncmV5X2FsbE9mKGdyZXlfYW55T2YoZ3JleV9raW5kT2ZDbGFzc05hbWUoQCJVSUxhYmVsIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JleV9raW5kT2ZDbGFzc05hbWUoQCJVSVRleHRGaWVsZCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXlfa2luZE9mQ2xhc3NOYW1lKEAiVUlUZXh0VmlldyIpLCBuaWwpLAogICAgICAgICAgICAgICAgICAgICBtYXRjaGVyLCBuaWwpOwogfQogCiAvLyBBIG1hdGNoZXIgZm9yIHRoZSBtYWluIHRpdGxlIG9mIHRoZSBTYWQgVGFiIGluICdyZWxvYWQnIG1vZGUuCiBpZDxHUkVZTWF0Y2hlcj4gcmVsb2FkU2FkVGFiVGl0bGVUZXh0KCkgewotICBzdGF0aWMgaWQgbWF0Y2hlciA9IG5pbDsKLSAgc3RhdGljIGRpc3BhdGNoX29uY2VfdCBvbmNlVG9rZW47Ci0gIGRpc3BhdGNoX29uY2UoJm9uY2VUb2tlbiwgXnsKLSAgICBtYXRjaGVyID0gW0dSRVlNYXRjaGVycwotICAgICAgICBtYXRjaGVyRm9yVGV4dDpsMTBuX3V0aWw6OkdldE5TU3RyaW5nKElEU19TQURfVEFCX01FU1NBR0UpXTsKLSAgfSk7Ci0gIHJldHVybiBtYXRjaGVyOworICByZXR1cm4gQ29udGFpbnNUZXh0KGwxMG5fdXRpbDo6R2V0TlNTdHJpbmcoSURTX1NBRF9UQUJfTUVTU0FHRSkpOwogfQogCiAvLyBBIG1hdGNoZXIgZm9yIHRoZSBtYWluIHRpdGxlIG9mIHRoZSBTYWQgVGFiIGluICdmZWVkYmFjaycgbW9kZS4KIGlkPEdSRVlNYXRjaGVyPiBmZWVkYmFja1NhZFRhYlRpdGxlQ29udGFpbnNUZXh0KCkgewotICBzdGF0aWMgaWQgbWF0Y2hlciA9IG5pbDsKLSAgc3RhdGljIGRpc3BhdGNoX29uY2VfdCBvbmNlVG9rZW47Ci0gIGRpc3BhdGNoX29uY2UoJm9uY2VUb2tlbiwgXnsKLSAgICBtYXRjaGVyID0gQ29udGFpbnNUZXh0KGwxMG5fdXRpbDo6R2V0TlNTdHJpbmcoSURTX1NBRF9UQUJfUkVMT0FEX1RSWSkpOwotICB9KTsKLSAgcmV0dXJuIG1hdGNoZXI7CisgIHJldHVybiBDb250YWluc1RleHQobDEwbl91dGlsOjpHZXROU1N0cmluZyhJRFNfU0FEX1RBQl9SRUxPQURfVFJZKSk7CiB9CiAKIC8vIEEgbWF0Y2hlciBmb3IgYSBoZWxwIHN0cmluZyBzdWdnZXN0aW5nIHRoZSB1c2VyIHVzZSBJbmNvZ25pdG8gTW9kZS4KIGlkPEdSRVlNYXRjaGVyPiBpbmNvZ25pdG9IZWxwQ29udGFpbnNUZXh0KCkgewotICBzdGF0aWMgaWQgbWF0Y2hlciA9IG5pbDsKLSAgc3RhdGljIGRpc3BhdGNoX29uY2VfdCBvbmNlVG9rZW47Ci0gIGRpc3BhdGNoX29uY2UoJm9uY2VUb2tlbiwgXnsKLSAgICBtYXRjaGVyID0KLSAgICAgICAgQ29udGFpbnNUZXh0KGwxMG5fdXRpbDo6R2V0TlNTdHJpbmcoSURTX1NBRF9UQUJfUkVMT0FEX0lOQ09HTklUTykpOwotICB9KTsKLSAgcmV0dXJuIG1hdGNoZXI7CisgIHJldHVybiBDb250YWluc1RleHQobDEwbl91dGlsOjpHZXROU1N0cmluZyhJRFNfU0FEX1RBQl9SRUxPQURfSU5DT0dOSVRPKSk7CiB9Ci19Cit9ICAvLyBuYW1lc3BhY2UKIAogLy8gU2FkIFRhYiBWaWV3IGludGVncmF0aW9uIHRlc3RzIGZvciBDaHJvbWUuCiBAaW50ZXJmYWNlIFNhZFRhYlZpZXdUZXN0Q2FzZSA6IENocm9tZVRlc3RDYXNlCmRpZmYgLS1naXQgYS9pb3MvY2hyb21lL2Jyb3dzZXIvdWkvc2V0dGluZ3MvcGFzc3dvcmQvcGFzc3dvcmRzX3NldHRpbmdzX2VndGVzdC5tbSBiL2lvcy9jaHJvbWUvYnJvd3Nlci91aS9zZXR0aW5ncy9wYXNzd29yZC9wYXNzd29yZHNfc2V0dGluZ3NfZWd0ZXN0Lm1tCmluZGV4IGZjNGM1NjguLjE0NTg3MDggMTAwNjQ0Ci0tLSBhL2lvcy9jaHJvbWUvYnJvd3Nlci91aS9zZXR0aW5ncy9wYXNzd29yZC9wYXNzd29yZHNfc2V0dGluZ3NfZWd0ZXN0Lm1tCisrKyBiL2lvcy9jaHJvbWUvYnJvd3Nlci91aS9zZXR0aW5ncy9wYXNzd29yZC9wYXNzd29yZHNfc2V0dGluZ3NfZWd0ZXN0Lm1tCkBAIC0xNTU2LDggKzE1NTYsMTAgQEAKICAgICBbW0VhcmxHcmV5CiAgICAgICAgIHNlbGVjdEVsZW1lbnRXaXRoTWF0Y2hlcjpncmV5X2FsbE9mKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1dHRvbldpdGhBY2Nlc3NpYmlsaXR5TGFiZWwoZGlzbWlzc0xhYmVsKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmV5X2ludGVyYWN0YWJsZSgpLCBudWxscHRyKV0KLSAgICAgICAgcGVyZm9ybUFjdGlvbjpncmV5X3RhcCgpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmV5X2ludGVyYWN0YWJsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXlfbm90KGdyZXlfYWNjZXNzaWJpbGl0eVRyYWl0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUFjY2Vzc2liaWxpdHlUcmFpdE5vdEVuYWJsZWQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKV0gcGVyZm9ybUFjdGlvbjpncmV5X3RhcCgpXTsKICAgfQogCiAgIC8vIFdhaXQgdW50aWwgdGhlIGFjdGl2aXR5IHZpZXcgaXMgZGlzbWlzc2VkLgpkaWZmIC0tZ2l0IGEvaW9zL2Nocm9tZS9icm93c2VyL3dlYi9jaGlsZF93aW5kb3dfb3Blbl9ieV9kb21fZWd0ZXN0Lm1tIGIvaW9zL2Nocm9tZS9icm93c2VyL3dlYi9jaGlsZF93aW5kb3dfb3Blbl9ieV9kb21fZWd0ZXN0Lm1tCmluZGV4IDY0ZjkwYjlhLi5hNWM5YmJkIDEwMDY0NAotLS0gYS9pb3MvY2hyb21lL2Jyb3dzZXIvd2ViL2NoaWxkX3dpbmRvd19vcGVuX2J5X2RvbV9lZ3Rlc3QubW0KKysrIGIvaW9zL2Nocm9tZS9icm93c2VyL3dlYi9jaGlsZF93aW5kb3dfb3Blbl9ieV9kb21fZWd0ZXN0Lm1tCkBAIC0yLDYgKzIsNyBAQAogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAorI2luY2x1ZGUgImJhc2Uvc3RyaW5ncy9zdHJpbmdwcmludGYuaCIKICNpbmNsdWRlICJiYXNlL3N0cmluZ3Mvc3lzX3N0cmluZ19jb252ZXJzaW9ucy5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvY29udGVudF9zZXR0aW5ncy9jb3JlL2NvbW1vbi9jb250ZW50X3NldHRpbmdzLmgiCiAjaW1wb3J0ICJpb3MvY2hyb21lL3Rlc3QvZWFybF9ncmV5L2Nocm9tZV9lYXJsX2dyZXkuaCIKQEAgLTEwLDExICsxMSwxNCBAQAogI2ltcG9ydCAiaW9zL3Rlc3RpbmcvZWFybF9ncmV5L2VhcmxfZ3JleV90ZXN0LmgiCiAjaW1wb3J0ICJpb3Mvd2ViL3B1YmxpYy90ZXN0L2h0dHBfc2VydmVyL2h0dHBfc2VydmVyLmgiCiAjaW5jbHVkZSAiaW9zL3dlYi9wdWJsaWMvdGVzdC9odHRwX3NlcnZlci9odHRwX3NlcnZlcl91dGlsLmgiCisjaW5jbHVkZSAibmV0L3Rlc3QvZW1iZWRkZWRfdGVzdF9zZXJ2ZXIvaHR0cF9yZXF1ZXN0LmgiCisjaW5jbHVkZSAibmV0L3Rlc3QvZW1iZWRkZWRfdGVzdF9zZXJ2ZXIvaHR0cF9yZXNwb25zZS5oIgogCiAjaWYgIWRlZmluZWQoX19oYXNfZmVhdHVyZSkgfHwgIV9faGFzX2ZlYXR1cmUob2JqY19hcmMpCiAjZXJyb3IgIlRoaXMgZmlsZSByZXF1aXJlcyBBUkMgc3VwcG9ydC4iCiAjZW5kaWYKIAordXNpbmcgY2hyb21lX3Rlc3RfdXRpbDo6T21uaWJveFRleHQ7CiB1c2luZyB3ZWI6OnRlc3Q6Okh0dHBTZXJ2ZXI7CiAKIG5hbWVzcGFjZSB7CkBAIC0yOSw2ICszMywzNCBAQAogY29uc3QgY2hhciBrV2luZG93MUNsb3NlZFtdID0gIndpbmRvdzEuY2xvc2VkOiB0cnVlIjsKIGNvbnN0IGNoYXIga1dpbmRvdzJDbG9zZWRbXSA9ICJ3aW5kb3cyLmNsb3NlZDogdHJ1ZSI7CiAKKy8vIFVSTHMgZm9yIHRlc3RXaW5kb3dPcGVuV3JpdGVBbmRSZWxvYWQuCitjb25zdCBjaGFyIGtXcml0ZVJlbG9hZFBhdGhbXSA9ICIvd3JpdGVSZWxvYWQuaHRtbCI7Citjb25zdCBjaGFyIGtTbG93UGF0aFtdID0gIi9zbG93Lmh0bWwiOworY29uc3QgY2hhciBrU2xvd1BhdGhDb250ZW50W10gPSAiU2xvdyBQYWdlIjsKK2ludCBrU2xvd1BhdGhEZWxheSA9IDM7CisKKy8vIG5ldDo6RW1iZWRkZWRUZXN0U2VydmVyIGhhbmRsZXIgZm9yIGtXcml0ZVJlbG9hZFBhdGggYW5kIGtTbG93UGF0aC4KK3N0ZDo6dW5pcXVlX3B0cjxuZXQ6OnRlc3Rfc2VydmVyOjpIdHRwUmVzcG9uc2U+IFdyaXRlUmVsb2FkSGFuZGxlcigKKyAgICBjb25zdCBuZXQ6OnRlc3Rfc2VydmVyOjpIdHRwUmVxdWVzdCYgcmVxdWVzdCkgeworICBpZiAocmVxdWVzdC5HZXRVUkwoKS5wYXRoKCkgPT0ga1Nsb3dQYXRoKSB7CisgICAgYXV0byBzbG93X2h0dHBfcmVzcG9uc2UgPQorICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPG5ldDo6dGVzdF9zZXJ2ZXI6OkRlbGF5ZWRIdHRwUmVzcG9uc2U+KAorICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kcyhrU2xvd1BhdGhEZWxheSkpOworICAgIHNsb3dfaHR0cF9yZXNwb25zZS0+c2V0X2NvbnRlbnRfdHlwZSgidGV4dC9odG1sIik7CisgICAgc2xvd19odHRwX3Jlc3BvbnNlLT5zZXRfY29udGVudChrU2xvd1BhdGhDb250ZW50KTsKKyAgICByZXR1cm4gc3RkOjptb3ZlKHNsb3dfaHR0cF9yZXNwb25zZSk7CisgIH0KKyAgYXV0byBodHRwX3Jlc3BvbnNlID0gc3RkOjptYWtlX3VuaXF1ZTxuZXQ6OnRlc3Rfc2VydmVyOjpCYXNpY0h0dHBSZXNwb25zZT4oKTsKKyAgaHR0cF9yZXNwb25zZS0+c2V0X2NvbnRlbnRfdHlwZSgidGV4dC9odG1sIik7CisgIGh0dHBfcmVzcG9uc2UtPnNldF9jb250ZW50KGJhc2U6OlN0cmluZ1ByaW50ZigKKyAgICAgICI8aHRtbD48Ym9keT48c2NyaXB0PmZ1bmN0aW9uIHN0YXJ0KCl7dmFyIHggPSB3aW5kb3cub3BlbignamF2YXNjcmlwdCIKKyAgICAgICI6ZG9jdW1lbnQud3JpdGUoMSknKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7eC5sb2NhdGlvbj0nJXMnfSwgIgorICAgICAgIjUwMCk7fTs8L3NjcmlwdD48aW5wdXQgb25jbGljaz0nc3RhcnQoKScgaWQ9J2J1dHRvbicgdmFsdWU9J2J1dHRvbicgIgorICAgICAgInR5cGU9J2J1dHRvbicgLz48L2JvZHk+PC9odG1sPiIsCisgICAgICBrU2xvd1BhdGgpKTsKKyAgcmV0dXJuIHN0ZDo6bW92ZShodHRwX3Jlc3BvbnNlKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlCiAKIC8vIFRlc3QgY2FzZSBmb3IgY2hpbGQgd2luZG93cyBvcGVuZWQgYnkgRE9NLgpAQCAtMjA4LDQgKzI0MCwyMCBAQAogICBbQ2hyb21lRWFybEdyZXkgd2FpdEZvcldlYlN0YXRlQ29udGFpbmluZ1RleHQ6a1dpbmRvdzJDbG9zZWRdOwogfQogCisvLyBUZXN0cyB0aGF0IHJlbG9hZGluZyBhIHdpbmRvdy5vcGVuIHdpdGggYSBkb2N1bWVudC53cml0ZSBkb2VzIG5vdCBsZWF2ZSBhCisvLyBkYW5nbGluZyBwZW5kaW5nIGl0ZW0uIFRoaXMgaXMgYSByZWdyZXNzaW9uIHRlc3QgZnJvbSBjcmJ1Zy5jb20vMTAxMTg5OAorLSAodm9pZCl0ZXN0V2luZG93T3BlbldyaXRlQW5kUmVsb2FkIHsKKyAgc2VsZi50ZXN0U2VydmVyLT5SZWdpc3RlclJlcXVlc3RIYW5kbGVyKGJhc2U6OkJpbmQoJldyaXRlUmVsb2FkSGFuZGxlcikpOworICBHUkVZQXNzZXJ0VHJ1ZShzZWxmLnRlc3RTZXJ2ZXItPlN0YXJ0KCksIEAiVGVzdCBzZXJ2ZXIgZmFpbGVkIHRvIHN0YXJ0LiIpOworICBbQ2hyb21lRWFybEdyZXkgbG9hZFVSTDpzZWxmLnRlc3RTZXJ2ZXItPkdldFVSTChrV3JpdGVSZWxvYWRQYXRoKV07CisgIFtDaHJvbWVFYXJsR3JleSB0YXBXZWJTdGF0ZUVsZW1lbnRXaXRoSUQ6QCJidXR0b24iXTsKKyAgW0Nocm9tZUVhcmxHcmV5IHJlbG9hZF07CisgIFtDaHJvbWVFYXJsR3JleSB3YWl0Rm9yV2ViU3RhdGVDb250YWluaW5nVGV4dDprU2xvd1BhdGhDb250ZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dDprU2xvd1BhdGhEZWxheSAqIDJdOworCisgIEdVUkwgc2xvd1VSTCA9IHNlbGYudGVzdFNlcnZlci0+R2V0VVJMKGtTbG93UGF0aCk7CisgIFtbRWFybEdyZXkgc2VsZWN0RWxlbWVudFdpdGhNYXRjaGVyOk9tbmlib3hUZXh0KHNsb3dVUkwuR2V0Q29udGVudCgpKV0KKyAgICAgIGFzc2VydFdpdGhNYXRjaGVyOmdyZXlfbm90TmlsKCldOworfQorCiBAZW5kCmRpZmYgLS1naXQgYS9pb3MvY2hyb21lL3Rlc3QvZWFybF9ncmV5L0JVSUxELmduIGIvaW9zL2Nocm9tZS90ZXN0L2VhcmxfZ3JleS9CVUlMRC5nbgppbmRleCA0MDA4YWYyLi45NzBlOTAyIDEwMDY0NAotLS0gYS9pb3MvY2hyb21lL3Rlc3QvZWFybF9ncmV5L0JVSUxELmduCisrKyBiL2lvcy9jaHJvbWUvdGVzdC9lYXJsX2dyZXkvQlVJTEQuZ24KQEAgLTI2Niw2ICsyNjYsNyBAQAogICAgICIvL2lvcy9jaHJvbWUvYnJvd3Nlci91aS90b29sYmFyL3B1YmxpYyIsCiAgICAgIi8vaW9zL2Nocm9tZS9icm93c2VyL3VpL3V0aWwiLAogICAgICIvL2lvcy9jaHJvbWUvdGVzdC9hcHA6dGVzdF9zdXBwb3J0IiwKKyAgICAiLy9pb3MvdGVzdGluZzp2ZXJpZnlfY3VzdG9tX3dlYmtpdCIsCiAgICAgIi8vaW9zL3Rlc3RpbmcvZWFybF9ncmV5OmVhcmxfZ3JleV9zdXBwb3J0IiwKICAgICAiLy9pb3MvdGhpcmRfcGFydHkvbWF0ZXJpYWxfY29tcG9uZW50c19pb3MiLAogICAgICIvL2lvcy90aGlyZF9wYXJ0eS93ZWJraXQiLApAQCAtMzc0LDYgKzM3NSw3IEBACiAgICAgIi8vaW9zL2Nocm9tZS9icm93c2VyL3VpL3V0aWwiLAogICAgICIvL2lvcy9jaHJvbWUvdGVzdC9hcHA6dGVzdF9zdXBwb3J0IiwKICAgICAiLy9pb3MvdGVzdGluZzpuc2Vycm9yX3N1cHBvcnQiLAorICAgICIvL2lvcy90ZXN0aW5nOnZlcmlmeV9jdXN0b21fd2Via2l0IiwKICAgICAiLy9pb3MvdGVzdGluZy9lYXJsX2dyZXk6ZWdfYXBwX3N1cHBvcnQrZWcyIiwKICAgICAiLy9pb3MvdGhpcmRfcGFydHkvZWFybF9ncmV5MjphcHBfZnJhbWV3b3JrK2xpbmsiLAogICAgICIvL2lvcy90aGlyZF9wYXJ0eS9ndHg6Z3R4K2xpbmsiLApkaWZmIC0tZ2l0IGEvaW9zL2Nocm9tZS90ZXN0L2VhcmxfZ3JleS9jaHJvbWVfZWFybF9ncmV5LmggYi9pb3MvY2hyb21lL3Rlc3QvZWFybF9ncmV5L2Nocm9tZV9lYXJsX2dyZXkuaAppbmRleCAxMGE0MTIxYWEuLmZhMzk0NjUzIDEwMDY0NAotLS0gYS9pb3MvY2hyb21lL3Rlc3QvZWFybF9ncmV5L2Nocm9tZV9lYXJsX2dyZXkuaAorKysgYi9pb3MvY2hyb21lL3Rlc3QvZWFybF9ncmV5L2Nocm9tZV9lYXJsX2dyZXkuaApAQCAtMzg0LDYgKzM4NCwxMSBAQAogLy8gUmV0dXJucyBZRVMgaWYgQ3JlZGl0Q2FyZFNjYW5uZXIgZmVhdHVyZSBpcyBlbmFibGVkLgogLSAoQk9PTClpc0NyZWRpdENhcmRTY2FubmVyRW5hYmxlZCBXQVJOX1VOVVNFRF9SRVNVTFQ7CiAKKy8vIFJldHVybnMgWUVTIGlmIGN1c3RvbSBXZWJLaXQgZnJhbWV3b3JrcyB3ZXJlIHByb3Blcmx5IGxvYWRlZCwgcmF0aGVyIHRoYW4KKy8vIHN5c3RlbSBmcmFtZXdvcmtzLiBBbHdheXMgcmV0dXJucyBZRVMgaWYgdGhlIGFwcCB3YXMgbm90IHJlcXVlc3RlZCB0byBydW4KKy8vIHdpdGggY3VzdG9tIFdlYktpdCBmcmFtZXdvcmtzLgorLSAoQk9PTClpc0N1c3RvbVdlYktpdExvYWRlZElmUmVxdWVzdGVkIFdBUk5fVU5VU0VEX1JFU1VMVDsKKwogI3ByYWdtYSBtYXJrIC0gUG9wdXAgQmxvY2tpbmcKIAogLy8gR2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcG9wdXAgY29udGVudCBzZXR0aW5nIHByZWZlcmVuY2UgZm9yIHRoZQpkaWZmIC0tZ2l0IGEvaW9zL2Nocm9tZS90ZXN0L2VhcmxfZ3JleS9jaHJvbWVfZWFybF9ncmV5Lm1tIGIvaW9zL2Nocm9tZS90ZXN0L2VhcmxfZ3JleS9jaHJvbWVfZWFybF9ncmV5Lm1tCmluZGV4IDM5MWFhMGUuLjZiYjBmZmYgMTAwNjQ0Ci0tLSBhL2lvcy9jaHJvbWUvdGVzdC9lYXJsX2dyZXkvY2hyb21lX2VhcmxfZ3JleS5tbQorKysgYi9pb3MvY2hyb21lL3Rlc3QvZWFybF9ncmV5L2Nocm9tZV9lYXJsX2dyZXkubW0KQEAgLTY0Nyw2ICs2NDcsMTAgQEAKICAgcmV0dXJuIFtDaHJvbWVFYXJsR3JleUFwcEludGVyZmFjZSBpc0NyZWRpdENhcmRTY2FubmVyRW5hYmxlZF07CiB9CiAKKy0gKEJPT0wpaXNDdXN0b21XZWJLaXRMb2FkZWRJZlJlcXVlc3RlZCB7CisgIHJldHVybiBbQ2hyb21lRWFybEdyZXlBcHBJbnRlcmZhY2UgaXNDdXN0b21XZWJLaXRMb2FkZWRJZlJlcXVlc3RlZF07Cit9CisKICNwcmFnbWEgbWFyayAtIFNjb3BlZEJsb2NrUG9wdXBzUHJlZgogCiAtIChDb250ZW50U2V0dGluZylwb3B1cFByZWZWYWx1ZSB7CmRpZmYgLS1naXQgYS9pb3MvY2hyb21lL3Rlc3QvZWFybF9ncmV5L2Nocm9tZV9lYXJsX2dyZXlfYXBwX2ludGVyZmFjZS5oIGIvaW9zL2Nocm9tZS90ZXN0L2VhcmxfZ3JleS9jaHJvbWVfZWFybF9ncmV5X2FwcF9pbnRlcmZhY2UuaAppbmRleCA4YjhjODgwLi5jZjY4NjY3IDEwMDY0NAotLS0gYS9pb3MvY2hyb21lL3Rlc3QvZWFybF9ncmV5L2Nocm9tZV9lYXJsX2dyZXlfYXBwX2ludGVyZmFjZS5oCisrKyBiL2lvcy9jaHJvbWUvdGVzdC9lYXJsX2dyZXkvY2hyb21lX2VhcmxfZ3JleV9hcHBfaW50ZXJmYWNlLmgKQEAgLTMxMyw2ICszMTMsMTEgQEAKIC8vIFJldHVybnMgWUVTIGlmIENyZWRpdENhcmRTY2FubmVyIGZlYXR1cmUgaXMgZW5hYmxlZC4KICsgKEJPT0wpaXNDcmVkaXRDYXJkU2Nhbm5lckVuYWJsZWQgV0FSTl9VTlVTRURfUkVTVUxUOwogCisvLyBSZXR1cm5zIFlFUyBpZiBjdXN0b20gV2ViS2l0IGZyYW1ld29ya3Mgd2VyZSBwcm9wZXJseSBsb2FkZWQsIHJhdGhlciB0aGFuCisvLyBzeXN0ZW0gZnJhbWV3b3Jrcy4gQWx3YXlzIHJldHVybnMgWUVTIGlmIHRoZSBhcHAgd2FzIG5vdCByZXF1ZXN0ZWQgdG8gcnVuCisvLyB3aXRoIGN1c3RvbSBXZWJLaXQgZnJhbWV3b3Jrcy4KKysgKEJPT0wpaXNDdXN0b21XZWJLaXRMb2FkZWRJZlJlcXVlc3RlZCBXQVJOX1VOVVNFRF9SRVNVTFQ7CisKICNwcmFnbWEgbWFyayAtIFBvcHVwIEJsb2NraW5nCiAKIC8vIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHBvcHVwIGNvbnRlbnQgc2V0dGluZyBwcmVmZXJlbmNlIGZvciB0aGUKZGlmZiAtLWdpdCBhL2lvcy9jaHJvbWUvdGVzdC9lYXJsX2dyZXkvY2hyb21lX2VhcmxfZ3JleV9hcHBfaW50ZXJmYWNlLm1tIGIvaW9zL2Nocm9tZS90ZXN0L2VhcmxfZ3JleS9jaHJvbWVfZWFybF9ncmV5X2FwcF9pbnRlcmZhY2UubW0KaW5kZXggNWVmYjdjOC4uZTU3Y2FjOSAxMDA2NDQKLS0tIGEvaW9zL2Nocm9tZS90ZXN0L2VhcmxfZ3JleS9jaHJvbWVfZWFybF9ncmV5X2FwcF9pbnRlcmZhY2UubW0KKysrIGIvaW9zL2Nocm9tZS90ZXN0L2VhcmxfZ3JleS9jaHJvbWVfZWFybF9ncmV5X2FwcF9pbnRlcmZhY2UubW0KQEAgLTI1LDYgKzI1LDcgQEAKICNpbXBvcnQgImlvcy9jaHJvbWUvdGVzdC9hcHAvdGFiX3Rlc3RfdXRpbC5oIgogI2ltcG9ydCAiaW9zL2Nocm9tZS90ZXN0L2VhcmxfZ3JleS9hY2Nlc3NpYmlsaXR5X3V0aWwuaCIKICNpbXBvcnQgImlvcy90ZXN0aW5nL25zZXJyb3JfdXRpbC5oIgorI2luY2x1ZGUgImlvcy90ZXN0aW5nL3ZlcmlmeV9jdXN0b21fd2Via2l0LmgiCiAjaW1wb3J0ICJpb3Mvd2ViL2NvbW1vbi9mZWF0dXJlcy5oIgogI2ltcG9ydCAiaW9zL3dlYi9wdWJsaWMvZGVwcmVjYXRlZC9jcndfanNfaW5qZWN0aW9uX3JlY2VpdmVyLmgiCiAjaW1wb3J0ICJpb3Mvd2ViL3B1YmxpYy9uYXZpZ2F0aW9uL25hdmlnYXRpb25fbWFuYWdlci5oIgpAQCAtNTM3LDYgKzUzOCwxMCBAQAogICByZXR1cm4gYmFzZTo6RmVhdHVyZUxpc3Q6OklzRW5hYmxlZChrQ3JlZGl0Q2FyZFNjYW5uZXIpOwogfQogCisrIChCT09MKWlzQ3VzdG9tV2ViS2l0TG9hZGVkSWZSZXF1ZXN0ZWQgeworICByZXR1cm4gSXNDdXN0b21XZWJLaXRMb2FkZWRJZlJlcXVlc3RlZCgpOworfQorCiAjcHJhZ21hIG1hcmsgLSBTY29wZWRCbG9ja1BvcHVwc1ByZWYKIAogKyAoQ29udGVudFNldHRpbmcpcG9wdXBQcmVmVmFsdWUgewpkaWZmIC0tZ2l0IGEvaW9zL2Nocm9tZS90ZXN0L2VhcmxfZ3JleS9jaHJvbWVfdGVzdF9jYXNlLm1tIGIvaW9zL2Nocm9tZS90ZXN0L2VhcmxfZ3JleS9jaHJvbWVfdGVzdF9jYXNlLm1tCmluZGV4IDhjN2ZiN2QuLmM1NzQ4ZjkgMTAwNjQ0Ci0tLSBhL2lvcy9jaHJvbWUvdGVzdC9lYXJsX2dyZXkvY2hyb21lX3Rlc3RfY2FzZS5tbQorKysgYi9pb3MvY2hyb21lL3Rlc3QvZWFybF9ncmV5L2Nocm9tZV90ZXN0X2Nhc2UubW0KQEAgLTQwOCw2ICs0MDgsOCBAQAogLy8gRGlzbWlzc2VzIGFuZCByZXZlcnQgYnJvd3NlciBzZXR0aW5ncyB0byBkZWZhdWx0LgogLy8gSXQgYWxzbyBzdGFydHMgdGhlIEhUVFAgc2VydmVyIGFuZCBlbmFibGVzIG1vY2sgYXV0aGVudGljYXRpb24uCiArICh2b2lkKXNldFVwSGVscGVyIHsKKyAgWENUQXNzZXJ0VHJ1ZShbQ2hyb21lRWFybEdyZXkgaXNDdXN0b21XZWJLaXRMb2FkZWRJZlJlcXVlc3RlZF0pOworCiAgIFtDb3ZlcmFnZVV0aWxzIGNvbmZpZ3VyZUNvdmVyYWdlUmVwb3J0UGF0aF07CiAKICAgW1tzZWxmIGNsYXNzXSBzdGFydEhUVFBTZXJ2ZXJdOwpkaWZmIC0tZ2l0IGEvaW9zL2Nocm9tZS90ZXN0L2VhcmxfZ3JleTIvQlVJTEQuZ24gYi9pb3MvY2hyb21lL3Rlc3QvZWFybF9ncmV5Mi9CVUlMRC5nbgppbmRleCA5Zjk5NDBjLi40MDU4ZTY1IDEwMDY0NAotLS0gYS9pb3MvY2hyb21lL3Rlc3QvZWFybF9ncmV5Mi9CVUlMRC5nbgorKysgYi9pb3MvY2hyb21lL3Rlc3QvZWFybF9ncmV5Mi9CVUlMRC5nbgpAQCAtNDYsNiArNDYsNyBAQAogICAgICIvL2lvcy9jaHJvbWUvYnJvd3Nlci91aS9vbW5pYm94L3BvcHVwL3Nob3J0Y3V0czplZzJfdGVzdHMiLAogICAgICIvL2lvcy9jaHJvbWUvYnJvd3Nlci91aS9vcGVuX2luOmVnMl90ZXN0cyIsCiAgICAgIi8vaW9zL2Nocm9tZS9icm93c2VyL3VpL3BhZ2VfaW5mbzplZzJfdGVzdHMiLAorICAgICIvL2lvcy9jaHJvbWUvYnJvd3Nlci91aS9zYWRfdGFiOmVnMl90ZXN0cyIsCiAgICAgIi8vaW9zL2Nocm9tZS9icm93c2VyL3VpL3NldHRpbmdzL2F1dG9maWxsOmVnMl90ZXN0cyIsCiAgICAgIi8vaW9zL2Nocm9tZS9icm93c2VyL3VpL3Rvb2xiYXI6ZWcyX3Rlc3RzIiwKICAgXQpkaWZmIC0tZ2l0IGEvaW9zL25ldC9jb29raWVzL2Nvb2tpZV9zdG9yZV9pb3NfdW5pdHRlc3QubW0gYi9pb3MvbmV0L2Nvb2tpZXMvY29va2llX3N0b3JlX2lvc191bml0dGVzdC5tbQppbmRleCBlZmQ3ZGMxNzIuLmYxOGQ1OTVjIDEwMDY0NAotLS0gYS9pb3MvbmV0L2Nvb2tpZXMvY29va2llX3N0b3JlX2lvc191bml0dGVzdC5tbQorKysgYi9pb3MvbmV0L2Nvb2tpZXMvY29va2llX3N0b3JlX2lvc191bml0dGVzdC5tbQpAQCAtNjksNiArNjksNyBAQAogICBzdGF0aWMgY29uc3QgYm9vbCBoYXNfZXhhY3RfY2hhbmdlX2NhdXNlID0gZmFsc2U7CiAgIHN0YXRpYyBjb25zdCBib29sIGhhc19leGFjdF9jaGFuZ2Vfb3JkZXJpbmcgPSBmYWxzZTsKICAgc3RhdGljIGNvbnN0IGludCBjcmVhdGlvbl90aW1lX2dyYW51bGFyaXR5X2luX21zID0gMTAwMDsKKyAgc3RhdGljIGNvbnN0IGJvb2wgc3VwcG9ydHNfY29va2llX2FjY2Vzc19zZW1hbnRpY3MgPSBmYWxzZTsKIAogICBiYXNlOjp0ZXN0OjpTaW5nbGVUaHJlYWRUYXNrRW52aXJvbm1lbnQgdGFza19lbnZpcm9ubWVudF87CiB9OwpkaWZmIC0tZ2l0IGEvaW9zL3Rlc3RpbmcvQlVJTEQuZ24gYi9pb3MvdGVzdGluZy9CVUlMRC5nbgppbmRleCA0YzEyZDM5Li5jN2I1NzRkIDEwMDY0NAotLS0gYS9pb3MvdGVzdGluZy9CVUlMRC5nbgorKysgYi9pb3MvdGVzdGluZy9CVUlMRC5nbgpAQCAtMTIsNiArMTIsMTggQEAKICAgXQogfQogCitzb3VyY2Vfc2V0KCJ2ZXJpZnlfY3VzdG9tX3dlYmtpdCIpIHsKKyAgY29uZmlncyArPSBbICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjplbmFibGVfYXJjIiBdCisgIHRlc3Rvbmx5ID0gdHJ1ZQorICBzb3VyY2VzID0gWworICAgICJ2ZXJpZnlfY3VzdG9tX3dlYmtpdC5oIiwKKyAgICAidmVyaWZ5X2N1c3RvbV93ZWJraXQubW0iLAorICBdCisgIGRlcHMgPSBbCisgICAgIi8vYmFzZSIsCisgIF0KK30KKwogc291cmNlX3NldCgibnNlcnJvcl9zdXBwb3J0IikgewogICBjb25maWdzICs9IFsgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOmVuYWJsZV9hcmMiIF0KICAgdGVzdG9ubHkgPSB0cnVlCmRpZmYgLS1naXQgYS9pb3MvdGVzdGluZy92ZXJpZnlfY3VzdG9tX3dlYmtpdC5oIGIvaW9zL3Rlc3RpbmcvdmVyaWZ5X2N1c3RvbV93ZWJraXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjFhMmU0MwotLS0gL2Rldi9udWxsCisrKyBiL2lvcy90ZXN0aW5nL3ZlcmlmeV9jdXN0b21fd2Via2l0LmgKQEAgLTAsMCArMSwxMyBAQAorLy8gQ29weXJpZ2h0IDIwMTkgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaWZuZGVmIElPU19URVNUSU5HX1ZFUklGWV9DVVNUT01fV0VCS0lUX0hfCisjZGVmaW5lIElPU19URVNUSU5HX1ZFUklGWV9DVVNUT01fV0VCS0lUX0hfCisKKy8vIFJldHVybnMgd2hldGhlciBjdXN0b20gV2ViS2l0IGZyYW1ld29ya3Mgd2VyZSBsb2FkZWQgaWYKKy8vIC0tcnVuLXdpdGgtY3VzdG9tLXdlYmtpdCB3YXMgcGFzc2VkIG9uIHRoZSBjb21tYW5kbGluZS4gIE90aGVyd2lzZSwgYWx3YXlzCisvLyByZXR1cm5zIHRydWUuCitib29sIElzQ3VzdG9tV2ViS2l0TG9hZGVkSWZSZXF1ZXN0ZWQoKTsKKworI2VuZGlmICAvLyBJT1NfVEVTVElOR19WRVJJRllfQ1VTVE9NX1dFQktJVF9IXwpkaWZmIC0tZ2l0IGEvaW9zL3Rlc3RpbmcvdmVyaWZ5X2N1c3RvbV93ZWJraXQubW0gYi9pb3MvdGVzdGluZy92ZXJpZnlfY3VzdG9tX3dlYmtpdC5tbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWUwOWE5Ci0tLSAvZGV2L251bGwKKysrIGIvaW9zL3Rlc3RpbmcvdmVyaWZ5X2N1c3RvbV93ZWJraXQubW0KQEAgLTAsMCArMSw1OCBAQAorLy8gQ29weXJpZ2h0IDIwMTkgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW1wb3J0ICJpb3MvdGVzdGluZy92ZXJpZnlfY3VzdG9tX3dlYmtpdC5oIgorCisjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KKyNpbmNsdWRlIDxtYWNoLW8vZHlsZC5oPgorCisjaW5jbHVkZSAiYmFzZS9jb21tYW5kX2xpbmUuaCIKKworI2lmICFkZWZpbmVkKF9faGFzX2ZlYXR1cmUpIHx8ICFfX2hhc19mZWF0dXJlKG9iamNfYXJjKQorI2Vycm9yICJUaGlzIGZpbGUgcmVxdWlyZXMgQVJDIHN1cHBvcnQuIgorI2VuZGlmCisKK25hbWVzcGFjZSB7CisKKy8vIFRoZSBzd2l0Y2ggdXNlZCB3aGVuIHJ1bm5pbmcgd2l0aCBjdXN0b20gV2ViS2l0IGZyYW1ld29ya3MuCitjb25zdCBjaGFyIGtSdW5XaXRoQ3VzdG9tV2ViS2l0W10gPSAicnVuLXdpdGgtY3VzdG9tLXdlYmtpdCI7CisKK30KKworYm9vbCBJc0N1c3RvbVdlYktpdExvYWRlZElmUmVxdWVzdGVkKCkgeworICBpZiAoIWJhc2U6OkNvbW1hbmRMaW5lOjpGb3JDdXJyZW50UHJvY2VzcygpLT5IYXNTd2l0Y2goCisgICAgICAgICAga1J1bldpdGhDdXN0b21XZWJLaXQpKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIGZvdW5kSW5jb3JyZWN0TG9hZExvY2F0aW9uID0gZmFsc2U7CisgIE5TQXJyYXk8TlNTdHJpbmcqPiogZnJhbWV3b3JrcyA9IEBbCisgICAgQCJKYXZhU2NyaXB0Q29yZS5mcmFtZXdvcmsvSmF2YVNjcmlwdENvcmUiLAorICAgIEAiV2ViQ29yZS5mcmFtZXdvcmsvV2ViQ29yZSIsCisgICAgQCJXZWJLaXQuZnJhbWV3b3JrL1dlYktpdCIsCisgICAgQCJXZWJLaXRMZWdhY3kuZnJhbWV3b3JrL1dlYktpdExlZ2FjeSIsCisgIF07CisKKyAgdWludDMyX3QgbnVtSW1hZ2VzID0gX2R5bGRfaW1hZ2VfY291bnQoKTsKKyAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG51bUltYWdlczsgaSsrKSB7CisgICAgTlNTdHJpbmcqIGltYWdlUGF0aCA9CisgICAgICAgIFtOU1N0cmluZyBzdHJpbmdXaXRoVVRGOFN0cmluZzpfZHlsZF9nZXRfaW1hZ2VfbmFtZShpKV07CisgICAgZm9yIChOU1N0cmluZyogZnJhbWV3b3JrIGluIGZyYW1ld29ya3MpIHsKKyAgICAgIGlmIChbaW1hZ2VQYXRoIGNvbnRhaW5zU3RyaW5nOmZyYW1ld29ya10pIHsKKyAgICAgICAgLy8gQ3VzdG9tIGZyYW1ld29ya3MgYXJlIGJ1bmRsZWQgaW5zaWRlIGEgIldlYktpdEZyYW1ld29ya3MiCisgICAgICAgIC8vIHN1YmRpcmVjdG9yeSwgc28gbG9vayBmb3IgdGhhdCBzdHJpbmcgdG8gYmUgcHJlc2VudCBpbiB8ZnVsbF9wYXRofC4KKyAgICAgICAgaWYgKCFbaW1hZ2VQYXRoIGNvbnRhaW5zU3RyaW5nOkAiV2ViS2l0RnJhbWV3b3JrcyJdKSB7CisgICAgICAgICAgLy8gVGhpcyBmcmFtZXdvcmsgd2FzIGxvYWRlZCBmcm9tIGFuIHVuZXhwZWN0ZWQgbG9jYXRpb24uCisgICAgICAgICAgTlNMb2coQCJVbmV4cGVjdGVkbHkgbG9hZGVkICVAIGZyb20gJUAgIiwgZnJhbWV3b3JrLCBpbWFnZVBhdGgpOworICAgICAgICAgIGZvdW5kSW5jb3JyZWN0TG9hZExvY2F0aW9uID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIE5vdGUgdGhhdCBjaGVja3MgYXJlIG5vdCBwZXJmb3JtZWQgb24gZnJhbWV3b3JrcyB0aGF0IHdlcmUgbmV2ZXIgbG9hZGVkIGF0CisgIC8vIGFsbC4gIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRoYXQgKmlmKiB0aGV5IHdlcmUgbG9hZGVkLCB0aGV5IHdlcmUgbG9hZGVkCisgIC8vIGZyb20gdGhlIGNvcnJlY3QgbG9jYXRpb24uCisgIHJldHVybiAhZm91bmRJbmNvcnJlY3RMb2FkTG9jYXRpb247Cit9CmRpZmYgLS1naXQgYS9pb3Mvd2ViL3Rlc3QvQlVJTEQuZ24gYi9pb3Mvd2ViL3Rlc3QvQlVJTEQuZ24KaW5kZXggMDBlMDI4NDAuLjkzOWEyNmY0IDEwMDY0NAotLS0gYS9pb3Mvd2ViL3Rlc3QvQlVJTEQuZ24KKysrIGIvaW9zL3dlYi90ZXN0L0JVSUxELmduCkBAIC01OCw2ICs1OCw3IEBACiAgICAgIjp0ZXN0X2NvbnN0YW50cyIsCiAgICAgIi8vYmFzZSIsCiAgICAgIi8vYmFzZS90ZXN0OnRlc3Rfc3VwcG9ydCIsCisgICAgIi8vaW9zL3Rlc3Rpbmc6dmVyaWZ5X2N1c3RvbV93ZWJraXQiLAogICAgICIvL2lvcy93ZWIiLAogICAgICIvL2lvcy93ZWIvY29tbW9uOndlYl92aWV3X2NyZWF0aW9uX3V0aWwiLAogICAgICIvL2lvcy93ZWIvbmF2aWdhdGlvbjpjb3JlIiwKZGlmZiAtLWdpdCBhL2lvcy93ZWIvdGVzdC93ZWJfdGVzdF9zdWl0ZS5tbSBiL2lvcy93ZWIvdGVzdC93ZWJfdGVzdF9zdWl0ZS5tbQppbmRleCA3NGE1MWQ2Li40NWRkMWYyIDEwMDY0NAotLS0gYS9pb3Mvd2ViL3Rlc3Qvd2ViX3Rlc3Rfc3VpdGUubW0KKysrIGIvaW9zL3dlYi90ZXN0L3dlYl90ZXN0X3N1aXRlLm1tCkBAIC00LDggKzQsMTAgQEAKIAogI2luY2x1ZGUgImlvcy93ZWIvcHVibGljL3Rlc3Qvd2ViX3Rlc3Rfc3VpdGUuaCIKIAorI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgogI2luY2x1ZGUgImJhc2UvbWVtb3J5L3B0cl91dGlsLmgiCiAjaW5jbHVkZSAiYmFzZS9wYXRoX3NlcnZpY2UuaCIKKyNpbmNsdWRlICJpb3MvdGVzdGluZy92ZXJpZnlfY3VzdG9tX3dlYmtpdC5oIgogI2luY2x1ZGUgImlvcy93ZWIvcHVibGljL25hdmlnYXRpb24vdXJsX3NjaGVtZXMuaCIKICNpbXBvcnQgImlvcy93ZWIvcHVibGljL3Rlc3QvZmFrZXMvdGVzdF93ZWJfY2xpZW50LmgiCiAjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCkBAIC0xOSw5ICsyMSwxNSBAQAogCiBXZWJUZXN0U3VpdGU6OldlYlRlc3RTdWl0ZShpbnQgYXJnYywgY2hhcioqIGFyZ3YpCiAgICAgOiBiYXNlOjpUZXN0U3VpdGUoYXJnYywgYXJndiksCi0gICAgICB3ZWJfY2xpZW50XyhiYXNlOjpXcmFwVW5pcXVlKG5ldyBUZXN0V2ViQ2xpZW50KSkge30KKyAgICAgIHdlYl9jbGllbnRfKGJhc2U6OldyYXBVbmlxdWUobmV3IFRlc3RXZWJDbGllbnQpKSB7CisgIENIRUNLKElzQ3VzdG9tV2ViS2l0TG9hZGVkSWZSZXF1ZXN0ZWQoKSk7Cit9CiAKLVdlYlRlc3RTdWl0ZTo6fldlYlRlc3RTdWl0ZSgpIHt9CitXZWJUZXN0U3VpdGU6On5XZWJUZXN0U3VpdGUoKSB7CisgIC8vIFZlcmlmeSBhZ2FpbiBhdCB0aGUgZW5kIG9mIHRoZSB0ZXN0IHJ1biwgaW4gY2FzZSBzb21lIGZyYW1ld29ya3Mgd2VyZSBub3QKKyAgLy8geWV0IGxvYWRlZCB3aGVuIHRoZSBjb25zdHJ1Y3RvciByYW4uCisgIENIRUNLKElzQ3VzdG9tV2ViS2l0TG9hZGVkSWZSZXF1ZXN0ZWQoKSk7Cit9CiAKIHZvaWQgV2ViVGVzdFN1aXRlOjpJbml0aWFsaXplKCkgewogICBiYXNlOjpUZXN0U3VpdGU6OkluaXRpYWxpemUoKTsKZGlmZiAtLWdpdCBhL2lvcy93ZWIvd2ViX3N0YXRlL3VpL2Nyd193ZWJfY29udHJvbGxlci5tbSBiL2lvcy93ZWIvd2ViX3N0YXRlL3VpL2Nyd193ZWJfY29udHJvbGxlci5tbQppbmRleCA4NjE4MjhkLi41MWQ5M2Y5IDEwMDY0NAotLS0gYS9pb3Mvd2ViL3dlYl9zdGF0ZS91aS9jcndfd2ViX2NvbnRyb2xsZXIubW0KKysrIGIvaW9zL3dlYi93ZWJfc3RhdGUvdWkvY3J3X3dlYl9jb250cm9sbGVyLm1tCkBAIC05NDEsNiArOTQxLDcgQEAKIAogLSAodm9pZClzZXREb2N1bWVudFVSTDooY29uc3QgR1VSTCYpbmV3VVJMCiAgICAgICAgICAgICAgICBjb250ZXh0Oih3ZWI6Ok5hdmlnYXRpb25Db250ZXh0SW1wbCopY29udGV4dCB7CisgIEdVUkwgb2xkRG9jdW1lbnRVUkwgPSBfZG9jdW1lbnRVUkw7CiAgIGlmIChuZXdVUkwgIT0gX2RvY3VtZW50VVJMICYmIG5ld1VSTC5pc192YWxpZCgpKSB7CiAgICAgX2RvY3VtZW50VVJMID0gbmV3VVJMOwogICAgIF91c2VySW50ZXJhY3Rpb25TdGF0ZS5TZXRVc2VySW50ZXJhY3Rpb25SZWdpc3RlcmVkU2luY2VMYXN0VXJsQ2hhbmdlKGZhbHNlKTsKQEAgLTk0OSw2ICs5NTAsMTYgQEAKICAgICAgICFjb250ZXh0LT5Jc0xvYWRpbmdIdG1sU3RyaW5nKCkgJiYgIWNvbnRleHQtPklzTG9hZGluZ0Vycm9yUGFnZSgpICYmCiAgICAgICAhSXNXS0ludGVybmFsVXJsKG5ld1VSTCkgJiYgIW5ld1VSTC5TY2hlbWVJcyh1cmw6OmtBYm91dFNjaGVtZSkgJiYKICAgICAgIHNlbGYud2ViVmlldykgeworICAgIC8vIE9uIGlPUzEzLCBXZWJLaXQgc3RhcnRlZCBjaGFuZ2luZyB0aGUgVVJMIHZpc2libGUgd2ViVmlldy5VUkwgd2hlbgorICAgIC8vIG9wZW5pbmcgYSBuZXcgdGFiIGFuZCB0aGVuIHdyaXRpbmcgdG8gaXQsIGUuZy4KKyAgICAvLyB3aW5kb3cub3BlbignamF2YXNjcmlwdDpkb2N1bWVudC53cml0ZSgxKScpLiAgVGhpcyBVUkwgaXMgbmV2ZXIgY29tbWl0ZWQsCisgICAgLy8gc28gaXQgc2hvdWxkIGJlIE9LIHRvIGlnbm9yZSB0aGlzIFVSTCBjaGFuZ2UuCisgICAgaWYgKGJhc2U6Omlvczo6SXNSdW5uaW5nT25JT1MxM09yTGF0ZXIoKSAmJiBvbGREb2N1bWVudFVSTC5Jc0Fib3V0QmxhbmsoKSAmJgorICAgICAgICAhc2VsZi53ZWJTdGF0ZUltcGwtPkdldE5hdmlnYXRpb25NYW5hZ2VyKCktPkdldExhc3RDb21taXR0ZWRJdGVtKCkgJiYKKyAgICAgICAgIXNlbGYud2ViVmlldy5sb2FkaW5nKSB7CisgICAgICByZXR1cm47CisgICAgfQorCiAgICAgR1VSTCBkb2N1bWVudE9yaWdpbiA9IG5ld1VSTC5HZXRPcmlnaW4oKTsKICAgICB3ZWI6Ok5hdmlnYXRpb25JdGVtKiBjb21taXR0ZWRJdGVtID0KICAgICAgICAgc2VsZi53ZWJTdGF0ZUltcGwtPkdldE5hdmlnYXRpb25NYW5hZ2VyKCktPkdldExhc3RDb21taXR0ZWRJdGVtKCk7CkBAIC0xOTMwLDcgKzE5NDEsOCBAQAogICBpZiAoIUlzUmVzdG9yZVNlc3Npb25VcmwoX2RvY3VtZW50VVJMKSAmJiAhSXNSZXN0b3JlU2Vzc2lvblVybChuZXdVUkwpKSB7CiAgICAgYm9vbCBpZ25vcmVfaG9zdF9jaGFuZ2UgPQogICAgICAgICAvLyBPbiBpT1MxMyBkb2N1bWVudC53cml0ZSgpIGNhbiBjaGFuZ2UgVVJMIG9yaWdpbiBmb3IgYWJvdXQ6YmxhbmsgcGFnZS4KLSAgICAgICAgKF9kb2N1bWVudFVSTC5Jc0Fib3V0QmxhbmsoKSAmJiBiYXNlOjppb3M6OklzUnVubmluZ09uSU9TMTNPckxhdGVyKCkpOworICAgICAgICAoX2RvY3VtZW50VVJMLklzQWJvdXRCbGFuaygpICYmIGJhc2U6Omlvczo6SXNSdW5uaW5nT25JT1MxM09yTGF0ZXIoKSAmJgorICAgICAgICAgIXNlbGYud2ViVmlldy5sb2FkaW5nKTsKICAgICBpZiAoIWlnbm9yZV9ob3N0X2NoYW5nZSkgewogICAgICAgRENIRUNLX0VRKF9kb2N1bWVudFVSTC5ob3N0KCksIG5ld1VSTC5ob3N0KCkpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2Jhc2UvdmlkZW9fZnJhbWUuY2MgYi9tZWRpYS9iYXNlL3ZpZGVvX2ZyYW1lLmNjCmluZGV4IDNiZGE4NTQxLi44NDI1MzI3IDEwMDY0NAotLS0gYS9tZWRpYS9iYXNlL3ZpZGVvX2ZyYW1lLmNjCisrKyBiL21lZGlhL2Jhc2UvdmlkZW9fZnJhbWUuY2MKQEAgLTQzLDcgKzQzLDggQEAKIC8vIFN0YXRpYyBjb25zdGV4cHIgY2xhc3MgZm9yIGdlbmVyYXRpbmcgdW5pcXVlIGlkZW50aWZpZXJzIGZvciBlYWNoIFZpZGVvRnJhbWUuCiBzdGF0aWMgYmFzZTo6QXRvbWljU2VxdWVuY2VOdW1iZXIgZ191bmlxdWVfaWRfZ2VuZXJhdG9yOwogCi1zdGF0aWMgc3RkOjpzdHJpbmcgU3RvcmFnZVR5cGVUb1N0cmluZygKKy8vIHN0YXRpYworc3RkOjpzdHJpbmcgVmlkZW9GcmFtZTo6U3RvcmFnZVR5cGVUb1N0cmluZygKICAgICBjb25zdCBWaWRlb0ZyYW1lOjpTdG9yYWdlVHlwZSBzdG9yYWdlX3R5cGUpIHsKICAgc3dpdGNoIChzdG9yYWdlX3R5cGUpIHsKICAgICBjYXNlIFZpZGVvRnJhbWU6OlNUT1JBR0VfVU5LTk9XTjoKZGlmZiAtLWdpdCBhL21lZGlhL2Jhc2UvdmlkZW9fZnJhbWUuaCBiL21lZGlhL2Jhc2UvdmlkZW9fZnJhbWUuaAppbmRleCBlZWJjYTg0Li45ZWE2Y2ViIDEwMDY0NAotLS0gYS9tZWRpYS9iYXNlL3ZpZGVvX2ZyYW1lLmgKKysrIGIvbWVkaWEvYmFzZS92aWRlb19mcmFtZS5oCkBAIC0zNTksNiArMzU5LDkgQEAKICAgLy8gRS5nLiAyeDIgZm9yIHRoZSBVLXBsYW5lIGluIFBJWEVMX0ZPUk1BVF9JNDIwLgogICBzdGF0aWMgZ2Z4OjpTaXplIFNhbXBsZVNpemUoVmlkZW9QaXhlbEZvcm1hdCBmb3JtYXQsIHNpemVfdCBwbGFuZSk7CiAKKyAgLy8gUmV0dXJucyBhIGh1bWFuIHJlYWRhYmxlIHN0cmluZyBvZiBTdG9yYWdlVHlwZS4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIFN0b3JhZ2VUeXBlVG9TdHJpbmcoVmlkZW9GcmFtZTo6U3RvcmFnZVR5cGUgc3RvcmFnZV90eXBlKTsKKwogICAvLyBBIHZpZGVvIGZyYW1lIHdyYXBwaW5nIGV4dGVybmFsIGRhdGEgbWF5IGJlIGJhY2tlZCBieSBhbiB1bnNhZmUgc2hhcmVkCiAgIC8vIG1lbW9yeSByZWdpb24uIFRoZXNlIG1ldGhvZHMgYXJlIHVzZWQgdG8gYXBwcm9wcmlhdGVseSB0cmFuc2Zvcm0gYQogICAvLyBWaWRlb0ZyYW1lIGNyZWF0ZWQgd2l0aCBXcmFwRXh0ZXJuYWxEYXRhLCBXcmFwRXh0ZXJuYWxZdXZhRGF0YSwgZXRjLiBUaGUKZGlmZiAtLWdpdCBhL21lZGlhL2Z1Y2hzaWEvY2RtL2Z1Y2hzaWFfc3RyZWFtX2RlY3J5cHRvci5jYyBiL21lZGlhL2Z1Y2hzaWEvY2RtL2Z1Y2hzaWFfc3RyZWFtX2RlY3J5cHRvci5jYwppbmRleCBjNjNjN2MzLi42ZWNhYmUyIDEwMDY0NAotLS0gYS9tZWRpYS9mdWNoc2lhL2NkbS9mdWNoc2lhX3N0cmVhbV9kZWNyeXB0b3IuY2MKKysrIGIvbWVkaWEvZnVjaHNpYS9jZG0vZnVjaHNpYV9zdHJlYW1fZGVjcnlwdG9yLmNjCkBAIC05MiwxNCArOTIsMjAgQEAKICAgICBmdWNoc2lhOjptZWRpYTo6U3RyZWFtUHJvY2Vzc29yUHRyIHByb2Nlc3NvcikKICAgICA6IHByb2Nlc3Nvcl8oc3RkOjptb3ZlKHByb2Nlc3NvciksIHRoaXMpIHt9CiAKLUZ1Y2hzaWFTdHJlYW1EZWNyeXB0b3JCYXNlOjp+RnVjaHNpYVN0cmVhbURlY3J5cHRvckJhc2UoKSA9IGRlZmF1bHQ7CitGdWNoc2lhU3RyZWFtRGVjcnlwdG9yQmFzZTo6fkZ1Y2hzaWFTdHJlYW1EZWNyeXB0b3JCYXNlKCkgeworICBEQ0hFQ0tfQ0FMTEVEX09OX1ZBTElEX1NFUVVFTkNFKHNlcXVlbmNlX2NoZWNrZXJfKTsKK30KIAogdm9pZCBGdWNoc2lhU3RyZWFtRGVjcnlwdG9yQmFzZTo6RGVjcnlwdEludGVybmFsKAogICAgIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gZW5jcnlwdGVkKSB7CisgIERDSEVDS19DQUxMRURfT05fVkFMSURfU0VRVUVOQ0Uoc2VxdWVuY2VfY2hlY2tlcl8pOworCiAgIGlucHV0X3dyaXRlcl9xdWV1ZV8uRW5xdWV1ZUJ1ZmZlcihzdGQ6Om1vdmUoZW5jcnlwdGVkKSk7CiB9CiAKIHZvaWQgRnVjaHNpYVN0cmVhbURlY3J5cHRvckJhc2U6OlJlc2V0U3RyZWFtKCkgeworICBEQ0hFQ0tfQ0FMTEVEX09OX1ZBTElEX1NFUVVFTkNFKHNlcXVlbmNlX2NoZWNrZXJfKTsKKwogICAvLyBDbG9zZSBjdXJyZW50IHN0cmVhbSBhbmQgZHJvcCBhbGwgdGhlIGNhY2hlZCBkZWNvZGVyIGJ1ZmZlcnMuCiAgIC8vIEtlZXAgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIHRvIGF2b2lkIGJ1ZmZlciByZS1hbGxvY2F0aW9uLgogICBwcm9jZXNzb3JfLlJlc2V0KCk7CkBAIC0xMDksNiArMTE1LDggQEAKIC8vIFN0cmVhbVByb2Nlc3NvckhlbHBlcjo6Q2xpZW50IGltcGxlbWVudGF0aW9uOgogdm9pZCBGdWNoc2lhU3RyZWFtRGVjcnlwdG9yQmFzZTo6QWxsb2NhdGVJbnB1dEJ1ZmZlcnMoCiAgICAgY29uc3QgZnVjaHNpYTo6bWVkaWE6OlN0cmVhbUJ1ZmZlckNvbnN0cmFpbnRzJiBzdHJlYW1fY29uc3RyYWludHMpIHsKKyAgRENIRUNLX0NBTExFRF9PTl9WQUxJRF9TRVFVRU5DRShzZXF1ZW5jZV9jaGVja2VyXyk7CisKICAgYmFzZTo6T3B0aW9uYWw8ZnVjaHNpYTo6c3lzbWVtOjpCdWZmZXJDb2xsZWN0aW9uQ29uc3RyYWludHM+CiAgICAgICBidWZmZXJfY29uc3RyYWludHMgPQogICAgICAgICAgIFN5c21lbUJ1ZmZlcldyaXRlcjo6R2V0UmVjb21tZW5kZWRDb25zdHJhaW50cyhzdHJlYW1fY29uc3RyYWludHMpOwpAQCAtMTI4LDEwICsxMzYsMTQgQEAKIH0KIAogdm9pZCBGdWNoc2lhU3RyZWFtRGVjcnlwdG9yQmFzZTo6T25PdXRwdXRGb3JtYXQoCi0gICAgZnVjaHNpYTo6bWVkaWE6OlN0cmVhbU91dHB1dEZvcm1hdCBmb3JtYXQpIHt9CisgICAgZnVjaHNpYTo6bWVkaWE6OlN0cmVhbU91dHB1dEZvcm1hdCBmb3JtYXQpIHsKKyAgRENIRUNLX0NBTExFRF9PTl9WQUxJRF9TRVFVRU5DRShzZXF1ZW5jZV9jaGVja2VyXyk7Cit9CiAKIHZvaWQgRnVjaHNpYVN0cmVhbURlY3J5cHRvckJhc2U6Ok9uSW5wdXRCdWZmZXJQb29sQ3JlYXRlZCgKICAgICBzdGQ6OnVuaXF1ZV9wdHI8U3lzbWVtQnVmZmVyUG9vbD4gcG9vbCkgeworICBEQ0hFQ0tfQ0FMTEVEX09OX1ZBTElEX1NFUVVFTkNFKHNlcXVlbmNlX2NoZWNrZXJfKTsKKwogICBpZiAoIXBvb2wpIHsKICAgICBETE9HKEVSUk9SKSA8PCAiRmFpbCB0byBhbGxvY2F0ZSBpbnB1dCBidWZmZXIuIjsKICAgICBPbkVycm9yKCk7CkBAIC0xNTAsNiArMTYyLDggQEAKIAogdm9pZCBGdWNoc2lhU3RyZWFtRGVjcnlwdG9yQmFzZTo6T25Xcml0ZXJDcmVhdGVkKAogICAgIHN0ZDo6dW5pcXVlX3B0cjxTeXNtZW1CdWZmZXJXcml0ZXI+IHdyaXRlcikgeworICBEQ0hFQ0tfQ0FMTEVEX09OX1ZBTElEX1NFUVVFTkNFKHNlcXVlbmNlX2NoZWNrZXJfKTsKKwogICBpZiAoIXdyaXRlcikgewogICAgIE9uRXJyb3IoKTsKICAgICByZXR1cm47CkBAIC0xNjYsNiArMTgwLDggQEAKIHZvaWQgRnVjaHNpYVN0cmVhbURlY3J5cHRvckJhc2U6OlNlbmRJbnB1dFBhY2tldCgKICAgICBjb25zdCBEZWNvZGVyQnVmZmVyKiBidWZmZXIsCiAgICAgU3RyZWFtUHJvY2Vzc29ySGVscGVyOjpJb1BhY2tldCBwYWNrZXQpIHsKKyAgRENIRUNLX0NBTExFRF9PTl9WQUxJRF9TRVFVRU5DRShzZXF1ZW5jZV9jaGVja2VyXyk7CisKICAgaWYgKCFwYWNrZXQudW5pdF9lbmQoKSkgewogICAgIC8vIFRoZSBlbmNyeXB0ZWQgZGF0YSBzaXplIGlzIHRvbyBiaWcuIERlY3J5cHRvciBzaG91bGQgY29uc2lkZXIKICAgICAvLyBzcGxpdHRpbmcgdGhlIGJ1ZmZlciBhbmQgdXBkYXRlIHRoZSBJViBhbmQgc3Vic2FtcGxlIGVudHJpZXMuCkBAIC0xODEsNiArMTk3LDggQEAKIH0KIAogdm9pZCBGdWNoc2lhU3RyZWFtRGVjcnlwdG9yQmFzZTo6UHJvY2Vzc0VuZE9mU3RyZWFtKCkgeworICBEQ0hFQ0tfQ0FMTEVEX09OX1ZBTElEX1NFUVVFTkNFKHNlcXVlbmNlX2NoZWNrZXJfKTsKKwogICBwcm9jZXNzb3JfLlByb2Nlc3NFb3MoKTsKIH0KIApAQCAtMjA4LDEzICsyMjYsMTcgQEAKIHZvaWQgRnVjaHNpYUNsZWFyU3RyZWFtRGVjcnlwdG9yOjpEZWNyeXB0KAogICAgIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gZW5jcnlwdGVkLAogICAgIERlY3J5cHRvcjo6RGVjcnlwdENCIGRlY3J5cHRfY2IpIHsKKyAgRENIRUNLX0NBTExFRF9PTl9WQUxJRF9TRVFVRU5DRShzZXF1ZW5jZV9jaGVja2VyXyk7CiAgIERDSEVDSyghZGVjcnlwdF9jYl8pOworCiAgIGRlY3J5cHRfY2JfID0gc3RkOjptb3ZlKGRlY3J5cHRfY2IpOwogICBjdXJyZW50X3N0YXR1c18gPSBEZWNyeXB0b3I6OmtTdWNjZXNzOwogICBEZWNyeXB0SW50ZXJuYWwoc3RkOjptb3ZlKGVuY3J5cHRlZCkpOwogfQogCiB2b2lkIEZ1Y2hzaWFDbGVhclN0cmVhbURlY3J5cHRvcjo6Q2FuY2VsRGVjcnlwdCgpIHsKKyAgRENIRUNLX0NBTExFRF9PTl9WQUxJRF9TRVFVRU5DRShzZXF1ZW5jZV9jaGVja2VyXyk7CisKICAgUmVzZXRTdHJlYW0oKTsKIAogICAvLyBGaXJlIHxkZWNyeXB0X2NiX3wgaW1tZWRpYXRlbHkgYXMgcmVxdWlyZWQgYnkgRGVjcnlwdG9yOjpDYW5jZWxEZWNyeXB0LgpAQCAtMjI0LDYgKzI0Niw4IEBACiAKIHZvaWQgRnVjaHNpYUNsZWFyU3RyZWFtRGVjcnlwdG9yOjpBbGxvY2F0ZU91dHB1dEJ1ZmZlcnMoCiAgICAgY29uc3QgZnVjaHNpYTo6bWVkaWE6OlN0cmVhbUJ1ZmZlckNvbnN0cmFpbnRzJiBzdHJlYW1fY29uc3RyYWludHMpIHsKKyAgRENIRUNLX0NBTExFRF9PTl9WQUxJRF9TRVFVRU5DRShzZXF1ZW5jZV9jaGVja2VyXyk7CisKICAgaWYgKCFzdHJlYW1fY29uc3RyYWludHMuaGFzX3BhY2tldF9jb3VudF9mb3JfY2xpZW50X21heCgpIHx8CiAgICAgICAhc3RyZWFtX2NvbnN0cmFpbnRzLmhhc19wYWNrZXRfY291bnRfZm9yX2NsaWVudF9taW4oKSkgewogICAgIERMT0coRVJST1IpIDw8ICJTdHJlYW1CdWZmZXJDb25zdHJhaW50cyBkb2Vzbid0IGNvbnRhaW4gcmVxdWlyZWQgZmllbGRzLiI7CkBAIC0yNDcsMTIgKzI3MSwxNSBAQAogfQogCiB2b2lkIEZ1Y2hzaWFDbGVhclN0cmVhbURlY3J5cHRvcjo6T25Qcm9jZXNzRW9zKCkgeworICBEQ0hFQ0tfQ0FMTEVEX09OX1ZBTElEX1NFUVVFTkNFKHNlcXVlbmNlX2NoZWNrZXJfKTsKKwogICAvLyBEZWNyeXB0b3IgbmV2ZXIgcHVzaGVzIEVPUyBmcmFtZS4KICAgTk9UUkVBQ0hFRCgpOwogfQogCiB2b2lkIEZ1Y2hzaWFDbGVhclN0cmVhbURlY3J5cHRvcjo6T25PdXRwdXRQYWNrZXQoCiAgICAgU3RyZWFtUHJvY2Vzc29ySGVscGVyOjpJb1BhY2tldCBwYWNrZXQpIHsKKyAgRENIRUNLX0NBTExFRF9PTl9WQUxJRF9TRVFVRU5DRShzZXF1ZW5jZV9jaGVja2VyXyk7CiAgIERDSEVDSyhkZWNyeXB0X2NiXyk7CiAKICAgRENIRUNLKG91dHB1dF9yZWFkZXJfKTsKQEAgLTMxMiw2ICszMzksOCBAQAogfQogCiB2b2lkIEZ1Y2hzaWFDbGVhclN0cmVhbURlY3J5cHRvcjo6T25Ob0tleSgpIHsKKyAgRENIRUNLX0NBTExFRF9PTl9WQUxJRF9TRVFVRU5DRShzZXF1ZW5jZV9jaGVja2VyXyk7CisKICAgLy8gUmVzZXQgdGhlIHF1ZXVlLiBUaGUgY2xpZW50IGlzIGV4cGVjdGVkIHRvIGNhbGwgRGVjcnlwdCgpIHdpdGggdGhlIHNhbWUKICAgLy8gYnVmZmVyIGFnYWluIHdoZW4gaXQgZ2V0cyBrTm9LZXkuCiAgIGlucHV0X3dyaXRlcl9xdWV1ZV8uUmVzZXRRdWV1ZSgpOwpAQCAtMzIxLDYgKzM1MCw4IEBACiB9CiAKIHZvaWQgRnVjaHNpYUNsZWFyU3RyZWFtRGVjcnlwdG9yOjpPbkVycm9yKCkgeworICBEQ0hFQ0tfQ0FMTEVEX09OX1ZBTElEX1NFUVVFTkNFKHNlcXVlbmNlX2NoZWNrZXJfKTsKKwogICBSZXNldFN0cmVhbSgpOwogICBpZiAoZGVjcnlwdF9jYl8pCiAgICAgc3RkOjptb3ZlKGRlY3J5cHRfY2JfKS5SdW4oRGVjcnlwdG9yOjprRXJyb3IsIG51bGxwdHIpOwpAQCAtMzMwLDYgKzM2MSw4IEBACiAgICAgc2l6ZV90IG51bV9idWZmZXJzX2Zvcl9jbGllbnQsCiAgICAgc2l6ZV90IG51bV9idWZmZXJzX2Zvcl9zZXJ2ZXIsCiAgICAgc3RkOjp1bmlxdWVfcHRyPFN5c21lbUJ1ZmZlclBvb2w+IHBvb2wpIHsKKyAgRENIRUNLX0NBTExFRF9PTl9WQUxJRF9TRVFVRU5DRShzZXF1ZW5jZV9jaGVja2VyXyk7CisKICAgaWYgKCFwb29sKSB7CiAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbCB0byBhbGxvY2F0ZSBvdXRwdXQgYnVmZmVyLiI7CiAgICAgT25FcnJvcigpOwpAQCAtMzUxLDYgKzM4NCw4IEBACiAKIHZvaWQgRnVjaHNpYUNsZWFyU3RyZWFtRGVjcnlwdG9yOjpPbk91dHB1dEJ1ZmZlclBvb2xSZWFkZXJDcmVhdGVkKAogICAgIHN0ZDo6dW5pcXVlX3B0cjxTeXNtZW1CdWZmZXJSZWFkZXI+IHJlYWRlcikgeworICBEQ0hFQ0tfQ0FMTEVEX09OX1ZBTElEX1NFUVVFTkNFKHNlcXVlbmNlX2NoZWNrZXJfKTsKKwogICBpZiAoIXJlYWRlcikgewogICAgIExPRyhFUlJPUikgPDwgIkZhaWwgdG8gZW5hYmxlIG91dHB1dCBidWZmZXIgcmVhZGVyLiI7CiAgICAgT25FcnJvcigpOwpAQCAtMzcyLDYgKzQwNyw3IEBACiAgICAgZnVjaHNpYTo6c3lzbWVtOjpCdWZmZXJDb2xsZWN0aW9uVG9rZW5QdHIgdG9rZW4sCiAgICAgc2l6ZV90IG51bV9idWZmZXJzX2Zvcl9kZWNyeXB0b3IsCiAgICAgc2l6ZV90IG51bV9idWZmZXJzX2Zvcl9jb2RlYykgeworICBEQ0hFQ0tfQ0FMTEVEX09OX1ZBTElEX1NFUVVFTkNFKHNlcXVlbmNlX2NoZWNrZXJfKTsKICAgRENIRUNLKCFjb21wbGV0ZV9idWZmZXJfYWxsb2NhdGlvbl9jYWxsYmFja18pOwogICBjb21wbGV0ZV9idWZmZXJfYWxsb2NhdGlvbl9jYWxsYmFja18gPQogICAgICAgYmFzZTo6QmluZE9uY2UoJlN0cmVhbVByb2Nlc3NvckhlbHBlcjo6Q29tcGxldGVPdXRwdXRCdWZmZXJzQWxsb2NhdGlvbiwKQEAgLTM4NSwxNiArNDIxLDIyIEBACiAKIHZvaWQgRnVjaHNpYVNlY3VyZVN0cmVhbURlY3J5cHRvcjo6RGVjcnlwdCgKICAgICBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IGVuY3J5cHRlZCkgeworICBEQ0hFQ0tfQ0FMTEVEX09OX1ZBTElEX1NFUVVFTkNFKHNlcXVlbmNlX2NoZWNrZXJfKTsKKwogICBEZWNyeXB0SW50ZXJuYWwoc3RkOjptb3ZlKGVuY3J5cHRlZCkpOwogfQogCiB2b2lkIEZ1Y2hzaWFTZWN1cmVTdHJlYW1EZWNyeXB0b3I6OlJlc2V0KCkgeworICBEQ0hFQ0tfQ0FMTEVEX09OX1ZBTElEX1NFUVVFTkNFKHNlcXVlbmNlX2NoZWNrZXJfKTsKKwogICBSZXNldFN0cmVhbSgpOwogICB3YWl0aW5nX2Zvcl9rZXlfID0gZmFsc2U7CiB9CiAKIHZvaWQgRnVjaHNpYVNlY3VyZVN0cmVhbURlY3J5cHRvcjo6QWxsb2NhdGVPdXRwdXRCdWZmZXJzKAogICAgIGNvbnN0IGZ1Y2hzaWE6Om1lZGlhOjpTdHJlYW1CdWZmZXJDb25zdHJhaW50cyYgc3RyZWFtX2NvbnN0cmFpbnRzKSB7CisgIERDSEVDS19DQUxMRURfT05fVkFMSURfU0VRVUVOQ0Uoc2VxdWVuY2VfY2hlY2tlcl8pOworCiAgIGlmIChjb21wbGV0ZV9idWZmZXJfYWxsb2NhdGlvbl9jYWxsYmFja18pIHsKICAgICBzdGQ6Om1vdmUoY29tcGxldGVfYnVmZmVyX2FsbG9jYXRpb25fY2FsbGJhY2tfKS5SdW4oKTsKICAgfSBlbHNlIHsKQEAgLTQwMywyMCArNDQ1LDI4IEBACiB9CiAKIHZvaWQgRnVjaHNpYVNlY3VyZVN0cmVhbURlY3J5cHRvcjo6T25Qcm9jZXNzRW9zKCkgeworICBEQ0hFQ0tfQ0FMTEVEX09OX1ZBTElEX1NFUVVFTkNFKHNlcXVlbmNlX2NoZWNrZXJfKTsKKwogICBjbGllbnRfLT5PbkRlY3J5cHRvckVuZE9mU3RyZWFtUGFja2V0KCk7CiB9CiAKIHZvaWQgRnVjaHNpYVNlY3VyZVN0cmVhbURlY3J5cHRvcjo6T25PdXRwdXRQYWNrZXQoCiAgICAgU3RyZWFtUHJvY2Vzc29ySGVscGVyOjpJb1BhY2tldCBwYWNrZXQpIHsKKyAgRENIRUNLX0NBTExFRF9PTl9WQUxJRF9TRVFVRU5DRShzZXF1ZW5jZV9jaGVja2VyXyk7CisKICAgY2xpZW50Xy0+T25EZWNyeXB0b3JPdXRwdXRQYWNrZXQoc3RkOjptb3ZlKHBhY2tldCkpOwogfQogCiBiYXNlOjpSZXBlYXRpbmdDbG9zdXJlIEZ1Y2hzaWFTZWN1cmVTdHJlYW1EZWNyeXB0b3I6OkdldE9uTmV3S2V5Q2xvc3VyZSgpIHsKKyAgRENIRUNLX0NBTExFRF9PTl9WQUxJRF9TRVFVRU5DRShzZXF1ZW5jZV9jaGVja2VyXyk7CisKICAgcmV0dXJuIEJpbmRUb0N1cnJlbnRMb29wKGJhc2U6OkJpbmRSZXBlYXRpbmcoCiAgICAgICAmRnVjaHNpYVNlY3VyZVN0cmVhbURlY3J5cHRvcjo6T25OZXdLZXksIHdlYWtfZmFjdG9yeV8uR2V0V2Vha1B0cigpKSk7CiB9CiAKIHZvaWQgRnVjaHNpYVNlY3VyZVN0cmVhbURlY3J5cHRvcjo6T25FcnJvcigpIHsKKyAgRENIRUNLX0NBTExFRF9PTl9WQUxJRF9TRVFVRU5DRShzZXF1ZW5jZV9jaGVja2VyXyk7CisKICAgUmVzZXRTdHJlYW0oKTsKIAogICAvLyBObyBuZWVkIHRvIHJlc2V0IG90aGVyIGZpZWxkcyBzaW5jZSBPbkVycm9yKCkgaXMgY2FsbGVkIGZvciBub24tcmVjb3ZlcmFibGUKQEAgLTQyNiw2ICs0NzYsNyBAQAogfQogCiB2b2lkIEZ1Y2hzaWFTZWN1cmVTdHJlYW1EZWNyeXB0b3I6Ok9uTm9LZXkoKSB7CisgIERDSEVDS19DQUxMRURfT05fVkFMSURfU0VRVUVOQ0Uoc2VxdWVuY2VfY2hlY2tlcl8pOwogICBEQ0hFQ0soIXdhaXRpbmdfZm9yX2tleV8pOwogCiAgIC8vIFJlc2V0IHN0cmVhbSBwb3NpdGlvbiwgYnV0IGtlZXAgYWxsIHBlbmRpbmcgYnVmZmVycy4gVGhleSB3aWxsIGJlCkBAIC00NDMsNiArNDk0LDggQEAKIH0KIAogdm9pZCBGdWNoc2lhU2VjdXJlU3RyZWFtRGVjcnlwdG9yOjpPbk5ld0tleSgpIHsKKyAgRENIRUNLX0NBTExFRF9PTl9WQUxJRF9TRVFVRU5DRShzZXF1ZW5jZV9jaGVja2VyXyk7CisKICAgaWYgKCF3YWl0aW5nX2Zvcl9rZXlfKSB7CiAgICAgcmV0cnlfb25fbm9fa2V5XyA9IHRydWU7CiAgICAgcmV0dXJuOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZnVjaHNpYS9jZG0vZnVjaHNpYV9zdHJlYW1fZGVjcnlwdG9yLmggYi9tZWRpYS9mdWNoc2lhL2NkbS9mdWNoc2lhX3N0cmVhbV9kZWNyeXB0b3IuaAppbmRleCA1OTRhM2VmLi42MGNjNzNkNCAxMDA2NDQKLS0tIGEvbWVkaWEvZnVjaHNpYS9jZG0vZnVjaHNpYV9zdHJlYW1fZGVjcnlwdG9yLmgKKysrIGIvbWVkaWEvZnVjaHNpYS9jZG0vZnVjaHNpYV9zdHJlYW1fZGVjcnlwdG9yLmgKQEAgLTksNiArOSw3IEBACiAKICNpbmNsdWRlIDxtZW1vcnk+CiAKKyNpbmNsdWRlICJiYXNlL3NlcXVlbmNlX2NoZWNrZXIuaCIKICNpbmNsdWRlICJtZWRpYS9iYXNlL2RlY3J5cHRvci5oIgogI2luY2x1ZGUgIm1lZGlhL2Z1Y2hzaWEvY29tbW9uL3N0cmVhbV9wcm9jZXNzb3JfaGVscGVyLmgiCiAjaW5jbHVkZSAibWVkaWEvZnVjaHNpYS9jb21tb24vc3lzbWVtX2J1ZmZlcl9wb29sLmgiCkBAIC0zOSw2ICs0MCw4IEBACiAKICAgU3lzbWVtQnVmZmVyV3JpdGVyUXVldWUgaW5wdXRfd3JpdGVyX3F1ZXVlXzsKIAorICBTRVFVRU5DRV9DSEVDS0VSKHNlcXVlbmNlX2NoZWNrZXJfKTsKKwogIHByaXZhdGU6CiAgIHZvaWQgT25JbnB1dEJ1ZmZlclBvb2xDcmVhdGVkKHN0ZDo6dW5pcXVlX3B0cjxTeXNtZW1CdWZmZXJQb29sPiBwb29sKTsKICAgdm9pZCBPbldyaXRlckNyZWF0ZWQoc3RkOjp1bmlxdWVfcHRyPFN5c21lbUJ1ZmZlcldyaXRlcj4gd3JpdGVyKTsKZGlmZiAtLWdpdCBhL21lZGlhL2Z1Y2hzaWEvY29tbW9uL3N0cmVhbV9wcm9jZXNzb3JfaGVscGVyLmNjIGIvbWVkaWEvZnVjaHNpYS9jb21tb24vc3RyZWFtX3Byb2Nlc3Nvcl9oZWxwZXIuY2MKaW5kZXggODQ2NTUzOC4uYTc0MTU4MCAxMDA2NDQKLS0tIGEvbWVkaWEvZnVjaHNpYS9jb21tb24vc3RyZWFtX3Byb2Nlc3Nvcl9oZWxwZXIuY2MKKysrIGIvbWVkaWEvZnVjaHNpYS9jb21tb24vc3RyZWFtX3Byb2Nlc3Nvcl9oZWxwZXIuY2MKQEAgLTg0LDkgKzg0LDEyIEBACiAgIHByb2Nlc3Nvcl8tPkVuYWJsZU9uU3RyZWFtRmFpbGVkKCk7CiB9CiAKLVN0cmVhbVByb2Nlc3NvckhlbHBlcjo6flN0cmVhbVByb2Nlc3NvckhlbHBlcigpID0gZGVmYXVsdDsKK1N0cmVhbVByb2Nlc3NvckhlbHBlcjo6flN0cmVhbVByb2Nlc3NvckhlbHBlcigpIHsKKyAgRENIRUNLX0NBTExFRF9PTl9WQUxJRF9USFJFQUQodGhyZWFkX2NoZWNrZXJfKTsKK30KIAogdm9pZCBTdHJlYW1Qcm9jZXNzb3JIZWxwZXI6OlByb2Nlc3MoSW9QYWNrZXQgaW5wdXQpIHsKKyAgRENIRUNLX0NBTExFRF9PTl9WQUxJRF9USFJFQUQodGhyZWFkX2NoZWNrZXJfKTsKICAgRENIRUNLKHByb2Nlc3Nvcl8pOwogCiAgIGZ1Y2hzaWE6Om1lZGlhOjpQYWNrZXQgcGFja2V0OwpAQCAtMTEzLDYgKzExNiw3IEBACiB9CiAKIHZvaWQgU3RyZWFtUHJvY2Vzc29ySGVscGVyOjpQcm9jZXNzRW9zKCkgeworICBEQ0hFQ0tfQ0FMTEVEX09OX1ZBTElEX1RIUkVBRCh0aHJlYWRfY2hlY2tlcl8pOwogICBEQ0hFQ0socHJvY2Vzc29yXyk7CiAKICAgYWN0aXZlX3N0cmVhbV8gPSB0cnVlOwpAQCAtMTIxLDYgKzEyNSw4IEBACiB9CiAKIHZvaWQgU3RyZWFtUHJvY2Vzc29ySGVscGVyOjpSZXNldCgpIHsKKyAgRENIRUNLX0NBTExFRF9PTl9WQUxJRF9USFJFQUQodGhyZWFkX2NoZWNrZXJfKTsKKwogICBpZiAoIWFjdGl2ZV9zdHJlYW1fKSB7CiAgICAgLy8gTm90aGluZyB0byBkbyBpZiB3ZSBkb24ndCBoYXZlIGFuIGFjdGl2ZSBzdHJlYW0uCiAgICAgcmV0dXJuOwpAQCAtMTM4LDYgKzE0NCw4IEBACiAKIHZvaWQgU3RyZWFtUHJvY2Vzc29ySGVscGVyOjpPblN0cmVhbUZhaWxlZCh1aW50NjRfdCBzdHJlYW1fbGlmZXRpbWVfb3JkaW5hbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWNoc2lhOjptZWRpYTo6U3RyZWFtRXJyb3IgZXJyb3IpIHsKKyAgRENIRUNLX0NBTExFRF9PTl9WQUxJRF9USFJFQUQodGhyZWFkX2NoZWNrZXJfKTsKKwogICBpZiAoc3RyZWFtX2xpZmV0aW1lX29yZGluYWxfICE9IHN0cmVhbV9saWZldGltZV9vcmRpbmFsKSB7CiAgICAgcmV0dXJuOwogICB9CkBAIC0xNTUsNiArMTYzLDggQEAKIAogdm9pZCBTdHJlYW1Qcm9jZXNzb3JIZWxwZXI6Ok9uSW5wdXRDb25zdHJhaW50cygKICAgICBmdWNoc2lhOjptZWRpYTo6U3RyZWFtQnVmZmVyQ29uc3RyYWludHMgY29uc3RyYWludHMpIHsKKyAgRENIRUNLX0NBTExFRF9PTl9WQUxJRF9USFJFQUQodGhyZWFkX2NoZWNrZXJfKTsKKwogICAvLyBCdWZmZXIgbGlmZXRpbWUgb3JkaW5hbCBpcyBhbiBvZGQgbnVtYmVyIGluY3JlbWVudGVkIGJ5IDIgZm9yIGVhY2ggYnVmZmVyCiAgIC8vIGdlbmVyYXRpb24gYXMgcmVxdWlyZWQgYnkgU3RyZWFtUHJvY2Vzc29yLgogICBpbnB1dF9idWZmZXJfbGlmZXRpbWVfb3JkaW5hbF8gKz0gMjsKQEAgLTE3OCw2ICsxODgsOCBAQAogCiB2b2lkIFN0cmVhbVByb2Nlc3NvckhlbHBlcjo6T25GcmVlSW5wdXRQYWNrZXQoCiAgICAgZnVjaHNpYTo6bWVkaWE6OlBhY2tldEhlYWRlciBmcmVlX2lucHV0X3BhY2tldCkgeworICBEQ0hFQ0tfQ0FMTEVEX09OX1ZBTElEX1RIUkVBRCh0aHJlYWRfY2hlY2tlcl8pOworCiAgIGlmICghZnJlZV9pbnB1dF9wYWNrZXQuaGFzX2J1ZmZlcl9saWZldGltZV9vcmRpbmFsKCkgfHwKICAgICAgICFmcmVlX2lucHV0X3BhY2tldC5oYXNfcGFja2V0X2luZGV4KCkpIHsKICAgICBETE9HKEVSUk9SKSA8PCAiUmVjZWl2ZWQgT25GcmVlSW5wdXRQYWNrZXQoKSB3aXRoIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLiI7CkBAIC0yMDYsNiArMjE4LDggQEAKIAogdm9pZCBTdHJlYW1Qcm9jZXNzb3JIZWxwZXI6Ok9uT3V0cHV0Q29uc3RyYWludHMoCiAgICAgZnVjaHNpYTo6bWVkaWE6OlN0cmVhbU91dHB1dENvbnN0cmFpbnRzIG91dHB1dF9jb25zdHJhaW50cykgeworICBEQ0hFQ0tfQ0FMTEVEX09OX1ZBTElEX1RIUkVBRCh0aHJlYWRfY2hlY2tlcl8pOworCiAgIGlmICghb3V0cHV0X2NvbnN0cmFpbnRzLmhhc19zdHJlYW1fbGlmZXRpbWVfb3JkaW5hbCgpKSB7CiAgICAgRExPRyhFUlJPUikKICAgICAgICAgPDwgIlJlY2VpdmVkIE9uT3V0cHV0Q29uc3RyYWludHMoKSB3aXRoIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLiI7CkBAIC0yNDIsNiArMjU2LDggQEAKIAogdm9pZCBTdHJlYW1Qcm9jZXNzb3JIZWxwZXI6Ok9uT3V0cHV0Rm9ybWF0KAogICAgIGZ1Y2hzaWE6Om1lZGlhOjpTdHJlYW1PdXRwdXRGb3JtYXQgb3V0cHV0X2Zvcm1hdCkgeworICBEQ0hFQ0tfQ0FMTEVEX09OX1ZBTElEX1RIUkVBRCh0aHJlYWRfY2hlY2tlcl8pOworCiAgIGlmICghb3V0cHV0X2Zvcm1hdC5oYXNfc3RyZWFtX2xpZmV0aW1lX29yZGluYWwoKSB8fAogICAgICAgIW91dHB1dF9mb3JtYXQuaGFzX2Zvcm1hdF9kZXRhaWxzKCkpIHsKICAgICBETE9HKEVSUk9SKSA8PCAiUmVjZWl2ZWQgT25PdXRwdXRGb3JtYXQoKSB3aXRoIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLiI7CkBAIC0yNTksNiArMjc1LDggQEAKIHZvaWQgU3RyZWFtUHJvY2Vzc29ySGVscGVyOjpPbk91dHB1dFBhY2tldChmdWNoc2lhOjptZWRpYTo6UGFja2V0IG91dHB1dF9wYWNrZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlcnJvcl9kZXRlY3RlZF9iZWZvcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlcnJvcl9kZXRlY3RlZF9kdXJpbmcpIHsKKyAgRENIRUNLX0NBTExFRF9PTl9WQUxJRF9USFJFQUQodGhyZWFkX2NoZWNrZXJfKTsKKwogICBpZiAoIW91dHB1dF9wYWNrZXQuaGFzX2hlYWRlcigpIHx8CiAgICAgICAhb3V0cHV0X3BhY2tldC5oZWFkZXIoKS5oYXNfYnVmZmVyX2xpZmV0aW1lX29yZGluYWwoKSB8fAogICAgICAgIW91dHB1dF9wYWNrZXQuaGVhZGVyKCkuaGFzX3BhY2tldF9pbmRleCgpIHx8CkBAIC0yOTksNiArMzE3LDggQEAKIHZvaWQgU3RyZWFtUHJvY2Vzc29ySGVscGVyOjpPbk91dHB1dEVuZE9mU3RyZWFtKAogICAgIHVpbnQ2NF90IHN0cmVhbV9saWZldGltZV9vcmRpbmFsLAogICAgIGJvb2wgZXJyb3JfZGV0ZWN0ZWRfYmVmb3JlKSB7CisgIERDSEVDS19DQUxMRURfT05fVkFMSURfVEhSRUFEKHRocmVhZF9jaGVja2VyXyk7CisKICAgaWYgKHN0cmVhbV9saWZldGltZV9vcmRpbmFsICE9IHN0cmVhbV9saWZldGltZV9vcmRpbmFsXykgewogICAgIHJldHVybjsKICAgfQpAQCAtMzE2LDYgKzMzNiw3IEBACiAKIHZvaWQgU3RyZWFtUHJvY2Vzc29ySGVscGVyOjpDb21wbGV0ZUlucHV0QnVmZmVyc0FsbG9jYXRpb24oCiAgICAgZnVjaHNpYTo6c3lzbWVtOjpCdWZmZXJDb2xsZWN0aW9uVG9rZW5QdHIgc3lzbWVtX3Rva2VuKSB7CisgIERDSEVDS19DQUxMRURfT05fVkFMSURfVEhSRUFEKHRocmVhZF9jaGVja2VyXyk7CiAgIERDSEVDSyghaW5wdXRfYnVmZmVyX2NvbnN0cmFpbnRzXy5Jc0VtcHR5KCkpOwogICBmdWNoc2lhOjptZWRpYTo6U3RyZWFtQnVmZmVyUGFydGlhbFNldHRpbmdzIHNldHRpbmdzOwogICBzZXR0aW5ncy5zZXRfYnVmZmVyX2xpZmV0aW1lX29yZGluYWwoaW5wdXRfYnVmZmVyX2xpZmV0aW1lX29yZGluYWxfKTsKQEAgLTMzNCw2ICszNTUsNyBAQAogICAgIHNpemVfdCBudW1fYnVmZmVyc19mb3JfY2xpZW50LAogICAgIHNpemVfdCBudW1fYnVmZmVyc19mb3Jfc2VydmVyLAogICAgIGZ1Y2hzaWE6OnN5c21lbTo6QnVmZmVyQ29sbGVjdGlvblRva2VuUHRyIGNvbGxlY3Rpb25fdG9rZW4pIHsKKyAgRENIRUNLX0NBTExFRF9PTl9WQUxJRF9USFJFQUQodGhyZWFkX2NoZWNrZXJfKTsKICAgRENIRUNLKCFvdXRwdXRfYnVmZmVyX2NvbnN0cmFpbnRzXy5Jc0VtcHR5KCkpOwogICBEQ0hFQ0tfTEUobnVtX2J1ZmZlcnNfZm9yX2NsaWVudCwKICAgICAgICAgICAgIG91dHB1dF9idWZmZXJfY29uc3RyYWludHNfLnBhY2tldF9jb3VudF9mb3JfY2xpZW50X21heCgpKTsKQEAgLTM1NCw2ICszNzYsOCBAQAogdm9pZCBTdHJlYW1Qcm9jZXNzb3JIZWxwZXI6Ok9uUmVjeWNsZU91dHB1dEJ1ZmZlcigKICAgICB1aW50NjRfdCBidWZmZXJfbGlmZXRpbWVfb3JkaW5hbCwKICAgICB1aW50MzJfdCBwYWNrZXRfaW5kZXgpIHsKKyAgRENIRUNLX0NBTExFRF9PTl9WQUxJRF9USFJFQUQodGhyZWFkX2NoZWNrZXJfKTsKKwogICBpZiAoIXByb2Nlc3Nvcl8pCiAgICAgcmV0dXJuOwogCmRpZmYgLS1naXQgYS9tZWRpYS9mdWNoc2lhL2NvbW1vbi9zdHJlYW1fcHJvY2Vzc29yX2hlbHBlci5oIGIvbWVkaWEvZnVjaHNpYS9jb21tb24vc3RyZWFtX3Byb2Nlc3Nvcl9oZWxwZXIuaAppbmRleCA4NzQxMWYyLi5lZDA4NGMzMiAxMDA2NDQKLS0tIGEvbWVkaWEvZnVjaHNpYS9jb21tb24vc3RyZWFtX3Byb2Nlc3Nvcl9oZWxwZXIuaAorKysgYi9tZWRpYS9mdWNoc2lhL2NvbW1vbi9zdHJlYW1fcHJvY2Vzc29yX2hlbHBlci5oCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSAiYmFzZS9tYWNyb3MuaCIKICNpbmNsdWRlICJiYXNlL21lbW9yeS93ZWFrX3B0ci5oIgogI2luY2x1ZGUgImJhc2Uvb3B0aW9uYWwuaCIKKyNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgogI2luY2x1ZGUgImJhc2UvdGltZS90aW1lLmgiCiAKIG5hbWVzcGFjZSBtZWRpYSB7CkBAIC0xNjksNiArMTcwLDkgQEAKICAgZnVjaHNpYTo6bWVkaWE6OlN0cmVhbVByb2Nlc3NvclB0ciBwcm9jZXNzb3JfOwogICBDbGllbnQqIGNvbnN0IGNsaWVudF87CiAKKyAgLy8gRklETCBpbnRlcmZhY2VzIGFyZSB0aHJlYWQtYWZmaW5lIChzZWUgY3JidWcuY29tLzEwMTI4NzUpLgorICBUSFJFQURfQ0hFQ0tFUih0aHJlYWRfY2hlY2tlcl8pOworCiAgIGJhc2U6OldlYWtQdHI8U3RyZWFtUHJvY2Vzc29ySGVscGVyPiB3ZWFrX3RoaXNfOwogICBiYXNlOjpXZWFrUHRyRmFjdG9yeTxTdHJlYW1Qcm9jZXNzb3JIZWxwZXI+IHdlYWtfZmFjdG9yeV87CiAKZGlmZiAtLWdpdCBhL21lZGlhL2Z1Y2hzaWEvY29tbW9uL3N5c21lbV9idWZmZXJfcG9vbC5jYyBiL21lZGlhL2Z1Y2hzaWEvY29tbW9uL3N5c21lbV9idWZmZXJfcG9vbC5jYwppbmRleCA5NGI2NzRhLi42YzMwYWQ4IDEwMDY0NAotLS0gYS9tZWRpYS9mdWNoc2lhL2NvbW1vbi9zeXNtZW1fYnVmZmVyX3Bvb2wuY2MKKysrIGIvbWVkaWEvZnVjaHNpYS9jb21tb24vc3lzbWVtX2J1ZmZlcl9wb29sLmNjCkBAIC0zMSwxMSArMzEsMTQgQEAKICAgICAgIH0pOwogfQogCi1TeXNtZW1CdWZmZXJQb29sOjpDcmVhdG9yOjp+Q3JlYXRvcigpID0gZGVmYXVsdDsKK1N5c21lbUJ1ZmZlclBvb2w6OkNyZWF0b3I6On5DcmVhdG9yKCkgeworICBEQ0hFQ0tfQ0FMTEVEX09OX1ZBTElEX1RIUkVBRCh0aHJlYWRfY2hlY2tlcl8pOworfQogCiB2b2lkIFN5c21lbUJ1ZmZlclBvb2w6OkNyZWF0b3I6OkNyZWF0ZSgKICAgICBmdWNoc2lhOjpzeXNtZW06OkJ1ZmZlckNvbGxlY3Rpb25Db25zdHJhaW50cyBjb25zdHJhaW50cywKICAgICBDcmVhdGVDQiBjcmVhdGVfY2IpIHsKKyAgRENIRUNLX0NBTExFRF9PTl9WQUxJRF9USFJFQUQodGhyZWFkX2NoZWNrZXJfKTsKICAgRENIRUNLKCFjcmVhdGVfY2JfKTsKICAgY3JlYXRlX2NiXyA9IHN0ZDo6bW92ZShjcmVhdGVfY2IpOwogICAvLyBCdWZmZXJDb2xsZWN0aW9uIG5lZWRzIHRvIGJlIHN5bmNocm9uaXplZCB0byBlbnN1cmUgdGhhdCBhbGwgdG9rZW4KQEAgLTY0LDExICs2NywxMyBAQAogfQogCiBTeXNtZW1CdWZmZXJQb29sOjp+U3lzbWVtQnVmZmVyUG9vbCgpIHsKKyAgRENIRUNLX0NBTExFRF9PTl9WQUxJRF9USFJFQUQodGhyZWFkX2NoZWNrZXJfKTsKICAgaWYgKGNvbGxlY3Rpb25fKQogICAgIGNvbGxlY3Rpb25fLT5DbG9zZSgpOwogfQogCiBmdWNoc2lhOjpzeXNtZW06OkJ1ZmZlckNvbGxlY3Rpb25Ub2tlblB0ciBTeXNtZW1CdWZmZXJQb29sOjpUYWtlVG9rZW4oKSB7CisgIERDSEVDS19DQUxMRURfT05fVkFMSURfVEhSRUFEKHRocmVhZF9jaGVja2VyXyk7CiAgIERDSEVDSyghc2hhcmVkX3Rva2Vuc18uZW1wdHkoKSk7CiAgIGF1dG8gdG9rZW4gPSBzdGQ6Om1vdmUoc2hhcmVkX3Rva2Vuc18uYmFjaygpKTsKICAgc2hhcmVkX3Rva2Vuc18ucG9wX2JhY2soKTsKQEAgLTc2LDYgKzgxLDcgQEAKIH0KIAogdm9pZCBTeXNtZW1CdWZmZXJQb29sOjpDcmVhdGVSZWFkZXIoQ3JlYXRlUmVhZGVyQ0IgY3JlYXRlX2NiKSB7CisgIERDSEVDS19DQUxMRURfT05fVkFMSURfVEhSRUFEKHRocmVhZF9jaGVja2VyXyk7CiAgIERDSEVDSyghY3JlYXRlX3JlYWRlcl9jYl8pOwogICBjcmVhdGVfcmVhZGVyX2NiXyA9IHN0ZDo6bW92ZShjcmVhdGVfY2IpOwogICBjb2xsZWN0aW9uXy0+V2FpdEZvckJ1ZmZlcnNBbGxvY2F0ZWQoCkBAIC04Myw2ICs4OSw3IEBACiB9CiAKIHZvaWQgU3lzbWVtQnVmZmVyUG9vbDo6Q3JlYXRlV3JpdGVyKENyZWF0ZVdyaXRlckNCIGNyZWF0ZV9jYikgeworICBEQ0hFQ0tfQ0FMTEVEX09OX1ZBTElEX1RIUkVBRCh0aHJlYWRfY2hlY2tlcl8pOwogICBEQ0hFQ0soIWNyZWF0ZV93cml0ZXJfY2JfKTsKICAgY3JlYXRlX3dyaXRlcl9jYl8gPSBzdGQ6Om1vdmUoY3JlYXRlX2NiKTsKICAgY29sbGVjdGlvbl8tPldhaXRGb3JCdWZmZXJzQWxsb2NhdGVkKApAQCAtOTIsNiArOTksOCBAQAogdm9pZCBTeXNtZW1CdWZmZXJQb29sOjpPbkJ1ZmZlcnNBbGxvY2F0ZWQoCiAgICAgenhfc3RhdHVzX3Qgc3RhdHVzLAogICAgIGZ1Y2hzaWE6OnN5c21lbTo6QnVmZmVyQ29sbGVjdGlvbkluZm9fMiBidWZmZXJfY29sbGVjdGlvbl9pbmZvKSB7CisgIERDSEVDS19DQUxMRURfT05fVkFMSURfVEhSRUFEKHRocmVhZF9jaGVja2VyXyk7CisKICAgaWYgKHN0YXR1cyAhPSBaWF9PSykgewogICAgIFpYX0xPRyhFUlJPUiwgc3RhdHVzKSA8PCAiRmFpbCB0byBhbGxvY2F0ZSBzeXNtZW0gYnVmZmVycy4iOwogICAgIE9uRXJyb3IoKTsKQEAgLTEwOCw2ICsxMTcsNyBAQAogfQogCiB2b2lkIFN5c21lbUJ1ZmZlclBvb2w6Ok9uRXJyb3IoKSB7CisgIERDSEVDS19DQUxMRURfT05fVkFMSURfVEhSRUFEKHRocmVhZF9jaGVja2VyXyk7CiAgIGNvbGxlY3Rpb25fLlVuYmluZCgpOwogICBpZiAoY3JlYXRlX3JlYWRlcl9jYl8pCiAgICAgc3RkOjptb3ZlKGNyZWF0ZV9yZWFkZXJfY2JfKS5SdW4obnVsbHB0cik7CkBAIC0xMzIsNiArMTQyLDggQEAKIAogc3RkOjp1bmlxdWVfcHRyPFN5c21lbUJ1ZmZlclBvb2w6OkNyZWF0b3I+CiBCdWZmZXJBbGxvY2F0b3I6Ok1ha2VCdWZmZXJQb29sQ3JlYXRvcihzaXplX3QgbnVtX29mX3Rva2VucykgeworICBEQ0hFQ0tfQ0FMTEVEX09OX1ZBTElEX1RIUkVBRCh0aHJlYWRfY2hlY2tlcl8pOworCiAgIC8vIENyZWF0ZSBhIG5ldyBzeXNtZW0gYnVmZmVyIGNvbGxlY3Rpb24gdG9rZW4gZm9yIHRoZSBhbGxvY2F0ZWQgYnVmZmVycy4KICAgZnVjaHNpYTo6c3lzbWVtOjpCdWZmZXJDb2xsZWN0aW9uVG9rZW5QdHIgY29sbGVjdGlvbl90b2tlbjsKICAgYWxsb2NhdG9yXy0+QWxsb2NhdGVTaGFyZWRDb2xsZWN0aW9uKGNvbGxlY3Rpb25fdG9rZW4uTmV3UmVxdWVzdCgpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2Z1Y2hzaWEvY29tbW9uL3N5c21lbV9idWZmZXJfcG9vbC5oIGIvbWVkaWEvZnVjaHNpYS9jb21tb24vc3lzbWVtX2J1ZmZlcl9wb29sLmgKaW5kZXggYTNmY2Y3NC4uYzRjNmNlYWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2Z1Y2hzaWEvY29tbW9uL3N5c21lbV9idWZmZXJfcG9vbC5oCisrKyBiL21lZGlhL2Z1Y2hzaWEvY29tbW9uL3N5c21lbV9idWZmZXJfcG9vbC5oCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSAiYmFzZS9jYWxsYmFjay5oIgogI2luY2x1ZGUgImJhc2UvY29udGFpbmVycy9zcGFuLmgiCiAjaW5jbHVkZSAiYmFzZS9tYWNyb3MuaCIKKyNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgogCiBuYW1lc3BhY2UgbWVkaWEgewogCkBAIC01MCw2ICs1MSw4IEBACiAgICAgc3RkOjp2ZWN0b3I8ZnVjaHNpYTo6c3lzbWVtOjpCdWZmZXJDb2xsZWN0aW9uVG9rZW5QdHI+IHNoYXJlZF90b2tlbnNfOwogICAgIENyZWF0ZUNCIGNyZWF0ZV9jYl87CiAKKyAgICBUSFJFQURfQ0hFQ0tFUih0aHJlYWRfY2hlY2tlcl8pOworCiAgICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKENyZWF0b3IpOwogICB9OwogCkBAIC04Myw2ICs4Niw5IEBACiAgIENyZWF0ZVJlYWRlckNCIGNyZWF0ZV9yZWFkZXJfY2JfOwogICBDcmVhdGVXcml0ZXJDQiBjcmVhdGVfd3JpdGVyX2NiXzsKIAorICAvLyBGSURMIGludGVyZmFjZXMgYXJlIHRocmVhZC1hZmZpbmUgKHNlZSBjcmJ1Zy5jb20vMTAxMjg3NSkuCisgIFRIUkVBRF9DSEVDS0VSKHRocmVhZF9jaGVja2VyXyk7CisKICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFN5c21lbUJ1ZmZlclBvb2wpOwogfTsKIApAQCAtMTAyLDYgKzEwOCw4IEBACiAgcHJpdmF0ZToKICAgZnVjaHNpYTo6c3lzbWVtOjpBbGxvY2F0b3JQdHIgYWxsb2NhdG9yXzsKIAorICBUSFJFQURfQ0hFQ0tFUih0aHJlYWRfY2hlY2tlcl8pOworCiAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihCdWZmZXJBbGxvY2F0b3IpOwogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvZnVjaHNpYS9jb21tb24vc3lzbWVtX2J1ZmZlcl93cml0ZXJfcXVldWUuY2MgYi9tZWRpYS9mdWNoc2lhL2NvbW1vbi9zeXNtZW1fYnVmZmVyX3dyaXRlcl9xdWV1ZS5jYwppbmRleCAxYjhkMTFjNi4uNzlhNzVlZmY2IDEwMDY0NAotLS0gYS9tZWRpYS9mdWNoc2lhL2NvbW1vbi9zeXNtZW1fYnVmZmVyX3dyaXRlcl9xdWV1ZS5jYworKysgYi9tZWRpYS9mdWNoc2lhL2NvbW1vbi9zeXNtZW1fYnVmZmVyX3dyaXRlcl9xdWV1ZS5jYwpAQCAtNDcsNiArNDcsNyBAQAogCiB2b2lkIFN5c21lbUJ1ZmZlcldyaXRlclF1ZXVlOjpFbnF1ZXVlQnVmZmVyKAogICAgIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gYnVmZmVyKSB7CisgIERDSEVDS19DQUxMRURfT05fVkFMSURfVEhSRUFEKHRocmVhZF9jaGVja2VyXyk7CiAgIHBlbmRpbmdfYnVmZmVyc18ucHVzaF9iYWNrKFBlbmRpbmdCdWZmZXIoYnVmZmVyKSk7CiAgIFB1bXBQYWNrZXRzKCk7CiB9CkBAIC01NCw2ICs1NSw3IEBACiB2b2lkIFN5c21lbUJ1ZmZlcldyaXRlclF1ZXVlOjpTdGFydChzdGQ6OnVuaXF1ZV9wdHI8U3lzbWVtQnVmZmVyV3JpdGVyPiB3cml0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZW5kUGFja2V0Q0Igc2VuZF9wYWNrZXRfY2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmRPZlN0cmVhbUNCIGVuZF9vZl9zdHJlYW1fY2IpIHsKKyAgRENIRUNLX0NBTExFRF9PTl9WQUxJRF9USFJFQUQodGhyZWFkX2NoZWNrZXJfKTsKICAgRENIRUNLKCF3cml0ZXJfKTsKIAogICB3cml0ZXJfID0gc3RkOjptb3ZlKHdyaXRlcik7CkBAIC02NCw2ICs2Niw3IEBACiB9CiAKIHZvaWQgU3lzbWVtQnVmZmVyV3JpdGVyUXVldWU6OlB1bXBQYWNrZXRzKCkgeworICBEQ0hFQ0tfQ0FMTEVEX09OX1ZBTElEX1RIUkVBRCh0aHJlYWRfY2hlY2tlcl8pOwogICBhdXRvIHdlYWtfdGhpcyA9IHdlYWtfZmFjdG9yeV8uR2V0V2Vha1B0cigpOwogCiAgIHdoaWxlICh3cml0ZXJfICYmICFpc19wYXVzZWRfICYmCkBAIC0xMTIsMTggKzExNSwyMSBAQAogfQogCiB2b2lkIFN5c21lbUJ1ZmZlcldyaXRlclF1ZXVlOjpSZXNldFF1ZXVlKCkgeworICBEQ0hFQ0tfQ0FMTEVEX09OX1ZBTElEX1RIUkVBRCh0aHJlYWRfY2hlY2tlcl8pOwogICBwZW5kaW5nX2J1ZmZlcnNfLmNsZWFyKCk7CiAgIGlucHV0X3F1ZXVlX3Bvc2l0aW9uXyA9IDA7CiAgIGlzX3BhdXNlZF8gPSBmYWxzZTsKIH0KIAogdm9pZCBTeXNtZW1CdWZmZXJXcml0ZXJRdWV1ZTo6UmVzZXRCdWZmZXJzKCkgeworICBEQ0hFQ0tfQ0FMTEVEX09OX1ZBTElEX1RIUkVBRCh0aHJlYWRfY2hlY2tlcl8pOwogICB3cml0ZXJfLnJlc2V0KCk7CiAgIHNlbmRfcGFja2V0X2NiXyA9IFNlbmRQYWNrZXRDQigpOwogICBlbmRfb2Zfc3RyZWFtX2NiXyA9IEVuZE9mU3RyZWFtQ0IoKTsKIH0KIAogdm9pZCBTeXNtZW1CdWZmZXJXcml0ZXJRdWV1ZTo6UmVzZXRQb3NpdGlvbkFuZFBhdXNlKCkgeworICBEQ0hFQ0tfQ0FMTEVEX09OX1ZBTElEX1RIUkVBRCh0aHJlYWRfY2hlY2tlcl8pOwogICBmb3IgKGF1dG8mIGJ1ZmZlciA6IHBlbmRpbmdfYnVmZmVyc18pIHsKICAgICBidWZmZXIuYnVmZmVyX3BvcyA9IDA7CiAgICAgYnVmZmVyLmlzX2NvbXBsZXRlID0gZmFsc2U7CkBAIC0xMzMsMTIgKzEzOSwxNCBAQAogfQogCiB2b2lkIFN5c21lbUJ1ZmZlcldyaXRlclF1ZXVlOjpVbnBhdXNlKCkgeworICBEQ0hFQ0tfQ0FMTEVEX09OX1ZBTElEX1RIUkVBRCh0aHJlYWRfY2hlY2tlcl8pOwogICBEQ0hFQ0soaXNfcGF1c2VkXyk7CiAgIGlzX3BhdXNlZF8gPSBmYWxzZTsKICAgUHVtcFBhY2tldHMoKTsKIH0KIAogdm9pZCBTeXNtZW1CdWZmZXJXcml0ZXJRdWV1ZTo6UmVsZWFzZUJ1ZmZlcihzaXplX3QgYnVmZmVyX2luZGV4KSB7CisgIERDSEVDS19DQUxMRURfT05fVkFMSURfVEhSRUFEKHRocmVhZF9jaGVja2VyXyk7CiAgIERDSEVDSyh3cml0ZXJfKTsKIAogICAvLyBNYXJrIHRoZSBpbnB1dCBidWZmZXIgYXMgY29tcGxldGUuCkBAIC0xNjQsNiArMTcyLDcgQEAKIH0KIAogc2l6ZV90IFN5c21lbUJ1ZmZlcldyaXRlclF1ZXVlOjpudW1fYnVmZmVycygpIGNvbnN0IHsKKyAgRENIRUNLX0NBTExFRF9PTl9WQUxJRF9USFJFQUQodGhyZWFkX2NoZWNrZXJfKTsKICAgcmV0dXJuIHdyaXRlcl8gPyB3cml0ZXJfLT5udW1fYnVmZmVycygpIDogMDsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZnVjaHNpYS9jb21tb24vc3lzbWVtX2J1ZmZlcl93cml0ZXJfcXVldWUuaCBiL21lZGlhL2Z1Y2hzaWEvY29tbW9uL3N5c21lbV9idWZmZXJfd3JpdGVyX3F1ZXVlLmgKaW5kZXggNjFhM2Y4Ni4uYjNkN2QwZSAxMDA2NDQKLS0tIGEvbWVkaWEvZnVjaHNpYS9jb21tb24vc3lzbWVtX2J1ZmZlcl93cml0ZXJfcXVldWUuaAorKysgYi9tZWRpYS9mdWNoc2lhL2NvbW1vbi9zeXNtZW1fYnVmZmVyX3dyaXRlcl9xdWV1ZS5oCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSAiYmFzZS9jb250YWluZXJzL3NwYW4uaCIKICNpbmNsdWRlICJiYXNlL21lbW9yeS93ZWFrX3B0ci5oIgogI2luY2x1ZGUgImJhc2Uvb3B0aW9uYWwuaCIKKyNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgogI2luY2x1ZGUgIm1lZGlhL2Z1Y2hzaWEvY29tbW9uL3N0cmVhbV9wcm9jZXNzb3JfaGVscGVyLmgiCiAjaW5jbHVkZSAibWVkaWEvZnVjaHNpYS9jb21tb24vc3lzbWVtX2J1ZmZlcl93cml0ZXIuaCIKIApAQCAtOTQsNiArOTUsOSBAQAogICBTZW5kUGFja2V0Q0Igc2VuZF9wYWNrZXRfY2JfOwogICBFbmRPZlN0cmVhbUNCIGVuZF9vZl9zdHJlYW1fY2JfOwogCisgIC8vIEZJREwgaW50ZXJmYWNlcyBhcmUgdGhyZWFkLWFmZmluZSAoc2VlIGNyYnVnLmNvbS8xMDEyODc1KS4KKyAgVEhSRUFEX0NIRUNLRVIodGhyZWFkX2NoZWNrZXJfKTsKKwogICBiYXNlOjpXZWFrUHRyRmFjdG9yeTxTeXNtZW1CdWZmZXJXcml0ZXJRdWV1ZT4gd2Vha19mYWN0b3J5X3t0aGlzfTsKIAogICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oU3lzbWVtQnVmZmVyV3JpdGVyUXVldWUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZ3B1L0JVSUxELmduIGIvbWVkaWEvZ3B1L0JVSUxELmduCmluZGV4IDgyN2ZmNTE1Li5iYTFiOTBlIDEwMDY0NAotLS0gYS9tZWRpYS9ncHUvQlVJTEQuZ24KKysrIGIvbWVkaWEvZ3B1L0JVSUxELmduCkBAIC0zNTEsNiArMzUxLDcgQEAKICAgICAgICI6Y29tbW9uIiwKICAgICAgICIvL2Jhc2UiLAogICAgICAgIi8vbWVkaWEiLAorICAgICAgIi8vbWVkaWEvZ3B1L2Nocm9tZW9zOmZvdXJjYyIsCiAgICAgICAiLy91aS9nZngvZ2VvbWV0cnkiLAogICAgIF0KICAgfQpAQCAtNjU3LDYgKzY1OCw3IEBACiAgICAgICAidGVzdDpyZW5kZXJfaGVscGVycyIsCiAgICAgICAiLy9iYXNlL3Rlc3Q6dGVzdF9zdXBwb3J0IiwKICAgICAgICIvL21lZGlhOnRlc3Rfc3VwcG9ydCIsCisgICAgICAiLy9tZWRpYS9ncHUvY2hyb21lb3M6Zm91cmNjIiwKICAgICAgICIvL21vam8vY29yZS9lbWJlZGRlciIsCiAgICAgICAiLy90ZXN0aW5nL2d0ZXN0IiwKICAgICBdCmRpZmYgLS1naXQgYS9tZWRpYS9ncHUvaW1hZ2VfcHJvY2Vzc29yLmNjIGIvbWVkaWEvZ3B1L2ltYWdlX3Byb2Nlc3Nvci5jYwppbmRleCA3OTA4ODAxLi5mMGZmZmFjIDEwMDY0NAotLS0gYS9tZWRpYS9ncHUvaW1hZ2VfcHJvY2Vzc29yLmNjCisrKyBiL21lZGlhL2dwdS9pbWFnZV9wcm9jZXNzb3IuY2MKQEAgLTQsNDAgKzQsNjkgQEAKIAogI2luY2x1ZGUgIm1lZGlhL2dwdS9pbWFnZV9wcm9jZXNzb3IuaCIKIAorI2luY2x1ZGUgPG9zdHJlYW0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgImJhc2Uvc3RyaW5ncy9zdHJpbmdwcmludGYuaCIKICNpbmNsdWRlICJtZWRpYS9iYXNlL2JpbmRfdG9fY3VycmVudF9sb29wLmgiCisjaW5jbHVkZSAibWVkaWEvYmFzZS92aWRlb19mcmFtZS5oIgogCiBuYW1lc3BhY2UgbWVkaWEgewogCi1JbWFnZVByb2Nlc3Nvcjo6UG9ydENvbmZpZzo6UG9ydENvbmZpZygKLSAgICBjb25zdCBWaWRlb0ZyYW1lTGF5b3V0JiBsYXlvdXQsCi0gICAgY29uc3QgZ2Z4OjpTaXplJiB2aXNpYmxlX3NpemUsCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8VmlkZW9GcmFtZTo6U3RvcmFnZVR5cGU+JiBwcmVmZXJyZWRfc3RvcmFnZV90eXBlcykKLSAgICA6IFBvcnRDb25maWcobGF5b3V0LAotICAgICAgICAgICAgICAgICBrVW5hc3NpZ25lZEZvdXJDQywKLSAgICAgICAgICAgICAgICAgdmlzaWJsZV9zaXplLAotICAgICAgICAgICAgICAgICBwcmVmZXJyZWRfc3RvcmFnZV90eXBlcykge30KK25hbWVzcGFjZSB7CisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmlkZW9GcmFtZTo6U3RvcmFnZVR5cGUmIHN0b3JhZ2VfdHlwZSkgeworICBvc3RyZWFtIDw8IFZpZGVvRnJhbWU6OlN0b3JhZ2VUeXBlVG9TdHJpbmcoc3RvcmFnZV90eXBlKTsKKyAgcmV0dXJuIG9zdHJlYW07Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorc3RkOjpzdHJpbmcgVmVjdG9yVG9TdHJpbmcoY29uc3Qgc3RkOjp2ZWN0b3I8VD4mIHZlYykgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVzdWx0OworICBzdGQ6OnN0cmluZyBkZWxpbTsKKyAgcmVzdWx0IDw8ICJbIjsKKyAgZm9yIChjb25zdCBUJiB2IDogdmVjKSB7CisgICAgcmVzdWx0IDw8IGRlbGltIDw8IHY7CisgICAgaWYgKGRlbGltLnNpemUoKSA9PSAwKQorICAgICAgZGVsaW0gPSAiLCAiOworICB9CisgIHJlc3VsdCA8PCAiXSI7CisgIHJldHVybiByZXN1bHQuc3RyKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitJbWFnZVByb2Nlc3Nvcjo6UG9ydENvbmZpZzo6UG9ydENvbmZpZyhjb25zdCBQb3J0Q29uZmlnJikgPSBkZWZhdWx0OwogCiBJbWFnZVByb2Nlc3Nvcjo6UG9ydENvbmZpZzo6UG9ydENvbmZpZygKLSAgICBjb25zdCBWaWRlb0ZyYW1lTGF5b3V0JiBsYXlvdXQsCi0gICAgdWludDMyX3QgZm91cmNjLAorICAgIEZvdXJjYyBmb3VyY2MsCisgICAgY29uc3QgZ2Z4OjpTaXplJiBzaXplLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENvbG9yUGxhbmVMYXlvdXQ+JiBwbGFuZXMsCiAgICAgY29uc3QgZ2Z4OjpTaXplJiB2aXNpYmxlX3NpemUsCiAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VmlkZW9GcmFtZTo6U3RvcmFnZVR5cGU+JiBwcmVmZXJyZWRfc3RvcmFnZV90eXBlcykKLSAgICA6IGxheW91dChsYXlvdXQpLAotICAgICAgZm91cmNjKGZvdXJjYyksCisgICAgOiBmb3VyY2MoZm91cmNjKSwKKyAgICAgIHNpemUoc2l6ZSksCisgICAgICBwbGFuZXMocGxhbmVzKSwKICAgICAgIHZpc2libGVfc2l6ZSh2aXNpYmxlX3NpemUpLAogICAgICAgcHJlZmVycmVkX3N0b3JhZ2VfdHlwZXMocHJlZmVycmVkX3N0b3JhZ2VfdHlwZXMpIHt9CiAKLUltYWdlUHJvY2Vzc29yOjpQb3J0Q29uZmlnOjp+UG9ydENvbmZpZygpIHt9CitJbWFnZVByb2Nlc3Nvcjo6UG9ydENvbmZpZzo6flBvcnRDb25maWcoKSA9IGRlZmF1bHQ7CiAKLUltYWdlUHJvY2Vzc29yOjpJbWFnZVByb2Nlc3Nvcihjb25zdCBWaWRlb0ZyYW1lTGF5b3V0JiBpbnB1dF9sYXlvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW9GcmFtZTo6U3RvcmFnZVR5cGUgaW5wdXRfc3RvcmFnZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZpZGVvRnJhbWVMYXlvdXQmIG91dHB1dF9sYXlvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW9GcmFtZTo6U3RvcmFnZVR5cGUgb3V0cHV0X3N0b3JhZ2VfdHlwZSwKK3N0ZDo6c3RyaW5nIEltYWdlUHJvY2Vzc29yOjpQb3J0Q29uZmlnOjpUb1N0cmluZygpIGNvbnN0IHsKKyAgcmV0dXJuIGJhc2U6OlN0cmluZ1ByaW50ZigKKyAgICAgICJQb3J0Q29uZmlnKGZvcm1hdDolcywgc2l6ZTolcywgcGxhbmVzOiAlcywgdmlzaWJsZV9zaXplOiVzLCAiCisgICAgICAic3RvcmFnZV90eXBlczolcykiLAorICAgICAgZm91cmNjLlRvU3RyaW5nKCkuY19zdHIoKSwgc2l6ZS5Ub1N0cmluZygpLmNfc3RyKCksCisgICAgICBWZWN0b3JUb1N0cmluZyhwbGFuZXMpLmNfc3RyKCksIHZpc2libGVfc2l6ZS5Ub1N0cmluZygpLmNfc3RyKCksCisgICAgICBWZWN0b3JUb1N0cmluZyhwcmVmZXJyZWRfc3RvcmFnZV90eXBlcykuY19zdHIoKSk7Cit9CisKK0ltYWdlUHJvY2Vzc29yOjpJbWFnZVByb2Nlc3Nvcihjb25zdCBJbWFnZVByb2Nlc3Nvcjo6UG9ydENvbmZpZyYgaW5wdXRfY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEltYWdlUHJvY2Vzc29yOjpQb3J0Q29uZmlnJiBvdXRwdXRfY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dE1vZGUgb3V0cHV0X21vZGUpCi0gICAgOiBpbnB1dF9sYXlvdXRfKGlucHV0X2xheW91dCksCi0gICAgICBpbnB1dF9zdG9yYWdlX3R5cGVfKGlucHV0X3N0b3JhZ2VfdHlwZSksCi0gICAgICBvdXRwdXRfbGF5b3V0XyhvdXRwdXRfbGF5b3V0KSwKLSAgICAgIG91dHB1dF9zdG9yYWdlX3R5cGVfKG91dHB1dF9zdG9yYWdlX3R5cGUpLAorICAgIDogaW5wdXRfY29uZmlnXyhpbnB1dF9jb25maWcpLAorICAgICAgb3V0cHV0X2NvbmZpZ18ob3V0cHV0X2NvbmZpZyksCiAgICAgICBvdXRwdXRfbW9kZV8ob3V0cHV0X21vZGUpIHt9CiAKICNpZiBkZWZpbmVkKE9TX1BPU0lYKSB8fCBkZWZpbmVkKE9TX0ZVQ0hTSUEpCmRpZmYgLS1naXQgYS9tZWRpYS9ncHUvaW1hZ2VfcHJvY2Vzc29yLmggYi9tZWRpYS9ncHUvaW1hZ2VfcHJvY2Vzc29yLmgKaW5kZXggNzcxNjUyYS4uYjU3OTkxZSAxMDA2NDQKLS0tIGEvbWVkaWEvZ3B1L2ltYWdlX3Byb2Nlc3Nvci5oCisrKyBiL21lZGlhL2dwdS9pbWFnZV9wcm9jZXNzb3IuaApAQCAtNyw2ICs3LDcgQEAKIAogI2luY2x1ZGUgPHN0ZGludC5oPgogCisjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgImJhc2UvY2FsbGJhY2tfZm9yd2FyZC5oIgpAQCAtMTQsOCArMTUsOSBAQAogI2luY2x1ZGUgImJhc2UvbWFjcm9zLmgiCiAjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKICNpbmNsdWRlICJidWlsZC9idWlsZF9jb25maWcuaCIKKyNpbmNsdWRlICJtZWRpYS9iYXNlL2NvbG9yX3BsYW5lX2xheW91dC5oIgogI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdmlkZW9fZnJhbWUuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3ZpZGVvX2ZyYW1lX2xheW91dC5oIgorI2luY2x1ZGUgIm1lZGlhL2dwdS9jaHJvbWVvcy9mb3VyY2MuaCIKICNpbmNsdWRlICJtZWRpYS9ncHUvbWVkaWFfZ3B1X2V4cG9ydC5oIgogI2luY2x1ZGUgInVpL2dmeC9nZW9tZXRyeS9zaXplLmgiCiAKQEAgLTQ4LDI3ICs1MCw0MyBAQAogICB9OwogCiAgIC8vIEVuY2Fwc3VsYXRlcyBJbWFnZVByb2Nlc3NvciBpbnB1dCAvIG91dHB1dCBjb25maWd1cmF0aW9ucy4KLSAgLy8gTm90ZSB0aGF0IHxmb3VyY2N8IGlzIHVzZWQgd2hlbiBmb3JtYXQgY2Fubm90IGJlIGRlc2NyaWJlZCBpbiB8bGF5b3V0fCwKLSAgLy8gZS5nLiBwbGF0Zm9ybSBzcGVjaWZpYyBmb3JtYXQgbm90IGxpc3RlZCBpbiBWaWRlb1BpeGVsRm9ybWF0LiBUaGUgZGVmYXVsdAotICAvLyB2YWx1ZSBvZiB8Zm91cmNjfCBpcyBrVW5hc3NpZ25lZEZvdXJDQy4KICAgc3RydWN0IE1FRElBX0dQVV9FWFBPUlQgUG9ydENvbmZpZyB7CiAgICAgUG9ydENvbmZpZygpID0gZGVsZXRlOworICAgIFBvcnRDb25maWcoY29uc3QgUG9ydENvbmZpZyYpOwogICAgIFBvcnRDb25maWcoCi0gICAgICAgIGNvbnN0IFZpZGVvRnJhbWVMYXlvdXQmIGxheW91dCwKLSAgICAgICAgY29uc3QgZ2Z4OjpTaXplJiB2aXNpYmxlX3NpemUsCi0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFZpZGVvRnJhbWU6OlN0b3JhZ2VUeXBlPiYgcHJlZmVycmVkX3N0b3JhZ2VfdHlwZXMpOwotICAgIFBvcnRDb25maWcoCi0gICAgICAgIGNvbnN0IFZpZGVvRnJhbWVMYXlvdXQmIGxheW91dCwKLSAgICAgICAgdWludDMyX3QgZm91cmNjLAorICAgICAgICBGb3VyY2MgZm91cmNjLAorICAgICAgICBjb25zdCBnZng6OlNpemUmIHNpemUsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENvbG9yUGxhbmVMYXlvdXQ+JiBwbGFuZXMsCiAgICAgICAgIGNvbnN0IGdmeDo6U2l6ZSYgdmlzaWJsZV9zaXplLAogICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxWaWRlb0ZyYW1lOjpTdG9yYWdlVHlwZT4mIHByZWZlcnJlZF9zdG9yYWdlX3R5cGVzKTsKICAgICB+UG9ydENvbmZpZygpOwogCi0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtVbmFzc2lnbmVkRm91ckNDID0gMHU7CisgICAgLy8gR2V0IHRoZSBmaXJzdCB8cHJlZmVycmVkX3N0b3JhZ2VfdHlwZXN8LgorICAgIC8vIElmIHxwcmVmZXJyZWRfc3RvcmFnZV90eXBlc3wgaXMgZW1wdHksIHJldHVybiBTVE9SQUdFX1VOS05PV04uCisgICAgVmlkZW9GcmFtZTo6U3RvcmFnZVR5cGUgc3RvcmFnZV90eXBlKCkgY29uc3QgeworICAgICAgcmV0dXJuIHByZWZlcnJlZF9zdG9yYWdlX3R5cGVzLmVtcHR5KCkgPyBWaWRlb0ZyYW1lOjpTVE9SQUdFX1VOS05PV04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcHJlZmVycmVkX3N0b3JhZ2VfdHlwZXMuZnJvbnQoKTsKKyAgICB9CiAKLSAgICBjb25zdCBWaWRlb0ZyYW1lTGF5b3V0IGxheW91dDsKLSAgICBjb25zdCB1aW50MzJfdCBmb3VyY2M7CisgICAgLy8gT3V0cHV0IGh1bWFuIHJlYWRhYmxlIHN0cmluZyBvZiBQb3J0Q29uZmlnLgorICAgIC8vIEV4YW1wbGU6CisgICAgLy8gUG9ydENvbmZpZyhmb3JtYXQ6Ok5WMTIsIHNpemU6NjQweDQ4MCwgcGxhbmVzOlsoNjQwLCAwLCAzMDcyMDApLAorICAgIC8vICg2NDAsMCwxNTM2MDApXSwgdmlzaWJsZV9zaXplOjY0MHg0ODAsIHN0b3JhZ2VfdHlwZXM6W0RNQUJVRlNdKQorICAgIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3Q7CisKKyAgICAvLyBWaWRlbyBmcmFtZSBmb3JtYXQgcmVwcmVzZW50ZWQgYXMgZm91cmNjIHR5cGUuCisgICAgY29uc3QgRm91cmNjIGZvdXJjYzsKKworICAgIC8vIFdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHZpZGVvIGZyYW1lIGluIHBpeGVscy4gVGhpcyBtdXN0IGluY2x1ZGUgcGl4ZWwKKyAgICAvLyBkYXRhIGZvciB0aGUgd2hvbGUgaW1hZ2U7IGkuZS4gZm9yIFlVViBmb3JtYXRzIHdpdGggc3Vic2FtcGxlZCBjaHJvbWEKKyAgICAvLyBwbGFuZXMuIElmIGEgdmlzaWJsZSBwb3J0aW9uIG9mIHRoZSBpbWFnZSBkb2VzIG5vdCBsaW5lIHVwIG9uIGEgc2FtcGxlCisgICAgLy8gYm91bmRhcnksIHxzaXplX3wgbXVzdCBiZSByb3VuZGVkIHVwIGFwcHJvcHJpYXRlbHkuCisgICAgY29uc3QgZ2Z4OjpTaXplIHNpemU7CisKKyAgICAvLyBMYXlvdXQgcHJvcGVydHkgKHN0cmlkZSwgb2Zmc2V0LCBzaXplIG9mIGJ5dGVzKSBmb3IgZWFjaCBjb2xvciBwbGFuZS4KKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDb2xvclBsYW5lTGF5b3V0PiBwbGFuZXM7CiAgICAgY29uc3QgZ2Z4OjpTaXplIHZpc2libGVfc2l6ZTsKKyAgICAvLyBMaXN0IG9mIHByZWZlcnJlZCBzdG9yYWdlIHR5cGVzLgogICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFZpZGVvRnJhbWU6OlN0b3JhZ2VUeXBlPiBwcmVmZXJyZWRfc3RvcmFnZV90eXBlczsKICAgfTsKIApAQCAtOTUsMjEgKzExMyw4IEBACiAKICAgdmlydHVhbCB+SW1hZ2VQcm9jZXNzb3IoKSA9IGRlZmF1bHQ7CiAKLSAgLy8gUmV0dXJucyBpbnB1dCBsYXlvdXQgb2YgdGhlIHByb2Nlc3Nvci4KLSAgY29uc3QgVmlkZW9GcmFtZUxheW91dCYgaW5wdXRfbGF5b3V0KCkgY29uc3QgeyByZXR1cm4gaW5wdXRfbGF5b3V0XzsgfQotCi0gIC8vIFJldHVybnMgb3V0cHV0IGxheW91dCBvZiB0aGUgcHJvY2Vzc29yLgotICBjb25zdCBWaWRlb0ZyYW1lTGF5b3V0JiBvdXRwdXRfbGF5b3V0KCkgY29uc3QgeyByZXR1cm4gb3V0cHV0X2xheW91dF87IH0KLQotICAvLyBSZXR1cm5zIGlucHV0IHN0b3JhZ2UgdHlwZS4KLSAgVmlkZW9GcmFtZTo6U3RvcmFnZVR5cGUgaW5wdXRfc3RvcmFnZV90eXBlKCkgY29uc3QgewotICAgIHJldHVybiBpbnB1dF9zdG9yYWdlX3R5cGVfOwotICB9Ci0KLSAgLy8gUmV0dXJucyBvdXRwdXQgc3RvcmFnZSB0eXBlLgotICBWaWRlb0ZyYW1lOjpTdG9yYWdlVHlwZSBvdXRwdXRfc3RvcmFnZV90eXBlKCkgY29uc3QgewotICAgIHJldHVybiBvdXRwdXRfc3RvcmFnZV90eXBlXzsKLSAgfQorICBjb25zdCBQb3J0Q29uZmlnJiBpbnB1dF9jb25maWcoKSBjb25zdCB7IHJldHVybiBpbnB1dF9jb25maWdfOyB9CisgIGNvbnN0IFBvcnRDb25maWcmIG91dHB1dF9jb25maWcoKSBjb25zdCB7IHJldHVybiBvdXRwdXRfY29uZmlnXzsgfQogCiAgIC8vIFJldHVybnMgb3V0cHV0IG1vZGUuCiAgIC8vIFRPRE8oY3JidWcuY29tLzkwNzc2Nyk6IFJlbW92ZSBpdCBvbmNlIEltYWdlUHJvY2Vzc29yIGFsd2F5cyB3b3JrcyBhcwpAQCAtMTQ5LDIxICsxNTQsMTUgQEAKICAgdmlydHVhbCBib29sIFJlc2V0KCkgPSAwOwogCiAgcHJvdGVjdGVkOgotICBJbWFnZVByb2Nlc3Nvcihjb25zdCBWaWRlb0ZyYW1lTGF5b3V0JiBpbnB1dF9sYXlvdXQsCi0gICAgICAgICAgICAgICAgIFZpZGVvRnJhbWU6OlN0b3JhZ2VUeXBlIGlucHV0X3N0b3JhZ2VfdHlwZSwKLSAgICAgICAgICAgICAgICAgY29uc3QgVmlkZW9GcmFtZUxheW91dCYgb3V0cHV0X2xheW91dCwKLSAgICAgICAgICAgICAgICAgVmlkZW9GcmFtZTo6U3RvcmFnZVR5cGUgb3V0cHV0X3N0b3JhZ2VfdHlwZSwKKyAgSW1hZ2VQcm9jZXNzb3IoY29uc3QgUG9ydENvbmZpZyYgaW5wdXRfY29uZmlnLAorICAgICAgICAgICAgICAgICBjb25zdCBQb3J0Q29uZmlnJiBvdXRwdXRfY29uZmlnLAogICAgICAgICAgICAgICAgICBPdXRwdXRNb2RlIG91dHB1dF9tb2RlKTsKIAotICAvLyBTdG9yZXMgaW5wdXQgZnJhbWUncyBsYXlvdXQgYW5kIHN0b3JhZ2UgdHlwZS4KLSAgY29uc3QgVmlkZW9GcmFtZUxheW91dCBpbnB1dF9sYXlvdXRfOwotICBjb25zdCBWaWRlb0ZyYW1lOjpTdG9yYWdlVHlwZSBpbnB1dF9zdG9yYWdlX3R5cGVfOworICBjb25zdCBQb3J0Q29uZmlnIGlucHV0X2NvbmZpZ187CisgIGNvbnN0IFBvcnRDb25maWcgb3V0cHV0X2NvbmZpZ187CiAKLSAgLy8gU3RvcmVzIG91dHB1dCBmcmFtZSdzIGxheW91dCwgc3RvcmFnZSB0eXBlIGFuZCBvdXRwdXQgbW9kZS4KICAgLy8gVE9ETyhjcmJ1Zy5jb20vOTA3NzY3KTogUmVtb3ZlIHxvdXRwdXRfbW9kZV98IG9uY2UgSW1hZ2VQcm9jZXNzb3IgYWx3YXlzCiAgIC8vIHdvcmtzIGFzIElNUE9SVCBtb2RlIGZvciBvdXRwdXQuCi0gIGNvbnN0IFZpZGVvRnJhbWVMYXlvdXQgb3V0cHV0X2xheW91dF87Ci0gIGNvbnN0IFZpZGVvRnJhbWU6OlN0b3JhZ2VUeXBlIG91dHB1dF9zdG9yYWdlX3R5cGVfOwogICBjb25zdCBPdXRwdXRNb2RlIG91dHB1dF9tb2RlXzsKIAogIHByaXZhdGU6CmRpZmYgLS1naXQgYS9tZWRpYS9ncHUvaW1hZ2VfcHJvY2Vzc29yX3Rlc3QuY2MgYi9tZWRpYS9ncHUvaW1hZ2VfcHJvY2Vzc29yX3Rlc3QuY2MKaW5kZXggOGIwODMzZGUuLmQ2NTNlNDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2dwdS9pbWFnZV9wcm9jZXNzb3JfdGVzdC5jYworKysgYi9tZWRpYS9ncHUvaW1hZ2VfcHJvY2Vzc29yX3Rlc3QuY2MKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlICJtZWRpYS9iYXNlL3ZpZGVvX2ZyYW1lLmgiCiAjaW5jbHVkZSAibWVkaWEvYmFzZS92aWRlb19mcmFtZV9sYXlvdXQuaCIKICNpbmNsdWRlICJtZWRpYS9iYXNlL3ZpZGVvX3R5cGVzLmgiCisjaW5jbHVkZSAibWVkaWEvZ3B1L2Nocm9tZW9zL2ZvdXJjYy5oIgogI2luY2x1ZGUgIm1lZGlhL2dwdS9pbWFnZV9wcm9jZXNzb3IuaCIKICNpbmNsdWRlICJtZWRpYS9ncHUvdGVzdC9pbWFnZS5oIgogI2luY2x1ZGUgIm1lZGlhL2dwdS90ZXN0L2ltYWdlX3Byb2Nlc3Nvci9pbWFnZV9wcm9jZXNzb3JfY2xpZW50LmgiCkBAIC04NCwxOCArODUsMTYgQEAKICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFZpZGVvRnJhbWU6OlN0b3JhZ2VUeXBlPiYgaW5wdXRfc3RvcmFnZV90eXBlcywKICAgICAgIGNvbnN0IHRlc3Q6OkltYWdlJiBvdXRwdXRfaW1hZ2UsCiAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxWaWRlb0ZyYW1lOjpTdG9yYWdlVHlwZT4mIG91dHB1dF9zdG9yYWdlX3R5cGVzKSB7Ci0gICAgY29uc3QgVmlkZW9QaXhlbEZvcm1hdCBpbnB1dF9mb3JtYXQgPSBpbnB1dF9pbWFnZS5QaXhlbEZvcm1hdCgpOwotICAgIGNvbnN0IFZpZGVvUGl4ZWxGb3JtYXQgb3V0cHV0X2Zvcm1hdCA9IG91dHB1dF9pbWFnZS5QaXhlbEZvcm1hdCgpOwotICAgIGF1dG8gaW5wdXRfY29uZmlnX2xheW91dCA9Ci0gICAgICAgIHRlc3Q6OkNyZWF0ZVZpZGVvRnJhbWVMYXlvdXQoaW5wdXRfZm9ybWF0LCBpbnB1dF9pbWFnZS5TaXplKCkpOwotICAgIGF1dG8gb3V0cHV0X2NvbmZpZ19sYXlvdXQgPQotICAgICAgICB0ZXN0OjpDcmVhdGVWaWRlb0ZyYW1lTGF5b3V0KG91dHB1dF9mb3JtYXQsIG91dHB1dF9pbWFnZS5TaXplKCkpOwotICAgIExPR19BU1NFUlQoaW5wdXRfY29uZmlnX2xheW91dCk7Ci0gICAgTE9HX0FTU0VSVChvdXRwdXRfY29uZmlnX2xheW91dCk7Ci0gICAgSW1hZ2VQcm9jZXNzb3I6OlBvcnRDb25maWcgaW5wdXRfY29uZmlnKAotICAgICAgICAqaW5wdXRfY29uZmlnX2xheW91dCwgaW5wdXRfaW1hZ2UuU2l6ZSgpLCBpbnB1dF9zdG9yYWdlX3R5cGVzKTsKLSAgICBJbWFnZVByb2Nlc3Nvcjo6UG9ydENvbmZpZyBvdXRwdXRfY29uZmlnKAotICAgICAgICAqb3V0cHV0X2NvbmZpZ19sYXlvdXQsIG91dHB1dF9pbWFnZS5TaXplKCksIG91dHB1dF9zdG9yYWdlX3R5cGVzKTsKKyAgICBGb3VyY2MgaW5wdXRfZm91cmNjID0KKyAgICAgICAgRm91cmNjOjpGcm9tVmlkZW9QaXhlbEZvcm1hdChpbnB1dF9pbWFnZS5QaXhlbEZvcm1hdCgpKTsKKyAgICBGb3VyY2Mgb3V0cHV0X2ZvdXJjYyA9CisgICAgICAgIEZvdXJjYzo6RnJvbVZpZGVvUGl4ZWxGb3JtYXQob3V0cHV0X2ltYWdlLlBpeGVsRm9ybWF0KCkpOworICAgIEltYWdlUHJvY2Vzc29yOjpQb3J0Q29uZmlnIGlucHV0X2NvbmZpZyhpbnB1dF9mb3VyY2MsIGlucHV0X2ltYWdlLlNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge30sIGlucHV0X2ltYWdlLlNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfc3RvcmFnZV90eXBlcyk7CisgICAgSW1hZ2VQcm9jZXNzb3I6OlBvcnRDb25maWcgb3V0cHV0X2NvbmZpZyhvdXRwdXRfZm91cmNjLCBvdXRwdXRfaW1hZ2UuU2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge30sIG91dHB1dF9pbWFnZS5TaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfc3RvcmFnZV90eXBlcyk7CiAgICAgLy8gVE9ETyhjcmJ1Zy5jb20vOTE3OTUxKTogU2VsZWN0IG1vcmUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIGJ1ZmZlcnMuCiAgICAgY29uc3RleHByIHNpemVfdCBrTnVtQnVmZmVycyA9IDE7CiAgICAgTE9HX0FTU0VSVChvdXRwdXRfaW1hZ2UuSXNNZXRhZGF0YUxvYWRlZCgpKTsKQEAgLTEwNCw3ICsxMDMsOCBAQAogICAgIC8vIFRPRE8oY3JidWcuY29tLzkxNzk1MSk6IFdlIHNob3VsZCB2YWxpZGF0ZSBhIHNjYWxlZCBpbWFnZSB3aXRoIFNTSU0uCiAgICAgLy8gVmFsaWRhdGluZyBwcm9jZXNzZWQgZnJhbWVzIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkIHdoZW4gYSBmb3JtYXQgaXMKICAgICAvLyBub3QgWVVWIG9yIHdoZW4gc2NhbGluZyBpbWFnZXMuCi0gICAgaWYgKElzWXV2UGxhbmFyKGlucHV0X2Zvcm1hdCkgJiYgSXNZdXZQbGFuYXIob3V0cHV0X2Zvcm1hdCkgJiYKKyAgICBpZiAoSXNZdXZQbGFuYXIoaW5wdXRfZm91cmNjLlRvVmlkZW9QaXhlbEZvcm1hdCgpKSAmJgorICAgICAgICBJc1l1dlBsYW5hcihvdXRwdXRfZm91cmNjLlRvVmlkZW9QaXhlbEZvcm1hdCgpKSAmJgogICAgICAgICBpbnB1dF9pbWFnZS5TaXplKCkgPT0gb3V0cHV0X2ltYWdlLlNpemUoKSkgewogICAgICAgYXV0byB2Zl92YWxpZGF0b3IgPSB0ZXN0OjpWaWRlb0ZyYW1lVmFsaWRhdG9yOjpDcmVhdGUoCiAgICAgICAgICAge291dHB1dF9pbWFnZS5DaGVja3N1bSgpfSwgb3V0cHV0X2ltYWdlLlBpeGVsRm9ybWF0KCkpOwpAQCAtMTE2LDcgKzExNiw3IEBACiAgICAgICAgICAgYmFzZTo6RmlsZVBhdGgoYmFzZTo6RmlsZVBhdGg6OmtDdXJyZW50RGlyZWN0b3J5KQogICAgICAgICAgICAgICAuQXBwZW5kKGdfZW52LT5HZXRUZXN0T3V0cHV0RmlsZVBhdGgoKSk7CiAgICAgICB0ZXN0OjpWaWRlb0ZyYW1lRmlsZVdyaXRlcjo6T3V0cHV0Rm9ybWF0IHNhdmVkX2ZpbGVfZm9ybWF0ID0KLSAgICAgICAgICBJc1l1dlBsYW5hcihvdXRwdXRfZm9ybWF0KQorICAgICAgICAgIElzWXV2UGxhbmFyKG91dHB1dF9mb3VyY2MuVG9WaWRlb1BpeGVsRm9ybWF0KCkpCiAgICAgICAgICAgICAgID8gdGVzdDo6VmlkZW9GcmFtZUZpbGVXcml0ZXI6Ok91dHB1dEZvcm1hdDo6a1lVVgogICAgICAgICAgICAgICA6IHRlc3Q6OlZpZGVvRnJhbWVGaWxlV3JpdGVyOjpPdXRwdXRGb3JtYXQ6OmtQTkc7CiAgICAgICBmcmFtZV9wcm9jZXNzb3JzLnB1c2hfYmFjaygKZGlmZiAtLWdpdCBhL21lZGlhL2dwdS9saWJ5dXZfaW1hZ2VfcHJvY2Vzc29yLmNjIGIvbWVkaWEvZ3B1L2xpYnl1dl9pbWFnZV9wcm9jZXNzb3IuY2MKaW5kZXggNjhkMTQ4ZWMuLjliZDkxNGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2dwdS9saWJ5dXZfaW1hZ2VfcHJvY2Vzc29yLmNjCisrKyBiL21lZGlhL2dwdS9saWJ5dXZfaW1hZ2VfcHJvY2Vzc29yLmNjCkBAIC04LDYgKzgsNyBAQAogI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgogI2luY2x1ZGUgImJhc2UvbWVtb3J5L3B0cl91dGlsLmgiCiAjaW5jbHVkZSAibWVkaWEvYmFzZS9iaW5kX3RvX2N1cnJlbnRfbG9vcC5oIgorI2luY2x1ZGUgIm1lZGlhL2dwdS9jaHJvbWVvcy9mb3VyY2MuaCIKICNpbmNsdWRlICJtZWRpYS9ncHUvbWFjcm9zLmgiCiAjaW5jbHVkZSAibWVkaWEvZ3B1L3ZpZGVvX2ZyYW1lX21hcHBlci5oIgogI2luY2x1ZGUgIm1lZGlhL2dwdS92aWRlb19mcmFtZV9tYXBwZXJfZmFjdG9yeS5oIgpAQCAtMjUsMjUgKzI2LDIxIEBACiAgIFVuc3VwcG9ydGVkLAogfTsKIAotU3VwcG9ydFJlc3VsdCBJc0Zvcm1hdFN1cHBvcnRlZChWaWRlb1BpeGVsRm9ybWF0IGlucHV0X2Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW9QaXhlbEZvcm1hdCBvdXRwdXRfZm9ybWF0KSB7Ci0gIGNvbnN0ZXhwciBzdHJ1Y3QgewotICAgIFZpZGVvUGl4ZWxGb3JtYXQgaW5wdXQ7Ci0gICAgVmlkZW9QaXhlbEZvcm1hdCBvdXRwdXQ7CitTdXBwb3J0UmVzdWx0IElzRm9ybWF0U3VwcG9ydGVkKEZvdXJjYyBpbnB1dF9mb3VyY2MsIEZvdXJjYyBvdXRwdXRfZm91cmNjKSB7CisgIHN0YXRpYyBjb25zdGV4cHIgc3RydWN0IHsKKyAgICB1aW50MzJfdCBpbnB1dDsKKyAgICB1aW50MzJfdCBvdXRwdXQ7CiAgICAgYm9vbCBuZWVkX3Bpdm90OwogICB9IGtTdXBwb3J0Rm9ybWF0Q29udmVyc2lvbkFycmF5W10gPSB7Ci0gICAgICB7UElYRUxfRk9STUFUX0FSR0IsIFBJWEVMX0ZPUk1BVF9OVjEyLCBmYWxzZX0sCi0gICAgICB7UElYRUxfRk9STUFUX0k0MjAsIFBJWEVMX0ZPUk1BVF9OVjEyLCBmYWxzZX0sCi0gICAgICB7UElYRUxfRk9STUFUX1lWMTIsIFBJWEVMX0ZPUk1BVF9OVjEyLCBmYWxzZX0sCi0gICAgICB7UElYRUxfRk9STUFUX0FCR1IsIFBJWEVMX0ZPUk1BVF9OVjEyLCB0cnVlfSwKLSAgICAgIHtQSVhFTF9GT1JNQVRfWEJHUiwgUElYRUxfRk9STUFUX05WMTIsIHRydWV9LAorICAgICAge0ZvdXJjYzo6QVIyNCwgRm91cmNjOjpOVjEyLCBmYWxzZX0sIHtGb3VyY2M6OllVMTIsIEZvdXJjYzo6TlYxMiwgZmFsc2V9LAorICAgICAge0ZvdXJjYzo6WVYxMiwgRm91cmNjOjpOVjEyLCBmYWxzZX0sIHtGb3VyY2M6OkFCMjQsIEZvdXJjYzo6TlYxMiwgdHJ1ZX0sCisgICAgICB7Rm91cmNjOjpYQjI0LCBGb3VyY2M6Ok5WMTIsIHRydWV9LAogICB9OwogCi0gIGZvciAoYXV0byogY29udiA9IHN0ZDo6Y2JlZ2luKGtTdXBwb3J0Rm9ybWF0Q29udmVyc2lvbkFycmF5KTsKLSAgICAgICBjb252ICE9IHN0ZDo6Y2VuZChrU3VwcG9ydEZvcm1hdENvbnZlcnNpb25BcnJheSk7IGNvbnYrKykgewotICAgIGlmIChjb252LT5pbnB1dCA9PSBpbnB1dF9mb3JtYXQgJiYgY29udi0+b3V0cHV0ID09IG91dHB1dF9mb3JtYXQpIHsKLSAgICAgIHJldHVybiBjb252LT5uZWVkX3Bpdm90ID8gU3VwcG9ydFJlc3VsdDo6U3VwcG9ydGVkV2l0aFBpdm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFN1cHBvcnRSZXN1bHQ6OlN1cHBvcnRlZDsKKyAgZm9yIChjb25zdCBhdXRvJiBjb252IDoga1N1cHBvcnRGb3JtYXRDb252ZXJzaW9uQXJyYXkpIHsKKyAgICBpZiAoY29udi5pbnB1dCA9PSBpbnB1dF9mb3VyY2MgJiYgY29udi5vdXRwdXQgPT0gb3V0cHV0X2ZvdXJjYykgeworICAgICAgcmV0dXJuIGNvbnYubmVlZF9waXZvdCA/IFN1cHBvcnRSZXN1bHQ6OlN1cHBvcnRlZFdpdGhQaXZvdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFN1cHBvcnRSZXN1bHQ6OlN1cHBvcnRlZDsKICAgICB9CiAgIH0KIApAQCAtNTMsMjEgKzUwLDExIEBACiB9ICAvLyBuYW1lc3BhY2UKIAogTGliWVVWSW1hZ2VQcm9jZXNzb3I6OkxpYllVVkltYWdlUHJvY2Vzc29yKAotICAgIGNvbnN0IFZpZGVvRnJhbWVMYXlvdXQmIGlucHV0X2xheW91dCwKLSAgICBjb25zdCBnZng6OlNpemUmIGlucHV0X3Zpc2libGVfc2l6ZSwKLSAgICBWaWRlb0ZyYW1lOjpTdG9yYWdlVHlwZSBpbnB1dF9zdG9yYWdlX3R5cGUsCi0gICAgY29uc3QgVmlkZW9GcmFtZUxheW91dCYgb3V0cHV0X2xheW91dCwKLSAgICBjb25zdCBnZng6OlNpemUmIG91dHB1dF92aXNpYmxlX3NpemUsCi0gICAgVmlkZW9GcmFtZTo6U3RvcmFnZVR5cGUgb3V0cHV0X3N0b3JhZ2VfdHlwZSwKKyAgICBjb25zdCBJbWFnZVByb2Nlc3Nvcjo6UG9ydENvbmZpZyYgaW5wdXRfY29uZmlnLAorICAgIGNvbnN0IEltYWdlUHJvY2Vzc29yOjpQb3J0Q29uZmlnJiBvdXRwdXRfY29uZmlnLAogICAgIHN0ZDo6dW5pcXVlX3B0cjxWaWRlb0ZyYW1lTWFwcGVyPiB2aWRlb19mcmFtZV9tYXBwZXIsCiAgICAgRXJyb3JDQiBlcnJvcl9jYikKLSAgICA6IEltYWdlUHJvY2Vzc29yKGlucHV0X2xheW91dCwKLSAgICAgICAgICAgICAgICAgICAgIGlucHV0X3N0b3JhZ2VfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9sYXlvdXQsCi0gICAgICAgICAgICAgICAgICAgICBvdXRwdXRfc3RvcmFnZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgT3V0cHV0TW9kZTo6SU1QT1JUKSwKLSAgICAgIGlucHV0X3Zpc2libGVfcmVjdF8oaW5wdXRfdmlzaWJsZV9zaXplKSwKLSAgICAgIG91dHB1dF92aXNpYmxlX3JlY3RfKG91dHB1dF92aXNpYmxlX3NpemUpLAorICAgIDogSW1hZ2VQcm9jZXNzb3IoaW5wdXRfY29uZmlnLCBvdXRwdXRfY29uZmlnLCBPdXRwdXRNb2RlOjpJTVBPUlQpLAogICAgICAgdmlkZW9fZnJhbWVfbWFwcGVyXyhzdGQ6Om1vdmUodmlkZW9fZnJhbWVfbWFwcGVyKSksCiAgICAgICBlcnJvcl9jYl8oZXJyb3JfY2IpLAogICAgICAgcHJvY2Vzc190aHJlYWRfKCJMaWJZVVZJbWFnZVByb2Nlc3NvclRocmVhZCIpIHt9CkBAIC04Myw3ICs3MCw3IEBACiBzdGQ6OnVuaXF1ZV9wdHI8TGliWVVWSW1hZ2VQcm9jZXNzb3I+IExpYllVVkltYWdlUHJvY2Vzc29yOjpDcmVhdGUoCiAgICAgY29uc3QgSW1hZ2VQcm9jZXNzb3I6OlBvcnRDb25maWcmIGlucHV0X2NvbmZpZywKICAgICBjb25zdCBJbWFnZVByb2Nlc3Nvcjo6UG9ydENvbmZpZyYgb3V0cHV0X2NvbmZpZywKLSAgICBjb25zdCBJbWFnZVByb2Nlc3Nvcjo6T3V0cHV0TW9kZSBvdXRwdXRfbW9kZSwKKyAgICBJbWFnZVByb2Nlc3Nvcjo6T3V0cHV0TW9kZSBvdXRwdXRfbW9kZSwKICAgICBFcnJvckNCIGVycm9yX2NiKSB7CiAgIFZMT0dGKDIpOwogCkBAIC05NCw3ICs4MSw3IEBACiAjaWYgZGVmaW5lZChPU19MSU5VWCkKICAgICBpZiAoaW5wdXRfdHlwZSA9PSBWaWRlb0ZyYW1lOjpTVE9SQUdFX0RNQUJVRlMpIHsKICAgICAgIHZpZGVvX2ZyYW1lX21hcHBlciA9IFZpZGVvRnJhbWVNYXBwZXJGYWN0b3J5OjpDcmVhdGVNYXBwZXIoCi0gICAgICAgICAgaW5wdXRfY29uZmlnLmxheW91dC5mb3JtYXQoKSwgdHJ1ZSk7CisgICAgICAgICAgaW5wdXRfY29uZmlnLmZvdXJjYy5Ub1ZpZGVvUGl4ZWxGb3JtYXQoKSwgdHJ1ZSk7CiAgICAgICBpZiAodmlkZW9fZnJhbWVfbWFwcGVyKSB7CiAgICAgICAgIGlucHV0X3N0b3JhZ2VfdHlwZSA9IGlucHV0X3R5cGU7CiAgICAgICAgIGJyZWFrOwpAQCAtMTMwLDE3ICsxMTcsMjEgQEAKICAgICByZXR1cm4gbnVsbHB0cjsKICAgfQogCi0gIFN1cHBvcnRSZXN1bHQgcmVzID0gSXNGb3JtYXRTdXBwb3J0ZWQoaW5wdXRfY29uZmlnLmxheW91dC5mb3JtYXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfY29uZmlnLmxheW91dC5mb3JtYXQoKSk7CisgIFN1cHBvcnRSZXN1bHQgcmVzID0KKyAgICAgIElzRm9ybWF0U3VwcG9ydGVkKGlucHV0X2NvbmZpZy5mb3VyY2MsIG91dHB1dF9jb25maWcuZm91cmNjKTsKICAgaWYgKHJlcyA9PSBTdXBwb3J0UmVzdWx0OjpVbnN1cHBvcnRlZCkgewotICAgIFZMT0dGKDIpIDw8ICJDb252ZXJzaW9uIGZyb20gIiA8PCBpbnB1dF9jb25maWcubGF5b3V0LmZvcm1hdCgpIDw8ICIgdG8gIgotICAgICAgICAgICAgIDw8IG91dHB1dF9jb25maWcubGF5b3V0LmZvcm1hdCgpIDw8ICIgaXMgbm90IHN1cHBvcnRlZCI7CisgICAgVkxPR0YoMikgPDwgIkNvbnZlcnNpb24gZnJvbSAiIDw8IGlucHV0X2NvbmZpZy5mb3VyY2MuVG9TdHJpbmcoKSA8PCAiIHRvICIKKyAgICAgICAgICAgICA8PCBvdXRwdXRfY29uZmlnLmZvdXJjYy5Ub1N0cmluZygpIDw8ICIgaXMgbm90IHN1cHBvcnRlZCI7CiAgICAgcmV0dXJuIG51bGxwdHI7CiAgIH0KIAogICBhdXRvIHByb2Nlc3NvciA9IGJhc2U6OldyYXBVbmlxdWUobmV3IExpYllVVkltYWdlUHJvY2Vzc29yKAotICAgICAgaW5wdXRfY29uZmlnLmxheW91dCwgaW5wdXRfY29uZmlnLnZpc2libGVfc2l6ZSwgaW5wdXRfc3RvcmFnZV90eXBlLAotICAgICAgb3V0cHV0X2NvbmZpZy5sYXlvdXQsIG91dHB1dF9jb25maWcudmlzaWJsZV9zaXplLCBvdXRwdXRfc3RvcmFnZV90eXBlLAorICAgICAgSW1hZ2VQcm9jZXNzb3I6OlBvcnRDb25maWcoaW5wdXRfY29uZmlnLmZvdXJjYywgaW5wdXRfY29uZmlnLnNpemUsIHt9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfY29uZmlnLnZpc2libGVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpbnB1dF9zdG9yYWdlX3R5cGV9KSwKKyAgICAgIEltYWdlUHJvY2Vzc29yOjpQb3J0Q29uZmlnKG91dHB1dF9jb25maWcuZm91cmNjLCBvdXRwdXRfY29uZmlnLnNpemUsIHt9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2NvbmZpZy52aXNpYmxlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7b3V0cHV0X3N0b3JhZ2VfdHlwZX0pLAogICAgICAgc3RkOjptb3ZlKHZpZGVvX2ZyYW1lX21hcHBlciksCiAgICAgICBtZWRpYTo6QmluZFRvQ3VycmVudExvb3Aoc3RkOjptb3ZlKGVycm9yX2NiKSkpKTsKICAgaWYgKHJlcyA9PSBTdXBwb3J0UmVzdWx0OjpTdXBwb3J0ZWRXaXRoUGl2b3QpIHsKQEAgLTE2MCw3ICsxNTEsNyBAQAogICB9CiAKICAgVkxPR0YoMikgPDwgIkxpYllVVkltYWdlUHJvY2Vzc29yIGNyZWF0ZWQgZm9yIGNvbnZlcnRpbmcgZnJvbSAiCi0gICAgICAgICAgIDw8IGlucHV0X2NvbmZpZy5sYXlvdXQgPDwgIiB0byAiIDw8IG91dHB1dF9jb25maWcubGF5b3V0OworICAgICAgICAgICA8PCBpbnB1dF9jb25maWcuVG9TdHJpbmcoKSA8PCAiIHRvICIgPDwgb3V0cHV0X2NvbmZpZy5Ub1N0cmluZygpOwogICByZXR1cm4gcHJvY2Vzc29yOwogfQogCkBAIC0xNzAsMTEgKzE2MSwxMyBAQAogICAgIEZyYW1lUmVhZHlDQiBjYikgewogICBEQ0hFQ0tfQ0FMTEVEX09OX1ZBTElEX1RIUkVBRChjbGllbnRfdGhyZWFkX2NoZWNrZXJfKTsKICAgRFZMT0dGKDQpOwotICBEQ0hFQ0tfRVEoaW5wdXRfZnJhbWUtPmxheW91dCgpLmZvcm1hdCgpLCBpbnB1dF9sYXlvdXRfLmZvcm1hdCgpKTsKLSAgRENIRUNLKGlucHV0X2ZyYW1lLT5sYXlvdXQoKS5jb2RlZF9zaXplKCkgPT0gaW5wdXRfbGF5b3V0Xy5jb2RlZF9zaXplKCkpOwotICBEQ0hFQ0tfRVEob3V0cHV0X2ZyYW1lLT5sYXlvdXQoKS5mb3JtYXQoKSwgb3V0cHV0X2xheW91dF8uZm9ybWF0KCkpOwotICBEQ0hFQ0sob3V0cHV0X2ZyYW1lLT5sYXlvdXQoKS5jb2RlZF9zaXplKCkgPT0gb3V0cHV0X2xheW91dF8uY29kZWRfc2l6ZSgpKTsKLSAgRENIRUNLKGlucHV0X3N0b3JhZ2VfdHlwZV8gPT0gaW5wdXRfZnJhbWUtPnN0b3JhZ2VfdHlwZSgpIHx8CisgIERDSEVDS19FUShpbnB1dF9mcmFtZS0+bGF5b3V0KCkuZm9ybWF0KCksCisgICAgICAgICAgICBpbnB1dF9jb25maWdfLmZvdXJjYy5Ub1ZpZGVvUGl4ZWxGb3JtYXQoKSk7CisgIERDSEVDSyhpbnB1dF9mcmFtZS0+bGF5b3V0KCkuY29kZWRfc2l6ZSgpID09IGlucHV0X2NvbmZpZ18uc2l6ZSk7CisgIERDSEVDS19FUShvdXRwdXRfZnJhbWUtPmxheW91dCgpLmZvcm1hdCgpLAorICAgICAgICAgICAgb3V0cHV0X2NvbmZpZ18uZm91cmNjLlRvVmlkZW9QaXhlbEZvcm1hdCgpKTsKKyAgRENIRUNLKG91dHB1dF9mcmFtZS0+bGF5b3V0KCkuY29kZWRfc2l6ZSgpID09IG91dHB1dF9jb25maWdfLnNpemUpOworICBEQ0hFQ0soaW5wdXRfY29uZmlnXy5zdG9yYWdlX3R5cGUoKSA9PSBpbnB1dF9mcmFtZS0+c3RvcmFnZV90eXBlKCkgfHwKICAgICAgICAgIFZpZGVvRnJhbWU6OklzU3RvcmFnZVR5cGVNYXBwYWJsZShpbnB1dF9mcmFtZS0+c3RvcmFnZV90eXBlKCkpKTsKICAgRENIRUNLKFZpZGVvRnJhbWU6OklzU3RvcmFnZVR5cGVNYXBwYWJsZShvdXRwdXRfZnJhbWUtPnN0b3JhZ2VfdHlwZSgpKSk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2dwdS9saWJ5dXZfaW1hZ2VfcHJvY2Vzc29yLmggYi9tZWRpYS9ncHUvbGlieXV2X2ltYWdlX3Byb2Nlc3Nvci5oCmluZGV4IGFhZjUxMzEuLjY2ZTQ0ZjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2dwdS9saWJ5dXZfaW1hZ2VfcHJvY2Vzc29yLmgKKysrIGIvbWVkaWEvZ3B1L2xpYnl1dl9pbWFnZV9wcm9jZXNzb3IuaApAQCAtNDUsMTYgKzQ1LDEyIEBACiAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8TGliWVVWSW1hZ2VQcm9jZXNzb3I+IENyZWF0ZSgKICAgICAgIGNvbnN0IEltYWdlUHJvY2Vzc29yOjpQb3J0Q29uZmlnJiBpbnB1dF9jb25maWcsCiAgICAgICBjb25zdCBJbWFnZVByb2Nlc3Nvcjo6UG9ydENvbmZpZyYgb3V0cHV0X2NvbmZpZywKLSAgICAgIGNvbnN0IEltYWdlUHJvY2Vzc29yOjpPdXRwdXRNb2RlIG91dHB1dF9tb2RlLAorICAgICAgSW1hZ2VQcm9jZXNzb3I6Ok91dHB1dE1vZGUgb3V0cHV0X21vZGUsCiAgICAgICBFcnJvckNCIGVycm9yX2NiKTsKIAogIHByaXZhdGU6Ci0gIExpYllVVkltYWdlUHJvY2Vzc29yKGNvbnN0IFZpZGVvRnJhbWVMYXlvdXQmIGlucHV0X2xheW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2Z4OjpTaXplJiBpbnB1dF92aXNpYmxlX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgIFZpZGVvRnJhbWU6OlN0b3JhZ2VUeXBlIGlucHV0X3N0b3JhZ2VfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmlkZW9GcmFtZUxheW91dCYgb3V0cHV0X2xheW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2Z4OjpTaXplJiBvdXRwdXRfdmlzaWJsZV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICBWaWRlb0ZyYW1lOjpTdG9yYWdlVHlwZSBvdXRwdXRfc3RvcmFnZV90eXBlLAorICBMaWJZVVZJbWFnZVByb2Nlc3Nvcihjb25zdCBJbWFnZVByb2Nlc3Nvcjo6UG9ydENvbmZpZyYgaW5wdXRfY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbWFnZVByb2Nlc3Nvcjo6UG9ydENvbmZpZyYgb3V0cHV0X2NvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFZpZGVvRnJhbWVNYXBwZXI+IHZpZGVvX2ZyYW1lX21hcHBlciwKICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JDQiBlcnJvcl9jYik7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2dwdS9tYWMvdnRfdmlkZW9fZGVjb2RlX2FjY2VsZXJhdG9yX21hYy5jYyBiL21lZGlhL2dwdS9tYWMvdnRfdmlkZW9fZGVjb2RlX2FjY2VsZXJhdG9yX21hYy5jYwppbmRleCBiNDQwZDU0Li5jYzk0NDMwIDEwMDY0NAotLS0gYS9tZWRpYS9ncHUvbWFjL3Z0X3ZpZGVvX2RlY29kZV9hY2NlbGVyYXRvcl9tYWMuY2MKKysrIGIvbWVkaWEvZ3B1L21hYy92dF92aWRlb19kZWNvZGVfYWNjZWxlcmF0b3JfbWFjLmNjCkBAIC02NTAsNyArNjUwLDcgQEAKICAgbmFsdV9kYXRhX3NpemVzLnJlc2VydmUoMyk7CiAgIG5hbHVfZGF0YV9wdHJzLnB1c2hfYmFjaygmYWN0aXZlX3Nwc18uZnJvbnQoKSk7CiAgIG5hbHVfZGF0YV9zaXplcy5wdXNoX2JhY2soYWN0aXZlX3Nwc18uc2l6ZSgpKTsKLSAgaWYgKCFsYXN0X3Nwc2V4dF8uZW1wdHkoKSkgeworICBpZiAoIWFjdGl2ZV9zcHNleHRfLmVtcHR5KCkpIHsKICAgICBuYWx1X2RhdGFfcHRycy5wdXNoX2JhY2soJmFjdGl2ZV9zcHNleHRfLmZyb250KCkpOwogICAgIG5hbHVfZGF0YV9zaXplcy5wdXNoX2JhY2soYWN0aXZlX3Nwc2V4dF8uc2l6ZSgpKTsKICAgfQpAQCAtNzczLDggKzc3Myw5IEBACiAgICAgICByZXR1cm47CiAgICAgfQogICAgIHN3aXRjaCAobmFsdS5uYWxfdW5pdF90eXBlKSB7Ci0gICAgICBjYXNlIEgyNjROQUxVOjprU1BTOgotICAgICAgICByZXN1bHQgPSBwYXJzZXJfLlBhcnNlU1BTKCZsYXN0X3Nwc19pZF8pOworICAgICAgY2FzZSBIMjY0TkFMVTo6a1NQUzogeworICAgICAgICBpbnQgc3BzX2lkID0gLTE7CisgICAgICAgIHJlc3VsdCA9IHBhcnNlcl8uUGFyc2VTUFMoJnNwc19pZCk7CiAgICAgICAgIGlmIChyZXN1bHQgPT0gSDI2NFBhcnNlcjo6a1Vuc3VwcG9ydGVkU3RyZWFtKSB7CiAgICAgICAgICAgV3JpdGVUb01lZGlhTG9nKE1lZGlhTG9nOjpNRURJQUxPR19FUlJPUiwgIlVuc3VwcG9ydGVkIFNQUyIpOwogICAgICAgICAgIE5vdGlmeUVycm9yKFBMQVRGT1JNX0ZBSUxVUkUsIFNGVF9VTlNVUFBPUlRFRF9TVFJFQU0pOwpAQCAtNzg1LDE2ICs3ODYsMjcgQEAKICAgICAgICAgICBOb3RpZnlFcnJvcihVTlJFQURBQkxFX0lOUFVULCBTRlRfSU5WQUxJRF9TVFJFQU0pOwogICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBsYXN0X3Nwc18uYXNzaWduKG5hbHUuZGF0YSwgbmFsdS5kYXRhICsgbmFsdS5zaXplKTsKLSAgICAgICAgbGFzdF9zcHNleHRfLmNsZWFyKCk7CisgICAgICAgIHNlZW5fc3BzX1tzcHNfaWRdLmFzc2lnbihuYWx1LmRhdGEsIG5hbHUuZGF0YSArIG5hbHUuc2l6ZSk7CisgICAgICAgIHNlZW5fc3BzZXh0Xy5lcmFzZShzcHNfaWQpOwogICAgICAgICBicmVhazsKKyAgICAgIH0KIAotICAgICAgY2FzZSBIMjY0TkFMVTo6a1NQU0V4dDoKLSAgICAgICAgbGFzdF9zcHNleHRfLmFzc2lnbihuYWx1LmRhdGEsIG5hbHUuZGF0YSArIG5hbHUuc2l6ZSk7CisgICAgICBjYXNlIEgyNjROQUxVOjprU1BTRXh0OiB7CisgICAgICAgIGludCBzcHNfaWQgPSAtMTsKKyAgICAgICAgcmVzdWx0ID0gcGFyc2VyXy5QYXJzZVNQU0V4dCgmc3BzX2lkKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBIMjY0UGFyc2VyOjprT2spIHsKKyAgICAgICAgICBXcml0ZVRvTWVkaWFMb2coTWVkaWFMb2c6Ok1FRElBTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHBhcnNlIFNQUyBleHRlbnNpb24iKTsKKyAgICAgICAgICBOb3RpZnlFcnJvcihVTlJFQURBQkxFX0lOUFVULCBTRlRfSU5WQUxJRF9TVFJFQU0pOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzZWVuX3Nwc2V4dF9bc3BzX2lkXS5hc3NpZ24obmFsdS5kYXRhLCBuYWx1LmRhdGEgKyBuYWx1LnNpemUpOwogICAgICAgICBicmVhazsKKyAgICAgIH0KIAotICAgICAgY2FzZSBIMjY0TkFMVTo6a1BQUzoKLSAgICAgICAgcmVzdWx0ID0gcGFyc2VyXy5QYXJzZVBQUygmbGFzdF9wcHNfaWRfKTsKKyAgICAgIGNhc2UgSDI2NE5BTFU6OmtQUFM6IHsKKyAgICAgICAgaW50IHBwc19pZCA9IC0xOworICAgICAgICByZXN1bHQgPSBwYXJzZXJfLlBhcnNlUFBTKCZwcHNfaWQpOwogICAgICAgICBpZiAocmVzdWx0ID09IEgyNjRQYXJzZXI6OmtVbnN1cHBvcnRlZFN0cmVhbSkgewogICAgICAgICAgIFdyaXRlVG9NZWRpYUxvZyhNZWRpYUxvZzo6TUVESUFMT0dfRVJST1IsICJVbnN1cHBvcnRlZCBQUFMiKTsKICAgICAgICAgICBOb3RpZnlFcnJvcihQTEFURk9STV9GQUlMVVJFLCBTRlRfVU5TVVBQT1JURURfU1RSRUFNKTsKQEAgLTgwNSw4ICs4MTcsOSBAQAogICAgICAgICAgIE5vdGlmeUVycm9yKFVOUkVBREFCTEVfSU5QVVQsIFNGVF9JTlZBTElEX1NUUkVBTSk7CiAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIGxhc3RfcHBzXy5hc3NpZ24obmFsdS5kYXRhLCBuYWx1LmRhdGEgKyBuYWx1LnNpemUpOworICAgICAgICBzZWVuX3Bwc19bcHBzX2lkXS5hc3NpZ24obmFsdS5kYXRhLCBuYWx1LmRhdGEgKyBuYWx1LnNpemUpOwogICAgICAgICBicmVhazsKKyAgICAgIH0KIAogICAgICAgY2FzZSBIMjY0TkFMVTo6a1NsaWNlRGF0YUE6CiAgICAgICBjYXNlIEgyNjROQUxVOjprU2xpY2VEYXRhQjoKQEAgLTgzMyw3ICs4NDYsNiBAQAogICAgICAgICAgIH0KIAogICAgICAgICAgIC8vIExvb2t1cCBTUFMgYW5kIFBQUy4KLSAgICAgICAgICBEQ0hFQ0tfRVEoc2xpY2VfaGRyLnBpY19wYXJhbWV0ZXJfc2V0X2lkLCBsYXN0X3Bwc19pZF8pOwogICAgICAgICAgIGNvbnN0IEgyNjRQUFMqIHBwcyA9IHBhcnNlcl8uR2V0UFBTKHNsaWNlX2hkci5waWNfcGFyYW1ldGVyX3NldF9pZCk7CiAgICAgICAgICAgaWYgKCFwcHMpIHsKICAgICAgICAgICAgIFdyaXRlVG9NZWRpYUxvZyhNZWRpYUxvZzo6TUVESUFMT0dfRVJST1IsCkBAIC04NDIsNyArODU0LDYgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICB9CiAKLSAgICAgICAgICBEQ0hFQ0tfRVEocHBzLT5zZXFfcGFyYW1ldGVyX3NldF9pZCwgbGFzdF9zcHNfaWRfKTsKICAgICAgICAgICBjb25zdCBIMjY0U1BTKiBzcHMgPSBwYXJzZXJfLkdldFNQUyhwcHMtPnNlcV9wYXJhbWV0ZXJfc2V0X2lkKTsKICAgICAgICAgICBpZiAoIXNwcykgewogICAgICAgICAgICAgV3JpdGVUb01lZGlhTG9nKE1lZGlhTG9nOjpNRURJQUxPR19FUlJPUiwKQEAgLTg1MiwxMSArODYzLDEyIEBACiAgICAgICAgICAgfQogCiAgICAgICAgICAgLy8gUmVjb3JkIHRoZSBjb25maWd1cmF0aW9uLgotICAgICAgICAgIC8vIFRPRE8oc2FuZGVyc2QpOiBJZGVhbGx5IHRoaXMgd291bGQgYmUgc2tpcHBlZCBpZiB3ZSBrbm93IHRoZXJlCi0gICAgICAgICAgLy8gaGF2ZSBub3QgYmVlbiBhbnkgcGFyYW1ldGVyIHNldHMgc2luY2UgdGhlIGxhc3QgZnJhbWUuCi0gICAgICAgICAgYWN0aXZlX3Nwc18gPSBsYXN0X3Nwc187Ci0gICAgICAgICAgYWN0aXZlX3Nwc2V4dF8gPSBsYXN0X3Nwc2V4dF87Ci0gICAgICAgICAgYWN0aXZlX3Bwc18gPSBsYXN0X3Bwc187CisgICAgICAgICAgRENIRUNLKHNlZW5fcHBzXy5jb3VudChzbGljZV9oZHIucGljX3BhcmFtZXRlcl9zZXRfaWQpKTsKKyAgICAgICAgICBEQ0hFQ0soc2Vlbl9zcHNfLmNvdW50KHBwcy0+c2VxX3BhcmFtZXRlcl9zZXRfaWQpKTsKKyAgICAgICAgICBhY3RpdmVfc3BzXyA9IHNlZW5fc3BzX1tzbGljZV9oZHIucGljX3BhcmFtZXRlcl9zZXRfaWRdOworICAgICAgICAgIC8vIE5vdGU6IFNQUyBleHRlbnNpb24gbG9va3VwIG1heSBjcmVhdGUgYW4gZW1wdHkgZW50cnkuCisgICAgICAgICAgYWN0aXZlX3Nwc2V4dF8gPSBzZWVuX3Nwc2V4dF9bc2xpY2VfaGRyLnBpY19wYXJhbWV0ZXJfc2V0X2lkXTsKKyAgICAgICAgICBhY3RpdmVfcHBzXyA9IHNlZW5fcHBzX1twcHMtPnNlcV9wYXJhbWV0ZXJfc2V0X2lkXTsKIAogICAgICAgICAgIC8vIENvbXB1dGUgYW5kIHN0b3JlIGZyYW1lIHByb3BlcnRpZXMuIHxpbWFnZV9zaXplfCBnZXRzIGZpbGxlZCBpbgogICAgICAgICAgIC8vIGxhdGVyLCBzaW5jZSBpdCBjb21lcyBmcm9tIHRoZSBkZWNvZGVyIGNvbmZpZ3VyYXRpb24uCmRpZmYgLS1naXQgYS9tZWRpYS9ncHUvbWFjL3Z0X3ZpZGVvX2RlY29kZV9hY2NlbGVyYXRvcl9tYWMuaCBiL21lZGlhL2dwdS9tYWMvdnRfdmlkZW9fZGVjb2RlX2FjY2VsZXJhdG9yX21hYy5oCmluZGV4IDA3YWUwNzAuLjEwODNkNjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2dwdS9tYWMvdnRfdmlkZW9fZGVjb2RlX2FjY2VsZXJhdG9yX21hYy5oCisrKyBiL21lZGlhL2dwdS9tYWMvdnRfdmlkZW9fZGVjb2RlX2FjY2VsZXJhdG9yX21hYy5oCkBAIC0yNDMsMjYgKzI0MywyMyBAQAogICBiYXNlOjpTY29wZWRDRlR5cGVSZWY8VlREZWNvbXByZXNzaW9uU2Vzc2lvblJlZj4gc2Vzc2lvbl87CiAgIEgyNjRQYXJzZXIgcGFyc2VyXzsKIAotICAvLyBMYXN0IFNQUyBhbmQgUFBTIHNlZW4gaW4gdGhlIGJpdHN0cmVhbS4KLSAgLy8KLSAgLy8gVE9ETyhzYW5kZXJzZCk6IEtlZXAgYSBtYXAgZnJvbSBJRCB0byBsYXN0IFNQUy9QUFMsIGZvciBzdHJlYW1zIHRoYXQKLSAgLy8gbWFpbnRhaW4gbXVsdGlwbGUgYWN0aXZlIGNvbmZpZ3VyYXRpb25zLiAoSSd2ZSBuZXZlciBzZWVuIHN1Y2ggYSBzdHJlYW0uKQotICBpbnQgbGFzdF9zcHNfaWRfID0gLTE7Ci0gIGludCBsYXN0X3Bwc19pZF8gPSAtMTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbGFzdF9zcHNfOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBsYXN0X3Nwc2V4dF87Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGxhc3RfcHBzXzsKKyAgLy8gU1BTcyBhbmQgUFBTcyBzZWVuIGluIHRoZSBiaXRzdHJlYW0uCisgIHN0ZDo6bWFwPGludCwgc3RkOjp2ZWN0b3I8dWludDhfdD4+IHNlZW5fc3BzXzsKKyAgc3RkOjptYXA8aW50LCBzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gc2Vlbl9zcHNleHRfOworICBzdGQ6Om1hcDxpbnQsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBzZWVuX3Bwc187CiAKLSAgLy8gTGFzdCBTUFMgYW5kIFBQUyByZWZlcmVuY2VkIGJ5IGEgc2xpY2UuIEluIHByYWN0aWNlIHRoZXNlIHdpbGwgYmUgdGhlIHNhbWUKLSAgLy8gYXMgdGhlIGxhc3Qgc2VlbiB2YWx1ZXMsIHVubGVzcyB0aGUgYml0c3RyZWFtIGlzIG1hbGZvcm1hdHRlZC4KKyAgLy8gU1BTIGFuZCBQUFMgbW9zdCByZWNlbnRseSBhY3RpdmF0ZWQgYnkgYW4gSURSLgorICAvLyBUT0RPKHNhbmRlcnNkKTogRW5hYmxlIGNvbmZpZ3VyaW5nIHdpdGggbXVsdGlwbGUgUFBTcy4KICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYWN0aXZlX3Nwc187CiAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGFjdGl2ZV9zcHNleHRfOwogICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBhY3RpdmVfcHBzXzsKIAotICAvLyBMYXN0IFNQUyBhbmQgUFBTIHRoZSBkZWNvZGVyIHdhcyBjb25mZ3VyZWQgd2l0aC4KKyAgLy8gU1BTIGFuZCBQUFMgdGhlIGRlY29kZXIgaXMgY3VycmVudGx5IGNvbmZndXJlZCB3aXRoLgogICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBjb25maWd1cmVkX3Nwc187CiAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNvbmZpZ3VyZWRfc3BzZXh0XzsKICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gY29uZmlndXJlZF9wcHNfOworCisgIC8vIFZpc2libGUgcmVjdCB0aGUgZGVjb2RlciBpcyBjb25maWd1cmVkIHRvIHVzZS4KICAgZ2Z4OjpTaXplIGNvbmZpZ3VyZWRfc2l6ZV87CiAKICAgYm9vbCB3YWl0aW5nX2Zvcl9pZHJfID0gdHJ1ZTsKZGlmZiAtLWdpdCBhL21lZGlhL2dwdS90ZXN0L0JVSUxELmduIGIvbWVkaWEvZ3B1L3Rlc3QvQlVJTEQuZ24KaW5kZXggNTcyNjkzYi4uNTE0YWExNyAxMDA2NDQKLS0tIGEvbWVkaWEvZ3B1L3Rlc3QvQlVJTEQuZ24KKysrIGIvbWVkaWEvZ3B1L3Rlc3QvQlVJTEQuZ24KQEAgLTE1NywyMSArMTU3LDI0IEBACiAgIF0KIH0KIAotc3RhdGljX2xpYnJhcnkoImltYWdlX3Byb2Nlc3NvciIpIHsKLSAgdGVzdG9ubHkgPSB0cnVlCi0gIHNvdXJjZXMgPSBbCi0gICAgImltYWdlX3Byb2Nlc3Nvci9pbWFnZV9wcm9jZXNzb3JfY2xpZW50LmNjIiwKLSAgICAiaW1hZ2VfcHJvY2Vzc29yL2ltYWdlX3Byb2Nlc3Nvcl9jbGllbnQuaCIsCi0gIF0KLSAgZGVwcyA9IFsKLSAgICAiOmhlbHBlcnMiLAotICAgICI6cmVuZGVyX2hlbHBlcnMiLAotICAgICIvL21lZGlhOnRlc3Rfc3VwcG9ydCIsCi0gICAgIi8vbWVkaWEvZ3B1IiwKLSAgICAiLy90ZXN0aW5nL2d0ZXN0IiwKLSAgICAiLy90aGlyZF9wYXJ0eS9saWJ5dXYiLAotICBdCi0gIGRhdGEgPSBbCi0gICAgIi8vbWVkaWEvdGVzdC9kYXRhLyIsCi0gIF0KK2lmICh1c2VfdmFhcGkgfHwgdXNlX3Y0bDJfY29kZWMpIHsKKyAgc3RhdGljX2xpYnJhcnkoImltYWdlX3Byb2Nlc3NvciIpIHsKKyAgICB0ZXN0b25seSA9IHRydWUKKyAgICBzb3VyY2VzID0gWworICAgICAgImltYWdlX3Byb2Nlc3Nvci9pbWFnZV9wcm9jZXNzb3JfY2xpZW50LmNjIiwKKyAgICAgICJpbWFnZV9wcm9jZXNzb3IvaW1hZ2VfcHJvY2Vzc29yX2NsaWVudC5oIiwKKyAgICBdCisgICAgZGVwcyA9IFsKKyAgICAgICI6aGVscGVycyIsCisgICAgICAiOnJlbmRlcl9oZWxwZXJzIiwKKyAgICAgICIvL21lZGlhOnRlc3Rfc3VwcG9ydCIsCisgICAgICAiLy9tZWRpYS9ncHUiLAorICAgICAgIi8vbWVkaWEvZ3B1L2Nocm9tZW9zOmZvdXJjYyIsCisgICAgICAiLy90ZXN0aW5nL2d0ZXN0IiwKKyAgICAgICIvL3RoaXJkX3BhcnR5L2xpYnl1diIsCisgICAgXQorICAgIGRhdGEgPSBbCisgICAgICAiLy9tZWRpYS90ZXN0L2RhdGEvIiwKKyAgICBdCisgIH0KIH0KZGlmZiAtLWdpdCBhL21lZGlhL2dwdS90ZXN0L2ltYWdlX3Byb2Nlc3Nvci9pbWFnZV9wcm9jZXNzb3JfY2xpZW50LmNjIGIvbWVkaWEvZ3B1L3Rlc3QvaW1hZ2VfcHJvY2Vzc29yL2ltYWdlX3Byb2Nlc3Nvcl9jbGllbnQuY2MKaW5kZXggNmRlOGZhMmIuLmI0Y2E2NTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2dwdS90ZXN0L2ltYWdlX3Byb2Nlc3Nvci9pbWFnZV9wcm9jZXNzb3JfY2xpZW50LmNjCisrKyBiL21lZGlhL2dwdS90ZXN0L2ltYWdlX3Byb2Nlc3Nvci9pbWFnZV9wcm9jZXNzb3JfY2xpZW50LmNjCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSAibWVkaWEvYmFzZS92aWRlb19mcmFtZS5oIgogI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdmlkZW9fZnJhbWVfbGF5b3V0LmgiCiAjaW5jbHVkZSAibWVkaWEvZ3B1L2J1aWxkZmxhZ3MuaCIKKyNpbmNsdWRlICJtZWRpYS9ncHUvY2hyb21lb3MvZm91cmNjLmgiCiAjaW5jbHVkZSAibWVkaWEvZ3B1L2ltYWdlX3Byb2Nlc3Nvcl9mYWN0b3J5LmgiCiAjaW5jbHVkZSAibWVkaWEvZ3B1L3Rlc3QvaW1hZ2UuaCIKICNpbmNsdWRlICJtZWRpYS9ncHUvdGVzdC92aWRlb19mcmFtZV9oZWxwZXJzLmgiCkBAIC0xMDcsMjIgKzEwOCw0NSBAQAogICBkb25lLT5TaWduYWwoKTsKIH0KIAorbmFtZXNwYWNlIHsKKworYmFzZTo6T3B0aW9uYWw8VmlkZW9GcmFtZUxheW91dD4gQ3JlYXRlTGF5b3V0KAorICAgIGNvbnN0IEltYWdlUHJvY2Vzc29yOjpQb3J0Q29uZmlnJiBjb25maWcpIHsKKyAgLy8gVjRMMiBzcGVjaWZpYyBmb3JtYXQgaGFjazoKKyAgLy8gSWYgVkRBJ3Mgb3V0cHV0IGZvcm1hdCBpcyBWNEwyX1BJWF9GTVRfTVQyMUMsIHdoaWNoIGlzIGEgcGxhdGZvcm0gc3BlY2lmaWMKKyAgLy8gZm9ybWF0IGFuZCBub3cgaXMgb25seSB1c2VkIGZvciBNVDgxNzMgVkRBIG91dHB1dCBhbmQgaXRzIGltYWdlIHByb2Nlc3NvcgorICAvLyBpbnB1dCwgd2Ugc2V0IFZpZGVvRnJhbWVMYXlvdXQgZm9yIGltYWdlIHByb2Nlc3NvcidzIGlucHV0IHdpdGggZm9ybWF0CisgIC8vIFBJWEVMX0ZPUk1BVF9OVjEyIGFzIE5WMTIncyBsYXlvdXQgaXMgdGhlIHNhbWUgYXMgTVQyMS4KKyAgY29uc3QgVmlkZW9QaXhlbEZvcm1hdCBwaXhlbF9mb3JtYXQgPSBjb25maWcuZm91cmNjLlRvVmlkZW9QaXhlbEZvcm1hdCgpOworICBpZiAoY29uZmlnLnBsYW5lcy5zaXplKCkgPD0gMSkgeworICAgIHJldHVybiBWaWRlb0ZyYW1lTGF5b3V0OjpDcmVhdGUocGl4ZWxfZm9ybWF0LCBjb25maWcuc2l6ZSk7CisgIH0KKyAgcmV0dXJuIFZpZGVvRnJhbWVMYXlvdXQ6OkNyZWF0ZU11bHRpUGxhbmFyKHBpeGVsX2Zvcm1hdCwgY29uZmlnLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcucGxhbmVzKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKIHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gSW1hZ2VQcm9jZXNzb3JDbGllbnQ6OkNyZWF0ZUlucHV0RnJhbWUoCiAgICAgY29uc3QgSW1hZ2UmIGlucHV0X2ltYWdlKSBjb25zdCB7CiAgIERDSEVDS19DQUxMRURfT05fVkFMSURfVEhSRUFEKHRlc3RfbWFpbl90aHJlYWRfY2hlY2tlcl8pOwogICBMT0dfQVNTRVJUKGltYWdlX3Byb2Nlc3Nvcl8pOwogICBMT0dfQVNTRVJUKGlucHV0X2ltYWdlLklzTG9hZGVkKCkpOwogCi0gIGNvbnN0IGF1dG8mIGlucHV0X2xheW91dCA9IGltYWdlX3Byb2Nlc3Nvcl8tPmlucHV0X2xheW91dCgpOwotICBpZiAoVmlkZW9GcmFtZTo6SXNTdG9yYWdlVHlwZU1hcHBhYmxlKAotICAgICAgICAgIGltYWdlX3Byb2Nlc3Nvcl8tPmlucHV0X3N0b3JhZ2VfdHlwZSgpKSkgeworICBjb25zdCBJbWFnZVByb2Nlc3Nvcjo6UG9ydENvbmZpZyYgaW5wdXRfY29uZmlnID0KKyAgICAgIGltYWdlX3Byb2Nlc3Nvcl8tPmlucHV0X2NvbmZpZygpOworICBjb25zdCBWaWRlb0ZyYW1lOjpTdG9yYWdlVHlwZSBpbnB1dF9zdG9yYWdlX3R5cGUgPQorICAgICAgaW5wdXRfY29uZmlnLnN0b3JhZ2VfdHlwZSgpOworICBiYXNlOjpPcHRpb25hbDxWaWRlb0ZyYW1lTGF5b3V0PiBpbnB1dF9sYXlvdXQgPSBDcmVhdGVMYXlvdXQoaW5wdXRfY29uZmlnKTsKKyAgTE9HX0FTU0VSVChpbnB1dF9sYXlvdXQpOworCisgIGlmIChWaWRlb0ZyYW1lOjpJc1N0b3JhZ2VUeXBlTWFwcGFibGUoaW5wdXRfc3RvcmFnZV90eXBlKSkgewogICAgIHJldHVybiBDbG9uZVZpZGVvRnJhbWUoZ3B1X21lbW9yeV9idWZmZXJfZmFjdG9yeV8uZ2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVWaWRlb0ZyYW1lRnJvbUltYWdlKGlucHV0X2ltYWdlKS5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2xheW91dCwgVmlkZW9GcmFtZTo6U1RPUkFHRV9PV05FRF9NRU1PUlkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgKmlucHV0X2xheW91dCwgVmlkZW9GcmFtZTo6U1RPUkFHRV9PV05FRF9NRU1PUlkpOwogICB9IGVsc2UgewogI2lmIGRlZmluZWQoT1NfQ0hST01FT1MpCi0gICAgTE9HX0FTU0VSVChpbWFnZV9wcm9jZXNzb3JfLT5pbnB1dF9zdG9yYWdlX3R5cGUoKSA9PQotICAgICAgICAgICAgICAgVmlkZW9GcmFtZTo6U1RPUkFHRV9ETUFCVUZTKTsKKyAgICBMT0dfQVNTRVJUKGlucHV0X3N0b3JhZ2VfdHlwZSA9PSBWaWRlb0ZyYW1lOjpTVE9SQUdFX0RNQUJVRlMpOwogICAgIC8vIE5WMTIgYW5kIFlWMTIgYXJlIHRoZSBvbmx5IGZvcm1hdHMgdGhhdCBjYW4gYmUgYWxsb2NhdGVkIHdpdGgKICAgICAvLyBnZng6OkJ1ZmZlclVzYWdlOjpTQ0FOT1VUX1ZFQV9SRUFEX0NBTUVSQV9BTkRfQ1BVX1JFQURfV1JJVEUuIFNvCiAgICAgLy8gZ2Z4OjpCdWZmZXJVc2FnZTo6R1BVX1JFQURfQ1BVX1JFQURfV1JJVEUgaXMgc3BlY2lmaWVkIGZvciBSR0IgZm9ybWF0cy4KQEAgLTEzMiw3ICsxNTYsNyBAQAogICAgICAgICAgICAgOiBnZng6OkJ1ZmZlclVzYWdlOjpHUFVfUkVBRF9DUFVfUkVBRF9XUklURTsKICAgICByZXR1cm4gQ2xvbmVWaWRlb0ZyYW1lKGdwdV9tZW1vcnlfYnVmZmVyX2ZhY3RvcnlfLmdldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlVmlkZW9GcmFtZUZyb21JbWFnZShpbnB1dF9pbWFnZSkuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9sYXlvdXQsIFZpZGVvRnJhbWU6OlNUT1JBR0VfRE1BQlVGUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICppbnB1dF9sYXlvdXQsIFZpZGVvRnJhbWU6OlNUT1JBR0VfRE1BQlVGUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9idWZmZXJfdXNhZ2UpOwogI2VuZGlmCiAgICAgcmV0dXJuIG51bGxwdHI7CkBAIC0xNDUsMTkgKzE2OSwyMiBAQAogICBMT0dfQVNTRVJUKG91dHB1dF9pbWFnZS5Jc01ldGFkYXRhTG9hZGVkKCkpOwogICBMT0dfQVNTRVJUKGltYWdlX3Byb2Nlc3Nvcl8pOwogCi0gIGNvbnN0IGF1dG8mIG91dHB1dF9sYXlvdXQgPSBpbWFnZV9wcm9jZXNzb3JfLT5vdXRwdXRfbGF5b3V0KCk7Ci0gIGlmIChWaWRlb0ZyYW1lOjpJc1N0b3JhZ2VUeXBlTWFwcGFibGUoCi0gICAgICAgICAgaW1hZ2VfcHJvY2Vzc29yXy0+b3V0cHV0X3N0b3JhZ2VfdHlwZSgpKSkgeworICBjb25zdCBJbWFnZVByb2Nlc3Nvcjo6UG9ydENvbmZpZyYgb3V0cHV0X2NvbmZpZyA9CisgICAgICBpbWFnZV9wcm9jZXNzb3JfLT5vdXRwdXRfY29uZmlnKCk7CisgIGNvbnN0IFZpZGVvRnJhbWU6OlN0b3JhZ2VUeXBlIG91dHB1dF9zdG9yYWdlX3R5cGUgPQorICAgICAgb3V0cHV0X2NvbmZpZy5zdG9yYWdlX3R5cGUoKTsKKyAgYmFzZTo6T3B0aW9uYWw8VmlkZW9GcmFtZUxheW91dD4gb3V0cHV0X2xheW91dCA9IENyZWF0ZUxheW91dChvdXRwdXRfY29uZmlnKTsKKyAgTE9HX0FTU0VSVChvdXRwdXRfbGF5b3V0KTsKKyAgaWYgKFZpZGVvRnJhbWU6OklzU3RvcmFnZVR5cGVNYXBwYWJsZShvdXRwdXRfc3RvcmFnZV90eXBlKSkgewogICAgIHJldHVybiBWaWRlb0ZyYW1lOjpDcmVhdGVGcmFtZVdpdGhMYXlvdXQoCi0gICAgICAgIG91dHB1dF9sYXlvdXQsIGdmeDo6UmVjdChvdXRwdXRfaW1hZ2UuU2l6ZSgpKSwgb3V0cHV0X2ltYWdlLlNpemUoKSwKKyAgICAgICAgKm91dHB1dF9sYXlvdXQsIGdmeDo6UmVjdChvdXRwdXRfaW1hZ2UuU2l6ZSgpKSwgb3V0cHV0X2ltYWdlLlNpemUoKSwKICAgICAgICAgYmFzZTo6VGltZURlbHRhKCksIGZhbHNlIC8qIHplcm9faW5pdGlhbGl6ZV9tZW1vcnkqLyk7CiAgIH0gZWxzZSB7CiAjaWYgQlVJTERGTEFHKFVTRV9DSFJPTUVPU19NRURJQV9BQ0NFTEVSQVRJT04pCi0gICAgTE9HX0FTU0VSVChpbWFnZV9wcm9jZXNzb3JfLT5vdXRwdXRfc3RvcmFnZV90eXBlKCkgPT0KLSAgICAgICAgICAgICAgIFZpZGVvRnJhbWU6OlNUT1JBR0VfRE1BQlVGUyk7CisgICAgTE9HX0FTU0VSVChvdXRwdXRfc3RvcmFnZV90eXBlID09IFZpZGVvRnJhbWU6OlNUT1JBR0VfRE1BQlVGUyk7CiAgICAgcmV0dXJuIENyZWF0ZVBsYXRmb3JtVmlkZW9GcmFtZSgKLSAgICAgICAgZ3B1X21lbW9yeV9idWZmZXJfZmFjdG9yeV8uZ2V0KCksIG91dHB1dF9sYXlvdXQuZm9ybWF0KCksCi0gICAgICAgIG91dHB1dF9sYXlvdXQuY29kZWRfc2l6ZSgpLCBnZng6OlJlY3Qob3V0cHV0X2ltYWdlLlNpemUoKSksCisgICAgICAgIGdwdV9tZW1vcnlfYnVmZmVyX2ZhY3RvcnlfLmdldCgpLCBvdXRwdXRfbGF5b3V0LT5mb3JtYXQoKSwKKyAgICAgICAgb3V0cHV0X2xheW91dC0+Y29kZWRfc2l6ZSgpLCBnZng6OlJlY3Qob3V0cHV0X2ltYWdlLlNpemUoKSksCiAgICAgICAgIG91dHB1dF9pbWFnZS5TaXplKCksIGJhc2U6OlRpbWVEZWx0YSgpLAogICAgICAgICBnZng6OkJ1ZmZlclVzYWdlOjpHUFVfUkVBRF9DUFVfUkVBRF9XUklURSk7CiAjZW5kaWYgIC8vIEJVSUxERkxBRyhVU0VfQ0hST01FT1NfTUVESUFfQUNDRUxFUkFUSU9OKQpkaWZmIC0tZ2l0IGEvbWVkaWEvZ3B1L3Rlc3QvdmlkZW9fcGxheWVyL3Rlc3RfdmRhX3ZpZGVvX2RlY29kZXIuY2MgYi9tZWRpYS9ncHUvdGVzdC92aWRlb19wbGF5ZXIvdGVzdF92ZGFfdmlkZW9fZGVjb2Rlci5jYwppbmRleCBkNDVhZWY4Li41MTM0ZTQ4NiAxMDA2NDQKLS0tIGEvbWVkaWEvZ3B1L3Rlc3QvdmlkZW9fcGxheWVyL3Rlc3RfdmRhX3ZpZGVvX2RlY29kZXIuY2MKKysrIGIvbWVkaWEvZ3B1L3Rlc3QvdmlkZW9fcGxheWVyL3Rlc3RfdmRhX3ZpZGVvX2RlY29kZXIuY2MKQEAgLTEyLDcgKzEyLDYgQEAKICNpbmNsdWRlICJiYXNlL3Rhc2svcG9zdF90YXNrLmgiCiAjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX3Rhc2tfcnVubmVyX2hhbmRsZS5oIgogI2luY2x1ZGUgImJ1aWxkL2J1aWxkX2NvbmZpZy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYmluZF90b19jdXJyZW50X2xvb3AuaCIKICNpbmNsdWRlICJtZWRpYS9iYXNlL3ZpZGVvX2ZyYW1lLmgiCiAjaW5jbHVkZSAibWVkaWEvYmFzZS93YWl0aW5nLmgiCiAjaW5jbHVkZSAibWVkaWEvZ3B1L2dwdV92aWRlb19kZWNvZGVfYWNjZWxlcmF0b3JfZmFjdG9yeS5oIgpAQCAtNDcsMTIgKzQ2LDE0IEBACiAgICAgICBncHVfbWVtb3J5X2J1ZmZlcl9mYWN0b3J5XyhncHVfbWVtb3J5X2J1ZmZlcl9mYWN0b3J5KSwKICNlbmRpZiAgLy8gQlVJTERGTEFHKFVTRV9DSFJPTUVPU19NRURJQV9BQ0NFTEVSQVRJT04pCiAgICAgICBkZWNvZGVfc3RhcnRfdGltZXN0YW1wc18oa1RpbWVzdGFtcENhY2hlU2l6ZSkgewotICBERVRBQ0hfRlJPTV9TRVFVRU5DRSh2ZGFfd3JhcHBlcl9zZXF1ZW5jZV9jaGVja2VyXyk7CisgIERDSEVDS19DQUxMRURfT05fVkFMSURfU0VRVUVOQ0UodmRhX3dyYXBwZXJfc2VxdWVuY2VfY2hlY2tlcl8pOwogCiAgIC8vIFRPRE8oY3JidWcuY29tLzkzMzYzMikgUmVtb3ZlIHN1cHBvcnQgZm9yIGFsbG9jYXRlIG1vZGUsIGFuZCBhbHdheXMgdXNlCiAgIC8vIGltcG9ydCBtb2RlLiBTdXBwb3J0IGZvciBhbGxvY2F0ZSBtb2RlIGlzIHRlbXBvcmFyeSBtYWludGFpbmVkIGZvciBvbGRlcgogICAvLyBwbGF0Zm9ybXMgdGhhdCBkb24ndCBzdXBwb3J0IGltcG9ydCBtb2RlLgogCisgIHZkYV93cmFwcGVyX3Rhc2tfcnVubmVyXyA9IGJhc2U6OlRocmVhZFRhc2tSdW5uZXJIYW5kbGU6OkdldCgpOworCiAgIHdlYWtfdGhpc18gPSB3ZWFrX3RoaXNfZmFjdG9yeV8uR2V0V2Vha1B0cigpOwogfQogCkBAIC0yNjgsNiArMjY5LDggQEAKIH0KIAogdm9pZCBUZXN0VkRBVmlkZW9EZWNvZGVyOjpEaXNtaXNzUGljdHVyZUJ1ZmZlcihpbnQzMl90IHBpY3R1cmVfYnVmZmVyX2lkKSB7CisgIERDSEVDS19DQUxMRURfT05fVkFMSURfU0VRVUVOQ0UodmRhX3dyYXBwZXJfc2VxdWVuY2VfY2hlY2tlcl8pOworCiAgIC8vIERyb3AgcmVmZXJlbmNlIHRvIHRoZSB2aWRlbyBmcmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIHBpY3R1cmUgYnVmZmVyLCBzbwogICAvLyB0aGUgdmlkZW8gZnJhbWUgYW5kIHJlbGF0ZWQgdGV4dHVyZSBhcmUgYXV0b21hdGljYWxseSBkZXN0cm95ZWQgb25jZSB0aGUKICAgLy8gcmVuZGVyZXIgYW5kIHZpZGVvIGZyYW1lIHByb2Nlc3NvcnMgYXJlIGRvbmUgdXNpbmcgdGhlbS4KQEAgLTMyMSwxMyArMzI0LDI0IEBACiAgIC8vIHx2aWRlb19mcmFtZXNffCB0byBtYXAgYmV0d2VlbiBwaWN0dXJlIGJ1ZmZlcnMgYW5kIGZyYW1lcywgYnV0IHRoYXQKICAgLy8gcmVmZXJlbmNlIHdpbGwgYmUgcmVsZWFzZWQgd2hlbiB0aGUgZGVjb2RlciBjYWxscyBEaXNtaXNzUGljdHVyZUJ1ZmZlcigpCiAgIC8vIChlLmcuIG9uIGEgcmVzb2x1dGlvbiBjaGFuZ2UpLgotICBiYXNlOjpPbmNlQ2xvc3VyZSByZXVzZV9jYiA9IEJpbmRUb0N1cnJlbnRMb29wKAotICAgICAgYmFzZTo6QmluZE9uY2UoJlRlc3RWREFWaWRlb0RlY29kZXI6OlJldXNlUGljdHVyZUJ1ZmZlclRhc2ssIHdlYWtfdGhpc18sCi0gICAgICAgICAgICAgICAgICAgICBwaWN0dXJlLnBpY3R1cmVfYnVmZmVyX2lkKCkpKTsKKyAgYmFzZTo6T25jZUNsb3N1cmUgcmV1c2VfY2IgPQorICAgICAgYmFzZTo6QmluZE9uY2UoJlRlc3RWREFWaWRlb0RlY29kZXI6OlJldXNlUGljdHVyZUJ1ZmZlclRodW5rLCB3ZWFrX3RoaXNfLAorICAgICAgICAgICAgICAgICAgICAgdmRhX3dyYXBwZXJfdGFza19ydW5uZXJfLCBwaWN0dXJlLnBpY3R1cmVfYnVmZmVyX2lkKCkpOwogICB3cmFwcGVkX3ZpZGVvX2ZyYW1lLT5BZGREZXN0cnVjdGlvbk9ic2VydmVyKHN0ZDo6bW92ZShyZXVzZV9jYikpOwogICBvdXRwdXRfY2JfLlJ1bihzdGQ6Om1vdmUod3JhcHBlZF92aWRlb19mcmFtZSkpOwogfQogCisvLyBzdGF0aWMKK3ZvaWQgVGVzdFZEQVZpZGVvRGVjb2Rlcjo6UmV1c2VQaWN0dXJlQnVmZmVyVGh1bmsoCisgICAgYmFzZTo6T3B0aW9uYWw8YmFzZTo6V2Vha1B0cjxUZXN0VkRBVmlkZW9EZWNvZGVyPj4gdmRhX3ZpZGVvX2RlY29kZXIsCisgICAgc2NvcGVkX3JlZnB0cjxiYXNlOjpTZXF1ZW5jZWRUYXNrUnVubmVyPiB0YXNrX3J1bm5lciwKKyAgICBpbnQzMl90IHBpY3R1cmVfYnVmZmVyX2lkKSB7CisgIERDSEVDSyh2ZGFfdmlkZW9fZGVjb2Rlcik7CisgIHRhc2tfcnVubmVyLT5Qb3N0VGFzaygKKyAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZE9uY2UoJlRlc3RWREFWaWRlb0RlY29kZXI6OlJldXNlUGljdHVyZUJ1ZmZlclRhc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2ZGFfdmlkZW9fZGVjb2RlciwgcGljdHVyZV9idWZmZXJfaWQpKTsKK30KKwogLy8gQ2FsbGVkIHdoZW4gYSBwaWN0dXJlIGJ1ZmZlciBpcyByZWFkeSB0byBiZSByZS11c2VkLgogdm9pZCBUZXN0VkRBVmlkZW9EZWNvZGVyOjpSZXVzZVBpY3R1cmVCdWZmZXJUYXNrKGludDMyX3QgcGljdHVyZV9idWZmZXJfaWQpIHsKICAgRENIRUNLX0NBTExFRF9PTl9WQUxJRF9TRVFVRU5DRSh2ZGFfd3JhcHBlcl9zZXF1ZW5jZV9jaGVja2VyXyk7CmRpZmYgLS1naXQgYS9tZWRpYS9ncHUvdGVzdC92aWRlb19wbGF5ZXIvdGVzdF92ZGFfdmlkZW9fZGVjb2Rlci5oIGIvbWVkaWEvZ3B1L3Rlc3QvdmlkZW9fcGxheWVyL3Rlc3RfdmRhX3ZpZGVvX2RlY29kZXIuaAppbmRleCAyNDRhZWQ1Li43NmFkYWYxNyAxMDA2NDQKLS0tIGEvbWVkaWEvZ3B1L3Rlc3QvdmlkZW9fcGxheWVyL3Rlc3RfdmRhX3ZpZGVvX2RlY29kZXIuaAorKysgYi9tZWRpYS9ncHUvdGVzdC92aWRlb19wbGF5ZXIvdGVzdF92ZGFfdmlkZW9fZGVjb2Rlci5oCkBAIC04MCw2ICs4MCwxMiBAQAogICB2b2lkIE5vdGlmeVJlc2V0RG9uZSgpIG92ZXJyaWRlOwogICB2b2lkIE5vdGlmeUVycm9yKFZpZGVvRGVjb2RlQWNjZWxlcmF0b3I6OkVycm9yIGVycm9yKSBvdmVycmlkZTsKIAorICAvLyBIZWxwZXIgdGh1bmsgdG8gYXZvaWQgZGVyZWZlcmVuY2luZyBXZWFrUHRycyBvbiB0aGUgd3JvbmcgdGhyZWFkLgorICBzdGF0aWMgdm9pZCBSZXVzZVBpY3R1cmVCdWZmZXJUaHVuaygKKyAgICAgIGJhc2U6Ok9wdGlvbmFsPGJhc2U6OldlYWtQdHI8VGVzdFZEQVZpZGVvRGVjb2Rlcj4+IGRlY29kZXJfY2xpZW50LAorICAgICAgc2NvcGVkX3JlZnB0cjxiYXNlOjpTZXF1ZW5jZWRUYXNrUnVubmVyPiB0YXNrX3J1bm5lciwKKyAgICAgIGludDMyX3QgcGljdHVyZV9idWZmZXJfaWQpOworCiAgIC8vIEdldCB0aGUgbmV4dCBiaXRzdHJlYW0gYnVmZmVyIGlkIHRvIGJlIHVzZWQuCiAgIGludDMyX3QgR2V0TmV4dEJpdHN0cmVhbUJ1ZmZlcklkKCk7CiAgIC8vIEdldCB0aGUgbmV4dCBwaWN0dXJlIGJ1ZmZlciBpZCB0byBiZSB1c2VkLgpAQCAtMTE4LDYgKzEyNCw4IEBACiAKICAgc3RkOjp1bmlxdWVfcHRyPFZpZGVvRGVjb2RlQWNjZWxlcmF0b3I+IGRlY29kZXJfOwogCisgIHNjb3BlZF9yZWZwdHI8YmFzZTo6U2VxdWVuY2VkVGFza1J1bm5lcj4gdmRhX3dyYXBwZXJfdGFza19ydW5uZXJfOworCiAgIFNFUVVFTkNFX0NIRUNLRVIodmRhX3dyYXBwZXJfc2VxdWVuY2VfY2hlY2tlcl8pOwogCiAgIGJhc2U6OldlYWtQdHI8VGVzdFZEQVZpZGVvRGVjb2Rlcj4gd2Vha190aGlzXzsKZGlmZiAtLWdpdCBhL21lZGlhL2dwdS90ZXN0L3ZpZGVvX3BsYXllci92aWRlb19kZWNvZGVyX2NsaWVudC5jYyBiL21lZGlhL2dwdS90ZXN0L3ZpZGVvX3BsYXllci92aWRlb19kZWNvZGVyX2NsaWVudC5jYwppbmRleCBiZDc5NmFkMS4uZjMyM2JkOWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2dwdS90ZXN0L3ZpZGVvX3BsYXllci92aWRlb19kZWNvZGVyX2NsaWVudC5jYworKysgYi9tZWRpYS9ncHUvdGVzdC92aWRlb19wbGF5ZXIvdmlkZW9fZGVjb2Rlcl9jbGllbnQuY2MKQEAgLTExLDcgKzExLDYgQEAKICNpbmNsdWRlICJiYXNlL21lbW9yeS9wdHJfdXRpbC5oIgogI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF90YXNrX3J1bm5lcl9oYW5kbGUuaCIKICNpbmNsdWRlICJidWlsZC9idWlsZF9jb25maWcuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2JpbmRfdG9fY3VycmVudF9sb29wLmgiCiAjaW5jbHVkZSAibWVkaWEvYmFzZS93YWl0aW5nLmgiCiAjaW5jbHVkZSAibWVkaWEvZ3B1L2J1aWxkZmxhZ3MuaCIKICNpbmNsdWRlICJtZWRpYS9ncHUvbWFjcm9zLmgiCkBAIC0zMiw2ICszMSwyMSBAQAogbmFtZXNwYWNlIG1lZGlhIHsKIG5hbWVzcGFjZSB0ZXN0IHsKIAorbmFtZXNwYWNlIHsKKy8vIENhbGxiYWNrcyBjYW4gYmUgY2FsbGVkIGZyb20gYW55IHRocmVhZCwgYnV0IFdlYWtQdHJzIGFyZSBub3QgdGhyZWFkLXNhZmUuCisvLyBUaGlzIGhlbHBlciB0aHVuayB3cmFwcyBhIFdlYWtQdHIgaW50byBhbiAnT3B0aW9uYWwnIHZhbHVlLCBzbyB0aGUgV2Vha1B0ciBpcworLy8gb25seSBkZXJlZmVyZW5jZWQgYWZ0ZXIgcmVzY2hlZHVsaW5nIHRoZSB0YXNrIG9uIHRoZSBzcGVjaWZpZWQgdGFzayBydW5uZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRiwgdHlwZW5hbWUuLi4gQXJncz4KK3ZvaWQgQ2FsbGJhY2tUaHVuaygKKyAgICBiYXNlOjpPcHRpb25hbDxiYXNlOjpXZWFrUHRyPFZpZGVvRGVjb2RlckNsaWVudD4+IGRlY29kZXJfY2xpZW50LAorICAgIHNjb3BlZF9yZWZwdHI8YmFzZTo6U2VxdWVuY2VkVGFza1J1bm5lcj4gdGFza19ydW5uZXIsCisgICAgRiBmLAorICAgIEFyZ3MuLi4gYXJncykgeworICBEQ0hFQ0soZGVjb2Rlcl9jbGllbnQpOworICB0YXNrX3J1bm5lci0+UG9zdFRhc2soRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZShmLCAqZGVjb2Rlcl9jbGllbnQsIGFyZ3MuLi4pKTsKK30KK30gIC8vIG5hbWVzcGFjZQorCiBWaWRlb0RlY29kZXJDbGllbnQ6OlZpZGVvRGVjb2RlckNsaWVudCgKICAgICBjb25zdCBWaWRlb1BsYXllcjo6RXZlbnRDYWxsYmFjayYgZXZlbnRfY2IsCiAgICAgZ3B1OjpHcHVNZW1vcnlCdWZmZXJGYWN0b3J5KiBncHVfbWVtb3J5X2J1ZmZlcl9mYWN0b3J5LApAQCAtMjA4LDEwICsyMjIsMTYgQEAKICAgICAgIGtOb1RyYW5zZm9ybWF0aW9uLCB2aWRlb18tPlJlc29sdXRpb24oKSwgZ2Z4OjpSZWN0KHZpZGVvXy0+UmVzb2x1dGlvbigpKSwKICAgICAgIHZpZGVvXy0+UmVzb2x1dGlvbigpLCBzdGQ6OnZlY3Rvcjx1aW50OF90PigwKSwgRW5jcnlwdGlvblNjaGVtZSgpKTsKIAotICBWaWRlb0RlY29kZXI6OkluaXRDQiBpbml0X2NiID0gQmluZFRvQ3VycmVudExvb3AoCi0gICAgICBiYXNlOjpCaW5kT25jZSgmVmlkZW9EZWNvZGVyQ2xpZW50OjpEZWNvZGVySW5pdGlhbGl6ZWRUYXNrLCB3ZWFrX3RoaXNfKSk7Ci0gIFZpZGVvRGVjb2Rlcjo6T3V0cHV0Q0Igb3V0cHV0X2NiID0gQmluZFRvQ3VycmVudExvb3AoCi0gICAgICBiYXNlOjpCaW5kUmVwZWF0aW5nKCZWaWRlb0RlY29kZXJDbGllbnQ6OkZyYW1lUmVhZHlUYXNrLCB3ZWFrX3RoaXNfKSk7CisgIFZpZGVvRGVjb2Rlcjo6SW5pdENCIGluaXRfY2IgPSBiYXNlOjpCaW5kT25jZSgKKyAgICAgIENhbGxiYWNrVGh1bms8ZGVjbHR5cGUoJlZpZGVvRGVjb2RlckNsaWVudDo6RGVjb2RlckluaXRpYWxpemVkVGFzayksCisgICAgICAgICAgICAgICAgICAgIGJvb2w+LAorICAgICAgd2Vha190aGlzXywgZGVjb2Rlcl9jbGllbnRfdGhyZWFkXy50YXNrX3J1bm5lcigpLAorICAgICAgJlZpZGVvRGVjb2RlckNsaWVudDo6RGVjb2RlckluaXRpYWxpemVkVGFzayk7CisgIFZpZGVvRGVjb2Rlcjo6T3V0cHV0Q0Igb3V0cHV0X2NiID0gYmFzZTo6QmluZFJlcGVhdGluZygKKyAgICAgIENhbGxiYWNrVGh1bms8ZGVjbHR5cGUoJlZpZGVvRGVjb2RlckNsaWVudDo6RnJhbWVSZWFkeVRhc2spLAorICAgICAgICAgICAgICAgICAgICBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+PiwKKyAgICAgIHdlYWtfdGhpc18sIGRlY29kZXJfY2xpZW50X3RocmVhZF8udGFza19ydW5uZXIoKSwKKyAgICAgICZWaWRlb0RlY29kZXJDbGllbnQ6OkZyYW1lUmVhZHlUYXNrKTsKIAogICBkZWNvZGVyXy0+SW5pdGlhbGl6ZShjb25maWcsIGZhbHNlLCBudWxscHRyLCBzdGQ6Om1vdmUoaW5pdF9jYiksIG91dHB1dF9jYiwKICAgICAgICAgICAgICAgICAgICAgICAgV2FpdGluZ0NCKCkpOwpAQCAtMjgzLDggKzMwMywxMSBAQAogICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oZnJhZ21lbnRfYnl0ZXMuZGF0YSgpKSwgZnJhZ21lbnRfc2l6ZSk7CiAgIGJpdHN0cmVhbV9idWZmZXItPnNldF90aW1lc3RhbXAoYmFzZTo6VGltZVRpY2tzOjpOb3coKS5zaW5jZV9vcmlnaW4oKSk7CiAKLSAgVmlkZW9EZWNvZGVyOjpEZWNvZGVDQiBkZWNvZGVfY2IgPSBCaW5kVG9DdXJyZW50TG9vcCgKLSAgICAgIGJhc2U6OkJpbmRPbmNlKCZWaWRlb0RlY29kZXJDbGllbnQ6OkRlY29kZURvbmVUYXNrLCB3ZWFrX3RoaXNfKSk7CisgIFZpZGVvRGVjb2Rlcjo6RGVjb2RlQ0IgZGVjb2RlX2NiID0gYmFzZTo6QmluZE9uY2UoCisgICAgICBDYWxsYmFja1RodW5rPGRlY2x0eXBlKCZWaWRlb0RlY29kZXJDbGllbnQ6OkRlY29kZURvbmVUYXNrKSwKKyAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkRlY29kZVN0YXR1cz4sCisgICAgICB3ZWFrX3RoaXNfLCBkZWNvZGVyX2NsaWVudF90aHJlYWRfLnRhc2tfcnVubmVyKCksCisgICAgICAmVmlkZW9EZWNvZGVyQ2xpZW50OjpEZWNvZGVEb25lVGFzayk7CiAgIGRlY29kZXJfLT5EZWNvZGUoc3RkOjptb3ZlKGJpdHN0cmVhbV9idWZmZXIpLCBzdGQ6Om1vdmUoZGVjb2RlX2NiKSk7CiAKICAgbnVtX291dHN0YW5kaW5nX2RlY29kZV9yZXF1ZXN0c18rKzsKQEAgLTMwNCw4ICszMjcsMTEgQEAKICAgLy8gQ2hhbmdpbmcgdGhlIHN0YXRlIHRvIGZsdXNoaW5nIHdpbGwgYWJvcnQgYW55IHBlbmRpbmcgZGVjb2Rlcy4KICAgZGVjb2Rlcl9jbGllbnRfc3RhdGVfID0gVmlkZW9EZWNvZGVyQ2xpZW50U3RhdGU6OmtGbHVzaGluZzsKIAotICBWaWRlb0RlY29kZXI6OkRlY29kZUNCIGZsdXNoX2RvbmVfY2IgPSBCaW5kVG9DdXJyZW50TG9vcCgKLSAgICAgIGJhc2U6OkJpbmRPbmNlKCZWaWRlb0RlY29kZXJDbGllbnQ6OkZsdXNoRG9uZVRhc2ssIHdlYWtfdGhpc18pKTsKKyAgVmlkZW9EZWNvZGVyOjpEZWNvZGVDQiBmbHVzaF9kb25lX2NiID0KKyAgICAgIGJhc2U6OkJpbmRPbmNlKENhbGxiYWNrVGh1bms8ZGVjbHR5cGUoJlZpZGVvRGVjb2RlckNsaWVudDo6Rmx1c2hEb25lVGFzayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpEZWNvZGVTdGF0dXM+LAorICAgICAgICAgICAgICAgICAgICAgd2Vha190aGlzXywgZGVjb2Rlcl9jbGllbnRfdGhyZWFkXy50YXNrX3J1bm5lcigpLAorICAgICAgICAgICAgICAgICAgICAgJlZpZGVvRGVjb2RlckNsaWVudDo6Rmx1c2hEb25lVGFzayk7CiAgIGRlY29kZXJfLT5EZWNvZGUoRGVjb2RlckJ1ZmZlcjo6Q3JlYXRlRU9TQnVmZmVyKCksIHN0ZDo6bW92ZShmbHVzaF9kb25lX2NiKSk7CiAKICAgRmlyZUV2ZW50KFZpZGVvUGxheWVyRXZlbnQ6OmtGbHVzaGluZyk7CkBAIC0zMTksOCArMzQ1LDEwIEBACiAgIGRlY29kZXJfY2xpZW50X3N0YXRlXyA9IFZpZGVvRGVjb2RlckNsaWVudFN0YXRlOjprUmVzZXR0aW5nOwogICAvLyBUT0RPKGRzdGFlc3NlbnNAKSBBbGxvdyByZXNldHRpbmcgdG8gYW55IHBvaW50IGluIHRoZSBzdHJlYW0uCiAgIGVuY29kZWRfZGF0YV9oZWxwZXJfLT5SZXdpbmQoKTsKLSAgYmFzZTo6UmVwZWF0aW5nQ2xvc3VyZSByZXNldF9kb25lX2NiID0gQmluZFRvQ3VycmVudExvb3AoCi0gICAgICBiYXNlOjpCaW5kUmVwZWF0aW5nKCZWaWRlb0RlY29kZXJDbGllbnQ6OlJlc2V0RG9uZVRhc2ssIHdlYWtfdGhpc18pKTsKKworICBiYXNlOjpSZXBlYXRpbmdDbG9zdXJlIHJlc2V0X2RvbmVfY2IgPSBiYXNlOjpCaW5kUmVwZWF0aW5nKAorICAgICAgQ2FsbGJhY2tUaHVuazxkZWNsdHlwZSgmVmlkZW9EZWNvZGVyQ2xpZW50OjpSZXNldERvbmVUYXNrKT4sIHdlYWtfdGhpc18sCisgICAgICBkZWNvZGVyX2NsaWVudF90aHJlYWRfLnRhc2tfcnVubmVyKCksICZWaWRlb0RlY29kZXJDbGllbnQ6OlJlc2V0RG9uZVRhc2spOwogICBkZWNvZGVyXy0+UmVzZXQocmVzZXRfZG9uZV9jYik7CiAgIEZpcmVFdmVudChWaWRlb1BsYXllckV2ZW50OjprUmVzZXR0aW5nKTsKIH0KQEAgLTM5Myw2ICs0MjEsOCBAQAogfQogCiB2b2lkIFZpZGVvRGVjb2RlckNsaWVudDo6RmlyZUV2ZW50KFZpZGVvUGxheWVyRXZlbnQgZXZlbnQpIHsKKyAgRENIRUNLX0NBTExFRF9PTl9WQUxJRF9TRVFVRU5DRShkZWNvZGVyX2NsaWVudF9zZXF1ZW5jZV9jaGVja2VyXyk7CisKICAgYm9vbCBjb250aW51ZV9kZWNvZGluZyA9IGV2ZW50X2NiXy5SdW4oZXZlbnQpOwogICBpZiAoIWNvbnRpbnVlX2RlY29kaW5nKSB7CiAgICAgLy8gQ2hhbmdpbmcgdGhlIHN0YXRlIHRvIGlkbGUgd2lsbCBhYm9ydCBhbnkgcGVuZGluZyBkZWNvZGVzLgpkaWZmIC0tZ2l0IGEvbWVkaWEvZ3B1L3Rlc3QvdmlkZW9fcGxheWVyL3ZpZGVvX3BsYXllci5jYyBiL21lZGlhL2dwdS90ZXN0L3ZpZGVvX3BsYXllci92aWRlb19wbGF5ZXIuY2MKaW5kZXggMmYwMzgyZi4uZWNmYTViNCAxMDA2NDQKLS0tIGEvbWVkaWEvZ3B1L3Rlc3QvdmlkZW9fcGxheWVyL3ZpZGVvX3BsYXllci5jYworKysgYi9tZWRpYS9ncHUvdGVzdC92aWRlb19wbGF5ZXIvdmlkZW9fcGxheWVyLmNjCkBAIC01NCw2ICs1NCw5IEBACiAgIENIRUNLKGZyYW1lX3JlbmRlcmVyKTsKICAgRFZMT0dGKDQpOwogCisgIC8vIGJhc2U6OlVucmV0YWluZWQgaXMgc2FmZSBoZXJlIGFzIHdlIHdpbGwgbmV2ZXIgcmVjZWl2ZSBjYWxsYmFja3MgYWZ0ZXIKKyAgLy8gZGVzdHJveWluZyB0aGUgdmlkZW8gcGxheWVyLCBzaW5jZSB0aGUgdmlkZW8gZGVjb2RlciBjbGllbnQgd2lsbCBiZQorICAvLyBkZXN0cm95ZWQgZmlyc3QuCiAgIEV2ZW50Q2FsbGJhY2sgZXZlbnRfY2IgPQogICAgICAgYmFzZTo6QmluZFJlcGVhdGluZygmVmlkZW9QbGF5ZXI6Ok5vdGlmeUV2ZW50LCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvZ3B1L3Y0bDIvdjRsMl9kZXZpY2UuY2MgYi9tZWRpYS9ncHUvdjRsMi92NGwyX2RldmljZS5jYwppbmRleCA4MTg5NDgxLi5kYmM0MDZjIDEwMDY0NAotLS0gYS9tZWRpYS9ncHUvdjRsMi92NGwyX2RldmljZS5jYworKysgYi9tZWRpYS9ncHUvdjRsMi92NGwyX2RldmljZS5jYwpAQCAtMTE1MywxNCArMTE1Myw2IEBACiB9CiAKIC8vIHN0YXRpYwotdWludDMyX3QgVjRMMkRldmljZTo6VmlkZW9GcmFtZUxheW91dFRvVjRMMlBpeEZtdCgKLSAgICBjb25zdCBWaWRlb0ZyYW1lTGF5b3V0JiBsYXlvdXQpIHsKLSAgcmV0dXJuIEZvdXJjYzo6RnJvbVZpZGVvUGl4ZWxGb3JtYXQobGF5b3V0LmZvcm1hdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbGF5b3V0LmlzX211bHRpX3BsYW5hcigpKQotICAgICAgLlRvVjRMMlBpeEZtdCgpOwotfQotCi0vLyBzdGF0aWMKIHVpbnQzMl90IFY0TDJEZXZpY2U6OlZpZGVvQ29kZWNQcm9maWxlVG9WNEwyUGl4Rm10KFZpZGVvQ29kZWNQcm9maWxlIHByb2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNsaWNlX2Jhc2VkKSB7CiAgIGlmIChwcm9maWxlID49IEgyNjRQUk9GSUxFX01JTiAmJiBwcm9maWxlIDw9IEgyNjRQUk9GSUxFX01BWCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvZ3B1L3Y0bDIvdjRsMl9kZXZpY2UuaCBiL21lZGlhL2dwdS92NGwyL3Y0bDJfZGV2aWNlLmgKaW5kZXggMGQwNmQ5My4uODYyZWQ1ZiAxMDA2NDQKLS0tIGEvbWVkaWEvZ3B1L3Y0bDIvdjRsMl9kZXZpY2UuaAorKysgYi9tZWRpYS9ncHUvdjRsMi92NGwyX2RldmljZS5oCkBAIC0zODEsOSArMzgxLDYgQEAKICAgICA6IHB1YmxpYyBiYXNlOjpSZWZDb3VudGVkVGhyZWFkU2FmZTxWNEwyRGV2aWNlPiB7CiAgcHVibGljOgogICAvLyBVdGlsaXR5IGZvcm1hdCBjb252ZXJzaW9uIGZ1bmN0aW9ucwotICAvLyBSZXR1cm5zIHY0bDIgcGl4ZWwgZm9ybWF0IGZyb20gfGxheW91dHwuIElmIHRoZXJlIGlzIG5vIGNvcnJlc3BvbmRpbmcKLSAgLy8gc2luZ2xlLSBvciBtdWx0aS1wbGFuYXIgZm9ybWF0IG9yIHxsYXlvdXR8IGlzIGludmFsaWQsIHJldHVybnMgMC4KLSAgc3RhdGljIHVpbnQzMl90IFZpZGVvRnJhbWVMYXlvdXRUb1Y0TDJQaXhGbXQoY29uc3QgVmlkZW9GcmFtZUxheW91dCYgbGF5b3V0KTsKICAgLy8gSWYgdGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZyBzaW5nbGUtIG9yIG11bHRpLXBsYW5hciBmb3JtYXQsIHJldHVybnMgMC4KICAgc3RhdGljIHVpbnQzMl90IFZpZGVvQ29kZWNQcm9maWxlVG9WNEwyUGl4Rm10KFZpZGVvQ29kZWNQcm9maWxlIHByb2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNsaWNlX2Jhc2VkKTsKZGlmZiAtLWdpdCBhL21lZGlhL2dwdS92NGwyL3Y0bDJfaW1hZ2VfcHJvY2Vzc29yLmNjIGIvbWVkaWEvZ3B1L3Y0bDIvdjRsMl9pbWFnZV9wcm9jZXNzb3IuY2MKaW5kZXggYzBmYjcxOC4uNzVjNjA3ZmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2dwdS92NGwyL3Y0bDJfaW1hZ2VfcHJvY2Vzc29yLmNjCisrKyBiL21lZGlhL2dwdS92NGwyL3Y0bDJfaW1hZ2VfcHJvY2Vzc29yLmNjCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcHRyX3V0aWwuaCIKICNpbmNsdWRlICJiYXNlL251bWVyaWNzL3NhZmVfY29udmVyc2lvbnMuaCIKICNpbmNsdWRlICJtZWRpYS9iYXNlL2JpbmRfdG9fY3VycmVudF9sb29wLmgiCisjaW5jbHVkZSAibWVkaWEvYmFzZS9jb2xvcl9wbGFuZV9sYXlvdXQuaCIKICNpbmNsdWRlICJtZWRpYS9iYXNlL3Njb3BlZGZkX2hlbHBlci5oIgogI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdmlkZW9fdHlwZXMuaCIKICNpbmNsdWRlICJtZWRpYS9ncHUvY2hyb21lb3MvZm91cmNjLmgiCkBAIC01MiwyNSArNTMsMTUgQEAKIAogVjRMMkltYWdlUHJvY2Vzc29yOjpWNEwySW1hZ2VQcm9jZXNzb3IoCiAgICAgc2NvcGVkX3JlZnB0cjxWNEwyRGV2aWNlPiBkZXZpY2UsCi0gICAgVmlkZW9GcmFtZTo6U3RvcmFnZVR5cGUgaW5wdXRfc3RvcmFnZV90eXBlLAotICAgIFZpZGVvRnJhbWU6OlN0b3JhZ2VUeXBlIG91dHB1dF9zdG9yYWdlX3R5cGUsCisgICAgY29uc3QgSW1hZ2VQcm9jZXNzb3I6OlBvcnRDb25maWcmIGlucHV0X2NvbmZpZywKKyAgICBjb25zdCBJbWFnZVByb2Nlc3Nvcjo6UG9ydENvbmZpZyYgb3V0cHV0X2NvbmZpZywKICAgICB2NGwyX21lbW9yeSBpbnB1dF9tZW1vcnlfdHlwZSwKICAgICB2NGwyX21lbW9yeSBvdXRwdXRfbWVtb3J5X3R5cGUsCiAgICAgT3V0cHV0TW9kZSBvdXRwdXRfbW9kZSwKLSAgICBjb25zdCBWaWRlb0ZyYW1lTGF5b3V0JiBpbnB1dF9sYXlvdXQsCi0gICAgY29uc3QgVmlkZW9GcmFtZUxheW91dCYgb3V0cHV0X2xheW91dCwKLSAgICBnZng6OlNpemUgaW5wdXRfdmlzaWJsZV9zaXplLAotICAgIGdmeDo6U2l6ZSBvdXRwdXRfdmlzaWJsZV9zaXplLAogICAgIHNpemVfdCBudW1fYnVmZmVycywKICAgICBFcnJvckNCIGVycm9yX2NiKQotICAgIDogSW1hZ2VQcm9jZXNzb3IoaW5wdXRfbGF5b3V0LAotICAgICAgICAgICAgICAgICAgICAgaW5wdXRfc3RvcmFnZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2xheW91dCwKLSAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9zdG9yYWdlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICBvdXRwdXRfbW9kZSksCi0gICAgICBpbnB1dF92aXNpYmxlX3NpemVfKGlucHV0X3Zpc2libGVfc2l6ZSksCisgICAgOiBJbWFnZVByb2Nlc3NvcihpbnB1dF9jb25maWcsIG91dHB1dF9jb25maWcsIG91dHB1dF9tb2RlKSwKICAgICAgIGlucHV0X21lbW9yeV90eXBlXyhpbnB1dF9tZW1vcnlfdHlwZSksCi0gICAgICBvdXRwdXRfdmlzaWJsZV9zaXplXyhvdXRwdXRfdmlzaWJsZV9zaXplKSwKICAgICAgIG91dHB1dF9tZW1vcnlfdHlwZV8ob3V0cHV0X21lbW9yeV90eXBlKSwKICAgICAgIGRldmljZV8oZGV2aWNlKSwKICAgICAgIGRldmljZV90aHJlYWRfKCJWNEwySW1hZ2VQcm9jZXNzb3JUaHJlYWQiKSwKQEAgLTE3MiwyMCArMTYzLDEwIEBACiAgICAgcmV0dXJuIG51bGxwdHI7CiAgIH0KIAotICBjb25zdCBWaWRlb0ZyYW1lTGF5b3V0JiBpbnB1dF9sYXlvdXQgPSBpbnB1dF9jb25maWcubGF5b3V0OwotCi0gIC8vIFVzZSBpbnB1dF9jb25maWcuZm91cmNjIGFzIGlucHV0IGZvcm1hdCBpZiBpdCBpcyBzcGVjaWZpZWQsIGkuZS4gbm9uLXplcm8uCi0gIGNvbnN0IHVpbnQzMl90IGlucHV0X2Zvcm1hdF9mb3VyY2MgPQotICAgICAgaW5wdXRfY29uZmlnLmZvdXJjYyA9PSBJbWFnZVByb2Nlc3Nvcjo6UG9ydENvbmZpZzo6a1VuYXNzaWduZWRGb3VyQ0MKLSAgICAgICAgICA/IFY0TDJEZXZpY2U6OlZpZGVvRnJhbWVMYXlvdXRUb1Y0TDJQaXhGbXQoaW5wdXRfbGF5b3V0KQotICAgICAgICAgIDogaW5wdXRfY29uZmlnLmZvdXJjYzsKLSAgaWYgKCFpbnB1dF9mb3JtYXRfZm91cmNjKSB7Ci0gICAgVkxPR0YoMSkgPDwgIkludmFsaWQgVmlkZW9GcmFtZUxheW91dDogIiA8PCBpbnB1dF9sYXlvdXQ7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgaWYgKCFkZXZpY2UtPk9wZW4oVjRMMkRldmljZTo6VHlwZTo6a0ltYWdlUHJvY2Vzc29yLCBpbnB1dF9mb3JtYXRfZm91cmNjKSkgeworICBpZiAoIWRldmljZS0+T3BlbihWNEwyRGV2aWNlOjpUeXBlOjprSW1hZ2VQcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgIGlucHV0X2NvbmZpZy5mb3VyY2MuVG9WNEwyUGl4Rm10KCkpKSB7CiAgICAgVkxPR0YoMSkgPDwgIkZhaWxlZCB0byBvcGVuIGRldmljZSB3aXRoIGlucHV0IGZvdXJjYzogIgotICAgICAgICAgICAgIDw8IEZvdXJjY1RvU3RyaW5nKGlucHV0X2Zvcm1hdF9mb3VyY2MpOworICAgICAgICAgICAgIDw8IGlucHV0X2NvbmZpZy5mb3VyY2MuVG9TdHJpbmcoKTsKICAgICByZXR1cm4gbnVsbHB0cjsKICAgfQogCkBAIC0xOTMsNzcgKzE3NCw3OCBAQAogICBzdHJ1Y3QgdjRsMl9mb3JtYXQgZm9ybWF0OwogICBtZW1zZXQoJmZvcm1hdCwgMCwgc2l6ZW9mKGZvcm1hdCkpOwogICBmb3JtYXQudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORTsKLSAgZm9ybWF0LmZtdC5waXhfbXAud2lkdGggPSBpbnB1dF9sYXlvdXQuY29kZWRfc2l6ZSgpLndpZHRoKCk7Ci0gIGZvcm1hdC5mbXQucGl4X21wLmhlaWdodCA9IGlucHV0X2xheW91dC5jb2RlZF9zaXplKCkuaGVpZ2h0KCk7Ci0gIGZvcm1hdC5mbXQucGl4X21wLnBpeGVsZm9ybWF0ID0gaW5wdXRfZm9ybWF0X2ZvdXJjYzsKKyAgZm9ybWF0LmZtdC5waXhfbXAud2lkdGggPSBpbnB1dF9jb25maWcuc2l6ZS53aWR0aCgpOworICBmb3JtYXQuZm10LnBpeF9tcC5oZWlnaHQgPSBpbnB1dF9jb25maWcuc2l6ZS5oZWlnaHQoKTsKKyAgZm9ybWF0LmZtdC5waXhfbXAucGl4ZWxmb3JtYXQgPSBpbnB1dF9jb25maWcuZm91cmNjLlRvVjRMMlBpeEZtdCgpOwogICBpZiAoZGV2aWNlLT5Jb2N0bChWSURJT0NfU19GTVQsICZmb3JtYXQpICE9IDAgfHwKLSAgICAgIGZvcm1hdC5mbXQucGl4X21wLnBpeGVsZm9ybWF0ICE9IGlucHV0X2Zvcm1hdF9mb3VyY2MpIHsKKyAgICAgIGZvcm1hdC5mbXQucGl4X21wLnBpeGVsZm9ybWF0ICE9IGlucHV0X2NvbmZpZy5mb3VyY2MuVG9WNEwyUGl4Rm10KCkpIHsKICAgICBWTE9HRigxKSA8PCAiRmFpbGVkIHRvIG5lZ290aWF0ZSBpbnB1dCBmb3JtYXQiOwogICAgIHJldHVybiBudWxscHRyOwogICB9CiAKLSAgYmFzZTo6T3B0aW9uYWw8VmlkZW9GcmFtZUxheW91dD4gbmVnb3RpYXRlZF9pbnB1dF9sYXlvdXQgPQotICAgICAgVjRMMkRldmljZTo6VjRMMkZvcm1hdFRvVmlkZW9GcmFtZUxheW91dChmb3JtYXQpOwotICBpZiAoIW5lZ290aWF0ZWRfaW5wdXRfbGF5b3V0KSB7Ci0gICAgVkxPR0YoMSkgPDwgIkZhaWxlZCB0byBuZWdvdGlhdGUgaW5wdXQgVmlkZW9GcmFtZUxheW91dCI7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLQotICBpZiAoIWdmeDo6UmVjdChuZWdvdGlhdGVkX2lucHV0X2xheW91dC0+Y29kZWRfc2l6ZSgpKQorICBjb25zdCB2NGwyX3BpeF9mb3JtYXRfbXBsYW5lJiBwaXhfbXAgPSBmb3JtYXQuZm10LnBpeF9tcDsKKyAgY29uc3QgZ2Z4OjpTaXplIG5lZ290aWF0ZWRfaW5wdXRfc2l6ZShwaXhfbXAud2lkdGgsIHBpeF9tcC5oZWlnaHQpOworICBpZiAoIWdmeDo6UmVjdChuZWdvdGlhdGVkX2lucHV0X3NpemUpCiAgICAgICAgICAgIC5Db250YWlucyhnZng6OlJlY3QoaW5wdXRfY29uZmlnLnZpc2libGVfc2l6ZSkpKSB7CiAgICAgVkxPR0YoMSkgPDwgIk5lZ290aWF0ZWQgaW5wdXQgYWxsb2NhdGVkIHNpemU6ICIKLSAgICAgICAgICAgICA8PCBuZWdvdGlhdGVkX2lucHV0X2xheW91dC0+Y29kZWRfc2l6ZSgpLlRvU3RyaW5nKCkKKyAgICAgICAgICAgICA8PCBuZWdvdGlhdGVkX2lucHV0X3NpemUuVG9TdHJpbmcoKQogICAgICAgICAgICAgIDw8ICIgc2hvdWxkIGNvbnRhaW4gdmlzaWJsZSBzaXplOiAiCiAgICAgICAgICAgICAgPDwgaW5wdXRfY29uZmlnLnZpc2libGVfc2l6ZS5Ub1N0cmluZygpOwogICAgIHJldHVybiBudWxscHRyOwogICB9Ci0KLSAgY29uc3QgVmlkZW9GcmFtZUxheW91dCYgb3V0cHV0X2xheW91dCA9IG91dHB1dF9jb25maWcubGF5b3V0OwotICBjb25zdCB1aW50MzJfdCBvdXRwdXRfZm9ybWF0X2ZvdXJjYyA9Ci0gICAgICBWNEwyRGV2aWNlOjpWaWRlb0ZyYW1lTGF5b3V0VG9WNEwyUGl4Rm10KG91dHB1dF9sYXlvdXQpOwotICBpZiAoIW91dHB1dF9mb3JtYXRfZm91cmNjKSB7Ci0gICAgVkxPR0YoMSkgPDwgIkludmFsaWQgVmlkZW9GcmFtZUxheW91dDogIiA8PCBvdXRwdXRfbGF5b3V0OwotICAgIHJldHVybiBudWxscHRyOworICBzdGQ6OnZlY3RvcjxDb2xvclBsYW5lTGF5b3V0PiBpbnB1dF9wbGFuZXMocGl4X21wLm51bV9wbGFuZXMpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBpeF9tcC5udW1fcGxhbmVzOyArK2kpIHsKKyAgICBpbnB1dF9wbGFuZXNbaV0uc3RyaWRlID0gcGl4X21wLnBsYW5lX2ZtdFtpXS5ieXRlc3BlcmxpbmU7CisgICAgLy8gb2Zmc2V0IHdpbGwgYmUgc3BlY2lmaWVkIGZvciBhIGJ1ZmZlciBpbiBlYWNoIFZJRElPQ19RQlVGLgorICAgIGlucHV0X3BsYW5lc1tpXS5vZmZzZXQgPSAwOworICAgIGlucHV0X3BsYW5lc1tpXS5zaXplID0gcGl4X21wLnBsYW5lX2ZtdFtpXS5zaXplaW1hZ2U7CiAgIH0KIAogICAvLyBUcnkgdG8gc2V0IG91dHB1dCBmb3JtYXQuCiAgIG1lbXNldCgmZm9ybWF0LCAwLCBzaXplb2YoZm9ybWF0KSk7CiAgIGZvcm1hdC50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORTsKLSAgZm9ybWF0LmZtdC5waXhfbXAud2lkdGggPSBvdXRwdXRfbGF5b3V0LmNvZGVkX3NpemUoKS53aWR0aCgpOwotICBmb3JtYXQuZm10LnBpeF9tcC5oZWlnaHQgPSBvdXRwdXRfbGF5b3V0LmNvZGVkX3NpemUoKS5oZWlnaHQoKTsKLSAgZm9ybWF0LmZtdC5waXhfbXAucGl4ZWxmb3JtYXQgPSBvdXRwdXRfZm9ybWF0X2ZvdXJjYzsKLSAgZm9ybWF0LmZtdC5waXhfbXAubnVtX3BsYW5lcyA9Ci0gICAgICBWNEwyRGV2aWNlOjpHZXROdW1QbGFuZXNPZlY0TDJQaXhGbXQob3V0cHV0X2Zvcm1hdF9mb3VyY2MpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZvcm1hdC5mbXQucGl4X21wLm51bV9wbGFuZXM7ICsraSkgewotICAgIGZvcm1hdC5mbXQucGl4X21wLnBsYW5lX2ZtdFtpXS5zaXplaW1hZ2UgPSBvdXRwdXRfbGF5b3V0LnBsYW5lcygpW2ldLnNpemU7Ci0gICAgZm9ybWF0LmZtdC5waXhfbXAucGxhbmVfZm10W2ldLmJ5dGVzcGVybGluZSA9Ci0gICAgICAgIG91dHB1dF9sYXlvdXQucGxhbmVzKClbaV0uc3RyaWRlOworICB2NGwyX3BpeF9mb3JtYXRfbXBsYW5lJiBvdXRfcGl4X21wID0gZm9ybWF0LmZtdC5waXhfbXA7CisgIG91dF9waXhfbXAud2lkdGggPSBvdXRwdXRfY29uZmlnLnNpemUud2lkdGgoKTsKKyAgb3V0X3BpeF9tcC5oZWlnaHQgPSBvdXRwdXRfY29uZmlnLnNpemUuaGVpZ2h0KCk7CisgIG91dF9waXhfbXAucGl4ZWxmb3JtYXQgPSBvdXRwdXRfY29uZmlnLmZvdXJjYy5Ub1Y0TDJQaXhGbXQoKTsKKyAgb3V0X3BpeF9tcC5udW1fcGxhbmVzID0gb3V0cHV0X2NvbmZpZy5wbGFuZXMuc2l6ZSgpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dF9jb25maWcucGxhbmVzLnNpemUoKTsgKytpKSB7CisgICAgb3V0X3BpeF9tcC5wbGFuZV9mbXRbaV0uc2l6ZWltYWdlID0gb3V0cHV0X2NvbmZpZy5wbGFuZXNbaV0uc2l6ZTsKKyAgICBvdXRfcGl4X21wLnBsYW5lX2ZtdFtpXS5ieXRlc3BlcmxpbmUgPSBvdXRwdXRfY29uZmlnLnBsYW5lc1tpXS5zdHJpZGU7CiAgIH0KICAgaWYgKGRldmljZS0+SW9jdGwoVklESU9DX1NfRk1ULCAmZm9ybWF0KSAhPSAwIHx8Ci0gICAgICBmb3JtYXQuZm10LnBpeF9tcC5waXhlbGZvcm1hdCAhPSBvdXRwdXRfZm9ybWF0X2ZvdXJjYykgeworICAgICAgZm9ybWF0LmZtdC5waXhfbXAucGl4ZWxmb3JtYXQgIT0gb3V0cHV0X2NvbmZpZy5mb3VyY2MuVG9WNEwyUGl4Rm10KCkpIHsKICAgICBWTE9HRigxKSA8PCAiRmFpbGVkIHRvIG5lZ290aWF0ZSBvdXRwdXQgZm9ybWF0IjsKICAgICByZXR1cm4gbnVsbHB0cjsKICAgfQotICBiYXNlOjpPcHRpb25hbDxWaWRlb0ZyYW1lTGF5b3V0PiBuZWdvdGlhdGVkX291dHB1dF9sYXlvdXQgPQotICAgICAgVjRMMkRldmljZTo6VjRMMkZvcm1hdFRvVmlkZW9GcmFtZUxheW91dChmb3JtYXQpOwotICBpZiAoIW5lZ290aWF0ZWRfb3V0cHV0X2xheW91dCkgewotICAgIFZMT0dGKDEpIDw8ICJGYWlsZWQgdG8gbmVnb3RpYXRlIG91dHB1dCBWaWRlb0ZyYW1lTGF5b3V0IjsKKworICBvdXRfcGl4X21wID0gZm9ybWF0LmZtdC5waXhfbXA7CisgIGNvbnN0IGdmeDo6U2l6ZSBuZWdvdGlhdGVkX291dHB1dF9zaXplKG91dF9waXhfbXAud2lkdGgsIG91dF9waXhfbXAuaGVpZ2h0KTsKKyAgaWYgKCFnZng6OlJlY3QobmVnb3RpYXRlZF9vdXRwdXRfc2l6ZSkKKyAgICAgICAgICAgLkNvbnRhaW5zKGdmeDo6UmVjdChvdXRwdXRfY29uZmlnLnNpemUpKSkgeworICAgIFZMT0dGKDEpIDw8ICJOZWdvdGlhdGVkIG91dHB1dCBhbGxvY2F0ZWQgc2l6ZTogIgorICAgICAgICAgICAgIDw8IG5lZ290aWF0ZWRfb3V0cHV0X3NpemUuVG9TdHJpbmcoKQorICAgICAgICAgICAgIDw8ICIgc2hvdWxkIGNvbnRhaW4gb3JpZ2luYWwgb3V0cHV0IGFsbG9jYXRlZCBzaXplOiAiCisgICAgICAgICAgICAgPDwgb3V0cHV0X2NvbmZpZy5zaXplLlRvU3RyaW5nKCk7CiAgICAgcmV0dXJuIG51bGxwdHI7CiAgIH0KLSAgaWYgKCFnZng6OlJlY3QobmVnb3RpYXRlZF9vdXRwdXRfbGF5b3V0LT5jb2RlZF9zaXplKCkpCi0gICAgICAgICAgIC5Db250YWlucyhnZng6OlJlY3Qob3V0cHV0X2xheW91dC5jb2RlZF9zaXplKCkpKSkgewotICAgIFZMT0dGKDEpIDw8ICJOZWdvdGlhdGVkIG91dHB1dCBhbGxvY2F0ZWQgc2l6ZTogIgotICAgICAgICAgICAgIDw8IG5lZ290aWF0ZWRfb3V0cHV0X2xheW91dC0+Y29kZWRfc2l6ZSgpLlRvU3RyaW5nKCkKLSAgICAgICAgICAgICA8PCAiIHNob3VsZCBjb250YWluIG9yaWdpbmFsIG91dHB1dCBhbGxvY2F0ZWQgc2l6ZTogIgotICAgICAgICAgICAgIDw8IG91dHB1dF9sYXlvdXQuY29kZWRfc2l6ZSgpLlRvU3RyaW5nKCk7Ci0gICAgcmV0dXJuIG51bGxwdHI7CisgIHN0ZDo6dmVjdG9yPENvbG9yUGxhbmVMYXlvdXQ+IG91dHB1dF9wbGFuZXMob3V0X3BpeF9tcC5udW1fcGxhbmVzKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaXhfbXAubnVtX3BsYW5lczsgKytpKSB7CisgICAgb3V0cHV0X3BsYW5lc1tpXS5zdHJpZGUgPSBwaXhfbXAucGxhbmVfZm10W2ldLmJ5dGVzcGVybGluZTsKKyAgICAvLyBvZmZzZXQgd2lsbCBiZSBzcGVjaWZpZWQgZm9yIGEgYnVmZmVyIGluIGVhY2ggVklESU9DX1FCVUYuCisgICAgb3V0cHV0X3BsYW5lc1tpXS5vZmZzZXQgPSAwOworICAgIG91dHB1dF9wbGFuZXNbaV0uc2l6ZSA9IHBpeF9tcC5wbGFuZV9mbXRbaV0uc2l6ZWltYWdlOwogICB9CiAKICAgYXV0byBwcm9jZXNzb3IgPSBiYXNlOjpXcmFwVW5pcXVlKG5ldyBWNEwySW1hZ2VQcm9jZXNzb3IoCi0gICAgICBzdGQ6Om1vdmUoZGV2aWNlKSwgaW5wdXRfc3RvcmFnZV90eXBlLCBvdXRwdXRfc3RvcmFnZV90eXBlLAotICAgICAgaW5wdXRfbWVtb3J5X3R5cGUsIG91dHB1dF9tZW1vcnlfdHlwZSwgb3V0cHV0X21vZGUsCi0gICAgICAqbmVnb3RpYXRlZF9pbnB1dF9sYXlvdXQsICpuZWdvdGlhdGVkX291dHB1dF9sYXlvdXQsCi0gICAgICBpbnB1dF9jb25maWcudmlzaWJsZV9zaXplLCBvdXRwdXRfY29uZmlnLnZpc2libGVfc2l6ZSwgbnVtX2J1ZmZlcnMsCisgICAgICBzdGQ6Om1vdmUoZGV2aWNlKSwKKyAgICAgIEltYWdlUHJvY2Vzc29yOjpQb3J0Q29uZmlnKGlucHV0X2NvbmZpZy5mb3VyY2MsIG5lZ290aWF0ZWRfaW5wdXRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3BsYW5lcywgaW5wdXRfY29uZmlnLnZpc2libGVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpbnB1dF9zdG9yYWdlX3R5cGV9KSwKKyAgICAgIEltYWdlUHJvY2Vzc29yOjpQb3J0Q29uZmlnKG91dHB1dF9jb25maWcuZm91cmNjLCBuZWdvdGlhdGVkX291dHB1dF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X3BsYW5lcywgb3V0cHV0X2NvbmZpZy52aXNpYmxlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7b3V0cHV0X3N0b3JhZ2VfdHlwZX0pLAorICAgICAgaW5wdXRfbWVtb3J5X3R5cGUsIG91dHB1dF9tZW1vcnlfdHlwZSwgb3V0cHV0X21vZGUsIG51bV9idWZmZXJzLAogICAgICAgbWVkaWE6OkJpbmRUb0N1cnJlbnRMb29wKHN0ZDo6bW92ZShlcnJvcl9jYikpKSk7CiAgIGlmICghcHJvY2Vzc29yLT5Jbml0aWFsaXplKCkpIHsKICAgICBWTE9HRigxKSA8PCAiRmFpbGVkIHRvIGluaXRpYWxpemUgVjRMMkltYWdlUHJvY2Vzc29yIjsKQEAgLTMwNiwxMCArMjg4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwogCiAgIFZMT0dGKDIpIDw8ICJWNEwySW1hZ2VQcm9jZXNzb3IgaW5pdGlhbGl6ZWQgZm9yICIKLSAgICAgICAgICAgPDwgImlucHV0X2xheW91dDogIiA8PCBpbnB1dF9sYXlvdXRfCi0gICAgICAgICAgIDw8ICIsIG91dHB1dF9sYXlvdXQ6ICIgPDwgb3V0cHV0X2xheW91dF8KLSAgICAgICAgICAgPDwgIiwgaW5wdXRfdmlzaWJsZV9zaXplOiAiIDw8IGlucHV0X3Zpc2libGVfc2l6ZV8uVG9TdHJpbmcoKQotICAgICAgICAgICA8PCAiLCBvdXRwdXRfdmlzaWJsZV9zaXplOiAiIDw8IG91dHB1dF92aXNpYmxlX3NpemVfLlRvU3RyaW5nKCk7CisgICAgICAgICAgIDw8ICJpbnB1dDogIiA8PCBpbnB1dF9jb25maWdfLlRvU3RyaW5nKCkKKyAgICAgICAgICAgPDwgIiwgb3V0cHV0OiAiIDw8IG91dHB1dF9jb25maWdfLlRvU3RyaW5nKCk7CiAKICAgcmV0dXJuIHRydWU7CiB9CkBAIC01MTQsOCArNDk0LDEwIEBACiAgIHN0cnVjdCB2NGwyX3JlY3QgdmlzaWJsZV9yZWN0OwogICB2aXNpYmxlX3JlY3QubGVmdCA9IDA7CiAgIHZpc2libGVfcmVjdC50b3AgPSAwOwotICB2aXNpYmxlX3JlY3Qud2lkdGggPSBiYXNlOjpjaGVja2VkX2Nhc3Q8X191MzI+KGlucHV0X3Zpc2libGVfc2l6ZV8ud2lkdGgoKSk7Ci0gIHZpc2libGVfcmVjdC5oZWlnaHQgPSBiYXNlOjpjaGVja2VkX2Nhc3Q8X191MzI+KGlucHV0X3Zpc2libGVfc2l6ZV8uaGVpZ2h0KCkpOworICB2aXNpYmxlX3JlY3Qud2lkdGggPQorICAgICAgYmFzZTo6Y2hlY2tlZF9jYXN0PF9fdTMyPihpbnB1dF9jb25maWdfLnZpc2libGVfc2l6ZS53aWR0aCgpKTsKKyAgdmlzaWJsZV9yZWN0LmhlaWdodCA9CisgICAgICBiYXNlOjpjaGVja2VkX2Nhc3Q8X191MzI+KGlucHV0X2NvbmZpZ18udmlzaWJsZV9zaXplLmhlaWdodCgpKTsKIAogICBzdHJ1Y3QgdjRsMl9zZWxlY3Rpb24gc2VsZWN0aW9uX2FyZzsKICAgbWVtc2V0KCZzZWxlY3Rpb25fYXJnLCAwLCBzaXplb2Yoc2VsZWN0aW9uX2FyZykpOwpAQCAtNTU2LDkgKzUzOCwxMCBAQAogICBzdHJ1Y3QgdjRsMl9yZWN0IHZpc2libGVfcmVjdDsKICAgdmlzaWJsZV9yZWN0LmxlZnQgPSAwOwogICB2aXNpYmxlX3JlY3QudG9wID0gMDsKLSAgdmlzaWJsZV9yZWN0LndpZHRoID0gYmFzZTo6Y2hlY2tlZF9jYXN0PF9fdTMyPihvdXRwdXRfdmlzaWJsZV9zaXplXy53aWR0aCgpKTsKKyAgdmlzaWJsZV9yZWN0LndpZHRoID0KKyAgICAgIGJhc2U6OmNoZWNrZWRfY2FzdDxfX3UzMj4ob3V0cHV0X2NvbmZpZ18udmlzaWJsZV9zaXplLndpZHRoKCkpOwogICB2aXNpYmxlX3JlY3QuaGVpZ2h0ID0KLSAgICBiYXNlOjpjaGVja2VkX2Nhc3Q8X191MzI+KG91dHB1dF92aXNpYmxlX3NpemVfLmhlaWdodCgpKTsKKyAgICAgIGJhc2U6OmNoZWNrZWRfY2FzdDxfX3UzMj4ob3V0cHV0X2NvbmZpZ18udmlzaWJsZV9zaXplLmhlaWdodCgpKTsKIAogICBvdXRwdXRfcXVldWVfID0gZGV2aWNlXy0+R2V0UXVldWUoVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSk7CiAgIGlmICghb3V0cHV0X3F1ZXVlXykKQEAgLTc5NiwxMSArNzc5LDExIEBACiAgIERDSEVDSyhidWZmZXIuSXNWYWxpZCgpKTsKIAogICBzdGQ6OnZlY3Rvcjx2b2lkKj4gdXNlcl9wdHJzOwotICBzaXplX3QgbnVtX3BsYW5lcyA9IFY0TDJEZXZpY2U6OkdldE51bVBsYW5lc09mVjRMMlBpeEZtdCgKLSAgICAgIFY0TDJEZXZpY2U6OlZpZGVvRnJhbWVMYXlvdXRUb1Y0TDJQaXhGbXQoaW5wdXRfbGF5b3V0XykpOworICBjb25zdCBzaXplX3QgbnVtX3BsYW5lcyA9CisgICAgICBWNEwyRGV2aWNlOjpHZXROdW1QbGFuZXNPZlY0TDJQaXhGbXQoaW5wdXRfY29uZmlnXy5mb3VyY2MuVG9WNEwyUGl4Rm10KCkpOwogICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bV9wbGFuZXM7ICsraSkgewogICAgIGludCBieXRlc191c2VkID0gVmlkZW9GcmFtZTo6UGxhbmVTaXplKGpvYl9yZWNvcmQtPmlucHV0X2ZyYW1lLT5mb3JtYXQoKSwgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9sYXlvdXRfLmNvZGVkX3NpemUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9jb25maWdfLnNpemUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgLkdldEFyZWEoKTsKICAgICBidWZmZXIuU2V0UGxhbmVCeXRlc1VzZWQoaSwgYnl0ZXNfdXNlZCk7CiAgICAgaWYgKGJ1ZmZlci5NZW1vcnkoKSA9PSBWNEwyX01FTU9SWV9VU0VSUFRSKQpkaWZmIC0tZ2l0IGEvbWVkaWEvZ3B1L3Y0bDIvdjRsMl9pbWFnZV9wcm9jZXNzb3IuaCBiL21lZGlhL2dwdS92NGwyL3Y0bDJfaW1hZ2VfcHJvY2Vzc29yLmgKaW5kZXggY2MxNDgzZmQuLjFkODVmM2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2dwdS92NGwyL3Y0bDJfaW1hZ2VfcHJvY2Vzc29yLmgKKysrIGIvbWVkaWEvZ3B1L3Y0bDIvdjRsMl9pbWFnZV9wcm9jZXNzb3IuaApAQCAtOTIsMTUgKzkyLDExIEBACiAgIH07CiAKICAgVjRMMkltYWdlUHJvY2Vzc29yKHNjb3BlZF9yZWZwdHI8VjRMMkRldmljZT4gZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgVmlkZW9GcmFtZTo6U3RvcmFnZVR5cGUgaW5wdXRfc3RvcmFnZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgVmlkZW9GcmFtZTo6U3RvcmFnZVR5cGUgb3V0cHV0X3N0b3JhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEltYWdlUHJvY2Vzc29yOjpQb3J0Q29uZmlnJiBpbnB1dF9jb25maWcsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbWFnZVByb2Nlc3Nvcjo6UG9ydENvbmZpZyYgb3V0cHV0X2NvbmZpZywKICAgICAgICAgICAgICAgICAgICAgIHY0bDJfbWVtb3J5IGlucHV0X21lbW9yeV90eXBlLAogICAgICAgICAgICAgICAgICAgICAgdjRsMl9tZW1vcnkgb3V0cHV0X21lbW9yeV90eXBlLAogICAgICAgICAgICAgICAgICAgICAgT3V0cHV0TW9kZSBvdXRwdXRfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZpZGVvRnJhbWVMYXlvdXQmIGlucHV0X2xheW91dCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZpZGVvRnJhbWVMYXlvdXQmIG91dHB1dF9sYXlvdXQsCi0gICAgICAgICAgICAgICAgICAgICBnZng6OlNpemUgaW5wdXRfdmlzaWJsZV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgZ2Z4OjpTaXplIG91dHB1dF92aXNpYmxlX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtX2J1ZmZlcnMsCiAgICAgICAgICAgICAgICAgICAgICBFcnJvckNCIGVycm9yX2NiKTsKIApAQCAtMTQzLDEyICsxMzksNyBAQAogICAvLyBjYWxsYmFja3Mgd2lsbCBiZSBpbnZva2VkLgogICB2b2lkIERlc3Ryb3koKTsKIAotICAvLyBTdG9yZXMgaW5wdXQgZnJhbWUncyB2aXNpYmxlIHNpemUgYW5kIHY0bDJfbWVtb3J5IHR5cGUuCi0gIGNvbnN0IGdmeDo6U2l6ZSBpbnB1dF92aXNpYmxlX3NpemVfOwogICBjb25zdCB2NGwyX21lbW9yeSBpbnB1dF9tZW1vcnlfdHlwZV87Ci0KLSAgLy8gU3RvcmVzIG91dHB1dCBmcmFtZSdzIHZpc2libGUgc2l6ZSBhbmQgdjRsMl9tZW1vcnkgdHlwZS4KLSAgY29uc3QgZ2Z4OjpTaXplIG91dHB1dF92aXNpYmxlX3NpemVfOwogICBjb25zdCB2NGwyX21lbW9yeSBvdXRwdXRfbWVtb3J5X3R5cGVfOwogCiAgIC8vIFY0TDIgZGV2aWNlIGluIHVzZS4KZGlmZiAtLWdpdCBhL21lZGlhL2dwdS92NGwyL3Y0bDJfc2xpY2VfdmlkZW9fZGVjb2RlX2FjY2VsZXJhdG9yLmNjIGIvbWVkaWEvZ3B1L3Y0bDIvdjRsMl9zbGljZV92aWRlb19kZWNvZGVfYWNjZWxlcmF0b3IuY2MKaW5kZXggZjc1ZWJiMS4uYTAxM2QyMSAxMDA2NDQKLS0tIGEvbWVkaWEvZ3B1L3Y0bDIvdjRsMl9zbGljZV92aWRlb19kZWNvZGVfYWNjZWxlcmF0b3IuY2MKKysrIGIvbWVkaWEvZ3B1L3Y0bDIvdjRsMl9zbGljZV92aWRlb19kZWNvZGVfYWNjZWxlcmF0b3IuY2MKQEAgLTU4NSw3ICs1ODUsNyBAQAogICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIERDSEVDS19FUShnbF9pbWFnZV9zaXplXywgaW1hZ2VfcHJvY2Vzc29yXy0+b3V0cHV0X2xheW91dCgpLmNvZGVkX3NpemUoKSk7CisgIERDSEVDS19FUShnbF9pbWFnZV9zaXplXywgaW1hZ2VfcHJvY2Vzc29yXy0+b3V0cHV0X2NvbmZpZygpLnNpemUpOwogCiAgIHJldHVybiB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZ3B1L3Y0bDIvdjRsMl92ZGFfaGVscGVycy5jYyBiL21lZGlhL2dwdS92NGwyL3Y0bDJfdmRhX2hlbHBlcnMuY2MKaW5kZXggYTAxZDljZi4uZjczZDRlOTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2dwdS92NGwyL3Y0bDJfdmRhX2hlbHBlcnMuY2MKKysrIGIvbWVkaWEvZ3B1L3Y0bDIvdjRsMl92ZGFfaGVscGVycy5jYwpAQCAtMTMsMzggKzEzLDYgQEAKIG5hbWVzcGFjZSBtZWRpYSB7CiBuYW1lc3BhY2UgdjRsMl92ZGFfaGVscGVycyB7CiAKLW5hbWVzcGFjZSB7Ci1iYXNlOjpPcHRpb25hbDxWaWRlb0ZyYW1lTGF5b3V0PiBDcmVhdGVMYXlvdXQodWludDMyX3QgZm91cmNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdmeDo6U2l6ZSYgc2l6ZSkgewotICAvLyBWNEwyIHNwZWNpZmljIGZvcm1hdCBoYWNrOgotICAvLyBJZiBWREEncyBvdXRwdXQgZm9ybWF0IGlzIFY0TDJfUElYX0ZNVF9NVDIxQywgd2hpY2ggaXMgYSBwbGF0Zm9ybSBzcGVjaWZpYwotICAvLyBmb3JtYXQgYW5kIG5vdyBpcyBvbmx5IHVzZWQgZm9yIE1UODE3MyBWREEgb3V0cHV0IGFuZCBpdHMgaW1hZ2UgcHJvY2Vzc29yCi0gIC8vIGlucHV0LCB3ZSBzZXQgVmlkZW9GcmFtZUxheW91dCBmb3IgaW1hZ2UgcHJvY2Vzc29yJ3MgaW5wdXQgd2l0aCBmb3JtYXQKLSAgLy8gUElYRUxfRk9STUFUX05WMTIgYXMgTlYxMidzIGxheW91dCBpcyB0aGUgc2FtZSBhcyBNVDIxLgotICBzaXplX3QgbnVtX3BsYW5lczsKLSAgc3dpdGNoIChmb3VyY2MpIHsKLSAgICBjYXNlIFY0TDJfUElYX0ZNVF9NVDIxQzoKLSAgICBjYXNlIFY0TDJfUElYX0ZNVF9NTTIxOgotICAgICAgbnVtX3BsYW5lcyA9IDI7Ci0gICAgICByZXR1cm4gVmlkZW9GcmFtZUxheW91dDo6Q3JlYXRlTXVsdGlQbGFuYXIoCi0gICAgICAgICAgUElYRUxfRk9STUFUX05WMTIsIHNpemUsIHN0ZDo6dmVjdG9yPENvbG9yUGxhbmVMYXlvdXQ+KG51bV9wbGFuZXMpKTsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBWaWRlb1BpeGVsRm9ybWF0IHBpeGVsX2Zvcm1hdCA9Ci0gICAgICAgICAgRm91cmNjOjpGcm9tVjRMMlBpeEZtdChmb3VyY2MpLlRvVmlkZW9QaXhlbEZvcm1hdCgpOwotICAgICAgaWYgKHBpeGVsX2Zvcm1hdCA9PSBQSVhFTF9GT1JNQVRfVU5LTk9XTikKLSAgICAgICAgcmV0dXJuIGJhc2U6Om51bGxvcHQ7Ci0gICAgICBudW1fcGxhbmVzID0gVjRMMkRldmljZTo6R2V0TnVtUGxhbmVzT2ZWNEwyUGl4Rm10KGZvdXJjYyk7Ci0gICAgICBpZiAobnVtX3BsYW5lcyA9PSAxKQotICAgICAgICByZXR1cm4gVmlkZW9GcmFtZUxheW91dDo6Q3JlYXRlKHBpeGVsX2Zvcm1hdCwgc2l6ZSk7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBWaWRlb0ZyYW1lTGF5b3V0OjpDcmVhdGVNdWx0aVBsYW5hcigKLSAgICAgICAgICAgIHBpeGVsX2Zvcm1hdCwgc2l6ZSwgc3RkOjp2ZWN0b3I8Q29sb3JQbGFuZUxheW91dD4obnVtX3BsYW5lcykpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLX0gIC8vIG5hbWVzcGFjZQotCiB1aW50MzJfdCBGaW5kSW1hZ2VQcm9jZXNzb3JJbnB1dEZvcm1hdChWNEwyRGV2aWNlKiB2ZGFfZGV2aWNlKSB7CiAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBwcm9jZXNzb3JfaW5wdXRfZm9ybWF0cyA9CiAgICAgICBWNEwySW1hZ2VQcm9jZXNzb3I6OkdldFN1cHBvcnRlZElucHV0Rm9ybWF0cygpOwpAQCAtMTAzLDQ1ICs3MSwzMyBAQAogICAgIHNjb3BlZF9yZWZwdHI8VjRMMkRldmljZT4gaW1hZ2VfcHJvY2Vzc29yX2RldmljZSwKICAgICBJbWFnZVByb2Nlc3Nvcjo6T3V0cHV0TW9kZSBpbWFnZV9wcm9jZXNzb3Jfb3V0cHV0X21vZGUsCiAgICAgSW1hZ2VQcm9jZXNzb3I6OkVycm9yQ0IgZXJyb3JfY2IpIHsKLSAgYmFzZTo6T3B0aW9uYWw8VmlkZW9GcmFtZUxheW91dD4gaW5wdXRfbGF5b3V0ID0KLSAgICAgIENyZWF0ZUxheW91dCh2ZGFfb3V0cHV0X2Zvcm1hdCwgdmRhX291dHB1dF9jb2RlZF9zaXplKTsKLSAgaWYgKCFpbnB1dF9sYXlvdXQpIHsKLSAgICBWTE9HRigxKSA8PCAiSW52YWxpZCBpbnB1dCBsYXlvdXQiOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0KLSAgYmFzZTo6T3B0aW9uYWw8VmlkZW9GcmFtZUxheW91dD4gb3V0cHV0X2xheW91dCA9Ci0gICAgICBDcmVhdGVMYXlvdXQoaXBfb3V0cHV0X2Zvcm1hdCwgaXBfb3V0cHV0X2NvZGVkX3NpemUpOwotICBpZiAoIW91dHB1dF9sYXlvdXQpIHsKLSAgICBWTE9HRigxKSA8PCAiSW52YWxpZCBvdXRwdXQgbGF5b3V0IjsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotCiAgIC8vIFRPRE8oY3JidWcuY29tLzkxNzc5OCk6IFVzZSBJbWFnZVByb2Nlc3NvckZhY3Rvcnk6OkNyZWF0ZSgpIG9uY2Ugd2UgcmVtb3ZlCiAgIC8vICAgICB8aW1hZ2VfcHJvY2Vzc29yX2RldmljZV98IGZyb20gVjRMMlZpZGVvRGVjb2RlQWNjZWxlcmF0b3IuCiAgIGF1dG8gaW1hZ2VfcHJvY2Vzc29yID0gVjRMMkltYWdlUHJvY2Vzc29yOjpDcmVhdGUoCiAgICAgICBpbWFnZV9wcm9jZXNzb3JfZGV2aWNlLAotICAgICAgSW1hZ2VQcm9jZXNzb3I6OlBvcnRDb25maWcoKmlucHV0X2xheW91dCwgdmRhX291dHB1dF9mb3JtYXQsIHZpc2libGVfc2l6ZSwKKyAgICAgIEltYWdlUHJvY2Vzc29yOjpQb3J0Q29uZmlnKEZvdXJjYzo6RnJvbVY0TDJQaXhGbXQodmRhX291dHB1dF9mb3JtYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmRhX291dHB1dF9jb2RlZF9zaXplLCB7fSwgdmlzaWJsZV9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1ZpZGVvRnJhbWU6OlNUT1JBR0VfRE1BQlVGU30pLAotICAgICAgSW1hZ2VQcm9jZXNzb3I6OlBvcnRDb25maWcoKm91dHB1dF9sYXlvdXQsIHZpc2libGVfc2l6ZSwKKyAgICAgIEltYWdlUHJvY2Vzc29yOjpQb3J0Q29uZmlnKEZvdXJjYzo6RnJvbVY0TDJQaXhGbXQoaXBfb3V0cHV0X2Zvcm1hdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcF9vdXRwdXRfY29kZWRfc2l6ZSwge30sIHZpc2libGVfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtWaWRlb0ZyYW1lOjpTVE9SQUdFX0RNQUJVRlN9KSwKICAgICAgIGltYWdlX3Byb2Nlc3Nvcl9vdXRwdXRfbW9kZSwgbmJfYnVmZmVycywgc3RkOjptb3ZlKGVycm9yX2NiKSk7CiAgIGlmICghaW1hZ2VfcHJvY2Vzc29yKQogICAgIHJldHVybiBudWxscHRyOwogCi0gIGlmIChpbWFnZV9wcm9jZXNzb3ItPm91dHB1dF9sYXlvdXQoKS5jb2RlZF9zaXplKCkgIT0gaXBfb3V0cHV0X2NvZGVkX3NpemUpIHsKKyAgaWYgKGltYWdlX3Byb2Nlc3Nvci0+b3V0cHV0X2NvbmZpZygpLnNpemUgIT0gaXBfb3V0cHV0X2NvZGVkX3NpemUpIHsKICAgICBWTE9HRigxKSA8PCAiSW1hZ2UgcHJvY2Vzc29yIHNob3VsZCBiZSBhYmxlIHRvIHVzZSB0aGUgcmVxdWVzdGVkIG91dHB1dCAiCiAgICAgICAgICAgICAgPDwgImNvZGVkIHNpemUgIiA8PCBpcF9vdXRwdXRfY29kZWRfc2l6ZS5Ub1N0cmluZygpCiAgICAgICAgICAgICAgPDwgIiB3aXRob3V0IGFkanVzdGluZyB0byAiCi0gICAgICAgICAgICAgPDwgaW1hZ2VfcHJvY2Vzc29yLT5vdXRwdXRfbGF5b3V0KCkuY29kZWRfc2l6ZSgpLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgPDwgaW1hZ2VfcHJvY2Vzc29yLT5vdXRwdXRfY29uZmlnKCkuc2l6ZS5Ub1N0cmluZygpOwogICAgIHJldHVybiBudWxscHRyOwogICB9CiAKLSAgaWYgKGltYWdlX3Byb2Nlc3Nvci0+aW5wdXRfbGF5b3V0KCkuY29kZWRfc2l6ZSgpICE9IHZkYV9vdXRwdXRfY29kZWRfc2l6ZSkgeworICBpZiAoaW1hZ2VfcHJvY2Vzc29yLT5pbnB1dF9jb25maWcoKS5zaXplICE9IHZkYV9vdXRwdXRfY29kZWRfc2l6ZSkgewogICAgIFZMT0dGKDEpIDw8ICJJbWFnZSBwcm9jZXNzb3Igc2hvdWxkIGJlIGFibGUgdG8gdGFrZSB0aGUgb3V0cHV0IGNvZGVkICIKICAgICAgICAgICAgICA8PCAic2l6ZSBvZiBkZWNvZGVyICIgPDwgdmRhX291dHB1dF9jb2RlZF9zaXplLlRvU3RyaW5nKCkKICAgICAgICAgICAgICA8PCAiIHdpdGhvdXQgYWRqdXN0aW5nIHRvICIKLSAgICAgICAgICAgICA8PCBpbWFnZV9wcm9jZXNzb3ItPmlucHV0X2xheW91dCgpLmNvZGVkX3NpemUoKS5Ub1N0cmluZygpOworICAgICAgICAgICAgIDw8IGltYWdlX3Byb2Nlc3Nvci0+aW5wdXRfY29uZmlnKCkuc2l6ZS5Ub1N0cmluZygpOwogICAgIHJldHVybiBudWxscHRyOwogICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2dwdS92NGwyL3Y0bDJfdmlkZW9fZW5jb2RlX2FjY2VsZXJhdG9yLmNjIGIvbWVkaWEvZ3B1L3Y0bDIvdjRsMl92aWRlb19lbmNvZGVfYWNjZWxlcmF0b3IuY2MKaW5kZXggMjE5N2JlYy4uYjNmYWNlNmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2dwdS92NGwyL3Y0bDJfdmlkZW9fZW5jb2RlX2FjY2VsZXJhdG9yLmNjCisrKyBiL21lZGlhL2dwdS92NGwyL3Y0bDJfdmlkZW9fZW5jb2RlX2FjY2VsZXJhdG9yLmNjCkBAIC05Niw2ICs5NiwxOSBAQAogCiBuYW1lc3BhY2UgbWVkaWEgewogCituYW1lc3BhY2UgeworLy8gQ29udmVydCBWaWRlb0ZyYW1lTGF5b3V0IHRvIEltYWdlUHJvY2Vzc29yOjpQb3J0Q29uZmlnLgorSW1hZ2VQcm9jZXNzb3I6OlBvcnRDb25maWcgVmlkZW9GcmFtZUxheW91dFRvUG9ydENvbmZpZygKKyAgICBjb25zdCBWaWRlb0ZyYW1lTGF5b3V0JiBsYXlvdXQsCisgICAgY29uc3QgZ2Z4OjpTaXplJiB2aXNpYmxlX3NpemUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VmlkZW9GcmFtZTo6U3RvcmFnZVR5cGU+JiBwcmVmZXJyZWRfc3RvcmFnZV90eXBlcykgeworICByZXR1cm4gSW1hZ2VQcm9jZXNzb3I6OlBvcnRDb25maWcoCisgICAgICBGb3VyY2M6OkZyb21WaWRlb1BpeGVsRm9ybWF0KGxheW91dC5mb3JtYXQoKSwgIWxheW91dC5pc19tdWx0aV9wbGFuYXIoKSksCisgICAgICBsYXlvdXQuY29kZWRfc2l6ZSgpLCBsYXlvdXQucGxhbmVzKCksIHZpc2libGVfc2l6ZSwKKyAgICAgIHByZWZlcnJlZF9zdG9yYWdlX3R5cGVzKTsKK30KK30gIC8vIG5hbWVzcGFjZQorCiBzdHJ1Y3QgVjRMMlZpZGVvRW5jb2RlQWNjZWxlcmF0b3I6OkJpdHN0cmVhbUJ1ZmZlclJlZiB7CiAgIEJpdHN0cmVhbUJ1ZmZlclJlZihpbnQzMl90IGlkLCBzdGQ6OnVuaXF1ZV9wdHI8VW5hbGlnbmVkU2hhcmVkTWVtb3J5PiBzaG0pCiAgICAgICA6IGlkKGlkKSwgc2htKHN0ZDo6bW92ZShzaG0pKSB7fQpAQCAtMjY3LDEyICsyODAsMTIgQEAKICAgICAgIGNvbmZpZy5pbml0aWFsX2JpdHJhdGUsIGNvbmZpZy5pbml0aWFsX2ZyYW1lcmF0ZS52YWx1ZV9vcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWRlb0VuY29kZUFjY2VsZXJhdG9yOjprRGVmYXVsdEZyYW1lcmF0ZSkpOwogICBjaGlsZF90YXNrX3J1bm5lcl8tPlBvc3RUYXNrKAotICAgICAgRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZE9uY2UoCi0gICAgICAgICAgJkNsaWVudDo6UmVxdWlyZUJpdHN0cmVhbUJ1ZmZlcnMsIGNsaWVudF8sIGtJbnB1dEJ1ZmZlckNvdW50LAotICAgICAgICAgIGltYWdlX3Byb2Nlc3Nvcl8uZ2V0KCkgPyBpbWFnZV9wcm9jZXNzb3JfLT5pbnB1dF9sYXlvdXQoKS5jb2RlZF9zaXplKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW5wdXRfYWxsb2NhdGVkX3NpemVfLAotICAgICAgICAgIG91dHB1dF9idWZmZXJfYnl0ZV9zaXplXykpOworICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZSgmQ2xpZW50OjpSZXF1aXJlQml0c3RyZWFtQnVmZmVycywgY2xpZW50XywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0lucHV0QnVmZmVyQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX3Byb2Nlc3Nvcl8uZ2V0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gaW1hZ2VfcHJvY2Vzc29yXy0+aW5wdXRfY29uZmlnKCkuc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpbnB1dF9hbGxvY2F0ZWRfc2l6ZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9idWZmZXJfYnl0ZV9zaXplXykpOwogCiAgIC8vIEZpbmlzaCBpbml0aWFsaXphdGlvbi4KICAgKnJlc3VsdCA9IHRydWU7CkBAIC0yOTQsOSArMzA3LDkgQEAKICAgLy8gZm9yIHxpbnB1dF9zdG9yYWdlX3R5cGV8IGhlcmUsIGFzIGxvbmcgYXMgVmlkZW9GcmFtZSBvbiBQcm9jZXNzKCkncyBkYXRhCiAgIC8vIGNhbiBiZSBhY2Nlc3NlZCBieSBWaWRlb0ZyYW1lOjpkYXRhKCkuCiAgIGltYWdlX3Byb2Nlc3Nvcl8gPSBJbWFnZVByb2Nlc3NvckZhY3Rvcnk6OkNyZWF0ZSgKLSAgICAgIEltYWdlUHJvY2Vzc29yOjpQb3J0Q29uZmlnKGlucHV0X2xheW91dCwgdmlzaWJsZV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1ZpZGVvRnJhbWU6OlNUT1JBR0VfT1dORURfTUVNT1JZfSksCi0gICAgICBJbWFnZVByb2Nlc3Nvcjo6UG9ydENvbmZpZygKKyAgICAgIFZpZGVvRnJhbWVMYXlvdXRUb1BvcnRDb25maWcoaW5wdXRfbGF5b3V0LCB2aXNpYmxlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtWaWRlb0ZyYW1lOjpTVE9SQUdFX09XTkVEX01FTU9SWX0pLAorICAgICAgVmlkZW9GcmFtZUxheW91dFRvUG9ydENvbmZpZygKICAgICAgICAgICBvdXRwdXRfbGF5b3V0LCB2aXNpYmxlX3NpemUsCiAgICAgICAgICAge1ZpZGVvRnJhbWU6OlNUT1JBR0VfRE1BQlVGUywgVmlkZW9GcmFtZTo6U1RPUkFHRV9PV05FRF9NRU1PUll9KSwKICAgICAgIC8vIFRyeSBPdXRwdXRNb2RlOjpBTExPQ0FURSBmaXJzdCBiZWNhdXNlIHdlIHdhbnQgdjRsMklQIGNob29zZXMKQEAgLTMxOSw3ICszMzIsNyBAQAogICAvLyBPdXRwdXQgY29kZWQgaGVpZ2h0IG9mIHByb2Nlc3NvciBjYW4gYmUgbGFyZ2VyIGJ1dCBub3Qgc21hbGxlciB0aGFuIHRoZQogICAvLyBpbnB1dCBjb2RlZCBoZWlnaHQgb2YgZW5jb2Rlci4gRm9yIGV4YW1wbGUsIHN1cHBvc2UgaW5wdXQgc2l6ZSBvZiBlbmNvZGVyCiAgIC8vIGlzIDMyMHgxOTMuIEl0IGlzIE9LIGlmIHRoZSBvdXRwdXQgb2YgcHJvY2Vzc29yIGlzIDMyMHgyMDguCi0gIGNvbnN0IGF1dG8mIGlwX291dHB1dF9zaXplID0gaW1hZ2VfcHJvY2Vzc29yXy0+b3V0cHV0X2xheW91dCgpLmNvZGVkX3NpemUoKTsKKyAgY29uc3QgYXV0byYgaXBfb3V0cHV0X3NpemUgPSBpbWFnZV9wcm9jZXNzb3JfLT5vdXRwdXRfY29uZmlnKCkuc2l6ZTsKICAgaWYgKGlwX291dHB1dF9zaXplLndpZHRoKCkgIT0gb3V0cHV0X2xheW91dC5jb2RlZF9zaXplKCkud2lkdGgoKSB8fAogICAgICAgaXBfb3V0cHV0X3NpemUuaGVpZ2h0KCkgPCBvdXRwdXRfbGF5b3V0LmNvZGVkX3NpemUoKS5oZWlnaHQoKSkgewogICAgIFZMT0dGKDEpIDw8ICJJbnZhbGlkIGltYWdlIHByb2Nlc3NvciBvdXRwdXQgY29kZWQgc2l6ZSAiCkBAIC0zNDcsNyArMzYwLDggQEAKICAgfQogCiAgIGltYWdlX3Byb2Nlc3Nvcl9vdXRwdXRfYnVmZmVyc18ucmVzaXplKGNvdW50KTsKLSAgY29uc3QgYXV0byBvdXRwdXRfc3RvcmFnZV90eXBlID0gaW1hZ2VfcHJvY2Vzc29yXy0+b3V0cHV0X3N0b3JhZ2VfdHlwZSgpOworICBjb25zdCBhdXRvIG91dHB1dF9zdG9yYWdlX3R5cGUgPQorICAgICAgaW1hZ2VfcHJvY2Vzc29yXy0+b3V0cHV0X2NvbmZpZygpLnN0b3JhZ2VfdHlwZSgpOwogICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICBzd2l0Y2ggKG91dHB1dF9zdG9yYWdlX3R5cGUpIHsKICAgICAgIGNhc2UgVmlkZW9GcmFtZTo6U1RPUkFHRV9PV05FRF9NRU1PUlk6CkBAIC0zNzIsNyArMzg2LDcgQEAKIGJvb2wgVjRMMlZpZGVvRW5jb2RlQWNjZWxlcmF0b3I6OkluaXRJbnB1dE1lbW9yeVR5cGUoY29uc3QgQ29uZmlnJiBjb25maWcpIHsKICAgRENIRUNLKGVuY29kZXJfdGhyZWFkXy50YXNrX3J1bm5lcigpLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwogICBpZiAoaW1hZ2VfcHJvY2Vzc29yXykgewotICAgIGNvbnN0IGF1dG8gc3RvcmFnZV90eXBlID0gaW1hZ2VfcHJvY2Vzc29yXy0+b3V0cHV0X3N0b3JhZ2VfdHlwZSgpOworICAgIGNvbnN0IGF1dG8gc3RvcmFnZV90eXBlID0gaW1hZ2VfcHJvY2Vzc29yXy0+b3V0cHV0X2NvbmZpZygpLnN0b3JhZ2VfdHlwZSgpOwogICAgIGlmIChzdG9yYWdlX3R5cGUgPT0gVmlkZW9GcmFtZTo6U1RPUkFHRV9ETUFCVUZTKSB7CiAgICAgICBpbnB1dF9tZW1vcnlfdHlwZV8gPSBWNEwyX01FTU9SWV9ETUFCVUY7CiAgICAgfSBlbHNlIGlmIChWaWRlb0ZyYW1lOjpJc1N0b3JhZ2VUeXBlTWFwcGFibGUoc3RvcmFnZV90eXBlKSkgewpAQCAtNjQwLDcgKzY1NCw3IEBACiAgIC8vIFdlIHNob3VsZCBhcHBseSB0aGUgZnJhbWUgc2l6ZSBjaGFuZ2UgdG8gSW1hZ2VQcm9jZXNzb3IgaWYgdGhlcmUgaXMuCiAgIGlmIChpbWFnZV9wcm9jZXNzb3JfKSB7CiAgICAgLy8gU3RyaWRlIGlzIHRoZSBzYW1lLiBUaGVyZSBpcyBubyBuZWVkIG9mIGV4ZWN1dGluZyBTX0ZNVCBhZ2Fpbi4KLSAgICBpZiAoaW1hZ2VfcHJvY2Vzc29yXy0+aW5wdXRfbGF5b3V0KCkuY29kZWRfc2l6ZSgpID09IG5ld19mcmFtZV9zaXplKSB7CisgICAgaWYgKGltYWdlX3Byb2Nlc3Nvcl8tPmlucHV0X2NvbmZpZygpLnNpemUgPT0gbmV3X2ZyYW1lX3NpemUpIHsKICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIApAQCAtNjY3LDcgKzY4MSw3IEBACiAgICAgICBOT1RJRllfRVJST1Ioa1BsYXRmb3JtRmFpbHVyZUVycm9yKTsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgaWYgKGltYWdlX3Byb2Nlc3Nvcl8tPmlucHV0X2xheW91dCgpLmNvZGVkX3NpemUoKS53aWR0aCgpICE9CisgICAgaWYgKGltYWdlX3Byb2Nlc3Nvcl8tPmlucHV0X2NvbmZpZygpLnNpemUud2lkdGgoKSAhPQogICAgICAgICBuZXdfZnJhbWVfc2l6ZS53aWR0aCgpKSB7CiAgICAgICBOT1RJRllfRVJST1Ioa1BsYXRmb3JtRmFpbHVyZUVycm9yKTsKICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTEwNjgsNyArMTA4Miw5IEBACiAKICAgRENIRUNLX0VRKGRldmljZV9pbnB1dF9sYXlvdXRfLT5mb3JtYXQoKSwgZnJhbWUtPmZvcm1hdCgpKTsKICAgc2l6ZV90IG51bV9wbGFuZXMgPSBWNEwyRGV2aWNlOjpHZXROdW1QbGFuZXNPZlY0TDJQaXhGbXQoCi0gICAgICBWNEwyRGV2aWNlOjpWaWRlb0ZyYW1lTGF5b3V0VG9WNEwyUGl4Rm10KCpkZXZpY2VfaW5wdXRfbGF5b3V0XykpOworICAgICAgRm91cmNjOjpGcm9tVmlkZW9QaXhlbEZvcm1hdChkZXZpY2VfaW5wdXRfbGF5b3V0Xy0+Zm9ybWF0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9pbnB1dF9sYXlvdXRfLT5pc19tdWx0aV9wbGFuYXIoKSkKKyAgICAgICAgICAuVG9WNEwyUGl4Rm10KCkpOwogCiAgIC8vIENyZWF0ZSBHcHVNZW1vcnlCdWZmZXJIYW5kbGUgZm9yIG5hdGl2ZV9pbnB1dF9tb2RlLgogICBnZng6OkdwdU1lbW9yeUJ1ZmZlckhhbmRsZSBnbWJfaGFuZGxlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZ3B1L3ZhYXBpL3ZhYXBpX2ltYWdlX3Byb2Nlc3Nvci5jYyBiL21lZGlhL2dwdS92YWFwaS92YWFwaV9pbWFnZV9wcm9jZXNzb3IuY2MKaW5kZXggNTJlZTU1MWIuLjg4NWEwYjggMTAwNjQ0Ci0tLSBhL21lZGlhL2dwdS92YWFwaS92YWFwaV9pbWFnZV9wcm9jZXNzb3IuY2MKKysrIGIvbWVkaWEvZ3B1L3ZhYXBpL3ZhYXBpX2ltYWdlX3Byb2Nlc3Nvci5jYwpAQCAtNCw2ICs0LDggQEAKIAogI2luY2x1ZGUgIm1lZGlhL2dwdS92YWFwaS92YWFwaV9pbWFnZV9wcm9jZXNzb3IuaCIKIAorI2luY2x1ZGUgPHN0ZGludC5oPgorCiAjaW5jbHVkZSA8dmEvdmEuaD4KIAogI2luY2x1ZGUgImJhc2UvYmluZC5oIgpAQCAtMzUsMjMgKzM3LDE5IEBACiAgIGVycm9yX2NiLlJ1bigpOwogfQogCi1ib29sIElzU3VwcG9ydGVkKFZpZGVvUGl4ZWxGb3JtYXQgaW5wdXRfZm9ybWF0LAotICAgICAgICAgICAgICAgICBWaWRlb1BpeGVsRm9ybWF0IG91dHB1dF9mb3JtYXQsCi0gICAgICAgICAgICAgICAgIGdmeDo6U2l6ZSBpbnB1dF9zaXplLAotICAgICAgICAgICAgICAgICBnZng6OlNpemUgb3V0cHV0X3NpemUpIHsKLSAgY29uc3QgdWludDMyX3QgaW5wdXRfdmFfZm91cmNjID0KLSAgICAgIEZvdXJjYzo6RnJvbVZpZGVvUGl4ZWxGb3JtYXQoaW5wdXRfZm9ybWF0KS5Ub1ZBRm91ckNDKCk7Citib29sIElzU3VwcG9ydGVkKHVpbnQzMl90IGlucHV0X3ZhX2ZvdXJjYywKKyAgICAgICAgICAgICAgICAgdWludDMyX3Qgb3V0cHV0X3ZhX2ZvdXJjYywKKyAgICAgICAgICAgICAgICAgY29uc3QgZ2Z4OjpTaXplJiBpbnB1dF9zaXplLAorICAgICAgICAgICAgICAgICBjb25zdCBnZng6OlNpemUmIG91dHB1dF9zaXplKSB7CiAgIGlmICghVmFhcGlXcmFwcGVyOjpJc1ZwcEZvcm1hdFN1cHBvcnRlZChpbnB1dF92YV9mb3VyY2MpKSB7Ci0gICAgVkxPR0YoMikgPDwgIlVuc3VwcG9ydGVkIGlucHV0IGZvcm1hdDogIiA8PCBpbnB1dF9mb3JtYXQgPDwgIiAoVkFfRk9VUkNDXyIKLSAgICAgICAgICAgICA8PCBGb3VyY2NUb1N0cmluZyhpbnB1dF92YV9mb3VyY2MpIDw8ICIpIjsKKyAgICBWTE9HRigyKSA8PCAiVW5zdXBwb3J0ZWQgaW5wdXQgZm9ybWF0OiBWQV9GT1VSQ0NfIgorICAgICAgICAgICAgIDw8IEZvdXJjY1RvU3RyaW5nKGlucHV0X3ZhX2ZvdXJjYyk7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgY29uc3QgdWludDMyX3Qgb3V0cHV0X3ZhX2ZvdXJjYyA9Ci0gICAgICBGb3VyY2M6OkZyb21WaWRlb1BpeGVsRm9ybWF0KG91dHB1dF9mb3JtYXQpLlRvVkFGb3VyQ0MoKTsKICAgaWYgKCFWYWFwaVdyYXBwZXI6OklzVnBwRm9ybWF0U3VwcG9ydGVkKG91dHB1dF92YV9mb3VyY2MpKSB7Ci0gICAgVkxPR0YoMikgPDwgIlVuc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQ6ICIgPDwgb3V0cHV0X2Zvcm1hdCA8PCAiIChWQV9GT1VSQ0NfIgotICAgICAgICAgICAgIDw8IEZvdXJjY1RvU3RyaW5nKG91dHB1dF92YV9mb3VyY2MpIDw8ICIpIjsKKyAgICBWTE9HRigyKSA8PCAiVW5zdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdDogVkFfRk9VUkNDXyIKKyAgICAgICAgICAgICA8PCBGb3VyY2NUb1N0cmluZyhvdXRwdXRfdmFfZm91cmNjKTsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIApAQCAtMTAxLDExICs5OSw5IEBACiAgIHJldHVybiBudWxscHRyOwogI2VuZGlmCiAKLSAgY29uc3QgVmlkZW9GcmFtZUxheW91dCYgaW5wdXRfbGF5b3V0ID0gaW5wdXRfY29uZmlnLmxheW91dDsKLSAgY29uc3QgVmlkZW9GcmFtZUxheW91dCYgb3V0cHV0X2xheW91dCA9IG91dHB1dF9jb25maWcubGF5b3V0OwotICBpZiAoIUlzU3VwcG9ydGVkKGlucHV0X2xheW91dC5mb3JtYXQoKSwgb3V0cHV0X2xheW91dC5mb3JtYXQoKSwKLSAgICAgICAgICAgICAgICAgICBpbnB1dF9jb25maWcubGF5b3V0LmNvZGVkX3NpemUoKSwKLSAgICAgICAgICAgICAgICAgICBvdXRwdXRfY29uZmlnLmxheW91dC5jb2RlZF9zaXplKCkpKSB7CisgIGlmICghSXNTdXBwb3J0ZWQoaW5wdXRfY29uZmlnLmZvdXJjYy5Ub1ZBRm91ckNDKCksCisgICAgICAgICAgICAgICAgICAgb3V0cHV0X2NvbmZpZy5mb3VyY2MuVG9WQUZvdXJDQygpLCBpbnB1dF9jb25maWcuc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBvdXRwdXRfY29uZmlnLnNpemUpKSB7CiAgICAgcmV0dXJuIG51bGxwdHI7CiAgIH0KIApAQCAtMTMxLDI3ICsxMjcsMjMgQEAKICAgICByZXR1cm4gbnVsbHB0cjsKICAgfQogCi0gIC8vIFdlIHNob3VsZCByZXN0cmljdCB0aGUgYWNjZXB0YWJsZSBWaWRlb0ZyYW1lTGF5b3V0IGZvciBpbnB1dCBhbmQgb3V0cHV0Ci0gIC8vIGJvdGggdG8gdGhlIG9uZSByZXR1cm5lZCBieSBHZXRQbGF0Zm9ybVZpZGVvRnJhbWVMYXlvdXQoKS4gSG93ZXZlciwKKyAgLy8gV2Ugc2hvdWxkIHJlc3RyaWN0IHRoZSBhY2NlcHRhYmxlIFBvcnRDb25maWcgZm9yIGlucHV0IGFuZCBvdXRwdXQgYm90aCB0bworICAvLyB0aGUgb25lIHJldHVybmVkIGJ5IEdldFBsYXRmb3JtVmlkZW9GcmFtZUxheW91dCgpLiBIb3dldmVyLAogICAvLyBJbWFnZVByb2Nlc3NvckZhY3RvcnkgaW50ZXJmYWNlIGRvZXNuJ3QgcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB3aGF0CiAgIC8vIEltYWdlUHJvY2Vzc29yIHdpbGwgYmUgdXNlZCBmb3IuIChlLmcuIGZvcm1hdCBjb252ZXJzaW9uIGFmdGVyIGRlY29kaW5nIGFuZAogICAvLyBzY2FsaW5nIGJlZm9yZSBlbmNvZGluZykuIFRodXMgd2UgY2Fubm90IGV4ZWN1dGUKICAgLy8gR2V0UGxhdGZvcm1WaWRlb0ZyYW1lTGF5b3V0KCkgd2l0aCBhIHByb3BlciBnZng6OkJ1ZmZlclVzYWdlLgogICAvLyBUT0RPKGNyYnVnLmNvbS84OTg0MjMpOiBBZGp1c3QgbGF5b3V0IG9uY2UgSW1hZ2VQcm9jZXNzb3IgcHJvdmlkZSB0aGUgdXNlCiAgIC8vIHNjZW5hcmlvLgotICByZXR1cm4gYmFzZTo6V3JhcFVuaXF1ZShuZXcgVmFhcGlJbWFnZVByb2Nlc3NvcihpbnB1dF9sYXlvdXQsIG91dHB1dF9sYXlvdXQsCisgIHJldHVybiBiYXNlOjpXcmFwVW5pcXVlKG5ldyBWYWFwaUltYWdlUHJvY2Vzc29yKGlucHV0X2NvbmZpZywgb3V0cHV0X2NvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHZhYXBpX3dyYXBwZXIpKSk7CiB9CiAKIFZhYXBpSW1hZ2VQcm9jZXNzb3I6OlZhYXBpSW1hZ2VQcm9jZXNzb3IoCi0gICAgY29uc3QgVmlkZW9GcmFtZUxheW91dCYgaW5wdXRfbGF5b3V0LAotICAgIGNvbnN0IFZpZGVvRnJhbWVMYXlvdXQmIG91dHB1dF9sYXlvdXQsCisgICAgY29uc3QgSW1hZ2VQcm9jZXNzb3I6OlBvcnRDb25maWcmIGlucHV0X2NvbmZpZywKKyAgICBjb25zdCBJbWFnZVByb2Nlc3Nvcjo6UG9ydENvbmZpZyYgb3V0cHV0X2NvbmZpZywKICAgICBzY29wZWRfcmVmcHRyPFZhYXBpV3JhcHBlcj4gdmFhcGlfd3JhcHBlcikKLSAgICA6IEltYWdlUHJvY2Vzc29yKGlucHV0X2xheW91dCwKLSAgICAgICAgICAgICAgICAgICAgIFZpZGVvRnJhbWU6OlNUT1JBR0VfRE1BQlVGUywKLSAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9sYXlvdXQsCi0gICAgICAgICAgICAgICAgICAgICBWaWRlb0ZyYW1lOjpTVE9SQUdFX0RNQUJVRlMsCi0gICAgICAgICAgICAgICAgICAgICBPdXRwdXRNb2RlOjpJTVBPUlQpLAorICAgIDogSW1hZ2VQcm9jZXNzb3IoaW5wdXRfY29uZmlnLCBvdXRwdXRfY29uZmlnLCBPdXRwdXRNb2RlOjpJTVBPUlQpLAogICAgICAgcHJvY2Vzc29yX3Rhc2tfcnVubmVyXyhiYXNlOjpDcmVhdGVTZXF1ZW5jZWRUYXNrUnVubmVyKAogICAgICAgICAgIGJhc2U6OlRhc2tUcmFpdHN7YmFzZTo6VGhyZWFkUG9vbCgpfSkpLAogICAgICAgdmFhcGlfd3JhcHBlcl8oc3RkOjptb3ZlKHZhYXBpX3dyYXBwZXIpKSB7fQpAQCAtMTY5LDMyICsxNjEsNDYgQEAKICAgRENIRUNLKGlucHV0X2ZyYW1lKTsKICAgRENIRUNLKG91dHB1dF9mcmFtZSk7CiAKLSAgY29uc3QgVmlkZW9GcmFtZUxheW91dCYgaW5wdXRfZnJhbWVfbGF5b3V0ID0gaW5wdXRfZnJhbWUtPmxheW91dCgpOwotICBpZiAoaW5wdXRfZnJhbWVfbGF5b3V0LmZvcm1hdCgpICE9IGlucHV0X2xheW91dF8uZm9ybWF0KCkgfHwKLSAgICAgIGlucHV0X2ZyYW1lX2xheW91dC5jb2RlZF9zaXplKCkgIT0gaW5wdXRfbGF5b3V0Xy5jb2RlZF9zaXplKCkpIHsKLSAgICBWTE9HRigxKSA8PCAiSW52YWxpZCBpbnB1dF9mcmFtZS0+bGF5b3V0PSIgPDwgaW5wdXRfZnJhbWUtPmxheW91dCgpCi0gICAgICAgICAgICAgPDwgIiwgaW5wdXRfbGF5b3V0Xz0iIDw8IGlucHV0X2xheW91dF87CisgIGNvbnN0IEZvdXJjYyBpbnB1dF9mcmFtZV9mb3VyY2MgPQorICAgICAgRm91cmNjOjpGcm9tVmlkZW9QaXhlbEZvcm1hdChpbnB1dF9mcmFtZS0+bGF5b3V0KCkuZm9ybWF0KCkpOworICBpZiAoaW5wdXRfZnJhbWVfZm91cmNjICE9IGlucHV0X2NvbmZpZ18uZm91cmNjKSB7CisgICAgVkxPR0YoMSkgPDwgIkludmFsaWQgaW5wdXRfZnJhbWUgZm9ybWF0PSIgPDwgaW5wdXRfZnJhbWVfZm91cmNjLlRvU3RyaW5nKCkKKyAgICAgICAgICAgICA8PCAiLCBleHBlY3RlZD0iIDw8IGlucHV0X2NvbmZpZ18uZm91cmNjLlRvU3RyaW5nKCk7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgY29uc3QgVmlkZW9GcmFtZUxheW91dCYgb3V0cHV0X2ZyYW1lX2xheW91dCA9IG91dHB1dF9mcmFtZS0+bGF5b3V0KCk7Ci0gIGlmIChvdXRwdXRfZnJhbWVfbGF5b3V0LmZvcm1hdCgpICE9IG91dHB1dF9sYXlvdXRfLmZvcm1hdCgpIHx8Ci0gICAgICBvdXRwdXRfZnJhbWVfbGF5b3V0LmNvZGVkX3NpemUoKSAhPSBvdXRwdXRfbGF5b3V0Xy5jb2RlZF9zaXplKCkpIHsKLSAgICBWTE9HRigxKSA8PCAiSW52YWxpZCBvdXRwdXRfZnJhbWUtPmxheW91dD0iIDw8IG91dHB1dF9mcmFtZS0+bGF5b3V0KCkKLSAgICAgICAgICAgICA8PCAiLCBvdXRwdXRfbGF5b3V0Xz0iIDw8IG91dHB1dF9sYXlvdXRfOworICBpZiAoaW5wdXRfZnJhbWUtPmxheW91dCgpLmNvZGVkX3NpemUoKSAhPSBpbnB1dF9jb25maWdfLnNpemUpIHsKKyAgICBWTE9HRigxKSA8PCAiSW52YWxpZCBpbnB1dF9mcmFtZSBzaXplPSIKKyAgICAgICAgICAgICA8PCBpbnB1dF9mcmFtZS0+bGF5b3V0KCkuY29kZWRfc2l6ZSgpLlRvU3RyaW5nKCkKKyAgICAgICAgICAgICA8PCAiLCBleHBlY3RlZD0iIDw8IGlucHV0X2NvbmZpZ18uc2l6ZS5Ub1N0cmluZygpOwogICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIGlmIChpbnB1dF9mcmFtZS0+c3RvcmFnZV90eXBlKCkgIT0gaW5wdXRfc3RvcmFnZV90eXBlKCkpIHsKKyAgY29uc3QgRm91cmNjIG91dHB1dF9mcmFtZV9mb3VyY2MgPQorICAgICAgRm91cmNjOjpGcm9tVmlkZW9QaXhlbEZvcm1hdChvdXRwdXRfZnJhbWUtPmxheW91dCgpLmZvcm1hdCgpKTsKKyAgaWYgKG91dHB1dF9mcmFtZV9mb3VyY2MgIT0gb3V0cHV0X2NvbmZpZ18uZm91cmNjKSB7CisgICAgVkxPR0YoMSkgPDwgIkludmFsaWQgb3V0cHV0X2ZyYW1lIGZvcm1hdD0iIDw8IG91dHB1dF9mcmFtZV9mb3VyY2MuVG9TdHJpbmcoKQorICAgICAgICAgICAgIDw8ICIsIGV4cGVjdGVkPSIgPDwgb3V0cHV0X2NvbmZpZ18uZm91cmNjLlRvU3RyaW5nKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKG91dHB1dF9mcmFtZS0+bGF5b3V0KCkuY29kZWRfc2l6ZSgpICE9IG91dHB1dF9jb25maWdfLnNpemUpIHsKKyAgICBWTE9HRigxKSA8PCAiSW52YWxpZCBvdXRwdXRfZnJhbWUgc2l6ZT0iCisgICAgICAgICAgICAgPDwgb3V0cHV0X2ZyYW1lLT5sYXlvdXQoKS5jb2RlZF9zaXplKCkuVG9TdHJpbmcoKQorICAgICAgICAgICAgIDw8ICIsIGV4cGVjdGVkPSIgPDwgb3V0cHV0X2NvbmZpZ18uc2l6ZS5Ub1N0cmluZygpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmIChpbnB1dF9mcmFtZS0+c3RvcmFnZV90eXBlKCkgIT0gaW5wdXRfY29uZmlnXy5zdG9yYWdlX3R5cGUoKSkgewogICAgIFZMT0dGKDEpIDw8ICJJbnZhbGlkIGlucHV0X2ZyYW1lLT5zdG9yYWdlX3R5cGU9IgogICAgICAgICAgICAgIDw8IGlucHV0X2ZyYW1lLT5zdG9yYWdlX3R5cGUoKQotICAgICAgICAgICAgIDw8ICIsIGlucHV0X3N0b3JhZ2VfdHlwZT0iIDw8IGlucHV0X3N0b3JhZ2VfdHlwZSgpOworICAgICAgICAgICAgIDw8ICIsIGlucHV0X3N0b3JhZ2VfdHlwZT0iIDw8IGlucHV0X2NvbmZpZ18uc3RvcmFnZV90eXBlKCk7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9Ci0gIGlmIChvdXRwdXRfZnJhbWUtPnN0b3JhZ2VfdHlwZSgpICE9IG91dHB1dF9zdG9yYWdlX3R5cGUoKSkgeworICBpZiAob3V0cHV0X2ZyYW1lLT5zdG9yYWdlX3R5cGUoKSAhPSBvdXRwdXRfY29uZmlnXy5zdG9yYWdlX3R5cGUoKSkgewogICAgIFZMT0dGKDEpIDw8ICJJbnZhbGlkIG91dHB1dF9mcmFtZS0+c3RvcmFnZV90eXBlPSIKICAgICAgICAgICAgICA8PCBvdXRwdXRfZnJhbWUtPnN0b3JhZ2VfdHlwZSgpCi0gICAgICAgICAgICAgPDwgIiwgb3V0cHV0X3N0b3JhZ2VfdHlwZT0iIDw8IG91dHB1dF9zdG9yYWdlX3R5cGUoKTsKKyAgICAgICAgICAgICA8PCAiLCBleHBlY3RlZD0iIDw8IG91dHB1dF9jb25maWdfLnN0b3JhZ2VfdHlwZSgpOwogICAgIHJldHVybiBmYWxzZTsKICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9ncHUvdmFhcGkvdmFhcGlfaW1hZ2VfcHJvY2Vzc29yLmggYi9tZWRpYS9ncHUvdmFhcGkvdmFhcGlfaW1hZ2VfcHJvY2Vzc29yLmgKaW5kZXggNjlhMDA4MmIuLjY5OWJlNGMyIDEwMDY0NAotLS0gYS9tZWRpYS9ncHUvdmFhcGkvdmFhcGlfaW1hZ2VfcHJvY2Vzc29yLmgKKysrIGIvbWVkaWEvZ3B1L3ZhYXBpL3ZhYXBpX2ltYWdlX3Byb2Nlc3Nvci5oCkBAIC0zOSw4ICszOSw4IEBACiAgIGJvb2wgUmVzZXQoKSBvdmVycmlkZTsKIAogIHByaXZhdGU6Ci0gIFZhYXBpSW1hZ2VQcm9jZXNzb3IoY29uc3QgVmlkZW9GcmFtZUxheW91dCYgaW5wdXRfbGF5b3V0LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZpZGVvRnJhbWVMYXlvdXQmIG91dHB1dF9sYXlvdXQsCisgIFZhYXBpSW1hZ2VQcm9jZXNzb3IoY29uc3QgSW1hZ2VQcm9jZXNzb3I6OlBvcnRDb25maWcmIGlucHV0X2NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbWFnZVByb2Nlc3Nvcjo6UG9ydENvbmZpZyYgb3V0cHV0X2NvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICBzY29wZWRfcmVmcHRyPFZhYXBpV3JhcHBlcj4gdmFhcGlfd3JhcHBlcik7CiAKICAgLy8gSW1hZ2VQcm9jZXNzb3IgaW1wbGVtZW50YXRpb24uCmRpZmYgLS1naXQgYS9tZWRpYS9ncHUvd2luZG93cy9kM2QxMV9jb3B5aW5nX3RleHR1cmVfd3JhcHBlci5jYyBiL21lZGlhL2dwdS93aW5kb3dzL2QzZDExX2NvcHlpbmdfdGV4dHVyZV93cmFwcGVyLmNjCmluZGV4IGU4NDk4NmYuLjRiMDA4MjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2dwdS93aW5kb3dzL2QzZDExX2NvcHlpbmdfdGV4dHVyZV93cmFwcGVyLmNjCisrKyBiL21lZGlhL2dwdS93aW5kb3dzL2QzZDExX2NvcHlpbmdfdGV4dHVyZV93cmFwcGVyLmNjCkBAIC02MSw3ICs2MSw2IEBACiAKIGJvb2wgQ29weWluZ1RleHR1cmUyRFdyYXBwZXI6OkluaXQoR2V0Q29tbWFuZEJ1ZmZlckhlbHBlckNCIGdldF9oZWxwZXJfY2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBhcnJheV9zbGljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIHRhcmdldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2Z4OjpTaXplIHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0ZXh0dXJlc19wZXJfcGljdHVyZSkgewogICBpZiAoIXZpZGVvX3Byb2Nlc3Nvcl8tPkluaXQoc2l6ZS53aWR0aCgpLCBzaXplLmhlaWdodCgpKSkKQEAgLTcwLDcgKzY5LDcgQEAKICAgcmV0dXJuIG91dHB1dF90ZXh0dXJlX3dyYXBwZXJfLT5Jbml0KAogICAgICAgZ2V0X2hlbHBlcl9jYiwKICAgICAgIDAsICAvLyBUaGUgb3V0cHV0IHRleHR1cmUgb25seSBoYXMgYW4gYXJyYXkgc2l6ZSBvZiAxLgotICAgICAgdGFyZ2V0LCBzaXplLCB0ZXh0dXJlc19wZXJfcGljdHVyZSk7CisgICAgICBzaXplLCB0ZXh0dXJlc19wZXJfcGljdHVyZSk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvbWVkaWEvZ3B1L3dpbmRvd3MvZDNkMTFfY29weWluZ190ZXh0dXJlX3dyYXBwZXIuaCBiL21lZGlhL2dwdS93aW5kb3dzL2QzZDExX2NvcHlpbmdfdGV4dHVyZV93cmFwcGVyLmgKaW5kZXggNjUyNGVhMC4uODE2NjNmOCAxMDA2NDQKLS0tIGEvbWVkaWEvZ3B1L3dpbmRvd3MvZDNkMTFfY29weWluZ190ZXh0dXJlX3dyYXBwZXIuaAorKysgYi9tZWRpYS9ncHUvd2luZG93cy9kM2QxMV9jb3B5aW5nX3RleHR1cmVfd3JhcHBlci5oCkBAIC0zMCw3ICszMCw2IEBACiAKICAgYm9vbCBJbml0KEdldENvbW1hbmRCdWZmZXJIZWxwZXJDQiBnZXRfaGVscGVyX2NiLAogICAgICAgICAgICAgc2l6ZV90IGFycmF5X3NsaWNlLAotICAgICAgICAgICAgR0xlbnVtIHRhcmdldCwKICAgICAgICAgICAgIGdmeDo6U2l6ZSBzaXplLAogICAgICAgICAgICAgaW50IHRleHR1cmVzX3Blcl9waWN0dXJlKSBvdmVycmlkZTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvZ3B1L3dpbmRvd3MvZDNkMTFfY29weWluZ190ZXh0dXJlX3dyYXBwZXJfdW5pdHRlc3QuY2MgYi9tZWRpYS9ncHUvd2luZG93cy9kM2QxMV9jb3B5aW5nX3RleHR1cmVfd3JhcHBlcl91bml0dGVzdC5jYwppbmRleCAzM2VkM2U0Li44OTUzN2JkNCAxMDA2NDQKLS0tIGEvbWVkaWEvZ3B1L3dpbmRvd3MvZDNkMTFfY29weWluZ190ZXh0dXJlX3dyYXBwZXJfdW5pdHRlc3QuY2MKKysrIGIvbWVkaWEvZ3B1L3dpbmRvd3MvZDNkMTFfY29weWluZ190ZXh0dXJlX3dyYXBwZXJfdW5pdHRlc3QuY2MKQEAgLTY1LDcgKzY1LDYgQEAKIAogICBib29sIEluaXQoR2V0Q29tbWFuZEJ1ZmZlckhlbHBlckNCIGdldF9oZWxwZXJfY2IsCiAgICAgICAgICAgICBzaXplX3QgYXJyYXlfc2xpY2UsCi0gICAgICAgICAgICBHTGVudW0gdGFyZ2V0LAogICAgICAgICAgICAgZ2Z4OjpTaXplIHNpemUsCiAgICAgICAgICAgICBpbnQgdGV4dHVyZXNfcGVyX3BpY3R1cmUpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gTW9ja0luaXQoKTsKQEAgLTE1MywxMCArMTUyLDEwIEBACiAgICAgICAgQ29weWluZ1RleHR1cmVXcmFwcGVyUHJvY2Vzc2VzQ29ycmVjdGx5KSB7CiAgIGF1dG8gd3JhcHBlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q29weWluZ1RleHR1cmUyRFdyYXBwZXI+KAogICAgICAgRXhwZWN0VGV4dHVyZVdyYXBwZXIoKSwgRXhwZWN0UHJvY2Vzc29yUHJveHkoKSwgbnVsbHB0cik7Ci0gIGF1dG8gcGljdHVyZV9idWZmZXIgPSBiYXNlOjpNYWtlUmVmQ291bnRlZDxEM0QxMVBpY3R1cmVCdWZmZXI+KAotICAgICAgR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMsIG51bGxwdHIsIGdmeDo6U2l6ZSgwLCAwKSwgMCk7CisgIGF1dG8gcGljdHVyZV9idWZmZXIgPQorICAgICAgYmFzZTo6TWFrZVJlZkNvdW50ZWQ8RDNEMTFQaWN0dXJlQnVmZmVyPihudWxscHRyLCBnZng6OlNpemUoMCwgMCksIDApOwogCi0gIEVYUEVDVF9FUSh3cmFwcGVyLT5Jbml0KENyZWF0ZU1vY2tIZWxwZXJDQigpLCAwLCB7fSwge30sIDApLCBJbml0U3VjY2VlZHMoKSk7CisgIEVYUEVDVF9FUSh3cmFwcGVyLT5Jbml0KENyZWF0ZU1vY2tIZWxwZXJDQigpLCAwLCB7fSwgMCksIEluaXRTdWNjZWVkcygpKTsKICAgRVhQRUNUX0VRKHdyYXBwZXItPlByb2Nlc3NUZXh0dXJlKHBpY3R1cmVfYnVmZmVyLmdldCgpLCBudWxscHRyKSwKICAgICAgICAgICAgIFByb2Nlc3NUZXh0dXJlU3VjY2VlZHMoKSk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9ncHUvd2luZG93cy9kM2QxMV9waWN0dXJlX2J1ZmZlci5jYyBiL21lZGlhL2dwdS93aW5kb3dzL2QzZDExX3BpY3R1cmVfYnVmZmVyLmNjCmluZGV4IDc4MWU4NzMuLjI3YTZmMWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2dwdS93aW5kb3dzL2QzZDExX3BpY3R1cmVfYnVmZmVyLmNjCisrKyBiL21lZGlhL2dwdS93aW5kb3dzL2QzZDExX3BpY3R1cmVfYnVmZmVyLmNjCkBAIC0yMiwxMiArMjIsMTAgQEAKIG5hbWVzcGFjZSBtZWRpYSB7CiAKIEQzRDExUGljdHVyZUJ1ZmZlcjo6RDNEMTFQaWN0dXJlQnVmZmVyKAotICAgIEdMZW51bSB0YXJnZXQsCiAgICAgc3RkOjp1bmlxdWVfcHRyPFRleHR1cmUyRFdyYXBwZXI+IHRleHR1cmVfd3JhcHBlciwKICAgICBnZng6OlNpemUgc2l6ZSwKICAgICBzaXplX3QgbGV2ZWwpCi0gICAgOiB0YXJnZXRfKHRhcmdldCksCi0gICAgICB0ZXh0dXJlX3dyYXBwZXJfKHN0ZDo6bW92ZSh0ZXh0dXJlX3dyYXBwZXIpKSwKKyAgICA6IHRleHR1cmVfd3JhcHBlcl8oc3RkOjptb3ZlKHRleHR1cmVfd3JhcHBlcikpLAogICAgICAgc2l6ZV8oc2l6ZSksCiAgICAgICBsZXZlbF8obGV2ZWwpIHt9CiAKQEAgLTQ1LDcgKzQzLDcgQEAKICAgdmlld19kZXNjLlZpZXdEaW1lbnNpb24gPSBEM0QxMV9WRE9WX0RJTUVOU0lPTl9URVhUVVJFMkQ7CiAgIHZpZXdfZGVzYy5UZXh0dXJlMkQuQXJyYXlTbGljZSA9IChVSU5UKWxldmVsXzsKIAotICBpZiAoIXRleHR1cmVfd3JhcHBlcl8tPkluaXQoc3RkOjptb3ZlKGdldF9oZWxwZXJfY2IpLCBsZXZlbF8sIHRhcmdldF8sIHNpemVfLAorICBpZiAoIXRleHR1cmVfd3JhcHBlcl8tPkluaXQoc3RkOjptb3ZlKGdldF9oZWxwZXJfY2IpLCBsZXZlbF8sIHNpemVfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZXNfcGVyX3BpY3R1cmUpKSB7CiAgICAgbWVkaWFfbG9nLT5BZGRFdmVudCgKICAgICAgICAgbWVkaWFfbG9nLT5DcmVhdGVTdHJpbmdFdmVudChNZWRpYUxvZ0V2ZW50OjpNRURJQV9FUlJPUl9MT0dfRU5UUlksCmRpZmYgLS1naXQgYS9tZWRpYS9ncHUvd2luZG93cy9kM2QxMV9waWN0dXJlX2J1ZmZlci5oIGIvbWVkaWEvZ3B1L3dpbmRvd3MvZDNkMTFfcGljdHVyZV9idWZmZXIuaAppbmRleCA4MzU4YTE4Li41Zjk0NTExIDEwMDY0NAotLS0gYS9tZWRpYS9ncHUvd2luZG93cy9kM2QxMV9waWN0dXJlX2J1ZmZlci5oCisrKyBiL21lZGlhL2dwdS93aW5kb3dzL2QzZDExX3BpY3R1cmVfYnVmZmVyLmgKQEAgLTQ5LDggKzQ5LDcgQEAKICAgLy8gfHRleHR1cmVfd3JhcHBlcnwgaXMgcmVzcG9uc2libGUgZm9yIGNvbnRyb2xsaW5nIG1haWxib3ggYWNjZXNzIHRvCiAgIC8vIHRoZSBJRDNEMTFUZXh0dXJlMkQsCiAgIC8vIHxsZXZlbHwgaXMgdGhlIHBpY3R1cmVidWZmZXIgaW5kZXggaW5zaWRlIHRoZSBBcnJheS10eXBlIElEM0QxMVRleHR1cmUyRC4KLSAgRDNEMTFQaWN0dXJlQnVmZmVyKEdMZW51bSB0YXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8VGV4dHVyZTJEV3JhcHBlcj4gdGV4dHVyZV93cmFwcGVyLAorICBEM0QxMVBpY3R1cmVCdWZmZXIoc3RkOjp1bmlxdWVfcHRyPFRleHR1cmUyRFdyYXBwZXI+IHRleHR1cmVfd3JhcHBlciwKICAgICAgICAgICAgICAgICAgICAgIGdmeDo6U2l6ZSBzaXplLAogICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxldmVsKTsKIApAQCAtODcsNyArODYsNiBAQAogICB+RDNEMTFQaWN0dXJlQnVmZmVyKCk7CiAgIGZyaWVuZCBjbGFzcyBiYXNlOjpSZWZDb3VudGVkVGhyZWFkU2FmZTxEM0QxMVBpY3R1cmVCdWZmZXI+OwogCi0gIEdMZW51bSB0YXJnZXRfOwogICBzdGQ6OnVuaXF1ZV9wdHI8VGV4dHVyZTJEV3JhcHBlcj4gdGV4dHVyZV93cmFwcGVyXzsKICAgZ2Z4OjpTaXplIHNpemVfOwogICBib29sIGluX3BpY3R1cmVfdXNlXyA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZ3B1L3dpbmRvd3MvZDNkMTFfdGV4dHVyZV93cmFwcGVyLmNjIGIvbWVkaWEvZ3B1L3dpbmRvd3MvZDNkMTFfdGV4dHVyZV93cmFwcGVyLmNjCmluZGV4IDk3NzZmOGYuLjhhN2U4Y2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2dwdS93aW5kb3dzL2QzZDExX3RleHR1cmVfd3JhcHBlci5jYworKysgYi9tZWRpYS9ncHUvd2luZG93cy9kM2QxMV90ZXh0dXJlX3dyYXBwZXIuY2MKQEAgLTMzLDcgKzMzLDYgQEAKIAogYm9vbCBEZWZhdWx0VGV4dHVyZTJEV3JhcHBlcjo6SW5pdChHZXRDb21tYW5kQnVmZmVySGVscGVyQ0IgZ2V0X2hlbHBlcl9jYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGFycmF5X3NsaWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gdGFyZ2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZng6OlNpemUgc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRleHR1cmVzX3Blcl9waWN0dXJlKSB7CiAgIGdwdV9yZXNvdXJjZXNfID0gc3RkOjptYWtlX3VuaXF1ZTxHcHVSZXNvdXJjZXM+KCk7CkBAIC01NSw4ICs1NCw4IEBACiAgIC8vIGEgaGFuZGxlIHRoYXQgd2UgZ2V0IGZyb20gfHRleHR1cmV8IGFzIGFuIElEWEdJUmVzb3VyY2UxLgogICAvLyBUT0RPKGxpYmVyYXRvKTogdGhpcyBzaG91bGQgaGFwcGVuIG9uIHRoZSBncHUgdGhyZWFkLgogICByZXR1cm4gZ3B1X3Jlc291cmNlc18tPkluaXQoc3RkOjptb3ZlKGdldF9oZWxwZXJfY2IpLCBhcnJheV9zbGljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShtYWlsYm94ZXMpLCB0YXJnZXQsIHNpemUsIFRleHR1cmUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmVzX3Blcl9waWN0dXJlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShtYWlsYm94ZXMpLCBHTF9URVhUVVJFX0VYVEVSTkFMX09FUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIFRleHR1cmUoKSwgdGV4dHVyZXNfcGVyX3BpY3R1cmUpOwogCiAgIHJldHVybiB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZ3B1L3dpbmRvd3MvZDNkMTFfdGV4dHVyZV93cmFwcGVyLmggYi9tZWRpYS9ncHUvd2luZG93cy9kM2QxMV90ZXh0dXJlX3dyYXBwZXIuaAppbmRleCBiM2FjOGM0YS4uMGYzMDk0MDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2dwdS93aW5kb3dzL2QzZDExX3RleHR1cmVfd3JhcHBlci5oCisrKyBiL21lZGlhL2dwdS93aW5kb3dzL2QzZDExX3RleHR1cmVfd3JhcHBlci5oCkBAIC01MSw3ICs1MSw2IEBACiAgIC8vIFRleHR1cmUyRC4gSXQgaXMgMSBvdGhlcndpc2UuCiAgIHZpcnR1YWwgYm9vbCBJbml0KEdldENvbW1hbmRCdWZmZXJIZWxwZXJDQiBnZXRfaGVscGVyX2NiLAogICAgICAgICAgICAgICAgICAgICBzaXplX3QgYXJyYXlfc2xpY2UsCi0gICAgICAgICAgICAgICAgICAgIEdMZW51bSB0YXJnZXQsCiAgICAgICAgICAgICAgICAgICAgIGdmeDo6U2l6ZSBzaXplLAogICAgICAgICAgICAgICAgICAgICBpbnQgdGV4dHVyZXNfcGVyX3BpY3R1cmUpID0gMDsKIApAQCAtNjgsNyArNjcsNiBAQAogCiAgIGJvb2wgSW5pdChHZXRDb21tYW5kQnVmZmVySGVscGVyQ0IgZ2V0X2hlbHBlcl9jYiwKICAgICAgICAgICAgIHNpemVfdCBhcnJheV9zbGljZSwKLSAgICAgICAgICAgIEdMZW51bSB0YXJnZXQsCiAgICAgICAgICAgICBnZng6OlNpemUgc2l6ZSwKICAgICAgICAgICAgIGludCB0ZXh0dXJlc19wZXJfcGljdHVyZSkgb3ZlcnJpZGU7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2dwdS93aW5kb3dzL2QzZDExX3ZpZGVvX2RlY29kZXIuY2MgYi9tZWRpYS9ncHUvd2luZG93cy9kM2QxMV92aWRlb19kZWNvZGVyLmNjCmluZGV4IDIyMjU3YmYuLjJlOWI4OGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2dwdS93aW5kb3dzL2QzZDExX3ZpZGVvX2RlY29kZXIuY2MKKysrIGIvbWVkaWEvZ3B1L3dpbmRvd3MvZDNkMTFfdmlkZW9fZGVjb2Rlci5jYwpAQCAtNjE3LDggKzYxNyw4IEBACiAgICAgYXV0byB0ZXhfd3JhcHBlciA9IHRleHR1cmVfc2VsZWN0b3JfLT5DcmVhdGVUZXh0dXJlV3JhcHBlcigKICAgICAgICAgZGV2aWNlXywgdmlkZW9fZGV2aWNlXywgZGV2aWNlX2NvbnRleHRfLCBpbl90ZXh0dXJlLCBzaXplKTsKIAotICAgIHBpY3R1cmVfYnVmZmVyc18ucHVzaF9iYWNrKG5ldyBEM0QxMVBpY3R1cmVCdWZmZXIoCi0gICAgICAgIEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLCBzdGQ6Om1vdmUodGV4X3dyYXBwZXIpLCBzaXplLCBpKSk7CisgICAgcGljdHVyZV9idWZmZXJzXy5wdXNoX2JhY2soCisgICAgICAgIG5ldyBEM0QxMVBpY3R1cmVCdWZmZXIoc3RkOjptb3ZlKHRleF93cmFwcGVyKSwgc2l6ZSwgaSkpOwogICAgIGlmICghcGljdHVyZV9idWZmZXJzX1tpXS0+SW5pdChnZXRfaGVscGVyX2NiXywgdmlkZW9fZGV2aWNlXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZV9zZWxlY3Rvcl8tPkRlY29kZXJHdWlkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmVzX3Blcl9waWN0dXJlLCBtZWRpYV9sb2dfLT5DbG9uZSgpKSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvZ3B1L3dpbmRvd3MvZHh2YV92aWRlb19kZWNvZGVfYWNjZWxlcmF0b3Jfd2luLmNjIGIvbWVkaWEvZ3B1L3dpbmRvd3MvZHh2YV92aWRlb19kZWNvZGVfYWNjZWxlcmF0b3Jfd2luLmNjCmluZGV4IGFjOTg2YjI4Li5hNWM5ODZiIDEwMDY0NAotLS0gYS9tZWRpYS9ncHUvd2luZG93cy9keHZhX3ZpZGVvX2RlY29kZV9hY2NlbGVyYXRvcl93aW4uY2MKKysrIGIvbWVkaWEvZ3B1L3dpbmRvd3MvZHh2YV92aWRlb19kZWNvZGVfYWNjZWxlcmF0b3Jfd2luLmNjCkBAIC0zNTQsNiArMzU0LDggQEAKICAgICB9CiAgIH0KIAorICAvLyBUT0RPKHNhbmRlcnNkKTogVXBkYXRlIHRvIG1hdGNoIGxvZ2ljIGluIFZUVkRBIHRoYXQgdHJhY2tzIGFjdGl2YXRlZCByYXRoZXIKKyAgLy8gdGhhbiBtb3N0IHJlY2VudCBTUFMgYW5kIFBQUy4KICAgaWYgKCFzcHMuZW1wdHkoKSAmJiBzcHMgIT0gbGFzdF9zcHNfKSB7CiAgICAgaWYgKCFsYXN0X3Nwc18uZW1wdHkoKSkgewogICAgICAgLy8gRmxhZyBjb25maWd1cmF0aW9uIGNoYW5nZXMgYWZ0ZXIgd2Ugc2VlIGFuIElEUiBzbGljZS4KZGlmZiAtLWdpdCBhL21lZGlhL3JlbmRlcmVycy9wYWludF9jYW52YXNfdmlkZW9fcmVuZGVyZXIuY2MgYi9tZWRpYS9yZW5kZXJlcnMvcGFpbnRfY2FudmFzX3ZpZGVvX3JlbmRlcmVyLmNjCmluZGV4IGU1NWEyZjAuLmEyMDEyN2EgMTAwNjQ0Ci0tLSBhL21lZGlhL3JlbmRlcmVycy9wYWludF9jYW52YXNfdmlkZW9fcmVuZGVyZXIuY2MKKysrIGIvbWVkaWEvcmVuZGVyZXJzL3BhaW50X2NhbnZhc192aWRlb19yZW5kZXJlci5jYwpAQCAtNTY0LDggKzU2NCw2IEBACiAgIH0KICAgflZpZGVvSW1hZ2VHZW5lcmF0b3IoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CiAKLSAgYm9vbCBJc0VsaWdpYmxlRm9yQWNjZWxlcmF0ZWREZWNvZGluZygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9Ci0KICAgc2tfc3A8U2tEYXRhPiBHZXRFbmNvZGVkRGF0YSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG51bGxwdHI7IH0KIAogICBib29sIEdldFBpeGVscyhjb25zdCBTa0ltYWdlSW5mbyYgaW5mbywKZGlmZiAtLWdpdCBhL21lZGlhL3ZpZGVvL2gyNjRfcGFyc2VyLmNjIGIvbWVkaWEvdmlkZW8vaDI2NF9wYXJzZXIuY2MKaW5kZXggNzVkNzE5Ni4uZjAwZmFmMzIgMTAwNjQ0Ci0tLSBhL21lZGlhL3ZpZGVvL2gyNjRfcGFyc2VyLmNjCisrKyBiL21lZGlhL3ZpZGVvL2gyNjRfcGFyc2VyLmNjCkBAIC0xMjE5LDYgKzEyMTksMTkgQEAKICAgcmV0dXJuIGtPazsKIH0KIAorSDI2NFBhcnNlcjo6UmVzdWx0IEgyNjRQYXJzZXI6OlBhcnNlU1BTRXh0KGludCogc3BzX2lkKSB7CisgIC8vIFNlZSA3LjQuMi4xLgorICBpbnQgbG9jYWxfc3BzX2lkID0gLTE7CisKKyAgKnNwc19pZCA9IC0xOworCisgIFJFQURfVUVfT1JfUkVUVVJOKCZsb2NhbF9zcHNfaWQpOworICBUUlVFX09SX1JFVFVSTihsb2NhbF9zcHNfaWQgPCAzMik7CisKKyAgKnNwc19pZCA9IGxvY2FsX3Nwc19pZDsKKyAgcmV0dXJuIGtPazsKK30KKwogSDI2NFBhcnNlcjo6UmVzdWx0IEgyNjRQYXJzZXI6OlBhcnNlUmVmUGljTGlzdE1vZGlmaWNhdGlvbigKICAgICBpbnQgbnVtX3JlZl9pZHhfYWN0aXZlX21pbnVzMSwKICAgICBIMjY0TW9kaWZpY2F0aW9uT2ZQaWNOdW0qIHJlZl9saXN0X21vZHMpIHsKZGlmZiAtLWdpdCBhL21lZGlhL3ZpZGVvL2gyNjRfcGFyc2VyLmggYi9tZWRpYS92aWRlby9oMjY0X3BhcnNlci5oCmluZGV4IDRhNzAxZmU2Li5mNzQzOWZlIDEwMDY0NAotLS0gYS9tZWRpYS92aWRlby9oMjY0X3BhcnNlci5oCisrKyBiL21lZGlhL3ZpZGVvL2gyNjRfcGFyc2VyLmgKQEAgLTQ2Niw2ICs0NjYsOSBAQAogICBSZXN1bHQgUGFyc2VTUFMoaW50KiBzcHNfaWQpOwogICBSZXN1bHQgUGFyc2VQUFMoaW50KiBwcHNfaWQpOwogCisgIC8vIFBhcnNlcyB0aGUgU1BTIElEIGZyb20gdGhlIFNQU0V4dCwgYnV0IG90aGVyd2lzZSBkb2VzIG5vdGhpbmcuCisgIFJlc3VsdCBQYXJzZVNQU0V4dChpbnQqIHNwc19pZCk7CisKICAgLy8gUmV0dXJuIGEgcG9pbnRlciB0byBTUFMvUFBTIHdpdGggZ2l2ZW4gfHNwc19pZHwvfHBwc19pZHwgb3IgTlVMTCBpZiBub3QKICAgLy8gcHJlc2VudC4KICAgY29uc3QgSDI2NFNQUyogR2V0U1BTKGludCBzcHNfaWQpIGNvbnN0OwpkaWZmIC0tZ2l0IGEvbW9qby9wdWJsaWMvanMvY29tcGlsZV9wcmVhbWJsZS5qcyBiL21vam8vcHVibGljL2pzL2NvbXBpbGVfcHJlYW1ibGUuanMKaW5kZXggZjJjZDY5OS4uNDk3ZTE0ZCAxMDA2NDQKLS0tIGEvbW9qby9wdWJsaWMvanMvY29tcGlsZV9wcmVhbWJsZS5qcworKysgYi9tb2pvL3B1YmxpYy9qcy9jb21waWxlX3ByZWFtYmxlLmpzCkBAIC03LDYgKzcsOCBAQAogICogQGZpbGVvdmVydmlldyBQcmVhbWJsZSBmb3IgSmF2YVNjcmlwdCB0byBiZSBjb21waWxlZCB3aXRoIENsb3N1cmUgQ29tcGlsZXIuCiAgKiBXZSBkb24ndCBjb21wbGUgYWdhaW5zdCB0aGUgQ2xvc3VyZSBsaWJyYXJ5LCBzbyB0aGlzIHByb3ZpZGVzIGEgbWluaW1hbCBzZXQKICAqIG9mICdnb29nJyBuYW1lc3BhY2UgcHJvcGVydGllcyB0byBzdXBwb3J0IHRoaW5ncyBsaWtlIHN5bWJvbCBleHBvcnRzLgorICoKKyAqIEBwcm92aWRlR29vZwogICovCiAKIC8qKiBAY29uc3QgKi8KZGlmZiAtLWdpdCBhL25ldC9CVUlMRC5nbiBiL25ldC9CVUlMRC5nbgppbmRleCA2NmY0ODFjLi5mMzJiMGMwNSAxMDA2NDQKLS0tIGEvbmV0L0JVSUxELmduCisrKyBiL25ldC9CVUlMRC5nbgpAQCAtNTA4Nyw2ICs1MDg3LDcgQEAKICAgICAiYmFzZS9sb29rdXBfc3RyaW5nX2luX2ZpeGVkX3NldF91bml0dGVzdC5jYyIsCiAgICAgImJhc2UvbWltZV9zbmlmZmVyX3VuaXR0ZXN0LmNjIiwKICAgICAiYmFzZS9taW1lX3V0aWxfdW5pdHRlc3QuY2MiLAorICAgICJiYXNlL25ldF9lcnJvcnNfdW5pdHRlc3QuY2MiLAogICAgICJiYXNlL25ldF9zdHJpbmdfdXRpbF91bml0dGVzdC5jYyIsCiAgICAgImJhc2UvbmV0d29ya19hY3Rpdml0eV9tb25pdG9yX3VuaXR0ZXN0LmNjIiwKICAgICAiYmFzZS9uZXR3b3JrX2NoYW5nZV9ub3RpZmllcl91bml0dGVzdC5jYyIsCmRpZmYgLS1naXQgYS9uZXQvYmFzZS9jYWNoZV90eXBlLmggYi9uZXQvYmFzZS9jYWNoZV90eXBlLmgKaW5kZXggZjdlYjNhMS4uM2YyOTg5YiAxMDA2NDQKLS0tIGEvbmV0L2Jhc2UvY2FjaGVfdHlwZS5oCisrKyBiL25ldC9iYXNlL2NhY2hlX3R5cGUuaApAQCAtOCwxMCArOCwxMiBAQAogbmFtZXNwYWNlIG5ldCB7CiAKIC8vIFRoZSB0eXBlcyBvZiBjYWNoZXMgdGhhdCBjYW4gYmUgY3JlYXRlZC4KKy8vIE5vdGU6IGVudW0gdmFsdWVzIHVzZWQgaW4gc29tZSBtZXRyaWNzLCBzbyBhZGQgbmV3IHZhbHVlcyBhdCBlbmQgb25seSwKKy8vIGFuZCBkb24ndCByZW51bWJlciBvbGQgb25lcy4KIGVudW0gQ2FjaGVUeXBlIHsKICAgRElTS19DQUNIRSwgICAgICAgICAgICAgICAgIC8vIERpc2sgaXMgdXNlZCBhcyB0aGUgYmFja2luZyBzdG9yYWdlLgogICBNRU1PUllfQ0FDSEUsICAgICAgICAgICAgICAgLy8gRGF0YSBpcyBzdG9yZWQgb25seSBpbiBtZW1vcnkuCi0gIE1FRElBX0NBQ0hFLCAgICAgICAgICAgICAgICAvLyBPcHRpbWl6ZWQgdG8gaGFuZGxlIG1lZGlhIGZpbGVzLgorICBSRU1PVkVEX01FRElBX0NBQ0hFLCAgICAgICAgLy8gTm8gbG9uZ2VyIGluIHVzZS4KICAgQVBQX0NBQ0hFLCAgICAgICAgICAgICAgICAgIC8vIEJhY2tpbmcgc3RvcmUgZm9yIGFuIEFwcENhY2hlLgogICBTSEFERVJfQ0FDSEUsICAgICAgICAgICAgICAgLy8gQmFja2luZyBzdG9yZSBmb3IgdGhlIEdMIHNoYWRlciBjYWNoZS4KICAgUE5BQ0xfQ0FDSEUsICAgICAgICAgICAgICAgIC8vIEJhY2tpbmcgc3RvcmUgdGhlIFBOYUNsIHRyYW5zbGF0aW9uIGNhY2hlCmRpZmYgLS1naXQgYS9uZXQvYmFzZS9mZWF0dXJlcy5jYyBiL25ldC9iYXNlL2ZlYXR1cmVzLmNjCmluZGV4IDBiY2UzMDllLi44NzQ2ZDI3IDEwMDY0NAotLS0gYS9uZXQvYmFzZS9mZWF0dXJlcy5jYworKysgYi9uZXQvYmFzZS9mZWF0dXJlcy5jYwpAQCAtMTUsOSArMTUsNiBAQAogY29uc3QgYmFzZTo6RmVhdHVyZVBhcmFtPGludD4ga01heFJlZmVyZXJIZWFkZXJMZW5ndGggPSB7CiAgICAgJmtDYXBSZWZlcmVySGVhZGVyTGVuZ3RoLCAiTWF4UmVmZXJlckhlYWRlckxlbmd0aCIsIDQwOTZ9OwogCi1jb25zdCBiYXNlOjpGZWF0dXJlIGtFbmZvcmNlVExTMTNEb3duZ3JhZGV7IkVuZm9yY2VUTFMxM0Rvd25ncmFkZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6RkVBVFVSRV9FTkFCTEVEX0JZX0RFRkFVTFR9OwotCiBjb25zdCBiYXNlOjpGZWF0dXJlIGtFbmFibGVUTFMxM0Vhcmx5RGF0YXsiRW5hYmxlVExTMTNFYXJseURhdGEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6RkVBVFVSRV9ESVNBQkxFRF9CWV9ERUZBVUxUfTsKIApkaWZmIC0tZ2l0IGEvbmV0L2Jhc2UvZmVhdHVyZXMuaCBiL25ldC9iYXNlL2ZlYXR1cmVzLmgKaW5kZXggZTQyYTM0ZjEuLjU4YzgwYzQgMTAwNjQ0Ci0tLSBhL25ldC9iYXNlL2ZlYXR1cmVzLmgKKysrIGIvbmV0L2Jhc2UvZmVhdHVyZXMuaApAQCAtMjIsMTMgKzIyLDYgQEAKIE5FVF9FWFBPUlQgZXh0ZXJuIGNvbnN0IGJhc2U6OkZlYXR1cmUga0NhcFJlZmVyZXJIZWFkZXJMZW5ndGg7CiBORVRfRVhQT1JUIGV4dGVybiBjb25zdCBiYXNlOjpGZWF0dXJlUGFyYW08aW50PiBrTWF4UmVmZXJlckhlYWRlckxlbmd0aDsKIAotLy8gRW5hYmxlcyB0aGUgYWRkaXRpb25hbCBUTFMgMS4zIHNlcnZlci1yYW5kb20tYmFzZWQgZG93bmdyYWRlIHByb3RlY3Rpb24KLS8vIGRlc2NyaWJlZCBpbiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjODQ0NiNzZWN0aW9uLTQuMS4zCi0vLwotLy8gVGhpcyBpcyBhIE1VU1QtbGV2ZWwgcmVxdWlyZW1lbnQgb2YgVExTIDEuMywgYnV0IGhhcyBjb21wYXRpYmlsaXR5IGlzc3VlcwotLy8gd2l0aCBzb21lIGJ1Z2d5IG5vbi1jb21wbGlhbnQgVExTLXRlcm1pbmF0aW5nIHByb3hpZXMuCi1ORVRfRVhQT1JUIGV4dGVybiBjb25zdCBiYXNlOjpGZWF0dXJlIGtFbmZvcmNlVExTMTNEb3duZ3JhZGU7Ci0KIC8vIEVuYWJsZXMgVExTIDEuMyBlYXJseSBkYXRhLgogTkVUX0VYUE9SVCBleHRlcm4gY29uc3QgYmFzZTo6RmVhdHVyZSBrRW5hYmxlVExTMTNFYXJseURhdGE7CiAKZGlmZiAtLWdpdCBhL25ldC9iYXNlL2xvYWRfZmxhZ3NfbGlzdC5oIGIvbmV0L2Jhc2UvbG9hZF9mbGFnc19saXN0LmgKaW5kZXggZWQ0NTcwNjcuLjZiYTA5OTAgMTAwNjQ0Ci0tLSBhL25ldC9iYXNlL2xvYWRfZmxhZ3NfbGlzdC5oCisrKyBiL25ldC9iYXNlL2xvYWRfZmxhZ3NfbGlzdC5oCkBAIC03OSwyMiArNzksMTcgQEAKIC8vIHJlcXVlc3QuIE92ZXJyaWRlcyBzb2NrZXQgbGltaXRzLiBNdXN0IGFsd2F5cyBiZSB1c2VkIHdpdGggTUFYSU1VTV9QUklPUklUWS4KIExPQURfRkxBRyhJR05PUkVfTElNSVRTLCAxIDw8IDEyKQogCi0vLyBJbmRpY2F0ZXMgdGhhdCB0aGUgb3BlcmF0aW9uIGlzIHNvbWV3aGF0IGxpa2VseSB0byBiZSBkdWUgdG8gYW4KLS8vIGV4cGxpY2l0IHVzZXIgYWN0aW9uLiBUaGlzIGNhbiBiZSB1c2VkIGFzIGEgaGludCB0byB0cmVhdCB0aGUKLS8vIHJlcXVlc3Qgd2l0aCBoaWdoZXIgcHJpb3JpdHkuCi1MT0FEX0ZMQUcoTUFZQkVfVVNFUl9HRVNUVVJFLCAxIDw8IDEzKQotCiAvLyBJbmRpY2F0ZXMgdGhhdCB0aGUgdXNlcm5hbWU6cGFzc3dvcmQgcG9ydGlvbiBvZiB0aGUgVVJMIHNob3VsZCBub3QKIC8vIGJlIGhvbm9yZWQsIGJ1dCB0aGF0IG90aGVyIGZvcm1zIG9mIGF1dGhvcml0eSBtYXkgYmUgdXNlZC4KLUxPQURfRkxBRyhET19OT1RfVVNFX0VNQkVEREVEX0lERU5USVRZLCAxIDw8IDE0KQorTE9BRF9GTEFHKERPX05PVF9VU0VfRU1CRURERURfSURFTlRJVFksIDEgPDwgMTMpCiAKIC8vIEluZGljYXRlcyB0aGF0IHRoaXMgcmVxdWVzdCBpcyBub3QgdG8gYmUgbWlncmF0ZWQgdG8gYSBjZWxsdWxhciBuZXR3b3JrIHdoZW4KIC8vIFFVSUMgY29ubmVjdGlvbiBtaWdyYXRpb24gaXMgZW5hYmxlZC4KLUxPQURfRkxBRyhESVNBQkxFX0NPTk5FQ1RJT05fTUlHUkFUSU9OX1RPX0NFTExVTEFSLCAxIDw8IDE1KQorTE9BRF9GTEFHKERJU0FCTEVfQ09OTkVDVElPTl9NSUdSQVRJT05fVE9fQ0VMTFVMQVIsIDEgPDwgMTQpCiAKIC8vIEluZGljYXRlcyB0aGF0IHRoZSBjYWNoZSBzaG91bGQgbm90IGNoZWNrIHRoYXQgdGhlIHJlcXVlc3QgbWF0Y2hlcyB0aGUKIC8vIHJlc3BvbnNlJ3MgdmFyeSBoZWFkZXIuCi1MT0FEX0ZMQUcoU0tJUF9WQVJZX0NIRUNLLCAxIDw8IDE2KQorTE9BRF9GTEFHKFNLSVBfVkFSWV9DSEVDSywgMSA8PCAxNSkKIAogLy8gVGhlIGNyZWF0b3Igb2YgdGhpcyBVUkxSZXF1ZXN0IHdpc2hlcyB0byByZWNlaXZlIHN0YWxlIHJlc3BvbnNlcyB3aGVuIGFsbG93ZWQKIC8vIGJ5IHRoZSAiQ2FjaGUtQ29udHJvbDogc3RhbGUtd2hpbGUtcmV2YWxpZGF0ZSIgZGlyZWN0aXZlIGFuZCBpcyBhYmxlIHRvIGlzc3VlCkBAIC0xMDQsMTYgKzk5LDE2IEBACiAvLyByZXNvdXJjZSBieSBpc3N1aW5nIGEgbmV3IHJlcXVlc3Qgd2l0aG91dCB0aGlzIGZsYWcgc2V0LiBJZiB0aGUgcmV2YWxpZGF0aW9uCiAvLyBkb2VzIG5vdCBjb21wbGV0ZSBpbiA2MCBzZWNvbmRzLCB0aGUgY2FjaGUgdHJlYXQgdGhlIHN0YWxlIHJlc291cmNlIGFzCiAvLyBpbnZhbGlkLCBhcyBpdCBkaWQgbm90IHNwZWNpZnkgc3RhbGUtd2hpbGUtcmV2YWxpZGF0ZS4KLUxPQURfRkxBRyhTVVBQT1JUX0FTWU5DX1JFVkFMSURBVElPTiwgMSA8PCAxNykKK0xPQURfRkxBRyhTVVBQT1JUX0FTWU5DX1JFVkFMSURBVElPTiwgMSA8PCAxNikKIAogLy8gSW5kaWNhdGVzIHRoYXQgYSBwcmVmZXRjaCByZXF1ZXN0J3MgY2FjaGVkIHJlc3BvbnNlIHNob3VsZCBiZSByZXN0cmljdGVkIGluCiAvLyBpbiB0ZXJtcyBvZiByZXVzZS4gVGhlIGNhY2hlZCByZXNwb25zZSBjYW4gb25seSBiZSByZXVzZWQgYnkgcmVxdWVzdHMgd2l0aAogLy8gdGhlIExPQURfQ0FOX1VTRV9SRVNUUklDVEVEX1BSRUZFVENIIGxvYWQgZmxhZy4KLUxPQURfRkxBRyhSRVNUUklDVEVEX1BSRUZFVENILCAxIDw8IDE4KQorTE9BRF9GTEFHKFJFU1RSSUNURURfUFJFRkVUQ0gsIDEgPDwgMTcpCiAKIC8vIFRoaXMgZmxhZyBtdXN0IGJlIHNldCBvbiByZXF1ZXN0cyB0aGF0IGFyZSBhbGxvd2VkIHRvIHJldXNlIGNhY2hlIGVudHJpZXMKIC8vIHRoYXQgYXJlIG1hcmtlZCBhcyBSRVNUUklDVEVEX1BSRUZFVENILiBSZXF1ZXN0cyB3aXRob3V0IHRoaXMgZmxhZyBjYW5ub3QKIC8vIHJldXNlIHJlc3RyaWN0ZWQgcHJlZmV0Y2ggcmVzcG9uc2VzIGluIHRoZSBjYWNoZS4gUmVzdHJpY3RlZCByZXNwb25zZSByZXVzZQogLy8gaXMgY29uc2lkZXJlZCBwcml2aWxlZ2VkLCBhbmQgdGhlcmVmb3JlIHRoaXMgZmxhZyBtdXN0IG9ubHkgYmUgc2V0IGZyb20gYQogLy8gdHJ1c3RlZCBwcm9jZXNzLgotTE9BRF9GTEFHKENBTl9VU0VfUkVTVFJJQ1RFRF9QUkVGRVRDSCwgMSA8PCAxOSkKK0xPQURfRkxBRyhDQU5fVVNFX1JFU1RSSUNURURfUFJFRkVUQ0gsIDEgPDwgMTgpCmRpZmYgLS1naXQgYS9uZXQvYmFzZS9uZXRfZXJyb3JzLmggYi9uZXQvYmFzZS9uZXRfZXJyb3JzLmgKaW5kZXggZjI0NTQwYS4uMjdkOGY2NiAxMDA2NDQKLS0tIGEvbmV0L2Jhc2UvbmV0X2Vycm9ycy5oCisrKyBiL25ldC9iYXNlL25ldF9lcnJvcnMuaApAQCAtMzgsNyArMzgsOCBAQAogTkVUX0VYUE9SVCBzdGQ6OnN0cmluZyBFeHRlbmRlZEVycm9yVG9TdHJpbmcoaW50IGVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4dGVuZGVkX2Vycm9yX2NvZGUpOwogCi0vLyBSZXR1cm5zIHRydWUgaWYgfGVycm9yfCBpcyBhIGNlcnRpZmljYXRlIGVycm9yIGNvZGUuCisvLyBSZXR1cm5zIHRydWUgaWYgfGVycm9yfCBpcyBhIGNlcnRpZmljYXRlIGVycm9yIGNvZGUuIE5vdGUgdGhpcyBkb2VzIG5vdAorLy8gaW5jbHVkZSBlcnJvcnMgZm9yIGNsaWVudCBjZXJ0aWZpY2F0ZXMuCiBORVRfRVhQT1JUIGJvb2wgSXNDZXJ0aWZpY2F0ZUVycm9yKGludCBlcnJvcik7CiAKIC8vIFJldHVybnMgdHJ1ZSBpZiB8ZXJyb3J8IGlzIGEgY2xpZW50IGNlcnRpZmljYXRlIGF1dGhlbnRpY2F0aW9uIGVycm9yLiBUaGlzCmRpZmYgLS1naXQgYS9uZXQvYmFzZS9uZXRfZXJyb3JzX3VuaXR0ZXN0LmNjIGIvbmV0L2Jhc2UvbmV0X2Vycm9yc191bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDllMmY3Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2Jhc2UvbmV0X2Vycm9yc191bml0dGVzdC5jYwpAQCAtMCwwICsxLDc5IEBACisvLyBDb3B5cmlnaHQgMjAxOSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJuZXQvYmFzZS9uZXRfZXJyb3JzLmgiCisKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIG5ldCB7CisKK25hbWVzcGFjZSB7CisKK1RFU1QoTmV0RXJyb3JzVGVzdCwgSXNDZXJ0aWZpY2F0ZUVycm9yKSB7CisgIC8vIFBvc2l0aXZlIHRlc3RzLgorICBFWFBFQ1RfVFJVRShJc0NlcnRpZmljYXRlRXJyb3IoRVJSX0NFUlRfQVVUSE9SSVRZX0lOVkFMSUQpKTsKKyAgRVhQRUNUX1RSVUUoSXNDZXJ0aWZpY2F0ZUVycm9yKEVSUl9DRVJUX0NPTU1PTl9OQU1FX0lOVkFMSUQpKTsKKyAgRVhQRUNUX1RSVUUoSXNDZXJ0aWZpY2F0ZUVycm9yKEVSUl9DRVJUX0NPTlRBSU5TX0VSUk9SUykpOworICBFWFBFQ1RfVFJVRShJc0NlcnRpZmljYXRlRXJyb3IoRVJSX0NFUlRfREFURV9JTlZBTElEKSk7CisgIEVYUEVDVF9UUlVFKElzQ2VydGlmaWNhdGVFcnJvcihFUlJfQ0VSVElGSUNBVEVfVFJBTlNQQVJFTkNZX1JFUVVJUkVEKSk7CisgIEVYUEVDVF9UUlVFKElzQ2VydGlmaWNhdGVFcnJvcihFUlJfQ0VSVF9JTlZBTElEKSk7CisgIEVYUEVDVF9UUlVFKElzQ2VydGlmaWNhdGVFcnJvcihFUlJfQ0VSVF9OQU1FX0NPTlNUUkFJTlRfVklPTEFUSU9OKSk7CisgIEVYUEVDVF9UUlVFKElzQ2VydGlmaWNhdGVFcnJvcihFUlJfQ0VSVF9OT05fVU5JUVVFX05BTUUpKTsKKyAgRVhQRUNUX1RSVUUoSXNDZXJ0aWZpY2F0ZUVycm9yKEVSUl9DRVJUX05PX1JFVk9DQVRJT05fTUVDSEFOSVNNKSk7CisgIEVYUEVDVF9UUlVFKElzQ2VydGlmaWNhdGVFcnJvcihFUlJfQ0VSVF9SRVZPS0VEKSk7CisgIEVYUEVDVF9UUlVFKElzQ2VydGlmaWNhdGVFcnJvcihFUlJfQ0VSVF9TWU1BTlRFQ19MRUdBQ1kpKTsKKyAgRVhQRUNUX1RSVUUoSXNDZXJ0aWZpY2F0ZUVycm9yKEVSUl9DRVJUX1VOQUJMRV9UT19DSEVDS19SRVZPQ0FUSU9OKSk7CisgIEVYUEVDVF9UUlVFKElzQ2VydGlmaWNhdGVFcnJvcihFUlJfQ0VSVF9WQUxJRElUWV9UT09fTE9ORykpOworICBFWFBFQ1RfVFJVRShJc0NlcnRpZmljYXRlRXJyb3IoRVJSX0NFUlRfV0VBS19LRVkpKTsKKyAgRVhQRUNUX1RSVUUoSXNDZXJ0aWZpY2F0ZUVycm9yKEVSUl9DRVJUX1dFQUtfU0lHTkFUVVJFX0FMR09SSVRITSkpOworICBFWFBFQ1RfVFJVRShJc0NlcnRpZmljYXRlRXJyb3IoRVJSX1NTTF9QSU5ORURfS0VZX05PVF9JTl9DRVJUX0NIQUlOKSk7CisKKyAgLy8gTmVnYXRpdmUgdGVzdHMuCisgIEVYUEVDVF9GQUxTRShJc0NlcnRpZmljYXRlRXJyb3IoRVJSX1NTTF9QUk9UT0NPTF9FUlJPUikpOworICBFWFBFQ1RfRkFMU0UoSXNDZXJ0aWZpY2F0ZUVycm9yKEVSUl9TU0xfS0VZX1VTQUdFX0lOQ09NUEFUSUJMRSkpOworICBFWFBFQ1RfRkFMU0UoCisgICAgICBJc0NlcnRpZmljYXRlRXJyb3IoRVJSX1NTTF9DTElFTlRfQVVUSF9QUklWQVRFX0tFWV9BQ0NFU1NfREVOSUVEKSk7CisgIEVYUEVDVF9GQUxTRShJc0NlcnRpZmljYXRlRXJyb3IoRVJSX1FVSUNfQ0VSVF9ST09UX05PVF9LTk9XTikpOworICBFWFBFQ1RfRkFMU0UoSXNDZXJ0aWZpY2F0ZUVycm9yKEVSUl9TU0xfQ0xJRU5UX0FVVEhfQ0VSVF9OT19QUklWQVRFX0tFWSkpOworICBFWFBFQ1RfRkFMU0UoSXNDZXJ0aWZpY2F0ZUVycm9yKEVSUl9GQUlMRUQpKTsKKyAgRVhQRUNUX0ZBTFNFKElzQ2VydGlmaWNhdGVFcnJvcihPSykpOworCisgIC8vIFRyaWdnZXIgYSBmYWlsdXJlIHdoZW5ldmVyIEVSUl9DRVJUX0VORCBpcyBjaGFuZ2VkLCBmb3JjaW5nIGRldmVsb3BlcnMgdG8KKyAgLy8gdXBkYXRlIHRoaXMgdGVzdC4KKyAgRVhQRUNUX0VRKEVSUl9DRVJUX0VORCwgLTIxNykKKyAgICAgIDw8ICJJdCBsb29rcyBsaWtlIHlvdSBhZGRlZCBhIG5ldyBjZXJ0aWZpY2F0ZSBlcnJvciBjb2RlICgiCisgICAgICA8PCBFcnJvclRvU3RyaW5nKEVSUl9DRVJUX0VORCArIDEpCisgICAgICA8PCAiKS5cbiIKKyAgICAgICAgICJcbiIKKyAgICAgICAgICJCZWNhdXNlIHRoaXMgY29kZSBpcyBiZXR3ZWVuIEVSUl9DRVJUX0JFR0lOIGFuZCBFUlJfQ0VSVF9FTkQsIGl0ICIKKyAgICAgICAgICJ3aWxsIGJlIG1hdGNoZWQgYnkgbmV0OjpJc0NlcnRpZmljYXRlRXJyb3IoKS5cbiIKKyAgICAgICAgICJcbiIKKyAgICAgICAgICIgKDEpIFBsZWFzZSBhZGQgYSBuZXcgdGVzdCBjYXNlIHRvICIKKyAgICAgICAgICJOZXRFcnJvcnNUZXN0LklzQ2VydGlmaWNhdGVFcnJvcigpLiIKKyAgICAgICAgICJcbiIKKyAgICAgICAgICIgKDIpIFJldmlldyB0aGUgZXhpc3RpbmcgY29uc3VtZXJzIG9mIElzQ2VydGlmaWNhdGVFcnJvcigpLiAiCisgICAgICAgICAiLy9jb250ZW50IGZvciBpbnN0YW5jZSBoYXMgc3BlY2lhbGl6ZWQgaGFuZGxpbmcgb2YgIgorICAgICAgICAgIklzQ2VydGlmaWNhdGVFcnJvcigpIHRoYXQgbWF5IG5lZWQgdG8gYmUgdXBkYXRlZC4iOworfQorCitURVNUKE5ldEVycm9yc1Rlc3QsIElzQ2xpZW50Q2VydGlmaWNhdGVFcnJvcikgeworICAvLyBQb3NpdGl2ZSB0ZXN0cy4KKyAgRVhQRUNUX1RSVUUoSXNDbGllbnRDZXJ0aWZpY2F0ZUVycm9yKEVSUl9CQURfU1NMX0NMSUVOVF9BVVRIX0NFUlQpKTsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBJc0NsaWVudENlcnRpZmljYXRlRXJyb3IoRVJSX1NTTF9DTElFTlRfQVVUSF9QUklWQVRFX0tFWV9BQ0NFU1NfREVOSUVEKSk7CisgIEVYUEVDVF9UUlVFKAorICAgICAgSXNDbGllbnRDZXJ0aWZpY2F0ZUVycm9yKEVSUl9TU0xfQ0xJRU5UX0FVVEhfQ0VSVF9OT19QUklWQVRFX0tFWSkpOworICBFWFBFQ1RfVFJVRShJc0NsaWVudENlcnRpZmljYXRlRXJyb3IoRVJSX1NTTF9DTElFTlRfQVVUSF9TSUdOQVRVUkVfRkFJTEVEKSk7CisgIEVYUEVDVF9UUlVFKAorICAgICAgSXNDbGllbnRDZXJ0aWZpY2F0ZUVycm9yKEVSUl9TU0xfQ0xJRU5UX0FVVEhfTk9fQ09NTU9OX0FMR09SSVRITVMpKTsKKworICAvLyBOZWdhdGl2ZSB0ZXN0cy4KKyAgRVhQRUNUX0ZBTFNFKElzQ2xpZW50Q2VydGlmaWNhdGVFcnJvcihFUlJfQ0VSVF9SRVZPS0VEKSk7CisgIEVYUEVDVF9GQUxTRShJc0NsaWVudENlcnRpZmljYXRlRXJyb3IoRVJSX1NTTF9QUk9UT0NPTF9FUlJPUikpOworICBFWFBFQ1RfRkFMU0UoSXNDbGllbnRDZXJ0aWZpY2F0ZUVycm9yKEVSUl9DRVJUX1dFQUtfS0VZKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCit9ICAvLyBuYW1lc3BhY2UgbmV0CmRpZmYgLS1naXQgYS9uZXQvY2VydC9jZXJ0X3ZlcmlmeV9wcm9jX2Jsb2NrbGlzdC5pbmMgYi9uZXQvY2VydC9jZXJ0X3ZlcmlmeV9wcm9jX2Jsb2NrbGlzdC5pbmMKaW5kZXggMGRmOGFhYS4uYjRhYmU4OSAxMDA2NDQKLS0tIGEvbmV0L2NlcnQvY2VydF92ZXJpZnlfcHJvY19ibG9ja2xpc3QuaW5jCisrKyBiL25ldC9jZXJ0L2NlcnRfdmVyaWZ5X3Byb2NfYmxvY2tsaXN0LmluYwpAQCAtMTY5LDEwICsxNjksNiBAQAogICAgICAgICB7MHg5YiwgMHg4YSwgMHg5MywgMHhkZSwgMHhjYywgMHhjZiwgMHhiYSwgMHhmYywgMHhmNCwgMHhkMCwgMHg0ZCwKICAgICAgICAgIDB4MzQsIDB4NDIsIDB4MTIsIDB4OGYsIDB4YjMsIDB4NTIsIDB4MTgsIDB4Y2YsIDB4ZTQsIDB4MzcsIDB4YTMsCiAgICAgICAgICAweGQ4LCAweGQwLCAweDMyLCAweDhjLCAweDk5LCAweGY4LCAweDkwLCAweDg5LCAweGU0LCAweDUwfSwKLSAgICAgICAgLy8gMmUwZjY2YTlmOWU3NjRjMzMwMDg0ODIwNThmZTBkOTJmYzBlYzBiMTIyZmJlOTk0ZWQ3YmY2NDYzNjY4Y2RkNC5wZW0KLSAgICAgICAgezB4OWMsIDB4MzUsIDB4NzQsIDB4N2MsIDB4M2EsIDB4NTMsIDB4NWMsIDB4ZjIsIDB4MTMsIDB4YjEsIDB4NDcsCi0gICAgICAgICAweDRlLCAweGRiLCAweDM5LCAweDc3LCAweGYxLCAweDM4LCAweDI0LCAweDBkLCAweDZkLCAweGMxLCAweGNlLAotICAgICAgICAgMHhjZCwgMHhlZSwgMHg3NCwgMHgxMSwgMHhhOCwgMHhmMSwgMHgyNSwgMHg1MywgMHhiMSwgMHgzZX0sCiAgICAgICAgIC8vIDgyNTNkYTY3MzhiNjBjNWMwYmIxMzljNzhlMDQ1NDI4YTBjODQxMjcyYWJkY2I5NTJmOTVmZjA1ZWQxYWI0NzYucGVtCiAgICAgICAgIHsweDljLCAweDU5LCAweGEzLCAweGNjLCAweGFlLCAweGE0LCAweDY5LCAweDk4LCAweDQyLCAweGIwLCAweDY4LAogICAgICAgICAgMHhjZiwgMHhjNSwgMHgyYywgMHhmOSwgMHg0NSwgMHhkYiwgMHg1MSwgMHg5OCwgMHg2OSwgMHg1NywgMHhjOCwKQEAgLTMxOSw0ICszMTUsOCBAQAogICAgICAgICB7MHhmYywgMHhkNywgMHg2YywgMHhjYSwgMHgyMywgMHg0NywgMHhlNSwgMHhjZCwgMHg1YiwgMHgzOSwgMHgzNCwKICAgICAgICAgIDB4N2YsIDB4NTEsIDB4Y2YsIDB4NDMsIDB4NjUsIDB4NGIsIDB4NjksIDB4YTIsIDB4YmYsIDB4YzksIDB4MDcsCiAgICAgICAgICAweDM2LCAweDcwLCAweGE2LCAweGJlLCAweDQ3LCAweGQ4LCAweDcwLCAweDFlLCAweDZlLCAweDBlfSwKKyAgICAgICAgLy8gYzY5MTBkMGJhOWVkZGY1OTMzMzQxNDlmZWRmZTg3Mzg1ZjM3YjYyNTM1NGJiNDM5NWMwYWUyYzhkZjQ4ZTE3Yy5wZW0KKyAgICAgICAgezB4YzYsIDB4OTEsIDB4MGQsIDB4MGIsIDB4YTksIDB4ZWQsIDB4ZGYsIDB4NTksIDB4MzMsIDB4MzQsIDB4MTQsCisgICAgICAgICAweDlmLCAweGVkLCAweGZlLCAweDg3LCAweDM4LCAweDVmLCAweDM3LCAweGI2LCAweDI1LCAweDM1LCAweDRiLAorICAgICAgICAgMHhiNCwgMHgzOSwgMHg1YywgMHgwYSwgMHhlMiwgMHhjOCwgMHhkZiwgMHg0OCwgMHhlMSwgMHg3Y30sCiB9OwpkaWZmIC0tZ2l0IGEvbmV0L2Nvb2tpZXMvY29va2llX2NvbnN0YW50cy5oIGIvbmV0L2Nvb2tpZXMvY29va2llX2NvbnN0YW50cy5oCmluZGV4IDgyNTcxMTQuLjZhNTg0NzAgMTAwNjQ0Ci0tLSBhL25ldC9jb29raWVzL2Nvb2tpZV9jb25zdGFudHMuaAorKysgYi9uZXQvY29va2llcy9jb29raWVfY29uc3RhbnRzLmgKQEAgLTcwLDEzICs3MCwxMCBAQAogICBrTWF4VmFsdWUgPSBrRXh0ZW5kZWQKIH07CiAKLS8vIFdoYXQgcnVsZXMgdG8gYXBwbHkgd2hlbiBkZXRlcm1pbmluZyB3aGVuIHdoZXRoZXIgYWNjZXNzIHRvIGEgcGFydGljdWxhcgotLy8gY29va2llIGlzIGFsbG93ZWQuCi0vLyBUT0RPKGNyYnVnLmNvbS85NzgxNzIpOiBNYWNoaW5lcnkgdG8gcmVhZCB0aGUgY29udGVudCBzZXR0aW5nIGFuZCBzZXQgdGhlCi0vLyBhcHByb3ByaWF0ZSBDb29raWVBY2Nlc3NTZW1hbnRpY3Mgb24gdGhlIGNvb2tpZSAod2lsbCBiZSBhZGRlZCBhcyBhIG5ldwotLy8gbWV0YWRhdGEgZmllbGQgb2YgQ2Fub25pY2FsQ29va2llKS4KKy8vIFdoYXQgcnVsZXMgdG8gYXBwbHkgd2hlbiBkZXRlcm1pbmluZyB3aGV0aGVyIGFjY2VzcyB0byBhIHBhcnRpY3VsYXIgY29va2llIGlzCisvLyBhbGxvd2VkLgogZW51bSBjbGFzcyBDb29raWVBY2Nlc3NTZW1hbnRpY3MgewotICAvLyBIYXMgbm90IGJlZW4gY2hlY2tlZCB5ZXQuCisgIC8vIEhhcyBub3QgYmVlbiBjaGVja2VkIHlldCBvciB0aGVyZSBpcyBubyB3YXkgdG8gY2hlY2suCiAgIFVOS05PV04gPSAtMSwKICAgLy8gSGFzIGJlZW4gY2hlY2tlZCBhbmQgdGhlIGNvb2tpZSBzaG91bGQgKm5vdCogYmUgc3ViamVjdCB0byBsZWdhY3kgYWNjZXNzCiAgIC8vIHJ1bGVzLgpkaWZmIC0tZ2l0IGEvbmV0L2Nvb2tpZXMvY29va2llX21vbnN0ZXIuY2MgYi9uZXQvY29va2llcy9jb29raWVfbW9uc3Rlci5jYwppbmRleCA4MWI2Mzk1YS4uZTMxNzEwMiAxMDA2NDQKLS0tIGEvbmV0L2Nvb2tpZXMvY29va2llX21vbnN0ZXIuY2MKKysrIGIvbmV0L2Nvb2tpZXMvY29va2llX21vbnN0ZXIuY2MKQEAgLTM4Nyw3ICszODcsNyBAQAogdm9pZCBDb29raWVNb25zdGVyOjpTZXRBbGxDb29raWVzQXN5bmMoY29uc3QgQ29va2llTGlzdCYgbGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldENvb2tpZXNDYWxsYmFjayBjYWxsYmFjaykgewogICBEb0Nvb2tpZUNhbGxiYWNrKGJhc2U6OkJpbmRPbmNlKAotICAgICAgLy8gYmFzZTo6VW5yZXRhaW5lZCBpcyBzYWZlIGFzIERvQ29va2llQ2FsbGJhY2tGb3JVUkwgc3RvcmVzCisgICAgICAvLyBiYXNlOjpVbnJldGFpbmVkIGlzIHNhZmUgYXMgRG9Db29raWVDYWxsYmFjayBzdG9yZXMKICAgICAgIC8vIHRoZSBjYWxsYmFjayBvbiB8KnRoaXN8LCBzbyB0aGUgY2FsbGJhY2sgd2lsbCBub3Qgb3V0bGl2ZQogICAgICAgLy8gdGhlIG9iamVjdC4KICAgICAgICZDb29raWVNb25zdGVyOjpTZXRBbGxDb29raWVzLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpLCBsaXN0LApAQCAtNDA0LDcgKzQwNCw3IEBACiAgIHN0ZDo6c3RyaW5nIGRvbWFpbiA9IGNvb2tpZS0+RG9tYWluKCk7CiAgIERvQ29va2llQ2FsbGJhY2tGb3JIb3N0T3JEb21haW4oCiAgICAgICBiYXNlOjpCaW5kT25jZSgKLSAgICAgICAgICAvLyBiYXNlOjpVbnJldGFpbmVkIGlzIHNhZmUgYXMgRG9Db29raWVDYWxsYmFja0ZvclVSTCBzdG9yZXMKKyAgICAgICAgICAvLyBiYXNlOjpVbnJldGFpbmVkIGlzIHNhZmUgYXMgRG9Db29raWVDYWxsYmFja0Zvckhvc3RPckRvbWFpbiBzdG9yZXMKICAgICAgICAgICAvLyB0aGUgY2FsbGJhY2sgb24gfCp0aGlzfCwgc28gdGhlIGNhbGxiYWNrIHdpbGwgbm90IG91dGxpdmUKICAgICAgICAgICAvLyB0aGUgb2JqZWN0LgogICAgICAgICAgICZDb29raWVNb25zdGVyOjpTZXRDYW5vbmljYWxDb29raWUsIGJhc2U6OlVucmV0YWluZWQodGhpcyksCkBAIC00MjksMTcgKzQyOSwyOCBAQAogCiB2b2lkIENvb2tpZU1vbnN0ZXI6OkdldEFsbENvb2tpZXNBc3luYyhHZXRBbGxDb29raWVzQ2FsbGJhY2sgY2FsbGJhY2spIHsKICAgRG9Db29raWVDYWxsYmFjayhiYXNlOjpCaW5kT25jZSgKLSAgICAgIC8vIGJhc2U6OlVucmV0YWluZWQgaXMgc2FmZSBhcyBEb0Nvb2tpZUNhbGxiYWNrRm9yVVJMIHN0b3JlcworICAgICAgLy8gYmFzZTo6VW5yZXRhaW5lZCBpcyBzYWZlIGFzIERvQ29va2llQ2FsbGJhY2sgc3RvcmVzCiAgICAgICAvLyB0aGUgY2FsbGJhY2sgb24gfCp0aGlzfCwgc28gdGhlIGNhbGxiYWNrIHdpbGwgbm90IG91dGxpdmUKICAgICAgIC8vIHRoZSBvYmplY3QuCiAgICAgICAmQ29va2llTW9uc3Rlcjo6R2V0QWxsQ29va2llcywgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSwKICAgICAgIHN0ZDo6bW92ZShjYWxsYmFjaykpKTsKIH0KIAordm9pZCBDb29raWVNb25zdGVyOjpHZXRBbGxDb29raWVzV2l0aEFjY2Vzc1NlbWFudGljc0FzeW5jKAorICAgIEdldEFsbENvb2tpZXNXaXRoQWNjZXNzU2VtYW50aWNzQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgRG9Db29raWVDYWxsYmFjayhiYXNlOjpCaW5kT25jZSgKKyAgICAgIC8vIGJhc2U6OlVucmV0YWluZWQgaXMgc2FmZSBhcyBEb0Nvb2tpZUNhbGxiYWNrIHN0b3JlcworICAgICAgLy8gdGhlIGNhbGxiYWNrIG9uIHwqdGhpc3wsIHNvIHRoZSBjYWxsYmFjayB3aWxsIG5vdCBvdXRsaXZlCisgICAgICAvLyB0aGUgb2JqZWN0LgorICAgICAgJkNvb2tpZU1vbnN0ZXI6OkdldEFsbENvb2tpZXMsIGJhc2U6OlVucmV0YWluZWQodGhpcyksCisgICAgICBiYXNlOjpCaW5kT25jZSgmQ29va2llTW9uc3Rlcjo6QXR0YWNoQWNjZXNzU2VtYW50aWNzTGlzdEZvckNvb2tpZUxpc3QsCisgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpLCBzdGQ6Om1vdmUoY2FsbGJhY2spKSkpOworfQorCiB2b2lkIENvb2tpZU1vbnN0ZXI6OkRlbGV0ZUNhbm9uaWNhbENvb2tpZUFzeW5jKGNvbnN0IENhbm9uaWNhbENvb2tpZSYgY29va2llLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWxldGVDYWxsYmFjayBjYWxsYmFjaykgewogICBEb0Nvb2tpZUNhbGxiYWNrKGJhc2U6OkJpbmRPbmNlKAotICAgICAgLy8gYmFzZTo6VW5yZXRhaW5lZCBpcyBzYWZlIGFzIERvQ29va2llQ2FsbGJhY2tGb3JVUkwgc3RvcmVzCisgICAgICAvLyBiYXNlOjpVbnJldGFpbmVkIGlzIHNhZmUgYXMgRG9Db29raWVDYWxsYmFjayBzdG9yZXMKICAgICAgIC8vIHRoZSBjYWxsYmFjayBvbiB8KnRoaXN8LCBzbyB0aGUgY2FsbGJhY2sgd2lsbCBub3Qgb3V0bGl2ZQogICAgICAgLy8gdGhlIG9iamVjdC4KICAgICAgICZDb29raWVNb25zdGVyOjpEZWxldGVDYW5vbmljYWxDb29raWUsIGJhc2U6OlVucmV0YWluZWQodGhpcyksIGNvb2tpZSwKQEAgLTQ1MCw3ICs0NjEsNyBAQAogICAgIGNvbnN0IFRpbWVSYW5nZSYgY3JlYXRpb25fcmFuZ2UsCiAgICAgRGVsZXRlQ2FsbGJhY2sgY2FsbGJhY2spIHsKICAgRG9Db29raWVDYWxsYmFjayhiYXNlOjpCaW5kT25jZSgKLSAgICAgIC8vIGJhc2U6OlVucmV0YWluZWQgaXMgc2FmZSBhcyBEb0Nvb2tpZUNhbGxiYWNrRm9yVVJMIHN0b3JlcworICAgICAgLy8gYmFzZTo6VW5yZXRhaW5lZCBpcyBzYWZlIGFzIERvQ29va2llQ2FsbGJhY2sgc3RvcmVzCiAgICAgICAvLyB0aGUgY2FsbGJhY2sgb24gfCp0aGlzfCwgc28gdGhlIGNhbGxiYWNrIHdpbGwgbm90IG91dGxpdmUKICAgICAgIC8vIHRoZSBvYmplY3QuCiAgICAgICAmQ29va2llTW9uc3Rlcjo6RGVsZXRlQWxsQ3JlYXRlZEluVGltZVJhbmdlLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpLApAQCAtNDYwLDcgKzQ3MSw3IEBACiB2b2lkIENvb2tpZU1vbnN0ZXI6OkRlbGV0ZUFsbE1hdGNoaW5nSW5mb0FzeW5jKENvb2tpZURlbGV0aW9uSW5mbyBkZWxldGVfaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRlQ2FsbGJhY2sgY2FsbGJhY2spIHsKICAgRG9Db29raWVDYWxsYmFjayhiYXNlOjpCaW5kT25jZSgKLSAgICAgIC8vIGJhc2U6OlVucmV0YWluZWQgaXMgc2FmZSBhcyBEb0Nvb2tpZUNhbGxiYWNrRm9yVVJMIHN0b3JlcworICAgICAgLy8gYmFzZTo6VW5yZXRhaW5lZCBpcyBzYWZlIGFzIERvQ29va2llQ2FsbGJhY2sgc3RvcmVzCiAgICAgICAvLyB0aGUgY2FsbGJhY2sgb24gfCp0aGlzfCwgc28gdGhlIGNhbGxiYWNrIHdpbGwgbm90IG91dGxpdmUKICAgICAgIC8vIHRoZSBvYmplY3QuCiAgICAgICAmQ29va2llTW9uc3Rlcjo6RGVsZXRlQWxsTWF0Y2hpbmdJbmZvLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpLApAQCAtNDcwLDcgKzQ4MSw3IEBACiB2b2lkIENvb2tpZU1vbnN0ZXI6OkRlbGV0ZVNlc3Npb25Db29raWVzQXN5bmMoCiAgICAgQ29va2llU3RvcmU6OkRlbGV0ZUNhbGxiYWNrIGNhbGxiYWNrKSB7CiAgIERvQ29va2llQ2FsbGJhY2soYmFzZTo6QmluZE9uY2UoCi0gICAgICAvLyBiYXNlOjpVbnJldGFpbmVkIGlzIHNhZmUgYXMgRG9Db29raWVDYWxsYmFja0ZvclVSTCBzdG9yZXMKKyAgICAgIC8vIGJhc2U6OlVucmV0YWluZWQgaXMgc2FmZSBhcyBEb0Nvb2tpZUNhbGxiYWNrIHN0b3JlcwogICAgICAgLy8gdGhlIGNhbGxiYWNrIG9uIHwqdGhpc3wsIHNvIHRoZSBjYWxsYmFjayB3aWxsIG5vdCBvdXRsaXZlCiAgICAgICAvLyB0aGUgb2JqZWN0LgogICAgICAgJkNvb2tpZU1vbnN0ZXI6OkRlbGV0ZVNlc3Npb25Db29raWVzLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpLApAQCAtNTg4LDYgKzU5OSwxNyBAQAogICBNYXliZVJ1bkNvb2tpZUNhbGxiYWNrKHN0ZDo6bW92ZShjYWxsYmFjayksIGNvb2tpZV9saXN0KTsKIH0KIAordm9pZCBDb29raWVNb25zdGVyOjpBdHRhY2hBY2Nlc3NTZW1hbnRpY3NMaXN0Rm9yQ29va2llTGlzdCgKKyAgICBHZXRBbGxDb29raWVzV2l0aEFjY2Vzc1NlbWFudGljc0NhbGxiYWNrIGNhbGxiYWNrLAorICAgIGNvbnN0IENvb2tpZUxpc3QmIGNvb2tpZV9saXN0KSB7CisgIHN0ZDo6dmVjdG9yPENvb2tpZUFjY2Vzc1NlbWFudGljcz4gYWNjZXNzX3NlbWFudGljc19saXN0OworICBmb3IgKGNvbnN0IENhbm9uaWNhbENvb2tpZSYgY29va2llIDogY29va2llX2xpc3QpIHsKKyAgICBhY2Nlc3Nfc2VtYW50aWNzX2xpc3QucHVzaF9iYWNrKEdldEFjY2Vzc1NlbWFudGljc0ZvckNvb2tpZShjb29raWUpKTsKKyAgfQorICBNYXliZVJ1bkNvb2tpZUNhbGxiYWNrKHN0ZDo6bW92ZShjYWxsYmFjayksIGNvb2tpZV9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc19zZW1hbnRpY3NfbGlzdCk7Cit9CisKIHZvaWQgQ29va2llTW9uc3Rlcjo6R2V0Q29va2llTGlzdFdpdGhPcHRpb25zKGNvbnN0IEdVUkwmIHVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvb2tpZU9wdGlvbnMmIG9wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRDb29raWVMaXN0Q2FsbGJhY2sgY2FsbGJhY2spIHsKZGlmZiAtLWdpdCBhL25ldC9jb29raWVzL2Nvb2tpZV9tb25zdGVyLmggYi9uZXQvY29va2llcy9jb29raWVfbW9uc3Rlci5oCmluZGV4IGRlMzZkNzkuLjY2YWQyNzBiIDEwMDY0NAotLS0gYS9uZXQvY29va2llcy9jb29raWVfbW9uc3Rlci5oCisrKyBiL25ldC9jb29raWVzL2Nvb2tpZV9tb25zdGVyLmgKQEAgLTE2NSw2ICsxNjUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvb2tpZU9wdGlvbnMmIG9wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Q29va2llTGlzdENhbGxiYWNrIGNhbGxiYWNrKSBvdmVycmlkZTsKICAgdm9pZCBHZXRBbGxDb29raWVzQXN5bmMoR2V0QWxsQ29va2llc0NhbGxiYWNrIGNhbGxiYWNrKSBvdmVycmlkZTsKKyAgdm9pZCBHZXRBbGxDb29raWVzV2l0aEFjY2Vzc1NlbWFudGljc0FzeW5jKAorICAgICAgR2V0QWxsQ29va2llc1dpdGhBY2Nlc3NTZW1hbnRpY3NDYWxsYmFjayBjYWxsYmFjaykgb3ZlcnJpZGU7CiAgIHZvaWQgRGVsZXRlQ2Fub25pY2FsQ29va2llQXN5bmMoY29uc3QgQ2Fub25pY2FsQ29va2llJiBjb29raWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRlQ2FsbGJhY2sgY2FsbGJhY2spIG92ZXJyaWRlOwogICB2b2lkIERlbGV0ZUFsbENyZWF0ZWRJblRpbWVSYW5nZUFzeW5jKApAQCAtMzU0LDYgKzM1NiwxMCBAQAogCiAgIHZvaWQgR2V0QWxsQ29va2llcyhHZXRBbGxDb29raWVzQ2FsbGJhY2sgY2FsbGJhY2spOwogCisgIHZvaWQgQXR0YWNoQWNjZXNzU2VtYW50aWNzTGlzdEZvckNvb2tpZUxpc3QoCisgICAgICBHZXRBbGxDb29raWVzV2l0aEFjY2Vzc1NlbWFudGljc0NhbGxiYWNrIGNhbGxiYWNrLAorICAgICAgY29uc3QgQ29va2llTGlzdCYgY29va2llX2xpc3QpOworCiAgIHZvaWQgR2V0Q29va2llTGlzdFdpdGhPcHRpb25zKGNvbnN0IEdVUkwmIHVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29va2llT3B0aW9ucyYgb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Q29va2llTGlzdENhbGxiYWNrIGNhbGxiYWNrKTsKZGlmZiAtLWdpdCBhL25ldC9jb29raWVzL2Nvb2tpZV9tb25zdGVyX3VuaXR0ZXN0LmNjIGIvbmV0L2Nvb2tpZXMvY29va2llX21vbnN0ZXJfdW5pdHRlc3QuY2MKaW5kZXggNjkwOGJiZDk0MzguLmRiODY2NzggMTAwNjQ0Ci0tLSBhL25ldC9jb29raWVzL2Nvb2tpZV9tb25zdGVyX3VuaXR0ZXN0LmNjCisrKyBiL25ldC9jb29raWVzL2Nvb2tpZV9tb25zdGVyX3VuaXR0ZXN0LmNjCkBAIC05Miw2ICs5Miw3IEBACiAgIHN0YXRpYyBjb25zdCBib29sIGhhc19leGFjdF9jaGFuZ2VfY2F1c2UgPSB0cnVlOwogICBzdGF0aWMgY29uc3QgYm9vbCBoYXNfZXhhY3RfY2hhbmdlX29yZGVyaW5nID0gdHJ1ZTsKICAgc3RhdGljIGNvbnN0IGludCBjcmVhdGlvbl90aW1lX2dyYW51bGFyaXR5X2luX21zID0gMDsKKyAgc3RhdGljIGNvbnN0IGJvb2wgc3VwcG9ydHNfY29va2llX2FjY2Vzc19zZW1hbnRpY3MgPSB0cnVlOwogfTsKIAogSU5TVEFOVElBVEVfVFlQRURfVEVTVF9TVUlURV9QKENvb2tpZU1vbnN0ZXIsCmRpZmYgLS1naXQgYS9uZXQvY29va2llcy9jb29raWVfc3RvcmUuY2MgYi9uZXQvY29va2llcy9jb29raWVfc3RvcmUuY2MKaW5kZXggMDU1NmEwNy4uNmY3YjFjYSAxMDA2NDQKLS0tIGEvbmV0L2Nvb2tpZXMvY29va2llX3N0b3JlLmNjCisrKyBiL25ldC9jb29raWVzL2Nvb2tpZV9zdG9yZS5jYwpAQCAtMTMsNiArMTMsMjQgQEAKIAogQ29va2llU3RvcmU6On5Db29raWVTdG9yZSgpID0gZGVmYXVsdDsKIAorLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aGljaCByZXR1cm5zIGEgZGVmYXVsdCB2ZWN0b3Igb2YgVU5LTk9XTgorLy8gQ29va2llQWNjZXNzU2VtYW50aWNzLgordm9pZCBDb29raWVTdG9yZTo6R2V0QWxsQ29va2llc1dpdGhBY2Nlc3NTZW1hbnRpY3NBc3luYygKKyAgICBHZXRBbGxDb29raWVzV2l0aEFjY2Vzc1NlbWFudGljc0NhbGxiYWNrIGNhbGxiYWNrKSB7CisgIEdldEFsbENvb2tpZXNDYWxsYmFjayBhZGFwdGVkX2NhbGxiYWNrID0gYmFzZTo6QmluZE9uY2UoCisgICAgICBbXShDb29raWVTdG9yZTo6R2V0QWxsQ29va2llc1dpdGhBY2Nlc3NTZW1hbnRpY3NDYWxsYmFjaworICAgICAgICAgICAgIG9yaWdpbmFsX2NhbGxiYWNrLAorICAgICAgICAgY29uc3QgQ29va2llTGlzdCYgY29va2llcykgeworICAgICAgICBzdGQ6OnZlY3RvcjxDb29raWVBY2Nlc3NTZW1hbnRpY3M+IGRlZmF1bHRfYWNjZXNzX3NlbWFudGljc19saXN0OworICAgICAgICBkZWZhdWx0X2FjY2Vzc19zZW1hbnRpY3NfbGlzdC5hc3NpZ24oY29va2llcy5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb29raWVBY2Nlc3NTZW1hbnRpY3M6OlVOS05PV04pOworICAgICAgICBzdGQ6Om1vdmUob3JpZ2luYWxfY2FsbGJhY2spCisgICAgICAgICAgICAuUnVuKGNvb2tpZXMsIGRlZmF1bHRfYWNjZXNzX3NlbWFudGljc19saXN0KTsKKyAgICAgIH0sCisgICAgICBzdGQ6Om1vdmUoY2FsbGJhY2spKTsKKyAgR2V0QWxsQ29va2llc0FzeW5jKHN0ZDo6bW92ZShhZGFwdGVkX2NhbGxiYWNrKSk7Cit9CisKIHZvaWQgQ29va2llU3RvcmU6OkRlbGV0ZUFsbEFzeW5jKERlbGV0ZUNhbGxiYWNrIGNhbGxiYWNrKSB7CiAgIERlbGV0ZUFsbENyZWF0ZWRJblRpbWVSYW5nZUFzeW5jKENvb2tpZURlbGV0aW9uSW5mbzo6VGltZVJhbmdlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShjYWxsYmFjaykpOwpkaWZmIC0tZ2l0IGEvbmV0L2Nvb2tpZXMvY29va2llX3N0b3JlLmggYi9uZXQvY29va2llcy9jb29raWVfc3RvcmUuaAppbmRleCAxMDI0MjhmLi5lYmVjNWRmIDEwMDY0NAotLS0gYS9uZXQvY29va2llcy9jb29raWVfc3RvcmUuaAorKysgYi9uZXQvY29va2llcy9jb29raWVfc3RvcmUuaApAQCAtNDksNiArNDksMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvb2tpZVN0YXR1c0xpc3QmIGV4Y2x1ZGVkX2xpc3QpPjsKICAgdXNpbmcgR2V0QWxsQ29va2llc0NhbGxiYWNrID0KICAgICAgIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKGNvbnN0IENvb2tpZUxpc3QmIGNvb2tpZXMpPjsKKyAgLy8gfGFjY2Vzc19zZW1hbnRpY3NfbGlzdHwgaXMgZ3VhcmFudGVlZCB0byB0aGUgc2FtZSBsZW5ndGggYXMgfGNvb2tpZXN8LgorICB1c2luZyBHZXRBbGxDb29raWVzV2l0aEFjY2Vzc1NlbWFudGljc0NhbGxiYWNrID0gYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQoCisgICAgICBjb25zdCBDb29raWVMaXN0JiBjb29raWVzLAorICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q29va2llQWNjZXNzU2VtYW50aWNzPiYgYWNjZXNzX3NlbWFudGljc19saXN0KT47CiAgIHVzaW5nIFNldENvb2tpZXNDYWxsYmFjayA9CiAgICAgICBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZChDYW5vbmljYWxDb29raWU6OkNvb2tpZUluY2x1c2lvblN0YXR1cyBzdGF0dXMpPjsKICAgdXNpbmcgRGVsZXRlQ2FsbGJhY2sgPSBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZCh1aW50MzJfdCBudW1fZGVsZXRlZCk+OwpAQCAtODQsNiArODgsMTggQEAKICAgLy8gbG9uZ2VzdCBwYXRoLCB0aGVuIGJ5IGVhcmxpZXN0IGNyZWF0aW9uIGRhdGUuCiAgIHZpcnR1YWwgdm9pZCBHZXRBbGxDb29raWVzQXN5bmMoR2V0QWxsQ29va2llc0NhbGxiYWNrIGNhbGxiYWNrKSA9IDA7CiAKKyAgLy8gUmV0dXJucyBhbGwgdGhlIGNvb2tpZXMsIGZvciB1c2UgaW4gbWFuYWdlbWVudCBVSSwgZXRjLiBUaGlzIGRvZXMgbm90IG1hcmsKKyAgLy8gdGhlIGNvb2tpZXMgYXMgaGF2aW5nIGJlZW4gYWNjZXNzZWQuIFRoZSByZXR1cm5lZCBjb29raWVzIGFyZSBvcmRlcmVkIGJ5CisgIC8vIGxvbmdlc3QgcGF0aCwgdGhlbiBieSBlYXJsaWVzdCBjcmVhdGlvbiBkYXRlLgorICAvLyBBZGRpdGlvbmFsbHkgcmV0dXJucyBhIHZlY3RvciBvZiBDb29raWVBY2Nlc3NTZW1hbnRpY3MgdmFsdWVzIGZvciB0aGUKKyAgLy8gcmV0dXJuZWQgY29va2llcywgd2hpY2ggd2lsbCBiZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHZlY3RvciBvZiByZXR1cm5lZAorICAvLyBjb29raWVzLiBUaGlzIHZlY3RvciB3aWxsIGVpdGhlciBjb250YWluIGFsbCBDb29raWVBY2Nlc3NTZW1hbnRpY3M6OlVOS05PV04KKyAgLy8gKGlmIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIHVzZWQpLCBvciBlYWNoIGVudHJ5IGluIHRoZQorICAvLyB2ZWN0b3Igb2YgQ29va2llQWNjZXNzU2VtYW50aWNzIHdpbGwgaW5kaWNhdGUgdGhlIGFjY2VzcyBzZW1hbnRpY3MKKyAgLy8gYXBwbGljYWJsZSB0byB0aGUgY29va2llIGF0IHRoZSBzYW1lIGluZGV4IGluIHRoZSByZXR1cm5lZCBDb29raWVMaXN0LgorICB2aXJ0dWFsIHZvaWQgR2V0QWxsQ29va2llc1dpdGhBY2Nlc3NTZW1hbnRpY3NBc3luYygKKyAgICAgIEdldEFsbENvb2tpZXNXaXRoQWNjZXNzU2VtYW50aWNzQ2FsbGJhY2sgY2FsbGJhY2spOworCiAgIC8vIERlbGV0ZXMgb25lIHNwZWNpZmljIGNvb2tpZS4gfGNvb2tpZXwgbXVzdCBoYXZlIGJlZW4gcmV0dXJuZWQgYnkgYSBwcmV2aW91cwogICAvLyBxdWVyeSBvbiB0aGlzIENvb2tpZVN0b3JlLiBJbnZva2VzIHxjYWxsYmFja3wgd2l0aCAxIGlmIGEgY29va2llIHdhcwogICAvLyBkZWxldGVkLCAwIG90aGVyd2lzZS4KZGlmZiAtLWdpdCBhL25ldC9jb29raWVzL2Nvb2tpZV9zdG9yZV90ZXN0X2NhbGxiYWNrcy5jYyBiL25ldC9jb29raWVzL2Nvb2tpZV9zdG9yZV90ZXN0X2NhbGxiYWNrcy5jYwppbmRleCBkZmYyYWJlLi44N2FiM2FlZSAxMDA2NDQKLS0tIGEvbmV0L2Nvb2tpZXMvY29va2llX3N0b3JlX3Rlc3RfY2FsbGJhY2tzLmNjCisrKyBiL25ldC9jb29raWVzL2Nvb2tpZV9zdG9yZV90ZXN0X2NhbGxiYWNrcy5jYwpAQCAtODAsNCArODAsMjEgQEAKICAgQ2FsbGJhY2tFcGlsb2d1ZSgpOwogfQogCitHZXRBbGxDb29raWVzV2l0aEFjY2Vzc1NlbWFudGljc0NhbGxiYWNrOjoKKyAgICBHZXRBbGxDb29raWVzV2l0aEFjY2Vzc1NlbWFudGljc0NhbGxiYWNrKCkgPSBkZWZhdWx0OworR2V0QWxsQ29va2llc1dpdGhBY2Nlc3NTZW1hbnRpY3NDYWxsYmFjazo6CisgICAgR2V0QWxsQ29va2llc1dpdGhBY2Nlc3NTZW1hbnRpY3NDYWxsYmFjayhiYXNlOjpUaHJlYWQqIHJ1bl9pbl90aHJlYWQpCisgICAgOiBDb29raWVDYWxsYmFjayhydW5faW5fdGhyZWFkKSB7fQorCitHZXRBbGxDb29raWVzV2l0aEFjY2Vzc1NlbWFudGljc0NhbGxiYWNrOjoKKyAgICB+R2V0QWxsQ29va2llc1dpdGhBY2Nlc3NTZW1hbnRpY3NDYWxsYmFjaygpID0gZGVmYXVsdDsKKwordm9pZCBHZXRBbGxDb29raWVzV2l0aEFjY2Vzc1NlbWFudGljc0NhbGxiYWNrOjpSdW4oCisgICAgY29uc3QgQ29va2llTGlzdCYgY29va2llcywKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDb29raWVBY2Nlc3NTZW1hbnRpY3M+JiBhY2Nlc3Nfc2VtYW50aWNzX2xpc3QpIHsKKyAgY29va2llc18gPSBjb29raWVzOworICBhY2Nlc3Nfc2VtYW50aWNzX2xpc3RfID0gYWNjZXNzX3NlbWFudGljc19saXN0OworICBDYWxsYmFja0VwaWxvZ3VlKCk7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBuZXQKZGlmZiAtLWdpdCBhL25ldC9jb29raWVzL2Nvb2tpZV9zdG9yZV90ZXN0X2NhbGxiYWNrcy5oIGIvbmV0L2Nvb2tpZXMvY29va2llX3N0b3JlX3Rlc3RfY2FsbGJhY2tzLmgKaW5kZXggYWY3ZjZmMi4uNTRiMDBiNSAxMDA2NDQKLS0tIGEvbmV0L2Nvb2tpZXMvY29va2llX3N0b3JlX3Rlc3RfY2FsbGJhY2tzLmgKKysrIGIvbmV0L2Nvb2tpZXMvY29va2llX3N0b3JlX3Rlc3RfY2FsbGJhY2tzLmgKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlICJiYXNlL3J1bl9sb29wLmgiCiAjaW5jbHVkZSAiYmFzZS9zaW5nbGVfdGhyZWFkX3Rhc2tfcnVubmVyLmgiCiAjaW5jbHVkZSAibmV0L2Nvb2tpZXMvY2Fub25pY2FsX2Nvb2tpZS5oIgorI2luY2x1ZGUgIm5ldC9jb29raWVzL2Nvb2tpZV9jb25zdGFudHMuaCIKICNpbmNsdWRlICJuZXQvY29va2llcy9jb29raWVfc3RvcmUuaCIKIAogbmFtZXNwYWNlIGJhc2UgewpAQCAtMTUxLDYgKzE1MiwzNiBAQAogICBDb29raWVMaXN0IGNvb2tpZXNfOwogfTsKIAorY2xhc3MgR2V0QWxsQ29va2llc1dpdGhBY2Nlc3NTZW1hbnRpY3NDYWxsYmFjayA6IHB1YmxpYyBDb29raWVDYWxsYmFjayB7CisgcHVibGljOgorICBHZXRBbGxDb29raWVzV2l0aEFjY2Vzc1NlbWFudGljc0NhbGxiYWNrKCk7CisgIGV4cGxpY2l0IEdldEFsbENvb2tpZXNXaXRoQWNjZXNzU2VtYW50aWNzQ2FsbGJhY2soCisgICAgICBiYXNlOjpUaHJlYWQqIHJ1bl9pbl90aHJlYWQpOworCisgIH5HZXRBbGxDb29raWVzV2l0aEFjY2Vzc1NlbWFudGljc0NhbGxiYWNrKCk7CisKKyAgdm9pZCBSdW4oY29uc3QgQ29va2llTGlzdCYgY29va2llcywKKyAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q29va2llQWNjZXNzU2VtYW50aWNzPiYgYWNjZXNzX3NlbWFudGljc19saXN0KTsKKworICAvLyBNYWtlcyBhIGNhbGxiYWNrIHRoYXQgd2lsbCBpbnZva2UgUnVuLiBBc3N1bWVzIHRoYXQgfHRoaXN8IHdpbGwgYmUga2VwdAorICAvLyBhbGl2ZSB0aWxsIHRoZSB0aW1lIHRoZSBjYWxsYmFjayBpcyB1c2VkLgorICBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZChjb25zdCBDb29raWVMaXN0JiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q29va2llQWNjZXNzU2VtYW50aWNzPiYpPgorICBNYWtlQ2FsbGJhY2soKSB7CisgICAgcmV0dXJuIGJhc2U6OkJpbmRPbmNlKCZHZXRBbGxDb29raWVzV2l0aEFjY2Vzc1NlbWFudGljc0NhbGxiYWNrOjpSdW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpOworICB9CisKKyAgY29uc3QgQ29va2llTGlzdCYgY29va2llcygpIHsgcmV0dXJuIGNvb2tpZXNfOyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPENvb2tpZUFjY2Vzc1NlbWFudGljcz4mIGFjY2Vzc19zZW1hbnRpY3NfbGlzdCgpIHsKKyAgICByZXR1cm4gYWNjZXNzX3NlbWFudGljc19saXN0XzsKKyAgfQorCisgcHJpdmF0ZToKKyAgQ29va2llTGlzdCBjb29raWVzXzsKKyAgc3RkOjp2ZWN0b3I8Q29va2llQWNjZXNzU2VtYW50aWNzPiBhY2Nlc3Nfc2VtYW50aWNzX2xpc3RfOworfTsKKwogfSAgLy8gbmFtZXNwYWNlIG5ldAogCiAjZW5kaWYgIC8vIE5FVF9DT09LSUVTX0NPT0tJRV9TVE9SRV9URVNUX0NBTExCQUNLU19IXwpkaWZmIC0tZ2l0IGEvbmV0L2Nvb2tpZXMvY29va2llX3N0b3JlX3VuaXR0ZXN0LmggYi9uZXQvY29va2llcy9jb29raWVfc3RvcmVfdW5pdHRlc3QuaAppbmRleCA4ZmU2ODM5MjkuLmQ5MTAyNmIgMTAwNjQ0Ci0tLSBhL25ldC9jb29raWVzL2Nvb2tpZV9zdG9yZV91bml0dGVzdC5oCisrKyBiL25ldC9jb29raWVzL2Nvb2tpZV9zdG9yZV91bml0dGVzdC5oCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSAibmV0L2Nvb2tpZXMvY29va2llX3N0b3JlLmgiCiAjaW5jbHVkZSAibmV0L2Nvb2tpZXMvY29va2llX3N0b3JlX3Rlc3RfY2FsbGJhY2tzLmgiCiAjaW5jbHVkZSAibmV0L2Nvb2tpZXMvY29va2llX3N0b3JlX3Rlc3RfaGVscGVycy5oIgorI2luY2x1ZGUgIm5ldC9jb29raWVzL3Rlc3RfY29va2llX2FjY2Vzc19kZWxlZ2F0ZS5oIgogI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgogI2luY2x1ZGUgInVybC9ndXJsLmgiCiAKQEAgLTEwMSw2ICsxMDIsMTEgQEAKIC8vICAgLy8gVGltZSB0byB3YWl0IGJldHdlZW4gdHdvIGNvb2tpZSBpbnNlcnRpb25zIHRvIGVuc3VyZSB0aGF0IGNvb2tpZXMgaGF2ZQogLy8gICAvLyBkaWZmZXJlbnQgY3JlYXRpb24gdGltZXMuCiAvLyAgIHN0YXRpYyBjb25zdCBpbnQgY3JlYXRpb25fdGltZV9ncmFudWxhcml0eV9pbl9tczsKKy8vCisvLyAgIC8vIFRoZSBjb29raWUgc3RvcmUgc3VwcG9ydHMgc2V0dGluZyBhIENvb2tpZUFjY2Vzc0RlbGVnYXRlIGFuZCB1c2luZyBpdCB0bworLy8gICAvLyBnZXQgdGhlIGFjY2VzcyBzZW1hbnRpY3MgZm9yIGVhY2ggY29va2llIHZpYQorLy8gICAvLyBDb29raWVTdG9yZTo6R2V0QWxsQ29va2llc1dpdGhBY2Nlc3NTZW1hbnRpY3NBc3luYygpLgorLy8gICBzdGF0aWMgY29uc3QgYm9vbCBzdXBwb3J0c19jb29raWVfYWNjZXNzX3NlbWFudGljczsKIC8vIH07CiAKIHRlbXBsYXRlIDxjbGFzcyBDb29raWVTdG9yZVRlc3RUcmFpdHM+CkBAIC0xNjYxLDYgKzE2NjcsNTggQEAKICAgQVNTRVJUX1RSVUUoKytpdCA9PSBjb29raWVzLmVuZCgpKTsKIH0KIAorVFlQRURfVEVTVF9QKENvb2tpZVN0b3JlVGVzdCwgR2V0QWxsQ29va2llc1dpdGhBY2Nlc3NTZW1hbnRpY3NBc3luYykgeworICBDb29raWVTdG9yZSogY3MgPSB0aGlzLT5HZXRDb29raWVTdG9yZSgpOworICBhdXRvIGFjY2Vzc19kZWxlZ2F0ZSA9IHN0ZDo6bWFrZV91bmlxdWU8VGVzdENvb2tpZUFjY2Vzc0RlbGVnYXRlPigpOworICBUZXN0Q29va2llQWNjZXNzRGVsZWdhdGUqIHRlc3RfZGVsZWdhdGUgPSBhY2Nlc3NfZGVsZWdhdGUuZ2V0KCk7CisgIC8vIGlmICFzdXBwb3J0c19jb29raWVfYWNjZXNzX3NlbWFudGljcywgc2V0dGluZyBhIGRlbGVnYXRlIGhlcmUgd2lsbCBkbworICAvLyBub3RoaW5nLgorICBjcy0+U2V0Q29va2llQWNjZXNzRGVsZWdhdGUoc3RkOjptb3ZlKGFjY2Vzc19kZWxlZ2F0ZSkpOworCisgIHRlc3RfZGVsZWdhdGUtPlNldEV4cGVjdGF0aW9uRm9yQ29va2llRG9tYWluKCJkb21haW4xLnRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb29raWVBY2Nlc3NTZW1hbnRpY3M6OkxFR0FDWSk7CisgIHRlc3RfZGVsZWdhdGUtPlNldEV4cGVjdGF0aW9uRm9yQ29va2llRG9tYWluKAorICAgICAgImRvbWFpbjIudGVzdCIsIENvb2tpZUFjY2Vzc1NlbWFudGljczo6Tk9OTEVHQUNZKTsKKyAgdGVzdF9kZWxlZ2F0ZS0+U2V0RXhwZWN0YXRpb25Gb3JDb29raWVEb21haW4oImRvbWFpbjMudGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvb2tpZUFjY2Vzc1NlbWFudGljczo6VU5LTk9XTik7CisKKyAgdGhpcy0+Q3JlYXRlQW5kU2V0Q29va2llKGNzLCBHVVJMKCJodHRwOi8vZG9tYWluMS50ZXN0IiksICJjb29raWU9MSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDb29raWVPcHRpb25zOjpNYWtlQWxsSW5jbHVzaXZlKCkpOworICB0aGlzLT5DcmVhdGVBbmRTZXRDb29raWUoY3MsIEdVUkwoImh0dHA6Ly9kb21haW4yLnRlc3QiKSwgImNvb2tpZT0xIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENvb2tpZU9wdGlvbnM6Ok1ha2VBbGxJbmNsdXNpdmUoKSk7CisgIHRoaXMtPkNyZWF0ZUFuZFNldENvb2tpZShjcywgR1VSTCgiaHR0cDovL2RvbWFpbjMudGVzdCIpLCAiY29va2llPTEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29va2llT3B0aW9uczo6TWFrZUFsbEluY2x1c2l2ZSgpKTsKKyAgdGhpcy0+Q3JlYXRlQW5kU2V0Q29va2llKGNzLCBHVVJMKCJodHRwOi8vZG9tYWluNC50ZXN0IiksICJjb29raWU9MSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDb29raWVPcHRpb25zOjpNYWtlQWxsSW5jbHVzaXZlKCkpOworCisgIEdldEFsbENvb2tpZXNXaXRoQWNjZXNzU2VtYW50aWNzQ2FsbGJhY2sgY2FsbGJhY2s7CisgIGNzLT5HZXRBbGxDb29raWVzV2l0aEFjY2Vzc1NlbWFudGljc0FzeW5jKGNhbGxiYWNrLk1ha2VDYWxsYmFjaygpKTsKKyAgY2FsbGJhY2suV2FpdFVudGlsRG9uZSgpOworICBFWFBFQ1RfVFJVRShjYWxsYmFjay53YXNfcnVuKCkpOworCisgIEVYUEVDVF9FUShjYWxsYmFjay5jb29raWVzKCkuc2l6ZSgpLCBjYWxsYmFjay5hY2Nlc3Nfc2VtYW50aWNzX2xpc3QoKS5zaXplKCkpOworICBFWFBFQ1RfRVEoNHUsIGNhbGxiYWNrLmFjY2Vzc19zZW1hbnRpY3NfbGlzdCgpLnNpemUoKSk7CisgIEVYUEVDVF9FUSgiZG9tYWluMS50ZXN0IiwgY2FsbGJhY2suY29va2llcygpWzBdLkRvbWFpbigpKTsKKyAgRVhQRUNUX0VRKCJkb21haW4yLnRlc3QiLCBjYWxsYmFjay5jb29raWVzKClbMV0uRG9tYWluKCkpOworICBFWFBFQ1RfRVEoImRvbWFpbjMudGVzdCIsIGNhbGxiYWNrLmNvb2tpZXMoKVsyXS5Eb21haW4oKSk7CisgIEVYUEVDVF9FUSgiZG9tYWluNC50ZXN0IiwgY2FsbGJhY2suY29va2llcygpWzNdLkRvbWFpbigpKTsKKworICBpZiAoIVR5cGVQYXJhbTo6c3VwcG9ydHNfY29va2llX2FjY2Vzc19zZW1hbnRpY3MpIHsKKyAgICBmb3IgKENvb2tpZUFjY2Vzc1NlbWFudGljcyBzZW1hbnRpY3MgOiBjYWxsYmFjay5hY2Nlc3Nfc2VtYW50aWNzX2xpc3QoKSkgeworICAgICAgRVhQRUNUX0VRKENvb2tpZUFjY2Vzc1NlbWFudGljczo6VU5LTk9XTiwgc2VtYW50aWNzKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgRVhQRUNUX0VRKENvb2tpZUFjY2Vzc1NlbWFudGljczo6TEVHQUNZLAorICAgICAgICAgICAgICBjYWxsYmFjay5hY2Nlc3Nfc2VtYW50aWNzX2xpc3QoKVswXSk7CisgICAgRVhQRUNUX0VRKENvb2tpZUFjY2Vzc1NlbWFudGljczo6Tk9OTEVHQUNZLAorICAgICAgICAgICAgICBjYWxsYmFjay5hY2Nlc3Nfc2VtYW50aWNzX2xpc3QoKVsxXSk7CisgICAgRVhQRUNUX0VRKENvb2tpZUFjY2Vzc1NlbWFudGljczo6VU5LTk9XTiwKKyAgICAgICAgICAgICAgY2FsbGJhY2suYWNjZXNzX3NlbWFudGljc19saXN0KClbMl0pOworICAgIEVYUEVDVF9FUShDb29raWVBY2Nlc3NTZW1hbnRpY3M6OlVOS05PV04sCisgICAgICAgICAgICAgIGNhbGxiYWNrLmFjY2Vzc19zZW1hbnRpY3NfbGlzdCgpWzNdKTsKKyAgfQorfQorCiBUWVBFRF9URVNUX1AoQ29va2llU3RvcmVUZXN0LCBEZWxldGVDYW5vbmljYWxDb29raWVBc3luYykgewogICBDb29raWVTdG9yZSogY3MgPSB0aGlzLT5HZXRDb29raWVTdG9yZSgpOwogCkBAIC0xNzU2LDYgKzE4MTQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVtcHR5TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb29raWVPcmRlcmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRBbGxDb29raWVzQXN5bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0QWxsQ29va2llc1dpdGhBY2Nlc3NTZW1hbnRpY3NBc3luYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWxldGVDYW5vbmljYWxDb29raWVBc3luYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWxldGVTZXNzaW9uQ29va2llKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2RhdGEvc3NsL2Jsb2NrbGlzdC8yZTBmNjZhOWY5ZTc2NGMzMzAwODQ4MjA1OGZlMGQ5MmZjMGVjMGIxMjJmYmU5OTRlZDdiZjY0NjM2NjhjZGQ0LnBlbSBiL25ldC9kYXRhL3NzbC9ibG9ja2xpc3QvMmUwZjY2YTlmOWU3NjRjMzMwMDg0ODIwNThmZTBkOTJmYzBlYzBiMTIyZmJlOTk0ZWQ3YmY2NDYzNjY4Y2RkNC5wZW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNTQ0NTE2Li4wMDAwMDAwCi0tLSBhL25ldC9kYXRhL3NzbC9ibG9ja2xpc3QvMmUwZjY2YTlmOWU3NjRjMzMwMDg0ODIwNThmZTBkOTJmYzBlYzBiMTIyZmJlOTk0ZWQ3YmY2NDYzNjY4Y2RkNC5wZW0KKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotQ2VydGlmaWNhdGU6Ci0gICAgRGF0YToKLSAgICAgICAgVmVyc2lvbjogMyAoMHgyKQotICAgICAgICBTZXJpYWwgTnVtYmVyOgotICAgICAgICAgICAgMDE6YWY6MWU6ZmI6ZGQ6NWU6YWU6MDk6NTI6MzI6MGI6MjQ6ZmU6NmI6NTU6NjgKLSAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGEyNTZXaXRoUlNBRW5jcnlwdGlvbgotICAgICAgICBJc3N1ZXI6IEMgPSBVUywgTyA9IERpZ2lDZXJ0IEluYywgQ04gPSBEaWdpQ2VydCBTSEEyIFNlY3VyZSBTZXJ2ZXIgQ0EKLSAgICAgICAgVmFsaWRpdHkKLSAgICAgICAgICAgIE5vdCBCZWZvcmU6IFNlcCAgMiAwMDowMDowMCAyMDE2IEdNVAotICAgICAgICAgICAgTm90IEFmdGVyIDogU2VwIDExIDEyOjAwOjAwIDIwMTkgR01UCi0gICAgICAgIFN1YmplY3Q6IEMgPSBVUywgU1QgPSBDYWxpZm9ybmlhLCBMID0gV2FsbnV0IENyZWVrLCBPID0gTHVjYXMgR2Fycm9uLCBDTiA9IHJldm9rZWQuYmFkc3NsLmNvbQotICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKLSAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCi0gICAgICAgICAgICAgICAgUHVibGljLUtleTogKDIwNDggYml0KQotICAgICAgICAgICAgICAgIE1vZHVsdXM6Ci0gICAgICAgICAgICAgICAgICAgIDAwOmM3OjMxOjY1OmU0OjU1OmNmOjY5OjkwOjlmOjZlOjFmOmQ4OjZhOjEzOgotICAgICAgICAgICAgICAgICAgICA3ZTo3NDpiZjoxMzozYTo1NDo2NDowZjo3NDoyNDozZDpkYzo2MDpiODphNzoKLSAgICAgICAgICAgICAgICAgICAgNDU6MDE6Yjc6Yzg6NmE6MDM6YWM6NjQ6NGE6NjU6ZjA6N2M6ODE6ODE6ODM6Ci0gICAgICAgICAgICAgICAgICAgIDBhOmQ5OmRkOjMxOjIwOjgyOjQ4OmE2OjMzOjYzOmVlOjJiOjc0OmVhOmI0OgotICAgICAgICAgICAgICAgICAgICBlNjpjNzoxYzpiMjo1ZTplNDoyODozYTo3YTozZDoyMDoxOTowMzpiNzoxNToKLSAgICAgICAgICAgICAgICAgICAgM2Y6NGY6Yzk6MjY6ZWM6Yjc6Y2I6YmY6NDg6NmU6NWY6MzQ6NzA6NTY6YzQ6Ci0gICAgICAgICAgICAgICAgICAgIDg2OmM3OmUzOjUyOjlhOjIxOjMzOjJmOjEwOjEzOmYzOjI1OjBjOjFlOjk0OgotICAgICAgICAgICAgICAgICAgICAzNToyZTplODpkMDpkMTpiNTphMDo3Nzo0MDo5MToyZTplOTpiYTpmODpmZjoKLSAgICAgICAgICAgICAgICAgICAgNGU6ZjU6ZmI6ZjI6N2E6MDQ6YTc6ZTY6YzY6Y2U6M2Y6MGY6MTA6MTg6MzI6Ci0gICAgICAgICAgICAgICAgICAgIGM4OjA2OmJjOjE1OmIzOmJlOjY5OmFjOjc1OjdkOjQyOmEwOjhjOjJlOmMzOgotICAgICAgICAgICAgICAgICAgICBhYzplMToyMDo0ZjoxZTozNjo5Yzo5YToyZTphMjpmZDo3OTo4MDpiNjo2MjoKLSAgICAgICAgICAgICAgICAgICAgZjg6YzA6YjI6MDM6YTk6Mjk6NTA6Y2M6ZDU6MjU6OGE6MzM6NWU6ZTA6Nzg6Ci0gICAgICAgICAgICAgICAgICAgIDEzOjE4OmMwOjgwOjE3OjA5Ojk1OmJkOmEyOmZlOjkyOjE1OjA3OjIwOjdhOgotICAgICAgICAgICAgICAgICAgICA4MTpjZTpkYjowZTo4MToyOTo4OTpkNDpjODplYzpiMzpiMzo3OTowZTpmMjoKLSAgICAgICAgICAgICAgICAgICAgY2U6MjU6ZTc6ZWU6YmU6MjE6N2Q6YWY6MGM6MTM6OTQ6Mjk6ZGU6MzU6OWE6Ci0gICAgICAgICAgICAgICAgICAgIDFlOmQ4Ojg0OjE4OjVhOjVjOjFhOjk0OjgyOmNlOjlhOjYxOmQ2OjlkOmVjOgotICAgICAgICAgICAgICAgICAgICBmODplZTphZDozZjowOTo1Yjo3MzplYzphMjo5YjpmYTpkYzo2MjpmMTo1ODoKLSAgICAgICAgICAgICAgICAgICAgMWY6N2QKLSAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCi0gICAgICAgIFg1MDl2MyBleHRlbnNpb25zOgotICAgICAgICAgICAgWDUwOXYzIEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcjogCi0gICAgICAgICAgICAgICAga2V5aWQ6MEY6ODA6NjE6MUM6ODI6MzE6NjE6RDU6MkY6Mjg6RTc6OEQ6NDY6Mzg6QjQ6MkM6RTE6QzY6RDk6RTIKLQotICAgICAgICAgICAgWDUwOXYzIFN1YmplY3QgS2V5IElkZW50aWZpZXI6IAotICAgICAgICAgICAgICAgIEY0OjQ4OjdEOjA3OjQ1OjFBOjMyOjA3OjkwOjkxOkFDOjA1OkI4OjlGOkE5OjExOkYwOjdFOjExOjM2Ci0gICAgICAgICAgICBYNTA5djMgU3ViamVjdCBBbHRlcm5hdGl2ZSBOYW1lOiAKLSAgICAgICAgICAgICAgICBETlM6cmV2b2tlZC5iYWRzc2wuY29tCi0gICAgICAgICAgICBYNTA5djMgS2V5IFVzYWdlOiBjcml0aWNhbAotICAgICAgICAgICAgICAgIERpZ2l0YWwgU2lnbmF0dXJlLCBLZXkgRW5jaXBoZXJtZW50Ci0gICAgICAgICAgICBYNTA5djMgRXh0ZW5kZWQgS2V5IFVzYWdlOiAKLSAgICAgICAgICAgICAgICBUTFMgV2ViIFNlcnZlciBBdXRoZW50aWNhdGlvbiwgVExTIFdlYiBDbGllbnQgQXV0aGVudGljYXRpb24KLSAgICAgICAgICAgIFg1MDl2MyBDUkwgRGlzdHJpYnV0aW9uIFBvaW50czogCi0KLSAgICAgICAgICAgICAgICBGdWxsIE5hbWU6Ci0gICAgICAgICAgICAgICAgICBVUkk6aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL3NzY2Etc2hhMi1nNS5jcmwKLQotICAgICAgICAgICAgICAgIEZ1bGwgTmFtZToKLSAgICAgICAgICAgICAgICAgIFVSSTpodHRwOi8vY3JsNC5kaWdpY2VydC5jb20vc3NjYS1zaGEyLWc1LmNybAotCi0gICAgICAgICAgICBYNTA5djMgQ2VydGlmaWNhdGUgUG9saWNpZXM6IAotICAgICAgICAgICAgICAgIFBvbGljeTogMi4xNi44NDAuMS4xMTQ0MTIuMS4xCi0gICAgICAgICAgICAgICAgICBDUFM6IGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMKLSAgICAgICAgICAgICAgICBQb2xpY3k6IDIuMjMuMTQwLjEuMi4zCi0KLSAgICAgICAgICAgIEF1dGhvcml0eSBJbmZvcm1hdGlvbiBBY2Nlc3M6IAotICAgICAgICAgICAgICAgIE9DU1AgLSBVUkk6aHR0cDovL29jc3AuZGlnaWNlcnQuY29tCi0gICAgICAgICAgICAgICAgQ0EgSXNzdWVycyAtIFVSSTpodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRTSEEyU2VjdXJlU2VydmVyQ0EuY3J0Ci0KLSAgICAgICAgICAgIFg1MDl2MyBCYXNpYyBDb25zdHJhaW50czogY3JpdGljYWwKLSAgICAgICAgICAgICAgICBDQTpGQUxTRQotICAgICAgICAgICAgQ1QgUHJlY2VydGlmaWNhdGUgU0NUczogCi0gICAgICAgICAgICAgICAgU2lnbmVkIENlcnRpZmljYXRlIFRpbWVzdGFtcDoKLSAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAgIDogdjEgKDB4MCkKLSAgICAgICAgICAgICAgICAgICAgTG9nIElEICAgIDogQTQ6Qjk6MDk6OTA6QjQ6MTg6NTg6MTQ6ODc6QkI6MTM6QTI6Q0M6Njc6NzA6MEE6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDNDOjM1Ojk4OjA0OkY5OjFCOkRGOkI4OkUzOjc3OkNEOjBFOkM4OjBEOkRDOjEwCi0gICAgICAgICAgICAgICAgICAgIFRpbWVzdGFtcCA6IFNlcCAgMiAyMDo0MDowMy44MDIgMjAxNiBHTVQKLSAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uczogbm9uZQotICAgICAgICAgICAgICAgICAgICBTaWduYXR1cmUgOiBlY2RzYS13aXRoLVNIQTI1NgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDo0NDowMjoyMDozRjo2QzpBODpGNTpDNDo3QzowMTo0QzpDMzo1QToyODoyNzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTA6NDc6NjM6RDk6QUM6RTE6QkU6MkQ6QkY6ODc6Nzg6Q0I6M0E6ODA6OTc6MjQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc0OkNEOjE2OkY3OjAyOjIwOjcxOkZGOjkzOkEyOkI1OjU0OjdFOjdGOjUzOjQ1OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3Rjo1OTo1QTo2MDoxODoyMTo1QzpBQjo3RDoxRjowODpCMjo1NDpBMDpCMzpDNDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODg6QTU6ODM6RDI6NjM6NTUKLSAgICAgICAgICAgICAgICBTaWduZWQgQ2VydGlmaWNhdGUgVGltZXN0YW1wOgotICAgICAgICAgICAgICAgICAgICBWZXJzaW9uICAgOiB2MSAoMHgwKQotICAgICAgICAgICAgICAgICAgICBMb2cgSUQgICAgOiA2ODpGNjo5ODpGODoxRjo2NDo4MjpCRTozQTo4QzpFRTpCOToyODoxRDo0QzpGQzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzE6NTE6NUQ6Njc6OTM6RDQ6NDQ6RDE6MEE6Njc6QUM6QkI6NEY6NEY6RkI6QzQKLSAgICAgICAgICAgICAgICAgICAgVGltZXN0YW1wIDogU2VwICAyIDIwOjQwOjAzLjc0NSAyMDE2IEdNVAotICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25zOiBub25lCi0gICAgICAgICAgICAgICAgICAgIFNpZ25hdHVyZSA6IGVjZHNhLXdpdGgtU0hBMjU2Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwOjQ2OjAyOjIxOjAwOkZFOjU5Ojk3OjIyOjRDOjZDOjBGOjM5OjA1OkQ5OkU0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo3RTozQjpEMzpCMzo0NzoxQjo2MTo3MjpCNjozQTo0RjpENjpGMjpBMzo1NzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDk6NDg6NEY6NkE6NkQ6MDI6MjE6MDA6OEY6MTQ6MUI6M0M6MUI6ODk6QTM6MUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcwOkVDOkQ0OkQ3OjExOkJDOkY5OjBCOjNDOjYwOkFDOjhDOjg0OjczOjI0OjZCOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwRTozNzo2RTo1Mzo3Rjo5RDo3RjozNAotICAgICAgICAgICAgICAgIFNpZ25lZCBDZXJ0aWZpY2F0ZSBUaW1lc3RhbXA6Ci0gICAgICAgICAgICAgICAgICAgIFZlcnNpb24gICA6IHYxICgweDApCi0gICAgICAgICAgICAgICAgICAgIExvZyBJRCAgICA6IDU2OjE0OjA2OjlBOjJGOkQ3OkMyOkVDOkQzOkY1OkUxOkJEOjQ0OkIyOjNFOkM3OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Njo3NjpCOTpCQzo5OToxMTo1QzpDMDpFRjo5NDo5ODo1NTpENjo4OTpEMDpERAotICAgICAgICAgICAgICAgICAgICBUaW1lc3RhbXAgOiBTZXAgIDIgMjA6NDA6MDMuOTY3IDIwMTYgR01UCi0gICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvbnM6IG5vbmUKLSAgICAgICAgICAgICAgICAgICAgU2lnbmF0dXJlIDogZWNkc2Etd2l0aC1TSEEyNTYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzA6NDU6MDI6MjA6MEU6QkY6NTM6NTk6MTc6MEM6RUM6NjY6MEM6NUU6ODc6QkI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDhGOjVGOkI2Ojc2Ojg2OkYyOjVDOkZDOkJDOkE4OkI5OkMwOkRGOkJDOjFBOjNCOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRToxMTpGMjpEMDowMjoyMTowMDo4NzoyNTozOTpFNDozMjo5OTo0ODpDQToyMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMUI6MTM6OTY6MUQ6QzM6MkM6OTg6NkI6MUI6QzA6Q0M6RTU6Njc6MjI6QkQ6OTI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0OkU5OjY4OkNEOjk1OjgyOjMyCi0gICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMjU2V2l0aFJTQUVuY3J5cHRpb24KLSAgICAgICAgIDVhOmEwOjQ5Ojg4OmFkOjYwOjFmOjA4OjUzOjRjOmQ5OmI4OmRjOmY1OjQwOjQxOmFkOmVmOgotICAgICAgICAgYzg6N2I6MDE6M2I6MTM6NzA6NDQ6OTk6ZjY6NWM6MjM6NDY6Zjc6M2E6Yzg6N2Q6Yzk6MjE6Ci0gICAgICAgICBhZDozYTo0OTo0NTo4MjoxZTo1ZDozYjoxZTo5Yjo2YTowYTozZTo2MToyZDpmNjpiMTo5OToKLSAgICAgICAgIDc0OjJmOjkxOmY5OmQ1OmYxOjlmOmFlOjc0OjI2OjhiOjNjOmE3OjhjOmJlOjI4OmZlOmFjOgotICAgICAgICAgM2I6NzA6YWU6MDg6NTY6NzE6YWM6NTU6N2M6NDA6ODk6MDI6MmQ6NjE6MmE6ZmQ6NTQ6NzI6Ci0gICAgICAgICBiZjoxYTo1Yzo3MDoxOTo5MDoxNTphNDo3NjphMDo3Zjo1NjoxYzpjMTpmMDo4ZDo1ZTo5OToKLSAgICAgICAgIDNkOjgzOjQxOjU0OjY4OmU1OjYyOmMxOjVhOmEyOjY0OjhjOjAxOjY0OjdhOjIzOmI5OjNmOgotICAgICAgICAgYmY6MjI6Y2Y6MWY6YzA6NDc6ODA6MWY6OTQ6ZDU6ZjI6MzA6ODQ6ZmI6MDc6MDI6ZmE6NWI6Ci0gICAgICAgICBhMDpiYTowOTowNDo5ODo0ZTpmMzoyNTo1Njo0YzpjNDo3ZTplMDoyNzpkODplODozMjo4ZjoKLSAgICAgICAgIGIzOjNjOjVhOjkyOjRiOmMwOjc3OjJkOmIwOmU1OmFlOjFmOmFmOjFkOjdmOjIxOjljOjY1OgotICAgICAgICAgMjY6YmU6MGM6YmE6ZTg6MGQ6YzE6ZDI6Njc6YjQ6Yjk6MzM6ZDE6NGE6ZWU6ZmM6Yjg6YWY6Ci0gICAgICAgICAwMzo1YjpjODozZTpiYzpmYTowOTo5ZDowNDpjZTozZTphNjpiNTpjNDo3NDozYjozMTo3YToKLSAgICAgICAgIGYzOjJjOjQyOmIzOmM3OjczOmRiOmFhOjc1OjJlOjhkOjhhOjllOjc5OjMzOmJlOmQ3OmI2OgotICAgICAgICAgMTQ6OWI6MjY6YWI6N2I6OWU6MTQ6YjM6NTU6ZTY6NGI6YmI6ODY6OTQ6MTE6NzQ6MDI6MzU6Ci0gICAgICAgICBiNDo1Mjo3MDo5YgotLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi1NSUlHb1RDQ0JZbWdBd0lCQWdJUUFhOGUrOTFlcmdsU01nc2svbXRWYURBTkJna3Foa2lHOXcwQkFRc0ZBREJOCi1NUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNU2N3SlFZRFZRUURFeDVFCi1hV2RwUTJWeWRDQlRTRUV5SUZObFkzVnlaU0JUWlhKMlpYSWdRMEV3SGhjTk1UWXdPVEF5TURBd01EQXdXaGNOCi1NVGt3T1RFeE1USXdNREF3V2pCdE1Rc3dDUVlEVlFRR0V3SlZVekVUTUJFR0ExVUVDQk1LUTJGc2FXWnZjbTVwCi1ZVEVWTUJNR0ExVUVCeE1NVjJGc2JuVjBJRU55WldWck1SVXdFd1lEVlFRS0V3eE1kV05oY3lCSFlYSnliMjR4Ci1HekFaQmdOVkJBTVRFbkpsZG05clpXUXVZbUZrYzNOc0xtTnZiVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFECi1nZ0VQQURDQ0FRb0NnZ0VCQU1jeFplUlZ6Mm1RbjI0ZjJHb1RmblMvRXpwVVpBOTBKRDNjWUxpblJRRzN5R29ECi1yR1JLWmZCOGdZR0RDdG5kTVNDQ1NLWXpZKzRyZE9xMDVzY2NzbDdrS0RwNlBTQVpBN2NWUDAvSkp1eTN5NzlJCi1ibDgwY0ZiRWhzZmpVcG9oTXk4UUUvTWxEQjZVTlM3bzBORzFvSGRBa1M3cHV2ai9Udlg3OG5vRXArYkd6ajhQCi1FQmd5eUFhOEZiTythYXgxZlVLZ2pDN0RyT0VnVHg0Mm5Kb3VvdjE1Z0xaaStNQ3lBNmtwVU16VkpZb3pYdUI0Ci1FeGpBZ0JjSmxiMmkvcElWQnlCNmdjN2JEb0VwaWRUSTdMT3plUTd5emlYbjdyNGhmYThNRTVRcDNqV2FIdGlFCi1HRnBjR3BTQ3pwcGgxcDNzK082dFB3bGJjK3lpbS9yY1l2RllIMzBDQXdFQUFhT0NBMXN3Z2dOWE1COEdBMVVkCi1Jd1FZTUJhQUZBK0FZUnlDTVdIVkx5am5qVVk0dEN6aHh0bmlNQjBHQTFVZERnUVdCQlQwU0gwSFJSb3lCNUNSCi1yQVc0bjZrUjhINFJOakFkQmdOVkhSRUVGakFVZ2hKeVpYWnZhMlZrTG1KaFpITnpiQzVqYjIwd0RnWURWUjBQCi1BUUgvQkFRREFnV2dNQjBHQTFVZEpRUVdNQlFHQ0NzR0FRVUZCd01CQmdnckJnRUZCUWNEQWpCckJnTlZIUjhFCi1aREJpTUMrZ0xhQXJoaWxvZEhSd09pOHZZM0pzTXk1a2FXZHBZMlZ5ZEM1amIyMHZjM05qWVMxemFHRXlMV2MxCi1MbU55YkRBdm9DMmdLNFlwYUhSMGNEb3ZMMk55YkRRdVpHbG5hV05sY25RdVkyOXRMM056WTJFdGMyaGhNaTFuCi1OUzVqY213d1RBWURWUjBnQkVVd1F6QTNCZ2xnaGtnQmh2MXNBUUV3S2pBb0JnZ3JCZ0VGQlFjQ0FSWWNhSFIwCi1jSE02THk5M2QzY3VaR2xuYVdObGNuUXVZMjl0TDBOUVV6QUlCZ1puZ1F3QkFnTXdmQVlJS3dZQkJRVUhBUUVFCi1jREJ1TUNRR0NDc0dBUVVGQnpBQmhoaG9kSFJ3T2k4dmIyTnpjQzVrYVdkcFkyVnlkQzVqYjIwd1JnWUlLd1lCCi1CUVVITUFLR09taDBkSEE2THk5allXTmxjblJ6TG1ScFoybGpaWEowTG1OdmJTOUVhV2RwUTJWeWRGTklRVEpUCi1aV04xY21WVFpYSjJaWEpEUVM1amNuUXdEQVlEVlIwVEFRSC9CQUl3QURDQ0FYNEdDaXNHQVFRQjFua0NCQUlFCi1nZ0Z1QklJQmFnRm9BSFVBcExrSmtMUVlXQlNIdXhPaXpHZHdDancxbUFUNUc5KzQ0M2ZORHNnTjNCQUFBQUZXCi03S0UzMmdBQUJBTUFSakJFQWlBL2JLajF4SHdCVE1OYUtDZFFSMlBack9HK0xiK0hlTXM2Z0pja2RNMFc5d0lnCi1jZitUb3JWVWZuOVRSWDlaV21BWUlWeXJmUjhJc2xTZ3M4U0lwWVBTWTFVQWR3Qm85cGo0SDJTQ3ZqcU03cmtvCi1IVXo4Y1ZGZFo1UFVSTkVLWjZ5N1QwLzd4QUFBQVZic29UZWhBQUFFQXdCSU1FWUNJUUQrV1pjaVRHd1BPUVhaCi01TXArTzlPelJ4dGhjclk2VDlieW8xZEpTRTlxYlFJaEFJOFVHendiaWFNZGNPelUxeEc4K1FzOFlLeU1oSE1rCi1hdzQzYmxOL25YODBBSFlBVmhRR21pL1h3dXpUOWVHOVJMSSt4MFoydWJ5WkVWekE3NVNZVmRhSjBOMEFBQUZXCi03S0U0ZndBQUJBTUFSekJGQWlBT3YxTlpGd3pzWmd4ZWg3dVBYN1oyaHZKYy9MeW91Y0RmdkJvNzdoSHkwQUloCi1BSWNsT2VReW1VaktJQnNUbGgzRExKaHJHOERNNVdjaXZaSVU2V2pObFlJeU1BMEdDU3FHU0liM0RRRUJDd1VBCi1BNElCQVFCYW9FbUlyV0FmQ0ZOTTJiamM5VUJCcmUvSWV3RTdFM0JFbWZaY0kwYjNPc2g5eVNHdE9rbEZnaDVkCi1PeDZiYWdvK1lTMzJzWmwwTDVINTFmR2ZyblFtaXp5bmpMNG8vcXc3Y0s0SVZuR3NWWHhBaVFJdFlTcjlWSEsvCi1HbHh3R1pBVnBIYWdmMVljd2ZDTlhwazlnMEZVYU9WaXdWcWlaSXdCWkhvanVUKy9Jczhmd0VlQUg1VFY4akNFCi0rd2NDK2x1Z3Vna0VtRTd6SlZaTXhIN2dKOWpvTW8relBGcVNTOEIzTGJEbHJoK3ZIWDhobkdVbXZneTY2QTNCCi0wbWUwdVRQUlN1Nzh1SzhEVzhnK3ZQb0puUVRPUHFhMXhIUTdNWHJ6TEVLengzUGJxblV1allxZWVUTysxN1lVCi1teWFyZTU0VXMxWG1TN3VHbEJGMEFqVzBVbkNiCi0tLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS9uZXQvZGF0YS9zc2wvYmxvY2tsaXN0L1JFQURNRS5tZCBiL25ldC9kYXRhL3NzbC9ibG9ja2xpc3QvUkVBRE1FLm1kCmluZGV4IDg0ZjQ2ZjIuLjExYWZkZDAgMTAwNjQ0Ci0tLSBhL25ldC9kYXRhL3NzbC9ibG9ja2xpc3QvUkVBRE1FLm1kCisrKyBiL25ldC9kYXRhL3NzbC9ibG9ja2xpc3QvUkVBRE1FLm1kCkBAIC0yODUsNyArMjg1LDcgQEAKIAogIyMjIHJldm9rZWQuYmFkc3NsLmNvbQogCi0gICogWzJlMGY2NmE5ZjllNzY0YzMzMDA4NDgyMDU4ZmUwZDkyZmMwZWMwYjEyMmZiZTk5NGVkN2JmNjQ2MzY2OGNkZDQucGVtXSgyZTBmNjZhOWY5ZTc2NGMzMzAwODQ4MjA1OGZlMGQ5MmZjMGVjMGIxMjJmYmU5OTRlZDdiZjY0NjM2NjhjZGQ0LnBlbSkKKyAgKiBbYzY5MTBkMGJhOWVkZGY1OTMzMzQxNDlmZWRmZTg3Mzg1ZjM3YjYyNTM1NGJiNDM5NWMwYWUyYzhkZjQ4ZTE3Yy5wZW1dKGM2OTEwZDBiYTllZGRmNTkzMzM0MTQ5ZmVkZmU4NzM4NWYzN2I2MjUzNTRiYjQzOTVjMGFlMmM4ZGY0OGUxN2MucGVtKQogCiAjIyMgcmV2b2tlZC5ncmMuY29tCiAKQEAgLTMwMiw3ICszMDIsNyBAQAogCiAjIyMgU3ltYW50ZWMKIAotRm9yIGRldGFpbHMsIHNlZSA8aHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9OTY2MDYwPiAKK0ZvciBkZXRhaWxzLCBzZWUgPGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTk2NjA2MD4KIAogVGhlc2UgdGhyZWUgaW50ZXJtZWRpYXRlIGNlcnRpZmljYXRlcyB3ZXJlIHJldGlyZWQgYnkgU3ltYW50ZWMsIGFuZAogYmxvY2tlZCBmb3Igcm9idXN0bmVzcyBhdCB0aGVpciByZXF1ZXN0LgpkaWZmIC0tZ2l0IGEvbmV0L2RhdGEvc3NsL2Jsb2NrbGlzdC9jNjkxMGQwYmE5ZWRkZjU5MzMzNDE0OWZlZGZlODczODVmMzdiNjI1MzU0YmI0Mzk1YzBhZTJjOGRmNDhlMTdjLnBlbSBiL25ldC9kYXRhL3NzbC9ibG9ja2xpc3QvYzY5MTBkMGJhOWVkZGY1OTMzMzQxNDlmZWRmZTg3Mzg1ZjM3YjYyNTM1NGJiNDM5NWMwYWUyYzhkZjQ4ZTE3Yy5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYxNjQ3YQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9kYXRhL3NzbC9ibG9ja2xpc3QvYzY5MTBkMGJhOWVkZGY1OTMzMzQxNDlmZWRmZTg3Mzg1ZjM3YjYyNTM1NGJiNDM5NWMwYWUyYzhkZjQ4ZTE3Yy5wZW0KQEAgLTAsMCArMSwxNTcgQEAKK0NlcnRpZmljYXRlOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjoKKyAgICAgICAgICAgIDAzOjcxOmI1OjhhOjg2OmY2OmNlOjljOjNlOmNiOjdiOmY0OjJmOjkyOjA4OmZjCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTI1NldpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQyA9IFVTLCBPID0gRGlnaUNlcnQgSW5jLCBDTiA9IERpZ2lDZXJ0IFNIQTIgU2VjdXJlIFNlcnZlciBDQQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogT2N0ICA0IDAwOjAwOjAwIDIwMTkgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBPY3QgIDggMTI6MDA6MDAgMjAyMSBHTVQKKyAgICAgICAgU3ViamVjdDogQyA9IFVTLCBTVCA9IENhbGlmb3JuaWEsIEwgPSBXYWxudXQgQ3JlZWssIE8gPSBMdWNhcyBHYXJyb24gVG9ycmVzLCBDTiA9IHJldm9rZWQuYmFkc3NsLmNvbQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICAgICAgUlNBIFB1YmxpYy1LZXk6ICgyMDQ4IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzOgorICAgICAgICAgICAgICAgICAgICAwMDpiNDoyZTozOToyNzpmNjo3Njo1NjpmYTpmOTo4MjoyZjphMDoyZDpmMjoKKyAgICAgICAgICAgICAgICAgICAgZDA6MzI6MTk6OTk6NTU6ZGM6ODk6NDQ6OTY6Zjc6NzM6MjM6YWY6Zjc6YTQ6CisgICAgICAgICAgICAgICAgICAgIDVlOjNlOjc0OmJmOjU5Ojc5OmNkOjVmOjBiOmU3OjhmOmZiOjAzOjE5OmJmOgorICAgICAgICAgICAgICAgICAgICA4Zjo5ZTo2MzpkMjpmZjowMjo3Yzo3NjpmZToxNjplOTowMjpmYzo4Njo5MDoKKyAgICAgICAgICAgICAgICAgICAgNWY6OTg6NWM6ZDY6OWE6YmE6MmU6OTU6ZTg6ZDg6YTU6YzU6ZjQ6OWM6OWQ6CisgICAgICAgICAgICAgICAgICAgIGE3OmI5OmRlOmI4OjRhOjcxOjYyOmZkOjJhOjI4OjdkOjAyOmFmOjQ2OmQ2OgorICAgICAgICAgICAgICAgICAgICAwZDoxZDo3MTo2MTpkOTo0YzpkYjo5NzoxNTowMDozNDpmNDo1Mzo4MTpiYzoKKyAgICAgICAgICAgICAgICAgICAgOGU6OTQ6Mzk6ZGU6ZDg6YmU6NDI6N2Y6MjQ6ZWE6MDI6NTM6YzY6NWI6ODA6CisgICAgICAgICAgICAgICAgICAgIDNlOjExOjJlOmQyOmQ5OjBiOjZkOjE4Ojg2OmFjOjIxOmQ2Ojc3OmQ5OjQ4OgorICAgICAgICAgICAgICAgICAgICBhOTo0ZjphMzo1YjoxZDpmMzphNTozNjo2NDpkNjo0ZDoxZjo0NjpiNzpmMzoKKyAgICAgICAgICAgICAgICAgICAgMzU6MTA6ZjU6N2I6NDU6M2E6ZGQ6YTQ6MTg6ZGI6YmQ6YTM6NGU6YzM6MTA6CisgICAgICAgICAgICAgICAgICAgIDliOjE5Ojg0OmU1Ojk2Ojk1OjliOjVkOmU3OjU2OjcyOmFiOjI3Ojg1OjY5OgorICAgICAgICAgICAgICAgICAgICAxNDpkYzplMTo1ZTozNjpjZDo2OTpjYTo3MzpjMDo4MjowNzo3ZDpmYzo3ZToKKyAgICAgICAgICAgICAgICAgICAgOGQ6MmU6ZmI6Y2I6Yzk6Nzk6MmU6OTc6MzY6NDM6MGY6MTY6OTQ6NDU6MGU6CisgICAgICAgICAgICAgICAgICAgIGJkOmQzOjA5OjZiOmQ5OmUwOjAzOmZlOjJhOjAwOjEwOjliOjk3OjM4OmYwOgorICAgICAgICAgICAgICAgICAgICA1MzoxMTo1ZTo4ZDo3YTplNjphMTpiZToyZTozMjphOTpmZjo2Mzo0ZjphMDoKKyAgICAgICAgICAgICAgICAgICAgYzY6ZWE6MzU6Yjg6NTk6ZTQ6YWI6NDM6YTI6NDg6YzA6MWE6MDg6MTE6YmU6CisgICAgICAgICAgICAgICAgICAgIDZjOmMzCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIFg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXI6CisgICAgICAgICAgICAgICAga2V5aWQ6MEY6ODA6NjE6MUM6ODI6MzE6NjE6RDU6MkY6Mjg6RTc6OEQ6NDY6Mzg6QjQ6MkM6RTE6QzY6RDk6RTIKKworICAgICAgICAgICAgWDUwOXYzIFN1YmplY3QgS2V5IElkZW50aWZpZXI6CisgICAgICAgICAgICAgICAgMzg6NEQ6Qjk6QzY6QUQ6N0Q6NkM6Njg6QzI6NUY6NzU6RDc6MUI6NkU6Q0I6QTY6RTk6OUU6M0E6QUQKKyAgICAgICAgICAgIFg1MDl2MyBTdWJqZWN0IEFsdGVybmF0aXZlIE5hbWU6CisgICAgICAgICAgICAgICAgRE5TOnJldm9rZWQuYmFkc3NsLmNvbSwgRE5TOnd3dy5yZXZva2VkLmJhZHNzbC5jb20KKyAgICAgICAgICAgIFg1MDl2MyBLZXkgVXNhZ2U6IGNyaXRpY2FsCisgICAgICAgICAgICAgICAgRGlnaXRhbCBTaWduYXR1cmUsIEtleSBFbmNpcGhlcm1lbnQKKyAgICAgICAgICAgIFg1MDl2MyBFeHRlbmRlZCBLZXkgVXNhZ2U6CisgICAgICAgICAgICAgICAgVExTIFdlYiBTZXJ2ZXIgQXV0aGVudGljYXRpb24sIFRMUyBXZWIgQ2xpZW50IEF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICBYNTA5djMgQ1JMIERpc3RyaWJ1dGlvbiBQb2ludHM6CisKKyAgICAgICAgICAgICAgICBGdWxsIE5hbWU6CisgICAgICAgICAgICAgICAgICBVUkk6aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL3NzY2Etc2hhMi1nNi5jcmwKKworICAgICAgICAgICAgICAgIEZ1bGwgTmFtZToKKyAgICAgICAgICAgICAgICAgIFVSSTpodHRwOi8vY3JsNC5kaWdpY2VydC5jb20vc3NjYS1zaGEyLWc2LmNybAorCisgICAgICAgICAgICBYNTA5djMgQ2VydGlmaWNhdGUgUG9saWNpZXM6CisgICAgICAgICAgICAgICAgUG9saWN5OiAyLjE2Ljg0MC4xLjExNDQxMi4xLjEKKyAgICAgICAgICAgICAgICAgIENQUzogaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUworICAgICAgICAgICAgICAgIFBvbGljeTogMi4yMy4xNDAuMS4yLjMKKworICAgICAgICAgICAgQXV0aG9yaXR5IEluZm9ybWF0aW9uIEFjY2VzczoKKyAgICAgICAgICAgICAgICBPQ1NQIC0gVVJJOmh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbQorICAgICAgICAgICAgICAgIENBIElzc3VlcnMgLSBVUkk6aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0U0hBMlNlY3VyZVNlcnZlckNBLmNydAorCisgICAgICAgICAgICBYNTA5djMgQmFzaWMgQ29uc3RyYWludHM6IGNyaXRpY2FsCisgICAgICAgICAgICAgICAgQ0E6RkFMU0UKKyAgICAgICAgICAgIENUIFByZWNlcnRpZmljYXRlIFNDVHM6CisgICAgICAgICAgICAgICAgU2lnbmVkIENlcnRpZmljYXRlIFRpbWVzdGFtcDoKKyAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAgIDogdjEgKDB4MCkKKyAgICAgICAgICAgICAgICAgICAgTG9nIElEICAgIDogQTQ6Qjk6MDk6OTA6QjQ6MTg6NTg6MTQ6ODc6QkI6MTM6QTI6Q0M6Njc6NzA6MEE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDNDOjM1Ojk4OjA0OkY5OjFCOkRGOkI4OkUzOjc3OkNEOjBFOkM4OjBEOkRDOjEwCisgICAgICAgICAgICAgICAgICAgIFRpbWVzdGFtcCA6IE9jdCAgNCAyMjo0Mjo1OC4xMjcgMjAxOSBHTVQKKyAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uczogbm9uZQorICAgICAgICAgICAgICAgICAgICBTaWduYXR1cmUgOiBlY2RzYS13aXRoLVNIQTI1NgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDo0NDowMjoyMDo1ODpGODpCQzpFRTpERTo0QzpDQzo5OTpFRjoyQzozMjo0NjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTg6MkE6Njk6Nzk6MEM6MzI6MUQ6QUQ6NTU6OTI6RjA6MDY6RjM6NUQ6NEM6ODM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDVGOjRBOjZEOkNCOjAyOjIwOjNBOjVCOkIxOkU4OkU3OkYwOjU3OkE4OkZFOjkwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGNTo4Mzo3Qzo1NDoxRTo2Rjo3MjpEOTpBRTo0QTpERDo5NDpGNjpBODpFMjozRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTU6RkM6MUE6MzU6Qzk6QkIKKyAgICAgICAgICAgICAgICBTaWduZWQgQ2VydGlmaWNhdGUgVGltZXN0YW1wOgorICAgICAgICAgICAgICAgICAgICBWZXJzaW9uICAgOiB2MSAoMHgwKQorICAgICAgICAgICAgICAgICAgICBMb2cgSUQgICAgOiA4Nzo3NTpCRjpFNzo1OTo3QzpGODo4Qzo0Mzo5OTo1RjpCRDpGMzo2RTpGRjo1NjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOEQ6NDc6NTY6MzY6RkY6NEE6QjU6NjA6QzE6QjQ6RUE6RkY6NUU6QTA6ODM6MEYKKyAgICAgICAgICAgICAgICAgICAgVGltZXN0YW1wIDogT2N0ICA0IDIyOjQyOjU4LjIzNCAyMDE5IEdNVAorICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25zOiBub25lCisgICAgICAgICAgICAgICAgICAgIFNpZ25hdHVyZSA6IGVjZHNhLXdpdGgtU0hBMjU2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwOjQ1OjAyOjIxOjAwOjk5OkM4OjhEOjRFOjYyOkI3OkM3OkQxOjc5OkQ5OkJGOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBMzpDOTowQToyNzpBMjozODpGOTozRDoxRDpENDo0RDo3RTpDODpENDo0NjozNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6QjY6RjI6MEQ6NUI6MDI6MjA6Mzg6NkI6NTA6MkI6QjA6ODI6OTg6Q0E6Q0Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQxOjI0OjI5OjcwOkJDOkE1OjNBOkNGOjRGOkJFOjc0OjZCOjBCOjU2OkRCOkM5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMjo0RDo5MjpEQTowOTo1NjpGNQorICAgICAgICAgICAgICAgIFNpZ25lZCBDZXJ0aWZpY2F0ZSBUaW1lc3RhbXA6CisgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gICA6IHYxICgweDApCisgICAgICAgICAgICAgICAgICAgIExvZyBJRCAgICA6IDQ0Ojk0OjY1OjJFOkIwOkVFOkNFOkFGOkM0OjQwOjA3OkQ4OkE4OkZFOjI4OkMwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQTpFNjo4MjpCRTpEODpDQjozMTpCNTozRjpEMzozMzo5NjpCNTpCNjo4MTpBOAorICAgICAgICAgICAgICAgICAgICBUaW1lc3RhbXAgOiBPY3QgIDQgMjI6NDI6NTcuOTg1IDIwMTkgR01UCisgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvbnM6IG5vbmUKKyAgICAgICAgICAgICAgICAgICAgU2lnbmF0dXJlIDogZWNkc2Etd2l0aC1TSEEyNTYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzA6NDU6MDI6MjE6MDA6QzE6Nzk6RDU6OTM6MDY6RDY6MkY6M0I6QTQ6MTI6NjM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk1OjZFOkNGOjA4OjQwOjc4OjkwOjY4OjQ0OjVDOjBCOjc0OjQzOkVDOjhBOkNBOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxRTpERToxRDo1MjpGMzowMjoyMDo1NzpENDpCRjpBMjowQjpENzpDMTozRjo0NDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUI6QUU6MTU6MDY6MDM6QzE6OUE6RUY6MEU6OTY6QzI6OEM6OTc6NkY6MTc6MEY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQyOjZGOkVGOjg2Ojg3OjNDOkMxCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMjU2V2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgIDE3OmNlOjc3OjAzOmQyOmEzOjI1OmI4OmMxOjU5OjBjOmIzOmIxOjNmOjM3OmFmOmUwOjFlOgorICAgICAgICAgN2E6NmI6NDE6MTY6ZWQ6N2U6NTg6MjY6N2M6YjI6ZGY6NjU6MTU6OWE6Y2Y6OTU6MDI6OWU6CisgICAgICAgICA1MzowYzozMzo3NTo5MDowYzo2NjphNjoxNzo5Yzo1NTo2NDo1YzplNDozYTo0NDo5ZjplNjoKKyAgICAgICAgIDljOjVjOmNkOmUxOjFmOjNjOjc0Ojg0OjE3OmRiOjYxOjhhOjQwOjAwOmRjOmJkOmU4OmM0OgorICAgICAgICAgNjA6MWE6MGQ6ZWE6NjA6ODM6NzU6ZTA6ZTU6N2M6NDM6MzE6ODg6MjM6MTA6OTE6NTQ6M2M6CisgICAgICAgICBjNzpkZDpmZTplNDo0MToxZDo1Yjo4MTo5YjpjMjo0MDoyZTo5ZjpiMzo3Mjo2Nzo0NDo5ZjoKKyAgICAgICAgIDI1OjNhOjEwOjg1OjM2Ojc5OjJkOmNhOjVhOmYwOjU3OjVhOjc4OmYwOjNjOjcxOjA1OjQyOgorICAgICAgICAgZTM6MjM6NWE6MTg6YjU6NzI6YTI6OTA6NDc6NzE6YjM6YjY6NjA6YmE6NTM6ODg6YTE6NTE6CisgICAgICAgICA0Mjo0ODpmYjo3MzoxNzplMzoxZTo0YjowYzphYTo2MjpmZjowODozODoyMzowMDpiZDpiNzoKKyAgICAgICAgIDJkOjgyOjdiOjJlOmEzOjQ3OjllOjkwOmJjOjk1Ojk0OjkzOjkzOjdiOmIwOmIwOmZhOjE4OgorICAgICAgICAgZjM6ZTY6NzY6MTc6ZTc6MjA6OWM6ZGI6MDE6NmU6ZDI6Zjk6NGI6ZDI6NGM6M2M6Nzc6YTA6CisgICAgICAgICBkYTo0Yjo1ODphYzo2NDoxNjo3OTphNzpiNzpjMjo3ZDo1Njo1Zjo1Yjo4NTo4YjoyNTpkODoKKyAgICAgICAgIDMxOjYyOjAwOjEzOjJhOjg0OmU0OmM1OjUxOjY5OjcxOjMzOmFiOmUxOjNhOjFkOjE4OjRkOgorICAgICAgICAgYzY6ZjE6ZjM6YWU6ZTg6NmY6YzE6OTI6NzQ6YmQ6YWY6Nzg6Mzk6YTQ6YmE6NTY6Njg6ZDc6CisgICAgICAgICAzYTozNjpkYTo4YQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlHdnpDQ0JhZWdBd0lCQWdJUUEzRzFpb2IyenB3K3kzdjBMNUlJL0RBTkJna3Foa2lHOXcwQkFRc0ZBREJOCitNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNU2N3SlFZRFZRUURFeDVFCithV2RwUTJWeWRDQlRTRUV5SUZObFkzVnlaU0JUWlhKMlpYSWdRMEV3SGhjTk1Ua3hNREEwTURBd01EQXdXaGNOCitNakV4TURBNE1USXdNREF3V2pCME1Rc3dDUVlEVlFRR0V3SlZVekVUTUJFR0ExVUVDQk1LUTJGc2FXWnZjbTVwCitZVEVWTUJNR0ExVUVCeE1NVjJGc2JuVjBJRU55WldWck1Sd3dHZ1lEVlFRS0V4Tk1kV05oY3lCSFlYSnliMjRnCitWRzl5Y21Wek1Sc3dHUVlEVlFRREV4SnlaWFp2YTJWa0xtSmhaSE56YkM1amIyMHdnZ0VpTUEwR0NTcUdTSWIzCitEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUMwTGprbjluWlcrdm1DTDZBdDh0QXlHWmxWM0lsRWx2ZHpJNi8zCitwRjQrZEw5WmVjMWZDK2VQK3dNWnY0K2VZOUwvQW54Mi9oYnBBdnlHa0YrWVhOYWF1aTZWNk5pbHhmU2NuYWU1CiszcmhLY1dMOUtpaDlBcTlHMWcwZGNXSFpUTnVYRlFBMDlGT0J2STZVT2Q3WXZrSi9KT29DVThaYmdENFJMdExaCitDMjBZaHF3aDFuZlpTS2xQbzFzZDg2VTJaTlpOSDBhMzh6VVE5WHRGT3Qya0dOdTlvMDdERUpzWmhPV1dsWnRkCis1MVp5cXllRmFSVGM0VjQyelduS2M4Q0NCMzM4Zm8wdSs4dkplUzZYTmtNUEZwUkZEcjNUQ1d2WjRBUCtLZ0FRCittNWM0OEZNUlhvMTY1cUcrTGpLcC8yTlBvTWJxTmJoWjVLdERva2pBR2dnUnZtekRBZ01CQUFHamdnTnlNSUlECitiakFmQmdOVkhTTUVHREFXZ0JRUGdHRWNnakZoMVM4bzU0MUdPTFFzNGNiWjRqQWRCZ05WSFE0RUZnUVVPRTI1Cit4cTE5YkdqQ1gzWFhHMjdMcHVtZU9xMHdOUVlEVlIwUkJDNHdMSUlTY21WMmIydGxaQzVpWVdSemMyd3VZMjl0CitnaFozZDNjdWNtVjJiMnRsWkM1aVlXUnpjMnd1WTI5dE1BNEdBMVVkRHdFQi93UUVBd0lGb0RBZEJnTlZIU1VFCitGakFVQmdnckJnRUZCUWNEQVFZSUt3WUJCUVVIQXdJd2F3WURWUjBmQkdRd1lqQXZvQzJnSzRZcGFIUjBjRG92CitMMk55YkRNdVpHbG5hV05sY25RdVkyOXRMM056WTJFdGMyaGhNaTFuTmk1amNtd3dMNkF0b0N1R0tXaDBkSEE2CitMeTlqY213MExtUnBaMmxqWlhKMExtTnZiUzl6YzJOaExYTm9ZVEl0WnpZdVkzSnNNRXdHQTFVZElBUkZNRU13CitOd1lKWUlaSUFZYjliQUVCTUNvd0tBWUlLd1lCQlFVSEFnRVdIR2gwZEhCek9pOHZkM2QzTG1ScFoybGpaWEowCitMbU52YlM5RFVGTXdDQVlHWjRFTUFRSURNSHdHQ0NzR0FRVUZCd0VCQkhBd2JqQWtCZ2dyQmdFRkJRY3dBWVlZCithSFIwY0RvdkwyOWpjM0F1WkdsbmFXTmxjblF1WTI5dE1FWUdDQ3NHQVFVRkJ6QUNoanBvZEhSd09pOHZZMkZqCitaWEowY3k1a2FXZHBZMlZ5ZEM1amIyMHZSR2xuYVVObGNuUlRTRUV5VTJWamRYSmxVMlZ5ZG1WeVEwRXVZM0owCitNQXdHQTFVZEV3RUIvd1FDTUFBd2dnRjlCZ29yQmdFRUFkWjVBZ1FDQklJQmJRU0NBV2tCWndCMUFLUzVDWkMwCitHRmdVaDdzVG9zeG5jQW84TlpnRStSdmZ1T04zelE3SURkd1FBQUFCYlpqd3djOEFBQVFEQUVZd1JBSWdXUGk4Cis3dDVNekpudkxESkdtQ3BwZVF3eUhhMVZrdkFHODExTWcxOUtiY3NDSURwYnNlam44RmVvL3BEMWczeFVIbTl5CisyYTVLM1pUMnFPSStGZndhTmNtN0FIWUFoM1cvNTFsOCtJeERtVis5ODI3L1ZvMUhWamIvU3JWZ3diVHEvMTZnCitndzhBQUFGdG1QRENPZ0FBQkFNQVJ6QkZBaUVBbWNpTlRtSzN4OUY1MmIranlRb25vamo1UFIzVVRYN0kxRVkyCit5cmJ5RFZzQ0lEaHJVQ3V3Z3BqS3pkRWtLWEM4cFRyUFQ3NTBhd3RXMjhuQ1RaTGFDVmIxQUhZQVJKUmxMckR1Cit6cS9FUUFmWXFQNG93TnJtZ3I3WXl6RzFQOU16bHJXMmdhZ0FBQUZ0bVBEQlFRQUFCQU1BUnpCRkFpRUF3WG5WCitrd2JXTHp1a0VtT1ZiczhJUUhpUWFFUmNDM1JEN0lyS0h0NGRVdk1DSUZmVXY2SUwxOEUvUk91dUZRWUR3WnJ2CitEcGJDakpkdkZ3OUNiKytHaHp6Qk1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQVh6bmNEMHFNbHVNRlpETE94CitQemV2NEI1NmEwRVc3WDVZSm55eTMyVVZtcytWQXA1VERETjFrQXhtcGhlY1ZXUmM1RHBFbithY1hNM2hIengwCitoQmZiWVlwQUFOeTk2TVJnR2czcVlJTjE0T1Y4UXpHSUl4Q1JWRHpIM2Y3a1FSMWJnWnZDUUM2ZnMzSm5SSjhsCitPaENGTm5rdHlscndWMXA0OER4eEJVTGpJMW9ZdFhLaWtFZHhzN1pndWxPSW9WRkNTUHR6RitNZVN3eXFZdjhJCitPQ01BdmJjdGduc3VvMGVla0x5VmxKT1RlN0N3K2hqejVuWVg1eUNjMndGdTB2bEwwa3c4ZDZEYVMxaXNaQlo1CitwN2ZDZlZaZlc0V0xKZGd4WWdBVEtvVGt4VkZwY1RPcjRUb2RHRTNHOGZPdTZHL0JrblM5cjNnNXBMcFdhTmM2CitOdHFLCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS9uZXQvZGlza19jYWNoZS9iYWNrZW5kX3VuaXR0ZXN0LmNjIGIvbmV0L2Rpc2tfY2FjaGUvYmFja2VuZF91bml0dGVzdC5jYwppbmRleCA1ZjYxMjFhNS4uNWExZTViNyAxMDA2NDQKLS0tIGEvbmV0L2Rpc2tfY2FjaGUvYmFja2VuZF91bml0dGVzdC5jYworKysgYi9uZXQvZGlza19jYWNoZS9iYWNrZW5kX3VuaXR0ZXN0LmNjCkBAIC0zNzIzLDggKzM3MjMsOCBAQAogICAgICAgbnVsbHB0ciwgJmNhY2hlWzBdLCBjYi5jYWxsYmFjaygpKTsKICAgQVNTRVJUX1RIQVQoY2IuR2V0UmVzdWx0KHJ2KSwgSXNPaygpKTsKICAgcnYgPSBkaXNrX2NhY2hlOjpDcmVhdGVDYWNoZUJhY2tlbmQoCi0gICAgICBuZXQ6Ok1FRElBX0NBQ0hFLCBuZXQ6OkNBQ0hFX0JBQ0tFTkRfREVGQVVMVCwgc3RvcmUyLkdldFBhdGgoKSwgMCwgZmFsc2UsCi0gICAgICBudWxscHRyLCAmY2FjaGVbMV0sIGNiLmNhbGxiYWNrKCkpOworICAgICAgbmV0OjpHRU5FUkFURURfQllURV9DT0RFX0NBQ0hFLCBuZXQ6OkNBQ0hFX0JBQ0tFTkRfREVGQVVMVCwKKyAgICAgIHN0b3JlMi5HZXRQYXRoKCksIDAsIGZhbHNlLCBudWxscHRyLCAmY2FjaGVbMV0sIGNiLmNhbGxiYWNrKCkpOwogICBBU1NFUlRfVEhBVChjYi5HZXRSZXN1bHQocnYpLCBJc09rKCkpOwogCiAgIEFTU0VSVF9UUlVFKGNhY2hlWzBdLmdldCgpICE9IG51bGxwdHIgJiYgY2FjaGVbMV0uZ2V0KCkgIT0gbnVsbHB0cik7CmRpZmYgLS1naXQgYS9uZXQvZGlza19jYWNoZS9ibG9ja2ZpbGUvaGlzdG9ncmFtX21hY3Jvcy5oIGIvbmV0L2Rpc2tfY2FjaGUvYmxvY2tmaWxlL2hpc3RvZ3JhbV9tYWNyb3MuaAppbmRleCAzYTY4MTc3Li5hNWRlODVjYyAxMDA2NDQKLS0tIGEvbmV0L2Rpc2tfY2FjaGUvYmxvY2tmaWxlL2hpc3RvZ3JhbV9tYWNyb3MuaAorKysgYi9uZXQvZGlza19jYWNoZS9ibG9ja2ZpbGUvaGlzdG9ncmFtX21hY3Jvcy5oCkBAIC05MiwxMSArOTIsMTEgQEAKICAgICBjb25zdCBzdGQ6OnN0cmluZyBteV9uYW1lID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgQ0FDSEVfVU1BX0JBQ0tFTkRfSU1QTF9PQkotPkhpc3RvZ3JhbU5hbWUobmFtZSwgZXhwZXJpbWVudCk7IFwKICAgICBzd2l0Y2ggKENBQ0hFX1VNQV9CQUNLRU5EX0lNUExfT0JKLT5HZXRDYWNoZVR5cGUoKSkgeyAgICAgICAgICAgIFwKKyAgICAgIGNhc2UgbmV0OjpSRU1PVkVEX01FRElBX0NBQ0hFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgTk9UUkVBQ0hFRCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgRkFMTFRIUk9VR0g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgIGNhc2UgbmV0OjpESVNLX0NBQ0hFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNhc2UgbmV0OjpNRURJQV9DQUNIRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgIGNhc2UgbmV0OjpBUFBfQ0FDSEU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgIGNhc2UgbmV0OjpTSEFERVJfQ0FDSEU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgIGNhc2UgbmV0OjpQTkFDTF9DQUNIRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL25ldC9kaXNrX2NhY2hlL2Rpc2tfY2FjaGUuY2MgYi9uZXQvZGlza19jYWNoZS9kaXNrX2NhY2hlLmNjCmluZGV4IDE2OWE4YTkuLmI1ZDMzMTUgMTAwNjQ0Ci0tLSBhL25ldC9kaXNrX2NhY2hlL2Rpc2tfY2FjaGUuY2MKKysrIGIvbmV0L2Rpc2tfY2FjaGUvZGlza19jYWNoZS5jYwpAQCAtMjQzLDcgKzI0Myw3IEBACiAgICAgICBzdGQ6Om1vdmUoYXBwX3N0YXR1c19saXN0ZW5lciksCiAjZW5kaWYKICAgICAgIG5ldF9sb2csIGJhY2tlbmQsIHN0ZDo6bW92ZShwb3N0X2NsZWFudXBfY2FsbGJhY2spLCBzdGQ6Om1vdmUoY2FsbGJhY2spKTsKLSAgaWYgKHR5cGUgPT0gbmV0OjpESVNLX0NBQ0hFIHx8IHR5cGUgPT0gbmV0OjpNRURJQV9DQUNIRSkgeworICBpZiAodHlwZSA9PSBuZXQ6OkRJU0tfQ0FDSEUpIHsKICAgICBEQ0hFQ0soIWhhZF9wb3N0X2NsZWFudXBfY2FsbGJhY2spOwogICAgIHJldHVybiBjcmVhdG9yLT5SdW4oKTsKICAgfQpkaWZmIC0tZ2l0IGEvbmV0L2Rpc2tfY2FjaGUvZGlza19jYWNoZS5oIGIvbmV0L2Rpc2tfY2FjaGUvZGlza19jYWNoZS5oCmluZGV4IDkxYWFhN2QuLmMxZDVmN2EgMTAwNjQ0Ci0tLSBhL25ldC9kaXNrX2NhY2hlL2Rpc2tfY2FjaGUuaAorKysgYi9uZXQvZGlza19jYWNoZS9kaXNrX2NhY2hlLmgKQEAgLTUyLDkgKzUyLDkgQEAKIC8vIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgYSBCYWNrZW5kIG9mIHRoZSBnaXZlbiB8dHlwZXwuIHxwYXRofCBwb2ludHMgdG8gYQogLy8gZm9sZGVyIHdoZXJlIHRoZSBjYWNoZWQgZGF0YSB3aWxsIGJlIHN0b3JlZCAoaWYgYXBwcm9wcmlhdGUpLiBUaGlzIGNhY2hlCiAvLyBpbnN0YW5jZSBtdXN0IGJlIHRoZSBvbmx5IG9iamVjdCB0aGF0IHdpbGwgYmUgcmVhZGluZyBvciB3cml0aW5nIGZpbGVzIHRvCi0vLyB0aGF0IGZvbGRlciAoaWYgYW5vdGhlciBvbmUgZXhpc3RzLCBhbmQgfHR5cGV8IGlzIG5vdCBuZXQ6OkRJU0tfQ0FDSEUgb3IKLS8vIG5ldDo6TUVESUFfQ0FDSEUsIHRoaXMgb3BlcmF0aW9uIHdpbGwgbm90IGNvbXBsZXRlIHVudGlsIHRoZSBwcmV2aW91cwotLy8gZHVwbGljYXRlIGdldHMgZGVzdHJveWVkIGFuZCBmaW5pc2hlcyBhbGwgSS9PKS4KKy8vIHRoYXQgZm9sZGVyIChpZiBhbm90aGVyIG9uZSBleGlzdHMsIGFuZCB8dHlwZXwgaXMgbm90IG5ldDo6RElTS19DQUNIRSB0aGlzCisvLyBvcGVyYXRpb24gd2lsbCBub3QgY29tcGxldGUgdW50aWwgdGhlIHByZXZpb3VzIGR1cGxpY2F0ZSBnZXRzIGRlc3Ryb3llZCBhbmQKKy8vIGZpbmlzaGVzIGFsbCBJL08pLgogLy8KIC8vIFRoZSByZXR1cm5lZCBvYmplY3Qgc2hvdWxkIGJlIGRlbGV0ZWQgd2hlbiBub3QgbmVlZGVkIGFueW1vcmUuCiAvLyBJZiB8Zm9yY2V8IGlzIHRydWUsIGFuZCB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCB0aGUgY2FjaGUgaW5pdGlhbGl6YXRpb24sIHRoZQpAQCAtOTYsOCArOTYsNyBAQAogLy8gd2lsbCBnZXQgaW52b2tlZCBldmVuIGlmIHRoZSBjcmVhdGlvbiBmYWlscy4gVGhlIGludm9jYXRpb24gd2lsbCBhbHdheXMgYmUKIC8vIHZpYSB0aGUgZXZlbnQgbG9vcCwgYW5kIG5ldmVyIGRpcmVjdC4KIC8vCi0vLyBUaGlzIGlzIGN1cnJlbnRseSB1bnN1cHBvcnRlZCBmb3IgfHR5cGV8ID09IG5ldDo6RElTS19DQUNIRSBvcgotLy8gbmV0OjpNRURJQV9DQUNIRS4KKy8vIFRoaXMgaXMgY3VycmVudGx5IHVuc3VwcG9ydGVkIGZvciB8dHlwZXwgPT0gbmV0OjpESVNLX0NBQ0hFLgogLy8KIC8vIE5vdGUgdGhhdCB0aGlzIHdpbGwgbm90IHdhaXQgZm9yIHxwb3N0X2NsZWFudXBfY2FsbGJhY2t8IG9mIGEgcHJldmlvdXMKIC8vIGluc3RhbmNlIGZvciB8cGF0aHwgdG8gcnVuLgpkaWZmIC0tZ2l0IGEvbmV0L2Rpc2tfY2FjaGUvZGlza19jYWNoZV9mdXp6ZXIuY2MgYi9uZXQvZGlza19jYWNoZS9kaXNrX2NhY2hlX2Z1enplci5jYwppbmRleCAyZjFlZTA0Li5jYzUzMTAyOWMgMTAwNjQ0Ci0tLSBhL25ldC9kaXNrX2NhY2hlL2Rpc2tfY2FjaGVfZnV6emVyLmNjCisrKyBiL25ldC9kaXNrX2NhY2hlL2Rpc2tfY2FjaGVfZnV6emVyLmNjCkBAIC0yNDYsOSArMjQ2LDEwIEBACiAgICAgICBNQVlCRV9QUklOVCA8PCAiQ2FjaGUgdHlwZSA9IEFQUF9DQUNIRS4iIDw8IHN0ZDo6ZW5kbDsKICAgICAgIHJldHVybiBuZXQ6OkNhY2hlVHlwZTo6QVBQX0NBQ0hFOwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSBkaXNrX2NhY2hlX2Z1enplcjo6RnV6ekNvbW1hbmRzOjpNRURJQV9DQUNIRToKLSAgICAgIE1BWUJFX1BSSU5UIDw8ICJDYWNoZSB0eXBlID0gTUVESUFfQ0FDSEUuIiA8PCBzdGQ6OmVuZGw7Ci0gICAgICByZXR1cm4gbmV0OjpDYWNoZVR5cGU6Ok1FRElBX0NBQ0hFOworICAgIGNhc2UgZGlza19jYWNoZV9mdXp6ZXI6OkZ1enpDb21tYW5kczo6UkVNT1ZFRF9NRURJQV9DQUNIRToKKyAgICAgIC8vIE1lZGlhIGNhY2hlIG5vIGxvbmdlciBpbiB1c2U7IGhhbmRsZSBhcyBIVFRQX0NBQ0hFCisgICAgICBNQVlCRV9QUklOVCA8PCAiQ2FjaGUgdHlwZSA9IFJFTU9WRURfTUVESUFfQ0FDSEUuIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gbmV0OjpDYWNoZVR5cGU6OkRJU0tfQ0FDSEU7CiAgICAgICBicmVhazsKICAgICBjYXNlIGRpc2tfY2FjaGVfZnV6emVyOjpGdXp6Q29tbWFuZHM6OlNIQURFUl9DQUNIRToKICAgICAgIE1BWUJFX1BSSU5UIDw8ICJDYWNoZSB0eXBlID0gU0hBREVSX0NBQ0hFLiIgPDwgc3RkOjplbmRsOwpkaWZmIC0tZ2l0IGEvbmV0L2Rpc2tfY2FjaGUvZGlza19jYWNoZV9mdXp6ZXIucHJvdG8gYi9uZXQvZGlza19jYWNoZS9kaXNrX2NhY2hlX2Z1enplci5wcm90bwppbmRleCA3NzliZGI1Li5iOWRiZTA4IDEwMDY0NAotLS0gYS9uZXQvZGlza19jYWNoZS9kaXNrX2NhY2hlX2Z1enplci5wcm90bworKysgYi9uZXQvZGlza19jYWNoZS9kaXNrX2NhY2hlX2Z1enplci5wcm90bwpAQCAtMjUsNyArMjUsNyBAQAogCiAgIGVudW0gQ2FjaGVUeXBlIHsKICAgICBBUFBfQ0FDSEUgPSAxOwotICAgIE1FRElBX0NBQ0hFID0gMjsKKyAgICBSRU1PVkVEX01FRElBX0NBQ0hFID0gMjsKICAgICBTSEFERVJfQ0FDSEUgPSAzOwogICAgIFBOQUNMX0NBQ0hFID0gNDsKICAgICBHRU5FUkFURURfQllURV9DT0RFX0NBQ0hFID0gNTsKZGlmZiAtLWdpdCBhL25ldC9kaXNrX2NhY2hlL2VudHJ5X3VuaXR0ZXN0LmNjIGIvbmV0L2Rpc2tfY2FjaGUvZW50cnlfdW5pdHRlc3QuY2MKaW5kZXggZDkyNTg3ZC4uM2U2MDliOSAxMDA2NDQKLS0tIGEvbmV0L2Rpc2tfY2FjaGUvZW50cnlfdW5pdHRlc3QuY2MKKysrIGIvbmV0L2Rpc2tfY2FjaGUvZW50cnlfdW5pdHRlc3QuY2MKQEAgLTIxNzUsMTQgKzIxNzUsMTIgQEAKIH0KIAogVEVTVF9GKERpc2tDYWNoZUVudHJ5VGVzdCwgVXBkYXRlU3BhcnNlRW50cnkpIHsKLSAgU2V0Q2FjaGVUeXBlKG5ldDo6TUVESUFfQ0FDSEUpOwogICBJbml0Q2FjaGUoKTsKICAgVXBkYXRlU3BhcnNlRW50cnkoKTsKIH0KIAogVEVTVF9GKERpc2tDYWNoZUVudHJ5VGVzdCwgTWVtb3J5T25seVVwZGF0ZVNwYXJzZUVudHJ5KSB7CiAgIFNldE1lbW9yeU9ubHlNb2RlKCk7Ci0gIFNldENhY2hlVHlwZShuZXQ6Ok1FRElBX0NBQ0hFKTsKICAgSW5pdENhY2hlKCk7CiAgIFVwZGF0ZVNwYXJzZUVudHJ5KCk7CiB9CmRpZmYgLS1naXQgYS9uZXQvZGlza19jYWNoZS9zaW1wbGUvc2ltcGxlX2hpc3RvZ3JhbV9tYWNyb3MuaCBiL25ldC9kaXNrX2NhY2hlL3NpbXBsZS9zaW1wbGVfaGlzdG9ncmFtX21hY3Jvcy5oCmluZGV4IGUxMDc2NGQuLjg0ZDBhNTcgMTAwNjQ0Ci0tLSBhL25ldC9kaXNrX2NhY2hlL3NpbXBsZS9zaW1wbGVfaGlzdG9ncmFtX21hY3Jvcy5oCisrKyBiL25ldC9kaXNrX2NhY2hlL3NpbXBsZS9zaW1wbGVfaGlzdG9ncmFtX21hY3Jvcy5oCkBAIC0zMSwxMCArMzEsNiBAQAogICAgICAgICBTSU1QTEVfQ0FDSEVfVEhVTksodW1hX3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiU2ltcGxlQ2FjaGUuQXBwLiIgdW1hX25hbWUsICMjX19WQV9BUkdTX18pKTsgICBcCiAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY2FzZSBuZXQ6Ok1FRElBX0NBQ0hFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgU0lNUExFX0NBQ0hFX1RIVU5LKHVtYV90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoIlNpbXBsZUNhY2hlLk1lZGlhLiIgdW1hX25hbWUsICMjX19WQV9BUkdTX18pKTsgXAotICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgIGNhc2UgbmV0OjpHRU5FUkFURURfQllURV9DT0RFX0NBQ0hFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICBjYXNlIG5ldDo6R0VORVJBVEVEX05BVElWRV9DT0RFX0NBQ0hFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgY2FzZSBuZXQ6OlNIQURFUl9DQUNIRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL25ldC9xdWljL3F1aWNfaHR0cDNfbG9nZ2VyLmNjIGIvbmV0L3F1aWMvcXVpY19odHRwM19sb2dnZXIuY2MKaW5kZXggNjk4YmQxOC4uMWI1ZjkyM2YgMTAwNjQ0Ci0tLSBhL25ldC9xdWljL3F1aWNfaHR0cDNfbG9nZ2VyLmNjCisrKyBiL25ldC9xdWljL3F1aWNfaHR0cDNfbG9nZ2VyLmNjCkBAIC04LDYgKzgsNyBAQAogI2luY2x1ZGUgPHV0aWxpdHk+CiAjaW5jbHVkZSA8dmVjdG9yPgogCisjaW5jbHVkZSAiYmFzZS9tZXRyaWNzL2hpc3RvZ3JhbV9tYWNyb3MuaCIKICNpbmNsdWRlICJiYXNlL3N0cmluZ3Mvc3RyaW5nX251bWJlcl9jb252ZXJzaW9ucy5oIgogI2luY2x1ZGUgIm5ldC9sb2cvbmV0X2xvZ19jYXB0dXJlX21vZGUuaCIKICNpbmNsdWRlICJuZXQvbG9nL25ldF9sb2dfZXZlbnRfdHlwZS5oIgpAQCAtNjQsNiArNjUsMjQgQEAKIAogdm9pZCBRdWljSHR0cDNMb2dnZXI6Ok9uU2V0dGluZ3NGcmFtZVJlY2VpdmVkKAogICAgIGNvbnN0IHF1aWM6OlNldHRpbmdzRnJhbWUmIGZyYW1lKSB7CisgIC8vIEluY3JlbWVudCB2YWx1ZSBieSBvbmUgYmVjYXVzZSBlbXB0eSBTRVRUSU5HUyBmcmFtZXMgYXJlIGFsbG93ZWQsCisgIC8vIGJ1dCBoaXN0b2dyYW1zIGRvIG5vdCBzdXBwb3J0IHRoZSB2YWx1ZSB6ZXJvLgorICBVTUFfSElTVE9HUkFNX0NVU1RPTV9DT1VOVFMoIk5ldC5RdWljU2Vzc2lvbi5SZWNlaXZlZFNldHRpbmdzLkNvdW50UGx1c09uZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS52YWx1ZXMuc2l6ZSgpICsgMSwgLyogbWluID0gKi8gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1heCA9ICovIDEwLCAvKiBidWNrZXRzID0gKi8gMTApOworICBmb3IgKGNvbnN0IGF1dG8mIHZhbHVlIDogZnJhbWUudmFsdWVzKSB7CisgICAgaWYgKHZhbHVlLmZpcnN0ID09IHF1aWM6OlNFVFRJTkdTX1FQQUNLX01BWF9UQUJMRV9DQVBBQ0lUWSkgeworICAgICAgVU1BX0hJU1RPR1JBTV9DT1VOVFNfMTAwMDAoCisgICAgICAgICAgIk5ldC5RdWljU2Vzc2lvbi5SZWNlaXZlZFNldHRpbmdzLk1heFRhYmxlQ2FwYWNpdHkiLCB2YWx1ZS5zZWNvbmQpOworICAgIH0gZWxzZSBpZiAodmFsdWUuZmlyc3QgPT0gcXVpYzo6U0VUVElOR1NfTUFYX0hFQURFUl9MSVNUX1NJWkUpIHsKKyAgICAgIFVNQV9ISVNUT0dSQU1fQ09VTlRTXzEwMDAwKAorICAgICAgICAgICJOZXQuUXVpY1Nlc3Npb24uUmVjZWl2ZWRTZXR0aW5ncy5NYXhIZWFkZXJMaXN0U2l6ZSIsIHZhbHVlLnNlY29uZCk7CisgICAgfSBlbHNlIGlmICh2YWx1ZS5maXJzdCA9PSBxdWljOjpTRVRUSU5HU19RUEFDS19CTE9DS0VEX1NUUkVBTVMpIHsKKyAgICAgIFVNQV9ISVNUT0dSQU1fQ09VTlRTXzEwMDAoCisgICAgICAgICAgIk5ldC5RdWljU2Vzc2lvbi5SZWNlaXZlZFNldHRpbmdzLkJsb2NrZWRTdHJlYW1zIiwgdmFsdWUuc2Vjb25kKTsKKyAgICB9CisgIH0KKwogICBpZiAoIW5ldF9sb2dfLklzQ2FwdHVyaW5nKCkpCiAgICAgcmV0dXJuOwogICBuZXRfbG9nXy5BZGRFdmVudChOZXRMb2dFdmVudFR5cGU6OkhUVFAzX1NFVFRJTkdTX1JFQ0VJVkVELApkaWZmIC0tZ2l0IGEvbmV0L3F1aWMvcXVpY19odHRwM19sb2dnZXIuaCBiL25ldC9xdWljL3F1aWNfaHR0cDNfbG9nZ2VyLmgKaW5kZXggOWU1ODM1MzMuLjhhMWI2ODYgMTAwNjQ0Ci0tLSBhL25ldC9xdWljL3F1aWNfaHR0cDNfbG9nZ2VyLmgKKysrIGIvbmV0L3F1aWMvcXVpY19odHRwM19sb2dnZXIuaApAQCAtMTgsNyArMTgsNyBAQAogbmFtZXNwYWNlIG5ldCB7CiAKIC8vIFRoaXMgY2xhc3MgaXMgYSBkZWJ1ZyB2aXNpdG9yIG9mIGEgcXVpYzo6UXVpY1NwZHlTZXNzaW9uIHdoaWNoIGxvZ3MgZXZlbnRzCi0vLyB0byB8bmV0X2xvZ3wuCisvLyB0byB8bmV0X2xvZ3wgYW5kIHJlY29yZHMgaGlzdG9ncmFtcy4KIGNsYXNzIE5FVF9FWFBPUlRfUFJJVkFURSBRdWljSHR0cDNMb2dnZXIgOiBwdWJsaWMgcXVpYzo6SHR0cDNEZWJ1Z1Zpc2l0b3IgewogIHB1YmxpYzoKICAgZXhwbGljaXQgUXVpY0h0dHAzTG9nZ2VyKGNvbnN0IE5ldExvZ1dpdGhTb3VyY2UmIG5ldF9sb2cpOwpkaWZmIC0tZ2l0IGEvbmV0L3JlcG9ydGluZy9yZXBvcnRpbmdfZGVsaXZlcnlfYWdlbnQuY2MgYi9uZXQvcmVwb3J0aW5nL3JlcG9ydGluZ19kZWxpdmVyeV9hZ2VudC5jYwppbmRleCAwYzY0ZjNjLi43M2UwYTkxIDEwMDY0NAotLS0gYS9uZXQvcmVwb3J0aW5nL3JlcG9ydGluZ19kZWxpdmVyeV9hZ2VudC5jYworKysgYi9uZXQvcmVwb3J0aW5nL3JlcG9ydGluZ19kZWxpdmVyeV9hZ2VudC5jYwpAQCAtMjI5LDggKzIyOSw5IEBACiAgICAgICB9CiAKICAgICAgIC8vIFRPRE86IENhbGN1bGF0ZSBhY3R1YWwgbWF4IGRlcHRoLgorICAgICAgLy8gVE9ETyhtbWVua2UpOiBQb3B1bGF0ZSBOZXR3b3JrSXNvbGF0aW9uS2V5LgogICAgICAgdXBsb2FkZXIoKS0+U3RhcnRVcGxvYWQoCi0gICAgICAgICAgcmVwb3J0X29yaWdpbiwgZW5kcG9pbnQsIGpzb24sIG1heF9kZXB0aCwKKyAgICAgICAgICByZXBvcnRfb3JpZ2luLCBlbmRwb2ludCwgTmV0d29ya0lzb2xhdGlvbktleSgpLCBqc29uLCBtYXhfZGVwdGgsCiAgICAgICAgICAgYmFzZTo6QmluZE9uY2UoJlJlcG9ydGluZ0RlbGl2ZXJ5QWdlbnRJbXBsOjpPblVwbG9hZENvbXBsZXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgIHdlYWtfZmFjdG9yeV8uR2V0V2Vha1B0cigpLCBzdGQ6Om1vdmUoZGVsaXZlcnkpKSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbmV0L3JlcG9ydGluZy9yZXBvcnRpbmdfdGVzdF91dGlsLmNjIGIvbmV0L3JlcG9ydGluZy9yZXBvcnRpbmdfdGVzdF91dGlsLmNjCmluZGV4IDViMzZmZWZiLi5kMjI4ZTNhIDEwMDY0NAotLS0gYS9uZXQvcmVwb3J0aW5nL3JlcG9ydGluZ190ZXN0X3V0aWwuY2MKKysrIGIvbmV0L3JlcG9ydGluZy9yZXBvcnRpbmdfdGVzdF91dGlsLmNjCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSAiYmFzZS90ZXN0L3NpbXBsZV90ZXN0X2Nsb2NrLmgiCiAjaW5jbHVkZSAiYmFzZS90ZXN0L3NpbXBsZV90ZXN0X3RpY2tfY2xvY2suaCIKICNpbmNsdWRlICJiYXNlL3RpbWVyL21vY2tfdGltZXIuaCIKKyNpbmNsdWRlICJuZXQvYmFzZS9uZXR3b3JrX2lzb2xhdGlvbl9rZXkuaCIKICNpbmNsdWRlICJuZXQvcmVwb3J0aW5nL3JlcG9ydGluZ19jYWNoZS5oIgogI2luY2x1ZGUgIm5ldC9yZXBvcnRpbmcvcmVwb3J0aW5nX2NvbnRleHQuaCIKICNpbmNsdWRlICJuZXQvcmVwb3J0aW5nL3JlcG9ydGluZ19kZWxlZ2F0ZS5oIgpAQCAtMzYsMTEgKzM3LDEzIEBACiAgcHVibGljOgogICBQZW5kaW5nVXBsb2FkSW1wbChjb25zdCB1cmw6Ok9yaWdpbiYgcmVwb3J0X29yaWdpbiwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1VSTCYgdXJsLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBOZXR3b3JrSXNvbGF0aW9uS2V5JiBuZXR3b3JrX2lzb2xhdGlvbl9rZXksCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBqc29uLAogICAgICAgICAgICAgICAgICAgICBSZXBvcnRpbmdVcGxvYWRlcjo6VXBsb2FkQ2FsbGJhY2sgY2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKFBlbmRpbmdVcGxvYWQqKT4gY29tcGxldGVfY2FsbGJhY2spCiAgICAgICA6IHJlcG9ydF9vcmlnaW5fKHJlcG9ydF9vcmlnaW4pLAogICAgICAgICB1cmxfKHVybCksCisgICAgICAgIG5ldHdvcmtfaXNvbGF0aW9uX2tleV8obmV0d29ya19pc29sYXRpb25fa2V5KSwKICAgICAgICAganNvbl8oanNvbiksCiAgICAgICAgIGNhbGxiYWNrXyhzdGQ6Om1vdmUoY2FsbGJhY2spKSwKICAgICAgICAgY29tcGxldGVfY2FsbGJhY2tfKHN0ZDo6bW92ZShjb21wbGV0ZV9jYWxsYmFjaykpIHt9CkBAIC02NCw2ICs2Nyw3IEBACiAgcHJpdmF0ZToKICAgdXJsOjpPcmlnaW4gcmVwb3J0X29yaWdpbl87CiAgIEdVUkwgdXJsXzsKKyAgTmV0d29ya0lzb2xhdGlvbktleSBuZXR3b3JrX2lzb2xhdGlvbl9rZXlfOwogICBzdGQ6OnN0cmluZyBqc29uXzsKICAgUmVwb3J0aW5nVXBsb2FkZXI6OlVwbG9hZENhbGxiYWNrIGNhbGxiYWNrXzsKICAgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQoUGVuZGluZ1VwbG9hZCopPiBjb21wbGV0ZV9jYWxsYmFja187CkBAIC05OCwxMyArMTAyLDE1IEBACiBUZXN0UmVwb3J0aW5nVXBsb2FkZXI6OlRlc3RSZXBvcnRpbmdVcGxvYWRlcigpID0gZGVmYXVsdDsKIFRlc3RSZXBvcnRpbmdVcGxvYWRlcjo6flRlc3RSZXBvcnRpbmdVcGxvYWRlcigpID0gZGVmYXVsdDsKIAotdm9pZCBUZXN0UmVwb3J0aW5nVXBsb2FkZXI6OlN0YXJ0VXBsb2FkKGNvbnN0IHVybDo6T3JpZ2luJiByZXBvcnRfb3JpZ2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdVUkwmIHVybCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYganNvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X2RlcHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVwbG9hZENhbGxiYWNrIGNhbGxiYWNrKSB7Cit2b2lkIFRlc3RSZXBvcnRpbmdVcGxvYWRlcjo6U3RhcnRVcGxvYWQoCisgICAgY29uc3QgdXJsOjpPcmlnaW4mIHJlcG9ydF9vcmlnaW4sCisgICAgY29uc3QgR1VSTCYgdXJsLAorICAgIGNvbnN0IE5ldHdvcmtJc29sYXRpb25LZXkmIG5ldHdvcmtfaXNvbGF0aW9uX2tleSwKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYganNvbiwKKyAgICBpbnQgbWF4X2RlcHRoLAorICAgIFVwbG9hZENhbGxiYWNrIGNhbGxiYWNrKSB7CiAgIHBlbmRpbmdfdXBsb2Fkc18ucHVzaF9iYWNrKHN0ZDo6bWFrZV91bmlxdWU8UGVuZGluZ1VwbG9hZEltcGw+KAotICAgICAgcmVwb3J0X29yaWdpbiwgdXJsLCBqc29uLCBzdGQ6Om1vdmUoY2FsbGJhY2spLAorICAgICAgcmVwb3J0X29yaWdpbiwgdXJsLCBuZXR3b3JrX2lzb2xhdGlvbl9rZXksIGpzb24sIHN0ZDo6bW92ZShjYWxsYmFjayksCiAgICAgICBiYXNlOjpCaW5kT25jZSgmRXJhc2VQZW5kaW5nVXBsb2FkLCAmcGVuZGluZ191cGxvYWRzXykpKTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L3JlcG9ydGluZy9yZXBvcnRpbmdfdGVzdF91dGlsLmggYi9uZXQvcmVwb3J0aW5nL3JlcG9ydGluZ190ZXN0X3V0aWwuaAppbmRleCBlNzVhNzIxLi42ODIzOGQyYiAxMDA2NDQKLS0tIGEvbmV0L3JlcG9ydGluZy9yZXBvcnRpbmdfdGVzdF91dGlsLmgKKysrIGIvbmV0L3JlcG9ydGluZy9yZXBvcnRpbmdfdGVzdF91dGlsLmgKQEAgLTM3LDYgKzM3LDcgQEAKIAogbmFtZXNwYWNlIG5ldCB7CiAKK2NsYXNzIE5ldHdvcmtJc29sYXRpb25LZXk7CiBzdHJ1Y3QgUmVwb3J0aW5nRW5kcG9pbnQ7CiBjbGFzcyBSZXBvcnRpbmdHYXJiYWdlQ29sbGVjdG9yOwogCkBAIC04MSw2ICs4Miw3IEBACiAKICAgdm9pZCBTdGFydFVwbG9hZChjb25zdCB1cmw6Ok9yaWdpbiYgcmVwb3J0X29yaWdpbiwKICAgICAgICAgICAgICAgICAgICBjb25zdCBHVVJMJiB1cmwsCisgICAgICAgICAgICAgICAgICAgY29uc3QgTmV0d29ya0lzb2xhdGlvbktleSYgbmV0d29ya19pc29sYXRpb25fa2V5LAogICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBqc29uLAogICAgICAgICAgICAgICAgICAgIGludCBtYXhfZGVwdGgsCiAgICAgICAgICAgICAgICAgICAgVXBsb2FkQ2FsbGJhY2sgY2FsbGJhY2spIG92ZXJyaWRlOwpkaWZmIC0tZ2l0IGEvbmV0L3JlcG9ydGluZy9yZXBvcnRpbmdfdXBsb2FkZXIuY2MgYi9uZXQvcmVwb3J0aW5nL3JlcG9ydGluZ191cGxvYWRlci5jYwppbmRleCA5MzBhNDlmLi5kMzNlNTE4IDEwMDY0NAotLS0gYS9uZXQvcmVwb3J0aW5nL3JlcG9ydGluZ191cGxvYWRlci5jYworKysgYi9uZXQvcmVwb3J0aW5nL3JlcG9ydGluZ191cGxvYWRlci5jYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgImJhc2Uvc3RyaW5ncy9zdHJpbmdfdXRpbC5oIgogI2luY2x1ZGUgIm5ldC9iYXNlL2VsZW1lbnRzX3VwbG9hZF9kYXRhX3N0cmVhbS5oIgogI2luY2x1ZGUgIm5ldC9iYXNlL2xvYWRfZmxhZ3MuaCIKKyNpbmNsdWRlICJuZXQvYmFzZS9uZXR3b3JrX2lzb2xhdGlvbl9rZXkuaCIKICNpbmNsdWRlICJuZXQvYmFzZS91cGxvYWRfYnl0ZXNfZWxlbWVudF9yZWFkZXIuaCIKICNpbmNsdWRlICJuZXQvaHR0cC9odHRwX3Jlc3BvbnNlX2hlYWRlcnMuaCIKICNpbmNsdWRlICJuZXQvdHJhZmZpY19hbm5vdGF0aW9uL25ldHdvcmtfdHJhZmZpY19hbm5vdGF0aW9uLmgiCkBAIC0xMDIsMTIgKzEwMywxNCBAQAogCiAgIFBlbmRpbmdVcGxvYWQoY29uc3QgdXJsOjpPcmlnaW4mIHJlcG9ydF9vcmlnaW4sCiAgICAgICAgICAgICAgICAgY29uc3QgR1VSTCYgdXJsLAorICAgICAgICAgICAgICAgIGNvbnN0IE5ldHdvcmtJc29sYXRpb25LZXkmIG5ldHdvcmtfaXNvbGF0aW9uX2tleSwKICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYganNvbiwKICAgICAgICAgICAgICAgICBpbnQgbWF4X2RlcHRoLAogICAgICAgICAgICAgICAgIFJlcG9ydGluZ1VwbG9hZGVyOjpVcGxvYWRDYWxsYmFjayBjYWxsYmFjaykKICAgICAgIDogc3RhdGUoQ1JFQVRFRCksCiAgICAgICAgIHJlcG9ydF9vcmlnaW4ocmVwb3J0X29yaWdpbiksCiAgICAgICAgIHVybCh1cmwpLAorICAgICAgICBuZXR3b3JrX2lzb2xhdGlvbl9rZXkobmV0d29ya19pc29sYXRpb25fa2V5KSwKICAgICAgICAgcGF5bG9hZF9yZWFkZXIoVXBsb2FkT3duZWRCeXRlc0VsZW1lbnRSZWFkZXI6OkNyZWF0ZVdpdGhTdHJpbmcoanNvbikpLAogICAgICAgICBtYXhfZGVwdGgobWF4X2RlcHRoKSwKICAgICAgICAgY2FsbGJhY2soc3RkOjptb3ZlKGNhbGxiYWNrKSkge30KQEAgLTExOSw2ICsxMjIsNyBAQAogICBTdGF0ZSBzdGF0ZTsKICAgY29uc3QgdXJsOjpPcmlnaW4gcmVwb3J0X29yaWdpbjsKICAgY29uc3QgR1VSTCB1cmw7CisgIGNvbnN0IE5ldHdvcmtJc29sYXRpb25LZXkgbmV0d29ya19pc29sYXRpb25fa2V5OwogICBzdGQ6OnVuaXF1ZV9wdHI8VXBsb2FkRWxlbWVudFJlYWRlcj4gcGF5bG9hZF9yZWFkZXI7CiAgIGludCBtYXhfZGVwdGg7CiAgIFJlcG9ydGluZ1VwbG9hZGVyOjpVcGxvYWRDYWxsYmFjayBjYWxsYmFjazsKQEAgLTE0MCwxMSArMTQ0LDEzIEBACiAKICAgdm9pZCBTdGFydFVwbG9hZChjb25zdCB1cmw6Ok9yaWdpbiYgcmVwb3J0X29yaWdpbiwKICAgICAgICAgICAgICAgICAgICBjb25zdCBHVVJMJiB1cmwsCisgICAgICAgICAgICAgICAgICAgY29uc3QgTmV0d29ya0lzb2xhdGlvbktleSYgbmV0d29ya19pc29sYXRpb25fa2V5LAogICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBqc29uLAogICAgICAgICAgICAgICAgICAgIGludCBtYXhfZGVwdGgsCiAgICAgICAgICAgICAgICAgICAgVXBsb2FkQ2FsbGJhY2sgY2FsbGJhY2spIG92ZXJyaWRlIHsKICAgICBhdXRvIHVwbG9hZCA9IHN0ZDo6bWFrZV91bmlxdWU8UGVuZGluZ1VwbG9hZD4oCi0gICAgICAgIHJlcG9ydF9vcmlnaW4sIHVybCwganNvbiwgbWF4X2RlcHRoLCBzdGQ6Om1vdmUoY2FsbGJhY2spKTsKKyAgICAgICAgcmVwb3J0X29yaWdpbiwgdXJsLCBuZXR3b3JrX2lzb2xhdGlvbl9rZXksIGpzb24sIG1heF9kZXB0aCwKKyAgICAgICAgc3RkOjptb3ZlKGNhbGxiYWNrKSk7CiAgICAgYXV0byBjb2xsZWN0b3Jfb3JpZ2luID0gdXJsOjpPcmlnaW46OkNyZWF0ZSh1cmwpOwogICAgIGlmIChjb2xsZWN0b3Jfb3JpZ2luID09IHJlcG9ydF9vcmlnaW4pIHsKICAgICAgIC8vIFNraXAgdGhlIHByZWZsaWdodCBjaGVjayBpZiB0aGUgcmVwb3J0cyBhcmUgYmVpbmcgc2VudCB0byB0aGUgc2FtZQpAQCAtMTcxLDYgKzE3Nyw3IEBACiAKICAgICB1cGxvYWQtPnJlcXVlc3QtPlNldExvYWRGbGFncyhMT0FEX0RJU0FCTEVfQ0FDSEUpOwogICAgIHVwbG9hZC0+cmVxdWVzdC0+c2V0X2FsbG93X2NyZWRlbnRpYWxzKGZhbHNlKTsKKyAgICB1cGxvYWQtPnJlcXVlc3QtPnNldF9uZXR3b3JrX2lzb2xhdGlvbl9rZXkodXBsb2FkLT5uZXR3b3JrX2lzb2xhdGlvbl9rZXkpOwogCiAgICAgdXBsb2FkLT5yZXF1ZXN0LT5TZXRFeHRyYVJlcXVlc3RIZWFkZXJCeU5hbWUoCiAgICAgICAgIEh0dHBSZXF1ZXN0SGVhZGVyczo6a09yaWdpbiwgdXBsb2FkLT5yZXBvcnRfb3JpZ2luLlNlcmlhbGl6ZSgpLCB0cnVlKTsKQEAgLTE5NywxMSArMjA0LDExIEBACiAgICAgdXBsb2FkLT5zdGF0ZSA9IFBlbmRpbmdVcGxvYWQ6OlNFTkRJTkdfUEFZTE9BRDsKICAgICB1cGxvYWQtPnJlcXVlc3QgPSBjb250ZXh0Xy0+Q3JlYXRlUmVxdWVzdCh1cGxvYWQtPnVybCwgSURMRSwgdGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmVwb3J0VXBsb2FkVHJhZmZpY0Fubm90YXRpb24pOwotCiAgICAgdXBsb2FkLT5yZXF1ZXN0LT5zZXRfbWV0aG9kKCJQT1NUIik7CiAKICAgICB1cGxvYWQtPnJlcXVlc3QtPlNldExvYWRGbGFncyhMT0FEX0RJU0FCTEVfQ0FDSEUpOwogICAgIHVwbG9hZC0+cmVxdWVzdC0+c2V0X2FsbG93X2NyZWRlbnRpYWxzKGZhbHNlKTsKKyAgICB1cGxvYWQtPnJlcXVlc3QtPnNldF9uZXR3b3JrX2lzb2xhdGlvbl9rZXkodXBsb2FkLT5uZXR3b3JrX2lzb2xhdGlvbl9rZXkpOwogCiAgICAgdXBsb2FkLT5yZXF1ZXN0LT5TZXRFeHRyYVJlcXVlc3RIZWFkZXJCeU5hbWUoCiAgICAgICAgIEh0dHBSZXF1ZXN0SGVhZGVyczo6a0NvbnRlbnRUeXBlLCBrVXBsb2FkQ29udGVudFR5cGUsIHRydWUpOwpkaWZmIC0tZ2l0IGEvbmV0L3JlcG9ydGluZy9yZXBvcnRpbmdfdXBsb2FkZXIuaCBiL25ldC9yZXBvcnRpbmcvcmVwb3J0aW5nX3VwbG9hZGVyLmgKaW5kZXggMGYzOTQ4YS4uOWZhMDMxOCAxMDA2NDQKLS0tIGEvbmV0L3JlcG9ydGluZy9yZXBvcnRpbmdfdXBsb2FkZXIuaAorKysgYi9uZXQvcmVwb3J0aW5nL3JlcG9ydGluZ191cGxvYWRlci5oCkBAIC0xOSw2ICsxOSw3IEBACiAKIG5hbWVzcGFjZSBuZXQgewogCitjbGFzcyBOZXR3b3JrSXNvbGF0aW9uS2V5OwogY2xhc3MgVVJMUmVxdWVzdENvbnRleHQ7CiAKIC8vIFVwbG9hZHMgYWxyZWFkeS1zZXJpYWxpemVkIHJlcG9ydHMgYW5kIGNvbnZlcnRzIHJlc3BvbnNlcyB0byBvbmUgb2YgdGhlCkBAIC0zNyw2ICszOCw3IEBACiAgIC8vIHxyZXBvcnRfb3JpZ2lufCBtdXN0IGJlIHRoYXQgb3JpZ2luLgogICB2aXJ0dWFsIHZvaWQgU3RhcnRVcGxvYWQoY29uc3QgdXJsOjpPcmlnaW4mIHJlcG9ydF9vcmlnaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVVJMJiB1cmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBOZXR3b3JrSXNvbGF0aW9uS2V5JiBuZXR3b3JrX2lzb2xhdGlvbl9rZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYganNvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfZGVwdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcGxvYWRDYWxsYmFjayBjYWxsYmFjaykgPSAwOwpkaWZmIC0tZ2l0IGEvbmV0L3JlcG9ydGluZy9yZXBvcnRpbmdfdXBsb2FkZXJfdW5pdHRlc3QuY2MgYi9uZXQvcmVwb3J0aW5nL3JlcG9ydGluZ191cGxvYWRlcl91bml0dGVzdC5jYwppbmRleCA3NjE4YzExOC4uZjNlMGVkZiAxMDA2NDQKLS0tIGEvbmV0L3JlcG9ydGluZy9yZXBvcnRpbmdfdXBsb2FkZXJfdW5pdHRlc3QuY2MKKysrIGIvbmV0L3JlcG9ydGluZy9yZXBvcnRpbmdfdXBsb2FkZXJfdW5pdHRlc3QuY2MKQEAgLTExLDkgKzExLDEzIEBACiAjaW5jbHVkZSAiYmFzZS9iaW5kLmgiCiAjaW5jbHVkZSAiYmFzZS9jYWxsYmFjay5oIgogI2luY2x1ZGUgImJhc2UvcnVuX2xvb3AuaCIKKyNpbmNsdWRlICJiYXNlL3Rlc3Qvc2NvcGVkX2ZlYXR1cmVfbGlzdC5oIgorI2luY2x1ZGUgIm5ldC9iYXNlL2ZlYXR1cmVzLmgiCisjaW5jbHVkZSAibmV0L2Jhc2UvbmV0d29ya19pc29sYXRpb25fa2V5LmgiCiAjaW5jbHVkZSAibmV0L2Nvb2tpZXMvY29va2llX3N0b3JlLmgiCiAjaW5jbHVkZSAibmV0L2Nvb2tpZXMvY29va2llX3N0b3JlX3Rlc3RfY2FsbGJhY2tzLmgiCiAjaW5jbHVkZSAibmV0L2h0dHAvaHR0cF9zdGF0dXNfY29kZS5oIgorI2luY2x1ZGUgIm5ldC9zb2NrZXQvc29ja2V0X3Rlc3RfdXRpbC5oIgogI2luY2x1ZGUgIm5ldC90ZXN0L2VtYmVkZGVkX3Rlc3Rfc2VydmVyL2VtYmVkZGVkX3Rlc3Rfc2VydmVyLmgiCiAjaW5jbHVkZSAibmV0L3Rlc3QvZW1iZWRkZWRfdGVzdF9zZXJ2ZXIvaHR0cF9yZXF1ZXN0LmgiCiAjaW5jbHVkZSAibmV0L3Rlc3QvZW1iZWRkZWRfdGVzdF9zZXJ2ZXIvaHR0cF9yZXNwb25zZS5oIgpAQCAtMTMyLDggKzEzNiw4IEBACiAgIEFTU0VSVF9UUlVFKHNlcnZlcl8uU3RhcnQoKSk7CiAKICAgVGVzdFVwbG9hZENhbGxiYWNrIGNhbGxiYWNrOwotICB1cGxvYWRlcl8tPlN0YXJ0VXBsb2FkKGtPcmlnaW4sIHNlcnZlcl8uR2V0VVJMKCIvIiksIGtVcGxvYWRCb2R5LCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGxiYWNrKCkpOworICB1cGxvYWRlcl8tPlN0YXJ0VXBsb2FkKGtPcmlnaW4sIHNlcnZlcl8uR2V0VVJMKCIvIiksIE5ldHdvcmtJc29sYXRpb25LZXkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBrVXBsb2FkQm9keSwgMCwgY2FsbGJhY2suY2FsbGJhY2soKSk7CiAgIGNhbGxiYWNrLldhaXRGb3JDYWxsKCk7CiB9CiAKQEAgLTE0Myw4ICsxNDcsOCBAQAogICBBU1NFUlRfVFJVRShzZXJ2ZXJfLlN0YXJ0KCkpOwogCiAgIFRlc3RVcGxvYWRDYWxsYmFjayBjYWxsYmFjazsKLSAgdXBsb2FkZXJfLT5TdGFydFVwbG9hZChrT3JpZ2luLCBzZXJ2ZXJfLkdldFVSTCgiLyIpLCBrVXBsb2FkQm9keSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsYmFjaygpKTsKKyAgdXBsb2FkZXJfLT5TdGFydFVwbG9hZChrT3JpZ2luLCBzZXJ2ZXJfLkdldFVSTCgiLyIpLCBOZXR3b3JrSXNvbGF0aW9uS2V5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAga1VwbG9hZEJvZHksIDAsIGNhbGxiYWNrLmNhbGxiYWNrKCkpOwogICBjYWxsYmFjay5XYWl0Rm9yQ2FsbCgpOwogCiAgIEVYUEVDVF9FUShSZXBvcnRpbmdVcGxvYWRlcjo6T3V0Y29tZTo6U1VDQ0VTUywgY2FsbGJhY2sub3V0Y29tZSgpKTsKQEAgLTE1Niw3ICsxNjAsOCBAQAogICBBU1NFUlRfVFJVRShzZXJ2ZXJfLlNodXRkb3duQW5kV2FpdFVudGlsQ29tcGxldGUoKSk7CiAKICAgVGVzdFVwbG9hZENhbGxiYWNrIGNhbGxiYWNrOwotICB1cGxvYWRlcl8tPlN0YXJ0VXBsb2FkKGtPcmlnaW4sIHVybCwga1VwbG9hZEJvZHksIDAsIGNhbGxiYWNrLmNhbGxiYWNrKCkpOworICB1cGxvYWRlcl8tPlN0YXJ0VXBsb2FkKGtPcmlnaW4sIHVybCwgTmV0d29ya0lzb2xhdGlvbktleSgpLCBrVXBsb2FkQm9keSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsYmFjaygpKTsKICAgY2FsbGJhY2suV2FpdEZvckNhbGwoKTsKIAogICBFWFBFQ1RfRVEoUmVwb3J0aW5nVXBsb2FkZXI6Ok91dGNvbWU6OkZBSUxVUkUsIGNhbGxiYWNrLm91dGNvbWUoKSk7CkBAIC0xNjgsOCArMTczLDggQEAKICAgQVNTRVJUX1RSVUUoc2VydmVyXy5TdGFydCgpKTsKIAogICBUZXN0VXBsb2FkQ2FsbGJhY2sgY2FsbGJhY2s7Ci0gIHVwbG9hZGVyXy0+U3RhcnRVcGxvYWQoa09yaWdpbiwgc2VydmVyXy5HZXRVUkwoIi8iKSwga1VwbG9hZEJvZHksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbGJhY2soKSk7CisgIHVwbG9hZGVyXy0+U3RhcnRVcGxvYWQoa09yaWdpbiwgc2VydmVyXy5HZXRVUkwoIi8iKSwgTmV0d29ya0lzb2xhdGlvbktleSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGtVcGxvYWRCb2R5LCAwLCBjYWxsYmFjay5jYWxsYmFjaygpKTsKICAgY2FsbGJhY2suV2FpdEZvckNhbGwoKTsKIAogICBFWFBFQ1RfRVEoUmVwb3J0aW5nVXBsb2FkZXI6Ok91dGNvbWU6OkZBSUxVUkUsIGNhbGxiYWNrLm91dGNvbWUoKSk7CkBAIC0xODIsOCArMTg3LDggQEAKICAgQVNTRVJUX1RSVUUoc2VydmVyXy5TdGFydCgpKTsKIAogICBUZXN0VXBsb2FkQ2FsbGJhY2sgY2FsbGJhY2s7Ci0gIHVwbG9hZGVyXy0+U3RhcnRVcGxvYWQoa09yaWdpbiwgc2VydmVyXy5HZXRVUkwoIi8iKSwga1VwbG9hZEJvZHksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbGJhY2soKSk7CisgIHVwbG9hZGVyXy0+U3RhcnRVcGxvYWQoa09yaWdpbiwgc2VydmVyXy5HZXRVUkwoIi8iKSwgTmV0d29ya0lzb2xhdGlvbktleSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGtVcGxvYWRCb2R5LCAwLCBjYWxsYmFjay5jYWxsYmFjaygpKTsKICAgY2FsbGJhY2suV2FpdEZvckNhbGwoKTsKIAogICBFWFBFQ1RfRVEoUmVwb3J0aW5nVXBsb2FkZXI6Ok91dGNvbWU6OkZBSUxVUkUsIGNhbGxiYWNrLm91dGNvbWUoKSk7CkBAIC0yMDcsOCArMjEyLDggQEAKICAgQVNTRVJUX1RSVUUoc2VydmVyXy5TdGFydCgpKTsKIAogICBUZXN0VXBsb2FkQ2FsbGJhY2sgY2FsbGJhY2s7Ci0gIHVwbG9hZGVyXy0+U3RhcnRVcGxvYWQoa09yaWdpbiwgc2VydmVyXy5HZXRVUkwoIi8iKSwga1VwbG9hZEJvZHksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbGJhY2soKSk7CisgIHVwbG9hZGVyXy0+U3RhcnRVcGxvYWQoa09yaWdpbiwgc2VydmVyXy5HZXRVUkwoIi8iKSwgTmV0d29ya0lzb2xhdGlvbktleSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGtVcGxvYWRCb2R5LCAwLCBjYWxsYmFjay5jYWxsYmFjaygpKTsKICAgY2FsbGJhY2suV2FpdEZvckNhbGwoKTsKIAogICBFWFBFQ1RfVFJVRShwcmVmbGlnaHRfcmVjZWl2ZWQpOwpAQCAtMjI0LDcgKzIyOSw4IEBACiAKICAgVGVzdFVwbG9hZENhbGxiYWNrIGNhbGxiYWNrOwogICBhdXRvIHNlcnZlcl9vcmlnaW4gPSB1cmw6Ok9yaWdpbjo6Q3JlYXRlKHNlcnZlcl8uYmFzZV91cmwoKSk7Ci0gIHVwbG9hZGVyXy0+U3RhcnRVcGxvYWQoc2VydmVyX29yaWdpbiwgc2VydmVyXy5HZXRVUkwoIi8iKSwga1VwbG9hZEJvZHksIDAsCisgIHVwbG9hZGVyXy0+U3RhcnRVcGxvYWQoc2VydmVyX29yaWdpbiwgc2VydmVyXy5HZXRVUkwoIi8iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrSXNvbGF0aW9uS2V5KCksIGtVcGxvYWRCb2R5LCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGxiYWNrKCkpOwogICBjYWxsYmFjay5XYWl0Rm9yQ2FsbCgpOwogCkBAIC0yNTAsOCArMjU2LDggQEAKICAgQVNTRVJUX1RSVUUoc2VydmVyXy5TdGFydCgpKTsKIAogICBUZXN0VXBsb2FkQ2FsbGJhY2sgY2FsbGJhY2s7Ci0gIHVwbG9hZGVyXy0+U3RhcnRVcGxvYWQoa09yaWdpbiwgc2VydmVyXy5HZXRVUkwoIi8iKSwga1VwbG9hZEJvZHksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbGJhY2soKSk7CisgIHVwbG9hZGVyXy0+U3RhcnRVcGxvYWQoa09yaWdpbiwgc2VydmVyXy5HZXRVUkwoIi8iKSwgTmV0d29ya0lzb2xhdGlvbktleSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGtVcGxvYWRCb2R5LCAwLCBjYWxsYmFjay5jYWxsYmFjaygpKTsKICAgY2FsbGJhY2suV2FpdEZvckNhbGwoKTsKIAogICBFWFBFQ1RfRVEoUmVwb3J0aW5nVXBsb2FkZXI6Ok91dGNvbWU6OkZBSUxVUkUsIGNhbGxiYWNrLm91dGNvbWUoKSk7CkBAIC0yODAsOCArMjg2LDggQEAKICAgQVNTRVJUX1RSVUUoc2VydmVyXy5TdGFydCgpKTsKIAogICBUZXN0VXBsb2FkQ2FsbGJhY2sgY2FsbGJhY2s7Ci0gIHVwbG9hZGVyXy0+U3RhcnRVcGxvYWQoa09yaWdpbiwgc2VydmVyXy5HZXRVUkwoIi8iKSwga1VwbG9hZEJvZHksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbGJhY2soKSk7CisgIHVwbG9hZGVyXy0+U3RhcnRVcGxvYWQoa09yaWdpbiwgc2VydmVyXy5HZXRVUkwoIi8iKSwgTmV0d29ya0lzb2xhdGlvbktleSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGtVcGxvYWRCb2R5LCAwLCBjYWxsYmFjay5jYWxsYmFjaygpKTsKICAgY2FsbGJhY2suV2FpdEZvckNhbGwoKTsKIAogICBFWFBFQ1RfRVEoUmVwb3J0aW5nVXBsb2FkZXI6Ok91dGNvbWU6OkZBSUxVUkUsIGNhbGxiYWNrLm91dGNvbWUoKSk7CkBAIC0zMTAsOCArMzE2LDggQEAKICAgQVNTRVJUX1RSVUUoc2VydmVyXy5TdGFydCgpKTsKIAogICBUZXN0VXBsb2FkQ2FsbGJhY2sgY2FsbGJhY2s7Ci0gIHVwbG9hZGVyXy0+U3RhcnRVcGxvYWQoa09yaWdpbiwgc2VydmVyXy5HZXRVUkwoIi8iKSwga1VwbG9hZEJvZHksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbGJhY2soKSk7CisgIHVwbG9hZGVyXy0+U3RhcnRVcGxvYWQoa09yaWdpbiwgc2VydmVyXy5HZXRVUkwoIi8iKSwgTmV0d29ya0lzb2xhdGlvbktleSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGtVcGxvYWRCb2R5LCAwLCBjYWxsYmFjay5jYWxsYmFjaygpKTsKICAgY2FsbGJhY2suV2FpdEZvckNhbGwoKTsKIAogICBFWFBFQ1RfRVEoUmVwb3J0aW5nVXBsb2FkZXI6Ok91dGNvbWU6OkZBSUxVUkUsIGNhbGxiYWNrLm91dGNvbWUoKSk7CkBAIC0zNDAsOCArMzQ2LDggQEAKICAgQVNTRVJUX1RSVUUoc2VydmVyXy5TdGFydCgpKTsKIAogICBUZXN0VXBsb2FkQ2FsbGJhY2sgY2FsbGJhY2s7Ci0gIHVwbG9hZGVyXy0+U3RhcnRVcGxvYWQoa09yaWdpbiwgc2VydmVyXy5HZXRVUkwoIi8iKSwga1VwbG9hZEJvZHksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbGJhY2soKSk7CisgIHVwbG9hZGVyXy0+U3RhcnRVcGxvYWQoa09yaWdpbiwgc2VydmVyXy5HZXRVUkwoIi8iKSwgTmV0d29ya0lzb2xhdGlvbktleSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGtVcGxvYWRCb2R5LCAwLCBjYWxsYmFjay5jYWxsYmFjaygpKTsKICAgY2FsbGJhY2suV2FpdEZvckNhbGwoKTsKIAogICBFWFBFQ1RfRVEoUmVwb3J0aW5nVXBsb2FkZXI6Ok91dGNvbWU6OkZBSUxVUkUsIGNhbGxiYWNrLm91dGNvbWUoKSk7CkBAIC0zNTQsOCArMzYwLDggQEAKICAgQVNTRVJUX1RSVUUoc2VydmVyXy5TdGFydCgpKTsKIAogICBUZXN0VXBsb2FkQ2FsbGJhY2sgY2FsbGJhY2s7Ci0gIHVwbG9hZGVyXy0+U3RhcnRVcGxvYWQoa09yaWdpbiwgc2VydmVyXy5HZXRVUkwoIi8iKSwga1VwbG9hZEJvZHksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbGJhY2soKSk7CisgIHVwbG9hZGVyXy0+U3RhcnRVcGxvYWQoa09yaWdpbiwgc2VydmVyXy5HZXRVUkwoIi8iKSwgTmV0d29ya0lzb2xhdGlvbktleSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGtVcGxvYWRCb2R5LCAwLCBjYWxsYmFjay5jYWxsYmFjaygpKTsKICAgY2FsbGJhY2suV2FpdEZvckNhbGwoKTsKIAogICBFWFBFQ1RfRVEoUmVwb3J0aW5nVXBsb2FkZXI6Ok91dGNvbWU6OlJFTU9WRV9FTkRQT0lOVCwgY2FsbGJhY2sub3V0Y29tZSgpKTsKQEAgLTM5OCw4ICs0MDQsOCBAQAogICBBU1NFUlRfVFJVRShzZXJ2ZXJfLlN0YXJ0KCkpOwogCiAgIFRlc3RVcGxvYWRDYWxsYmFjayBjYWxsYmFjazsKLSAgdXBsb2FkZXJfLT5TdGFydFVwbG9hZChrT3JpZ2luLCBzZXJ2ZXJfLkdldFVSTCgiLyIpLCBrVXBsb2FkQm9keSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsYmFjaygpKTsKKyAgdXBsb2FkZXJfLT5TdGFydFVwbG9hZChrT3JpZ2luLCBzZXJ2ZXJfLkdldFVSTCgiLyIpLCBOZXR3b3JrSXNvbGF0aW9uS2V5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAga1VwbG9hZEJvZHksIDAsIGNhbGxiYWNrLmNhbGxiYWNrKCkpOwogICBjYWxsYmFjay5XYWl0Rm9yQ2FsbCgpOwogCiAgIEVYUEVDVF9UUlVFKGZvbGxvd2VkKTsKQEAgLTQyMSw4ICs0MjcsOCBAQAogICBBU1NFUlRfVFJVRShzZXJ2ZXJfLlN0YXJ0KCkpOwogCiAgIFRlc3RVcGxvYWRDYWxsYmFjayBjYWxsYmFjazsKLSAgdXBsb2FkZXJfLT5TdGFydFVwbG9hZChrT3JpZ2luLCBzZXJ2ZXJfLkdldFVSTCgiLyIpLCBrVXBsb2FkQm9keSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsYmFjaygpKTsKKyAgdXBsb2FkZXJfLT5TdGFydFVwbG9hZChrT3JpZ2luLCBzZXJ2ZXJfLkdldFVSTCgiLyIpLCBOZXR3b3JrSXNvbGF0aW9uS2V5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAga1VwbG9hZEJvZHksIDAsIGNhbGxiYWNrLmNhbGxiYWNrKCkpOwogICBjYWxsYmFjay5XYWl0Rm9yQ2FsbCgpOwogCiAgIEVYUEVDVF9GQUxTRShmb2xsb3dlZCk7CkBAIC00NTIsOCArNDU4LDggQEAKICAgQVNTRVJUX1RSVUUoY29va2llX2NhbGxiYWNrLnJlc3VsdCgpLklzSW5jbHVkZSgpKTsKIAogICBUZXN0VXBsb2FkQ2FsbGJhY2sgdXBsb2FkX2NhbGxiYWNrOwotICB1cGxvYWRlcl8tPlN0YXJ0VXBsb2FkKGtPcmlnaW4sIHNlcnZlcl8uR2V0VVJMKCIvIiksIGtVcGxvYWRCb2R5LCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZF9jYWxsYmFjay5jYWxsYmFjaygpKTsKKyAgdXBsb2FkZXJfLT5TdGFydFVwbG9hZChrT3JpZ2luLCBzZXJ2ZXJfLkdldFVSTCgiLyIpLCBOZXR3b3JrSXNvbGF0aW9uS2V5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAga1VwbG9hZEJvZHksIDAsIHVwbG9hZF9jYWxsYmFjay5jYWxsYmFjaygpKTsKICAgdXBsb2FkX2NhbGxiYWNrLldhaXRGb3JDYWxsKCk7CiB9CiAKQEAgLTQ3Myw4ICs0NzksOCBAQAogICBBU1NFUlRfVFJVRShzZXJ2ZXJfLlN0YXJ0KCkpOwogCiAgIFRlc3RVcGxvYWRDYWxsYmFjayB1cGxvYWRfY2FsbGJhY2s7Ci0gIHVwbG9hZGVyXy0+U3RhcnRVcGxvYWQoa09yaWdpbiwgc2VydmVyXy5HZXRVUkwoIi8iKSwga1VwbG9hZEJvZHksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXBsb2FkX2NhbGxiYWNrLmNhbGxiYWNrKCkpOworICB1cGxvYWRlcl8tPlN0YXJ0VXBsb2FkKGtPcmlnaW4sIHNlcnZlcl8uR2V0VVJMKCIvIiksIE5ldHdvcmtJc29sYXRpb25LZXkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBrVXBsb2FkQm9keSwgMCwgdXBsb2FkX2NhbGxiYWNrLmNhbGxiYWNrKCkpOwogICB1cGxvYWRfY2FsbGJhY2suV2FpdEZvckNhbGwoKTsKIAogICBHZXRDb29raWVMaXN0Q2FsbGJhY2sgY29va2llX2NhbGxiYWNrOwpAQCAtNTEyLDIwICs1MTgsMTM5IEBACiAKICAgewogICAgIFRlc3RVcGxvYWRDYWxsYmFjayBjYWxsYmFjazsKLSAgICB1cGxvYWRlcl8tPlN0YXJ0VXBsb2FkKGtPcmlnaW4sIHNlcnZlcl8uR2V0VVJMKCIvIiksIGtVcGxvYWRCb2R5LCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbGJhY2soKSk7CisgICAgdXBsb2FkZXJfLT5TdGFydFVwbG9hZChrT3JpZ2luLCBzZXJ2ZXJfLkdldFVSTCgiLyIpLCBOZXR3b3JrSXNvbGF0aW9uS2V5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrVXBsb2FkQm9keSwgMCwgY2FsbGJhY2suY2FsbGJhY2soKSk7CiAgICAgY2FsbGJhY2suV2FpdEZvckNhbGwoKTsKICAgfQogICBFWFBFQ1RfRVEoMSwgcmVxdWVzdF9jb3VudCk7CiAKICAgewogICAgIFRlc3RVcGxvYWRDYWxsYmFjayBjYWxsYmFjazsKLSAgICB1cGxvYWRlcl8tPlN0YXJ0VXBsb2FkKGtPcmlnaW4sIHNlcnZlcl8uR2V0VVJMKCIvIiksIGtVcGxvYWRCb2R5LCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbGJhY2soKSk7CisgICAgdXBsb2FkZXJfLT5TdGFydFVwbG9hZChrT3JpZ2luLCBzZXJ2ZXJfLkdldFVSTCgiLyIpLCBOZXR3b3JrSXNvbGF0aW9uS2V5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrVXBsb2FkQm9keSwgMCwgY2FsbGJhY2suY2FsbGJhY2soKSk7CiAgICAgY2FsbGJhY2suV2FpdEZvckNhbGwoKTsKICAgfQogICBFWFBFQ1RfRVEoMiwgcmVxdWVzdF9jb3VudCk7CiB9CiAKKy8vIENyZWF0ZSB0d28gcmVxdWVzdHMgd2l0aCB0aGUgc2FtZSBOZXR3b3JrSXNvbGF0aW9uS2V5LCBhbmQgb25lIHJlcXVlc3Qgd2l0aCBhCisvLyBkaWZmZXJlbnQgb25lLCBhbmQgbWFrZSBzdXJlIG9ubHkgdGhlIHJlcXVlc3RzIHdpdGggdGhlIHNhbWUKKy8vIE5ldHdvcmtJc29sYXRpb25LZXkgc2hhcmUgYSBzb2NrZXQuCitURVNUX0YoUmVwb3J0aW5nVXBsb2FkZXJUZXN0LCBSZXNwZWN0c05ldHdvcmtJc29sYXRpb25LZXkpIHsKKyAgLy8gV2hpbGUgZmVhdHVyZXM6OmtQYXJ0aXRpb25Db25uZWN0aW9uc0J5TmV0d29ya0lzb2xhdGlvbktleSBpcyBub3QgbmVlZGVkCisgIC8vIGZvciByZXBvcnRpbmcgY29kZSB0byByZXNwZWN0IE5ldHdvcmtJc29sYXRpb25LZXlzLCB0aGlzIHRlc3Qgd29ya3MgYnkKKyAgLy8gZW5zdXJpbmcgdGhhdCBSZXBvcnRpbmcncyBOZXR3b3JrSXNvbGF0aW9uS2V5IG1ha2VzIGl0IHRvIHRoZSBzb2NrZXQgcG9vbAorICAvLyBsYXllciBhbmQgaXMgcmVzcGVjdGVkIHRoZXJlLCBzbyB0aGlzIHRlc3QgbmVlZHMgdG8gZW5hYmxlCisgIC8vIGtQYXJ0aXRpb25Db25uZWN0aW9uc0J5TmV0d29ya0lzb2xhdGlvbktleS4KKyAgYmFzZTo6dGVzdDo6U2NvcGVkRmVhdHVyZUxpc3QgZmVhdHVyZV9saXN0OworICBmZWF0dXJlX2xpc3QuSW5pdEFuZEVuYWJsZUZlYXR1cmUoCisgICAgICBmZWF0dXJlczo6a1BhcnRpdGlvbkNvbm5lY3Rpb25zQnlOZXR3b3JrSXNvbGF0aW9uS2V5KTsKKworICBjb25zdCB1cmw6Ok9yaWdpbiBrT3JpZ2luMiA9IHVybDo6T3JpZ2luOjpDcmVhdGUoR1VSTCgiaHR0cHM6Ly9vcmlnaW4yLyIpKTsKKyAgQVNTRVJUX05FKGtPcmlnaW4sIGtPcmlnaW4yKTsKKyAgY29uc3QgTmV0d29ya0lzb2xhdGlvbktleSBrTmV0d29ya0lzb2xhdGlvbktleTEoa09yaWdpbiwga09yaWdpbik7CisgIGNvbnN0IE5ldHdvcmtJc29sYXRpb25LZXkga05ldHdvcmtJc29sYXRpb25LZXkyKGtPcmlnaW4yLCBrT3JpZ2luMik7CisKKyAgTW9ja0NsaWVudFNvY2tldEZhY3Rvcnkgc29ja2V0X2ZhY3Rvcnk7CisgIFRlc3RVUkxSZXF1ZXN0Q29udGV4dCBjb250ZXh0KHRydWUgLyogZGVsYXlfaW5pdGlhbGl6YXRpb24gKi8pOworICBjb250ZXh0LnNldF9jbGllbnRfc29ja2V0X2ZhY3RvcnkoJnNvY2tldF9mYWN0b3J5KTsKKyAgY29udGV4dC5Jbml0KCk7CisKKyAgLy8gRmlyc3Qgc29ja2V0IGhhbmRsZXMgZmlyc3QgYW5kIHRoaXJkIHJlcXVlc3RzLgorICBNb2NrV3JpdGUgd3JpdGVzMVtdID0geworICAgICAgTW9ja1dyaXRlKFNZTkNIUk9OT1VTLCAwLAorICAgICAgICAgICAgICAgICJQT1NUIC8xIEhUVFAvMS4xXHJcbiIKKyAgICAgICAgICAgICAgICAiSG9zdDogb3JpZ2luXHJcbiIKKyAgICAgICAgICAgICAgICAiQ29ubmVjdGlvbjoga2VlcC1hbGl2ZVxyXG4iCisgICAgICAgICAgICAgICAgIkNvbnRlbnQtTGVuZ3RoOiAyXHJcbiIKKyAgICAgICAgICAgICAgICAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9yZXBvcnRzK2pzb25cclxuIgorICAgICAgICAgICAgICAgICJVc2VyLUFnZW50OiBcclxuIgorICAgICAgICAgICAgICAgICJBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGVcclxuIgorICAgICAgICAgICAgICAgICJBY2NlcHQtTGFuZ3VhZ2U6IGVuLXVzLGZyXHJcblxyXG4iKSwKKyAgICAgIE1vY2tXcml0ZShTWU5DSFJPTk9VUywgMSwga1VwbG9hZEJvZHkpLAorICAgICAgTW9ja1dyaXRlKFNZTkNIUk9OT1VTLCAzLAorICAgICAgICAgICAgICAgICJQT1NUIC8zIEhUVFAvMS4xXHJcbiIKKyAgICAgICAgICAgICAgICAiSG9zdDogb3JpZ2luXHJcbiIKKyAgICAgICAgICAgICAgICAiQ29ubmVjdGlvbjoga2VlcC1hbGl2ZVxyXG4iCisgICAgICAgICAgICAgICAgIkNvbnRlbnQtTGVuZ3RoOiAyXHJcbiIKKyAgICAgICAgICAgICAgICAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9yZXBvcnRzK2pzb25cclxuIgorICAgICAgICAgICAgICAgICJVc2VyLUFnZW50OiBcclxuIgorICAgICAgICAgICAgICAgICJBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGVcclxuIgorICAgICAgICAgICAgICAgICJBY2NlcHQtTGFuZ3VhZ2U6IGVuLXVzLGZyXHJcblxyXG4iKSwKKyAgICAgIE1vY2tXcml0ZShTWU5DSFJPTk9VUywgNCwga1VwbG9hZEJvZHkpLAorICB9OworICBNb2NrUmVhZCByZWFkczFbXSA9IHsKKyAgICAgIE1vY2tSZWFkKFNZTkNIUk9OT1VTLCAyLAorICAgICAgICAgICAgICAgIkhUVFAvMS4xIDIwMCBPS1xyXG4iCisgICAgICAgICAgICAgICAiQ29ubmVjdGlvbjogS2VlcC1BbGl2ZVxyXG4iCisgICAgICAgICAgICAgICAiQ29udGVudC1MZW5ndGg6IDBcclxuXHJcbiIpLAorICAgICAgTW9ja1JlYWQoU1lOQ0hST05PVVMsIDUsCisgICAgICAgICAgICAgICAiSFRUUC8xLjEgMjAwIE9LXHJcbiIKKyAgICAgICAgICAgICAgICJDb25uZWN0aW9uOiBLZWVwLUFsaXZlXHJcbiIKKyAgICAgICAgICAgICAgICJDb250ZW50LUxlbmd0aDogMFxyXG5cclxuIiksCisgIH07CisgIFNlcXVlbmNlZFNvY2tldERhdGEgZGF0YTEocmVhZHMxLCB3cml0ZXMxKTsKKyAgc29ja2V0X2ZhY3RvcnkuQWRkU29ja2V0RGF0YVByb3ZpZGVyKCZkYXRhMSk7CisgIFNTTFNvY2tldERhdGFQcm92aWRlciBzc2xfZGF0YTEoQVNZTkMsIE9LKTsKKyAgc29ja2V0X2ZhY3RvcnkuQWRkU1NMU29ja2V0RGF0YVByb3ZpZGVyKCZzc2xfZGF0YTEpOworCisgIC8vIFNlY29uZCBzb2NrZXQgaGFuZGxlcyBzZWNvbmQgcmVxdWVzdC4KKyAgTW9ja1dyaXRlIHdyaXRlczJbXSA9IHsKKyAgICAgIE1vY2tXcml0ZShTWU5DSFJPTk9VUywgMCwKKyAgICAgICAgICAgICAgICAiUE9TVCAvMiBIVFRQLzEuMVxyXG4iCisgICAgICAgICAgICAgICAgIkhvc3Q6IG9yaWdpblxyXG4iCisgICAgICAgICAgICAgICAgIkNvbm5lY3Rpb246IGtlZXAtYWxpdmVcclxuIgorICAgICAgICAgICAgICAgICJDb250ZW50LUxlbmd0aDogMlxyXG4iCisgICAgICAgICAgICAgICAgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vcmVwb3J0cytqc29uXHJcbiIKKyAgICAgICAgICAgICAgICAiVXNlci1BZ2VudDogXHJcbiIKKyAgICAgICAgICAgICAgICAiQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlXHJcbiIKKyAgICAgICAgICAgICAgICAiQWNjZXB0LUxhbmd1YWdlOiBlbi11cyxmclxyXG5cclxuIiksCisgICAgICBNb2NrV3JpdGUoU1lOQ0hST05PVVMsIDEsIGtVcGxvYWRCb2R5KSwKKyAgfTsKKyAgTW9ja1JlYWQgcmVhZHMyW10gPSB7CisgICAgICBNb2NrUmVhZChTWU5DSFJPTk9VUywgMiwKKyAgICAgICAgICAgICAgICJIVFRQLzEuMSAyMDAgT0tcclxuIgorICAgICAgICAgICAgICAgIkNvbm5lY3Rpb246IEtlZXAtQWxpdmVcclxuIgorICAgICAgICAgICAgICAgIkNvbnRlbnQtTGVuZ3RoOiAwXHJcblxyXG4iKSwKKyAgfTsKKyAgU2VxdWVuY2VkU29ja2V0RGF0YSBkYXRhMihyZWFkczIsIHdyaXRlczIpOworICBzb2NrZXRfZmFjdG9yeS5BZGRTb2NrZXREYXRhUHJvdmlkZXIoJmRhdGEyKTsKKyAgU1NMU29ja2V0RGF0YVByb3ZpZGVyIHNzbF9kYXRhMihBU1lOQywgT0spOworICBzb2NrZXRfZmFjdG9yeS5BZGRTU0xTb2NrZXREYXRhUHJvdmlkZXIoJnNzbF9kYXRhMik7CisKKyAgVGVzdFVwbG9hZENhbGxiYWNrIGNhbGxiYWNrMTsKKyAgc3RkOjp1bmlxdWVfcHRyPFJlcG9ydGluZ1VwbG9hZGVyPiB1cGxvYWRlcjEgPQorICAgICAgUmVwb3J0aW5nVXBsb2FkZXI6OkNyZWF0ZSgmY29udGV4dCk7CisgIHVwbG9hZGVyMS0+U3RhcnRVcGxvYWQoa09yaWdpbiwgR1VSTCgiaHR0cHM6Ly9vcmlnaW4vMSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGtOZXR3b3JrSXNvbGF0aW9uS2V5MSwga1VwbG9hZEJvZHksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sxLmNhbGxiYWNrKCkpOworICBjYWxsYmFjazEuV2FpdEZvckNhbGwoKTsKKyAgRVhQRUNUX0VRKFJlcG9ydGluZ1VwbG9hZGVyOjpPdXRjb21lOjpTVUNDRVNTLCBjYWxsYmFjazEub3V0Y29tZSgpKTsKKworICAvLyBTdGFydCB0d28gbW9yZSByZXF1ZXN0cyBpbiBwYXJhbGxlbC4gVGhlIGZpcnN0IHN0YXJ0ZWQgdXNlcyBhIGRpZmZlcmVudAorICAvLyBOZXR3b3JrSXNvbGF0aW9uS2V5LCBzbyBzaG91bGQgY3JlYXRlIGEgbmV3IHNvY2tldCwgd2hpbGUgdGhlIHNlY29uZCBvbmUKKyAgLy8gZ2V0cyB0aGUgb3RoZXIgc29ja2V0LiBTdGFydCBpbiBwYXJhbGxlbCB0byBtYWtlIHN1cmUgdGhhdCBhIG5ldyBzb2NrZXQKKyAgLy8gaXNuJ3QgY3JlYXRlZCBqdXN0IGJlY2F1c2UgdGhlIGZpcnN0IGlzIHJldHVybmVkIHRvIHRoZSBzb2NrZXQgcG9vbAorICAvLyBhc3luY2hyb25vdXNseS4KKyAgVGVzdFVwbG9hZENhbGxiYWNrIGNhbGxiYWNrMjsKKyAgc3RkOjp1bmlxdWVfcHRyPFJlcG9ydGluZ1VwbG9hZGVyPiB1cGxvYWRlcjIgPQorICAgICAgUmVwb3J0aW5nVXBsb2FkZXI6OkNyZWF0ZSgmY29udGV4dCk7CisgIHVwbG9hZGVyMi0+U3RhcnRVcGxvYWQoa09yaWdpbiwgR1VSTCgiaHR0cHM6Ly9vcmlnaW4vMiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGtOZXR3b3JrSXNvbGF0aW9uS2V5Miwga1VwbG9hZEJvZHksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2syLmNhbGxiYWNrKCkpOworICBUZXN0VXBsb2FkQ2FsbGJhY2sgY2FsbGJhY2szOworICBzdGQ6OnVuaXF1ZV9wdHI8UmVwb3J0aW5nVXBsb2FkZXI+IHVwbG9hZGVyMyA9CisgICAgICBSZXBvcnRpbmdVcGxvYWRlcjo6Q3JlYXRlKCZjb250ZXh0KTsKKyAgdXBsb2FkZXIzLT5TdGFydFVwbG9hZChrT3JpZ2luLCBHVVJMKCJodHRwczovL29yaWdpbi8zIiksCisgICAgICAgICAgICAgICAgICAgICAgICAga05ldHdvcmtJc29sYXRpb25LZXkxLCBrVXBsb2FkQm9keSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazMuY2FsbGJhY2soKSk7CisKKyAgY2FsbGJhY2syLldhaXRGb3JDYWxsKCk7CisgIEVYUEVDVF9FUShSZXBvcnRpbmdVcGxvYWRlcjo6T3V0Y29tZTo6U1VDQ0VTUywgY2FsbGJhY2syLm91dGNvbWUoKSk7CisKKyAgY2FsbGJhY2szLldhaXRGb3JDYWxsKCk7CisgIEVYUEVDVF9FUShSZXBvcnRpbmdVcGxvYWRlcjo6T3V0Y29tZTo6U1VDQ0VTUywgY2FsbGJhY2szLm91dGNvbWUoKSk7Cit9CisKIH0gIC8vIG5hbWVzcGFjZQogfSAgLy8gbmFtZXNwYWNlIG5ldApkaWZmIC0tZ2l0IGEvbmV0L3NvY2tldC9jbGllbnRfc29ja2V0X3Bvb2xfYmFzZV91bml0dGVzdC5jYyBiL25ldC9zb2NrZXQvY2xpZW50X3NvY2tldF9wb29sX2Jhc2VfdW5pdHRlc3QuY2MKaW5kZXggYmQ0YjczYy4uOTI2MGU1ZSAxMDA2NDQKLS0tIGEvbmV0L3NvY2tldC9jbGllbnRfc29ja2V0X3Bvb2xfYmFzZV91bml0dGVzdC5jYworKysgYi9uZXQvc29ja2V0L2NsaWVudF9zb2NrZXRfcG9vbF9iYXNlX3VuaXR0ZXN0LmNjCkBAIC01NTY2LDYgKzU1NjYsMTYgQEAKICAgICByZXR1cm4gVGVzdEdyb3VwSWQoImEiLCA0NDMsIENsaWVudFNvY2tldFBvb2w6OlNvY2tldFR5cGU6OmtTc2wpOwogICB9CiAKKyAgc3RhdGljIENsaWVudFNvY2tldFBvb2w6Okdyb3VwSWQgR2V0R3JvdXBJZEluUGFydGl0aW9uKCkgeworICAgIC8vIE5vdGUgdGhpcyBHcm91cElkIHdpbGwgbWF0Y2ggR2V0R3JvdXBJZCgpIHVubGVzcworICAgIC8vIGtQYXJ0aXRpb25Db25uZWN0aW9uc0J5TmV0d29ya0lzb2xhdGlvbktleSBpcyBlbmFibGVkLgorICAgIGNvbnN0IGF1dG8ga09yaWdpbiA9IHVybDo6T3JpZ2luOjpDcmVhdGUoR1VSTCgiaHR0cHM6Ly9iLyIpKTsKKyAgICBjb25zdCBOZXR3b3JrSXNvbGF0aW9uS2V5IGtOZXR3b3JrSXNvbGF0aW9uS2V5KGtPcmlnaW4sIGtPcmlnaW4pOworICAgIHJldHVybiBUZXN0R3JvdXBJZCgiYSIsIDQ0MywgQ2xpZW50U29ja2V0UG9vbDo6U29ja2V0VHlwZTo6a1NzbCwKKyAgICAgICAgICAgICAgICAgICAgICAgUHJpdmFjeU1vZGU6OlBSSVZBQ1lfTU9ERV9ESVNBQkxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAga05ldHdvcmtJc29sYXRpb25LZXkpOworICB9CisKICAgdm9pZCBPblNTTENvbmZpZ0ZvclNlcnZlckNoYW5nZWQoKSB7CiAgICAgc3dpdGNoIChHZXRQYXJhbSgpKSB7CiAgICAgICBjYXNlIFJlZnJlc2hUeXBlOjprU2VydmVyOgpAQCAtNTYxNCwxOCArNTYyNCwyOCBAQAogfQogCiBURVNUX1AoQ2xpZW50U29ja2V0UG9vbEJhc2VSZWZyZXNoVGVzdCwgUmVmcmVzaEdyb3VwQ2xvc2VzSWRsZUNvbm5lY3RKb2JzKSB7CisgIGJhc2U6OnRlc3Q6OlNjb3BlZEZlYXR1cmVMaXN0IGZlYXR1cmVfbGlzdDsKKyAgZmVhdHVyZV9saXN0LkluaXRBbmRFbmFibGVGZWF0dXJlKAorICAgICAgZmVhdHVyZXM6OmtQYXJ0aXRpb25Db25uZWN0aW9uc0J5TmV0d29ya0lzb2xhdGlvbktleSk7CisKICAgQ3JlYXRlUG9vbEZvclJlZnJlc2goa0RlZmF1bHRNYXhTb2NrZXRzLCBrRGVmYXVsdE1heFNvY2tldHNQZXJHcm91cCk7CiAgIGNvbnN0IENsaWVudFNvY2tldFBvb2w6Okdyb3VwSWQga0dyb3VwSWQgPSBHZXRHcm91cElkKCk7CisgIGNvbnN0IENsaWVudFNvY2tldFBvb2w6Okdyb3VwSWQga0dyb3VwSWRJblBhcnRpdGlvbiA9IEdldEdyb3VwSWRJblBhcnRpdGlvbigpOwogCiAgIHBvb2xfLT5SZXF1ZXN0U29ja2V0cyhrR3JvdXBJZCwgcGFyYW1zXywgYmFzZTo6bnVsbG9wdCwgMiwKICAgICAgICAgICAgICAgICAgICAgICAgIE5ldExvZ1dpdGhTb3VyY2UoKSk7CisgIHBvb2xfLT5SZXF1ZXN0U29ja2V0cyhrR3JvdXBJZEluUGFydGl0aW9uLCBwYXJhbXNfLCBiYXNlOjpudWxsb3B0LCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgTmV0TG9nV2l0aFNvdXJjZSgpKTsKICAgQVNTRVJUX1RSVUUocG9vbF8tPkhhc0dyb3VwRm9yVGVzdGluZyhrR3JvdXBJZCkpOwotICBFWFBFQ1RfRVEoMiwgcG9vbF8tPklkbGVTb2NrZXRDb3VudCgpKTsKKyAgQVNTRVJUX1RSVUUocG9vbF8tPkhhc0dyb3VwRm9yVGVzdGluZyhrR3JvdXBJZEluUGFydGl0aW9uKSk7CisgIEVYUEVDVF9FUSg0LCBwb29sXy0+SWRsZVNvY2tldENvdW50KCkpOwogICBFWFBFQ1RfRVEoMnUsIHBvb2xfLT5JZGxlU29ja2V0Q291bnRJbkdyb3VwKGtHcm91cElkKSk7CisgIEVYUEVDVF9FUSgydSwgcG9vbF8tPklkbGVTb2NrZXRDb3VudEluR3JvdXAoa0dyb3VwSWRJblBhcnRpdGlvbikpOwogCiAgIE9uU1NMQ29uZmlnRm9yU2VydmVyQ2hhbmdlZCgpOwogICBFWFBFQ1RfRVEoMCwgcG9vbF8tPklkbGVTb2NrZXRDb3VudCgpKTsKICAgRVhQRUNUX0ZBTFNFKHBvb2xfLT5IYXNHcm91cEZvclRlc3Rpbmcoa0dyb3VwSWQpKTsKKyAgRVhQRUNUX0ZBTFNFKHBvb2xfLT5IYXNHcm91cEZvclRlc3Rpbmcoa0dyb3VwSWRJblBhcnRpdGlvbikpOwogfQogCiBURVNUX0YoQ2xpZW50U29ja2V0UG9vbEJhc2VUZXN0LApkaWZmIC0tZ2l0IGEvbmV0L3NvY2tldC9zc2xfY2xpZW50X3NvY2tldF9pbXBsLmNjIGIvbmV0L3NvY2tldC9zc2xfY2xpZW50X3NvY2tldF9pbXBsLmNjCmluZGV4IGU2MWRmNjcuLmRmNGY3MjAgMTAwNjQ0Ci0tLSBhL25ldC9zb2NrZXQvc3NsX2NsaWVudF9zb2NrZXRfaW1wbC5jYworKysgYi9uZXQvc29ja2V0L3NzbF9jbGllbnRfc29ja2V0X2ltcGwuY2MKQEAgLTc0NSwxMiArNzQ1LDYgQEAKICAgUmV0cnlBbGxPcGVyYXRpb25zKCk7CiB9CiAKLXN0YXRpYyBib29sIEVuZm9yY2VUTFMxM0Rvd25ncmFkZUZvcktub3duUm9vdHNPbmx5KCkgewotICByZXR1cm4gYmFzZTo6RmVhdHVyZUxpc3Q6OklzRW5hYmxlZChmZWF0dXJlczo6a0VuZm9yY2VUTFMxM0Rvd25ncmFkZSkgJiYKLSAgICAgICAgIGJhc2U6OkdldEZpZWxkVHJpYWxQYXJhbUJ5RmVhdHVyZUFzQm9vbCgKLSAgICAgICAgICAgICBmZWF0dXJlczo6a0VuZm9yY2VUTFMxM0Rvd25ncmFkZSwgImtub3duX3Jvb3RzX29ubHkiLCB0cnVlKTsKLX0KLQogaW50IFNTTENsaWVudFNvY2tldEltcGw6OkluaXQoKSB7CiAgIERDSEVDSyghc3NsXyk7CiAKQEAgLTgxNCw4ICs4MDgsNyBAQAogCiAgIFNTTF9zZXRfZWFybHlfZGF0YV9lbmFibGVkKHNzbF8uZ2V0KCksIHNzbF9jb25maWdfLmVhcmx5X2RhdGFfZW5hYmxlZCk7CiAKLSAgaWYgKCFiYXNlOjpGZWF0dXJlTGlzdDo6SXNFbmFibGVkKGZlYXR1cmVzOjprRW5mb3JjZVRMUzEzRG93bmdyYWRlKSB8fAotICAgICAgRW5mb3JjZVRMUzEzRG93bmdyYWRlRm9yS25vd25Sb290c09ubHkoKSkgeworICBpZiAoIWNvbnRleHRfLT5jb25maWcoKS50bHMxM19oYXJkZW5pbmdfZm9yX2xvY2FsX2FuY2hvcnNfZW5hYmxlZCkgewogICAgIFNTTF9zZXRfaWdub3JlX3RsczEzX2Rvd25ncmFkZShzc2xfLmdldCgpLCAxKTsKICAgfQogCkBAIC0xMDEwLDggKzEwMDMsNyBAQAogICAgIH0KICAgfQogCi0gIGlmICghYmFzZTo6RmVhdHVyZUxpc3Q6OklzRW5hYmxlZChmZWF0dXJlczo6a0VuZm9yY2VUTFMxM0Rvd25ncmFkZSkgfHwKLSAgICAgIEVuZm9yY2VUTFMxM0Rvd25ncmFkZUZvcktub3duUm9vdHNPbmx5KCkpIHsKKyAgaWYgKCFjb250ZXh0Xy0+Y29uZmlnKCkudGxzMTNfaGFyZGVuaW5nX2Zvcl9sb2NhbF9hbmNob3JzX2VuYWJsZWQpIHsKICAgICAvLyBSZWNvcmQgbWV0cmljcyBvbiB0aGUgVExTIDEuMyBhbnRpLWRvd25ncmFkZSBtZWNoYW5pc20uIFRoaXMgaXMgb25seQogICAgIC8vIHJlY29yZGVkIHdoZW4gZW5mb3JjZW1lbnQgaXMgZGlzYWJsZWQuIChXaGVuIGVuZm9yY2VtZW50IGlzIGVuYWJsZWQsCiAgICAgLy8gdGhlIGNvbm5lY3Rpb24gd2lsbCBmYWlsIHdpdGggRVJSX1RMUzEzX0RPV05HUkFERV9ERVRFQ1RFRC4pIFNlZQpAQCAtMTA2MSw4ICsxMDUzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKTsKICAgICAgIH0KIAotICAgICAgaWYgKEVuZm9yY2VUTFMxM0Rvd25ncmFkZUZvcktub3duUm9vdHNPbmx5KCkgJiYKLSAgICAgICAgICBzZXJ2ZXJfY2VydF92ZXJpZnlfcmVzdWx0Xy5pc19pc3N1ZWRfYnlfa25vd25fcm9vdCkgeworICAgICAgaWYgKHNlcnZlcl9jZXJ0X3ZlcmlmeV9yZXN1bHRfLmlzX2lzc3VlZF9ieV9rbm93bl9yb290KSB7CiAgICAgICAgIC8vIEV4aXQgRG9IYW5kc2hha2VMb29wIGFuZCByZXR1cm4gdGhlIHJlc3VsdCB0byB0aGUgY2FsbGVyIHRvCiAgICAgICAgIC8vIENvbm5lY3QuCiAgICAgICAgIERDSEVDS19FUShTVEFURV9OT05FLCBuZXh0X2hhbmRzaGFrZV9zdGF0ZV8pOwpkaWZmIC0tZ2l0IGEvbmV0L3NvY2tldC9zc2xfY2xpZW50X3NvY2tldF91bml0dGVzdC5jYyBiL25ldC9zb2NrZXQvc3NsX2NsaWVudF9zb2NrZXRfdW5pdHRlc3QuY2MKaW5kZXggNDkwZDhkNC4uNTc5MTRiYyAxMDA2NDQKLS0tIGEvbmV0L3NvY2tldC9zc2xfY2xpZW50X3NvY2tldF91bml0dGVzdC5jYworKysgYi9uZXQvc29ja2V0L3NzbF9jbGllbnRfc29ja2V0X3VuaXR0ZXN0LmNjCkBAIC01MzU2LDI3MyArNTM1Niw1NSBAQAogI2VuZGlmICAvLyBPU19BTkRST0lECiB9CiAKLS8vIFRlc3QgZG93bmdyYWRlIGVuZm9yY2VtZW50IHdvcmtzIGZvciB0aGUgMS4zIHRvIDEuMiBkb3duZ3JhZGUuCi1URVNUX0YoU1NMQ2xpZW50U29ja2V0VGVzdCwgVExTMTNEb3duZ3JhZGVFbmZvcmNlZEF0VExTMTIpIHsKLSAgYmFzZTo6dGVzdDo6U2NvcGVkRmVhdHVyZUxpc3QgZmVhdHVyZV9saXN0OwotICBmZWF0dXJlX2xpc3QuSW5pdEFuZEVuYWJsZUZlYXR1cmVXaXRoUGFyYW1ldGVycygKLSAgICAgIGZlYXR1cmVzOjprRW5mb3JjZVRMUzEzRG93bmdyYWRlLCB7eyJrbm93bl9yb290c19vbmx5IiwgImZhbHNlIn19KTsKKy8vIFRlc3QgZG93bmdyYWRlIGVuZm9yY2VtZW50IGJlaGF2ZXMgYXMgZXhwZWN0ZWQuCitURVNUX0YoU1NMQ2xpZW50U29ja2V0VGVzdCwgVExTMTNEb3duZ3JhZGVFbmZvcmNlZCkgeworICBmb3IgKGF1dG8gdGxzX21heF92ZXJzaW9uIDoKKyAgICAgICB7U3Bhd25lZFRlc3RTZXJ2ZXI6OlNTTE9wdGlvbnM6OlRMU19NQVhfVkVSU0lPTl9UTFMxXzAsCisgICAgICAgIFNwYXduZWRUZXN0U2VydmVyOjpTU0xPcHRpb25zOjpUTFNfTUFYX1ZFUlNJT05fVExTMV8xLAorICAgICAgICBTcGF3bmVkVGVzdFNlcnZlcjo6U1NMT3B0aW9uczo6VExTX01BWF9WRVJTSU9OX1RMUzFfMn0pIHsKKyAgICBmb3IgKGJvb2wgZG93bmdyYWRlIDoge2ZhbHNlLCB0cnVlfSkgeworICAgICAgU0NPUEVEX1RSQUNFKGRvd25ncmFkZSk7CisgICAgICBTQ09QRURfVFJBQ0UodGxzX21heF92ZXJzaW9uKTsKKyAgICAgIFNwYXduZWRUZXN0U2VydmVyOjpTU0xPcHRpb25zIHNzbF9vcHRpb25zOworICAgICAgc3NsX29wdGlvbnMuc2ltdWxhdGVfdGxzMTNfZG93bmdyYWRlID0gZG93bmdyYWRlOworICAgICAgc3NsX29wdGlvbnMudGxzX21heF92ZXJzaW9uID0gdGxzX21heF92ZXJzaW9uOworICAgICAgQVNTRVJUX1RSVUUoU3RhcnRUZXN0U2VydmVyKHNzbF9vcHRpb25zKSk7CisgICAgICBzY29wZWRfcmVmcHRyPFg1MDlDZXJ0aWZpY2F0ZT4gc2VydmVyX2NlcnQgPQorICAgICAgICAgIHNwYXduZWRfdGVzdF9zZXJ2ZXIoKS0+R2V0Q2VydGlmaWNhdGUoKTsKIAotICBTcGF3bmVkVGVzdFNlcnZlcjo6U1NMT3B0aW9ucyBzc2xfb3B0aW9uczsKLSAgc3NsX29wdGlvbnMuc2ltdWxhdGVfdGxzMTNfZG93bmdyYWRlID0gdHJ1ZTsKLSAgc3NsX29wdGlvbnMudGxzX21heF92ZXJzaW9uID0KLSAgICAgIFNwYXduZWRUZXN0U2VydmVyOjpTU0xPcHRpb25zOjpUTFNfTUFYX1ZFUlNJT05fVExTMV8yOwotICBBU1NFUlRfVFJVRShTdGFydFRlc3RTZXJ2ZXIoc3NsX29wdGlvbnMpKTsKKyAgICAgIGZvciAoYm9vbCBlbmFibGVfZm9yX2xvY2FsX2FuY2hvcnMgOiB7ZmFsc2UsIHRydWV9KSB7CisgICAgICAgIFNDT1BFRF9UUkFDRShlbmFibGVfZm9yX2xvY2FsX2FuY2hvcnMpOworICAgICAgICBTU0xDb250ZXh0Q29uZmlnIGNvbmZpZzsKKyAgICAgICAgY29uZmlnLnZlcnNpb25fbWF4ID0gU1NMX1BST1RPQ09MX1ZFUlNJT05fVExTMV8zOworICAgICAgICBjb25maWcudGxzMTNfaGFyZGVuaW5nX2Zvcl9sb2NhbF9hbmNob3JzX2VuYWJsZWQgPQorICAgICAgICAgICAgZW5hYmxlX2Zvcl9sb2NhbF9hbmNob3JzOworICAgICAgICBzc2xfY29uZmlnX3NlcnZpY2VfLT5VcGRhdGVTU0xDb25maWdBbmROb3RpZnkoY29uZmlnKTsKIAotICBTU0xDb250ZXh0Q29uZmlnIGNvbmZpZzsKLSAgY29uZmlnLnZlcnNpb25fbWF4ID0gU1NMX1BST1RPQ09MX1ZFUlNJT05fVExTMV8zOwotICBzc2xfY29uZmlnX3NlcnZpY2VfLT5VcGRhdGVTU0xDb25maWdBbmROb3RpZnkoY29uZmlnKTsKKyAgICAgICAgZm9yIChib29sIGtub3duX3Jvb3QgOiB7ZmFsc2UsIHRydWV9KSB7CisgICAgICAgICAgU0NPUEVEX1RSQUNFKGtub3duX3Jvb3QpOworICAgICAgICAgIENlcnRWZXJpZnlSZXN1bHQgdmVyaWZ5X3Jlc3VsdDsKKyAgICAgICAgICB2ZXJpZnlfcmVzdWx0LmlzX2lzc3VlZF9ieV9rbm93bl9yb290ID0ga25vd25fcm9vdDsKKyAgICAgICAgICB2ZXJpZnlfcmVzdWx0LnZlcmlmaWVkX2NlcnQgPSBzZXJ2ZXJfY2VydDsKKyAgICAgICAgICBjZXJ0X3ZlcmlmaWVyXy0+Q2xlYXJSdWxlcygpOworICAgICAgICAgIGNlcnRfdmVyaWZpZXJfLT5BZGRSZXN1bHRGb3JDZXJ0KHNlcnZlcl9jZXJ0LmdldCgpLCB2ZXJpZnlfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9LKTsKIAotICBpbnQgcnY7Ci0gIEFTU0VSVF9UUlVFKENyZWF0ZUFuZENvbm5lY3RTU0xDbGllbnRTb2NrZXQoU1NMQ29uZmlnKCksICZydikpOwotICBFWFBFQ1RfVEhBVChydiwgSXNFcnJvcihFUlJfVExTMTNfRE9XTkdSQURFX0RFVEVDVEVEKSk7Ci0gIEVYUEVDVF9GQUxTRShzb2NrXy0+SXNDb25uZWN0ZWQoKSk7Ci19CisgICAgICAgICAgYm9vbCBzaG91bGRfZW5mb3JjZSA9IGtub3duX3Jvb3QgfHwgZW5hYmxlX2Zvcl9sb2NhbF9hbmNob3JzOwogCi0vLyBUZXN0IGRvd25ncmFkZSBlbmZvcmNlbWVudCB3b3JrcyBmb3IgdGhlIDEuMyB0byAxLjEgZG93bmdyYWRlLgotVEVTVF9GKFNTTENsaWVudFNvY2tldFRlc3QsIFRMUzEzRG93bmdyYWRlRW5mb3JjZWRBdFRMUzExKSB7Ci0gIGJhc2U6OnRlc3Q6OlNjb3BlZEZlYXR1cmVMaXN0IGZlYXR1cmVfbGlzdDsKLSAgZmVhdHVyZV9saXN0LkluaXRBbmRFbmFibGVGZWF0dXJlV2l0aFBhcmFtZXRlcnMoCi0gICAgICBmZWF0dXJlczo6a0VuZm9yY2VUTFMxM0Rvd25ncmFkZSwge3sia25vd25fcm9vdHNfb25seSIsICJmYWxzZSJ9fSk7Ci0KLSAgU3Bhd25lZFRlc3RTZXJ2ZXI6OlNTTE9wdGlvbnMgc3NsX29wdGlvbnM7Ci0gIHNzbF9vcHRpb25zLnNpbXVsYXRlX3RsczEyX2Rvd25ncmFkZSA9IHRydWU7Ci0gIHNzbF9vcHRpb25zLnRsc19tYXhfdmVyc2lvbiA9Ci0gICAgICBTcGF3bmVkVGVzdFNlcnZlcjo6U1NMT3B0aW9uczo6VExTX01BWF9WRVJTSU9OX1RMUzFfMTsKLSAgQVNTRVJUX1RSVUUoU3RhcnRUZXN0U2VydmVyKHNzbF9vcHRpb25zKSk7Ci0KLSAgU1NMQ29udGV4dENvbmZpZyBjb25maWc7Ci0gIGNvbmZpZy52ZXJzaW9uX21heCA9IFNTTF9QUk9UT0NPTF9WRVJTSU9OX1RMUzFfMzsKLSAgc3NsX2NvbmZpZ19zZXJ2aWNlXy0+VXBkYXRlU1NMQ29uZmlnQW5kTm90aWZ5KGNvbmZpZyk7Ci0KLSAgaW50IHJ2OwotICBBU1NFUlRfVFJVRShDcmVhdGVBbmRDb25uZWN0U1NMQ2xpZW50U29ja2V0KFNTTENvbmZpZygpLCAmcnYpKTsKLSAgRVhQRUNUX1RIQVQocnYsIElzRXJyb3IoRVJSX1RMUzEzX0RPV05HUkFERV9ERVRFQ1RFRCkpOwotICBFWFBFQ1RfRkFMU0Uoc29ja18tPklzQ29ubmVjdGVkKCkpOwotfQotCi0vLyBUZXN0IGRvd25ncmFkZSBlbmZvcmNlbWVudCB3b3JrcyBmb3IgdGhlIDEuMyB0byAxLjAgZG93bmdyYWRlLgotVEVTVF9GKFNTTENsaWVudFNvY2tldFRlc3QsIFRMUzEzRG93bmdyYWRlRW5mb3JjZWRBdFRMUzEwKSB7Ci0gIGJhc2U6OnRlc3Q6OlNjb3BlZEZlYXR1cmVMaXN0IGZlYXR1cmVfbGlzdDsKLSAgZmVhdHVyZV9saXN0LkluaXRBbmRFbmFibGVGZWF0dXJlV2l0aFBhcmFtZXRlcnMoCi0gICAgICBmZWF0dXJlczo6a0VuZm9yY2VUTFMxM0Rvd25ncmFkZSwge3sia25vd25fcm9vdHNfb25seSIsICJmYWxzZSJ9fSk7Ci0KLSAgU3Bhd25lZFRlc3RTZXJ2ZXI6OlNTTE9wdGlvbnMgc3NsX29wdGlvbnM7Ci0gIHNzbF9vcHRpb25zLnNpbXVsYXRlX3RsczEyX2Rvd25ncmFkZSA9IHRydWU7Ci0gIHNzbF9vcHRpb25zLnRsc19tYXhfdmVyc2lvbiA9Ci0gICAgICBTcGF3bmVkVGVzdFNlcnZlcjo6U1NMT3B0aW9uczo6VExTX01BWF9WRVJTSU9OX1RMUzFfMDsKLSAgQVNTRVJUX1RSVUUoU3RhcnRUZXN0U2VydmVyKHNzbF9vcHRpb25zKSk7Ci0KLSAgU1NMQ29udGV4dENvbmZpZyBjb25maWc7Ci0gIGNvbmZpZy52ZXJzaW9uX21heCA9IFNTTF9QUk9UT0NPTF9WRVJTSU9OX1RMUzFfMzsKLSAgc3NsX2NvbmZpZ19zZXJ2aWNlXy0+VXBkYXRlU1NMQ29uZmlnQW5kTm90aWZ5KGNvbmZpZyk7Ci0KLSAgaW50IHJ2OwotICBBU1NFUlRfVFJVRShDcmVhdGVBbmRDb25uZWN0U1NMQ2xpZW50U29ja2V0KFNTTENvbmZpZygpLCAmcnYpKTsKLSAgRVhQRUNUX1RIQVQocnYsIElzRXJyb3IoRVJSX1RMUzEzX0RPV05HUkFERV9ERVRFQ1RFRCkpOwotICBFWFBFQ1RfRkFMU0Uoc29ja18tPklzQ29ubmVjdGVkKCkpOwotfQotCi0vLyBUZXN0IGRvd25ncmFkZSBlbmZvcmNlbWVudCBsZXRzIHZhbGlkIGNvbm5lY3Rpb25zIHRocm91Z2guCi1URVNUX0YoU1NMQ2xpZW50U29ja2V0VGVzdCwgVExTMTNEb3duZ3JhZGVWYWxpZCkgewotICBiYXNlOjp0ZXN0OjpTY29wZWRGZWF0dXJlTGlzdCBmZWF0dXJlX2xpc3Q7Ci0gIGZlYXR1cmVfbGlzdC5Jbml0QW5kRW5hYmxlRmVhdHVyZShmZWF0dXJlczo6a0VuZm9yY2VUTFMxM0Rvd25ncmFkZSk7Ci0KLSAgU3Bhd25lZFRlc3RTZXJ2ZXI6OlNTTE9wdGlvbnMgc3NsX29wdGlvbnM7Ci0gIHNzbF9vcHRpb25zLnRsc19tYXhfdmVyc2lvbiA9Ci0gICAgICBTcGF3bmVkVGVzdFNlcnZlcjo6U1NMT3B0aW9uczo6VExTX01BWF9WRVJTSU9OX1RMUzFfMjsKLSAgQVNTRVJUX1RSVUUoU3RhcnRUZXN0U2VydmVyKHNzbF9vcHRpb25zKSk7Ci0KLSAgU1NMQ29udGV4dENvbmZpZyBjb25maWc7Ci0gIGNvbmZpZy52ZXJzaW9uX21heCA9IFNTTF9QUk9UT0NPTF9WRVJTSU9OX1RMUzFfMzsKLSAgc3NsX2NvbmZpZ19zZXJ2aWNlXy0+VXBkYXRlU1NMQ29uZmlnQW5kTm90aWZ5KGNvbmZpZyk7Ci0KLSAgaW50IHJ2OwotICBBU1NFUlRfVFJVRShDcmVhdGVBbmRDb25uZWN0U1NMQ2xpZW50U29ja2V0KFNTTENvbmZpZygpLCAmcnYpKTsKLSAgRVhQRUNUX1RIQVQocnYsIElzT2soKSk7Ci0gIEVYUEVDVF9UUlVFKHNvY2tfLT5Jc0Nvbm5lY3RlZCgpKTsKLQotICBTU0xJbmZvIGluZm87Ci0gIEVYUEVDVF9UUlVFKHNvY2tfLT5HZXRTU0xJbmZvKCZpbmZvKSk7Ci0gIEVYUEVDVF9FUShTU0xfQ09OTkVDVElPTl9WRVJTSU9OX1RMUzFfMiwKLSAgICAgICAgICAgIFNTTENvbm5lY3Rpb25TdGF0dXNUb1ZlcnNpb24oaW5mby5jb25uZWN0aW9uX3N0YXR1cykpOwotfQotCi0vLyBUZXN0IHRoZSBkb3duZ3JhZGUgaXMgbm90IGVuZm9yY2VkIGZvciB0aGUgVExTIDEuMyB0byBUTFMgMS4yIGRvd25ncmFkZSBpZgotLy8gZGlzYWJsZWQuCi1URVNUX0YoU1NMQ2xpZW50U29ja2V0VGVzdCwgVExTMTNEb3duZ3JhZGVJZ25vcmVkQXRUTFMxMikgewotICBiYXNlOjp0ZXN0OjpTY29wZWRGZWF0dXJlTGlzdCBmZWF0dXJlX2xpc3Q7Ci0gIGZlYXR1cmVfbGlzdC5Jbml0QW5kRGlzYWJsZUZlYXR1cmUoZmVhdHVyZXM6OmtFbmZvcmNlVExTMTNEb3duZ3JhZGUpOwotCi0gIFNwYXduZWRUZXN0U2VydmVyOjpTU0xPcHRpb25zIHNzbF9vcHRpb25zOwotICBzc2xfb3B0aW9ucy50bHNfbWF4X3ZlcnNpb24gPQotICAgICAgU3Bhd25lZFRlc3RTZXJ2ZXI6OlNTTE9wdGlvbnM6OlRMU19NQVhfVkVSU0lPTl9UTFMxXzI7Ci0gIHNzbF9vcHRpb25zLnNpbXVsYXRlX3RsczEzX2Rvd25ncmFkZSA9IHRydWU7Ci0gIEFTU0VSVF9UUlVFKFN0YXJ0VGVzdFNlcnZlcihzc2xfb3B0aW9ucykpOwotCi0gIFNTTENvbnRleHRDb25maWcgY29uZmlnOwotICBjb25maWcudmVyc2lvbl9tYXggPSBTU0xfUFJPVE9DT0xfVkVSU0lPTl9UTFMxXzM7Ci0gIHNzbF9jb25maWdfc2VydmljZV8tPlVwZGF0ZVNTTENvbmZpZ0FuZE5vdGlmeShjb25maWcpOwotCi0gIGludCBydjsKLSAgQVNTRVJUX1RSVUUoQ3JlYXRlQW5kQ29ubmVjdFNTTENsaWVudFNvY2tldChTU0xDb25maWcoKSwgJnJ2KSk7Ci0gIEVYUEVDVF9USEFUKHJ2LCBJc09rKCkpOwotICBFWFBFQ1RfVFJVRShzb2NrXy0+SXNDb25uZWN0ZWQoKSk7Ci0KLSAgU1NMSW5mbyBpbmZvOwotICBFWFBFQ1RfVFJVRShzb2NrXy0+R2V0U1NMSW5mbygmaW5mbykpOwotICBFWFBFQ1RfRVEoU1NMX0NPTk5FQ1RJT05fVkVSU0lPTl9UTFMxXzIsCi0gICAgICAgICAgICBTU0xDb25uZWN0aW9uU3RhdHVzVG9WZXJzaW9uKGluZm8uY29ubmVjdGlvbl9zdGF0dXMpKTsKLX0KLQotLy8gVGVzdCB0aGUgZG93bmdyYWRlIGlzIG5vdCBlbmZvcmNlZCBmb3IgdGhlIFRMUyAxLjMgdG8gVExTIDEuMSBkb3duZ3JhZGUgaWYKLS8vIGRpc2FibGVkLgotVEVTVF9GKFNTTENsaWVudFNvY2tldFRlc3QsIFRMUzEzRG93bmdyYWRlSWdub3JlZEF0VExTMTEpIHsKLSAgYmFzZTo6dGVzdDo6U2NvcGVkRmVhdHVyZUxpc3QgZmVhdHVyZV9saXN0OwotICBmZWF0dXJlX2xpc3QuSW5pdEFuZERpc2FibGVGZWF0dXJlKGZlYXR1cmVzOjprRW5mb3JjZVRMUzEzRG93bmdyYWRlKTsKLQotICBTcGF3bmVkVGVzdFNlcnZlcjo6U1NMT3B0aW9ucyBzc2xfb3B0aW9uczsKLSAgc3NsX29wdGlvbnMuc2ltdWxhdGVfdGxzMTJfZG93bmdyYWRlID0gdHJ1ZTsKLSAgc3NsX29wdGlvbnMudGxzX21heF92ZXJzaW9uID0KLSAgICAgIFNwYXduZWRUZXN0U2VydmVyOjpTU0xPcHRpb25zOjpUTFNfTUFYX1ZFUlNJT05fVExTMV8xOwotICBBU1NFUlRfVFJVRShTdGFydFRlc3RTZXJ2ZXIoc3NsX29wdGlvbnMpKTsKLQotICBTU0xDb250ZXh0Q29uZmlnIGNvbmZpZzsKLSAgY29uZmlnLnZlcnNpb25fbWF4ID0gU1NMX1BST1RPQ09MX1ZFUlNJT05fVExTMV8zOwotICBzc2xfY29uZmlnX3NlcnZpY2VfLT5VcGRhdGVTU0xDb25maWdBbmROb3RpZnkoY29uZmlnKTsKLQotICBpbnQgcnY7Ci0gIEFTU0VSVF9UUlVFKENyZWF0ZUFuZENvbm5lY3RTU0xDbGllbnRTb2NrZXQoU1NMQ29uZmlnKCksICZydikpOwotICBFWFBFQ1RfVEhBVChydiwgSXNPaygpKTsKLSAgRVhQRUNUX1RSVUUoc29ja18tPklzQ29ubmVjdGVkKCkpOwotCi0gIFNTTEluZm8gaW5mbzsKLSAgRVhQRUNUX1RSVUUoc29ja18tPkdldFNTTEluZm8oJmluZm8pKTsKLSAgRVhQRUNUX0VRKFNTTF9DT05ORUNUSU9OX1ZFUlNJT05fVExTMV8xLAotICAgICAgICAgICAgU1NMQ29ubmVjdGlvblN0YXR1c1RvVmVyc2lvbihpbmZvLmNvbm5lY3Rpb25fc3RhdHVzKSk7Ci19Ci0KLS8vIFRlc3QgdGhlIGRvd25ncmFkZSBpcyBub3QgZW5mb3JjZWQgZm9yIHRoZSBUTFMgMS4zIHRvIFRMUyAxLjAgZG93bmdyYWRlIGlmCi0vLyBkaXNhYmxlZC4KLVRFU1RfRihTU0xDbGllbnRTb2NrZXRUZXN0LCBUTFMxM0Rvd25ncmFkZUlnbm9yZWRBdFRMUzEwKSB7Ci0gIGJhc2U6OnRlc3Q6OlNjb3BlZEZlYXR1cmVMaXN0IGZlYXR1cmVfbGlzdDsKLSAgZmVhdHVyZV9saXN0LkluaXRBbmREaXNhYmxlRmVhdHVyZShmZWF0dXJlczo6a0VuZm9yY2VUTFMxM0Rvd25ncmFkZSk7Ci0KLSAgU3Bhd25lZFRlc3RTZXJ2ZXI6OlNTTE9wdGlvbnMgc3NsX29wdGlvbnM7Ci0gIHNzbF9vcHRpb25zLnNpbXVsYXRlX3RsczEzX2Rvd25ncmFkZSA9IHRydWU7Ci0gIHNzbF9vcHRpb25zLnRsc19tYXhfdmVyc2lvbiA9Ci0gICAgICBTcGF3bmVkVGVzdFNlcnZlcjo6U1NMT3B0aW9uczo6VExTX01BWF9WRVJTSU9OX1RMUzFfMDsKLSAgQVNTRVJUX1RSVUUoU3RhcnRUZXN0U2VydmVyKHNzbF9vcHRpb25zKSk7Ci0KLSAgU1NMQ29udGV4dENvbmZpZyBjb25maWc7Ci0gIGNvbmZpZy52ZXJzaW9uX21heCA9IFNTTF9QUk9UT0NPTF9WRVJTSU9OX1RMUzFfMzsKLSAgc3NsX2NvbmZpZ19zZXJ2aWNlXy0+VXBkYXRlU1NMQ29uZmlnQW5kTm90aWZ5KGNvbmZpZyk7Ci0KLSAgaW50IHJ2OwotICBBU1NFUlRfVFJVRShDcmVhdGVBbmRDb25uZWN0U1NMQ2xpZW50U29ja2V0KFNTTENvbmZpZygpLCAmcnYpKTsKLSAgRVhQRUNUX1RIQVQocnYsIElzT2soKSk7Ci0gIEVYUEVDVF9UUlVFKHNvY2tfLT5Jc0Nvbm5lY3RlZCgpKTsKLQotICBTU0xJbmZvIGluZm87Ci0gIEVYUEVDVF9UUlVFKHNvY2tfLT5HZXRTU0xJbmZvKCZpbmZvKSk7Ci0gIEVYUEVDVF9FUShTU0xfQ09OTkVDVElPTl9WRVJTSU9OX1RMUzEsCi0gICAgICAgICAgICBTU0xDb25uZWN0aW9uU3RhdHVzVG9WZXJzaW9uKGluZm8uY29ubmVjdGlvbl9zdGF0dXMpKTsKLX0KLQotLy8gRmFpbGVkIG9uIEFuZHJvaWQgYnVpbGRlci4gU2VlIGh0dHBzOi8vY3JidWcuY29tLzk5OTY0NwotI2lmIGRlZmluZWQoT1NfQU5EUk9JRCkKLSNkZWZpbmUgTUFZQkVfVExTMTNEb3duZ3JhZGVFbmZvcmNlZEtub3duS25vd24gXAotICBESVNBQkxFRF9UTFMxM0Rvd25ncmFkZUVuZm9yY2VkS25vd25Lbm93bgotI2Vsc2UKLSNkZWZpbmUgTUFZQkVfVExTMTNEb3duZ3JhZGVFbmZvcmNlZEtub3duS25vd24gVExTMTNEb3duZ3JhZGVFbmZvcmNlZEtub3duS25vd24KLSNlbmRpZgotLy8gVGVzdCBkb3duZ3JhZGUgZW5mb3JjZW1lbnQgZW5mb3JjZXMga25vd24gcm9vdHMgd2hlbiBjb25maWd1cmVkIHRvLgotVEVTVF9GKFNTTENsaWVudFNvY2tldFRlc3QsIE1BWUJFX1RMUzEzRG93bmdyYWRlRW5mb3JjZWRLbm93bktub3duKSB7Ci0gIGJhc2U6OnRlc3Q6OlNjb3BlZEZlYXR1cmVMaXN0IGZlYXR1cmVfbGlzdDsKLSAgZmVhdHVyZV9saXN0LkluaXRBbmRFbmFibGVGZWF0dXJlV2l0aFBhcmFtZXRlcnMoCi0gICAgICBmZWF0dXJlczo6a0VuZm9yY2VUTFMxM0Rvd25ncmFkZSwge3sia25vd25fcm9vdHNfb25seSIsICJ0cnVlIn19KTsKLQotICBTcGF3bmVkVGVzdFNlcnZlcjo6U1NMT3B0aW9ucyBzc2xfb3B0aW9uczsKLSAgc3NsX29wdGlvbnMuc2ltdWxhdGVfdGxzMTNfZG93bmdyYWRlID0gdHJ1ZTsKLSAgc3NsX29wdGlvbnMudGxzX21heF92ZXJzaW9uID0KLSAgICAgIFNwYXduZWRUZXN0U2VydmVyOjpTU0xPcHRpb25zOjpUTFNfTUFYX1ZFUlNJT05fVExTMV8yOwotICBBU1NFUlRfVFJVRShTdGFydFRlc3RTZXJ2ZXIoc3NsX29wdGlvbnMpKTsKLQotICBzY29wZWRfcmVmcHRyPFg1MDlDZXJ0aWZpY2F0ZT4gc2VydmVyX2NlcnQgPQotICAgICAgc3Bhd25lZF90ZXN0X3NlcnZlcigpLT5HZXRDZXJ0aWZpY2F0ZSgpOwotCi0gIC8vIENlcnRpZmljYXRlIGlzIHRydXN0ZWQgYW5kIGNoYWlucyB0byBhIHB1YmxpYyByb290LgotICBDZXJ0VmVyaWZ5UmVzdWx0IHZlcmlmeV9yZXN1bHQ7Ci0gIHZlcmlmeV9yZXN1bHQuaXNfaXNzdWVkX2J5X2tub3duX3Jvb3QgPSB0cnVlOwotICB2ZXJpZnlfcmVzdWx0LnZlcmlmaWVkX2NlcnQgPSBzZXJ2ZXJfY2VydDsKLSAgY2VydF92ZXJpZmllcl8tPkFkZFJlc3VsdEZvckNlcnQoc2VydmVyX2NlcnQuZ2V0KCksIHZlcmlmeV9yZXN1bHQsIE9LKTsKLQotICBTU0xDb250ZXh0Q29uZmlnIGNvbmZpZzsKLSAgY29uZmlnLnZlcnNpb25fbWF4ID0gU1NMX1BST1RPQ09MX1ZFUlNJT05fVExTMV8zOwotICBzc2xfY29uZmlnX3NlcnZpY2VfLT5VcGRhdGVTU0xDb25maWdBbmROb3RpZnkoY29uZmlnKTsKLQotICBpbnQgcnY7Ci0gIEFTU0VSVF9UUlVFKENyZWF0ZUFuZENvbm5lY3RTU0xDbGllbnRTb2NrZXQoU1NMQ29uZmlnKCksICZydikpOwotICBFWFBFQ1RfVEhBVChydiwgSXNFcnJvcihFUlJfVExTMTNfRE9XTkdSQURFX0RFVEVDVEVEKSk7Ci0gIEVYUEVDVF9GQUxTRShzb2NrXy0+SXNDb25uZWN0ZWQoKSk7Ci19Ci0KLS8vIFRlc3QgZG93bmdyYWRlIGVuZm9yY2VtZW50IGFsbG93cyB2YWxpZCBjb25uZWN0aW9ucyB3aXRoIGtub3duIHJvb3RzIHdoZW4KLS8vIGNvbmZpZ3VyZWQgdG8uCi1URVNUX0YoU1NMQ2xpZW50U29ja2V0VGVzdCwgVExTMTNEb3duZ3JhZGVFbmZvcmNlZEtub3duVmFsaWQpIHsKLSAgYmFzZTo6dGVzdDo6U2NvcGVkRmVhdHVyZUxpc3QgZmVhdHVyZV9saXN0OwotICBmZWF0dXJlX2xpc3QuSW5pdEFuZEVuYWJsZUZlYXR1cmVXaXRoUGFyYW1ldGVycygKLSAgICAgIGZlYXR1cmVzOjprRW5mb3JjZVRMUzEzRG93bmdyYWRlLCB7eyJrbm93bl9yb290c19vbmx5IiwgInRydWUifX0pOwotCi0gIEFTU0VSVF9UUlVFKFN0YXJ0VGVzdFNlcnZlcihTcGF3bmVkVGVzdFNlcnZlcjo6U1NMT3B0aW9ucygpKSk7Ci0KLSAgc2NvcGVkX3JlZnB0cjxYNTA5Q2VydGlmaWNhdGU+IHNlcnZlcl9jZXJ0ID0KLSAgICAgIHNwYXduZWRfdGVzdF9zZXJ2ZXIoKS0+R2V0Q2VydGlmaWNhdGUoKTsKLQotICAvLyBDZXJ0aWZpY2F0ZSBpcyB0cnVzdGVkIGFuZCBjaGFpbnMgdG8gYSBwdWJsaWMgcm9vdC4KLSAgQ2VydFZlcmlmeVJlc3VsdCB2ZXJpZnlfcmVzdWx0OwotICB2ZXJpZnlfcmVzdWx0LmlzX2lzc3VlZF9ieV9rbm93bl9yb290ID0gdHJ1ZTsKLSAgdmVyaWZ5X3Jlc3VsdC52ZXJpZmllZF9jZXJ0ID0gc2VydmVyX2NlcnQ7Ci0gIGNlcnRfdmVyaWZpZXJfLT5BZGRSZXN1bHRGb3JDZXJ0KHNlcnZlcl9jZXJ0LmdldCgpLCB2ZXJpZnlfcmVzdWx0LCBPSyk7Ci0KLSAgU1NMQ29udGV4dENvbmZpZyBjb25maWc7Ci0gIGNvbmZpZy52ZXJzaW9uX21heCA9IFNTTF9QUk9UT0NPTF9WRVJTSU9OX1RMUzFfMzsKLSAgc3NsX2NvbmZpZ19zZXJ2aWNlXy0+VXBkYXRlU1NMQ29uZmlnQW5kTm90aWZ5KGNvbmZpZyk7Ci0KLSAgaW50IHJ2OwotICBBU1NFUlRfVFJVRShDcmVhdGVBbmRDb25uZWN0U1NMQ2xpZW50U29ja2V0KFNTTENvbmZpZygpLCAmcnYpKTsKLSAgRVhQRUNUX1RIQVQocnYsIElzT2soKSk7Ci0gIEVYUEVDVF9UUlVFKHNvY2tfLT5Jc0Nvbm5lY3RlZCgpKTsKLX0KLQotLy8gVGVzdCBkb3duZ3JhZGUgZW5mb3JjZW1lbnQgaWdub3JlcyB1bmtub3duIHJvb3RzIHdoZW4gY29uZmlndXJlZCB0by4KLVRFU1RfRihTU0xDbGllbnRTb2NrZXRUZXN0LCBUTFMxM0Rvd25ncmFkZUVuZm9yY2VkS25vd25Vbmtub3duKSB7Ci0gIGJhc2U6OnRlc3Q6OlNjb3BlZEZlYXR1cmVMaXN0IGZlYXR1cmVfbGlzdDsKLSAgZmVhdHVyZV9saXN0LkluaXRBbmRFbmFibGVGZWF0dXJlV2l0aFBhcmFtZXRlcnMoCi0gICAgICBmZWF0dXJlczo6a0VuZm9yY2VUTFMxM0Rvd25ncmFkZSwge3sia25vd25fcm9vdHNfb25seSIsICJ0cnVlIn19KTsKLQotICBTcGF3bmVkVGVzdFNlcnZlcjo6U1NMT3B0aW9ucyBzc2xfb3B0aW9uczsKLSAgc3NsX29wdGlvbnMuc2ltdWxhdGVfdGxzMTNfZG93bmdyYWRlID0gdHJ1ZTsKLSAgc3NsX29wdGlvbnMudGxzX21heF92ZXJzaW9uID0KLSAgICAgIFNwYXduZWRUZXN0U2VydmVyOjpTU0xPcHRpb25zOjpUTFNfTUFYX1ZFUlNJT05fVExTMV8yOwotICBBU1NFUlRfVFJVRShTdGFydFRlc3RTZXJ2ZXIoc3NsX29wdGlvbnMpKTsKLQotICBzY29wZWRfcmVmcHRyPFg1MDlDZXJ0aWZpY2F0ZT4gc2VydmVyX2NlcnQgPQotICAgICAgc3Bhd25lZF90ZXN0X3NlcnZlcigpLT5HZXRDZXJ0aWZpY2F0ZSgpOwotCi0gIC8vIENlcnRpZmljYXRlIGlzIHRydXN0ZWQgYW5kIGNoYWlucyB0byBhIHB1YmxpYyByb290LgotICBDZXJ0VmVyaWZ5UmVzdWx0IHZlcmlmeV9yZXN1bHQ7Ci0gIHZlcmlmeV9yZXN1bHQuaXNfaXNzdWVkX2J5X2tub3duX3Jvb3QgPSBmYWxzZTsKLSAgdmVyaWZ5X3Jlc3VsdC52ZXJpZmllZF9jZXJ0ID0gc2VydmVyX2NlcnQ7Ci0gIGNlcnRfdmVyaWZpZXJfLT5BZGRSZXN1bHRGb3JDZXJ0KHNlcnZlcl9jZXJ0LmdldCgpLCB2ZXJpZnlfcmVzdWx0LCBPSyk7Ci0KLSAgU1NMQ29udGV4dENvbmZpZyBjb25maWc7Ci0gIGNvbmZpZy52ZXJzaW9uX21heCA9IFNTTF9QUk9UT0NPTF9WRVJTSU9OX1RMUzFfMzsKLSAgc3NsX2NvbmZpZ19zZXJ2aWNlXy0+VXBkYXRlU1NMQ29uZmlnQW5kTm90aWZ5KGNvbmZpZyk7Ci0KLSAgaW50IHJ2OwotICBBU1NFUlRfVFJVRShDcmVhdGVBbmRDb25uZWN0U1NMQ2xpZW50U29ja2V0KFNTTENvbmZpZygpLCAmcnYpKTsKLSAgRVhQRUNUX1RIQVQocnYsIElzT2soKSk7Ci0gIEVYUEVDVF9UUlVFKHNvY2tfLT5Jc0Nvbm5lY3RlZCgpKTsKKyAgICAgICAgICBzc2xfY2xpZW50X3Nlc3Npb25fY2FjaGVfLT5GbHVzaCgpOworICAgICAgICAgIGludCBydjsKKyAgICAgICAgICBBU1NFUlRfVFJVRShDcmVhdGVBbmRDb25uZWN0U1NMQ2xpZW50U29ja2V0KFNTTENvbmZpZygpLCAmcnYpKTsKKyAgICAgICAgICBpZiAoc2hvdWxkX2VuZm9yY2UgJiYgZG93bmdyYWRlKSB7CisgICAgICAgICAgICBFWFBFQ1RfVEhBVChydiwgSXNFcnJvcihFUlJfVExTMTNfRE9XTkdSQURFX0RFVEVDVEVEKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0Uoc29ja18tPklzQ29ubmVjdGVkKCkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBFWFBFQ1RfVEhBVChydiwgSXNPaygpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHNvY2tfLT5Jc0Nvbm5lY3RlZCgpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KIH0KIAogc3RydWN0IFRMUzEzRG93bmdyYWRlTWV0cmljc1BhcmFtcyB7CkBAIC01NjkxLDEwICs1NDczLDYgQEAKICAgY29uc3QgVExTMTNEb3duZ3JhZGVNZXRyaWNzUGFyYW1zJiBwYXJhbXMgPSBHZXRQYXJhbSgpOwogICBiYXNlOjpIaXN0b2dyYW1UZXN0ZXIgaGlzdG9ncmFtczsKIAotICAvLyBNZXRyaWNzIGFyZSBvbmx5IGdhdGhlcmVkIHdoZW4gZW5mb3JjZW1lbnQgaXMgZGlzYWJsZWQuCi0gIGJhc2U6OnRlc3Q6OlNjb3BlZEZlYXR1cmVMaXN0IGZlYXR1cmVfbGlzdDsKLSAgZmVhdHVyZV9saXN0LkluaXRBbmREaXNhYmxlRmVhdHVyZShmZWF0dXJlczo6a0VuZm9yY2VUTFMxM0Rvd25ncmFkZSk7Ci0KICAgU3Bhd25lZFRlc3RTZXJ2ZXI6OlNTTE9wdGlvbnMgc3NsX29wdGlvbnM7CiAgIHNzbF9vcHRpb25zLnNpbXVsYXRlX3RsczEzX2Rvd25ncmFkZSA9IHBhcmFtcy5kb3duZ3JhZGU7CiAgIHNzbF9vcHRpb25zLmtleV9leGNoYW5nZXMgPSBwYXJhbXMua2V5X2V4Y2hhbmdlczsKQEAgLTU3MjksNyArNTUwNyw3IEBACiAgIHN0ZDo6dW5pcXVlX3B0cjxTU0xDbGllbnRTb2NrZXQ+IHNzbF9zb2NrZXQgPQogICAgICAgQ3JlYXRlU1NMQ2xpZW50U29ja2V0KHN0ZDo6bW92ZSh0cmFuc3BvcnQpLCBob3N0X3BvcnRfcGFpciwgU1NMQ29uZmlnKCkpOwogICBydiA9IGNhbGxiYWNrLkdldFJlc3VsdChzc2xfc29ja2V0LT5Db25uZWN0KGNhbGxiYWNrLmNhbGxiYWNrKCkpKTsKLSAgRVhQRUNUX1RIQVQocnYsIElzT2soKSk7CisgIEVYUEVDVF9USEFUKHJ2LCBBbnlPZihJc09rKCksIElzRXJyb3IoRVJSX1RMUzEzX0RPV05HUkFERV9ERVRFQ1RFRCkpKTsKIAogICBoaXN0b2dyYW1zLkV4cGVjdFVuaXF1ZVNhbXBsZSgiTmV0LlNTTFRMUzEzRG93bmdyYWRlIiwgcGFyYW1zLmRvd25ncmFkZSwgMSk7CiAgIGlmIChwYXJhbXMudGxzMTNfZXhwZXJpbWVudF9ob3N0KSB7CmRpZmYgLS1naXQgYS9uZXQvc29ja2V0L3RyYW5zcG9ydF9jbGllbnRfc29ja2V0X3Bvb2wuY2MgYi9uZXQvc29ja2V0L3RyYW5zcG9ydF9jbGllbnRfc29ja2V0X3Bvb2wuY2MKaW5kZXggZGU0MGYyOS4uZDE4MjNiMiAxMDA2NDQKLS0tIGEvbmV0L3NvY2tldC90cmFuc3BvcnRfY2xpZW50X3NvY2tldF9wb29sLmNjCisrKyBiL25ldC9zb2NrZXQvdHJhbnNwb3J0X2NsaWVudF9zb2NrZXRfcG9vbC5jYwpAQCAtODAwLDcgKzgwMCw2IEBACiAKIHZvaWQgVHJhbnNwb3J0Q2xpZW50U29ja2V0UG9vbDo6T25TU0xDb25maWdGb3JTZXJ2ZXJDaGFuZ2VkKAogICAgIGNvbnN0IEhvc3RQb3J0UGFpciYgc2VydmVyKSB7Ci0gIGJvb2wgcmVmcmVzaGVkX2FueSA9IGZhbHNlOwogICAvLyBDdXJyZW50IHRpbWUgdmFsdWUuIFJldHJpZXZpbmcgaXQgb25jZSBhdCB0aGUgZnVuY3Rpb24gc3RhcnQgcmF0aGVyIHRoYW4KICAgLy8gaW5zaWRlIHRoZSBpbm5lciBsb29wLCBzaW5jZSBpdCBzaG91bGRuJ3QgY2hhbmdlIGJ5IGFueSBtZWFuaW5nZnVsIGFtb3VudC4KICAgLy8KQEAgLTgwOSwyOCArODA4LDIwIEBACiAgIC8vIGludGVyZmFjZXMgc28gdGhlIHBhcmFtZXRlciBpcyBub3QgbmVjZXNzYXJ5LgogICBiYXNlOjpUaW1lVGlja3Mgbm93ID0gYmFzZTo6VGltZVRpY2tzOjpOb3coKTsKIAotICBpZiAocHJveHlfc2VydmVyXy5pc19odHRwX2xpa2UoKSAmJiAhcHJveHlfc2VydmVyXy5pc19odHRwKCkgJiYKLSAgICAgIHByb3h5X3NlcnZlcl8uaG9zdF9wb3J0X3BhaXIoKSA9PSBzZXJ2ZXIpIHsKLSAgICAvLyBJZiB0aGUgcHJveHkgaXMgfHNlcnZlcnwgYW5kIHVzZXMgU1NMIHNldHRpbmdzIChIVFRQUyBvciBRVUlDKSwgcmVmcmVzaAotICAgIC8vIGV2ZXJ5IGdyb3VwLgotICAgIHJlZnJlc2hlZF9hbnkgPSAhZ3JvdXBfbWFwXy5lbXB0eSgpOwotICAgIGZvciAoYXV0byBpdCA9IGdyb3VwX21hcF8uYmVnaW4oKTsgaXQgIT0gZ3JvdXBfbWFwXy5lbmQoKTspIHsKLSAgICAgIGF1dG8gdG9fcmVmcmVzaCA9IGl0Kys7CisgIC8vIElmIHRoZSBwcm94eSBpcyB8c2VydmVyfCBhbmQgdXNlcyBTU0wgc2V0dGluZ3MgKEhUVFBTIG9yIFFVSUMpLCByZWZyZXNoCisgIC8vIGV2ZXJ5IGdyb3VwLgorICBib29sIHByb3h5X21hdGNoZXMgPSBwcm94eV9zZXJ2ZXJfLmlzX2h0dHBfbGlrZSgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICFwcm94eV9zZXJ2ZXJfLmlzX2h0dHAoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICBwcm94eV9zZXJ2ZXJfLmhvc3RfcG9ydF9wYWlyKCkgPT0gc2VydmVyOworICBib29sIHJlZnJlc2hlZF9hbnkgPSBmYWxzZTsKKyAgZm9yIChhdXRvIGl0ID0gZ3JvdXBfbWFwXy5iZWdpbigpOyBpdCAhPSBncm91cF9tYXBfLmVuZCgpOykgeworICAgIGF1dG8gdG9fcmVmcmVzaCA9IGl0Kys7CisgICAgaWYgKHByb3h5X21hdGNoZXMgfHwgKHRvX3JlZnJlc2gtPmZpcnN0LnNvY2tldF90eXBlKCkgPT0gU29ja2V0VHlwZTo6a1NzbCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICB0b19yZWZyZXNoLT5maXJzdC5kZXN0aW5hdGlvbigpID09IHNlcnZlcikpIHsKKyAgICAgIHJlZnJlc2hlZF9hbnkgPSB0cnVlOwogICAgICAgLy8gTm90ZSB0aGlzIGNhbGwgbWF5IGRlc3Ryb3kgdGhlIGdyb3VwIGFuZCBpbnZhbGlkYXRlIHx0b19yZWZyZXNofC4KICAgICAgIFJlZnJlc2hHcm91cCh0b19yZWZyZXNoLCBub3cpOwogICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvLyBSZWZyZXNoIHRoZSBjcmVkZW50aWFsZWQgYW5kIHVuY3JlZGVudGlhbGVkIHBvb2xzIGZvciB8c2VydmVyfC4KLSAgICBmb3IgKGF1dG8gcHJpdmFjeV9tb2RlIDoge1ByaXZhY3lNb2RlOjpQUklWQUNZX01PREVfRElTQUJMRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcml2YWN5TW9kZTo6UFJJVkFDWV9NT0RFX0VOQUJMRUR9KSB7Ci0gICAgICBhdXRvIGl0ID0KLSAgICAgICAgICBncm91cF9tYXBfLmZpbmQoR3JvdXBJZChzZXJ2ZXIsIFNvY2tldFR5cGU6OmtTc2wsIHByaXZhY3lfbW9kZSkpOwotICAgICAgaWYgKGl0ICE9IGdyb3VwX21hcF8uZW5kKCkpIHsKLSAgICAgICAgcmVmcmVzaGVkX2FueSA9IHRydWU7Ci0gICAgICAgIC8vIE5vdGUgdGhpcyBjYWxsIG1heSBkZXN0cm95IHRoZSBncm91cCBhbmQgaW52YWxpZGF0ZSB8aXR8LgotICAgICAgICBSZWZyZXNoR3JvdXAoaXQsIG5vdyk7Ci0gICAgICB9Ci0gICAgfQogICB9CiAKICAgaWYgKHJlZnJlc2hlZF9hbnkpIHsKZGlmZiAtLWdpdCBhL25ldC9zc2wvc3NsX2NvbmZpZ19zZXJ2aWNlLmNjIGIvbmV0L3NzbC9zc2xfY29uZmlnX3NlcnZpY2UuY2MKaW5kZXggYTM1ZDZiMGEuLjM1NGI2NjAgMTAwNjQ0Ci0tLSBhL25ldC9zc2wvc3NsX2NvbmZpZ19zZXJ2aWNlLmNjCisrKyBiL25ldC9zc2wvc3NsX2NvbmZpZ19zZXJ2aWNlLmNjCkBAIC0xNyw5ICsxNywxMSBAQAogYm9vbCBTU0xDb250ZXh0Q29uZmlnc0FyZUVxdWFsKGNvbnN0IG5ldDo6U1NMQ29udGV4dENvbmZpZyYgY29uZmlnMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXQ6OlNTTENvbnRleHRDb25maWcmIGNvbmZpZzIpIHsKICAgcmV0dXJuIHN0ZDo6dGllKGNvbmZpZzEudmVyc2lvbl9taW4sIGNvbmZpZzEudmVyc2lvbl9tYXgsCi0gICAgICAgICAgICAgICAgICBjb25maWcxLmRpc2FibGVkX2NpcGhlcl9zdWl0ZXMpID09CisgICAgICAgICAgICAgICAgICBjb25maWcxLmRpc2FibGVkX2NpcGhlcl9zdWl0ZXMsCisgICAgICAgICAgICAgICAgICBjb25maWcxLnRsczEzX2hhcmRlbmluZ19mb3JfbG9jYWxfYW5jaG9yc19lbmFibGVkKSA9PQogICAgICAgICAgc3RkOjp0aWUoY29uZmlnMi52ZXJzaW9uX21pbiwgY29uZmlnMi52ZXJzaW9uX21heCwKLSAgICAgICAgICAgICAgICAgIGNvbmZpZzIuZGlzYWJsZWRfY2lwaGVyX3N1aXRlcyk7CisgICAgICAgICAgICAgICAgICBjb25maWcyLmRpc2FibGVkX2NpcGhlcl9zdWl0ZXMsCisgICAgICAgICAgICAgICAgICBjb25maWcyLnRsczEzX2hhcmRlbmluZ19mb3JfbG9jYWxfYW5jaG9yc19lbmFibGVkKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9uZXQvc3NsL3NzbF9jb25maWdfc2VydmljZS5oIGIvbmV0L3NzbC9zc2xfY29uZmlnX3NlcnZpY2UuaAppbmRleCA3M2M3MDgwYi4uYzFkMjI2OWMgMTAwNjQ0Ci0tLSBhL25ldC9zc2wvc3NsX2NvbmZpZ19zZXJ2aWNlLmgKKysrIGIvbmV0L3NzbC9zc2xfY29uZmlnX3NlcnZpY2UuaApAQCAtMzgsNiArMzgsMTAgQEAKICAgLy8gRXg6IFRvIGRpc2FibGUgVExTX1JTQV9XSVRIX1JDNF8xMjhfTUQ1LCBzcGVjaWZ5IDB4MDAwNCwgd2hpbGUgdG8KICAgLy8gZGlzYWJsZSBUTFNfRUNESF9FQ0RTQV9XSVRIX1JDNF8xMjhfU0hBLCBzcGVjaWZ5IDB4QzAwMi4KICAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IGRpc2FibGVkX2NpcGhlcl9zdWl0ZXM7CisKKyAgLy8gSWYgdHJ1ZSwgZW5hYmxlcyBUTFMgMS4zIGRvd25ncmFkZSBoYXJkZW5pbmcgZm9yIGNvbm5lY3Rpb25zIHVzaW5nCisgIC8vIGxvY2FsIHRydXN0IGFuY2hvcnMuIChIYXJkZW5pbmcgZm9yIGtub3duIHJvb3RzIGlzIGFsd2F5cyBlbmFibGVkLikKKyAgYm9vbCB0bHMxM19oYXJkZW5pbmdfZm9yX2xvY2FsX2FuY2hvcnNfZW5hYmxlZCA9IGZhbHNlOwogfTsKIAogLy8gVGhlIGludGVyZmFjZSBmb3IgcmV0cmlldmluZyBnbG9iYWwgU1NMIGNvbmZpZ3VyYXRpb24uICBUaGlzIGludGVyZmFjZQpkaWZmIC0tZ2l0IGEvbmV0L3NzbC9zc2xfY29uZmlnX3NlcnZpY2VfdW5pdHRlc3QuY2MgYi9uZXQvc3NsL3NzbF9jb25maWdfc2VydmljZV91bml0dGVzdC5jYwppbmRleCAxNWQwNmNjLi4zODI4YTcyZiAxMDA2NDQKLS0tIGEvbmV0L3NzbC9zc2xfY29uZmlnX3NlcnZpY2VfdW5pdHRlc3QuY2MKKysrIGIvbmV0L3NzbC9zc2xfY29uZmlnX3NlcnZpY2VfdW5pdHRlc3QuY2MKQEAgLTEyMiw2ICsxMjIsMTEgQEAKICAgRVhQRUNUX0NBTEwob2JzZXJ2ZXIsIE9uU1NMQ29udGV4dENvbmZpZ0NoYW5nZWQoKSkuVGltZXMoMSk7CiAgIG1vY2tfc2VydmljZS5TZXRTU0xDb250ZXh0Q29uZmlnKGluaXRpYWxfY29uZmlnKTsKIAorICAvLyBFbnN1cmUgdGhhdCB0b2dnbGluZyBUTFMgMS4zIGhhcmRlbmluZyB0cmlnZ2VycyBhbiB1cGRhdGUuCisgIGluaXRpYWxfY29uZmlnLnRsczEzX2hhcmRlbmluZ19mb3JfbG9jYWxfYW5jaG9yc19lbmFibGVkID0gdHJ1ZTsKKyAgRVhQRUNUX0NBTEwob2JzZXJ2ZXIsIE9uU1NMQ29udGV4dENvbmZpZ0NoYW5nZWQoKSkuVGltZXMoMSk7CisgIG1vY2tfc2VydmljZS5TZXRTU0xDb250ZXh0Q29uZmlnKGluaXRpYWxfY29uZmlnKTsKKwogICBtb2NrX3NlcnZpY2UuUmVtb3ZlT2JzZXJ2ZXIoJm9ic2VydmVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L3VybF9yZXF1ZXN0L3VybF9yZXF1ZXN0X2NvbnRleHRfYnVpbGRlcl91bml0dGVzdC5jYyBiL25ldC91cmxfcmVxdWVzdC91cmxfcmVxdWVzdF9jb250ZXh0X2J1aWxkZXJfdW5pdHRlc3QuY2MKaW5kZXggZWVlMTI5NC4uMzU1NzFjMyAxMDA2NDQKLS0tIGEvbmV0L3VybF9yZXF1ZXN0L3VybF9yZXF1ZXN0X2NvbnRleHRfYnVpbGRlcl91bml0dGVzdC5jYworKysgYi9uZXQvdXJsX3JlcXVlc3QvdXJsX3JlcXVlc3RfY29udGV4dF9idWlsZGVyX3VuaXR0ZXN0LmNjCkBAIC02LDYgKzYsNyBAQAogCiAjaW5jbHVkZSAiYmFzZS9ydW5fbG9vcC5oIgogI2luY2x1ZGUgImJ1aWxkL2J1aWxkX2NvbmZpZy5oIgorI2luY2x1ZGUgIm5ldC9iYXNlL25ldHdvcmtfaXNvbGF0aW9uX2tleS5oIgogI2luY2x1ZGUgIm5ldC9iYXNlL3JlcXVlc3RfcHJpb3JpdHkuaCIKICNpbmNsdWRlICJuZXQvYmFzZS90ZXN0X2NvbXBsZXRpb25fY2FsbGJhY2suaCIKICNpbmNsdWRlICJuZXQvZG5zL2hvc3RfcmVzb2x2ZXIuaCIKQEAgLTE5Niw3ICsxOTcsOCBAQAogICAvLyBRdWV1ZSBhIHBlbmRpbmcgdXBsb2FkLgogICBHVVJMIHVybCgiaHR0cHM6Ly93d3cuZm9vLnRlc3QiKTsKICAgY29udGV4dC0+cmVwb3J0aW5nX3NlcnZpY2UoKS0+R2V0Q29udGV4dEZvclRlc3RpbmcoKS0+dXBsb2FkZXIoKS0+U3RhcnRVcGxvYWQoCi0gICAgICB1cmw6Ok9yaWdpbjo6Q3JlYXRlKHVybCksIHVybCwgInJlcG9ydCBib2R5IiwgMCwgYmFzZTo6RG9Ob3RoaW5nKCkpOworICAgICAgdXJsOjpPcmlnaW46OkNyZWF0ZSh1cmwpLCB1cmwsIE5ldHdvcmtJc29sYXRpb25LZXkoKSwgInJlcG9ydCBib2R5IiwgMCwKKyAgICAgIGJhc2U6OkRvTm90aGluZygpKTsKICAgYmFzZTo6UnVuTG9vcCgpLlJ1blVudGlsSWRsZSgpOwogICBBU1NFUlRfRVEoMSwgY29udGV4dC0+cmVwb3J0aW5nX3NlcnZpY2UoKQogICAgICAgICAgICAgICAgICAgIC0+R2V0Q29udGV4dEZvclRlc3RpbmcoKQpkaWZmIC0tZ2l0IGEvcmVtb3RpbmcvYW5kcm9pZC9qYXZhL3Jlcy9sYXlvdXQvbm90aWZpY2F0aW9uX2RpYWxvZy54bWwgYi9yZW1vdGluZy9hbmRyb2lkL2phdmEvcmVzL2xheW91dC9ub3RpZmljYXRpb25fZGlhbG9nLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGRiM2U4Ci0tLSAvZGV2L251bGwKKysrIGIvcmVtb3RpbmcvYW5kcm9pZC9qYXZhL3Jlcy9sYXlvdXQvbm90aWZpY2F0aW9uX2RpYWxvZy54bWwKQEAgLTAsMCArMSwxOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKworPCEtLSBDb3B5cmlnaHQgMjAxOSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgICAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorICAgICBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICB4bWxuczp0b29scz0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vdG9vbHMiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nU3RhcnQ9IjIwZHAiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0VuZD0iMjBkcCI+CisgICAgPENoZWNrQm94IGFuZHJvaWQ6aWQ9IkAraWQvc2lsZW5jZV9jaGVja2JveCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9kb250X3Nob3dfYWdhaW4iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiLz4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcmVtb3RpbmcvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vY2hyb21vdGluZy9qbmkvTm90aWZpY2F0aW9uUHJlc2VudGVyLmphdmEgYi9yZW1vdGluZy9hbmRyb2lkL2phdmEvc3JjL29yZy9jaHJvbWl1bS9jaHJvbW90aW5nL2puaS9Ob3RpZmljYXRpb25QcmVzZW50ZXIuamF2YQppbmRleCA3MTZkZTY4Li5jMjUzY2QwIDEwMDY0NAotLS0gYS9yZW1vdGluZy9hbmRyb2lkL2phdmEvc3JjL29yZy9jaHJvbWl1bS9jaHJvbW90aW5nL2puaS9Ob3RpZmljYXRpb25QcmVzZW50ZXIuamF2YQorKysgYi9yZW1vdGluZy9hbmRyb2lkL2phdmEvc3JjL29yZy9jaHJvbWl1bS9jaHJvbW90aW5nL2puaS9Ob3RpZmljYXRpb25QcmVzZW50ZXIuamF2YQpAQCAtNSwxMCArNSwxNCBAQAogcGFja2FnZSBvcmcuY2hyb21pdW0uY2hyb21vdGluZy5qbmk7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjcuYXBwLkFsZXJ0RGlhbG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkNoZWNrQm94OwogCiBpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5JbnREZWY7CiAKQEAgLTIwLDYgKzI0LDcgQEAKIAogaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKIGltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CiAKIC8qKiBIZWxwZXIgZm9yIGZldGNoaW5nIGFuZCBwcmVzZW50aW5nIGEgbm90aWZpY2F0aW9uICovCiBASk5JTmFtZXNwYWNlKCJyZW1vdGluZyIpCkBAIC0zMiw2ICszNywxOSBAQAogICAgICAgICBpbnQgRkVUQ0hFRCA9IDI7CiAgICAgfQogCisgICAgQEludERlZih7Tm90aWZpY2F0aW9uVWlTdGF0ZS5OT1RfU0hPV04sIE5vdGlmaWNhdGlvblVpU3RhdGUuU0hPV04sCisgICAgICAgICAgICBOb3RpZmljYXRpb25VaVN0YXRlLlNJTEVOQ0VEfSkKKyAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCisgICAgcHJpdmF0ZSBAaW50ZXJmYWNlIE5vdGlmaWNhdGlvblVpU3RhdGUgeworICAgICAgICBpbnQgTk9UX1NIT1dOID0gMDsKKyAgICAgICAgaW50IFNIT1dOID0gMTsKKyAgICAgICAgaW50IFNJTEVOQ0VEID0gMjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9VSV9TVEFURSA9ICJub3RpZmljYXRpb25fdWlfc3RhdGUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0xBU1RfU0VFTl9NRVNTQUdFX0lEID0KKyAgICAgICAgICAgICJub3RpZmljYXRpb25fbGFzdF9zZWVuX21lc3NhZ2VfaWQiOworCiAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIG1OYXRpdmVKbmlOb3RpZmljYXRpb25QcmVzZW50ZXI7CiAgICAgcHJpdmF0ZSBmaW5hbCBBY3Rpdml0eSBtQWN0aXZpdHk7CiAKQEAgLTY1LDExICs4MywyOCBAQAogICAgIH0KIAogICAgIEBDYWxsZWRCeU5hdGl2ZQotICAgIHZvaWQgb25Ob3RpZmljYXRpb25GZXRjaGVkKFN0cmluZyBtZXNzYWdlVGV4dCwgU3RyaW5nIGxpbmtUZXh0LCBTdHJpbmcgbGlua1VybCkgeworICAgIHZvaWQgb25Ob3RpZmljYXRpb25GZXRjaGVkKFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZyBtZXNzYWdlVGV4dCwgU3RyaW5nIGxpbmtUZXh0LAorICAgICAgICAgICAgU3RyaW5nIGxpbmtVcmwsIGJvb2xlYW4gYWxsb3dTaWxlbmNlKSB7CiAgICAgICAgIFByZWNvbmRpdGlvbnMuaXNUcnVlKG1TdGF0ZSA9PSBTdGF0ZS5GRVRDSElORyk7CiAgICAgICAgIG1TdGF0ZSA9IFN0YXRlLkZFVENIRUQ7CiAKLSAgICAgICAgLy8gVE9ETyh5dXdlaWgpOiBBZGQgRG9uJ3QgU2hvdyBBZ2FpbiBzdXBwb3J0LgorICAgICAgICBTaGFyZWRQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IG1BY3Rpdml0eS5nZXRQcmVmZXJlbmNlcyhDb250ZXh0Lk1PREVfUFJJVkFURSk7CisgICAgICAgIEBOb3RpZmljYXRpb25VaVN0YXRlCisgICAgICAgIGludCB1aVN0YXRlID0gcHJlZmVyZW5jZXMuZ2V0SW50KFBSRUZFUkVOQ0VfVUlfU1RBVEUsIE5vdGlmaWNhdGlvblVpU3RhdGUuTk9UX1NIT1dOKTsKKyAgICAgICAgU3RyaW5nIGxhc3RTZWVuTWVzc2FnZUlkID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKFBSRUZFUkVOQ0VfTEFTVF9TRUVOX01FU1NBR0VfSUQsICIiKTsKKworICAgICAgICBpZiAoYWxsb3dTaWxlbmNlICYmIHVpU3RhdGUgPT0gTm90aWZpY2F0aW9uVWlTdGF0ZS5TSUxFTkNFRAorICAgICAgICAgICAgICAgICYmIE9iamVjdHMuZXF1YWxzKGxhc3RTZWVuTWVzc2FnZUlkLCBtZXNzYWdlSWQpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoIU9iamVjdHMuZXF1YWxzKGxhc3RTZWVuTWVzc2FnZUlkLCBtZXNzYWdlSWQpKSB7CisgICAgICAgICAgICBwcmVmZXJlbmNlcy5lZGl0KCkKKyAgICAgICAgICAgICAgICAgICAgLnB1dEludChQUkVGRVJFTkNFX1VJX1NUQVRFLCBOb3RpZmljYXRpb25VaVN0YXRlLk5PVF9TSE9XTikKKyAgICAgICAgICAgICAgICAgICAgLnB1dFN0cmluZyhQUkVGRVJFTkNFX0xBU1RfU0VFTl9NRVNTQUdFX0lELCBtZXNzYWdlSWQpCisgICAgICAgICAgICAgICAgICAgIC5hcHBseSgpOworICAgICAgICB9CisKICAgICAgICAgZmluYWwgQWxlcnREaWFsb2cuQnVpbGRlciBidWlsZGVyID0gbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIobUFjdGl2aXR5KTsKICAgICAgICAgYnVpbGRlci5zZXRNZXNzYWdlKG1lc3NhZ2VUZXh0KTsKICAgICAgICAgYnVpbGRlci5zZXRQb3NpdGl2ZUJ1dHRvbihsaW5rVGV4dCwgKERpYWxvZ0ludGVyZmFjZSBkaWFsb2csIGludCBpZCkgLT4gewpAQCAtODEsNiArMTE2LDIzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAtPiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdGhpbmcKICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICBDaGVja0JveCBzaWxlbmNlQ2hlY2tCb3g7CisgICAgICAgIGlmIChhbGxvd1NpbGVuY2UgJiYgdWlTdGF0ZSA9PSBOb3RpZmljYXRpb25VaVN0YXRlLlNIT1dOKSB7CisgICAgICAgICAgICBWaWV3IG5vdGlmaWNhdGlvbkRpYWxvZyA9CisgICAgICAgICAgICAgICAgICAgIG1BY3Rpdml0eS5nZXRMYXlvdXRJbmZsYXRlcigpLmluZmxhdGUoUi5sYXlvdXQubm90aWZpY2F0aW9uX2RpYWxvZywgbnVsbCk7CisgICAgICAgICAgICBidWlsZGVyLnNldFZpZXcobm90aWZpY2F0aW9uRGlhbG9nKTsKKyAgICAgICAgICAgIHNpbGVuY2VDaGVja0JveCA9IG5vdGlmaWNhdGlvbkRpYWxvZy5maW5kVmlld0J5SWQoUi5pZC5zaWxlbmNlX2NoZWNrYm94KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNpbGVuY2VDaGVja0JveCA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgYnVpbGRlci5zZXRPbkRpc21pc3NMaXN0ZW5lcigoRGlhbG9nSW50ZXJmYWNlIGRpYWxvZykgLT4geworICAgICAgICAgICAgQE5vdGlmaWNhdGlvblVpU3RhdGUKKyAgICAgICAgICAgIGludCBuZXdTdGF0ZSA9IChzaWxlbmNlQ2hlY2tCb3ggIT0gbnVsbCAmJiBzaWxlbmNlQ2hlY2tCb3guaXNDaGVja2VkKCkpCisgICAgICAgICAgICAgICAgICAgID8gTm90aWZpY2F0aW9uVWlTdGF0ZS5TSUxFTkNFRAorICAgICAgICAgICAgICAgICAgICA6IE5vdGlmaWNhdGlvblVpU3RhdGUuU0hPV047CisgICAgICAgICAgICBwcmVmZXJlbmNlcy5lZGl0KCkucHV0SW50KFBSRUZFUkVOQ0VfVUlfU1RBVEUsIG5ld1N0YXRlKS5hcHBseSgpOworICAgICAgICB9KTsKKwogICAgICAgICBmaW5hbCBBbGVydERpYWxvZyBkaWFsb2cgPSBidWlsZGVyLmNyZWF0ZSgpOwogICAgICAgICBkaWFsb2cuc2hvdygpOwogICAgIH0KZGlmZiAtLWdpdCBhL3JlbW90aW5nL2Jhc2Uvc2VydmljZV91cmxzLmNjIGIvcmVtb3RpbmcvYmFzZS9zZXJ2aWNlX3VybHMuY2MKaW5kZXggOGM3ODZhZi4uYThlZGU2MiAxMDA2NDQKLS0tIGEvcmVtb3RpbmcvYmFzZS9zZXJ2aWNlX3VybHMuY2MKKysrIGIvcmVtb3RpbmcvYmFzZS9zZXJ2aWNlX3VybHMuY2MKQEAgLTcsMTAgKzcsOCBAQAogI2luY2x1ZGUgImJhc2UvY29tbWFuZF9saW5lLmgiCiAjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCiAjaW5jbHVkZSAiZ29vZ2xlX2FwaXMvZ29vZ2xlX2FwaV9rZXlzLmgiCi0jaW5jbHVkZSAicmVtb3RpbmcvYmFzZS9yZW1vdGluZ19ib3QuaCIKIAogLy8gQ29uZmlndXJhYmxlIHNlcnZpY2UgZGF0YS4KLWNvbnN0ZXhwciBjaGFyIGtEaXJlY3RvcnlCYXNlVXJsW10gPSAiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vY2hyb21vdGluZy92MSI7CiBjb25zdGV4cHIgY2hhciBrR2NkQmFzZVVybFtdID0gImh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Nsb3VkZGV2aWNlcy92MSI7CiBjb25zdGV4cHIgY2hhciBrR2NkSmlkW10gPSAiY2xvdWRkZXZpY2VzLmdzZXJ2aWNlYWNjb3VudC5jb20iOwogY29uc3RleHByIGNoYXIga0Z0bFNlcnZlckVuZHBvaW50W10gPSAiaW5zdGFudG1lc3NhZ2luZy1wYS5nb29nbGVhcGlzLmNvbSI7CkBAIC0xOCwyNCArMTYsMTYgQEAKIAogLy8gQ29tbWFuZCBsaW5lIHN3aXRjaGVzLgogI2lmICFkZWZpbmVkKE5ERUJVRykKLWNvbnN0ZXhwciBjaGFyIGtEaXJlY3RvcnlCYXNlVXJsU3dpdGNoW10gPSAiZGlyZWN0b3J5LWJhc2UtdXJsIjsKIGNvbnN0ZXhwciBjaGFyIGtHY2RCYXNlVXJsU3dpdGNoW10gPSAiZ2NkLWJhc2UtdXJsIjsKLWNvbnN0ZXhwciBjaGFyIGtEaXJlY3RvcnlCb3RKaWRTd2l0Y2hbXSA9ICJkaXJlY3RvcnktYm90LWppZCI7CiBjb25zdGV4cHIgY2hhciBrR2NkSmlkU3dpdGNoW10gPSAiZ2NkLWppZCI7CiBjb25zdGV4cHIgY2hhciBrRnRsU2VydmVyRW5kcG9pbnRTd2l0Y2hbXSA9ICJmdGwtc2VydmVyLWVuZHBvaW50IjsKIGNvbnN0ZXhwciBjaGFyIGtSZW1vdGluZ1NlcnZlckVuZHBvaW50U3dpdGNoW10gPSAicmVtb3Rpbmctc2VydmVyLWVuZHBvaW50IjsKICNlbmRpZiAgLy8gIWRlZmluZWQoTkRFQlVHKQogCi0vLyBOb24tY29uZmlndXJhYmxlIHNlcnZpY2UgcGF0aHMuCi1jb25zdGV4cHIgY2hhciBrRGlyZWN0b3J5SG9zdHNTdWZmaXhbXSA9ICIvQG1lL2hvc3RzLyI7Ci1jb25zdGV4cHIgY2hhciBrRGlyZWN0b3J5SWNlQ29uZmlnU3VmZml4W10gPSAiL0BtZS9pY2Vjb25maWciOwotCiBuYW1lc3BhY2UgcmVtb3RpbmcgewogCiBTZXJ2aWNlVXJsczo6U2VydmljZVVybHMoKQotICAgIDogZGlyZWN0b3J5X2Jhc2VfdXJsXyhrRGlyZWN0b3J5QmFzZVVybCksCi0gICAgICBnY2RfYmFzZV91cmxfKGtHY2RCYXNlVXJsKSwKLSAgICAgIGRpcmVjdG9yeV9ib3RfamlkXyhrUmVtb3RpbmdCb3RKaWQpLAorICAgIDogZ2NkX2Jhc2VfdXJsXyhrR2NkQmFzZVVybCksCiAgICAgICBnY2RfamlkXyhrR2NkSmlkKSwKICAgICAgIGZ0bF9zZXJ2ZXJfZW5kcG9pbnRfKGtGdGxTZXJ2ZXJFbmRwb2ludCksCiAgICAgICByZW1vdGluZ19zZXJ2ZXJfZW5kcG9pbnRfKGtSZW1vdGluZ1NlcnZlckVuZHBvaW50KSB7CkBAIC00NSwxNyArMzUsOSBAQAogICAgIC8vIEFsbG93IGRlYnVnIGJ1aWxkcyB0byBvdmVycmlkZSB1cmxzIHZpYSBjb21tYW5kIGxpbmUuCiAgICAgYmFzZTo6Q29tbWFuZExpbmUqIGNvbW1hbmRfbGluZSA9IGJhc2U6OkNvbW1hbmRMaW5lOjpGb3JDdXJyZW50UHJvY2VzcygpOwogICAgIENIRUNLKGNvbW1hbmRfbGluZSk7Ci0gICAgaWYgKGNvbW1hbmRfbGluZS0+SGFzU3dpdGNoKGtEaXJlY3RvcnlCYXNlVXJsU3dpdGNoKSkgewotICAgICAgZGlyZWN0b3J5X2Jhc2VfdXJsXyA9Ci0gICAgICAgICAgY29tbWFuZF9saW5lLT5HZXRTd2l0Y2hWYWx1ZUFTQ0lJKGtEaXJlY3RvcnlCYXNlVXJsU3dpdGNoKTsKLSAgICB9CiAgICAgaWYgKGNvbW1hbmRfbGluZS0+SGFzU3dpdGNoKGtHY2RCYXNlVXJsU3dpdGNoKSkgewogICAgICAgZ2NkX2Jhc2VfdXJsXyA9IGNvbW1hbmRfbGluZS0+R2V0U3dpdGNoVmFsdWVBU0NJSShrR2NkQmFzZVVybFN3aXRjaCk7CiAgICAgfQotICAgIGlmIChjb21tYW5kX2xpbmUtPkhhc1N3aXRjaChrRGlyZWN0b3J5Qm90SmlkU3dpdGNoKSkgewotICAgICAgZGlyZWN0b3J5X2JvdF9qaWRfID0KLSAgICAgICAgICBjb21tYW5kX2xpbmUtPkdldFN3aXRjaFZhbHVlQVNDSUkoa0RpcmVjdG9yeUJvdEppZFN3aXRjaCk7Ci0gICAgfQogICAgIGlmIChjb21tYW5kX2xpbmUtPkhhc1N3aXRjaChrR2NkSmlkU3dpdGNoKSkgewogICAgICAgZ2NkX2ppZF8gPSBjb21tYW5kX2xpbmUtPkdldFN3aXRjaFZhbHVlQVNDSUkoa0djZEppZFN3aXRjaCk7CiAgICAgfQpAQCAtNjksOSArNTEsNiBAQAogICAgIH0KICAgfQogI2VuZGlmICAvLyAhZGVmaW5lZChOREVCVUcpCi0KLSAgZGlyZWN0b3J5X2hvc3RzX3VybF8gPSBkaXJlY3RvcnlfYmFzZV91cmxfICsga0RpcmVjdG9yeUhvc3RzU3VmZml4OwotICBpY2VfY29uZmlnX3VybF8gPSBkaXJlY3RvcnlfYmFzZV91cmxfICsga0RpcmVjdG9yeUljZUNvbmZpZ1N1ZmZpeDsKIH0KIAogU2VydmljZVVybHM6On5TZXJ2aWNlVXJscygpID0gZGVmYXVsdDsKZGlmZiAtLWdpdCBhL3JlbW90aW5nL2Jhc2Uvc2VydmljZV91cmxzLmggYi9yZW1vdGluZy9iYXNlL3NlcnZpY2VfdXJscy5oCmluZGV4IDJhNjkwNDguLjE2MjRkMmIzIDEwMDY0NAotLS0gYS9yZW1vdGluZy9iYXNlL3NlcnZpY2VfdXJscy5oCisrKyBiL3JlbW90aW5nL2Jhc2Uvc2VydmljZV91cmxzLmgKQEAgLTIxLDIxICsyMSwxMSBAQAogICBzdGF0aWMgU2VydmljZVVybHMqIEdldEluc3RhbmNlKCk7CiAKICAgLy8gUmVtb3RpbmcgZGlyZWN0b3J5IFJFU1QgQVBJIFVSTHMuCi0gIGNvbnN0IHN0ZDo6c3RyaW5nJiBkaXJlY3RvcnlfYmFzZV91cmwoKSBjb25zdCB7IHJldHVybiBkaXJlY3RvcnlfYmFzZV91cmxfOyB9Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nJiBkaXJlY3RvcnlfaG9zdHNfdXJsKCkgY29uc3QgewotICAgIHJldHVybiBkaXJlY3RvcnlfaG9zdHNfdXJsXzsKLSAgfQogICBjb25zdCBzdGQ6OnN0cmluZyYgZ2NkX2Jhc2VfdXJsKCkgY29uc3QgeyByZXR1cm4gZ2NkX2Jhc2VfdXJsXzsgfQogCi0gIC8vIFJlbW90aW5nIGRpcmVjdG9yeSBib3QgSklEIChmb3IgcmVnaXN0ZXJpbmcgaG9zdHMsIGxvZ2dpbmcsIGhlYXJ0YmVhdHMpLgotICBjb25zdCBzdGQ6OnN0cmluZyYgZGlyZWN0b3J5X2JvdF9qaWQoKSBjb25zdCB7IHJldHVybiBkaXJlY3RvcnlfYm90X2ppZF87IH0KLQogICAvLyBKSUQgZm9yIGNvbW11bmljYXRpbmcgd2l0aCBHQ0QuCiAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnY2RfamlkKCkgY29uc3QgeyByZXR1cm4gZ2NkX2ppZF87IH0KIAotICAvLyBJQ0UgY29uZmlnIFVSTC4KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGljZV9jb25maWdfdXJsKCkgY29uc3QgeyByZXR1cm4gaWNlX2NvbmZpZ191cmxfOyB9Ci0KICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZ0bF9zZXJ2ZXJfZW5kcG9pbnQoKSBjb25zdCB7CiAgICAgcmV0dXJuIGZ0bF9zZXJ2ZXJfZW5kcG9pbnRfOwogICB9CkBAIC00NCwxMyArMzQsNiBAQAogICAgIHJldHVybiByZW1vdGluZ19zZXJ2ZXJfZW5kcG9pbnRfOwogICB9CiAKLSNpZiAhZGVmaW5lZChOREVCVUcpCi0gIC8vIE92ZXJyaWRlIHRoZSBkaXJlY3RvcnkgYm90IEpJRCBmb3IgdGVzdGluZy4KLSAgdm9pZCBzZXRfZGlyZWN0b3J5X2JvdF9qaWQoY29uc3Qgc3RkOjpzdHJpbmcmIGJvdF9qaWQpIHsKLSAgICBkaXJlY3RvcnlfYm90X2ppZF8gPSBib3RfamlkOwotICB9Ci0jZW5kaWYKLQogIHByaXZhdGU6CiAgIGZyaWVuZCBzdHJ1Y3QgYmFzZTo6RGVmYXVsdFNpbmdsZXRvblRyYWl0czxTZXJ2aWNlVXJscz47CiAKQEAgLTYwLDcgKzQzLDYgQEAKICAgc3RkOjpzdHJpbmcgZGlyZWN0b3J5X2Jhc2VfdXJsXzsKICAgc3RkOjpzdHJpbmcgZGlyZWN0b3J5X2hvc3RzX3VybF87CiAgIHN0ZDo6c3RyaW5nIGdjZF9iYXNlX3VybF87Ci0gIHN0ZDo6c3RyaW5nIGRpcmVjdG9yeV9ib3RfamlkXzsKICAgc3RkOjpzdHJpbmcgZ2NkX2ppZF87CiAgIHN0ZDo6c3RyaW5nIGljZV9jb25maWdfdXJsXzsKICAgc3RkOjpzdHJpbmcgZnRsX3NlcnZlcl9lbmRwb2ludF87CmRpZmYgLS1naXQgYS9yZW1vdGluZy9jbGllbnQvam5pL2puaV9ub3RpZmljYXRpb25fcHJlc2VudGVyLmNjIGIvcmVtb3RpbmcvY2xpZW50L2puaS9qbmlfbm90aWZpY2F0aW9uX3ByZXNlbnRlci5jYwppbmRleCA5MzM5YWY2Zi4uMDM3MDZiMCAxMDA2NDQKLS0tIGEvcmVtb3RpbmcvY2xpZW50L2puaS9qbmlfbm90aWZpY2F0aW9uX3ByZXNlbnRlci5jYworKysgYi9yZW1vdGluZy9jbGllbnQvam5pL2puaV9ub3RpZmljYXRpb25fcHJlc2VudGVyLmNjCkBAIC01NywxMiArNTcsMTUgQEAKICAgICBKYXZhX05vdGlmaWNhdGlvblByZXNlbnRlcl9vbk5vTm90aWZpY2F0aW9uKGVudiwgamF2YV9wcmVzZW50ZXIpOwogICAgIHJldHVybjsKICAgfQorICBhdXRvIGpfbWVzc2FnZV9pZCA9IENvbnZlcnRVVEY4VG9KYXZhU3RyaW5nKGVudiwgbm90aWZpY2F0aW9uLT5tZXNzYWdlX2lkKTsKICAgYXV0byBqX21lc3NhZ2VfdGV4dCA9CiAgICAgICBDb252ZXJ0VVRGOFRvSmF2YVN0cmluZyhlbnYsIG5vdGlmaWNhdGlvbi0+bWVzc2FnZV90ZXh0KTsKICAgYXV0byBqX2xpbmtfdGV4dCA9IENvbnZlcnRVVEY4VG9KYXZhU3RyaW5nKGVudiwgbm90aWZpY2F0aW9uLT5saW5rX3RleHQpOwogICBhdXRvIGpfbGlua191cmwgPSBDb252ZXJ0VVRGOFRvSmF2YVN0cmluZyhlbnYsIG5vdGlmaWNhdGlvbi0+bGlua191cmwpOworICBhdXRvIGpfYWxsb3dfc2lsZW5jZSA9IG5vdGlmaWNhdGlvbi0+YWxsb3dfc2lsZW5jZTsKICAgSmF2YV9Ob3RpZmljYXRpb25QcmVzZW50ZXJfb25Ob3RpZmljYXRpb25GZXRjaGVkKAotICAgICAgZW52LCBqYXZhX3ByZXNlbnRlciwgal9tZXNzYWdlX3RleHQsIGpfbGlua190ZXh0LCBqX2xpbmtfdXJsKTsKKyAgICAgIGVudiwgamF2YV9wcmVzZW50ZXIsIGpfbWVzc2FnZV9pZCwgal9tZXNzYWdlX3RleHQsIGpfbGlua190ZXh0LAorICAgICAgal9saW5rX3VybCwgal9hbGxvd19zaWxlbmNlKTsKIH0KIAogc3RhdGljIGpsb25nIEpOSV9Ob3RpZmljYXRpb25QcmVzZW50ZXJfSW5pdCgKZGlmZiAtLWdpdCBhL3JlbW90aW5nL2NsaWVudC9ub3RpZmljYXRpb24vbm90aWZpY2F0aW9uX2NsaWVudC5jYyBiL3JlbW90aW5nL2NsaWVudC9ub3RpZmljYXRpb24vbm90aWZpY2F0aW9uX2NsaWVudC5jYwppbmRleCAyMGJiMTVmLi42YzYxM2YyIDEwMDY0NAotLS0gYS9yZW1vdGluZy9jbGllbnQvbm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbl9jbGllbnQuY2MKKysrIGIvcmVtb3RpbmcvY2xpZW50L25vdGlmaWNhdGlvbi9ub3RpZmljYXRpb25fY2xpZW50LmNjCkBAIC0zMDQsOCArMzA0LDggQEAKICAgYXV0byBtZXNzYWdlID0gYmFzZTo6bWFrZV9vcHRpb25hbDxOb3RpZmljYXRpb25NZXNzYWdlPigpOwogICBtZXNzYWdlLT5tZXNzYWdlX2lkID0gbWVzc2FnZV9pZDsKICAgbWVzc2FnZS0+bGlua191cmwgPSBsaW5rX3VybDsKLSAgbWVzc2FnZS0+YWxsb3dfZG9udF9zaG93X2FnYWluID0gZmFsc2U7Ci0gIEZpbmRLZXlBbmRHZXQocnVsZSwgImFsbG93X2RvbnRfc2hvd19hZ2FpbiIsICZtZXNzYWdlLT5hbGxvd19kb250X3Nob3dfYWdhaW4pOworICBtZXNzYWdlLT5hbGxvd19zaWxlbmNlID0gZmFsc2U7CisgIEZpbmRLZXlBbmRHZXQocnVsZSwgImFsbG93X3NpbGVuY2UiLCAmbWVzc2FnZS0+YWxsb3dfc2lsZW5jZSk7CiAgICpvdXRfbWVzc2FnZV90ZXh0X2ZpbGVuYW1lID0gbWVzc2FnZV90ZXh0X2ZpbGVuYW1lOwogICAqb3V0X2xpbmtfdGV4dF9maWxlbmFtZSA9IGxpbmtfdGV4dF9maWxlbmFtZTsKICAgcmV0dXJuIG1lc3NhZ2U7CmRpZmYgLS1naXQgYS9yZW1vdGluZy9jbGllbnQvbm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbl9jbGllbnRfdW5pdHRlc3QuY2MgYi9yZW1vdGluZy9jbGllbnQvbm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbl9jbGllbnRfdW5pdHRlc3QuY2MKaW5kZXggMGJhZjQ3YS4uNzZiZmQ2ZjcgMTAwNjQ0Ci0tLSBhL3JlbW90aW5nL2NsaWVudC9ub3RpZmljYXRpb24vbm90aWZpY2F0aW9uX2NsaWVudF91bml0dGVzdC5jYworKysgYi9yZW1vdGluZy9jbGllbnQvbm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbl9jbGllbnRfdW5pdHRlc3QuY2MKQEAgLTY1LDcgKzY1LDcgQEAKICAgcnVsZS5TZXRTdHJpbmdLZXkoImxpbmtfdGV4dCIsICJsaW5rX3RleHQuanNvbiIpOwogICBydWxlLlNldFN0cmluZ0tleSgibGlua191cmwiLCAiaHR0cHM6Ly9leGFtcGxlLmNvbS9zb21lX2xpbmsiKTsKICAgcnVsZS5TZXRJbnRLZXkoInBlcmNlbnQiLCAxMDApOwotICBydWxlLlNldEJvb2xLZXkoImFsbG93X2RvbnRfc2hvd19hZ2FpbiIsIHRydWUpOworICBydWxlLlNldEJvb2xLZXkoImFsbG93X3NpbGVuY2UiLCB0cnVlKTsKICAgcmV0dXJuIHJ1bGU7CiB9CiAKQEAgLTgyLDcgKzgyLDcgQEAKICAgbWVzc2FnZS5tZXNzYWdlX3RleHQgPSAiemgtQ046bWVzc2FnZSI7CiAgIG1lc3NhZ2UubGlua190ZXh0ID0gInpoLUNOOmxpbmsiOwogICBtZXNzYWdlLmxpbmtfdXJsID0gImh0dHBzOi8vZXhhbXBsZS5jb20vc29tZV9saW5rIjsKLSAgbWVzc2FnZS5hbGxvd19kb250X3Nob3dfYWdhaW4gPSB0cnVlOworICBtZXNzYWdlLmFsbG93X3NpbGVuY2UgPSB0cnVlOwogICByZXR1cm4gbWVzc2FnZTsKIH0KIApAQCAtMzExLDEwICszMTEsMTAgQEAKICAgY2xpZW50Xy0+R2V0Tm90aWZpY2F0aW9uKGtUZXN0RW1haWwsIGNhbGxiYWNrLkdldCgpKTsKIH0KIAotVEVTVF9GKE5vdGlmaWNhdGlvbkNsaWVudFRlc3QsIEFsbG93RG9udFNob3dBZ2Fpbk5vdFNldF9EZWZhdWx0VG9GYWxzZSkgeworVEVTVF9GKE5vdGlmaWNhdGlvbkNsaWVudFRlc3QsIEFsbG93U2lsZW5jZU5vdFNldF9EZWZhdWx0VG9GYWxzZSkgewogICBiYXNlOjpWYWx1ZSBydWxlcyhiYXNlOjpWYWx1ZTo6VHlwZTo6TElTVCk7CiAgIGJhc2U6OlZhbHVlIHJ1bGUgPSBDcmVhdGVEZWZhdWx0UnVsZSgpOwotICBydWxlLlJlbW92ZUtleSgiYWxsb3dfZG9udF9zaG93X2FnYWluIik7CisgIHJ1bGUuUmVtb3ZlS2V5KCJhbGxvd19zaWxlbmNlIik7CiAgIHJ1bGVzLkFwcGVuZChzdGQ6Om1vdmUocnVsZSkpOwogICBFWFBFQ1RfQ0FMTCgqZmV0Y2hlcl8sIEZldGNoSnNvbkZpbGUoIm5vdGlmaWNhdGlvbi9ydWxlcy5qc29uIikpCiAgICAgICAuV2lsbE9uY2UoUmV0dXJuQnlNb3ZlKHN0ZDo6bW92ZShydWxlcykpKTsKQEAgLTMyNCw3ICszMjQsNyBAQAogICAgICAgLldpbGxPbmNlKFJldHVybkJ5TW92ZShDcmVhdGVEZWZhdWx0VHJhbnNsYXRpb25zKCJsaW5rIikpKTsKIAogICBOb3RpZmljYXRpb25NZXNzYWdlIG5vdGlmaWNhdGlvbiA9IENyZWF0ZURlZmF1bHROb3RpZmljYXRpb24oKTsKLSAgbm90aWZpY2F0aW9uLmFsbG93X2RvbnRfc2hvd19hZ2FpbiA9IGZhbHNlOworICBub3RpZmljYXRpb24uYWxsb3dfc2lsZW5jZSA9IGZhbHNlOwogICBiYXNlOjpNb2NrQ2FsbGJhY2s8Tm90aWZpY2F0aW9uQ2xpZW50OjpOb3RpZmljYXRpb25DYWxsYmFjaz4gY2FsbGJhY2s7CiAgIEVYUEVDVF9DQUxMKGNhbGxiYWNrLCBSdW4oTWVzc2FnZU1hdGNoZXMobm90aWZpY2F0aW9uKSkpOwogICBjbGllbnRfLT5HZXROb3RpZmljYXRpb24oa1Rlc3RFbWFpbCwgY2FsbGJhY2suR2V0KCkpOwpkaWZmIC0tZ2l0IGEvcmVtb3RpbmcvY2xpZW50L25vdGlmaWNhdGlvbi9ub3RpZmljYXRpb25fbWVzc2FnZS5oIGIvcmVtb3RpbmcvY2xpZW50L25vdGlmaWNhdGlvbi9ub3RpZmljYXRpb25fbWVzc2FnZS5oCmluZGV4IGIxNDg2ZDBhLi4yYTU5MTY5IDEwMDY0NAotLS0gYS9yZW1vdGluZy9jbGllbnQvbm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbl9tZXNzYWdlLmgKKysrIGIvcmVtb3RpbmcvY2xpZW50L25vdGlmaWNhdGlvbi9ub3RpZmljYXRpb25fbWVzc2FnZS5oCkBAIC0yMiw3ICsyMiw3IEBACiAgIHN0ZDo6c3RyaW5nIG1lc3NhZ2VfdGV4dDsKICAgc3RkOjpzdHJpbmcgbGlua190ZXh0OwogICBzdGQ6OnN0cmluZyBsaW5rX3VybDsKLSAgYm9vbCBhbGxvd19kb250X3Nob3dfYWdhaW47CisgIGJvb2wgYWxsb3dfc2lsZW5jZTsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSByZW1vdGluZwpkaWZmIC0tZ2l0IGEvcmVtb3RpbmcvY2xpZW50L3BsdWdpbi9jaHJvbW90aW5nX2luc3RhbmNlLmNjIGIvcmVtb3RpbmcvY2xpZW50L3BsdWdpbi9jaHJvbW90aW5nX2luc3RhbmNlLmNjCmluZGV4IGRiNDMyYWUuLmQwZmQ5ZmQgMTAwNjQ0Ci0tLSBhL3JlbW90aW5nL2NsaWVudC9wbHVnaW4vY2hyb21vdGluZ19pbnN0YW5jZS5jYworKysgYi9yZW1vdGluZy9jbGllbnQvcGx1Z2luL2Nocm9tb3RpbmdfaW5zdGFuY2UuY2MKQEAgLTU3Myw3ICs1NzMsNiBAQAogICBzdGQ6OnN0cmluZyBsb2NhbF9qaWQ7CiAgIHN0ZDo6c3RyaW5nIGhvc3RfamlkOwogICBzdGQ6OnN0cmluZyBob3N0X3B1YmxpY19rZXk7Ci0gIHN0ZDo6c3RyaW5nIGRpcmVjdG9yeV9ib3RfamlkOwogICBpZiAoIWRhdGEuR2V0U3RyaW5nKCJob3N0SmlkIiwgJmhvc3RfamlkKSB8fAogICAgICAgIWRhdGEuR2V0U3RyaW5nKCJob3N0UHVibGljS2V5IiwgJmhvc3RfcHVibGljX2tleSkgfHwKICAgICAgICFkYXRhLkdldFN0cmluZygibG9jYWxKaWQiLCAmbG9jYWxfamlkKSB8fApAQCAtNTg1LDEyICs1ODQsNiBAQAogICBkYXRhLkdldFN0cmluZygiY2xpZW50UGFpcmluZ0lkIiwgJmNsaWVudF9hdXRoX2NvbmZpZy5wYWlyaW5nX2NsaWVudF9pZCk7CiAgIGRhdGEuR2V0U3RyaW5nKCJjbGllbnRQYWlyZWRTZWNyZXQiLCAmY2xpZW50X2F1dGhfY29uZmlnLnBhaXJpbmdfc2VjcmV0KTsKIAotI2lmICFkZWZpbmVkKE5ERUJVRykKLSAgaWYgKGRhdGEuR2V0U3RyaW5nKCJkaXJlY3RvcnlCb3RKaWQiLCAmZGlyZWN0b3J5X2JvdF9qaWQpKSB7Ci0gICAgU2VydmljZVVybHM6OkdldEluc3RhbmNlKCktPnNldF9kaXJlY3RvcnlfYm90X2ppZChkaXJlY3RvcnlfYm90X2ppZCk7Ci0gIH0KLSNlbmRpZgotCiAgIGlmICh1c2VfYXN5bmNfcGluX2RpYWxvZ18pIHsKICAgICBjbGllbnRfYXV0aF9jb25maWcuZmV0Y2hfc2VjcmV0X2NhbGxiYWNrID0gYmFzZTo6QmluZCgKICAgICAgICAgJkNocm9tb3RpbmdJbnN0YW5jZTo6RmV0Y2hTZWNyZXRGcm9tRGlhbG9nLCB3ZWFrX2ZhY3RvcnlfLkdldFdlYWtQdHIoKSk7CmRpZmYgLS1naXQgYS9yZW1vdGluZy9ob3N0L2l0Mm1lL2l0Mm1lX2hvc3QuY2MgYi9yZW1vdGluZy9ob3N0L2l0Mm1lL2l0Mm1lX2hvc3QuY2MKaW5kZXggNzM1N2NjMS4uYjcyMTM4MCAxMDA2NDQKLS0tIGEvcmVtb3RpbmcvaG9zdC9pdDJtZS9pdDJtZV9ob3N0LmNjCisrKyBiL3JlbW90aW5nL2hvc3QvaXQybWUvaXQybWVfaG9zdC5jYwpAQCAtOTEsNyArOTEsNiBAQAogICAgIGJhc2U6OldlYWtQdHI8SXQyTWVIb3N0OjpPYnNlcnZlcj4gb2JzZXJ2ZXIsCiAgICAgc3RkOjp1bmlxdWVfcHRyPFNpZ25hbFN0cmF0ZWd5PiBzaWduYWxfc3RyYXRlZ3ksCiAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHVzZXJuYW1lLAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkaXJlY3RvcnlfYm90X2ppZCwKICAgICBjb25zdCBwcm90b2NvbDo6SWNlQ29uZmlnJiBpY2VfY29uZmlnKSB7CiAgIERDSEVDSyhob3N0X2NvbnRleHQtPnVpX3Rhc2tfcnVubmVyKCktPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CiAKQEAgLTExMCw5ICsxMDksOSBAQAogCiAgIC8vIFN3aXRjaCB0byB0aGUgbmV0d29yayB0aHJlYWQgdG8gc3RhcnQgdGhlIGFjdHVhbCBjb25uZWN0aW9uLgogICBob3N0X2NvbnRleHRfLT5uZXR3b3JrX3Rhc2tfcnVubmVyKCktPlBvc3RUYXNrKAotICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZSgmSXQyTWVIb3N0OjpDb25uZWN0T25OZXR3b3JrVGhyZWFkLCB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZSwgZGlyZWN0b3J5X2JvdF9qaWQsIGljZV9jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShyZWdpc3Rlcl9yZXF1ZXN0KSkpOworICAgICAgRlJPTV9IRVJFLAorICAgICAgYmFzZTo6QmluZE9uY2UoJkl0Mk1lSG9zdDo6Q29ubmVjdE9uTmV0d29ya1RocmVhZCwgdGhpcywgdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICBpY2VfY29uZmlnLCBzdGQ6Om1vdmUocmVnaXN0ZXJfcmVxdWVzdCkpKTsKIH0KIAogdm9pZCBJdDJNZUhvc3Q6OkRpc2Nvbm5lY3QoKSB7CkBAIC0xMjMsNyArMTIyLDYgQEAKIAogdm9pZCBJdDJNZUhvc3Q6OkNvbm5lY3RPbk5ldHdvcmtUaHJlYWQoCiAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHVzZXJuYW1lLAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkaXJlY3RvcnlfYm90X2ppZCwKICAgICBjb25zdCBwcm90b2NvbDo6SWNlQ29uZmlnJiBpY2VfY29uZmlnLAogICAgIHN0ZDo6dW5pcXVlX3B0cjxSZWdpc3RlclN1cHBvcnRIb3N0UmVxdWVzdD4gcmVnaXN0ZXJfcmVxdWVzdCkgewogICBEQ0hFQ0soaG9zdF9jb250ZXh0Xy0+bmV0d29ya190YXNrX3J1bm5lcigpLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwpkaWZmIC0tZ2l0IGEvcmVtb3RpbmcvaG9zdC9pdDJtZS9pdDJtZV9ob3N0LmggYi9yZW1vdGluZy9ob3N0L2l0Mm1lL2l0Mm1lX2hvc3QuaAppbmRleCA3MTNlNzA1Li43ZjdiODAwIDEwMDY0NAotLS0gYS9yZW1vdGluZy9ob3N0L2l0Mm1lL2l0Mm1lX2hvc3QuaAorKysgYi9yZW1vdGluZy9ob3N0L2l0Mm1lL2l0Mm1lX2hvc3QuaApAQCAtOTQsNyArOTQsNiBAQAogICAgICAgYmFzZTo6V2Vha1B0cjxJdDJNZUhvc3Q6Ok9ic2VydmVyPiBvYnNlcnZlciwKICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxTaWduYWxTdHJhdGVneT4gc2lnbmFsX3N0cmF0ZWd5LAogICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHVzZXJuYW1lLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRpcmVjdG9yeV9ib3RfamlkLAogICAgICAgY29uc3QgcHJvdG9jb2w6OkljZUNvbmZpZyYgaWNlX2NvbmZpZyk7CiAKICAgLy8gRGlzY29ubmVjdHMgYW5kIHNodXRzIGRvd24gdGhlIGhvc3QuCkBAIC0xNDQsNyArMTQzLDYgQEAKICAgLy8gVGFzayBwb3N0ZWQgdG8gdGhlIG5ldHdvcmsgdGhyZWFkIGZyb20gQ29ubmVjdCgpLgogICB2b2lkIENvbm5lY3RPbk5ldHdvcmtUaHJlYWQoCiAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdXNlcm5hbWUsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGlyZWN0b3J5X2JvdF9qaWQsCiAgICAgICBjb25zdCBwcm90b2NvbDo6SWNlQ29uZmlnJiBpY2VfY29uZmlnLAogICAgICAgc3RkOjp1bmlxdWVfcHRyPFJlZ2lzdGVyU3VwcG9ydEhvc3RSZXF1ZXN0PiByZWdpc3Rlcl9yZXF1ZXN0KTsKIApkaWZmIC0tZ2l0IGEvcmVtb3RpbmcvaG9zdC9pdDJtZS9pdDJtZV9ob3N0X3VuaXR0ZXN0LmNjIGIvcmVtb3RpbmcvaG9zdC9pdDJtZS9pdDJtZV9ob3N0X3VuaXR0ZXN0LmNjCmluZGV4IDg0NjU2NDUuLjdlZDNmYTYxIDEwMDY0NAotLS0gYS9yZW1vdGluZy9ob3N0L2l0Mm1lL2l0Mm1lX2hvc3RfdW5pdHRlc3QuY2MKKysrIGIvcmVtb3RpbmcvaG9zdC9pdDJtZS9pdDJtZV9ob3N0X3VuaXR0ZXN0LmNjCkBAIC0yOTgsMTIgKzI5OCwxMSBAQAogICBhdXRvIGxvZ190b19zZXJ2ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPFhtcHBMb2dUb1NlcnZlcj4oCiAgICAgICBTZXJ2ZXJMb2dFbnRyeTo6SVQyTUUsIGZha2Vfc2lnbmFsX3N0cmF0ZWd5LmdldCgpLCAiZmFrZV9ib3RfamlkIiwKICAgICAgIGhvc3RfY29udGV4dF8tPm5ldHdvcmtfdGFza19ydW5uZXIoKSk7Ci0gIGl0Mm1lX2hvc3RfLT5Db25uZWN0KGhvc3RfY29udGV4dF8tPkNvcHkoKSwgcG9saWNpZXNfLT5DcmVhdGVEZWVwQ29weSgpLAotICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoZGlhbG9nX2ZhY3RvcnkpLAotICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocmVnaXN0ZXJfaG9zdF9yZXF1ZXN0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGxvZ190b19zZXJ2ZXIpLCB3ZWFrX2ZhY3RvcnlfLkdldFdlYWtQdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGZha2Vfc2lnbmFsX3N0cmF0ZWd5KSwga1Rlc3RVc2VyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgImZha2VfYm90X2ppZCIsIGljZV9jb25maWcpOworICBpdDJtZV9ob3N0Xy0+Q29ubmVjdCgKKyAgICAgIGhvc3RfY29udGV4dF8tPkNvcHkoKSwgcG9saWNpZXNfLT5DcmVhdGVEZWVwQ29weSgpLAorICAgICAgc3RkOjptb3ZlKGRpYWxvZ19mYWN0b3J5KSwgc3RkOjptb3ZlKHJlZ2lzdGVyX2hvc3RfcmVxdWVzdCksCisgICAgICBzdGQ6Om1vdmUobG9nX3RvX3NlcnZlciksIHdlYWtfZmFjdG9yeV8uR2V0V2Vha1B0cigpLAorICAgICAgc3RkOjptb3ZlKGZha2Vfc2lnbmFsX3N0cmF0ZWd5KSwga1Rlc3RVc2VyTmFtZSwgaWNlX2NvbmZpZyk7CiAKICAgYmFzZTo6UnVuTG9vcCBydW5fbG9vcDsKICAgc3RhdGVfY2hhbmdlX2NhbGxiYWNrXyA9CmRpZmYgLS1naXQgYS9yZW1vdGluZy9ob3N0L2l0Mm1lL2l0Mm1lX25hdGl2ZV9tZXNzYWdpbmdfaG9zdC5jYyBiL3JlbW90aW5nL2hvc3QvaXQybWUvaXQybWVfbmF0aXZlX21lc3NhZ2luZ19ob3N0LmNjCmluZGV4IGE2YjJlODEuLmYxNmU4MWUgMTAwNjQ0Ci0tLSBhL3JlbW90aW5nL2hvc3QvaXQybWUvaXQybWVfbmF0aXZlX21lc3NhZ2luZ19ob3N0LmNjCisrKyBiL3JlbW90aW5nL2hvc3QvaXQybWUvaXQybWVfbmF0aXZlX21lc3NhZ2luZ19ob3N0LmNjCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSAicmVtb3RpbmcvYmFzZS9hdXRvX3RocmVhZF90YXNrX3J1bm5lci5oIgogI2luY2x1ZGUgInJlbW90aW5nL2Jhc2UvbmFtZV92YWx1ZV9tYXAuaCIKICNpbmNsdWRlICJyZW1vdGluZy9iYXNlL3Bhc3N0aHJvdWdoX29hdXRoX3Rva2VuX2dldHRlci5oIgotI2luY2x1ZGUgInJlbW90aW5nL2Jhc2Uvc2VydmljZV91cmxzLmgiCiAjaW5jbHVkZSAicmVtb3RpbmcvaG9zdC9jaHJvbW90aW5nX2hvc3RfY29udGV4dC5oIgogI2luY2x1ZGUgInJlbW90aW5nL2hvc3QvaG9zdF9leGl0X2NvZGVzLmgiCiAjaW5jbHVkZSAicmVtb3RpbmcvaG9zdC9pdDJtZS9pdDJtZV9jb25maXJtYXRpb25fZGlhbG9nLmgiCkBAIC03NCw2ICs3Myw3IEBACiAjZW5kaWYgIC8vIGRlZmluZWQoT1NfV0lOKQogCiBjb25zdGV4cHIgY2hhciBrQW5vbnltb3VzVXNlck5hbWVbXSA9ICJhbm9ueW1vdXNfdXNlciI7Citjb25zdCBjaGFyIGtSZW1vdGluZ0JvdEppZFtdID0gInJlbW90aW5nQGJvdC50YWxrLmdvb2dsZS5jb20iOwogCiAvLyBIZWxwZXIgZnVuY3Rpb25zIHRvIHJ1biB8Y2FsbGJhY2t8IGFzeW5jaHJvbm91c2x5IG9uIHRoZSBjb3JyZWN0IHRocmVhZAogLy8gdXNpbmcgfHRhc2tfcnVubmVyfC4KQEAgLTI0OCw5ICsyNDgsNiBAQAogICBib29sIHRlcm1pbmF0ZV91cG9uX2lucHV0ID0gZmFsc2U7CiAgIG1lc3NhZ2UtPkdldEJvb2xlYW4oInRlcm1pbmF0ZVVwb25JbnB1dCIsICZ0ZXJtaW5hdGVfdXBvbl9pbnB1dCk7CiAKLSAgc3RkOjpzdHJpbmcgZGlyZWN0b3J5X2JvdF9qaWQgPQotICAgICAgU2VydmljZVVybHM6OkdldEluc3RhbmNlKCktPmRpcmVjdG9yeV9ib3RfamlkKCk7Ci0KICAgc3RkOjp1bmlxdWVfcHRyPFNpZ25hbFN0cmF0ZWd5PiBzaWduYWxfc3RyYXRlZ3k7CiAgIHN0ZDo6dW5pcXVlX3B0cjxSZWdpc3RlclN1cHBvcnRIb3N0UmVxdWVzdD4gcmVnaXN0ZXJfaG9zdF9yZXF1ZXN0OwogICBzdGQ6OnVuaXF1ZV9wdHI8TG9nVG9TZXJ2ZXI+IGxvZ190b19zZXJ2ZXI7CkBAIC0yNjEsOSArMjU4LDkgQEAKICAgICB9CiAgICAgc2lnbmFsX3N0cmF0ZWd5ID0gQ3JlYXRlRGVsZWdhdGVkU2lnbmFsU3RyYXRlZ3kobWVzc2FnZS5nZXQoKSk7CiAgICAgcmVnaXN0ZXJfaG9zdF9yZXF1ZXN0ID0KLSAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxYbXBwUmVnaXN0ZXJTdXBwb3J0SG9zdFJlcXVlc3Q+KGRpcmVjdG9yeV9ib3RfamlkKTsKKyAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxYbXBwUmVnaXN0ZXJTdXBwb3J0SG9zdFJlcXVlc3Q+KGtSZW1vdGluZ0JvdEppZCk7CiAgICAgbG9nX3RvX3NlcnZlciA9IHN0ZDo6bWFrZV91bmlxdWU8WG1wcExvZ1RvU2VydmVyPigKLSAgICAgICAgU2VydmVyTG9nRW50cnk6OklUMk1FLCBzaWduYWxfc3RyYXRlZ3kuZ2V0KCksIGRpcmVjdG9yeV9ib3RfamlkLAorICAgICAgICBTZXJ2ZXJMb2dFbnRyeTo6SVQyTUUsIHNpZ25hbF9zdHJhdGVneS5nZXQoKSwga1JlbW90aW5nQm90SmlkLAogICAgICAgICBob3N0X2NvbnRleHRfLT5uZXR3b3JrX3Rhc2tfcnVubmVyKCkpOwogICB9IGVsc2UgewogICAgIHN0ZDo6c3RyaW5nIGFjY2Vzc190b2tlbiA9IEV4dHJhY3RBY2Nlc3NUb2tlbihtZXNzYWdlLmdldCgpKTsKQEAgLTI4MSwxNCArMjc4LDYgQEAKICAgICByZXR1cm47CiAgIH0KIAotI2lmICFkZWZpbmVkKE5ERUJVRykKLSAgaWYgKCFtZXNzYWdlLT5HZXRTdHJpbmcoImRpcmVjdG9yeUJvdEppZCIsICZkaXJlY3RvcnlfYm90X2ppZCkpIHsKLSAgICBMT0coRVJST1IpIDw8ICInZGlyZWN0b3J5Qm90SmlkJyBub3QgZm91bmQgaW4gcmVxdWVzdC4iOwotICAgIFNlbmRFcnJvckFuZEV4aXQoc3RkOjptb3ZlKHJlc3BvbnNlKSwgRXJyb3JDb2RlOjpJTkNPTVBBVElCTEVfUFJPVE9DT0wpOwotICAgIHJldHVybjsKLSAgfQotI2VuZGlmICAvLyAhZGVmaW5lZChOREVCVUcpCi0KICAgYmFzZTo6RGljdGlvbmFyeVZhbHVlKiBpY2VfY29uZmlnX2RpY3Q7CiAgIHByb3RvY29sOjpJY2VDb25maWcgaWNlX2NvbmZpZzsKICAgaWYgKG1lc3NhZ2UtPkdldERpY3Rpb25hcnkoImljZUNvbmZpZyIsICZpY2VfY29uZmlnX2RpY3QpKSB7CkBAIC0zMTMsMTEgKzMwMiwxMSBAQAogICBpdDJtZV9ob3N0Xy0+c2V0X2VuYWJsZV9kaWFsb2dzKCFub19kaWFsb2dzKTsKICAgaXQybWVfaG9zdF8tPnNldF90ZXJtaW5hdGVfdXBvbl9pbnB1dCh0ZXJtaW5hdGVfdXBvbl9pbnB1dCk7CiAjZW5kaWYKLSAgaXQybWVfaG9zdF8tPkNvbm5lY3QoCi0gICAgICBob3N0X2NvbnRleHRfLT5Db3B5KCksIHN0ZDo6bW92ZShwb2xpY2llcyksCi0gICAgICBzdGQ6Om1ha2VfdW5pcXVlPEl0Mk1lQ29uZmlybWF0aW9uRGlhbG9nRmFjdG9yeT4oKSwKLSAgICAgIHN0ZDo6bW92ZShyZWdpc3Rlcl9ob3N0X3JlcXVlc3QpLCBzdGQ6Om1vdmUobG9nX3RvX3NlcnZlciksIHdlYWtfcHRyXywKLSAgICAgIHN0ZDo6bW92ZShzaWduYWxfc3RyYXRlZ3kpLCB1c2VybmFtZSwgZGlyZWN0b3J5X2JvdF9qaWQsIGljZV9jb25maWcpOworICBpdDJtZV9ob3N0Xy0+Q29ubmVjdChob3N0X2NvbnRleHRfLT5Db3B5KCksIHN0ZDo6bW92ZShwb2xpY2llcyksCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8SXQyTWVDb25maXJtYXRpb25EaWFsb2dGYWN0b3J5PigpLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocmVnaXN0ZXJfaG9zdF9yZXF1ZXN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGxvZ190b19zZXJ2ZXIpLCB3ZWFrX3B0cl8sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShzaWduYWxfc3RyYXRlZ3kpLCB1c2VybmFtZSwgaWNlX2NvbmZpZyk7CiAKICAgU2VuZE1lc3NhZ2VUb0NsaWVudChzdGQ6Om1vdmUocmVzcG9uc2UpKTsKIH0KZGlmZiAtLWdpdCBhL3JlbW90aW5nL2hvc3QvaXQybWUvaXQybWVfbmF0aXZlX21lc3NhZ2luZ19ob3N0X3VuaXR0ZXN0LmNjIGIvcmVtb3RpbmcvaG9zdC9pdDJtZS9pdDJtZV9uYXRpdmVfbWVzc2FnaW5nX2hvc3RfdW5pdHRlc3QuY2MKaW5kZXggMjgzY2JjOTcuLjY5ODViYWQgMTAwNjQ0Ci0tLSBhL3JlbW90aW5nL2hvc3QvaXQybWUvaXQybWVfbmF0aXZlX21lc3NhZ2luZ19ob3N0X3VuaXR0ZXN0LmNjCisrKyBiL3JlbW90aW5nL2hvc3QvaXQybWUvaXQybWVfbmF0aXZlX21lc3NhZ2luZ19ob3N0X3VuaXR0ZXN0LmNjCkBAIC00OCw3ICs0OCw2IEBACiBjb25zdGV4cHIgYmFzZTo6VGltZURlbHRhIGtUZXN0QWNjZXNzQ29kZUxpZmV0aW1lID0KICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21TZWNvbmRzKDY2Nik7CiBjb25zdCBjaGFyIGtUZXN0Q2xpZW50VXNlcm5hbWVbXSA9ICJzb21lX3VzZXJAZ21haWwuY29tIjsKLWNvbnN0IGNoYXIga1Rlc3RCb3RKaWRbXSA9ICJyZW1vdGluZ0Bib3QudGFsay5nb29nbGUuY29tIjsKIGNvbnN0IGNoYXIga1Rlc3RTdHVuU2VydmVyW10gPSAidGVzdF9yZWxheV9zZXJ2ZXIuY29tIjsKIAogdm9pZCBWZXJpZnlJZChzdGQ6OnVuaXF1ZV9wdHI8YmFzZTo6RGljdGlvbmFyeVZhbHVlPiByZXNwb25zZSwKQEAgLTkxLDcgKzkwLDYgQEAKICAgY29ubmVjdF9tZXNzYWdlLlNldFN0cmluZygidHlwZSIsICJjb25uZWN0Iik7CiAgIGNvbm5lY3RfbWVzc2FnZS5TZXRTdHJpbmcoInhtcHBTZXJ2ZXJBZGRyZXNzIiwgInRhbGsuZ29vZ2xlLmNvbTo1MjIyIik7CiAgIGNvbm5lY3RfbWVzc2FnZS5TZXRCb29sZWFuKCJ4bXBwU2VydmVyVXNlVGxzIiwgdHJ1ZSk7Ci0gIGNvbm5lY3RfbWVzc2FnZS5TZXRTdHJpbmcoImRpcmVjdG9yeUJvdEppZCIsIGtUZXN0Qm90SmlkKTsKICAgY29ubmVjdF9tZXNzYWdlLlNldFN0cmluZygidXNlck5hbWUiLCBrVGVzdENsaWVudFVzZXJuYW1lKTsKICAgY29ubmVjdF9tZXNzYWdlLlNldFN0cmluZygiYXV0aFNlcnZpY2VXaXRoVG9rZW4iLCAib2F1dGgyOnNvbWV0b2tlbiIpOwogICBjb25uZWN0X21lc3NhZ2UuU2V0KCJpY2VDb25maWciLApAQCAtMTI0LDcgKzEyMiw2IEBACiAgICAgICAgICAgICAgICBiYXNlOjpXZWFrUHRyPEl0Mk1lSG9zdDo6T2JzZXJ2ZXI+IG9ic2VydmVyLAogICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFNpZ25hbFN0cmF0ZWd5PiBzaWduYWxfc3RyYXRlZ3ksCiAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdXNlcm5hbWUsCi0gICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGlyZWN0b3J5X2JvdF9qaWQsCiAgICAgICAgICAgICAgICBjb25zdCBwcm90b2NvbDo6SWNlQ29uZmlnJiBpY2VfY29uZmlnKSBvdmVycmlkZTsKICAgdm9pZCBEaXNjb25uZWN0KCkgb3ZlcnJpZGU7CiAKQEAgLTE0NSwxMyArMTQyLDExIEBACiAgICAgYmFzZTo6V2Vha1B0cjxJdDJNZUhvc3Q6Ok9ic2VydmVyPiBvYnNlcnZlciwKICAgICBzdGQ6OnVuaXF1ZV9wdHI8U2lnbmFsU3RyYXRlZ3k+IHNpZ25hbF9zdHJhdGVneSwKICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdXNlcm5hbWUsCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRpcmVjdG9yeV9ib3RfamlkLAogICAgIGNvbnN0IHByb3RvY29sOjpJY2VDb25maWcmIGljZV9jb25maWcpIHsKICAgRENIRUNLKGNvbnRleHQtPnVpX3Rhc2tfcnVubmVyKCktPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CiAKICAgLy8gVmVyaWZ5IHRoYXQgcGFyYW1ldGVycyBhcmUgcGFzc2VkIGNvcnJlY3RseS4KICAgRVhQRUNUX0VRKHVzZXJuYW1lLCBrVGVzdENsaWVudFVzZXJuYW1lKTsKLSAgRVhQRUNUX0VRKGRpcmVjdG9yeV9ib3RfamlkLCBrVGVzdEJvdEppZCk7CiAgIEVYUEVDVF9FUShpY2VfY29uZmlnLnN0dW5fc2VydmVyc1swXS5ob3N0bmFtZSgpLCBrVGVzdFN0dW5TZXJ2ZXIpOwogCiAgIGhvc3RfY29udGV4dF8gPSBzdGQ6Om1vdmUoY29udGV4dCk7CmRpZmYgLS1naXQgYS9yZW1vdGluZy9pb3MvYXBwL25vdGlmaWNhdGlvbl9kaWFsb2dfdmlld19jb250cm9sbGVyLmggYi9yZW1vdGluZy9pb3MvYXBwL25vdGlmaWNhdGlvbl9kaWFsb2dfdmlld19jb250cm9sbGVyLmgKaW5kZXggMjAwYWJlMC4uMTBjZjFlZSAxMDA2NDQKLS0tIGEvcmVtb3RpbmcvaW9zL2FwcC9ub3RpZmljYXRpb25fZGlhbG9nX3ZpZXdfY29udHJvbGxlci5oCisrKyBiL3JlbW90aW5nL2lvcy9hcHAvbm90aWZpY2F0aW9uX2RpYWxvZ192aWV3X2NvbnRyb2xsZXIuaApAQCAtMTEsMTQgKzExLDE0IEBACiBzdHJ1Y3QgTm90aWZpY2F0aW9uTWVzc2FnZTsKIH0gIC8vIG5hbWVzcGFjZSByZW1vdGluZwogCi11c2luZyBOb3RpZmljYXRpb25EaWFsb2dDb21wbGV0aW9uQmxvY2sgPSB2b2lkICheKShCT09MIGlzRG9udFNob3dBZ2Fpbk9uKTsKK3VzaW5nIE5vdGlmaWNhdGlvbkRpYWxvZ0NvbXBsZXRpb25CbG9jayA9IHZvaWQgKF4pKEJPT0wgc2lsZW5jZWQpOwogCiAvLyBUaGlzIGlzIHRoZSB2aWV3IGNvbnRyb2xsZXIgZm9yIHNob3dpbmcgdGhlIG5vdGlmaWNhdGlvbiBkaWFsb2cuCiBAaW50ZXJmYWNlIE5vdGlmaWNhdGlvbkRpYWxvZ1ZpZXdDb250cm9sbGVyIDogVUlWaWV3Q29udHJvbGxlcgogCiAtIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhOb3RpZmljYXRpb25NZXNzYWdlOgogICAgICAgICAgICAgICAgICAgICAoY29uc3QgcmVtb3Rpbmc6Ok5vdGlmaWNhdGlvbk1lc3NhZ2UmKW1lc3NhZ2UKLSAgICAgICAgICAgICAgc2hvdWxkU2hvd0RvbnRTaG93QWdhaW5Ub2dnbGU6KEJPT0wpc2hvdWxkU2hvd0RvbnRTaG93QWdhaW5Ub2dnbGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dTaWxlbmNlOihCT09MKWFsbG93U2lsZW5jZTsKIAogLSAodm9pZClwcmVzZW50T25Ub3BWQ1dpdGhDb21wbGV0aW9uOgogICAgIChOb3RpZmljYXRpb25EaWFsb2dDb21wbGV0aW9uQmxvY2spY29tcGxldGlvbjsKZGlmZiAtLWdpdCBhL3JlbW90aW5nL2lvcy9hcHAvbm90aWZpY2F0aW9uX2RpYWxvZ192aWV3X2NvbnRyb2xsZXIubW0gYi9yZW1vdGluZy9pb3MvYXBwL25vdGlmaWNhdGlvbl9kaWFsb2dfdmlld19jb250cm9sbGVyLm1tCmluZGV4IDFhOGE4OTQuLmM3NmE1MDQgMTAwNjQ0Ci0tLSBhL3JlbW90aW5nL2lvcy9hcHAvbm90aWZpY2F0aW9uX2RpYWxvZ192aWV3X2NvbnRyb2xsZXIubW0KKysrIGIvcmVtb3RpbmcvaW9zL2FwcC9ub3RpZmljYXRpb25fZGlhbG9nX3ZpZXdfY29udHJvbGxlci5tbQpAQCAtMzIsMjkgKzMyLDI5IEBACiAgIE5TU3RyaW5nKiBfbWVzc2FnZVRleHQ7CiAgIE5TU3RyaW5nKiBfbGlua1RleHQ7CiAgIE5TVVJMKiBfbGlua1VybDsKLSAgQk9PTCBfc2hvdWxkU2hvd0RvbnRTaG93QWdhaW5Ub2dnbGU7CisgIEJPT0wgX2FsbG93U2lsZW5jZTsKICAgTm90aWZpY2F0aW9uRGlhbG9nQ29tcGxldGlvbkJsb2NrIF9jb21wbGV0aW9uOwogICBNRENEaWFsb2dUcmFuc2l0aW9uQ29udHJvbGxlciogX3RyYW5zaXRpb25Db250cm9sbGVyOwogICBVSUxhYmVsKiBfbWVzc2FnZUxhYmVsOwogICBNRENCdXR0b24qIF9saW5rQnV0dG9uOwogICBNRENCdXR0b24qIF9kaXNtaXNzQnV0dG9uOwogCi0gIC8vIFRoZXNlIHdpbGwgYmUgbmlsIGlmIHxfc2hvdWxkU2hvd0RvbnRTaG93QWdhaW5Ub2dnbGV8IGlzIE5PLgorICAvLyBUaGVzZSB3aWxsIGJlIG5pbCBpZiB8X2FsbG93U2lsZW5jZXwgaXMgTk8uCiAgIFVJU3dpdGNoKiBfZG9udFNob3dBZ2FpblN3aXRjaDsKICAgVUlMYWJlbCogX2RvbnRTaG93QWdhaW5MYWJlbDsKIH0KIAogI3ByYWdtYSBtYXJrIC0gVUlWaWV3Q29udHJvbGxlcgogCi0tIChpbnN0YW5jZXR5cGUpCi0gICAgICBpbml0V2l0aE5vdGlmaWNhdGlvbk1lc3NhZ2U6KGNvbnN0IHJlbW90aW5nOjpOb3RpZmljYXRpb25NZXNzYWdlJiltZXNzYWdlCi0gICAgc2hvdWxkU2hvd0RvbnRTaG93QWdhaW5Ub2dnbGU6KEJPT0wpc2hvdWxkU2hvd0RvbnRTaG93QWdhaW5Ub2dnbGUgeworLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoTm90aWZpY2F0aW9uTWVzc2FnZToKKyAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHJlbW90aW5nOjpOb3RpZmljYXRpb25NZXNzYWdlJiltZXNzYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dTaWxlbmNlOihCT09MKWFsbG93U2lsZW5jZSB7CiAgIHNlbGYgPSBbc3VwZXIgaW5pdF07CiAgIGlmIChzZWxmKSB7CiAgICAgX21lc3NhZ2VUZXh0ID0gYmFzZTo6U3lzVVRGOFRvTlNTdHJpbmcobWVzc2FnZS5tZXNzYWdlX3RleHQpOwogICAgIF9saW5rVGV4dCA9IGJhc2U6OlN5c1VURjhUb05TU3RyaW5nKG1lc3NhZ2UubGlua190ZXh0KTsKICAgICBfbGlua1VybCA9IFtOU1VSTCBVUkxXaXRoU3RyaW5nOmJhc2U6OlN5c1VURjhUb05TU3RyaW5nKG1lc3NhZ2UubGlua191cmwpXTsKLSAgICBfc2hvdWxkU2hvd0RvbnRTaG93QWdhaW5Ub2dnbGUgPSBzaG91bGRTaG93RG9udFNob3dBZ2FpblRvZ2dsZTsKKyAgICBfYWxsb3dTaWxlbmNlID0gYWxsb3dTaWxlbmNlOwogCiAgICAgX3RyYW5zaXRpb25Db250cm9sbGVyID0gW01EQ0RpYWxvZ1RyYW5zaXRpb25Db250cm9sbGVyIG5ld107CiAgICAgc2VsZi5tb2RhbFByZXNlbnRhdGlvblN0eWxlID0gVUlNb2RhbFByZXNlbnRhdGlvbkN1c3RvbTsKQEAgLTEzMCw3ICsxMzAsNyBAQAogICAgIFtfbGlua0J1dHRvbi5oZWlnaHRBbmNob3IgY29uc3RyYWludEVxdWFsVG9Db25zdGFudDprQnV0dG9uSGVpZ2h0XSwKICAgXV07CiAKLSAgaWYgKF9zaG91bGRTaG93RG9udFNob3dBZ2FpblRvZ2dsZSkgeworICBpZiAoX2FsbG93U2lsZW5jZSkgewogICAgIC8vIFRoaXMgaXMgdG8gYWxsb3cgdXNlciB0byB0b2dnbGUgc3dpdGNoIGJ5IHRhcHBpbmcgdGhlIGxhYmVsLiBUYXAgZXZlbnRzCiAgICAgLy8gd29uJ3QgYmUgYnViYmxlZCBkb3duIHRvIHRoZSBzd2l0Y2guCiAgICAgVUlUYXBHZXN0dXJlUmVjb2duaXplciogZG9udFNob3dBZ2FpblRhcEdlc3R1cmVSZWNvZ25pemVyID0KQEAgLTE4Nyw3ICsxODcsNyBAQAogICAgICAgICAgICAgICBfbGlua0J1dHRvbi5pbnRyaW5zaWNDb250ZW50U2l6ZS53aWR0aCk7CiAgIENHRmxvYXQgY29udGVudEhlaWdodCA9IF9tZXNzYWdlTGFiZWwuaW50cmluc2ljQ29udGVudFNpemUuaGVpZ2h0ICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAqIGtMYWJlbEluc2V0ICsga0J1dHRvbkhlaWdodDsKLSAgaWYgKF9zaG91bGRTaG93RG9udFNob3dBZ2FpblRvZ2dsZSkgeworICBpZiAoX2FsbG93U2lsZW5jZSkgewogICAgIGNvbnRlbnRXaWR0aCA9CiAgICAgICAgIE1BWChjb250ZW50V2lkdGgsCiAgICAgICAgICAgICBrU3dpdGNoSW5zZXQgKyBfZG9udFNob3dBZ2FpblN3aXRjaC5pbnRyaW5zaWNDb250ZW50U2l6ZS53aWR0aCArCmRpZmYgLS1naXQgYS9yZW1vdGluZy9pb3MvYXBwL25vdGlmaWNhdGlvbl9wcmVzZW50ZXIubW0gYi9yZW1vdGluZy9pb3MvYXBwL25vdGlmaWNhdGlvbl9wcmVzZW50ZXIubW0KaW5kZXggZjEyMmQxZDYuLjk3ODA4YTMwZCAxMDA2NDQKLS0tIGEvcmVtb3RpbmcvaW9zL2FwcC9ub3RpZmljYXRpb25fcHJlc2VudGVyLm1tCisrKyBiL3JlbW90aW5nL2lvcy9hcHAvbm90aWZpY2F0aW9uX3ByZXNlbnRlci5tbQpAQCAtMzYsOCArMzYsOCBAQAogCiBlbnVtIE5vdGlmaWNhdGlvblVpU3RhdGUgOiB1bnNpZ25lZCBpbnQgewogICBOT1RfU0hPV04gPSAwLAotICBTSE9XTl9BVF9MRUFTVF9PTkNFID0gMSwKLSAgVVNFUl9DSE9TRV9ET05UX1NIT1dfQUdBSU4gPSAyLAorICBTSE9XTiA9IDEsCisgIFNJTEVOQ0VEID0gMiwKIH07CiAKIE5vdGlmaWNhdGlvblVpU3RhdGUgTlNOdW1iZXJUb1VpU3RhdGUoTlNOdW1iZXIqIG51bWJlcikgewpAQCAtMTI0LDggKzEyNCw3IEBACiAgICAgICAgICAgb2JqZWN0Rm9yRmxhZzpSZW1vdGluZ0ZsYWdMYXN0U2Vlbk5vdGlmaWNhdGlvbk1lc3NhZ2VJZF0pOwogICBOb3RpZmljYXRpb25VaVN0YXRlIHVpX3N0YXRlID0gTlNOdW1iZXJUb1VpU3RhdGUoW1JlbW90aW5nUHJlZmVyZW5jZXMuaW5zdGFuY2UKICAgICAgIG9iamVjdEZvckZsYWc6UmVtb3RpbmdGbGFnTm90aWZpY2F0aW9uVWlTdGF0ZV0pOwotICBpZiAobm90aWZpY2F0aW9uLT5hbGxvd19kb250X3Nob3dfYWdhaW4gJiYKLSAgICAgIHVpX3N0YXRlID09IFVTRVJfQ0hPU0VfRE9OVF9TSE9XX0FHQUlOICYmCisgIGlmIChub3RpZmljYXRpb24tPmFsbG93X3NpbGVuY2UgJiYgdWlfc3RhdGUgPT0gU0lMRU5DRUQgJiYKICAgICAgIGxhc3Rfc2Vlbl9tZXNzYWdlX2lkID09IG5vdGlmaWNhdGlvbi0+bWVzc2FnZV9pZCkgewogICAgIHJldHVybjsKICAgfQpAQCAtMTQwLDE1ICsxMzksMTMgQEAKICAgICBbUmVtb3RpbmdQcmVmZXJlbmNlcy5pbnN0YW5jZSBzeW5jaHJvbml6ZUZsYWdzXTsKICAgfQogCi0gIEJPT0wgc2hvdWxkU2hvd0RvbnRTaG93QWdhaW4gPQotICAgICAgbm90aWZpY2F0aW9uLT5hbGxvd19kb250X3Nob3dfYWdhaW4gJiYgdWlfc3RhdGUgPT0gU0hPV05fQVRfTEVBU1RfT05DRTsKKyAgQk9PTCBhbGxvd1NpbGVuY2UgPSBub3RpZmljYXRpb24tPmFsbG93X3NpbGVuY2UgJiYgdWlfc3RhdGUgPT0gU0hPV047CiAgIE5vdGlmaWNhdGlvbkRpYWxvZ1ZpZXdDb250cm9sbGVyKiBkaWFsb2dWYyA9CiAgICAgICBbW05vdGlmaWNhdGlvbkRpYWxvZ1ZpZXdDb250cm9sbGVyIGFsbG9jXQotICAgICAgICAgICAgaW5pdFdpdGhOb3RpZmljYXRpb25NZXNzYWdlOipub3RpZmljYXRpb24KLSAgICAgICAgICBzaG91bGRTaG93RG9udFNob3dBZ2FpblRvZ2dsZTpzaG91bGRTaG93RG9udFNob3dBZ2Fpbl07Ci0gIFtkaWFsb2dWYyBwcmVzZW50T25Ub3BWQ1dpdGhDb21wbGV0aW9uOl4oQk9PTCBpc0RvbnRTaG93QWdhaW5PbikgewotICAgIE5vdGlmaWNhdGlvblVpU3RhdGUgbmV3X3VpX3N0YXRlID0KLSAgICAgICAgaXNEb250U2hvd0FnYWluT24gPyBVU0VSX0NIT1NFX0RPTlRfU0hPV19BR0FJTiA6IFNIT1dOX0FUX0xFQVNUX09OQ0U7CisgICAgICAgICAgaW5pdFdpdGhOb3RpZmljYXRpb25NZXNzYWdlOipub3RpZmljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd1NpbGVuY2U6YWxsb3dTaWxlbmNlXTsKKyAgW2RpYWxvZ1ZjIHByZXNlbnRPblRvcFZDV2l0aENvbXBsZXRpb246XihCT09MIGlzU2lsZW5jZWQpIHsKKyAgICBOb3RpZmljYXRpb25VaVN0YXRlIG5ld191aV9zdGF0ZSA9IGlzU2lsZW5jZWQgPyBTSUxFTkNFRCA6IFNIT1dOOwogICAgIFtSZW1vdGluZ1ByZWZlcmVuY2VzLmluc3RhbmNlIHNldE9iamVjdDpVaVN0YXRlVG9OU051bWJlcihuZXdfdWlfc3RhdGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JGbGFnOlJlbW90aW5nRmxhZ05vdGlmaWNhdGlvblVpU3RhdGVdOwogICAgIFtSZW1vdGluZ1ByZWZlcmVuY2VzLmluc3RhbmNlIHN5bmNocm9uaXplRmxhZ3NdOwpkaWZmIC0tZ2l0IGEvcmVtb3RpbmcvcmVzb3VyY2VzL3JlbW90aW5nX3N0cmluZ3MuZ3JkIGIvcmVtb3RpbmcvcmVzb3VyY2VzL3JlbW90aW5nX3N0cmluZ3MuZ3JkCmluZGV4IDUyZjU1YjEuLjAyMTE0ZDAgMTAwNjQ0Ci0tLSBhL3JlbW90aW5nL3Jlc291cmNlcy9yZW1vdGluZ19zdHJpbmdzLmdyZAorKysgYi9yZW1vdGluZy9yZXNvdXJjZXMvcmVtb3Rpbmdfc3RyaW5ncy5ncmQKQEAgLTY2Miw3ICs2NjIsNyBAQAogICAgICAgICA8bWVzc2FnZSBuYW1lPSJJRFNfRElTTUlTUyIgZGVzYz0iTGFiZWwgZm9yIGJ1dHRvbiB0byBkaXNtaXNzIGEgZGlhbG9nIiBmb3JtYXR0ZXJfZGF0YT0iYW5kcm9pZF9qYXZhIj4KICAgICAgICAgICBEaXNtaXNzCiAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgPG1lc3NhZ2UgbmFtZT0iSURTX0RPTlRfU0hPV19BR0FJTiIgZGVzYz0iTGFiZWwgZm9yIGNoZWNrYm94IHRvIG1ha2UgYSBkaWFsb2cgbm90IHNob3dpbmcgYWdhaW4uIj4KKyAgICAgICAgPG1lc3NhZ2UgbmFtZT0iSURTX0RPTlRfU0hPV19BR0FJTiIgZGVzYz0iTGFiZWwgZm9yIGNoZWNrYm94IHRvIG1ha2UgYSBkaWFsb2cgbm90IHNob3dpbmcgYWdhaW4uIiBmb3JtYXR0ZXJfZGF0YT0iYW5kcm9pZF9qYXZhIj4KICAgICAgICAgICBEb24ndCBzaG93IGFnYWluCiAgICAgICAgIDwvbWVzc2FnZT4KICAgICAgIDwvaWY+ICA8IS0tIGlzX2FuZHJvaWQgb3IgaXNfaW9zIC0tPgpkaWZmIC0tZ2l0IGEvcmVtb3Rpbmcvc2lnbmFsaW5nL3NpZ25hbGluZ19hZGRyZXNzLmNjIGIvcmVtb3Rpbmcvc2lnbmFsaW5nL3NpZ25hbGluZ19hZGRyZXNzLmNjCmluZGV4IDExNjU2MTAuLmMyNDM1YjMgMTAwNjQ0Ci0tLSBhL3JlbW90aW5nL3NpZ25hbGluZy9zaWduYWxpbmdfYWRkcmVzcy5jYworKysgYi9yZW1vdGluZy9zaWduYWxpbmcvc2lnbmFsaW5nX2FkZHJlc3MuY2MKQEAgLTExLDcgKzExLDYgQEAKICNpbmNsdWRlICJiYXNlL3N0cmluZ3Mvc3RyaW5ncHJpbnRmLmgiCiAjaW5jbHVkZSAicmVtb3RpbmcvYmFzZS9uYW1lX3ZhbHVlX21hcC5oIgogI2luY2x1ZGUgInJlbW90aW5nL2Jhc2UvcmVtb3RpbmdfYm90LmgiCi0jaW5jbHVkZSAicmVtb3RpbmcvYmFzZS9zZXJ2aWNlX3VybHMuaCIKICNpbmNsdWRlICJyZW1vdGluZy9zaWduYWxpbmcvamlkX3V0aWwuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9saWJqaW5nbGVfeG1wcC94bWxsaXRlL3htbGVsZW1lbnQuaCIKIApAQCAtODQsNyArODMsNyBAQAogICAgICAgYnJlYWs7CiAgICAgY2FzZSBTaWduYWxpbmdBZGRyZXNzOjpDaGFubmVsOjpMQ1M6CiAgICAgICBlbmRwb2ludF9pZF8gPSBOb3JtYWxpemVKaWQoYWRkcmVzcyk7Ci0gICAgICBqaWRfID0gcmVtb3Rpbmc6OlNlcnZpY2VVcmxzOjpHZXRJbnN0YW5jZSgpLT5kaXJlY3RvcnlfYm90X2ppZCgpOworICAgICAgamlkXyA9IGtSZW1vdGluZ0JvdEppZDsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgU2lnbmFsaW5nQWRkcmVzczo6Q2hhbm5lbDo6RlRMOgogICAgICAgamlkXyA9IE5vcm1hbGl6ZUppZChhZGRyZXNzKTsKZGlmZiAtLWdpdCBhL3JlbW90aW5nL3Rlc3QvaXQybWVfY2xpX2hvc3QuY2MgYi9yZW1vdGluZy90ZXN0L2l0Mm1lX2NsaV9ob3N0LmNjCmluZGV4IGJjNzI4ZDUuLjZiYzg1YjkgMTAwNjQ0Ci0tLSBhL3JlbW90aW5nL3Rlc3QvaXQybWVfY2xpX2hvc3QuY2MKKysrIGIvcmVtb3RpbmcvdGVzdC9pdDJtZV9jbGlfaG9zdC5jYwpAQCAtNDEsMTIgKzQxLDggQEAKIC8vIENvbm5lY3QgbWVzc2FnZSBwYXJhbWV0ZXJzOgogY29uc3RleHByIGNoYXIga0NSRENvbm5lY3RVc2VyTmFtZVtdID0gInVzZXJOYW1lIjsKIGNvbnN0ZXhwciBjaGFyIGtDUkRDb25uZWN0QXV0aFtdID0gImF1dGhTZXJ2aWNlV2l0aFRva2VuIjsKLWNvbnN0ZXhwciBjaGFyIGtDUkRDb25uZWN0RGlyZWN0b3J5Qm90W10gPSAiZGlyZWN0b3J5Qm90SmlkIjsKIGNvbnN0ZXhwciBjaGFyIGtDUkRDb25uZWN0Tm9EaWFsb2dzW10gPSAibm9EaWFsb2dzIjsKIAotLy8gQ29ubmVjdCBtZXNzYWdlIHBhcmFtZXRlciB2YWx1ZXM6Ci1jb25zdGV4cHIgY2hhciBrQ1JEQ29ubmVjdERpcmVjdG9yeUJvdFZhbHVlW10gPSAicmVtb3RpbmdAYm90LnRhbGsuZ29vZ2xlLmNvbSI7Ci0KIC8vIENSRCBob3N0IHN0YXRlcyB3ZSBjYXJlIGFib3V0OgogY29uc3RleHByIGNoYXIga0NSRFN0YXRlS2V5W10gPSAic3RhdGUiOwogY29uc3RleHByIGNoYXIga0NSRFN0YXRlRXJyb3JbXSA9ICJFUlJPUiI7CkBAIC0yMTYsOCArMjEyLDYgQEAKIAogICBjb25uZWN0X3BhcmFtcy5TZXRLZXkoa0NSRENvbm5lY3RVc2VyTmFtZSwgYmFzZTo6VmFsdWUodXNlcl9lbWFpbCkpOwogICBjb25uZWN0X3BhcmFtcy5TZXRLZXkoa0NSRENvbm5lY3RBdXRoLCBiYXNlOjpWYWx1ZSgib2F1dGgyOiIgKyBhY2Nlc3NfdG9rZW4pKTsKLSAgY29ubmVjdF9wYXJhbXMuU2V0S2V5KGtDUkRDb25uZWN0RGlyZWN0b3J5Qm90LAotICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VmFsdWUoa0NSRENvbm5lY3REaXJlY3RvcnlCb3RWYWx1ZSkpOwogICBjb25uZWN0X3BhcmFtcy5TZXRLZXkoa0NSRENvbm5lY3ROb0RpYWxvZ3MsIGJhc2U6OlZhbHVlKHRydWUpKTsKICAgY29ubmVjdF9wYXJhbXNfID0gc3RkOjptb3ZlKGNvbm5lY3RfcGFyYW1zKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvZGV2aWNlL2dlb2xvY2F0aW9uL3Bvc2l0aW9uX2NhY2hlX2ltcGxfcGVyZnRlc3QuY2MgYi9zZXJ2aWNlcy9kZXZpY2UvZ2VvbG9jYXRpb24vcG9zaXRpb25fY2FjaGVfaW1wbF9wZXJmdGVzdC5jYwppbmRleCAwZDhhNWY4Li43ZGQ5MGI4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9kZXZpY2UvZ2VvbG9jYXRpb24vcG9zaXRpb25fY2FjaGVfaW1wbF9wZXJmdGVzdC5jYworKysgYi9zZXJ2aWNlcy9kZXZpY2UvZ2VvbG9jYXRpb24vcG9zaXRpb25fY2FjaGVfaW1wbF9wZXJmdGVzdC5jYwpAQCAtMTMsNyArMTMsMjMgQEAKICNpbmNsdWRlICJiYXNlL3RpbWUvdGltZS5oIgogI2luY2x1ZGUgInNlcnZpY2VzL2RldmljZS9nZW9sb2NhdGlvbi9wb3NpdGlvbl9jYWNoZV90ZXN0X3V0aWwuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL3BlcmYvcGVyZl90ZXN0LmgiCisjaW5jbHVkZSAidGVzdGluZy9wZXJmL3BlcmZfcmVzdWx0X3JlcG9ydGVyLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciBjaGFyIGtNZXRyaWNQcmVmaXhQb3NpdGlvbkNhY2hlSW1wbFtdID0gIlBvc2l0aW9uQ2FjaGVJbXBsLiI7Citjb25zdGV4cHIgY2hhciBrTWV0cmljQWRkVGltZU1zW10gPSAiYWRkX3RpbWUiOworY29uc3RleHByIGNoYXIga01ldHJpY0ZpbmRUaW1lTXNbXSA9ICJmaW5kX3RpbWUiOworY29uc3RleHByIGNoYXIga1N0b3J5QmFzZWxpbmVbXSA9ICJiYXNlbGluZV9zdG9yeSI7CisKK3BlcmZfdGVzdDo6UGVyZlJlc3VsdFJlcG9ydGVyIFNldFVwUmVwb3J0ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHN0b3J5KSB7CisgIHBlcmZfdGVzdDo6UGVyZlJlc3VsdFJlcG9ydGVyIHJlcG9ydGVyKGtNZXRyaWNQcmVmaXhQb3NpdGlvbkNhY2hlSW1wbCwgc3RvcnkpOworICByZXBvcnRlci5SZWdpc3RlckltcG9ydGFudE1ldHJpYyhrTWV0cmljQWRkVGltZU1zLCAibXMiKTsKKyAgcmVwb3J0ZXIuUmVnaXN0ZXJJbXBvcnRhbnRNZXRyaWMoa01ldHJpY0ZpbmRUaW1lTXMsICJtcyIpOworICByZXR1cm4gcmVwb3J0ZXI7Cit9CisKK30gIC8vIG5hbWVzcGFjZQogCiBuYW1lc3BhY2UgZGV2aWNlIHsKIApAQCAtNDIsOSArNTgsOCBAQAogICBmb3IgKGNvbnN0IGF1dG8mIHBhaXIgOiBkYXRhXykKICAgICBjYWNoZV8uQ2FjaGVQb3NpdGlvbihwYWlyLmZpcnN0LCBwYWlyLnNlY29uZCk7CiAgIGJhc2U6OlRpbWUgZW5kID0gYmFzZTo6VGltZTo6Tm93KCk7Ci0gIHBlcmZfdGVzdDo6UHJpbnRSZXN1bHQoImFkZGluZ190b19jYWNoZSIsICIiLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGEoZW5kIC0gc3RhcnQpLkluTWlsbGlzZWNvbmRzRigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICJtcyBwZXIgYmF0Y2giLCB0cnVlKTsKKyAgYXV0byByZXBvcnRlciA9IFNldFVwUmVwb3J0ZXIoa1N0b3J5QmFzZWxpbmUpOworICByZXBvcnRlci5BZGRSZXN1bHQoa01ldHJpY0FkZFRpbWVNcywgYmFzZTo6VGltZURlbHRhKGVuZCAtIHN0YXJ0KSk7CiB9CiAKIFRFU1RfRihQb3NpdGlvbkNhY2hlSW1wbFBlcmZUZXN0LCBGaW5kaW5nKSB7CkBAIC01NCw4ICs2OSw3IEBACiAgIGZvciAoY29uc3QgYXV0byYgcGFpciA6IGRhdGFfKQogICAgIGNhY2hlXy5GaW5kUG9zaXRpb24ocGFpci5maXJzdCk7CiAgIGJhc2U6OlRpbWUgZW5kID0gYmFzZTo6VGltZTo6Tm93KCk7Ci0gIHBlcmZfdGVzdDo6UHJpbnRSZXN1bHQoImZpbmRpbmdfaW5fY2FjaGUiLCAiIiwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhKGVuZCAtIHN0YXJ0KS5Jbk1pbGxpc2Vjb25kc0YoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAibXMgcGVyIGJhdGNoIiwgdHJ1ZSk7CisgIGF1dG8gcmVwb3J0ZXIgPSBTZXRVcFJlcG9ydGVyKGtTdG9yeUJhc2VsaW5lKTsKKyAgcmVwb3J0ZXIuQWRkUmVzdWx0KGtNZXRyaWNGaW5kVGltZU1zLCBiYXNlOjpUaW1lRGVsdGEoZW5kIC0gc3RhcnQpKTsKIH0KIH0gIC8vIG5hbWVzcGFjZSBkZXZpY2UKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhX3Nlc3Npb24vYXVkaW9fZm9jdXNfbWFuYWdlci5jYyBiL3NlcnZpY2VzL21lZGlhX3Nlc3Npb24vYXVkaW9fZm9jdXNfbWFuYWdlci5jYwppbmRleCBiNWFiY2RmLi43NmEwNzlmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYV9zZXNzaW9uL2F1ZGlvX2ZvY3VzX21hbmFnZXIuY2MKKysrIGIvc2VydmljZXMvbWVkaWFfc2Vzc2lvbi9hdWRpb19mb2N1c19tYW5hZ2VyLmNjCkBAIC0xMyw3ICsxMyw3IEBACiAjaW5jbHVkZSAiYmFzZS9wb3dlcl9tb25pdG9yL3Bvd2VyX29ic2VydmVyLmgiCiAjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX3Rhc2tfcnVubmVyX2hhbmRsZS5oIgogI2luY2x1ZGUgImJhc2UvdW5ndWVzc2FibGVfdG9rZW4uaCIKLSNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvYmluZGluZ3MvaW50ZXJmYWNlX3JlcXVlc3QuaCIKKyNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvYmluZGluZ3MvcmVtb3RlLmgiCiAjaW5jbHVkZSAic2VydmljZXMvbWVkaWFfc2Vzc2lvbi9hdWRpb19mb2N1c19yZXF1ZXN0LmgiCiAjaW5jbHVkZSAic2VydmljZXMvbWVkaWFfc2Vzc2lvbi9wdWJsaWMvY3BwL2ZlYXR1cmVzLmgiCiAjaW5jbHVkZSAic2VydmljZXMvbWVkaWFfc2Vzc2lvbi9wdWJsaWMvbW9qb20vYXVkaW9fZm9jdXMubW9qb20uaCIKQEAgLTY0LDEzICs2NCwxMyBAQAogICAgICAgOiBpZGVudGl0eV8oc291cmNlX2lkKSwgb2JzZXJ2ZXJfKHN0ZDo6bW92ZShvYnNlcnZlcikpIHsKICAgICAvLyBTZXQgYSBjb25uZWN0aW9uIGVycm9yIGhhbmRsZXIgc28gdGhhdCB3ZSB3aWxsIHJlbW92ZSBvYnNlcnZlcnMgdGhhdCBoYXZlCiAgICAgLy8gaGFkIGFuIGVycm9yIC8gYmVlbiBjbG9zZWQuCi0gICAgb2JzZXJ2ZXJfLnNldF9jb25uZWN0aW9uX2Vycm9yX2hhbmRsZXIoYmFzZTo6QmluZE9uY2UoCisgICAgb2JzZXJ2ZXJfLnNldF9kaXNjb25uZWN0X2hhbmRsZXIoYmFzZTo6QmluZE9uY2UoCiAgICAgICAgICZBdWRpb0ZvY3VzTWFuYWdlcjo6Q2xlYW51cFNvdXJjZU9ic2VydmVycywgYmFzZTo6VW5yZXRhaW5lZChvd25lcikpKTsKICAgfQogCiAgIH5Tb3VyY2VPYnNlcnZlckhvbGRlcigpID0gZGVmYXVsdDsKIAotICBib29sIGlzX3ZhbGlkKCkgY29uc3QgeyByZXR1cm4gIW9ic2VydmVyXy5lbmNvdW50ZXJlZF9lcnJvcigpOyB9CisgIGJvb2wgaXNfdmFsaWQoKSBjb25zdCB7IHJldHVybiBvYnNlcnZlcl8uaXNfY29ubmVjdGVkKCk7IH0KIAogICBjb25zdCBiYXNlOjpVbmd1ZXNzYWJsZVRva2VuJiBpZGVudGl0eSgpIGNvbnN0IHsgcmV0dXJuIGlkZW50aXR5XzsgfQogCkBAIC04NCw3ICs4NCw3IEBACiAKICBwcml2YXRlOgogICBjb25zdCBiYXNlOjpVbmd1ZXNzYWJsZVRva2VuIGlkZW50aXR5XzsKLSAgbW9qb206OkF1ZGlvRm9jdXNPYnNlcnZlclB0ciBvYnNlcnZlcl87CisgIG1vam86OlJlbW90ZTxtb2pvbTo6QXVkaW9Gb2N1c09ic2VydmVyPiBvYnNlcnZlcl87CiAKICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFNvdXJjZU9ic2VydmVySG9sZGVyKTsKIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9uZXR3b3JrL2Nvb2tpZV9tYW5hZ2VyLmNjIGIvc2VydmljZXMvbmV0d29yay9jb29raWVfbWFuYWdlci5jYwppbmRleCBjMGYxMDVhLi41YTA4NzIyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9uZXR3b3JrL2Nvb2tpZV9tYW5hZ2VyLmNjCisrKyBiL3NlcnZpY2VzL25ldHdvcmsvY29va2llX21hbmFnZXIuY2MKQEAgLTczLDYgKzczLDExIEBACiAgIGNvb2tpZV9zdG9yZV8tPkdldEFsbENvb2tpZXNBc3luYyhzdGQ6Om1vdmUoY2FsbGJhY2spKTsKIH0KIAordm9pZCBDb29raWVNYW5hZ2VyOjpHZXRBbGxDb29raWVzV2l0aEFjY2Vzc1NlbWFudGljcygKKyAgICBHZXRBbGxDb29raWVzV2l0aEFjY2Vzc1NlbWFudGljc0NhbGxiYWNrIGNhbGxiYWNrKSB7CisgIGNvb2tpZV9zdG9yZV8tPkdldEFsbENvb2tpZXNXaXRoQWNjZXNzU2VtYW50aWNzQXN5bmMoc3RkOjptb3ZlKGNhbGxiYWNrKSk7Cit9CisKIHZvaWQgQ29va2llTWFuYWdlcjo6R2V0Q29va2llTGlzdChjb25zdCBHVVJMJiB1cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0OjpDb29raWVPcHRpb25zJiBjb29raWVfb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRDb29raWVMaXN0Q2FsbGJhY2sgY2FsbGJhY2spIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL25ldHdvcmsvY29va2llX21hbmFnZXIuaCBiL3NlcnZpY2VzL25ldHdvcmsvY29va2llX21hbmFnZXIuaAppbmRleCA0N2VhZGY5Ny4uOWE3Njc1MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbmV0d29yay9jb29raWVfbWFuYWdlci5oCisrKyBiL3NlcnZpY2VzL25ldHdvcmsvY29va2llX21hbmFnZXIuaApAQCAtNTYsNiArNTYsOCBAQAogCiAgIC8vIG1vam9tOjpDb29raWVNYW5hZ2VyCiAgIHZvaWQgR2V0QWxsQ29va2llcyhHZXRBbGxDb29raWVzQ2FsbGJhY2sgY2FsbGJhY2spIG92ZXJyaWRlOworICB2b2lkIEdldEFsbENvb2tpZXNXaXRoQWNjZXNzU2VtYW50aWNzKAorICAgICAgR2V0QWxsQ29va2llc1dpdGhBY2Nlc3NTZW1hbnRpY3NDYWxsYmFjayBjYWxsYmFjaykgb3ZlcnJpZGU7CiAgIHZvaWQgR2V0Q29va2llTGlzdChjb25zdCBHVVJMJiB1cmwsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXQ6OkNvb2tpZU9wdGlvbnMmIGNvb2tpZV9vcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgR2V0Q29va2llTGlzdENhbGxiYWNrIGNhbGxiYWNrKSBvdmVycmlkZTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL25ldHdvcmsvY29va2llX21hbmFnZXJfdW5pdHRlc3QuY2MgYi9zZXJ2aWNlcy9uZXR3b3JrL2Nvb2tpZV9tYW5hZ2VyX3VuaXR0ZXN0LmNjCmluZGV4IDY3OTRmNzcuLjM5ZGZiMGUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL25ldHdvcmsvY29va2llX21hbmFnZXJfdW5pdHRlc3QuY2MKKysrIGIvc2VydmljZXMvbmV0d29yay9jb29raWVfbWFuYWdlcl91bml0dGVzdC5jYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgIm5ldC9jb29raWVzL2Nvb2tpZV9zdG9yZV90ZXN0X2NhbGxiYWNrcy5oIgogI2luY2x1ZGUgIm5ldC9jb29raWVzL2Nvb2tpZV9zdG9yZV90ZXN0X2hlbHBlcnMuaCIKICNpbmNsdWRlICJuZXQvY29va2llcy9jb29raWVfdXRpbC5oIgorI2luY2x1ZGUgIm5ldC9jb29raWVzL3Rlc3RfY29va2llX2FjY2Vzc19kZWxlZ2F0ZS5oIgogI2luY2x1ZGUgInNlcnZpY2VzL25ldHdvcmsvcHVibGljL21vam9tL2Nvb2tpZV9tYW5hZ2VyLm1vam9tLmgiCiAjaW5jbHVkZSAic2VydmljZXMvbmV0d29yay9zZXNzaW9uX2NsZWFudXBfY29va2llX3N0b3JlLmgiCiAjaW5jbHVkZSAidGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLmgiCkBAIC04Miw2ICs4MywyNCBAQAogICAgIHJldHVybiBjb29raWVzX291dDsKICAgfQogCisgIHN0ZDo6dmVjdG9yPG5ldDo6Q2Fub25pY2FsQ29va2llPiBHZXRBbGxDb29raWVzV2l0aEFjY2Vzc1NlbWFudGljcygKKyAgICAgIHN0ZDo6dmVjdG9yPG5ldDo6Q29va2llQWNjZXNzU2VtYW50aWNzPiogYWNjZXNzX3NlbWFudGljc19saXN0X291dCkgeworICAgIGJhc2U6OlJ1bkxvb3AgcnVuX2xvb3A7CisgICAgc3RkOjp2ZWN0b3I8bmV0OjpDYW5vbmljYWxDb29raWU+IGNvb2tpZXNfb3V0OworICAgIGNvb2tpZV9zZXJ2aWNlXy0+R2V0QWxsQ29va2llc1dpdGhBY2Nlc3NTZW1hbnRpY3MoCisgICAgICAgIGJhc2U6OkJpbmRMYW1iZGFGb3JUZXN0aW5nKAorICAgICAgICAgICAgWyZydW5fbG9vcCwgJmNvb2tpZXNfb3V0LCBhY2Nlc3Nfc2VtYW50aWNzX2xpc3Rfb3V0XSgKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxuZXQ6OkNhbm9uaWNhbENvb2tpZT4mIGNvb2tpZXMsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bmV0OjpDb29raWVBY2Nlc3NTZW1hbnRpY3M+JgorICAgICAgICAgICAgICAgICAgICBhY2Nlc3Nfc2VtYW50aWNzX2xpc3QpIHsKKyAgICAgICAgICAgICAgY29va2llc19vdXQgPSBjb29raWVzOworICAgICAgICAgICAgICAqYWNjZXNzX3NlbWFudGljc19saXN0X291dCA9IGFjY2Vzc19zZW1hbnRpY3NfbGlzdDsKKyAgICAgICAgICAgICAgcnVuX2xvb3AuUXVpdCgpOworICAgICAgICAgICAgfSkpOworICAgIHJ1bl9sb29wLlJ1bigpOworICAgIHJldHVybiBjb29raWVzX291dDsKKyAgfQorCiAgIHN0ZDo6dmVjdG9yPG5ldDo6Q2Fub25pY2FsQ29va2llPiBHZXRDb29raWVMaXN0KGNvbnN0IEdVUkwmIHVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0OjpDb29raWVPcHRpb25zIG9wdGlvbnMpIHsKICAgICBiYXNlOjpSdW5Mb29wIHJ1bl9sb29wOwpAQCAtNDM5LDYgKzQ1OCw3NSBAQAogICBFWFBFQ1RfRVEobmV0OjpDT09LSUVfUFJJT1JJVFlfTUVESVVNLCBjb29raWVzWzNdLlByaW9yaXR5KCkpOwogfQogCitURVNUX0YoQ29va2llTWFuYWdlclRlc3QsIEdldEFsbENvb2tpZXNXaXRoQWNjZXNzU2VtYW50aWNzKSB7CisgIGF1dG8gZGVsZWdhdGUgPSBzdGQ6Om1ha2VfdW5pcXVlPG5ldDo6VGVzdENvb2tpZUFjY2Vzc0RlbGVnYXRlPigpOworICBkZWxlZ2F0ZS0+U2V0RXhwZWN0YXRpb25Gb3JDb29raWVEb21haW4oImRvbWFpbjEudGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXQ6OkNvb2tpZUFjY2Vzc1NlbWFudGljczo6VU5LTk9XTik7CisgIGRlbGVnYXRlLT5TZXRFeHBlY3RhdGlvbkZvckNvb2tpZURvbWFpbigiZG9tYWluMi50ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldDo6Q29va2llQWNjZXNzU2VtYW50aWNzOjpMRUdBQ1kpOworICBkZWxlZ2F0ZS0+U2V0RXhwZWN0YXRpb25Gb3JDb29raWVEb21haW4oCisgICAgICAiLmRvbWFpbndpdGhkb3QudGVzdCIsIG5ldDo6Q29va2llQWNjZXNzU2VtYW50aWNzOjpOT05MRUdBQ1kpOworICBjb29raWVfc3RvcmUoKS0+U2V0Q29va2llQWNjZXNzRGVsZWdhdGUoc3RkOjptb3ZlKGRlbGVnYXRlKSk7CisKKyAgLy8gU2V0IHNvbWUgY29va2llcyBmb3IgdGhlIHRlc3QgdG8gcGxheSB3aXRoLgorICAvLyBUT0RPKGNobGlseSk6IEJlY2F1c2UgdGhlIG9yZGVyIG9mIHRoZSBjb29raWVzIHdpdGggcmVzcGVjdCB0byB0aGUgYWNjZXNzCisgIC8vIHNlbWFudGljcyBlbnRyaWVzIHNob3VsZCBtYXRjaCB1cCwgZm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIHRlc3Qgd2UgbmVlZAorICAvLyB0aGUgY29va2llcyB0byBzb3J0IGluIGEgcHJlZGljdGFibGUgb3JkZXIuIFNpbmNlIHRoZSBsb25nZXN0IHBhdGggaXMKKyAgLy8gZmlyc3QsIHdlIGNhbiBtYW5pcHVsYXRlIHRoZSBwYXRoIGF0dHJpYnV0ZSBvZiBlYWNoIGNvb2tpZSBzZXQgYmVsb3cgdG8gZ2V0CisgIC8vIHRoZW0gaW4gdGhlIHJpZ2h0IG9yZGVyLiBUaGlzIHdpbGwgaGF2ZSB0byBjaGFuZ2UgaWYgQ29va2llU29ydGVyIGV2ZXIKKyAgLy8gc3RhcnRzIHNvcnRpbmcgdGhlIGNvb2tpZXMgZGlmZmVyZW50bHkuCisKKyAgLy8gVU5LTk9XTgorICBFWFBFQ1RfVFJVRShTZXRDYW5vbmljYWxDb29raWUoCisgICAgICBuZXQ6OkNhbm9uaWNhbENvb2tpZSgiQSIsICJCIiwgImRvbWFpbjEudGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiL3RoaXMvcGF0aC9pcy90aGUvbG9uZ2VzdC9mb3Ivc29ydGluZy9wdXJwb3NlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lKCksIGJhc2U6OlRpbWUoKSwgYmFzZTo6VGltZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLypzZWN1cmU9Ki9mYWxzZSwgLypodHRwb25seT0qL2ZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0OjpDb29raWVTYW1lU2l0ZTo6Tk9fUkVTVFJJQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXQ6OkNPT0tJRV9QUklPUklUWV9NRURJVU0pLAorICAgICAgImh0dHBzIiwgdHJ1ZSkpOworICAvLyBMRUdBQ1kKKyAgRVhQRUNUX1RSVUUoU2V0Q2Fub25pY2FsQ29va2llKAorICAgICAgbmV0OjpDYW5vbmljYWxDb29raWUoCisgICAgICAgICAgIkMiLCAiRCIsICJkb21haW4yLnRlc3QiLCAiL3dpdGgvbG9uZ2VyL3BhdGgiLCBiYXNlOjpUaW1lKCksCisgICAgICAgICAgYmFzZTo6VGltZSgpLCBiYXNlOjpUaW1lKCksIC8qc2VjdXJlPSovZmFsc2UsIC8qaHR0cG9ubHk9Ki9mYWxzZSwKKyAgICAgICAgICBuZXQ6OkNvb2tpZVNhbWVTaXRlOjpOT19SRVNUUklDVElPTiwgbmV0OjpDT09LSUVfUFJJT1JJVFlfTUVESVVNKSwKKyAgICAgICJodHRwcyIsIHRydWUpKTsKKyAgLy8gbm90IHNldCAoVU5LTk9XTikKKyAgRVhQRUNUX1RSVUUoU2V0Q2Fub25pY2FsQ29va2llKAorICAgICAgbmV0OjpDYW5vbmljYWxDb29raWUoCisgICAgICAgICAgIkh0dHBPbmx5IiwgIkYiLCAiZG9tYWluMy50ZXN0IiwgIi93aXRoL3BhdGgiLCBiYXNlOjpUaW1lKCksCisgICAgICAgICAgYmFzZTo6VGltZSgpLCBiYXNlOjpUaW1lKCksIC8qc2VjdXJlPSovZmFsc2UsCisgICAgICAgICAgLypodHRwb25seT0qL3RydWUsIG5ldDo6Q29va2llU2FtZVNpdGU6Ok5PX1JFU1RSSUNUSU9OLAorICAgICAgICAgIG5ldDo6Q09PS0lFX1BSSU9SSVRZX01FRElVTSksCisgICAgICAiaHR0cHMiLCB0cnVlKSk7CisgIC8vIE5PTkxFR0FDWQorICBFWFBFQ1RfVFJVRShTZXRDYW5vbmljYWxDb29raWUoCisgICAgICBuZXQ6OkNhbm9uaWNhbENvb2tpZSgKKyAgICAgICAgICAiU2VjdXJlIiwgIkUiLCAiLmRvbWFpbndpdGhkb3QudGVzdCIsICIvIiwgYmFzZTo6VGltZSgpLCBiYXNlOjpUaW1lKCksCisgICAgICAgICAgYmFzZTo6VGltZSgpLCAvKnNlY3VyZT0qL3RydWUsCisgICAgICAgICAgLypodHRwb25seT0qL2ZhbHNlLCBuZXQ6OkNvb2tpZVNhbWVTaXRlOjpOT19SRVNUUklDVElPTiwKKyAgICAgICAgICBuZXQ6OkNPT0tJRV9QUklPUklUWV9NRURJVU0pLAorICAgICAgImh0dHBzIiwgdHJ1ZSkpOworCisgIHN0ZDo6dmVjdG9yPG5ldDo6Q29va2llQWNjZXNzU2VtYW50aWNzPiBhY2Nlc3Nfc2VtYW50aWNzX2xpc3Q7CisgIHN0ZDo6dmVjdG9yPG5ldDo6Q2Fub25pY2FsQ29va2llPiBjb29raWVzID0KKyAgICAgIHNlcnZpY2Vfd3JhcHBlcigpLT5HZXRBbGxDb29raWVzV2l0aEFjY2Vzc1NlbWFudGljcygKKyAgICAgICAgICAmYWNjZXNzX3NlbWFudGljc19saXN0KTsKKworICBBU1NFUlRfRVEoNHUsIGNvb2tpZXMuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKGNvb2tpZXMuc2l6ZSgpLCBhY2Nlc3Nfc2VtYW50aWNzX2xpc3Quc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKCJkb21haW4xLnRlc3QiLCBjb29raWVzWzBdLkRvbWFpbigpKTsKKyAgRVhQRUNUX0VRKCJkb21haW4yLnRlc3QiLCBjb29raWVzWzFdLkRvbWFpbigpKTsKKyAgRVhQRUNUX0VRKCJkb21haW4zLnRlc3QiLCBjb29raWVzWzJdLkRvbWFpbigpKTsKKyAgRVhQRUNUX0VRKCIuZG9tYWlud2l0aGRvdC50ZXN0IiwgY29va2llc1szXS5Eb21haW4oKSk7CisKKyAgRVhQRUNUX0VRKG5ldDo6Q29va2llQWNjZXNzU2VtYW50aWNzOjpVTktOT1dOLCBhY2Nlc3Nfc2VtYW50aWNzX2xpc3RbMF0pOworICBFWFBFQ1RfRVEobmV0OjpDb29raWVBY2Nlc3NTZW1hbnRpY3M6OkxFR0FDWSwgYWNjZXNzX3NlbWFudGljc19saXN0WzFdKTsKKyAgRVhQRUNUX0VRKG5ldDo6Q29va2llQWNjZXNzU2VtYW50aWNzOjpVTktOT1dOLCBhY2Nlc3Nfc2VtYW50aWNzX2xpc3RbMl0pOworICBFWFBFQ1RfRVEobmV0OjpDb29raWVBY2Nlc3NTZW1hbnRpY3M6Ok5PTkxFR0FDWSwgYWNjZXNzX3NlbWFudGljc19saXN0WzNdKTsKK30KKwogVEVTVF9GKENvb2tpZU1hbmFnZXJUZXN0LCBHZXRDb29raWVMaXN0KSB7CiAgIC8vIFNldCBzb21lIGNvb2tpZXMgZm9yIHRoZSB0ZXN0IHRvIHBsYXkgd2l0aC4KICAgRVhQRUNUX1RSVUUoU2V0Q2Fub25pY2FsQ29va2llKApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbmV0d29yay9wdWJsaWMvY3BwL2Nvb2tpZV9tYW5hZ2VyLnR5cGVtYXAgYi9zZXJ2aWNlcy9uZXR3b3JrL3B1YmxpYy9jcHAvY29va2llX21hbmFnZXIudHlwZW1hcAppbmRleCBkZTkzODRiZC4uYTM2NTczNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvbmV0d29yay9wdWJsaWMvY3BwL2Nvb2tpZV9tYW5hZ2VyLnR5cGVtYXAKKysrIGIvc2VydmljZXMvbmV0d29yay9wdWJsaWMvY3BwL2Nvb2tpZV9tYW5hZ2VyLnR5cGVtYXAKQEAgLTE3LDYgKzE3LDcgQEAKICAgIm5ldHdvcmsubW9qb20uQ29va2llUHJpb3JpdHk9OjpuZXQ6OkNvb2tpZVByaW9yaXR5IiwKICAgIm5ldHdvcmsubW9qb20uQ29va2llU2FtZVNpdGU9OjpuZXQ6OkNvb2tpZVNhbWVTaXRlIiwKICAgIm5ldHdvcmsubW9qb20uQ29va2llU2FtZVNpdGVDb250ZXh0PTo6bmV0OjpDb29raWVPcHRpb25zOjpTYW1lU2l0ZUNvb2tpZUNvbnRleHQiLAorICAibmV0d29yay5tb2pvbS5Db29raWVBY2Nlc3NTZW1hbnRpY3M9OjpuZXQ6OkNvb2tpZUFjY2Vzc1NlbWFudGljcyIsCiAgICJuZXR3b3JrLm1vam9tLkNvb2tpZU9wdGlvbnM9OjpuZXQ6OkNvb2tpZU9wdGlvbnMiLAogICAibmV0d29yay5tb2pvbS5DYW5vbmljYWxDb29raWU9OjpuZXQ6OkNhbm9uaWNhbENvb2tpZSIsCiAgICJuZXR3b3JrLm1vam9tLkNvb2tpZUluY2x1c2lvblN0YXR1c1dhcm5pbmdSZWFzb249OjpuZXQ6OkNhbm9uaWNhbENvb2tpZTo6Q29va2llSW5jbHVzaW9uU3RhdHVzOjpXYXJuaW5nUmVhc29uIiwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL25ldHdvcmsvcHVibGljL2NwcC9jb29raWVfbWFuYWdlcl9tb2pvbV90cmFpdHMuY2MgYi9zZXJ2aWNlcy9uZXR3b3JrL3B1YmxpYy9jcHAvY29va2llX21hbmFnZXJfbW9qb21fdHJhaXRzLmNjCmluZGV4IDZmMzQ2MWZmLi4wNjcwNThkOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbmV0d29yay9wdWJsaWMvY3BwL2Nvb2tpZV9tYW5hZ2VyX21vam9tX3RyYWl0cy5jYworKysgYi9zZXJ2aWNlcy9uZXR3b3JrL3B1YmxpYy9jcHAvY29va2llX21hbmFnZXJfbW9qb21fdHJhaXRzLmNjCkBAIC04Niw2ICs4Niw0MyBAQAogICByZXR1cm4gZmFsc2U7CiB9CiAKK25ldHdvcms6Om1vam9tOjpDb29raWVBY2Nlc3NTZW1hbnRpY3MgRW51bVRyYWl0czwKKyAgICBuZXR3b3JrOjptb2pvbTo6Q29va2llQWNjZXNzU2VtYW50aWNzLAorICAgIG5ldDo6Q29va2llQWNjZXNzU2VtYW50aWNzPjo6VG9Nb2pvbShuZXQ6OkNvb2tpZUFjY2Vzc1NlbWFudGljcyBpbnB1dCkgeworICBzd2l0Y2ggKGlucHV0KSB7CisgICAgY2FzZSBuZXQ6OkNvb2tpZUFjY2Vzc1NlbWFudGljczo6VU5LTk9XTjoKKyAgICAgIHJldHVybiBuZXR3b3JrOjptb2pvbTo6Q29va2llQWNjZXNzU2VtYW50aWNzOjpVTktOT1dOOworICAgIGNhc2UgbmV0OjpDb29raWVBY2Nlc3NTZW1hbnRpY3M6Ok5PTkxFR0FDWToKKyAgICAgIHJldHVybiBuZXR3b3JrOjptb2pvbTo6Q29va2llQWNjZXNzU2VtYW50aWNzOjpOT05MRUdBQ1k7CisgICAgY2FzZSBuZXQ6OkNvb2tpZUFjY2Vzc1NlbWFudGljczo6TEVHQUNZOgorICAgICAgcmV0dXJuIG5ldHdvcms6Om1vam9tOjpDb29raWVBY2Nlc3NTZW1hbnRpY3M6OkxFR0FDWTsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgTk9UUkVBQ0hFRCgpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8bmV0d29yazo6bW9qb206OkNvb2tpZUFjY2Vzc1NlbWFudGljcz4oaW5wdXQpOworfQorCitib29sIEVudW1UcmFpdHM8bmV0d29yazo6bW9qb206OkNvb2tpZUFjY2Vzc1NlbWFudGljcywKKyAgICAgICAgICAgICAgICBuZXQ6OkNvb2tpZUFjY2Vzc1NlbWFudGljcz46OgorICAgIEZyb21Nb2pvbShuZXR3b3JrOjptb2pvbTo6Q29va2llQWNjZXNzU2VtYW50aWNzIGlucHV0LAorICAgICAgICAgICAgICBuZXQ6OkNvb2tpZUFjY2Vzc1NlbWFudGljcyogb3V0cHV0KSB7CisgIHN3aXRjaCAoaW5wdXQpIHsKKyAgICBjYXNlIG5ldHdvcms6Om1vam9tOjpDb29raWVBY2Nlc3NTZW1hbnRpY3M6OlVOS05PV046CisgICAgICAqb3V0cHV0ID0gbmV0OjpDb29raWVBY2Nlc3NTZW1hbnRpY3M6OlVOS05PV047CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlIG5ldHdvcms6Om1vam9tOjpDb29raWVBY2Nlc3NTZW1hbnRpY3M6Ok5PTkxFR0FDWToKKyAgICAgICpvdXRwdXQgPSBuZXQ6OkNvb2tpZUFjY2Vzc1NlbWFudGljczo6Tk9OTEVHQUNZOworICAgICAgcmV0dXJuIHRydWU7CisgICAgY2FzZSBuZXR3b3JrOjptb2pvbTo6Q29va2llQWNjZXNzU2VtYW50aWNzOjpMRUdBQ1k6CisgICAgICAqb3V0cHV0ID0gbmV0OjpDb29raWVBY2Nlc3NTZW1hbnRpY3M6OkxFR0FDWTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKIG5ldHdvcms6Om1vam9tOjpDb29raWVJbmNsdXNpb25TdGF0dXNXYXJuaW5nUmVhc29uCiBFbnVtVHJhaXRzPG5ldHdvcms6Om1vam9tOjpDb29raWVJbmNsdXNpb25TdGF0dXNXYXJuaW5nUmVhc29uLAogICAgICAgICAgICBuZXQ6OkNhbm9uaWNhbENvb2tpZTo6Q29va2llSW5jbHVzaW9uU3RhdHVzOjpXYXJuaW5nUmVhc29uPjo6CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9uZXR3b3JrL3B1YmxpYy9jcHAvY29va2llX21hbmFnZXJfbW9qb21fdHJhaXRzLmggYi9zZXJ2aWNlcy9uZXR3b3JrL3B1YmxpYy9jcHAvY29va2llX21hbmFnZXJfbW9qb21fdHJhaXRzLmgKaW5kZXggZTVhMzQ1Yi4uODczMGRlNTQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL25ldHdvcmsvcHVibGljL2NwcC9jb29raWVfbWFuYWdlcl9tb2pvbV90cmFpdHMuaAorKysgYi9zZXJ2aWNlcy9uZXR3b3JrL3B1YmxpYy9jcHAvY29va2llX21hbmFnZXJfbW9qb21fdHJhaXRzLmgKQEAgLTI5LDYgKzI5LDE1IEBACiB9OwogCiB0ZW1wbGF0ZSA8Pgorc3RydWN0IEVudW1UcmFpdHM8bmV0d29yazo6bW9qb206OkNvb2tpZUFjY2Vzc1NlbWFudGljcywKKyAgICAgICAgICAgICAgICAgIG5ldDo6Q29va2llQWNjZXNzU2VtYW50aWNzPiB7CisgIHN0YXRpYyBuZXR3b3JrOjptb2pvbTo6Q29va2llQWNjZXNzU2VtYW50aWNzIFRvTW9qb20oCisgICAgICBuZXQ6OkNvb2tpZUFjY2Vzc1NlbWFudGljcyBpbnB1dCk7CisgIHN0YXRpYyBib29sIEZyb21Nb2pvbShuZXR3b3JrOjptb2pvbTo6Q29va2llQWNjZXNzU2VtYW50aWNzIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgbmV0OjpDb29raWVBY2Nlc3NTZW1hbnRpY3MqIG91dHB1dCk7Cit9OworCit0ZW1wbGF0ZSA8Pgogc3RydWN0IEVudW1UcmFpdHM8bmV0d29yazo6bW9qb206OkNvb2tpZUluY2x1c2lvblN0YXR1c1dhcm5pbmdSZWFzb24sCiAgICAgICAgICAgICAgICAgICBuZXQ6OkNhbm9uaWNhbENvb2tpZTo6Q29va2llSW5jbHVzaW9uU3RhdHVzOjpXYXJuaW5nUmVhc29uPiB7CiAgIHN0YXRpYyBuZXR3b3JrOjptb2pvbTo6Q29va2llSW5jbHVzaW9uU3RhdHVzV2FybmluZ1JlYXNvbiBUb01vam9tKApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbmV0d29yay9wdWJsaWMvY3BwL2Nvb2tpZV9tYW5hZ2VyX21vam9tX3RyYWl0c191bml0dGVzdC5jYyBiL3NlcnZpY2VzL25ldHdvcmsvcHVibGljL2NwcC9jb29raWVfbWFuYWdlcl9tb2pvbV90cmFpdHNfdW5pdHRlc3QuY2MKaW5kZXggNzhkY2Y5Yi4uYjg3MjM4Y2QgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL25ldHdvcmsvcHVibGljL2NwcC9jb29raWVfbWFuYWdlcl9tb2pvbV90cmFpdHNfdW5pdHRlc3QuY2MKKysrIGIvc2VydmljZXMvbmV0d29yay9wdWJsaWMvY3BwL2Nvb2tpZV9tYW5hZ2VyX21vam9tX3RyYWl0c191bml0dGVzdC5jYwpAQCAtMTE3LDcgKzExNyw4IEBACiBURVNUKENvb2tpZU1hbmFnZXJUcmFpdHNUZXN0LCBSb3VuZHRyaXBzX0Nvb2tpZVNhbWVTaXRlKSB7CiAgIGZvciAobmV0OjpDb29raWVTYW1lU2l0ZSBjb29raWVfc3RhdGUgOgogICAgICAgIHtuZXQ6OkNvb2tpZVNhbWVTaXRlOjpOT19SRVNUUklDVElPTiwgbmV0OjpDb29raWVTYW1lU2l0ZTo6TEFYX01PREUsCi0gICAgICAgIG5ldDo6Q29va2llU2FtZVNpdGU6OlNUUklDVF9NT0RFfSkgeworICAgICAgICBuZXQ6OkNvb2tpZVNhbWVTaXRlOjpTVFJJQ1RfTU9ERSwgbmV0OjpDb29raWVTYW1lU2l0ZTo6RVhURU5ERURfTU9ERSwKKyAgICAgICAgbmV0OjpDb29raWVTYW1lU2l0ZTo6VU5TUEVDSUZJRUR9KSB7CiAgICAgbmV0OjpDb29raWVTYW1lU2l0ZSByb3VuZHRyaXA7CiAgICAgQVNTRVJUX1RSVUUoU2VyaWFsaXplQW5kRGVzZXJpYWxpemVFbnVtPG1vam9tOjpDb29raWVTYW1lU2l0ZT4oY29va2llX3N0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyb3VuZHRyaXApKTsKQEAgLTEyNSw2ICsxMjYsMTggQEAKICAgfQogfQogCitURVNUKENvb2tpZU1hbmFnZXJUcmFpdHNUZXN0LCBSb3VuZHRyaXBzX0Nvb2tpZUFjY2Vzc1NlbWFudGljcykgeworICBmb3IgKG5ldDo6Q29va2llQWNjZXNzU2VtYW50aWNzIGFjY2Vzc19zZW1hbnRpY3MgOgorICAgICAgIHtuZXQ6OkNvb2tpZUFjY2Vzc1NlbWFudGljczo6VU5LTk9XTiwKKyAgICAgICAgbmV0OjpDb29raWVBY2Nlc3NTZW1hbnRpY3M6Ok5PTkxFR0FDWSwKKyAgICAgICAgbmV0OjpDb29raWVBY2Nlc3NTZW1hbnRpY3M6OkxFR0FDWX0pIHsKKyAgICBuZXQ6OkNvb2tpZUFjY2Vzc1NlbWFudGljcyByb3VuZHRyaXA7CisgICAgQVNTRVJUX1RSVUUoU2VyaWFsaXplQW5kRGVzZXJpYWxpemVFbnVtPG1vam9tOjpDb29raWVBY2Nlc3NTZW1hbnRpY3M+KAorICAgICAgICBhY2Nlc3Nfc2VtYW50aWNzLCAmcm91bmR0cmlwKSk7CisgICAgRVhQRUNUX0VRKGFjY2Vzc19zZW1hbnRpY3MsIHJvdW5kdHJpcCk7CisgIH0KK30KKwogVEVTVChDb29raWVNYW5hZ2VyVHJhaXRzVGVzdCwgUm91bmR0cmlwc19Db29raWVTYW1lU2l0ZUNvbnRleHQpIHsKICAgZm9yIChuZXQ6OkNvb2tpZU9wdGlvbnM6OlNhbWVTaXRlQ29va2llQ29udGV4dCBjb250ZXh0X3N0YXRlIDoKICAgICAgICB7bmV0OjpDb29raWVPcHRpb25zOjpTYW1lU2l0ZUNvb2tpZUNvbnRleHQ6OkNST1NTX1NJVEUsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9uZXR3b3JrL3B1YmxpYy9jcHAvcmVzb3VyY2VfcmVxdWVzdC5oIGIvc2VydmljZXMvbmV0d29yay9wdWJsaWMvY3BwL3Jlc291cmNlX3JlcXVlc3QuaAppbmRleCAwOGM3MTJjLi5mOGNkMTg4MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbmV0d29yay9wdWJsaWMvY3BwL3Jlc291cmNlX3JlcXVlc3QuaAorKysgYi9zZXJ2aWNlcy9uZXR3b3JrL3B1YmxpYy9jcHAvcmVzb3VyY2VfcmVxdWVzdC5oCkBAIC01OSw4ICs1OSw1MiBAQAogICBHVVJMIHNpdGVfZm9yX2Nvb2tpZXM7CiAgIGJvb2wgYXR0YWNoX3NhbWVfc2l0ZV9jb29raWVzID0gZmFsc2U7CiAgIGJvb2wgdXBkYXRlX2ZpcnN0X3BhcnR5X3VybF9vbl9yZWRpcmVjdCA9IGZhbHNlOworCisgIC8vIHxyZXF1ZXN0X2luaXRpYXRvcnwgaW5kaWNhdGVzIHRoZSBvcmlnaW4gaW5pdGlhdGluZyB0aGUgUmVzb3VyY2VSZXF1ZXN0LgorICAvLworICAvLyB8cmVxdWVzdF9pbml0aWF0b3J8IGlzIGJhc2U6Om51bGxvcHQgZm9yIGJyb3dzZXItaW5pdGlhdGVkIHJlcXVlc3RzIChlLmcuCisgIC8vIG5hdmlnYXRpb25zIGluaXRpYXRlZCB2aWEgb21uaWJveCBvciBib29rbWFya3MsIGludGVybmFsIHN1YnJzb3VyY2UKKyAgLy8gcmVxdWVzdHMgbGlrZSBmZXRjaGluZyB0aGUgU2FmZUJyb3dzaW5nIGRhdGEsIGV0Yy4pLgorICAvLworICAvLyBGb3IgYWxsIHJlcXVlc3RzIGluaXRpYXRlZCB2aWEgd2ViIChib3RoIHN1YnJlc291cmNlIHJlcXVlc3RzIGFuZAorICAvLyBuYXZpZ2F0aW9ucyksIHxyZXF1ZXN0X2luaXRpYXRvcnwgaXMgYWx3YXlzIHNldCB0byB0aGUgb3JpZ2luIG9mIHRoZSBmcmFtZQorICAvLyB0aGF0IGhhcyBpbml0aWF0ZWQgdGhlIHJlcXVlc3QuICBUaGlzIGlzIHRydWUgZXZlbiBpZiB0aGUgcmVxdWVzdCBtaWdodAorICAvLyBoYXZlIGJlZW4gaW5pdGlhdGVkIGJ5IGFuIGlzb2xhdGVkIHdvcmxkIChlLmcuIGZyb20gYSBjb250ZW50IHNjcmlwdCBvZiBhbgorICAvLyBleHRlbnNpb24sIHdpdGggaXRzIG93biwgc2VwYXJhdGUgb3JpZ2luKS4gIFRoaXMgbmVlZHMgdG8gYmUgdHJ1ZSBldmVuIGlmCisgIC8vIHRoZSByZXF1ZXN0IG1pZ2h0IGJlICJwcm94aWVkIiBpbiB0aGUgYnJvd3NlciBwcm9jZXNzIG9uIGJlaGFsZiBvZiBhIHdlYgorICAvLyBvcmlnaW4gKGUuZy4gYXMgaXMgdGhlIGNhc2UgZm9yIFBheW1lbnRSZXF1ZXN0IEFQSSkuCisgIC8vCisgIC8vIHxyZXF1ZXN0X2luaXRpYXRvcnwgaXMgY29uc3VsdGVkIGluIGEgdmFyaWV0eSBvZiBzZWN1cml0eSBmZWF0dXJlcywKKyAgLy8gaW5jbHVkaW5nOiBjYWxjdWxhdGluZyBTZWMtRmV0Y2gtU2l0ZSByZXF1ZXN0IGhlYWRlciwgZGV0ZXJtaW5pbmcgaWYgdGhlCisgIC8vIHJlcXVlc3Qgc2hvdWxkIGJlIHN1YmplY3QgdG8gQ09SUywgZGV0ZXJtaW5pbmcgaWYgQ09SQiBhbmQvb3IgQ09SUCBzaG91bGQKKyAgLy8gYmxvY2sgdGhlIHJlc3BvbnNlLCBkZXRlcm1pbmluZyBpZiBTYW1lU2l0ZT1zdHJpY3QgY29va2llcyBzaG91bGQgYmUgc2VudCwKKyAgLy8gZXRjLgorICAvLworICAvLyBTZWUgYWxzbzoKKyAgLy8gLSB8aXNvbGF0ZWRfd29ybGRfb3JpZ2lufAorICAvLyAtIFVSTExvYWRlckZhY3RvcnlQYXJhbXM6OnJlcXVlc3RfaW5pdGlhdG9yX3NpdGVfbG9jawogICBiYXNlOjpPcHRpb25hbDx1cmw6Ok9yaWdpbj4gcmVxdWVzdF9pbml0aWF0b3I7CisKKyAgLy8gSWYgdGhpcyBpcyBhIHN1YnJlc291cmNlIHJlcXVlc3QgaW5pdGlhdGVkIGZyb20gYW4gaXNvbGF0ZWQgd29ybGQgKGUuZy4KKyAgLy8gZnJvbSBhIGNvbnRlbnQgc2NyaXB0IG9mIGEgQ2hyb21lIEV4dGVuc2lvbiksIHRoZW4gfGlzb2xhdGVkX3dvcmxkX29yaWdpbnwKKyAgLy8gaW5kaWNhdGVzIHRoZSBvcmlnaW4gb2YgdGhlIGlzb2xhdGVkIHdvcmxkLiAgT3RoZXJ3aXNlLAorICAvLyB8aXNvbGF0ZWRfd29ybGRfb3JpZ2lufCBpcyBzZXQgdG8gYmFzZTo6bnVsbG9wdC4KKyAgLy8KKyAgLy8gRXhhbXBsZSAjMTogWEhSIGluaXRpYXRlZCBmcm9tIGEgY29udGVudCBzY3JpcHQgb2YgY2hyb21lLWV4dGVuc2lvbjovL2ZvbworICAvLyB0aGF0IHdhcyBpbmplY3RlZCBpbnRvIGEgaHR0cHM6Ly9leGFtcGxlLmNvbSB3ZWIgZnJhbWU6CisgIC8vIC0gfHJlcXVlc3RfaW5pdGlhdG9yfCBpcyAiaHR0cHM6Ly9leGFtcGxlLmNvbSIKKyAgLy8gLSB8aXNvbGF0ZWRfd29ybGRfb3JpZ2lufCBpcyAiY2hyb21lLWV4dGVuc2lvbjovL2ZvbyIKKyAgLy8KKyAgLy8gRXhhbXBsZSAjMjogWEhSIGluaXRpYXRlZCBmcm9tIGEgQ2hyb21lIEV4dGVuc2lvbiBmcmFtZSAoZS5nLiBmcm9tIGFuCisgIC8vIGV4dGVuc2lvbiBiYWNrZ3JvdW5kIHBhZ2UpOgorICAvLyAtIHxyZXF1ZXN0X2luaXRpYXRvcnwgaXMgImNocm9tZS1leHRlbnNpb246Ly9mb28iCisgIC8vIC0gfGlzb2xhdGVkX3dvcmxkX29yaWdpbnwgaXMgYmFzZTo6bnVsbG9wdCAodGhpcyByZXF1ZXN0IGlzIG5vdCBhc3NvY2lhdGVkCisgIC8vIHdpdGggYW4gaXNvbGF0ZWQgd29ybGQpCisgIC8vCisgIC8vIHxpc29sYXRlZF93b3JsZF9vcmlnaW58IGlzIGNvbnN1bHRlZCBieSBPT1ItQ09SUywgdG8gZGV0ZXJtaW5lIGlmIHRoaXMKKyAgLy8gcmVxdWVzdCBtaWdodCBuZWVkIHRvIGJlIGV4ZW1wdCBmcm9tIENPUlMsIGJhc2VkIG9uIE9yaWdpbkFjY2Vzc0xpc3QuCiAgIGJhc2U6Ok9wdGlvbmFsPHVybDo6T3JpZ2luPiBpc29sYXRlZF93b3JsZF9vcmlnaW47CisKICAgR1VSTCByZWZlcnJlcjsKICAgbmV0OjpVUkxSZXF1ZXN0OjpSZWZlcnJlclBvbGljeSByZWZlcnJlcl9wb2xpY3kgPQogICAgICAgbmV0OjpVUkxSZXF1ZXN0OjpORVZFUl9DTEVBUl9SRUZFUlJFUjsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL25ldHdvcmsvcHVibGljL21vam9tL2Nvb2tpZV9tYW5hZ2VyLm1vam9tIGIvc2VydmljZXMvbmV0d29yay9wdWJsaWMvbW9qb20vY29va2llX21hbmFnZXIubW9qb20KaW5kZXggNjk5MDNlYi4uYzY5YjIwOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbmV0d29yay9wdWJsaWMvbW9qb20vY29va2llX21hbmFnZXIubW9qb20KKysrIGIvc2VydmljZXMvbmV0d29yay9wdWJsaWMvbW9qb20vY29va2llX21hbmFnZXIubW9qb20KQEAgLTUyLDcgKzUyLDYgQEAKICAgTEFYX01PREUgPSAxLAogICBTVFJJQ1RfTU9ERSA9IDIsCiAgIEVYVEVOREVEX01PREUgPSAzLAotICAvLyA0IGlzIHJlc2VydmVkOiBMQVhfTU9ERV9BTExPV19VTlNBRkUgaXMgbm90IHVzZWQgaGVyZS4KIH07CiAKIGVudW0gQ29va2llU2FtZVNpdGVDb250ZXh0IHsKQEAgLTYyLDYgKzYxLDE1IEBACiAgIFNBTUVfU0lURV9TVFJJQ1QKIH07CiAKKy8vIFdoYXQgcnVsZXMgdG8gYXBwbHkgd2hlbiBkZXRlcm1pbmluZyB3aGV0aGVyIGFjY2VzcyB0byBhIHBhcnRpY3VsYXIgY29va2llIGlzCisvLyBhbGxvd2VkLgorLy8gS2VlcCBpbiBzeW5jIHdpdGggbmV0L2Nvb2tpZXMvY29va2llX2NvbnN0YW50cy5oLgorZW51bSBDb29raWVBY2Nlc3NTZW1hbnRpY3MgeworICBVTktOT1dOID0gLTEsCisgIE5PTkxFR0FDWSA9IDAsCisgIExFR0FDWSwKK307CisKIC8vIEtlZXAgZGVmYXVsdHMgaGVyZSBpbiBzeW5jIHdpdGggbmV0L2Nvb2tpZXMvY29va2llX29wdGlvbnMuY2MuCiBzdHJ1Y3QgQ29va2llT3B0aW9ucyB7CiAgIGJvb2wgZXhjbHVkZV9odHRwb25seSA9IHRydWU7CkBAIC0yMTUsNiArMjIzLDIxIEBACiAgIC8vIG9uIG9yaWdpbi4gIFNob3VsZCB0aGUgcmV0dXJuZWQgY29va2llcyBhbHNvIGJlIHNvcnRlZCBieSBvcmlnaW4/CiAgIEdldEFsbENvb2tpZXMoKSA9PiAoYXJyYXk8Q2Fub25pY2FsQ29va2llPiBjb29raWVzKTsKIAorICAvLyBHZXQgYWxsIHRoZSBjb29raWVzIGtub3duIHRvIHRoZSBzZXJ2aWNlLgorICAvLyBSZXR1cm5lZCBjb29raWUgbGlzdCBpcyBzb3J0ZWQgZmlyc3QgYnkgcGF0aCBsZW5ndGggKGxvbmdlc3QgZmlyc3QpCisgIC8vIGFuZCBzZWNvbmQgYnkgY3JlYXRpb24gdGltZS4KKyAgLy8gQWRkaXRpb25hbGx5IGdldCBhIGxpc3Qgb2YgdGhlIENvb2tpZUFjY2Vzc1NlbWFudGljcyB0aGF0IGFwcGxpZXMgdG8gZWFjaCwKKyAgLy8gaWYga25vd24uIFRoZSB8YWNjZXNzX3NlbWFudGljc19saXN0fCBpcyBndWFyYW50ZWVkIHRvIGJlIHRoZSBzYW1lIGxlbmd0aAorICAvLyBhcyB8Y29va2llc3wsIHdpdGggZWFjaCBlbGVtZW50IGluIHxjb29raWVzfCBoYXZpbmcgdGhlIGFjY2VzcyBzZW1hbnRpY3MKKyAgLy8gd2hpY2ggaXMgZ2l2ZW4gYnkgdGhlIHNhbWUgaW5kZXggaW4gfGFjY2Vzc19zZW1hbnRpY3NfbGlzdHwuIElmIHRoaXMgbWV0aG9kCisgIC8vIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgdW5kZXJseWluZyBDb29raWVTdG9yZSwgdGhlIHJldHVybmVkCisgIC8vIHxhY2Nlc3Nfc2VtYW50aWNzX2xpc3R8IHdpbGwganVzdCBjb250YWluIGFsbCBVTktOT1dOcy4gSWYgaXQgaXMKKyAgLy8gc3VwcG9ydGVkLCB0aGUgYWNjZXNzIHNlbWFudGljcyB2YWx1ZXMgd2lsbCBoYXZlIGJlZW4gZGV0ZXJtaW5lZCBieQorICAvLyBxdWVyeWluZyB0aGUgQ29va2llU3RvcmUncyBDb29raWVBY2Nlc3NEZWxlZ2F0ZS4KKyAgR2V0QWxsQ29va2llc1dpdGhBY2Nlc3NTZW1hbnRpY3MoKQorICAgICAgPT4gKGFycmF5PENhbm9uaWNhbENvb2tpZT4gY29va2llcywKKyAgICAgICAgICBhcnJheTxDb29raWVBY2Nlc3NTZW1hbnRpY3M+IGFjY2Vzc19zZW1hbnRpY3NfbGlzdCk7CisKICAgLy8gR2V0IGFsbCBjb29raWVzIGZvciB0aGUgc3BlY2lmaWVkIFVSTCBhbmQgY29va2llIG9wdGlvbnMuCiAgIC8vIFJldHVybmVkIGNvb2tpZSBsaXN0IGlzIHNvcnRlZCBmaXJzdCBieSBwYXRoIGxlbmd0aCAobG9uZ2VzdCBmaXJzdCkKICAgLy8gYW5kIHNlY29uZCBieSBjcmVhdGlvbiB0aW1lLiBJZiB0aGUgfHJldHVybl9leGNsdWRlZF9jb29raWVzfCBvcHRpb24gaXMgc2V0CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9uZXR3b3JrL3B1YmxpYy9tb2pvbS9zc2xfY29uZmlnLm1vam9tIGIvc2VydmljZXMvbmV0d29yay9wdWJsaWMvbW9qb20vc3NsX2NvbmZpZy5tb2pvbQppbmRleCA5NTYwYWUxLi5iOTdhNzAxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9uZXR3b3JrL3B1YmxpYy9tb2pvbS9zc2xfY29uZmlnLm1vam9tCisrKyBiL3NlcnZpY2VzL25ldHdvcmsvcHVibGljL21vam9tL3NzbF9jb25maWcubW9qb20KQEAgLTIwLDYgKzIwLDEwIEBACiAgIGJvb2wgc2hhMV9sb2NhbF9hbmNob3JzX2VuYWJsZWQgPSBmYWxzZTsKICAgYm9vbCBzeW1hbnRlY19lbmZvcmNlbWVudF9kaXNhYmxlZCA9IGZhbHNlOwogCisgIC8vIElmIHRydWUsIGVuYWJsZXMgVExTIDEuMyBkb3duZ3JhZGUgaGFyZGVuaW5nIGZvciBjb25uZWN0aW9ucyB1c2luZyBsb2NhbAorICAvLyB0cnVzdCBhbmNob3JzLiAoSGFyZGVuaW5nIGZvciBrbm93biByb290cyBpcyBhbHdheXMgZW5hYmxlZC4pCisgIGJvb2wgdGxzMTNfaGFyZGVuaW5nX2Zvcl9sb2NhbF9hbmNob3JzX2VuYWJsZWQgPSBmYWxzZTsKKwogICAvLyBTU0wgMi4wIGFuZCAzLjAgYXJlIG5vdCBzdXBwb3J0ZWQuIE5vdGUgdGhlc2UgbGluZXMgbXVzdCBiZSBrZXB0IGluIHN5bmMKICAgLy8gd2l0aCBuZXQvc3NsL3NzbF9jb25maWcuY2MuCiAgIFNTTFZlcnNpb24gdmVyc2lvbl9taW4gPSBrVExTMTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL25ldHdvcmsvc3NsX2NvbmZpZ19zZXJ2aWNlX21vam9fdW5pdHRlc3QuY2MgYi9zZXJ2aWNlcy9uZXR3b3JrL3NzbF9jb25maWdfc2VydmljZV9tb2pvX3VuaXR0ZXN0LmNjCmluZGV4IGQ0NWZhZmMuLmU3YjExOTkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL25ldHdvcmsvc3NsX2NvbmZpZ19zZXJ2aWNlX21vam9fdW5pdHRlc3QuY2MKKysrIGIvc2VydmljZXMvbmV0d29yay9zc2xfY29uZmlnX3NlcnZpY2VfbW9qb191bml0dGVzdC5jYwpAQCAtNDMwLDYgKzQzMCwxNiBAQAogICBSdW5Db252ZXJzaW9uVGVzdHMoKm1vam9fY29uZmlnLCBleHBlY3RlZF9uZXRfY29uZmlnKTsKIH0KIAorVEVTVF9GKE5ldHdvcmtTZXJ2aWNlU1NMQ29uZmlnU2VydmljZVRlc3QsIEluaXRpYWxDb25maWdUTFMxM0hhcmRlbmluZykgeworICBuZXQ6OlNTTENvbnRleHRDb25maWcgZXhwZWN0ZWRfbmV0X2NvbmZpZzsKKyAgZXhwZWN0ZWRfbmV0X2NvbmZpZy50bHMxM19oYXJkZW5pbmdfZm9yX2xvY2FsX2FuY2hvcnNfZW5hYmxlZCA9IHRydWU7CisKKyAgbW9qb206OlNTTENvbmZpZ1B0ciBtb2pvX2NvbmZpZyA9IG1vam9tOjpTU0xDb25maWc6Ok5ldygpOworICBtb2pvX2NvbmZpZy0+dGxzMTNfaGFyZGVuaW5nX2Zvcl9sb2NhbF9hbmNob3JzX2VuYWJsZWQgPSB0cnVlOworCisgIFJ1bkNvbnZlcnNpb25UZXN0cygqbW9qb19jb25maWcsIGV4cGVjdGVkX25ldF9jb25maWcpOworfQorCiBURVNUX0YoTmV0d29ya1NlcnZpY2VTU0xDb25maWdTZXJ2aWNlVGVzdCwgQ2FuU2hhcmVDb25uZWN0aW9uV2l0aENsaWVudENlcnRzKSB7CiAgIC8vIENyZWF0ZSBhIGRlZmF1bHQgTmV0d29ya0NvbnRleHQgYW5kIHRlc3QgdGhhdAogICAvLyBDYW5TaGFyZUNvbm5lY3Rpb25XaXRoQ2xpZW50Q2VydHMgcmV0dXJucyBmYWxzZS4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL25ldHdvcmsvc3NsX2NvbmZpZ190eXBlX2NvbnZlcnRlci5jYyBiL3NlcnZpY2VzL25ldHdvcmsvc3NsX2NvbmZpZ190eXBlX2NvbnZlcnRlci5jYwppbmRleCAxMjVmM2U1Li5kNjkxMTJkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9uZXR3b3JrL3NzbF9jb25maWdfdHlwZV9jb252ZXJ0ZXIuY2MKKysrIGIvc2VydmljZXMvbmV0d29yay9zc2xfY29uZmlnX3R5cGVfY29udmVydGVyLmNjCkBAIC0zNCw2ICszNCw4IEBACiAgIERDSEVDS19MRShuZXRfY29uZmlnLnZlcnNpb25fbWluLCBuZXRfY29uZmlnLnZlcnNpb25fbWF4KTsKIAogICBuZXRfY29uZmlnLmRpc2FibGVkX2NpcGhlcl9zdWl0ZXMgPSBtb2pvX2NvbmZpZy0+ZGlzYWJsZWRfY2lwaGVyX3N1aXRlczsKKyAgbmV0X2NvbmZpZy50bHMxM19oYXJkZW5pbmdfZm9yX2xvY2FsX2FuY2hvcnNfZW5hYmxlZCA9CisgICAgICBtb2pvX2NvbmZpZy0+dGxzMTNfaGFyZGVuaW5nX2Zvcl9sb2NhbF9hbmNob3JzX2VuYWJsZWQ7CiAgIHJldHVybiBuZXRfY29uZmlnOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9uZXR3b3JrL3Rlc3QvdGVzdF9jb29raWVfbWFuYWdlci5oIGIvc2VydmljZXMvbmV0d29yay90ZXN0L3Rlc3RfY29va2llX21hbmFnZXIuaAppbmRleCBlOWFiN2Y3ZC4uZmMxOTdhMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbmV0d29yay90ZXN0L3Rlc3RfY29va2llX21hbmFnZXIuaAorKysgYi9zZXJ2aWNlcy9uZXR3b3JrL3Rlc3QvdGVzdF9jb29raWVfbWFuYWdlci5oCkBAIC0yNyw2ICsyNyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldDo6Q29va2llT3B0aW9ucyYgY29va2llX29wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldENhbm9uaWNhbENvb2tpZUNhbGxiYWNrIGNhbGxiYWNrKSBvdmVycmlkZTsKICAgdm9pZCBHZXRBbGxDb29raWVzKEdldEFsbENvb2tpZXNDYWxsYmFjayBjYWxsYmFjaykgb3ZlcnJpZGUge30KKyAgdm9pZCBHZXRBbGxDb29raWVzV2l0aEFjY2Vzc1NlbWFudGljcygKKyAgICAgIEdldEFsbENvb2tpZXNXaXRoQWNjZXNzU2VtYW50aWNzQ2FsbGJhY2sgY2FsbGJhY2spIG92ZXJyaWRlIHt9CiAgIHZvaWQgR2V0Q29va2llTGlzdChjb25zdCBHVVJMJiB1cmwsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXQ6OkNvb2tpZU9wdGlvbnMmIGNvb2tpZV9vcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgR2V0Q29va2llTGlzdENhbGxiYWNrIGNhbGxiYWNrKSBvdmVycmlkZSB7fQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvcmVzb3VyY2VfY29vcmRpbmF0b3IvcHVibGljL21vam9tL0JVSUxELmduIGIvc2VydmljZXMvcmVzb3VyY2VfY29vcmRpbmF0b3IvcHVibGljL21vam9tL0JVSUxELmduCmluZGV4IDE3ZWExNDkuLjkxMTcwZWYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3Jlc291cmNlX2Nvb3JkaW5hdG9yL3B1YmxpYy9tb2pvbS9CVUlMRC5nbgorKysgYi9zZXJ2aWNlcy9yZXNvdXJjZV9jb29yZGluYXRvci9wdWJsaWMvbW9qb20vQlVJTEQuZ24KQEAgLTksOCArOSw2IEBACiAgIG1hY3JvX3ByZWZpeCA9ICJSRVNPVVJDRV9DT09SRElOQVRPUl9QVUJMSUNfTU9KT00iCiAKICAgc291cmNlcyA9IFsKLSAgICAiY29vcmRpbmF0aW9uX3VuaXQubW9qb20iLAotICAgICJsaWZlY3ljbGUubW9qb20iLAogICAgICJtZW1vcnlfaW5zdHJ1bWVudGF0aW9uL2NvbnN0YW50cy5tb2pvbSIsCiAgICAgIm1lbW9yeV9pbnN0cnVtZW50YXRpb24vbWVtb3J5X2luc3RydW1lbnRhdGlvbi5tb2pvbSIsCiAgICAgInJlc291cmNlX2Nvb3JkaW5hdG9yX3NlcnZpY2UubW9qb20iLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvcmVzb3VyY2VfY29vcmRpbmF0b3IvcHVibGljL21vam9tL09XTkVSUyBiL3NlcnZpY2VzL3Jlc291cmNlX2Nvb3JkaW5hdG9yL3B1YmxpYy9tb2pvbS9PV05FUlMKaW5kZXggNWMzYTZhYzQuLjA4ODUwZjQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3Jlc291cmNlX2Nvb3JkaW5hdG9yL3B1YmxpYy9tb2pvbS9PV05FUlMKKysrIGIvc2VydmljZXMvcmVzb3VyY2VfY29vcmRpbmF0b3IvcHVibGljL21vam9tL09XTkVSUwpAQCAtMSw0ICsxLDIgQEAKLXBlci1maWxlIEJVSUxELmduPWZpbGU6Ly9zZXJ2aWNlcy9yZXNvdXJjZV9jb29yZGluYXRvci9tZW1vcnlfaW5zdHJ1bWVudGF0aW9uL09XTkVSUwotCiBwZXItZmlsZSAqLm1vam9tPXNldCBub3BhcmVudAogcGVyLWZpbGUgKi5tb2pvbT1maWxlOi8vaXBjL1NFQ1VSSVRZX09XTkVSUwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc2VydmljZV9tYW5hZ2VyL3NhbmRib3gvbGludXgvc2FuZGJveF9saW51eC5jYyBiL3NlcnZpY2VzL3NlcnZpY2VfbWFuYWdlci9zYW5kYm94L2xpbnV4L3NhbmRib3hfbGludXguY2MKaW5kZXggZjYyMzFkNC4uYjYzN2M0ZjEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NlcnZpY2VfbWFuYWdlci9zYW5kYm94L2xpbnV4L3NhbmRib3hfbGludXguY2MKKysrIGIvc2VydmljZXMvc2VydmljZV9tYW5hZ2VyL3NhbmRib3gvbGludXgvc2FuZGJveF9saW51eC5jYwpAQCAtMjkzLDEyICsyOTMsMTggQEAKICAgaWYgKGhvb2spCiAgICAgQ0hFQ0soc3RkOjptb3ZlKGhvb2spLlJ1bihvcHRpb25zKSk7CiAKKyAgLy8gSWYgd2UgYWxsb3cgdGhyZWFkcyAqYW5kKiBoYXZlIG11bHRpcGxlIHRocmVhZHMsIHRyeSB0byB1c2UgVFNZTkMuCisgIHNhbmRib3g6OlNhbmRib3hCUEY6OlNlY2NvbXBMZXZlbCBzZWNjb21wX2xldmVsID0KKyAgICAgIG9wdGlvbnMuYWxsb3dfdGhyZWFkc19kdXJpbmdfc2FuZGJveF9pbml0ICYmICFJc1NpbmdsZVRocmVhZGVkKCkKKyAgICAgICAgICA/IHNhbmRib3g6OlNhbmRib3hCUEY6OlNlY2NvbXBMZXZlbDo6TVVMVElfVEhSRUFERUQKKyAgICAgICAgICA6IHNhbmRib3g6OlNhbmRib3hCUEY6OlNlY2NvbXBMZXZlbDo6U0lOR0xFX1RIUkVBREVEOworCiAgIC8vIElmIHRoZSBrZXJuZWwgc3VwcG9ydHMgdGhlIHNhbmRib3gsIGFuZCBpZiB0aGUgY29tbWFuZCBsaW5lIHNheXMgd2UKICAgLy8gc2hvdWxkIGVuYWJsZSBpdCwgZW5hYmxlIGl0IG9yIGRpZS4KICAgc3RkOjp1bmlxdWVfcHRyPEJQRkJhc2VQb2xpY3k+IHBvbGljeSA9CiAgICAgICBTYW5kYm94U2VjY29tcEJQRjo6UG9saWN5Rm9yU2FuZGJveFR5cGUoc2FuZGJveF90eXBlLCBvcHRpb25zKTsKLSAgU2FuZGJveFNlY2NvbXBCUEY6OlN0YXJ0U2FuZGJveFdpdGhFeHRlcm5hbFBvbGljeShzdGQ6Om1vdmUocG9saWN5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVuUHJvYyhwcm9jX2ZkXykpOworICBTYW5kYm94U2VjY29tcEJQRjo6U3RhcnRTYW5kYm94V2l0aEV4dGVybmFsUG9saWN5KAorICAgICAgc3RkOjptb3ZlKHBvbGljeSksIE9wZW5Qcm9jKHByb2NfZmRfKSwgc2VjY29tcF9sZXZlbCk7CiAgIFNhbmRib3hTZWNjb21wQlBGOjpSdW5TYW5kYm94U2FuaXR5Q2hlY2tzKHNhbmRib3hfdHlwZSwgb3B0aW9ucyk7CiAgIHNlY2NvbXBfYnBmX3N0YXJ0ZWRfID0gdHJ1ZTsKICAgTG9nU2FuZGJveFN0YXJ0ZWQoInNlY2NvbXAtYnBmIik7CkBAIC0zMjksOSArMzM1LDEzIEBACiAgICAgICBiYXNlOjpCaW5kT25jZSgmU2FuZGJveExpbnV4OjpDaGVja0ZvckJyb2tlblByb21pc2VzLAogICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSwgc2FuZGJveF90eXBlKSk7CiAKLSAgLy8gTm8gbWF0dGVyIHdoYXQsIGl0J3MgYWx3YXlzIGFuIGVycm9yIHRvIGNhbGwgSW5pdGlhbGl6ZVNhbmRib3goKSBhZnRlcgotICAvLyB0aHJlYWRzIGhhdmUgYmVlbiBjcmVhdGVkLgotICBpZiAoIUlzU2luZ2xlVGhyZWFkZWQoKSkgeworICBjb25zdCBib29sIGhhc190aHJlYWRzID0gIUlzU2luZ2xlVGhyZWFkZWQoKTsKKworICAvLyBGb3Igbm93LCByZXN0cmljdCB0aGUgfG9wdGlvbnMuYWxsb3dfdGhyZWFkc19kdXJpbmdfc2FuZGJveF9pbml0fCBvcHRpb24gdG8KKyAgLy8gdGhlIEdQVSBwcm9jZXNzCisgIERDSEVDSyhwcm9jZXNzX3R5cGUgPT0gc3dpdGNoZXM6OmtHcHVQcm9jZXNzIHx8CisgICAgICAgICAhb3B0aW9ucy5hbGxvd190aHJlYWRzX2R1cmluZ19zYW5kYm94X2luaXQpOworICBpZiAoaGFzX3RocmVhZHMgJiYgIW9wdGlvbnMuYWxsb3dfdGhyZWFkc19kdXJpbmdfc2FuZGJveF9pbml0KSB7CiAgICAgc3RkOjpzdHJpbmcgZXJyb3JfbWVzc2FnZSA9CiAgICAgICAgICJJbml0aWFsaXplU2FuZGJveCgpIGNhbGxlZCB3aXRoIG11bHRpcGxlIHRocmVhZHMgaW4gcHJvY2VzcyAiICsKICAgICAgICAgcHJvY2Vzc190eXBlICsgIi4iOwpAQCAtMzQwLDEzICszNTAsNiBAQAogICAgIGlmIChJc1J1bm5pbmdUU0FOKCkpCiAgICAgICByZXR1cm4gZmFsc2U7CiAKLSNpZiBkZWZpbmVkKE9TX0NIUk9NRU9TKQotICAgIGlmIChiYXNlOjpTeXNJbmZvOjpJc1J1bm5pbmdPbkNocm9tZU9TKCkgJiYKLSAgICAgICAgcHJvY2Vzc190eXBlID09IHN3aXRjaGVzOjprR3B1UHJvY2VzcykgewotICAgICAgZXJyb3JfbWVzc2FnZSArPSAiIFRoaXMgZXJyb3IgY2FuIGJlIHNhZmVseSBpZ25vcmVkIGluIFZNVGVzdHMuIjsKLSAgICB9Ci0jZW5kaWYKLQogICAgIC8vIFRoZSBHUFUgcHJvY2VzcyBpcyBhbGxvd2VkIHRvIGNhbGwgSW5pdGlhbGl6ZVNhbmRib3goKSB3aXRoIHRocmVhZHMuCiAgICAgYm9vbCBzYW5kYm94X2ZhaWx1cmVfZmF0YWwgPSBwcm9jZXNzX3R5cGUgIT0gc3dpdGNoZXM6OmtHcHVQcm9jZXNzOwogICAgIC8vIFRoaXMgY2FuIGJlIGRpc2FibGVkIHdpdGggdGhlICctLWdwdS1zYW5kYm94LWZhaWx1cmVzLWZhdGFsJyBmbGFnLgpAQCAtMzcxLDIxICszNzQsMzEgQEAKICAgICB9CiAgIH0KIAotICAvLyBPbmx5IG9uZSB0aHJlYWQgaXMgcnVubmluZywgcHJlLWluaXRpYWxpemUgaWYgbm90IGFscmVhZHkgZG9uZS4KKyAgLy8gQXQgdGhpcyBwb2ludCB3ZSBhcmUgZWl0aGVyIHNpbmdsZSB0aHJlYWRlZCwgb3Igd2Ugd29uJ3QgYmUgZW5nYWdpbmcgdGhlCisgIC8vIHNlbWFudGljIGxheWVyIG9mIHRoZSBzYW5kYm94IGFuZCB3ZSB3b24ndCBjYXJlIGlmIHRoZXJlIGFyZSBmaWxlCisgIC8vIGRlc2NyaXB0b3JzIGxlZnQgb3Blbi4KKworICAvLyBQcmUtaW5pdGlhbGl6ZSBpZiBub3QgYWxyZWFkeSBkb25lLgogICBpZiAoIXByZV9pbml0aWFsaXplZF8pCiAgICAgUHJlaW5pdGlhbGl6ZVNhbmRib3goKTsKIAotICAvLyBUdXJuIG9uIHRoZSBuYW1lc3BhY2Ugc2FuZGJveCBpZiB0aGUgenlnb3RlIGhhc24ndCBkb25lIHNvIGFscmVhZHkuCisgIC8vIFR1cm4gb24gdGhlIG5hbWVzcGFjZSBzYW5kYm94IGlmIG91ciBjYWxsZXIgd2FudHMgaXQgKGFuZCB0aGUgenlnb3RlIGhhc24ndAorICAvLyBkb25lIHNvIGFscmVhZHkpLgogICBpZiAob3B0aW9ucy5lbmdhZ2VfbmFtZXNwYWNlX3NhbmRib3gpCiAgICAgRW5nYWdlTmFtZXNwYWNlU2FuZGJveChmYWxzZSAvKiBmcm9tX3p5Z290ZSAqLyk7CiAKLSAgQ0hFQ0soIUhhc09wZW5EaXJlY3RvcmllcygpKQorICAvLyBDaGVjayBmb3Igb3BlbiBkaXJlY3Rvcmllcywgd2hpY2ggY2FuIGJyZWFrIHRoZSBzZW1hbnRpYyBzYW5kYm94IGxheWVyLiBJbgorICAvLyBzb21lIGNhc2VzIHRoZSBjYWxsZXIgZG9lc24ndCB3YW50IHRvIGVuYWJsZSB0aGUgc2VtYW50aWMgc2FuZGJveCBsYXllciwKKyAgLy8gYW5kIHRoaXMgQ0hFQ0sgc2hvdWxkIGJlIHNraXBwZWQuIEluIHRoaXMgY2FzZSwgdGhlIGNhbGxlciBzaG91bGQgdW5zZXQKKyAgLy8gfG9wdGlvbnMuY2hlY2tfZm9yX29wZW5fZGlyZWN0b3JpZXN8LgorICBDSEVDSyghb3B0aW9ucy5jaGVja19mb3Jfb3Blbl9kaXJlY3RvcmllcyB8fCAhSGFzT3BlbkRpcmVjdG9yaWVzKCkpCiAgICAgICA8PCAiSW5pdGlhbGl6ZVNhbmRib3goKSBjYWxsZWQgYWZ0ZXIgdW5leHBlY3RlZCBkaXJlY3RvcmllcyBoYXZlIGJlZW4gIgogICAgICAgPDwgIm9wZW5lZC4gVGhpcyBicmVha3MgdGhlIHNlY3VyaXR5IG9mIHRoZSBzZXR1aWQgc2FuZGJveC4iOwogCiAgIHNhbmRib3g6OkluaXRMaWJjTG9jYWx0aW1lRnVuY3Rpb25zKCk7CiAKICAgLy8gQXR0ZW1wdCB0byBsaW1pdCB0aGUgZnV0dXJlIHNpemUgb2YgdGhlIGFkZHJlc3Mgc3BhY2Ugb2YgdGhlIHByb2Nlc3MuCisgIC8vIEZpbmUgdG8gY2FsbCB3aXRoIG11bHRpcGxlIHRocmVhZHMgYXMgd2UgZG9uJ3QgdXNlIFJMSU1JVF9TVEFDSy4KICAgaW50IGVycm9yID0gMDsKICAgY29uc3QgYm9vbCBsaW1pdGVkX2FzID0gTGltaXRBZGRyZXNzU3BhY2UoJmVycm9yKTsKICAgaWYgKGVycm9yKSB7CkBAIC00NDgsNiArNDYxLDcgQEAKICAgLy8gb3RoZXIgbWVtb3J5LWh1bmdyeSBhdHRhY2sgbW9kZXMuCiAKICAgcmxpbV90IHByb2Nlc3NfZGF0YV9zaXplX2xpbWl0ID0gR2V0UHJvY2Vzc0RhdGFTaXplTGltaXQoc2FuZGJveF90eXBlKTsKKyAgLy8gRmluZSB0byBjYWxsIHdpdGggbXVsdGlwbGUgdGhyZWFkcyBhcyB3ZSBkb24ndCB1c2UgUkxJTUlUX1NUQUNLLgogICAqZXJyb3IgPSBzYW5kYm94OjpSZXNvdXJjZUxpbWl0czo6TG93ZXIoUkxJTUlUX0RBVEEsIHByb2Nlc3NfZGF0YV9zaXplX2xpbWl0KTsKIAogICAvLyBDYWNoZSB0aGUgcmVzb3VyY2UgbGltaXQgYmVmb3JlIHR1cm5pbmcgb24gdGhlIHNhbmRib3guCkBAIC01MTAsNiArNTI0LDExIEBACiAKIGJvb2wgU2FuZGJveExpbnV4OjpFbmdhZ2VOYW1lc3BhY2VTYW5kYm94SW50ZXJuYWwoYm9vbCBmcm9tX3p5Z290ZSkgewogICBDSEVDSyhwcmVfaW5pdGlhbGl6ZWRfKTsKKyAgQ0hFQ0soSXNTaW5nbGVUaHJlYWRlZCgpKQorICAgICAgPDwgIlRoZSBwcm9jZXNzIGNhbm5vdCBoYXZlIG11bHRpcGxlIHRocmVhZHMgd2hlbiBlbmdhZ2luZyB0aGUgbmFtZXNwYWNlICIKKyAgICAgICAgICJzYW5kYm94LCBiZWNhdXNlIHRoZSB0aHJlYWQgZW5nYWdpbmcgdGhlIHNhbmRib3ggY2Fubm90IGVuc3VyZSB0aGF0ICIKKyAgICAgICAgICJvdGhlciB0aHJlYWRzIGNsb3NlIGFsbCB0aGVpciBvcGVuIGRpcmVjdG9yaWVzLiI7CisKICAgaWYgKGZyb21fenlnb3RlKSB7CiAgICAgLy8gQ2hlY2sgYmVpbmcgaW4gYSBuZXcgUElEIG5hbWVzcGFjZSBjcmVhdGVkIGJ5IHRoZSBuYW1lc3BhY2Ugc2FuZGJveCBhbmQKICAgICAvLyBiZWluZyB0aGUgaW5pdCBwcm9jZXNzLgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc2VydmljZV9tYW5hZ2VyL3NhbmRib3gvbGludXgvc2FuZGJveF9saW51eC5oIGIvc2VydmljZXMvc2VydmljZV9tYW5hZ2VyL3NhbmRib3gvbGludXgvc2FuZGJveF9saW51eC5oCmluZGV4IDViNjUwMWEuLjU5N2VhNTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NlcnZpY2VfbWFuYWdlci9zYW5kYm94L2xpbnV4L3NhbmRib3hfbGludXguaAorKysgYi9zZXJ2aWNlcy9zZXJ2aWNlX21hbmFnZXIvc2FuZGJveC9saW51eC9zYW5kYm94X2xpbnV4LmgKQEAgLTk5LDYgKzk5LDE2IEBACiAgICAgLy8gYmUgZG9uZSBzbyBhZ2Fpbi4gU2V0IHRvIHRydWUgdG8gaW5kaWNhdGUgdGhhdCB0aGVyZSBpc24ndCBhIHp5Z290ZQogICAgIC8vIGZvciB0aGlzIHByb2Nlc3MgYW5kIHRoZSBzdGVwIGlzIHRvIGJlIHBlcmZvcm1lZCBoZXJlIGV4cGxpY2l0bHkuCiAgICAgYm9vbCBlbmdhZ2VfbmFtZXNwYWNlX3NhbmRib3ggPSBmYWxzZTsKKworICAgIC8vIEFsbG93IHN0YXJ0aW5nIHRoZSBzYW5kYm94IHdpdGggbXVsdGlwbGUgdGhyZWFkcyBhbHJlYWR5IHJ1bm5pbmcuIFRoaXMKKyAgICAvLyB3aWxsIGVuYWJsZSBUU1lOQyBmb3Igc2VjY29tcC1CUEYsIHdoaWNoIHN5bmNzIHRoZSBzZWNjb21wLUJQRiBwb2xpY3kKKyAgICAvLyBhY3Jvc3MgYWxsIHJ1bm5pbmcgdGhyZWFkcy4KKyAgICBib29sIGFsbG93X3RocmVhZHNfZHVyaW5nX3NhbmRib3hfaW5pdCA9IGZhbHNlOworCisgICAgLy8gRW5hYmxlcyB0aGUgQ0hFQ0sgZm9yIG9wZW4gZGlyZWN0b3JpZXMuIFRoZSBvcGVuIGRpcmVjdG9yeSBjaGVjayBpcyBvbmx5CisgICAgLy8gdXNlZnVsIGZvciB0aGUgY2hyb290IGphaWwgKGZyb20gdGhlIHNlbWFudGljIGxheWVyIG9mIHRoZSBzYW5kYm94KSwgYW5kCisgICAgLy8gY2FuIHNhZmVseSBiZSBkaXNhYmxlZCBpZiB3ZSBhcmUgb25seSBlbmFibGluZyB0aGUgc2VjY29tcC1CUEYgbGF5ZXIuCisgICAgYm9vbCBjaGVja19mb3Jfb3Blbl9kaXJlY3RvcmllcyA9IHRydWU7CiAgIH07CiAKICAgLy8gQ2FsbGVycyBjYW4gcHJvdmlkZSB0aGlzIGhvb2sgdG8gcnVuIGNvZGUgcmlnaHQgYmVmb3JlIHRoZSBwb2xpY3kKQEAgLTE3Niw5ICsxODYsMTEgQEAKICAgLy8gYmUgdXNlZCBkaXJlY3RseS4KICAgc2FuZGJveDo6U2V0dWlkU2FuZGJveENsaWVudCogc2V0dWlkX3NhbmRib3hfY2xpZW50KCkgY29uc3Q7CiAKLSAgLy8gQ2hlY2sgdGhlIHBvbGljeSBhbmQgZXZlbnR1YWxseSBzdGFydCB0aGUgc2VjY29tcC1icGYgc2FuZGJveC4gVGhpcyBzaG91bGQKLSAgLy8gbmV2ZXIgYmUgY2FsbGVkIHdpdGggdGhyZWFkcyBzdGFydGVkLiBJZiB3ZSBkZXRlY3QgdGhhdCB0aHJlYWRzIGhhdmUKLSAgLy8gc3RhcnRlZCB3ZSB3aWxsIGNyYXNoLgorICAvLyBDaGVjayB0aGUgcG9saWN5IGFuZCBldmVudHVhbGx5IHN0YXJ0IHRoZSBzZWNjb21wLWJwZiBzYW5kYm94LiBGaW5lIHRvIGJlCisgIC8vIGNhbGxlZCB3aXRoIHRocmVhZHMsIGFzIGxvbmcgYXMKKyAgLy8gfG9wdGlvbnMuYWxsb3dfdGhyZWFkc19kdXJpbmdfc2FuZGJveF9pbml0fCBpcyB0cnVlIGFuZCB0aGUga2VybmVsCisgIC8vIHN1cHBvcnRzIHNlY2NvbXAncyBUU1lOQyBmZWF0dXJlLiBJZiBUU1lOQyBpcyBub3QgYXZhaWxhYmxlIHdlIHRyZWF0CisgIC8vIG11bHRpcGxlIHRocmVhZHMgYXMgYSBmYXRhbCBlcnJvci4KICAgYm9vbCBTdGFydFNlY2NvbXBCUEYoc2VydmljZV9tYW5hZ2VyOjpTYW5kYm94VHlwZSBzYW5kYm94X3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgIFByZVNhbmRib3hIb29rIGhvb2ssCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc2VydmljZV9tYW5hZ2VyL3NhbmRib3gvbGludXgvc2FuZGJveF9zZWNjb21wX2JwZl9saW51eC5jYyBiL3NlcnZpY2VzL3NlcnZpY2VfbWFuYWdlci9zYW5kYm94L2xpbnV4L3NhbmRib3hfc2VjY29tcF9icGZfbGludXguY2MKaW5kZXggZWZkODZiOC4uOTRkZTgzYTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NlcnZpY2VfbWFuYWdlci9zYW5kYm94L2xpbnV4L3NhbmRib3hfc2VjY29tcF9icGZfbGludXguY2MKKysrIGIvc2VydmljZXMvc2VydmljZV9tYW5hZ2VyL3NhbmRib3gvbGludXgvc2FuZGJveF9zZWNjb21wX2JwZl9saW51eC5jYwpAQCAtMjI1LDcgKzIyNSw4IEBACiAKIGJvb2wgU2FuZGJveFNlY2NvbXBCUEY6OlN0YXJ0U2FuZGJveFdpdGhFeHRlcm5hbFBvbGljeSgKICAgICBzdGQ6OnVuaXF1ZV9wdHI8c2FuZGJveDo6YnBmX2RzbDo6UG9saWN5PiBwb2xpY3ksCi0gICAgYmFzZTo6U2NvcGVkRkQgcHJvY19mZCkgeworICAgIGJhc2U6OlNjb3BlZEZEIHByb2NfZmQsCisgICAgc2FuZGJveDo6U2FuZGJveEJQRjo6U2VjY29tcExldmVsIHNlY2NvbXBfbGV2ZWwpIHsKICNpZiBCVUlMREZMQUcoVVNFX1NFQ0NPTVBfQlBGKQogICBpZiAoSXNTZWNjb21wQlBGRGVzaXJlZCgpICYmIFN1cHBvcnRzU2FuZGJveCgpKSB7CiAgICAgQ0hFQ0socG9saWN5KTsKQEAgLTIzNiw3ICsyMzcsNyBAQAogICAgIC8vIGRvaW5nIHNvIGRvZXMgbm90IHN0b3AgdGhlIHNhbmRib3guCiAgICAgU2FuZGJveEJQRiBzYW5kYm94KHN0ZDo6bW92ZShwb2xpY3kpKTsKICAgICBzYW5kYm94LlNldFByb2NGZChzdGQ6Om1vdmUocHJvY19mZCkpOwotICAgIENIRUNLKHNhbmRib3guU3RhcnRTYW5kYm94KFNhbmRib3hCUEY6OlNlY2NvbXBMZXZlbDo6U0lOR0xFX1RIUkVBREVEKSk7CisgICAgQ0hFQ0soc2FuZGJveC5TdGFydFNhbmRib3goc2VjY29tcF9sZXZlbCkpOwogICAgIHJldHVybiB0cnVlOwogICB9CiAjZW5kaWYgIC8vIEJVSUxERkxBRyhVU0VfU0VDQ09NUF9CUEYpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zZXJ2aWNlX21hbmFnZXIvc2FuZGJveC9saW51eC9zYW5kYm94X3NlY2NvbXBfYnBmX2xpbnV4LmggYi9zZXJ2aWNlcy9zZXJ2aWNlX21hbmFnZXIvc2FuZGJveC9saW51eC9zYW5kYm94X3NlY2NvbXBfYnBmX2xpbnV4LmgKaW5kZXggNzE3MGY0OWQuLjRkYTA5NWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NlcnZpY2VfbWFuYWdlci9zYW5kYm94L2xpbnV4L3NhbmRib3hfc2VjY29tcF9icGZfbGludXguaAorKysgYi9zZXJ2aWNlcy9zZXJ2aWNlX21hbmFnZXIvc2FuZGJveC9saW51eC9zYW5kYm94X3NlY2NvbXBfYnBmX2xpbnV4LmgKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlICJiYXNlL21hY3Jvcy5oIgogI2luY2x1ZGUgImJ1aWxkL2J1aWxkX2NvbmZpZy5oIgogI2luY2x1ZGUgInNhbmRib3gvbGludXgvYnBmX2RzbC9wb2xpY3kuaCIKKyNpbmNsdWRlICJzYW5kYm94L2xpbnV4L3NlY2NvbXAtYnBmL3NhbmRib3hfYnBmLmgiCiAjaW5jbHVkZSAic2VydmljZXMvc2VydmljZV9tYW5hZ2VyL3NhbmRib3gvZXhwb3J0LmgiCiAjaW5jbHVkZSAic2VydmljZXMvc2VydmljZV9tYW5hZ2VyL3NhbmRib3gvbGludXgvYnBmX2Jhc2VfcG9saWN5X2xpbnV4LmgiCiAjaW5jbHVkZSAic2VydmljZXMvc2VydmljZV9tYW5hZ2VyL3NhbmRib3gvc2FuZGJveF90eXBlLmgiCkBAIC02MCw3ICs2MSw5IEBACiAgIC8vIGV4dGVybmFsIHBvbGljeS4KICAgc3RhdGljIGJvb2wgU3RhcnRTYW5kYm94V2l0aEV4dGVybmFsUG9saWN5KAogICAgICAgc3RkOjp1bmlxdWVfcHRyPHNhbmRib3g6OmJwZl9kc2w6OlBvbGljeT4gcG9saWN5LAotICAgICAgYmFzZTo6U2NvcGVkRkQgcHJvY19mZCk7CisgICAgICBiYXNlOjpTY29wZWRGRCBwcm9jX2ZkLAorICAgICAgc2FuZGJveDo6U2FuZGJveEJQRjo6U2VjY29tcExldmVsIHNlY2NvbXBfbGV2ZWwgPQorICAgICAgICAgIHNhbmRib3g6OlNhbmRib3hCUEY6OlNlY2NvbXBMZXZlbDo6U0lOR0xFX1RIUkVBREVEKTsKIAogICAvLyBUaGUgImJhc2VsaW5lIiBwb2xpY3kgY2FuIGJlIGEgdXNlZnVsIGJhc2UgdG8gYnVpbGQgYSBzYW5kYm94IHBvbGljeS4KICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxzYW5kYm94OjpicGZfZHNsOjpQb2xpY3k+IEdldEJhc2VsaW5lUG9saWN5KCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90cmFjaW5nL3BlcmZldHRvL2NvbnN1bWVyX2hvc3QuY2MgYi9zZXJ2aWNlcy90cmFjaW5nL3BlcmZldHRvL2NvbnN1bWVyX2hvc3QuY2MKaW5kZXggZWE5MDM0ZTkuLjE4OWEwODEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3RyYWNpbmcvcGVyZmV0dG8vY29uc3VtZXJfaG9zdC5jYworKysgYi9zZXJ2aWNlcy90cmFjaW5nL3BlcmZldHRvL2NvbnN1bWVyX2hvc3QuY2MKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlICJiYXNlL3RyYWNlX2V2ZW50L3RyYWNlX2xvZy5oIgogI2luY2x1ZGUgImJhc2UvdmFsdWVzLmgiCiAjaW5jbHVkZSAiYnVpbGQvYnVpbGRfY29uZmlnLmgiCisjaW5jbHVkZSAibW9qby9wdWJsaWMvY3BwL2JpbmRpbmdzL3NlbGZfb3duZWRfcmVjZWl2ZXIuaCIKICNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvYmluZGluZ3Mvc3Ryb25nX2JpbmRpbmcuaCIKICNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvc3lzdGVtL3dhaXQuaCIKICNpbmNsdWRlICJzZXJ2aWNlcy90cmFjaW5nL3BlcmZldHRvL2pzb25fdHJhY2VfZXhwb3J0ZXIuaCIKQEAgLTQ3OSwxMiArNDgwLDEyIEBACiB9CiAKIC8vIHN0YXRpYwotdm9pZCBDb25zdW1lckhvc3Q6OkJpbmRDb25zdW1lclJlcXVlc3QoCit2b2lkIENvbnN1bWVySG9zdDo6QmluZENvbnN1bWVyUmVjZWl2ZXIoCiAgICAgUGVyZmV0dG9TZXJ2aWNlKiBzZXJ2aWNlLAotICAgIG1vam9tOjpDb25zdW1lckhvc3RSZXF1ZXN0IHJlcXVlc3QsCisgICAgbW9qbzo6UGVuZGluZ1JlY2VpdmVyPG1vam9tOjpDb25zdW1lckhvc3Q+IHJlY2VpdmVyLAogICAgIGNvbnN0IHNlcnZpY2VfbWFuYWdlcjo6QmluZFNvdXJjZUluZm8mIHNvdXJjZV9pbmZvKSB7Ci0gIG1vam86Ok1ha2VTdHJvbmdCaW5kaW5nKHN0ZDo6bWFrZV91bmlxdWU8Q29uc3VtZXJIb3N0PihzZXJ2aWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHJlcXVlc3QpKTsKKyAgbW9qbzo6TWFrZVNlbGZPd25lZFJlY2VpdmVyKHN0ZDo6bWFrZV91bmlxdWU8Q29uc3VtZXJIb3N0PihzZXJ2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShyZWNlaXZlcikpOwogfQogCiBDb25zdW1lckhvc3Q6OkNvbnN1bWVySG9zdChQZXJmZXR0b1NlcnZpY2UqIHNlcnZpY2UpIDogc2VydmljZV8oc2VydmljZSkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHJhY2luZy9wZXJmZXR0by9jb25zdW1lcl9ob3N0LmggYi9zZXJ2aWNlcy90cmFjaW5nL3BlcmZldHRvL2NvbnN1bWVyX2hvc3QuaAppbmRleCAwODhhYjg4OS4uYjlhZmJjMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvdHJhY2luZy9wZXJmZXR0by9jb25zdW1lcl9ob3N0LmgKKysrIGIvc2VydmljZXMvdHJhY2luZy9wZXJmZXR0by9jb25zdW1lcl9ob3N0LmgKQEAgLTQwLDkgKzQwLDkgQEAKIC8vIHRvIGFjdCBhcyBhIFBlcmZldHRvIGNvbnN1bWVyLgogY2xhc3MgQ29uc3VtZXJIb3N0IDogcHVibGljIHBlcmZldHRvOjpDb25zdW1lciwgcHVibGljIG1vam9tOjpDb25zdW1lckhvc3QgewogIHB1YmxpYzoKLSAgc3RhdGljIHZvaWQgQmluZENvbnN1bWVyUmVxdWVzdCgKKyAgc3RhdGljIHZvaWQgQmluZENvbnN1bWVyUmVjZWl2ZXIoCiAgICAgICBQZXJmZXR0b1NlcnZpY2UqIHNlcnZpY2UsCi0gICAgICBtb2pvbTo6Q29uc3VtZXJIb3N0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgbW9qbzo6UGVuZGluZ1JlY2VpdmVyPG1vam9tOjpDb25zdW1lckhvc3Q+IHJlY2VpdmVyLAogICAgICAgY29uc3Qgc2VydmljZV9tYW5hZ2VyOjpCaW5kU291cmNlSW5mbyYgc291cmNlX2luZm8pOwogCiAgIGNsYXNzIFN0cmVhbVdyaXRlcjsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3RyYWNpbmcvcHVibGljL2NwcC9CVUlMRC5nbiBiL3NlcnZpY2VzL3RyYWNpbmcvcHVibGljL2NwcC9CVUlMRC5nbgppbmRleCA5Y2U3M2Y3Li43NWNjNWZhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90cmFjaW5nL3B1YmxpYy9jcHAvQlVJTEQuZ24KKysrIGIvc2VydmljZXMvdHJhY2luZy9wdWJsaWMvY3BwL0JVSUxELmduCkBAIC0zNCw2ICszNCw4IEBACiAgICAgICAicGVyZmV0dG8vZHVtbXlfcHJvZHVjZXIuY2MiLAogICAgICAgInBlcmZldHRvL2R1bW15X3Byb2R1Y2VyLmgiLAogICAgICAgInBlcmZldHRvL2ludGVybmluZ19pbmRleC5oIiwKKyAgICAgICJwZXJmZXR0by9qYXZhX2hlYXBfcHJvZmlsZXIvamF2YV9oZWFwX3Byb2ZpbGVyLmNjIiwKKyAgICAgICJwZXJmZXR0by9qYXZhX2hlYXBfcHJvZmlsZXIvamF2YV9oZWFwX3Byb2ZpbGVyLmgiLAogICAgICAgInBlcmZldHRvL3BlcmZldHRvX2NvbmZpZy5jYyIsCiAgICAgICAicGVyZmV0dG8vcGVyZmV0dG9fY29uZmlnLmgiLAogICAgICAgInBlcmZldHRvL3BlcmZldHRvX3Byb2R1Y2VyLmNjIiwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3RyYWNpbmcvcHVibGljL2NwcC9wZXJmZXR0by9pbnRlcm5pbmdfaW5kZXguaCBiL3NlcnZpY2VzL3RyYWNpbmcvcHVibGljL2NwcC9wZXJmZXR0by9pbnRlcm5pbmdfaW5kZXguaAppbmRleCBkOWE3Y2QyLi41MjVjZGI2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90cmFjaW5nL3B1YmxpYy9jcHAvcGVyZmV0dG8vaW50ZXJuaW5nX2luZGV4LmgKKysrIGIvc2VydmljZXMvdHJhY2luZy9wdWJsaWMvY3BwL3BlcmZldHRvL2ludGVybmluZ19pbmRleC5oCkBAIC01LDExICs1LDExIEBACiAjaWZuZGVmIFNFUlZJQ0VTX1RSQUNJTkdfUFVCTElDX0NQUF9QRVJGRVRUT19JTlRFUk5JTkdfSU5ERVhfSF8KICNkZWZpbmUgU0VSVklDRVNfVFJBQ0lOR19QVUJMSUNfQ1BQX1BFUkZFVFRPX0lOVEVSTklOR19JTkRFWF9IXwogCi0jaW5jbHVkZSA8YXJyYXk+CiAjaW5jbHVkZSA8Y3N0ZGludD4KICNpbmNsdWRlIDx0dXBsZT4KIAogI2luY2x1ZGUgImJhc2UvY29tcG9uZW50X2V4cG9ydC5oIgorI2luY2x1ZGUgImJhc2UvY29udGFpbmVycy9tcnVfY2FjaGUuaCIKIAogbmFtZXNwYWNlIHRyYWNpbmcgewogCkBAIC0xNyw3ICsxNyw3IEBACiB1c2luZyBJbnRlcm5pbmdJRCA9IHVpbnQzMl90OwogCiBzdHJ1Y3QgQ09NUE9ORU5UX0VYUE9SVChUUkFDSU5HX0NQUCkgSW50ZXJuaW5nSW5kZXhFbnRyeSB7Ci0gIEludGVybmluZ0lEIGlkID0gMDsKKyAgSW50ZXJuaW5nSUQgaWQ7CiAKICAgLy8gV2hldGhlciB0aGUgZW50cnkgd2FzIGVtaXR0ZWQgc2luY2UgdGhlIGxhc3QgcmVzZXQgb2YgZW1pdHRlZCBzdGF0ZS4gSWYKICAgLy8gfGZhbHNlfCwgdGhlIHNpbmsgc2hvdWxkIChyZSllbWl0IHRoZSBlbnRyeSBpbiB0aGUgY3VycmVudCBUcmFjZVBhY2tldC4KQEAgLTI1LDgwICsyNSwyOSBAQAogICAvLyBXZSBkb24ndCByZW1vdmUgZW50cmllcyBvbiByZXNldCBvZiBlbWl0dGVkIHN0YXRlLCBzbyB0aGF0IHdlIGNhbiBjb250aW51ZQogICAvLyB0byB1c2UgdGhlaXIgb3JpZ2luYWwgSURzIGFuZCBhdm9pZCB1bm5lY2Vzc2FyaWx5IGluY3JlbWVudGluZyB0aGUgSUQKICAgLy8gY291bnRlci4KLSAgYm9vbCB3YXNfZW1pdHRlZCA9IGZhbHNlOworICBib29sIHdhc19lbWl0dGVkOwogfTsKIAogLy8gSW50ZXJuaW5nIGluZGV4IHRoYXQgYXNzb2NpYXRlcyBpbnRlcm5lZCB2YWx1ZXMgd2l0aCBpbnRlcm5pbmcgSURzLiBJdCBjYW4KIC8vIHRyYWNrIGVudHJpZXMgb2YgZGlmZmVyZW50IHR5cGVzIHdpdGhpbiB0aGUgc2FtZSBJRCBzcGFjZSwgZS5nLiBzbyB0aGF0IGJvdGgKIC8vIGNvcGllZCBzdHJpbmdzIGFuZCBwb2ludGVycyB0byBzdGF0aWMgc3RyaW5ncyBjYW4gY28tZXhpc3QgaW4gdGhlIHNhbWUgaW5kZXguCi0vLwotLy8gVGhlIGluZGV4IHdpbGwgY2FjaGUgdXAgdG8gfE58IHZhbHVlcyBwZXIgVmFsdWVUeXBlIGFmdGVyIHdoaWNoIGl0IHdpbGwgc3RhcnQKLS8vIHJlcGxhY2luZyB0aGVtIGluIGEgRklGTyBiYXNpcy4gTiBtdXN0IGJlIGEgcG93ZXIgb2YgMiBmb3IgcGVyZm9ybWFuY2UKLS8vIHJlYXNvbnMuCi10ZW1wbGF0ZSA8c2l6ZV90IE4sIHR5cGVuYW1lLi4uIFZhbHVlVHlwZXM+CisvLyBVc2VzIGJhc2U6Ok1SVUNhY2hlcyB0byB0cmFjayB0aGUgSUQgYXNzb2NpYXRpb25zIHdoaWxlIGVuZm9yY2luZyBhbiB1cHBlcgorLy8gYm91bmQgb24gdGhlIGluZGV4IHNpemUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gVmFsdWVUeXBlcz4KIGNsYXNzIENPTVBPTkVOVF9FWFBPUlQoVFJBQ0lOR19DUFApIEludGVybmluZ0luZGV4IHsKICBwdWJsaWM6Ci0gIC8vIEluZGV4Q2FjaGUgaXMganVzdCBhIHBhaXIgb2Ygc3RkOjphcnJheXMgd2hpY2ggYXJnIGtlcHQgaW4gc3luYyB3aXRoIGVhY2gKLSAgLy8gb3RoZXIuIFRoaXMgaGFzIGFuIGFkdmFudGFnZSBvdmVyIGEgc3RkOjphcnJheTxwYWlycz4gc2luY2Ugd2UgY2FuIGxvYWQgYQotICAvLyBidW5jaCBvZiBrZXlzIHRvIHNlYXJjaCBpbiBvbmUgY2FjaGUgbGluZSB3aXRob3V0IGxvYWRpbmcgdmFsdWVzLgogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWVUeXBlPgotICBjbGFzcyBJbmRleENhY2hlIHsKLSAgIHB1YmxpYzoKLSAgICBJbmRleENhY2hlKCkgewotICAgICAgLy8gQXNzZXJ0IHRoYXQgTiBpcyBhIHBvd2VyIG9mIHR3by4gVGhpcyBhbGxvd3MgdGhlICIlIE4iIGluIEluc2VydCgpIHRvCi0gICAgICAvLyBjb21waWxlIHRvIGEgYnVuY2ggb2YgYml0IHNoaWZ0cyB3aGljaCBpbXByb3ZlcyBwZXJmb3JtYW5jZSBvdmVyIGFuCi0gICAgICAvLyBhcmJpdHJhcnkgbW9kdWxvIGRpdmlzaW9uLgotICAgICAgc3RhdGljX2Fzc2VydCgKLSAgICAgICAgICBOICYmICgoTiAmIChOIC0gMSkpID09IDApLAotICAgICAgICAgICJJbnRlcm5pbmdJbmRleCByZXF1aXJlcyB0aGF0IHRoZSBjYWNoZSBzaXplIGJlIGEgcG93ZXIgb2YgMi4iKTsKLSAgICB9CisgIHVzaW5nIEluZGV4Q2FjaGUgPSBiYXNlOjpNUlVDYWNoZTxWYWx1ZVR5cGUsIEludGVybmluZ0luZGV4RW50cnk+OwogCi0gICAgdm9pZCBDbGVhcigpIHsKLSAgICAgIGZvciAoYXV0byYgdmFsIDoga2V5c18pIHsKLSAgICAgICAgdmFsID0gVmFsdWVUeXBle307Ci0gICAgICB9Ci0gICAgfQotCi0gICAgdHlwZW5hbWUgc3RkOjphcnJheTxJbnRlcm5pbmdJbmRleEVudHJ5LCBOPjo6aXRlcmF0b3IgRmluZCgKLSAgICAgICAgY29uc3QgVmFsdWVUeXBlJiB2YWx1ZSkgewotICAgICAgYXV0byBpdCA9IHN0ZDo6ZmluZChrZXlzXy5iZWdpbigpLCBrZXlzXy5lbmQoKSwgdmFsdWUpOwotICAgICAgLy8gSWYgdGhlIGZpbmQgYWJvdmUgcmV0dXJucyBpdCA9PSBrZXlzXy5lbmQoKSwgdGhlbiAoaXQgLSBrZXlzXy5iZWdpbigpKQotICAgICAgLy8gd2lsbCBlcXVhbCBrZXlzXy5zaXplKCkgd2hpY2ggaXMgZXF1YWwgdG8gdmFsdWVzXy5zaXplKCkuIFNvCi0gICAgICAvLyB2YWx1ZXNfLmJlZ2luKCkgKyB2YWx1ZXNfc2l6ZSgpIHdpbGwgYmUgdmFsdWVzXy5lbmQoKSBhbmQgd2UndmUKLSAgICAgIC8vIHJldHVybmVkIHRoZSBjb3JyZWN0IHZhbHVlLiBUaGlzIHNhdmVzIHVzIGNoZWNraW5nIGEgY29uZGl0aW9uYWwgaW4KLSAgICAgIC8vIHRoaXMgZnVuY3Rpb24uCi0gICAgICByZXR1cm4gdmFsdWVzXy5iZWdpbigpICsgKGl0IC0ga2V5c18uYmVnaW4oKSk7Ci0gICAgfQotCi0gICAgdHlwZW5hbWUgc3RkOjphcnJheTxJbnRlcm5pbmdJbmRleEVudHJ5LCBOPjo6aXRlcmF0b3IgSW5zZXJ0KAotICAgICAgICBjb25zdCBWYWx1ZVR5cGUmIGtleSwKLSAgICAgICAgSW50ZXJuaW5nSW5kZXhFbnRyeSYmIHZhbHVlKSB7Ci0gICAgICBzaXplX3QgbmV3X3Bvc2l0aW9uID0gY3VycmVudF9pbmRleF8rKyAlIE47Ci0gICAgICBrZXlzX1tuZXdfcG9zaXRpb25dID0ga2V5OwotICAgICAgdmFsdWVzX1tuZXdfcG9zaXRpb25dID0gc3RkOjptb3ZlKHZhbHVlKTsKLSAgICAgIHJldHVybiB2YWx1ZXNfLmJlZ2luKCkgKyBuZXdfcG9zaXRpb247Ci0gICAgfQotCi0gICAgdHlwZW5hbWUgc3RkOjphcnJheTxJbnRlcm5pbmdJbmRleEVudHJ5LCBOPjo6aXRlcmF0b3IgYmVnaW4oKSB7Ci0gICAgICByZXR1cm4gdmFsdWVzXy5iZWdpbigpOwotICAgIH0KLSAgICB0eXBlbmFtZSBzdGQ6OmFycmF5PEludGVybmluZ0luZGV4RW50cnksIE4+OjppdGVyYXRvciBlbmQoKSB7Ci0gICAgICByZXR1cm4gdmFsdWVzXy5lbmQoKTsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgc2l6ZV90IGN1cnJlbnRfaW5kZXhfID0gMDsKLSAgICBzdGQ6OmFycmF5PFZhbHVlVHlwZSwgTj4ga2V5c197e319OwotICAgIHN0ZDo6YXJyYXk8SW50ZXJuaW5nSW5kZXhFbnRyeSwgTj4gdmFsdWVzX3t7fX07Ci0gIH07Ci0KLSAgLy8gQ29uc3RydWN0IGEgbmV3IGluZGV4IHdpdGggY2FjaGVzIGZvciBlYWNoIG9mIHRoZSBWYWx1ZVR5cGVzLiBFdmVyeSBjYWNoZQotICAvLyBpcyB8TnwgZWxlbWVudHMuCisgIC8vIENvbnN0cnVjdCBhIG5ldyBpbmRleCB3aXRoIGNhY2hlcyBmb3IgZWFjaCBvZiB0aGUgVmFsdWVUeXBlcy4gVGhlIGNhY2hlCisgIC8vIHNpemUgZm9yIHRoZSBuLXRoIFZhbHVlVHlwZSB3aWxsIGJlIGxpbWl0ZWQgdG8gbWF4X2VudHJ5X2NvdW50c1tuXSBlbnRyaWVzLgogICAvLwotICAvLyBGb3IgZXhhbXBsZSwgdG8gY29uc3RydWN0IGFuIGluZGV4IGNvbnRhaW5pbmcgYXQgbW9zdCAxMDI0IGNoYXIqIHBvaW50ZXJzCi0gIC8vIGFuZCAxMDI0IHN0ZDo6c3RyaW5nIG9iamVjdHM6Ci0gIC8vICAgICBJbnRlcm5pbmdJbmRleDwxMDI0LCBjaGFyKiwgc3RkOjpzdHJpbmc+IGluZGV4OwotICBJbnRlcm5pbmdJbmRleCgpID0gZGVmYXVsdDsKKyAgLy8gRm9yIGV4YW1wbGUsIHRvIGNvbnN0cnVjdCBhbiBpbmRleCBjb250YWluaW5nIGF0IG1vc3QgMTAwMCBjaGFyKiBwb2ludGVycworICAvLyBhbmQgMTAwIHN0ZDo6c3RyaW5nIG9iamVjdHM6CisgIC8vICAgICBJbnRlcm5pbmdJbmRleDxjaGFyKiwgc3RkOjpzdHJpbmc+IGluZGV4KDEwMDAsIDEwMCk7CisgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBTaXplVHlwZT4KKyAgSW50ZXJuaW5nSW5kZXgoU2l6ZVR5cGUuLi4gbWF4X2VudHJ5X2NvdW50cykKKyAgICAgIDogZW50cnlfY2FjaGVzXyhtYXhfZW50cnlfY291bnRzLi4uKSB7fQogCiAgIC8vIFJldHVybnMgdGhlIGVudHJ5IGZvciB0aGUgZ2l2ZW4gaW50ZXJuZWQgfHZhbHVlfCwgYWRkaW5nIGl0IHRvIHRoZSBpbmRleCBpZgogICAvLyBpdCBkaWRuJ3QgZXhpc3QgcHJldmlvdXNseSBvciB3YXMgZXZpY3RlZCBmcm9tIHRoZSBpbmRleC4gRW50cmllcyBtYXkgYmUKQEAgLTExMSwxNCArNjAsMTQgQEAKICAgSW50ZXJuaW5nSW5kZXhFbnRyeSBMb29rdXBPckFkZChjb25zdCBWYWx1ZVR5cGUmIHZhbHVlKSB7CiAgICAgSW5kZXhDYWNoZTxWYWx1ZVR5cGU+JiBjYWNoZSA9CiAgICAgICAgIHN0ZDo6Z2V0PEluZGV4Q2FjaGU8VmFsdWVUeXBlPj4oZW50cnlfY2FjaGVzXyk7Ci0gICAgYXV0byBpdCA9IGNhY2hlLkZpbmQodmFsdWUpOworICAgIGF1dG8gaXQgPSBjYWNoZS5HZXQodmFsdWUpOwogICAgIGlmIChpdCA9PSBjYWNoZS5lbmQoKSkgewotICAgICAgaXQgPSBjYWNoZS5JbnNlcnQodmFsdWUsIEludGVybmluZ0luZGV4RW50cnl7bmV4dF9pZF8rKywgZmFsc2V9KTsKKyAgICAgIGl0ID0gY2FjaGUuUHV0KHZhbHVlLCBJbnRlcm5pbmdJbmRleEVudHJ5e25leHRfaWRfKyssIGZhbHNlfSk7CiAgICAgfQotICAgIGJvb2wgd2FzX2VtaXR0ZWQgPSBpdC0+d2FzX2VtaXR0ZWQ7CisgICAgYm9vbCB3YXNfZW1pdHRlZCA9IGl0LT5zZWNvbmQud2FzX2VtaXR0ZWQ7CiAgICAgLy8gVGhlIGNhbGxlciB3aWxsIChyZSllbWl0IHRoZSBlbnRyeSwgc28gbWFyayBpdCBhcyBlbWl0dGVkLgotICAgIGl0LT53YXNfZW1pdHRlZCA9IHRydWU7Ci0gICAgcmV0dXJuIEludGVybmluZ0luZGV4RW50cnl7aXQtPmlkLCB3YXNfZW1pdHRlZH07CisgICAgaXQtPnNlY29uZC53YXNfZW1pdHRlZCA9IHRydWU7CisgICAgcmV0dXJuIEludGVybmluZ0luZGV4RW50cnl7aXQtPnNlY29uZC5pZCwgd2FzX2VtaXR0ZWR9OwogICB9CiAKICAgLy8gTWFya3MgYWxsIGVudHJpZXMgYXMgIm5vdCBlbWl0dGVkIiwgc28gdGhhdCB0aGV5IHdpbGwgYmUgcmVlbWl0dGVkIHdoZW4KQEAgLTE1NCw3ICsxMDMsNyBAQAogICAgICAgY2FjaGUuQ2xlYXIoKTsKICAgICB9IGVsc2UgewogICAgICAgZm9yIChhdXRvJiBlbnRyeSA6IGNhY2hlKSB7Ci0gICAgICAgIGVudHJ5Lndhc19lbWl0dGVkID0gZmFsc2U7CisgICAgICAgIGVudHJ5LnNlY29uZC53YXNfZW1pdHRlZCA9IGZhbHNlOwogICAgICAgfQogICAgIH0KICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHJhY2luZy9wdWJsaWMvY3BwL3BlcmZldHRvL2phdmFfaGVhcF9wcm9maWxlci9qYXZhX2hlYXBfcHJvZmlsZXIuY2MgYi9zZXJ2aWNlcy90cmFjaW5nL3B1YmxpYy9jcHAvcGVyZmV0dG8vamF2YV9oZWFwX3Byb2ZpbGVyL2phdmFfaGVhcF9wcm9maWxlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzg3ZDc2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHJhY2luZy9wdWJsaWMvY3BwL3BlcmZldHRvL2phdmFfaGVhcF9wcm9maWxlci9qYXZhX2hlYXBfcHJvZmlsZXIuY2MKQEAgLTAsMCArMSwzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTkgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAic2VydmljZXMvdHJhY2luZy9wdWJsaWMvY3BwL3BlcmZldHRvL2phdmFfaGVhcF9wcm9maWxlci9qYXZhX2hlYXBfcHJvZmlsZXIuaCIKKworI2luY2x1ZGUgInNlcnZpY2VzL3RyYWNpbmcvcHVibGljL2NwcC9wZXJmZXR0by9wZXJmZXR0b190cmFjZWRfcHJvY2Vzcy5oIgorCituYW1lc3BhY2UgdHJhY2luZyB7CisKK0phdmFIZWFwUHJvZmlsZXI6OkphdmFIZWFwUHJvZmlsZXIoKQorICAgIDogRGF0YVNvdXJjZUJhc2UobW9qb206OmtKYXZhSGVhcFByb2ZpbGVyU291cmNlTmFtZSkge30KKworLy8gc3RhdGljCitKYXZhSGVhcFByb2ZpbGVyKiBKYXZhSGVhcFByb2ZpbGVyOjpHZXRJbnN0YW5jZSgpIHsKKyAgc3RhdGljIGJhc2U6Ok5vRGVzdHJ1Y3RvcjxKYXZhSGVhcFByb2ZpbGVyPiBpbnN0YW5jZTsKKyAgcmV0dXJuIGluc3RhbmNlLmdldCgpOworfQorCit2b2lkIEphdmFIZWFwUHJvZmlsZXI6OlN0YXJ0VHJhY2luZygKKyAgICBQZXJmZXR0b1Byb2R1Y2VyKiBwcm9kdWNlciwKKyAgICBjb25zdCBwZXJmZXR0bzo6RGF0YVNvdXJjZUNvbmZpZyYgZGF0YV9zb3VyY2VfY29uZmlnKSB7fQorCit2b2lkIEphdmFIZWFwUHJvZmlsZXI6OlN0b3BUcmFjaW5nKGJhc2U6Ok9uY2VDbG9zdXJlIHN0b3BfY29tcGxldGVfY2FsbGJhY2spIHsKKyAgcHJvZHVjZXJfID0gbnVsbHB0cjsKKyAgc3RkOjptb3ZlKHN0b3BfY29tcGxldGVfY2FsbGJhY2spLlJ1bigpOworfQorCit2b2lkIEphdmFIZWFwUHJvZmlsZXI6OkZsdXNoKGJhc2U6OlJlcGVhdGluZ0Nsb3N1cmUgZmx1c2hfY29tcGxldGVfY2FsbGJhY2spIHsKKyAgZmx1c2hfY29tcGxldGVfY2FsbGJhY2suUnVuKCk7Cit9Cit9ICAvLyBuYW1lc3BhY2UgdHJhY2luZwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHJhY2luZy9wdWJsaWMvY3BwL3BlcmZldHRvL2phdmFfaGVhcF9wcm9maWxlci9qYXZhX2hlYXBfcHJvZmlsZXIuaCBiL3NlcnZpY2VzL3RyYWNpbmcvcHVibGljL2NwcC9wZXJmZXR0by9qYXZhX2hlYXBfcHJvZmlsZXIvamF2YV9oZWFwX3Byb2ZpbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM1ZjIzM2MKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90cmFjaW5nL3B1YmxpYy9jcHAvcGVyZmV0dG8vamF2YV9oZWFwX3Byb2ZpbGVyL2phdmFfaGVhcF9wcm9maWxlci5oCkBAIC0wLDAgKzEsMzIgQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2lmbmRlZiBTRVJWSUNFU19UUkFDSU5HX1BVQkxJQ19DUFBfUEVSRkVUVE9fSkFWQV9IRUFQX1BST0ZJTEVSX0pBVkFfSEVBUF9QUk9GSUxFUl9IXworI2RlZmluZSBTRVJWSUNFU19UUkFDSU5HX1BVQkxJQ19DUFBfUEVSRkVUVE9fSkFWQV9IRUFQX1BST0ZJTEVSX0pBVkFfSEVBUF9QUk9GSUxFUl9IXworCisjaW5jbHVkZSAiYmFzZS9jb21wb25lbnRfZXhwb3J0LmgiCisjaW5jbHVkZSAic2VydmljZXMvdHJhY2luZy9wdWJsaWMvY3BwL3BlcmZldHRvL3BlcmZldHRvX3RyYWNlZF9wcm9jZXNzLmgiCisKK25hbWVzcGFjZSB0cmFjaW5nIHsKKworLy8gVGhpcyBpcyBhIEphdmEgaGVhcCBwcm9maWxlciBvbiBBbmRyb2lkIHRoYXQgcHJvdmlkZXMgaGVhcCBkdW1wcyB0bworLy8gdHJhY2luZyBUaGUgcHJvZmlsZXIgaXMgZW5hYmxlZCBiYXNlZCBvbgorLy8gRElTQUJMRURfQllfREVGQVVMVCgiamF2YV9oZWFwX3Byb2ZpbGVyIikgY2F0ZWdvcnkuCitjbGFzcyBDT01QT05FTlRfRVhQT1JUKFRSQUNJTkdfQ1BQKSBKYXZhSGVhcFByb2ZpbGVyCisgICAgOiBwdWJsaWMgUGVyZmV0dG9UcmFjZWRQcm9jZXNzOjpEYXRhU291cmNlQmFzZSB7CisgcHVibGljOgorICBzdGF0aWMgSmF2YUhlYXBQcm9maWxlciogR2V0SW5zdGFuY2UoKTsKKworICBKYXZhSGVhcFByb2ZpbGVyKCk7CisKKyAgLy8gUGVyZmV0dG9UcmFjZWRQcm9jZXNzOjpEYXRhU291cmNlQmFzZSBpbXBsZW1lbnRhdGlvbjoKKyAgdm9pZCBTdGFydFRyYWNpbmcoCisgICAgICBQZXJmZXR0b1Byb2R1Y2VyKiBwcm9kdWNlciwKKyAgICAgIGNvbnN0IHBlcmZldHRvOjpEYXRhU291cmNlQ29uZmlnJiBkYXRhX3NvdXJjZV9jb25maWcpIG92ZXJyaWRlOworICB2b2lkIFN0b3BUcmFjaW5nKGJhc2U6Ok9uY2VDbG9zdXJlIHN0b3BfY29tcGxldGVfY2FsbGJhY2spIG92ZXJyaWRlOworICB2b2lkIEZsdXNoKGJhc2U6OlJlcGVhdGluZ0Nsb3N1cmUgZmx1c2hfY29tcGxldGVfY2FsbGJhY2spIG92ZXJyaWRlOworfTsKK30gIC8vIG5hbWVzcGFjZSB0cmFjaW5nCisKKyNlbmRpZiAgLy8gU0VSVklDRVNfVFJBQ0lOR19QVUJMSUNfQ1BQX1BFUkZFVFRPX0pBVkFfSEVBUF9QUk9GSUxFUl9KQVZBX0hFQVBfUFJPRklMRVJfSF8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3RyYWNpbmcvcHVibGljL2NwcC9wZXJmZXR0by9wZXJmZXR0b19jb25maWcuY2MgYi9zZXJ2aWNlcy90cmFjaW5nL3B1YmxpYy9jcHAvcGVyZmV0dG8vcGVyZmV0dG9fY29uZmlnLmNjCmluZGV4IDMyZWY3OGU5Li44YmJmYTAzOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvdHJhY2luZy9wdWJsaWMvY3BwL3BlcmZldHRvL3BlcmZldHRvX2NvbmZpZy5jYworKysgYi9zZXJ2aWNlcy90cmFjaW5nL3B1YmxpYy9jcHAvcGVyZmV0dG8vcGVyZmV0dG9fY29uZmlnLmNjCkBAIC0xMjQsNiArMTI0LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjaHJvbWVfY29uZmlnX3N0cmluZywgcHJpdmFjeV9maWx0ZXJpbmdfZW5hYmxlZCk7CiAgIH0KIAorICBpZiAoY2hyb21lX2NvbmZpZy5Jc0NhdGVnb3J5R3JvdXBFbmFibGVkKAorICAgICAgICAgIFRSQUNFX0RJU0FCTEVEX0JZX0RFRkFVTFQoImphdmFfaGVhcF9wcm9maWxlciIpKSkgeworICAgIEFkZERhdGFTb3VyY2VDb25maWcoJnBlcmZldHRvX2NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNpbmc6Om1vam9tOjprSmF2YUhlYXBQcm9maWxlclNvdXJjZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjaHJvbWVfY29uZmlnX3N0cmluZywgcHJpdmFjeV9maWx0ZXJpbmdfZW5hYmxlZCk7CisgIH0KKwogICByZXR1cm4gcGVyZmV0dG9fY29uZmlnOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90cmFjaW5nL3B1YmxpYy9jcHAvcGVyZmV0dG8vdHJhY2tfZXZlbnRfdGhyZWFkX2xvY2FsX2V2ZW50X3NpbmsuY2MgYi9zZXJ2aWNlcy90cmFjaW5nL3B1YmxpYy9jcHAvcGVyZmV0dG8vdHJhY2tfZXZlbnRfdGhyZWFkX2xvY2FsX2V2ZW50X3NpbmsuY2MKaW5kZXggMmNhMDkxNC4uYTQ4NGEyZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvdHJhY2luZy9wdWJsaWMvY3BwL3BlcmZldHRvL3RyYWNrX2V2ZW50X3RocmVhZF9sb2NhbF9ldmVudF9zaW5rLmNjCisrKyBiL3NlcnZpY2VzL3RyYWNpbmcvcHVibGljL2NwcC9wZXJmZXR0by90cmFja19ldmVudF90aHJlYWRfbG9jYWxfZXZlbnRfc2luay5jYwpAQCAtMTY5LDYgKzE2OSwxMiBAQAogICAgIDogVGhyZWFkTG9jYWxFdmVudFNpbmsoc3RkOjptb3ZlKHRyYWNlX3dyaXRlciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZV9pbnRlcm5pbmcpLAorICAgICAgLy8gVE9ETyhlc2Vja2xlcik6IFR1bmUgdGhlc2UgdmFsdWVzIGV4cGVyaW1lbnRhbGx5LgorICAgICAgaW50ZXJuZWRfZXZlbnRfY2F0ZWdvcmllc18oMTAwMCksCisgICAgICBpbnRlcm5lZF9ldmVudF9uYW1lc18oMTAwMCwgMTAwKSwKKyAgICAgIGludGVybmVkX2Fubm90YXRpb25fbmFtZXNfKDEwMDAsIDEwMCksCisgICAgICBpbnRlcm5lZF9zb3VyY2VfbG9jYXRpb25zXygxMDAwKSwKKyAgICAgIGludGVybmVkX2xvZ19tZXNzYWdlX2JvZGllc18oMTAwKSwKICAgICAgIHByb2Nlc3NfaWRfKFRyYWNlTG9nOjpHZXRJbnN0YW5jZSgpLT5wcm9jZXNzX2lkKCkpLAogICAgICAgdGhyZWFkX2lkXyhzdGF0aWNfY2FzdDxpbnQ+KGJhc2U6OlBsYXRmb3JtVGhyZWFkOjpDdXJyZW50SWQoKSkpLAogICAgICAgcHJpdmFjeV9maWx0ZXJpbmdfZW5hYmxlZF8ocHJvdG9fd3JpdGVyX2ZpbHRlcmluZ19lbmFibGVkKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90cmFjaW5nL3B1YmxpYy9jcHAvcGVyZmV0dG8vdHJhY2tfZXZlbnRfdGhyZWFkX2xvY2FsX2V2ZW50X3NpbmsuaCBiL3NlcnZpY2VzL3RyYWNpbmcvcHVibGljL2NwcC9wZXJmZXR0by90cmFja19ldmVudF90aHJlYWRfbG9jYWxfZXZlbnRfc2luay5oCmluZGV4IDlhNGI5MGEuLjUyYTA3MWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3RyYWNpbmcvcHVibGljL2NwcC9wZXJmZXR0by90cmFja19ldmVudF90aHJlYWRfbG9jYWxfZXZlbnRfc2luay5oCisrKyBiL3NlcnZpY2VzL3RyYWNpbmcvcHVibGljL2NwcC9wZXJmZXR0by90cmFja19ldmVudF90aHJlYWRfbG9jYWxfZXZlbnRfc2luay5oCkBAIC02OSwxMyArNjksMTIgQEAKIAogICAvLyBUT0RPKGVzZWNrbGVyKTogTWFrZSBpdCBwb3NzaWJsZSB0byByZWdpc3RlciBuZXcgaW5kZXhlcyBmb3IgdXNlIGZyb20KICAgLy8gVFJBQ0VfRVZFTlQgbWFjcm9zLgotICAvLyBUT0RPKGVzZWNrbGVyKTogVHVuZSB0aGUgY2FjaGUgc2l6ZXMgZXhwZXJpbWVudGFsbHkuCi0gIEludGVybmluZ0luZGV4PDEwMjQsIGNvbnN0IGNoYXIqPiBpbnRlcm5lZF9ldmVudF9jYXRlZ29yaWVzXzsKLSAgSW50ZXJuaW5nSW5kZXg8MTAyNCwgY29uc3QgY2hhciosIHN0ZDo6c3RyaW5nPiBpbnRlcm5lZF9ldmVudF9uYW1lc187Ci0gIEludGVybmluZ0luZGV4PDEwMjQsIGNvbnN0IGNoYXIqLCBzdGQ6OnN0cmluZz4gaW50ZXJuZWRfYW5ub3RhdGlvbl9uYW1lc187Ci0gIEludGVybmluZ0luZGV4PDEwMjQsIHN0ZDo6dHVwbGU8Y29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBpbnQ+PgorICBJbnRlcm5pbmdJbmRleDxjb25zdCBjaGFyKj4gaW50ZXJuZWRfZXZlbnRfY2F0ZWdvcmllc187CisgIEludGVybmluZ0luZGV4PGNvbnN0IGNoYXIqLCBzdGQ6OnN0cmluZz4gaW50ZXJuZWRfZXZlbnRfbmFtZXNfOworICBJbnRlcm5pbmdJbmRleDxjb25zdCBjaGFyKiwgc3RkOjpzdHJpbmc+IGludGVybmVkX2Fubm90YXRpb25fbmFtZXNfOworICBJbnRlcm5pbmdJbmRleDxzdGQ6OnR1cGxlPGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgaW50Pj4KICAgICAgIGludGVybmVkX3NvdXJjZV9sb2NhdGlvbnNfOwotICBJbnRlcm5pbmdJbmRleDwxMjgsIHN0ZDo6c3RyaW5nPiBpbnRlcm5lZF9sb2dfbWVzc2FnZV9ib2RpZXNfOworICBJbnRlcm5pbmdJbmRleDxzdGQ6OnN0cmluZz4gaW50ZXJuZWRfbG9nX21lc3NhZ2VfYm9kaWVzXzsKIAogICBzdGF0aWMgc3RkOjphdG9taWM8dWludDMyX3Q+IGluY3JlbWVudGFsX3N0YXRlX3Jlc2V0X2lkXzsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHJhY2luZy9wdWJsaWMvY3BwL3N0YWNrX3NhbXBsaW5nL3RyYWNpbmdfc2FtcGxlcl9wcm9maWxlci5oIGIvc2VydmljZXMvdHJhY2luZy9wdWJsaWMvY3BwL3N0YWNrX3NhbXBsaW5nL3RyYWNpbmdfc2FtcGxlcl9wcm9maWxlci5oCmluZGV4IDZkNzFmOWUuLjdkMGJmNjEwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90cmFjaW5nL3B1YmxpYy9jcHAvc3RhY2tfc2FtcGxpbmcvdHJhY2luZ19zYW1wbGVyX3Byb2ZpbGVyLmgKKysrIGIvc2VydmljZXMvdHJhY2luZy9wdWJsaWMvY3BwL3N0YWNrX3NhbXBsaW5nL3RyYWNpbmdfc2FtcGxlcl9wcm9maWxlci5oCkBAIC03OCwxNSArNzgsMTQgQEAKICAgICBjb25zdCBiYXNlOjpQbGF0Zm9ybVRocmVhZElkIHNhbXBsZWRfdGhyZWFkX2lkXzsKICAgICBiYXNlOjpMb2NrIHRyYWNlX3dyaXRlcl9sb2NrXzsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8cGVyZmV0dG86OlRyYWNlV3JpdGVyPiB0cmFjZV93cml0ZXJfOwotICAgIEludGVybmluZ0luZGV4PDEwMjQsIHNpemVfdD4gaW50ZXJuZWRfY2FsbHN0YWNrc197fTsKLSAgICBJbnRlcm5pbmdJbmRleDwxMDI0LAotICAgICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+LAorICAgIEludGVybmluZ0luZGV4PHNpemVfdD4gaW50ZXJuZWRfY2FsbHN0YWNrc197MTAwMH07CisgICAgSW50ZXJuaW5nSW5kZXg8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4sCiAgICAgICAgICAgICAgICAgICAgc3RkOjpwYWlyPHVpbnRwdHJfdCwgc3RkOjpzdHJpbmc+PgotICAgICAgICBpbnRlcm5lZF9mcmFtZXNfe307Ci0gICAgSW50ZXJuaW5nSW5kZXg8MTAyNCwgc3RkOjpzdHJpbmc+IGludGVybmVkX2ZyYW1lX25hbWVzX3t9OwotICAgIEludGVybmluZ0luZGV4PDEwMjQsIHN0ZDo6c3RyaW5nPiBpbnRlcm5lZF9tb2R1bGVfbmFtZXNfe307Ci0gICAgSW50ZXJuaW5nSW5kZXg8MTAyNCwgc3RkOjpzdHJpbmc+IGludGVybmVkX21vZHVsZV9pZHNfe307Ci0gICAgSW50ZXJuaW5nSW5kZXg8MTAyNCwgdWludHB0cl90PiBpbnRlcm5lZF9tb2R1bGVzX3t9OworICAgICAgICBpbnRlcm5lZF9mcmFtZXNfezEwMDAsIDEwMDB9OworICAgIEludGVybmluZ0luZGV4PHN0ZDo6c3RyaW5nPiBpbnRlcm5lZF9mcmFtZV9uYW1lc197MTAwMH07CisgICAgSW50ZXJuaW5nSW5kZXg8c3RkOjpzdHJpbmc+IGludGVybmVkX21vZHVsZV9uYW1lc197MTAwMH07CisgICAgSW50ZXJuaW5nSW5kZXg8c3RkOjpzdHJpbmc+IGludGVybmVkX21vZHVsZV9pZHNfezEwMDB9OworICAgIEludGVybmluZ0luZGV4PHVpbnRwdHJfdD4gaW50ZXJuZWRfbW9kdWxlc197MTAwMH07CiAgICAgYm9vbCByZXNldF9pbmNyZW1lbnRhbF9zdGF0ZV8gPSB0cnVlOwogICAgIHVpbnQzMl90IGxhc3RfaW5jcmVtZW50YWxfc3RhdGVfcmVzZXRfaWRfID0gMDsKICAgICBpbnQzMl90IGxhc3RfZW1pdHRlZF9wcm9jZXNzX3ByaW9yaXR5XyA9IC0xOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHJhY2luZy9wdWJsaWMvbW9qb20vcGVyZmV0dG9fc2VydmljZS5tb2pvbSBiL3NlcnZpY2VzL3RyYWNpbmcvcHVibGljL21vam9tL3BlcmZldHRvX3NlcnZpY2UubW9qb20KaW5kZXggNjA0ZDIyOS4uNzhjOGUzNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvdHJhY2luZy9wdWJsaWMvbW9qb20vcGVyZmV0dG9fc2VydmljZS5tb2pvbQorKysgYi9zZXJ2aWNlcy90cmFjaW5nL3B1YmxpYy9tb2pvbS9wZXJmZXR0b19zZXJ2aWNlLm1vam9tCkBAIC0xMCw2ICsxMCw3IEBACiBjb25zdCBzdHJpbmcga1N5c3RlbVRyYWNlRGF0YVNvdXJjZU5hbWUgPSAib3JnLmNocm9taXVtLnRyYWNlX3N5c3RlbSI7CiBjb25zdCBzdHJpbmcga0FyY1RyYWNlRGF0YVNvdXJjZU5hbWUgPSAib3JnLmNocm9taXVtLnRyYWNlX2FyYyI7CiBjb25zdCBzdHJpbmcga1NhbXBsZXJQcm9maWxlclNvdXJjZU5hbWUgPSAib3JnLmNocm9taXVtLnNhbXBsZXJfcHJvZmlsZXIiOworY29uc3Qgc3RyaW5nIGtKYXZhSGVhcFByb2ZpbGVyU291cmNlTmFtZSA9ICJvcmcuY2hyb21pdW0uamF2YV9oZWFwX3Byb2ZpbGVyIjsKIAogLy8gQnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGZsb3c6IFRoZXJlJ3MgYSBwZXItcHJvY2VzcyBQcm9kdWNlckNsaWVudCB3aGljaAogLy8gY29ubmVjdHMgdG8gdGhlIGNlbnRyYWwgUGVyZmV0dG9TZXJ2aWNlIGFuZCBlc3RhYmxpc2hlcyBhIHR3by13YXkgY29ubmVjdGlvbgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHJhY2luZy90cmFjaW5nX3NlcnZpY2UuY2MgYi9zZXJ2aWNlcy90cmFjaW5nL3RyYWNpbmdfc2VydmljZS5jYwppbmRleCA1NjliMzQ1Li5jMzQyOGE3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90cmFjaW5nL3RyYWNpbmdfc2VydmljZS5jYworKysgYi9zZXJ2aWNlcy90cmFjaW5nL3RyYWNpbmdfc2VydmljZS5jYwpAQCAtMTg5LDcgKzE4OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodHJhY2luZ19jb29yZGluYXRvcl8uZ2V0KCkpKSk7CiAKICAgcmVnaXN0cnlfLkFkZEludGVyZmFjZSgKLSAgICAgIGJhc2U6OkJpbmRSZXBlYXRpbmcoJkNvbnN1bWVySG9zdDo6QmluZENvbnN1bWVyUmVxdWVzdCwKKyAgICAgIGJhc2U6OkJpbmRSZXBlYXRpbmcoJkNvbnN1bWVySG9zdDo6QmluZENvbnN1bWVyUmVjZWl2ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoUGVyZmV0dG9TZXJ2aWNlOjpHZXRJbnN0YW5jZSgpKSkpOwogCiAgIHNlcnZpY2VfbGlzdGVuZXJfID0gc3RkOjptYWtlX3VuaXF1ZTxTZXJ2aWNlTGlzdGVuZXI+KApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdml6L3B1YmxpYy9jcHAvY29tcG9zaXRpbmcvbW9qb21fdHJhaXRzX3BlcmZ0ZXN0LmNjIGIvc2VydmljZXMvdml6L3B1YmxpYy9jcHAvY29tcG9zaXRpbmcvbW9qb21fdHJhaXRzX3BlcmZ0ZXN0LmNjCmluZGV4IDg0ZjdlZjE2Li41MzdlOTVkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy92aXovcHVibGljL2NwcC9jb21wb3NpdGluZy9tb2pvbV90cmFpdHNfcGVyZnRlc3QuY2MKKysrIGIvc2VydmljZXMvdml6L3B1YmxpYy9jcHAvY29tcG9zaXRpbmcvbW9qb21fdHJhaXRzX3BlcmZ0ZXN0LmNjCkBAIC0xOSw3ICsxOSw3IEBACiAjaW5jbHVkZSAic2VydmljZXMvdml6L3B1YmxpYy9jcHAvY29tcG9zaXRpbmcvc2hhcmVkX3F1YWRfc3RhdGVfbW9qb21fdHJhaXRzLmgiCiAjaW5jbHVkZSAic2VydmljZXMvdml6L3B1YmxpYy9jcHAvY29tcG9zaXRpbmcvc3VyZmFjZV9pZF9tb2pvbV90cmFpdHMuaCIKICNpbmNsdWRlICJzZXJ2aWNlcy92aXovcHVibGljL21vam9tL2NvbXBvc2l0aW5nL2NvbXBvc2l0b3JfZnJhbWUubW9qb20uaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL3BlcmYvcGVyZl90ZXN0LmgiCisjaW5jbHVkZSAidGVzdGluZy9wZXJmL3BlcmZfcmVzdWx0X3JlcG9ydGVyLmgiCiAjaW5jbHVkZSAidWkvZ2Z4L2dlb21ldHJ5L21vam9tL2dlb21ldHJ5X21vam9tX3RyYWl0cy5oIgogI2luY2x1ZGUgInVpL2dmeC9tb2pvbS9zZWxlY3Rpb25fYm91bmRfbW9qb21fdHJhaXRzLmgiCiAjaW5jbHVkZSAidWkvbGF0ZW5jeS9tb2pvbS9sYXRlbmN5X2luZm9fbW9qb21fdHJhaXRzLmgiCkBAIC0zMywxMCArMzMsMzcgQEAKIAogZW51bSBjbGFzcyBVc2VTaW5nbGVTaGFyZWRRdWFkU3RhdGUgeyBZRVMsIE5PIH07CiAKK2NvbnN0ZXhwciBjaGFyIGtNZXRyaWNQcmVmaXhWaXpTZXJpYWxpemF0aW9uW10gPSAiVml6U2VyaWFsaXphdGlvbi4iOworY29uc3RleHByIGNoYXIga01ldHJpY1N0cnVjdERlc2VyaWFsaXphdGlvblRpbWVVc1tdID0KKyAgICAiU3RydWN0VHJhaXRzX21pbl9mcmFtZV9kZXNlcmlhbGl6YXRpb25fdGltZSI7Citjb25zdGV4cHIgY2hhciBrTWV0cmljU3RydWN0RGVzZXJpYWxpemF0aW9uVGhyb3VnaHB1dFJ1bnNQZXJTW10gPQorICAgICJTdHJ1Y3RUcmFpdHNfZGVzZXJpYWxpemF0aW9uX3Rocm91Z2hwdXQiOworY29uc3RleHByIGNoYXIga01ldHJpY1N0cnVjdFNlcmlhbGl6YXRpb25UaW1lVXNbXSA9CisgICAgIlN0cnVjdFRyYWl0c19taW5fZnJhbWVfc2VyaWFsaXphdGlvbl90aW1lIjsKK2NvbnN0ZXhwciBjaGFyIGtNZXRyaWNTdHJ1Y3RTZXJpYWxpemF0aW9uVGhyb3VnaHB1dFJ1bnNQZXJTW10gPQorICAgICJTdHJ1Y3RUcmFpdHNfc2VyaWFsaXphdGlvbl90aHJvdWdocHV0IjsKKworcGVyZl90ZXN0OjpQZXJmUmVzdWx0UmVwb3J0ZXIgU2V0VXBSZXBvcnRlcigKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgc3RvcnksCisgICAgVXNlU2luZ2xlU2hhcmVkUXVhZFN0YXRlIHNpbmdsZV9zcXMpIHsKKyAgc3RkOjpzdHJpbmcgc3Rvcnlfc3VmZml4ID0gc2luZ2xlX3NxcyA9PSBVc2VTaW5nbGVTaGFyZWRRdWFkU3RhdGU6OllFUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAiX3Blcl9yZW5kZXJfcGFzc19zaGFyZWRfcXVhZF9zdGF0ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIl9wZXJfcXVhZF9zaGFyZWRfcXVhZF9zdGF0ZSI7CisgIHBlcmZfdGVzdDo6UGVyZlJlc3VsdFJlcG9ydGVyIHJlcG9ydGVyKGtNZXRyaWNQcmVmaXhWaXpTZXJpYWxpemF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yeSArIHN0b3J5X3N1ZmZpeCk7CisgIHJlcG9ydGVyLlJlZ2lzdGVySW1wb3J0YW50TWV0cmljKGtNZXRyaWNTdHJ1Y3REZXNlcmlhbGl6YXRpb25UaW1lVXMsICJ1cyIpOworICByZXBvcnRlci5SZWdpc3RlckltcG9ydGFudE1ldHJpYygKKyAgICAgIGtNZXRyaWNTdHJ1Y3REZXNlcmlhbGl6YXRpb25UaHJvdWdocHV0UnVuc1BlclMsICJydW5zL3MiKTsKKyAgcmVwb3J0ZXIuUmVnaXN0ZXJJbXBvcnRhbnRNZXRyaWMoa01ldHJpY1N0cnVjdFNlcmlhbGl6YXRpb25UaW1lVXMsICJ1cyIpOworICByZXBvcnRlci5SZWdpc3RlckltcG9ydGFudE1ldHJpYyhrTWV0cmljU3RydWN0U2VyaWFsaXphdGlvblRocm91Z2hwdXRSdW5zUGVyUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJ1bnMvcyIpOworICByZXR1cm4gcmVwb3J0ZXI7Cit9CisKIGNsYXNzIFZpelNlcmlhbGl6YXRpb25QZXJmVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKICBwcm90ZWN0ZWQ6CiAgIHN0YXRpYyB2b2lkIFJ1bkRlc2VyaWFsaXphdGlvblRlc3RTdHJ1Y3RUcmFpdHMoCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdGVzdF9uYW1lLAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHN0b3J5LAogICAgICAgY29uc3QgQ29tcG9zaXRvckZyYW1lJiBmcmFtZSwKICAgICAgIFVzZVNpbmdsZVNoYXJlZFF1YWRTdGF0ZSBzaW5nbGVfc3FzKSB7CiAgICAgbW9qbzo6TWVzc2FnZSBtZXNzYWdlID0gbW9qb206OkNvbXBvc2l0b3JGcmFtZTo6U2VyaWFsaXplQXNNZXNzYWdlKCZmcmFtZSk7CkBAIC02OCwyMyArOTUsMTUgQEAKICAgICAgIHN0YXJ0ID0gbm93OwogICAgIH0KIAotICAgIHBlcmZfdGVzdDo6UHJpbnRSZXN1bHQoCi0gICAgICAgICJTdHJ1Y3RUcmFpdHMgZGVzZXJpYWxpemF0aW9uIG1pbl9mcmFtZV9kZXNlcmlhbGl6YXRpb25fdGltZSIsCi0gICAgICAgIHNpbmdsZV9zcXMgPT0gVXNlU2luZ2xlU2hhcmVkUXVhZFN0YXRlOjpZRVMKLSAgICAgICAgICAgID8gIl9wZXJfcmVuZGVyX3Bhc3Nfc2hhcmVkX3F1YWRfc3RhdGUiCi0gICAgICAgICAgICA6ICJfcGVyX3F1YWRfc2hhcmVkX3F1YWRfc3RhdGUiLAotICAgICAgICB0ZXN0X25hbWUsIG1pbl90aW1lLkluTWlsbGlzZWNvbmRzRigpIC8ga1RpbWVDaGVja0ludGVydmFsICogMTAwMCwgInVzIiwKLSAgICAgICAgdHJ1ZSk7Ci0gICAgcGVyZl90ZXN0OjpQcmludFJlc3VsdCgKLSAgICAgICAgIlN0cnVjdFRyYWl0cyBkZXNlcmlhbGl6YXRpb246IG51bSBydW5zIGluIDIgc2Vjb25kcyIsCi0gICAgICAgIHNpbmdsZV9zcXMgPT0gVXNlU2luZ2xlU2hhcmVkUXVhZFN0YXRlOjpZRVMKLSAgICAgICAgICAgID8gIl9wZXJfcmVuZGVyX3Bhc3Nfc2hhcmVkX3F1YWRfc3RhdGUiCi0gICAgICAgICAgICA6ICJfcGVyX3F1YWRfc2hhcmVkX3F1YWRfc3RhdGUiLAotICAgICAgICB0ZXN0X25hbWUsIGNvdW50LCAicnVucy9zIiwgdHJ1ZSk7CisgICAgYXV0byByZXBvcnRlciA9IFNldFVwUmVwb3J0ZXIoc3RvcnksIHNpbmdsZV9zcXMpOworICAgIHJlcG9ydGVyLkFkZFJlc3VsdChrTWV0cmljU3RydWN0RGVzZXJpYWxpemF0aW9uVGltZVVzLAorICAgICAgICAgICAgICAgICAgICAgICBtaW5fdGltZS5Jbk1pY3Jvc2Vjb25kc0YoKSAvIGtUaW1lQ2hlY2tJbnRlcnZhbCk7CisgICAgcmVwb3J0ZXIuQWRkUmVzdWx0KGtNZXRyaWNTdHJ1Y3REZXNlcmlhbGl6YXRpb25UaHJvdWdocHV0UnVuc1BlclMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICogMTAwMCAvIGtUaW1lTGltaXRNaWxsaXMpOwogICB9CiAKICAgc3RhdGljIHZvaWQgUnVuU2VyaWFsaXphdGlvblRlc3RTdHJ1Y3RUcmFpdHMoCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdGVzdF9uYW1lLAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHN0b3J5LAogICAgICAgY29uc3QgQ29tcG9zaXRvckZyYW1lJiBmcmFtZSwKICAgICAgIFVzZVNpbmdsZVNoYXJlZFF1YWRTdGF0ZSBzaW5nbGVfc3FzKSB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtV2FybXVwUnVuczsgKytpKSB7CkBAIC0xMTMsMjEgKzEzMiwxNCBAQAogICAgICAgc3RhcnQgPSBub3c7CiAgICAgfQogCi0gICAgcGVyZl90ZXN0OjpQcmludFJlc3VsdCgKLSAgICAgICAgIlN0cnVjdFRyYWl0cyBzZXJpYWxpemF0aW9uIG1pbl9mcmFtZV9zZXJpYWxpemF0aW9uX3RpbWUiLAotICAgICAgICBzaW5nbGVfc3FzID09IFVzZVNpbmdsZVNoYXJlZFF1YWRTdGF0ZTo6WUVTCi0gICAgICAgICAgICA/ICJfcGVyX3JlbmRlcl9wYXNzX3NoYXJlZF9xdWFkX3N0YXRlIgotICAgICAgICAgICAgOiAiX3Blcl9xdWFkX3NoYXJlZF9xdWFkX3N0YXRlIiwKLSAgICAgICAgdGVzdF9uYW1lLCBtaW5fdGltZS5Jbk1pbGxpc2Vjb25kc0YoKSAvIGtUaW1lQ2hlY2tJbnRlcnZhbCAqIDEwMDAsICJ1cyIsCi0gICAgICAgIHRydWUpOwotICAgIHBlcmZfdGVzdDo6UHJpbnRSZXN1bHQoIlN0cnVjdFRyYWl0cyBzZXJpYWxpemF0aW9uOiBudW0gcnVucyBpbiAyIHNlY29uZHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlX3NxcyA9PSBVc2VTaW5nbGVTaGFyZWRRdWFkU3RhdGU6OllFUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIl9wZXJfcmVuZGVyX3Bhc3Nfc2hhcmVkX3F1YWRfc3RhdGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiX3Blcl9xdWFkX3NoYXJlZF9xdWFkX3N0YXRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfbmFtZSwgY291bnQsICJydW5zL3MiLCB0cnVlKTsKKyAgICBhdXRvIHJlcG9ydGVyID0gU2V0VXBSZXBvcnRlcihzdG9yeSwgc2luZ2xlX3Nxcyk7CisgICAgcmVwb3J0ZXIuQWRkUmVzdWx0KGtNZXRyaWNTdHJ1Y3RTZXJpYWxpemF0aW9uVGltZVVzLAorICAgICAgICAgICAgICAgICAgICAgICBtaW5fdGltZS5Jbk1pY3Jvc2Vjb25kc0YoKSAvIGtUaW1lQ2hlY2tJbnRlcnZhbCk7CisgICAgcmVwb3J0ZXIuQWRkUmVzdWx0KGtNZXRyaWNTdHJ1Y3RTZXJpYWxpemF0aW9uVGhyb3VnaHB1dFJ1bnNQZXJTLAorICAgICAgICAgICAgICAgICAgICAgICBjb3VudCAqIDEwMDAgLyBrVGltZUxpbWl0TWlsbGlzKTsKICAgfQogCi0gIHN0YXRpYyB2b2lkIFJ1bkNvbXBsZXhDb21wb3NpdG9yRnJhbWVUZXN0KGNvbnN0IHN0ZDo6c3RyaW5nJiB0ZXN0X25hbWUpIHsKKyAgc3RhdGljIHZvaWQgUnVuQ29tcGxleENvbXBvc2l0b3JGcmFtZVRlc3QoY29uc3Qgc3RkOjpzdHJpbmcmIHN0b3J5KSB7CiAgICAgQ29tcG9zaXRvckZyYW1lIGZyYW1lOwogICAgIGZyYW1lLm1ldGFkYXRhLmJlZ2luX2ZyYW1lX2FjayA9IEJlZ2luRnJhbWVBY2soMCwgMSwgdHJ1ZSk7CiAKQEAgLTI4MywxMCArMjk1LDEwIEBACiAgICAgfQogCiAgICAgcmVuZGVyX3Bhc3NfbGlzdC5wdXNoX2JhY2soc3RkOjptb3ZlKHBhc3NfaW4pKTsKLSAgICBSdW5UZXN0KHRlc3RfbmFtZSwgc3RkOjptb3ZlKGZyYW1lKSwgVXNlU2luZ2xlU2hhcmVkUXVhZFN0YXRlOjpOTyk7CisgICAgUnVuVGVzdChzdG9yeSwgc3RkOjptb3ZlKGZyYW1lKSwgVXNlU2luZ2xlU2hhcmVkUXVhZFN0YXRlOjpOTyk7CiAgIH0KIAotICBzdGF0aWMgdm9pZCBSdW5Db21wb3NpdG9yRnJhbWVUZXN0KGNvbnN0IHN0ZDo6c3RyaW5nJiB0ZXN0X25hbWUsCisgIHN0YXRpYyB2b2lkIFJ1bkNvbXBvc2l0b3JGcmFtZVRlc3QoY29uc3Qgc3RkOjpzdHJpbmcmIHN0b3J5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG51bV9xdWFkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBudW1fcGFzc2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZVNpbmdsZVNoYXJlZFF1YWRTdGF0ZSBzaW5nbGVfc3FzKSB7CkBAIC0zMDYsMTQgKzMxOCwxNCBAQAogICAgICAgfQogICAgICAgZnJhbWUucmVuZGVyX3Bhc3NfbGlzdC5wdXNoX2JhY2soc3RkOjptb3ZlKHJlbmRlcl9wYXNzKSk7CiAgICAgfQotICAgIFJ1blRlc3QodGVzdF9uYW1lLCBzdGQ6Om1vdmUoZnJhbWUpLCBzaW5nbGVfc3FzKTsKKyAgICBSdW5UZXN0KHN0b3J5LCBzdGQ6Om1vdmUoZnJhbWUpLCBzaW5nbGVfc3FzKTsKICAgfQogCi0gIHN0YXRpYyB2b2lkIFJ1blRlc3QoY29uc3Qgc3RkOjpzdHJpbmcmIHRlc3RfbmFtZSwKKyAgc3RhdGljIHZvaWQgUnVuVGVzdChjb25zdCBzdGQ6OnN0cmluZyYgc3RvcnksCiAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRvckZyYW1lIGZyYW1lLAogICAgICAgICAgICAgICAgICAgICAgIFVzZVNpbmdsZVNoYXJlZFF1YWRTdGF0ZSBzaW5nbGVfc3FzKSB7Ci0gICAgUnVuU2VyaWFsaXphdGlvblRlc3RTdHJ1Y3RUcmFpdHModGVzdF9uYW1lLCBmcmFtZSwgc2luZ2xlX3Nxcyk7Ci0gICAgUnVuRGVzZXJpYWxpemF0aW9uVGVzdFN0cnVjdFRyYWl0cyh0ZXN0X25hbWUsIGZyYW1lLCBzaW5nbGVfc3FzKTsKKyAgICBSdW5TZXJpYWxpemF0aW9uVGVzdFN0cnVjdFRyYWl0cyhzdG9yeSwgZnJhbWUsIHNpbmdsZV9zcXMpOworICAgIFJ1bkRlc2VyaWFsaXphdGlvblRlc3RTdHJ1Y3RUcmFpdHMoc3RvcnksIGZyYW1lLCBzaW5nbGVfc3FzKTsKICAgfQogfTsKIApkaWZmIC0tZ2l0IGEvc3RvcmFnZS9icm93c2VyL2Jsb2IvYmxvYl9idWlsZGVyX2Zyb21fc3RyZWFtLmNjIGIvc3RvcmFnZS9icm93c2VyL2Jsb2IvYmxvYl9idWlsZGVyX2Zyb21fc3RyZWFtLmNjCmluZGV4IDRkZDI1YWE1Li42YTY3NThhIDEwMDY0NAotLS0gYS9zdG9yYWdlL2Jyb3dzZXIvYmxvYi9ibG9iX2J1aWxkZXJfZnJvbV9zdHJlYW0uY2MKKysrIGIvc3RvcmFnZS9icm93c2VyL2Jsb2IvYmxvYl9idWlsZGVyX2Zyb21fc3RyZWFtLmNjCkBAIC00OTUsOCArNDk1LDcgQEAKICAgICAgIGl0ZW1zXy5iYWNrKCktPml0ZW0oKS0+bGVuZ3RoKCkgPCBrTWF4RmlsZVNpemUpIHsKICAgICBhdXRvIGl0ZW0gPSBpdGVtc18uYmFjaygpLT5pdGVtKCk7CiAgICAgdWludDY0X3Qgb2xkX2ZpbGVfc2l6ZSA9IGl0ZW0tPmxlbmd0aCgpOwotICAgIHNjb3BlZF9yZWZwdHI8U2hhcmVhYmxlRmlsZVJlZmVyZW5jZT4gZmlsZV9yZWZlcmVuY2UgPQotICAgICAgICBzdGF0aWNfY2FzdDxTaGFyZWFibGVGaWxlUmVmZXJlbmNlKj4oaXRlbS0+ZGF0YV9oYW5kbGUoKSk7CisgICAgc2NvcGVkX3JlZnB0cjxTaGFyZWFibGVGaWxlUmVmZXJlbmNlPiBmaWxlX3JlZmVyZW5jZSA9IGl0ZW0tPmZpbGVfcmVmXzsKICAgICBEQ0hFQ0soZmlsZV9yZWZlcmVuY2UpOwogICAgIGF1dG8gZmlsZV9zaXplX2RlbHRhID0gc3RkOjptaW4oa01heEZpbGVTaXplIC0gb2xkX2ZpbGVfc2l6ZSwgbGVuZ3RoX2hpbnQpOwogICAgIGNvbnRleHRfLT5tdXRhYmxlX21lbW9yeV9jb250cm9sbGVyKCktPkdyb3dGaWxlQWxsb2NhdGlvbigKQEAgLTYxOCw3ICs2MTcsNyBAQAogICBEQ0hFQ0soIWl0ZW1zXy5lbXB0eSgpKTsKICAgYXV0byBpdGVtID0gaXRlbXNfLmJhY2soKS0+aXRlbSgpOwogICBEQ0hFQ0tfRVEoaXRlbS0+dHlwZSgpLCBCbG9iRGF0YUl0ZW06OlR5cGU6OmtGaWxlKTsKLSAgRENIRUNLX0VRKGl0ZW0tPmRhdGFfaGFuZGxlKCksIGZpbGVfcmVmZXJlbmNlLmdldCgpKTsKKyAgRENIRUNLX0VRKGl0ZW0tPmZpbGVfcmVmXywgZmlsZV9yZWZlcmVuY2UuZ2V0KCkpOwogCiAgIGl0ZW0tPlNldEZpbGVNb2RpZmljYXRpb25UaW1lKG1vZGlmaWNhdGlvbl90aW1lKTsKICAgY3VycmVudF90b3RhbF9zaXplXyArPSBieXRlc193cml0dGVuOwpkaWZmIC0tZ2l0IGEvc3RvcmFnZS9icm93c2VyL2Jsb2IvYmxvYl9kYXRhX2J1aWxkZXIuY2MgYi9zdG9yYWdlL2Jyb3dzZXIvYmxvYi9ibG9iX2RhdGFfYnVpbGRlci5jYwppbmRleCBmZWM0NzljLi5iZDhjYWFkIDEwMDY0NAotLS0gYS9zdG9yYWdlL2Jyb3dzZXIvYmxvYi9ibG9iX2RhdGFfYnVpbGRlci5jYworKysgYi9zdG9yYWdlL2Jyb3dzZXIvYmxvYi9ibG9iX2RhdGFfYnVpbGRlci5jYwpAQCAtMjgxLDggKzI4MSw3IEBACiAgICAgICBjYXNlIEJsb2JEYXRhSXRlbTo6VHlwZTo6a0ZpbGU6IHsKICAgICAgICAgZGF0YV9pdGVtID0gQmxvYkRhdGFJdGVtOjpDcmVhdGVGaWxlKAogICAgICAgICAgICAgc291cmNlX2l0ZW0tPnBhdGgoKSwgc291cmNlX2l0ZW0tPm9mZnNldCgpICsgaXRlbV9vZmZzZXQsIHJlYWRfc2l6ZSwKLSAgICAgICAgICAgIHNvdXJjZV9pdGVtLT5leHBlY3RlZF9tb2RpZmljYXRpb25fdGltZSgpLAotICAgICAgICAgICAgc291cmNlX2l0ZW0tPmRhdGFfaGFuZGxlXyk7CisgICAgICAgICAgICBzb3VyY2VfaXRlbS0+ZXhwZWN0ZWRfbW9kaWZpY2F0aW9uX3RpbWUoKSwgc291cmNlX2l0ZW0tPmZpbGVfcmVmXyk7CiAKICAgICAgICAgaWYgKHNvdXJjZV9pdGVtLT5Jc0Z1dHVyZUZpbGVJdGVtKCkpIHsKICAgICAgICAgICAvLyBUaGUgc291cmNlIGZpbGUgaXNuJ3QgYSByZWFsIGZpbGUgeWV0IChwYXRoIGlzIGZha2UpLCBzbyBzdG9yZSB0aGUKZGlmZiAtLWdpdCBhL3N0b3JhZ2UvYnJvd3Nlci9ibG9iL2Jsb2JfZGF0YV9pdGVtLmNjIGIvc3RvcmFnZS9icm93c2VyL2Jsb2IvYmxvYl9kYXRhX2l0ZW0uY2MKaW5kZXggMjI1ODJhOWEuLjBhOThlMDkgMTAwNjQ0Ci0tLSBhL3N0b3JhZ2UvYnJvd3Nlci9ibG9iL2Jsb2JfZGF0YV9pdGVtLmNjCisrKyBiL3N0b3JhZ2UvYnJvd3Nlci9ibG9iL2Jsb2JfZGF0YV9pdGVtLmNjCkBAIC03OCwxMiArNzgsMTIgQEAKICAgICB1aW50NjRfdCBvZmZzZXQsCiAgICAgdWludDY0X3QgbGVuZ3RoLAogICAgIGJhc2U6OlRpbWUgZXhwZWN0ZWRfbW9kaWZpY2F0aW9uX3RpbWUsCi0gICAgc2NvcGVkX3JlZnB0cjxEYXRhSGFuZGxlPiBkYXRhX2hhbmRsZSkgeworICAgIHNjb3BlZF9yZWZwdHI8U2hhcmVhYmxlRmlsZVJlZmVyZW5jZT4gZmlsZV9yZWYpIHsKICAgYXV0byBpdGVtID0KICAgICAgIGJhc2U6OldyYXBSZWZDb3VudGVkKG5ldyBCbG9iRGF0YUl0ZW0oVHlwZTo6a0ZpbGUsIG9mZnNldCwgbGVuZ3RoKSk7CiAgIGl0ZW0tPnBhdGhfID0gc3RkOjptb3ZlKHBhdGgpOwogICBpdGVtLT5leHBlY3RlZF9tb2RpZmljYXRpb25fdGltZV8gPSBzdGQ6Om1vdmUoZXhwZWN0ZWRfbW9kaWZpY2F0aW9uX3RpbWUpOwotICBpdGVtLT5kYXRhX2hhbmRsZV8gPSBzdGQ6Om1vdmUoZGF0YV9oYW5kbGUpOworICBpdGVtLT5maWxlX3JlZl8gPSBzdGQ6Om1vdmUoZmlsZV9yZWYpOwogICAvLyBUT0RPKG1layk6IERDSEVDSyghaXRlbS0+SXNGdXR1cmVGaWxlSXRlbSgpKSB3aGVuIEJsb2JEYXRhQnVpbGRlciBoYXMgc29tZQogICAvLyBvdGhlciB3YXkgb2Ygc2xpY2luZyBhIGZ1dHVyZSBmaWxlLgogICByZXR1cm4gaXRlbTsKQEAgLTE3MSwxNCArMTcxLDE1IEBACiAgIGJ5dGVzXy5yZXNpemUobGVuZ3RoXyk7CiB9CiAKLXZvaWQgQmxvYkRhdGFJdGVtOjpQb3B1bGF0ZUZpbGUoYmFzZTo6RmlsZVBhdGggcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZSBleHBlY3RlZF9tb2RpZmljYXRpb25fdGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkX3JlZnB0cjxEYXRhSGFuZGxlPiBkYXRhX2hhbmRsZSkgewordm9pZCBCbG9iRGF0YUl0ZW06OlBvcHVsYXRlRmlsZSgKKyAgICBiYXNlOjpGaWxlUGF0aCBwYXRoLAorICAgIGJhc2U6OlRpbWUgZXhwZWN0ZWRfbW9kaWZpY2F0aW9uX3RpbWUsCisgICAgc2NvcGVkX3JlZnB0cjxTaGFyZWFibGVGaWxlUmVmZXJlbmNlPiBmaWxlX3JlZikgewogICBEQ0hFQ0tfRVEodHlwZV8sIFR5cGU6OmtGaWxlKTsKICAgRENIRUNLKElzRnV0dXJlRmlsZUl0ZW0oKSk7CiAgIHBhdGhfID0gc3RkOjptb3ZlKHBhdGgpOwogICBleHBlY3RlZF9tb2RpZmljYXRpb25fdGltZV8gPSBzdGQ6Om1vdmUoZXhwZWN0ZWRfbW9kaWZpY2F0aW9uX3RpbWUpOwotICBkYXRhX2hhbmRsZV8gPSBzdGQ6Om1vdmUoZGF0YV9oYW5kbGUpOworICBmaWxlX3JlZl8gPSBzdGQ6Om1vdmUoZmlsZV9yZWYpOwogfQogCiB2b2lkIEJsb2JEYXRhSXRlbTo6U2hyaW5rRmlsZSh1aW50NjRfdCBuZXdfbGVuZ3RoKSB7CmRpZmYgLS1naXQgYS9zdG9yYWdlL2Jyb3dzZXIvYmxvYi9ibG9iX2RhdGFfaXRlbS5oIGIvc3RvcmFnZS9icm93c2VyL2Jsb2IvYmxvYl9kYXRhX2l0ZW0uaAppbmRleCBiZWMwNzJmLi40YjU1OWVkMiAxMDA2NDQKLS0tIGEvc3RvcmFnZS9icm93c2VyL2Jsb2IvYmxvYl9kYXRhX2l0ZW0uaAorKysgYi9zdG9yYWdlL2Jyb3dzZXIvYmxvYi9ibG9iX2RhdGFfaXRlbS5oCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSAiYmFzZS9maWxlcy9maWxlX3BhdGguaCIKICNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgogI2luY2x1ZGUgIm5ldC9iYXNlL2lvX2J1ZmZlci5oIgorI2luY2x1ZGUgInN0b3JhZ2UvYnJvd3Nlci9ibG9iL3NoYXJlYWJsZV9maWxlX3JlZmVyZW5jZS5oIgogI2luY2x1ZGUgInVybC9ndXJsLmgiCiAKIG5hbWVzcGFjZSBzdG9yYWdlIHsKQEAgLTEwMiw3ICsxMDMsNyBAQAogICAgICAgdWludDY0X3Qgb2Zmc2V0LAogICAgICAgdWludDY0X3QgbGVuZ3RoLAogICAgICAgYmFzZTo6VGltZSBleHBlY3RlZF9tb2RpZmljYXRpb25fdGltZSA9IGJhc2U6OlRpbWUoKSwKLSAgICAgIHNjb3BlZF9yZWZwdHI8RGF0YUhhbmRsZT4gZGF0YV9oYW5kbGUgPSBudWxscHRyKTsKKyAgICAgIHNjb3BlZF9yZWZwdHI8U2hhcmVhYmxlRmlsZVJlZmVyZW5jZT4gZmlsZV9yZWYgPSBudWxscHRyKTsKICAgc3RhdGljIHNjb3BlZF9yZWZwdHI8QmxvYkRhdGFJdGVtPiBDcmVhdGVGdXR1cmVGaWxlKHVpbnQ2NF90IG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGZpbGVfaWQpOwpAQCAtMTQ4LDggKzE0OSw3IEBACiAgIH0KIAogICBEYXRhSGFuZGxlKiBkYXRhX2hhbmRsZSgpIGNvbnN0IHsKLSAgICBEQ0hFQ0sodHlwZV8gPT0gVHlwZTo6a0ZpbGUgfHwgdHlwZV8gPT0gVHlwZTo6a1JlYWRhYmxlRGF0YUhhbmRsZSkKLSAgICAgICAgPDwgc3RhdGljX2Nhc3Q8aW50Pih0eXBlXyk7CisgICAgRENIRUNLX0VRKHR5cGVfLCBUeXBlOjprUmVhZGFibGVEYXRhSGFuZGxlKSA8PCBzdGF0aWNfY2FzdDxpbnQ+KHR5cGVfKTsKICAgICByZXR1cm4gZGF0YV9oYW5kbGVfLmdldCgpOwogICB9CiAKQEAgLTE4MCw3ICsxODAsNyBAQAogCiAgIHZvaWQgUG9wdWxhdGVGaWxlKGJhc2U6OkZpbGVQYXRoIHBhdGgsCiAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlRpbWUgZXhwZWN0ZWRfbW9kaWZpY2F0aW9uX3RpbWUsCi0gICAgICAgICAgICAgICAgICAgIHNjb3BlZF9yZWZwdHI8RGF0YUhhbmRsZT4gZGF0YV9oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICBzY29wZWRfcmVmcHRyPFNoYXJlYWJsZUZpbGVSZWZlcmVuY2U+IGZpbGVfcmVmKTsKICAgdm9pZCBTaHJpbmtGaWxlKHVpbnQ2NF90IG5ld19sZW5ndGgpOwogICB2b2lkIEdyb3dGaWxlKHVpbnQ2NF90IG5ld19sZW5ndGgpOwogICB2b2lkIFNldEZpbGVNb2RpZmljYXRpb25UaW1lKGJhc2U6OlRpbWUgdGltZSkgewpAQCAtMTk4LDggKzE5OCw4IEBACiAgIGJhc2U6OlRpbWUKICAgICAgIGV4cGVjdGVkX21vZGlmaWNhdGlvbl90aW1lXzsgIC8vIEZvciBUeXBlOjprRmlsZSBhbmQga0ZpbGVGaWxlc3lzdGVtLgogCi0gIHNjb3BlZF9yZWZwdHI8RGF0YUhhbmRsZT4KLSAgICAgIGRhdGFfaGFuZGxlXzsgIC8vIEZvciBUeXBlOjprRmlsZSBhbmQga1JlYWRhYmxlRGF0YUhhbmRsZS4KKyAgc2NvcGVkX3JlZnB0cjxEYXRhSGFuZGxlPiBkYXRhX2hhbmRsZV87ICAgICAgICAgICAvLyBGb3Iga1JlYWRhYmxlRGF0YUhhbmRsZS4KKyAgc2NvcGVkX3JlZnB0cjxTaGFyZWFibGVGaWxlUmVmZXJlbmNlPiBmaWxlX3JlZl87ICAvLyBGb3IgVHlwZTo6a0ZpbGUKIAogICBzY29wZWRfcmVmcHRyPEZpbGVTeXN0ZW1Db250ZXh0PgogICAgICAgZmlsZV9zeXN0ZW1fY29udGV4dF87ICAvLyBGb3IgVHlwZTo6a0ZpbGVGaWxlc3lzdGVtLgpkaWZmIC0tZ2l0IGEvc3RvcmFnZS9icm93c2VyL2Jsb2IvYmxvYl9zdG9yYWdlX2NvbnRleHQuY2MgYi9zdG9yYWdlL2Jyb3dzZXIvYmxvYi9ibG9iX3N0b3JhZ2VfY29udGV4dC5jYwppbmRleCBhMmJiNGMwLi5jY2JiZGE2IDEwMDY0NAotLS0gYS9zdG9yYWdlL2Jyb3dzZXIvYmxvYi9ibG9iX3N0b3JhZ2VfY29udGV4dC5jYworKysgYi9zdG9yYWdlL2Jyb3dzZXIvYmxvYi9ibG9iX3N0b3JhZ2VfY29udGV4dC5jYwpAQCAtNTIwLDcgKzUyMCw3IEBACiAgICAgICAgICAgICAgIHNvdXJjZV9pdGVtLT5wYXRoKCksCiAgICAgICAgICAgICAgIHNvdXJjZV9pdGVtLT5vZmZzZXQoKSArIGNvcHkuc291cmNlX2l0ZW1fb2Zmc2V0LCBkZXN0X3NpemUsCiAgICAgICAgICAgICAgIHNvdXJjZV9pdGVtLT5leHBlY3RlZF9tb2RpZmljYXRpb25fdGltZSgpLAotICAgICAgICAgICAgICBzb3VyY2VfaXRlbS0+ZGF0YV9oYW5kbGVfKTsKKyAgICAgICAgICAgICAgc291cmNlX2l0ZW0tPmZpbGVfcmVmXyk7CiAgICAgICAgICAgY29weS5kZXN0X2l0ZW0tPnNldF9pdGVtKHN0ZDo6bW92ZShuZXdfaXRlbSkpOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zdG9yYWdlL2Jyb3dzZXIvYmxvYi9zaGFyZWFibGVfZmlsZV9yZWZlcmVuY2UuaCBiL3N0b3JhZ2UvYnJvd3Nlci9ibG9iL3NoYXJlYWJsZV9maWxlX3JlZmVyZW5jZS5oCmluZGV4IGMwMDljNzAuLmQ2ZjMwYTggMTAwNjQ0Ci0tLSBhL3N0b3JhZ2UvYnJvd3Nlci9ibG9iL3NoYXJlYWJsZV9maWxlX3JlZmVyZW5jZS5oCisrKyBiL3N0b3JhZ2UvYnJvd3Nlci9ibG9iL3NoYXJlYWJsZV9maWxlX3JlZmVyZW5jZS5oCkBAIC03LDcgKzcsNiBAQAogCiAjaW5jbHVkZSAiYmFzZS9jb21wb25lbnRfZXhwb3J0LmgiCiAjaW5jbHVkZSAiYmFzZS9tYWNyb3MuaCIKLSNpbmNsdWRlICJzdG9yYWdlL2Jyb3dzZXIvYmxvYi9ibG9iX2RhdGFfaXRlbS5oIgogI2luY2x1ZGUgInN0b3JhZ2UvYnJvd3Nlci9ibG9iL3Njb3BlZF9maWxlLmgiCiAKIG5hbWVzcGFjZSBzdG9yYWdlIHsKQEAgLTE3LDcgKzE2LDcgQEAKIC8vIFRoaXMgY2xhc3MgaXMgbm9uLXRocmVhZC1zYWZlIGFuZCBhbGwgbWV0aG9kcyBtdXN0IGJlIGNhbGxlZCBvbiBhIHNpbmdsZQogLy8gdGhyZWFkLgogY2xhc3MgQ09NUE9ORU5UX0VYUE9SVChTVE9SQUdFX0JST1dTRVIpIFNoYXJlYWJsZUZpbGVSZWZlcmVuY2UKLSAgICA6IHB1YmxpYyBCbG9iRGF0YUl0ZW06OkRhdGFIYW5kbGUgeworICAgIDogcHVibGljIGJhc2U6OlJlZkNvdW50ZWQ8U2hhcmVhYmxlRmlsZVJlZmVyZW5jZT4gewogIHB1YmxpYzoKICAgdXNpbmcgRmluYWxSZWxlYXNlQ2FsbGJhY2sgPSBTY29wZWRGaWxlOjpTY29wZU91dENhbGxiYWNrOwogCkBAIC02NCw4ICs2MywxMCBAQAogICB2b2lkIEFkZEZpbmFsUmVsZWFzZUNhbGxiYWNrKEZpbmFsUmVsZWFzZUNhbGxiYWNrIGNhbGxiYWNrKTsKIAogIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBiYXNlOjpSZWZDb3VudGVkPFNoYXJlYWJsZUZpbGVSZWZlcmVuY2U+OworCiAgIFNoYXJlYWJsZUZpbGVSZWZlcmVuY2UoU2NvcGVkRmlsZSBzY29wZWRfZmlsZSk7Ci0gIH5TaGFyZWFibGVGaWxlUmVmZXJlbmNlKCkgb3ZlcnJpZGU7CisgIH5TaGFyZWFibGVGaWxlUmVmZXJlbmNlKCk7CiAKICAgU2NvcGVkRmlsZSBzY29wZWRfZmlsZV87CiAKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvYnVpbGRib3QvY2hyb21lLmpzb24gYi90ZXN0aW5nL2J1aWxkYm90L2Nocm9tZS5qc29uCmluZGV4IDVhZGRhNmUuLmFjNTM0NzAgMTAwNjQ0Ci0tLSBhL3Rlc3RpbmcvYnVpbGRib3QvY2hyb21lLmpzb24KKysrIGIvdGVzdGluZy9idWlsZGJvdC9jaHJvbWUuanNvbgpAQCAtMjI2OCwyMyArMjI2OCw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgXQogICAgICAgICB9LAotICAgICAgICAidGVzdCI6ICJsZXZlbGRiX3NlcnZpY2VfdW5pdHRlc3RzIgotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgIm1lcmdlIjogewotICAgICAgICAgICJhcmdzIjogW10sCi0gICAgICAgICAgInNjcmlwdCI6ICIvL3Rlc3RpbmcvbWVyZ2Vfc2NyaXB0cy9zdGFuZGFyZF9ndGVzdF9tZXJnZS5weSIKLSAgICAgICAgfSwKLSAgICAgICAgInN3YXJtaW5nIjogewotICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogdHJ1ZSwKLSAgICAgICAgICAiZGltZW5zaW9uX3NldHMiOiBbCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICJvcyI6ICJVYnVudHUtMTYuMDQiLAotICAgICAgICAgICAgICAicG9vbCI6ICJjaHJvbWUudGVzdHMiLAotICAgICAgICAgICAgICAic3NkIjogIjAiCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgXQotICAgICAgICB9LAogICAgICAgICAidGVzdCI6ICJsaWJqaW5nbGVfeG1wcF91bml0dGVzdHMiCiAgICAgICB9LAogICAgICAgewpkaWZmIC0tZ2l0IGEvdGVzdGluZy9idWlsZGJvdC9jaHJvbWl1bS5jaHJvbWl1bW9zLmpzb24gYi90ZXN0aW5nL2J1aWxkYm90L2Nocm9taXVtLmNocm9taXVtb3MuanNvbgppbmRleCBkM2NkYjhjZS4uYTUwNjk3NiAxMDA2NDQKLS0tIGEvdGVzdGluZy9idWlsZGJvdC9jaHJvbWl1bS5jaHJvbWl1bW9zLmpzb24KKysrIGIvdGVzdGluZy9idWlsZGJvdC9jaHJvbWl1bS5jaHJvbWl1bW9zLmpzb24KQEAgLTE2MjEsMjEgKzE2MjEsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgIF0KICAgICAgICAgfSwKLSAgICAgICAgInRlc3QiOiAibGV2ZWxkYl9zZXJ2aWNlX3VuaXR0ZXN0cyIKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgICJtZXJnZSI6IHsKLSAgICAgICAgICAiYXJncyI6IFtdLAotICAgICAgICAgICJzY3JpcHQiOiAiLy90ZXN0aW5nL21lcmdlX3NjcmlwdHMvc3RhbmRhcmRfZ3Rlc3RfbWVyZ2UucHkiCi0gICAgICAgIH0sCi0gICAgICAgICJzd2FybWluZyI6IHsKLSAgICAgICAgICAiY2FuX3VzZV9vbl9zd2FybWluZ19idWlsZGVycyI6IHRydWUsCi0gICAgICAgICAgImRpbWVuc2lvbl9zZXRzIjogWwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAib3MiOiAiVWJ1bnR1LTE2LjA0IgotICAgICAgICAgICAgfQotICAgICAgICAgIF0KLSAgICAgICAgfSwKICAgICAgICAgInRlc3QiOiAibGliamluZ2xlX3htcHBfdW5pdHRlc3RzIgogICAgICAgfSwKICAgICAgIHsKQEAgLTMxNzYsMjIgKzMxNjEsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgIF0KICAgICAgICAgfSwKLSAgICAgICAgInRlc3QiOiAibGV2ZWxkYl9zZXJ2aWNlX3VuaXR0ZXN0cyIKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgICJpc29sYXRlX2NvdmVyYWdlX2RhdGEiOiB0cnVlLAotICAgICAgICAibWVyZ2UiOiB7Ci0gICAgICAgICAgImFyZ3MiOiBbXSwKLSAgICAgICAgICAic2NyaXB0IjogIi8vdGVzdGluZy9tZXJnZV9zY3JpcHRzL3N0YW5kYXJkX2d0ZXN0X21lcmdlLnB5IgotICAgICAgICB9LAotICAgICAgICAic3dhcm1pbmciOiB7Ci0gICAgICAgICAgImNhbl91c2Vfb25fc3dhcm1pbmdfYnVpbGRlcnMiOiB0cnVlLAotICAgICAgICAgICJkaW1lbnNpb25fc2V0cyI6IFsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIm9zIjogIlVidW50dS0xNi4wNCIKLSAgICAgICAgICAgIH0KLSAgICAgICAgICBdCi0gICAgICAgIH0sCiAgICAgICAgICJ0ZXN0IjogImxpYmppbmdsZV94bXBwX3VuaXR0ZXN0cyIKICAgICAgIH0sCiAgICAgICB7CmRpZmYgLS1naXQgYS90ZXN0aW5nL2J1aWxkYm90L2Nocm9taXVtLmNsYW5nLmpzb24gYi90ZXN0aW5nL2J1aWxkYm90L2Nocm9taXVtLmNsYW5nLmpzb24KaW5kZXggYWE4ZTY4ZC4uNWIzNjU4NyAxMDA2NDQKLS0tIGEvdGVzdGluZy9idWlsZGJvdC9jaHJvbWl1bS5jbGFuZy5qc29uCisrKyBiL3Rlc3RpbmcvYnVpbGRib3QvY2hyb21pdW0uY2xhbmcuanNvbgpAQCAtODA1LDIxICs4MDUsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgIF0KICAgICAgICAgfSwKLSAgICAgICAgInRlc3QiOiAibGV2ZWxkYl9zZXJ2aWNlX3VuaXR0ZXN0cyIKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgICJtZXJnZSI6IHsKLSAgICAgICAgICAiYXJncyI6IFtdLAotICAgICAgICAgICJzY3JpcHQiOiAiLy90ZXN0aW5nL21lcmdlX3NjcmlwdHMvc3RhbmRhcmRfZ3Rlc3RfbWVyZ2UucHkiCi0gICAgICAgIH0sCi0gICAgICAgICJzd2FybWluZyI6IHsKLSAgICAgICAgICAiY2FuX3VzZV9vbl9zd2FybWluZ19idWlsZGVycyI6IHRydWUsCi0gICAgICAgICAgImRpbWVuc2lvbl9zZXRzIjogWwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAib3MiOiAiVWJ1bnR1LTE2LjA0IgotICAgICAgICAgICAgfQotICAgICAgICAgIF0KLSAgICAgICAgfSwKICAgICAgICAgInRlc3QiOiAibGliamluZ2xlX3htcHBfdW5pdHRlc3RzIgogICAgICAgfSwKICAgICAgIHsKQEAgLTIzNDIsMjIgKzIzMjcsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgIF0KICAgICAgICAgfSwKLSAgICAgICAgInRlc3QiOiAibGV2ZWxkYl9zZXJ2aWNlX3VuaXR0ZXN0cyIKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgICJtZXJnZSI6IHsKLSAgICAgICAgICAiYXJncyI6IFtdLAotICAgICAgICAgICJzY3JpcHQiOiAiLy90ZXN0aW5nL21lcmdlX3NjcmlwdHMvc3RhbmRhcmRfZ3Rlc3RfbWVyZ2UucHkiCi0gICAgICAgIH0sCi0gICAgICAgICJzd2FybWluZyI6IHsKLSAgICAgICAgICAiY2FuX3VzZV9vbl9zd2FybWluZ19idWlsZGVycyI6IHRydWUsCi0gICAgICAgICAgImRpbWVuc2lvbl9zZXRzIjogWwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAiY3B1IjogIng4Ni02NCIsCi0gICAgICAgICAgICAgICJvcyI6ICJXaW5kb3dzLTEwLTE1MDYzIgotICAgICAgICAgICAgfQotICAgICAgICAgIF0KLSAgICAgICAgfSwKICAgICAgICAgInRlc3QiOiAibGliamluZ2xlX3htcHBfdW5pdHRlc3RzIgogICAgICAgfSwKICAgICAgIHsKQEAgLTM4OTQsMjIgKzM4NjMsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgIF0KICAgICAgICAgfSwKLSAgICAgICAgInRlc3QiOiAibGV2ZWxkYl9zZXJ2aWNlX3VuaXR0ZXN0cyIKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgICJtZXJnZSI6IHsKLSAgICAgICAgICAiYXJncyI6IFtdLAotICAgICAgICAgICJzY3JpcHQiOiAiLy90ZXN0aW5nL21lcmdlX3NjcmlwdHMvc3RhbmRhcmRfZ3Rlc3RfbWVyZ2UucHkiCi0gICAgICAgIH0sCi0gICAgICAgICJzd2FybWluZyI6IHsKLSAgICAgICAgICAiY2FuX3VzZV9vbl9zd2FybWluZ19idWlsZGVycyI6IHRydWUsCi0gICAgICAgICAgImRpbWVuc2lvbl9zZXRzIjogWwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAiY3B1IjogIng4Ni02NCIsCi0gICAgICAgICAgICAgICJvcyI6ICJXaW5kb3dzLTEwLTE1MDYzIgotICAgICAgICAgICAgfQotICAgICAgICAgIF0KLSAgICAgICAgfSwKICAgICAgICAgInRlc3QiOiAibGliamluZ2xlX3htcHBfdW5pdHRlc3RzIgogICAgICAgfSwKICAgICAgIHsKQEAgLTExNTczLDIxICsxMTUyNiw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgXQogICAgICAgICB9LAotICAgICAgICAidGVzdCI6ICJsZXZlbGRiX3NlcnZpY2VfdW5pdHRlc3RzIgotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgIm1lcmdlIjogewotICAgICAgICAgICJhcmdzIjogW10sCi0gICAgICAgICAgInNjcmlwdCI6ICIvL3Rlc3RpbmcvbWVyZ2Vfc2NyaXB0cy9zdGFuZGFyZF9ndGVzdF9tZXJnZS5weSIKLSAgICAgICAgfSwKLSAgICAgICAgInN3YXJtaW5nIjogewotICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogdHJ1ZSwKLSAgICAgICAgICAiZGltZW5zaW9uX3NldHMiOiBbCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICJvcyI6ICJVYnVudHUtMTYuMDQiCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgXQotICAgICAgICB9LAogICAgICAgICAidGVzdCI6ICJsaWJqaW5nbGVfeG1wcF91bml0dGVzdHMiCiAgICAgICB9LAogICAgICAgewpAQCAtMTMxMDYsMjQgKzEzMDQ0LDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICBdCiAgICAgICAgIH0sCi0gICAgICAgICJ0ZXN0IjogImxldmVsZGJfc2VydmljZV91bml0dGVzdHMiCi0gICAgICB9LAotICAgICAgewotICAgICAgICAiYXJncyI6IFsKLSAgICAgICAgICAiLS10ZXN0LWxhdW5jaGVyLXByaW50LXRlc3Qtc3RkaW89YWx3YXlzIgotICAgICAgICBdLAotICAgICAgICAibWVyZ2UiOiB7Ci0gICAgICAgICAgImFyZ3MiOiBbXSwKLSAgICAgICAgICAic2NyaXB0IjogIi8vdGVzdGluZy9tZXJnZV9zY3JpcHRzL3N0YW5kYXJkX2d0ZXN0X21lcmdlLnB5IgotICAgICAgICB9LAotICAgICAgICAic3dhcm1pbmciOiB7Ci0gICAgICAgICAgImNhbl91c2Vfb25fc3dhcm1pbmdfYnVpbGRlcnMiOiB0cnVlLAotICAgICAgICAgICJkaW1lbnNpb25fc2V0cyI6IFsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIm9zIjogIlVidW50dS0xNi4wNCIKLSAgICAgICAgICAgIH0KLSAgICAgICAgICBdCi0gICAgICAgIH0sCiAgICAgICAgICJ0ZXN0IjogImxpYmppbmdsZV94bXBwX3VuaXR0ZXN0cyIKICAgICAgIH0sCiAgICAgICB7CkBAIC0xNDYxNywyMSArMTQ1MzcsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgIF0KICAgICAgICAgfSwKLSAgICAgICAgInRlc3QiOiAibGV2ZWxkYl9zZXJ2aWNlX3VuaXR0ZXN0cyIKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgICJtZXJnZSI6IHsKLSAgICAgICAgICAiYXJncyI6IFtdLAotICAgICAgICAgICJzY3JpcHQiOiAiLy90ZXN0aW5nL21lcmdlX3NjcmlwdHMvc3RhbmRhcmRfZ3Rlc3RfbWVyZ2UucHkiCi0gICAgICAgIH0sCi0gICAgICAgICJzd2FybWluZyI6IHsKLSAgICAgICAgICAiY2FuX3VzZV9vbl9zd2FybWluZ19idWlsZGVycyI6IHRydWUsCi0gICAgICAgICAgImRpbWVuc2lvbl9zZXRzIjogWwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAib3MiOiAiVWJ1bnR1LTE2LjA0IgotICAgICAgICAgICAgfQotICAgICAgICAgIF0KLSAgICAgICAgfSwKICAgICAgICAgInRlc3QiOiAibGliamluZ2xlX3htcHBfdW5pdHRlc3RzIgogICAgICAgfSwKICAgICAgIHsKQEAgLTE1OTk0LDIxICsxNTg5OSw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgXQogICAgICAgICB9LAotICAgICAgICAidGVzdCI6ICJsZXZlbGRiX3NlcnZpY2VfdW5pdHRlc3RzIgotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgIm1lcmdlIjogewotICAgICAgICAgICJhcmdzIjogW10sCi0gICAgICAgICAgInNjcmlwdCI6ICIvL3Rlc3RpbmcvbWVyZ2Vfc2NyaXB0cy9zdGFuZGFyZF9ndGVzdF9tZXJnZS5weSIKLSAgICAgICAgfSwKLSAgICAgICAgInN3YXJtaW5nIjogewotICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogdHJ1ZSwKLSAgICAgICAgICAiZGltZW5zaW9uX3NldHMiOiBbCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICJvcyI6ICJVYnVudHUtMTYuMDQiCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgXQotICAgICAgICB9LAogICAgICAgICAidGVzdCI6ICJsaWJqaW5nbGVfeG1wcF91bml0dGVzdHMiCiAgICAgICB9LAogICAgICAgewpAQCAtMTczNTgsMjEgKzE3MjQ4LDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICBdCiAgICAgICAgIH0sCi0gICAgICAgICJ0ZXN0IjogImxldmVsZGJfc2VydmljZV91bml0dGVzdHMiCi0gICAgICB9LAotICAgICAgewotICAgICAgICAibWVyZ2UiOiB7Ci0gICAgICAgICAgImFyZ3MiOiBbXSwKLSAgICAgICAgICAic2NyaXB0IjogIi8vdGVzdGluZy9tZXJnZV9zY3JpcHRzL3N0YW5kYXJkX2d0ZXN0X21lcmdlLnB5IgotICAgICAgICB9LAotICAgICAgICAic3dhcm1pbmciOiB7Ci0gICAgICAgICAgImNhbl91c2Vfb25fc3dhcm1pbmdfYnVpbGRlcnMiOiB0cnVlLAotICAgICAgICAgICJkaW1lbnNpb25fc2V0cyI6IFsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIm9zIjogIlVidW50dS0xNi4wNCIKLSAgICAgICAgICAgIH0KLSAgICAgICAgICBdCi0gICAgICAgIH0sCiAgICAgICAgICJ0ZXN0IjogImxpYmppbmdsZV94bXBwX3VuaXR0ZXN0cyIKICAgICAgIH0sCiAgICAgICB7CkBAIC0xODc1MiwyMSArMTg2MjcsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgIF0KICAgICAgICAgfSwKLSAgICAgICAgInRlc3QiOiAibGV2ZWxkYl9zZXJ2aWNlX3VuaXR0ZXN0cyIKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgICJtZXJnZSI6IHsKLSAgICAgICAgICAiYXJncyI6IFtdLAotICAgICAgICAgICJzY3JpcHQiOiAiLy90ZXN0aW5nL21lcmdlX3NjcmlwdHMvc3RhbmRhcmRfZ3Rlc3RfbWVyZ2UucHkiCi0gICAgICAgIH0sCi0gICAgICAgICJzd2FybWluZyI6IHsKLSAgICAgICAgICAiY2FuX3VzZV9vbl9zd2FybWluZ19idWlsZGVycyI6IHRydWUsCi0gICAgICAgICAgImRpbWVuc2lvbl9zZXRzIjogWwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAib3MiOiAiVWJ1bnR1LTE2LjA0IgotICAgICAgICAgICAgfQotICAgICAgICAgIF0KLSAgICAgICAgfSwKICAgICAgICAgInRlc3QiOiAibGliamluZ2xlX3htcHBfdW5pdHRlc3RzIgogICAgICAgfSwKICAgICAgIHsKQEAgLTIwMTQ3LDIxICsyMDAwNyw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgXQogICAgICAgICB9LAotICAgICAgICAidGVzdCI6ICJsZXZlbGRiX3NlcnZpY2VfdW5pdHRlc3RzIgotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgIm1lcmdlIjogewotICAgICAgICAgICJhcmdzIjogW10sCi0gICAgICAgICAgInNjcmlwdCI6ICIvL3Rlc3RpbmcvbWVyZ2Vfc2NyaXB0cy9zdGFuZGFyZF9ndGVzdF9tZXJnZS5weSIKLSAgICAgICAgfSwKLSAgICAgICAgInN3YXJtaW5nIjogewotICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogdHJ1ZSwKLSAgICAgICAgICAiZGltZW5zaW9uX3NldHMiOiBbCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICJvcyI6ICJVYnVudHUtMTYuMDQiCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgXQotICAgICAgICB9LAogICAgICAgICAidGVzdCI6ICJsaWJqaW5nbGVfeG1wcF91bml0dGVzdHMiCiAgICAgICB9LAogICAgICAgewpAQCAtMjEyNDMsMTYgKzIxMDg4LDYgQEAKICAgICAgICAgInN3YXJtaW5nIjogewogICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogdHJ1ZQogICAgICAgICB9LAotICAgICAgICAidGVzdCI6ICJsZXZlbGRiX3NlcnZpY2VfdW5pdHRlc3RzIgotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgIm1lcmdlIjogewotICAgICAgICAgICJhcmdzIjogW10sCi0gICAgICAgICAgInNjcmlwdCI6ICIvL3Rlc3RpbmcvbWVyZ2Vfc2NyaXB0cy9zdGFuZGFyZF9ndGVzdF9tZXJnZS5weSIKLSAgICAgICAgfSwKLSAgICAgICAgInN3YXJtaW5nIjogewotICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogdHJ1ZQotICAgICAgICB9LAogICAgICAgICAidGVzdCI6ICJsaWJqaW5nbGVfeG1wcF91bml0dGVzdHMiCiAgICAgICB9LAogICAgICAgewpAQCAtMjI0MTUsMTkgKzIyMjUwLDYgQEAKICAgICAgICAgInN3YXJtaW5nIjogewogICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogdHJ1ZQogICAgICAgICB9LAotICAgICAgICAidGVzdCI6ICJsZXZlbGRiX3NlcnZpY2VfdW5pdHRlc3RzIgotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgImFyZ3MiOiBbCi0gICAgICAgICAgIi0tdGVzdC1sYXVuY2hlci1wcmludC10ZXN0LXN0ZGlvPWFsd2F5cyIKLSAgICAgICAgXSwKLSAgICAgICAgIm1lcmdlIjogewotICAgICAgICAgICJhcmdzIjogW10sCi0gICAgICAgICAgInNjcmlwdCI6ICIvL3Rlc3RpbmcvbWVyZ2Vfc2NyaXB0cy9zdGFuZGFyZF9ndGVzdF9tZXJnZS5weSIKLSAgICAgICAgfSwKLSAgICAgICAgInN3YXJtaW5nIjogewotICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogdHJ1ZQotICAgICAgICB9LAogICAgICAgICAidGVzdCI6ICJsaWJqaW5nbGVfeG1wcF91bml0dGVzdHMiCiAgICAgICB9LAogICAgICAgewpAQCAtMjMzMzksMTYgKzIzMTYxLDYgQEAKICAgICAgICAgInN3YXJtaW5nIjogewogICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogdHJ1ZQogICAgICAgICB9LAotICAgICAgICAidGVzdCI6ICJsZXZlbGRiX3NlcnZpY2VfdW5pdHRlc3RzIgotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgIm1lcmdlIjogewotICAgICAgICAgICJhcmdzIjogW10sCi0gICAgICAgICAgInNjcmlwdCI6ICIvL3Rlc3RpbmcvbWVyZ2Vfc2NyaXB0cy9zdGFuZGFyZF9ndGVzdF9tZXJnZS5weSIKLSAgICAgICAgfSwKLSAgICAgICAgInN3YXJtaW5nIjogewotICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogdHJ1ZQotICAgICAgICB9LAogICAgICAgICAidGVzdCI6ICJsaWJqaW5nbGVfeG1wcF91bml0dGVzdHMiCiAgICAgICB9LAogICAgICAgewpAQCAtMjQ0NzAsMTYgKzI0MjgyLDYgQEAKICAgICAgICAgInN3YXJtaW5nIjogewogICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogdHJ1ZQogICAgICAgICB9LAotICAgICAgICAidGVzdCI6ICJsZXZlbGRiX3NlcnZpY2VfdW5pdHRlc3RzIgotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgIm1lcmdlIjogewotICAgICAgICAgICJhcmdzIjogW10sCi0gICAgICAgICAgInNjcmlwdCI6ICIvL3Rlc3RpbmcvbWVyZ2Vfc2NyaXB0cy9zdGFuZGFyZF9ndGVzdF9tZXJnZS5weSIKLSAgICAgICAgfSwKLSAgICAgICAgInN3YXJtaW5nIjogewotICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogdHJ1ZQotICAgICAgICB9LAogICAgICAgICAidGVzdCI6ICJsaWJqaW5nbGVfeG1wcF91bml0dGVzdHMiCiAgICAgICB9LAogICAgICAgewpAQCAtMjU1MTYsMTYgKzI1MzE4LDYgQEAKICAgICAgICAgInN3YXJtaW5nIjogewogICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogdHJ1ZQogICAgICAgICB9LAotICAgICAgICAidGVzdCI6ICJsZXZlbGRiX3NlcnZpY2VfdW5pdHRlc3RzIgotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgIm1lcmdlIjogewotICAgICAgICAgICJhcmdzIjogW10sCi0gICAgICAgICAgInNjcmlwdCI6ICIvL3Rlc3RpbmcvbWVyZ2Vfc2NyaXB0cy9zdGFuZGFyZF9ndGVzdF9tZXJnZS5weSIKLSAgICAgICAgfSwKLSAgICAgICAgInN3YXJtaW5nIjogewotICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogdHJ1ZQotICAgICAgICB9LAogICAgICAgICAidGVzdCI6ICJsaWJqaW5nbGVfeG1wcF91bml0dGVzdHMiCiAgICAgICB9LAogICAgICAgewpAQCAtMjY1NjIsMTYgKzI2MzU0LDYgQEAKICAgICAgICAgInN3YXJtaW5nIjogewogICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogdHJ1ZQogICAgICAgICB9LAotICAgICAgICAidGVzdCI6ICJsZXZlbGRiX3NlcnZpY2VfdW5pdHRlc3RzIgotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgIm1lcmdlIjogewotICAgICAgICAgICJhcmdzIjogW10sCi0gICAgICAgICAgInNjcmlwdCI6ICIvL3Rlc3RpbmcvbWVyZ2Vfc2NyaXB0cy9zdGFuZGFyZF9ndGVzdF9tZXJnZS5weSIKLSAgICAgICAgfSwKLSAgICAgICAgInN3YXJtaW5nIjogewotICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogdHJ1ZQotICAgICAgICB9LAogICAgICAgICAidGVzdCI6ICJsaWJqaW5nbGVfeG1wcF91bml0dGVzdHMiCiAgICAgICB9LAogICAgICAgewpAQCAtMjc5NjQsMjIgKzI3NzQ2LDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICBdCiAgICAgICAgIH0sCi0gICAgICAgICJ0ZXN0IjogImxldmVsZGJfc2VydmljZV91bml0dGVzdHMiCi0gICAgICB9LAotICAgICAgewotICAgICAgICAibWVyZ2UiOiB7Ci0gICAgICAgICAgImFyZ3MiOiBbXSwKLSAgICAgICAgICAic2NyaXB0IjogIi8vdGVzdGluZy9tZXJnZV9zY3JpcHRzL3N0YW5kYXJkX2d0ZXN0X21lcmdlLnB5IgotICAgICAgICB9LAotICAgICAgICAic3dhcm1pbmciOiB7Ci0gICAgICAgICAgImNhbl91c2Vfb25fc3dhcm1pbmdfYnVpbGRlcnMiOiB0cnVlLAotICAgICAgICAgICJkaW1lbnNpb25fc2V0cyI6IFsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgImNwdSI6ICJ4ODYtNjQiLAotICAgICAgICAgICAgICAib3MiOiAiV2luZG93cy0xMC0xNTA2MyIKLSAgICAgICAgICAgIH0KLSAgICAgICAgICBdCi0gICAgICAgIH0sCiAgICAgICAgICJ0ZXN0IjogImxpYmppbmdsZV94bXBwX3VuaXR0ZXN0cyIKICAgICAgIH0sCiAgICAgICB7CkBAIC0yOTYwNCwyMiArMjkzNzAsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgIF0KICAgICAgICAgfSwKLSAgICAgICAgInRlc3QiOiAibGV2ZWxkYl9zZXJ2aWNlX3VuaXR0ZXN0cyIKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgICJtZXJnZSI6IHsKLSAgICAgICAgICAiYXJncyI6IFtdLAotICAgICAgICAgICJzY3JpcHQiOiAiLy90ZXN0aW5nL21lcmdlX3NjcmlwdHMvc3RhbmRhcmRfZ3Rlc3RfbWVyZ2UucHkiCi0gICAgICAgIH0sCi0gICAgICAgICJzd2FybWluZyI6IHsKLSAgICAgICAgICAiY2FuX3VzZV9vbl9zd2FybWluZ19idWlsZGVycyI6IHRydWUsCi0gICAgICAgICAgImRpbWVuc2lvbl9zZXRzIjogWwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAiY3B1IjogIng4Ni02NCIsCi0gICAgICAgICAgICAgICJvcyI6ICJXaW5kb3dzLTEwLTE1MDYzIgotICAgICAgICAgICAgfQotICAgICAgICAgIF0KLSAgICAgICAgfSwKICAgICAgICAgInRlc3QiOiAibGliamluZ2xlX3htcHBfdW5pdHRlc3RzIgogICAgICAgfSwKICAgICAgIHsKQEAgLTMxMjQ0LDIyICszMDk5NCw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgXQogICAgICAgICB9LAotICAgICAgICAidGVzdCI6ICJsZXZlbGRiX3NlcnZpY2VfdW5pdHRlc3RzIgotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgIm1lcmdlIjogewotICAgICAgICAgICJhcmdzIjogW10sCi0gICAgICAgICAgInNjcmlwdCI6ICIvL3Rlc3RpbmcvbWVyZ2Vfc2NyaXB0cy9zdGFuZGFyZF9ndGVzdF9tZXJnZS5weSIKLSAgICAgICAgfSwKLSAgICAgICAgInN3YXJtaW5nIjogewotICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogdHJ1ZSwKLSAgICAgICAgICAiZGltZW5zaW9uX3NldHMiOiBbCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICJjcHUiOiAieDg2LTY0IiwKLSAgICAgICAgICAgICAgIm9zIjogIldpbmRvd3MtMTAtMTUwNjMiCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgXQotICAgICAgICB9LAogICAgICAgICAidGVzdCI6ICJsaWJqaW5nbGVfeG1wcF91bml0dGVzdHMiCiAgICAgICB9LAogICAgICAgewpAQCAtMzI1MjgsMTYgKzMyMjYyLDYgQEAKICAgICAgICAgInN3YXJtaW5nIjogewogICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogdHJ1ZQogICAgICAgICB9LAotICAgICAgICAidGVzdCI6ICJsZXZlbGRiX3NlcnZpY2VfdW5pdHRlc3RzIgotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgIm1lcmdlIjogewotICAgICAgICAgICJhcmdzIjogW10sCi0gICAgICAgICAgInNjcmlwdCI6ICIvL3Rlc3RpbmcvbWVyZ2Vfc2NyaXB0cy9zdGFuZGFyZF9ndGVzdF9tZXJnZS5weSIKLSAgICAgICAgfSwKLSAgICAgICAgInN3YXJtaW5nIjogewotICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogdHJ1ZQotICAgICAgICB9LAogICAgICAgICAidGVzdCI6ICJsaWJqaW5nbGVfeG1wcF91bml0dGVzdHMiCiAgICAgICB9LAogICAgICAgewpAQCAtMzM1NzQsMTYgKzMzMjk4LDYgQEAKICAgICAgICAgInN3YXJtaW5nIjogewogICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogdHJ1ZQogICAgICAgICB9LAotICAgICAgICAidGVzdCI6ICJsZXZlbGRiX3NlcnZpY2VfdW5pdHRlc3RzIgotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgIm1lcmdlIjogewotICAgICAgICAgICJhcmdzIjogW10sCi0gICAgICAgICAgInNjcmlwdCI6ICIvL3Rlc3RpbmcvbWVyZ2Vfc2NyaXB0cy9zdGFuZGFyZF9ndGVzdF9tZXJnZS5weSIKLSAgICAgICAgfSwKLSAgICAgICAgInN3YXJtaW5nIjogewotICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogdHJ1ZQotICAgICAgICB9LAogICAgICAgICAidGVzdCI6ICJsaWJqaW5nbGVfeG1wcF91bml0dGVzdHMiCiAgICAgICB9LAogICAgICAgewpAQCAtMzQ2MjAsMTYgKzM0MzM0LDYgQEAKICAgICAgICAgInN3YXJtaW5nIjogewogICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogdHJ1ZQogICAgICAgICB9LAotICAgICAgICAidGVzdCI6ICJsZXZlbGRiX3NlcnZpY2VfdW5pdHRlc3RzIgotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgIm1lcmdlIjogewotICAgICAgICAgICJhcmdzIjogW10sCi0gICAgICAgICAgInNjcmlwdCI6ICIvL3Rlc3RpbmcvbWVyZ2Vfc2NyaXB0cy9zdGFuZGFyZF9ndGVzdF9tZXJnZS5weSIKLSAgICAgICAgfSwKLSAgICAgICAgInN3YXJtaW5nIjogewotICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogdHJ1ZQotICAgICAgICB9LAogICAgICAgICAidGVzdCI6ICJsaWJqaW5nbGVfeG1wcF91bml0dGVzdHMiCiAgICAgICB9LAogICAgICAgewpAQCAtMzU2NjYsMTYgKzM1MzcwLDYgQEAKICAgICAgICAgInN3YXJtaW5nIjogewogICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogdHJ1ZQogICAgICAgICB9LAotICAgICAgICAidGVzdCI6ICJsZXZlbGRiX3NlcnZpY2VfdW5pdHRlc3RzIgotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgIm1lcmdlIjogewotICAgICAgICAgICJhcmdzIjogW10sCi0gICAgICAgICAgInNjcmlwdCI6ICIvL3Rlc3RpbmcvbWVyZ2Vfc2NyaXB0cy9zdGFuZGFyZF9ndGVzdF9tZXJnZS5weSIKLSAgICAgICAgfSwKLSAgICAgICAgInN3YXJtaW5nIjogewotICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogdHJ1ZQotICAgICAgICB9LAogICAgICAgICAidGVzdCI6ICJsaWJqaW5nbGVfeG1wcF91bml0dGVzdHMiCiAgICAgICB9LAogICAgICAgewpAQCAtMzY3MTIsMTYgKzM2NDA2LDYgQEAKICAgICAgICAgInN3YXJtaW5nIjogewogICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogdHJ1ZQogICAgICAgICB9LAotICAgICAgICAidGVzdCI6ICJsZXZlbGRiX3NlcnZpY2VfdW5pdHRlc3RzIgotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgIm1lcmdlIjogewotICAgICAgICAgICJhcmdzIjogW10sCi0gICAgICAgICAgInNjcmlwdCI6ICIvL3Rlc3RpbmcvbWVyZ2Vfc2NyaXB0cy9zdGFuZGFyZF9ndGVzdF9tZXJnZS5weSIKLSAgICAgICAgfSwKLSAgICAgICAgInN3YXJtaW5nIjogewotICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogdHJ1ZQotICAgICAgICB9LAogICAgICAgICAidGVzdCI6ICJsaWJqaW5nbGVfeG1wcF91bml0dGVzdHMiCiAgICAgICB9LAogICAgICAgewpAQCAtMzc5NTMsMjEgKzM3NjM3LDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICBdCiAgICAgICAgIH0sCi0gICAgICAgICJ0ZXN0IjogImxldmVsZGJfc2VydmljZV91bml0dGVzdHMiCi0gICAgICB9LAotICAgICAgewotICAgICAgICAibWVyZ2UiOiB7Ci0gICAgICAgICAgImFyZ3MiOiBbXSwKLSAgICAgICAgICAic2NyaXB0IjogIi8vdGVzdGluZy9tZXJnZV9zY3JpcHRzL3N0YW5kYXJkX2d0ZXN0X21lcmdlLnB5IgotICAgICAgICB9LAotICAgICAgICAic3dhcm1pbmciOiB7Ci0gICAgICAgICAgImNhbl91c2Vfb25fc3dhcm1pbmdfYnVpbGRlcnMiOiB0cnVlLAotICAgICAgICAgICJkaW1lbnNpb25fc2V0cyI6IFsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIm9zIjogIlVidW50dS0xNi4wNCIKLSAgICAgICAgICAgIH0KLSAgICAgICAgICBdCi0gICAgICAgIH0sCiAgICAgICAgICJ0ZXN0IjogImxpYmppbmdsZV94bXBwX3VuaXR0ZXN0cyIKICAgICAgIH0sCiAgICAgICB7CkBAIC0zOTQxNSwyMSArMzkwODQsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgIF0KICAgICAgICAgfSwKLSAgICAgICAgInRlc3QiOiAibGV2ZWxkYl9zZXJ2aWNlX3VuaXR0ZXN0cyIKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgICJtZXJnZSI6IHsKLSAgICAgICAgICAiYXJncyI6IFtdLAotICAgICAgICAgICJzY3JpcHQiOiAiLy90ZXN0aW5nL21lcmdlX3NjcmlwdHMvc3RhbmRhcmRfZ3Rlc3RfbWVyZ2UucHkiCi0gICAgICAgIH0sCi0gICAgICAgICJzd2FybWluZyI6IHsKLSAgICAgICAgICAiY2FuX3VzZV9vbl9zd2FybWluZ19idWlsZGVycyI6IHRydWUsCi0gICAgICAgICAgImRpbWVuc2lvbl9zZXRzIjogWwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAib3MiOiAiV2luZG93cy0xMC0xNTA2MyIKLSAgICAgICAgICAgIH0KLSAgICAgICAgICBdCi0gICAgICAgIH0sCiAgICAgICAgICJ0ZXN0IjogImxpYmppbmdsZV94bXBwX3VuaXR0ZXN0cyIKICAgICAgIH0sCiAgICAgICB7CmRpZmYgLS1naXQgYS90ZXN0aW5nL2J1aWxkYm90L2Nocm9taXVtLmZ5aS5qc29uIGIvdGVzdGluZy9idWlsZGJvdC9jaHJvbWl1bS5meWkuanNvbgppbmRleCBmOTZjMWI3Li42Mzc1Y2Q0IDEwMDY0NAotLS0gYS90ZXN0aW5nL2J1aWxkYm90L2Nocm9taXVtLmZ5aS5qc29uCisrKyBiL3Rlc3RpbmcvYnVpbGRib3QvY2hyb21pdW0uZnlpLmpzb24KQEAgLTE3NTYsMTYgKzE3NTYsNiBAQAogICAgICAgICAic3dhcm1pbmciOiB7CiAgICAgICAgICAgImNhbl91c2Vfb25fc3dhcm1pbmdfYnVpbGRlcnMiOiBmYWxzZQogICAgICAgICB9LAotICAgICAgICAidGVzdCI6ICJsZXZlbGRiX3NlcnZpY2VfdW5pdHRlc3RzIgotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgIm1lcmdlIjogewotICAgICAgICAgICJhcmdzIjogW10sCi0gICAgICAgICAgInNjcmlwdCI6ICIvL3Rlc3RpbmcvbWVyZ2Vfc2NyaXB0cy9zdGFuZGFyZF9ndGVzdF9tZXJnZS5weSIKLSAgICAgICAgfSwKLSAgICAgICAgInN3YXJtaW5nIjogewotICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogZmFsc2UKLSAgICAgICAgfSwKICAgICAgICAgInRlc3QiOiAibGliamluZ2xlX3htcHBfdW5pdHRlc3RzIgogICAgICAgfSwKICAgICAgIHsKQEAgLTMyMjMsMjIgKzMyMTMsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgIF0KICAgICAgICAgfSwKLSAgICAgICAgInRlc3QiOiAibGV2ZWxkYl9zZXJ2aWNlX3VuaXR0ZXN0cyIKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgICJtZXJnZSI6IHsKLSAgICAgICAgICAiYXJncyI6IFtdLAotICAgICAgICAgICJzY3JpcHQiOiAiLy90ZXN0aW5nL21lcmdlX3NjcmlwdHMvc3RhbmRhcmRfZ3Rlc3RfbWVyZ2UucHkiCi0gICAgICAgIH0sCi0gICAgICAgICJzd2FybWluZyI6IHsKLSAgICAgICAgICAiY2FuX3VzZV9vbl9zd2FybWluZ19idWlsZGVycyI6IHRydWUsCi0gICAgICAgICAgImRpbWVuc2lvbl9zZXRzIjogWwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAiY3B1IjogIng4Ni02NCIsCi0gICAgICAgICAgICAgICJvcyI6ICJXaW5kb3dzLTEwLTE3MTM0IgotICAgICAgICAgICAgfQotICAgICAgICAgIF0KLSAgICAgICAgfSwKICAgICAgICAgInRlc3QiOiAibGliamluZ2xlX3htcHBfdW5pdHRlc3RzIgogICAgICAgfSwKICAgICAgIHsKQEAgLTEzNzg1LDIyICsxMzc1OSw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgXQogICAgICAgICB9LAotICAgICAgICAidGVzdCI6ICJsZXZlbGRiX3NlcnZpY2VfdW5pdHRlc3RzIgotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgImlzb2xhdGVfY292ZXJhZ2VfZGF0YSI6IHRydWUsCi0gICAgICAgICJtZXJnZSI6IHsKLSAgICAgICAgICAiYXJncyI6IFtdLAotICAgICAgICAgICJzY3JpcHQiOiAiLy90ZXN0aW5nL21lcmdlX3NjcmlwdHMvc3RhbmRhcmRfZ3Rlc3RfbWVyZ2UucHkiCi0gICAgICAgIH0sCi0gICAgICAgICJzd2FybWluZyI6IHsKLSAgICAgICAgICAiY2FuX3VzZV9vbl9zd2FybWluZ19idWlsZGVycyI6IHRydWUsCi0gICAgICAgICAgImRpbWVuc2lvbl9zZXRzIjogWwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAib3MiOiAiVWJ1bnR1LTE2LjA0IgotICAgICAgICAgICAgfQotICAgICAgICAgIF0KLSAgICAgICAgfSwKICAgICAgICAgInRlc3QiOiAibGliamluZ2xlX3htcHBfdW5pdHRlc3RzIgogICAgICAgfSwKICAgICAgIHsKQEAgLTE1Mjc3LDIxICsxNTIzNSw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgXQogICAgICAgICB9LAotICAgICAgICAidGVzdCI6ICJsZXZlbGRiX3NlcnZpY2VfdW5pdHRlc3RzIgotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgIm1lcmdlIjogewotICAgICAgICAgICJhcmdzIjogW10sCi0gICAgICAgICAgInNjcmlwdCI6ICIvL3Rlc3RpbmcvbWVyZ2Vfc2NyaXB0cy9zdGFuZGFyZF9ndGVzdF9tZXJnZS5weSIKLSAgICAgICAgfSwKLSAgICAgICAgInN3YXJtaW5nIjogewotICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogdHJ1ZSwKLSAgICAgICAgICAiZGltZW5zaW9uX3NldHMiOiBbCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICJvcyI6ICJVYnVudHUtMTYuMDQiCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgXQotICAgICAgICB9LAogICAgICAgICAidGVzdCI6ICJsaWJqaW5nbGVfeG1wcF91bml0dGVzdHMiCiAgICAgICB9LAogICAgICAgewpAQCAtMTcwNjgsMjIgKzE3MDExLDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICBdCiAgICAgICAgIH0sCi0gICAgICAgICJ0ZXN0IjogImxldmVsZGJfc2VydmljZV91bml0dGVzdHMiCi0gICAgICB9LAotICAgICAgewotICAgICAgICAiaXNvbGF0ZV9jb3ZlcmFnZV9kYXRhIjogdHJ1ZSwKLSAgICAgICAgIm1lcmdlIjogewotICAgICAgICAgICJhcmdzIjogW10sCi0gICAgICAgICAgInNjcmlwdCI6ICIvL3Rlc3RpbmcvbWVyZ2Vfc2NyaXB0cy9zdGFuZGFyZF9ndGVzdF9tZXJnZS5weSIKLSAgICAgICAgfSwKLSAgICAgICAgInN3YXJtaW5nIjogewotICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogdHJ1ZSwKLSAgICAgICAgICAiZGltZW5zaW9uX3NldHMiOiBbCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICJvcyI6ICJVYnVudHUtMTYuMDQiCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgXQotICAgICAgICB9LAogICAgICAgICAidGVzdCI6ICJsaWJqaW5nbGVfeG1wcF91bml0dGVzdHMiCiAgICAgICB9LAogICAgICAgewpAQCAtMjI4NzYsMjMgKzIyODAzLDYgQEAKICAgICAgICAgICBdLAogICAgICAgICAgICJleHBpcmF0aW9uIjogMjE2MDAKICAgICAgICAgfSwKLSAgICAgICAgInRlc3QiOiAibGV2ZWxkYl9zZXJ2aWNlX3VuaXR0ZXN0cyIKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgICJtZXJnZSI6IHsKLSAgICAgICAgICAiYXJncyI6IFtdLAotICAgICAgICAgICJzY3JpcHQiOiAiLy90ZXN0aW5nL21lcmdlX3NjcmlwdHMvc3RhbmRhcmRfZ3Rlc3RfbWVyZ2UucHkiCi0gICAgICAgIH0sCi0gICAgICAgICJzd2FybWluZyI6IHsKLSAgICAgICAgICAiY2FuX3VzZV9vbl9zd2FybWluZ19idWlsZGVycyI6IHRydWUsCi0gICAgICAgICAgImRpbWVuc2lvbl9zZXRzIjogWwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAiZ3B1IjogIjgwODY6MGEyZSIsCi0gICAgICAgICAgICAgICJvcyI6ICJNYWMtMTAuMTUiCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgXSwKLSAgICAgICAgICAiZXhwaXJhdGlvbiI6IDIxNjAwCi0gICAgICAgIH0sCiAgICAgICAgICJ0ZXN0IjogImxpYmppbmdsZV94bXBwX3VuaXR0ZXN0cyIKICAgICAgIH0sCiAgICAgICB7CmRpZmYgLS1naXQgYS90ZXN0aW5nL2J1aWxkYm90L2Nocm9taXVtLmxpbnV4Lmpzb24gYi90ZXN0aW5nL2J1aWxkYm90L2Nocm9taXVtLmxpbnV4Lmpzb24KaW5kZXggMmY5NDA4NS4uNjM0MmM3ZCAxMDA2NDQKLS0tIGEvdGVzdGluZy9idWlsZGJvdC9jaHJvbWl1bS5saW51eC5qc29uCisrKyBiL3Rlc3RpbmcvYnVpbGRib3QvY2hyb21pdW0ubGludXguanNvbgpAQCAtMzA5NCwyMiArMzA5NCw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgXQogICAgICAgICB9LAotICAgICAgICAidGVzdCI6ICJsZXZlbGRiX3NlcnZpY2VfdW5pdHRlc3RzIgotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgImlzb2xhdGVfY292ZXJhZ2VfZGF0YSI6IHRydWUsCi0gICAgICAgICJtZXJnZSI6IHsKLSAgICAgICAgICAiYXJncyI6IFtdLAotICAgICAgICAgICJzY3JpcHQiOiAiLy90ZXN0aW5nL21lcmdlX3NjcmlwdHMvc3RhbmRhcmRfZ3Rlc3RfbWVyZ2UucHkiCi0gICAgICAgIH0sCi0gICAgICAgICJzd2FybWluZyI6IHsKLSAgICAgICAgICAiY2FuX3VzZV9vbl9zd2FybWluZ19idWlsZGVycyI6IHRydWUsCi0gICAgICAgICAgImRpbWVuc2lvbl9zZXRzIjogWwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAib3MiOiAiVWJ1bnR1LTE2LjA0IgotICAgICAgICAgICAgfQotICAgICAgICAgIF0KLSAgICAgICAgfSwKICAgICAgICAgInRlc3QiOiAibGliamluZ2xlX3htcHBfdW5pdHRlc3RzIgogICAgICAgfSwKICAgICAgIHsKQEAgLTQ5MjMsMjEgKzQ5MDcsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgIF0KICAgICAgICAgfSwKLSAgICAgICAgInRlc3QiOiAibGV2ZWxkYl9zZXJ2aWNlX3VuaXR0ZXN0cyIKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgICJtZXJnZSI6IHsKLSAgICAgICAgICAiYXJncyI6IFtdLAotICAgICAgICAgICJzY3JpcHQiOiAiLy90ZXN0aW5nL21lcmdlX3NjcmlwdHMvc3RhbmRhcmRfZ3Rlc3RfbWVyZ2UucHkiCi0gICAgICAgIH0sCi0gICAgICAgICJzd2FybWluZyI6IHsKLSAgICAgICAgICAiY2FuX3VzZV9vbl9zd2FybWluZ19idWlsZGVycyI6IHRydWUsCi0gICAgICAgICAgImRpbWVuc2lvbl9zZXRzIjogWwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAib3MiOiAiVWJ1bnR1LTE2LjA0IgotICAgICAgICAgICAgfQotICAgICAgICAgIF0KLSAgICAgICAgfSwKICAgICAgICAgInRlc3QiOiAibGliamluZ2xlX3htcHBfdW5pdHRlc3RzIgogICAgICAgfSwKICAgICAgIHsKQEAgLTY2OTQsMjEgKzY2NjMsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgIF0KICAgICAgICAgfSwKLSAgICAgICAgInRlc3QiOiAibGV2ZWxkYl9zZXJ2aWNlX3VuaXR0ZXN0cyIKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgICJtZXJnZSI6IHsKLSAgICAgICAgICAiYXJncyI6IFtdLAotICAgICAgICAgICJzY3JpcHQiOiAiLy90ZXN0aW5nL21lcmdlX3NjcmlwdHMvc3RhbmRhcmRfZ3Rlc3RfbWVyZ2UucHkiCi0gICAgICAgIH0sCi0gICAgICAgICJzd2FybWluZyI6IHsKLSAgICAgICAgICAiY2FuX3VzZV9vbl9zd2FybWluZ19idWlsZGVycyI6IHRydWUsCi0gICAgICAgICAgImRpbWVuc2lvbl9zZXRzIjogWwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAib3MiOiAiVWJ1bnR1LTE0LjA0IgotICAgICAgICAgICAgfQotICAgICAgICAgIF0KLSAgICAgICAgfSwKICAgICAgICAgInRlc3QiOiAibGliamluZ2xlX3htcHBfdW5pdHRlc3RzIgogICAgICAgfSwKICAgICAgIHsKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvYnVpbGRib3QvY2hyb21pdW0ubWFjLmpzb24gYi90ZXN0aW5nL2J1aWxkYm90L2Nocm9taXVtLm1hYy5qc29uCmluZGV4IDIzMTc2NzE0Li4yOGRkNjhjOSAxMDA2NDQKLS0tIGEvdGVzdGluZy9idWlsZGJvdC9jaHJvbWl1bS5tYWMuanNvbgorKysgYi90ZXN0aW5nL2J1aWxkYm90L2Nocm9taXVtLm1hYy5qc29uCkBAIC04MzIsMjIgKzgzMiw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgXQogICAgICAgICB9LAotICAgICAgICAidGVzdCI6ICJsZXZlbGRiX3NlcnZpY2VfdW5pdHRlc3RzIgotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgIm1lcmdlIjogewotICAgICAgICAgICJhcmdzIjogW10sCi0gICAgICAgICAgInNjcmlwdCI6ICIvL3Rlc3RpbmcvbWVyZ2Vfc2NyaXB0cy9zdGFuZGFyZF9ndGVzdF9tZXJnZS5weSIKLSAgICAgICAgfSwKLSAgICAgICAgInN3YXJtaW5nIjogewotICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogdHJ1ZSwKLSAgICAgICAgICAiZGltZW5zaW9uX3NldHMiOiBbCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICJncHUiOiAibm9uZSIsCi0gICAgICAgICAgICAgICJvcyI6ICJNYWMtMTAuMTAiCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgXQotICAgICAgICB9LAogICAgICAgICAidGVzdCI6ICJsaWJqaW5nbGVfeG1wcF91bml0dGVzdHMiCiAgICAgICB9LAogICAgICAgewpAQCAtMjM5NiwyMiArMjM4MCw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgXQogICAgICAgICB9LAotICAgICAgICAidGVzdCI6ICJsZXZlbGRiX3NlcnZpY2VfdW5pdHRlc3RzIgotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgIm1lcmdlIjogewotICAgICAgICAgICJhcmdzIjogW10sCi0gICAgICAgICAgInNjcmlwdCI6ICIvL3Rlc3RpbmcvbWVyZ2Vfc2NyaXB0cy9zdGFuZGFyZF9ndGVzdF9tZXJnZS5weSIKLSAgICAgICAgfSwKLSAgICAgICAgInN3YXJtaW5nIjogewotICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogdHJ1ZSwKLSAgICAgICAgICAiZGltZW5zaW9uX3NldHMiOiBbCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICJncHUiOiAibm9uZSIsCi0gICAgICAgICAgICAgICJvcyI6ICJNYWMtMTAuMTEiCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgXQotICAgICAgICB9LAogICAgICAgICAidGVzdCI6ICJsaWJqaW5nbGVfeG1wcF91bml0dGVzdHMiCiAgICAgICB9LAogICAgICAgewpAQCAtMzk2MCwyMiArMzkyOCw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgXQogICAgICAgICB9LAotICAgICAgICAidGVzdCI6ICJsZXZlbGRiX3NlcnZpY2VfdW5pdHRlc3RzIgotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgIm1lcmdlIjogewotICAgICAgICAgICJhcmdzIjogW10sCi0gICAgICAgICAgInNjcmlwdCI6ICIvL3Rlc3RpbmcvbWVyZ2Vfc2NyaXB0cy9zdGFuZGFyZF9ndGVzdF9tZXJnZS5weSIKLSAgICAgICAgfSwKLSAgICAgICAgInN3YXJtaW5nIjogewotICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogdHJ1ZSwKLSAgICAgICAgICAiZGltZW5zaW9uX3NldHMiOiBbCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICJncHUiOiAiODA4NjowYTJlIiwKLSAgICAgICAgICAgICAgIm9zIjogIk1hYy0xMC4xMi42IgotICAgICAgICAgICAgfQotICAgICAgICAgIF0KLSAgICAgICAgfSwKICAgICAgICAgInRlc3QiOiAibGliamluZ2xlX3htcHBfdW5pdHRlc3RzIgogICAgICAgfSwKICAgICAgIHsKQEAgLTU1NjksMjIgKzU1MjEsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgIF0KICAgICAgICAgfSwKLSAgICAgICAgInRlc3QiOiAibGV2ZWxkYl9zZXJ2aWNlX3VuaXR0ZXN0cyIKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgICJtZXJnZSI6IHsKLSAgICAgICAgICAiYXJncyI6IFtdLAotICAgICAgICAgICJzY3JpcHQiOiAiLy90ZXN0aW5nL21lcmdlX3NjcmlwdHMvc3RhbmRhcmRfZ3Rlc3RfbWVyZ2UucHkiCi0gICAgICAgIH0sCi0gICAgICAgICJzd2FybWluZyI6IHsKLSAgICAgICAgICAiY2FuX3VzZV9vbl9zd2FybWluZ19idWlsZGVycyI6IHRydWUsCi0gICAgICAgICAgImRpbWVuc2lvbl9zZXRzIjogWwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAiZ3B1IjogIm5vbmUiLAotICAgICAgICAgICAgICAib3MiOiAiTWFjLTEwLjEzLjYiCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgXQotICAgICAgICB9LAogICAgICAgICAidGVzdCI6ICJsaWJqaW5nbGVfeG1wcF91bml0dGVzdHMiCiAgICAgICB9LAogICAgICAgewpAQCAtNzE2OCwyMiArNzEwNCw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgXQogICAgICAgICB9LAotICAgICAgICAidGVzdCI6ICJsZXZlbGRiX3NlcnZpY2VfdW5pdHRlc3RzIgotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgIm1lcmdlIjogewotICAgICAgICAgICJhcmdzIjogW10sCi0gICAgICAgICAgInNjcmlwdCI6ICIvL3Rlc3RpbmcvbWVyZ2Vfc2NyaXB0cy9zdGFuZGFyZF9ndGVzdF9tZXJnZS5weSIKLSAgICAgICAgfSwKLSAgICAgICAgInN3YXJtaW5nIjogewotICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogdHJ1ZSwKLSAgICAgICAgICAiZGltZW5zaW9uX3NldHMiOiBbCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICJncHUiOiAibm9uZSIsCi0gICAgICAgICAgICAgICJvcyI6ICJNYWMtMTAuMTMuNiIKLSAgICAgICAgICAgIH0KLSAgICAgICAgICBdCi0gICAgICAgIH0sCiAgICAgICAgICJ0ZXN0IjogImxpYmppbmdsZV94bXBwX3VuaXR0ZXN0cyIKICAgICAgIH0sCiAgICAgICB7CmRpZmYgLS1naXQgYS90ZXN0aW5nL2J1aWxkYm90L2Nocm9taXVtLm1lbW9yeS5qc29uIGIvdGVzdGluZy9idWlsZGJvdC9jaHJvbWl1bS5tZW1vcnkuanNvbgppbmRleCA3YWY5OTg1Li42Y2NlOGJmIDEwMDY0NAotLS0gYS90ZXN0aW5nL2J1aWxkYm90L2Nocm9taXVtLm1lbW9yeS5qc29uCisrKyBiL3Rlc3RpbmcvYnVpbGRib3QvY2hyb21pdW0ubWVtb3J5Lmpzb24KQEAgLTQwNDEsMjQgKzQwNDEsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgIF0KICAgICAgICAgfSwKLSAgICAgICAgInRlc3QiOiAibGV2ZWxkYl9zZXJ2aWNlX3VuaXR0ZXN0cyIKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgICJhcmdzIjogWwotICAgICAgICAgICItLXRlc3QtbGF1bmNoZXItcHJpbnQtdGVzdC1zdGRpbz1hbHdheXMiCi0gICAgICAgIF0sCi0gICAgICAgICJtZXJnZSI6IHsKLSAgICAgICAgICAiYXJncyI6IFtdLAotICAgICAgICAgICJzY3JpcHQiOiAiLy90ZXN0aW5nL21lcmdlX3NjcmlwdHMvc3RhbmRhcmRfZ3Rlc3RfbWVyZ2UucHkiCi0gICAgICAgIH0sCi0gICAgICAgICJzd2FybWluZyI6IHsKLSAgICAgICAgICAiY2FuX3VzZV9vbl9zd2FybWluZ19idWlsZGVycyI6IHRydWUsCi0gICAgICAgICAgImRpbWVuc2lvbl9zZXRzIjogWwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAib3MiOiAiVWJ1bnR1LTE2LjA0IgotICAgICAgICAgICAgfQotICAgICAgICAgIF0KLSAgICAgICAgfSwKICAgICAgICAgInRlc3QiOiAibGliamluZ2xlX3htcHBfdW5pdHRlc3RzIgogICAgICAgfSwKICAgICAgIHsKQEAgLTU2MTgsMjEgKzU2MDAsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgIF0KICAgICAgICAgfSwKLSAgICAgICAgInRlc3QiOiAibGV2ZWxkYl9zZXJ2aWNlX3VuaXR0ZXN0cyIKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgICJtZXJnZSI6IHsKLSAgICAgICAgICAiYXJncyI6IFtdLAotICAgICAgICAgICJzY3JpcHQiOiAiLy90ZXN0aW5nL21lcmdlX3NjcmlwdHMvc3RhbmRhcmRfZ3Rlc3RfbWVyZ2UucHkiCi0gICAgICAgIH0sCi0gICAgICAgICJzd2FybWluZyI6IHsKLSAgICAgICAgICAiY2FuX3VzZV9vbl9zd2FybWluZ19idWlsZGVycyI6IHRydWUsCi0gICAgICAgICAgImRpbWVuc2lvbl9zZXRzIjogWwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAib3MiOiAiVWJ1bnR1LTE2LjA0IgotICAgICAgICAgICAgfQotICAgICAgICAgIF0KLSAgICAgICAgfSwKICAgICAgICAgInRlc3QiOiAibGliamluZ2xlX3htcHBfdW5pdHRlc3RzIgogICAgICAgfSwKICAgICAgIHsKQEAgLTcyMDUsMjQgKzcxNzIsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgIF0KICAgICAgICAgfSwKLSAgICAgICAgInRlc3QiOiAibGV2ZWxkYl9zZXJ2aWNlX3VuaXR0ZXN0cyIKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgICJhcmdzIjogWwotICAgICAgICAgICItLXRlc3QtbGF1bmNoZXItcHJpbnQtdGVzdC1zdGRpbz1hbHdheXMiCi0gICAgICAgIF0sCi0gICAgICAgICJtZXJnZSI6IHsKLSAgICAgICAgICAiYXJncyI6IFtdLAotICAgICAgICAgICJzY3JpcHQiOiAiLy90ZXN0aW5nL21lcmdlX3NjcmlwdHMvc3RhbmRhcmRfZ3Rlc3RfbWVyZ2UucHkiCi0gICAgICAgIH0sCi0gICAgICAgICJzd2FybWluZyI6IHsKLSAgICAgICAgICAiY2FuX3VzZV9vbl9zd2FybWluZ19idWlsZGVycyI6IHRydWUsCi0gICAgICAgICAgImRpbWVuc2lvbl9zZXRzIjogWwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAib3MiOiAiVWJ1bnR1LTE2LjA0IgotICAgICAgICAgICAgfQotICAgICAgICAgIF0KLSAgICAgICAgfSwKICAgICAgICAgInRlc3QiOiAibGliamluZ2xlX3htcHBfdW5pdHRlc3RzIgogICAgICAgfSwKICAgICAgIHsKQEAgLTkwMzUsMjUgKzg5ODQsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgIF0KICAgICAgICAgfSwKLSAgICAgICAgInRlc3QiOiAibGV2ZWxkYl9zZXJ2aWNlX3VuaXR0ZXN0cyIKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgICJhcmdzIjogWwotICAgICAgICAgICItLXRlc3QtbGF1bmNoZXItcHJpbnQtdGVzdC1zdGRpbz1hbHdheXMiCi0gICAgICAgIF0sCi0gICAgICAgICJtZXJnZSI6IHsKLSAgICAgICAgICAiYXJncyI6IFtdLAotICAgICAgICAgICJzY3JpcHQiOiAiLy90ZXN0aW5nL21lcmdlX3NjcmlwdHMvc3RhbmRhcmRfZ3Rlc3RfbWVyZ2UucHkiCi0gICAgICAgIH0sCi0gICAgICAgICJzd2FybWluZyI6IHsKLSAgICAgICAgICAiY2FuX3VzZV9vbl9zd2FybWluZ19idWlsZGVycyI6IHRydWUsCi0gICAgICAgICAgImRpbWVuc2lvbl9zZXRzIjogWwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAiY3B1IjogIng4Ni02NCIsCi0gICAgICAgICAgICAgICJvcyI6ICJVYnVudHUtMTYuMDQiCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgXQotICAgICAgICB9LAogICAgICAgICAidGVzdCI6ICJsaWJqaW5nbGVfeG1wcF91bml0dGVzdHMiCiAgICAgICB9LAogICAgICAgewpAQCAtMTA4MjEsMjUgKzEwNzUxLDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICBdCiAgICAgICAgIH0sCi0gICAgICAgICJ0ZXN0IjogImxldmVsZGJfc2VydmljZV91bml0dGVzdHMiCi0gICAgICB9LAotICAgICAgewotICAgICAgICAiYXJncyI6IFsKLSAgICAgICAgICAiLS10ZXN0LWxhdW5jaGVyLXByaW50LXRlc3Qtc3RkaW89YWx3YXlzIgotICAgICAgICBdLAotICAgICAgICAibWVyZ2UiOiB7Ci0gICAgICAgICAgImFyZ3MiOiBbXSwKLSAgICAgICAgICAic2NyaXB0IjogIi8vdGVzdGluZy9tZXJnZV9zY3JpcHRzL3N0YW5kYXJkX2d0ZXN0X21lcmdlLnB5IgotICAgICAgICB9LAotICAgICAgICAic3dhcm1pbmciOiB7Ci0gICAgICAgICAgImNhbl91c2Vfb25fc3dhcm1pbmdfYnVpbGRlcnMiOiB0cnVlLAotICAgICAgICAgICJkaW1lbnNpb25fc2V0cyI6IFsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgImNwdSI6ICJ4ODYtNjQiLAotICAgICAgICAgICAgICAib3MiOiAiVWJ1bnR1LTE2LjA0IgotICAgICAgICAgICAgfQotICAgICAgICAgIF0KLSAgICAgICAgfSwKICAgICAgICAgInRlc3QiOiAibGliamluZ2xlX3htcHBfdW5pdHRlc3RzIgogICAgICAgfSwKICAgICAgIHsKQEAgLTEyNDkxLDI0ICsxMjQwMiw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgXQogICAgICAgICB9LAotICAgICAgICAidGVzdCI6ICJsZXZlbGRiX3NlcnZpY2VfdW5pdHRlc3RzIgotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgImFyZ3MiOiBbCi0gICAgICAgICAgIi0tdGVzdC1sYXVuY2hlci1wcmludC10ZXN0LXN0ZGlvPWFsd2F5cyIKLSAgICAgICAgXSwKLSAgICAgICAgIm1lcmdlIjogewotICAgICAgICAgICJhcmdzIjogW10sCi0gICAgICAgICAgInNjcmlwdCI6ICIvL3Rlc3RpbmcvbWVyZ2Vfc2NyaXB0cy9zdGFuZGFyZF9ndGVzdF9tZXJnZS5weSIKLSAgICAgICAgfSwKLSAgICAgICAgInN3YXJtaW5nIjogewotICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogdHJ1ZSwKLSAgICAgICAgICAiZGltZW5zaW9uX3NldHMiOiBbCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICJvcyI6ICJVYnVudHUtMTYuMDQiCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgXQotICAgICAgICB9LAogICAgICAgICAidGVzdCI6ICJsaWJqaW5nbGVfeG1wcF91bml0dGVzdHMiCiAgICAgICB9LAogICAgICAgewpAQCAtMTM3OTEsMTkgKzEzNjg0LDYgQEAKICAgICAgICAgInN3YXJtaW5nIjogewogICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogdHJ1ZQogICAgICAgICB9LAotICAgICAgICAidGVzdCI6ICJsZXZlbGRiX3NlcnZpY2VfdW5pdHRlc3RzIgotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgImFyZ3MiOiBbCi0gICAgICAgICAgIi0tdGVzdC1sYXVuY2hlci1wcmludC10ZXN0LXN0ZGlvPWFsd2F5cyIKLSAgICAgICAgXSwKLSAgICAgICAgIm1lcmdlIjogewotICAgICAgICAgICJhcmdzIjogW10sCi0gICAgICAgICAgInNjcmlwdCI6ICIvL3Rlc3RpbmcvbWVyZ2Vfc2NyaXB0cy9zdGFuZGFyZF9ndGVzdF9tZXJnZS5weSIKLSAgICAgICAgfSwKLSAgICAgICAgInN3YXJtaW5nIjogewotICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogdHJ1ZQotICAgICAgICB9LAogICAgICAgICAidGVzdCI6ICJsaWJqaW5nbGVfeG1wcF91bml0dGVzdHMiCiAgICAgICB9LAogICAgICAgewpAQCAtMTc4NzMsMjEgKzE3NzUzLDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICBdCiAgICAgICAgIH0sCi0gICAgICAgICJ0ZXN0IjogImxldmVsZGJfc2VydmljZV91bml0dGVzdHMiCi0gICAgICB9LAotICAgICAgewotICAgICAgICAibWVyZ2UiOiB7Ci0gICAgICAgICAgImFyZ3MiOiBbXSwKLSAgICAgICAgICAic2NyaXB0IjogIi8vdGVzdGluZy9tZXJnZV9zY3JpcHRzL3N0YW5kYXJkX2d0ZXN0X21lcmdlLnB5IgotICAgICAgICB9LAotICAgICAgICAic3dhcm1pbmciOiB7Ci0gICAgICAgICAgImNhbl91c2Vfb25fc3dhcm1pbmdfYnVpbGRlcnMiOiB0cnVlLAotICAgICAgICAgICJkaW1lbnNpb25fc2V0cyI6IFsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIm9zIjogIldpbmRvd3MtMTAtMTUwNjMiCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgXQotICAgICAgICB9LAogICAgICAgICAidGVzdCI6ICJsaWJqaW5nbGVfeG1wcF91bml0dGVzdHMiCiAgICAgICB9LAogICAgICAgewpkaWZmIC0tZ2l0IGEvdGVzdGluZy9idWlsZGJvdC9jaHJvbWl1bS53aW4uanNvbiBiL3Rlc3RpbmcvYnVpbGRib3QvY2hyb21pdW0ud2luLmpzb24KaW5kZXggNTk0ODUwOC4uZGZmYmU1NCAxMDA2NDQKLS0tIGEvdGVzdGluZy9idWlsZGJvdC9jaHJvbWl1bS53aW4uanNvbgorKysgYi90ZXN0aW5nL2J1aWxkYm90L2Nocm9taXVtLndpbi5qc29uCkBAIC02MzksMTYgKzYzOSw2IEBACiAgICAgICAgICJzd2FybWluZyI6IHsKICAgICAgICAgICAiY2FuX3VzZV9vbl9zd2FybWluZ19idWlsZGVycyI6IHRydWUKICAgICAgICAgfSwKLSAgICAgICAgInRlc3QiOiAibGV2ZWxkYl9zZXJ2aWNlX3VuaXR0ZXN0cyIKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgICJtZXJnZSI6IHsKLSAgICAgICAgICAiYXJncyI6IFtdLAotICAgICAgICAgICJzY3JpcHQiOiAiLy90ZXN0aW5nL21lcmdlX3NjcmlwdHMvc3RhbmRhcmRfZ3Rlc3RfbWVyZ2UucHkiCi0gICAgICAgIH0sCi0gICAgICAgICJzd2FybWluZyI6IHsKLSAgICAgICAgICAiY2FuX3VzZV9vbl9zd2FybWluZ19idWlsZGVycyI6IHRydWUKLSAgICAgICAgfSwKICAgICAgICAgInRlc3QiOiAibGliamluZ2xlX3htcHBfdW5pdHRlc3RzIgogICAgICAgfSwKICAgICAgIHsKQEAgLTIyNTMsMjIgKzIyNDMsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgIF0KICAgICAgICAgfSwKLSAgICAgICAgInRlc3QiOiAibGV2ZWxkYl9zZXJ2aWNlX3VuaXR0ZXN0cyIKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgICJtZXJnZSI6IHsKLSAgICAgICAgICAiYXJncyI6IFtdLAotICAgICAgICAgICJzY3JpcHQiOiAiLy90ZXN0aW5nL21lcmdlX3NjcmlwdHMvc3RhbmRhcmRfZ3Rlc3RfbWVyZ2UucHkiCi0gICAgICAgIH0sCi0gICAgICAgICJzd2FybWluZyI6IHsKLSAgICAgICAgICAiY2FuX3VzZV9vbl9zd2FybWluZ19idWlsZGVycyI6IHRydWUsCi0gICAgICAgICAgImRpbWVuc2lvbl9zZXRzIjogWwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAiY3B1IjogIng4Ni02NCIsCi0gICAgICAgICAgICAgICJvcyI6ICJXaW5kb3dzLTEwLTE1MDYzIgotICAgICAgICAgICAgfQotICAgICAgICAgIF0KLSAgICAgICAgfSwKICAgICAgICAgInRlc3QiOiAibGliamluZ2xlX3htcHBfdW5pdHRlc3RzIgogICAgICAgfSwKICAgICAgIHsKQEAgLTQxMTYsMjIgKzQwOTAsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgIF0KICAgICAgICAgfSwKLSAgICAgICAgInRlc3QiOiAibGV2ZWxkYl9zZXJ2aWNlX3VuaXR0ZXN0cyIKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgICJtZXJnZSI6IHsKLSAgICAgICAgICAiYXJncyI6IFtdLAotICAgICAgICAgICJzY3JpcHQiOiAiLy90ZXN0aW5nL21lcmdlX3NjcmlwdHMvc3RhbmRhcmRfZ3Rlc3RfbWVyZ2UucHkiCi0gICAgICAgIH0sCi0gICAgICAgICJzd2FybWluZyI6IHsKLSAgICAgICAgICAiY2FuX3VzZV9vbl9zd2FybWluZ19idWlsZGVycyI6IHRydWUsCi0gICAgICAgICAgImRpbWVuc2lvbl9zZXRzIjogWwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAiY3B1IjogIng4Ni02NCIsCi0gICAgICAgICAgICAgICJvcyI6ICJXaW5kb3dzLTEwLTE1MDYzIgotICAgICAgICAgICAgfQotICAgICAgICAgIF0KLSAgICAgICAgfSwKICAgICAgICAgInRlc3QiOiAibGliamluZ2xlX3htcHBfdW5pdHRlc3RzIgogICAgICAgfSwKICAgICAgIHsKQEAgLTU3MTAsMTYgKzU2NjgsNiBAQAogICAgICAgICAic3dhcm1pbmciOiB7CiAgICAgICAgICAgImNhbl91c2Vfb25fc3dhcm1pbmdfYnVpbGRlcnMiOiB0cnVlCiAgICAgICAgIH0sCi0gICAgICAgICJ0ZXN0IjogImxldmVsZGJfc2VydmljZV91bml0dGVzdHMiCi0gICAgICB9LAotICAgICAgewotICAgICAgICAibWVyZ2UiOiB7Ci0gICAgICAgICAgImFyZ3MiOiBbXSwKLSAgICAgICAgICAic2NyaXB0IjogIi8vdGVzdGluZy9tZXJnZV9zY3JpcHRzL3N0YW5kYXJkX2d0ZXN0X21lcmdlLnB5IgotICAgICAgICB9LAotICAgICAgICAic3dhcm1pbmciOiB7Ci0gICAgICAgICAgImNhbl91c2Vfb25fc3dhcm1pbmdfYnVpbGRlcnMiOiB0cnVlCi0gICAgICAgIH0sCiAgICAgICAgICJ0ZXN0IjogImxpYmppbmdsZV94bXBwX3VuaXR0ZXN0cyIKICAgICAgIH0sCiAgICAgICB7CkBAIC02OTY0LDE2ICs2OTEyLDYgQEAKICAgICAgICAgInN3YXJtaW5nIjogewogICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogdHJ1ZQogICAgICAgICB9LAotICAgICAgICAidGVzdCI6ICJsZXZlbGRiX3NlcnZpY2VfdW5pdHRlc3RzIgotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgIm1lcmdlIjogewotICAgICAgICAgICJhcmdzIjogW10sCi0gICAgICAgICAgInNjcmlwdCI6ICIvL3Rlc3RpbmcvbWVyZ2Vfc2NyaXB0cy9zdGFuZGFyZF9ndGVzdF9tZXJnZS5weSIKLSAgICAgICAgfSwKLSAgICAgICAgInN3YXJtaW5nIjogewotICAgICAgICAgICJjYW5fdXNlX29uX3N3YXJtaW5nX2J1aWxkZXJzIjogdHJ1ZQotICAgICAgICB9LAogICAgICAgICAidGVzdCI6ICJsaWJqaW5nbGVfeG1wcF91bml0dGVzdHMiCiAgICAgICB9LAogICAgICAgewpkaWZmIC0tZ2l0IGEvdGVzdGluZy9idWlsZGJvdC9nbl9pc29sYXRlX21hcC5weWwgYi90ZXN0aW5nL2J1aWxkYm90L2duX2lzb2xhdGVfbWFwLnB5bAppbmRleCBiOTU3ZDE2Li42YmQ2OGEwIDEwMDY0NAotLS0gYS90ZXN0aW5nL2J1aWxkYm90L2duX2lzb2xhdGVfbWFwLnB5bAorKysgYi90ZXN0aW5nL2J1aWxkYm90L2duX2lzb2xhdGVfbWFwLnB5bApAQCAtMTQ4NSwxMCArMTQ4NSw2IEBACiAgICAgImxhYmVsIjogIi8vdGhpcmRfcGFydHkvbGV2ZWxkYXRhYmFzZTpsZXZlbGRiX3B1dF9nZXRfZGVsZXRlX2Z1enplciIsCiAgICAgInR5cGUiOiAiZnV6emVyIiwKICAgfSwKLSAgImxldmVsZGJfc2VydmljZV91bml0dGVzdHMiOiB7Ci0gICAgImxhYmVsIjogIi8vY29tcG9uZW50cy9zZXJ2aWNlcy9sZXZlbGRiOmxldmVsZGJfc2VydmljZV91bml0dGVzdHMiLAotICAgICJ0eXBlIjogImNvbnNvbGVfdGVzdF9sYXVuY2hlciIsCi0gIH0sCiAgICJsaWJBTkdMRSI6IHsKICAgICAibGFiZWwiOiAiLy90aGlyZF9wYXJ0eS9hbmdsZTpsaWJBTkdMRSIsCiAgICAgInR5cGUiOiAiYWRkaXRpb25hbF9jb21waWxlX3RhcmdldCIsCmRpZmYgLS1naXQgYS90ZXN0aW5nL2J1aWxkYm90L3Rlc3Rfc3VpdGVzLnB5bCBiL3Rlc3RpbmcvYnVpbGRib3QvdGVzdF9zdWl0ZXMucHlsCmluZGV4IGJkZjEyYWIuLmY3YzI5MzMxIDEwMDY0NAotLS0gYS90ZXN0aW5nL2J1aWxkYm90L3Rlc3Rfc3VpdGVzLnB5bAorKysgYi90ZXN0aW5nL2J1aWxkYm90L3Rlc3Rfc3VpdGVzLnB5bApAQCAtNDQ4Niw3ICs0NDg2LDYgQEAKICAgICAgICAgICAnc2hhcmRzJzogMywKICAgICAgICAgfSwKICAgICAgIH0sCi0gICAgICAnbGV2ZWxkYl9zZXJ2aWNlX3VuaXR0ZXN0cyc6IHt9LCAgIyBodHRwczovL2NyYnVnLmNvbS84NjI3MDkKICAgICAgICdtZXNzYWdlX2NlbnRlcl91bml0dGVzdHMnOiB7fSwKICAgICAgICduYWNsX2xvYWRlcl91bml0dGVzdHMnOiB7fSwKICAgICAgICduYXRpdmVfdGhlbWVfdW5pdHRlc3RzJzoge30sCmRpZmYgLS1naXQgYS90ZXN0aW5nL3ZhcmlhdGlvbnMvZmllbGR0cmlhbF90ZXN0aW5nX2NvbmZpZy5qc29uIGIvdGVzdGluZy92YXJpYXRpb25zL2ZpZWxkdHJpYWxfdGVzdGluZ19jb25maWcuanNvbgppbmRleCA4NzNkODRiLi4yNzY2MTRiIDEwMDY0NAotLS0gYS90ZXN0aW5nL3ZhcmlhdGlvbnMvZmllbGR0cmlhbF90ZXN0aW5nX2NvbmZpZy5qc29uCisrKyBiL3Rlc3RpbmcvdmFyaWF0aW9ucy9maWVsZHRyaWFsX3Rlc3RpbmdfY29uZmlnLmpzb24KQEAgLTEzOTQsMTAgKzEzOTQsOSBAQAogICAgICAgICAgICAgXSwKICAgICAgICAgICAgICJleHBlcmltZW50cyI6IFsKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICJuYW1lIjogIkNhcGFjaXR5XzUxMmtiX0NodW5rXzY0a2IiLAorICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJFbmFibGVkXzJNQl92MSIsCiAgICAgICAgICAgICAgICAgICAgICJwYXJhbXMiOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAiY2FwYWNpdHlfYnl0ZXMiOiAiNTI0Mjg4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJjaHVua19ieXRlcyI6ICI2NTUzNiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYXBhY2l0eV9ieXRlcyI6ICIyMDk3MTUyIgogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiZW5hYmxlX2ZlYXR1cmVzIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgIkJsb2JEYXRhUGlwZVR1bmluZyIKQEAgLTM3NjgsNiArMzc2NywyNiBAQAogICAgICAgICAgICAgXQogICAgICAgICB9CiAgICAgXSwKKyAgICAiT2ZmTWFpblRocmVhZFNlcnZpY2VXb3JrZXJTdGFydHVwIjogWworICAgICAgICB7CisgICAgICAgICAgICAicGxhdGZvcm1zIjogWworICAgICAgICAgICAgICAgICJhbmRyb2lkIiwKKyAgICAgICAgICAgICAgICAiYW5kcm9pZF93ZWJ2aWV3IiwKKyAgICAgICAgICAgICAgICAiY2hyb21lb3MiLAorICAgICAgICAgICAgICAgICJsaW51eCIsCisgICAgICAgICAgICAgICAgIm1hYyIsCisgICAgICAgICAgICAgICAgIndpbmRvd3MiCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgImV4cGVyaW1lbnRzIjogWworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiRW5hYmxlZCIsCisgICAgICAgICAgICAgICAgICAgICJlbmFibGVfZmVhdHVyZXMiOiBbCisgICAgICAgICAgICAgICAgICAgICAgICAiT2ZmTWFpblRocmVhZFNlcnZpY2VXb3JrZXJTdGFydHVwIgorICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgXQorICAgICAgICB9CisgICAgXSwKICAgICAiT2ZmZXJVcGxvYWRDcmVkaXRDYXJkcyI6IFsKICAgICAgICAgewogICAgICAgICAgICAgInBsYXRmb3JtcyI6IFsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL2NvbW1vbi9mZWF0dXJlcy5jYyBiL3RoaXJkX3BhcnR5L2JsaW5rL2NvbW1vbi9mZWF0dXJlcy5jYwppbmRleCA2ZTVkODEwLi5hZmY3M2NmIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay9jb21tb24vZmVhdHVyZXMuY2MKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvY29tbW9uL2ZlYXR1cmVzLmNjCkBAIC0xMjksNiArMTI5LDEwIEBACiAjZW5kaWYKIH07CiAKKy8vIEVuYWJsZSBDU1NPTSBWaWV3IFNjcm9sbCBDb29yZGluYXRlcy4gaHR0cHM6Ly9jcmJ1Zy5jb20vNzIxNzU5LgorY29uc3QgYmFzZTo6RmVhdHVyZSBrQ1NTT01WaWV3U2Nyb2xsQ29vcmRpbmF0ZXN7CisgICAgIkNTU09NVmlld1Njcm9sbENvb3JkaW5hdGVzIiwgYmFzZTo6RkVBVFVSRV9ESVNBQkxFRF9CWV9ERUZBVUxUfTsKKwogLy8gRW5hYmxlcyB1c2FnZSBvZiBnZXREaXNwbGF5TWVkaWEoKSB0aGF0IGFsbG93cyBjYXB0dXJlIG9mIHdlYiBjb250ZW50LCBzZWUKIC8vIGh0dHBzOi8vY3JidWcuY29tLzg2NTA2MC4KIGNvbnN0IGJhc2U6OkZlYXR1cmUga1JUQ0dldERpc3BsYXlNZWRpYXsiUlRDR2V0RGlzcGxheU1lZGlhIiwKQEAgLTI5NCwxMCArMjk4LDYgQEAKICNlbmRpZgogfTsKIAotLy8gVXNlIHNjcm9sbCBnZXN0dXJlcyBmb3Igc2Nyb2xsYmFyIHNjcm9sbHMgKHNlZSBodHRwczovL2NyYnVnLmNvbS85NTQwMDcpLgotY29uc3QgYmFzZTo6RmVhdHVyZSBrU2Nyb2xsYmFySW5qZWN0U2Nyb2xsR2VzdHVyZXN7Ci0gICAgIlNjcm9sbGJhckluamVjdFNjcm9sbEdlc3R1cmVzIiwgYmFzZTo6RkVBVFVSRV9FTkFCTEVEX0JZX0RFRkFVTFR9OwotCiAvLyBBdXRvbWF0aWNhbGx5IGNvbnZlcnQgbGlnaHQtdGhlbWVkIHBhZ2VzIHRvIHVzZSBhIEJsaW5rLWdlbmVyYXRlZCBkYXJrIHRoZW1lCiBjb25zdCBiYXNlOjpGZWF0dXJlIGtGb3JjZVdlYkNvbnRlbnRzRGFya01vZGV7CiAgICAgIldlYkNvbnRlbnRzRm9yY2VEYXJrIiwgYmFzZTo6RkVBVFVSRV9ESVNBQkxFRF9CWV9ERUZBVUxUfTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL2NvbW1vbi9sb2FkZXIvdXJsX2xvYWRlcl9mYWN0b3J5X2J1bmRsZS5jYyBiL3RoaXJkX3BhcnR5L2JsaW5rL2NvbW1vbi9sb2FkZXIvdXJsX2xvYWRlcl9mYWN0b3J5X2J1bmRsZS5jYwppbmRleCA5MDUyYzkxMTYuLjE0NzZiZjYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL2NvbW1vbi9sb2FkZXIvdXJsX2xvYWRlcl9mYWN0b3J5X2J1bmRsZS5jYworKysgYi90aGlyZF9wYXJ0eS9ibGluay9jb21tb24vbG9hZGVyL3VybF9sb2FkZXJfZmFjdG9yeV9idW5kbGUuY2MKQEAgLTM5LDEzICszOSwxMyBAQAogICAgIG1vam86OlBlbmRpbmdSZW1vdGU8bmV0d29yazo6bW9qb206OlVSTExvYWRlckZhY3Rvcnk+CiAgICAgICAgIHBlbmRpbmdfZGVmYXVsdF9mYWN0b3J5LAogICAgIFNjaGVtZU1hcCBwZW5kaW5nX3NjaGVtZV9zcGVjaWZpY19mYWN0b3JpZXMsCi0gICAgT3JpZ2luTWFwIHBlbmRpbmdfaW5pdGlhdG9yX3NwZWNpZmljX2ZhY3RvcmllcywKKyAgICBPcmlnaW5NYXAgcGVuZGluZ19pc29sYXRlZF93b3JsZF9mYWN0b3JpZXMsCiAgICAgYm9vbCBieXBhc3NfcmVkaXJlY3RfY2hlY2tzKQogICAgIDogcGVuZGluZ19kZWZhdWx0X2ZhY3RvcnlfKHN0ZDo6bW92ZShwZW5kaW5nX2RlZmF1bHRfZmFjdG9yeSkpLAogICAgICAgcGVuZGluZ19zY2hlbWVfc3BlY2lmaWNfZmFjdG9yaWVzXygKICAgICAgICAgICBzdGQ6Om1vdmUocGVuZGluZ19zY2hlbWVfc3BlY2lmaWNfZmFjdG9yaWVzKSksCi0gICAgICBwZW5kaW5nX2luaXRpYXRvcl9zcGVjaWZpY19mYWN0b3JpZXNfKAotICAgICAgICAgIHN0ZDo6bW92ZShwZW5kaW5nX2luaXRpYXRvcl9zcGVjaWZpY19mYWN0b3JpZXMpKSwKKyAgICAgIHBlbmRpbmdfaXNvbGF0ZWRfd29ybGRfZmFjdG9yaWVzXygKKyAgICAgICAgICBzdGQ6Om1vdmUocGVuZGluZ19pc29sYXRlZF93b3JsZF9mYWN0b3JpZXMpKSwKICAgICAgIGJ5cGFzc19yZWRpcmVjdF9jaGVja3NfKGJ5cGFzc19yZWRpcmVjdF9jaGVja3MpIHt9CiAKIFVSTExvYWRlckZhY3RvcnlCdW5kbGVJbmZvOjp+VVJMTG9hZGVyRmFjdG9yeUJ1bmRsZUluZm8oKSA9IGRlZmF1bHQ7CkBAIC01Nyw4ICs1Nyw4IEBACiAgIG90aGVyLT5wZW5kaW5nX2FwcGNhY2hlX2ZhY3RvcnlfID0gc3RkOjptb3ZlKHBlbmRpbmdfYXBwY2FjaGVfZmFjdG9yeV8pOwogICBvdGhlci0+cGVuZGluZ19zY2hlbWVfc3BlY2lmaWNfZmFjdG9yaWVzXyA9CiAgICAgICBzdGQ6Om1vdmUocGVuZGluZ19zY2hlbWVfc3BlY2lmaWNfZmFjdG9yaWVzXyk7Ci0gIG90aGVyLT5wZW5kaW5nX2luaXRpYXRvcl9zcGVjaWZpY19mYWN0b3JpZXNfID0KLSAgICAgIHN0ZDo6bW92ZShwZW5kaW5nX2luaXRpYXRvcl9zcGVjaWZpY19mYWN0b3JpZXNfKTsKKyAgb3RoZXItPnBlbmRpbmdfaXNvbGF0ZWRfd29ybGRfZmFjdG9yaWVzXyA9CisgICAgICBzdGQ6Om1vdmUocGVuZGluZ19pc29sYXRlZF93b3JsZF9mYWN0b3JpZXNfKTsKICAgb3RoZXItPmJ5cGFzc19yZWRpcmVjdF9jaGVja3NfID0gYnlwYXNzX3JlZGlyZWN0X2NoZWNrc187CiAKICAgcmV0dXJuIGJhc2U6Ok1ha2VSZWZDb3VudGVkPFVSTExvYWRlckZhY3RvcnlCdW5kbGU+KHN0ZDo6bW92ZShvdGhlcikpOwpAQCAtODIsOSArODIsOSBAQAogICAgIHJldHVybiBpdC0+c2Vjb25kLmdldCgpOwogCiAgIGlmIChyZXF1ZXN0Lmlzb2xhdGVkX3dvcmxkX29yaWdpbi5oYXNfdmFsdWUoKSkgewotICAgIGF1dG8gaXQyID0gaW5pdGlhdG9yX3NwZWNpZmljX2ZhY3Rvcmllc18uZmluZCgKLSAgICAgICAgcmVxdWVzdC5pc29sYXRlZF93b3JsZF9vcmlnaW4udmFsdWUoKSk7Ci0gICAgaWYgKGl0MiAhPSBpbml0aWF0b3Jfc3BlY2lmaWNfZmFjdG9yaWVzXy5lbmQoKSkKKyAgICBhdXRvIGl0MiA9CisgICAgICAgIGlzb2xhdGVkX3dvcmxkX2ZhY3Rvcmllc18uZmluZChyZXF1ZXN0Lmlzb2xhdGVkX3dvcmxkX29yaWdpbi52YWx1ZSgpKTsKKyAgICBpZiAoaXQyICE9IGlzb2xhdGVkX3dvcmxkX2ZhY3Rvcmllc18uZW5kKCkpCiAgICAgICByZXR1cm4gaXQyLT5zZWNvbmQuZ2V0KCk7CiAgIH0KIApAQCAtMTI1LDcgKzEyNSw3IEBACiAgIGF1dG8gcGVuZGluZ19mYWN0b3JpZXMgPSBzdGQ6Om1ha2VfdW5pcXVlPGJsaW5rOjpVUkxMb2FkZXJGYWN0b3J5QnVuZGxlSW5mbz4oCiAgICAgICBzdGQ6Om1vdmUocGVuZGluZ19kZWZhdWx0X2ZhY3RvcnkpLAogICAgICAgQ2xvbmVSZW1vdGVNYXBUb1BlbmRpbmdSZW1vdGVNYXAoc2NoZW1lX3NwZWNpZmljX2ZhY3Rvcmllc18pLAotICAgICAgQ2xvbmVSZW1vdGVNYXBUb1BlbmRpbmdSZW1vdGVNYXAoaW5pdGlhdG9yX3NwZWNpZmljX2ZhY3Rvcmllc18pLAorICAgICAgQ2xvbmVSZW1vdGVNYXBUb1BlbmRpbmdSZW1vdGVNYXAoaXNvbGF0ZWRfd29ybGRfZmFjdG9yaWVzXyksCiAgICAgICBieXBhc3NfcmVkaXJlY3RfY2hlY2tzXyk7CiAKICAgaWYgKGFwcGNhY2hlX2ZhY3RvcnlfKSB7CkBAIC0xNTQsOCArMTU0LDggQEAKICAgICAgICZzY2hlbWVfc3BlY2lmaWNfZmFjdG9yaWVzXywKICAgICAgIHN0ZDo6bW92ZShwZW5kaW5nX2ZhY3Rvcmllcy0+cGVuZGluZ19zY2hlbWVfc3BlY2lmaWNfZmFjdG9yaWVzKCkpKTsKICAgQmluZFBlbmRpbmdSZW1vdGVNYXBUb1JlbW90ZU1hcCgKLSAgICAgICZpbml0aWF0b3Jfc3BlY2lmaWNfZmFjdG9yaWVzXywKLSAgICAgIHN0ZDo6bW92ZShwZW5kaW5nX2ZhY3Rvcmllcy0+cGVuZGluZ19pbml0aWF0b3Jfc3BlY2lmaWNfZmFjdG9yaWVzKCkpKTsKKyAgICAgICZpc29sYXRlZF93b3JsZF9mYWN0b3JpZXNfLAorICAgICAgc3RkOjptb3ZlKHBlbmRpbmdfZmFjdG9yaWVzLT5wZW5kaW5nX2lzb2xhdGVkX3dvcmxkX2ZhY3RvcmllcygpKSk7CiAgIGJ5cGFzc19yZWRpcmVjdF9jaGVja3NfID0gcGVuZGluZ19mYWN0b3JpZXMtPmJ5cGFzc19yZWRpcmVjdF9jaGVja3MoKTsKIH0KIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvY29tbW9uL2xvYWRlci91cmxfbG9hZGVyX2ZhY3RvcnlfYnVuZGxlX21vam9tX3RyYWl0cy5jYyBiL3RoaXJkX3BhcnR5L2JsaW5rL2NvbW1vbi9sb2FkZXIvdXJsX2xvYWRlcl9mYWN0b3J5X2J1bmRsZV9tb2pvbV90cmFpdHMuY2MKaW5kZXggZjYzYjU3MS4uMmYwMzdkM2MgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL2NvbW1vbi9sb2FkZXIvdXJsX2xvYWRlcl9mYWN0b3J5X2J1bmRsZV9tb2pvbV90cmFpdHMuY2MKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvY29tbW9uL2xvYWRlci91cmxfbG9hZGVyX2ZhY3RvcnlfYnVuZGxlX21vam9tX3RyYWl0cy5jYwpAQCAtMzMsOSArMzMsOSBAQAogfQogCiAvLyBzdGF0aWMKLWJsaW5rOjpVUkxMb2FkZXJGYWN0b3J5QnVuZGxlSW5mbzo6T3JpZ2luTWFwCi1UcmFpdHM6OmluaXRpYXRvcl9zcGVjaWZpY19mYWN0b3JpZXMoQnVuZGxlSW5mb1R5cGUmIGJ1bmRsZSkgewotICByZXR1cm4gc3RkOjptb3ZlKGJ1bmRsZS0+cGVuZGluZ19pbml0aWF0b3Jfc3BlY2lmaWNfZmFjdG9yaWVzKCkpOworYmxpbms6OlVSTExvYWRlckZhY3RvcnlCdW5kbGVJbmZvOjpPcmlnaW5NYXAgVHJhaXRzOjppc29sYXRlZF93b3JsZF9mYWN0b3JpZXMoCisgICAgQnVuZGxlSW5mb1R5cGUmIGJ1bmRsZSkgeworICByZXR1cm4gc3RkOjptb3ZlKGJ1bmRsZS0+cGVuZGluZ19pc29sYXRlZF93b3JsZF9mYWN0b3JpZXMoKSk7CiB9CiAKIC8vIHN0YXRpYwpAQCAtNTYsOCArNTYsOCBAQAogICAgICAgICAgICYoKm91dF9idW5kbGUpLT5wZW5kaW5nX3NjaGVtZV9zcGVjaWZpY19mYWN0b3JpZXMoKSkpIHsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KLSAgaWYgKCFkYXRhLlJlYWRJbml0aWF0b3JTcGVjaWZpY0ZhY3RvcmllcygKLSAgICAgICAgICAmKCpvdXRfYnVuZGxlKS0+cGVuZGluZ19pbml0aWF0b3Jfc3BlY2lmaWNfZmFjdG9yaWVzKCkpKSB7CisgIGlmICghZGF0YS5SZWFkSXNvbGF0ZWRXb3JsZEZhY3RvcmllcygKKyAgICAgICAgICAmKCpvdXRfYnVuZGxlKS0+cGVuZGluZ19pc29sYXRlZF93b3JsZF9mYWN0b3JpZXMoKSkpIHsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvcHVibGljL2NvbW1vbi9mZWF0dXJlcy5oIGIvdGhpcmRfcGFydHkvYmxpbmsvcHVibGljL2NvbW1vbi9mZWF0dXJlcy5oCmluZGV4IGNmZDE3MmMuLmZiMWQyZDQ3IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvY29tbW9uL2ZlYXR1cmVzLmgKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvcHVibGljL2NvbW1vbi9mZWF0dXJlcy5oCkBAIC0yNiw2ICsyNiw3IEBACiBCTElOS19DT01NT05fRVhQT1JUIGV4dGVybiBjb25zdCBiYXNlOjpGZWF0dXJlIGtGcmVlemVQdXJnZU1lbW9yeUFsbFBhZ2VzRnJvemVuOwogQkxJTktfQ09NTU9OX0VYUE9SVCBleHRlcm4gY29uc3QgYmFzZTo6RmVhdHVyZSBrRnJlZXplVXNlckFnZW50OwogQkxJTktfQ09NTU9OX0VYUE9SVCBleHRlcm4gY29uc3QgYmFzZTo6RmVhdHVyZSBrSW1wbGljaXRSb290U2Nyb2xsZXI7CitCTElOS19DT01NT05fRVhQT1JUIGV4dGVybiBjb25zdCBiYXNlOjpGZWF0dXJlIGtDU1NPTVZpZXdTY3JvbGxDb29yZGluYXRlczsKIEJMSU5LX0NPTU1PTl9FWFBPUlQgZXh0ZXJuIGNvbnN0IGJhc2U6OkZlYXR1cmUga0NTU0JhY2tkcm9wRmlsdGVyOwogQkxJTktfQ09NTU9OX0VYUE9SVCBleHRlcm4gY29uc3QgYmFzZTo6RmVhdHVyZSBrRGlzcGxheUxvY2tpbmc7CiBCTElOS19DT01NT05fRVhQT1JUIGV4dGVybiBjb25zdCBiYXNlOjpGZWF0dXJlIGtGYXN0Qm9yZGVyUmFkaXVzOwpAQCAtODEsNyArODIsNiBAQAogICAgIGtXZWJGb250c0NhY2hlQXdhcmVUaW1lb3V0QWRhcHRpb247CiBCTElOS19DT01NT05fRVhQT1JUIGV4dGVybiBjb25zdCBiYXNlOjpGZWF0dXJlCiAgICAga0Jsb2NraW5nRm9jdXNXaXRob3V0VXNlckFjdGl2YXRpb247Ci1CTElOS19DT01NT05fRVhQT1JUIGV4dGVybiBjb25zdCBiYXNlOjpGZWF0dXJlIGtTY3JvbGxiYXJJbmplY3RTY3JvbGxHZXN0dXJlczsKIAogQkxJTktfQ09NTU9OX0VYUE9SVCBleHRlcm4gY29uc3QgYmFzZTo6RmVhdHVyZSBrQXVkaW9Xb3JrbGV0UmVhbHRpbWVUaHJlYWQ7CiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYy9jb21tb24vbG9hZGVyL3VybF9sb2FkZXJfZmFjdG9yeV9idW5kbGUuaCBiL3RoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYy9jb21tb24vbG9hZGVyL3VybF9sb2FkZXJfZmFjdG9yeV9idW5kbGUuaAppbmRleCBjMGYxYTQ1Li5mN2QzNjMzIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvY29tbW9uL2xvYWRlci91cmxfbG9hZGVyX2ZhY3RvcnlfYnVuZGxlLmgKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvcHVibGljL2NvbW1vbi9sb2FkZXIvdXJsX2xvYWRlcl9mYWN0b3J5X2J1bmRsZS5oCkBAIC0zNyw5ICszNyw5IEBACiAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywKICAgICAgICAgICAgICAgIG1vam86OlBlbmRpbmdSZW1vdGU8bmV0d29yazo6bW9qb206OlVSTExvYWRlckZhY3Rvcnk+PjsKIAotICAvLyBNYXAgZnJvbSBvcmlnaW4gb2YgcmVxdWVzdCBpbml0aWF0b3IgdG8gUGVuZGluZ1JlbW90ZTxVUkxMb2FkZXJGYWN0b3J5PiBmb3IKLSAgLy8gaGFuZGxpbmcgdGhpcyBpbml0aWF0b3IncyByZXF1ZXN0cyAoZS5nLiwgZm9yIHJlbGF4aW5nIENPUkIgZm9yIHJlcXVlc3RzCi0gIC8vIGluaXRpYXRlZCBmcm9tIGNvbnRlbnQgc2NyaXB0cykuCisgIC8vIE1hcCBmcm9tIG9yaWdpbiBvZiBpc29sYXRlZCB3b3JsZCB0byBQZW5kaW5nUmVtb3RlPFVSTExvYWRlckZhY3Rvcnk+IGZvcgorICAvLyBoYW5kbGluZyB0aGlzIGlzb2xhdGVkIHdvcmxkJ3MgcmVxdWVzdHMgKGUuZy4sIGZvciByZWxheGluZyBDT1JCIGZvcgorICAvLyByZXF1ZXN0cyBpbml0aWF0ZWQgZnJvbSBjb250ZW50IHNjcmlwdHMpLgogICB1c2luZyBPcmlnaW5NYXAgPQogICAgICAgc3RkOjptYXA8dXJsOjpPcmlnaW4sCiAgICAgICAgICAgICAgICBtb2pvOjpQZW5kaW5nUmVtb3RlPG5ldHdvcms6Om1vam9tOjpVUkxMb2FkZXJGYWN0b3J5Pj47CkBAIC00OSw3ICs0OSw3IEBACiAgICAgICBtb2pvOjpQZW5kaW5nUmVtb3RlPG5ldHdvcms6Om1vam9tOjpVUkxMb2FkZXJGYWN0b3J5PgogICAgICAgICAgIHBlbmRpbmdfZGVmYXVsdF9mYWN0b3J5LAogICAgICAgU2NoZW1lTWFwIHNjaGVtZV9zcGVjaWZpY19mYWN0b3J5X2luZm9zLAotICAgICAgT3JpZ2luTWFwIGluaXRpYXRvcl9zcGVjaWZpY19mYWN0b3J5X2luZm9zLAorICAgICAgT3JpZ2luTWFwIGlzb2xhdGVkX3dvcmxkX2ZhY3RvcnlfaW5mb3MsCiAgICAgICBib29sIGJ5cGFzc19yZWRpcmVjdF9jaGVja3MpOwogICB+VVJMTG9hZGVyRmFjdG9yeUJ1bmRsZUluZm8oKSBvdmVycmlkZTsKIApAQCAtNjYsOCArNjYsOCBAQAogICBTY2hlbWVNYXAmIHBlbmRpbmdfc2NoZW1lX3NwZWNpZmljX2ZhY3RvcmllcygpIHsKICAgICByZXR1cm4gcGVuZGluZ19zY2hlbWVfc3BlY2lmaWNfZmFjdG9yaWVzXzsKICAgfQotICBPcmlnaW5NYXAmIHBlbmRpbmdfaW5pdGlhdG9yX3NwZWNpZmljX2ZhY3RvcmllcygpIHsKLSAgICByZXR1cm4gcGVuZGluZ19pbml0aWF0b3Jfc3BlY2lmaWNfZmFjdG9yaWVzXzsKKyAgT3JpZ2luTWFwJiBwZW5kaW5nX2lzb2xhdGVkX3dvcmxkX2ZhY3RvcmllcygpIHsKKyAgICByZXR1cm4gcGVuZGluZ19pc29sYXRlZF93b3JsZF9mYWN0b3JpZXNfOwogICB9CiAKICAgYm9vbCBieXBhc3NfcmVkaXJlY3RfY2hlY2tzKCkgY29uc3QgeyByZXR1cm4gYnlwYXNzX3JlZGlyZWN0X2NoZWNrc187IH0KQEAgLTg0LDcgKzg0LDcgQEAKICAgbW9qbzo6UGVuZGluZ1JlbW90ZTxuZXR3b3JrOjptb2pvbTo6VVJMTG9hZGVyRmFjdG9yeT4KICAgICAgIHBlbmRpbmdfYXBwY2FjaGVfZmFjdG9yeV87CiAgIFNjaGVtZU1hcCBwZW5kaW5nX3NjaGVtZV9zcGVjaWZpY19mYWN0b3JpZXNfOwotICBPcmlnaW5NYXAgcGVuZGluZ19pbml0aWF0b3Jfc3BlY2lmaWNfZmFjdG9yaWVzXzsKKyAgT3JpZ2luTWFwIHBlbmRpbmdfaXNvbGF0ZWRfd29ybGRfZmFjdG9yaWVzXzsKICAgYm9vbCBieXBhc3NfcmVkaXJlY3RfY2hlY2tzXyA9IGZhbHNlOwogCiAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihVUkxMb2FkZXJGYWN0b3J5QnVuZGxlSW5mbyk7CkBAIC0xNjAsMTIgKzE2MCwxMiBAQAogICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIG1vam86OlJlbW90ZTxuZXR3b3JrOjptb2pvbTo6VVJMTG9hZGVyRmFjdG9yeT4+OwogICBTY2hlbWVNYXAgc2NoZW1lX3NwZWNpZmljX2ZhY3Rvcmllc187CiAKLSAgLy8gTWFwIGZyb20gb3JpZ2luIG9mIHJlcXVlc3QgaW5pdGlhdG9yIHRvIFJlbW90ZTxVUkxMb2FkZXJGYWN0b3J5PiBmb3IKLSAgLy8gaGFuZGxpbmcgdGhpcyBpbml0aWF0b3IncyByZXF1ZXN0cy4gU2VlIGFsc28KKyAgLy8gTWFwIGZyb20gb3JpZ2luIG9mIGlzb2xhdGVkIHdvcmxkIHRvIFJlbW90ZTxVUkxMb2FkZXJGYWN0b3J5PiBmb3IgaGFuZGxpbmcKKyAgLy8gdGhpcyBpc29sYXRlZCB3b3JsZCdzIHJlcXVlc3RzLiBTZWUgYWxzbwogICAvLyBVUkxMb2FkZXJGYWN0b3J5QnVuZGxlSW5mbzo6T3JpZ2luTWFwLgogICB1c2luZyBPcmlnaW5NYXAgPQogICAgICAgc3RkOjptYXA8dXJsOjpPcmlnaW4sIG1vam86OlJlbW90ZTxuZXR3b3JrOjptb2pvbTo6VVJMTG9hZGVyRmFjdG9yeT4+OwotICBPcmlnaW5NYXAgaW5pdGlhdG9yX3NwZWNpZmljX2ZhY3Rvcmllc187CisgIE9yaWdpbk1hcCBpc29sYXRlZF93b3JsZF9mYWN0b3JpZXNfOwogCiAgIGJvb2wgYnlwYXNzX3JlZGlyZWN0X2NoZWNrc18gPSBmYWxzZTsKIH07CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvY29tbW9uL2xvYWRlci91cmxfbG9hZGVyX2ZhY3RvcnlfYnVuZGxlX21vam9tX3RyYWl0cy5oIGIvdGhpcmRfcGFydHkvYmxpbmsvcHVibGljL2NvbW1vbi9sb2FkZXIvdXJsX2xvYWRlcl9mYWN0b3J5X2J1bmRsZV9tb2pvbV90cmFpdHMuaAppbmRleCA0NzI3NjQzZi4uY2Q5YzlkZSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvcHVibGljL2NvbW1vbi9sb2FkZXIvdXJsX2xvYWRlcl9mYWN0b3J5X2J1bmRsZV9tb2pvbV90cmFpdHMuaAorKysgYi90aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvY29tbW9uL2xvYWRlci91cmxfbG9hZGVyX2ZhY3RvcnlfYnVuZGxlX21vam9tX3RyYWl0cy5oCkBAIC0zMyw4ICszMyw4IEBACiAgIHN0YXRpYyBibGluazo6VVJMTG9hZGVyRmFjdG9yeUJ1bmRsZUluZm86OlNjaGVtZU1hcCBzY2hlbWVfc3BlY2lmaWNfZmFjdG9yaWVzKAogICAgICAgQnVuZGxlSW5mb1R5cGUmIGJ1bmRsZSk7CiAKLSAgc3RhdGljIGJsaW5rOjpVUkxMb2FkZXJGYWN0b3J5QnVuZGxlSW5mbzo6T3JpZ2luTWFwCi0gIGluaXRpYXRvcl9zcGVjaWZpY19mYWN0b3JpZXMoQnVuZGxlSW5mb1R5cGUmIGJ1bmRsZSk7CisgIHN0YXRpYyBibGluazo6VVJMTG9hZGVyRmFjdG9yeUJ1bmRsZUluZm86Ok9yaWdpbk1hcCBpc29sYXRlZF93b3JsZF9mYWN0b3JpZXMoCisgICAgICBCdW5kbGVJbmZvVHlwZSYgYnVuZGxlKTsKIAogICBzdGF0aWMgYm9vbCBieXBhc3NfcmVkaXJlY3RfY2hlY2tzKEJ1bmRsZUluZm9UeXBlJiBidW5kbGUpOwogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvbW9qb20vbG9hZGVyL3VybF9sb2FkZXJfZmFjdG9yeV9idW5kbGUubW9qb20gYi90aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvbW9qb20vbG9hZGVyL3VybF9sb2FkZXJfZmFjdG9yeV9idW5kbGUubW9qb20KaW5kZXggYjQ0N2ZlOTAuLjAyNGE1NTYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYy9tb2pvbS9sb2FkZXIvdXJsX2xvYWRlcl9mYWN0b3J5X2J1bmRsZS5tb2pvbQorKysgYi90aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvbW9qb20vbG9hZGVyL3VybF9sb2FkZXJfZmFjdG9yeV9idW5kbGUubW9qb20KQEAgLTI2LDEyICsyNiw4IEBACiAgIG1hcDxzdHJpbmcsIG5ldHdvcmsubW9qb20uVVJMTG9hZGVyRmFjdG9yeT4gc2NoZW1lX3NwZWNpZmljX2ZhY3RvcmllczsKIAogICAvLyBBIG1hcHBpbmcgZnJvbSBpc29sYXRlZCB3b3JsZCdzIG9yaWdpbiB0byBmYWN0b3J5IGludGVyZmFjZS4KLSAgLy8KLSAgLy8gVE9ETyhsdWthc3phKTogaHR0cHM6Ly9jcmJ1Zy5jb20vOTQwMDY4OiBSZW5hbWUgdG8KLSAgLy8gfGlzb2xhdGVkX3dvcmxkX2ZhY3Rvcmllc3wgKGhlcmUgYW5kIGluIG90aGVyIHBsYWNlcyByZWZlcnJpbmcgdG8KLSAgLy8gImluaXRpYXRvci1zcGVjaWZpYyBmYWN0b3JpZXMpLgogICBtYXA8dXJsLm1vam9tLk9yaWdpbiwgbmV0d29yay5tb2pvbS5VUkxMb2FkZXJGYWN0b3J5PgotICAgICAgaW5pdGlhdG9yX3NwZWNpZmljX2ZhY3RvcmllczsKKyAgICAgIGlzb2xhdGVkX3dvcmxkX2ZhY3RvcmllczsKIAogICAvLyBBIHNwZWNpYWwgZmFjdG9yeSB0aGF0IGlzIHVzZWQgZm9yIEFwcENhY2hlLgogICAvLyBUT0RPKGh0dHBzOi8vY3JidWcuY29tLzU4Mjc1MCk6IERyb3AgdGhpcyB3aGVuIEFwcENhY2hlIGlzIGRlcHJlY2F0ZWQuCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvbW9qb20vc2VydmljZV93b3JrZXIvZW1iZWRkZWRfd29ya2VyLm1vam9tIGIvdGhpcmRfcGFydHkvYmxpbmsvcHVibGljL21vam9tL3NlcnZpY2Vfd29ya2VyL2VtYmVkZGVkX3dvcmtlci5tb2pvbQppbmRleCA2OWM3MWY0Li5hZDgyY2U5ZCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvcHVibGljL21vam9tL3NlcnZpY2Vfd29ya2VyL2VtYmVkZGVkX3dvcmtlci5tb2pvbQorKysgYi90aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvbW9qb20vc2VydmljZV93b3JrZXIvZW1iZWRkZWRfd29ya2VyLm1vam9tCkBAIC0xMSw2ICsxMSw3IEBACiBpbXBvcnQgInRoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYy9tb2pvbS9kZXZ0b29scy9jb25zb2xlX21lc3NhZ2UubW9qb20iOwogaW1wb3J0ICJ0aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvbW9qb20vZGV2dG9vbHMvZGV2dG9vbHNfYWdlbnQubW9qb20iOwogaW1wb3J0ICJ0aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvbW9qb20vd29ya2VyL3N1YnJlc291cmNlX2xvYWRlcl91cGRhdGVyLm1vam9tIjsKK2ltcG9ydCAidGhpcmRfcGFydHkvYmxpbmsvcHVibGljL21vam9tL2xvYWRlci9mZXRjaF9jbGllbnRfc2V0dGluZ3Nfb2JqZWN0Lm1vam9tIjsKIGltcG9ydCAidGhpcmRfcGFydHkvYmxpbmsvcHVibGljL21vam9tL2xvYWRlci91cmxfbG9hZGVyX2ZhY3RvcnlfYnVuZGxlLm1vam9tIjsKIGltcG9ydCAidGhpcmRfcGFydHkvYmxpbmsvcHVibGljL21vam9tL3JlbmRlcmVyX3ByZWZlcmVuY2Vfd2F0Y2hlci5tb2pvbSI7CiBpbXBvcnQgInRoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYy9tb2pvbS9yZW5kZXJlcl9wcmVmZXJlbmNlcy5tb2pvbSI7CkBAIC00NCw2ICs0NSwxMCBAQAogICAvLyBodHRwczovL3czYy5naXRodWIuaW8vU2VydmljZVdvcmtlci8jZGZuLXR5cGUKICAgU2NyaXB0VHlwZSBzY3JpcHRfdHlwZTsKIAorICAvLyBUaGUgb3V0c2lkZSBmZXRjaCBjbGllbnQgc2V0dGluZ3Mgb2JqZWN0LiBUaGlzIGlzIHVzZWQgZm9yIHRvcC1sZXZlbCBzY3JpcHQKKyAgLy8gZmV0Y2guCisgIEZldGNoQ2xpZW50U2V0dGluZ3NPYmplY3Qgb3V0c2lkZV9mZXRjaF9jbGllbnRfc2V0dGluZ3Nfb2JqZWN0OworCiAgIC8vIFRoZSBzdHJpbmcgdXNlZCBmb3IgInVzZXItYWdlbnQiIEhUVFAgaGVhZGVyLgogICBzdHJpbmcgdXNlcl9hZ2VudDsKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvcHVibGljL21vam9tL3dlYl9mZWF0dXJlL3dlYl9mZWF0dXJlLm1vam9tIGIvdGhpcmRfcGFydHkvYmxpbmsvcHVibGljL21vam9tL3dlYl9mZWF0dXJlL3dlYl9mZWF0dXJlLm1vam9tCmluZGV4IDgyN2EyMTcuLjk4YzlkY2QgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYy9tb2pvbS93ZWJfZmVhdHVyZS93ZWJfZmVhdHVyZS5tb2pvbQorKysgYi90aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvbW9qb20vd2ViX2ZlYXR1cmUvd2ViX2ZlYXR1cmUubW9qb20KQEAgLTI0MzQsNiArMjQzNCw5IEBACiAgIGtBUklBQW5ub3RhdGlvblJvbGVzID0gMzA1MCwKICAga0ludGVyc2VjdGlvbk9ic2VydmVyVjIgPSAzMDUxLAogICBrSGVhdnlBZEludGVydmVudGlvbiA9IDMwNTIsCisgIGtVc2VyVGltaW5nTDMgPSAzMDUzLAorICBrR2V0R2FtZXBhZHNGcm9tQ3Jvc3NPcmlnaW5TdWJmcmFtZSA9IDMwNTQsCisgIGtHZXRHYW1lcGFkc0Zyb21JbnNlY3VyZUNvbnRleHQgPSAzMDU1LAogCiAgIC8vIEFkZCBuZXcgZmVhdHVyZXMgaW1tZWRpYXRlbHkgYWJvdmUgdGhpcyBsaW5lLiBEb24ndCBjaGFuZ2UgYXNzaWduZWQKICAgLy8gbnVtYmVycyBvZiBhbnkgaXRlbSwgYW5kIGRvbid0IHJldXNlIHJlbW92ZWQgc2xvdHMuCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvcGxhdGZvcm0vd2ViX2ZldGNoX2NsaWVudF9zZXR0aW5nc19vYmplY3QuaCBiL3RoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYy9wbGF0Zm9ybS93ZWJfZmV0Y2hfY2xpZW50X3NldHRpbmdzX29iamVjdC5oCmluZGV4IGQyY2Q0ZDdmLi5mYmVlNzZhMSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvcHVibGljL3BsYXRmb3JtL3dlYl9mZXRjaF9jbGllbnRfc2V0dGluZ3Nfb2JqZWN0LmgKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvcHVibGljL3BsYXRmb3JtL3dlYl9mZXRjaF9jbGllbnRfc2V0dGluZ3Nfb2JqZWN0LmgKQEAgLTI1LDYgKzI1LDggQEAKICAgV2ViVVJMIG91dGdvaW5nX3JlZmVycmVyOwogICBtb2pvbTo6SW5zZWN1cmVSZXF1ZXN0c1BvbGljeSBpbnNlY3VyZV9yZXF1ZXN0c19wb2xpY3k7CiAKKyAgV2ViRmV0Y2hDbGllbnRTZXR0aW5nc09iamVjdCgpIHt9CisKICNpZiBJTlNJREVfQkxJTksKICAgZXhwbGljaXQgV2ViRmV0Y2hDbGllbnRTZXR0aW5nc09iamVjdCgKICAgICAgIGNvbnN0IEZldGNoQ2xpZW50U2V0dGluZ3NPYmplY3RTbmFwc2hvdCYgc25hcHNob3QpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvcGxhdGZvcm0vd2ViX3J1bnRpbWVfZmVhdHVyZXMuaCBiL3RoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYy9wbGF0Zm9ybS93ZWJfcnVudGltZV9mZWF0dXJlcy5oCmluZGV4IDFkMzMwZDEuLjY2ZThhNmQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYy9wbGF0Zm9ybS93ZWJfcnVudGltZV9mZWF0dXJlcy5oCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYy9wbGF0Zm9ybS93ZWJfcnVudGltZV9mZWF0dXJlcy5oCkBAIC0xMTEsNiArMTExLDcgQEAKICAgQkxJTktfUExBVEZPUk1fRVhQT1JUIHN0YXRpYyB2b2lkIEVuYWJsZUZvcm1Db250cm9sc1JlZnJlc2goYm9vbCk7CiAgIEJMSU5LX1BMQVRGT1JNX0VYUE9SVCBzdGF0aWMgdm9pZCBFbmFibGVHZW5lcmljU2Vuc29yRXh0cmFDbGFzc2VzKGJvb2wpOwogICBCTElOS19QTEFURk9STV9FWFBPUlQgc3RhdGljIHZvaWQgRW5hYmxlSW1wbGljaXRSb290U2Nyb2xsZXIoYm9vbCk7CisgIEJMSU5LX1BMQVRGT1JNX0VYUE9SVCBzdGF0aWMgdm9pZCBFbmFibGVDU1NPTVZpZXdTY3JvbGxDb29yZGluYXRlcyhib29sKTsKICAgQkxJTktfUExBVEZPUk1fRVhQT1JUIHN0YXRpYyB2b2lkIEVuYWJsZUlucHV0TXVsdGlwbGVGaWVsZHNVSShib29sKTsKICAgQkxJTktfUExBVEZPUk1fRVhQT1JUIHN0YXRpYyB2b2lkIEVuYWJsZUJ1aWx0SW5Nb2R1bGVBbGwoYm9vbCk7CiAgIEJMSU5LX1BMQVRGT1JNX0VYUE9SVCBzdGF0aWMgdm9pZCBFbmFibGVCdWlsdEluTW9kdWxlSW5mcmEoYm9vbCk7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvd2ViL3dlYl9lbWJlZGRlZF93b3JrZXJfc3RhcnRfZGF0YS5oIGIvdGhpcmRfcGFydHkvYmxpbmsvcHVibGljL3dlYi93ZWJfZW1iZWRkZWRfd29ya2VyX3N0YXJ0X2RhdGEuaAppbmRleCA2ZDY5NTJhLi5hYmViYzFmIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvd2ViL3dlYl9lbWJlZGRlZF93b3JrZXJfc3RhcnRfZGF0YS5oCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYy93ZWIvd2ViX2VtYmVkZGVkX3dvcmtlcl9zdGFydF9kYXRhLmgKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlICJzZXJ2aWNlcy9uZXR3b3JrL3B1YmxpYy9tb2pvbS9pcF9hZGRyZXNzX3NwYWNlLm1vam9tLXNoYXJlZC5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYy9tb2pvbS9zZXJ2aWNlX3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9yZWdpc3RyYXRpb24ubW9qb20tc2hhcmVkLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcHVibGljL3BsYXRmb3JtL3dlYl9jb250ZW50X3NlY3VyaXR5X3BvbGljeS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYy9wbGF0Zm9ybS93ZWJfZmV0Y2hfY2xpZW50X3NldHRpbmdzX29iamVjdC5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYy9wbGF0Zm9ybS93ZWJfc3RyaW5nLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcHVibGljL3BsYXRmb3JtL3dlYl91cmwuaCIKIApAQCAtNTUsNiArNTYsOCBAQAogCiAgIG5ldHdvcms6Om1vam9tOjpJUEFkZHJlc3NTcGFjZSBhZGRyZXNzX3NwYWNlOwogCisgIFdlYkZldGNoQ2xpZW50U2V0dGluZ3NPYmplY3Qgb3V0c2lkZV9mZXRjaF9jbGllbnRfc2V0dGluZ3Nfb2JqZWN0OworCiAgIFdlYkVtYmVkZGVkV29ya2VyU3RhcnREYXRhKCkgOiB3YWl0X2Zvcl9kZWJ1Z2dlcl9tb2RlKGtEb250V2FpdEZvckRlYnVnZ2VyKSB7fQogfTsKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvcHVibGljL3dlYi93ZWJfdmlldy5oIGIvdGhpcmRfcGFydHkvYmxpbmsvcHVibGljL3dlYi93ZWJfdmlldy5oCmluZGV4IDA5OTkxNjcuLmJkMjc5ZTMxIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvd2ViL3dlYl92aWV3LmgKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvcHVibGljL3dlYi93ZWJfdmlldy5oCkBAIC0yNjksNiArMjY5LDkgQEAKICAgLy8gbW9kZSAoZG9lcyBub3QgaGF2ZSA8IWRvY3R5cGUgaHRtbD4pLCB0aGUgaGVpZ2h0IHdpbGwgc3RyZXRjaCB0byBmaWxsIHRoZQogICAvLyB2aWV3cG9ydC4gVGhlIHJldHVybmVkIHNpemUgaGFzIHRoZSBwYWdlIHpvb20gZmFjdG9yIGFwcGxpZWQuIFRoZSBsaWZlY3ljbGUKICAgLy8gbXVzdCBiZSB1cGRhdGVkIHRvIGF0IGxlYXN0IGxheW91dCBiZWZvcmUgY2FsbGluZyAoc2VlOiB8VXBkYXRlTGlmZWN5Y2xlfCkuCisgIC8vCisgIC8vIFRoaXMgbWF5IG9ubHkgYmUgY2FsbGVkIHdoZW4gdGhlcmUgaXMgYSBsb2NhbCBtYWluIGZyYW1lIGF0dGFjaGVkIHRvIHRoaXMKKyAgLy8gV2ViVmlldy4KICAgdmlydHVhbCBXZWJTaXplIENvbnRlbnRzUHJlZmVycmVkTWluaW11bVNpemUoKSA9IDA7CiAKICAgLy8gUmVxdWVzdHMgYSBwYWdlLXNjYWxlIGFuaW1hdGlvbiBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHBvaW50L3JlY3QuCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL0RFUFMgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL0RFUFMKaW5kZXggYjcyZmI5Yi4uMTYyOTc4NSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvY29yZS9ERVBTCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvREVQUwpAQCAtNTAsNiArNTAsNyBAQAogICAgICIrY2MvcGFpbnQvcGFpbnRfZmxhZ3MuaCIsCiAgICAgIitjYy9wYWludC9wYWludF93b3JrbGV0X2lucHV0LmgiLAogICAgICIrY2MvdHJlZXMvcGFpbnRfaG9sZGluZ19jb21taXRfdHJpZ2dlci5oIiwKKyAgICAiK2NvbXBvbmVudHMvcGVyZm9ybWFuY2VfbWFuYWdlci9wdWJsaWMvbW9qb20vY29vcmRpbmF0aW9uX3VuaXQubW9qb20tYmxpbmsuaCIsCiAgICAgIitncHUvY29uZmlnL2dwdV9mZWF0dXJlX2luZm8uaCIsCiAgICAgIi1pbnNwZWN0b3IvdjgiLAogICAgICIraW5zcGVjdG9yL3Y4L3B1YmxpYyIsCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL2RvbS9kb2N1bWVudC5jYyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvZG9tL2RvY3VtZW50LmNjCmluZGV4IDU0NDI3ZjcuLjk1ODdjZTggMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvZG9tL2RvY3VtZW50LmNjCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvZG9tL2RvY3VtZW50LmNjCkBAIC0zOCw2ICszOCw3IEBACiAjaW5jbHVkZSAiYmFzZS90aW1lL3RpbWUuaCIKICNpbmNsdWRlICJjYy9pbnB1dC9vdmVyc2Nyb2xsX2JlaGF2aW9yLmgiCiAjaW5jbHVkZSAiY2MvaW5wdXQvc2Nyb2xsX3NuYXBfZGF0YS5oIgorI2luY2x1ZGUgImNvbXBvbmVudHMvcGVyZm9ybWFuY2VfbWFuYWdlci9wdWJsaWMvbW9qb20vY29vcmRpbmF0aW9uX3VuaXQubW9qb20tYmxpbmsuaCIKICNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvYmluZGluZ3MvcGVuZGluZ19yZW1vdGUuaCIKICNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvYmluZGluZ3MvcmVtb3RlLmgiCiAjaW5jbHVkZSAic2VydmljZXMvbWV0cmljcy9wdWJsaWMvY3BwL21vam9fdWttX3JlY29yZGVyLmgiCkBAIC00NSw3ICs0Niw2IEBACiAjaW5jbHVkZSAic2VydmljZXMvbWV0cmljcy9wdWJsaWMvY3BwL3VrbV9zb3VyY2VfaWQuaCIKICNpbmNsdWRlICJzZXJ2aWNlcy9tZXRyaWNzL3B1YmxpYy9tb2pvbS91a21faW50ZXJmYWNlLm1vam9tLWJsaW5rLmgiCiAjaW5jbHVkZSAic2VydmljZXMvbmV0d29yay9wdWJsaWMvbW9qb20vaXBfYWRkcmVzc19zcGFjZS5tb2pvbS1ibGluay5oIgotI2luY2x1ZGUgInNlcnZpY2VzL3Jlc291cmNlX2Nvb3JkaW5hdG9yL3B1YmxpYy9tb2pvbS9jb29yZGluYXRpb25fdW5pdC5tb2pvbS1ibGluay5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYy9jb21tb24vYXNzb2NpYXRlZF9pbnRlcmZhY2VzL2Fzc29jaWF0ZWRfaW50ZXJmYWNlX3Byb3ZpZGVyLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcHVibGljL2NvbW1vbi9icm93c2VyX2ludGVyZmFjZV9icm9rZXJfcHJveHkuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvY29tbW9uL2ZlYXR1cmVzLmgiCkBAIC02NTY1LDcgKzY1NjUsNyBAQAogCiBuYW1lc3BhY2UgewogCi11c2luZyByZXNvdXJjZV9jb29yZGluYXRvcjo6bW9qb206OkludGVydmVudGlvblBvbGljeTsKK3VzaW5nIHBlcmZvcm1hbmNlX21hbmFnZXI6Om1vam9tOjpJbnRlcnZlbnRpb25Qb2xpY3k7CiAKIC8vIEEgaGVscGVyIGZ1bmN0aW9uIHRvIHNldCB0aGUgb3JpZ2luIHRyaWFsIGZyZWV6ZSBwb2xpY3kgb2YgYSBkb2N1bWVudC4KIHZvaWQgU2V0T3JpZ2luVHJpYWxGcmVlemVQb2xpY3koCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL2RvbS9lbGVtZW50LmNjIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvY29yZS9kb20vZWxlbWVudC5jYwppbmRleCA4Y2I4MDcyLi5jMmIzYWEwNiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvY29yZS9kb20vZWxlbWVudC5jYworKysgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL2RvbS9lbGVtZW50LmNjCkBAIC0xMjc4LDggKzEyNzgsMTYgQEAKICAgICAgICAgICAgICAga0VsZW1lbnRXaXRoTGVmdHdhcmRPclVwd2FyZE92ZXJmbG93RGlyZWN0aW9uX1Njcm9sbExlZnRPclRvcCk7CiAgICAgfQogCi0gICAgcmV0dXJuIEFkanVzdEZvckFic29sdXRlWm9vbTo6QWRqdXN0U2Nyb2xsKAotICAgICAgICBzY3JvbGxhYmxlX2FyZWEtPlNjcm9sbFBvc2l0aW9uKCkuWCgpLCAqR2V0TGF5b3V0Qm94KCkpOworICAgIC8vIEluIG9yZGVyIHRvIGtlZXAgdGhlIGJlaGF2aW9yIG9mIGVsZW1lbnQgc2Nyb2xsIGNvbnNpc3RlbnQgd2l0aCBkb2N1bWVudAorICAgIC8vIHNjcm9sbCwgYW5kIGNvbnNpc3RlbnQgd2l0aCB0aGUgYmVoYXZpb3Igb2Ygb3RoZXIgdmVuZG9ycywgdGhlIHNjcm9sbExlZnQKKyAgICAvLyBvZiBhIGJveCBpcyBjaGFuZ2VkIHRvIHRoZSBvZmZzZXQgZnJvbSB8U2Nyb2xsT3JpZ2luKCl8LgorICAgIGlmIChSdW50aW1lRW5hYmxlZEZlYXR1cmVzOjpDU1NPTVZpZXdTY3JvbGxDb29yZGluYXRlc0VuYWJsZWQoKSkgeworICAgICAgcmV0dXJuIEFkanVzdEZvckFic29sdXRlWm9vbTo6QWRqdXN0U2Nyb2xsKAorICAgICAgICAgIHNjcm9sbGFibGVfYXJlYS0+R2V0U2Nyb2xsT2Zmc2V0KCkuV2lkdGgoKSwgKkdldExheW91dEJveCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIEFkanVzdEZvckFic29sdXRlWm9vbTo6QWRqdXN0U2Nyb2xsKAorICAgICAgICAgIHNjcm9sbGFibGVfYXJlYS0+U2Nyb2xsUG9zaXRpb24oKS5YKCksICpHZXRMYXlvdXRCb3goKSk7CisgICAgfQogICB9CiAKICAgcmV0dXJuIDA7CkBAIC0xMzA3LDggKzEzMTUsMTYgQEAKICAgICAgICAgICAgICAga0VsZW1lbnRXaXRoTGVmdHdhcmRPclVwd2FyZE92ZXJmbG93RGlyZWN0aW9uX1Njcm9sbExlZnRPclRvcCk7CiAgICAgfQogCi0gICAgcmV0dXJuIEFkanVzdEZvckFic29sdXRlWm9vbTo6QWRqdXN0U2Nyb2xsKAotICAgICAgICBzY3JvbGxhYmxlX2FyZWEtPlNjcm9sbFBvc2l0aW9uKCkuWSgpLCAqR2V0TGF5b3V0Qm94KCkpOworICAgIC8vIEluIG9yZGVyIHRvIGtlZXAgdGhlIGJlaGF2aW9yIG9mIGVsZW1lbnQgc2Nyb2xsIGNvbnNpc3RlbnQgd2l0aCBkb2N1bWVudAorICAgIC8vIHNjcm9sbCwgYW5kIGNvbnNpc3RlbnQgd2l0aCB0aGUgYmVoYXZpb3Igb2Ygb3RoZXIgdmVuZG9ycywgdGhlIHNjcm9sbFRvcAorICAgIC8vIG9mIGEgYm94IGlzIGNoYW5nZWQgdG8gdGhlIG9mZnNldCBmcm9tIHxTY3JvbGxPcmlnaW4oKXwuCisgICAgaWYgKFJ1bnRpbWVFbmFibGVkRmVhdHVyZXM6OkNTU09NVmlld1Njcm9sbENvb3JkaW5hdGVzRW5hYmxlZCgpKSB7CisgICAgICByZXR1cm4gQWRqdXN0Rm9yQWJzb2x1dGVab29tOjpBZGp1c3RTY3JvbGwoCisgICAgICAgICAgc2Nyb2xsYWJsZV9hcmVhLT5HZXRTY3JvbGxPZmZzZXQoKS5IZWlnaHQoKSwgKkdldExheW91dEJveCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIEFkanVzdEZvckFic29sdXRlWm9vbTo6QWRqdXN0U2Nyb2xsKAorICAgICAgICAgIHNjcm9sbGFibGVfYXJlYS0+U2Nyb2xsUG9zaXRpb24oKS5ZKCksICpHZXRMYXlvdXRCb3goKSk7CisgICAgfQogICB9CiAKICAgcmV0dXJuIDA7CkBAIC0xMzQ1LDIwICsxMzYxLDM4IEBACiAgICAgICB9CiAgICAgfQogCi0gICAgRmxvYXRQb2ludCBlbmRfcG9pbnQobmV3X2xlZnQgKiBib3gtPlN0eWxlKCktPkVmZmVjdGl2ZVpvb20oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxhYmxlX2FyZWEtPlNjcm9sbFBvc2l0aW9uKCkuWSgpKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Y2M6OlNuYXBTZWxlY3Rpb25TdHJhdGVneT4gc3RyYXRlZ3kgPQotICAgICAgICBjYzo6U25hcFNlbGVjdGlvblN0cmF0ZWd5OjpDcmVhdGVGb3JFbmRQb3NpdGlvbigKLSAgICAgICAgICAgIGdmeDo6U2Nyb2xsT2Zmc2V0KGVuZF9wb2ludCksIHRydWUsIGZhbHNlKTsKLSAgICBlbmRfcG9pbnQgPSBHZXREb2N1bWVudCgpCi0gICAgICAgICAgICAgICAgICAgIC5HZXRTbmFwQ29vcmRpbmF0b3IoKQotICAgICAgICAgICAgICAgICAgICAuR2V0U25hcFBvc2l0aW9uKCpib3gsICpzdHJhdGVneSkKLSAgICAgICAgICAgICAgICAgICAgLnZhbHVlX29yKGVuZF9wb2ludCk7CisgICAgaWYgKFJ1bnRpbWVFbmFibGVkRmVhdHVyZXM6OkNTU09NVmlld1Njcm9sbENvb3JkaW5hdGVzRW5hYmxlZCgpKSB7CisgICAgICBTY3JvbGxPZmZzZXQgZW5kX29mZnNldChuZXdfbGVmdCAqIGJveC0+U3R5bGUoKS0+RWZmZWN0aXZlWm9vbSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsYWJsZV9hcmVhLT5HZXRTY3JvbGxPZmZzZXQoKS5IZWlnaHQoKSk7CisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Y2M6OlNuYXBTZWxlY3Rpb25TdHJhdGVneT4gc3RyYXRlZ3kgPQorICAgICAgICAgIGNjOjpTbmFwU2VsZWN0aW9uU3RyYXRlZ3k6OkNyZWF0ZUZvckVuZFBvc2l0aW9uKAorICAgICAgICAgICAgICBnZng6OlNjcm9sbE9mZnNldCgKKyAgICAgICAgICAgICAgICAgIHNjcm9sbGFibGVfYXJlYS0+U2Nyb2xsT2Zmc2V0VG9Qb3NpdGlvbihlbmRfb2Zmc2V0KSksCisgICAgICAgICAgICAgIHRydWUsIGZhbHNlKTsKKyAgICAgIGJhc2U6Ok9wdGlvbmFsPEZsb2F0UG9pbnQ+IHNuYXBfcG9pbnQgPQorICAgICAgICAgIEdldERvY3VtZW50KCkuR2V0U25hcENvb3JkaW5hdG9yKCkuR2V0U25hcFBvc2l0aW9uKCpib3gsICpzdHJhdGVneSk7CisgICAgICBpZiAoc25hcF9wb2ludC5oYXNfdmFsdWUoKSkgeworICAgICAgICBlbmRfb2Zmc2V0ID0KKyAgICAgICAgICAgIHNjcm9sbGFibGVfYXJlYS0+U2Nyb2xsUG9zaXRpb25Ub09mZnNldChzbmFwX3BvaW50LnZhbHVlKCkpOworICAgICAgfQorICAgICAgc2Nyb2xsYWJsZV9hcmVhLT5TZXRTY3JvbGxPZmZzZXQoZW5kX29mZnNldCwga1Byb2dyYW1tYXRpY1Njcm9sbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTY3JvbGxCZWhhdmlvckF1dG8pOworICAgIH0gZWxzZSB7CisgICAgICBGbG9hdFBvaW50IGVuZF9wb2ludChuZXdfbGVmdCAqIGJveC0+U3R5bGUoKS0+RWZmZWN0aXZlWm9vbSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsYWJsZV9hcmVhLT5TY3JvbGxQb3NpdGlvbigpLlkoKSk7CisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Y2M6OlNuYXBTZWxlY3Rpb25TdHJhdGVneT4gc3RyYXRlZ3kgPQorICAgICAgICAgIGNjOjpTbmFwU2VsZWN0aW9uU3RyYXRlZ3k6OkNyZWF0ZUZvckVuZFBvc2l0aW9uKAorICAgICAgICAgICAgICBnZng6OlNjcm9sbE9mZnNldChlbmRfcG9pbnQpLCB0cnVlLCBmYWxzZSk7CisgICAgICBlbmRfcG9pbnQgPSBHZXREb2N1bWVudCgpCisgICAgICAgICAgICAgICAgICAgICAgLkdldFNuYXBDb29yZGluYXRvcigpCisgICAgICAgICAgICAgICAgICAgICAgLkdldFNuYXBQb3NpdGlvbigqYm94LCAqc3RyYXRlZ3kpCisgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlX29yKGVuZF9wb2ludCk7CiAKLSAgICBGbG9hdFBvaW50IG5ld19wb3NpdGlvbihlbmRfcG9pbnQuWCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbGFibGVfYXJlYS0+U2Nyb2xsUG9zaXRpb24oKS5ZKCkpOwotICAgIHNjcm9sbGFibGVfYXJlYS0+U2Nyb2xsVG9BYnNvbHV0ZVBvc2l0aW9uKG5ld19wb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrU2Nyb2xsQmVoYXZpb3JBdXRvKTsKKyAgICAgIEZsb2F0UG9pbnQgbmV3X3Bvc2l0aW9uKGVuZF9wb2ludC5YKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxhYmxlX2FyZWEtPlNjcm9sbFBvc2l0aW9uKCkuWSgpKTsKKyAgICAgIHNjcm9sbGFibGVfYXJlYS0+U2Nyb2xsVG9BYnNvbHV0ZVBvc2l0aW9uKG5ld19wb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTY3JvbGxCZWhhdmlvckF1dG8pOworICAgIH0KICAgfQogfQogCkBAIC0xMzkzLDE5ICsxNDI3LDM4IEBACiAgICAgICB9CiAgICAgfQogCi0gICAgRmxvYXRQb2ludCBlbmRfcG9pbnQoc2Nyb2xsYWJsZV9hcmVhLT5TY3JvbGxQb3NpdGlvbigpLlgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfdG9wICogYm94LT5TdHlsZSgpLT5FZmZlY3RpdmVab29tKCkpOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxjYzo6U25hcFNlbGVjdGlvblN0cmF0ZWd5PiBzdHJhdGVneSA9Ci0gICAgICAgIGNjOjpTbmFwU2VsZWN0aW9uU3RyYXRlZ3k6OkNyZWF0ZUZvckVuZFBvc2l0aW9uKAotICAgICAgICAgICAgZ2Z4OjpTY3JvbGxPZmZzZXQoZW5kX3BvaW50KSwgZmFsc2UsIHRydWUpOwotICAgIGVuZF9wb2ludCA9IEdldERvY3VtZW50KCkKLSAgICAgICAgICAgICAgICAgICAgLkdldFNuYXBDb29yZGluYXRvcigpCi0gICAgICAgICAgICAgICAgICAgIC5HZXRTbmFwUG9zaXRpb24oKmJveCwgKnN0cmF0ZWd5KQotICAgICAgICAgICAgICAgICAgICAudmFsdWVfb3IoZW5kX3BvaW50KTsKLSAgICBGbG9hdFBvaW50IG5ld19wb3NpdGlvbihzY3JvbGxhYmxlX2FyZWEtPlNjcm9sbFBvc2l0aW9uKCkuWCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9wb2ludC5ZKCkpOwotICAgIHNjcm9sbGFibGVfYXJlYS0+U2Nyb2xsVG9BYnNvbHV0ZVBvc2l0aW9uKG5ld19wb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrU2Nyb2xsQmVoYXZpb3JBdXRvKTsKKyAgICBpZiAoUnVudGltZUVuYWJsZWRGZWF0dXJlczo6Q1NTT01WaWV3U2Nyb2xsQ29vcmRpbmF0ZXNFbmFibGVkKCkpIHsKKyAgICAgIFNjcm9sbE9mZnNldCBlbmRfb2Zmc2V0KHNjcm9sbGFibGVfYXJlYS0+R2V0U2Nyb2xsT2Zmc2V0KCkuV2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld190b3AgKiBib3gtPlN0eWxlKCktPkVmZmVjdGl2ZVpvb20oKSk7CisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Y2M6OlNuYXBTZWxlY3Rpb25TdHJhdGVneT4gc3RyYXRlZ3kgPQorICAgICAgICAgIGNjOjpTbmFwU2VsZWN0aW9uU3RyYXRlZ3k6OkNyZWF0ZUZvckVuZFBvc2l0aW9uKAorICAgICAgICAgICAgICBnZng6OlNjcm9sbE9mZnNldCgKKyAgICAgICAgICAgICAgICAgIHNjcm9sbGFibGVfYXJlYS0+U2Nyb2xsT2Zmc2V0VG9Qb3NpdGlvbihlbmRfb2Zmc2V0KSksCisgICAgICAgICAgICAgIGZhbHNlLCB0cnVlKTsKKyAgICAgIGJhc2U6Ok9wdGlvbmFsPEZsb2F0UG9pbnQ+IHNuYXBfcG9pbnQgPQorICAgICAgICAgIEdldERvY3VtZW50KCkuR2V0U25hcENvb3JkaW5hdG9yKCkuR2V0U25hcFBvc2l0aW9uKCpib3gsICpzdHJhdGVneSk7CisgICAgICBpZiAoc25hcF9wb2ludC5oYXNfdmFsdWUoKSkgeworICAgICAgICBlbmRfb2Zmc2V0ID0KKyAgICAgICAgICAgIHNjcm9sbGFibGVfYXJlYS0+U2Nyb2xsUG9zaXRpb25Ub09mZnNldChzbmFwX3BvaW50LnZhbHVlKCkpOworICAgICAgfQorCisgICAgICBzY3JvbGxhYmxlX2FyZWEtPlNldFNjcm9sbE9mZnNldChlbmRfb2Zmc2V0LCBrUHJvZ3JhbW1hdGljU2Nyb2xsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1Njcm9sbEJlaGF2aW9yQXV0byk7CisgICAgfSBlbHNlIHsKKyAgICAgIEZsb2F0UG9pbnQgZW5kX3BvaW50KHNjcm9sbGFibGVfYXJlYS0+U2Nyb2xsUG9zaXRpb24oKS5YKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfdG9wICogYm94LT5TdHlsZSgpLT5FZmZlY3RpdmVab29tKCkpOworICAgICAgc3RkOjp1bmlxdWVfcHRyPGNjOjpTbmFwU2VsZWN0aW9uU3RyYXRlZ3k+IHN0cmF0ZWd5ID0KKyAgICAgICAgICBjYzo6U25hcFNlbGVjdGlvblN0cmF0ZWd5OjpDcmVhdGVGb3JFbmRQb3NpdGlvbigKKyAgICAgICAgICAgICAgZ2Z4OjpTY3JvbGxPZmZzZXQoZW5kX3BvaW50KSwgZmFsc2UsIHRydWUpOworICAgICAgZW5kX3BvaW50ID0gR2V0RG9jdW1lbnQoKQorICAgICAgICAgICAgICAgICAgICAgIC5HZXRTbmFwQ29vcmRpbmF0b3IoKQorICAgICAgICAgICAgICAgICAgICAgIC5HZXRTbmFwUG9zaXRpb24oKmJveCwgKnN0cmF0ZWd5KQorICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZV9vcihlbmRfcG9pbnQpOworICAgICAgRmxvYXRQb2ludCBuZXdfcG9zaXRpb24oc2Nyb2xsYWJsZV9hcmVhLT5TY3JvbGxQb3NpdGlvbigpLlgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9wb2ludC5ZKCkpOworICAgICAgc2Nyb2xsYWJsZV9hcmVhLT5TY3JvbGxUb0Fic29sdXRlUG9zaXRpb24obmV3X3Bvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1Njcm9sbEJlaGF2aW9yQXV0byk7CisgICAgfQogICB9CiB9CiAKQEAgLTE1MzksNTQgKzE1OTIsODYgQEAKICAgaWYgKFBhaW50TGF5ZXJTY3JvbGxhYmxlQXJlYSogc2Nyb2xsYWJsZV9hcmVhID0gR2V0U2Nyb2xsYWJsZUFyZWEoKSkgewogICAgIExheW91dEJveCogYm94ID0gR2V0TGF5b3V0Qm94KCk7CiAgICAgRENIRUNLKGJveCk7Ci0gICAgRmxvYXRQb2ludCBuZXdfcG9zaXRpb24oc2Nyb2xsYWJsZV9hcmVhLT5TY3JvbGxQb3NpdGlvbigpLlgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxhYmxlX2FyZWEtPlNjcm9sbFBvc2l0aW9uKCkuWSgpKTsKLSAgICBpZiAoc2Nyb2xsX3RvX29wdGlvbnMtPmhhc0xlZnQoKSkgewotICAgICAgaWYgKEhhc0xlZnR3YXJkRGlyZWN0aW9uKCp0aGlzKSkgeworICAgIGlmIChzY3JvbGxfdG9fb3B0aW9ucy0+aGFzTGVmdCgpICYmIEhhc0xlZnR3YXJkRGlyZWN0aW9uKCp0aGlzKSkgeworICAgICAgVXNlQ291bnRlcjo6Q291bnQoCisgICAgICAgICAgR2V0RG9jdW1lbnQoKSwKKyAgICAgICAgICBXZWJGZWF0dXJlOjoKKyAgICAgICAgICAgICAga0VsZW1lbnRXaXRoTGVmdHdhcmRPclVwd2FyZE92ZXJmbG93RGlyZWN0aW9uX1Njcm9sbExlZnRPclRvcCk7CisgICAgICBpZiAoc2Nyb2xsX3RvX29wdGlvbnMtPmxlZnQoKSA+IDApIHsKICAgICAgICAgVXNlQ291bnRlcjo6Q291bnQoCiAgICAgICAgICAgICBHZXREb2N1bWVudCgpLAogICAgICAgICAgICAgV2ViRmVhdHVyZTo6Ci0gICAgICAgICAgICAgICAga0VsZW1lbnRXaXRoTGVmdHdhcmRPclVwd2FyZE92ZXJmbG93RGlyZWN0aW9uX1Njcm9sbExlZnRPclRvcCk7Ci0gICAgICAgIGlmIChzY3JvbGxfdG9fb3B0aW9ucy0+bGVmdCgpID4gMCkgewotICAgICAgICAgIFVzZUNvdW50ZXI6OkNvdW50KAotICAgICAgICAgICAgICBHZXREb2N1bWVudCgpLAotICAgICAgICAgICAgICBXZWJGZWF0dXJlOjoKLSAgICAgICAgICAgICAgICAgIGtFbGVtZW50V2l0aExlZnR3YXJkT3JVcHdhcmRPdmVyZmxvd0RpcmVjdGlvbl9TY3JvbGxMZWZ0T3JUb3BTZXRQb3NpdGl2ZSk7Ci0gICAgICAgIH0KKyAgICAgICAgICAgICAgICBrRWxlbWVudFdpdGhMZWZ0d2FyZE9yVXB3YXJkT3ZlcmZsb3dEaXJlY3Rpb25fU2Nyb2xsTGVmdE9yVG9wU2V0UG9zaXRpdmUpOwogICAgICAgfQotCi0gICAgICBuZXdfcG9zaXRpb24uU2V0WCgKLSAgICAgICAgICBTY3JvbGxhYmxlQXJlYTo6Tm9ybWFsaXplTm9uRmluaXRlU2Nyb2xsKHNjcm9sbF90b19vcHRpb25zLT5sZWZ0KCkpICoKLSAgICAgICAgICBib3gtPlN0eWxlKCktPkVmZmVjdGl2ZVpvb20oKSk7CiAgICAgfQotICAgIGlmIChzY3JvbGxfdG9fb3B0aW9ucy0+aGFzVG9wKCkpIHsKLSAgICAgIGlmIChIYXNVcHdhcmREaXJlY3Rpb24oKnRoaXMpKSB7CisgICAgaWYgKHNjcm9sbF90b19vcHRpb25zLT5oYXNUb3AoKSAmJiBIYXNVcHdhcmREaXJlY3Rpb24oKnRoaXMpKSB7CisgICAgICBVc2VDb3VudGVyOjpDb3VudCgKKyAgICAgICAgICBHZXREb2N1bWVudCgpLAorICAgICAgICAgIFdlYkZlYXR1cmU6OgorICAgICAgICAgICAgICBrRWxlbWVudFdpdGhMZWZ0d2FyZE9yVXB3YXJkT3ZlcmZsb3dEaXJlY3Rpb25fU2Nyb2xsTGVmdE9yVG9wKTsKKyAgICAgIGlmIChzY3JvbGxfdG9fb3B0aW9ucy0+dG9wKCkgPiAwKSB7CiAgICAgICAgIFVzZUNvdW50ZXI6OkNvdW50KAogICAgICAgICAgICAgR2V0RG9jdW1lbnQoKSwKICAgICAgICAgICAgIFdlYkZlYXR1cmU6OgotICAgICAgICAgICAgICAgIGtFbGVtZW50V2l0aExlZnR3YXJkT3JVcHdhcmRPdmVyZmxvd0RpcmVjdGlvbl9TY3JvbGxMZWZ0T3JUb3ApOwotICAgICAgICBpZiAoc2Nyb2xsX3RvX29wdGlvbnMtPnRvcCgpID4gMCkgewotICAgICAgICAgIFVzZUNvdW50ZXI6OkNvdW50KAotICAgICAgICAgICAgICBHZXREb2N1bWVudCgpLAotICAgICAgICAgICAgICBXZWJGZWF0dXJlOjoKLSAgICAgICAgICAgICAgICAgIGtFbGVtZW50V2l0aExlZnR3YXJkT3JVcHdhcmRPdmVyZmxvd0RpcmVjdGlvbl9TY3JvbGxMZWZ0T3JUb3BTZXRQb3NpdGl2ZSk7Ci0gICAgICAgIH0KKyAgICAgICAgICAgICAgICBrRWxlbWVudFdpdGhMZWZ0d2FyZE9yVXB3YXJkT3ZlcmZsb3dEaXJlY3Rpb25fU2Nyb2xsTGVmdE9yVG9wU2V0UG9zaXRpdmUpOwogICAgICAgfQotCi0gICAgICBuZXdfcG9zaXRpb24uU2V0WSgKLSAgICAgICAgICBTY3JvbGxhYmxlQXJlYTo6Tm9ybWFsaXplTm9uRmluaXRlU2Nyb2xsKHNjcm9sbF90b19vcHRpb25zLT50b3AoKSkgKgotICAgICAgICAgIGJveC0+U3R5bGUoKS0+RWZmZWN0aXZlWm9vbSgpKTsKICAgICB9CiAKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Y2M6OlNuYXBTZWxlY3Rpb25TdHJhdGVneT4gc3RyYXRlZ3kgPQotICAgICAgICBjYzo6U25hcFNlbGVjdGlvblN0cmF0ZWd5OjpDcmVhdGVGb3JFbmRQb3NpdGlvbigKLSAgICAgICAgICAgIGdmeDo6U2Nyb2xsT2Zmc2V0KG5ld19wb3NpdGlvbiksIHNjcm9sbF90b19vcHRpb25zLT5oYXNMZWZ0KCksCi0gICAgICAgICAgICBzY3JvbGxfdG9fb3B0aW9ucy0+aGFzVG9wKCkpOwotICAgIG5ld19wb3NpdGlvbiA9IEdldERvY3VtZW50KCkKLSAgICAgICAgICAgICAgICAgICAgICAgLkdldFNuYXBDb29yZGluYXRvcigpCi0gICAgICAgICAgICAgICAgICAgICAgIC5HZXRTbmFwUG9zaXRpb24oKmJveCwgKnN0cmF0ZWd5KQotICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVfb3IobmV3X3Bvc2l0aW9uKTsKLSAgICBzY3JvbGxhYmxlX2FyZWEtPlNjcm9sbFRvQWJzb2x1dGVQb3NpdGlvbihuZXdfcG9zaXRpb24sIHNjcm9sbF9iZWhhdmlvcik7CisgICAgLy8gSW4gb3JkZXIgdG8ga2VlcCB0aGUgYmVoYXZpb3Igb2YgZWxlbWVudCBzY3JvbGwgY29uc2lzdGVudCB3aXRoIGRvY3VtZW50CisgICAgLy8gc2Nyb2xsLCBhbmQgY29uc2lzdGVudCB3aXRoIHRoZSBiZWhhdmlvciBvZiBvdGhlciB2ZW5kb3JzLCB0aGUKKyAgICAvLyBvZmZzZXRzIGluIHxzY3JvbGxfdG9fb3B0aW9uc3wgYXJlIHRyZWF0ZWQgYXMgdGhlIG9mZnNldCBmcm9tCisgICAgLy8gfFNjcm9sbE9yaWdpbigpfC4KKyAgICBpZiAoUnVudGltZUVuYWJsZWRGZWF0dXJlczo6Q1NTT01WaWV3U2Nyb2xsQ29vcmRpbmF0ZXNFbmFibGVkKCkpIHsKKyAgICAgIFNjcm9sbE9mZnNldCBuZXdfb2Zmc2V0ID0gc2Nyb2xsYWJsZV9hcmVhLT5HZXRTY3JvbGxPZmZzZXQoKTsKKyAgICAgIGlmIChzY3JvbGxfdG9fb3B0aW9ucy0+aGFzTGVmdCgpKSB7CisgICAgICAgIG5ld19vZmZzZXQuU2V0V2lkdGgoU2Nyb2xsYWJsZUFyZWE6Ok5vcm1hbGl6ZU5vbkZpbml0ZVNjcm9sbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsX3RvX29wdGlvbnMtPmxlZnQoKSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveC0+U3R5bGUoKS0+RWZmZWN0aXZlWm9vbSgpKTsKKyAgICAgIH0KKyAgICAgIGlmIChzY3JvbGxfdG9fb3B0aW9ucy0+aGFzVG9wKCkpIHsKKyAgICAgICAgbmV3X29mZnNldC5TZXRIZWlnaHQoCisgICAgICAgICAgICBTY3JvbGxhYmxlQXJlYTo6Tm9ybWFsaXplTm9uRmluaXRlU2Nyb2xsKHNjcm9sbF90b19vcHRpb25zLT50b3AoKSkgKgorICAgICAgICAgICAgYm94LT5TdHlsZSgpLT5FZmZlY3RpdmVab29tKCkpOworICAgICAgfQorCisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Y2M6OlNuYXBTZWxlY3Rpb25TdHJhdGVneT4gc3RyYXRlZ3kgPQorICAgICAgICAgIGNjOjpTbmFwU2VsZWN0aW9uU3RyYXRlZ3k6OkNyZWF0ZUZvckVuZFBvc2l0aW9uKAorICAgICAgICAgICAgICBnZng6OlNjcm9sbE9mZnNldCgKKyAgICAgICAgICAgICAgICAgIHNjcm9sbGFibGVfYXJlYS0+U2Nyb2xsT2Zmc2V0VG9Qb3NpdGlvbihuZXdfb2Zmc2V0KSksCisgICAgICAgICAgICAgIHNjcm9sbF90b19vcHRpb25zLT5oYXNMZWZ0KCksIHNjcm9sbF90b19vcHRpb25zLT5oYXNUb3AoKSk7CisgICAgICBiYXNlOjpPcHRpb25hbDxGbG9hdFBvaW50PiBzbmFwX3BvaW50ID0KKyAgICAgICAgICBHZXREb2N1bWVudCgpLkdldFNuYXBDb29yZGluYXRvcigpLkdldFNuYXBQb3NpdGlvbigqYm94LCAqc3RyYXRlZ3kpOworICAgICAgaWYgKHNuYXBfcG9pbnQuaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgbmV3X29mZnNldCA9CisgICAgICAgICAgICBzY3JvbGxhYmxlX2FyZWEtPlNjcm9sbFBvc2l0aW9uVG9PZmZzZXQoc25hcF9wb2ludC52YWx1ZSgpKTsKKyAgICAgIH0KKworICAgICAgc2Nyb2xsYWJsZV9hcmVhLT5TZXRTY3JvbGxPZmZzZXQobmV3X29mZnNldCwga1Byb2dyYW1tYXRpY1Njcm9sbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbF9iZWhhdmlvcik7CisgICAgfSBlbHNlIHsKKyAgICAgIEZsb2F0UG9pbnQgbmV3X3Bvc2l0aW9uKHNjcm9sbGFibGVfYXJlYS0+U2Nyb2xsUG9zaXRpb24oKS5YKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxhYmxlX2FyZWEtPlNjcm9sbFBvc2l0aW9uKCkuWSgpKTsKKyAgICAgIGlmIChzY3JvbGxfdG9fb3B0aW9ucy0+aGFzTGVmdCgpKSB7CisgICAgICAgIG5ld19wb3NpdGlvbi5TZXRYKFNjcm9sbGFibGVBcmVhOjpOb3JtYWxpemVOb25GaW5pdGVTY3JvbGwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxfdG9fb3B0aW9ucy0+bGVmdCgpKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJveC0+U3R5bGUoKS0+RWZmZWN0aXZlWm9vbSgpKTsKKyAgICAgIH0KKyAgICAgIGlmIChzY3JvbGxfdG9fb3B0aW9ucy0+aGFzVG9wKCkpIHsKKyAgICAgICAgbmV3X3Bvc2l0aW9uLlNldFkoCisgICAgICAgICAgICBTY3JvbGxhYmxlQXJlYTo6Tm9ybWFsaXplTm9uRmluaXRlU2Nyb2xsKHNjcm9sbF90b19vcHRpb25zLT50b3AoKSkgKgorICAgICAgICAgICAgYm94LT5TdHlsZSgpLT5FZmZlY3RpdmVab29tKCkpOworICAgICAgfQorCisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Y2M6OlNuYXBTZWxlY3Rpb25TdHJhdGVneT4gc3RyYXRlZ3kgPQorICAgICAgICAgIGNjOjpTbmFwU2VsZWN0aW9uU3RyYXRlZ3k6OkNyZWF0ZUZvckVuZFBvc2l0aW9uKAorICAgICAgICAgICAgICBnZng6OlNjcm9sbE9mZnNldChuZXdfcG9zaXRpb24pLCBzY3JvbGxfdG9fb3B0aW9ucy0+aGFzTGVmdCgpLAorICAgICAgICAgICAgICBzY3JvbGxfdG9fb3B0aW9ucy0+aGFzVG9wKCkpOworICAgICAgbmV3X3Bvc2l0aW9uID0gR2V0RG9jdW1lbnQoKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5HZXRTbmFwQ29vcmRpbmF0b3IoKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5HZXRTbmFwUG9zaXRpb24oKmJveCwgKnN0cmF0ZWd5KQorICAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZV9vcihuZXdfcG9zaXRpb24pOworICAgICAgc2Nyb2xsYWJsZV9hcmVhLT5TY3JvbGxUb0Fic29sdXRlUG9zaXRpb24obmV3X3Bvc2l0aW9uLCBzY3JvbGxfYmVoYXZpb3IpOworICAgIH0KICAgfQogfQogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL2V4cG9ydGVkL3dlYl92aWV3X2ltcGwuY2MgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL2V4cG9ydGVkL3dlYl92aWV3X2ltcGwuY2MKaW5kZXggYTBkMTQ0OWMuLjk5NDEzYTEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvZXhwb3J0ZWQvd2ViX3ZpZXdfaW1wbC5jYworKysgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL2V4cG9ydGVkL3dlYl92aWV3X2ltcGwuY2MKQEAgLTI2OTUsOSArMjY5NSw5IEBACiB9CiAKIFdlYlNpemUgV2ViVmlld0ltcGw6OkNvbnRlbnRzUHJlZmVycmVkTWluaW11bVNpemUoKSB7CisgIERDSEVDSyhBc1ZpZXcoKS5wYWdlLT5NYWluRnJhbWUoKS0+SXNMb2NhbEZyYW1lKCkpOworCiAgIGF1dG8qIG1haW5fbG9jYWxfZnJhbWUgPSBEeW5hbWljVG88TG9jYWxGcmFtZT4oQXNWaWV3KCkucGFnZS0+TWFpbkZyYW1lKCkpOwotICBpZiAoIW1haW5fbG9jYWxfZnJhbWUpCi0gICAgcmV0dXJuIFdlYlNpemUoKTsKICAgRG9jdW1lbnQqIGRvY3VtZW50ID0gbWFpbl9sb2NhbF9mcmFtZS0+R2V0RG9jdW1lbnQoKTsKICAgaWYgKCFkb2N1bWVudCB8fCAhZG9jdW1lbnQtPkdldExheW91dFZpZXcoKSB8fCAhZG9jdW1lbnQtPmRvY3VtZW50RWxlbWVudCgpIHx8CiAgICAgICAhZG9jdW1lbnQtPmRvY3VtZW50RWxlbWVudCgpLT5HZXRMYXlvdXRCb3goKSkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvZnJhbWUvbG9jYWxfZnJhbWUuY2MgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL2ZyYW1lL2xvY2FsX2ZyYW1lLmNjCmluZGV4IDVhNmY4OTEuLjRmYjcyN2QgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvZnJhbWUvbG9jYWxfZnJhbWUuY2MKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvY29yZS9mcmFtZS9sb2NhbF9mcmFtZS5jYwpAQCAtMTY0MSw3ICsxNjQxLDcgQEAKICAgaWYgKGF1dG8qIGRvY3VtZW50X3Jlc291cmNlX2Nvb3JkaW5hdG9yID0KICAgICAgICAgICBHZXREb2N1bWVudCgpLT5HZXRSZXNvdXJjZUNvb3JkaW5hdG9yKCkpIHsKICAgICBkb2N1bWVudF9yZXNvdXJjZV9jb29yZGluYXRvci0+U2V0TGlmZWN5Y2xlU3RhdGUoCi0gICAgICAgIHJlc291cmNlX2Nvb3JkaW5hdG9yOjptb2pvbTo6TGlmZWN5Y2xlU3RhdGU6OmtGcm96ZW4pOworICAgICAgICBwZXJmb3JtYW5jZV9tYW5hZ2VyOjptb2pvbTo6TGlmZWN5Y2xlU3RhdGU6OmtGcm96ZW4pOwogICB9CiB9CiAKQEAgLTE2NTgsNyArMTY1OCw3IEBACiAgIGlmIChhdXRvKiBkb2N1bWVudF9yZXNvdXJjZV9jb29yZGluYXRvciA9CiAgICAgICAgICAgR2V0RG9jdW1lbnQoKS0+R2V0UmVzb3VyY2VDb29yZGluYXRvcigpKSB7CiAgICAgZG9jdW1lbnRfcmVzb3VyY2VfY29vcmRpbmF0b3ItPlNldExpZmVjeWNsZVN0YXRlKAotICAgICAgICByZXNvdXJjZV9jb29yZGluYXRvcjo6bW9qb206OkxpZmVjeWNsZVN0YXRlOjprUnVubmluZyk7CisgICAgICAgIHBlcmZvcm1hbmNlX21hbmFnZXI6Om1vam9tOjpMaWZlY3ljbGVTdGF0ZTo6a1J1bm5pbmcpOwogICB9CiB9CiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvaHRtbC9mb3Jtcy9yZXNvdXJjZXMvY29sb3JfcGlja2VyLmNzcyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvaHRtbC9mb3Jtcy9yZXNvdXJjZXMvY29sb3JfcGlja2VyLmNzcwppbmRleCBmYTdiM2E3Li5kZDkzMGUyIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL2h0bWwvZm9ybXMvcmVzb3VyY2VzL2NvbG9yX3BpY2tlci5jc3MKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvY29yZS9odG1sL2Zvcm1zL3Jlc291cmNlcy9jb2xvcl9waWNrZXIuY3NzCkBAIC0xOTcsNyArMTk3LDEzIEBACiAgICAgZm9yY2VkLWNvbG9yLWFkanVzdDogbm9uZTsKICAgICBib3JkZXItY29sb3I6IFdpbmRvd1RleHQ7CiAgIH0KKyAgY29sb3Itd2VsbCB7CisgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIFdpbmRvd1RleHQ7CisgIH0KICAgY29sb3Itc2VsZWN0aW9uLXJpbmcgewogICAgIGZvcmNlZC1jb2xvci1hZGp1c3Q6IG5vbmU7CiAgIH0KKyAgZm9ybWF0LXRvZ2dsZXIgeworICAgIGJvcmRlcjogMXB4IHNvbGlkIFdpbmRvd1RleHQ7CisgIH0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL2h0bWwvZm9ybXMvdGV4dF9jb250cm9sX2VsZW1lbnQuY2MgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL2h0bWwvZm9ybXMvdGV4dF9jb250cm9sX2VsZW1lbnQuY2MKaW5kZXggZjhmYzk0YWUuLjdjYmMxYjdjIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL2h0bWwvZm9ybXMvdGV4dF9jb250cm9sX2VsZW1lbnQuY2MKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvY29yZS9odG1sL2Zvcm1zL3RleHRfY29udHJvbF9lbGVtZW50LmNjCkBAIC00MDgsNyArNDA4LDggQEAKICAgICAgICAgaW5kZXggKz0gc3RkOjptaW4obGVuZ3RoLCBwYXNzZWRfcG9zaXRpb24uT2Zmc2V0SW5Db250YWluZXJOb2RlKCkpOwogICAgICAgZWxzZQogICAgICAgICBpbmRleCArPSBsZW5ndGg7Ci0gICAgfSBlbHNlIGlmIChub2RlLT5IYXNUYWdOYW1lKGtCclRhZykpIHsKKyAgICAgIC8vIERpc3JlZ2FyZCB0aGUgbGFzdCBhdXRvIGFkZGVkIHBsYWNlaG9sZGVyIEJyVGFnLgorICAgIH0gZWxzZSBpZiAobm9kZS0+SGFzVGFnTmFtZShrQnJUYWcpICYmIG5vZGUgIT0gaW5uZXJfZWRpdG9yLT5sYXN0Q2hpbGQoKSkgewogICAgICAgKytpbmRleDsKICAgICB9CiAgIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvaW5wdXQvZXZlbnRfaGFuZGxlcl90ZXN0LmNjIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvY29yZS9pbnB1dC9ldmVudF9oYW5kbGVyX3Rlc3QuY2MKaW5kZXggMzRhYzE2OC4uN2ZkYjAwOWEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvaW5wdXQvZXZlbnRfaGFuZGxlcl90ZXN0LmNjCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvaW5wdXQvZXZlbnRfaGFuZGxlcl90ZXN0LmNjCkBAIC0xMDQ0LDIyICsxMDQ0LDcgQEAKICAgQVNTRVJUX0ZBTFNFKGNocm9tZV9jbGllbnRfLT5SZWNlaXZlZFJlcXVlc3RGb3JVbmJ1ZmZlcmVkSW5wdXQoKSk7CiB9CiAKLWNsYXNzIEV2ZW50SGFuZGxlclNjcm9sbGJhckdlc3R1cmVJbmplY3Rpb25UZXN0IDogcHVibGljIFNpbVRlc3QgewotIHB1YmxpYzoKLSAgRXZlbnRIYW5kbGVyU2Nyb2xsYmFyR2VzdHVyZUluamVjdGlvblRlc3QoKSA9IGRlZmF1bHQ7Ci0KLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBzY29wZWRfZmVhdHVyZV9saXN0Xy5Jbml0QW5kRW5hYmxlRmVhdHVyZSgKLSAgICAgICAgZmVhdHVyZXM6OmtTY3JvbGxiYXJJbmplY3RTY3JvbGxHZXN0dXJlcyk7Ci0gICAgU2ltVGVzdDo6U2V0VXAoKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgYmFzZTo6dGVzdDo6U2NvcGVkRmVhdHVyZUxpc3Qgc2NvcGVkX2ZlYXR1cmVfbGlzdF87Ci19OwotCi1URVNUX0YoRXZlbnRIYW5kbGVyU2Nyb2xsYmFyR2VzdHVyZUluamVjdGlvblRlc3QsCi0gICAgICAgTW91c2VVcE9mZlNjcm9sbGJhckdlbmVyYXRlc1Njcm9sbEVuZCkgeworVEVTVF9GKEV2ZW50SGFuZGxlclNpbVRlc3QsIE1vdXNlVXBPZmZTY3JvbGxiYXJHZW5lcmF0ZXNTY3JvbGxFbmQpIHsKICAgV2ViVmlldygpLk1haW5GcmFtZVdpZGdldCgpLT5SZXNpemUoV2ViU2l6ZSg4MDAsIDYwMCkpOwogICBTaW1SZXF1ZXN0IHJlcXVlc3QoImh0dHBzOi8vZXhhbXBsZS5jb20vdGVzdC5odG1sIiwgInRleHQvaHRtbCIpOwogICBMb2FkVVJMKCJodHRwczovL2V4YW1wbGUuY29tL3Rlc3QuaHRtbCIpOwpAQCAtMTEzMyw3ICsxMTE4LDcgQEAKICAgfQogfQogCi1URVNUX0YoRXZlbnRIYW5kbGVyU2Nyb2xsYmFyR2VzdHVyZUluamVjdGlvblRlc3QsIE1vdXNlVXBPbmx5T25TY3JvbGxiYXIpIHsKK1RFU1RfRihFdmVudEhhbmRsZXJTaW1UZXN0LCBNb3VzZVVwT25seU9uU2Nyb2xsYmFyKSB7CiAgIFdlYlZpZXcoKS5NYWluRnJhbWVXaWRnZXQoKS0+UmVzaXplKFdlYlNpemUoODAwLCA2MDApKTsKICAgU2ltUmVxdWVzdCByZXF1ZXN0KCJodHRwczovL2V4YW1wbGUuY29tL3Rlc3QuaHRtbCIsICJ0ZXh0L2h0bWwiKTsKICAgTG9hZFVSTCgiaHR0cHM6Ly9leGFtcGxlLmNvbS90ZXN0Lmh0bWwiKTsKQEAgLTExODUsNyArMTE3MCw3IEBACiAgIEVYUEVDVF9FUShXZWJXaWRnZXRDbGllbnQoKS5HZXRJbmplY3RlZFNjcm9sbEdlc3R1cmVEYXRhKCkuc2l6ZSgpLCAwdSk7CiB9CiAKLVRFU1RfRihFdmVudEhhbmRsZXJTY3JvbGxiYXJHZXN0dXJlSW5qZWN0aW9uVGVzdCwgUmlnaHRDbGlja05vR2VzdHVyZXMpIHsKK1RFU1RfRihFdmVudEhhbmRsZXJTaW1UZXN0LCBSaWdodENsaWNrTm9HZXN0dXJlcykgewogICBXZWJWaWV3KCkuTWFpbkZyYW1lV2lkZ2V0KCktPlJlc2l6ZShXZWJTaXplKDgwMCwgNjAwKSk7CiAgIFNpbVJlcXVlc3QgcmVxdWVzdCgiaHR0cHM6Ly9leGFtcGxlLmNvbS90ZXN0Lmh0bWwiLCAidGV4dC9odG1sIik7CiAgIExvYWRVUkwoImh0dHBzOi8vZXhhbXBsZS5jb20vdGVzdC5odG1sIik7CkBAIC0xMjMwLDggKzEyMTUsNyBAQAogI2RlZmluZSBNQVlCRV9HZXN0dXJlVGFwV2l0aFNjcm9sbFNuYXBzIEdlc3R1cmVUYXBXaXRoU2Nyb2xsU25hcHMKICNlbmRpZgogCi1URVNUX0YoRXZlbnRIYW5kbGVyU2Nyb2xsYmFyR2VzdHVyZUluamVjdGlvblRlc3QsCi0gICAgICAgTUFZQkVfR2VzdHVyZVRhcFdpdGhTY3JvbGxTbmFwcykgeworVEVTVF9GKEV2ZW50SGFuZGxlclNpbVRlc3QsIE1BWUJFX0dlc3R1cmVUYXBXaXRoU2Nyb2xsU25hcHMpIHsKICAgLy8gQ3JlYXRlIGEgcGFnZSB0aGF0IGhhcyBzY3JvbGwgc25hcHMgZW5hYmxlZCBmb3IgYSBzY3JvbGxlci4gVGFwIG9uIHRoZQogICAvLyBzY3JvbGxiYXIgYW5kIHZlcmlmeSB0aGF0IHRoZSBTbmFwQ29udHJvbGxlciBkb2VzIG5vdCBpbW1lZGlhdGVseSBjYW5jZWwKICAgLy8gdGhlIHJlc3VsdGluZyBhbmltYXRpb24gZHVyaW5nIHRoZSBoYW5kbGluZyBvZiBHZXN0dXJlU2Nyb2xsRW5kIC0gdGhpcwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvY29yZS9sYXlvdXQvbGF5b3V0X29iamVjdC5jYyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvbGF5b3V0L2xheW91dF9vYmplY3QuY2MKaW5kZXggYzk3ZGFjNC4uMjA2MDI0OCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvY29yZS9sYXlvdXQvbGF5b3V0X29iamVjdC5jYworKysgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL2xheW91dC9sYXlvdXRfb2JqZWN0LmNjCkBAIC0xNDE0LDYgKzE0MTQsMTMgQEAKIGJvb2wgTGF5b3V0T2JqZWN0OjpIYXNEaXN0b3J0aW5nVmlzdWFsRWZmZWN0cygpIGNvbnN0IHsKICAgLy8gVE9ETyhzemFnZXIpOiBDaGVjayBvY2NsdXNpb24gaW5mb3JtYXRpb24gcHJvcGFnYXRlZCBmcm9tIG91dC1vZi1wcm9jZXNzCiAgIC8vIHBhcmVudCBmcmFtZS4KKworICAvLyBUT0RPKHN6YWdlcik6IFJlbW92ZSBDSEVDSydzIGFmdGVyIGRpYWdub3NpbmcgY3Jhc2guCisgIFBhaW50TGF5ZXIqIGVuY2xvc2luZ19sYXllciA9IEVuY2xvc2luZ0xheWVyKCk7CisgIENIRUNLKGVuY2xvc2luZ19sYXllcik7CisgIENIRUNLKGVuY2xvc2luZ19sYXllci0+R2V0TGF5b3V0T2JqZWN0KCkKKyAgICAgICAgICAgIC5GaXJzdEZyYWdtZW50KCkKKyAgICAgICAgICAgIC5IYXNMb2NhbEJvcmRlckJveFByb3BlcnRpZXMoKSk7CiAgIFByb3BlcnR5VHJlZVN0YXRlIHBhaW50X3Byb3BlcnRpZXMgPSBFbmNsb3NpbmdMYXllcigpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5HZXRMYXlvdXRPYmplY3QoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5GaXJzdEZyYWdtZW50KCkKQEAgLTE0MzAsMTIgKzE0MzcsMTUgQEAKICAgICB9CiAgIH0KIAotICBQcm9wZXJ0eVRyZWVTdGF0ZSByb290X3Byb3BlcnRpZXMgPSBHZXREb2N1bWVudCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuR2V0RnJhbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5Mb2NhbEZyYW1lUm9vdCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQ29udGVudExheW91dE9iamVjdCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPkZpcnN0RnJhZ21lbnQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkxvY2FsQm9yZGVyQm94UHJvcGVydGllcygpOworICAvLyBUT0RPKHN6YWdlcik6IFJlbW92ZSBDSEVDSydzIGFmdGVyIGRpYWdub3NpbmcgY3Jhc2guCisgIENIRUNLKEdldERvY3VtZW50KCkuSXNBY3RpdmUoKSk7CisgIExvY2FsRnJhbWUqIGZyYW1lID0gR2V0RG9jdW1lbnQoKS5HZXRGcmFtZSgpOworICBDSEVDSyhmcmFtZSk7CisgIExheW91dFZpZXcqIGxheW91dF92aWV3ID0gZnJhbWUtPkxvY2FsRnJhbWVSb290KCkuQ29udGVudExheW91dE9iamVjdCgpOworICBDSEVDSyhsYXlvdXRfdmlldyk7CisgIENIRUNLKGxheW91dF92aWV3LT5GaXJzdEZyYWdtZW50KCkuSGFzTG9jYWxCb3JkZXJCb3hQcm9wZXJ0aWVzKCkpOworICBQcm9wZXJ0eVRyZWVTdGF0ZSByb290X3Byb3BlcnRpZXMgPQorICAgICAgbGF5b3V0X3ZpZXctPkZpcnN0RnJhZ21lbnQoKS5Mb2NhbEJvcmRlckJveFByb3BlcnRpZXMoKTsKIAogICAvLyBUaGUgb25seSBhbGxvd2VkIHRyYW5zZm9ybXMgYXJlIDJEIHRyYW5zbGF0aW9uIGFuZCBwcm9wb3J0aW9uYWwgdXAtc2NhbGluZy4KICAgY29uc3QgYXV0byYgdHJhbnNsYXRpb25fMmRfb3JfbWF0cml4ID0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvbGF5b3V0L2xheW91dF9zaGlmdF90cmFja2VyLmNjIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvY29yZS9sYXlvdXQvbGF5b3V0X3NoaWZ0X3RyYWNrZXIuY2MKaW5kZXggOTNmMWVhMjcuLmQzYzdlYWUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvbGF5b3V0L2xheW91dF9zaGlmdF90cmFja2VyLmNjCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvbGF5b3V0L2xheW91dF9zaGlmdF90cmFja2VyLmNjCkBAIC0yOCw3ICsyOCw3IEBACiAKIHN0YXRpYyBjb25zdGV4cHIgYmFzZTo6VGltZURlbHRhIGtUaW1lckRlbGF5ID0KICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoNTAwKTsKLXN0YXRpYyBjb25zdCBmbG9hdCBrTW92ZW1lbnRUaHJlc2hvbGQgPSAxLjA7ICAvLyBDU1MgcGl4ZWxzLgorc3RhdGljIGNvbnN0IGZsb2F0IGtNb3ZlbWVudFRocmVzaG9sZCA9IDMuMDsgIC8vIENTUyBwaXhlbHMuCiAKIHN0YXRpYyBGbG9hdFBvaW50IExvZ2ljYWxTdGFydChjb25zdCBGbG9hdFJlY3QmIHJlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGF5b3V0T2JqZWN0JiBvYmplY3QpIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvbGF5b3V0L3Njcm9sbGJhcnNfdGVzdC5jYyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvbGF5b3V0L3Njcm9sbGJhcnNfdGVzdC5jYwppbmRleCA3ZWZjMGUyLi43MmNhMGE2IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL2xheW91dC9zY3JvbGxiYXJzX3Rlc3QuY2MKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvY29yZS9sYXlvdXQvc2Nyb2xsYmFyc190ZXN0LmNjCkBAIC0yLDcgKzIsNiBAQAogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAotI2luY2x1ZGUgImJhc2UvdGVzdC9zY29wZWRfZmVhdHVyZV9saXN0LmgiCiAjaW5jbHVkZSAiYnVpbGQvYnVpbGRfY29uZmlnLmgiCiAjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcHVibGljL2NvbW1vbi9mZWF0dXJlcy5oIgpAQCAtMTYzLDggKzE2Miw2IEBACiAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CiAgICAgU2Nyb2xsYmFyc1Rlc3Q6OlNldFVwKCk7CiAgICAgV2ViVmlldygpLlNjaGVkdWxlcigpLT5FbmFibGVWaXJ0dWFsVGltZSgpOwotICAgIHNjb3BlZF9mZWF0dXJlX2xpc3RfLkluaXRBbmRFbmFibGVGZWF0dXJlKAotICAgICAgICBmZWF0dXJlczo6a1Njcm9sbGJhckluamVjdFNjcm9sbEdlc3R1cmVzKTsKICAgfQogCiAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CkBAIC0xOTUsOSArMTkyLDYgQEAKICAgICAgICAgZGVsYXkpOwogICAgIHRlc3Q6OkVudGVyUnVuTG9vcCgpOwogICB9Ci0KLSBwcml2YXRlOgotICBiYXNlOjp0ZXN0OjpTY29wZWRGZWF0dXJlTGlzdCBzY29wZWRfZmVhdHVyZV9saXN0XzsKIH07CiAKIFRFU1RfRihTY3JvbGxiYXJzVGVzdCwgRG9jdW1lbnRTdHlsZVJlY2FsY1ByZXNlcnZlc1Njcm9sbGJhcnMpIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvc2NyaXB0L3BlbmRpbmdfc2NyaXB0LmNjIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvY29yZS9zY3JpcHQvcGVuZGluZ19zY3JpcHQuY2MKaW5kZXggMmEzNTNhOC4uOGFmOWU4ZjcgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvc2NyaXB0L3BlbmRpbmdfc2NyaXB0LmNjCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvc2NyaXB0L3BlbmRpbmdfc2NyaXB0LmNjCkBAIC0xNDEsMTYgKzE0MSw5IEBACiAgIH0KIAogICBpZiAoT3JpZ2luYWxDb250ZXh0RG9jdW1lbnQoKSAhPSBjb250ZXh0X2RvY3VtZW50KSB7Ci0gICAgaWYgKEdldFNjcmlwdFR5cGUoKSA9PSBtb2pvbTo6U2NyaXB0VHlwZTo6a01vZHVsZSkgewotICAgICAgLy8gRG8gbm90IGV4ZWN1dGUgbW9kdWxlIHNjcmlwdHMgaWYgdGhleSBhcmUgbW92ZWQgYmV0d2VlbiBkb2N1bWVudHMuCi0gICAgICBEaXNwb3NlKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gVE9ETyhoaXJvc2hpZ2UpOiBBbHNvIGRvIG5vdCBleGVjdXRlIGNsYXNzaWMgc2NyaXB0cy4KLSAgICAvLyBodHRwczovL2NyYnVnLmNvbS83MjE5MTQKLSAgICBVc2VDb3VudGVyOjpDb3VudChjb250ZXh0X2RvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgIFdlYkZlYXR1cmU6OmtFdmFsdWF0ZVNjcmlwdE1vdmVkQmV0d2VlbkRvY3VtZW50cyk7CisgICAgLy8gRG8gbm90IGV4ZWN1dGUgc2NyaXB0cyBpZiB0aGV5IGFyZSBtb3ZlZCBiZXR3ZWVuIGRvY3VtZW50cy4KKyAgICBEaXNwb3NlKCk7CisgICAgcmV0dXJuOwogICB9CiAKICAgaWYgKE9yaWdpbmFsQ29udGV4dERvY3VtZW50KCkgPT0gY29udGV4dF9kb2N1bWVudCAmJgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvY29yZS9zY3JvbGwvc2Nyb2xsYmFyLmNjIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvY29yZS9zY3JvbGwvc2Nyb2xsYmFyLmNjCmluZGV4IDIyMzhiY2QuLjdhYTUyNmYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvc2Nyb2xsL3Njcm9sbGJhci5jYworKysgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL3Njcm9sbC9zY3JvbGxiYXIuY2MKQEAgLTIwOSwxNCArMjA5LDcgQEAKICAgfQogCiAgIC8vIEhhbmRsZSB0aGUgYXJyb3dzIGFuZCB0cmFjayBieSBpbmplY3RpbmcgYSBzY3JvbGwgdXBkYXRlLgotICBpZiAoSXNTY3JvbGxHZXN0dXJlSW5qZWN0aW9uRW5hYmxlZCgpKSB7Ci0gICAgSW5qZWN0U2Nyb2xsR2VzdHVyZUZvclByZXNzZWRQYXJ0KFdlYklucHV0RXZlbnQ6OmtHZXN0dXJlU2Nyb2xsVXBkYXRlKTsKLSAgfSBlbHNlIHsKLSAgICBzY3JvbGxhYmxlX2FyZWFfLT5Vc2VyU2Nyb2xsKAotICAgICAgICBQcmVzc2VkUGFydFNjcm9sbEdyYW51bGFyaXR5KCksCi0gICAgICAgIFRvU2Nyb2xsRGVsdGEoUHJlc3NlZFBhcnRTY3JvbGxEaXJlY3Rpb25QaHlzaWNhbCgpLCAxKSwKLSAgICAgICAgU2Nyb2xsYWJsZUFyZWE6OlNjcm9sbENhbGxiYWNrKCkpOwotICB9CisgIEluamVjdFNjcm9sbEdlc3R1cmVGb3JQcmVzc2VkUGFydChXZWJJbnB1dEV2ZW50OjprR2VzdHVyZVNjcm9sbFVwZGF0ZSk7CiAKICAgLy8gQWx3YXlzIHN0YXJ0IHRpbWVyIHdoZW4gdXNlciBwcmVzcyBvbiBidXR0b24gc2luY2Ugc2Nyb2xsYWJsZSBhcmVhIG1heWJlCiAgIC8vIGluZmluaXRlIHNjcm9sbGluZy4KQEAgLTI5MSwxMiArMjg0LDcgQEAKICAgICAgICAgZGVsdGE7CiAgICAgZGVzdGluYXRpb25fcG9zaXRpb24gPQogICAgICAgICBzY3JvbGxhYmxlX2FyZWFfLT5DbGFtcFNjcm9sbE9mZnNldChvcmllbnRhdGlvbl8sIGRlc3RpbmF0aW9uX3Bvc2l0aW9uKTsKLSAgICBpZiAoSXNTY3JvbGxHZXN0dXJlSW5qZWN0aW9uRW5hYmxlZCgpKSB7Ci0gICAgICBJbmplY3RHZXN0dXJlU2Nyb2xsVXBkYXRlRm9yVGh1bWJNb3ZlKGRlc3RpbmF0aW9uX3Bvc2l0aW9uKTsKLSAgICB9IGVsc2UgewotICAgICAgc2Nyb2xsYWJsZV9hcmVhXy0+U2V0U2Nyb2xsT2Zmc2V0U2luZ2xlQXhpcygKLSAgICAgICAgICBvcmllbnRhdGlvbl8sIGRlc3RpbmF0aW9uX3Bvc2l0aW9uLCBrVXNlclNjcm9sbCk7Ci0gICAgfQorICAgIEluamVjdEdlc3R1cmVTY3JvbGxVcGRhdGVGb3JUaHVtYk1vdmUoZGVzdGluYXRpb25fcG9zaXRpb24pOwogICAgIGRvY3VtZW50X2RyYWdfcG9zXyA9IHBvczsKICAgICByZXR1cm47CiAgIH0KQEAgLTMyNSwxMiArMzEzLDggQEAKICAgICBmbG9hdCBuZXdfb2Zmc2V0ID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHRodW1iX3BvcyArIGRlbHRhKSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF4X29mZnNldCAtIG1pbl9vZmZzZXQpIC8gKHRyYWNrX2xlbiAtIHRodW1iX2xlbikgKwogICAgICAgICAgICAgICAgICAgICAgICBtaW5fb2Zmc2V0OwotICAgIGlmIChJc1Njcm9sbEdlc3R1cmVJbmplY3Rpb25FbmFibGVkKCkpIHsKLSAgICAgIEluamVjdEdlc3R1cmVTY3JvbGxVcGRhdGVGb3JUaHVtYk1vdmUobmV3X29mZnNldCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNjcm9sbGFibGVfYXJlYV8tPlNldFNjcm9sbE9mZnNldFNpbmdsZUF4aXMob3JpZW50YXRpb25fLCBuZXdfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVXNlclNjcm9sbCk7Ci0gICAgfQorCisgICAgSW5qZWN0R2VzdHVyZVNjcm9sbFVwZGF0ZUZvclRodW1iTW92ZShuZXdfb2Zmc2V0KTsKICAgfQogfQogCkBAIC00NDMsMTkgKzQyNywxMyBAQAogICAgICAgc2Nyb2xsYWJsZV9hcmVhXykgewogICAgIFNjcm9sbE9mZnNldCBkZWx0YSA9IFRvU2Nyb2xsRGVsdGEoUHJlc3NlZFBhcnRTY3JvbGxEaXJlY3Rpb25QaHlzaWNhbCgpLCAxKTsKICAgICBpZiAoRGVsdGFXaWxsU2Nyb2xsKGRlbHRhKSkgewotICAgICAgaWYgKElzU2Nyb2xsR2VzdHVyZUluamVjdGlvbkVuYWJsZWQoKSkgewotICAgICAgICAvLyBUYXBzIHBlcmZvcm0gYSBzaW5nbGUgc2Nyb2xsIGJlZ2luL3VwZGF0ZS9lbmQgc2VxdWVuY2Ugb2YgZ2VzdHVyZQotICAgICAgICAvLyBldmVudHMuIFRoZXJlJ3Mgbm8gYXV0b3Njcm9sbCB0aW1lciBzaW5jZSBsb25nIHByZXNzIGlzIG5vdCB0cmVhdGVkCi0gICAgICAgIC8vIHRoZSBzYW1lIGFzIGhvbGRpbmcgYSBtb3VzZSBkb3duLgotICAgICAgICBJbmplY3RTY3JvbGxHZXN0dXJlRm9yUHJlc3NlZFBhcnQoV2ViSW5wdXRFdmVudDo6a0dlc3R1cmVTY3JvbGxCZWdpbik7Ci0gICAgICAgIEluamVjdFNjcm9sbEdlc3R1cmVGb3JQcmVzc2VkUGFydChXZWJJbnB1dEV2ZW50OjprR2VzdHVyZVNjcm9sbFVwZGF0ZSk7Ci0gICAgICAgIEluamVjdFNjcm9sbEdlc3R1cmVGb3JQcmVzc2VkUGFydChXZWJJbnB1dEV2ZW50OjprR2VzdHVyZVNjcm9sbEVuZCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzY3JvbGxhYmxlX2FyZWFfLT5Vc2VyU2Nyb2xsKAotICAgICAgICAgICAgUHJlc3NlZFBhcnRTY3JvbGxHcmFudWxhcml0eSgpLAotICAgICAgICAgICAgVG9TY3JvbGxEZWx0YShQcmVzc2VkUGFydFNjcm9sbERpcmVjdGlvblBoeXNpY2FsKCksIDEpLAotICAgICAgICAgICAgU2Nyb2xsYWJsZUFyZWE6OlNjcm9sbENhbGxiYWNrKCkpOwotICAgICAgfQorICAgICAgLy8gVGFwcyBwZXJmb3JtIGEgc2luZ2xlIHNjcm9sbCBiZWdpbi91cGRhdGUvZW5kIHNlcXVlbmNlIG9mIGdlc3R1cmUKKyAgICAgIC8vIGV2ZW50cy4gVGhlcmUncyBubyBhdXRvc2Nyb2xsIHRpbWVyIHNpbmNlIGxvbmcgcHJlc3MgaXMgbm90IHRyZWF0ZWQKKyAgICAgIC8vIHRoZSBzYW1lIGFzIGhvbGRpbmcgYSBtb3VzZSBkb3duLgorICAgICAgSW5qZWN0U2Nyb2xsR2VzdHVyZUZvclByZXNzZWRQYXJ0KFdlYklucHV0RXZlbnQ6OmtHZXN0dXJlU2Nyb2xsQmVnaW4pOworICAgICAgSW5qZWN0U2Nyb2xsR2VzdHVyZUZvclByZXNzZWRQYXJ0KFdlYklucHV0RXZlbnQ6OmtHZXN0dXJlU2Nyb2xsVXBkYXRlKTsKKyAgICAgIEluamVjdFNjcm9sbEdlc3R1cmVGb3JQcmVzc2VkUGFydChXZWJJbnB1dEV2ZW50OjprR2VzdHVyZVNjcm9sbEVuZCk7CisKICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgfQpAQCAtNDczLDEyICs0NTEsNyBAQAogICAgICAgaWYgKHNjcm9sbGFibGVfYXJlYV8pIHsKICAgICAgICAgZmxvYXQgZGVzdGluYXRpb25fcG9zaXRpb24gPQogICAgICAgICAgICAgZHJhZ19vcmlnaW5fICsgc2Nyb2xsYWJsZV9hcmVhXy0+TWluaW11bVNjcm9sbE9mZnNldChvcmllbnRhdGlvbl8pOwotICAgICAgICBpZiAoSXNTY3JvbGxHZXN0dXJlSW5qZWN0aW9uRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgSW5qZWN0R2VzdHVyZVNjcm9sbFVwZGF0ZUZvclRodW1iTW92ZShkZXN0aW5hdGlvbl9wb3NpdGlvbik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc2Nyb2xsYWJsZV9hcmVhXy0+U2V0U2Nyb2xsT2Zmc2V0U2luZ2xlQXhpcygKLSAgICAgICAgICAgICAgb3JpZW50YXRpb25fLCBkZXN0aW5hdGlvbl9wb3NpdGlvbiwga1VzZXJTY3JvbGwpOwotICAgICAgICB9CisgICAgICAgIEluamVjdEdlc3R1cmVTY3JvbGxVcGRhdGVGb3JUaHVtYk1vdmUoZGVzdGluYXRpb25fcG9zaXRpb24pOwogICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICBNb3ZlVGh1bWIob3JpZW50YXRpb25fID09IGtIb3Jpem9udGFsU2Nyb2xsYmFyCkBAIC01NDUsOCArNTE4LDcgQEAKICAgICAgIHNjcm9sbGFibGVfYXJlYV8tPk1vdXNlRXhpdGVkU2Nyb2xsYmFyKCp0aGlzKTsKICAgICB9CiAKLSAgICBpZiAoSXNTY3JvbGxHZXN0dXJlSW5qZWN0aW9uRW5hYmxlZCgpKQotICAgICAgSW5qZWN0U2Nyb2xsR2VzdHVyZUZvclByZXNzZWRQYXJ0KFdlYklucHV0RXZlbnQ6OmtHZXN0dXJlU2Nyb2xsRW5kKTsKKyAgICBJbmplY3RTY3JvbGxHZXN0dXJlRm9yUHJlc3NlZFBhcnQoV2ViSW5wdXRFdmVudDo6a0dlc3R1cmVTY3JvbGxFbmQpOwogICB9CiB9CiAKQEAgLTU4NywxMCArNTU5LDYgQEAKICAgQXV0b3Njcm9sbFByZXNzZWRQYXJ0KEdldFRoZW1lKCkuSW5pdGlhbEF1dG9zY3JvbGxUaW1lckRlbGF5KCkpOwogfQogCi1ib29sIFNjcm9sbGJhcjo6SXNTY3JvbGxHZXN0dXJlSW5qZWN0aW9uRW5hYmxlZCgpIGNvbnN0IHsKLSAgcmV0dXJuIGJhc2U6OkZlYXR1cmVMaXN0OjpJc0VuYWJsZWQoZmVhdHVyZXM6OmtTY3JvbGxiYXJJbmplY3RTY3JvbGxHZXN0dXJlcyk7Ci19Ci0KIHZvaWQgU2Nyb2xsYmFyOjpJbmplY3RTY3JvbGxHZXN0dXJlRm9yUHJlc3NlZFBhcnQoCiAgICAgV2ViSW5wdXRFdmVudDo6VHlwZSBnZXN0dXJlX3R5cGUpIHsKICAgU2Nyb2xsT2Zmc2V0IGRlbHRhID0gVG9TY3JvbGxEZWx0YShQcmVzc2VkUGFydFNjcm9sbERpcmVjdGlvblBoeXNpY2FsKCksIDEpOwpAQCAtNjI2LDcgKzU5NCw2IEBACiB2b2lkIFNjcm9sbGJhcjo6SW5qZWN0U2Nyb2xsR2VzdHVyZShXZWJJbnB1dEV2ZW50OjpUeXBlIGdlc3R1cmVfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjcm9sbE9mZnNldCBkZWx0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjcm9sbEdyYW51bGFyaXR5IGdyYW51bGFyaXR5KSB7Ci0gIERDSEVDSyhJc1Njcm9sbEdlc3R1cmVJbmplY3Rpb25FbmFibGVkKCkpOwogICBEQ0hFQ0soc2Nyb2xsYWJsZV9hcmVhXyk7CiAKICAgaWYgKGdlc3R1cmVfdHlwZSA9PSBXZWJJbnB1dEV2ZW50OjpUeXBlOjprR2VzdHVyZVNjcm9sbEVuZCAmJgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvY29yZS9zY3JvbGwvc2Nyb2xsYmFyLmggYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL3Njcm9sbC9zY3JvbGxiYXIuaAppbmRleCBmMmQ3NzNjLi44MTEzMjJkIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL3Njcm9sbC9zY3JvbGxiYXIuaAorKysgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL3Njcm9sbC9zY3JvbGxiYXIuaApAQCAtMjEyLDcgKzIxMiw2IEBACiAgIHZvaWQgU3RvcFRpbWVySWZOZWVkZWQoKTsKICAgdm9pZCBBdXRvc2Nyb2xsUHJlc3NlZFBhcnQoYmFzZTo6VGltZURlbHRhIGRlbGF5KTsKICAgYm9vbCBIYW5kbGVUYXBHZXN0dXJlKCk7Ci0gIGJvb2wgSXNTY3JvbGxHZXN0dXJlSW5qZWN0aW9uRW5hYmxlZCgpIGNvbnN0OwogICB2b2lkIEluamVjdFNjcm9sbEdlc3R1cmVGb3JQcmVzc2VkUGFydChXZWJJbnB1dEV2ZW50OjpUeXBlIGdlc3R1cmVfdHlwZSk7CiAgIHZvaWQgSW5qZWN0R2VzdHVyZVNjcm9sbFVwZGF0ZUZvclRodW1iTW92ZShmbG9hdCBzaW5nbGVfYXhpc190YXJnZXRfb2Zmc2V0KTsKICAgdm9pZCBJbmplY3RTY3JvbGxHZXN0dXJlKFdlYklucHV0RXZlbnQ6OlR5cGUgdHlwZSwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvc3ZnL2FuaW1hdGlvbi9zbWlsX2FuaW1hdGlvbl9zYW5kd2ljaC5jYyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvc3ZnL2FuaW1hdGlvbi9zbWlsX2FuaW1hdGlvbl9zYW5kd2ljaC5jYwppbmRleCBhNGQyZDNmLi4yYzE0ZGZkIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL3N2Zy9hbmltYXRpb24vc21pbF9hbmltYXRpb25fc2FuZHdpY2guY2MKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvY29yZS9zdmcvYW5pbWF0aW9uL3NtaWxfYW5pbWF0aW9uX3NhbmR3aWNoLmNjCkBAIC03MCw3ICs3MCw3IEBACiAgIGZvciAoY29uc3QgYXV0byYgYW5pbWF0aW9uIDogc2FuZHdpY2hfKSB7CiAgICAgRENIRUNLKGFuaW1hdGlvbi0+SGFzVmFsaWRUYXJnZXQoKSk7CiAKLSAgICBpZiAoIWFuaW1hdGlvbi0+Q3VycmVudEludGVydmFsSXNBY3RpdmUoZWxhcHNlZCkpCisgICAgaWYgKCFhbmltYXRpb24tPk5lZWRzSW50ZXJ2YWxVcGRhdGUoZWxhcHNlZCkpCiAgICAgICBjb250aW51ZTsKICAgICBhbmltYXRpb24tPlVwZGF0ZUludGVydmFsKGVsYXBzZWQpOwogICB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL3N2Zy9hbmltYXRpb24vc3ZnX3NtaWxfZWxlbWVudC5jYyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvc3ZnL2FuaW1hdGlvbi9zdmdfc21pbF9lbGVtZW50LmNjCmluZGV4IDI0ODQyZjcuLmQwMDk1MTIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvc3ZnL2FuaW1hdGlvbi9zdmdfc21pbF9lbGVtZW50LmNjCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvc3ZnL2FuaW1hdGlvbi9zdmdfc21pbF9lbGVtZW50LmNjCkBAIC0xODgsNyArMTg4LDcgQEAKICAgICAgIGlzX3NjaGVkdWxlZF8oZmFsc2UpLAogICAgICAgaW50ZXJ2YWxfe1NNSUxUaW1lOjpVbnJlc29sdmVkKCksIFNNSUxUaW1lOjpVbnJlc29sdmVkKCl9LAogICAgICAgcHJldmlvdXNfaW50ZXJ2YWxfe1NNSUxUaW1lOjpVbnJlc29sdmVkKCksIFNNSUxUaW1lOjpVbnJlc29sdmVkKCl9LAotICAgICAgbmV4dF9pbnRlcnZhbF90aW1lXyhTTUlMVGltZTo6VW5yZXNvbHZlZCgpKSwKKyAgICAgIG5leHRfaW50ZXJ2YWxfdGltZV8oU01JTFRpbWU6OkVhcmxpZXN0KCkpLAogICAgICAgYWN0aXZlX3N0YXRlXyhrSW5hY3RpdmUpLAogICAgICAgcmVzdGFydF8oa1Jlc3RhcnRBbHdheXMpLAogICAgICAgZmlsbF8oa0ZpbGxSZW1vdmUpLApAQCAtMjU3LDkgKzI1Nyw4IEBACiAgIGlzX3dhaXRpbmdfZm9yX2ZpcnN0X2ludGVydmFsXyA9IHRydWU7CiAgIGludGVydmFsXyA9IHtTTUlMVGltZTo6VW5yZXNvbHZlZCgpLCBTTUlMVGltZTo6VW5yZXNvbHZlZCgpfTsKICAgcHJldmlvdXNfaW50ZXJ2YWxfID0ge1NNSUxUaW1lOjpVbnJlc29sdmVkKCksIFNNSUxUaW1lOjpVbnJlc29sdmVkKCl9OwotICBuZXh0X2ludGVydmFsX3RpbWVfID0gU01JTFRpbWU6OlVucmVzb2x2ZWQoKTsKKyAgbmV4dF9pbnRlcnZhbF90aW1lXyA9IFNNSUxUaW1lOjpFYXJsaWVzdCgpOwogICBsYXN0X3Byb2dyZXNzXyA9IHswLjBmLCAwfTsKLSAgUmVzb2x2ZUZpcnN0SW50ZXJ2YWwoU01JTFRpbWUoKSk7CiB9CiAKIE5vZGU6Okluc2VydGlvbk5vdGlmaWNhdGlvblJlcXVlc3QgU1ZHU01JTEVsZW1lbnQ6Okluc2VydGVkSW50bygKQEAgLTgxOSwxNSArODE4LDYgQEAKICAgcmV0dXJuIFNNSUxJbnRlcnZhbChTTUlMVGltZTo6VW5yZXNvbHZlZCgpLCBTTUlMVGltZTo6VW5yZXNvbHZlZCgpKTsKIH0KIAotYm9vbCBTVkdTTUlMRWxlbWVudDo6UmVzb2x2ZUZpcnN0SW50ZXJ2YWwoU01JTFRpbWUgcHJlc2VudGF0aW9uX3RpbWUpIHsKLSAgU01JTEludGVydmFsIGZpcnN0X2ludGVydmFsID0KLSAgICAgIFJlc29sdmVJbnRlcnZhbChTTUlMVGltZTo6RWFybGllc3QoKSwgcHJlc2VudGF0aW9uX3RpbWUpOwotICBpZiAoIWZpcnN0X2ludGVydmFsLklzUmVzb2x2ZWQoKSB8fCBmaXJzdF9pbnRlcnZhbCA9PSBpbnRlcnZhbF8pCi0gICAgcmV0dXJuIGZhbHNlOwotICBTZXROZXdJbnRlcnZhbChmaXJzdF9pbnRlcnZhbCwgcHJlc2VudGF0aW9uX3RpbWUpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQogdm9pZCBTVkdTTUlMRWxlbWVudDo6U2V0TmV3SW50ZXJ2YWwoY29uc3QgU01JTEludGVydmFsJiBpbnRlcnZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNSUxUaW1lIHByZXNlbnRhdGlvbl90aW1lKSB7CiAgIGludGVydmFsXyA9IGludGVydmFsOwpAQCAtODczLDE0ICs4NjMsOCBAQAogICBTTUlMVGltZSBjdXJyZW50X3ByZXNlbnRhdGlvbl90aW1lID0KICAgICAgIHRpbWVfY29udGFpbmVyXyA/IHRpbWVfY29udGFpbmVyXy0+Q3VycmVudERvY3VtZW50VGltZSgpIDogU01JTFRpbWUoKTsKICAgRENIRUNLKCFjdXJyZW50X3ByZXNlbnRhdGlvbl90aW1lLklzVW5yZXNvbHZlZCgpKTsKLSAgaWYgKGlzX3dhaXRpbmdfZm9yX2ZpcnN0X2ludGVydmFsXykgewotICAgIGluc3RhbmNlX2xpc3RzX2hhdmVfY2hhbmdlZF8gPSBmYWxzZTsKLSAgICBSZXNvbHZlRmlyc3RJbnRlcnZhbChjdXJyZW50X3ByZXNlbnRhdGlvbl90aW1lKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgU01JTEludGVydmFsIG9sZF9pbnRlcnZhbCA9IGludGVydmFsXzsKICAgVXBkYXRlSW50ZXJ2YWwoY3VycmVudF9wcmVzZW50YXRpb25fdGltZSk7Ci0gIGlmIChpbnRlcnZhbF8gIT0gb2xkX2ludGVydmFsKSB7CisgIGlmIChpbnRlcnZhbF9oYXNfY2hhbmdlZF8pIHsKICAgICBpZiAoR2V0QWN0aXZlU3RhdGUoKSA9PSBrQWN0aXZlICYmCiAgICAgICAgIGludGVydmFsXy5CZWdpbnNBZnRlcihjdXJyZW50X3ByZXNlbnRhdGlvbl90aW1lKSkgewogICAgICAgYWN0aXZlX3N0YXRlXyA9IERldGVybWluZUFjdGl2ZVN0YXRlKGN1cnJlbnRfcHJlc2VudGF0aW9uX3RpbWUpOwpAQCAtOTE0LDcgKzg5OCw3IEBACiAKIGJvb2wgU1ZHU01JTEVsZW1lbnQ6OkhhbmRsZUludGVydmFsUmVzdGFydChTTUlMVGltZSBwcmVzZW50YXRpb25fdGltZSkgewogICBSZXN0YXJ0IHJlc3RhcnQgPSBHZXRSZXN0YXJ0KCk7Ci0gIGlmIChyZXN0YXJ0ID09IGtSZXN0YXJ0TmV2ZXIpCisgIGlmICghaXNfd2FpdGluZ19mb3JfZmlyc3RfaW50ZXJ2YWxfICYmIHJlc3RhcnQgPT0ga1Jlc3RhcnROZXZlcikKICAgICByZXR1cm4gZmFsc2U7CiAgIGlmICghaW50ZXJ2YWxfLklzUmVzb2x2ZWQoKSB8fCBpbnRlcnZhbF8uRW5kc0JlZm9yZShwcmVzZW50YXRpb25fdGltZSkpCiAgICAgcmV0dXJuIHRydWU7CkBAIC05MjksNyArOTEzLDYgQEAKIH0KIAogdm9pZCBTVkdTTUlMRWxlbWVudDo6VXBkYXRlSW50ZXJ2YWwoU01JTFRpbWUgcHJlc2VudGF0aW9uX3RpbWUpIHsKLSAgRENIRUNLKCFpc193YWl0aW5nX2Zvcl9maXJzdF9pbnRlcnZhbF8pOwogICBpZiAoaW5zdGFuY2VfbGlzdHNfaGF2ZV9jaGFuZ2VkXykgewogICAgIGluc3RhbmNlX2xpc3RzX2hhdmVfY2hhbmdlZF8gPSBmYWxzZTsKICAgICBEaXNjYXJkT3JSZXZhbGlkYXRlQ3VycmVudEludGVydmFsKHByZXNlbnRhdGlvbl90aW1lKTsKQEAgLTkzNyw3ICs5MjAsOSBAQAogICBpZiAoIUhhbmRsZUludGVydmFsUmVzdGFydChwcmVzZW50YXRpb25fdGltZSkpCiAgICAgcmV0dXJuOwogICBTTUlMVGltZSBiZWdpbl9hZnRlciA9Ci0gICAgICBpbnRlcnZhbF8uSXNSZXNvbHZlZCgpID8gaW50ZXJ2YWxfLmVuZCA6IFNNSUxUaW1lOjpFYXJsaWVzdCgpOworICAgICAgIWlzX3dhaXRpbmdfZm9yX2ZpcnN0X2ludGVydmFsXyAmJiBpbnRlcnZhbF8uSXNSZXNvbHZlZCgpCisgICAgICAgICAgPyBpbnRlcnZhbF8uZW5kCisgICAgICAgICAgOiBTTUlMVGltZTo6RWFybGllc3QoKTsKICAgU01JTEludGVydmFsIG5leHRfaW50ZXJ2YWwgPSBSZXNvbHZlSW50ZXJ2YWwoYmVnaW5fYWZ0ZXIsIHByZXNlbnRhdGlvbl90aW1lKTsKICAgaWYgKCFuZXh0X2ludGVydmFsLklzUmVzb2x2ZWQoKSB8fCBuZXh0X2ludGVydmFsID09IGludGVydmFsXykKICAgICByZXR1cm47CkBAIC05NTAsOCArOTM1LDcgQEAKIHZvaWQgU1ZHU01JTEVsZW1lbnQ6OkFkZGVkVG9UaW1lQ29udGFpbmVyKCkgewogICBEQ0hFQ0sodGltZV9jb250YWluZXJfKTsKICAgU01JTFRpbWUgY3VycmVudF9wcmVzZW50YXRpb25fdGltZSA9IHRpbWVfY29udGFpbmVyXy0+Q3VycmVudERvY3VtZW50VGltZSgpOwotICBpZiAoaXNfd2FpdGluZ19mb3JfZmlyc3RfaW50ZXJ2YWxfKQotICAgIFJlc29sdmVGaXJzdEludGVydmFsKGN1cnJlbnRfcHJlc2VudGF0aW9uX3RpbWUpOworICBVcGRhdGVJbnRlcnZhbChjdXJyZW50X3ByZXNlbnRhdGlvbl90aW1lKTsKIAogICBpZiAoSW50ZXJ2YWxCZWdpbigpIDw9IGN1cnJlbnRfcHJlc2VudGF0aW9uX3RpbWUgfHwKICAgICAgIE5leHRQcm9ncmVzc1RpbWUoY3VycmVudF9wcmVzZW50YXRpb25fdGltZSkuSXNGaW5pdGUoKSkgewpAQCAtMTA2OSwzNiArMTA1MywxMiBAQAogICAgICAgICAgR2V0QWN0aXZlU3RhdGUoKSA9PSBrRnJvemVuOwogfQogCi1ib29sIFNWR1NNSUxFbGVtZW50OjpDdXJyZW50SW50ZXJ2YWxJc0FjdGl2ZShTTUlMVGltZSBlbGFwc2VkKSB7Citib29sIFNWR1NNSUxFbGVtZW50OjpOZWVkc0ludGVydmFsVXBkYXRlKFNNSUxUaW1lIGVsYXBzZWQpIGNvbnN0IHsKICAgLy8gQ2hlY2sgd2UncmUgY29ubmVjdGVkIHRvIHNvbWV0aGluZyBhbmQgdGhhdCBvdXIgY29uZGl0aW9ucyBoYXZlIGJlZW4KICAgLy8gImNvbm5lY3RlZCIuCiAgIERDSEVDSyh0aW1lX2NvbnRhaW5lcl8pOwogICBEQ0hFQ0soY29uZGl0aW9uc19jb25uZWN0ZWRfKTsKLSAgLy8gSWYgfGlzX3dhaXRpbmdfZm9yX2ZpcnN0X2ludGVydmFsX3wgaXMgdHJ1ZSwgfGludGVydmFsX3wgY2FuIGVpdGhlciBiZSB0aGUKLSAgLy8gYWN0dWFsIGludGVydmFsIHRoYXQgaGFzIGJlZW4gcmVzb2x2ZWQsIG9yIHVucmVzb2x2ZWQgaWYgdGhlcmUgYXJlIG5vCi0gIC8vIGJlZ2luIHRpbWVzIHlldC4KLSAgRENIRUNLKGlzX3dhaXRpbmdfZm9yX2ZpcnN0X2ludGVydmFsXyB8fCBpbnRlcnZhbF8uSXNSZXNvbHZlZCgpKTsKLQotICAvLyBObyBpbnRlcnZhbCBoYXMgYmVlbiByZXNvbHZlZCB5ZXQsIHdlJ3JlIHdhaXRpbmcgZm9yIGFuIGV2ZW50IG9mIHNvbWUKLSAgLy8gc29ydC4KLSAgaWYgKCFpbnRlcnZhbF8uSXNSZXNvbHZlZCgpKSB7Ci0gICAgRENIRUNLX0VRKEdldEFjdGl2ZVN0YXRlKCksIGtJbmFjdGl2ZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gV2UgaGF2ZSBhIGN1cnJlbnQgaW50ZXJ2YWwsIGJ1dCBpdCBoYXMgbm90IHN0YXJ0ZWQgeWV0LgotICBpZiAoaW50ZXJ2YWxfLkJlZ2luc0FmdGVyKGVsYXBzZWQpKSB7Ci0gICAgRENIRUNLX05FKEdldEFjdGl2ZVN0YXRlKCksIGtBY3RpdmUpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChpc193YWl0aW5nX2Zvcl9maXJzdF9pbnRlcnZhbF8pIHsKLSAgICAvLyBUaGUgY3VycmVudCBpbnRlcm5hbCBtdXN0IGJlIHRoZSBmaXJzdCwgYW5kIGhhcyBzdGFydGVkLCBzbyBjbGVhciB0aGUgZmxhZyBhbmQgKHJlKXJlc29sdmUuCi0gICAgaXNfd2FpdGluZ19mb3JfZmlyc3RfaW50ZXJ2YWxfID0gZmFsc2U7Ci0gICAgaWYgKFJlc29sdmVGaXJzdEludGVydmFsKGVsYXBzZWQpKQotICAgICAgdGltZV9jb250YWluZXJfLT5NYXJrSW50ZXJ2YWxzRGlydHkoKTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIGVsYXBzZWQgPj0gbmV4dF9pbnRlcnZhbF90aW1lXzsKIH0KIAogdm9pZCBTVkdTTUlMRWxlbWVudDo6VXBkYXRlQWN0aXZlU3RhdGUoU01JTFRpbWUgZWxhcHNlZCkgewpAQCAtMTI0Nyw2ICsxMjA3LDEwIEBACiAgIEFkZEluc3RhbmNlVGltZUFuZFVwZGF0ZShrQmVnaW4sIEVsYXBzZWQoKSwgU01JTFRpbWVPcmlnaW46OmtMaW5rQWN0aXZhdGlvbik7CiB9CiAKK3ZvaWQgU1ZHU01JTEVsZW1lbnQ6OlN0YXJ0ZWRBY3RpdmVJbnRlcnZhbCgpIHsKKyAgaXNfd2FpdGluZ19mb3JfZmlyc3RfaW50ZXJ2YWxfID0gZmFsc2U7Cit9CisKIHZvaWQgU1ZHU01JTEVsZW1lbnQ6OkVuZGVkQWN0aXZlSW50ZXJ2YWwoKSB7CiAgIFJlbW92ZUluc3RhbmNlVGltZXNXaXRoT3JpZ2luKGJlZ2luX3RpbWVzXywgU01JTFRpbWVPcmlnaW46OmtTY3JpcHQpOwogICBSZW1vdmVJbnN0YW5jZVRpbWVzV2l0aE9yaWdpbihlbmRfdGltZXNfLCBTTUlMVGltZU9yaWdpbjo6a1NjcmlwdCk7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL3N2Zy9hbmltYXRpb24vc3ZnX3NtaWxfZWxlbWVudC5oIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvY29yZS9zdmcvYW5pbWF0aW9uL3N2Z19zbWlsX2VsZW1lbnQuaAppbmRleCBkY2ZmZjcyLi4wMDMxYWIwIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL3N2Zy9hbmltYXRpb24vc3ZnX3NtaWxfZWxlbWVudC5oCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvc3ZnL2FuaW1hdGlvbi9zdmdfc21pbF9lbGVtZW50LmgKQEAgLTg0LDcgKzg0LDcgQEAKICAgU01JTFRpbWUgSW50ZXJ2YWxCZWdpbigpIGNvbnN0IHsgcmV0dXJuIGludGVydmFsXy5iZWdpbjsgfQogICBTTUlMVGltZSBTaW1wbGVEdXJhdGlvbigpIGNvbnN0OwogCi0gIGJvb2wgQ3VycmVudEludGVydmFsSXNBY3RpdmUoU01JTFRpbWUgZWxhcHNlZCk7CisgIGJvb2wgTmVlZHNJbnRlcnZhbFVwZGF0ZShTTUlMVGltZSBlbGFwc2VkKSBjb25zdDsKICAgdm9pZCBVcGRhdGVJbnRlcnZhbChTTUlMVGltZSBwcmVzZW50YXRpb25fdGltZSk7CiAgIHZvaWQgVXBkYXRlQWN0aXZlU3RhdGUoU01JTFRpbWUgZWxhcHNlZCk7CiAgIHZvaWQgVXBkYXRlUHJvZ3Jlc3NTdGF0ZShTTUlMVGltZSBwcmVzZW50YXRpb25fdGltZSk7CkBAIC0xNDEsNiArMTQxLDggQEAKICAgdmlydHVhbCB2b2lkIFdpbGxDaGFuZ2VBbmltYXRpb25UYXJnZXQoKTsKICAgdmlydHVhbCB2b2lkIERpZENoYW5nZUFuaW1hdGlvblRhcmdldCgpOwogCisgIHZpcnR1YWwgdm9pZCBTdGFydGVkQWN0aXZlSW50ZXJ2YWwoKTsKKwogICBRdWFsaWZpZWROYW1lIGF0dHJpYnV0ZV9uYW1lXzsKIAogIHByaXZhdGU6CkBAIC0xNDgsNyArMTUwLDYgQEAKICAgdm9pZCBDbGVhclJlc291cmNlQW5kRXZlbnRCYXNlUmVmZXJlbmNlcygpOwogICB2b2lkIENsZWFyQ29uZGl0aW9ucygpOwogCi0gIHZpcnR1YWwgdm9pZCBTdGFydGVkQWN0aXZlSW50ZXJ2YWwoKSA9IDA7CiAgIHZvaWQgRW5kZWRBY3RpdmVJbnRlcnZhbCgpOwogICB2aXJ0dWFsIHZvaWQgVXBkYXRlQW5pbWF0aW9uKGZsb2F0IHBlcmNlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcmVwZWF0LApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvY29yZS9zdmcvc3ZnX2FuaW1hdGlvbl9lbGVtZW50LmNjIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvY29yZS9zdmcvc3ZnX2FuaW1hdGlvbl9lbGVtZW50LmNjCmluZGV4IDQzMGRhZGEuLjAwNDBkMGEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvc3ZnL3N2Z19hbmltYXRpb25fZWxlbWVudC5jYworKysgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL3N2Zy9zdmdfYW5pbWF0aW9uX2VsZW1lbnQuY2MKQEAgLTUyOSw2ICs1MjksOCBAQAogfQogCiB2b2lkIFNWR0FuaW1hdGlvbkVsZW1lbnQ6OlN0YXJ0ZWRBY3RpdmVJbnRlcnZhbCgpIHsKKyAgU1ZHU01JTEVsZW1lbnQ6OlN0YXJ0ZWRBY3RpdmVJbnRlcnZhbCgpOworCiAgIGFuaW1hdGlvbl92YWxpZF8gPSBmYWxzZTsKIAogICBpZiAoIUlzVmFsaWQoKSB8fCAhSGFzVmFsaWRUYXJnZXQoKSkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvc3ZnL3N2Z19kaXNjYXJkX2VsZW1lbnQuaCBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvc3ZnL3N2Z19kaXNjYXJkX2VsZW1lbnQuaAppbmRleCBhZGUwOThiLi5kZmZjZjUyIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL3N2Zy9zdmdfZGlzY2FyZF9lbGVtZW50LmgKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvY29yZS9zdmcvc3ZnX2Rpc2NhcmRfZWxlbWVudC5oCkBAIC01MSw3ICs1MSw2IEBACiAKICAgYm9vbCBPdmVyd3JpdGVzVW5kZXJseWluZ0FuaW1hdGlvblZhbHVlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KIAotICB2b2lkIFN0YXJ0ZWRBY3RpdmVJbnRlcnZhbCgpIG92ZXJyaWRlIHt9CiAgIHZvaWQgVXBkYXRlQW5pbWF0aW9uKGZsb2F0IHBlcmNlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHJlcGVhdCwKICAgICAgICAgICAgICAgICAgICAgICAgU1ZHU01JTEVsZW1lbnQqIHJlc3VsdF9lbGVtZW50KSBvdmVycmlkZSB7fQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvY29yZS90ZXN0aW5nL2ludGVybmFscy5jYyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvdGVzdGluZy9pbnRlcm5hbHMuY2MKaW5kZXggMzNhZjI4Y2IuLjVhNzkxN2FlIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL3Rlc3RpbmcvaW50ZXJuYWxzLmNjCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvdGVzdGluZy9pbnRlcm5hbHMuY2MKQEAgLTE3OTgsOSArMTc5OCw5IEBACiAgIGNvbnN0IGNjOjpUb3VjaEFjdGlvblJlZ2lvbiYgdG91Y2hfYWN0aW9uX3JlZ2lvbiA9CiAgICAgICBncmFwaGljc19sYXllci0+Q2NMYXllcigpLT50b3VjaF9hY3Rpb25fcmVnaW9uKCk7CiAgIGlmICghdG91Y2hfYWN0aW9uX3JlZ2lvbi5HZXRBbGxSZWdpb25zKCkuSXNFbXB0eSgpKSB7Ci0gICAgY29uc3QgYXV0byYgbGF5ZXJfcG9zaXRpb24gPSBncmFwaGljc19sYXllci0+Q2NMYXllcigpLT5wb3NpdGlvbigpOworICAgIGNvbnN0IGF1dG8mIGxheWVyX3Bvc2l0aW9uID0gZ3JhcGhpY3NfbGF5ZXItPkdldE9mZnNldEZyb21UcmFuc2Zvcm1Ob2RlKCk7CiAgICAgY29uc3QgYXV0byYgbGF5ZXJfYm91bmRzID0gZ3JhcGhpY3NfbGF5ZXItPkNjTGF5ZXIoKS0+Ym91bmRzKCk7Ci0gICAgSW50UmVjdCBsYXllcl9yZWN0KGxheWVyX3Bvc2l0aW9uLngoKSwgbGF5ZXJfcG9zaXRpb24ueSgpLAorICAgIEludFJlY3QgbGF5ZXJfcmVjdChsYXllcl9wb3NpdGlvbi5YKCksIGxheWVyX3Bvc2l0aW9uLlkoKSwKICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJfYm91bmRzLndpZHRoKCksIGxheWVyX2JvdW5kcy5oZWlnaHQoKSk7CiAKICAgICBWZWN0b3I8SW50UmVjdD4gbGF5ZXJfaGl0X3Rlc3RfcmVjdHM7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL3RpbWluZy9wZXJmb3JtYW5jZS5jYyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvdGltaW5nL3BlcmZvcm1hbmNlLmNjCmluZGV4IDgzYzA1NjQuLmFhZDM5Y2FmIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL3RpbWluZy9wZXJmb3JtYW5jZS5jYworKysgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL3RpbWluZy9wZXJmb3JtYW5jZS5jYwpAQCAtNjQ0LDE0ICs2NDQsMTIgQEAKIAogUGVyZm9ybWFuY2VNYXJrKiBQZXJmb3JtYW5jZTo6bWFyayhTY3JpcHRTdGF0ZSogc2NyaXB0X3N0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIG1hcmtfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uU3RhdGUmIGV4Y2VwdGlvbl9zdGF0ZSkgewotICByZXR1cm4gbWFyayhzY3JpcHRfc3RhdGUsIG1hcmtfbmFtZSwgbnVsbHB0ciwgZXhjZXB0aW9uX3N0YXRlKTsKLX0KLQotUGVyZm9ybWFuY2VNYXJrKiBQZXJmb3JtYW5jZTo6bWFyayhTY3JpcHRTdGF0ZSogc2NyaXB0X3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIG1hcmtfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybWFuY2VNYXJrT3B0aW9ucyogbWFya19vcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb25TdGF0ZSYgZXhjZXB0aW9uX3N0YXRlKSB7CisgIGlmIChtYXJrX29wdGlvbnMgJiYKKyAgICAgIChtYXJrX29wdGlvbnMtPmhhc1N0YXJ0VGltZSgpIHx8IG1hcmtfb3B0aW9ucy0+aGFzRGV0YWlsKCkpKSB7CisgICAgVXNlQ291bnRlcjo6Q291bnQoR2V0RXhlY3V0aW9uQ29udGV4dCgpLCBXZWJGZWF0dXJlOjprVXNlclRpbWluZ0wzKTsKKyAgfQogICBQZXJmb3JtYW5jZU1hcmsqIHBlcmZvcm1hbmNlX21hcmsgPSBHZXRVc2VyVGltaW5nKCkuQ3JlYXRlUGVyZm9ybWFuY2VNYXJrKAogICAgICAgc2NyaXB0X3N0YXRlLCBtYXJrX25hbWUsIG1hcmtfb3B0aW9ucywgZXhjZXB0aW9uX3N0YXRlKTsKICAgaWYgKHBlcmZvcm1hbmNlX21hcmspIHsKQEAgLTcyMyw2ICs3MjEsNyBAQAogICBpZiAoc3RhcnRfb3Jfb3B0aW9ucy5Jc1BlcmZvcm1hbmNlTWVhc3VyZU9wdGlvbnMoKSAmJgogICAgICAgIUlzTWVhc3VyZU9wdGlvbnNFbXB0eSgKICAgICAgICAgICAqc3RhcnRfb3Jfb3B0aW9ucy5HZXRBc1BlcmZvcm1hbmNlTWVhc3VyZU9wdGlvbnMoKSkpIHsKKyAgICBVc2VDb3VudGVyOjpDb3VudChHZXRFeGVjdXRpb25Db250ZXh0KCksIFdlYkZlYXR1cmU6OmtVc2VyVGltaW5nTDMpOwogICAgIC8vIG1lYXN1cmUoIm5hbWUiLCB7IHN0YXJ0LCBlbmQgfSwgKikKICAgICBpZiAoZW5kX21hcmspIHsKICAgICAgIGV4Y2VwdGlvbl9zdGF0ZS5UaHJvd1R5cGVFcnJvcigKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvdGltaW5nL3BlcmZvcm1hbmNlLmggYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL3RpbWluZy9wZXJmb3JtYW5jZS5oCmluZGV4IDBjZDAyNDUuLjNlZGFjYWUzIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL3RpbWluZy9wZXJmb3JtYW5jZS5oCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvdGltaW5nL3BlcmZvcm1hbmNlLmgKQEAgLTE4OCwxMCArMTg4LDYgQEAKIAogICBQZXJmb3JtYW5jZU1hcmsqIG1hcmsoU2NyaXB0U3RhdGUqLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXRvbWljU3RyaW5nJiBtYXJrX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb25TdGF0ZSYpOwotCi0gIFBlcmZvcm1hbmNlTWFyayogbWFyayhTY3JpcHRTdGF0ZSosCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIG1hcmtfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1hbmNlTWFya09wdGlvbnMqIG1hcmtfb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvblN0YXRlJik7CiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvdGltaW5nL3dpbmRvd19wZXJmb3JtYW5jZV90ZXN0LmNjIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvY29yZS90aW1pbmcvd2luZG93X3BlcmZvcm1hbmNlX3Rlc3QuY2MKaW5kZXggOGZlN2I5NTYuLjVlN2JmM2Y1IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL3RpbWluZy93aW5kb3dfcGVyZm9ybWFuY2VfdGVzdC5jYworKysgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL3RpbWluZy93aW5kb3dfcGVyZm9ybWFuY2VfdGVzdC5jYwpAQCAtMjA1LDEyICsyMDUsMTIgQEAKICAgRHVtbXlFeGNlcHRpb25TdGF0ZUZvclRlc3RpbmcgZXhjZXB0aW9uX3N0YXRlOwogICB0ZXN0X3Rhc2tfcnVubmVyXy0+RmFzdEZvcndhcmRCeShiYXNlOjpUaW1lRGVsdGE6OkZyb21TZWNvbmRzKDIpKTsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHsKLSAgICBwZXJmb3JtYW5jZV8tPm1hcmsoc2NvcGUuR2V0U2NyaXB0U3RhdGUoKSwgQXRvbWljU3RyaW5nOjpOdW1iZXIoaSksCisgICAgcGVyZm9ybWFuY2VfLT5tYXJrKHNjb3BlLkdldFNjcmlwdFN0YXRlKCksIEF0b21pY1N0cmluZzo6TnVtYmVyKGkpLCBudWxscHRyLAogICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25fc3RhdGUpOwogICB9CiAgIHRlc3RfdGFza19ydW5uZXJfLT5GYXN0Rm9yd2FyZEJ5KGJhc2U6OlRpbWVEZWx0YTo6RnJvbVNlY29uZHMoMikpOwogICBmb3IgKGludCBpID0gODsgaSA8IDE3OyBpKyspIHsKLSAgICBwZXJmb3JtYW5jZV8tPm1hcmsoc2NvcGUuR2V0U2NyaXB0U3RhdGUoKSwgQXRvbWljU3RyaW5nOjpOdW1iZXIoaSksCisgICAgcGVyZm9ybWFuY2VfLT5tYXJrKHNjb3BlLkdldFNjcmlwdFN0YXRlKCksIEF0b21pY1N0cmluZzo6TnVtYmVyKGkpLCBudWxscHRyLAogICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25fc3RhdGUpOwogICB9CiAgIFBlcmZvcm1hbmNlRW50cnlWZWN0b3IgZW50cmllcyA9IHBlcmZvcm1hbmNlXy0+Z2V0RW50cmllcygpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvY29yZS93b3JrZXJzL2RlZGljYXRlZF93b3JrZXJfZ2xvYmFsX3Njb3BlLmNjIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvY29yZS93b3JrZXJzL2RlZGljYXRlZF93b3JrZXJfZ2xvYmFsX3Njb3BlLmNjCmluZGV4IDhmMjc3NWUuLmFiNzFiMjIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvd29ya2Vycy9kZWRpY2F0ZWRfd29ya2VyX2dsb2JhbF9zY29wZS5jYworKysgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL3dvcmtlcnMvZGVkaWNhdGVkX3dvcmtlcl9nbG9iYWxfc2NvcGUuY2MKQEAgLTQ0LDcgKzQ0LDYgQEAKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL21lc3NhZ2luZy9wb3N0X21lc3NhZ2Vfb3B0aW9ucy5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvb3JpZ2luX3RyaWFscy9vcmlnaW5fdHJpYWxfY29udGV4dC5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvcHJvYmUvY29yZV9wcm9iZXMuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL3NjcmlwdC9tb2R1bGF0b3IuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL3dvcmtlcnMvZGVkaWNhdGVkX3dvcmtlcl9vYmplY3RfcHJveHkuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL3dvcmtlcnMvZGVkaWNhdGVkX3dvcmtlcl90aHJlYWQuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL3dvcmtlcnMvZ2xvYmFsX3Njb3BlX2NyZWF0aW9uX3BhcmFtcy5oIgpAQCAtMjA5LDggKzIwOCw2IEBACiAgIC8vICJ3b3JrZXIiIG90aGVyd2lzZS4iCiAgIG1vam9tOjpSZXF1ZXN0Q29udGV4dFR5cGUgZGVzdGluYXRpb24gPSBtb2pvbTo6UmVxdWVzdENvbnRleHRUeXBlOjpXT1JLRVI7CiAKLSAgTW9kdWxhdG9yKiBtb2R1bGF0b3IgPSBNb2R1bGF0b3I6OkZyb20oU2NyaXB0Q29udHJvbGxlcigpLT5HZXRTY3JpcHRTdGF0ZSgpKTsKLQogICAvLyBTdGVwIDEzOiAiLi4uIEZldGNoIGEgbW9kdWxlIHdvcmtlciBzY3JpcHQgZ3JhcGggZ2l2ZW4gdXJsLCBvdXRzaWRlCiAgIC8vIHNldHRpbmdzLCBkZXN0aW5hdGlvbiwgdGhlIHZhbHVlIG9mIHRoZSBjcmVkZW50aWFscyBtZW1iZXIgb2Ygb3B0aW9ucywgYW5kCiAgIC8vIGluc2lkZSBzZXR0aW5ncy4iCkBAIC0yMTgsNyArMjE1LDggQEAKICAgICAgICAgICAgICAgICAgICAgb3V0c2lkZV9yZXNvdXJjZV90aW1pbmdfbm90aWZpZXIsIGRlc3RpbmF0aW9uLAogICAgICAgICAgICAgICAgICAgICBjcmVkZW50aWFsc19tb2RlLAogICAgICAgICAgICAgICAgICAgICBNb2R1bGVTY3JpcHRDdXN0b21GZXRjaFR5cGU6OmtXb3JrZXJDb25zdHJ1Y3RvciwKLSAgICAgICAgICAgICAgICAgICAgTWFrZUdhcmJhZ2VDb2xsZWN0ZWQ8V29ya2VyTW9kdWxlVHJlZUNsaWVudD4obW9kdWxhdG9yKSk7CisgICAgICAgICAgICAgICAgICAgIE1ha2VHYXJiYWdlQ29sbGVjdGVkPFdvcmtlck1vZHVsZVRyZWVDbGllbnQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0Q29udHJvbGxlcigpLT5HZXRTY3JpcHRTdGF0ZSgpKSk7CiB9CiAKIGNvbnN0IFN0cmluZyBEZWRpY2F0ZWRXb3JrZXJHbG9iYWxTY29wZTo6bmFtZSgpIGNvbnN0IHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvd29ya2Vycy93b3JrZXJfbW9kdWxlX3RyZWVfY2xpZW50LmNjIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvY29yZS93b3JrZXJzL3dvcmtlcl9tb2R1bGVfdHJlZV9jbGllbnQuY2MKaW5kZXggN2JkNzQ1ZC4uOGM3NWI2NSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvY29yZS93b3JrZXJzL3dvcmtlcl9tb2R1bGVfdHJlZV9jbGllbnQuY2MKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvY29yZS93b3JrZXJzL3dvcmtlcl9tb2R1bGVfdHJlZV9jbGllbnQuY2MKQEAgLTEyLDE3ICsxMiwxNiBAQAogCiBuYW1lc3BhY2UgYmxpbmsgewogCi1Xb3JrZXJNb2R1bGVUcmVlQ2xpZW50OjpXb3JrZXJNb2R1bGVUcmVlQ2xpZW50KE1vZHVsYXRvciogbW9kdWxhdG9yKQotICAgIDogbW9kdWxhdG9yXyhtb2R1bGF0b3IpIHt9CitXb3JrZXJNb2R1bGVUcmVlQ2xpZW50OjpXb3JrZXJNb2R1bGVUcmVlQ2xpZW50KFNjcmlwdFN0YXRlKiBzY3JpcHRfc3RhdGUpCisgICAgOiBzY3JpcHRfc3RhdGVfKHNjcmlwdF9zdGF0ZSkge30KIAogLy8gQSBwYXJ0aWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSAiUHJvY2Vzc2luZyBtb2RlbCIgYWxnb3JpdGhtIGluIHRoZSBIVE1MCiAvLyBXZWJXb3JrZXIgc3BlYzoKIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvQy8jd29ya2VyLXByb2Nlc3NpbmctbW9kZWwKIHZvaWQgV29ya2VyTW9kdWxlVHJlZUNsaWVudDo6Tm90aWZ5TW9kdWxlVHJlZUxvYWRGaW5pc2hlZCgKICAgICBNb2R1bGVTY3JpcHQqIG1vZHVsZV9zY3JpcHQpIHsKLSAgYXV0byogZXhlY3V0aW9uX2NvbnRleHQgPQotICAgICAgRXhlY3V0aW9uQ29udGV4dDo6RnJvbShtb2R1bGF0b3JfLT5HZXRTY3JpcHRTdGF0ZSgpKTsKLSAgYXV0byogd29ya2VyX2dsb2JhbF9zY29wZSA9IFRvPFdvcmtlckdsb2JhbFNjb3BlPihleGVjdXRpb25fY29udGV4dCk7CisgIGF1dG8qIHdvcmtlcl9nbG9iYWxfc2NvcGUgPQorICAgICAgVG88V29ya2VyR2xvYmFsU2NvcGU+KEV4ZWN1dGlvbkNvbnRleHQ6OkZyb20oc2NyaXB0X3N0YXRlXykpOwogICBibGluazo6V29ya2VyUmVwb3J0aW5nUHJveHkmIHdvcmtlcl9yZXBvcnRpbmdfcHJveHkgPQogICAgICAgd29ya2VyX2dsb2JhbF9zY29wZS0+UmVwb3J0aW5nUHJveHkoKTsKIApAQCAtNTIsNyArNTEsNyBAQAogfQogCiB2b2lkIFdvcmtlck1vZHVsZVRyZWVDbGllbnQ6OlRyYWNlKGJsaW5rOjpWaXNpdG9yKiB2aXNpdG9yKSB7Ci0gIHZpc2l0b3ItPlRyYWNlKG1vZHVsYXRvcl8pOworICB2aXNpdG9yLT5UcmFjZShzY3JpcHRfc3RhdGVfKTsKICAgTW9kdWxlVHJlZUNsaWVudDo6VHJhY2UodmlzaXRvcik7CiB9CiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvd29ya2Vycy93b3JrZXJfbW9kdWxlX3RyZWVfY2xpZW50LmggYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL3dvcmtlcnMvd29ya2VyX21vZHVsZV90cmVlX2NsaWVudC5oCmluZGV4IGY4ZmIwODk0Li5lOTY1NTk1IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL3dvcmtlcnMvd29ya2VyX21vZHVsZV90cmVlX2NsaWVudC5oCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvd29ya2Vycy93b3JrZXJfbW9kdWxlX3RyZWVfY2xpZW50LmgKQEAgLTEyLDExICsxMiwxMiBAQAogbmFtZXNwYWNlIGJsaW5rIHsKIAogY2xhc3MgTW9kdWxlU2NyaXB0OworY2xhc3MgU2NyaXB0U3RhdGU7CiAKIC8vIEEgTW9kdWxlVHJlZUNsaWVudCB0aGF0IGxpdmVzIG9uIHRoZSB3b3JrZXIgY29udGV4dCdzIHRocmVhZC4KIGNsYXNzIENPUkVfRVhQT1JUIFdvcmtlck1vZHVsZVRyZWVDbGllbnQgZmluYWwgOiBwdWJsaWMgTW9kdWxlVHJlZUNsaWVudCB7CiAgcHVibGljOgotICBleHBsaWNpdCBXb3JrZXJNb2R1bGVUcmVlQ2xpZW50KE1vZHVsYXRvciopOworICBleHBsaWNpdCBXb3JrZXJNb2R1bGVUcmVlQ2xpZW50KFNjcmlwdFN0YXRlKik7CiAKICAgLy8gSW1wbGVtZW50cyBNb2R1bGVUcmVlQ2xpZW50LgogICB2b2lkIE5vdGlmeU1vZHVsZVRyZWVMb2FkRmluaXNoZWQoTW9kdWxlU2NyaXB0KikgZmluYWw7CkBAIC0yNCw3ICsyNSw3IEBACiAgIHZvaWQgVHJhY2UoYmxpbms6OlZpc2l0b3IqKSBvdmVycmlkZTsKIAogIHByaXZhdGU6Ci0gIE1lbWJlcjxNb2R1bGF0b3I+IG1vZHVsYXRvcl87CisgIE1lbWJlcjxTY3JpcHRTdGF0ZT4gc2NyaXB0X3N0YXRlXzsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBibGluawpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvZGV2dG9vbHMvZnJvbnRfZW5kL1Rlc3RzLmpzIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvZGV2dG9vbHMvZnJvbnRfZW5kL1Rlc3RzLmpzCmluZGV4IDFiM2Y3MzYuLmM5ZTcxMzkgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2RldnRvb2xzL2Zyb250X2VuZC9UZXN0cy5qcworKysgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9kZXZ0b29scy9mcm9udF9lbmQvVGVzdHMuanMKQEAgLTE0MzcsNiArMTQzNyw3IEBACiAgICAgICAgIGJhc2VVUkwgKyAnZWNob2hlYWRlcj9Db29raWUnLCB1bmRlZmluZWQsIDIwMCwgWydjYWNoZS1jb250cm9sJ10sICdkZXZ0b29scy10ZXN0LWNvb2tpZT1zYW1lLXNpdGUtY29va2llJyk7CiAgICAgYXdhaXQgdGVzdENhc2UoJ2RhdGE6dGV4dC9odG1sLDxib2R5PmhlbGxvPC9ib2R5PicsIHVuZGVmaW5lZCwgMjAwLCBbXSwgJzxib2R5PmhlbGxvPC9ib2R5PicpOwogICAgIGF3YWl0IHRlc3RDYXNlKGZpbGVVUkwsIHVuZGVmaW5lZCwgMjAwLCBbXSwgJzxodG1sPlxuPGJvZHk+XG5EdW1teSBwYWdlLlxuPC9ib2R5PlxuPC9odG1sPlxuJyk7CisgICAgYXdhaXQgdGVzdENhc2UoZmlsZVVSTCArICd0aGlzZmlsZXNob3VsZG5vdGJlZm91bmQnLCB1bmRlZmluZWQsIDQwNCwgW10sICcnKTsKIAogICAgIHRoaXMucmVsZWFzZUNvbnRyb2woKTsKICAgfTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2RldnRvb2xzL2Zyb250X2VuZC9lbGVtZW50cy9Db21wdXRlZFN0eWxlV2lkZ2V0LmpzIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvZGV2dG9vbHMvZnJvbnRfZW5kL2VsZW1lbnRzL0NvbXB1dGVkU3R5bGVXaWRnZXQuanMKaW5kZXggMWE4Y2YwZC4uNzI2ZDVhZCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvZGV2dG9vbHMvZnJvbnRfZW5kL2VsZW1lbnRzL0NvbXB1dGVkU3R5bGVXaWRnZXQuanMKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvZGV2dG9vbHMvZnJvbnRfZW5kL2VsZW1lbnRzL0NvbXB1dGVkU3R5bGVXaWRnZXQuanMKQEAgLTIyNCw2ICsyMjQsOCBAQAogICAgICAgICB0cmVlRWxlbWVudC5saXN0SXRlbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgZSA9PiBlLmNvbnN1bWUoKSwgZmFsc2UpOwogICAgICAgICB0cmVlRWxlbWVudC5saXN0SXRlbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCBlID0+IGUuY29uc3VtZSgpLCBmYWxzZSk7CiAgICAgICAgIHRyZWVFbGVtZW50Lmxpc3RJdGVtRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZUNsaWNrLmJpbmQobnVsbCwgdHJlZUVsZW1lbnQpLCBmYWxzZSk7CisgICAgICAgIHRyZWVFbGVtZW50Lmxpc3RJdGVtRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKAorICAgICAgICAgICAgJ2NvbnRleHRtZW51JywgdGhpcy5faGFuZGxlQ29udGV4dE1lbnVFdmVudC5iaW5kKHRoaXMsIG1hdGNoZWRTdHlsZXMsIGFjdGl2ZVByb3BlcnR5KSk7CiAgICAgICAgIGNvbnN0IGdvdG9Tb3VyY2VFbGVtZW50ID0gVUkuSWNvbi5jcmVhdGUoJ21lZGl1bWljb24tYXJyb3ctaW4tY2lyY2xlJywgJ2dvdG8tc291cmNlLWljb24nKTsKICAgICAgICAgZ290b1NvdXJjZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9uYXZpZ2F0ZVRvU291cmNlLmJpbmQodGhpcywgYWN0aXZlUHJvcGVydHkpKTsKICAgICAgICAgcHJvcGVydHlWYWx1ZUVsZW1lbnQuYXBwZW5kQ2hpbGQoZ290b1NvdXJjZUVsZW1lbnQpOwpAQCAtMzE5LDYgKzMyMSw5IEBACiAKICAgICAgIGNvbnN0IHRyYWNlVHJlZUVsZW1lbnQgPSBuZXcgVUkuVHJlZUVsZW1lbnQoKTsKICAgICAgIHRyYWNlVHJlZUVsZW1lbnQudGl0bGUgPSB0cmFjZTsKKworICAgICAgdHJhY2VUcmVlRWxlbWVudC5saXN0SXRlbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKKyAgICAgICAgICAnY29udGV4dG1lbnUnLCB0aGlzLl9oYW5kbGVDb250ZXh0TWVudUV2ZW50LmJpbmQodGhpcywgbWF0Y2hlZFN0eWxlcywgcHJvcGVydHkpKTsKICAgICAgIHJvb3RUcmVlRWxlbWVudC5hcHBlbmRDaGlsZCh0cmFjZVRyZWVFbGVtZW50KTsKICAgICB9CiAgICAgcmV0dXJuIC8qKiBAdHlwZSB7IVNESy5DU1NQcm9wZXJ0eX0gKi8gKGFjdGl2ZVByb3BlcnR5KTsKQEAgLTMyNiw2ICszMzEsMjggQEAKIAogICAvKioKICAgICogQHBhcmFtIHshU0RLLkNTU01hdGNoZWRTdHlsZXN9IG1hdGNoZWRTdHlsZXMKKyAgICogQHBhcmFtIHshU0RLLkNTU1Byb3BlcnR5fSBwcm9wZXJ0eQorICAgKiBAcGFyYW0geyFFdmVudH0gZXZlbnQKKyAgICovCisgIF9oYW5kbGVDb250ZXh0TWVudUV2ZW50KG1hdGNoZWRTdHlsZXMsIHByb3BlcnR5LCBldmVudCkgeworICAgIGNvbnN0IGNvbnRleHRNZW51ID0gbmV3IFVJLkNvbnRleHRNZW51KGV2ZW50KTsKKyAgICBjb25zdCBydWxlID0gcHJvcGVydHkub3duZXJTdHlsZS5wYXJlbnRSdWxlOworCisgICAgaWYgKHJ1bGUpIHsKKyAgICAgIGNvbnN0IGhlYWRlciA9IHJ1bGUuc3R5bGVTaGVldElkID8gbWF0Y2hlZFN0eWxlcy5jc3NNb2RlbCgpLnN0eWxlU2hlZXRIZWFkZXJGb3JJZChydWxlLnN0eWxlU2hlZXRJZCkgOiBudWxsOworICAgICAgaWYgKGhlYWRlciAmJiAhaGVhZGVyLmlzQW5vbnltb3VzSW5saW5lU3R5bGVTaGVldCgpKSB7CisgICAgICAgIGNvbnRleHRNZW51LmRlZmF1bHRTZWN0aW9uKCkuYXBwZW5kSXRlbShsc2BOYXZpZ2F0ZSB0byBzZWxlY3RvciBzb3VyY2VgLCAoKSA9PiB7CisgICAgICAgICAgRWxlbWVudHMuU3R5bGVQcm9wZXJ0aWVzU2VjdGlvbi50cnlOYXZpZ2F0ZVRvUnVsZUxvY2F0aW9uKG1hdGNoZWRTdHlsZXMsIHJ1bGUpOworICAgICAgICB9KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjb250ZXh0TWVudS5kZWZhdWx0U2VjdGlvbigpLmFwcGVuZEl0ZW0obHNgTmF2aWdhdGUgdG8gc3R5bGVgLCAoKSA9PiBDb21tb24uUmV2ZWFsZXIucmV2ZWFsKHByb3BlcnR5KSk7CisgICAgY29udGV4dE1lbnUuc2hvdygpOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSB7IVNESy5DU1NNYXRjaGVkU3R5bGVzfSBtYXRjaGVkU3R5bGVzCiAgICAqIEByZXR1cm4geyFNYXA8c3RyaW5nLCAhQXJyYXk8IVNESy5DU1NQcm9wZXJ0eT4+fQogICAgKi8KICAgX2NvbXB1dGVQcm9wZXJ0eVRyYWNlcyhtYXRjaGVkU3R5bGVzKSB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9kZXZ0b29scy9mcm9udF9lbmQvZWxlbWVudHMvU3R5bGVzU2lkZWJhclBhbmUuanMgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9kZXZ0b29scy9mcm9udF9lbmQvZWxlbWVudHMvU3R5bGVzU2lkZWJhclBhbmUuanMKaW5kZXggNzc0M2VkMS4uMWQyYTNiNiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvZGV2dG9vbHMvZnJvbnRfZW5kL2VsZW1lbnRzL1N0eWxlc1NpZGViYXJQYW5lLmpzCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2RldnRvb2xzL2Zyb250X2VuZC9lbGVtZW50cy9TdHlsZXNTaWRlYmFyUGFuZS5qcwpAQCAtOTc5LDEyICs5NzksNyBAQAogICAgICAgcmV0dXJuIGNyZWF0ZVRleHROb2RlKCcnKTsKICAgICB9CiAKLSAgICBsZXQgcnVsZUxvY2F0aW9uOwotICAgIGlmIChydWxlIGluc3RhbmNlb2YgU0RLLkNTU1N0eWxlUnVsZSkgewotICAgICAgcnVsZUxvY2F0aW9uID0gcnVsZS5zdHlsZS5yYW5nZTsKLSAgICB9IGVsc2UgaWYgKHJ1bGUgaW5zdGFuY2VvZiBTREsuQ1NTS2V5ZnJhbWVSdWxlKSB7Ci0gICAgICBydWxlTG9jYXRpb24gPSBydWxlLmtleSgpLnJhbmdlOwotICAgIH0KKyAgICBjb25zdCBydWxlTG9jYXRpb24gPSB0aGlzLl9nZXRSdWxlTG9jYXRpb25Gcm9tQ1NTUnVsZShydWxlKTsKIAogICAgIGNvbnN0IGhlYWRlciA9IHJ1bGUuc3R5bGVTaGVldElkID8gbWF0Y2hlZFN0eWxlcy5jc3NNb2RlbCgpLnN0eWxlU2hlZXRIZWFkZXJGb3JJZChydWxlLnN0eWxlU2hlZXRJZCkgOiBudWxsOwogICAgIGlmIChydWxlTG9jYXRpb24gJiYgcnVsZS5zdHlsZVNoZWV0SWQgJiYgaGVhZGVyICYmICFoZWFkZXIuaXNBbm9ueW1vdXNJbmxpbmVTdHlsZVNoZWV0KCkpIHsKQEAgLTEwMTIsNiArMTAwNywzOSBAQAogICB9CiAKICAgLyoqCisgICAqIEBwYXJhbSB7IVNESy5DU1NSdWxlfSBydWxlCisgICAqIEByZXR1cm4gez9UZXh0VXRpbHMuVGV4dFJhbmdlfQorICAgKi8KKyAgc3RhdGljIF9nZXRSdWxlTG9jYXRpb25Gcm9tQ1NTUnVsZShydWxlKSB7CisgICAgbGV0IHJ1bGVMb2NhdGlvbiA9IG51bGw7CisgICAgaWYgKHJ1bGUgaW5zdGFuY2VvZiBTREsuQ1NTU3R5bGVSdWxlKSB7CisgICAgICBydWxlTG9jYXRpb24gPSBydWxlLnN0eWxlLnJhbmdlOworICAgIH0gZWxzZSBpZiAocnVsZSBpbnN0YW5jZW9mIFNESy5DU1NLZXlmcmFtZVJ1bGUpIHsKKyAgICAgIHJ1bGVMb2NhdGlvbiA9IHJ1bGUua2V5KCkucmFuZ2U7CisgICAgfQorICAgIHJldHVybiBydWxlTG9jYXRpb247CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIHshU0RLLkNTU01hdGNoZWRTdHlsZXN9IG1hdGNoZWRTdHlsZXMKKyAgICogQHBhcmFtIHs/U0RLLkNTU1J1bGV9IHJ1bGUKKyAgICovCisgIHN0YXRpYyB0cnlOYXZpZ2F0ZVRvUnVsZUxvY2F0aW9uKG1hdGNoZWRTdHlsZXMsIHJ1bGUpIHsKKyAgICBpZiAoIXJ1bGUpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBydWxlTG9jYXRpb24gPSB0aGlzLl9nZXRSdWxlTG9jYXRpb25Gcm9tQ1NTUnVsZShydWxlKTsKKyAgICBjb25zdCBoZWFkZXIgPSBydWxlLnN0eWxlU2hlZXRJZCA/IG1hdGNoZWRTdHlsZXMuY3NzTW9kZWwoKS5zdHlsZVNoZWV0SGVhZGVyRm9ySWQocnVsZS5zdHlsZVNoZWV0SWQpIDogbnVsbDsKKworICAgIGlmIChydWxlTG9jYXRpb24gJiYgcnVsZS5zdHlsZVNoZWV0SWQgJiYgaGVhZGVyICYmICFoZWFkZXIuaXNBbm9ueW1vdXNJbmxpbmVTdHlsZVNoZWV0KCkpIHsKKyAgICAgIGNvbnN0IG1hdGNoaW5nU2VsZWN0b3JMb2NhdGlvbiA9CisgICAgICAgICAgdGhpcy5fZ2V0Q1NTU2VsZWN0b3JMb2NhdGlvbihtYXRjaGVkU3R5bGVzLmNzc01vZGVsKCksIHJ1bGUuc3R5bGVTaGVldElkLCBydWxlTG9jYXRpb24pOworICAgICAgdGhpcy5fcmV2ZWFsU2VsZWN0b3JTb3VyY2UobWF0Y2hpbmdTZWxlY3RvckxvY2F0aW9uLCB0cnVlKTsKKyAgICB9CisgIH0KKworICAvKioKICAgICogQHBhcmFtIHshU0RLLkNTU01vZGVsfSBjc3NNb2RlbAogICAgKiBAcGFyYW0geyFDb21wb25lbnRzLkxpbmtpZmllcn0gbGlua2lmaWVyCiAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHlsZVNoZWV0SWQKQEAgLTEwMTksMTEgKzEwNDcsMjEgQEAKICAgICogQHJldHVybiB7IU5vZGV9CiAgICAqLwogICBzdGF0aWMgX2xpbmtpZnlSdWxlTG9jYXRpb24oY3NzTW9kZWwsIGxpbmtpZmllciwgc3R5bGVTaGVldElkLCBydWxlTG9jYXRpb24pIHsKKyAgICBjb25zdCBtYXRjaGluZ1NlbGVjdG9yTG9jYXRpb24gPSB0aGlzLl9nZXRDU1NTZWxlY3RvckxvY2F0aW9uKGNzc01vZGVsLCBzdHlsZVNoZWV0SWQsIHJ1bGVMb2NhdGlvbik7CisgICAgcmV0dXJuIGxpbmtpZmllci5saW5raWZ5Q1NTTG9jYXRpb24obWF0Y2hpbmdTZWxlY3RvckxvY2F0aW9uKTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0geyFTREsuQ1NTTW9kZWx9IGNzc01vZGVsCisgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHlsZVNoZWV0SWQKKyAgICogQHBhcmFtIHshVGV4dFV0aWxzLlRleHRSYW5nZX0gcnVsZUxvY2F0aW9uCisgICAqIEByZXR1cm4geyFTREsuQ1NTTG9jYXRpb259CisgICAqLworICBzdGF0aWMgX2dldENTU1NlbGVjdG9yTG9jYXRpb24oY3NzTW9kZWwsIHN0eWxlU2hlZXRJZCwgcnVsZUxvY2F0aW9uKSB7CiAgICAgY29uc3Qgc3R5bGVTaGVldEhlYWRlciA9IGNzc01vZGVsLnN0eWxlU2hlZXRIZWFkZXJGb3JJZChzdHlsZVNoZWV0SWQpOwogICAgIGNvbnN0IGxpbmVOdW1iZXIgPSBzdHlsZVNoZWV0SGVhZGVyLmxpbmVOdW1iZXJJblNvdXJjZShydWxlTG9jYXRpb24uc3RhcnRMaW5lKTsKICAgICBjb25zdCBjb2x1bW5OdW1iZXIgPSBzdHlsZVNoZWV0SGVhZGVyLmNvbHVtbk51bWJlckluU291cmNlKHJ1bGVMb2NhdGlvbi5zdGFydExpbmUsIHJ1bGVMb2NhdGlvbi5zdGFydENvbHVtbik7Ci0gICAgY29uc3QgbWF0Y2hpbmdTZWxlY3RvckxvY2F0aW9uID0gbmV3IFNESy5DU1NMb2NhdGlvbihzdHlsZVNoZWV0SGVhZGVyLCBsaW5lTnVtYmVyLCBjb2x1bW5OdW1iZXIpOwotICAgIHJldHVybiBsaW5raWZpZXIubGlua2lmeUNTU0xvY2F0aW9uKG1hdGNoaW5nU2VsZWN0b3JMb2NhdGlvbik7CisgICAgcmV0dXJuIG5ldyBTREsuQ1NTTG9jYXRpb24oc3R5bGVTaGVldEhlYWRlciwgbGluZU51bWJlciwgY29sdW1uTnVtYmVyKTsKICAgfQogCiAgIC8qKgpAQCAtMTgyOCw2ICsxODY2LDE0IEBACiAgICAgICByZXR1cm47CiAgICAgfQogICAgIGNvbnN0IHJhd0xvY2F0aW9uID0gbmV3IFNESy5DU1NMb2NhdGlvbihoZWFkZXIsIHJ1bGUubGluZU51bWJlckluU291cmNlKGluZGV4KSwgcnVsZS5jb2x1bW5OdW1iZXJJblNvdXJjZShpbmRleCkpOworICAgIEVsZW1lbnRzLlN0eWxlUHJvcGVydGllc1NlY3Rpb24uX3JldmVhbFNlbGVjdG9yU291cmNlKHJhd0xvY2F0aW9uLCBmb2N1cyk7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIHshU0RLLkNTU0xvY2F0aW9ufSByYXdMb2NhdGlvbgorICAgKiBAcGFyYW0ge2Jvb2xlYW59IGZvY3VzCisgICAqLworICBzdGF0aWMgX3JldmVhbFNlbGVjdG9yU291cmNlKHJhd0xvY2F0aW9uLCBmb2N1cykgewogICAgIGNvbnN0IHVpTG9jYXRpb24gPSBCaW5kaW5ncy5jc3NXb3Jrc3BhY2VCaW5kaW5nLnJhd0xvY2F0aW9uVG9VSUxvY2F0aW9uKHJhd0xvY2F0aW9uKTsKICAgICBpZiAodWlMb2NhdGlvbikgewogICAgICAgQ29tbW9uLlJldmVhbGVyLnJldmVhbCh1aUxvY2F0aW9uLCAhZm9jdXMpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvZGV2dG9vbHMvZnJvbnRfZW5kL2VsZW1lbnRzL2VsZW1lbnRzX3N0cmluZ3MuZ3JkcCBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2RldnRvb2xzL2Zyb250X2VuZC9lbGVtZW50cy9lbGVtZW50c19zdHJpbmdzLmdyZHAKaW5kZXggN2VhMzc1My4uYTA5ZGJhNiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvZGV2dG9vbHMvZnJvbnRfZW5kL2VsZW1lbnRzL2VsZW1lbnRzX3N0cmluZ3MuZ3JkcAorKysgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9kZXZ0b29scy9mcm9udF9lbmQvZWxlbWVudHMvZWxlbWVudHNfc3RyaW5ncy5ncmRwCkBAIC00Miw2ICs0Miw5IEBACiAgIDxtZXNzYWdlIG5hbWU9IklEU19ERVZUT09MU18yNjM5NmNjYTNlYWUyOGZjNmUzOTEyM2VkYjJmMTUxMCIgZGVzYz0iQ29udGV4dCBtZW51IGl0ZW0gZm9yIHN0eWxlIHByb3BlcnR5IGluIGVkaXQgbW9kZSI+CiAgICAgUmV2ZWFsIGluIFNvdXJjZXMgcGFuZWwKICAgPC9tZXNzYWdlPgorICA8bWVzc2FnZSBuYW1lPSJJRFNfREVWVE9PTFNfMjg2NGEyZDk1ZTE3ZTMwMzJhM2E2ZTY5YTUxZDAyNTYiIGRlc2M9IkNvbnRleHQgbWVudSBpdGVtIGluIEVsZW1lbnRzIHBhbmVsIHRvIG5hdmlnYXRlIHRvIHN0eWxlIGluIHN0eWxlcyBwYW5lIj4KKyAgICBOYXZpZ2F0ZSB0byBzdHlsZQorICA8L21lc3NhZ2U+CiAgIDxtZXNzYWdlIG5hbWU9IklEU19ERVZUT09MU18yOGMwYTMwNTBmNzg0NTgzZDUyMzM5ZGRiMGJjMTI3NCIgZGVzYz0iVGV4dCBpbiBFbGVtZW50cyBUcmVlIEVsZW1lbnQgb2YgdGhlIEVsZW1lbnRzIHBhbmVsIj4KICAgICBQYXN0ZSBlbGVtZW50CiAgIDwvbWVzc2FnZT4KQEAgLTE4Myw2ICsxODYsOSBAQAogICA8bWVzc2FnZSBuYW1lPSJJRFNfREVWVE9PTFNfOTFkMTdlZmY2YTE1MjllOGE0ZjY3YTVhYTRjYWJlYzciIGRlc2M9Ik5vIG1hdGNoZXMgZWxlbWVudCB0ZXh0IGNvbnRlbnQgaW4gQ29tcHV0ZWQgU3R5bGUgV2lkZ2V0IG9mIHRoZSBFbGVtZW50cyBwYW5lbCI+CiAgICAgTm8gbWF0Y2hpbmcgcHJvcGVydHkKICAgPC9tZXNzYWdlPgorICA8bWVzc2FnZSBuYW1lPSJJRFNfREVWVE9PTFNfOTI0ODQzYzViMjRiYzY5ZWQ3ZGEyYmZmNjk5ZGU0ZjEiIGRlc2M9IkNvbnRleHQgbWVudSBpdGVtIGluIEVsZW1lbnRzIHBhbmVsIHRvIG5hdmlnYXRlIHRvIGNzcyBzZWxlY3RvciBzb3VyY2UiPgorICAgIE5hdmlnYXRlIHRvIHNlbGVjdG9yIHNvdXJjZQorICA8L21lc3NhZ2U+CiAgIDxtZXNzYWdlIG5hbWU9IklEU19ERVZUT09MU185N2QyOGZiYzU3M2Y5ZjMzMWY1YjE4ODZiNWMxZWVlZiIgZGVzYz0iVGV4dCBpbiBFbGVtZW50cyBUcmVlIEVsZW1lbnQgb2YgdGhlIEVsZW1lbnRzIHBhbmVsIj4KICAgICBDb3B5IGZ1bGwgWFBhdGgKICAgPC9tZXNzYWdlPgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvZGV2dG9vbHMvZnJvbnRfZW5kL3Byb3RvY29sL0luc3BlY3RvckJhY2tlbmQuanMgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9kZXZ0b29scy9mcm9udF9lbmQvcHJvdG9jb2wvSW5zcGVjdG9yQmFja2VuZC5qcwppbmRleCAzYmRiNjk2Li45NDNmYzE2MSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvZGV2dG9vbHMvZnJvbnRfZW5kL3Byb3RvY29sL0luc3BlY3RvckJhY2tlbmQuanMKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvZGV2dG9vbHMvZnJvbnRfZW5kL3Byb3RvY29sL0luc3BlY3RvckJhY2tlbmQuanMKQEAgLTQxMywxMCArNDEzLDQxIEBACiAKICAgICBjb25zdCBtZXNzYWdlT2JqZWN0ID0gLyoqIEB0eXBlIHshT2JqZWN0fSAqLyAoKHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJykgPyBKU09OLnBhcnNlKG1lc3NhZ2UpIDogbWVzc2FnZSk7CiAKKyAgICAvLyBTZW5kIGFsbCBtZXNzYWdlcyB0byBwcm94eSBjb25uZWN0aW9ucy4KKyAgICBsZXQgcHJveHlDb25uZWN0aW9uSXNBY3RpdmUgPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IHNlc3Npb24gb2YgdGhpcy5fc2Vzc2lvbnMudmFsdWVzKCkpIHsKKyAgICAgIGlmICghc2Vzc2lvbi5wcm94eUNvbm5lY3Rpb24pIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIE9ubHkgdGhlIEF1ZGl0cyBwYW5lbCBoYXMgdXNlIHByb3h5IGNvbm5lY3Rpb25zLiBJZiBpdCBpcyBldmVyIHBvc3NpYmxlIHRvIGhhdmUgbXVsdGlwbGUgYWN0aXZlIGF0IHRoZQorICAgICAgLy8gc2FtZSB0aW1lLCBpdCBzaG91bGQgYmUgdGVzdCB0aG9yb3VnaGx5LgorICAgICAgaWYgKHByb3h5Q29ubmVjdGlvbklzQWN0aXZlKSB7CisgICAgICAgIFByb3RvY29sLkluc3BlY3RvckJhY2tlbmQucmVwb3J0UHJvdG9jb2xFcnJvcigKKyAgICAgICAgICAgICdQcm90b2NvbCBFcnJvcjogbXVsdGlwbGUgcHJveHkgY29ubmVjdGlvbnMgYXJlIG5vdCBleHBsaWNpdGx5IHN1cHBvcnRlZCByaWdodCBub3cnLCBtZXNzYWdlT2JqZWN0KTsKKyAgICAgIH0KKworICAgICAgaWYgKHNlc3Npb24ucHJveHlDb25uZWN0aW9uLl9vbk1lc3NhZ2UpIHsKKyAgICAgICAgc2Vzc2lvbi5wcm94eUNvbm5lY3Rpb24uX29uTWVzc2FnZShtZXNzYWdlT2JqZWN0KTsKKyAgICAgICAgcHJveHlDb25uZWN0aW9uSXNBY3RpdmUgPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgUHJvdG9jb2wuSW5zcGVjdG9yQmFja2VuZC5yZXBvcnRQcm90b2NvbEVycm9yKAorICAgICAgICAgICAgJ1Byb3RvY29sIEVycm9yOiB0aGUgc2Vzc2lvbiBoYXMgYSBwcm94eUNvbm5lY3Rpb24gd2l0aCBubyBfb25NZXNzYWdlJywgbWVzc2FnZU9iamVjdCk7CisgICAgICB9CisgICAgfQorCiAgICAgY29uc3Qgc2Vzc2lvbklkID0gbWVzc2FnZU9iamVjdC5zZXNzaW9uSWQgfHwgJyc7CiAgICAgY29uc3Qgc2Vzc2lvbiA9IHRoaXMuX3Nlc3Npb25zLmdldChzZXNzaW9uSWQpOwogICAgIGlmICghc2Vzc2lvbikgewotICAgICAgUHJvdG9jb2wuSW5zcGVjdG9yQmFja2VuZC5yZXBvcnRQcm90b2NvbEVycm9yKCdQcm90b2NvbCBFcnJvcjogdGhlIG1lc3NhZ2Ugd2l0aCB3cm9uZyBzZXNzaW9uIGlkJywgbWVzc2FnZU9iamVjdCk7CisgICAgICBpZiAoIXByb3h5Q29ubmVjdGlvbklzQWN0aXZlKSB7CisgICAgICAgIFByb3RvY29sLkluc3BlY3RvckJhY2tlbmQucmVwb3J0UHJvdG9jb2xFcnJvcigKKyAgICAgICAgICAgICdQcm90b2NvbCBFcnJvcjogdGhlIG1lc3NhZ2Ugd2l0aCB3cm9uZyBzZXNzaW9uIGlkJywgbWVzc2FnZU9iamVjdCk7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSWYgdGhpcyBtZXNzYWdlIGlzIGRpcmVjdGx5IGZvciB0aGUgdGFyZ2V0IGNvbnRyb2xsZWQgYnkgdGhlIHByb3h5IGNvbm5lY3Rpb24sIGRvbid0IGhhbmRsZSBpdC4KKyAgICBpZiAoc2Vzc2lvbi5wcm94eUNvbm5lY3Rpb24pIHsKICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTQyNCwyMSArNDU1LDEzIEBACiAgICAgICBQcm90b2NvbC5Ob2RlVVJMLnBhdGNoKG1lc3NhZ2VPYmplY3QpOwogICAgIH0KIAotICAgIGlmIChzZXNzaW9uLnByb3h5Q29ubmVjdGlvbikgewotICAgICAgaWYgKHNlc3Npb24ucHJveHlDb25uZWN0aW9uLl9vbk1lc3NhZ2UpIHsKLSAgICAgICAgc2Vzc2lvbi5wcm94eUNvbm5lY3Rpb24uX29uTWVzc2FnZShtZXNzYWdlT2JqZWN0KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFByb3RvY29sLkluc3BlY3RvckJhY2tlbmQucmVwb3J0UHJvdG9jb2xFcnJvcigKLSAgICAgICAgICAgICdQcm90b2NvbCBFcnJvcjogdGhlIG1lc3NhZ2UgaGFzIGEgcHJveHlDb25uZWN0aW9uIHdpdGggbm8gX29uTWVzc2FnZScsIG1lc3NhZ2VPYmplY3QpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLQogICAgIGlmICgnaWQnIGluIG1lc3NhZ2VPYmplY3QpIHsgIC8vIGp1c3QgYSByZXNwb25zZSBmb3Igc29tZSByZXF1ZXN0CiAgICAgICBjb25zdCBjYWxsYmFjayA9IHNlc3Npb24uY2FsbGJhY2tzLmdldChtZXNzYWdlT2JqZWN0LmlkKTsKICAgICAgIHNlc3Npb24uY2FsbGJhY2tzLmRlbGV0ZShtZXNzYWdlT2JqZWN0LmlkKTsKICAgICAgIGlmICghY2FsbGJhY2spIHsKLSAgICAgICAgUHJvdG9jb2wuSW5zcGVjdG9yQmFja2VuZC5yZXBvcnRQcm90b2NvbEVycm9yKCdQcm90b2NvbCBFcnJvcjogdGhlIG1lc3NhZ2Ugd2l0aCB3cm9uZyBpZCcsIG1lc3NhZ2VPYmplY3QpOworICAgICAgICBpZiAoIXByb3h5Q29ubmVjdGlvbklzQWN0aXZlKSB7CisgICAgICAgICAgUHJvdG9jb2wuSW5zcGVjdG9yQmFja2VuZC5yZXBvcnRQcm90b2NvbEVycm9yKCdQcm90b2NvbCBFcnJvcjogdGhlIG1lc3NhZ2Ugd2l0aCB3cm9uZyBpZCcsIG1lc3NhZ2VPYmplY3QpOworICAgICAgICB9CiAgICAgICAgIHJldHVybjsKICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvZGV2dG9vbHMvZnJvbnRfZW5kL3Nkay9DaGlsZFRhcmdldE1hbmFnZXIuanMgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9kZXZ0b29scy9mcm9udF9lbmQvc2RrL0NoaWxkVGFyZ2V0TWFuYWdlci5qcwppbmRleCA1ZWI3OWIwLi5lNWM3NWVlOCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvZGV2dG9vbHMvZnJvbnRfZW5kL3Nkay9DaGlsZFRhcmdldE1hbmFnZXIuanMKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvZGV2dG9vbHMvZnJvbnRfZW5kL3Nkay9DaGlsZFRhcmdldE1hbmFnZXIuanMKQEAgLTIxNiw4ICsyMTYsOCBAQAogICAgIGNvbnN0IHNlc3Npb25JZCA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoYXdhaXQgdGFyZ2V0QWdlbnQuYXR0YWNoVG9UYXJnZXQodGFyZ2V0SWQsIHRydWUgLyogZmxhdHRlbiAqLykpOwogICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBuZXcgU0RLLlBhcmFsbGVsQ29ubmVjdGlvbih0YXJnZXRSb3V0ZXIuY29ubmVjdGlvbigpLCBzZXNzaW9uSWQpOwogICAgIHRhcmdldFJvdXRlci5yZWdpc3RlclNlc3Npb24odGFyZ2V0LCBzZXNzaW9uSWQsIGNvbm5lY3Rpb24pOwotICAgIGNvbm5lY3Rpb24uc2V0T25EaXNjb25uZWN0KGFzeW5jICgpID0+IHsKLSAgICAgIGF3YWl0IHRhcmdldEFnZW50LmRldGFjaEZyb21UYXJnZXQoc2Vzc2lvbklkKTsKKyAgICBjb25uZWN0aW9uLnNldE9uRGlzY29ubmVjdCgoKSA9PiB7CisgICAgICB0YXJnZXRBZ2VudC5kZXRhY2hGcm9tVGFyZ2V0KHNlc3Npb25JZCk7CiAgICAgICB0YXJnZXRSb3V0ZXIudW5yZWdpc3RlclNlc3Npb24oc2Vzc2lvbklkKTsKICAgICB9KTsKICAgICByZXR1cm4ge2Nvbm5lY3Rpb24sIHNlc3Npb25JZH07CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9kZXZ0b29scy9mcm9udF9lbmQvc2RrL0Nvbm5lY3Rpb25zLmpzIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvZGV2dG9vbHMvZnJvbnRfZW5kL3Nkay9Db25uZWN0aW9ucy5qcwppbmRleCA5ZGEwNTEzLi5lYmM1OTQ4NyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvZGV2dG9vbHMvZnJvbnRfZW5kL3Nkay9Db25uZWN0aW9ucy5qcworKysgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9kZXZ0b29scy9mcm9udF9lbmQvc2RrL0Nvbm5lY3Rpb25zLmpzCkBAIC0yOTQsNyArMjk0LDEwIEBACiAgICAqLwogICBzZW5kUmF3TWVzc2FnZShtZXNzYWdlKSB7CiAgICAgY29uc3QgbWVzc2FnZU9iamVjdCA9IEpTT04ucGFyc2UobWVzc2FnZSk7Ci0gICAgbWVzc2FnZU9iamVjdC5zZXNzaW9uSWQgPSB0aGlzLl9zZXNzaW9uSWQ7CisgICAgLy8gSWYgdGhlIG1lc3NhZ2UgaXNuJ3QgZm9yIGEgc3BlY2lmaWMgc2Vzc2lvbiwgaXQgbXVzdCBiZSBmb3IgdGhlIHJvb3Qgc2Vzc2lvbi4KKyAgICBpZiAoIW1lc3NhZ2VPYmplY3Quc2Vzc2lvbklkKSB7CisgICAgICBtZXNzYWdlT2JqZWN0LnNlc3Npb25JZCA9IHRoaXMuX3Nlc3Npb25JZDsKKyAgICB9CiAgICAgdGhpcy5fY29ubmVjdGlvbi5zZW5kUmF3TWVzc2FnZShKU09OLnN0cmluZ2lmeShtZXNzYWdlT2JqZWN0KSk7CiAgIH0KIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy9hY2Nlc3NpYmlsaXR5L2F4X29iamVjdF9jYWNoZV9pbXBsLmNjIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy9hY2Nlc3NpYmlsaXR5L2F4X29iamVjdF9jYWNoZV9pbXBsLmNjCmluZGV4IGI3YTgyOWMuLjVkN2Q5ZmMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvYWNjZXNzaWJpbGl0eS9heF9vYmplY3RfY2FjaGVfaW1wbC5jYworKysgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL2FjY2Vzc2liaWxpdHkvYXhfb2JqZWN0X2NhY2hlX2ltcGwuY2MKQEAgLTEyMSw2ICsxMjEsNyBAQAogICAgIEFkZFBlcm1pc3Npb25TdGF0dXNMaXN0ZW5lcigpOwogICBkb2N1bWVudHNfLmluc2VydCgmZG9jdW1lbnQpOwogICBkb2N1bWVudC5WaWV3KCktPlJlZ2lzdGVyRm9yTGlmZWN5Y2xlTm90aWZpY2F0aW9ucyh0aGlzKTsKKyAgcmVsYXRpb25fY2FjaGVfLT5Jbml0KCk7CiB9CiAKIEFYT2JqZWN0Q2FjaGVJbXBsOjp+QVhPYmplY3RDYWNoZUltcGwoKSB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL2FjY2Vzc2liaWxpdHkvYXhfb2JqZWN0X3Rlc3QuY2MgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL2FjY2Vzc2liaWxpdHkvYXhfb2JqZWN0X3Rlc3QuY2MKaW5kZXggMmJmNjQ5YS4uYjU0MjZhMCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy9hY2Nlc3NpYmlsaXR5L2F4X29iamVjdF90ZXN0LmNjCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvYWNjZXNzaWJpbGl0eS9heF9vYmplY3RfdGVzdC5jYwpAQCAtMzk2LDUgKzM5Niw1NSBAQAogICBBU1NFUlRfRVEoYXhfc2VsZWN0LT5GaXJzdENoaWxkKCktPkNoaWxkQ291bnQoKSwgMSk7CiB9CiAKK1RFU1RfRihBY2Nlc3NpYmlsaXR5VGVzdCwgSW5pdFJlbGF0aW9uQ2FjaGUpIHsKKyAgLy8gQWxsIG9mIHRoZSBvdGhlciB0ZXN0cyBhbHJlYWR5IGhhdmUgYWNjZXNzaWJpbGl0eSBpbml0aWFsaXplZAorICAvLyBmaXJzdCwgYnV0IHdlIGRvbid0IHdhbnQgdG8gaW4gdGhpcyB0ZXN0LgorICAvLworICAvLyBHZXQgcmlkIG9mIHRoZSBBWENvbnRleHQgc28gdGhlIEFYT2JqZWN0Q2FjaGUgaXMgZGVzdHJveWVkLgorICBheF9jb250ZXh0Xy5yZXNldChudWxscHRyKTsKKworICBTZXRCb2R5SW5uZXJIVE1MKFIiSFRNTCgKKyAgICAgIDx1bCBpZD0idWwiIGFyaWEtb3ducz0ibGkiPjwvdWw+CisgICAgICA8bGFiZWwgZm9yPSJhIj48L2xhYmVsPgorICAgICAgPGlucHV0IGlkPSJhIj4KKyAgICAgIDxpbnB1dCBpZD0iYiI+CisgICAgICA8ZGl2IHJvbGU9InNlY3Rpb24iIGlkPSJkaXYiPgorICAgICAgICA8bGkgaWQ9ImxpIj48L2xpPgorICAgICAgPC9kaXY+CisgICAgKUhUTUwiKTsKKworICAvLyBOb3cgcmVjcmVhdGUgYW4gQVhDb250ZXh0LCBzaW11bGF0aW5nIHdoYXQgaGFwcGVucyBpZiBhY2Nlc3NpYmlsaXR5CisgIC8vIGlzIGVuYWJsZWQgYWZ0ZXIgdGhlIGRvY3VtZW50IGlzIGxvYWRlZC4KKyAgYXhfY29udGV4dF8ucmVzZXQobmV3IEFYQ29udGV4dChHZXREb2N1bWVudCgpKSk7CisKKyAgY29uc3QgQVhPYmplY3QqIHJvb3QgPSBHZXRBWFJvb3RPYmplY3QoKTsKKyAgQVNTRVJUX05FKG51bGxwdHIsIHJvb3QpOworICBjb25zdCBBWE9iamVjdCogaW5wdXRfYSA9IEdldEFYT2JqZWN0QnlFbGVtZW50SWQoImEiKTsKKyAgQVNTRVJUX05FKG51bGxwdHIsIGlucHV0X2EpOworICBjb25zdCBBWE9iamVjdCogaW5wdXRfYiA9IEdldEFYT2JqZWN0QnlFbGVtZW50SWQoImIiKTsKKyAgQVNTRVJUX05FKG51bGxwdHIsIGlucHV0X2IpOworCisgIEVYUEVDVF9UUlVFKAorICAgICAgR2V0QVhPYmplY3RDYWNoZSgpLk1heUhhdmVIVE1MTGFiZWwoVG9IVE1MRWxlbWVudCgqaW5wdXRfYS0+R2V0Tm9kZSgpKSkpOworICBFWFBFQ1RfRkFMU0UoCisgICAgICBHZXRBWE9iamVjdENhY2hlKCkuTWF5SGF2ZUhUTUxMYWJlbChUb0hUTUxFbGVtZW50KCppbnB1dF9iLT5HZXROb2RlKCkpKSk7CisKKyAgLy8gTm90ZTogcmV0cmlldmUgdGhlIExJIGZpcnN0IGFuZCBjaGVjayB0aGF0IGl0cyBwYXJlbnQgaXMgbm90CisgIC8vIHRoZSBwYXJhZ3JhcGggZWxlbWVudC4gSWYgd2Ugd2VyZSB0byByZXRyaWV2ZSB0aGUgVUwgZWxlbWVudCwKKyAgLy8gdGhhdCB3b3VsZCB0cmlnZ2VyIHRoZSBhcmlhLW93bnMgY2hlY2sgYW5kIHdvdWxuJ3QgYWxsb3cgdXMgdG8KKyAgLy8gdGVzdCB3aGV0aGVyIHRoZSByZWxhdGlvbiBjYWNoZSB3YXMgaW5pdGlhbGl6ZWQuCisgIGNvbnN0IEFYT2JqZWN0KiBsaSA9IEdldEFYT2JqZWN0QnlFbGVtZW50SWQoImxpIik7CisgIEFTU0VSVF9ORShudWxscHRyLCBsaSk7CisKKyAgY29uc3QgQVhPYmplY3QqIGRpdiA9IEdldEFYT2JqZWN0QnlFbGVtZW50SWQoImRpdiIpOworICBBU1NFUlRfTkUobnVsbHB0ciwgZGl2KTsKKyAgRVhQRUNUX05FKGxpLT5QYXJlbnRPYmplY3RVbmlnbm9yZWQoKSwgZGl2KTsKKworICBjb25zdCBBWE9iamVjdCogdWwgPSBHZXRBWE9iamVjdEJ5RWxlbWVudElkKCJ1bCIpOworICBBU1NFUlRfTkUobnVsbHB0ciwgdWwpOworCisgIEVYUEVDVF9FUShsaS0+UGFyZW50T2JqZWN0VW5pZ25vcmVkKCksIHVsKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIHRlc3QKIH0gIC8vIG5hbWVzcGFjZSBibGluawpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy9hY2Nlc3NpYmlsaXR5L2F4X3JlbGF0aW9uX2NhY2hlLmNjIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy9hY2Nlc3NpYmlsaXR5L2F4X3JlbGF0aW9uX2NhY2hlLmNjCmluZGV4IDAyZWFlMDAuLjNjNTNkZDggMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvYWNjZXNzaWJpbGl0eS9heF9yZWxhdGlvbl9jYWNoZS5jYworKysgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL2FjY2Vzc2liaWxpdHkvYXhfcmVsYXRpb25fY2FjaGUuY2MKQEAgLTUsNiArNSw3IEBACiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy9hY2Nlc3NpYmlsaXR5L2F4X3JlbGF0aW9uX2NhY2hlLmgiCiAKICNpbmNsdWRlICJiYXNlL21lbW9yeS9wdHJfdXRpbC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvZG9tL2VsZW1lbnRfdHJhdmVyc2FsLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvY29yZS9odG1sL2Zvcm1zL2h0bWxfbGFiZWxfZWxlbWVudC5oIgogCiBuYW1lc3BhY2UgYmxpbmsgewpAQCAtMTYsNiArMTcsMjQgQEAKIAogQVhSZWxhdGlvbkNhY2hlOjp+QVhSZWxhdGlvbkNhY2hlKCkgPSBkZWZhdWx0OwogCit2b2lkIEFYUmVsYXRpb25DYWNoZTo6SW5pdCgpIHsKKyAgLy8gSW5pdCB0aGUgcmVsYXRpb24gY2FjaGUgd2l0aCBlbGVtZW50cyBhbHJlYWR5IGluIHRoZSBkb2N1bWVudC4KKyAgRG9jdW1lbnQmIGRvY3VtZW50ID0gb2JqZWN0X2NhY2hlXy0+R2V0RG9jdW1lbnQoKTsKKyAgZm9yIChFbGVtZW50JiBlbGVtZW50IDoKKyAgICAgICBFbGVtZW50VHJhdmVyc2FsOjpEZXNjZW5kYW50c09mKCpkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQoKSkpIHsKKyAgICBjb25zdCBhdXRvJiBpZCA9IGVsZW1lbnQuRmFzdEdldEF0dHJpYnV0ZShrRm9yQXR0cik7CisgICAgaWYgKCFpZC5Jc0VtcHR5KCkpCisgICAgICBhbGxfcHJldmlvdXNseV9zZWVuX2xhYmVsX3RhcmdldF9pZHNfLmluc2VydChpZCk7CisKKyAgICBpZiAoZWxlbWVudC5GYXN0SGFzQXR0cmlidXRlKGtBcmlhT3duc0F0dHIpKSB7CisgICAgICBpZiAoQVhPYmplY3QqIG9iaiA9IG9iamVjdF9jYWNoZV8tPkdldE9yQ3JlYXRlKCZlbGVtZW50KSkgeworICAgICAgICBvYmotPkNsZWFyQ2hpbGRyZW4oKTsKKyAgICAgICAgb2JqLT5BZGRDaGlsZHJlbigpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCiBib29sIEFYUmVsYXRpb25DYWNoZTo6SXNBcmlhT3duZWQoY29uc3QgQVhPYmplY3QqIGNoaWxkKSBjb25zdCB7CiAgIHJldHVybiBhcmlhX293bmVkX2NoaWxkX3RvX293bmVyX21hcHBpbmdfLkNvbnRhaW5zKGNoaWxkLT5BWE9iamVjdElEKCkpOwogfQpAQCAtMjcxLDYgKzI5MCw3IEBACiAKIHZvaWQgQVhSZWxhdGlvbkNhY2hlOjpMYWJlbENoYW5nZWQoTm9kZSogbm9kZSkgewogICBjb25zdCBhdXRvJiBpZCA9IFRvPEhUTUxFbGVtZW50Pihub2RlKS0+RmFzdEdldEF0dHJpYnV0ZShrRm9yQXR0cik7CisgIExPRyhFUlJPUikgPDwgIkxhYmVsQ2hhbmdlZCAiIDw8IGlkOwogICBpZiAoIWlkLklzRW1wdHkoKSkgewogICAgIGFsbF9wcmV2aW91c2x5X3NlZW5fbGFiZWxfdGFyZ2V0X2lkc18uaW5zZXJ0KGlkKTsKICAgICBpZiAoYXV0byogY29udHJvbCA9IFRvPEhUTUxMYWJlbEVsZW1lbnQ+KG5vZGUpLT5jb250cm9sKCkpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL2FjY2Vzc2liaWxpdHkvYXhfcmVsYXRpb25fY2FjaGUuaCBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvYWNjZXNzaWJpbGl0eS9heF9yZWxhdGlvbl9jYWNoZS5oCmluZGV4IGE5NjA5N2YuLjJkZWM1Y2ZiIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL2FjY2Vzc2liaWxpdHkvYXhfcmVsYXRpb25fY2FjaGUuaAorKysgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL2FjY2Vzc2liaWxpdHkvYXhfcmVsYXRpb25fY2FjaGUuaApAQCAtMjIsNiArMjIsOSBAQAogICBleHBsaWNpdCBBWFJlbGF0aW9uQ2FjaGUoQVhPYmplY3RDYWNoZUltcGwqKTsKICAgdmlydHVhbCB+QVhSZWxhdGlvbkNhY2hlKCk7CiAKKyAgLy8gU2NhbiB0aGUgaW5pdGlhbCBkb2N1bWVudC4KKyAgdm9pZCBJbml0KCk7CisKICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBvYmplY3QncyBwb3NpdGlvbiBpbiB0aGUgdHJlZSB3YXMgZHVlIHRvCiAgIC8vIGFyaWEtb3ducy4KICAgYm9vbCBJc0FyaWFPd25lZChjb25zdCBBWE9iamVjdCopIGNvbnN0OwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy9hY2Nlc3NpYmlsaXR5L3Rlc3RpbmcvYWNjZXNzaWJpbGl0eV90ZXN0LmggYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL2FjY2Vzc2liaWxpdHkvdGVzdGluZy9hY2Nlc3NpYmlsaXR5X3Rlc3QuaAppbmRleCA3NDYxYzViLi4wNjA4YzRlIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL2FjY2Vzc2liaWxpdHkvdGVzdGluZy9hY2Nlc3NpYmlsaXR5X3Rlc3QuaAorKysgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL2FjY2Vzc2liaWxpdHkvdGVzdGluZy9hY2Nlc3NpYmlsaXR5X3Rlc3QuaApAQCAtNDQsMTIgKzQ0LDEzIEBACiAKICAgc3RkOjpzdHJpbmcgUHJpbnRBWFRyZWUoKSBjb25zdDsKIAorIHByb3RlY3RlZDoKKyAgc3RkOjp1bmlxdWVfcHRyPEFYQ29udGV4dD4gYXhfY29udGV4dF87CisKICBwcml2YXRlOgogICBzdGQ6Om9zdHJpbmdzdHJlYW0mIFByaW50QVhUcmVlSGVscGVyKHN0ZDo6b3N0cmluZ3N0cmVhbSYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVhPYmplY3QqIHJvb3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxldmVsKSBjb25zdDsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8QVhDb250ZXh0PiBheF9jb250ZXh0XzsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSB0ZXN0CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL2V4cG9ydGVkL3dlYl9lbWJlZGRlZF93b3JrZXJfaW1wbC5jYyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvZXhwb3J0ZWQvd2ViX2VtYmVkZGVkX3dvcmtlcl9pbXBsLmNjCmluZGV4IDFkOGU0ZDhiLi5lMjkzYjk5IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL2V4cG9ydGVkL3dlYl9lbWJlZGRlZF93b3JrZXJfaW1wbC5jYworKysgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL2V4cG9ydGVkL3dlYl9lbWJlZGRlZF93b3JrZXJfaW1wbC5jYwpAQCAtMjYyLDcgKzI2Miw4IEBACiAgIHN0ZDo6dW5pcXVlX3B0cjxDcm9zc1RocmVhZEZldGNoQ2xpZW50U2V0dGluZ3NPYmplY3REYXRhPgogICAgICAgZmV0Y2hfY2xpZW50X3NldHRpbmdfb2JqZWN0X2RhdGEgPSBDcmVhdGVGZXRjaENsaWVudFNldHRpbmdzT2JqZWN0RGF0YSgKICAgICAgICAgICB3b3JrZXJfc3RhcnRfZGF0YS0+c2NyaXB0X3VybCwgc3RhcnRlcl9vcmlnaW4uZ2V0KCksCi0gICAgICAgICAgc3RhcnRlcl9odHRwc19zdGF0ZSwgd29ya2VyX3N0YXJ0X2RhdGEtPmFkZHJlc3Nfc3BhY2UpOworICAgICAgICAgIHN0YXJ0ZXJfaHR0cHNfc3RhdGUsIHdvcmtlcl9zdGFydF9kYXRhLT5hZGRyZXNzX3NwYWNlLAorICAgICAgICAgIHdvcmtlcl9zdGFydF9kYXRhLT5vdXRzaWRlX2ZldGNoX2NsaWVudF9zZXR0aW5nc19vYmplY3QpOwogCiAgIC8vID4gU3dpdGNoaW5nIG9uIGpvYidzIHdvcmtlciB0eXBlLCBydW4gdGhlc2Ugc3Vic3RlcHMgd2l0aCB0aGUgZm9sbG93aW5nCiAgIC8vID4gb3B0aW9uczoKQEAgLTMwMiwyNCArMzAzLDMwIEBACiAgICAgY29uc3QgS1VSTCYgc2NyaXB0X3VybCwKICAgICBjb25zdCBTZWN1cml0eU9yaWdpbiogc2VjdXJpdHlfb3JpZ2luLAogICAgIGNvbnN0IEh0dHBzU3RhdGUmIGh0dHBzX3N0YXRlLAotICAgIG5ldHdvcms6Om1vam9tOjpJUEFkZHJlc3NTcGFjZSBhZGRyZXNzX3NwYWNlKSB7Ci0gIC8vIFRPRE8oY3JidWcuY29tLzk2NzI2NSk6IEN1cnJlbnRseSB3ZSBjcmVhdGUgYW4gaW5jb21wbGV0ZSBvdXRzaWRlIHNldHRpbmdzCi0gIC8vIG9iamVjdCBmcm9tIHx3b3JrZXJfc3RhcnRfZGF0YXwgYnV0IHdlIHNob3VsZCBjcmVhdGUgYSBwcm9wZXIgb3V0c2lkZQotICAvLyBzZXR0aW5ncyBvYmplY3RzIGRlcGVuZGluZyBvbiB0aGUgc2l0dWF0aW9uLiBGb3IgbmV3IHdvcmtlciBjYXNlLCB0aGlzCi0gIC8vIHNob3VsZCBiZSB0aGUgRG9jdW1lbnQgdGhhdCBjYWxsZWQgbmF2aWdhdG9yLnNlcnZpY2VXb3JrZXIucmVnaXN0ZXIoKS4gRm9yCi0gIC8vIFNlcnZpY2VXb3JrZXJSZWdpc3RyYXRpb24jdXBkYXRlKCkgY2FzZSwgaXQgc2hvdWxkIGJlIHRoZSBEb2N1bWVudCB0aGF0Ci0gIC8vIGNhbGxlZCB1cGRhdGUoKS4gRm9yIHNvZnQgdXBkYXRlIGNhc2UsIGl0IHNlZW1zIHRvIGJlICdudWxsJyBkb2N1bWVudC4KLSAgLy8KLSAgLy8gVG8gZ2V0IGEgY29ycmVjdCBzZXR0aW5ncywgd2UgbmVlZCB0byBtYWtlIGEgd2F5IHRvIHBhc3MgdGhlIHNldHRpbmdzCi0gIC8vIG9iamVjdCBvdmVyIG1vam8gSVBDcy4KKyAgICBuZXR3b3JrOjptb2pvbTo6SVBBZGRyZXNzU3BhY2UgYWRkcmVzc19zcGFjZSwKKyAgICBjb25zdCBXZWJGZXRjaENsaWVudFNldHRpbmdzT2JqZWN0JiBwYXNzZWRfc2V0dGluZ3Nfb2JqZWN0KSB7CisgIC8vIFRPRE8oY3JidWcuY29tLzk2NzI2NSk6IEN1cnJlbnRseSB8cGFzc2VkX3NldHRpbmdzX29iamVjdHwgZG9lc24ndCBjb250YWluCisgIC8vIGVub3VnaCBwYXJhbWV0ZXJzIHRvIGNyZWF0ZSBhIGNvbXBsZXRlIG91dHNpZGUgc2V0dGluZ3Mgb2JqZWN0LiBQYXNzCisgIC8vIGFsbCBuZWNlc3NhcnkgaW5mb3JtYXRpb24gZnJvbSB0aGUgcGFyZW50IGV4ZWN1dGlvbiBjb250ZXh0LgorICAvLyBGb3IgbmV3IHdvcmtlciBjYXNlLCB0aGUgcGFyZW50IGlzIHRoZSBEb2N1bWVudCB0aGF0IGNhbGxlZAorICAvLyBuYXZpZ2F0b3Iuc2VydmljZVdvcmtlci5yZWdpc3RlcigpLiBGb3IgU2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbiN1cGRhdGUoKQorICAvLyBjYXNlLCBpdCBzaG91bGQgYmUgdGhlIERvY3VtZW50IHRoYXQgY2FsbGVkIHVwZGF0ZSgpLiBGb3Igc29mdCB1cGRhdGUgY2FzZSwKKyAgLy8gaXQgc2VlbXMgdG8gYmUgJ251bGwnIGRvY3VtZW50LgorCisgIFdlYkluc2VjdXJlUmVxdWVzdFBvbGljeSBpbnNlY3VyZV9yZXF1ZXN0c19wb2xpY3kgPQorICAgICAgcGFzc2VkX3NldHRpbmdzX29iamVjdC5pbnNlY3VyZV9yZXF1ZXN0c19wb2xpY3kgPT0KKyAgICAgICAgICAgICAgbW9qb206Okluc2VjdXJlUmVxdWVzdHNQb2xpY3k6OmtVcGdyYWRlCisgICAgICAgICAgPyBrVXBncmFkZUluc2VjdXJlUmVxdWVzdHMKKyAgICAgICAgICA6IGtCbG9ja0FsbE1peGVkQ29udGVudDsKIAogICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxDcm9zc1RocmVhZEZldGNoQ2xpZW50U2V0dGluZ3NPYmplY3REYXRhPigKICAgICAgIHNjcmlwdF91cmwuQ29weSgpIC8qIGdsb2JhbF9vYmplY3RfdXJsICovLAogICAgICAgc2NyaXB0X3VybC5Db3B5KCkgLyogYmFzZV91cmwgKi8sIHNlY3VyaXR5X29yaWdpbi0+SXNvbGF0ZWRDb3B5KCksCi0gICAgICBuZXR3b3JrOjptb2pvbTo6UmVmZXJyZXJQb2xpY3k6OmtEZWZhdWx0LAotICAgICAgc2NyaXB0X3VybC5HZXRTdHJpbmcoKS5Jc29sYXRlZENvcHkoKSAvKiBvdXRnb2luZ19yZWZlcnJlciAqLywKKyAgICAgIHBhc3NlZF9zZXR0aW5nc19vYmplY3QucmVmZXJyZXJfcG9saWN5LAorICAgICAgS1VSTDo6Q3JlYXRlSXNvbGF0ZWQoCisgICAgICAgICAgcGFzc2VkX3NldHRpbmdzX29iamVjdC5vdXRnb2luZ19yZWZlcnJlci5HZXRTdHJpbmcoKSksCiAgICAgICBodHRwc19zdGF0ZSwgQWxsb3dlZEJ5Tm9zbmlmZjo6TWltZVR5cGVDaGVjazo6a0xheCwgYWRkcmVzc19zcGFjZSwKLSAgICAgIGtCbG9ja0FsbE1peGVkQ29udGVudCAvKiBpbnNlY3VyZV9yZXF1ZXN0c19wb2xpY3kgKi8sCisgICAgICBpbnNlY3VyZV9yZXF1ZXN0c19wb2xpY3ksCiAgICAgICBGZXRjaENsaWVudFNldHRpbmdzT2JqZWN0OjpJbnNlY3VyZU5hdmlnYXRpb25zU2V0KCksCiAgICAgICBmYWxzZSAvKiBtaXhlZF9hdXRvdXBncmFkZV9vcHRfb3V0ICovKTsKIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvZXhwb3J0ZWQvd2ViX2VtYmVkZGVkX3dvcmtlcl9pbXBsLmggYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL2V4cG9ydGVkL3dlYl9lbWJlZGRlZF93b3JrZXJfaW1wbC5oCmluZGV4IGI2YmVjMDcuLjQyY2EwZDAgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvZXhwb3J0ZWQvd2ViX2VtYmVkZGVkX3dvcmtlcl9pbXBsLmgKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy9leHBvcnRlZC93ZWJfZW1iZWRkZWRfd29ya2VyX2ltcGwuaApAQCAtOTIsMTAgKzkyLDEyIEBACiAgIC8vIENyZWF0ZXMgYSBjcm9zcy10aHJlYWQgY29weWFibGUgb3V0c2lkZSBzZXR0aW5ncyBvYmplY3QgZm9yIHRvcC1sZXZlbAogICAvLyB3b3JrZXIgc2NyaXB0IGZldGNoLgogICBzdGQ6OnVuaXF1ZV9wdHI8Q3Jvc3NUaHJlYWRGZXRjaENsaWVudFNldHRpbmdzT2JqZWN0RGF0YT4KLSAgQ3JlYXRlRmV0Y2hDbGllbnRTZXR0aW5nc09iamVjdERhdGEoY29uc3QgS1VSTCYgc2NyaXB0X3VybCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2VjdXJpdHlPcmlnaW4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBIdHRwc1N0YXRlJiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29yazo6bW9qb206OklQQWRkcmVzc1NwYWNlKTsKKyAgQ3JlYXRlRmV0Y2hDbGllbnRTZXR0aW5nc09iamVjdERhdGEoCisgICAgICBjb25zdCBLVVJMJiBzY3JpcHRfdXJsLAorICAgICAgY29uc3QgU2VjdXJpdHlPcmlnaW4qLAorICAgICAgY29uc3QgSHR0cHNTdGF0ZSYsCisgICAgICBuZXR3b3JrOjptb2pvbTo6SVBBZGRyZXNzU3BhY2UsCisgICAgICBjb25zdCBXZWJGZXRjaENsaWVudFNldHRpbmdzT2JqZWN0JiBwYXNzZWRfc2V0dGluZ3Nfb2JqZWN0KTsKIAogICAvLyBDbGllbnQgbXVzdCByZW1haW4gdmFsaWQgdGhyb3VnaCB0aGUgZW50aXJlIGxpZmUgdGltZSBvZiB0aGUgd29ya2VyLgogICBXZWJTZXJ2aWNlV29ya2VyQ29udGV4dENsaWVudCogY29uc3Qgd29ya2VyX2NvbnRleHRfY2xpZW50XzsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvZ2FtZXBhZC9uYXZpZ2F0b3JfZ2FtZXBhZC5jYyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvZ2FtZXBhZC9uYXZpZ2F0b3JfZ2FtZXBhZC5jYwppbmRleCBlYTQ5NDZlLi5iNTliMjc1IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL2dhbWVwYWQvbmF2aWdhdG9yX2dhbWVwYWQuY2MKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy9nYW1lcGFkL25hdmlnYXRvcl9nYW1lcGFkLmNjCkBAIC0xMTQsNiArMTE0LDE3IEBACiAgIH0KICAgaXNfZ2FtZXBhZHNfZXhwb3NlZF8gPSB0cnVlOwogCisgIEV4ZWN1dGlvbkNvbnRleHQqIGNvbnRleHQgPQorICAgICAgRG9tV2luZG93KCkgPyBEb21XaW5kb3coKS0+R2V0RXhlY3V0aW9uQ29udGV4dCgpIDogbnVsbHB0cjsKKworICBpZiAoR2V0RnJhbWUoKSAmJiBHZXRGcmFtZSgpLT5Jc0Nyb3NzT3JpZ2luU3ViZnJhbWUoKSkgeworICAgIFVzZUNvdW50ZXI6OkNvdW50KGNvbnRleHQsIFdlYkZlYXR1cmU6OmtHZXRHYW1lcGFkc0Zyb21Dcm9zc09yaWdpblN1YmZyYW1lKTsKKyAgfQorCisgIGlmIChjb250ZXh0ICYmICFjb250ZXh0LT5Jc1NlY3VyZUNvbnRleHQoKSkgeworICAgIFVzZUNvdW50ZXI6OkNvdW50KGNvbnRleHQsIFdlYkZlYXR1cmU6OmtHZXRHYW1lcGFkc0Zyb21JbnNlY3VyZUNvbnRleHQpOworICB9CisKICAgcmV0dXJuIGdhbWVwYWRzXy5HZXQoKTsKIH0KIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy9wYXltZW50cy9wYXltZW50X2hhbmRsZXJfdXRpbHMuY2MgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL3BheW1lbnRzL3BheW1lbnRfaGFuZGxlcl91dGlscy5jYwppbmRleCA5NmY2MjViYy4uNTdjZTg0OCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy9wYXltZW50cy9wYXltZW50X2hhbmRsZXJfdXRpbHMuY2MKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy9wYXltZW50cy9wYXltZW50X2hhbmRsZXJfdXRpbHMuY2MKQEAgLTQsNiArNCw3IEBACiAKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL3BheW1lbnRzL3BheW1lbnRfaGFuZGxlcl91dGlscy5oIgogCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcHVibGljL21vam9tL3NlcnZpY2Vfd29ya2VyL3NlcnZpY2Vfd29ya2VyX2Vycm9yX3R5cGUubW9qb20tYmxpbmsuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL2V4ZWN1dGlvbl9jb250ZXh0L2V4ZWN1dGlvbl9jb250ZXh0LmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvY29yZS9pbnNwZWN0b3IvY29uc29sZV9tZXNzYWdlLmgiCiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvcGF5bWVudHMvcGF5bWVudF9oYW5kbGVyX3V0aWxzLmggYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL3BheW1lbnRzL3BheW1lbnRfaGFuZGxlcl91dGlscy5oCmluZGV4IDYzYTRmYWUuLmQxZDgyNGYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvcGF5bWVudHMvcGF5bWVudF9oYW5kbGVyX3V0aWxzLmgKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy9wYXltZW50cy9wYXltZW50X2hhbmRsZXJfdXRpbHMuaApAQCAtNSw3ICs1LDcgQEAKICNpZm5kZWYgVEhJUkRfUEFSVFlfQkxJTktfUkVOREVSRVJfTU9EVUxFU19QQVlNRU5UU19QQVlNRU5UX0hBTkRMRVJfVVRJTFNfSF8KICNkZWZpbmUgVEhJUkRfUEFSVFlfQkxJTktfUkVOREVSRVJfTU9EVUxFU19QQVlNRU5UU19QQVlNRU5UX0hBTkRMRVJfVVRJTFNfSF8KIAotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYy9tb2pvbS9zZXJ2aWNlX3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9lcnJvcl90eXBlLm1vam9tLWJsaW5rLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcHVibGljL21vam9tL3NlcnZpY2Vfd29ya2VyL3NlcnZpY2Vfd29ya2VyX2Vycm9yX3R5cGUubW9qb20tYmxpbmstZm9yd2FyZC5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL3d0Zi9hbGxvY2F0b3IvYWxsb2NhdG9yLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vd3RmL3RleHQvd3RmX3N0cmluZy5oIgogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL3BheW1lbnRzL3BheW1lbnRfcmVxdWVzdC5oIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy9wYXltZW50cy9wYXltZW50X3JlcXVlc3QuaAppbmRleCA2MjEwMTg2MS4uMjMxNWZmNiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy9wYXltZW50cy9wYXltZW50X3JlcXVlc3QuaAorKysgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL3BheW1lbnRzL3BheW1lbnRfcmVxdWVzdC5oCkBAIC03LDcgKzcsNyBAQAogCiAjaW5jbHVkZSAiYmFzZS9tYWNyb3MuaCIKICNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcmVmcHRyLmgiCi0jaW5jbHVkZSAiY29tcG9uZW50cy9wYXltZW50cy9tb2pvbS9wYXltZW50X3JlcXVlc3RfZGF0YS5tb2pvbS1ibGluay5oIgorI2luY2x1ZGUgImNvbXBvbmVudHMvcGF5bWVudHMvbW9qb20vcGF5bWVudF9yZXF1ZXN0X2RhdGEubW9qb20tYmxpbmstZm9yd2FyZC5oIgogI2luY2x1ZGUgIm1vam8vcHVibGljL2NwcC9iaW5kaW5ncy9yZWNlaXZlci5oIgogI2luY2x1ZGUgIm1vam8vcHVibGljL2NwcC9iaW5kaW5ncy9yZW1vdGUuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvbW9qb20vcGF5bWVudHMvcGF5bWVudF9yZXF1ZXN0Lm1vam9tLWJsaW5rLmgiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL3BheW1lbnRzL3BheW1lbnRfcmVxdWVzdF9yZXNwb25kX3dpdGhfb2JzZXJ2ZXIuaCBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvcGF5bWVudHMvcGF5bWVudF9yZXF1ZXN0X3Jlc3BvbmRfd2l0aF9vYnNlcnZlci5oCmluZGV4IDBiNTRmYzIuLmE5NDI4ZGMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvcGF5bWVudHMvcGF5bWVudF9yZXF1ZXN0X3Jlc3BvbmRfd2l0aF9vYnNlcnZlci5oCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvcGF5bWVudHMvcGF5bWVudF9yZXF1ZXN0X3Jlc3BvbmRfd2l0aF9vYnNlcnZlci5oCkBAIC02LDcgKzYsNyBAQAogI2RlZmluZSBUSElSRF9QQVJUWV9CTElOS19SRU5ERVJFUl9NT0RVTEVTX1BBWU1FTlRTX1BBWU1FTlRfUkVRVUVTVF9SRVNQT05EX1dJVEhfT0JTRVJWRVJfSF8KIAogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYy9tb2pvbS9wYXltZW50cy9wYXltZW50X2FwcC5tb2pvbS1ibGluay5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYy9tb2pvbS9zZXJ2aWNlX3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9lcnJvcl90eXBlLm1vam9tLWJsaW5rLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcHVibGljL21vam9tL3NlcnZpY2Vfd29ya2VyL3NlcnZpY2Vfd29ya2VyX2Vycm9yX3R5cGUubW9qb20tYmxpbmstZm9yd2FyZC5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvbW9kdWxlc19leHBvcnQuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL3NlcnZpY2Vfd29ya2VyL3Jlc3BvbmRfd2l0aF9vYnNlcnZlci5oIgogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL3BheW1lbnRzL3BheW1lbnRfcmVzcG9uc2UuaCBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvcGF5bWVudHMvcGF5bWVudF9yZXNwb25zZS5oCmluZGV4IDA1YWY2NTRkLi5jODkwYjM3IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL3BheW1lbnRzL3BheW1lbnRfcmVzcG9uc2UuaAorKysgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL3BheW1lbnRzL3BheW1lbnRfcmVzcG9uc2UuaApAQCAtNiw3ICs2LDcgQEAKICNkZWZpbmUgVEhJUkRfUEFSVFlfQkxJTktfUkVOREVSRVJfTU9EVUxFU19QQVlNRU5UU19QQVlNRU5UX1JFU1BPTlNFX0hfCiAKICNpbmNsdWRlICJiYXNlL21hY3Jvcy5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYy9tb2pvbS9wYXltZW50cy9wYXltZW50X3JlcXVlc3QubW9qb20tYmxpbmsuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvbW9qb20vcGF5bWVudHMvcGF5bWVudF9yZXF1ZXN0Lm1vam9tLWJsaW5rLWZvcndhcmQuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9iaW5kaW5ncy9jb3JlL3Y4L2FjdGl2ZV9zY3JpcHRfd3JhcHBhYmxlLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvYmluZGluZ3MvY29yZS92OC9zY3JpcHRfcHJvbWlzZS5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2JpbmRpbmdzL2NvcmUvdjgvc2NyaXB0X3ZhbHVlLmgiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL3BlZXJjb25uZWN0aW9uL2FkYXB0ZXJzL3AycF9xdWljX3N0cmVhbV91bml0dGVzdC5jYyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvcGVlcmNvbm5lY3Rpb24vYWRhcHRlcnMvcDJwX3F1aWNfc3RyZWFtX3VuaXR0ZXN0LmNjCmluZGV4IGVlYzlmZjguLmNhMzA4OGMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvcGVlcmNvbm5lY3Rpb24vYWRhcHRlcnMvcDJwX3F1aWNfc3RyZWFtX3VuaXR0ZXN0LmNjCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvcGVlcmNvbm5lY3Rpb24vYWRhcHRlcnMvcDJwX3F1aWNfc3RyZWFtX3VuaXR0ZXN0LmNjCkBAIC0xNzQsNyArMTc0LDIzIEBACiAKICAgcXVpYzo6UXVpY1JzdFN0cmVhbUZyYW1lIHJzdF9mcmFtZShxdWljOjprSW52YWxpZENvbnRyb2xGcmFtZUlkLCBrU3RyZWFtSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVpYzo6UVVJQ19TVFJFQU1fQ0FOQ0VMTEVELCAwKTsKKyAgaWYgKCFWZXJzaW9uSGFzSWV0ZlF1aWNGcmFtZXMoY29ubmVjdGlvbl8tPnZlcnNpb24oKS50cmFuc3BvcnRfdmVyc2lvbikpIHsKKyAgICAvLyBHb29nbGUgUlNUX1NUUkVBTSBjbG9zZXMgdGhlIHN0cmVhbSBpbiBib3RoIGRpcmVjdGlvbnMuIEEgUlNUX1NUUkVBTQorICAgIC8vIGlzIHRoZW4gc2VudCB0byB0aGUgcGVlciB0byBjb21tdW5pY2F0ZSB0aGUgZmluYWwgYnl0ZSBvZmZzZXQuCisgICAgRVhQRUNUX0NBTEwoc2Vzc2lvbl8sCisgICAgICAgICAgICAgICAgU2VuZFJzdFN0cmVhbShrU3RyZWFtSWQsIHF1aWM6OlFVSUNfUlNUX0FDS05PV0xFREdFTUVOVCwgMCkpOworICB9CiAgIHN0cmVhbV8tPk9uU3RyZWFtUmVzZXQocnN0X2ZyYW1lKTsKKyAgaWYgKFZlcnNpb25IYXNJZXRmUXVpY0ZyYW1lcyhjb25uZWN0aW9uXy0+dmVyc2lvbigpLnRyYW5zcG9ydF92ZXJzaW9uKSkgeworICAgIC8vIEluIElFVEYgUVVJQywgdGhlIFJTVF9TVFJFQU0gb25seSBjbG9zZXMgdGhlIHN0cmVhbSBpbiBvbmUgZGlyZWN0aW9uLgorICAgIC8vIEEgU1RPUF9TRU5ESU5HIGZyYW1lIGluIHJlcXVpcmUgdG8gaW5kdWNlIHRoZSBhIFJTVF9TVFJFQU0gYmVpbmcKKyAgICAvLyBzZW5kIHRvIGNsb3NlIHRoZSBvdGhlciBkaXJlY3Rpb24uCisgICAgRVhQRUNUX0NBTEwoKmNvbm5lY3Rpb25fLCBTZW5kQ29udHJvbEZyYW1lKF8pKTsKKyAgICBFWFBFQ1RfQ0FMTCgqY29ubmVjdGlvbl8sIE9uU3RyZWFtUmVzZXQoa1N0cmVhbUlkLCB0ZXN0aW5nOjpfKSk7CisgICAgcXVpYzo6UXVpY1N0b3BTZW5kaW5nRnJhbWUgc3RvcF9zZW5kaW5nX2ZyYW1lKHF1aWM6OmtJbnZhbGlkQ29udHJvbEZyYW1lSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTdHJlYW1JZCwgMCk7CisgICAgc2Vzc2lvbl8uT25TdG9wU2VuZGluZ0ZyYW1lKHN0b3Bfc2VuZGluZ19mcmFtZSk7CisgIH0KIAogICBFWFBFQ1RfVFJVRShzdHJlYW1fLT5Jc0Nsb3NlZEZvclRlc3RpbmcoKSk7CiB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL3ByZXNlbnRhdGlvbi9tb2NrX3ByZXNlbnRhdGlvbl9zZXJ2aWNlLmggYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL3ByZXNlbnRhdGlvbi9tb2NrX3ByZXNlbnRhdGlvbl9zZXJ2aWNlLmgKaW5kZXggY2M1NzBkYWMuLjIzNmEyYzIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvcHJlc2VudGF0aW9uL21vY2tfcHJlc2VudGF0aW9uX3NlcnZpY2UuaAorKysgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL3ByZXNlbnRhdGlvbi9tb2NrX3ByZXNlbnRhdGlvbl9zZXJ2aWNlLmgKQEAgLTcsNyArNyw3IEBACiAKICNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvYmluZGluZ3MvcGVuZGluZ19yZW1vdGUuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvbW9qb20vcHJlc2VudGF0aW9uL3ByZXNlbnRhdGlvbi5tb2pvbS1ibGluay5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYy9tb2pvbS9wcmVzZW50YXRpb24vcHJlc2VudGF0aW9uLm1vam9tLWJsaW5rLWZvcndhcmQuaCIKIAogbmFtZXNwYWNlIGJsaW5rIHsKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy9wcmVzZW50YXRpb24vcHJlc2VudGF0aW9uX2F2YWlsYWJpbGl0eV9vYnNlcnZlci5oIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy9wcmVzZW50YXRpb24vcHJlc2VudGF0aW9uX2F2YWlsYWJpbGl0eV9vYnNlcnZlci5oCmluZGV4IGVmZDQyMDMuLjVhYzFlNDMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvcHJlc2VudGF0aW9uL3ByZXNlbnRhdGlvbl9hdmFpbGFiaWxpdHlfb2JzZXJ2ZXIuaAorKysgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL3ByZXNlbnRhdGlvbi9wcmVzZW50YXRpb25fYXZhaWxhYmlsaXR5X29ic2VydmVyLmgKQEAgLTUsNyArNSw3IEBACiAjaWZuZGVmIFRISVJEX1BBUlRZX0JMSU5LX1JFTkRFUkVSX01PRFVMRVNfUFJFU0VOVEFUSU9OX1BSRVNFTlRBVElPTl9BVkFJTEFCSUxJVFlfT0JTRVJWRVJfSF8KICNkZWZpbmUgVEhJUkRfUEFSVFlfQkxJTktfUkVOREVSRVJfTU9EVUxFU19QUkVTRU5UQVRJT05fUFJFU0VOVEFUSU9OX0FWQUlMQUJJTElUWV9PQlNFUlZFUl9IXwogCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcHVibGljL21vam9tL3ByZXNlbnRhdGlvbi9wcmVzZW50YXRpb24ubW9qb20tYmxpbmsuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvbW9qb20vcHJlc2VudGF0aW9uL3ByZXNlbnRhdGlvbi5tb2pvbS1ibGluay1mb3J3YXJkLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vaGVhcC9nYXJiYWdlX2NvbGxlY3RlZC5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL3d0Zi92ZWN0b3IuaCIKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy9wcmVzZW50YXRpb24vcHJlc2VudGF0aW9uX2Nvbm5lY3Rpb25fY2FsbGJhY2tzLmggYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL3ByZXNlbnRhdGlvbi9wcmVzZW50YXRpb25fY29ubmVjdGlvbl9jYWxsYmFja3MuaAppbmRleCBlZjZiYjQyZS4uMGRhYzczOCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy9wcmVzZW50YXRpb24vcHJlc2VudGF0aW9uX2Nvbm5lY3Rpb25fY2FsbGJhY2tzLmgKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy9wcmVzZW50YXRpb24vcHJlc2VudGF0aW9uX2Nvbm5lY3Rpb25fY2FsbGJhY2tzLmgKQEAgLTgsNyArOCw3IEBACiAjaW5jbHVkZSAiYmFzZS9tYWNyb3MuaCIKICNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvYmluZGluZ3MvcGVuZGluZ19yZWNlaXZlci5oIgogI2luY2x1ZGUgIm1vam8vcHVibGljL2NwcC9iaW5kaW5ncy9wZW5kaW5nX3JlbW90ZS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYy9tb2pvbS9wcmVzZW50YXRpb24vcHJlc2VudGF0aW9uLm1vam9tLWJsaW5rLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcHVibGljL21vam9tL3ByZXNlbnRhdGlvbi9wcmVzZW50YXRpb24ubW9qb20tYmxpbmstZm9yd2FyZC5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL2hlYXAvcGVyc2lzdGVudC5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL3d0Zi9hbGxvY2F0b3IvYWxsb2NhdG9yLmgiCiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvcHJlc2VudGF0aW9uL3ByZXNlbnRhdGlvbl9lcnJvci5jYyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvcHJlc2VudGF0aW9uL3ByZXNlbnRhdGlvbl9lcnJvci5jYwppbmRleCA3ZjlkYjY5Li43MjA4M2E1IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL3ByZXNlbnRhdGlvbi9wcmVzZW50YXRpb25fZXJyb3IuY2MKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy9wcmVzZW50YXRpb24vcHJlc2VudGF0aW9uX2Vycm9yLmNjCkBAIC00LDYgKzQsNyBAQAogCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy9wcmVzZW50YXRpb24vcHJlc2VudGF0aW9uX2Vycm9yLmgiCiAKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvbW9qb20vcHJlc2VudGF0aW9uL3ByZXNlbnRhdGlvbi5tb2pvbS1ibGluay5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL2hlYXAvaGVhcC5oIgogCiBuYW1lc3BhY2UgYmxpbmsgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy9wcmVzZW50YXRpb24vcHJlc2VudGF0aW9uX2Vycm9yLmggYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL3ByZXNlbnRhdGlvbi9wcmVzZW50YXRpb25fZXJyb3IuaAppbmRleCA0NmNiNjVmLi42MmY1ZmNiZCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy9wcmVzZW50YXRpb24vcHJlc2VudGF0aW9uX2Vycm9yLmgKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy9wcmVzZW50YXRpb24vcHJlc2VudGF0aW9uX2Vycm9yLmgKQEAgLTUsNyArNSw3IEBACiAjaWZuZGVmIFRISVJEX1BBUlRZX0JMSU5LX1JFTkRFUkVSX01PRFVMRVNfUFJFU0VOVEFUSU9OX1BSRVNFTlRBVElPTl9FUlJPUl9IXwogI2RlZmluZSBUSElSRF9QQVJUWV9CTElOS19SRU5ERVJFUl9NT0RVTEVTX1BSRVNFTlRBVElPTl9QUkVTRU5UQVRJT05fRVJST1JfSF8KIAotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYy9tb2pvbS9wcmVzZW50YXRpb24vcHJlc2VudGF0aW9uLm1vam9tLWJsaW5rLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcHVibGljL21vam9tL3ByZXNlbnRhdGlvbi9wcmVzZW50YXRpb24ubW9qb20tYmxpbmstZm9yd2FyZC5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvZG9tL2RvbV9leGNlcHRpb24uaCIKIAogbmFtZXNwYWNlIGJsaW5rIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvcHVzaF9tZXNzYWdpbmcvcHVzaF9lcnJvci5jYyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvcHVzaF9tZXNzYWdpbmcvcHVzaF9lcnJvci5jYwppbmRleCBjMmVkYzBkMC4uMWFlMjg4YyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy9wdXNoX21lc3NhZ2luZy9wdXNoX2Vycm9yLmNjCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvcHVzaF9tZXNzYWdpbmcvcHVzaF9lcnJvci5jYwpAQCAtNCw2ICs0LDcgQEAKIAogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvcHVzaF9tZXNzYWdpbmcvcHVzaF9lcnJvci5oIgogCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcHVibGljL21vam9tL3B1c2hfbWVzc2FnaW5nL3B1c2hfbWVzc2FnaW5nLm1vam9tLWJsaW5rLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvY29yZS9kb20vZG9tX2V4Y2VwdGlvbi5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL2hlYXAvaGVhcC5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL3d0Zi9hc3NlcnRpb25zLmgiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL3B1c2hfbWVzc2FnaW5nL3B1c2hfZXJyb3IuaCBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvcHVzaF9tZXNzYWdpbmcvcHVzaF9lcnJvci5oCmluZGV4IDA0NTg3OGQuLmI0OGE4ZjQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvcHVzaF9tZXNzYWdpbmcvcHVzaF9lcnJvci5oCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvcHVzaF9tZXNzYWdpbmcvcHVzaF9lcnJvci5oCkBAIC01LDcgKzUsNyBAQAogI2lmbmRlZiBUSElSRF9QQVJUWV9CTElOS19SRU5ERVJFUl9NT0RVTEVTX1BVU0hfTUVTU0FHSU5HX1BVU0hfRVJST1JfSF8KICNkZWZpbmUgVEhJUkRfUEFSVFlfQkxJTktfUkVOREVSRVJfTU9EVUxFU19QVVNIX01FU1NBR0lOR19QVVNIX0VSUk9SX0hfCiAKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvbW9qb20vcHVzaF9tZXNzYWdpbmcvcHVzaF9tZXNzYWdpbmcubW9qb20tYmxpbmsuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvbW9qb20vcHVzaF9tZXNzYWdpbmcvcHVzaF9tZXNzYWdpbmcubW9qb20tYmxpbmstZm9yd2FyZC5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvZG9tL2RvbV9leGNlcHRpb24uaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9oZWFwL2hhbmRsZS5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL3d0Zi9hbGxvY2F0b3IvYWxsb2NhdG9yLmgiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL3B1c2hfbWVzc2FnaW5nL3B1c2hfbWVzc2FnaW5nX2NsaWVudC5jYyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvcHVzaF9tZXNzYWdpbmcvcHVzaF9tZXNzYWdpbmdfY2xpZW50LmNjCmluZGV4IGVjZDY5YzYuLjY5MmRmYzQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvcHVzaF9tZXNzYWdpbmcvcHVzaF9tZXNzYWdpbmdfY2xpZW50LmNjCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvcHVzaF9tZXNzYWdpbmcvcHVzaF9tZXNzYWdpbmdfY2xpZW50LmNjCkBAIC04LDYgKzgsNyBAQAogI2luY2x1ZGUgPHV0aWxpdHk+CiAKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvY29tbW9uL2Jyb3dzZXJfaW50ZXJmYWNlX2Jyb2tlcl9wcm94eS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYy9tb2pvbS9tYW5pZmVzdC9tYW5pZmVzdC5tb2pvbS1ibGluay5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYy9tb2pvbS9wdXNoX21lc3NhZ2luZy9wdXNoX21lc3NhZ2luZ19zdGF0dXMubW9qb20tYmxpbmsuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvcGxhdGZvcm0vcGxhdGZvcm0uaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvd2ViL3dlYl9sb2NhbF9mcmFtZS5oIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy9wdXNoX21lc3NhZ2luZy9wdXNoX21lc3NhZ2luZ19jbGllbnQuaCBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvcHVzaF9tZXNzYWdpbmcvcHVzaF9tZXNzYWdpbmdfY2xpZW50LmgKaW5kZXggYTE0Nzg2NmYuLmRhYjQwZDAgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvcHVzaF9tZXNzYWdpbmcvcHVzaF9tZXNzYWdpbmdfY2xpZW50LmgKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy9wdXNoX21lc3NhZ2luZy9wdXNoX21lc3NhZ2luZ19jbGllbnQuaApAQCAtMTAsNyArMTAsNyBAQAogCiAjaW5jbHVkZSAiYmFzZS9tYWNyb3MuaCIKICNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvYmluZGluZ3MvcmVtb3RlLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcHVibGljL21vam9tL21hbmlmZXN0L21hbmlmZXN0Lm1vam9tLWJsaW5rLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcHVibGljL21vam9tL21hbmlmZXN0L21hbmlmZXN0Lm1vam9tLWJsaW5rLWZvcndhcmQuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvbW9qb20vcHVzaF9tZXNzYWdpbmcvcHVzaF9tZXNzYWdpbmcubW9qb20tYmxpbmsuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL2ZyYW1lL2xvY2FsX2ZyYW1lLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy9wdXNoX21lc3NhZ2luZy9wdXNoX3N1YnNjcmlwdGlvbl9jYWxsYmFja3MuaCIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvcHVzaF9tZXNzYWdpbmcvcHVzaF9wcm92aWRlci5oIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy9wdXNoX21lc3NhZ2luZy9wdXNoX3Byb3ZpZGVyLmgKaW5kZXggNzllNjk4NDEuLjRhYzQ5ZTggMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvcHVzaF9tZXNzYWdpbmcvcHVzaF9wcm92aWRlci5oCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvcHVzaF9tZXNzYWdpbmcvcHVzaF9wcm92aWRlci5oCkBAIC0xMyw3ICsxMyw3IEBACiAjaW5jbHVkZSAiYmFzZS9zaW5nbGVfdGhyZWFkX3Rhc2tfcnVubmVyLmgiCiAjaW5jbHVkZSAibW9qby9wdWJsaWMvY3BwL2JpbmRpbmdzL3JlbW90ZS5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYy9tb2pvbS9wdXNoX21lc3NhZ2luZy9wdXNoX21lc3NhZ2luZy5tb2pvbS1ibGluay5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYy9tb2pvbS9wdXNoX21lc3NhZ2luZy9wdXNoX21lc3NhZ2luZ19zdGF0dXMubW9qb20tYmxpbmsuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvbW9qb20vcHVzaF9tZXNzYWdpbmcvcHVzaF9tZXNzYWdpbmdfc3RhdHVzLm1vam9tLWJsaW5rLWZvcndhcmQuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL3B1c2hfbWVzc2FnaW5nL3B1c2hfc3Vic2NyaXB0aW9uX2NhbGxiYWNrcy5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvc2VydmljZV93b3JrZXIvc2VydmljZV93b3JrZXJfcmVnaXN0cmF0aW9uLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vc3VwcGxlbWVudGFibGUuaCIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvcHVzaF9tZXNzYWdpbmcvcHVzaF9zdWJzY3JpcHRpb24uaCBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvcHVzaF9tZXNzYWdpbmcvcHVzaF9zdWJzY3JpcHRpb24uaAppbmRleCAzYzk5NDk5Li44MDk4ZTUyIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL3B1c2hfbWVzc2FnaW5nL3B1c2hfc3Vic2NyaXB0aW9uLmgKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy9wdXNoX21lc3NhZ2luZy9wdXNoX3N1YnNjcmlwdGlvbi5oCkBAIC04LDcgKzgsNyBAQAogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlICJiYXNlL2d0ZXN0X3Byb2RfdXRpbC5oIgogI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9yZWZwdHIuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvbW9qb20vcHVzaF9tZXNzYWdpbmcvcHVzaF9tZXNzYWdpbmcubW9qb20tYmxpbmsuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvbW9qb20vcHVzaF9tZXNzYWdpbmcvcHVzaF9tZXNzYWdpbmcubW9qb20tYmxpbmstZm9yd2FyZC5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2JpbmRpbmdzL2NvcmUvdjgvc2NyaXB0X3Byb21pc2UuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9iaW5kaW5ncy9jb3JlL3Y4L3NjcmlwdF92YWx1ZS5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvZG9tL2RvbV90aW1lX3N0YW1wLmgiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL3NjcmVlbl9vcmllbnRhdGlvbi9ERVBTIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy9zY3JlZW5fb3JpZW50YXRpb24vREVQUwppbmRleCA0NmVhNDhlLi5hOGU0YmY4MCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy9zY3JlZW5fb3JpZW50YXRpb24vREVQUworKysgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL3NjcmVlbl9vcmllbnRhdGlvbi9ERVBTCkBAIC0xLDYgKzEsNyBAQAogaW5jbHVkZV9ydWxlcyA9IFsKICAgICAiK21vam8vcHVibGljL2NwcC9iaW5kaW5ncy9hc3NvY2lhdGVkX2ludGVyZmFjZV9wdHIuaCIsCiAgICAgIitzZXJ2aWNlcy9kZXZpY2UvcHVibGljL21vam9tL3NjcmVlbl9vcmllbnRhdGlvbi5tb2pvbS1ibGluay5oIiwKKyAgICAiK3NlcnZpY2VzL2RldmljZS9wdWJsaWMvbW9qb20vc2NyZWVuX29yaWVudGF0aW9uLm1vam9tLWJsaW5rLWZvcndhcmQuaCIsCiAgICAgIi10aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzIiwKICAgICAiK3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvZXZlbnRfdGFyZ2V0X21vZHVsZXMuaCIsCiAgICAgIit0aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL21vZHVsZXNfZXhwb3J0LmgiLApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy9zZXJ2aWNlX3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9nbG9iYWxfc2NvcGUuY2MgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL3NlcnZpY2Vfd29ya2VyL3NlcnZpY2Vfd29ya2VyX2dsb2JhbF9zY29wZS5jYwppbmRleCA3OGJkYmRjMi4uYzUwOTUwNDUzIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL3NlcnZpY2Vfd29ya2VyL3NlcnZpY2Vfd29ya2VyX2dsb2JhbF9zY29wZS5jYworKysgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL3NlcnZpY2Vfd29ya2VyL3NlcnZpY2Vfd29ya2VyX2dsb2JhbF9zY29wZS5jYwpAQCAtMzAwLDcgKzMwMCw3IEBACiAgICAgICAgICAgICAgICAgICAgIG1vam9tOjpSZXF1ZXN0Q29udGV4dFR5cGU6OlNFUlZJQ0VfV09SS0VSLCBjcmVkZW50aWFsc19tb2RlLAogICAgICAgICAgICAgICAgICAgICBNb2R1bGVTY3JpcHRDdXN0b21GZXRjaFR5cGU6OmtXb3JrZXJDb25zdHJ1Y3RvciwKICAgICAgICAgICAgICAgICAgICAgTWFrZUdhcmJhZ2VDb2xsZWN0ZWQ8U2VydmljZVdvcmtlck1vZHVsZVRyZWVDbGllbnQ+KAotICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxhdG9yOjpGcm9tKFNjcmlwdENvbnRyb2xsZXIoKS0+R2V0U2NyaXB0U3RhdGUoKSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNjcmlwdENvbnRyb2xsZXIoKS0+R2V0U2NyaXB0U3RhdGUoKSkpOwogfQogCiB2b2lkIFNlcnZpY2VXb3JrZXJHbG9iYWxTY29wZTo6RGlzcG9zZSgpIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvc2VydmljZV93b3JrZXIvc2VydmljZV93b3JrZXJfbW9kdWxlX3RyZWVfY2xpZW50LmNjIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy9zZXJ2aWNlX3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9tb2R1bGVfdHJlZV9jbGllbnQuY2MKaW5kZXggMDRkNzZkYS4uNjEzNmNlMyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy9zZXJ2aWNlX3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9tb2R1bGVfdHJlZV9jbGllbnQuY2MKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy9zZXJ2aWNlX3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9tb2R1bGVfdHJlZV9jbGllbnQuY2MKQEAgLTEyLDggKzEyLDggQEAKIG5hbWVzcGFjZSBibGluayB7CiAKIFNlcnZpY2VXb3JrZXJNb2R1bGVUcmVlQ2xpZW50OjpTZXJ2aWNlV29ya2VyTW9kdWxlVHJlZUNsaWVudCgKLSAgICBNb2R1bGF0b3IqIG1vZHVsYXRvcikKLSAgICA6IG1vZHVsYXRvcl8obW9kdWxhdG9yKSB7fQorICAgIFNjcmlwdFN0YXRlKiBzY3JpcHRfc3RhdGUpCisgICAgOiBzY3JpcHRfc3RhdGVfKHNjcmlwdF9zdGF0ZSkge30KIAogLy8gVGhpcyBjbGllbnQgaXMgdXNlZCBmb3IgYm90aCBuZXcgYW5kIGluc3RhbGxlZCBzY3JpcHRzLiBJbiB0aGUgbmV3IHNjcmlwdHMKIC8vIGNhc2UsIHRoaXMgaXMgYSBwYXJ0aWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjdXN0b20gInBlcmZvcm0gdGhlIGZldGNoIiBob29rCkBAIC0yMyw5ICsyMyw4IEBACiAvLyBzY3JpcHQgcmVzb3VyY2UuCiB2b2lkIFNlcnZpY2VXb3JrZXJNb2R1bGVUcmVlQ2xpZW50OjpOb3RpZnlNb2R1bGVUcmVlTG9hZEZpbmlzaGVkKAogICAgIE1vZHVsZVNjcmlwdCogbW9kdWxlX3NjcmlwdCkgewotICBhdXRvKiBleGVjdXRpb25fY29udGV4dCA9Ci0gICAgICBFeGVjdXRpb25Db250ZXh0OjpGcm9tKG1vZHVsYXRvcl8tPkdldFNjcmlwdFN0YXRlKCkpOwotICBhdXRvKiB3b3JrZXJfZ2xvYmFsX3Njb3BlID0gVG88V29ya2VyR2xvYmFsU2NvcGU+KGV4ZWN1dGlvbl9jb250ZXh0KTsKKyAgYXV0byogd29ya2VyX2dsb2JhbF9zY29wZSA9CisgICAgICBUbzxXb3JrZXJHbG9iYWxTY29wZT4oRXhlY3V0aW9uQ29udGV4dDo6RnJvbShzY3JpcHRfc3RhdGVfKSk7CiAgIGJsaW5rOjpXb3JrZXJSZXBvcnRpbmdQcm94eSYgd29ya2VyX3JlcG9ydGluZ19wcm94eSA9CiAgICAgICB3b3JrZXJfZ2xvYmFsX3Njb3BlLT5SZXBvcnRpbmdQcm94eSgpOwogCkBAIC00OCw3ICs0Nyw3IEBACiB9CiAKIHZvaWQgU2VydmljZVdvcmtlck1vZHVsZVRyZWVDbGllbnQ6OlRyYWNlKGJsaW5rOjpWaXNpdG9yKiB2aXNpdG9yKSB7Ci0gIHZpc2l0b3ItPlRyYWNlKG1vZHVsYXRvcl8pOworICB2aXNpdG9yLT5UcmFjZShzY3JpcHRfc3RhdGVfKTsKICAgTW9kdWxlVHJlZUNsaWVudDo6VHJhY2UodmlzaXRvcik7CiB9CiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvc2VydmljZV93b3JrZXIvc2VydmljZV93b3JrZXJfbW9kdWxlX3RyZWVfY2xpZW50LmggYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL3NlcnZpY2Vfd29ya2VyL3NlcnZpY2Vfd29ya2VyX21vZHVsZV90cmVlX2NsaWVudC5oCmluZGV4IGU2Y2FlNDkuLjk0ZTJlYzYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvc2VydmljZV93b3JrZXIvc2VydmljZV93b3JrZXJfbW9kdWxlX3RyZWVfY2xpZW50LmgKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy9zZXJ2aWNlX3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9tb2R1bGVfdHJlZV9jbGllbnQuaApAQCAtMTIsMTIgKzEyLDEzIEBACiBuYW1lc3BhY2UgYmxpbmsgewogCiBjbGFzcyBNb2R1bGVTY3JpcHQ7CitjbGFzcyBTY3JpcHRTdGF0ZTsKIAogLy8gVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBNb2R1bGVUcmVlQ2xpZW50IGZvciBzZXJ2aWNlIHdvcmtlcnMgdGhhdCBsaXZlcwogLy8gb24gdGhlIHdvcmtlciBjb250ZXh0J3MgdGhyZWFkLgogY2xhc3MgU2VydmljZVdvcmtlck1vZHVsZVRyZWVDbGllbnQgZmluYWwgOiBwdWJsaWMgTW9kdWxlVHJlZUNsaWVudCB7CiAgcHVibGljOgotICBleHBsaWNpdCBTZXJ2aWNlV29ya2VyTW9kdWxlVHJlZUNsaWVudChNb2R1bGF0b3IqKTsKKyAgZXhwbGljaXQgU2VydmljZVdvcmtlck1vZHVsZVRyZWVDbGllbnQoU2NyaXB0U3RhdGUqKTsKIAogICAvLyBJbXBsZW1lbnRzIE1vZHVsZVRyZWVDbGllbnQuCiAgIHZvaWQgTm90aWZ5TW9kdWxlVHJlZUxvYWRGaW5pc2hlZChNb2R1bGVTY3JpcHQqKSBmaW5hbDsKQEAgLTI1LDcgKzI2LDcgQEAKICAgdm9pZCBUcmFjZShibGluazo6VmlzaXRvciopIG92ZXJyaWRlOwogCiAgcHJpdmF0ZToKLSAgTWVtYmVyPE1vZHVsYXRvcj4gbW9kdWxhdG9yXzsKKyAgTWVtYmVyPFNjcmlwdFN0YXRlPiBzY3JpcHRfc3RhdGVfOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGJsaW5rCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL3dlYmdsL3dlYmdsMl9yZW5kZXJpbmdfY29udGV4dC5jYyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMvd2ViZ2wvd2ViZ2wyX3JlbmRlcmluZ19jb250ZXh0LmNjCmluZGV4IDgyZGNjODQ0Li4yMzcxM2YxMCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy93ZWJnbC93ZWJnbDJfcmVuZGVyaW5nX2NvbnRleHQuY2MKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy93ZWJnbC93ZWJnbDJfcmVuZGVyaW5nX2NvbnRleHQuY2MKQEAgLTE0Niw3ICsxNDYsNyBAQAogICBSZWdpc3RlckV4dGVuc2lvbjxXZWJHTE11bHRpRHJhd0luc3RhbmNlZD4od2ViZ2xfbXVsdGlfZHJhd19pbnN0YW5jZWRfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0RyYWZ0RXh0ZW5zaW9uKTsKICAgUmVnaXN0ZXJFeHRlbnNpb248V2ViR0xWaWRlb1RleHR1cmU+KHdlYmdsX3ZpZGVvX3RleHR1cmVfLCBrRHJhZnRFeHRlbnNpb24pOwotICBSZWdpc3RlckV4dGVuc2lvbjxPVlJNdWx0aXZpZXcyPihvdnJfbXVsdGl2aWV3Ml8sIGtEcmFmdEV4dGVuc2lvbik7CisgIFJlZ2lzdGVyRXh0ZW5zaW9uPE9WUk11bHRpdmlldzI+KG92cl9tdWx0aXZpZXcyXyk7CiB9CiAKIHZvaWQgV2ViR0wyUmVuZGVyaW5nQ29udGV4dDo6VHJhY2UoYmxpbms6OlZpc2l0b3IqIHZpc2l0b3IpIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMveHIveHIuY2MgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL3hyL3hyLmNjCmluZGV4IDk3Y2ZiYzcuLjVjYjlkYmI0IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL3hyL3hyLmNjCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMveHIveHIuY2MKQEAgLTUzMCw2ICs1MzAsMTUgQEAKICAgfQogfQogCit2b2lkIFhSOjpTZXRGcmFtZXNUaHJvdHRsZWQoY29uc3QgWFJTZXNzaW9uKiBzZXNzaW9uLCBib29sIHRocm90dGxlZCkgeworICAvLyBUaGUgc2VydmljZSBvbmx5IGNhcmVzIGlmIHRoZSBpbW1lcnNpdmUgc2Vzc2lvbiBpcyB0aHJvdHRsaW5nIGZyYW1lcy4KKyAgaWYgKHNlc3Npb24tPmltbWVyc2l2ZSgpKSB7CisgICAgLy8gSWYgd2UgaGF2ZSBhbiBpbW1lcnNpdmUgc2Vzc2lvbiwgd2Ugc2hvdWxkIGhhdmUgYSBzZXJ2aWNlLgorICAgIERDSEVDSyhzZXJ2aWNlXyk7CisgICAgc2VydmljZV8tPlNldEZyYW1lc1Rocm90dGxlZCh0aHJvdHRsZWQpOworICB9Cit9CisKIFNjcmlwdFByb21pc2UgWFI6OnN1cHBvcnRzU2Vzc2lvbihTY3JpcHRTdGF0ZSogc2NyaXB0X3N0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZyYgbW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb25TdGF0ZSYgZXhjZXB0aW9uX3N0YXRlKSB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL3hyL3hyLmggYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL3hyL3hyLmgKaW5kZXggYWExZTAxMzcuLjlkOTczMzMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMveHIveHIuaAorKysgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL3hyL3hyLmgKQEAgLTkyLDYgKzkyLDggQEAKIAogICB2b2lkIEV4aXRQcmVzZW50KCk7CiAKKyAgdm9pZCBTZXRGcmFtZXNUaHJvdHRsZWQoY29uc3QgWFJTZXNzaW9uKiBzZXNzaW9uLCBib29sIHRocm90dGxlZCk7CisKICAgYmFzZTo6VGltZVRpY2tzIE5hdmlnYXRpb25TdGFydCgpIGNvbnN0IHsgcmV0dXJuIG5hdmlnYXRpb25fc3RhcnRfOyB9CiAKICBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy94ci94cl9zZXNzaW9uLmNjIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy94ci94cl9zZXNzaW9uLmNjCmluZGV4IGM2MWI3Yjg5Li4yNjkxZjJkNiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy94ci94cl9zZXNzaW9uLmNjCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL21vZHVsZXMveHIveHJfc2Vzc2lvbi5jYwpAQCAtOTA5LDEzICs5MDksMzkgQEAKICAgICB9CiAgIH0KIAotICAvLyBXZSBjYW4gcmVxdWVzdCBhIGZyYW1lIGlmIHdlJ3JlIG5vdCBoaWRkZW4sIHdlIGRvbid0IGFscmVhZHkgaGF2ZSBhIHBlbmRpbmcKLSAgLy8gZnJhbWUsIHdlIGhhdmUgcGVuZGluZyBjYWxsYmFja3MsIGFuZCB3ZSB3aWxsIGhhdmUgYSBiYXNlIGxheWVyIHdoZW4gaXQKLSAgLy8gcmVzb2x2ZXMuCi0gIGJvb2wgY2FuX3JlcXVlc3RfZnJhbWUgPQotICAgICAgdmlzaWJpbGl0eV9zdGF0ZV8gIT0gWFJWaXNpYmlsaXR5U3RhdGU6OkhJRERFTiAmJiAhcGVuZGluZ19mcmFtZV8gJiYKLSAgICAgICFjYWxsYmFja19jb2xsZWN0aW9uXy0+SXNFbXB0eSgpICYmIHdpbGxfaGF2ZV9iYXNlX2xheWVyOwotICBpZiAoY2FuX3JlcXVlc3RfZnJhbWUpIHsKKyAgLy8gQSBwYWdlIHdpbGwgbm90IGJlIGFsbG93ZWQgdG8gZ2V0IGZyYW1lcyBpZiBpdHMgdmlzaWJpbGl0eSBzdGF0ZSBpcyBoaWRkZW4uCisgIGJvb2wgcGFnZV9hbGxvd2VkX2ZyYW1lcyA9IHZpc2liaWxpdHlfc3RhdGVfICE9IFhSVmlzaWJpbGl0eVN0YXRlOjpISURERU47CisKKyAgLy8gQSBwYWdlIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHkgaWYgaXQgd2lsbCBoYXZlIGEgYmFzZSBsYXllciB3aGVuIHRoZSBmcmFtZQorICAvLyBjYWxsYmFjayBnZXRzIHJlc29sdmVkLgorICBib29sIHBhZ2VfY29uZmlndXJlZF9wcm9wZXJseSA9IHdpbGxfaGF2ZV9iYXNlX2xheWVyOworCisgIC8vIElmIHdlIGhhdmUgYW4gb3V0c3RhbmRpbmcgY2FsbGJhY2sgcmVnaXN0ZXJlZCwgdGhlbiB3ZSBrbm93IHRoYXQgdGhlIHBhZ2UKKyAgLy8gYWN0dWFsbHkgd2FudHMgZnJhbWVzLgorICBib29sIHBhZ2Vfd2FudHNfZnJhbWUgPSAhY2FsbGJhY2tfY29sbGVjdGlvbl8tPklzRW1wdHkoKTsKKworICAvLyBBIHBhZ2UgY2FuIHByb2Nlc3MgZnJhbWVzIGlmIGl0IGhhcyBpdHMgYXBwcm9wcmlhdGUgYmFzZSBsYXllciBzZXQgYW5kIGhhcworICAvLyBpbmRpY2F0ZWQgdGhhdCBpdCBhY3R1YWxseSB3YW50cyBmcmFtZXMuCisgIGJvb2wgcGFnZV9jYW5fcHJvY2Vzc19mcmFtZXMgPSBwYWdlX2NvbmZpZ3VyZWRfcHJvcGVybHkgJiYgcGFnZV93YW50c19mcmFtZTsKKworICAvLyBXZSBjb25zaWRlciBmcmFtZXMgdG8gYmUgdGhyb3R0bGVkIGlmIHRoZSBwYWdlIGlzIG5vdCBhbGxvd2VkIGZyYW1lcywgYnV0CisgIC8vIG90aGVyd2lzZSB3b3VsZCBiZSBhYmxlIHRvIHJlY2VpdmUgdGhlbS4gVGhlcmVmb3JlLCBpZiB0aGUgcGFnZSBpc24ndCBpbiBhCisgIC8vIHN0YXRlIHRvIHByb2Nlc3MgZnJhbWVzLCBpdCBkb2Vzbid0IG1hdHRlciBpZiB3ZSBhcmUgdGhyb3R0bGluZyBpdCwgYW55CisgIC8vICJzdGFsbHMiIHNob3VsZCBiZSBhdHRyaWJ1dGVkIHRvIHRoZSBwYWdlIGJlaW5nIHBvb3JseSBiZWhhdmVkLgorICBib29sIGZyYW1lc190aHJvdHRsZWQgPSBwYWdlX2Nhbl9wcm9jZXNzX2ZyYW1lcyAmJiAhcGFnZV9hbGxvd2VkX2ZyYW1lczsKKworICAvLyBJZiBvdXIgdGhyb3R0bGVkIHN0YXRlIGhhcyBjaGFuZ2VkLCBub3RpZnkgYW55b25lIHdobyBtYXkgY2FyZQorICBpZiAoZnJhbWVzX3Rocm90dGxlZF8gIT0gZnJhbWVzX3Rocm90dGxlZCkgeworICAgIGZyYW1lc190aHJvdHRsZWRfID0gZnJhbWVzX3Rocm90dGxlZDsKKyAgICB4cl8tPlNldEZyYW1lc1Rocm90dGxlZCh0aGlzLCBmcmFtZXNfdGhyb3R0bGVkXyk7CisgIH0KKworICAvLyBXZSBjYW4gcmVxdWVzdCBhIGZyYW1lIGlmIHdlIGRvbid0IGhhdmUgb25lIGFscmVhZHkgcGVuZGluZywgdGhlIHBhZ2UgaXMKKyAgLy8gYWxsb3dlZCB0byByZXF1ZXN0IGZyYW1lcywgYW5kIHRoZSBwYWdlIGlzIHNldCB1cCB0byBwcm9wZXJseSBoYW5kbGUgZnJhbWVzCisgIC8vIGFuZCB3YW50cyBvbmUuCisgIGJvb2wgcmVxdWVzdF9mcmFtZSA9CisgICAgICAhcGVuZGluZ19mcmFtZV8gJiYgcGFnZV9hbGxvd2VkX2ZyYW1lcyAmJiBwYWdlX2Nhbl9wcm9jZXNzX2ZyYW1lczsKKyAgaWYgKHJlcXVlc3RfZnJhbWUpIHsKICAgICB4cl8tPmZyYW1lUHJvdmlkZXIoKS0+UmVxdWVzdEZyYW1lKHRoaXMpOwogICAgIHBlbmRpbmdfZnJhbWVfID0gdHJ1ZTsKICAgfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy94ci94cl9zZXNzaW9uLmggYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9tb2R1bGVzL3hyL3hyX3Nlc3Npb24uaAppbmRleCBlZDZiZDJlMC4uZjNhZjk3YyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy94ci94cl9zZXNzaW9uLmgKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvbW9kdWxlcy94ci94cl9zZXNzaW9uLmgKQEAgLTM0MSw2ICszNDEsNyBAQAogICBib29sIHJlc29sdmluZ19mcmFtZV8gPSBmYWxzZTsKICAgYm9vbCB1cGRhdGVfdmlld3NfbmV4dF9mcmFtZV8gPSBmYWxzZTsKICAgYm9vbCB2aWV3c19kaXJ0eV8gPSB0cnVlOworICBib29sIGZyYW1lc190aHJvdHRsZWRfID0gZmFsc2U7CiAKICAgLy8gSW5kaWNhdGVzIHRoYXQgd2UndmUgYWxyZWFkeSBsb2dnZWQgYSBtZXRyaWMsIHNvIGRvbid0IG5lZWQgdG8gbG9nIGl0CiAgIC8vIGFnYWluLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vZXhwb3J0ZWQvd2ViX3J1bnRpbWVfZmVhdHVyZXMuY2MgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9leHBvcnRlZC93ZWJfcnVudGltZV9mZWF0dXJlcy5jYwppbmRleCA5YTY0YzE5Li5iMWQ4NDAzIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9leHBvcnRlZC93ZWJfcnVudGltZV9mZWF0dXJlcy5jYworKysgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9leHBvcnRlZC93ZWJfcnVudGltZV9mZWF0dXJlcy5jYwpAQCAtMjI0LDYgKzIyNCwxMCBAQAogICBSdW50aW1lRW5hYmxlZEZlYXR1cmVzOjpTZXRJbXBsaWNpdFJvb3RTY3JvbGxlckVuYWJsZWQoZW5hYmxlKTsKIH0KIAordm9pZCBXZWJSdW50aW1lRmVhdHVyZXM6OkVuYWJsZUNTU09NVmlld1Njcm9sbENvb3JkaW5hdGVzKGJvb2wgZW5hYmxlKSB7CisgIFJ1bnRpbWVFbmFibGVkRmVhdHVyZXM6OlNldENTU09NVmlld1Njcm9sbENvb3JkaW5hdGVzRW5hYmxlZChlbmFibGUpOworfQorCiB2b2lkIFdlYlJ1bnRpbWVGZWF0dXJlczo6RW5hYmxlSW5wdXRNdWx0aXBsZUZpZWxkc1VJKGJvb2wgZW5hYmxlKSB7CiAgIFJ1bnRpbWVFbmFibGVkRmVhdHVyZXM6OlNldElucHV0TXVsdGlwbGVGaWVsZHNVSUVuYWJsZWQoZW5hYmxlKTsKIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL2dyYXBoaWNzL2RlY29kaW5nX2ltYWdlX2dlbmVyYXRvci5jYyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL2dyYXBoaWNzL2RlY29kaW5nX2ltYWdlX2dlbmVyYXRvci5jYwppbmRleCBkZGRlNWY2OC4uNDA1NjdmZSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vZ3JhcGhpY3MvZGVjb2RpbmdfaW1hZ2VfZ2VuZXJhdG9yLmNjCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL2dyYXBoaWNzL2RlY29kaW5nX2ltYWdlX2dlbmVyYXRvci5jYwpAQCAtMjUsOCArMjUsOCBAQAogCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vZ3JhcGhpY3MvZGVjb2RpbmdfaW1hZ2VfZ2VuZXJhdG9yLmgiCiAKLSNpbmNsdWRlIDx1dGlsaXR5PgogI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgogCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vZ3JhcGhpY3MvaW1hZ2VfZnJhbWVfZ2VuZXJhdG9yLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9za2lhX3V0aWxzLmgiCkBAIC0zOSwyNyArMzksNiBAQAogCiBuYW1lc3BhY2UgYmxpbmsgewogCi1uYW1lc3BhY2UgewotCi0vLyBUaGVzZSBmaWxlbmFtZSBleHRlbnNpb24gc3RyaW5ncyBjb21lIGZyb20gSW1hZ2VEZWNvZGVyOjpGaWxlbmFtZUV4dGVuc2lvbi4KLVBhaW50SW1hZ2U6OkltYWdlVHlwZSBGaWxlRXh0ZW5zaW9uVG9JbWFnZVR5cGUoU3RyaW5nIGltYWdlX2V4dGVuc2lvbikgewotICBpZiAoaW1hZ2VfZXh0ZW5zaW9uID09ICJwbmciKQotICAgIHJldHVybiBQYWludEltYWdlOjpJbWFnZVR5cGU6OmtQTkc7Ci0gIGlmIChpbWFnZV9leHRlbnNpb24gPT0gImpwZyIpCi0gICAgcmV0dXJuIFBhaW50SW1hZ2U6OkltYWdlVHlwZTo6a0pQRUc7Ci0gIGlmIChpbWFnZV9leHRlbnNpb24gPT0gIndlYnAiKQotICAgIHJldHVybiBQYWludEltYWdlOjpJbWFnZVR5cGU6OmtXRUJQOwotICBpZiAoaW1hZ2VfZXh0ZW5zaW9uID09ICJnaWYiKQotICAgIHJldHVybiBQYWludEltYWdlOjpJbWFnZVR5cGU6OmtHSUY7Ci0gIGlmIChpbWFnZV9leHRlbnNpb24gPT0gImljbyIpCi0gICAgcmV0dXJuIFBhaW50SW1hZ2U6OkltYWdlVHlwZTo6a0lDTzsKLSAgaWYgKGltYWdlX2V4dGVuc2lvbiA9PSAiYm1wIikKLSAgICByZXR1cm4gUGFpbnRJbWFnZTo6SW1hZ2VUeXBlOjprQk1QOwotICByZXR1cm4gUGFpbnRJbWFnZTo6SW1hZ2VUeXBlOjprSW52YWxpZDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KIC8vIHN0YXRpYwogc3RkOjp1bmlxdWVfcHRyPFNrSW1hZ2VHZW5lcmF0b3I+CiBEZWNvZGluZ0ltYWdlR2VuZXJhdG9yOjpDcmVhdGVBc1NrSW1hZ2VHZW5lcmF0b3Ioc2tfc3A8U2tEYXRhPiBkYXRhKSB7CkBAIC04OCwxMSArNjcsMTMgQEAKIAogICBXZWJWZWN0b3I8RnJhbWVNZXRhZGF0YT4gZnJhbWVzOwogICBmcmFtZXMuZW1wbGFjZV9iYWNrKEZyYW1lTWV0YWRhdGEoKSk7CisgIGNjOjpJbWFnZUhlYWRlck1ldGFkYXRhIGltYWdlX21ldGFkYXRhID0KKyAgICAgIGRlY29kZXItPk1ha2VNZXRhZGF0YUZvckRlY29kZUFjY2VsZXJhdGlvbigpOworICBpbWFnZV9tZXRhZGF0YS5hbGxfZGF0YV9yZWNlaXZlZF9wcmlvcl90b19kZWNvZGUgPSB0cnVlOwogICBza19zcDxEZWNvZGluZ0ltYWdlR2VuZXJhdG9yPiBnZW5lcmF0b3IgPSBEZWNvZGluZ0ltYWdlR2VuZXJhdG9yOjpDcmVhdGUoCiAgICAgICBzdGQ6Om1vdmUoZnJhbWUpLCBpbmZvLCBzdGQ6Om1vdmUoc2VnbWVudF9yZWFkZXIpLCBzdGQ6Om1vdmUoZnJhbWVzKSwKICAgICAgIFBhaW50SW1hZ2U6OkdldE5leHRDb250ZW50SWQoKSwgdHJ1ZSAvKiBhbGxfZGF0YV9yZWNlaXZlZCAqLywKLSAgICAgIHRydWUgLyogaXNfZWxpZ2libGVfZm9yX2FjY2VsZXJhdGVkX2RlY29kaW5nICovLAotICAgICAgZmFsc2UgLyogY2FuX3l1dl9kZWNvZGUgKi8sIGRlY29kZXItPkZpbGVuYW1lRXh0ZW5zaW9uKCkpOworICAgICAgZmFsc2UgLyogY2FuX3l1dl9kZWNvZGUgKi8sIGltYWdlX21ldGFkYXRhKTsKICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8U2tpYVBhaW50SW1hZ2VHZW5lcmF0b3I+KAogICAgICAgc3RkOjptb3ZlKGdlbmVyYXRvciksIFBhaW50SW1hZ2U6OmtEZWZhdWx0RnJhbWVJbmRleCwKICAgICAgIFBhaW50SW1hZ2U6OmtEZWZhdWx0R2VuZXJhdG9yQ2xpZW50SWQpOwpAQCAtMTA2LDE0ICs4NywxMSBAQAogICAgIFdlYlZlY3RvcjxGcmFtZU1ldGFkYXRhPiBmcmFtZXMsCiAgICAgUGFpbnRJbWFnZTo6Q29udGVudElkIGNvbnRlbnRfaWQsCiAgICAgYm9vbCBhbGxfZGF0YV9yZWNlaXZlZCwKLSAgICBib29sIGlzX2VsaWdpYmxlX2Zvcl9hY2NlbGVyYXRlZF9kZWNvZGluZywKICAgICBib29sIGNhbl95dXZfZGVjb2RlLAotICAgIFN0cmluZyBpbWFnZV90eXBlKSB7Ci0gIFBhaW50SW1hZ2U6OkltYWdlVHlwZSBwYWludF9pbWFnZV90eXBlID0gRmlsZUV4dGVuc2lvblRvSW1hZ2VUeXBlKGltYWdlX3R5cGUpOworICAgIGNvbnN0IGNjOjpJbWFnZUhlYWRlck1ldGFkYXRhJiBpbWFnZV9tZXRhZGF0YSkgewogICByZXR1cm4gc2tfc3A8RGVjb2RpbmdJbWFnZUdlbmVyYXRvcj4obmV3IERlY29kaW5nSW1hZ2VHZW5lcmF0b3IoCiAgICAgICBzdGQ6Om1vdmUoZnJhbWVfZ2VuZXJhdG9yKSwgaW5mbywgc3RkOjptb3ZlKGRhdGEpLCBzdGQ6Om1vdmUoZnJhbWVzKSwKLSAgICAgIGNvbnRlbnRfaWQsIGFsbF9kYXRhX3JlY2VpdmVkLCBpc19lbGlnaWJsZV9mb3JfYWNjZWxlcmF0ZWRfZGVjb2RpbmcsCi0gICAgICBjYW5feXV2X2RlY29kZSwgcGFpbnRfaW1hZ2VfdHlwZSkpOworICAgICAgY29udGVudF9pZCwgYWxsX2RhdGFfcmVjZWl2ZWQsIGNhbl95dXZfZGVjb2RlLCBpbWFnZV9tZXRhZGF0YSkpOwogfQogCiBEZWNvZGluZ0ltYWdlR2VuZXJhdG9yOjpEZWNvZGluZ0ltYWdlR2VuZXJhdG9yKApAQCAtMTIzLDI1ICsxMDEsMTggQEAKICAgICBXZWJWZWN0b3I8RnJhbWVNZXRhZGF0YT4gZnJhbWVzLAogICAgIFBhaW50SW1hZ2U6OkNvbnRlbnRJZCBjb21wbGV0ZV9mcmFtZV9jb250ZW50X2lkLAogICAgIGJvb2wgYWxsX2RhdGFfcmVjZWl2ZWQsCi0gICAgYm9vbCBpc19lbGlnaWJsZV9mb3JfYWNjZWxlcmF0ZWRfZGVjb2RpbmcsCiAgICAgYm9vbCBjYW5feXV2X2RlY29kZSwKLSAgICBQYWludEltYWdlOjpJbWFnZVR5cGUgaW1hZ2VfdHlwZSkKKyAgICBjb25zdCBjYzo6SW1hZ2VIZWFkZXJNZXRhZGF0YSYgaW1hZ2VfbWV0YWRhdGEpCiAgICAgOiBQYWludEltYWdlR2VuZXJhdG9yKGluZm8sIGZyYW1lcy5SZWxlYXNlVmVjdG9yKCkpLAogICAgICAgZnJhbWVfZ2VuZXJhdG9yXyhzdGQ6Om1vdmUoZnJhbWVfZ2VuZXJhdG9yKSksCiAgICAgICBkYXRhXyhzdGQ6Om1vdmUoZGF0YSkpLAogICAgICAgYWxsX2RhdGFfcmVjZWl2ZWRfKGFsbF9kYXRhX3JlY2VpdmVkKSwKLSAgICAgIGlzX2VsaWdpYmxlX2Zvcl9hY2NlbGVyYXRlZF9kZWNvZGluZ18oCi0gICAgICAgICAgaXNfZWxpZ2libGVfZm9yX2FjY2VsZXJhdGVkX2RlY29kaW5nKSwKICAgICAgIGNhbl95dXZfZGVjb2RlXyhjYW5feXV2X2RlY29kZSksCiAgICAgICBjb21wbGV0ZV9mcmFtZV9jb250ZW50X2lkXyhjb21wbGV0ZV9mcmFtZV9jb250ZW50X2lkKSwKLSAgICAgIGltYWdlX3R5cGVfKGltYWdlX3R5cGUpIHt9CisgICAgICBpbWFnZV9tZXRhZGF0YV8oaW1hZ2VfbWV0YWRhdGEpIHt9CiAKIERlY29kaW5nSW1hZ2VHZW5lcmF0b3I6On5EZWNvZGluZ0ltYWdlR2VuZXJhdG9yKCkgPSBkZWZhdWx0OwogCi1ib29sIERlY29kaW5nSW1hZ2VHZW5lcmF0b3I6OklzRWxpZ2libGVGb3JBY2NlbGVyYXRlZERlY29kaW5nKCkgY29uc3QgewotICByZXR1cm4gaXNfZWxpZ2libGVfZm9yX2FjY2VsZXJhdGVkX2RlY29kaW5nXzsKLX0KLQogc2tfc3A8U2tEYXRhPiBEZWNvZGluZ0ltYWdlR2VuZXJhdG9yOjpHZXRFbmNvZGVkRGF0YSgpIGNvbnN0IHsKICAgVFJBQ0VfRVZFTlQwKCJibGluayIsICJEZWNvZGluZ0ltYWdlR2VuZXJhdG9yOjpyZWZFbmNvZGVkRGF0YSIpOwogCkBAIC0zMTcsNCArMjg4LDkgQEAKICAgcmV0dXJuIFBhaW50SW1hZ2VHZW5lcmF0b3I6OkdldENvbnRlbnRJZEZvckZyYW1lKGZyYW1lX2luZGV4KTsKIH0KIAorY29uc3QgY2M6OkltYWdlSGVhZGVyTWV0YWRhdGEqCitEZWNvZGluZ0ltYWdlR2VuZXJhdG9yOjpHZXRNZXRhZGF0YUZvckRlY29kZUFjY2VsZXJhdGlvbigpIGNvbnN0IHsKKyAgcmV0dXJuICZpbWFnZV9tZXRhZGF0YV87Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBibGluawpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vZ3JhcGhpY3MvZGVjb2RpbmdfaW1hZ2VfZ2VuZXJhdG9yLmggYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9ncmFwaGljcy9kZWNvZGluZ19pbWFnZV9nZW5lcmF0b3IuaAppbmRleCBhZWIxODUzNC4uYjcyZjNiZCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vZ3JhcGhpY3MvZGVjb2RpbmdfaW1hZ2VfZ2VuZXJhdG9yLmgKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vZ3JhcGhpY3MvZGVjb2RpbmdfaW1hZ2VfZ2VuZXJhdG9yLmgKQEAgLTYzLDE0ICs2MywxMiBAQAogICAgICAgV2ViVmVjdG9yPEZyYW1lTWV0YWRhdGE+LAogICAgICAgUGFpbnRJbWFnZTo6Q29udGVudElkLAogICAgICAgYm9vbCBhbGxfZGF0YV9yZWNlaXZlZCwKLSAgICAgIGJvb2wgaXNfZWxpZ2libGVfZm9yX2FjY2VsZXJhdGVkX2RlY29kaW5nLAogICAgICAgYm9vbCBjYW5feXV2X2RlY29kZSwKLSAgICAgIFN0cmluZyBpbWFnZV90eXBlKTsKKyAgICAgIGNvbnN0IGNjOjpJbWFnZUhlYWRlck1ldGFkYXRhJiBpbWFnZV9tZXRhZGF0YSk7CiAKICAgfkRlY29kaW5nSW1hZ2VHZW5lcmF0b3IoKSBvdmVycmlkZTsKIAogICAvLyBQYWludEltYWdlR2VuZXJhdG9yIGltcGxlbWVudGF0aW9uLgotICBib29sIElzRWxpZ2libGVGb3JBY2NlbGVyYXRlZERlY29kaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CiAgIHNrX3NwPFNrRGF0YT4gR2V0RW5jb2RlZERhdGEoKSBjb25zdCBvdmVycmlkZTsKICAgYm9vbCBHZXRQaXhlbHMoY29uc3QgU2tJbWFnZUluZm8mLAogICAgICAgICAgICAgICAgICB2b2lkKiBwaXhlbHMsCkBAIC04OCw3ICs4Niw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGF6eV9waXhlbF9yZWYpIG92ZXJyaWRlOwogICBTa0lTaXplIEdldFN1cHBvcnRlZERlY29kZVNpemUoY29uc3QgU2tJU2l6ZSYgcmVxdWVzdGVkX3NpemUpIGNvbnN0IG92ZXJyaWRlOwogICBQYWludEltYWdlOjpDb250ZW50SWQgR2V0Q29udGVudElkRm9yRnJhbWUoc2l6ZV90IGZyYW1lX2luZGV4KSBjb25zdCBvdmVycmlkZTsKLSAgUGFpbnRJbWFnZTo6SW1hZ2VUeXBlIEdldEltYWdlVHlwZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGltYWdlX3R5cGVfOyB9CisgIGNvbnN0IGNjOjpJbWFnZUhlYWRlck1ldGFkYXRhKiBHZXRNZXRhZGF0YUZvckRlY29kZUFjY2VsZXJhdGlvbigpCisgICAgICBjb25zdCBvdmVycmlkZTsKIAogIHByaXZhdGU6CiAgIERlY29kaW5nSW1hZ2VHZW5lcmF0b3Ioc2NvcGVkX3JlZnB0cjxJbWFnZUZyYW1lR2VuZXJhdG9yPiwKQEAgLTk3LDE5ICs5NiwyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlZlY3RvcjxGcmFtZU1ldGFkYXRhPiwKICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludEltYWdlOjpDb250ZW50SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGxfZGF0YV9yZWNlaXZlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2VsaWdpYmxlX2Zvcl9hY2NlbGVyYXRlZF9kZWNvZGluZywKICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNhbl95dXZfZGVjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50SW1hZ2U6OkltYWdlVHlwZSBpbWFnZV90eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYzo6SW1hZ2VIZWFkZXJNZXRhZGF0YSYgaW1hZ2VfbWV0YWRhdGEpOwogCiAgIHNjb3BlZF9yZWZwdHI8SW1hZ2VGcmFtZUdlbmVyYXRvcj4gZnJhbWVfZ2VuZXJhdG9yXzsKICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxTZWdtZW50UmVhZGVyPiBkYXRhXzsgIC8vIERhdGEgc291cmNlLgogICBjb25zdCBib29sIGFsbF9kYXRhX3JlY2VpdmVkXzsKLSAgY29uc3QgYm9vbCBpc19lbGlnaWJsZV9mb3JfYWNjZWxlcmF0ZWRfZGVjb2RpbmdfOwogICBjb25zdCBib29sIGNhbl95dXZfZGVjb2RlXzsKICAgY29uc3QgUGFpbnRJbWFnZTo6Q29udGVudElkIGNvbXBsZXRlX2ZyYW1lX2NvbnRlbnRfaWRfOwotICAvLyBUaGUgaW1hZ2UgZmlsZSBraW5kIGFzIHJldHVybmVkIGJ5IHRoZSB1bmRlcmx5aW5nIGRlY29kZXIgYW5kCi0gIC8vIHRyYW5zbGF0ZWQgaW50byBQYWludEltYWdlOjpJbWFnZVR5cGUuCi0gIGNvbnN0IFBhaW50SW1hZ2U6OkltYWdlVHlwZSBpbWFnZV90eXBlXzsKKworICAvLyBJbWFnZSBtZXRhZGF0YSwgc3VjaCBhcyBmb3JtYXQgKGUuZy4gSnBlZyBvciBXZWJQKSwgWVVWIHN1YnNhbXBsaW5nIGZhY3RvcgorICAvLyAoZS5nLiA0NDQsIDQyMiwgNDIwLCBldGMuKSwgc2l6ZSwgYW5kIGZvcm1hdC1zcGVjaWZpYyBpbmZvcm1hdGlvbiB0aGF0IGlzCisgIC8vIHVzZWZ1bCBmb3IgZGVjaWRpbmcgd2hpY2gga2luZCBvZiBkZWNvZGluZyBjYW4gYmUgdXNlZCAoaS5lLiBoYXJkd2FyZQorICAvLyBhY2NlbGVyYXRpb24gb3Igbm9ybWFsKS4KKyAgY29uc3QgY2M6OkltYWdlSGVhZGVyTWV0YWRhdGEgaW1hZ2VfbWV0YWRhdGFfOwogCiAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihEZWNvZGluZ0ltYWdlR2VuZXJhdG9yKTsKIH07CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9ncmFwaGljcy9kZWZlcnJlZF9pbWFnZV9kZWNvZGVyLmNjIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vZ3JhcGhpY3MvZGVmZXJyZWRfaW1hZ2VfZGVjb2Rlci5jYwppbmRleCBjY2UxZjY5Li42MTQxZGYxIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9ncmFwaGljcy9kZWZlcnJlZF9pbWFnZV9kZWNvZGVyLmNjCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL2dyYXBoaWNzL2RlZmVycmVkX2ltYWdlX2RlY29kZXIuY2MKQEAgLTIzMywxMSArMjMzLDE0IEBACiAgIC8vIGNvbW1vbiwgc28gd2UgYXZvaWQgd29ycnlpbmcgYWJvdXQgdGhpcyB3aXRoIHRoZSBsaW5lIGJlbG93LgogICBjYW5feXV2X2RlY29kZV8gJj0gIWluY3JlbWVudGFsX2RlY29kZV9uZWVkZWRfLnZhbHVlKCk7CiAKKyAgRENIRUNLKGltYWdlX21ldGFkYXRhXyk7CisgIGltYWdlX21ldGFkYXRhXy0+YWxsX2RhdGFfcmVjZWl2ZWRfcHJpb3JfdG9fZGVjb2RlID0KKyAgICAgICFpbmNyZW1lbnRhbF9kZWNvZGVfbmVlZGVkXy52YWx1ZSgpOworCiAgIGF1dG8gZ2VuZXJhdG9yID0gRGVjb2RpbmdJbWFnZUdlbmVyYXRvcjo6Q3JlYXRlKAogICAgICAgZnJhbWVfZ2VuZXJhdG9yXywgaW5mbywgc3RkOjptb3ZlKHNlZ21lbnRfcmVhZGVyKSwgc3RkOjptb3ZlKGZyYW1lcyksCi0gICAgICBjb21wbGV0ZV9mcmFtZV9jb250ZW50X2lkXywgYWxsX2RhdGFfcmVjZWl2ZWRfLAotICAgICAgIWluY3JlbWVudGFsX2RlY29kZV9uZWVkZWRfLnZhbHVlKCkgLyogYWJsZSB0byBkbyBhY2NlbGVyYXRlZCBkZWNvZGluZyAqLywKLSAgICAgIGNhbl95dXZfZGVjb2RlXywgaW1hZ2VfdHlwZSk7CisgICAgICBjb21wbGV0ZV9mcmFtZV9jb250ZW50X2lkXywgYWxsX2RhdGFfcmVjZWl2ZWRfLCBjYW5feXV2X2RlY29kZV8sCisgICAgICAqaW1hZ2VfbWV0YWRhdGFfKTsKICAgZmlyc3RfZGVjb2RpbmdfZ2VuZXJhdG9yX2NyZWF0ZWRfID0gdHJ1ZTsKIAogICBzaXplX3QgaW1hZ2VfYnl0ZV9zaXplID0gQnl0ZVNpemUoKTsKQEAgLTQyMCw2ICs0MjMsOSBAQAogICAgICAgbWV0YWRhdGFfZGVjb2Rlcl8tPkNhbkRlY29kZVRvWVVWKCkgJiYgYWxsX2RhdGFfcmVjZWl2ZWRfICYmCiAgICAgICAhZnJhbWVfZ2VuZXJhdG9yXy0+SXNNdWx0aUZyYW1lKCk7CiAKKyAgaWYgKCFpbWFnZV9tZXRhZGF0YV8pCisgICAgaW1hZ2VfbWV0YWRhdGFfID0gbWV0YWRhdGFfZGVjb2Rlcl8tPk1ha2VNZXRhZGF0YUZvckRlY29kZUFjY2VsZXJhdGlvbigpOworCiAgIC8vIElmIHdlJ3ZlIHJlY2VpdmVkIGFsbCBvZiB0aGUgZGF0YSwgdGhlbiB3ZSBjYW4gcmVzZXQgdGhlIG1ldGFkYXRhIGRlY29kZXIsCiAgIC8vIHNpbmNlIGV2ZXJ5dGhpbmcgd2UgY2FyZSBhYm91dCBzaG91bGQgbm93IGJlIHN0b3JlZCBpbiB8ZnJhbWVfZGF0YV98LgogICBpZiAoYWxsX2RhdGFfcmVjZWl2ZWRfKSB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9ncmFwaGljcy9kZWZlcnJlZF9pbWFnZV9kZWNvZGVyLmggYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9ncmFwaGljcy9kZWZlcnJlZF9pbWFnZV9kZWNvZGVyLmgKaW5kZXggOGY1OTA5NTguLmQ3YTA2OWIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL2dyYXBoaWNzL2RlZmVycmVkX2ltYWdlX2RlY29kZXIuaAorKysgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9ncmFwaGljcy9kZWZlcnJlZF9pbWFnZV9kZWNvZGVyLmgKQEAgLTEyMCw2ICsxMjAsMTAgQEAKICAgY29uc3QgUGFpbnRJbWFnZTo6Q29udGVudElkIGNvbXBsZXRlX2ZyYW1lX2NvbnRlbnRfaWRfOwogICBiYXNlOjpPcHRpb25hbDxib29sPiBpbmNyZW1lbnRhbF9kZWNvZGVfbmVlZGVkXzsKIAorICAvLyBDYWNoZXMgYW4gaW1hZ2UncyBtZXRhZGF0YSBzbyBpdCBjYW4gb3V0bGl2ZSB8bWV0YWRhdGFfZGVjb2Rlcl98IGFmdGVyIGFsbAorICAvLyBkYXRhIGlzIHJlY2VpdmVkIGluIGNhc2VzIHdoZXJlIG11bHRpcGxlIGdlbmVyYXRvcnMgYXJlIGNyZWF0ZWQuCisgIGJhc2U6Ok9wdGlvbmFsPGNjOjpJbWFnZUhlYWRlck1ldGFkYXRhPiBpbWFnZV9tZXRhZGF0YV87CisKICAgLy8gQ2FjaGVzIGZyYW1lIHN0YXRlIGluZm9ybWF0aW9uLgogICBWZWN0b3I8RGVmZXJyZWRGcmFtZURhdGE+IGZyYW1lX2RhdGFfOwogICBzY29wZWRfcmVmcHRyPEltYWdlRnJhbWVHZW5lcmF0b3I+IGZyYW1lX2dlbmVyYXRvcl87CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9ncmFwaGljcy9kZWZlcnJlZF9pbWFnZV9kZWNvZGVyX3Rlc3QuY2MgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9ncmFwaGljcy9kZWZlcnJlZF9pbWFnZV9kZWNvZGVyX3Rlc3QuY2MKaW5kZXggZWI1M2VlYmUuLmRhM2VlMDIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL2dyYXBoaWNzL2RlZmVycmVkX2ltYWdlX2RlY29kZXJfdGVzdC5jYworKysgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9ncmFwaGljcy9kZWZlcnJlZF9pbWFnZV9kZWNvZGVyX3Rlc3QuY2MKQEAgLTE5OSw0NyArMTk5LDUwIEBACiAgIEVYUEVDVF9FUShTa0NvbG9yU2V0QVJHQigyNTUsIDI1NSwgMjU1LCAyNTUpLCBiaXRtYXBfLmdldENvbG9yKDAsIDApKTsKIH0KIAotVEVTVF9GKERlZmVycmVkSW1hZ2VEZWNvZGVyVGVzdCwgaXNFbGlnaWJsZUZvckhhcmR3YXJlRGVjb2RpbmdOb25JbmNyZW1lbnRhbCkgewotICAvLyBUaGUgaW1hZ2UgaXMgcmVjZWl2ZWQgY29tcGxldGVseS4gVGhpcyBpcyBva2F5IGZvciBoYXJkd2FyZSBkZWNvZGluZyBzaW5jZQotICAvLyBpdCdzIGFzc3VtZWQgdGhhdCB0aGUgc29mdHdhcmUgZGVjb2RlciBoYXNuJ3QgZG9uZSBhbnkgd29yay4KK1RFU1RfRihEZWZlcnJlZEltYWdlRGVjb2RlclRlc3QsIGFsbERhdGFSZWNlaXZlZFByaW9yVG9EZWNvZGVOb25JbmNyZW1lbnRhbGx5KSB7CisgIC8vIFRoZSBpbWFnZSBpcyByZWNlaXZlZCBjb21wbGV0ZWx5IGF0IG9uY2UuCiAgIGxhenlfZGVjb2Rlcl8tPlNldERhdGEoZGF0YV8sIHRydWUgLyogYWxsX2RhdGFfcmVjZWl2ZWQgKi8pOwogICBQYWludEltYWdlIGltYWdlID0gQ3JlYXRlUGFpbnRJbWFnZSgpOwogICBBU1NFUlRfVFJVRShpbWFnZSk7Ci0gIEVYUEVDVF9UUlVFKGltYWdlLklzRWxpZ2libGVGb3JBY2NlbGVyYXRlZERlY29kaW5nKCkpOworICBBU1NFUlRfVFJVRShpbWFnZS5HZXRJbWFnZUhlYWRlck1ldGFkYXRhKCkpOworICBFWFBFQ1RfVFJVRSgKKyAgICAgIGltYWdlLkdldEltYWdlSGVhZGVyTWV0YWRhdGEoKS0+YWxsX2RhdGFfcmVjZWl2ZWRfcHJpb3JfdG9fZGVjb2RlKTsKIH0KIAotVEVTVF9GKERlZmVycmVkSW1hZ2VEZWNvZGVyVGVzdCwgaXNFbGlnaWJsZUZvckhhcmR3YXJlRGVjb2RpbmdJbmNyZW1lbnRhbCkgeworVEVTVF9GKERlZmVycmVkSW1hZ2VEZWNvZGVyVGVzdCwgYWxsRGF0YVJlY2VpdmVkUHJpb3JUb0RlY29kZUluY3JlbWVudGFsbHkpIHsKICAgLy8gVGhlIGltYWdlIGlzIHJlY2VpdmVkIGluIHR3byBwYXJ0cywgYnV0IGEgUGFpbnRJbWFnZUdlbmVyYXRvciBpcyBjcmVhdGVkCi0gIC8vIG9ubHkgYWZ0ZXIgYWxsIHRoZSBkYXRhIGlzIHJlY2VpdmVkLiBUaGlzIGlzIG9rYXkgZm9yIGhhcmR3YXJlIGRlY29kaW5nCi0gIC8vIHNpbmNlIGl0J3MgYXNzdW1lZCB0aGF0IHRoZSBzb2Z0d2FyZSBkZWNvZGVyIGhhc24ndCBkb25lIGFueSB3b3JrIGJlZm9yZQotICAvLyB0aGUgUGFpbnRJbWFnZUdlbmVyYXRvciBpcyBjcmVhdGVkLgorICAvLyBvbmx5IGFmdGVyIGFsbCB0aGUgZGF0YSBpcyByZWNlaXZlZC4KICAgc2NvcGVkX3JlZnB0cjxTaGFyZWRCdWZmZXI+IHBhcnRpYWxfZGF0YSA9CiAgICAgICBTaGFyZWRCdWZmZXI6OkNyZWF0ZShkYXRhXy0+RGF0YSgpLCBkYXRhXy0+c2l6ZSgpIC0gMTApOwogICBsYXp5X2RlY29kZXJfLT5TZXREYXRhKHBhcnRpYWxfZGF0YSwgZmFsc2UgLyogYWxsX2RhdGFfcmVjZWl2ZWQgKi8pOwogICBsYXp5X2RlY29kZXJfLT5TZXREYXRhKGRhdGFfLCB0cnVlIC8qIGFsbF9kYXRhX3JlY2VpdmVkICovKTsKICAgUGFpbnRJbWFnZSBpbWFnZSA9IENyZWF0ZVBhaW50SW1hZ2UoKTsKICAgQVNTRVJUX1RSVUUoaW1hZ2UpOwotICBFWFBFQ1RfVFJVRShpbWFnZS5Jc0VsaWdpYmxlRm9yQWNjZWxlcmF0ZWREZWNvZGluZygpKTsKKyAgQVNTRVJUX1RSVUUoaW1hZ2UuR2V0SW1hZ2VIZWFkZXJNZXRhZGF0YSgpKTsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBpbWFnZS5HZXRJbWFnZUhlYWRlck1ldGFkYXRhKCktPmFsbF9kYXRhX3JlY2VpdmVkX3ByaW9yX3RvX2RlY29kZSk7CiB9CiAKLVRFU1RfRihEZWZlcnJlZEltYWdlRGVjb2RlclRlc3QsIGlzTm90RWxpZ2libGVGb3JIYXJkd2FyZURlY29kaW5nKSB7CitURVNUX0YoRGVmZXJyZWRJbWFnZURlY29kZXJUZXN0LCBub3RBbGxEYXRhUmVjZWl2ZWRQcmlvclRvRGVjb2RlKSB7CiAgIC8vIFRoZSBpbWFnZSBpcyByZWNlaXZlZCBpbiB0d28gcGFydHMsIGFuZCBhIFBhaW50SW1hZ2VHZW5lcmF0b3IgaXMgY3JlYXRlZAogICAvLyBmb3IgZWFjaCBvbmUuIEluIHJlYWwgdXNhZ2UsIGl0J3MgbGlrZWx5IHRoYXQgdGhlIHNvZnR3YXJlIGltYWdlIGRlY29kZXIKLSAgLy8gd2lsbCBzdGFydCB3b3JraW5nIHdpdGggcGFydGlhbCBkYXRhLCBzbyB0aGVyZSdzIG5vIHBvaW50IGluIHVzaW5nIHRoZQotICAvLyBoYXJkd2FyZSBhY2NlbGVyYXRvciAoYmVjYXVzZSBpZiB3ZSBkaWQsIHdlJ2QgYmUgZG9pbmcgZG91YmxlIHdvcms6IGluCi0gIC8vIHNvZnR3YXJlIGFuZCBpbiBoYXJkd2FyZSkuCisgIC8vIHdpbGwgc3RhcnQgd29ya2luZyB3aXRoIHBhcnRpYWwgZGF0YS4KICAgc2NvcGVkX3JlZnB0cjxTaGFyZWRCdWZmZXI+IHBhcnRpYWxfZGF0YSA9CiAgICAgICBTaGFyZWRCdWZmZXI6OkNyZWF0ZShkYXRhXy0+RGF0YSgpLCBkYXRhXy0+c2l6ZSgpIC0gMTApOwogICBsYXp5X2RlY29kZXJfLT5TZXREYXRhKHBhcnRpYWxfZGF0YSwgZmFsc2UgLyogYWxsX2RhdGFfcmVjZWl2ZWQgKi8pOwogICBQYWludEltYWdlIGltYWdlID0KICAgICAgIENyZWF0ZVBhaW50SW1hZ2UoUGFpbnRJbWFnZTo6Q29tcGxldGlvblN0YXRlOjpQQVJUSUFMTFlfRE9ORSk7CiAgIEFTU0VSVF9UUlVFKGltYWdlKTsKLSAgRVhQRUNUX0ZBTFNFKGltYWdlLklzRWxpZ2libGVGb3JBY2NlbGVyYXRlZERlY29kaW5nKCkpOworICBBU1NFUlRfVFJVRShpbWFnZS5HZXRJbWFnZUhlYWRlck1ldGFkYXRhKCkpOworICBFWFBFQ1RfRkFMU0UoCisgICAgICBpbWFnZS5HZXRJbWFnZUhlYWRlck1ldGFkYXRhKCktPmFsbF9kYXRhX3JlY2VpdmVkX3ByaW9yX3RvX2RlY29kZSk7CiAKICAgbGF6eV9kZWNvZGVyXy0+U2V0RGF0YShkYXRhXywgdHJ1ZSAvKiBhbGxfZGF0YV9yZWNlaXZlZCAqLyk7CiAgIGltYWdlID0gQ3JlYXRlUGFpbnRJbWFnZSgpOwogICBBU1NFUlRfVFJVRShpbWFnZSk7Ci0gIEVYUEVDVF9GQUxTRShpbWFnZS5Jc0VsaWdpYmxlRm9yQWNjZWxlcmF0ZWREZWNvZGluZygpKTsKKyAgQVNTRVJUX1RSVUUoaW1hZ2UuR2V0SW1hZ2VIZWFkZXJNZXRhZGF0YSgpKTsKKyAgRVhQRUNUX0ZBTFNFKAorICAgICAgaW1hZ2UuR2V0SW1hZ2VIZWFkZXJNZXRhZGF0YSgpLT5hbGxfZGF0YV9yZWNlaXZlZF9wcmlvcl90b19kZWNvZGUpOwogfQogCiBzdGF0aWMgdm9pZCBSYXN0ZXJpemVNYWluKGNjOjpQYWludENhbnZhcyogY2FudmFzLCBza19zcDxQYWludFJlY29yZD4gcmVjb3JkKSB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9ERVBTIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvREVQUwppbmRleCBjNDBiZTllLi44YmNiOTUxIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9ERVBTCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL0RFUFMKQEAgLTYsNiArNiw3IEBACiAgICAgIit0aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycyIsCiAKICAgICAjIERlcGVuZGVuY2llcy4KKyAgICAiK2Jhc2UvYml0cy5oIiwKICAgICAiK2NjL3BhaW50L2ltYWdlX2FuaW1hdGlvbl9jb3VudC5oIiwKICAgICAiK3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL2dlb21ldHJ5IiwKICAgICAiK3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL2dyYXBoaWNzIiwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL2ltYWdlX2RlY29kZXIuY2MgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9pbWFnZV9kZWNvZGVyLmNjCmluZGV4IGJlNTkxMjcyLi4wNTcxZDExIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9pbWFnZV9kZWNvZGVyLmNjCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL2ltYWdlX2RlY29kZXIuY2MKQEAgLTMyLDkgKzMyLDMwIEBACiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvd2VicC93ZWJwX2ltYWdlX2RlY29kZXIuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9pbnN0cnVtZW50YXRpb24vdHJhY2luZy90cmFjZV9ldmVudC5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL25ldHdvcmsvbWltZS9taW1lX3R5cGVfcmVnaXN0cnkuaCIKKyNpbmNsdWRlICJ1aS9nZngvZ2VvbWV0cnkvc2l6ZS5oIgogCiBuYW1lc3BhY2UgYmxpbmsgewogCituYW1lc3BhY2UgeworCitjYzo6SW1hZ2VUeXBlIEZpbGVFeHRlbnNpb25Ub0ltYWdlVHlwZShTdHJpbmcgaW1hZ2VfZXh0ZW5zaW9uKSB7CisgIGlmIChpbWFnZV9leHRlbnNpb24gPT0gInBuZyIpCisgICAgcmV0dXJuIGNjOjpJbWFnZVR5cGU6OmtQTkc7CisgIGlmIChpbWFnZV9leHRlbnNpb24gPT0gImpwZyIpCisgICAgcmV0dXJuIGNjOjpJbWFnZVR5cGU6OmtKUEVHOworICBpZiAoaW1hZ2VfZXh0ZW5zaW9uID09ICJ3ZWJwIikKKyAgICByZXR1cm4gY2M6OkltYWdlVHlwZTo6a1dFQlA7CisgIGlmIChpbWFnZV9leHRlbnNpb24gPT0gImdpZiIpCisgICAgcmV0dXJuIGNjOjpJbWFnZVR5cGU6OmtHSUY7CisgIGlmIChpbWFnZV9leHRlbnNpb24gPT0gImljbyIpCisgICAgcmV0dXJuIGNjOjpJbWFnZVR5cGU6OmtJQ087CisgIGlmIChpbWFnZV9leHRlbnNpb24gPT0gImJtcCIpCisgICAgcmV0dXJuIGNjOjpJbWFnZVR5cGU6OmtCTVA7CisgIHJldHVybiBjYzo6SW1hZ2VUeXBlOjprSW52YWxpZDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKIGNvbnN0IHNpemVfdCBJbWFnZURlY29kZXI6OmtOb0RlY29kZWRJbWFnZUJ5dGVMaW1pdDsKIAogaW5saW5lIGJvb2wgTWF0Y2hlc0pQRUdTaWduYXR1cmUoY29uc3QgY2hhciogY29udGVudHMpIHsKQEAgLTIzMiw2ICsyNTMsMTcgQEAKICAgcmV0dXJuIGtVbmRlZmluZWRGb3JtYXQ7CiB9CiAKK2NjOjpJbWFnZUhlYWRlck1ldGFkYXRhIEltYWdlRGVjb2Rlcjo6TWFrZU1ldGFkYXRhRm9yRGVjb2RlQWNjZWxlcmF0aW9uKCkKKyAgICBjb25zdCB7CisgIERDSEVDSyhJc0RlY29kZWRTaXplQXZhaWxhYmxlKCkpOworICBjYzo6SW1hZ2VIZWFkZXJNZXRhZGF0YSBpbWFnZV9tZXRhZGF0YXt9OworICBpbWFnZV9tZXRhZGF0YS5pbWFnZV90eXBlID0gRmlsZUV4dGVuc2lvblRvSW1hZ2VUeXBlKEZpbGVuYW1lRXh0ZW5zaW9uKCkpOworICBpbWFnZV9tZXRhZGF0YS55dXZfc3Vic2FtcGxpbmcgPSBHZXRZVVZTdWJzYW1wbGluZygpOworICBpbWFnZV9tZXRhZGF0YS5pbWFnZV9zaXplID0gc3RhdGljX2Nhc3Q8Z2Z4OjpTaXplPihzaXplXyk7CisgIGltYWdlX21ldGFkYXRhLmhhc19lbWJlZGRlZF9jb2xvcl9wcm9maWxlID0gSGFzRW1iZWRkZWRDb2xvclByb2ZpbGUoKTsKKyAgcmV0dXJuIGltYWdlX21ldGFkYXRhOworfQorCiBzaXplX3QgSW1hZ2VEZWNvZGVyOjpGcmFtZUNvdW50KCkgewogICBjb25zdCBzaXplX3Qgb2xkX3NpemUgPSBmcmFtZV9idWZmZXJfY2FjaGVfLnNpemUoKTsKICAgY29uc3Qgc2l6ZV90IG5ld19zaXplID0gRGVjb2RlRnJhbWVDb3VudCgpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvaW1hZ2VfZGVjb2Rlci5oIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvaW1hZ2VfZGVjb2Rlci5oCmluZGV4IDJhZmU5ZDRhLi4yNzRjNzNjIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9pbWFnZV9kZWNvZGVyLmgKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvaW1hZ2VfZGVjb2Rlci5oCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcHVibGljL3BsYXRmb3JtL3BsYXRmb3JtLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vZ3JhcGhpY3MvY29sb3JfYmVoYXZpb3IuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9ncmFwaGljcy9pbWFnZV9vcmllbnRhdGlvbi5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL2dyYXBoaWNzL3BhaW50L3BhaW50X2ltYWdlLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvaW1hZ2VfYW5pbWF0aW9uLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvaW1hZ2VfZnJhbWUuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9zZWdtZW50X3JlYWRlci5oIgpAQCAtMjQzLDYgKzI0NCwxMiBAQAogICAgIHJldHVybiBTa1lVVkNvbG9yU3BhY2U6OmtJZGVudGl0eV9Ta1lVVkNvbG9yU3BhY2U7CiAgIH0KIAorICAvLyBSZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBkZWNpZGUgd2hldGhlciBvciBub3QgaGFyZHdhcmUKKyAgLy8gYWNjZWxlcmF0aW9uIGNhbiBiZSB1c2VkIHRvIGRlY29kZSB0aGlzIGltYWdlLiBDYWxsZXJzIG9mIHRoaXMgZnVuY3Rpb24KKyAgLy8gbXVzdCBlbnN1cmUgdGhlIGhlYWRlciB3YXMgc3VjY2Vzc2Z1bGx5IHBhcnNlZCBwcmlvciB0byBjYWxsaW5nIHRoaXMKKyAgLy8gbWV0aG9kLCBpLmUuLCBJc0RlY29kZWRTaXplQXZhaWxhYmxlKCkgbXVzdCByZXR1cm4gdHJ1ZS4KKyAgdmlydHVhbCBjYzo6SW1hZ2VIZWFkZXJNZXRhZGF0YSBNYWtlTWV0YWRhdGFGb3JEZWNvZGVBY2NlbGVyYXRpb24oKSBjb25zdDsKKwogICAvLyBUaGlzIHdpbGwgb25seSBkaWZmZXIgZnJvbSBzaXplKCkgZm9yIElDTyAod2hlcmUgZWFjaCBmcmFtZSBpcyBhCiAgIC8vIGRpZmZlcmVudCBpY29uKSBvciBvdGhlciBmb3JtYXRzIHdoZXJlIGRpZmZlcmVudCBmcmFtZXMgYXJlIGRpZmZlcmVudAogICAvLyBzaXplcy4gVGhpcyBkb2VzIE5PVCBkaWZmZXIgZnJvbSBzaXplKCkgZm9yIEdJRiBvciBXZWJQLCBzaW5jZQpAQCAtNDk5LDYgKzUwNiwxMSBAQAogICBzdGQ6OnVuaXF1ZV9wdHI8SW1hZ2VQbGFuZXM+IGltYWdlX3BsYW5lc187CiAKICBwcml2YXRlOgorICAvLyBUaGUgWVVWIHN1YnNhbXBsaW5nIG9mIHRoZSBpbWFnZS4KKyAgdmlydHVhbCBjYzo6WVVWU3Vic2FtcGxpbmcgR2V0WVVWU3Vic2FtcGxpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIGNjOjpZVVZTdWJzYW1wbGluZzo6a1Vua25vd247CisgIH0KKwogICAvLyBTb21lIGNvZGUgcGF0aHMgY29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGUgaW1hZ2UgYXMgIndpZHRoICogaGVpZ2h0ICogNCBvciA4IgogICAvLyBhbmQgcmV0dXJuIGl0IGFzIGEgKHNpZ25lZCkgaW50LiAgQXZvaWQgb3ZlcmZsb3cuCiAgIGlubGluZSBib29sIFNpemVDYWxjdWxhdGlvbk1heU92ZXJmbG93KHVuc2lnbmVkIHdpZHRoLApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvanBlZy9qcGVnX2ltYWdlX2RlY29kZXIuY2MgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9qcGVnL2pwZWdfaW1hZ2VfZGVjb2Rlci5jYwppbmRleCAyMmRmNjg5Li4xNDJiYzRkNSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvanBlZy9qcGVnX2ltYWdlX2RlY29kZXIuY2MKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvanBlZy9qcGVnX2ltYWdlX2RlY29kZXIuY2MKQEAgLTM5LDYgKzM5LDggQEAKIAogI2luY2x1ZGUgPG1lbW9yeT4KIAorI2luY2x1ZGUgImJhc2UvYml0cy5oIgorI2luY2x1ZGUgImJhc2UvbnVtZXJpY3Mvc2FmZV9jb252ZXJzaW9ucy5oIgogI2luY2x1ZGUgImJ1aWxkL2J1aWxkX2NvbmZpZy5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL2dyYXBoaWNzL2JpdG1hcF9pbWFnZV9tZXRyaWNzLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vaW5zdHJ1bWVudGF0aW9uL3RyYWNpbmcvdHJhY2VfZXZlbnQuaCIKQEAgLTgxLDE5ICs4Myw5IEBACiAvLyBKUEVHIG9ubHkgc3VwcG9ydHMgYSBkZW5vbWluYXRvciBvZiA4LgogY29uc3QgdW5zaWduZWQgZ19zY2FsZV9kZW5vbWluYXRvciA9IDg7CiAKLWVudW0geXV2X3N1YnNhbXBsaW5nIHsKLSAgWVVWX1VOS05PV04sCi0gIFlVVl80MTAsCi0gIFlVVl80MTEsCi0gIFlVVl80MjAsCi0gIFlVVl80MjIsCi0gIFlVVl80NDAsCi0gIFlVVl80NDQKLX07Ci0KIC8vIEV4dHJhY3RzIHRoZSBZVVYgc3Vic2FtcGxpbmcgZm9ybWF0IG9mIGFuIGltYWdlIGdpdmVuIHxpbmZvfCB3aGljaCBpcyBhc3N1bWVkCiAvLyB0byBoYXZlIGdvbmUgdGhyb3VnaCBhIGpwZWdfcmVhZF9oZWFkZXIoKSBjYWxsLgoteXV2X3N1YnNhbXBsaW5nIFl1dlN1YnNhbXBsaW5nKGNvbnN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QmIGluZm8pIHsKK2NjOjpZVVZTdWJzYW1wbGluZyBZdXZTdWJzYW1wbGluZyhjb25zdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0JiBpbmZvKSB7CiAgIGlmIChpbmZvLmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX1lDYkNyICYmIGluZm8ubnVtX2NvbXBvbmVudHMgPT0gMyAmJgogICAgICAgaW5mby5jb21wX2luZm8gJiYgaW5mby5jb21wX2luZm9bMV0uaF9zYW1wX2ZhY3RvciA9PSAxICYmCiAgICAgICBpbmZvLmNvbXBfaW5mb1sxXS52X3NhbXBfZmFjdG9yID09IDEgJiYKQEAgLTEwNCwyOSArOTYsMjQgQEAKICAgICBpZiAodiA9PSAxKSB7CiAgICAgICBzd2l0Y2ggKGgpIHsKICAgICAgICAgY2FzZSAxOgotICAgICAgICAgIHJldHVybiBZVVZfNDQ0OworICAgICAgICAgIHJldHVybiBjYzo6WVVWU3Vic2FtcGxpbmc6Oms0NDQ7CiAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICByZXR1cm4gWVVWXzQyMjsKKyAgICAgICAgICByZXR1cm4gY2M6OllVVlN1YnNhbXBsaW5nOjprNDIyOwogICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgcmV0dXJuIFlVVl80MTE7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgYnJlYWs7CisgICAgICAgICAgcmV0dXJuIGNjOjpZVVZTdWJzYW1wbGluZzo6azQxMTsKICAgICAgIH0KICAgICB9IGVsc2UgaWYgKHYgPT0gMikgewogICAgICAgc3dpdGNoIChoKSB7CiAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICByZXR1cm4gWVVWXzQ0MDsKKyAgICAgICAgICByZXR1cm4gY2M6OllVVlN1YnNhbXBsaW5nOjprNDQwOwogICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgcmV0dXJuIFlVVl80MjA7CisgICAgICAgICAgcmV0dXJuIGNjOjpZVVZTdWJzYW1wbGluZzo6azQyMDsKICAgICAgICAgY2FzZSA0OgotICAgICAgICAgIHJldHVybiBZVVZfNDEwOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHJldHVybiBjYzo6WVVWU3Vic2FtcGxpbmc6Oms0MTA7CiAgICAgICB9CiAgICAgfQogICB9Ci0KLSAgcmV0dXJuIFlVVl9VTktOT1dOOworICByZXR1cm4gY2M6OllVVlN1YnNhbXBsaW5nOjprVW5rbm93bjsKIH0KIAogLy8gRXh0cmFjdHMgdGhlIEpQRUcgY29sb3Igc3BhY2Ugb2YgYW4gaW1hZ2UgZm9yIFVNQSBwdXJwb3NlcyBnaXZlbiB8aW5mb3wgd2hpY2gKQEAgLTE1MCwxOSArMTM3LDE5IEBACiAgICAgICByZXR1cm4gYmxpbms6OkJpdG1hcEltYWdlTWV0cmljczo6SnBlZ0NvbG9yU3BhY2U6OmtZQ0NLOwogICAgIGNhc2UgSkNTX1lDYkNyOgogICAgICAgc3dpdGNoIChZdXZTdWJzYW1wbGluZyhpbmZvKSkgewotICAgICAgICBjYXNlIFlVVl80NDQ6CisgICAgICAgIGNhc2UgY2M6OllVVlN1YnNhbXBsaW5nOjprNDQ0OgogICAgICAgICAgIHJldHVybiBibGluazo6Qml0bWFwSW1hZ2VNZXRyaWNzOjpKcGVnQ29sb3JTcGFjZTo6a1lDYkNyNDQ0OwotICAgICAgICBjYXNlIFlVVl80MjI6CisgICAgICAgIGNhc2UgY2M6OllVVlN1YnNhbXBsaW5nOjprNDIyOgogICAgICAgICAgIHJldHVybiBibGluazo6Qml0bWFwSW1hZ2VNZXRyaWNzOjpKcGVnQ29sb3JTcGFjZTo6a1lDYkNyNDIyOwotICAgICAgICBjYXNlIFlVVl80MTE6CisgICAgICAgIGNhc2UgY2M6OllVVlN1YnNhbXBsaW5nOjprNDExOgogICAgICAgICAgIHJldHVybiBibGluazo6Qml0bWFwSW1hZ2VNZXRyaWNzOjpKcGVnQ29sb3JTcGFjZTo6a1lDYkNyNDExOwotICAgICAgICBjYXNlIFlVVl80NDA6CisgICAgICAgIGNhc2UgY2M6OllVVlN1YnNhbXBsaW5nOjprNDQwOgogICAgICAgICAgIHJldHVybiBibGluazo6Qml0bWFwSW1hZ2VNZXRyaWNzOjpKcGVnQ29sb3JTcGFjZTo6a1lDYkNyNDQwOwotICAgICAgICBjYXNlIFlVVl80MjA6CisgICAgICAgIGNhc2UgY2M6OllVVlN1YnNhbXBsaW5nOjprNDIwOgogICAgICAgICAgIHJldHVybiBibGluazo6Qml0bWFwSW1hZ2VNZXRyaWNzOjpKcGVnQ29sb3JTcGFjZTo6a1lDYkNyNDIwOwotICAgICAgICBjYXNlIFlVVl80MTA6CisgICAgICAgIGNhc2UgY2M6OllVVlN1YnNhbXBsaW5nOjprNDEwOgogICAgICAgICAgIHJldHVybiBibGluazo6Qml0bWFwSW1hZ2VNZXRyaWNzOjpKcGVnQ29sb3JTcGFjZTo6a1lDYkNyNDEwOwotICAgICAgICBjYXNlIFlVVl9VTktOT1dOOgorICAgICAgICBjYXNlIGNjOjpZVVZTdWJzYW1wbGluZzo6a1Vua25vd246CiAgICAgICAgICAgcmV0dXJuIGJsaW5rOjpCaXRtYXBJbWFnZU1ldHJpY3M6OkpwZWdDb2xvclNwYWNlOjprWUNiQ3JPdGhlcjsKICAgICAgIH0KICAgICAgIE5PVFJFQUNIRUQoKTsKQEAgLTQ2NSw4ICs0NTIsOCBAQAogICAgICAgICAgICAgLy8gVE9ETyhjcmJ1Zy5jb20vOTE5NjI3KTogaXMgdGhlIGluZm9fLnNjYWxlX2Rlbm9tIDw9IDggYWN0dWFsbHkKICAgICAgICAgICAgIC8vIG5lZWRlZD8KICAgICAgICAgICAgIGluZm9fLm91dF9jb2xvcl9zcGFjZSA9IHJnYk91dHB1dENvbG9yU3BhY2UoKTsKLSAgICAgICAgICAgIGlmIChkZWNvZGVyXy0+SGFzSW1hZ2VQbGFuZXMoKSAmJiAoaW5mb18uc2NhbGVfZGVub20gPD0gOCkgJiYKLSAgICAgICAgICAgICAgICAoWXV2U3Vic2FtcGxpbmcoaW5mb18pICE9IFlVVl9VTktOT1dOKSkKKyAgICAgICAgICAgIGlmIChkZWNvZGVyXy0+SGFzSW1hZ2VQbGFuZXMoKSAmJiBpbmZvXy5zY2FsZV9kZW5vbSA8PSA4ICYmCisgICAgICAgICAgICAgICAgKFl1dlN1YnNhbXBsaW5nKGluZm9fKSAhPSBjYzo6WVVWU3Vic2FtcGxpbmc6OmtVbmtub3duKSkKICAgICAgICAgICAgICAgb3ZlcnJpZGVfY29sb3Jfc3BhY2UgPSBKQ1NfWUNiQ3I7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICBjYXNlIEpDU19HUkFZU0NBTEU6CkBAIC05NDYsNiArOTMzLDI3IEBACiAgIHJldHVybiBzdXBwb3J0ZWRfZGVjb2RlX3NpemVzXzsKIH0KIAorY2M6OkltYWdlSGVhZGVyTWV0YWRhdGEgSlBFR0ltYWdlRGVjb2Rlcjo6TWFrZU1ldGFkYXRhRm9yRGVjb2RlQWNjZWxlcmF0aW9uKCkKKyAgICBjb25zdCB7CisgIGNjOjpJbWFnZUhlYWRlck1ldGFkYXRhIGltYWdlX21ldGFkYXRhID0KKyAgICAgIEltYWdlRGVjb2Rlcjo6TWFrZU1ldGFkYXRhRm9yRGVjb2RlQWNjZWxlcmF0aW9uKCk7CisgIGltYWdlX21ldGFkYXRhLmpwZWdfaXNfcHJvZ3Jlc3NpdmUgPSByZWFkZXJfLT5JbmZvKCktPmJ1ZmZlcmVkX2ltYWdlOworCisgIC8vIENhbGN1bGF0ZSB0aGUgY29kZWQgc2l6ZSBvZiB0aGUgaW1hZ2UuCisgIGNvbnN0IHNpemVfdCBtY3Vfd2lkdGggPQorICAgICAgYmFzZTo6Y2hlY2tlZF9jYXN0PHNpemVfdD4ocmVhZGVyXy0+SW5mbygpLT5jb21wX2luZm8tPmhfc2FtcF9mYWN0b3IgKiA4KTsKKyAgY29uc3Qgc2l6ZV90IG1jdV9oZWlnaHQgPQorICAgICAgYmFzZTo6Y2hlY2tlZF9jYXN0PHNpemVfdD4ocmVhZGVyXy0+SW5mbygpLT5jb21wX2luZm8tPnZfc2FtcF9mYWN0b3IgKiA4KTsKKyAgY29uc3QgaW50IGNvZGVkX3dpZHRoID0gYmFzZTo6Y2hlY2tlZF9jYXN0PGludD4oYmFzZTo6Yml0czo6QWxpZ24oCisgICAgICBiYXNlOjpjaGVja2VkX2Nhc3Q8c2l6ZV90PihpbWFnZV9tZXRhZGF0YS5pbWFnZV9zaXplLndpZHRoKCkpLAorICAgICAgbWN1X3dpZHRoKSk7CisgIGNvbnN0IGludCBjb2RlZF9oZWlnaHQgPSBiYXNlOjpjaGVja2VkX2Nhc3Q8aW50PihiYXNlOjpiaXRzOjpBbGlnbigKKyAgICAgIGJhc2U6OmNoZWNrZWRfY2FzdDxzaXplX3Q+KGltYWdlX21ldGFkYXRhLmltYWdlX3NpemUuaGVpZ2h0KCkpLAorICAgICAgbWN1X2hlaWdodCkpOworICBpbWFnZV9tZXRhZGF0YS5jb2RlZF9zaXplID0gZ2Z4OjpTaXplKGNvZGVkX3dpZHRoLCBjb2RlZF9oZWlnaHQpOworICByZXR1cm4gaW1hZ2VfbWV0YWRhdGE7Cit9CisKIC8vIEF0IHRoZSBtb21lbnQgd2Ugc3VwcG9ydCBvbmx5IEpDU19SR0IgYW5kIEpDU19DTVlLIHZhbHVlcyBvZiB0aGUKIC8vIEpfQ09MT1JfU1BBQ0UgZW51bS4KIC8vIElmIHlvdSBuZWVkIGEgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gZm9yIG90aGVyIEpfQ09MT1JfU1BBQ0UgdmFsdWVzLApAQCAtMTE1NSw2ICsxMTYzLDEzIEBACiAgIHJldHVybiBkZWNvZGVyLT5GcmFtZUlzRGVjb2RlZEF0SW5kZXgoMCk7CiB9CiAKK2NjOjpZVVZTdWJzYW1wbGluZyBKUEVHSW1hZ2VEZWNvZGVyOjpHZXRZVVZTdWJzYW1wbGluZygpIGNvbnN0IHsKKyAgRENIRUNLKHJlYWRlcl8tPkluZm8oKSk7CisgIC8vIHJlYWRlcl8tPkluZm8oKSBzaG91bGQgaGF2ZSBnb25lIHRocm91Z2ggYSBqcGVnX3JlYWRfaGVhZGVyKCkgY2FsbC4KKyAgRENIRUNLKElzRGVjb2RlZFNpemVBdmFpbGFibGUoKSk7CisgIHJldHVybiBZdXZTdWJzYW1wbGluZygqcmVhZGVyXy0+SW5mbygpKTsKK30KKwogdm9pZCBKUEVHSW1hZ2VEZWNvZGVyOjpEZWNvZGUoYm9vbCBvbmx5X3NpemUpIHsKICAgaWYgKEZhaWxlZCgpKQogICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL2pwZWcvanBlZ19pbWFnZV9kZWNvZGVyLmggYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9qcGVnL2pwZWdfaW1hZ2VfZGVjb2Rlci5oCmluZGV4IGI0M2RjZmUuLjY4MDEwMzQyMSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvanBlZy9qcGVnX2ltYWdlX2RlY29kZXIuaAorKysgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9qcGVnL2pwZWdfaW1hZ2VfZGVjb2Rlci5oCkBAIC03OCw2ICs3OCw4IEBACiAgIC8vIEltYWdlRGVjb2RlcjoKICAgdm9pZCBEZWNvZGVTaXplKCkgb3ZlcnJpZGUgeyBEZWNvZGUodHJ1ZSk7IH0KICAgdm9pZCBEZWNvZGUoc2l6ZV90KSBvdmVycmlkZSB7IERlY29kZShmYWxzZSk7IH0KKyAgY2M6OllVVlN1YnNhbXBsaW5nIEdldFlVVlN1YnNhbXBsaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGNjOjpJbWFnZUhlYWRlck1ldGFkYXRhIE1ha2VNZXRhZGF0YUZvckRlY29kZUFjY2VsZXJhdGlvbigpIGNvbnN0IG92ZXJyaWRlOwogCiAgIC8vIERlY29kZXMgdGhlIGltYWdlLiAgSWYgfG9ubHlfc2l6ZXwgaXMgdHJ1ZSwgc3RvcHMgZGVjb2RpbmcgYWZ0ZXIKICAgLy8gY2FsY3VsYXRpbmcgdGhlIGltYWdlIHNpemUuICBJZiBkZWNvZGluZyBmYWlscyBidXQgdGhlcmUgaXMgbm8gbW9yZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvd2VicC93ZWJwX2ltYWdlX2RlY29kZXIuY2MgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy93ZWJwL3dlYnBfaW1hZ2VfZGVjb2Rlci5jYwppbmRleCBmNGM2MDcyMy4uYTc1ZjM3MzggMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3dlYnAvd2VicF9pbWFnZV9kZWNvZGVyLmNjCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3dlYnAvd2VicF9pbWFnZV9kZWNvZGVyLmNjCkBAIC0yOCw2ICsyOCw4IEBACiAKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy93ZWJwL3dlYnBfaW1hZ2VfZGVjb2Rlci5oIgogCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKICNpbmNsdWRlICJiYXNlL2ZlYXR1cmVfbGlzdC5oIgogI2luY2x1ZGUgImJ1aWxkL2J1aWxkX2NvbmZpZy5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL2luc3RydW1lbnRhdGlvbi9oaXN0b2dyYW0uaCIKQEAgLTEyMSw2ICsxMjMsMjAgQEAKICAga0NvdW50V2ViUEZpbGVGb3JtYXRzCiB9OwogCisvLyBWYWxpZGF0ZXMgdGhhdCB8YmxvYnwgaXMgYSBzaW1wbGUgbG9zc3kgV2ViUCBpbWFnZS4gTm90ZSB0aGF0IHRoaXMgZXhwbGljaXRseQorLy8gY2hlY2tzICJXRUJQVlA4ICIgdG8gZXhjbHVkZSBleHRlbmRlZCBsb3NzeSBXZWJQcyB0aGF0IGRvbid0IGFjdHVhbGx5IHVzZSBhbnkKKy8vIGV4dGVuZGVkIGZlYXR1cmVzLgorLy8KKy8vIFRPRE8oY3JidWcuY29tLzEwMDkyMzcpOiBjb25zaWRlciBjb21iaW5pbmcgdGhpcyB3aXRoIHRoZSBsb2dpYyB0byBkZXRlY3QKKy8vIFdlYlBzIHRoYXQgY2FuIGJlIGRlY29kZWQgdG8gWVVWLgorYm9vbCBJc1NpbXBsZUxvc3N5V2ViUEltYWdlKGNvbnN0IHNrX3NwPFNrRGF0YT4mIGJsb2IpIHsKKyAgaWYgKGJsb2ItPnNpemUoKSA8IDIwVUwpCisgICAgcmV0dXJuIGZhbHNlOworICBEQ0hFQ0soYmxvYi0+Ynl0ZXMoKSk7CisgIHJldHVybiAhbWVtY21wKGJsb2ItPmJ5dGVzKCksICJSSUZGIiwgNCkgJiYKKyAgICAgICAgICFtZW1jbXAoYmxvYi0+Ynl0ZXMoKSArIDhVTCwgIldFQlBWUDggIiwgOCk7Cit9CisKIC8vIFRoaXMgbWV0aG9kIHBhcnNlcyB8YmxvYnwncyBoZWFkZXIgYW5kIGVtaXRzIGEgVU1BIHdpdGggdGhlIGZpbGUgZm9ybWF0LCBhcwogLy8gZGVmaW5lZCBieSBXZWJQLCBzZWUgV2ViUEZpbGVGb3JtYXQuCiB2b2lkIFVwZGF0ZVdlYlBGaWxlRm9ybWF0VU1BKGNvbnN0IHNrX3NwPFNrRGF0YT4mIGJsb2IpIHsKQEAgLTQ0MSw2ICs0NTcsMTcgQEAKICAgcmV0dXJuIFNrWVVWQ29sb3JTcGFjZTo6a1JlYzYwMV9Ta1lVVkNvbG9yU3BhY2U7CiB9CiAKK2NjOjpZVVZTdWJzYW1wbGluZyBXRUJQSW1hZ2VEZWNvZGVyOjpHZXRZVVZTdWJzYW1wbGluZygpIGNvbnN0IHsKKyAgRENIRUNLKGNvbnNvbGlkYXRlZF9kYXRhXyk7CisgIGlmIChJc1NpbXBsZUxvc3N5V2ViUEltYWdlKGNvbnNvbGlkYXRlZF9kYXRhXykpCisgICAgcmV0dXJuIGNjOjpZVVZTdWJzYW1wbGluZzo6azQyMDsKKyAgLy8gSXQgaXMgcG9zc2libGUgZm9yIGEgbm9uLXNpbXBsZSBsb3NzeSBXZWJQIHRvIGFsc28gYmUgWVVWIDQ6MjowLiBIb3dldmVyLAorICAvLyB3ZSdyZSBiZWluZyBjb25zZXJ2YXRpdmUgaGVyZSBiZWNhdXNlIHRoaXMgaXMgY3VycmVudGx5IG9ubHkgdXNlZCBmb3IKKyAgLy8gaGFyZHdhcmUgZGVjb2RlIGFjY2VsZXJhdGlvbiwgYW5kIFdlYlBzIG90aGVyIHRoYW4gc2ltcGxlIGxvc3N5IGFyZSBub3QKKyAgLy8gc3VwcG9ydGVkIGluIHRoYXQgcGF0aCBhbnl3YXkuCisgIHJldHVybiBjYzo6WVVWU3Vic2FtcGxpbmc6OmtVbmtub3duOworfQorCiBib29sIFdFQlBJbWFnZURlY29kZXI6OkNhblJldXNlUHJldmlvdXNGcmFtZUJ1ZmZlcihzaXplX3QgZnJhbWVfaW5kZXgpIGNvbnN0IHsKICAgRENIRUNLKGZyYW1lX2luZGV4IDwgZnJhbWVfYnVmZmVyX2NhY2hlXy5zaXplKCkpOwogICByZXR1cm4gZnJhbWVfYnVmZmVyX2NhY2hlX1tmcmFtZV9pbmRleF0uR2V0QWxwaGFCbGVuZFNvdXJjZSgpICE9CkBAIC03NjcsNCArNzk0LDE1IEBACiAgIH0KIH0KIAorY2M6OkltYWdlSGVhZGVyTWV0YWRhdGEgV0VCUEltYWdlRGVjb2Rlcjo6TWFrZU1ldGFkYXRhRm9yRGVjb2RlQWNjZWxlcmF0aW9uKCkKKyAgICBjb25zdCB7CisgIGNjOjpJbWFnZUhlYWRlck1ldGFkYXRhIGltYWdlX21ldGFkYXRhID0KKyAgICAgIEltYWdlRGVjb2Rlcjo6TWFrZU1ldGFkYXRhRm9yRGVjb2RlQWNjZWxlcmF0aW9uKCk7CisKKyAgRENIRUNLKGNvbnNvbGlkYXRlZF9kYXRhXyk7CisgIGltYWdlX21ldGFkYXRhLndlYnBfaXNfbm9uX2V4dGVuZGVkX2xvc3N5ID0KKyAgICAgIElzU2ltcGxlTG9zc3lXZWJQSW1hZ2UoY29uc29saWRhdGVkX2RhdGFfKTsKKyAgcmV0dXJuIGltYWdlX21ldGFkYXRhOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYmxpbmsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3dlYnAvd2VicF9pbWFnZV9kZWNvZGVyLmggYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy93ZWJwL3dlYnBfaW1hZ2VfZGVjb2Rlci5oCmluZGV4IDZhZWQyYWViLi4xYzQwZDM3IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy93ZWJwL3dlYnBfaW1hZ2VfZGVjb2Rlci5oCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3dlYnAvd2VicF9pbWFnZV9kZWNvZGVyLmgKQEAgLTYxLDYgKzYxLDggQEAKICAgdm9pZCBEZWNvZGUoc2l6ZV90KSBvdmVycmlkZTsKICAgdm9pZCBEZWNvZGVUb1lVVigpIG92ZXJyaWRlOwogICBTa1lVVkNvbG9yU3BhY2UgR2V0WVVWQ29sb3JTcGFjZSgpIGNvbnN0IG92ZXJyaWRlOworICBjYzo6WVVWU3Vic2FtcGxpbmcgR2V0WVVWU3Vic2FtcGxpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgY2M6OkltYWdlSGVhZGVyTWV0YWRhdGEgTWFrZU1ldGFkYXRhRm9yRGVjb2RlQWNjZWxlcmF0aW9uKCkgY29uc3Qgb3ZlcnJpZGU7CiAKICAgV0VCUF9DU1BfTU9ERSBSR0JPdXRwdXRNb2RlKCk7CiAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgaW1hZ2UgZGF0YSByZWNlaXZlZCBzbyBmYXIgKGFzIHN0b3JlZCBpbgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vaW5zdHJ1bWVudGF0aW9uL0JVSUxELmduIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vaW5zdHJ1bWVudGF0aW9uL0JVSUxELmduCmluZGV4IDQ0MzFjY2UuLjc5NWIxYTI1IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9pbnN0cnVtZW50YXRpb24vQlVJTEQuZ24KKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vaW5zdHJ1bWVudGF0aW9uL0JVSUxELmduCkBAIC0zNSw2ICszNSw3IEBACiAgIF0KIAogICBkZXBzID0gWworICAgICIvL2NvbXBvbmVudHMvcGVyZm9ybWFuY2VfbWFuYWdlci9wdWJsaWMvbW9qb206bW9qb21fYmxpbmsiLAogICAgICIvL3NlcnZpY2VzL3NlcnZpY2VfbWFuYWdlci9wdWJsaWMvY3BwIiwKICAgXQogfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vaW5zdHJ1bWVudGF0aW9uL0RFUFMgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9pbnN0cnVtZW50YXRpb24vREVQUwppbmRleCAwNTZhZTJhMy4uMWI5YWFlMiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vaW5zdHJ1bWVudGF0aW9uL0RFUFMKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vaW5zdHJ1bWVudGF0aW9uL0RFUFMKQEAgLTEyLDYgKzEyLDcgQEAKICAgICAiK2Jhc2Uvc3RyaW5ncyIsCiAgICAgIitiYXNlL3RyYWNlX2V2ZW50IiwKICAgICAiK2Jhc2UvdmFsdWVzLmgiLAorICAgICIrY29tcG9uZW50cy9wZXJmb3JtYW5jZV9tYW5hZ2VyL3B1YmxpYy9tb2pvbSIsCiAgICAgIitza2lhL2V4dC9za2lhX3RyYWNlX21lbW9yeV9kdW1wX2ltcGwuaCIsCiAKICAgICAiK3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL2ZvbnRzL2ZvbnRfZ2xvYmFsX2NvbnRleHQuaCIsCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9pbnN0cnVtZW50YXRpb24vcmVzb3VyY2VfY29vcmRpbmF0b3IvZG9jdW1lbnRfcmVzb3VyY2VfY29vcmRpbmF0b3IuY2MgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9pbnN0cnVtZW50YXRpb24vcmVzb3VyY2VfY29vcmRpbmF0b3IvZG9jdW1lbnRfcmVzb3VyY2VfY29vcmRpbmF0b3IuY2MKaW5kZXggNDdiNDlkMi4uMjljN2NhM2IgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL2luc3RydW1lbnRhdGlvbi9yZXNvdXJjZV9jb29yZGluYXRvci9kb2N1bWVudF9yZXNvdXJjZV9jb29yZGluYXRvci5jYworKysgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9pbnN0cnVtZW50YXRpb24vcmVzb3VyY2VfY29vcmRpbmF0b3IvZG9jdW1lbnRfcmVzb3VyY2VfY29vcmRpbmF0b3IuY2MKQEAgLTE0LDcgKzE0LDcgQEAKIAogbmFtZXNwYWNlIHsKIAotdXNpbmcgcmVzb3VyY2VfY29vcmRpbmF0b3I6Om1vam9tOjpJbnRlcnZlbnRpb25Qb2xpY3k7Cit1c2luZyBwZXJmb3JtYW5jZV9tYW5hZ2VyOjptb2pvbTo6SW50ZXJ2ZW50aW9uUG9saWN5OwogCiB9ICAvLyBuYW1lc3BhY2UKIApAQCAtNDEsNyArNDEsNyBAQAogfQogCiB2b2lkIERvY3VtZW50UmVzb3VyY2VDb29yZGluYXRvcjo6U2V0TGlmZWN5Y2xlU3RhdGUoCi0gICAgcmVzb3VyY2VfY29vcmRpbmF0b3I6Om1vam9tOjpMaWZlY3ljbGVTdGF0ZSBzdGF0ZSkgeworICAgIHBlcmZvcm1hbmNlX21hbmFnZXI6Om1vam9tOjpMaWZlY3ljbGVTdGF0ZSBzdGF0ZSkgewogICBzZXJ2aWNlXy0+U2V0TGlmZWN5Y2xlU3RhdGUoc3RhdGUpOwogfQogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9pbnN0cnVtZW50YXRpb24vcmVzb3VyY2VfY29vcmRpbmF0b3IvZG9jdW1lbnRfcmVzb3VyY2VfY29vcmRpbmF0b3IuaCBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL2luc3RydW1lbnRhdGlvbi9yZXNvdXJjZV9jb29yZGluYXRvci9kb2N1bWVudF9yZXNvdXJjZV9jb29yZGluYXRvci5oCmluZGV4IGY1Yjg4ZjguLjU5MjE3NTMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL2luc3RydW1lbnRhdGlvbi9yZXNvdXJjZV9jb29yZGluYXRvci9kb2N1bWVudF9yZXNvdXJjZV9jb29yZGluYXRvci5oCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL2luc3RydW1lbnRhdGlvbi9yZXNvdXJjZV9jb29yZGluYXRvci9kb2N1bWVudF9yZXNvdXJjZV9jb29yZGluYXRvci5oCkBAIC04LDggKzgsOCBAQAogI2luY2x1ZGUgPG1lbW9yeT4KIAogI2luY2x1ZGUgImJhc2UvbWFjcm9zLmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9wZXJmb3JtYW5jZV9tYW5hZ2VyL3B1YmxpYy9tb2pvbS9jb29yZGluYXRpb25fdW5pdC5tb2pvbS1ibGluay5oIgogI2luY2x1ZGUgIm1vam8vcHVibGljL2NwcC9iaW5kaW5ncy9yZW1vdGUuaCIKLSNpbmNsdWRlICJzZXJ2aWNlcy9yZXNvdXJjZV9jb29yZGluYXRvci9wdWJsaWMvbW9qb20vY29vcmRpbmF0aW9uX3VuaXQubW9qb20tYmxpbmsuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9wbGF0Zm9ybV9leHBvcnQuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS93dGYvYWxsb2NhdG9yL2FsbG9jYXRvci5oIgogCkBAIC0yOSwxMCArMjksMTAgQEAKICAgfkRvY3VtZW50UmVzb3VyY2VDb29yZGluYXRvcigpOwogCiAgIHZvaWQgU2V0TmV0d29ya0FsbW9zdElkbGUoKTsKLSAgdm9pZCBTZXRMaWZlY3ljbGVTdGF0ZShyZXNvdXJjZV9jb29yZGluYXRvcjo6bW9qb206OkxpZmVjeWNsZVN0YXRlKTsKKyAgdm9pZCBTZXRMaWZlY3ljbGVTdGF0ZShwZXJmb3JtYW5jZV9tYW5hZ2VyOjptb2pvbTo6TGlmZWN5Y2xlU3RhdGUpOwogICB2b2lkIFNldEhhc05vbkVtcHR5QmVmb3JlVW5sb2FkKGJvb2wgaGFzX25vbmVtcHR5X2JlZm9yZXVubG9hZCk7CiAgIHZvaWQgU2V0T3JpZ2luVHJpYWxGcmVlemVQb2xpY3koCi0gICAgICByZXNvdXJjZV9jb29yZGluYXRvcjo6bW9qb206OkludGVydmVudGlvblBvbGljeSBwb2xpY3kpOworICAgICAgcGVyZm9ybWFuY2VfbWFuYWdlcjo6bW9qb206OkludGVydmVudGlvblBvbGljeSBwb2xpY3kpOwogICAvLyBBIG9uZSB3YXkgc3dpdGNoIHRoYXQgbWFya3MgYSBmcmFtZSBhcyBiZWluZyBhbiBhZGZyYW1lLgogICB2b2lkIFNldElzQWRGcmFtZSgpOwogICB2b2lkIE9uTm9uUGVyc2lzdGVudE5vdGlmaWNhdGlvbkNyZWF0ZWQoKTsKQEAgLTQwLDcgKzQwLDcgQEAKICBwcml2YXRlOgogICBleHBsaWNpdCBEb2N1bWVudFJlc291cmNlQ29vcmRpbmF0b3Ioc2VydmljZV9tYW5hZ2VyOjpJbnRlcmZhY2VQcm92aWRlciopOwogCi0gIG1vam86OlJlbW90ZTxyZXNvdXJjZV9jb29yZGluYXRvcjo6bW9qb206OmJsaW5rOjpEb2N1bWVudENvb3JkaW5hdGlvblVuaXQ+CisgIG1vam86OlJlbW90ZTxwZXJmb3JtYW5jZV9tYW5hZ2VyOjptb2pvbTo6Ymxpbms6OkRvY3VtZW50Q29vcmRpbmF0aW9uVW5pdD4KICAgICAgIHNlcnZpY2VfOwogCiAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihEb2N1bWVudFJlc291cmNlQ29vcmRpbmF0b3IpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vaW5zdHJ1bWVudGF0aW9uL3Jlc291cmNlX2Nvb3JkaW5hdG9yL3JlbmRlcmVyX3Jlc291cmNlX2Nvb3JkaW5hdG9yLmNjIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vaW5zdHJ1bWVudGF0aW9uL3Jlc291cmNlX2Nvb3JkaW5hdG9yL3JlbmRlcmVyX3Jlc291cmNlX2Nvb3JkaW5hdG9yLmNjCmluZGV4IGRlY2ZmZWEuLjQyNDM3ZjYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL2luc3RydW1lbnRhdGlvbi9yZXNvdXJjZV9jb29yZGluYXRvci9yZW5kZXJlcl9yZXNvdXJjZV9jb29yZGluYXRvci5jYworKysgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9pbnN0cnVtZW50YXRpb24vcmVzb3VyY2VfY29vcmRpbmF0b3IvcmVuZGVyZXJfcmVzb3VyY2VfY29vcmRpbmF0b3IuY2MKQEAgLTI3LDcgKzI3LDcgQEAKICAgRENIRUNLKHBsYXRmb3JtKTsKIAogICBtb2pvOjpQZW5kaW5nUmVtb3RlPAotICAgICAgcmVzb3VyY2VfY29vcmRpbmF0b3I6Om1vam9tOjpibGluazo6UHJvY2Vzc0Nvb3JkaW5hdGlvblVuaXQ+CisgICAgICBwZXJmb3JtYW5jZV9tYW5hZ2VyOjptb2pvbTo6Ymxpbms6OlByb2Nlc3NDb29yZGluYXRpb25Vbml0PgogICAgICAgcmVtb3RlOwogICBwbGF0Zm9ybS0+R2V0QnJvd3NlckludGVyZmFjZUJyb2tlclByb3h5KCktPkdldEludGVyZmFjZSgKICAgICAgIHJlbW90ZS5Jbml0V2l0aE5ld1BpcGVBbmRQYXNzUmVjZWl2ZXIoKSk7CkBAIC00OSw3ICs0OSw3IEBACiAKIFJlbmRlcmVyUmVzb3VyY2VDb29yZGluYXRvcjo6UmVuZGVyZXJSZXNvdXJjZUNvb3JkaW5hdG9yKAogICAgIG1vam86OlBlbmRpbmdSZW1vdGU8Ci0gICAgICAgIHJlc291cmNlX2Nvb3JkaW5hdG9yOjptb2pvbTo6Ymxpbms6OlByb2Nlc3NDb29yZGluYXRpb25Vbml0PiByZW1vdGUpIHsKKyAgICAgICAgcGVyZm9ybWFuY2VfbWFuYWdlcjo6bW9qb206OmJsaW5rOjpQcm9jZXNzQ29vcmRpbmF0aW9uVW5pdD4gcmVtb3RlKSB7CiAgIHNlcnZpY2VfLkJpbmQoc3RkOjptb3ZlKHJlbW90ZSkpOwogfQogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9pbnN0cnVtZW50YXRpb24vcmVzb3VyY2VfY29vcmRpbmF0b3IvcmVuZGVyZXJfcmVzb3VyY2VfY29vcmRpbmF0b3IuaCBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL2luc3RydW1lbnRhdGlvbi9yZXNvdXJjZV9jb29yZGluYXRvci9yZW5kZXJlcl9yZXNvdXJjZV9jb29yZGluYXRvci5oCmluZGV4IDg3NmZiMWEuLjQzNzk1Y2MgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL2luc3RydW1lbnRhdGlvbi9yZXNvdXJjZV9jb29yZGluYXRvci9yZW5kZXJlcl9yZXNvdXJjZV9jb29yZGluYXRvci5oCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL2luc3RydW1lbnRhdGlvbi9yZXNvdXJjZV9jb29yZGluYXRvci9yZW5kZXJlcl9yZXNvdXJjZV9jb29yZGluYXRvci5oCkBAIC02LDggKzYsOCBAQAogI2RlZmluZSBUSElSRF9QQVJUWV9CTElOS19SRU5ERVJFUl9QTEFURk9STV9JTlNUUlVNRU5UQVRJT05fUkVTT1VSQ0VfQ09PUkRJTkFUT1JfUkVOREVSRVJfUkVTT1VSQ0VfQ09PUkRJTkFUT1JfSF8KIAogI2luY2x1ZGUgImJhc2UvbWFjcm9zLmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9wZXJmb3JtYW5jZV9tYW5hZ2VyL3B1YmxpYy9tb2pvbS9jb29yZGluYXRpb25fdW5pdC5tb2pvbS1ibGluay5oIgogI2luY2x1ZGUgIm1vam8vcHVibGljL2NwcC9iaW5kaW5ncy9yZW1vdGUuaCIKLSNpbmNsdWRlICJzZXJ2aWNlcy9yZXNvdXJjZV9jb29yZGluYXRvci9wdWJsaWMvbW9qb20vY29vcmRpbmF0aW9uX3VuaXQubW9qb20tYmxpbmsuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9wbGF0Zm9ybV9leHBvcnQuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS93dGYvYWxsb2NhdG9yL2FsbG9jYXRvci5oIgogCkBAIC0zNiw5ICszNiw5IEBACiAgcHJpdmF0ZToKICAgZXhwbGljaXQgUmVuZGVyZXJSZXNvdXJjZUNvb3JkaW5hdG9yKAogICAgICAgbW9qbzo6UGVuZGluZ1JlbW90ZTwKLSAgICAgICAgICByZXNvdXJjZV9jb29yZGluYXRvcjo6bW9qb206OmJsaW5rOjpQcm9jZXNzQ29vcmRpbmF0aW9uVW5pdD4gcmVtb3RlKTsKKyAgICAgICAgICBwZXJmb3JtYW5jZV9tYW5hZ2VyOjptb2pvbTo6Ymxpbms6OlByb2Nlc3NDb29yZGluYXRpb25Vbml0PiByZW1vdGUpOwogCi0gIG1vam86OlJlbW90ZTxyZXNvdXJjZV9jb29yZGluYXRvcjo6bW9qb206OmJsaW5rOjpQcm9jZXNzQ29vcmRpbmF0aW9uVW5pdD4KKyAgbW9qbzo6UmVtb3RlPHBlcmZvcm1hbmNlX21hbmFnZXI6Om1vam9tOjpibGluazo6UHJvY2Vzc0Nvb3JkaW5hdGlvblVuaXQ+CiAgICAgICBzZXJ2aWNlXzsKIAogICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oUmVuZGVyZXJSZXNvdXJjZUNvb3JkaW5hdG9yKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL3AycC9tZG5zX3Jlc3BvbmRlcl9hZGFwdGVyLmNjIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vcDJwL21kbnNfcmVzcG9uZGVyX2FkYXB0ZXIuY2MKaW5kZXggNzBhMjczMGEuLjEzZTAyOGQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL3AycC9tZG5zX3Jlc3BvbmRlcl9hZGFwdGVyLmNjCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL3AycC9tZG5zX3Jlc3BvbmRlcl9hZGFwdGVyLmNjCkBAIC04LDYgKzgsNyBAQAogCiAjaW5jbHVkZSAiYmFzZS9iaW5kLmgiCiAjaW5jbHVkZSAiamluZ2xlL2dsdWUvdXRpbHMuaCIKKyNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvYmluZGluZ3MvcGVuZGluZ19yZW1vdGUuaCIKICNpbmNsdWRlICJuZXQvYmFzZS9pcF9hZGRyZXNzLmgiCiAjaW5jbHVkZSAibmV0L2Jhc2UvaXBfZW5kcG9pbnQuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvY29tbW9uL3RocmVhZF9zYWZlX2Jyb3dzZXJfaW50ZXJmYWNlX2Jyb2tlcl9wcm94eS5oIgpAQCAtMzksMjcgKzQwLDI3IEBACiB9ICAvLyBuYW1lc3BhY2UKIAogTWRuc1Jlc3BvbmRlckFkYXB0ZXI6Ok1kbnNSZXNwb25kZXJBZGFwdGVyKCkgewotICBuZXR3b3JrOjptb2pvbTo6Ymxpbms6Ok1kbnNSZXNwb25kZXJQdHIgY2xpZW50OwotICBhdXRvIHJlcXVlc3QgPSBtb2pvOjpNYWtlUmVxdWVzdCgmY2xpZW50KTsKLSAgdGhyZWFkX3NhZmVfY2xpZW50XyA9Ci0gICAgICBuZXR3b3JrOjptb2pvbTo6Ymxpbms6OlRocmVhZFNhZmVNZG5zUmVzcG9uZGVyUHRyOjpDcmVhdGUoCisgIG1vam86OlBlbmRpbmdSZW1vdGU8bmV0d29yazo6bW9qb206OmJsaW5rOjpNZG5zUmVzcG9uZGVyPiBjbGllbnQ7CisgIGF1dG8gcmVjZWl2ZXIgPSBjbGllbnQuSW5pdFdpdGhOZXdQaXBlQW5kUGFzc1JlY2VpdmVyKCk7CisgIHNoYXJlZF9yZW1vdGVfY2xpZW50XyA9CisgICAgICBtb2pvOjpTaGFyZWRSZW1vdGU8bmV0d29yazo6bW9qb206OmJsaW5rOjpNZG5zUmVzcG9uZGVyPigKICAgICAgICAgICBzdGQ6Om1vdmUoY2xpZW50KSk7CiAgIGJsaW5rOjpQbGF0Zm9ybTo6Q3VycmVudCgpLT5HZXRCcm93c2VySW50ZXJmYWNlQnJva2VyUHJveHkoKS0+R2V0SW50ZXJmYWNlKAotICAgICAgc3RkOjptb3ZlKHJlcXVlc3QpKTsKKyAgICAgIHN0ZDo6bW92ZShyZWNlaXZlcikpOwogfQogCiBNZG5zUmVzcG9uZGVyQWRhcHRlcjo6fk1kbnNSZXNwb25kZXJBZGFwdGVyKCkgPSBkZWZhdWx0OwogCiB2b2lkIE1kbnNSZXNwb25kZXJBZGFwdGVyOjpDcmVhdGVOYW1lRm9yQWRkcmVzcyhjb25zdCBydGM6OklQQWRkcmVzcyYgYWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVDcmVhdGVkQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgdGhyZWFkX3NhZmVfY2xpZW50Xy0+Z2V0KCktPkNyZWF0ZU5hbWVGb3JBZGRyZXNzKAorICBzaGFyZWRfcmVtb3RlX2NsaWVudF8tPkNyZWF0ZU5hbWVGb3JBZGRyZXNzKAogICAgICAgamluZ2xlX2dsdWU6OlJ0Y0lQQWRkcmVzc1RvTmV0SVBBZGRyZXNzKGFkZHIpLAogICAgICAgYmFzZTo6QmluZE9uY2UoJk9uTmFtZUNyZWF0ZWRGb3JBZGRyZXNzLCBjYWxsYmFjaywgYWRkcikpOwogfQogCiB2b2lkIE1kbnNSZXNwb25kZXJBZGFwdGVyOjpSZW1vdmVOYW1lRm9yQWRkcmVzcyhjb25zdCBydGM6OklQQWRkcmVzcyYgYWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVSZW1vdmVkQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgdGhyZWFkX3NhZmVfY2xpZW50Xy0+Z2V0KCktPlJlbW92ZU5hbWVGb3JBZGRyZXNzKAorICBzaGFyZWRfcmVtb3RlX2NsaWVudF8tPlJlbW92ZU5hbWVGb3JBZGRyZXNzKAogICAgICAgamluZ2xlX2dsdWU6OlJ0Y0lQQWRkcmVzc1RvTmV0SVBBZGRyZXNzKGFkZHIpLAogICAgICAgYmFzZTo6QmluZE9uY2UoJk9uTmFtZVJlbW92ZWRGb3JBZGRyZXNzLCBjYWxsYmFjaykpOwogfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vcDJwL21kbnNfcmVzcG9uZGVyX2FkYXB0ZXIuaCBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL3AycC9tZG5zX3Jlc3BvbmRlcl9hZGFwdGVyLmgKaW5kZXggYjgyOTgzMmZjLi41M2YwNDVhIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9wMnAvbWRuc19yZXNwb25kZXJfYWRhcHRlci5oCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL3AycC9tZG5zX3Jlc3BvbmRlcl9hZGFwdGVyLmgKQEAgLTUsNiArNSw3IEBACiAjaWZuZGVmIFRISVJEX1BBUlRZX0JMSU5LX1JFTkRFUkVSX1BMQVRGT1JNX1AyUF9NRE5TX1JFU1BPTkRFUl9BREFQVEVSX0hfCiAjZGVmaW5lIFRISVJEX1BBUlRZX0JMSU5LX1JFTkRFUkVSX1BMQVRGT1JNX1AyUF9NRE5TX1JFU1BPTkRFUl9BREFQVEVSX0hfCiAKKyNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvYmluZGluZ3Mvc2hhcmVkX3JlbW90ZS5oIgogI2luY2x1ZGUgInNlcnZpY2VzL25ldHdvcmsvcHVibGljL21vam9tL21kbnNfcmVzcG9uZGVyLm1vam9tLWJsaW5rLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vcGxhdGZvcm1fZXhwb3J0LmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvd2VicnRjL3J0Y19iYXNlL21kbnNfcmVzcG9uZGVyX2ludGVyZmFjZS5oIgpAQCAtMzQsOCArMzUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVSZW1vdmVkQ2FsbGJhY2sgY2FsbGJhY2spIG92ZXJyaWRlOwogCiAgcHJpdmF0ZToKLSAgc2NvcGVkX3JlZnB0cjxuZXR3b3JrOjptb2pvbTo6Ymxpbms6OlRocmVhZFNhZmVNZG5zUmVzcG9uZGVyUHRyPgotICAgICAgdGhyZWFkX3NhZmVfY2xpZW50XzsKKyAgbW9qbzo6U2hhcmVkUmVtb3RlPG5ldHdvcms6Om1vam9tOjpibGluazo6TWRuc1Jlc3BvbmRlcj4KKyAgICAgIHNoYXJlZF9yZW1vdGVfY2xpZW50XzsKIAogICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTWRuc1Jlc3BvbmRlckFkYXB0ZXIpOwogfTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL3J1bnRpbWVfZW5hYmxlZF9mZWF0dXJlcy5qc29uNSBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL3J1bnRpbWVfZW5hYmxlZF9mZWF0dXJlcy5qc29uNQppbmRleCA5ZDlmMzMzLi5lOThmMWU3ZiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vcnVudGltZV9lbmFibGVkX2ZlYXR1cmVzLmpzb241CisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL3J1bnRpbWVfZW5hYmxlZF9mZWF0dXJlcy5qc29uNQpAQCAtNDUwLDYgKzQ1MCwxMCBAQAogICAgICAgc3RhdHVzOiAiZXhwZXJpbWVudGFsIiwKICAgICB9LAogICAgIHsKKyAgICAgIG5hbWU6ICJDU1NPTVZpZXdTY3JvbGxDb29yZGluYXRlcyIsCisgICAgICBzdGF0dXM6ICJleHBlcmltZW50YWwiLAorICAgIH0sCisgICAgewogICAgICAgbmFtZTogIkNTU1BhaW50QVBJQXJndW1lbnRzIiwKICAgICAgIHN0YXR1czogImV4cGVyaW1lbnRhbCIsCiAgICAgICBkZXBlbmRzX29uOiBbIkNTU1ZhcmlhYmxlczIiXSwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL3NjaGVkdWxlci90ZXN0L3dlYl9mYWtlX3RocmVhZF9zY2hlZHVsZXIuY2MgYi90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9zY2hlZHVsZXIvdGVzdC93ZWJfZmFrZV90aHJlYWRfc2NoZWR1bGVyLmNjCmluZGV4IGIyODU5MWQuLjE3NzY2YzMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL3NjaGVkdWxlci90ZXN0L3dlYl9mYWtlX3RocmVhZF9zY2hlZHVsZXIuY2MKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvcGxhdGZvcm0vc2NoZWR1bGVyL3Rlc3Qvd2ViX2Zha2VfdGhyZWFkX3NjaGVkdWxlci5jYwpAQCAtNiw2ICs2LDcgQEAKIAogI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wL21lc3NhZ2VfbG9vcC5oIgogI2luY2x1ZGUgImJhc2Uvc2luZ2xlX3RocmVhZF90YXNrX3J1bm5lci5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF90YXNrX3J1bm5lcl9oYW5kbGUuaCIKICNpbmNsdWRlICJidWlsZC9idWlsZF9jb25maWcuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9wbGF0Zm9ybS9zY2hlZHVsZXIvcHVibGljL3RocmVhZC5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL3BsYXRmb3JtL3d0Zi90ZXh0L3d0Zl9zdHJpbmcuaCIKQEAgLTMzLDcgKzM0LDcgQEAKIAogc2NvcGVkX3JlZnB0cjxiYXNlOjpTaW5nbGVUaHJlYWRUYXNrUnVubmVyPgogV2ViRmFrZVRocmVhZFNjaGVkdWxlcjo6SW5wdXRUYXNrUnVubmVyKCkgewotICByZXR1cm4gbnVsbHB0cjsKKyAgcmV0dXJuIGJhc2U6OlRocmVhZFRhc2tSdW5uZXJIYW5kbGU6OkdldCgpOwogfQogCiBzY29wZWRfcmVmcHRyPGJhc2U6OlNpbmdsZVRocmVhZFRhc2tSdW5uZXI+CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvRmxhZ0V4cGVjdGF0aW9ucy9lbmFibGUtYmxpbmstZmVhdHVyZXM9TGF5b3V0TkdGcmFnbWVudEl0ZW0gYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvRmxhZ0V4cGVjdGF0aW9ucy9lbmFibGUtYmxpbmstZmVhdHVyZXM9TGF5b3V0TkdGcmFnbWVudEl0ZW0KaW5kZXggNzU3NWFjOS4uNDAxMzk4ZCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL0ZsYWdFeHBlY3RhdGlvbnMvZW5hYmxlLWJsaW5rLWZlYXR1cmVzPUxheW91dE5HRnJhZ21lbnRJdGVtCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9GbGFnRXhwZWN0YXRpb25zL2VuYWJsZS1ibGluay1mZWF0dXJlcz1MYXlvdXROR0ZyYWdtZW50SXRlbQpAQCAtMTg3OSw3ICsxODc5LDYgQEAKIGNyYnVnLmNvbS85ODIxOTQgdmlydHVhbC9sYXlvdXRfbmdfZXhwZXJpbWVudGFsL3ByaW50aW5nL3BhZ2UtY291bnQtbGF5b3V0LW92ZXJmbG93Lmh0bWwgWyBGYWlsdXJlIF0KIGNyYnVnLmNvbS85ODIxOTQgdmlydHVhbC9sYXlvdXRfbmdfZXhwZXJpbWVudGFsL3ByaW50aW5nL3JldHVybi1mcm9tLXByaW50aW5nLW1vZGUuaHRtbCBbIEZhaWx1cmUgXQogY3JidWcuY29tLzk4MjE5NCB2aXJ0dWFsL2xheW91dF9uZ19leHBlcmltZW50YWwvcHJpbnRpbmcvY3NzMi4xL3BhZ2UtYnJlYWstaW5zaWRlLTAwMC5odG1sIFsgRmFpbHVyZSBdCi1jcmJ1Zy5jb20vOTgyMTk0IHZpcnR1YWwvbWFpbl90aHJlYWRfc2Nyb2xsYmFyX2dlc3R1cmVzL2Zhc3Qvc2Nyb2xsaW5nL3Njcm9sbGJhcnMvc2Nyb2xsYmFyLW9jY2x1ZGVkLWJ5LWRpdi5odG1sIFsgQ3Jhc2ggXQogY3JidWcuY29tLzk4MjE5NCB2aXJ0dWFsL21vdXNlZXZlbnRfZnJhY3Rpb25hbC9mYXN0L2V2ZW50cy9hbmNob3ItaW1hZ2Utc2Nyb2xsZWQteC15Lmh0bWwgWyBUaW1lb3V0IF0KIGNyYnVnLmNvbS85ODIxOTQgdmlydHVhbC9tb3VzZWV2ZW50X2ZyYWN0aW9uYWwvZmFzdC9ldmVudHMvYXR0cmlidXRlLWxpc3RlbmVyLWRlbGV0aW9uLWNyYXNoLmh0bWwgWyBDcmFzaCBdCiBjcmJ1Zy5jb20vOTgyMTk0IHZpcnR1YWwvbW91c2VldmVudF9mcmFjdGlvbmFsL2Zhc3QvZXZlbnRzL2F1dG9zY3JvbGwtZGlzYWJsZWQtaW4tZml4Lmh0bWwgWyBDcmFzaCBdCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvTmV2ZXJGaXhUZXN0cyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9OZXZlckZpeFRlc3RzCmluZGV4IDk0ZmQ4OTAuLjE2NGM4MDQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9OZXZlckZpeFRlc3RzCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9OZXZlckZpeFRlc3RzCkBAIC03NSw2ICs3NSwxMCBAQAogWyBNYWMgXSBmYXN0L2Zvcm1zL2NhbGVuZGFyLXBpY2tlci9tb250aC1vcGVuLXBpY2tlci13aXRoLWY0LWtleS5odG1sIFsgV29udEZpeCBdCiBbIE1hYyBdIGZhc3QvZm9ybXMvY2FsZW5kYXItcGlja2VyL3dlZWstb3Blbi1waWNrZXItd2l0aC1mNC1rZXkuaHRtbCBbIFdvbnRGaXggXQogCisjIFRoZXNlIHRlc3RzIGFyZSBzcGVjaWZpYyB0byBXaW5kb3dzLgorY3JidWcuY29tLzEwMTI1OTAgWyBNYWMgXSBmYXN0L292ZXJmbG93L3J0bC1zY3JvbGxiYXItZHJhZy1vcmlnaW4uaHRtbCBbIFdvbnRGaXggXQorY3JidWcuY29tLzEwMTI1OTAgWyBMaW51eCBdIGZhc3Qvb3ZlcmZsb3cvcnRsLXNjcm9sbGJhci1kcmFnLW9yaWdpbi5odG1sIFsgV29udEZpeCBdCisKICMgTWFjIGRvZXMgbm90IGhhdmUgbWVudSBrZXkuCiBbIE1hYyBdIGVkaXRpbmcvc3BlbGxpbmcvc3BlbGxpbmctb24tY29udGV4dC1tZW51LWtleS5odG1sIFsgV29udEZpeCBdCiBbIE1hYyBdIGZhc3QvZXZlbnRzL2NvbnRleHQtbWVudS1rZXktc2hpZnQtZjEwLW1vZGlmaWVycy5odG1sIFsgV29udEZpeCBdCkBAIC0xMDMsOCArMTA3LDYgQEAKIFsgTWFjIF0gICB2aXJ0dWFsL3Njcm9sbF9jdXN0b21pemF0aW9uL2Zhc3Qvc2Nyb2xsaW5nL3Njcm9sbGJhcnMvc2Nyb2xsYmFyLXRodW1iLXNuYXBwaW5nLmh0bWwgWyBXb250Rml4IF0KIFsgTGludXggXSB2aXJ0dWFsL3RocmVhZGVkL2Zhc3Qvc2Nyb2xsaW5nL3Njcm9sbGJhcnMvc2Nyb2xsYmFyLXRodW1iLXNuYXBwaW5nLmh0bWwgWyBXb250Rml4IF0KIFsgTWFjIF0gICB2aXJ0dWFsL3RocmVhZGVkL2Zhc3Qvc2Nyb2xsaW5nL3Njcm9sbGJhcnMvc2Nyb2xsYmFyLXRodW1iLXNuYXBwaW5nLmh0bWwgWyBXb250Rml4IF0KLVsgTGludXggXSB2aXJ0dWFsL21haW5fdGhyZWFkX3Njcm9sbGJhcl9nZXN0dXJlcy9mYXN0L3Njcm9sbGluZy9zY3JvbGxiYXJzL3Njcm9sbGJhci10aHVtYi1zbmFwcGluZy5odG1sIFsgV29udEZpeCBdCi1bIE1hYyBdICAgdmlydHVhbC9tYWluX3RocmVhZF9zY3JvbGxiYXJfZ2VzdHVyZXMvZmFzdC9zY3JvbGxpbmcvc2Nyb2xsYmFycy9zY3JvbGxiYXItdGh1bWItc25hcHBpbmcuaHRtbCBbIFdvbnRGaXggXQogCiAKICMgVGhlc2UgdGVzdHMgYXJlIHNwZWNpZmljIHRvIExpbnV4LgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL1Nsb3dUZXN0cyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9TbG93VGVzdHMKaW5kZXggMzhhMWUxZi4uZmM4NDU4YiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL1Nsb3dUZXN0cworKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvU2xvd1Rlc3RzCkBAIC02NDAsNyArNjQwLDYgQEAKIGNyYnVnLmNvbS85ODA4MDQgdmlydHVhbC9jb21wb3NpdG9yX3RocmVhZGVkX3Njcm9sbGJhcl9zY3JvbGxpbmcvZmFzdC9zY3JvbGxpbmcvc2Nyb2xsYmFycy9tb3VzZS1hdXRvc2Nyb2xsaW5nLW9uLXNjcm9sbGJhci5odG1sIFsgU2xvdyBdCiBjcmJ1Zy5jb20vOTgwODA0IHZpcnR1YWwvc2Nyb2xsX2N1c3RvbWl6YXRpb24vZmFzdC9zY3JvbGxpbmcvc2Nyb2xsYmFycy9tb3VzZS1hdXRvc2Nyb2xsaW5nLW9uLXNjcm9sbGJhci5odG1sIFsgU2xvdyBdCiBjcmJ1Zy5jb20vOTgwODA0IHZpcnR1YWwvdGhyZWFkZWQvZmFzdC9zY3JvbGxpbmcvc2Nyb2xsYmFycy9tb3VzZS1hdXRvc2Nyb2xsaW5nLW9uLXNjcm9sbGJhci5odG1sIFsgU2xvdyBdCi1jcmJ1Zy5jb20vOTgwODA0IHZpcnR1YWwvbWFpbl90aHJlYWRfc2Nyb2xsYmFyX2dlc3R1cmVzL2Zhc3Qvc2Nyb2xsaW5nL3Njcm9sbGJhcnMvbW91c2UtYXV0b3Njcm9sbGluZy1vbi1zY3JvbGxiYXIuaHRtbCBbIFNsb3cgXQogCiBjcmJ1Zy5jb20vOTgzNjQyIHZpcnR1YWwvZ3B1L2Zhc3QvY2FudmFzL2NhbnZhcy1jb21wb3NpdGUtYWxwaGEuaHRtbCBbIFNsb3cgXQogY3JidWcuY29tLzk4MzY0MiBbIE1hYyBEZWJ1ZyBdIGZhc3QvY2FudmFzL2NhbnZhcy1jb21wb3NpdGUtYWxwaGEuaHRtbCBbIFNsb3cgXQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL1Rlc3RFeHBlY3RhdGlvbnMgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvVGVzdEV4cGVjdGF0aW9ucwppbmRleCBiNzY1MWRlLi45Mzg5Y2VjIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvVGVzdEV4cGVjdGF0aW9ucworKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvVGVzdEV4cGVjdGF0aW9ucwpAQCAtNjg2LDYgKzY4Niw5IEBACiAKIGNyYnVnLmNvbS8xMDAzNTA2IGV4dGVybmFsL3dwdC9jc3MvY3NzLWZsZXhib3gvcGVyY2VudGFnZS1oZWlnaHRzLTAwNy5odG1sIFsgRmFpbHVyZSBdCiAKK2NyYnVnLmNvbS82ODAzMzEgZXh0ZXJuYWwvd3B0L2Nzcy9jc3NvbS12aWV3L3Njcm9sbEludG9WaWV3LXNpZGV3YXlzLWxyLXdyaXRpbmctbW9kZS1hbmQtcnRsLWRpcmVjdGlvbi5odG1sIFsgRmFpbHVyZSBdCitjcmJ1Zy5jb20vNjgwMzMxIGV4dGVybmFsL3dwdC9jc3MvY3Nzb20tdmlldy9zY3JvbGxJbnRvVmlldy1zaWRld2F5cy1ybC13cml0aW5nLW1vZGUtYW5kLXJ0bC1kaXJlY3Rpb24uaHRtbCBbIEZhaWx1cmUgXQorCiAjID09PT09PSBMYXlvdXQgdGVhbSBvd25lZCB0ZXN0cyB0byBoZXJlID09PT09PQogCiAjID09PT09PSBMYXlvdXRORy1vbmx5IGZhaWx1cmVzIGZyb20gaGVyZSA9PT09PT0KQEAgLTI4MzEsMTIgKzI4MzQsNiBAQAogY3JidWcuY29tLzk1Mzg0NyBbIE1hYyBdIHZpcnR1YWwvdGhyZWFkZWQvZmFzdC9zY3JvbGxpbmcvc2Nyb2xsYmFycy9zY3JvbGxiYXItb2NjbHVkZWQtYnktZGl2Lmh0bWwgWyBGYWlsdXJlIF0KIGNyYnVnLmNvbS85NTM4NDcgWyBNYWMgXSB2aXJ0dWFsL3RocmVhZGVkL2Zhc3Qvc2Nyb2xsaW5nL3Njcm9sbGJhcnMvc2Nyb2xsYmFyLWJ1dHRvbi1nZXN0dXJlLXRhcmdldC5odG1sIFsgRmFpbHVyZSBdCiBjcmJ1Zy5jb20vOTUzODQ3IFsgTWFjIF0gdmlydHVhbC90aHJlYWRlZC9mYXN0L3Njcm9sbGluZy9zY3JvbGxiYXJzL21vdXNlLWF1dG9zY3JvbGxpbmctb24tc2Nyb2xsYmFyLmh0bWwgWyBGYWlsdXJlIFRpbWVvdXQgXQotY3JidWcuY29tLzk1Mzg0NyBbIE1hYyBdIHZpcnR1YWwvbWFpbl90aHJlYWRfc2Nyb2xsYmFyX2dlc3R1cmVzL2Zhc3Qvc2Nyb2xsaW5nL3Njcm9sbGJhcnMvbW91c2Utc2Nyb2xsaW5nLW9uLWRpdi1zY3JvbGxiYXIuaHRtbCBbIEZhaWx1cmUgXQotY3JidWcuY29tLzk1Mzg0NyBbIE1hYyBdIHZpcnR1YWwvbWFpbl90aHJlYWRfc2Nyb2xsYmFyX2dlc3R1cmVzL2Zhc3Qvc2Nyb2xsaW5nL3Njcm9sbGJhcnMvbW91c2Utc2Nyb2xsaW5nLW9uLXJvb3Qtc2Nyb2xsYmFyLmh0bWwgWyBGYWlsdXJlIF0KLWNyYnVnLmNvbS85NTM4NDcgWyBNYWMgXSB2aXJ0dWFsL21haW5fdGhyZWFkX3Njcm9sbGJhcl9nZXN0dXJlcy9mYXN0L3Njcm9sbGluZy9zY3JvbGxiYXJzL3Njcm9sbC1jaGFpbmluZy1mb3ItZ2VzdHVyZS1iYXNlZC1zY3JvbGxpbmcuaHRtbCBbIEZhaWx1cmUgXQotY3JidWcuY29tLzk1Mzg0NyBbIE1hYyBdIHZpcnR1YWwvbWFpbl90aHJlYWRfc2Nyb2xsYmFyX2dlc3R1cmVzL2Zhc3Qvc2Nyb2xsaW5nL3Njcm9sbGJhcnMvc2Nyb2xsYmFyLW9jY2x1ZGVkLWJ5LWRpdi5odG1sIFsgRmFpbHVyZSBdCi1jcmJ1Zy5jb20vOTUzODQ3IFsgTWFjIF0gdmlydHVhbC9tYWluX3RocmVhZF9zY3JvbGxiYXJfZ2VzdHVyZXMvZmFzdC9zY3JvbGxpbmcvc2Nyb2xsYmFycy9zY3JvbGxiYXItYnV0dG9uLWdlc3R1cmUtdGFyZ2V0Lmh0bWwgWyBGYWlsdXJlIF0KLWNyYnVnLmNvbS85NTM4NDcgWyBNYWMgXSB2aXJ0dWFsL21haW5fdGhyZWFkX3Njcm9sbGJhcl9nZXN0dXJlcy9mYXN0L3Njcm9sbGluZy9zY3JvbGxiYXJzL21vdXNlLWF1dG9zY3JvbGxpbmctb24tc2Nyb2xsYmFyLmh0bWwgWyBGYWlsdXJlIFRpbWVvdXQgXQogCiAjIENvbXBvc2l0b3IgdGhyZWFkZWQgc2Nyb2xsYmFyIHNjcm9sbHMgcGFyZW50IG9mIHN1YnNjcm9sbGVyLgogIyBOb3RlOiBldmVuIHdoZW4gZml4ZWQgd2lsbCBzdGlsbCBmYWlsIG9uIE1hYyB1bnRpbCBjcmJ1Zy5jb20vOTUzODQ3CkBAIC01ODEyLDggKzU4MDksNiBAQAogCiAjIFNoZXJpZmYgMjAxOS0wNy0zMAogY3JidWcuY29tLzk4NzExNSBbIFdpbiBMaW51eCBdIHZpcnR1YWwvdGhyZWFkZWQvZmFzdC9zY3JvbGxpbmcvc2Nyb2xsYmFycy9zY3JvbGxiYXItYnV0dG9uLWdlc3R1cmUtdGFyZ2V0Lmh0bWwgWyBDcmFzaCBQYXNzIEZhaWx1cmUgXQotY3JidWcuY29tLzYyNjcwMyBbIE1hYyBdIGV4dGVybmFsL3dwdC9jc3MvY3Nzb20tdmlldy9zY3JvbGxJbnRvVmlldy1zaWRld2F5cy1sci13cml0aW5nLW1vZGUtYW5kLXJ0bC1kaXJlY3Rpb24uaHRtbCBbIEZhaWx1cmUgXQotY3JidWcuY29tLzYyNjcwMyBbIE1hYyBdIGV4dGVybmFsL3dwdC9jc3MvY3Nzb20tdmlldy9zY3JvbGxJbnRvVmlldy1zaWRld2F5cy1ybC13cml0aW5nLW1vZGUtYW5kLXJ0bC1kaXJlY3Rpb24uaHRtbCBbIEZhaWx1cmUgXQogCiAjIFNoZXJpZmYgMjAxOS0wNy0zMQogY3JidWcuY29tLzk3OTQyMiBbIE1hYyBdIGZhc3QvYm9yZGVycy9ib3JkZXItcmFkaXVzLW1hc2stY2FudmFzLXdpdGgtc2hhZG93Lmh0bWwgWyBGYWlsdXJlIF0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9WaXJ0dWFsVGVzdFN1aXRlcyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9WaXJ0dWFsVGVzdFN1aXRlcwppbmRleCBlZjg5YzE4Li44MmFlMjMzIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvVmlydHVhbFRlc3RTdWl0ZXMKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL1ZpcnR1YWxUZXN0U3VpdGVzCkBAIC01NDYsMTEgKzU0Niw2IEBACiAgICAgICAgICAgICAgIi0tZW5hYmxlLXByZWZlci1jb21wb3NpdGluZy10by1sY2QtdGV4dCJdCiAgIH0sCiAgIHsKLSAgICAicHJlZml4IjogIm1haW5fdGhyZWFkX3Njcm9sbGJhcl9nZXN0dXJlcyIsCi0gICAgImJhc2UiOiAiZmFzdC9zY3JvbGxpbmcvc2Nyb2xsYmFycyIsCi0gICAgImFyZ3MiOiBbIi0tZW5hYmxlLWZlYXR1cmVzPVNjcm9sbGJhckluamVjdFNjcm9sbEdlc3R1cmVzIl0KLSAgfSwKLSAgewogICAgICJwcmVmaXgiOiAic3BlZWNoLXdpdGgtdW5pZmllZC1hdXRvcGxheSIsCiAgICAgImJhc2UiOiAiZXh0ZXJuYWwvd3B0L3NwZWVjaC1hcGkiLAogICAgICJhcmdzIjogWyItLWF1dG9wbGF5LXBvbGljeT1kb2N1bWVudC11c2VyLWFjdGl2YXRpb24tcmVxdWlyZWQiXQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2NvbXBvc2l0aW5nL292ZXJmbG93L3J0bC1vdmVyZmxvdy5odG1sIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2NvbXBvc2l0aW5nL292ZXJmbG93L3J0bC1vdmVyZmxvdy5odG1sCmluZGV4IDZmZWU5ODQuLjliOTYwNGEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9jb21wb3NpdGluZy9vdmVyZmxvdy9ydGwtb3ZlcmZsb3cuaHRtbAorKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvY29tcG9zaXRpbmcvb3ZlcmZsb3cvcnRsLW92ZXJmbG93Lmh0bWwKQEAgLTUxLDcgKzUxLDcgQEAKICAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxzY3JpcHQ+Ci0gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY29uZCcpLnNjcm9sbExlZnQgPSAwOworICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWNvbmQnKS5zY3JvbGxMZWZ0ID0gLTYwMDsKICAgPC9zY3JpcHQ+CiA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvY29tcG9zaXRpbmcvcnRsL3J0bC1vdmVyZmxvdy1zY3JvbGxpbmcuaHRtbCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9jb21wb3NpdGluZy9ydGwvcnRsLW92ZXJmbG93LXNjcm9sbGluZy5odG1sCmluZGV4IGNlMTBmM2YuLjUzZTYyYzMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9jb21wb3NpdGluZy9ydGwvcnRsLW92ZXJmbG93LXNjcm9sbGluZy5odG1sCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9jb21wb3NpdGluZy9ydGwvcnRsLW92ZXJmbG93LXNjcm9sbGluZy5odG1sCkBAIC01LDcgKzUsNyBAQAogICAgICAgICBpbnRlcm5hbHMuc2V0dGluZ3Muc2V0UHJlZmVyQ29tcG9zaXRpbmdUb0xDRFRleHRFbmFibGVkKHRydWUpOwogCiAgICAgZnVuY3Rpb24gcnVuVGVzdCgpIHsKLSAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvbnRhaW5lciIpLnNjcm9sbExlZnQgPSAwOworICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29udGFpbmVyIikuc2Nyb2xsTGVmdCA9IC03MTU7CiAgICAgfQogPC9zY3JpcHQ+CiA8c3R5bGU+CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvV1BUX0JBU0VfTUFOSUZFU1RfNi5qc29uIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL1dQVF9CQVNFX01BTklGRVNUXzYuanNvbgppbmRleCBlOWQzM2ZkZS4uY2JkMDMxMiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL1dQVF9CQVNFX01BTklGRVNUXzYuanNvbgorKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvV1BUX0JBU0VfTUFOSUZFU1RfNi5qc29uCkBAIC05OTQ3MSw2ICs5OTQ3MSwxOCBAQAogICAgICB7fQogICAgIF0KICAgIF0sCisgICAiY3NzL2ZpbHRlci1lZmZlY3RzL21vcnBob2xvZ3ktbWlycm9yZWQuaHRtbCI6IFsKKyAgICBbCisgICAgICJjc3MvZmlsdGVyLWVmZmVjdHMvbW9ycGhvbG9neS1taXJyb3JlZC5odG1sIiwKKyAgICAgWworICAgICAgWworICAgICAgICIvY3NzL2ZpbHRlci1lZmZlY3RzL3JlZmVyZW5jZS9ncmVlbi0xMDB4MTAwLmh0bWwiLAorICAgICAgICI9PSIKKyAgICAgIF0KKyAgICAgXSwKKyAgICAge30KKyAgICBdCisgICBdLAogICAgImNzcy9maWx0ZXItZWZmZWN0cy9zdmctZmVmbG9vZC0wMDEuaHRtbCI6IFsKICAgICBbCiAgICAgICJjc3MvZmlsdGVyLWVmZmVjdHMvc3ZnLWZlZmxvb2QtMDAxLmh0bWwiLApAQCAtMTQwNTE1LDYgKzE0MDUyNyw5IEBACiAgICAiY3NzL2Nzcy1yaHl0aG0vT1dORVJTIjogWwogICAgIFtdCiAgICBdLAorICAgImNzcy9jc3Mtcmh5dGhtL2xpbmUtaGVpZ2h0LXN0ZXAtZHluYW1pYy0wMDEtZXhwZWN0ZWQudHh0IjogWworICAgIFtdCisgICBdLAogICAgImNzcy9jc3Mtcmh5dGhtL3JlZmVyZW5jZS9saW5lLWhlaWdodC1zdGVwLWJhc2ljLTAwMS5odG1sIjogWwogICAgIFtdCiAgICBdLApAQCAtMTQwODM5LDYgKzE0MDg1NCw5IEBACiAgICAiY3NzL2Nzcy1zaGFwZXMvc2hhcGUtb3V0c2lkZS92YWx1ZXMvc2hhcGUtbWFyZ2luLTAwNS1leHBlY3RlZC50eHQiOiBbCiAgICAgW10KICAgIF0sCisgICAiY3NzL2Nzcy1zaGFwZXMvc2hhcGUtb3V0c2lkZS92YWx1ZXMvc2hhcGUtb3V0c2lkZS1jb21wdXRlZC1zaGFwZS0wMDAtZXhwZWN0ZWQudHh0IjogWworICAgIFtdCisgICBdLAogICAgImNzcy9jc3Mtc2hhcGVzL3NoYXBlLW91dHNpZGUvdmFsdWVzL3NoYXBlLW91dHNpZGUtaW5zZXQtMDAxLWV4cGVjdGVkLnR4dCI6IFsKICAgICBbXQogICAgXSwKQEAgLTE2MjA5MSw5ICsxNjIxMDksNiBAQAogICAgImluZnJhc3RydWN0dXJlL21ldGFkYXRhL2luZnJhc3RydWN0dXJlL3NlcnZlci93cHQtc2VydmVyLXdlYnNvY2tldC5zdWIuaHRtbC5pbmkiOiBbCiAgICAgW10KICAgIF0sCi0gICAiaW5mcmFzdHJ1Y3R1cmUvbWV0YWRhdGEvaW5mcmFzdHJ1Y3R1cmUvdGVzdGRyaXZlci9hY3Rpb25zL19fZGlyX18uaW5pIjogWwotICAgIFtdCi0gICBdLAogICAgImluZnJhc3RydWN0dXJlL21ldGFkYXRhL2luZnJhc3RydWN0dXJlL3Rlc3Rkcml2ZXIvYWN0aW9ucy9hY3Rpb25zV2l0aEtleVByZXNzZWQuaHRtbC5pbmkiOiBbCiAgICAgW10KICAgIF0sCkBAIC0zMTcwNDMsMjQgKzMxNzA1OCw2IEBACiAgICAgIHt9CiAgICAgXQogICAgXSwKLSAgICJ3ZWJ4ci94ckRldmljZV9zdXBwb3J0c1Nlc3Npb25faW1tZXJzaXZlLmh0dHBzLmh0bWwiOiBbCi0gICAgWwotICAgICAid2VieHIveHJEZXZpY2Vfc3VwcG9ydHNTZXNzaW9uX2ltbWVyc2l2ZS5odHRwcy5odG1sIiwKLSAgICAge30KLSAgICBdCi0gICBdLAotICAgIndlYnhyL3hyRGV2aWNlX3N1cHBvcnRzU2Vzc2lvbl9pbW1lcnNpdmVfdW5zdXBwb3J0ZWQuaHR0cHMuaHRtbCI6IFsKLSAgICBbCi0gICAgICJ3ZWJ4ci94ckRldmljZV9zdXBwb3J0c1Nlc3Npb25faW1tZXJzaXZlX3Vuc3VwcG9ydGVkLmh0dHBzLmh0bWwiLAotICAgICB7fQotICAgIF0KLSAgIF0sCi0gICAid2VieHIveHJEZXZpY2Vfc3VwcG9ydHNTZXNzaW9uX25vbl9pbW1lcnNpdmUuaHR0cHMuaHRtbCI6IFsKLSAgICBbCi0gICAgICJ3ZWJ4ci94ckRldmljZV9zdXBwb3J0c1Nlc3Npb25fbm9uX2ltbWVyc2l2ZS5odHRwcy5odG1sIiwKLSAgICAge30KLSAgICBdCi0gICBdLAogICAgIndlYnhyL3hyRnJhbWVfZ2V0UG9zZS5odHRwcy5odG1sIjogWwogICAgIFsKICAgICAgIndlYnhyL3hyRnJhbWVfZ2V0UG9zZS5odHRwcy5odG1sIiwKQEAgLTMzNzE5Miw3ICszMzcxODksNyBAQAogICAgInN1cHBvcnQiCiAgIF0sCiAgICJiZWFjb24vTUVUQS55bWwiOiBbCi0gICAiOTRmYTc1YzUxNzhhMzlkNTE5ODA3ZGRjMjQ5MDkwMGQ0MWFjYWU0MSIsCisgICAiNGJkOTRlMzIwNjRjNzg1NTM2NjY0MjRlMWQwZWUzMGJjYTQ5ODdmYiIsCiAgICAic3VwcG9ydCIKICAgXSwKICAgImJlYWNvbi9PV05FUlMiOiBbCkBAIC0zODAyNTYsNyArMzgwMjUzLDcgQEAKICAgICJ0ZXN0aGFybmVzcyIKICAgXSwKICAgImNzcy9jc3MtZ3JpZC9hbGlnbm1lbnQvZ3JpZC1zZWxmLWFsaWdubWVudC1ub24tc3RhdGljLXBvc2l0aW9uZWQtaXRlbXMtMDA5LWV4cGVjdGVkLnR4dCI6IFsKLSAgICIxYjMyY2Y0MzYxOGRlNjk2NjMzOTY1NzY2OGQ5NDFiNTIwMTQzZmE1IiwKKyAgICIzYTEwMGE0ODU3NWVhNzg3M2M2ZTZiMDM0NGMzNzY1YmUxNDM3ZDNiIiwKICAgICJzdXBwb3J0IgogICBdLAogICAiY3NzL2Nzcy1ncmlkL2FsaWdubWVudC9ncmlkLXNlbGYtYWxpZ25tZW50LW5vbi1zdGF0aWMtcG9zaXRpb25lZC1pdGVtcy0wMDkuaHRtbCI6IFsKQEAgLTM4MDI2NCw3ICszODAyNjEsNyBAQAogICAgInRlc3RoYXJuZXNzIgogICBdLAogICAiY3NzL2Nzcy1ncmlkL2FsaWdubWVudC9ncmlkLXNlbGYtYWxpZ25tZW50LW5vbi1zdGF0aWMtcG9zaXRpb25lZC1pdGVtcy0wMTAtZXhwZWN0ZWQudHh0IjogWwotICAgIjFiMzJjZjQzNjE4ZGU2OTY2MzM5NjU3NjY4ZDk0MWI1MjAxNDNmYTUiLAorICAgIjNhMTAwYTQ4NTc1ZWE3ODczYzZlNmIwMzQ0YzM3NjViZTE0MzdkM2IiLAogICAgInN1cHBvcnQiCiAgIF0sCiAgICJjc3MvY3NzLWdyaWQvYWxpZ25tZW50L2dyaWQtc2VsZi1hbGlnbm1lbnQtbm9uLXN0YXRpYy1wb3NpdGlvbmVkLWl0ZW1zLTAxMC5odG1sIjogWwpAQCAtMzg5NjkxLDYgKzM4OTY4OCwxMCBAQAogICAgImI0YzI5OTA1ZWEyZjQ5MWVmZDhkMDM2NWFjMWM1YTg3MGU4YzRlZGYiLAogICAgInJlZnRlc3QiCiAgIF0sCisgICJjc3MvY3NzLXJoeXRobS9saW5lLWhlaWdodC1zdGVwLWR5bmFtaWMtMDAxLWV4cGVjdGVkLnR4dCI6IFsKKyAgICJiYWM5ZDgxMTA2MmI4ZjA4ZjFjZjZmZGIzZThkYzdiMTRmODY3Mjc0IiwKKyAgICJzdXBwb3J0IgorICBdLAogICAiY3NzL2Nzcy1yaHl0aG0vbGluZS1oZWlnaHQtc3RlcC1keW5hbWljLTAwMS5odG1sIjogWwogICAgImQ2ZjdiZDllNzhhZWRjY2M4NmM0YTcyNjNiOTliYjI2MmJhZTkxNTgiLAogICAgInRlc3RoYXJuZXNzIgpAQCAtMzkxNTI4LDcgKzM5MTUyOSw3IEBACiAgICAidGVzdGhhcm5lc3MiCiAgIF0sCiAgICJjc3MvY3NzLXNoYXBlcy9zaGFwZS1vdXRzaWRlL3ZhbHVlcy9zaGFwZS1tYXJnaW4tMDAxLmh0bWwiOiBbCi0gICAiMzlkZWE3ZWZlODFlZWViNzI4ZDhlMTRhZDc1NTdkY2Y0MGViODJkZiIsCisgICAiMjhlY2ExYTZiYWZjMzk0MDhkMWM2MjNhMGIyNjI1Y2Q0ZGExNDc4YiIsCiAgICAidGVzdGhhcm5lc3MiCiAgIF0sCiAgICJjc3MvY3NzLXNoYXBlcy9zaGFwZS1vdXRzaWRlL3ZhbHVlcy9zaGFwZS1tYXJnaW4tMDAyLWV4cGVjdGVkLnR4dCI6IFsKQEAgLTM5MTU3NiwxMSArMzkxNTc3LDExIEBACiAgICAidGVzdGhhcm5lc3MiCiAgIF0sCiAgICJjc3MvY3NzLXNoYXBlcy9zaGFwZS1vdXRzaWRlL3ZhbHVlcy9zaGFwZS1vdXRzaWRlLWNpcmNsZS0wMDQuaHRtbCI6IFsKLSAgICIwMWYzZmMxYmZmZTI0MzU5YmNhNzUxMjFlYmRlOTdjN2ZkNWQ5Mzc2IiwKKyAgICIyODk4NjFlZTE1MDJmMDBhNWFmYThmYjZhYWZkNDdjNWRjOWFmZDZhIiwKICAgICJ0ZXN0aGFybmVzcyIKICAgXSwKICAgImNzcy9jc3Mtc2hhcGVzL3NoYXBlLW91dHNpZGUvdmFsdWVzL3NoYXBlLW91dHNpZGUtY2lyY2xlLTAwNS5odG1sIjogWwotICAgIjdkOTAzMThlYzczNjVhMTE5YWQ2MzliOTM2YjQxMjc4NDNhZTYyMDMiLAorICAgIjQ2Y2FlMDQ1YzVkMGM4ZjA5MmQxNWExOTRiOTFlNDM4NDE0NmEzMmUiLAogICAgInRlc3RoYXJuZXNzIgogICBdLAogICAiY3NzL2Nzcy1zaGFwZXMvc2hhcGUtb3V0c2lkZS92YWx1ZXMvc2hhcGUtb3V0c2lkZS1jaXJjbGUtMDA2Lmh0bWwiOiBbCkBAIC0zOTE2MDcsNiArMzkxNjA4LDEwIEBACiAgICAiN2YwNTcxY2RkNmYzYWQ2NzM5MTQzNWYyOTRlZGU3ZWZhYWU3ZjQ3ZSIsCiAgICAidGVzdGhhcm5lc3MiCiAgIF0sCisgICJjc3MvY3NzLXNoYXBlcy9zaGFwZS1vdXRzaWRlL3ZhbHVlcy9zaGFwZS1vdXRzaWRlLWNvbXB1dGVkLXNoYXBlLTAwMC1leHBlY3RlZC50eHQiOiBbCisgICAiNWUyYTE2MzBlMmU3MzYyNWY3MjMwYTVkMzE5ZjdiMTBjZTc5YWQ4NSIsCisgICAic3VwcG9ydCIKKyAgXSwKICAgImNzcy9jc3Mtc2hhcGVzL3NoYXBlLW91dHNpZGUvdmFsdWVzL3NoYXBlLW91dHNpZGUtY29tcHV0ZWQtc2hhcGUtMDAwLmh0bWwiOiBbCiAgICAiZjc5YjIxYTcyM2U2ZTI1M2RmMDE3NmU1M2E0NTY3ZDhlYzk1NjdhYiIsCiAgICAidGVzdGhhcm5lc3MiCkBAIC0zOTE2MzIsMTEgKzM5MTYzNywxMSBAQAogICAgInRlc3RoYXJuZXNzIgogICBdLAogICAiY3NzL2Nzcy1zaGFwZXMvc2hhcGUtb3V0c2lkZS92YWx1ZXMvc2hhcGUtb3V0c2lkZS1lbGxpcHNlLTAwNC5odG1sIjogWwotICAgIjc2MTdhMzRiY2UwYzdmOTA2NjgxNDFhNDgwYjQ4N2M1MzRhOTZlZWQiLAorICAgIjFkNGFhODVhMDdjMzA0YzMyMGFlNDRhMzM2NGQ0ZTcyNDhhM2VhMjYiLAogICAgInRlc3RoYXJuZXNzIgogICBdLAogICAiY3NzL2Nzcy1zaGFwZXMvc2hhcGUtb3V0c2lkZS92YWx1ZXMvc2hhcGUtb3V0c2lkZS1lbGxpcHNlLTAwNS5odG1sIjogWwotICAgImZlNWFmM2I2ODJjOGNkNjBlM2UxMDI3OGFmM2FhNTNlZDEwOGQ2YmEiLAorICAgIjVhY2I5OTQxOTEyNThjNGI4ZWMwMmQ3MDMwOWRhNzZjYmJjN2ZjNTIiLAogICAgInRlc3RoYXJuZXNzIgogICBdLAogICAiY3NzL2Nzcy1zaGFwZXMvc2hhcGUtb3V0c2lkZS92YWx1ZXMvc2hhcGUtb3V0c2lkZS1lbGxpcHNlLTAwNi5odG1sIjogWwpAQCAtMzkxNjg0LDcgKzM5MTY4OSw3IEBACiAgICAidGVzdGhhcm5lc3MiCiAgIF0sCiAgICJjc3MvY3NzLXNoYXBlcy9zaGFwZS1vdXRzaWRlL3ZhbHVlcy9zaGFwZS1vdXRzaWRlLWluc2V0LTAwMy5odG1sIjogWwotICAgIjliNDIwNzA3ZmUyZTI5MmRkZWM4ODEwZjRjMTg1YWFhNTc0YjNiNWIiLAorICAgIjNmZmMyYWY5ODE2NzJhN2FjMDE4ZWVmYjIwZWI1Yjc1MDY0NGM2MDkiLAogICAgInRlc3RoYXJuZXNzIgogICBdLAogICAiY3NzL2Nzcy1zaGFwZXMvc2hhcGUtb3V0c2lkZS92YWx1ZXMvc2hhcGUtb3V0c2lkZS1pbnNldC0wMDQuaHRtbCI6IFsKQEAgLTM5MTcyOCw3ICszOTE3MzMsNyBAQAogICAgInRlc3RoYXJuZXNzIgogICBdLAogICAiY3NzL2Nzcy1zaGFwZXMvc2hhcGUtb3V0c2lkZS92YWx1ZXMvc2hhcGUtb3V0c2lkZS1wb2x5Z29uLTAwNC5odG1sIjogWwotICAgImM5NjIzYTJlNWJkNGYyMThjMWI0M2E0Njc5Y2I4MTdhNjQ3Yzc3YzQiLAorICAgImU5ZWNmMmRmNTk5YjAyNTgzMjlkNWFmNmEzYzA5ZWU4MzY4ZjEyMjIiLAogICAgInRlc3RoYXJuZXNzIgogICBdLAogICAiY3NzL2Nzcy1zaGFwZXMvc2hhcGUtb3V0c2lkZS92YWx1ZXMvc2hhcGUtb3V0c2lkZS1wb2x5Z29uLTAwNS5odG1sIjogWwpAQCAtMzkxNzQwLDcgKzM5MTc0NSw3IEBACiAgICAidGVzdGhhcm5lc3MiCiAgIF0sCiAgICJjc3MvY3NzLXNoYXBlcy9zaGFwZS1vdXRzaWRlL3ZhbHVlcy9zaGFwZS1vdXRzaWRlLXNoYXBlLWFyZ3VtZW50cy0wMDAuaHRtbCI6IFsKLSAgICIwMmQ1YmM3OGQ5YTUwOWJlYzNkNzdhOTBiNDczNmFkNzM3NmRkZjEyIiwKKyAgICIwOGQ1ZDQ3MWRlNmI5M2I0NDQ2NjczZjk5MzFhOTc2YmNiY2YxY2U4IiwKICAgICJ0ZXN0aGFybmVzcyIKICAgXSwKICAgImNzcy9jc3Mtc2hhcGVzL3NoYXBlLW91dHNpZGUvdmFsdWVzL3NoYXBlLW91dHNpZGUtc2hhcGUtYXJndW1lbnRzLTAwMS5odG1sIjogWwpAQCAtMzkxNzY4LDcgKzM5MTc3Myw3IEBACiAgICAidGVzdGhhcm5lc3MiCiAgIF0sCiAgICJjc3MvY3NzLXNoYXBlcy9zaGFwZS1vdXRzaWRlL3ZhbHVlcy9zdXBwb3J0L3BhcnNpbmctdXRpbHMuanMiOiBbCi0gICAiMTE4YTExNDUzMzM3NzMxZjM4MDA2M2I3MzYzODBjMmM4NjEwYWU4MSIsCisgICAiYWJhZGJmNzA2NjY5NWFkMWY3NTQ1NDBjOWJhYzc1YjI4MDljOGM0YyIsCiAgICAic3VwcG9ydCIKICAgXSwKICAgImNzcy9jc3Mtc2hhcGVzL3NwZWMtZXhhbXBsZXMvcmVmZXJlbmNlL3NoYXBlLW91dHNpZGUtMDAxLXJlZi5odG1sIjogWwpAQCAtNDIxMTIzLDYgKzQyMTEyOCwxMCBAQAogICAgIjRmYzAyZjE2NzE5ZDA3MzNlNGNiYTg3ZDhkMjI5ZmU2ZWQxNWU2YWEiLAogICAgInN1cHBvcnQiCiAgIF0sCisgICJjc3MvZmlsdGVyLWVmZmVjdHMvbW9ycGhvbG9neS1taXJyb3JlZC5odG1sIjogWworICAgImYwMzM4ZTE4MDM0NGYzNDFkYjYwYWIwNzEwYmRjZGI3MWU4ODUzYjciLAorICAgInJlZnRlc3QiCisgIF0sCiAgICJjc3MvZmlsdGVyLWVmZmVjdHMvcGFyc2luZy9iYWNrZHJvcC1maWx0ZXItY29tcHV0ZWQuaHRtbCI6IFsKICAgICI1ZThjZTZiYWU2ODBjODRlZjQ5ZTg4MjMwOWE1NzMxMTNmZmM3YjFlIiwKICAgICJ0ZXN0aGFybmVzcyIKQEAgLTQzOTgzNiw3ICs0Mzk4NDUsNyBAQAogICAgInRlc3RoYXJuZXNzIgogICBdLAogICAiaHItdGltZS9NRVRBLnltbCI6IFsKLSAgICIyYmUzNTQ5MjBhYTE0MGE3MmJjNjJlYTIyNzNmNWQ5NzVlYWI4ZDQ2IiwKKyAgICI3NzlkNWI0YWYwODQyOGM0NTAyM2ZjOWQ1MTlhYjA4MzBkODY2YTg3IiwKICAgICJzdXBwb3J0IgogICBdLAogICAiaHItdGltZS9PV05FUlMiOiBbCkBAIC00NjA5ODcsMTAgKzQ2MDk5Niw2IEBACiAgICAiMmNjMzY0YjYxMDk4N2FkNTkzOGM4MjIyODdlYjc2MDc5YzJhZjJhMyIsCiAgICAic3VwcG9ydCIKICAgXSwKLSAgImluZnJhc3RydWN0dXJlL21ldGFkYXRhL2luZnJhc3RydWN0dXJlL3Rlc3Rkcml2ZXIvYWN0aW9ucy9fX2Rpcl9fLmluaSI6IFsKLSAgICIyYmFjMGI1MGRiNzI3ZGRjNzBiOTBhYzNmYjQ0Mzk1NDMxOTcyM2VmIiwKLSAgICJzdXBwb3J0IgotICBdLAogICAiaW5mcmFzdHJ1Y3R1cmUvbWV0YWRhdGEvaW5mcmFzdHJ1Y3R1cmUvdGVzdGRyaXZlci9hY3Rpb25zL2FjdGlvbnNXaXRoS2V5UHJlc3NlZC5odG1sLmluaSI6IFsKICAgICJiOTQ2NWMwNjZjNzY1N2ExZWEwMGUzMTZkZGRmMWI3YWFhODU0ZWYzIiwKICAgICJzdXBwb3J0IgpAQCAtNDY4MDY4LDcgKzQ2ODA3Myw3IEBACiAgICAic3VwcG9ydCIKICAgXSwKICAgIm5hdmlnYXRpb24tdGltaW5nL01FVEEueW1sIjogWwotICAgImMwOWE2ZTAzZmQxOWY1YTQwNWIzOTFjMmM0NjcxZGY2ZmYwNGVkZjEiLAorICAgImJmYjBlMGYxZjY3YTljNmFhMmU3ZTkyMWIwOWU4NWY4ZDk3MGIyOTAiLAogICAgInN1cHBvcnQiCiAgIF0sCiAgICJuYXZpZ2F0aW9uLXRpbWluZy9PV05FUlMiOiBbCkBAIC00NzUyMzYsNyArNDc1MjQxLDcgQEAKICAgICJzdXBwb3J0IgogICBdLAogICAicGFnZS12aXNpYmlsaXR5L01FVEEueW1sIjogWwotICAgIjUwOTkzNmMzNzFiN2RlM2U3ZTBlNWY3ZTQxZDEwY2ZmYmE5ZjVkMmEiLAorICAgIjliOWFlYThlOGIxMWJmOThkZDIzYzhlMTYxZTNhN2Q3MDFkYTJhYmEiLAogICAgInN1cHBvcnQiCiAgIF0sCiAgICJwYWdlLXZpc2liaWxpdHkvT1dORVJTIjogWwpAQCAtNDc2MDI0LDcgKzQ3NjAyOSw3IEBACiAgICAibWFudWFsIgogICBdLAogICAicGVyZm9ybWFuY2UtdGltZWxpbmUvTUVUQS55bWwiOiBbCi0gICAiNDZmMTZhZTVmMzFhYTM4OGNmZDFmN2ZmNzU5YTVkZjQ0ZDE3ZmQwYSIsCisgICAiODlmYWUxZGIwZDliN2FmZDIwMjczN2UzNDc1NGI0ZTg5MzI5OGQ0OSIsCiAgICAic3VwcG9ydCIKICAgXSwKICAgInBlcmZvcm1hbmNlLXRpbWVsaW5lL09XTkVSUyI6IFsKQEAgLTQ5MDA1Miw3ICs0OTAwNTcsNyBAQAogICAgInRlc3RoYXJuZXNzIgogICBdLAogICAicmVzb3VyY2UtdGltaW5nL01FVEEueW1sIjogWwotICAgIjc2MTc2OTcwZDRkOTNlNmE2NmJmMmJjNjJhZWM1ZGQ2MmNjZDEyYzEiLAorICAgIjY2MmM0MmNiNjY0MjE5ZGVlMTU5ZmQyNDhlMTQ0NmMwNDFhNGJjOTMiLAogICAgInN1cHBvcnQiCiAgIF0sCiAgICJyZXNvdXJjZS10aW1pbmcvT1dORVJTIjogWwpAQCAtNDk5NzQwLDcgKzQ5OTc0NSw3IEBACiAgICAic3VwcG9ydCIKICAgXSwKICAgInRpbWluZy1lbnRyeXR5cGVzLXJlZ2lzdHJ5L01FVEEueW1sIjogWwotICAgImMwOWE2ZTAzZmQxOWY1YTQwNWIzOTFjMmM0NjcxZGY2ZmYwNGVkZjEiLAorICAgImJmYjBlMGYxZjY3YTljNmFhMmU3ZTkyMWIwOWU4NWY4ZDk3MGIyOTAiLAogICAgInN1cHBvcnQiCiAgIF0sCiAgICJ0aW1pbmctZW50cnl0eXBlcy1yZWdpc3RyeS9yZWdpc3RyeS5hbnkuanMiOiBbCkBAIC00OTk4OTIsNyArNDk5ODk3LDcgQEAKICAgICJzdXBwb3J0IgogICBdLAogICAidG9vbHMvY2kvbWFuaWZlc3RfYnVpbGQucHkiOiBbCi0gICAiYWRlMTdkNmJlNDBkODA3NTFkZTEyYjBkNDYyYThmNTMxYmJlOTA1OSIsCisgICAiNjQwMGJmZDVlNDgzN2Y0NDU5OTMxMDEyN2JhZjZkMDkwNWRmMzQxNiIsCiAgICAic3VwcG9ydCIKICAgXSwKICAgInRvb2xzL2NpL3J1bl90Yy5weSI6IFsKQEAgLTUwODg5Miw3ICs1MDg4OTcsNyBAQAogICAgInRlc3RoYXJuZXNzIgogICBdLAogICAidXNlci10aW1pbmcvTUVUQS55bWwiOiBbCi0gICAiYTk3YTMxZDc2NmJkOTZmMDAzMGEwNDc2MzJjMzM0MmM3MGFiZjNkOCIsCisgICAiNWNiMmE3ODljMDljODliN2MxMDI5NTUxZTY0NmIzZjI0MGU4MGMyYSIsCiAgICAic3VwcG9ydCIKICAgXSwKICAgInVzZXItdGltaW5nL09XTkVSUyI6IFsKQEAgLTUxMDQ1Miw3ICs1MTA0NTcsNyBAQAogICAgInN1cHBvcnQiCiAgIF0sCiAgICJ3ZWItc2hhcmUvc2hhcmUtc2hhcmVQcm9taXNlLWludGVybmFsLXNsb3QuaHR0cHMuaHRtbCI6IFsKLSAgICI1YTcxZWFhNGFiZjM1OTAwOGQ4NGQxZjIxOTA4M2VjMWE5MWE2NDU4IiwKKyAgICIxNDc4MTU4YTBjNGVmZTM2NWFlNGE0NzFmOTA1ZDgyYTdiMWZmZjhkIiwKICAgICJ0ZXN0aGFybmVzcyIKICAgXSwKICAgIndlYi1zaGFyZS9zaGFyZS1zaW1wbGUtbWFudWFsLmh0dHBzLmh0bWwiOiBbCkBAIC01MTg5MDMsMTggKzUxODkwOCw2IEBACiAgICAiOWZhOGMzMWQ2M2FhYjZmNzQ4ODZiNTU1OTZmZjYzOTExMDE4ZjUxZSIsCiAgICAidGVzdGhhcm5lc3MiCiAgIF0sCi0gICJ3ZWJ4ci94ckRldmljZV9zdXBwb3J0c1Nlc3Npb25faW1tZXJzaXZlLmh0dHBzLmh0bWwiOiBbCi0gICAiZmQwODI3YTUyNmVmMDEyOTllZWNjZDk0ZjkzZjEzMWU0MDE0Y2Q3YiIsCi0gICAidGVzdGhhcm5lc3MiCi0gIF0sCi0gICJ3ZWJ4ci94ckRldmljZV9zdXBwb3J0c1Nlc3Npb25faW1tZXJzaXZlX3Vuc3VwcG9ydGVkLmh0dHBzLmh0bWwiOiBbCi0gICAiMWQ2M2EyYjFjM2EyNTRkOTk5NDczYmM1MDc0NTMwOTVjNDI0M2EwOCIsCi0gICAidGVzdGhhcm5lc3MiCi0gIF0sCi0gICJ3ZWJ4ci94ckRldmljZV9zdXBwb3J0c1Nlc3Npb25fbm9uX2ltbWVyc2l2ZS5odHRwcy5odG1sIjogWwotICAgImIzNzY0OTVkNzY1MTA2ZmNiMTQzNWMzZTYwYzBmYTZlMTY3ZDljNzEiLAotICAgInRlc3RoYXJuZXNzIgotICBdLAogICAid2VieHIveHJGcmFtZV9nZXRQb3NlLmh0dHBzLmh0bWwiOiBbCiAgICAiNzFjYTc4YWJiNDhjZjEyY2I0MWU4MjQ5Mjg5YTA2ZWRkYzdlYWU5NCIsCiAgICAidGVzdGhhcm5lc3MiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L2FuaW1hdGlvbi13b3JrbGV0L3Njcm9sbC10aW1lbGluZS13cml0aW5nLW1vZGVzLmh0dHBzLmh0bWwgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L2FuaW1hdGlvbi13b3JrbGV0L3Njcm9sbC10aW1lbGluZS13cml0aW5nLW1vZGVzLmh0dHBzLmh0bWwKaW5kZXggMTg5YmI5ZjAuLmViOGU2ZmQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvYW5pbWF0aW9uLXdvcmtsZXQvc2Nyb2xsLXRpbWVsaW5lLXdyaXRpbmctbW9kZXMuaHR0cHMuaHRtbAorKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L2FuaW1hdGlvbi13b3JrbGV0L3Njcm9sbC10aW1lbGluZS13cml0aW5nLW1vZGVzLmh0dHBzLmh0bWwKQEAgLTEwOCwxMSArMTA4LDExIEBACiAgIGNvbnN0IGVsZW1lbnRzID0gY3JlYXRlVGVzdERPTSh0cnVlLCAndmVydGljYWwtcmwnLCAnbHRyJyk7CiAgIGNvbnN0IGFuaW1hdGlvbiA9IGNyZWF0ZUFuZFBsYXlUZXN0QW5pbWF0aW9uKGVsZW1lbnRzLCAnYmxvY2snKTsKIAotICAvLyBNb3ZlIHRoZSBzY3JvbGxlciB0byB0aGUgNzUlIHBvaW50LiBTaW5jZSBpdCBpcyB2ZXJ0aWNhbC1ybCwgdGhpcyBpcwotICAvLyBlcXVpdmFsZW50IHRvIHRoZSAyNSUgcG9pbnQgZm9yIHRoZSBTY3JvbGxUaW1lbGluZS4KKyAgLy8gTW92ZSB0aGUgc2Nyb2xsZXIgdG8gdGhlIGxlZnQgMjUlIHBvaW50LCBzaW5jZSBpdCBpcyB2ZXJ0aWNhbC1ybCwKKyAgLy8gaS5lIGxlZnR3YXJkcyBvdmVyZmxvdyBkaXJlY3Rpb24sIHNjcm9sbExlZnQgaXMgLTI1JSBwb2ludC4KICAgY29uc3QgbWF4U2Nyb2xsID0KICAgICAgIGVsZW1lbnRzLnNjcm9sbGVyLnNjcm9sbFdpZHRoIC0gZWxlbWVudHMuc2Nyb2xsZXIuY2xpZW50V2lkdGg7Ci0gIGVsZW1lbnRzLnNjcm9sbGVyLnNjcm9sbExlZnQgPSAwLjc1ICogbWF4U2Nyb2xsOworICBlbGVtZW50cy5zY3JvbGxlci5zY3JvbGxMZWZ0ID0gLTAuMjUgKiBtYXhTY3JvbGw7CiAKICAgd2FpdEZvck5vdE51bGxMb2NhbFRpbWUoYW5pbWF0aW9uKS50aGVuKHQuc3RlcF9mdW5jX2RvbmUoKCkgPT4gewogICAgIGFzc2VydF9lcXVhbHMoCkBAIC0xMjQsMTEgKzEyNCwxMSBAQAogICBjb25zdCBlbGVtZW50cyA9IGNyZWF0ZVRlc3RET00odHJ1ZSwgJ2hvcml6b250YWwtdGInLCAncnRsJyk7CiAgIGNvbnN0IGFuaW1hdGlvbiA9IGNyZWF0ZUFuZFBsYXlUZXN0QW5pbWF0aW9uKGVsZW1lbnRzLCAnaW5saW5lJyk7CiAKLSAgLy8gTW92ZSB0aGUgc2Nyb2xsZXIgdG8gdGhlIDc1JSBwb2ludC4gU2luY2UgaXQgaXMgZGlyZWN0aW9uOiBydGwsIHRoaXMgaXMKLSAgLy8gZXF1aXZhbGVudCB0byB0aGUgMjUlIHBvaW50IGZvciB0aGUgU2Nyb2xsVGltZWxpbmUuCisgIC8vIE1vdmUgdGhlIHNjcm9sbGVyIHRvIHRoZSBsZWZ0IDI1JSBwb2ludCwgc2luY2UgaXQgaXMgZGlyZWN0aW9uOiBydGwsCisgIC8vIGkuZSBsZWZ0d2FyZHMgb3ZlcmZsb3cgZGlyZWN0aW9uLCBzY3JvbGxMZWZ0IGlzIC0yNSUgcG9pbnQuCiAgIGNvbnN0IG1heFNjcm9sbCA9CiAgICAgICBlbGVtZW50cy5zY3JvbGxlci5zY3JvbGxXaWR0aCAtIGVsZW1lbnRzLnNjcm9sbGVyLmNsaWVudFdpZHRoOwotICBlbGVtZW50cy5zY3JvbGxlci5zY3JvbGxMZWZ0ID0gMC43NSAqIG1heFNjcm9sbDsKKyAgZWxlbWVudHMuc2Nyb2xsZXIuc2Nyb2xsTGVmdCA9IC0wLjI1ICogbWF4U2Nyb2xsOwogCiAgIHdhaXRGb3JOb3ROdWxsTG9jYWxUaW1lKGFuaW1hdGlvbikudGhlbih0LnN0ZXBfZnVuY19kb25lKCgpID0+IHsKICAgICBhc3NlcnRfZXF1YWxzKApAQCAtMTU1LDExICsxNTUsMTEgQEAKICAgY29uc3QgZWxlbWVudHMgPSBjcmVhdGVUZXN0RE9NKGZhbHNlLCAndmVydGljYWwtbHInLCAncnRsJyk7CiAgIGNvbnN0IGFuaW1hdGlvbiA9IGNyZWF0ZUFuZFBsYXlUZXN0QW5pbWF0aW9uKGVsZW1lbnRzLCAnaW5saW5lJyk7CiAKLSAgLy8gTW92ZSB0aGUgc2Nyb2xsZXIgdG8gdGhlIDc1JSBwb2ludC4gU2luY2UgdGhpcyBpcyBhIHZlcnRpY2FsIHdyaXRpbmcgbW9kZQotICAvLyBhbmQgZGlyZWN0aW9uOiBydGwsIHRoaXMgaXMgMjUlIG9mIHRoZSBTY3JvbGxUaW1lbGluZSBjdXJyZW50VGltZS4KKyAgLy8gTW92ZSB0aGUgc2Nyb2xsZXIgdG8gdGhlIHRvcCAyNSUgcG9pbnQsIHNpbmNlIGl0IGlzIGEgdmVydGljYWwtbHIgd3JpdGluZyBtb2RlCisgIC8vIGFuZCBkaXJlY3Rpb246IHJ0bCwgaS5lIHVwd2FyZHMgb3ZlcmZsb3cgZGlyZWN0aW9uLCBzY3JvbGxUb3AgaXMgLTI1JSBwb2ludC4KICAgY29uc3QgbWF4U2Nyb2xsID0KICAgICAgIGVsZW1lbnRzLnNjcm9sbGVyLnNjcm9sbEhlaWdodCAtIGVsZW1lbnRzLnNjcm9sbGVyLmNsaWVudEhlaWdodDsKLSAgZWxlbWVudHMuc2Nyb2xsZXIuc2Nyb2xsVG9wID0gMC43NSAqIG1heFNjcm9sbDsKKyAgZWxlbWVudHMuc2Nyb2xsZXIuc2Nyb2xsVG9wID0gLTAuMjUgKiBtYXhTY3JvbGw7CiAKICAgd2FpdEZvck5vdE51bGxMb2NhbFRpbWUoYW5pbWF0aW9uKS50aGVuKHQuc3RlcF9mdW5jX2RvbmUoKCkgPT4gewogICAgIGFzc2VydF9lcXVhbHMoCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L2JlYWNvbi9NRVRBLnltbCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvYmVhY29uL01FVEEueW1sCmluZGV4IDk0ZmE3NWMuLjRiZDk0ZTMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvYmVhY29uL01FVEEueW1sCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvYmVhY29uL01FVEEueW1sCkBAIC0xLDQgKzEsMyBAQAogc3BlYzogaHR0cHM6Ly93M2MuZ2l0aHViLmlvL2JlYWNvbi8KIHN1Z2dlc3RlZF9yZXZpZXdlcnM6Ci0gIC0gdG9kZHJlaWZzdGVjawogICAtIGlncmlnb3JpawpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC9jc3MvY3NzLWZsZXhib3gvc2Nyb2xsYmFycy1hdXRvLXJlZi5odG1sIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC9jc3MvY3NzLWZsZXhib3gvc2Nyb2xsYmFycy1hdXRvLXJlZi5odG1sCmluZGV4IGU4M2JhNTIuLjU5MGI1MzMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvY3NzL2Nzcy1mbGV4Ym94L3Njcm9sbGJhcnMtYXV0by1yZWYuaHRtbAorKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L2Nzcy9jc3MtZmxleGJveC9zY3JvbGxiYXJzLWF1dG8tcmVmLmh0bWwKQEAgLTE2Niw4ICsxNjYsOCBAQAogfQogbm9kZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucnRsID4gLnJvdy1yZXZlcnNlIik7CiBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7Ci0gIG5vZGVzW2ldLnNjcm9sbExlZnQgPSAwOwotICBub2Rlc1tpXS5zY3JvbGxUb3AgPSAwOworICBub2Rlc1tpXS5zY3JvbGxMZWZ0ID0gLTEwMDAwOworICBub2Rlc1tpXS5zY3JvbGxUb3AgPSAtMTAwMDA7CiB9CiBub2RlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5jb2x1bW4tcmV2ZXJzZSIpOwogZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgewpAQCAtMTc2LDcgKzE3Niw3IEBACiB9CiBub2RlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5mbGlwcGVkLWJsb2NrcyA+IC5jb2x1bW4tcmV2ZXJzZSIpOwogZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgewotICBub2Rlc1tpXS5zY3JvbGxMZWZ0ID0gMDsKKyAgbm9kZXNbaV0uc2Nyb2xsTGVmdCA9IC0xMDAwMDsKICAgbm9kZXNbaV0uc2Nyb2xsVG9wID0gMDsKIH0KIDwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC9jc3MvY3NzLWZsZXhib3gvc2Nyb2xsYmFycy1yZWYuaHRtbCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvY3NzL2Nzcy1mbGV4Ym94L3Njcm9sbGJhcnMtcmVmLmh0bWwKaW5kZXggMzJiYjYxMC4uOTExZTdhYyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC9jc3MvY3NzLWZsZXhib3gvc2Nyb2xsYmFycy1yZWYuaHRtbAorKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L2Nzcy9jc3MtZmxleGJveC9zY3JvbGxiYXJzLXJlZi5odG1sCkBAIC0xNjYsOCArMTY2LDggQEAKIH0KIG5vZGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJ0bCA+IC5yb3ctcmV2ZXJzZSIpOwogZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgewotICBub2Rlc1tpXS5zY3JvbGxMZWZ0ID0gMDsKLSAgbm9kZXNbaV0uc2Nyb2xsVG9wID0gMDsKKyAgbm9kZXNbaV0uc2Nyb2xsTGVmdCA9IC0xMDAwMDsKKyAgbm9kZXNbaV0uc2Nyb2xsVG9wID0gLTEwMDAwOwogfQogbm9kZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuY29sdW1uLXJldmVyc2UiKTsKIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsKQEAgLTE3Niw3ICsxNzYsNyBAQAogfQogbm9kZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuZmxpcHBlZC1ibG9ja3MgPiAuY29sdW1uLXJldmVyc2UiKTsKIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsKLSAgbm9kZXNbaV0uc2Nyb2xsTGVmdCA9IDA7CisgIG5vZGVzW2ldLnNjcm9sbExlZnQgPSAtMTAwMDA7CiAgIG5vZGVzW2ldLnNjcm9sbFRvcCA9IDA7CiB9CiA8L3NjcmlwdD4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvY3NzL2Nzcy1wb3NpdGlvbi9wb3NpdGlvbi1zdGlja3ktd3JpdGluZy1tb2Rlcy1yZWYuaHRtbCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvY3NzL2Nzcy1wb3NpdGlvbi9wb3NpdGlvbi1zdGlja3ktd3JpdGluZy1tb2Rlcy1yZWYuaHRtbAppbmRleCAzOTgwMDg2Li5iOTc3MWFjZiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC9jc3MvY3NzLXBvc2l0aW9uL3Bvc2l0aW9uLXN0aWNreS13cml0aW5nLW1vZGVzLXJlZi5odG1sCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvY3NzL2Nzcy1wb3NpdGlvbi9wb3NpdGlvbi1zdGlja3ktd3JpdGluZy1tb2Rlcy1yZWYuaHRtbApAQCAtMzUsNyArMzUsNyBAQAogICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Nyb2xsZXIxJykuc2Nyb2xsVG9wID0gNTA7CiAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzY3JvbGxlcjEnKS5zY3JvbGxMZWZ0ID0gMjA7CiAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzY3JvbGxlcjInKS5zY3JvbGxUb3AgPSA1MDsKLSAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Njcm9sbGVyMicpLnNjcm9sbExlZnQgPSA2MDsKKyAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Njcm9sbGVyMicpLnNjcm9sbExlZnQgPSAtMjU7CiB9KTsKIDwvc2NyaXB0PgogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L2Nzcy9jc3MtcG9zaXRpb24vcG9zaXRpb24tc3RpY2t5LXdyaXRpbmctbW9kZXMuaHRtbCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvY3NzL2Nzcy1wb3NpdGlvbi9wb3NpdGlvbi1zdGlja3ktd3JpdGluZy1tb2Rlcy5odG1sCmluZGV4IGVlMmRiYzAuLmRhMjdmNTBjIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L2Nzcy9jc3MtcG9zaXRpb24vcG9zaXRpb24tc3RpY2t5LXdyaXRpbmctbW9kZXMuaHRtbAorKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L2Nzcy9jc3MtcG9zaXRpb24vcG9zaXRpb24tc3RpY2t5LXdyaXRpbmctbW9kZXMuaHRtbApAQCAtNDQsNyArNDQsNyBAQAogICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Nyb2xsZXIxJykuc2Nyb2xsVG9wID0gNTA7CiAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzY3JvbGxlcjEnKS5zY3JvbGxMZWZ0ID0gMjA7CiAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzY3JvbGxlcjInKS5zY3JvbGxUb3AgPSA1MDsKLSAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Njcm9sbGVyMicpLnNjcm9sbExlZnQgPSA2MDsKKyAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Njcm9sbGVyMicpLnNjcm9sbExlZnQgPSAtMjU7CiB9KTsKIDwvc2NyaXB0PgogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L2Nzcy9jc3Mtc2Nyb2xsLWFuY2hvcmluZy90ZXh0LWFuY2hvci1pbi12ZXJ0aWNhbC1ybC1leHBlY3RlZC50eHQgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L2Nzcy9jc3Mtc2Nyb2xsLWFuY2hvcmluZy90ZXh0LWFuY2hvci1pbi12ZXJ0aWNhbC1ybC1leHBlY3RlZC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyYzhjNWFjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvY3NzL2Nzcy1zY3JvbGwtYW5jaG9yaW5nL3RleHQtYW5jaG9yLWluLXZlcnRpY2FsLXJsLWV4cGVjdGVkLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotVGhpcyBpcyBhIHRlc3RoYXJuZXNzLmpzLWJhc2VkIHRlc3QuCi1GQUlMIExpbmUgYXQgZWRnZSBvZiBzY3JvbGxwb3J0IHNob3VsZG4ndCBqdW1wIHZpc3VhbGx5IHdoZW4gY29udGVudCBpcyBpbnNlcnRlZCBiZWZvcmUgYXNzZXJ0X2VxdWFsczogZXhwZWN0ZWQgLTQwMCBidXQgZ290IDMwMAotSGFybmVzczogdGhlIHRlc3QgcmFuIHRvIGNvbXBsZXRpb24uCi0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvY3NzL2Nzcy1zY3JvbGwtc25hcC9zbmFwLWlubGluZS1ibG9jay1leHBlY3RlZC50eHQgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L2Nzcy9jc3Mtc2Nyb2xsLXNuYXAvc25hcC1pbmxpbmUtYmxvY2stZXhwZWN0ZWQudHh0CmluZGV4IDQ4MTljMzkuLjQ5ZjhhODkgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvY3NzL2Nzcy1zY3JvbGwtc25hcC9zbmFwLWlubGluZS1ibG9jay1leHBlY3RlZC50eHQKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC9jc3MvY3NzLXNjcm9sbC1zbmFwL3NuYXAtaW5saW5lLWJsb2NrLWV4cGVjdGVkLnR4dApAQCAtMSwxMSArMSwxMSBAQAogVGhpcyBpcyBhIHRlc3RoYXJuZXNzLmpzLWJhc2VkIHRlc3QuCiBQQVNTIFNuYXBzIGNvcnJlY3RseSBmb3IgaG9yaXpvbnRhbC10YiB3cml0aW5nIG1vZGUgd2l0aCAnc2Nyb2xsLXNuYXAtYWxpZ246IGVuZCBzdGFydCcgYWxpZ25tZW50CiBQQVNTIFNuYXBzIGNvcnJlY3RseSBmb3IgdmVydGljYWwtbHIgd3JpdGluZyBtb2RlIHdpdGggJ3Njcm9sbC1zbmFwLWFsaWduOiBlbmQgc3RhcnQnIGFsaWdubWVudAotRkFJTCBTbmFwcyBjb3JyZWN0bHkgZm9yIHZlcnRpY2FsLXJsIHdyaXRpbmcgbW9kZSB3aXRoICdzY3JvbGwtc25hcC1hbGlnbjogZW5kIHN0YXJ0JyBhbGlnbm1lbnQgYXNzZXJ0X2VxdWFsczogYWxpZ25zIGNvcnJlY3RseSBvbiB4IGV4cGVjdGVkIC0zMTUgYnV0IGdvdCAzMDAKLUZBSUwgU25hcHMgY29ycmVjdGx5IGZvciBob3Jpem9udGFsLXRiIHdyaXRpbmcgbW9kZSB3aXRoICdzY3JvbGwtc25hcC1hbGlnbjogc3RhcnQgZW5kJyBhbGlnbm1lbnQgYXNzZXJ0X2VxdWFsczogYWxpZ25zIGNvcnJlY3RseSBvbiB4IGV4cGVjdGVkIDExNSBidXQgZ290IDAKLUZBSUwgU25hcHMgY29ycmVjdGx5IGZvciB2ZXJ0aWNhbC1sciB3cml0aW5nIG1vZGUgd2l0aCAnc2Nyb2xsLXNuYXAtYWxpZ246IHN0YXJ0IGVuZCcgYWxpZ25tZW50IGFzc2VydF9lcXVhbHM6IGFsaWducyBjb3JyZWN0bHkgb24geCBleHBlY3RlZCAzMDAgYnV0IGdvdCAwCi1GQUlMIFNuYXBzIGNvcnJlY3RseSBmb3IgdmVydGljYWwtcmwgd3JpdGluZyBtb2RlIHdpdGggJ3Njcm9sbC1zbmFwLWFsaWduOiBzdGFydCBlbmQnIGFsaWdubWVudCBhc3NlcnRfZXF1YWxzOiBhbGlnbnMgY29ycmVjdGx5IG9uIHggZXhwZWN0ZWQgLTUwMCBidXQgZ290IDExNQotRkFJTCBTbmFwcyBjb3JyZWN0bHkgZm9yICdkaXJlY3Rpb246IHJ0bCcgd2l0aCAnc2Nyb2xsLXNuYXAtYWxpZ246IGVuZCBzdGFydCcgYWxpZ25tZW50IGFzc2VydF9lcXVhbHM6IGFsaWducyBjb3JyZWN0bHkgb24geCBleHBlY3RlZCAtNTAwIGJ1dCBnb3QgMAotRkFJTCBTbmFwcyBjb3JyZWN0bHkgZm9yICdkaXJlY3Rpb246IHJ0bCcgd2l0aCAnc2Nyb2xsLXNuYXAtYWxpZ246IHN0YXJ0IGVuZCcgYWxpZ25tZW50IGFzc2VydF9lcXVhbHM6IGFsaWducyBjb3JyZWN0bHkgb24geCBleHBlY3RlZCAtMzE1IGJ1dCBnb3QgMAorUEFTUyBTbmFwcyBjb3JyZWN0bHkgZm9yIHZlcnRpY2FsLXJsIHdyaXRpbmcgbW9kZSB3aXRoICdzY3JvbGwtc25hcC1hbGlnbjogZW5kIHN0YXJ0JyBhbGlnbm1lbnQKK1BBU1MgU25hcHMgY29ycmVjdGx5IGZvciBob3Jpem9udGFsLXRiIHdyaXRpbmcgbW9kZSB3aXRoICdzY3JvbGwtc25hcC1hbGlnbjogc3RhcnQgZW5kJyBhbGlnbm1lbnQKK1BBU1MgU25hcHMgY29ycmVjdGx5IGZvciB2ZXJ0aWNhbC1sciB3cml0aW5nIG1vZGUgd2l0aCAnc2Nyb2xsLXNuYXAtYWxpZ246IHN0YXJ0IGVuZCcgYWxpZ25tZW50CitQQVNTIFNuYXBzIGNvcnJlY3RseSBmb3IgdmVydGljYWwtcmwgd3JpdGluZyBtb2RlIHdpdGggJ3Njcm9sbC1zbmFwLWFsaWduOiBzdGFydCBlbmQnIGFsaWdubWVudAorRkFJTCBTbmFwcyBjb3JyZWN0bHkgZm9yICdkaXJlY3Rpb246IHJ0bCcgd2l0aCAnc2Nyb2xsLXNuYXAtYWxpZ246IGVuZCBzdGFydCcgYWxpZ25tZW50IGFzc2VydF9lcXVhbHM6IGFsaWducyBjb3JyZWN0bHkgb24geCBleHBlY3RlZCAtNTAwIGJ1dCBnb3QgLTMxNQorRkFJTCBTbmFwcyBjb3JyZWN0bHkgZm9yICdkaXJlY3Rpb246IHJ0bCcgd2l0aCAnc2Nyb2xsLXNuYXAtYWxpZ246IHN0YXJ0IGVuZCcgYWxpZ25tZW50IGFzc2VydF9lcXVhbHM6IGFsaWducyBjb3JyZWN0bHkgb24geCBleHBlY3RlZCAtMzE1IGJ1dCBnb3QgLTUwMAogSGFybmVzczogdGhlIHRlc3QgcmFuIHRvIGNvbXBsZXRpb24uCiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvY3NzL2Nzcy1zaGFwZXMvc2hhcGUtb3V0c2lkZS92YWx1ZXMvc2hhcGUtbWFyZ2luLTAwMS5odG1sIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC9jc3MvY3NzLXNoYXBlcy9zaGFwZS1vdXRzaWRlL3ZhbHVlcy9zaGFwZS1tYXJnaW4tMDAxLmh0bWwKaW5kZXggMzlkZWE3ZS4uMjhlY2ExYSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC9jc3MvY3NzLXNoYXBlcy9zaGFwZS1vdXRzaWRlL3ZhbHVlcy9zaGFwZS1tYXJnaW4tMDAxLmh0bWwKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC9jc3MvY3NzLXNoYXBlcy9zaGFwZS1vdXRzaWRlL3ZhbHVlcy9zaGFwZS1tYXJnaW4tMDAxLmh0bWwKQEAgLTEwLDEwICsxMCwxMiBAQAogICAgICAgICA8c2NyaXB0IHNyYz0iL3Jlc291cmNlcy90ZXN0aGFybmVzcy5qcyI+PC9zY3JpcHQ+CiAgICAgICAgIDxzY3JpcHQgc3JjPSIvcmVzb3VyY2VzL3Rlc3RoYXJuZXNzcmVwb3J0LmpzIj48L3NjcmlwdD4KICAgICAgICAgPHNjcmlwdCBzcmM9InN1cHBvcnQvcGFyc2luZy11dGlscy5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii9mb250cy9haGVtLmNzcyIgLz4KICAgICA8L2hlYWQ+CiAgICAgPGJvZHk+CiAgICAgICAgIDxkaXYgaWQ9ImxvZyI+PC9kaXY+CiAgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICAgICAgc2V0dXAoe2V4cGxpY2l0X2RvbmU6IHRydWV9KTsKICAgICAgICAgdmFyIHNoYXBlX21hcmdpbl92YWxpZF91bml0X3Rlc3RzID0gW107CiAgICAgICAgIFBhcnNpbmdVdGlscy52YWxpZFVuaXRzLmZvckVhY2goZnVuY3Rpb24odW5pdCkgewogICAgICAgICAgICAgdGVzdCA9ICIxMCIrdW5pdDsKQEAgLTI1LDEwICsyNywxNiBAQAogICAgICAgICAgICAgdGVzdENhc2VbImV4cGVjdGVkX2NvbXB1dGVkIl0gPSB0ZXN0OwogICAgICAgICAgICAgc2hhcGVfbWFyZ2luX3ZhbGlkX3VuaXRfdGVzdHMucHVzaCh0ZXN0Q2FzZSk7CiAgICAgICAgIH0pOworCiAgICAgICAgIGdlbmVyYXRlX3Rlc3RzKCBQYXJzaW5nVXRpbHMudGVzdFNoYXBlTWFyZ2luSW5saW5lU3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzaW5nVXRpbHMuYnVpbGRUZXN0Q2FzZXMoc2hhcGVfbWFyZ2luX3ZhbGlkX3VuaXRfdGVzdHMsICJpbmxpbmUiKSwgdHJ1ZSk7Ci0gICAgICAgIGdlbmVyYXRlX3Rlc3RzKCBQYXJzaW5nVXRpbHMudGVzdFNoYXBlTWFyZ2luQ29tcHV0ZWRTdHlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNpbmdVdGlscy5idWlsZFRlc3RDYXNlcyhzaGFwZV9tYXJnaW5fdmFsaWRfdW5pdF90ZXN0cywgImNvbXB1dGVkIiksIHRydWUpOworICAgICAgICBQYXJzaW5nVXRpbHMuc2V0dXBGb250cygpOworICAgICAgICBkb2N1bWVudC5mb250cy5yZWFkeS50aGVuKCgpPT4geworICAgICAgICAgICAgZ2VuZXJhdGVfdGVzdHMoIFBhcnNpbmdVdGlscy50ZXN0U2hhcGVNYXJnaW5Db21wdXRlZFN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNpbmdVdGlscy5idWlsZFRlc3RDYXNlcyhzaGFwZV9tYXJnaW5fdmFsaWRfdW5pdF90ZXN0cywgImNvbXB1dGVkIiksIHRydWUpOworICAgICAgICAgICAgUGFyc2luZ1V0aWxzLnJlc3RvcmVGb250cygpOworICAgICAgICAgICAgZG9uZSgpOworICAgICAgICB9KTsKICAgICAgICAgPC9zY3JpcHQ+CiAgICAgPC9ib2R5PgogPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC9jc3MvY3NzLXNoYXBlcy9zaGFwZS1vdXRzaWRlL3ZhbHVlcy9zaGFwZS1vdXRzaWRlLWNpcmNsZS0wMDQuaHRtbCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvY3NzL2Nzcy1zaGFwZXMvc2hhcGUtb3V0c2lkZS92YWx1ZXMvc2hhcGUtb3V0c2lkZS1jaXJjbGUtMDA0Lmh0bWwKaW5kZXggMDFmM2ZjMWIuLjI4OTg2MWVlMSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC9jc3MvY3NzLXNoYXBlcy9zaGFwZS1vdXRzaWRlL3ZhbHVlcy9zaGFwZS1vdXRzaWRlLWNpcmNsZS0wMDQuaHRtbAorKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L2Nzcy9jc3Mtc2hhcGVzL3NoYXBlLW91dHNpZGUvdmFsdWVzL3NoYXBlLW91dHNpZGUtY2lyY2xlLTAwNC5odG1sCkBAIC0xMywxNCArMTMsMjEgQEAKICAgICAgICAgPHNjcmlwdCBzcmM9Ii9yZXNvdXJjZXMvdGVzdGhhcm5lc3MuanMiPjwvc2NyaXB0PgogICAgICAgICA8c2NyaXB0IHNyYz0iL3Jlc291cmNlcy90ZXN0aGFybmVzc3JlcG9ydC5qcyI+PC9zY3JpcHQ+CiAgICAgICAgIDxzY3JpcHQgc3JjPSJzdXBwb3J0L3BhcnNpbmctdXRpbHMuanMiPjwvc2NyaXB0PgorICAgICAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIvZm9udHMvYWhlbS5jc3MiIC8+CiAgICAgPC9oZWFkPgogICAgIDxib2R5PgogICAgICAgICA8ZGl2IGlkPSJsb2ciPjwvZGl2PgogICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgICAgICAgICBzZXR1cCh7ZXhwbGljaXRfZG9uZTogdHJ1ZX0pOwogICAgICAgICAgICAgZ2VuZXJhdGVfdGVzdHMoIFBhcnNpbmdVdGlscy50ZXN0SW5saW5lU3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2luZ1V0aWxzLmJ1aWxkUG9zaXRpb25UZXN0cygiY2lyY2xlIiwgdHJ1ZSwgJ2xlbmd0aFVuaXQgKyBpbmxpbmUnLCBQYXJzaW5nVXRpbHMudmFsaWRVbml0cykgKTsKLSAgICAgICAgICAgIGdlbmVyYXRlX3Rlc3RzKCBQYXJzaW5nVXRpbHMudGVzdENvbXB1dGVkU3R5bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2luZ1V0aWxzLmJ1aWxkUG9zaXRpb25UZXN0cygiY2lyY2xlIiwgdHJ1ZSwgJ2xlbmd0aFVuaXQgKyBjb21wdXRlZCcsIFBhcnNpbmdVdGlscy52YWxpZFVuaXRzKSApOworICAgICAgICAgICAgUGFyc2luZ1V0aWxzLnNldHVwRm9udHMoKTsKKyAgICAgICAgICAgIGRvY3VtZW50LmZvbnRzLnJlYWR5LnRoZW4oKCk9PiB7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVfdGVzdHMoIFBhcnNpbmdVdGlscy50ZXN0Q29tcHV0ZWRTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2luZ1V0aWxzLmJ1aWxkUG9zaXRpb25UZXN0cygiY2lyY2xlIiwgdHJ1ZSwgJ2xlbmd0aFVuaXQgKyBjb21wdXRlZCcsIFBhcnNpbmdVdGlscy52YWxpZFVuaXRzKSApOworICAgICAgICAgICAgICAgIFBhcnNpbmdVdGlscy5yZXN0b3JlRm9udHMoKTsKKyAgICAgICAgICAgICAgICBkb25lKCk7CisgICAgICAgICAgICB9KTsKICAgICAgICAgPC9zY3JpcHQ+CiAgICAgPC9ib2R5PgogPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC9jc3MvY3NzLXNoYXBlcy9zaGFwZS1vdXRzaWRlL3ZhbHVlcy9zaGFwZS1vdXRzaWRlLWNpcmNsZS0wMDUuaHRtbCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvY3NzL2Nzcy1zaGFwZXMvc2hhcGUtb3V0c2lkZS92YWx1ZXMvc2hhcGUtb3V0c2lkZS1jaXJjbGUtMDA1Lmh0bWwKaW5kZXggN2Q5MDMxOC4uNDZjYWUwNCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC9jc3MvY3NzLXNoYXBlcy9zaGFwZS1vdXRzaWRlL3ZhbHVlcy9zaGFwZS1vdXRzaWRlLWNpcmNsZS0wMDUuaHRtbAorKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L2Nzcy9jc3Mtc2hhcGVzL3NoYXBlLW91dHNpZGUvdmFsdWVzL3NoYXBlLW91dHNpZGUtY2lyY2xlLTAwNS5odG1sCkBAIC0xMiwxMiArMTIsMTkgQEAKICAgICAgICAgPHNjcmlwdCBzcmM9Ii9yZXNvdXJjZXMvdGVzdGhhcm5lc3MuanMiPjwvc2NyaXB0PgogICAgICAgICA8c2NyaXB0IHNyYz0iL3Jlc291cmNlcy90ZXN0aGFybmVzc3JlcG9ydC5qcyI+PC9zY3JpcHQ+CiAgICAgICAgIDxzY3JpcHQgc3JjPSJzdXBwb3J0L3BhcnNpbmctdXRpbHMuanMiPjwvc2NyaXB0PgorICAgICAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIvZm9udHMvYWhlbS5jc3MiIC8+CiAgICAgPC9oZWFkPgogICAgIDxib2R5PgogICAgICAgICA8ZGl2IGlkPSJsb2ciPjwvZGl2PgogICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgICAgICAgICBzZXR1cCh7ZXhwbGljaXRfZG9uZTogdHJ1ZX0pOwogICAgICAgICAgICAgZ2VuZXJhdGVfdGVzdHMoUGFyc2luZ1V0aWxzLnRlc3RJbmxpbmVTdHlsZSwgUGFyc2luZ1V0aWxzLmJ1aWxkUmFkaWlUZXN0cygnY2lyY2xlJywgJ2xlbmd0aFVuaXQgKyBpbmxpbmUnLCBQYXJzaW5nVXRpbHMudmFsaWRVbml0cykpOwotICAgICAgICAgICAgZ2VuZXJhdGVfdGVzdHMoUGFyc2luZ1V0aWxzLnRlc3RDb21wdXRlZFN0eWxlLCBQYXJzaW5nVXRpbHMuYnVpbGRSYWRpaVRlc3RzKCdjaXJjbGUnLCAnbGVuZ3RoVW5pdCArIGNvbXB1dGVkJywgUGFyc2luZ1V0aWxzLnZhbGlkVW5pdHMpKTsKKyAgICAgICAgICAgIFBhcnNpbmdVdGlscy5zZXR1cEZvbnRzKCk7CisgICAgICAgICAgICBkb2N1bWVudC5mb250cy5yZWFkeS50aGVuKCgpPT4geworICAgICAgICAgICAgICAgIGdlbmVyYXRlX3Rlc3RzKFBhcnNpbmdVdGlscy50ZXN0Q29tcHV0ZWRTdHlsZSwgUGFyc2luZ1V0aWxzLmJ1aWxkUmFkaWlUZXN0cygnY2lyY2xlJywgJ2xlbmd0aFVuaXQgKyBjb21wdXRlZCcsIFBhcnNpbmdVdGlscy52YWxpZFVuaXRzKSk7CisgICAgICAgICAgICAgICAgUGFyc2luZ1V0aWxzLnJlc3RvcmVGb250cygpOworICAgICAgICAgICAgICAgIGRvbmUoKTsKKyAgICAgICAgICAgIH0pOwogICAgICAgICA8L3NjcmlwdD4KICAgICA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L2Nzcy9jc3Mtc2hhcGVzL3NoYXBlLW91dHNpZGUvdmFsdWVzL3NoYXBlLW91dHNpZGUtY29tcHV0ZWQtc2hhcGUtMDAwLWV4cGVjdGVkLnR4dCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvY3NzL2Nzcy1zaGFwZXMvc2hhcGUtb3V0c2lkZS92YWx1ZXMvc2hhcGUtb3V0c2lkZS1jb21wdXRlZC1zaGFwZS0wMDAtZXhwZWN0ZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMmExNjMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L2Nzcy9jc3Mtc2hhcGVzL3NoYXBlLW91dHNpZGUvdmFsdWVzL3NoYXBlLW91dHNpZGUtY29tcHV0ZWQtc2hhcGUtMDAwLWV4cGVjdGVkLnR4dApAQCAtMCwwICsxLDQgQEAKK1RoaXMgaXMgYSB0ZXN0aGFybmVzcy5qcy1iYXNlZCB0ZXN0LgorRkFJTCBTaGFwZSBPdXRzaWRlIEJhc2ljIFNoYXBlIENvbXB1dGVkIEZvbnQgUmVsYXRpdmUgTGVuZ3RocyBVbmNhdWdodCBUeXBlRXJyb3I6IFBhcnNpbmdVdGlscy5zZXR1cEZvbnRzKC4uLikgaXMgbm90IGEgZnVuY3Rpb24KK0hhcm5lc3M6IHRoZSB0ZXN0IHJhbiB0byBjb21wbGV0aW9uLgorCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L2Nzcy9jc3Mtc2hhcGVzL3NoYXBlLW91dHNpZGUvdmFsdWVzL3NoYXBlLW91dHNpZGUtZWxsaXBzZS0wMDQuaHRtbCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvY3NzL2Nzcy1zaGFwZXMvc2hhcGUtb3V0c2lkZS92YWx1ZXMvc2hhcGUtb3V0c2lkZS1lbGxpcHNlLTAwNC5odG1sCmluZGV4IDc2MTdhMzQuLjFkNGFhODVhIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L2Nzcy9jc3Mtc2hhcGVzL3NoYXBlLW91dHNpZGUvdmFsdWVzL3NoYXBlLW91dHNpZGUtZWxsaXBzZS0wMDQuaHRtbAorKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L2Nzcy9jc3Mtc2hhcGVzL3NoYXBlLW91dHNpZGUvdmFsdWVzL3NoYXBlLW91dHNpZGUtZWxsaXBzZS0wMDQuaHRtbApAQCAtMTMsMTQgKzEzLDIxIEBACiAgICAgICAgIDxzY3JpcHQgc3JjPSIvcmVzb3VyY2VzL3Rlc3RoYXJuZXNzLmpzIj48L3NjcmlwdD4KICAgICAgICAgPHNjcmlwdCBzcmM9Ii9yZXNvdXJjZXMvdGVzdGhhcm5lc3NyZXBvcnQuanMiPjwvc2NyaXB0PgogICAgICAgICA8c2NyaXB0IHNyYz0ic3VwcG9ydC9wYXJzaW5nLXV0aWxzLmpzIj48L3NjcmlwdD4KKyAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iL2ZvbnRzL2FoZW0uY3NzIiAvPgogICAgIDwvaGVhZD4KICAgICA8Ym9keT4KICAgICAgICAgPGRpdiBpZD0ibG9nIj48L2Rpdj4KICAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgICAgICAgICAgc2V0dXAoe2V4cGxpY2l0X2RvbmU6IHRydWV9KTsKICAgICAgICAgICAgIGdlbmVyYXRlX3Rlc3RzKCBQYXJzaW5nVXRpbHMudGVzdElubGluZVN0eWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNpbmdVdGlscy5idWlsZFBvc2l0aW9uVGVzdHMoImVsbGlwc2UiLCB0cnVlLCAnbGVuZ3RoVW5pdCArIGlubGluZScsIFBhcnNpbmdVdGlscy52YWxpZFVuaXRzKSApOwotICAgICAgICAgICAgZ2VuZXJhdGVfdGVzdHMoIFBhcnNpbmdVdGlscy50ZXN0Q29tcHV0ZWRTdHlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzaW5nVXRpbHMuYnVpbGRQb3NpdGlvblRlc3RzKCJlbGxpcHNlIiwgdHJ1ZSwgJ2xlbmd0aFVuaXQgKyBjb21wdXRlZCcsIFBhcnNpbmdVdGlscy52YWxpZFVuaXRzKSApOworICAgICAgICAgICAgUGFyc2luZ1V0aWxzLnNldHVwRm9udHMoKTsKKyAgICAgICAgICAgIGRvY3VtZW50LmZvbnRzLnJlYWR5LnRoZW4oKCk9PiB7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVfdGVzdHMoIFBhcnNpbmdVdGlscy50ZXN0Q29tcHV0ZWRTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2luZ1V0aWxzLmJ1aWxkUG9zaXRpb25UZXN0cygiZWxsaXBzZSIsIHRydWUsICdsZW5ndGhVbml0ICsgY29tcHV0ZWQnLCBQYXJzaW5nVXRpbHMudmFsaWRVbml0cykgKTsKKyAgICAgICAgICAgICAgICBQYXJzaW5nVXRpbHMucmVzdG9yZUZvbnRzKCk7CisgICAgICAgICAgICAgICAgZG9uZSgpOworICAgICAgICAgICAgfSk7CiAgICAgICAgIDwvc2NyaXB0PgogICAgIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvY3NzL2Nzcy1zaGFwZXMvc2hhcGUtb3V0c2lkZS92YWx1ZXMvc2hhcGUtb3V0c2lkZS1lbGxpcHNlLTAwNS5odG1sIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC9jc3MvY3NzLXNoYXBlcy9zaGFwZS1vdXRzaWRlL3ZhbHVlcy9zaGFwZS1vdXRzaWRlLWVsbGlwc2UtMDA1Lmh0bWwKaW5kZXggZmU1YWYzYi4uNWFjYjk5NCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC9jc3MvY3NzLXNoYXBlcy9zaGFwZS1vdXRzaWRlL3ZhbHVlcy9zaGFwZS1vdXRzaWRlLWVsbGlwc2UtMDA1Lmh0bWwKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC9jc3MvY3NzLXNoYXBlcy9zaGFwZS1vdXRzaWRlL3ZhbHVlcy9zaGFwZS1vdXRzaWRlLWVsbGlwc2UtMDA1Lmh0bWwKQEAgLTEyLDEyICsxMiwyMCBAQAogICAgICAgICA8c2NyaXB0IHNyYz0iL3Jlc291cmNlcy90ZXN0aGFybmVzcy5qcyI+PC9zY3JpcHQ+CiAgICAgICAgIDxzY3JpcHQgc3JjPSIvcmVzb3VyY2VzL3Rlc3RoYXJuZXNzcmVwb3J0LmpzIj48L3NjcmlwdD4KICAgICAgICAgPHNjcmlwdCBzcmM9InN1cHBvcnQvcGFyc2luZy11dGlscy5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii9mb250cy9haGVtLmNzcyIgLz4KICAgICA8L2hlYWQ+CiAgICAgPGJvZHk+CiAgICAgICAgIDxkaXYgaWQ9ImxvZyI+PC9kaXY+CiAgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICAgICAgICAgIHNldHVwKHtleHBsaWNpdF9kb25lOiB0cnVlfSk7CiAgICAgICAgICAgICBnZW5lcmF0ZV90ZXN0cyhQYXJzaW5nVXRpbHMudGVzdElubGluZVN0eWxlLCBQYXJzaW5nVXRpbHMuYnVpbGRSYWRpaVRlc3RzKCdlbGxpcHNlJywgJ2xlbmd0aFVuaXQgKyBpbmxpbmUnLCBQYXJzaW5nVXRpbHMudmFsaWRVbml0cykpOwotICAgICAgICAgICAgZ2VuZXJhdGVfdGVzdHMoUGFyc2luZ1V0aWxzLnRlc3RDb21wdXRlZFN0eWxlLCBQYXJzaW5nVXRpbHMuYnVpbGRSYWRpaVRlc3RzKCdlbGxpcHNlJywgJ2xlbmd0aFVuaXQgKyBjb21wdXRlZCcsIFBhcnNpbmdVdGlscy52YWxpZFVuaXRzKSk7CisgICAgICAgICAgICBQYXJzaW5nVXRpbHMuc2V0dXBGb250cygpOworICAgICAgICAgICAgZG9jdW1lbnQuZm9udHMucmVhZHkudGhlbigoKT0+IHsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZV90ZXN0cyhQYXJzaW5nVXRpbHMudGVzdENvbXB1dGVkU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNpbmdVdGlscy5idWlsZFJhZGlpVGVzdHMoJ2VsbGlwc2UnLCAnbGVuZ3RoVW5pdCArIGNvbXB1dGVkJywgUGFyc2luZ1V0aWxzLnZhbGlkVW5pdHMpKTsKKyAgICAgICAgICAgICAgICBQYXJzaW5nVXRpbHMucmVzdG9yZUZvbnRzKCk7CisgICAgICAgICAgICAgICAgZG9uZSgpOworICAgICAgICAgICAgfSk7CiAgICAgICAgIDwvc2NyaXB0PgogICAgIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvY3NzL2Nzcy1zaGFwZXMvc2hhcGUtb3V0c2lkZS92YWx1ZXMvc2hhcGUtb3V0c2lkZS1pbnNldC0wMDMuaHRtbCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvY3NzL2Nzcy1zaGFwZXMvc2hhcGUtb3V0c2lkZS92YWx1ZXMvc2hhcGUtb3V0c2lkZS1pbnNldC0wMDMuaHRtbAppbmRleCA5YjQyMDcwLi4zZmZjMmFmIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L2Nzcy9jc3Mtc2hhcGVzL3NoYXBlLW91dHNpZGUvdmFsdWVzL3NoYXBlLW91dHNpZGUtaW5zZXQtMDAzLmh0bWwKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC9jc3MvY3NzLXNoYXBlcy9zaGFwZS1vdXRzaWRlL3ZhbHVlcy9zaGFwZS1vdXRzaWRlLWluc2V0LTAwMy5odG1sCkBAIC0xMywxNSArMTMsMjIgQEAKICAgICAgICAgPHNjcmlwdCBzcmM9Ii9yZXNvdXJjZXMvdGVzdGhhcm5lc3MuanMiPjwvc2NyaXB0PgogICAgICAgICA8c2NyaXB0IHNyYz0iL3Jlc291cmNlcy90ZXN0aGFybmVzc3JlcG9ydC5qcyI+PC9zY3JpcHQ+CiAgICAgICAgIDxzY3JpcHQgc3JjPSJzdXBwb3J0L3BhcnNpbmctdXRpbHMuanMiPjwvc2NyaXB0PgorICAgICAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIvZm9udHMvYWhlbS5jc3MiIC8+CiAgICAgPC9oZWFkPgogICAgIDxib2R5PgogICAgICAgICA8ZGl2IGlkPSJsb2ciPjwvZGl2PgogICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgICAgICAgIHNldHVwKHtleHBsaWNpdF9kb25lOiB0cnVlfSk7CiAgICAgICAgICAgIFBhcnNpbmdVdGlscy52YWxpZFVuaXRzLmZvckVhY2goZnVuY3Rpb24odW5pdCkgewogICAgICAgICAgICAgICAgIGdlbmVyYXRlX3Rlc3RzKFBhcnNpbmdVdGlscy50ZXN0SW5saW5lU3R5bGUsIFBhcnNpbmdVdGlscy5nZW5lcmF0ZUluc2V0Um91bmRDYXNlcyh1bml0LCAnaW5saW5lJykpOwogICAgICAgICAgICB9KTsKLSAgICAgICAgICAgUGFyc2luZ1V0aWxzLnZhbGlkVW5pdHMuZm9yRWFjaChmdW5jdGlvbih1bml0KSB7Ci0gICAgICAgICAgICAgICAgZ2VuZXJhdGVfdGVzdHMoUGFyc2luZ1V0aWxzLnRlc3RDb21wdXRlZFN0eWxlLCBQYXJzaW5nVXRpbHMuZ2VuZXJhdGVJbnNldFJvdW5kQ2FzZXModW5pdCwgJ2NvbXB1dGVkJykpOworICAgICAgICAgICBQYXJzaW5nVXRpbHMuc2V0dXBGb250cygpOworICAgICAgICAgICBkb2N1bWVudC5mb250cy5yZWFkeS50aGVuKCgpPT4geworICAgICAgICAgICAgICAgIFBhcnNpbmdVdGlscy52YWxpZFVuaXRzLmZvckVhY2goZnVuY3Rpb24odW5pdCkgeworICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZV90ZXN0cyhQYXJzaW5nVXRpbHMudGVzdENvbXB1dGVkU3R5bGUsIFBhcnNpbmdVdGlscy5nZW5lcmF0ZUluc2V0Um91bmRDYXNlcyh1bml0LCAnY29tcHV0ZWQnKSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgUGFyc2luZ1V0aWxzLnJlc3RvcmVGb250cygpOworICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgIDwvc2NyaXB0PgogICAgIDwvYm9keT4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvY3NzL2Nzcy1zaGFwZXMvc2hhcGUtb3V0c2lkZS92YWx1ZXMvc2hhcGUtb3V0c2lkZS1wb2x5Z29uLTAwNC5odG1sIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC9jc3MvY3NzLXNoYXBlcy9zaGFwZS1vdXRzaWRlL3ZhbHVlcy9zaGFwZS1vdXRzaWRlLXBvbHlnb24tMDA0Lmh0bWwKaW5kZXggYzk2MjNhMmUuLmU5ZWNmMmQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvY3NzL2Nzcy1zaGFwZXMvc2hhcGUtb3V0c2lkZS92YWx1ZXMvc2hhcGUtb3V0c2lkZS1wb2x5Z29uLTAwNC5odG1sCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvY3NzL2Nzcy1zaGFwZXMvc2hhcGUtb3V0c2lkZS92YWx1ZXMvc2hhcGUtb3V0c2lkZS1wb2x5Z29uLTAwNC5odG1sCkBAIC0xMywxMCArMTMsMTIgQEAKICAgICAgICAgPHNjcmlwdCBzcmM9Ii9yZXNvdXJjZXMvdGVzdGhhcm5lc3MuanMiPjwvc2NyaXB0PgogICAgICAgICA8c2NyaXB0IHNyYz0iL3Jlc291cmNlcy90ZXN0aGFybmVzc3JlcG9ydC5qcyI+PC9zY3JpcHQ+CiAgICAgICAgIDxzY3JpcHQgc3JjPSJzdXBwb3J0L3BhcnNpbmctdXRpbHMuanMiPjwvc2NyaXB0PgorICAgICAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIvZm9udHMvYWhlbS5jc3MiIC8+CiAgICAgPC9oZWFkPgogICAgIDxib2R5PgogICAgICAgICA8ZGl2IGlkPSJsb2ciPjwvZGl2PgogICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgICAgICAgICBzZXR1cCh7ZXhwbGljaXRfZG9uZTogdHJ1ZX0pOwogICAgICAgICAgICAgdmFyIGFyZ19sZW5ndGhfdW5pdHNfdGVzdHMgPSBbCiAgICAgICAgICAgICAgICBbJyUnLCAncHgnLCAncHgnXSwKICAgICAgICAgICAgICAgIFsncHgnLCAnJScsICdweCddLApAQCAtMzEsOCArMzMsMTMgQEAKICAgICAgICAgICAgIF07CiAgICAgICAgICAgICBnZW5lcmF0ZV90ZXN0cyggUGFyc2luZ1V0aWxzLnRlc3RJbmxpbmVTdHlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzaW5nVXRpbHMuYnVpbGRQb2x5Z29uVGVzdHMoYXJnX2xlbmd0aF91bml0c190ZXN0cywgJ2lubGluZScpICk7Ci0gICAgICAgICAgICBnZW5lcmF0ZV90ZXN0cyggUGFyc2luZ1V0aWxzLnRlc3RDb21wdXRlZFN0eWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNpbmdVdGlscy5idWlsZFBvbHlnb25UZXN0cyhhcmdfbGVuZ3RoX3VuaXRzX3Rlc3RzLCAnY29tcHV0ZWQnKSApOworICAgICAgICAgICAgUGFyc2luZ1V0aWxzLnNldHVwRm9udHMoKTsKKyAgICAgICAgICAgIGRvY3VtZW50LmZvbnRzLnJlYWR5LnRoZW4oKCk9PiB7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVfdGVzdHMoIFBhcnNpbmdVdGlscy50ZXN0Q29tcHV0ZWRTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2luZ1V0aWxzLmJ1aWxkUG9seWdvblRlc3RzKGFyZ19sZW5ndGhfdW5pdHNfdGVzdHMsICdjb21wdXRlZCcpICk7CisgICAgICAgICAgICAgICAgUGFyc2luZ1V0aWxzLnJlc3RvcmVGb250cygpOworICAgICAgICAgICAgICAgIGRvbmUoKTsKKyAgICAgICAgICAgIH0pOwogICAgICAgICA8L3NjcmlwdD4KICAgICA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L2Nzcy9jc3Mtc2hhcGVzL3NoYXBlLW91dHNpZGUvdmFsdWVzL3NoYXBlLW91dHNpZGUtc2hhcGUtYXJndW1lbnRzLTAwMC5odG1sIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC9jc3MvY3NzLXNoYXBlcy9zaGFwZS1vdXRzaWRlL3ZhbHVlcy9zaGFwZS1vdXRzaWRlLXNoYXBlLWFyZ3VtZW50cy0wMDAuaHRtbAppbmRleCAwMmQ1YmM3OC4uMDhkNWQ0NyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC9jc3MvY3NzLXNoYXBlcy9zaGFwZS1vdXRzaWRlL3ZhbHVlcy9zaGFwZS1vdXRzaWRlLXNoYXBlLWFyZ3VtZW50cy0wMDAuaHRtbAorKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L2Nzcy9jc3Mtc2hhcGVzL3NoYXBlLW91dHNpZGUvdmFsdWVzL3NoYXBlLW91dHNpZGUtc2hhcGUtYXJndW1lbnRzLTAwMC5odG1sCkBAIC0xMyw2ICsxMyw3IEBACiAgICAgICAgIDxzY3JpcHQgc3JjPSIvcmVzb3VyY2VzL3Rlc3RoYXJuZXNzLmpzIj48L3NjcmlwdD4KICAgICAgICAgPHNjcmlwdCBzcmM9Ii9yZXNvdXJjZXMvdGVzdGhhcm5lc3NyZXBvcnQuanMiPjwvc2NyaXB0PgogICAgICAgICA8c2NyaXB0IHNyYz0ic3VwcG9ydC9wYXJzaW5nLXV0aWxzLmpzIj48L3NjcmlwdD4KKyAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iL2ZvbnRzL2FoZW0uY3NzIiAvPgogICAgIDwvaGVhZD4KICAgICA8Ym9keT4KICAgICAgICAgPGRpdiBpZD0ibG9nIj48L2Rpdj4KQEAgLTIxLDYgKzIyLDcgQEAKICAgICAgICAgICAgIC8vIGZpeGVkIHVuaXRzOiBjbSwgbW0sIGluLCBweCwgcHQsIHBjCiAgICAgICAgICAgICAvLyBwZXJjZW50YWdlIHVuaXQ6ICUKICAgICAgICAgICAgIC8vIHplcm8gbGVuZ3RoOiAwCisgICAgICAgICAgICBzZXR1cCh7ZXhwbGljaXRfZG9uZTogdHJ1ZX0pOwogICAgICAgICAgICAgdmFyIGJhc2ljX3NoYXBlX2FyZ3NfdGVzdHMgPSBbCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiMC12YWx1ZWQiLApAQCAtNTMsMTAgKzU1LDE3IEBACiAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWRfY29tcHV0ZWQiOiAicG9seWdvbigxJSAyJSkiCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgXTsKKwogICAgICAgICAgICAgZ2VuZXJhdGVfdGVzdHMoIFBhcnNpbmdVdGlscy50ZXN0SW5saW5lU3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2luZ1V0aWxzLmJ1aWxkVGVzdENhc2VzKGJhc2ljX3NoYXBlX2FyZ3NfdGVzdHMsICJpbmxpbmUiKSApOwotICAgICAgICAgICAgZ2VuZXJhdGVfdGVzdHMoIFBhcnNpbmdVdGlscy50ZXN0Q29tcHV0ZWRTdHlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzaW5nVXRpbHMuYnVpbGRUZXN0Q2FzZXMoYmFzaWNfc2hhcGVfYXJnc190ZXN0cywgImNvbXB1dGVkIikgKTsKKyAgICAgICAgICAgIFBhcnNpbmdVdGlscy5zZXR1cEZvbnRzKCk7CisgICAgICAgICAgICBkb2N1bWVudC5mb250cy5yZWFkeS50aGVuKCgpPT4geworICAgICAgICAgICAgICAgIGdlbmVyYXRlX3Rlc3RzKCBQYXJzaW5nVXRpbHMudGVzdENvbXB1dGVkU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNpbmdVdGlscy5idWlsZFRlc3RDYXNlcyhiYXNpY19zaGFwZV9hcmdzX3Rlc3RzLCAiY29tcHV0ZWQiKSApOworICAgICAgICAgICAgICAgIFBhcnNpbmdVdGlscy5yZXN0b3JlRm9udHMoKTsKKyAgICAgICAgICAgICAgICBkb25lKCk7CisgICAgICAgICAgICB9KTsKKwogICAgICAgICA8L3NjcmlwdD4KICAgICA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L2Nzcy9jc3Mtc2hhcGVzL3NoYXBlLW91dHNpZGUvdmFsdWVzL3N1cHBvcnQvcGFyc2luZy11dGlscy5qcyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvY3NzL2Nzcy1zaGFwZXMvc2hhcGUtb3V0c2lkZS92YWx1ZXMvc3VwcG9ydC9wYXJzaW5nLXV0aWxzLmpzCmluZGV4IDExOGExMTQ1Li5hYmFkYmY3MCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC9jc3MvY3NzLXNoYXBlcy9zaGFwZS1vdXRzaWRlL3ZhbHVlcy9zdXBwb3J0L3BhcnNpbmctdXRpbHMuanMKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC9jc3MvY3NzLXNoYXBlcy9zaGFwZS1vdXRzaWRlL3ZhbHVlcy9zdXBwb3J0L3BhcnNpbmctdXRpbHMuanMKQEAgLTQ0NiwzMSArNDQ2LDMyIEBACiAgICAgfQogfQogCi1mdW5jdGlvbiBzZXR1cEZvbnRzKGZ1bmMpIHsKLSAgICByZXR1cm4gZnVuY3Rpb24gKCkgewotICAgICAgICB2YXIgZm9udFByb3BlcnRpZXMgPSB7Ci0gICAgICAgICAgICAnZm9udC1mYW1pbHknOiAnQWhlbScsCi0gICAgICAgICAgICAnZm9udC1zaXplJzogJzE2cHgnLAotICAgICAgICAgICAgJ2xpbmUtaGVpZ2h0JzogJzEnCi0gICAgICAgIH07Ci0gICAgICAgIHZhciBzYXZlZFZhbHVlcyA9IHsgfTsKLSAgICAgICAgZWFjaChmb250UHJvcGVydGllcywgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKLSAgICAgICAgICAgIHNhdmVkVmFsdWVzW2tleV0gPSBkb2N1bWVudC5ib2R5LnN0eWxlLmdldFByb3BlcnR5VmFsdWUoa2V5KTsKLSAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuc2V0UHJvcGVydHkoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIH0pOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgZWFjaChzYXZlZFZhbHVlcywgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5zZXRQcm9wZXJ0eShrZXksIHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUucmVtb3ZlUHJvcGVydHkoa2V5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQorLy8vIEZvciBzYXZpbmcgYW5kIHJlc3RvcmluZyBmb250IHByb3BlcnRpZXMKK3ZhciBzYXZlZEZvbnRWYWx1ZXMgPSB7IH07CisKK2Z1bmN0aW9uIHNldHVwRm9udHMoKSB7CisgICAgdmFyIGZvbnRQcm9wZXJ0aWVzID0geworICAgICAgICAnZm9udC1mYW1pbHknOiAnQWhlbScsCisgICAgICAgICdmb250LXNpemUnOiAnMTZweCcsCisgICAgICAgICdsaW5lLWhlaWdodCc6ICcxJwogICAgIH07CisgICAgc2F2ZWRGb250VmFsdWVzID0geyB9OworICAgIGVhY2goZm9udFByb3BlcnRpZXMsIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7CisgICAgICAgIHNhdmVkRm9udFZhbHVlc1trZXldID0gZG9jdW1lbnQuYm9keS5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKGtleSk7CisgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuc2V0UHJvcGVydHkoa2V5LCB2YWx1ZSk7CisgICAgfSk7Cit9CisKK2Z1bmN0aW9uIHJlc3RvcmVGb250cygpIHsKKyAgICBlYWNoKHNhdmVkRm9udFZhbHVlcywgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKKyAgICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnNldFByb3BlcnR5KGtleSwgdmFsdWUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5yZW1vdmVQcm9wZXJ0eShrZXkpOworICAgICAgICB9CisgICAgfSk7CisgICAgc2F2ZWRGb250VmFsdWVzID0geyB9OwogfQogCiB2YXIgdmFsaWRVbml0cyA9IFsKQEAgLTgxOSwxMSArODIwLDExIEBACiAKIHJldHVybiB7CiAgICAgdGVzdElubGluZVN0eWxlOiB0ZXN0SW5saW5lU3R5bGUsCi0gICAgdGVzdENvbXB1dGVkU3R5bGU6IHNldHVwRm9udHModGVzdENvbXB1dGVkU3R5bGUpLAorICAgIHRlc3RDb21wdXRlZFN0eWxlOiB0ZXN0Q29tcHV0ZWRTdHlsZSwKICAgICB0ZXN0U2hhcGVNYXJnaW5JbmxpbmVTdHlsZTogdGVzdFNoYXBlTWFyZ2luSW5saW5lU3R5bGUsCi0gICAgdGVzdFNoYXBlTWFyZ2luQ29tcHV0ZWRTdHlsZTogc2V0dXBGb250cyh0ZXN0U2hhcGVNYXJnaW5Db21wdXRlZFN0eWxlKSwKKyAgICB0ZXN0U2hhcGVNYXJnaW5Db21wdXRlZFN0eWxlOiB0ZXN0U2hhcGVNYXJnaW5Db21wdXRlZFN0eWxlLAogICAgIHRlc3RTaGFwZVRocmVzaG9sZElubGluZVN0eWxlOiB0ZXN0U2hhcGVUaHJlc2hvbGRJbmxpbmVTdHlsZSwKLSAgICB0ZXN0U2hhcGVUaHJlc2hvbGRDb21wdXRlZFN0eWxlOiBzZXR1cEZvbnRzKHRlc3RTaGFwZVRocmVzaG9sZENvbXB1dGVkU3R5bGUpLAorICAgIHRlc3RTaGFwZVRocmVzaG9sZENvbXB1dGVkU3R5bGU6IHRlc3RTaGFwZVRocmVzaG9sZENvbXB1dGVkU3R5bGUsCiAgICAgYnVpbGRUZXN0Q2FzZXM6IGJ1aWxkVGVzdENhc2VzLAogICAgIGJ1aWxkUmFkaWlUZXN0czogYnVpbGRSYWRpaVRlc3RzLAogICAgIGJ1aWxkUG9zaXRpb25UZXN0czogYnVpbGRQb3NpdGlvblRlc3RzLApAQCAtODM0LDYgKzgzNSw3IEBACiAgICAgdmFsaWRVbml0czogdmFsaWRVbml0cywKICAgICBjYWxjVGVzdFZhbHVlczogY2FsY1Rlc3RWYWx1ZXMsCiAgICAgcm91bmRSZXN1bHRTdHI6IHJvdW5kUmVzdWx0U3RyLAotICAgIHNldHVwRm9udHM6IHNldHVwRm9udHMKKyAgICBzZXR1cEZvbnRzOiBzZXR1cEZvbnRzLAorICAgIHJlc3RvcmVGb250czogcmVzdG9yZUZvbnRzLAogfQogfSkoKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvY3NzL2Nzc29tLXZpZXcvc2Nyb2xsSW50b1ZpZXctaG9yaXpvbnRhbC10Yi13cml0aW5nLW1vZGUtYW5kLXJ0bC1kaXJlY3Rpb24tZXhwZWN0ZWQudHh0IGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC9jc3MvY3Nzb20tdmlldy9zY3JvbGxJbnRvVmlldy1ob3Jpem9udGFsLXRiLXdyaXRpbmctbW9kZS1hbmQtcnRsLWRpcmVjdGlvbi1leHBlY3RlZC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YzY2N2M1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvY3NzL2Nzc29tLXZpZXcvc2Nyb2xsSW50b1ZpZXctaG9yaXpvbnRhbC10Yi13cml0aW5nLW1vZGUtYW5kLXJ0bC1kaXJlY3Rpb24tZXhwZWN0ZWQudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotVGhpcyBpcyBhIHRlc3RoYXJuZXNzLmpzLWJhc2VkIHRlc3QuCi1GQUlMIHNjcm9sbEludG9WaWV3KHsiYmxvY2siOiJzdGFydCIsImlubGluZSI6InN0YXJ0In0pIGFzc2VydF9hcHByb3hfZXF1YWxzOiBzY3JvbGxYIGV4cGVjdGVkIC0yMDAgKy8tIDAuNSBidXQgZ290IDExNQotRkFJTCBzY3JvbGxJbnRvVmlldyh7ImJsb2NrIjoic3RhcnQiLCJpbmxpbmUiOiJjZW50ZXIifSkgYXNzZXJ0X2FwcHJveF9lcXVhbHM6IHNjcm9sbFggZXhwZWN0ZWQgLTE1Ny41ICsvLSAwLjUgYnV0IGdvdCAxNTcKLUZBSUwgc2Nyb2xsSW50b1ZpZXcoeyJibG9jayI6InN0YXJ0IiwiaW5saW5lIjoiZW5kIn0pIGFzc2VydF9hcHByb3hfZXF1YWxzOiBzY3JvbGxYIGV4cGVjdGVkIC0xMTUgKy8tIDAuNSBidXQgZ290IDIwMAotRkFJTCBzY3JvbGxJbnRvVmlldyh7ImJsb2NrIjoiY2VudGVyIiwiaW5saW5lIjoic3RhcnQifSkgYXNzZXJ0X2FwcHJveF9lcXVhbHM6IHNjcm9sbFggZXhwZWN0ZWQgLTIwMCArLy0gMC41IGJ1dCBnb3QgMTE1Ci1GQUlMIHNjcm9sbEludG9WaWV3KHsiYmxvY2siOiJjZW50ZXIiLCJpbmxpbmUiOiJjZW50ZXIifSkgYXNzZXJ0X2FwcHJveF9lcXVhbHM6IHNjcm9sbFggZXhwZWN0ZWQgLTE1Ny41ICsvLSAwLjUgYnV0IGdvdCAxNTcKLUZBSUwgc2Nyb2xsSW50b1ZpZXcoeyJibG9jayI6ImNlbnRlciIsImlubGluZSI6ImVuZCJ9KSBhc3NlcnRfYXBwcm94X2VxdWFsczogc2Nyb2xsWCBleHBlY3RlZCAtMTE1ICsvLSAwLjUgYnV0IGdvdCAyMDAKLUZBSUwgc2Nyb2xsSW50b1ZpZXcoeyJibG9jayI6ImVuZCIsImlubGluZSI6InN0YXJ0In0pIGFzc2VydF9hcHByb3hfZXF1YWxzOiBzY3JvbGxYIGV4cGVjdGVkIC0yMDAgKy8tIDAuNSBidXQgZ290IDExNQotRkFJTCBzY3JvbGxJbnRvVmlldyh7ImJsb2NrIjoiZW5kIiwiaW5saW5lIjoiY2VudGVyIn0pIGFzc2VydF9hcHByb3hfZXF1YWxzOiBzY3JvbGxYIGV4cGVjdGVkIC0xNTcuNSArLy0gMC41IGJ1dCBnb3QgMTU3Ci1GQUlMIHNjcm9sbEludG9WaWV3KHsiYmxvY2siOiJlbmQiLCJpbmxpbmUiOiJlbmQifSkgYXNzZXJ0X2FwcHJveF9lcXVhbHM6IHNjcm9sbFggZXhwZWN0ZWQgLTExNSArLy0gMC41IGJ1dCBnb3QgMjAwCi1IYXJuZXNzOiB0aGUgdGVzdCByYW4gdG8gY29tcGxldGlvbi4KLQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC9jc3MvY3Nzb20tdmlldy9zY3JvbGxJbnRvVmlldy1zaWRld2F5cy1sci13cml0aW5nLW1vZGUtYW5kLXJ0bC1kaXJlY3Rpb24tZXhwZWN0ZWQudHh0IGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC9jc3MvY3Nzb20tdmlldy9zY3JvbGxJbnRvVmlldy1zaWRld2F5cy1sci13cml0aW5nLW1vZGUtYW5kLXJ0bC1kaXJlY3Rpb24tZXhwZWN0ZWQudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWQyYmFhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvY3NzL2Nzc29tLXZpZXcvc2Nyb2xsSW50b1ZpZXctc2lkZXdheXMtbHItd3JpdGluZy1tb2RlLWFuZC1ydGwtZGlyZWN0aW9uLWV4cGVjdGVkLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLVRoaXMgaXMgYSB0ZXN0aGFybmVzcy5qcy1iYXNlZCB0ZXN0LgotRkFJTCBzY3JvbGxJbnRvVmlldyh7ImJsb2NrIjoic3RhcnQiLCJpbmxpbmUiOiJzdGFydCJ9KSBhc3NlcnRfYXBwcm94X2VxdWFsczogc2Nyb2xsWCBleHBlY3RlZCAyMDAgKy8tIDAuNSBidXQgZ290IDExNQotRkFJTCBzY3JvbGxJbnRvVmlldyh7ImJsb2NrIjoic3RhcnQiLCJpbmxpbmUiOiJjZW50ZXIifSkgYXNzZXJ0X2FwcHJveF9lcXVhbHM6IHNjcm9sbFggZXhwZWN0ZWQgMjAwICsvLSAwLjUgYnV0IGdvdCAxNTcKLUZBSUwgc2Nyb2xsSW50b1ZpZXcoeyJibG9jayI6InN0YXJ0IiwiaW5saW5lIjoiZW5kIn0pIGFzc2VydF9hcHByb3hfZXF1YWxzOiBzY3JvbGxZIGV4cGVjdGVkIDExNSArLy0gMC41IGJ1dCBnb3QgMjAwCi1GQUlMIHNjcm9sbEludG9WaWV3KHsiYmxvY2siOiJjZW50ZXIiLCJpbmxpbmUiOiJzdGFydCJ9KSBhc3NlcnRfYXBwcm94X2VxdWFsczogc2Nyb2xsWCBleHBlY3RlZCAxNTcuNSArLy0gMC41IGJ1dCBnb3QgMTE1Ci1QQVNTIHNjcm9sbEludG9WaWV3KHsiYmxvY2siOiJjZW50ZXIiLCJpbmxpbmUiOiJjZW50ZXIifSkKLUZBSUwgc2Nyb2xsSW50b1ZpZXcoeyJibG9jayI6ImNlbnRlciIsImlubGluZSI6ImVuZCJ9KSBhc3NlcnRfYXBwcm94X2VxdWFsczogc2Nyb2xsWCBleHBlY3RlZCAxNTcuNSArLy0gMC41IGJ1dCBnb3QgMjAwCi1GQUlMIHNjcm9sbEludG9WaWV3KHsiYmxvY2siOiJlbmQiLCJpbmxpbmUiOiJzdGFydCJ9KSBhc3NlcnRfYXBwcm94X2VxdWFsczogc2Nyb2xsWSBleHBlY3RlZCAyMDAgKy8tIDAuNSBidXQgZ290IDExNQotRkFJTCBzY3JvbGxJbnRvVmlldyh7ImJsb2NrIjoiZW5kIiwiaW5saW5lIjoiY2VudGVyIn0pIGFzc2VydF9hcHByb3hfZXF1YWxzOiBzY3JvbGxYIGV4cGVjdGVkIDExNSArLy0gMC41IGJ1dCBnb3QgMTU3Ci1GQUlMIHNjcm9sbEludG9WaWV3KHsiYmxvY2siOiJlbmQiLCJpbmxpbmUiOiJlbmQifSkgYXNzZXJ0X2FwcHJveF9lcXVhbHM6IHNjcm9sbFggZXhwZWN0ZWQgMTE1ICsvLSAwLjUgYnV0IGdvdCAyMDAKLUhhcm5lc3M6IHRoZSB0ZXN0IHJhbiB0byBjb21wbGV0aW9uLgotCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L2Nzcy9jc3NvbS12aWV3L3Njcm9sbEludG9WaWV3LXNpZGV3YXlzLXJsLXdyaXRpbmctbW9kZS1hbmQtcnRsLWRpcmVjdGlvbi1leHBlY3RlZC50eHQgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L2Nzcy9jc3NvbS12aWV3L3Njcm9sbEludG9WaWV3LXNpZGV3YXlzLXJsLXdyaXRpbmctbW9kZS1hbmQtcnRsLWRpcmVjdGlvbi1leHBlY3RlZC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMGExNzUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC9jc3MvY3Nzb20tdmlldy9zY3JvbGxJbnRvVmlldy1zaWRld2F5cy1ybC13cml0aW5nLW1vZGUtYW5kLXJ0bC1kaXJlY3Rpb24tZXhwZWN0ZWQudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotVGhpcyBpcyBhIHRlc3RoYXJuZXNzLmpzLWJhc2VkIHRlc3QuCi1GQUlMIHNjcm9sbEludG9WaWV3KHsiYmxvY2siOiJzdGFydCIsImlubGluZSI6InN0YXJ0In0pIGFzc2VydF9hcHByb3hfZXF1YWxzOiBzY3JvbGxYIGV4cGVjdGVkIC0yMDAgKy8tIDAuNSBidXQgZ290IDExNQotRkFJTCBzY3JvbGxJbnRvVmlldyh7ImJsb2NrIjoic3RhcnQiLCJpbmxpbmUiOiJjZW50ZXIifSkgYXNzZXJ0X2FwcHJveF9lcXVhbHM6IHNjcm9sbFggZXhwZWN0ZWQgLTIwMCArLy0gMC41IGJ1dCBnb3QgMTU3Ci1GQUlMIHNjcm9sbEludG9WaWV3KHsiYmxvY2siOiJzdGFydCIsImlubGluZSI6ImVuZCJ9KSBhc3NlcnRfYXBwcm94X2VxdWFsczogc2Nyb2xsWCBleHBlY3RlZCAtMjAwICsvLSAwLjUgYnV0IGdvdCAyMDAKLUZBSUwgc2Nyb2xsSW50b1ZpZXcoeyJibG9jayI6ImNlbnRlciIsImlubGluZSI6InN0YXJ0In0pIGFzc2VydF9hcHByb3hfZXF1YWxzOiBzY3JvbGxYIGV4cGVjdGVkIC0xNTcuNSArLy0gMC41IGJ1dCBnb3QgMTE1Ci1GQUlMIHNjcm9sbEludG9WaWV3KHsiYmxvY2siOiJjZW50ZXIiLCJpbmxpbmUiOiJjZW50ZXIifSkgYXNzZXJ0X2FwcHJveF9lcXVhbHM6IHNjcm9sbFggZXhwZWN0ZWQgLTE1Ny41ICsvLSAwLjUgYnV0IGdvdCAxNTcKLUZBSUwgc2Nyb2xsSW50b1ZpZXcoeyJibG9jayI6ImNlbnRlciIsImlubGluZSI6ImVuZCJ9KSBhc3NlcnRfYXBwcm94X2VxdWFsczogc2Nyb2xsWCBleHBlY3RlZCAtMTU3LjUgKy8tIDAuNSBidXQgZ290IDIwMAotRkFJTCBzY3JvbGxJbnRvVmlldyh7ImJsb2NrIjoiZW5kIiwiaW5saW5lIjoic3RhcnQifSkgYXNzZXJ0X2FwcHJveF9lcXVhbHM6IHNjcm9sbFggZXhwZWN0ZWQgLTExNSArLy0gMC41IGJ1dCBnb3QgMTE1Ci1GQUlMIHNjcm9sbEludG9WaWV3KHsiYmxvY2siOiJlbmQiLCJpbmxpbmUiOiJjZW50ZXIifSkgYXNzZXJ0X2FwcHJveF9lcXVhbHM6IHNjcm9sbFggZXhwZWN0ZWQgLTExNSArLy0gMC41IGJ1dCBnb3QgMTU3Ci1GQUlMIHNjcm9sbEludG9WaWV3KHsiYmxvY2siOiJlbmQiLCJpbmxpbmUiOiJlbmQifSkgYXNzZXJ0X2FwcHJveF9lcXVhbHM6IHNjcm9sbFggZXhwZWN0ZWQgLTExNSArLy0gMC41IGJ1dCBnb3QgMjAwCi1IYXJuZXNzOiB0aGUgdGVzdCByYW4gdG8gY29tcGxldGlvbi4KLQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC9jc3MvY3Nzb20tdmlldy9zY3JvbGxJbnRvVmlldy12ZXJ0aWNhbC1sci13cml0aW5nLW1vZGUtYW5kLXJ0bC1kaXJlY3Rpb24tZXhwZWN0ZWQudHh0IGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC9jc3MvY3Nzb20tdmlldy9zY3JvbGxJbnRvVmlldy12ZXJ0aWNhbC1sci13cml0aW5nLW1vZGUtYW5kLXJ0bC1kaXJlY3Rpb24tZXhwZWN0ZWQudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzQxMTVjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvY3NzL2Nzc29tLXZpZXcvc2Nyb2xsSW50b1ZpZXctdmVydGljYWwtbHItd3JpdGluZy1tb2RlLWFuZC1ydGwtZGlyZWN0aW9uLWV4cGVjdGVkLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLVRoaXMgaXMgYSB0ZXN0aGFybmVzcy5qcy1iYXNlZCB0ZXN0LgotRkFJTCBzY3JvbGxJbnRvVmlldyh7ImJsb2NrIjoic3RhcnQiLCJpbmxpbmUiOiJzdGFydCJ9KSBhc3NlcnRfYXBwcm94X2VxdWFsczogc2Nyb2xsWSBleHBlY3RlZCAtMjAwICsvLSAwLjUgYnV0IGdvdCAxMTUKLUZBSUwgc2Nyb2xsSW50b1ZpZXcoeyJibG9jayI6InN0YXJ0IiwiaW5saW5lIjoiY2VudGVyIn0pIGFzc2VydF9hcHByb3hfZXF1YWxzOiBzY3JvbGxZIGV4cGVjdGVkIC0xNTcuNSArLy0gMC41IGJ1dCBnb3QgMTU3Ci1GQUlMIHNjcm9sbEludG9WaWV3KHsiYmxvY2siOiJzdGFydCIsImlubGluZSI6ImVuZCJ9KSBhc3NlcnRfYXBwcm94X2VxdWFsczogc2Nyb2xsWSBleHBlY3RlZCAtMTE1ICsvLSAwLjUgYnV0IGdvdCAyMDAKLUZBSUwgc2Nyb2xsSW50b1ZpZXcoeyJibG9jayI6ImNlbnRlciIsImlubGluZSI6InN0YXJ0In0pIGFzc2VydF9hcHByb3hfZXF1YWxzOiBzY3JvbGxZIGV4cGVjdGVkIC0yMDAgKy8tIDAuNSBidXQgZ290IDExNQotRkFJTCBzY3JvbGxJbnRvVmlldyh7ImJsb2NrIjoiY2VudGVyIiwiaW5saW5lIjoiY2VudGVyIn0pIGFzc2VydF9hcHByb3hfZXF1YWxzOiBzY3JvbGxZIGV4cGVjdGVkIC0xNTcuNSArLy0gMC41IGJ1dCBnb3QgMTU3Ci1GQUlMIHNjcm9sbEludG9WaWV3KHsiYmxvY2siOiJjZW50ZXIiLCJpbmxpbmUiOiJlbmQifSkgYXNzZXJ0X2FwcHJveF9lcXVhbHM6IHNjcm9sbFkgZXhwZWN0ZWQgLTExNSArLy0gMC41IGJ1dCBnb3QgMjAwCi1GQUlMIHNjcm9sbEludG9WaWV3KHsiYmxvY2siOiJlbmQiLCJpbmxpbmUiOiJzdGFydCJ9KSBhc3NlcnRfYXBwcm94X2VxdWFsczogc2Nyb2xsWSBleHBlY3RlZCAtMjAwICsvLSAwLjUgYnV0IGdvdCAxMTUKLUZBSUwgc2Nyb2xsSW50b1ZpZXcoeyJibG9jayI6ImVuZCIsImlubGluZSI6ImNlbnRlciJ9KSBhc3NlcnRfYXBwcm94X2VxdWFsczogc2Nyb2xsWSBleHBlY3RlZCAtMTU3LjUgKy8tIDAuNSBidXQgZ290IDE1NwotRkFJTCBzY3JvbGxJbnRvVmlldyh7ImJsb2NrIjoiZW5kIiwiaW5saW5lIjoiZW5kIn0pIGFzc2VydF9hcHByb3hfZXF1YWxzOiBzY3JvbGxZIGV4cGVjdGVkIC0xMTUgKy8tIDAuNSBidXQgZ290IDIwMAotSGFybmVzczogdGhlIHRlc3QgcmFuIHRvIGNvbXBsZXRpb24uCi0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvY3NzL2Nzc29tLXZpZXcvc2Nyb2xsSW50b1ZpZXctdmVydGljYWwtcmwtd3JpdGluZy1tb2RlLmh0bWwgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L2Nzcy9jc3NvbS12aWV3L3Njcm9sbEludG9WaWV3LXZlcnRpY2FsLXJsLXdyaXRpbmctbW9kZS5odG1sCmluZGV4IGNlYzI3ZjQuLmRjNWYzZTIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvY3NzL2Nzc29tLXZpZXcvc2Nyb2xsSW50b1ZpZXctdmVydGljYWwtcmwtd3JpdGluZy1tb2RlLmh0bWwKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC9jc3MvY3Nzb20tdmlldy9zY3JvbGxJbnRvVmlldy12ZXJ0aWNhbC1ybC13cml0aW5nLW1vZGUuaHRtbApAQCAtOTIsMjAgKzkyLDYgQEAKICAgaW5saW5lRW5kOiAoKDIqYm94X2hlaWdodCkgLSBzY3JvbGxlcl9oZWlnaHQpICsgc2Nyb2xsYmFyX3dpZHRoLAogfTsKIAotLy8gQXMgYnJvd3NlcnMgZGlmZmVyIGluIHRoZSBtZWFuaW5nIG9mIHNjcm9sbExlZnQgd2hlbgotLy8gaW4gYSByaWdodC10by1sZWZ0IG1vZGUsIHdlIGFkanVzdCB0aGUgZXhwZWN0YXRpb24KLS8vIHRvIG1hdGNoIHRoZSBzZW1hbnRpY3Mgb2Ygc2Nyb2xsTGVmdC4KLS8vIEluIHZlcnRpY2FsLXJsIG1vZGUsIHRoZSBzY3JvbGwgeCBjb29yZGluYXRlIHNob3VsZCBiZSBub25wb3NpdGl2ZSBwZXIgdGhlIHRoZSBzcGVjLgotLy8gQnV0IHNvbWUgYnJvd3NlcnMgaXMgbm9ubmVnYXRpdmUsIHNvIHdlIGFkanVzdCB0aGUgZXhwZWN0YXRpb24uCi1zY3JvbGxlci5zY3JvbGxMZWZ0ID0gLTEwMDA7Ci1pZihzY3JvbGxlci5zY3JvbGxMZWZ0ID09PSAwKSB7Ci0gIGV4cGVjdGVkWCA9IHsKLSAgICBibG9ja1N0YXJ0OiAoKDIqYm94X3dpZHRoKSAtIHNjcm9sbGVyX3dpZHRoKSArIHNjcm9sbGJhcl93aWR0aCwKLSAgICBibG9ja0NlbnRlcjogKCgzKmJveF93aWR0aCAtIHNjcm9sbGVyX3dpZHRoKS8yKSArIChzY3JvbGxiYXJfd2lkdGgvMiksCi0gICAgYmxvY2tFbmQ6IGJveF93aWR0aCwKLSAgfTsKLX0KLQogWwogICBbe2Jsb2NrOiAic3RhcnQiLCBpbmxpbmU6ICJzdGFydCJ9LCBleHBlY3RlZFguYmxvY2tTdGFydCwgZXhwZWN0ZWRZLmlubGluZVN0YXJ0XSwKICAgW3tibG9jazogInN0YXJ0IiwgaW5saW5lOiAiY2VudGVyIn0sIGV4cGVjdGVkWC5ibG9ja1N0YXJ0LCBleHBlY3RlZFkuaW5saW5lQ2VudGVyXSwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvY3NzL2Nzc29tLXZpZXcvc2Nyb2xsTGVmdFRvcC1leHBlY3RlZC50eHQgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L2Nzcy9jc3NvbS12aWV3L3Njcm9sbExlZnRUb3AtZXhwZWN0ZWQudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGVjZDk1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvY3NzL2Nzc29tLXZpZXcvc2Nyb2xsTGVmdFRvcC1leHBlY3RlZC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLVRoaXMgaXMgYSB0ZXN0aGFybmVzcy5qcy1iYXNlZCB0ZXN0LgotUEFTUyB3cml0aW5nLW1vZGU6aG9yaXpvbnRhbC10YjsgZGlyZWN0aW9uOmx0cgotRkFJTCB3cml0aW5nLW1vZGU6aG9yaXpvbnRhbC10YjsgZGlyZWN0aW9uOnJ0bCBhc3NlcnRfYXBwcm94X2VxdWFsczogaW5pdGlhbCBzY3JvbGxMZWZ0IGV4cGVjdGVkIDAgKy8tIDAuNSBidXQgZ290IDE2NQotUEFTUyB3cml0aW5nLW1vZGU6dmVydGljYWwtbHI7IGRpcmVjdGlvbjpsdHIKLUZBSUwgd3JpdGluZy1tb2RlOnZlcnRpY2FsLWxyOyBkaXJlY3Rpb246cnRsIGFzc2VydF9hcHByb3hfZXF1YWxzOiBpbml0aWFsIHNjcm9sbFRvcCBleHBlY3RlZCAwICsvLSAwLjUgYnV0IGdvdCAzMTUKLUZBSUwgd3JpdGluZy1tb2RlOnZlcnRpY2FsLXJsOyBkaXJlY3Rpb246bHRyIGFzc2VydF9hcHByb3hfZXF1YWxzOiBpbml0aWFsIHNjcm9sbExlZnQgZXhwZWN0ZWQgMCArLy0gMC41IGJ1dCBnb3QgMTY1Ci1GQUlMIHdyaXRpbmctbW9kZTp2ZXJ0aWNhbC1ybDsgZGlyZWN0aW9uOnJ0bCBhc3NlcnRfYXBwcm94X2VxdWFsczogaW5pdGlhbCBzY3JvbGxMZWZ0IGV4cGVjdGVkIDAgKy8tIDAuNSBidXQgZ290IDE2NQotSGFybmVzczogdGhlIHRlc3QgcmFuIHRvIGNvbXBsZXRpb24uCi0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvaHItdGltZS9NRVRBLnltbCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvaHItdGltZS9NRVRBLnltbAppbmRleCAyYmUzNTQ5Li43NzlkNWI0IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L2hyLXRpbWUvTUVUQS55bWwKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC9oci10aW1lL01FVEEueW1sCkBAIC0yLDQgKzIsMyBAQAogc3VnZ2VzdGVkX3Jldmlld2VyczoKICAgLSBwbGVoZWdhcgogICAtIGlncmlnb3JpawotICAtIHRvZGRyZWlmc3RlY2sKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvaW5mcmFzdHJ1Y3R1cmUvbWV0YWRhdGEvaW5mcmFzdHJ1Y3R1cmUvdGVzdGRyaXZlci9hY3Rpb25zL19fZGlyX18uaW5pIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC9pbmZyYXN0cnVjdHVyZS9tZXRhZGF0YS9pbmZyYXN0cnVjdHVyZS90ZXN0ZHJpdmVyL2FjdGlvbnMvX19kaXJfXy5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYWMwYjUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC9pbmZyYXN0cnVjdHVyZS9tZXRhZGF0YS9pbmZyYXN0cnVjdHVyZS90ZXN0ZHJpdmVyL2FjdGlvbnMvX19kaXJfXy5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWRpc2FibGVkOgotICBpZiBwcm9kdWN0ID09ICJjaHJvbWUiIGFuZCBvcyA9PSAibWFjIjogaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9tZWRyaXZlci9pc3N1ZXMvZGV0YWlsP2lkPTMxMTQKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvbmF2aWdhdGlvbi10aW1pbmcvTUVUQS55bWwgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L25hdmlnYXRpb24tdGltaW5nL01FVEEueW1sCmluZGV4IGMwOWE2ZTAuLmJmYjBlMGYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvbmF2aWdhdGlvbi10aW1pbmcvTUVUQS55bWwKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC9uYXZpZ2F0aW9uLXRpbWluZy9NRVRBLnltbApAQCAtMiw1ICsyLDQgQEAKIHN1Z2dlc3RlZF9yZXZpZXdlcnM6CiAgIC0gcGxlaGVnYXIKICAgLSBpZ3JpZ29yaWsKLSAgLSB0b2RkcmVpZnN0ZWNrCiAgIC0geW9hdndlaXNzCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L3BhZ2UtdmlzaWJpbGl0eS9NRVRBLnltbCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvcGFnZS12aXNpYmlsaXR5L01FVEEueW1sCmluZGV4IDUwOTkzNmMuLjliOWFlYTggMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvcGFnZS12aXNpYmlsaXR5L01FVEEueW1sCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvcGFnZS12aXNpYmlsaXR5L01FVEEueW1sCkBAIC0yLDQgKzIsMyBAQAogc3VnZ2VzdGVkX3Jldmlld2VyczoKICAgLSBwbGVoZWdhcgogICAtIGlncmlnb3JpawotICAtIHRvZGRyZWlmc3RlY2sKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvcGVyZm9ybWFuY2UtdGltZWxpbmUvTUVUQS55bWwgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L3BlcmZvcm1hbmNlLXRpbWVsaW5lL01FVEEueW1sCmluZGV4IDQ2ZjE2YWU1Li44OWZhZTFkIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L3BlcmZvcm1hbmNlLXRpbWVsaW5lL01FVEEueW1sCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvcGVyZm9ybWFuY2UtdGltZWxpbmUvTUVUQS55bWwKQEAgLTIsNCArMiwzIEBACiBzdWdnZXN0ZWRfcmV2aWV3ZXJzOgogICAtIHBsZWhlZ2FyCiAgIC0gaWdyaWdvcmlrCi0gIC0gdG9kZHJlaWZzdGVjawpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC9yZXNvdXJjZS10aW1pbmcvTUVUQS55bWwgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L3Jlc291cmNlLXRpbWluZy9NRVRBLnltbAppbmRleCA3NjE3Njk3MC4uNjYyYzQyY2IgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvcmVzb3VyY2UtdGltaW5nL01FVEEueW1sCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvcmVzb3VyY2UtdGltaW5nL01FVEEueW1sCkBAIC0zLDUgKzMsNCBAQAogICAtIHBsZWhlZ2FyCiAgIC0genF6aGFuZwogICAtIGlncmlnb3JpawotICAtIHRvZGRyZWlmc3RlY2sKICAgLSB5b2F2d2Vpc3MKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvc2Nyb2xsLWFuaW1hdGlvbnMvY3VycmVudC10aW1lLXdyaXRpbmctbW9kZXMuaHRtbCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvc2Nyb2xsLWFuaW1hdGlvbnMvY3VycmVudC10aW1lLXdyaXRpbmctbW9kZXMuaHRtbAppbmRleCA4OWI3OGZjLi4wODNjNGNmIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L3Njcm9sbC1hbmltYXRpb25zL2N1cnJlbnQtdGltZS13cml0aW5nLW1vZGVzLmh0bWwKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC9zY3JvbGwtYW5pbWF0aW9ucy9jdXJyZW50LXRpbWUtd3JpdGluZy1tb2Rlcy5odG1sCkBAIC01MSw3ICs1MSw3IEBACiAgIC8vIFRoZSBvZmZzZXQgaW4gdGhlIGlubGluZS9ob3Jpem9udGFsIGRpcmVjdGlvbiBzaG91bGQgYmUgaW52ZXJ0ZWQuIFRoZQogICAvLyBibG9jay92ZXJ0aWNhbCBkaXJlY3Rpb24gc2hvdWxkIGJlIHVuYWZmZWN0ZWQuCiAgIHNjcm9sbGVyLnNjcm9sbFRvcCA9IDUwOwotICBzY3JvbGxlci5zY3JvbGxMZWZ0ID0gNzU7CisgIHNjcm9sbGVyLnNjcm9sbExlZnQgPSA3NSAtIHNjcm9sbGVyU2l6ZTsKIAogICBhc3NlcnRfZXF1YWxzKGJsb2NrU2Nyb2xsVGltZWxpbmUuY3VycmVudFRpbWUsIDUwLCAnU2Nyb2xsZWQgYmxvY2sgdGltZWxpbmUnKTsKICAgYXNzZXJ0X2VxdWFscygKQEAgLTEwNSw3ICsxMDUsNyBAQAogICAvLyBob3Jpem9udGFsL3ZlcnRpY2FsIGNhc2VzLCBob3Jpem9udGFsIHN0YXJ0cyBvbiB0aGUgcmlnaHQtaGFuZC1zaWRlIGFuZAogICAvLyB2ZXJ0aWNhbCBpcyBub3JtYWwuCiAgIHNjcm9sbGVyLnNjcm9sbFRvcCA9IDUwOwotICBzY3JvbGxlci5zY3JvbGxMZWZ0ID0gNzU7CisgIHNjcm9sbGVyLnNjcm9sbExlZnQgPSA3NSAtIHNjcm9sbGVyU2l6ZTsKIAogICBhc3NlcnRfZXF1YWxzKAogICAgICAgYmxvY2tTY3JvbGxUaW1lbGluZS5jdXJyZW50VGltZSwgc2Nyb2xsZXJTaXplIC0gNzUsCkBAIC0yMDcsMzYgKzIwNywzNiBAQAogICBhc3NlcnRfZXF1YWxzKAogICAgICAgY2FsY1Njcm9sbFRpbWVsaW5lLmN1cnJlbnRUaW1lLCBudWxsLCAnVW5zY3JvbGxlZCBjYWxjLWJhc2VkIHRpbWVsaW5lJyk7CiAKLSAgLy8gV2l0aCBkaXJlY3Rpb24gcnRsIG9mZnNldHMgYXJlIGludmVydGVkLCBzdWNoIHRoYXQgc2Nyb2xsTGVmdCA9PQotICAvLyBzY3JvbGxlclNpemUgaXMgdGhlICd6ZXJvJyBwb2ludCBmb3IgY3VycmVudFRpbWUuIEhvd2V2ZXIgdGhlCisgIC8vIFdpdGggZGlyZWN0aW9uIHJ0bCBvZmZzZXRzIGFyZSBpbnZlcnRlZCwgc3VjaCB0aGF0IHNjcm9sbExlZnQgPT0gMAorICAvLyBpcyB0aGUgJ3plcm8nIHBvaW50IGZvciBjdXJyZW50VGltZS4gSG93ZXZlciB0aGUKICAgLy8gc3RhcnRTY3JvbGxPZmZzZXQgaXMgYW4gYWJzb2x1dGUgZGlzdGFuY2UgYWxvbmcgdGhlIG9mZnNldCwgc28gZG9lc24ndAogICAvLyBuZWVkIGFkanVzdGluZy4KIAogICAvLyBDaGVjayB0aGUgbGVuZ3RoLWJhc2VkIFNjcm9sbFRpbWVsaW5lLgotICBzY3JvbGxlci5zY3JvbGxMZWZ0ID0gc2Nyb2xsZXJTaXplOworICBzY3JvbGxlci5zY3JvbGxMZWZ0ID0gMDsKICAgYXNzZXJ0X2VxdWFscygKICAgICAgIGxlbmd0aFNjcm9sbFRpbWVsaW5lLmN1cnJlbnRUaW1lLCBudWxsLAogICAgICAgJ0xlbmd0aC1iYXNlZCB0aW1lbGluZSBiZWZvcmUgdGhlIHN0YXJ0U2Nyb2xsT2Zmc2V0IHBvaW50Jyk7Ci0gIHNjcm9sbGVyLnNjcm9sbExlZnQgPSBzY3JvbGxlclNpemUgLSAyMDsKKyAgc2Nyb2xsZXIuc2Nyb2xsTGVmdCA9IC0yMDsKICAgYXNzZXJ0X2VxdWFscygKICAgICAgIGxlbmd0aFNjcm9sbFRpbWVsaW5lLmN1cnJlbnRUaW1lLCAwLAogICAgICAgJ0xlbmd0aC1iYXNlZCB0aW1lbGluZSBhdCB0aGUgc3RhcnRTY3JvbGxPZmZzZXQgcG9pbnQnKTsKLSAgc2Nyb2xsZXIuc2Nyb2xsTGVmdCA9IHNjcm9sbGVyU2l6ZSAtIDUwOworICBzY3JvbGxlci5zY3JvbGxMZWZ0ID0gLTUwOwogICBhc3NlcnRfZXF1YWxzKAogICAgICAgbGVuZ3RoU2Nyb2xsVGltZWxpbmUuY3VycmVudFRpbWUsCiAgICAgICBjYWxjdWxhdGVDdXJyZW50VGltZSg1MCwgMjAsIHNjcm9sbGVyU2l6ZSwgc2Nyb2xsZXJTaXplKSwKICAgICAgICdMZW5ndGgtYmFzZWQgdGltZWxpbmUgYWZ0ZXIgdGhlIHN0YXJ0U2Nyb2xsT2Zmc2V0IHBvaW50Jyk7CiAKICAgLy8gQ2hlY2sgdGhlIHBlcmNlbnRhZ2UtYmFzZWQgU2Nyb2xsVGltZWxpbmUuCi0gIHNjcm9sbGVyLnNjcm9sbExlZnQgPSBzY3JvbGxlclNpemUgLSAoMC4xOSAqIHNjcm9sbGVyU2l6ZSk7CisgIHNjcm9sbGVyLnNjcm9sbExlZnQgPSAtKDAuMTkgKiBzY3JvbGxlclNpemUpOwogICBhc3NlcnRfZXF1YWxzKAogICAgICAgcGVyY2VudGFnZVNjcm9sbFRpbWVsaW5lLmN1cnJlbnRUaW1lLCBudWxsLAogICAgICAgJ1BlcmNlbnRhZ2UtYmFzZWQgdGltZWxpbmUgYmVmb3JlIHRoZSBzdGFydFNjcm9sbE9mZnNldCBwb2ludCcpOwotICBzY3JvbGxlci5zY3JvbGxMZWZ0ID0gc2Nyb2xsZXJTaXplIC0gKDAuMjAgKiBzY3JvbGxlclNpemUpOworICBzY3JvbGxlci5zY3JvbGxMZWZ0ID0gLSgwLjIwICogc2Nyb2xsZXJTaXplKTsKICAgYXNzZXJ0X2VxdWFscygKICAgICAgIHBlcmNlbnRhZ2VTY3JvbGxUaW1lbGluZS5jdXJyZW50VGltZSwgMCwKICAgICAgICdQZXJjZW50YWdlLWJhc2VkIHRpbWVsaW5lIGF0IHRoZSBzdGFydFNjcm9sbE9mZnNldCBwb2ludCcpOwotICBzY3JvbGxlci5zY3JvbGxMZWZ0ID0gc2Nyb2xsZXJTaXplIC0gKDAuNCAqIHNjcm9sbGVyU2l6ZSk7CisgIHNjcm9sbGVyLnNjcm9sbExlZnQgPSAtKDAuNCAqIHNjcm9sbGVyU2l6ZSk7CiAgIGFzc2VydF9lcXVhbHMoCiAgICAgICBwZXJjZW50YWdlU2Nyb2xsVGltZWxpbmUuY3VycmVudFRpbWUsCiAgICAgICBjYWxjdWxhdGVDdXJyZW50VGltZSgKQEAgLTI0NCwxNSArMjQ0LDE1IEBACiAgICAgICAnUGVyY2VudGFnZS1iYXNlZCB0aW1lbGluZSBhZnRlciB0aGUgc3RhcnRTY3JvbGxPZmZzZXQgcG9pbnQnKTsKIAogICAvLyBDaGVjayB0aGUgY2FsYy1iYXNlZCBTY3JvbGxUaW1lbGluZS4KLSAgc2Nyb2xsZXIuc2Nyb2xsTGVmdCA9IHNjcm9sbGVyU2l6ZSAtICgwLjIgKiBzY3JvbGxlclNpemUgLSAxMCk7CisgIHNjcm9sbGVyLnNjcm9sbExlZnQgPSAtKDAuMiAqIHNjcm9sbGVyU2l6ZSAtIDEwKTsKICAgYXNzZXJ0X2VxdWFscygKICAgICAgIGNhbGNTY3JvbGxUaW1lbGluZS5jdXJyZW50VGltZSwgbnVsbCwKICAgICAgICdDYWxjLWJhc2VkIHRpbWVsaW5lIGJlZm9yZSB0aGUgc3RhcnRTY3JvbGxPZmZzZXQgcG9pbnQnKTsKLSAgc2Nyb2xsZXIuc2Nyb2xsTGVmdCA9IHNjcm9sbGVyU2l6ZSAtICgwLjIgKiBzY3JvbGxlclNpemUgLSA1KTsKKyAgc2Nyb2xsZXIuc2Nyb2xsTGVmdCA9IC0oMC4yICogc2Nyb2xsZXJTaXplIC0gNSk7CiAgIGFzc2VydF9lcXVhbHMoCiAgICAgICBjYWxjU2Nyb2xsVGltZWxpbmUuY3VycmVudFRpbWUsIDAsCiAgICAgICAnQ2FsYy1iYXNlZCB0aW1lbGluZSBhdCB0aGUgc3RhcnRTY3JvbGxPZmZzZXQgcG9pbnQnKTsKLSAgc2Nyb2xsZXIuc2Nyb2xsTGVmdCA9IHNjcm9sbGVyU2l6ZSAtICgwLjIgKiBzY3JvbGxlclNpemUpOworICBzY3JvbGxlci5zY3JvbGxMZWZ0ID0gLSgwLjIgKiBzY3JvbGxlclNpemUpOwogICBhc3NlcnRfZXF1YWxzKAogICAgICAgY2FsY1Njcm9sbFRpbWVsaW5lLmN1cnJlbnRUaW1lLAogICAgICAgY2FsY3VsYXRlQ3VycmVudFRpbWUoCkBAIC0yODgsMjEgKzI4OCwyMSBAQAogICAgIGVuZFNjcm9sbE9mZnNldDogJ2NhbGMoODAlICsgNXB4KScKICAgfSk7CiAKLSAgLy8gV2l0aCBkaXJlY3Rpb24gcnRsIG9mZnNldHMgYXJlIGludmVydGVkLCBzdWNoIHRoYXQgc2Nyb2xsTGVmdCA9PQotICAvLyBzY3JvbGxlclNpemUgaXMgdGhlICd6ZXJvJyBwb2ludCBmb3IgY3VycmVudFRpbWUuIEhvd2V2ZXIgdGhlCisgIC8vIFdpdGggZGlyZWN0aW9uIHJ0bCBvZmZzZXRzIGFyZSBpbnZlcnRlZCwgc3VjaCB0aGF0IHNjcm9sbExlZnQgPT0gMAorICAvLyBpcyB0aGUgJ3plcm8nIHBvaW50IGZvciBjdXJyZW50VGltZS4gSG93ZXZlciB0aGUKICAgLy8gZW5kU2Nyb2xsT2Zmc2V0IGlzIGFuIGFic29sdXRlIGRpc3RhbmNlIGFsb25nIHRoZSBvZmZzZXQsIHNvIGRvZXNuJ3QgbmVlZAogICAvLyBhZGp1c3RpbmcuCiAKICAgLy8gQ2hlY2sgdGhlIGxlbmd0aC1iYXNlZCBTY3JvbGxUaW1lbGluZS4KLSAgc2Nyb2xsZXIuc2Nyb2xsTGVmdCA9IDA7CisgIHNjcm9sbGVyLnNjcm9sbExlZnQgPSAtc2Nyb2xsZXJTaXplOwogICBhc3NlcnRfZXF1YWxzKAogICAgICAgbGVuZ3RoU2Nyb2xsVGltZWxpbmUuY3VycmVudFRpbWUsIG51bGwsCiAgICAgICAnTGVuZ3RoLWJhc2VkIHRpbWVsaW5lIGFmdGVyIHRoZSBlbmRTY3JvbGxPZmZzZXQgcG9pbnQnKTsKLSAgc2Nyb2xsZXIuc2Nyb2xsTGVmdCA9IDIwOworICBzY3JvbGxlci5zY3JvbGxMZWZ0ID0gMjAgLSBzY3JvbGxlclNpemU7CiAgIGFzc2VydF9lcXVhbHMoCiAgICAgICBsZW5ndGhTY3JvbGxUaW1lbGluZS5jdXJyZW50VGltZSwgbnVsbCwKICAgICAgICdMZW5ndGgtYmFzZWQgdGltZWxpbmUgYXQgdGhlIGVuZFNjcm9sbE9mZnNldCBwb2ludCcpOwotICBzY3JvbGxlci5zY3JvbGxMZWZ0ID0gNTA7CisgIHNjcm9sbGVyLnNjcm9sbExlZnQgPSA1MCAtIHNjcm9sbGVyU2l6ZTsKICAgYXNzZXJ0X2VxdWFscygKICAgICAgIGxlbmd0aFNjcm9sbFRpbWVsaW5lLmN1cnJlbnRUaW1lLAogICAgICAgY2FsY3VsYXRlQ3VycmVudFRpbWUoCkBAIC0zMTAsMTUgKzMxMCwxNSBAQAogICAgICAgJ0xlbmd0aC1iYXNlZCB0aW1lbGluZSBiZWZvcmUgdGhlIGVuZFNjcm9sbE9mZnNldCBwb2ludCcpOwogCiAgIC8vIENoZWNrIHRoZSBwZXJjZW50YWdlLWJhc2VkIFNjcm9sbFRpbWVsaW5lLgotICBzY3JvbGxlci5zY3JvbGxMZWZ0ID0gMC4xOSAqIHNjcm9sbGVyU2l6ZTsKKyAgc2Nyb2xsZXIuc2Nyb2xsTGVmdCA9IDAuMTkgKiBzY3JvbGxlclNpemUgLSBzY3JvbGxlclNpemU7CiAgIGFzc2VydF9lcXVhbHMoCiAgICAgICBwZXJjZW50YWdlU2Nyb2xsVGltZWxpbmUuY3VycmVudFRpbWUsIG51bGwsCiAgICAgICAnUGVyY2VudGFnZS1iYXNlZCB0aW1lbGluZSBhZnRlciB0aGUgZW5kU2Nyb2xsT2Zmc2V0IHBvaW50Jyk7Ci0gIHNjcm9sbGVyLnNjcm9sbExlZnQgPSAwLjIwICogc2Nyb2xsZXJTaXplOworICBzY3JvbGxlci5zY3JvbGxMZWZ0ID0gMC4yMCAqIHNjcm9sbGVyU2l6ZSAtIHNjcm9sbGVyU2l6ZTsKICAgYXNzZXJ0X2VxdWFscygKICAgICAgIHBlcmNlbnRhZ2VTY3JvbGxUaW1lbGluZS5jdXJyZW50VGltZSwgbnVsbCwKICAgICAgICdQZXJjZW50YWdlLWJhc2VkIHRpbWVsaW5lIGF0IHRoZSBlbmRTY3JvbGxPZmZzZXQgcG9pbnQnKTsKLSAgc2Nyb2xsZXIuc2Nyb2xsTGVmdCA9IDAuNCAqIHNjcm9sbGVyU2l6ZTsKKyAgc2Nyb2xsZXIuc2Nyb2xsTGVmdCA9IDAuNCAqIHNjcm9sbGVyU2l6ZSAtIHNjcm9sbGVyU2l6ZTsKICAgYXNzZXJ0X2VxdWFscygKICAgICAgIHBlcmNlbnRhZ2VTY3JvbGxUaW1lbGluZS5jdXJyZW50VGltZSwKICAgICAgIGNhbGN1bGF0ZUN1cnJlbnRUaW1lKApAQCAtMzI2LDE1ICszMjYsMTUgQEAKICAgICAgICdQZXJjZW50YWdlLWJhc2VkIHRpbWVsaW5lIGJlZm9yZSB0aGUgZW5kU2Nyb2xsT2Zmc2V0IHBvaW50Jyk7CiAKICAgLy8gQ2hlY2sgdGhlIGNhbGMtYmFzZWQgU2Nyb2xsVGltZWxpbmUuIDgwJSArIDVweAotICBzY3JvbGxlci5zY3JvbGxMZWZ0ID0gMC4yICogc2Nyb2xsZXJTaXplIC0gMTA7CisgIHNjcm9sbGVyLnNjcm9sbExlZnQgPSAtMC44ICogc2Nyb2xsZXJTaXplIC0gMTA7CiAgIGFzc2VydF9lcXVhbHMoCiAgICAgICBjYWxjU2Nyb2xsVGltZWxpbmUuY3VycmVudFRpbWUsIG51bGwsCiAgICAgICAnQ2FsYy1iYXNlZCB0aW1lbGluZSBhZnRlciB0aGUgZW5kU2Nyb2xsT2Zmc2V0IHBvaW50Jyk7Ci0gIHNjcm9sbGVyLnNjcm9sbExlZnQgPSAwLjIgKiBzY3JvbGxlclNpemUgLSA1OworICBzY3JvbGxlci5zY3JvbGxMZWZ0ID0gLTAuOCAqIHNjcm9sbGVyU2l6ZSAtIDU7CiAgIGFzc2VydF9lcXVhbHMoCiAgICAgICBjYWxjU2Nyb2xsVGltZWxpbmUuY3VycmVudFRpbWUsIG51bGwsCiAgICAgICAnQ2FsYy1iYXNlZCB0aW1lbGluZSBhdCB0aGUgZW5kU2Nyb2xsT2Zmc2V0IHBvaW50Jyk7Ci0gIHNjcm9sbGVyLnNjcm9sbExlZnQgPSAwLjIgKiBzY3JvbGxlclNpemU7CisgIHNjcm9sbGVyLnNjcm9sbExlZnQgPSAtMC44ICogc2Nyb2xsZXJTaXplOwogICBhc3NlcnRfZXF1YWxzKAogICAgICAgY2FsY1Njcm9sbFRpbWVsaW5lLmN1cnJlbnRUaW1lLAogICAgICAgY2FsY3VsYXRlQ3VycmVudFRpbWUoCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L3RpbWluZy1lbnRyeXR5cGVzLXJlZ2lzdHJ5L01FVEEueW1sIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC90aW1pbmctZW50cnl0eXBlcy1yZWdpc3RyeS9NRVRBLnltbAppbmRleCBjMDlhNmUwLi5iZmIwZTBmIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L3RpbWluZy1lbnRyeXR5cGVzLXJlZ2lzdHJ5L01FVEEueW1sCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvdGltaW5nLWVudHJ5dHlwZXMtcmVnaXN0cnkvTUVUQS55bWwKQEAgLTIsNSArMiw0IEBACiBzdWdnZXN0ZWRfcmV2aWV3ZXJzOgogICAtIHBsZWhlZ2FyCiAgIC0gaWdyaWdvcmlrCi0gIC0gdG9kZHJlaWZzdGVjawogICAtIHlvYXZ3ZWlzcwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC90b29scy9jaS9tYW5pZmVzdF9idWlsZC5weSBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvdG9vbHMvY2kvbWFuaWZlc3RfYnVpbGQucHkKaW5kZXggYWRlMTdkNi4uNjQwMGJmZDUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvdG9vbHMvY2kvbWFuaWZlc3RfYnVpbGQucHkKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC90b29scy9jaS9tYW5pZmVzdF9idWlsZC5weQpAQCAtNDMsNyArNDMsNyBAQAogICAgICAgICBydW4oYXJncyArIFtwYXRoXSkKIAogCi1kZWYgcmVxdWVzdCh1cmwsIGRlc2MsIGRhdGE9Tm9uZSwganNvbl9kYXRhPU5vbmUsIHBhcmFtcz1Ob25lLCBoZWFkZXJzPU5vbmUpOgorZGVmIHJlcXVlc3QodXJsLCBkZXNjLCBtZXRob2Q9Tm9uZSwgZGF0YT1Ob25lLCBqc29uX2RhdGE9Tm9uZSwgcGFyYW1zPU5vbmUsIGhlYWRlcnM9Tm9uZSk6CiAgICAgZ2l0aHViX3Rva2VuID0gb3MuZW52aXJvbi5nZXQoIkdJVEhVQl9UT0tFTiIpCiAgICAgZGVmYXVsdF9oZWFkZXJzID0gewogICAgICAgICAiQXV0aG9yaXphdGlvbiI6ICJ0b2tlbiAlcyIgJSBnaXRodWJfdG9rZW4sCkBAIC01NywxMiArNTcsMTMgQEAKICAgICBrd2FyZ3MgPSB7InBhcmFtcyI6IHBhcmFtcywKICAgICAgICAgICAgICAgImhlYWRlcnMiOiBfaGVhZGVyc30KICAgICB0cnk6Ci0gICAgICAgIGxvZ2dlci5pbmZvKCJMb2FkaW5nIFVSTCAlcyIgJSB1cmwpCisgICAgICAgIGxvZ2dlci5pbmZvKCJSZXF1ZXN0aW5nIFVSTCAlcyIgJSB1cmwpCiAgICAgICAgIGlmIGpzb25fZGF0YSBpcyBub3QgTm9uZSBvciBkYXRhIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgbWV0aG9kID0gcmVxdWVzdHMucG9zdAorICAgICAgICAgICAgaWYgbWV0aG9kIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgbWV0aG9kID0gcmVxdWVzdHMucG9zdAogICAgICAgICAgICAga3dhcmdzWyJqc29uIl0gPSBqc29uX2RhdGEKICAgICAgICAgICAgIGt3YXJnc1siZGF0YSJdID0gZGF0YQotICAgICAgICBlbHNlOgorICAgICAgICBlbGlmIG1ldGhvZCBpcyBOb25lOgogICAgICAgICAgICAgbWV0aG9kID0gcmVxdWVzdHMuZ2V0CiAKICAgICAgICAgcmVzcCA9IG1ldGhvZCh1cmwsICoqa3dhcmdzKQpAQCAtMTA1LDMyICsxMDYsMTkgQEAKICAgICByZXR1cm4gcHJbIm51bWJlciJdCiAKIAotZGVmIHRhZyhvd25lciwgcmVwbywgc2hhLCB0YWcpOgotICAgIGRhdGEgPSB7InJlZiI6ICJyZWZzL3RhZ3MvJXMiICUgdGFnLAotICAgICAgICAgICAgInNoYSI6IHNoYX0KLSAgICB1cmwgPSAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy8lcy8lcy9naXQvcmVmcyIgJSAob3duZXIsIHJlcG8pCi0KLSAgICByZXNwX2RhdGEgPSByZXF1ZXN0KHVybCwgIlRhZyBjcmVhdGlvbiIsIGpzb25fZGF0YT1kYXRhKQotICAgIGlmIG5vdCByZXNwX2RhdGE6Ci0gICAgICAgIHJldHVybiBGYWxzZQotCi0gICAgbG9nZ2VyLmluZm8oIlRhZ2dlZCAlcyBhcyAlcyIgJSAoc2hhLCB0YWcpKQotICAgIHJldHVybiBUcnVlCi0KLQogZGVmIGNyZWF0ZV9yZWxlYXNlKG1hbmlmZXN0X3BhdGgsIG93bmVyLCByZXBvLCBzaGEsIHRhZywgYm9keSk6CiAgICAgY3JlYXRlX3VybCA9ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyVzLyVzL3JlbGVhc2VzIiAlIChvd25lciwgcmVwbykKICAgICBjcmVhdGVfZGF0YSA9IHsidGFnX25hbWUiOiB0YWcsCisgICAgICAgICAgICAgICAgICAgInRhcmdldF9jb21taXRpc2giOiBzaGEsCiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiB0YWcsCi0gICAgICAgICAgICAgICAgICAgImJvZHkiOiBib2R5fQotICAgIGNyZWF0ZV9kYXRhID0gcmVxdWVzdChjcmVhdGVfdXJsLCAiUmVsZWFzZSBjcmVhdGlvbiIsIGpzb25fZGF0YT1jcmVhdGVfZGF0YSkKLSAgICBpZiBub3QgY3JlYXRlX2RhdGE6CisgICAgICAgICAgICAgICAgICAgImJvZHkiOiBib2R5LAorICAgICAgICAgICAgICAgICAgICJkcmFmdCI6IFRydWV9CisgICAgY3JlYXRlX3Jlc3AgPSByZXF1ZXN0KGNyZWF0ZV91cmwsICJSZWxlYXNlIGNyZWF0aW9uIiwganNvbl9kYXRhPWNyZWF0ZV9kYXRhKQorICAgIGlmIG5vdCBjcmVhdGVfcmVzcDoKICAgICAgICAgcmV0dXJuIEZhbHNlCiAKICAgICAjIFVwbG9hZCBVUkwgY29udGFpbnMgJ3s/bmFtZSxsYWJlbH0nIGF0IHRoZSBlbmQgd2hpY2ggd2Ugd2FudCB0byByZW1vdmUKLSAgICB1cGxvYWRfdXJsID0gY3JlYXRlX2RhdGFbInVwbG9hZF91cmwiXS5zcGxpdCgieyIsIDEpWzBdCi0KLSAgICBzdWNjZXNzID0gVHJ1ZQorICAgIHVwbG9hZF91cmwgPSBjcmVhdGVfcmVzcFsidXBsb2FkX3VybCJdLnNwbGl0KCJ7IiwgMSlbMF0KIAogICAgIHVwbG9hZF9leHRzID0gWyIuZ3oiLCAiLmJ6MiIsICIuenN0Il0KICAgICBmb3IgdXBsb2FkX2V4dCBpbiB1cGxvYWRfZXh0czoKQEAgLTE0Niw5ICsxMzQsMTcgQEAKICAgICAgICAgdXBsb2FkX3Jlc3AgPSByZXF1ZXN0KHVwbG9hZF91cmwsICJNYW5pZmVzdCB1cGxvYWQiLCBkYXRhPXVwbG9hZF9kYXRhLCBwYXJhbXM9cGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycz17J0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nfSkKICAgICAgICAgaWYgbm90IHVwbG9hZF9yZXNwOgotICAgICAgICAgICAgc3VjY2VzcyA9IEZhbHNlCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKIAotICAgIHJldHVybiBzdWNjZXNzCisgICAgcmVsZWFzZV9pZCA9IGNyZWF0ZV9yZXNwWyJpZCJdCisgICAgZWRpdF91cmwgPSAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy8lcy8lcy9yZWxlYXNlcy8lcyIgJSAob3duZXIsIHJlcG8sIHJlbGVhc2VfaWQpCisgICAgZWRpdF9kYXRhID0geyJkcmFmdCI6IEZhbHNlfQorICAgIGVkaXRfcmVzcCA9IHJlcXVlc3QoZWRpdF91cmwsICJSZWxlYXNlIHB1Ymxpc2hpbmciLCBtZXRob2Q9cmVxdWVzdHMucGF0Y2gsIGpzb25fZGF0YT1lZGl0X2RhdGEpCisgICAgaWYgbm90IGVkaXRfcmVzcDoKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBsb2dnZXIuaW5mbygiUmVsZWFzZWQgJXMiICUgZWRpdF9yZXNwWyJodG1sX3VybCJdKQorICAgIHJldHVybiBUcnVlCiAKIAogZGVmIHNob3VsZF9kcnlfcnVuKCk6CkBAIC0xOTAsMTAgKzE4Niw2IEBACiAgICAgICAgIHJldHVybiBTdGF0dXMuRkFJTAogICAgIHRhZ19uYW1lID0gIm1lcmdlX3ByXyVzIiAlIHByCiAKLSAgICB0YWdnZWQgPSB0YWcob3duZXIsIHJlcG8sIGhlYWRfcmV2LCB0YWdfbmFtZSkKLSAgICBpZiBub3QgdGFnZ2VkOgotICAgICAgICByZXR1cm4gU3RhdHVzLkZBSUwKLQogICAgIGlmIG5vdCBjcmVhdGVfcmVsZWFzZShtYW5pZmVzdF9wYXRoLCBvd25lciwgcmVwbywgaGVhZF9yZXYsIHRhZ19uYW1lLCBib2R5KToKICAgICAgICAgcmV0dXJuIFN0YXR1cy5GQUlMCiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvdXNlci10aW1pbmcvTUVUQS55bWwgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L3VzZXItdGltaW5nL01FVEEueW1sCmluZGV4IGE5N2EzMWQuLjVjYjJhNzggMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvdXNlci10aW1pbmcvTUVUQS55bWwKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC91c2VyLXRpbWluZy9NRVRBLnltbApAQCAtMiw0ICsyLDMgQEAKIHN1Z2dlc3RlZF9yZXZpZXdlcnM6CiAgIC0gcGxlaGVnYXIKICAgLSBpZ3JpZ29yaWsKLSAgLSB0b2RkcmVpZnN0ZWNrCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L3dlYi1zaGFyZS9zaGFyZS1zaGFyZVByb21pc2UtaW50ZXJuYWwtc2xvdC5odHRwcy5odG1sIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC93ZWItc2hhcmUvc2hhcmUtc2hhcmVQcm9taXNlLWludGVybmFsLXNsb3QuaHR0cHMuaHRtbAppbmRleCA1YTcxZWFhLi4xNDc4MTU4YSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC93ZWItc2hhcmUvc2hhcmUtc2hhcmVQcm9taXNlLWludGVybmFsLXNsb3QuaHR0cHMuaHRtbAorKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L3dlYi1zaGFyZS9zaGFyZS1zaGFyZVByb21pc2UtaW50ZXJuYWwtc2xvdC5odHRwcy5odG1sCkBAIC0xMCwyMSArMTAsMjcgQEAKICAgICA8c2NyaXB0IHNyYz0iL3Jlc291cmNlcy90ZXN0ZHJpdmVyLXZlbmRvci5qcyI+PC9zY3JpcHQ+CiAgIDwvaGVhZD4KICAgPGJvZHk+CisgICAgPGJ1dHRvbj4KICAgICA8c2NyaXB0PgorICAgICAgc2V0dXAoeyBhbGxvd191bmNhdWdodF9leGNlcHRpb246dHJ1ZSB9KTsKICAgICAgIHByb21pc2VfdGVzdChhc3luYyB0ID0+IHsKLSAgICAgICAgY29uc3QgWywgcHJvbWlzZTIsIHByb21pc2UzXSA9IGF3YWl0IHRlc3RfZHJpdmVyLmJsZXNzKAotICAgICAgICAgICJzaGFyZSBuZWVkcyB1c2VyIGFjdGl2YXRpb24iLAotICAgICAgICAgICgpID0+IHsKLSAgICAgICAgICAgIHJldHVybiBbCisgICAgICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImJ1dHRvbiIpOworICAgICAgICBjb25zdCBwID0gbmV3IFByb21pc2UociA9PiB7CisgICAgICAgICAgYnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB7CisgICAgICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtdOworICAgICAgICAgICAgcHJvbWlzZXMucHVzaCgKICAgICAgICAgICAgICAgbmF2aWdhdG9yLnNoYXJlKHsgdGl0bGU6ICJzaG91bGQgYmUgcGVuZGluZyIgfSksCiAgICAgICAgICAgICAgIG5hdmlnYXRvci5zaGFyZSh7IHRpdGxlOiAic2hvdWxkIHJlamVjdCIgfSksCi0gICAgICAgICAgICAgIG5hdmlnYXRvci5zaGFyZSh7IHRpdGxlOiAic2hvdWxkIGFsc28gcmVqZWN0IiB9KSwKLSAgICAgICAgICAgIF07Ci0gICAgICAgICAgfQotICAgICAgICApOworICAgICAgICAgICAgICBuYXZpZ2F0b3Iuc2hhcmUoeyB0aXRsZTogInNob3VsZCBhbHNvIHJlamVjdCIgfSkKKyAgICAgICAgICAgICk7CisgICAgICAgICAgICByKHByb21pc2VzKTsKKyAgICAgICAgICB9OworICAgICAgICB9KTsKKyAgICAgICAgdGVzdF9kcml2ZXIuY2xpY2soYnV0dG9uKTsKKyAgICAgICAgY29uc3QgWywgcHJvbWlzZTIsIHByb21pc2UzXSA9IGF3YWl0IHA7CiAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFsKICAgICAgICAgICBwcm9taXNlX3JlamVjdHModCwgIkludmFsaWRTdGF0ZUVycm9yIiwgcHJvbWlzZTIpLAotICAgICAgICAgIHByb21pc2VfcmVqZWN0cyh0LCAiSW52YWxpZFN0YXRlRXJyb3IiLCBwcm9taXNlMyksCisgICAgICAgICAgcHJvbWlzZV9yZWplY3RzKHQsICJJbnZhbGlkU3RhdGVFcnJvciIsIHByb21pc2UzKQogICAgICAgICBdKTsKICAgICAgIH0sICJPbmx5IGFsbG93IG9uZSBzaGFyZSBjYWxsIGF0IGEgdGltZSwgd2hpY2ggaXMgY29udHJvbGxlZCBieSB0aGUgW1tzaGFyZVByb21pc2VdXSBpbnRlcm5hbCBzbG90LiIpOwogICAgIDwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC93ZWJ4ci94ckRldmljZV9zdXBwb3J0c1Nlc3Npb25faW1tZXJzaXZlLmh0dHBzLmh0bWwgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L3dlYnhyL3hyRGV2aWNlX3N1cHBvcnRzU2Vzc2lvbl9pbW1lcnNpdmUuaHR0cHMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQwODI3YTUyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9leHRlcm5hbC93cHQvd2VieHIveHJEZXZpY2Vfc3VwcG9ydHNTZXNzaW9uX2ltbWVyc2l2ZS5odHRwcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWw+Ci08Ym9keT4KLSAgPHNjcmlwdCBzcmM9L3Jlc291cmNlcy90ZXN0aGFybmVzcy5qcz48L3NjcmlwdD4KLSAgPHNjcmlwdCBzcmM9L3Jlc291cmNlcy90ZXN0aGFybmVzc3JlcG9ydC5qcz48L3NjcmlwdD4KLSAgPHNjcmlwdCBzcmM9InJlc291cmNlcy93ZWJ4cl91dGlsLmpzIj48L3NjcmlwdD4KLSAgPHNjcmlwdCBzcmM9InJlc291cmNlcy93ZWJ4cl90ZXN0X2NvbnN0YW50cy5qcyI+PC9zY3JpcHQ+Ci0gIDxzY3JpcHQ+Ci0gICAgeHJfcHJvbWlzZV90ZXN0KAotICAgICAgInN1cHBvcnRzU2Vzc2lvbiByZXNvbHZlcyB3aGVuIGltbWVyc2l2ZSBvcHRpb25zIHN1cHBvcnRlZCIsCi0gICAgICAoKSA9PiB7Ci0gICAgICAgIHJldHVybiBuYXZpZ2F0b3IueHIudGVzdC5zaW11bGF0ZURldmljZUNvbm5lY3Rpb24oVFJBQ0tFRF9JTU1FUlNJVkVfREVWSUNFKQotICAgICAgICAgIC50aGVuKCAoY29udHJvbGxlcikgPT4gbmF2aWdhdG9yLnhyLnN1cHBvcnRzU2Vzc2lvbignaW1tZXJzaXZlLXZyJykpOwotICAgICAgfSk7Ci0gIDwvc2NyaXB0PgotPC9ib2R5PgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC93ZWJ4ci94ckRldmljZV9zdXBwb3J0c1Nlc3Npb25faW1tZXJzaXZlX3Vuc3VwcG9ydGVkLmh0dHBzLmh0bWwgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L3dlYnhyL3hyRGV2aWNlX3N1cHBvcnRzU2Vzc2lvbl9pbW1lcnNpdmVfdW5zdXBwb3J0ZWQuaHR0cHMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ2M2EyYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L3dlYnhyL3hyRGV2aWNlX3N1cHBvcnRzU2Vzc2lvbl9pbW1lcnNpdmVfdW5zdXBwb3J0ZWQuaHR0cHMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sPgotPGJvZHk+Ci0gIDxzY3JpcHQgc3JjPS9yZXNvdXJjZXMvdGVzdGhhcm5lc3MuanM+PC9zY3JpcHQ+Ci0gIDxzY3JpcHQgc3JjPS9yZXNvdXJjZXMvdGVzdGhhcm5lc3NyZXBvcnQuanM+PC9zY3JpcHQ+Ci0gIDxzY3JpcHQgc3JjPSJyZXNvdXJjZXMvd2VieHJfdXRpbC5qcyI+PC9zY3JpcHQ+Ci0gIDxzY3JpcHQgc3JjPSJyZXNvdXJjZXMvd2VieHJfdGVzdF9jb25zdGFudHMuanMiPjwvc2NyaXB0PgotICA8c2NyaXB0PgotICAgIHhyX3Byb21pc2VfdGVzdCgKLSAgICAgICJzdXBwb3J0c1Nlc3Npb24gcmVqZWN0cyB3aGVuIG9wdGlvbnMgbm90IHN1cHBvcnRlZCIsCi0gICAgICAodCkgPT4gewotICAgICAgcmV0dXJuIG5hdmlnYXRvci54ci50ZXN0LnNpbXVsYXRlRGV2aWNlQ29ubmVjdGlvbihWQUxJRF9OT05fSU1NRVJTSVZFX0RFVklDRSkKLSAgICAgICAgLnRoZW4oIChjb250cm9sbGVyKSA9PiB7Ci0gICAgICAgICAgcmV0dXJuIHByb21pc2VfcmVqZWN0cygKLSAgICAgICAgICAgIHQsCi0gICAgICAgICAgICAiTm90U3VwcG9ydGVkRXJyb3IiLAotICAgICAgICAgICAgbmF2aWdhdG9yLnhyLnN1cHBvcnRzU2Vzc2lvbignaW1tZXJzaXZlLXZyJykKLSAgICAgICAgICApOwotICAgICAgICB9KTsKLSAgICB9KTsKLSAgPC9zY3JpcHQ+Ci08L2JvZHk+CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L3dlYnhyL3hyRGV2aWNlX3N1cHBvcnRzU2Vzc2lvbl9ub25faW1tZXJzaXZlLmh0dHBzLmh0bWwgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZXh0ZXJuYWwvd3B0L3dlYnhyL3hyRGV2aWNlX3N1cHBvcnRzU2Vzc2lvbl9ub25faW1tZXJzaXZlLmh0dHBzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNzY0OTUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2V4dGVybmFsL3dwdC93ZWJ4ci94ckRldmljZV9zdXBwb3J0c1Nlc3Npb25fbm9uX2ltbWVyc2l2ZS5odHRwcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPCFET0NUWVBFIGh0bWw+Ci08Ym9keT4KLSAgPHNjcmlwdCBzcmM9L3Jlc291cmNlcy90ZXN0aGFybmVzcy5qcz48L3NjcmlwdD4KLSAgPHNjcmlwdCBzcmM9L3Jlc291cmNlcy90ZXN0aGFybmVzc3JlcG9ydC5qcz48L3NjcmlwdD4KLSAgPHNjcmlwdCBzcmM9InJlc291cmNlcy93ZWJ4cl91dGlsLmpzIj48L3NjcmlwdD4KLSAgPHNjcmlwdCBzcmM9InJlc291cmNlcy93ZWJ4cl90ZXN0X2NvbnN0YW50cy5qcyI+PC9zY3JpcHQ+Ci0gIDxzY3JpcHQ+Ci0gICAgeHJfcHJvbWlzZV90ZXN0KAotICAgICAgInN1cHBvcnRzU2Vzc2lvbiByZXNvbHZlcyB3aGVuIGlubGluZSBvcHRpb25zIHN1cHBvcnRlZCIsCi0gICAgICAodCkgPT4gewotICAgICAgcmV0dXJuIG5hdmlnYXRvci54ci50ZXN0LnNpbXVsYXRlRGV2aWNlQ29ubmVjdGlvbihUUkFDS0VEX0lNTUVSU0lWRV9ERVZJQ0UpCi0gICAgICAgIC50aGVuKCAoY29udHJvbGxlcikgPT4gewotICAgICAgICAgIC8vIElubGluZSBzZXNzaW9ucyBzaG91bGQgYmUgc3VwcG9ydGVkLgotICAgICAgICAgIHJldHVybiBuYXZpZ2F0b3IueHIuc3VwcG9ydHNTZXNzaW9uKCdpbmxpbmUnKTsKLSAgICAgICAgfSk7Ci0gICAgfSk7Ci0gIDwvc2NyaXB0PgotPC9ib2R5PgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvY3NzL292ZXJmbG93LXJ0bC1ib3JkZXItYWZ0ZXIuaHRtbCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L2Nzcy9vdmVyZmxvdy1ydGwtYm9yZGVyLWFmdGVyLmh0bWwKaW5kZXggN2YyMDY2ZTIuLmIwNjUyYjI1IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9jc3Mvb3ZlcmZsb3ctcnRsLWJvcmRlci1hZnRlci5odG1sCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L2Nzcy9vdmVyZmxvdy1ydGwtYm9yZGVyLWFmdGVyLmh0bWwKQEAgLTE2LDcgKzE2LDcgQEAKICAgICA8L3N0eWxlPgogICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9yZXNvdXJjZXMvY2hlY2stbGF5b3V0LmpzIj48L3NjcmlwdD4KICAgPC9oZWFkPgotICA8Ym9keSBvbmxvYWQ9ImNoZWNrTGF5b3V0KCcjY29udGFpbmVyJyk7IGNvbnRhaW5lci5zY3JvbGxMZWZ0ID0gMTAwMDsiPgorICA8Ym9keSBvbmxvYWQ9ImNoZWNrTGF5b3V0KCcjY29udGFpbmVyJyk7IGNvbnRhaW5lci5zY3JvbGxMZWZ0ID0gMDsiPgogICAgIDwhLS0gV2UgaGF2ZSB0byBzZXQgdGhlIHNjcm9sbCBwb3NpdGlvbiwgYmVjYXVzZSBvZiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYxMjkKICAgICAgICAgIEZ1cnRoZXJtb3JlLCBpbm5lci5zY3JvbGxJbnRvVmlldygpIGRvZXNuJ3Qgd29yaywgc28ganVzdCBzZXQgc29tZSBpbnNhbmUgbGVmdCB2YWx1ZS4KICAgICAgICAgIFRoaXMgaXMganVzdCB0byBtYWtlIGl0IGxvb2sgZ29vZDsgY2hlY2tMYXlvdXQoKSBkb2Vzbid0IGNhcmUuIC0tPgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZG9tL0hUTUxTY3JpcHRFbGVtZW50L2FwcGVuZC1jaGlsZC1hZG9wdC1ub2RlLWNyYXNoLWV4cGVjdGVkLnR4dCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L2RvbS9IVE1MU2NyaXB0RWxlbWVudC9hcHBlbmQtY2hpbGQtYWRvcHQtbm9kZS1jcmFzaC1leHBlY3RlZC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMDIxNDE5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L2RvbS9IVE1MU2NyaXB0RWxlbWVudC9hcHBlbmQtY2hpbGQtYWRvcHQtbm9kZS1jcmFzaC1leHBlY3RlZC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLUNPTlNPTEUgTUVTU0FHRTogbGluZSAxMDogUEFTUyB1bmxlc3MgY3Jhc2guCi0gCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9kb20vSFRNTFNjcmlwdEVsZW1lbnQvYXBwZW5kLWNoaWxkLWFkb3B0LW5vZGUtY3Jhc2guaHRtbCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L2RvbS9IVE1MU2NyaXB0RWxlbWVudC9hcHBlbmQtY2hpbGQtYWRvcHQtbm9kZS1jcmFzaC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGU0MTI2MS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9kb20vSFRNTFNjcmlwdEVsZW1lbnQvYXBwZW5kLWNoaWxkLWFkb3B0LW5vZGUtY3Jhc2guaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sPgotPGlmcmFtZSBzcmM9cmVzb3VyY2VzL2FwcGVuZC1jaGlsZC1hZG9wdC1ub2RlLWZyYW1lLmh0bWw+PC9pZnJhbWU+Ci08aWZyYW1lIHNyYz1yZXNvdXJjZXMvYXBwZW5kLWNoaWxkLWFkb3B0LW5vZGUtZnJhbWUuc3ZnPjwvaWZyYW1lPgotPHNjcmlwdD4KLXRlc3RSdW5uZXIud2FpdFVudGlsRG9uZSgpOwotdGVzdFJ1bm5lci5kdW1wQXNUZXh0KCk7Ci0KLS8vIERvbid0IHVzZSBqcy10ZXN0LmpzIGJlY2F1c2UgdGhpcyBidWcgaXMgYWJvdXQgPHNjcmlwdD4gbG9hZGluZyBhbmQKLS8vIGl0IG1ha2VzIHNlbnNlIHRvIGtlZXAgdGhpcyBzbWFsbCBhbmQgZWFzeSB0byBkZWJ1ZyB3aGVuIHJlZ3Jlc3MuCi1jb25zb2xlLmxvZygiUEFTUyB1bmxlc3MgY3Jhc2guIik7Ci0KLXZhciBjb3VudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImlmcmFtZSIpLmxlbmd0aDsKLQotZnVuY3Rpb24gZG9uZSgpIHsKLSAgICBpZiAoLS1jb3VudCkKLSAgICAgICAgcmV0dXJuOwotICAgIHRlc3RSdW5uZXIubm90aWZ5RG9uZSgpOwotfQotPC9zY3JpcHQ+CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9kb20vSFRNTFNjcmlwdEVsZW1lbnQvYXBwZW5kLWNoaWxkLWFkb3B0LW5vZGUtZXJyb3ItY3Jhc2gtZXhwZWN0ZWQudHh0IGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZG9tL0hUTUxTY3JpcHRFbGVtZW50L2FwcGVuZC1jaGlsZC1hZG9wdC1ub2RlLWVycm9yLWNyYXNoLWV4cGVjdGVkLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UwNjhmODIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZG9tL0hUTUxTY3JpcHRFbGVtZW50L2FwcGVuZC1jaGlsZC1hZG9wdC1ub2RlLWVycm9yLWNyYXNoLWV4cGVjdGVkLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotQ09OU09MRSBNRVNTQUdFOiBsaW5lIDk6IFBBU1MgdW5sZXNzIGNyYXNoLgotIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZG9tL0hUTUxTY3JpcHRFbGVtZW50L2FwcGVuZC1jaGlsZC1hZG9wdC1ub2RlLWVycm9yLWNyYXNoLmh0bWwgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9kb20vSFRNTFNjcmlwdEVsZW1lbnQvYXBwZW5kLWNoaWxkLWFkb3B0LW5vZGUtZXJyb3ItY3Jhc2guaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFmNGRkOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9kb20vSFRNTFNjcmlwdEVsZW1lbnQvYXBwZW5kLWNoaWxkLWFkb3B0LW5vZGUtZXJyb3ItY3Jhc2guaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTwhRE9DVFlQRSBodG1sPgotPHNjcmlwdD4KLXRlc3RSdW5uZXIud2FpdFVudGlsRG9uZSgpOwotdGVzdFJ1bm5lci5kdW1wQXNUZXh0KCk7Ci0KLS8vIERvbid0IHVzZSBqcy10ZXN0LmpzIGJlY2F1c2UgdGhpcyBidWcgaXMgYWJvdXQgYSBmYWlsaW5nIGxvYWQgb2YgYW4gYXN5bmMKLS8vIDxzY3JpcHQ+IG9mIGEgZnJhbWUgZG9jdW1lbnQgYmVpbmcgbW92ZWQgdG8gaXRzIHBhcmVudCBkb2N1bWVudC4KLS8vIEhlbmNlIGl0IG1ha2VzIHNlbnNlIHRvIGtlZXAgdGhpcyBzbWFsbCBhbmQgZWFzeSB0byBkZWJ1ZyB3aGVuIHJlZ3Jlc3MuCi1jb25zb2xlLmxvZygiUEFTUyB1bmxlc3MgY3Jhc2guIik7Ci0KLXZhciBjb3VudCA9IDI7Ci0KLWZ1bmN0aW9uIGRvbmUoKSB7Ci0gICAgaWYgKC0tY291bnQpCi0gICAgICAgIHJldHVybjsKLSAgICB0ZXN0UnVubmVyLm5vdGlmeURvbmUoKTsKLX0KLTwvc2NyaXB0PgotPGlmcmFtZSBzcmM9cmVzb3VyY2VzL2FwcGVuZC1jaGlsZC1hZG9wdC1ub2RlLWVycm9yLWZyYW1lLmh0bWw+PC9pZnJhbWU+Ci08aWZyYW1lIHNyYz1yZXNvdXJjZXMvYXBwZW5kLWNoaWxkLWFkb3B0LW5vZGUtZXJyb3ItZnJhbWUuc3ZnPjwvaWZyYW1lPgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZG9tL0hUTUxTY3JpcHRFbGVtZW50L3Jlc291cmNlcy9hcHBlbmQtY2hpbGQtYWRvcHQtbm9kZS1lcnJvci1mcmFtZS5odG1sIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZG9tL0hUTUxTY3JpcHRFbGVtZW50L3Jlc291cmNlcy9hcHBlbmQtY2hpbGQtYWRvcHQtbm9kZS1lcnJvci1mcmFtZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDk1YmE3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L2RvbS9IVE1MU2NyaXB0RWxlbWVudC9yZXNvdXJjZXMvYXBwZW5kLWNoaWxkLWFkb3B0LW5vZGUtZXJyb3ItZnJhbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sPgotPGh0bWw+Ci08Ym9keT4KLTxzY3JpcHQ+Ci1mdW5jdGlvbiBpbml0KCkKLXsKLSAgICB2YXIgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Ci0gICAgc2NyaXB0LnNyYyA9ICJkb2VzLW5vdC1leGlzdC5qcyI7Ci0gICAgc2NyaXB0Lm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7IHdpbmRvdy50b3AuZG9uZSgpOyB9OwotICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc2NyaXB0KTsKLSAgICB2YXIgY29udGV4dERvYyA9IHdpbmRvdy50b3AuZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnQoIiIsIG51bGwpOwotICAgIGNvbnRleHREb2MuYWRvcHROb2RlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7Ci19Ci0KLWluaXQoKTsKLTwvc2NyaXB0PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZG9tL0hUTUxTY3JpcHRFbGVtZW50L3Jlc291cmNlcy9hcHBlbmQtY2hpbGQtYWRvcHQtbm9kZS1lcnJvci1mcmFtZS5zdmcgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9kb20vSFRNTFNjcmlwdEVsZW1lbnQvcmVzb3VyY2VzL2FwcGVuZC1jaGlsZC1hZG9wdC1ub2RlLWVycm9yLWZyYW1lLnN2ZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNhYjJmMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9kb20vSFRNTFNjcmlwdEVsZW1lbnQvcmVzb3VyY2VzL2FwcGVuZC1jaGlsZC1hZG9wdC1ub2RlLWVycm9yLWZyYW1lLnN2ZworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0MDAiIGhlaWdodD0iNDAwIj4KLTxzY3JpcHQ+Ci1mdW5jdGlvbiBpbml0KCkKLXsKLSAgICB2YXIgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsICJzY3JpcHQiKTsKLSAgICBzY3JpcHQuc2V0QXR0cmlidXRlTlMoJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnLCAnaHJlZicsICJkb2VzLW5vdC1leGlzdC5qcyIpOwotCi0gICAgc2NyaXB0Lm9uZXJyb3IgPSBmdW5jdGlvbigpIHsgd2luZG93LnRvcC5kb25lKCk7IH07Ci0gICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKHNjcmlwdCk7Ci0gICAgdmFyIGNvbnRleHREb2MgPSB3aW5kb3cudG9wLmRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZURvY3VtZW50KCIiLCBudWxsKTsKLSAgICBjb250ZXh0RG9jLmFkb3B0Tm9kZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpOwotfQotaW5pdCgpOwotPC9zY3JpcHQ+Ci08L3N2Zz4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L2RvbS9IVE1MU2NyaXB0RWxlbWVudC9yZXNvdXJjZXMvYXBwZW5kLWNoaWxkLWFkb3B0LW5vZGUtZnJhbWUuaHRtbCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L2RvbS9IVE1MU2NyaXB0RWxlbWVudC9yZXNvdXJjZXMvYXBwZW5kLWNoaWxkLWFkb3B0LW5vZGUtZnJhbWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE1MDgzNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9kb20vSFRNTFNjcmlwdEVsZW1lbnQvcmVzb3VyY2VzL2FwcGVuZC1jaGlsZC1hZG9wdC1ub2RlLWZyYW1lLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08IURPQ1RZUEUgaHRtbD4KLTxodG1sPgotPGJvZHk+Ci08c2NyaXB0PgotZnVuY3Rpb24gaW5pdCgpCi17Ci0gICAgdmFyIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwotICAgIHNjcmlwdC5zcmMgPSAic2hvdWxkLWxvYWQuanMiOwotICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc2NyaXB0KTsKLSAgICB2YXIgY29udGV4dERvYyA9IHdpbmRvdy50b3AuZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnQoIiIsIG51bGwpOwotICAgIGNvbnRleHREb2MuYWRvcHROb2RlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7Ci19Ci0KLWluaXQoKTsKLTwvc2NyaXB0PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZG9tL0hUTUxTY3JpcHRFbGVtZW50L3Jlc291cmNlcy9hcHBlbmQtY2hpbGQtYWRvcHQtbm9kZS1mcmFtZS5zdmcgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9kb20vSFRNTFNjcmlwdEVsZW1lbnQvcmVzb3VyY2VzL2FwcGVuZC1jaGlsZC1hZG9wdC1ub2RlLWZyYW1lLnN2ZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk1NjA4YTYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZG9tL0hUTUxTY3JpcHRFbGVtZW50L3Jlc291cmNlcy9hcHBlbmQtY2hpbGQtYWRvcHQtbm9kZS1mcmFtZS5zdmcKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNDAwIiBoZWlnaHQ9IjQwMCI+Ci08c2NyaXB0PgotZnVuY3Rpb24gaW5pdCgpCi17Ci0gICAgdmFyIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCAic2NyaXB0Iik7Ci0gICAgc2NyaXB0LnNldEF0dHJpYnV0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywgJ2hyZWYnLCAic2hvdWxkLWxvYWQuanMiKTsKLSAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoc2NyaXB0KTsKLSAgICB2YXIgY29udGV4dERvYyA9IHdpbmRvdy50b3AuZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnQoIiIsIG51bGwpOwotICAgIGNvbnRleHREb2MuYWRvcHROb2RlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7Ci19Ci1pbml0KCk7Ci08L3NjcmlwdD4KLTwvc3ZnPgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL2RvY3VtZW50LWVsZW1lbnRGcm9tUG9pbnQuaHRtbCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L2V2ZW50cy9kb2N1bWVudC1lbGVtZW50RnJvbVBvaW50Lmh0bWwKaW5kZXggYzhiNmJiMC4uZjcxZTNmMCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL2RvY3VtZW50LWVsZW1lbnRGcm9tUG9pbnQuaHRtbAorKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9ldmVudHMvZG9jdW1lbnQtZWxlbWVudEZyb21Qb2ludC5odG1sCkBAIC0yNTMsNyArMjUzLDcgQEAKICAgICAgICAgLy8gU2Nyb2xsIGJvZHkgYW5kIGlubmVyIG92ZXJmbG93IGJveC4KICAgICAgICAgd2luZG93LnNjcm9sbFRvKDIwLCAxMDApOwogICAgICAgICB2YXIgb3ZlcmZsb3dDb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ292ZXJmbG93Jyk7Ci0gICAgICAgIG92ZXJmbG93Q29udGVudC5zY3JvbGxMZWZ0ID0gODA7CisgICAgICAgIG92ZXJmbG93Q29udGVudC5zY3JvbGxMZWZ0ID0gMDsKICAgICAgICAgb3ZlcmZsb3dDb250ZW50LnNjcm9sbFRvcCA9IDYwOwogICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgLy8gRGlzcGF0Y2ggZXZlbnRzLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL29mZnNldFgtb2Zmc2V0WS5odG1sIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL29mZnNldFgtb2Zmc2V0WS5odG1sCmluZGV4IGQxYmI5NjUuLjAzMjcxMjYxIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9ldmVudHMvb2Zmc2V0WC1vZmZzZXRZLmh0bWwKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL29mZnNldFgtb2Zmc2V0WS5odG1sCkBAIC0yMCwxNSArMjAsMTUgQEAKICAgICAgIHZhciByZXN1bHRzRGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3VsdHMnKTsKICAgICAgIHJlc3VsdHNEaXYuaW5uZXJIVE1MICs9IHMgKyAnPGJyPic7CiAgICAgfQotICAgIAorCiAgICAgZnVuY3Rpb24gdGVzdCgpCiAgICAgewogICAgICAgLy8gU2Nyb2xsIHNvIHRoYXQgZnJhbWUgdmlldyBvZmZzZXRzIGFyZSBub24temVybwogICAgICAgd2luZG93LnNjcm9sbFRvKDIwLCAxMDApOwogCi0gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3ZlcmZsb3cnKS5zY3JvbGxMZWZ0ID0gODA7CisgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3ZlcmZsb3cnKS5zY3JvbGxMZWZ0ID0gMDsKICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvdmVyZmxvdycpLnNjcm9sbFRvcCA9IDYwOwotICAgICAgCisKICAgICAgIC8vIEluIG5vbi10ZXN0IG1vZGUsIHNob3cgdGhlIG1vdXNlIGNvb3JkcyBmb3IgdGVzdGluZwogICAgICAgaWYgKCF3aW5kb3cudGVzdFJ1bm5lcikKICAgICAgICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBtb3VzZW1vdmVkLCBmYWxzZSk7CkBAIC05NSw3ICs5NSw3IEBACiAgICAgICBpZiAod2luZG93LnRlc3RSdW5uZXIpCiAgICAgICAgIHRlc3RSdW5uZXIubm90aWZ5RG9uZSgpOwogICAgIH0KLSAgICAKKwogICAgIGZ1bmN0aW9uIHN1bVBvc2l0aW9ucyhlbGVtZW50KQogICAgIHsKICAgICAgICAgdmFyIG9mZnNldExlZnQgPSAwOwpAQCAtMTQxLDEzICsxNDEsMTMgQEAKIAogICAgICAgbG9nKHJlc3VsdCk7CiAgICAgfQotICAgIAorCiAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmdW5jdGlvbigpIHsKICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KHRlc3QsIDApOwogICAgIH0sIGZhbHNlKTsKICAgPC9zY3JpcHQ+CiAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiI+Ci0gIAorCiAgICAgYm9keSB7CiAgICAgICBoZWlnaHQ6IDIwNDhweDsKICAgICAgIHdpZHRoOiAyMDQ4cHg7CkBAIC0xNzAsNyArMTcwLDcgQEAKICAgICAgIHdpZHRoOiAyMDBweDsKICAgICAgIGJvcmRlcjogMTVweCBzb2xpZCBncmF5OwogICAgIH0KLSAgICAKKwogICAgICNyZWwtYm94IHsKICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgIGhlaWdodDogMTAwcHg7CkBAIC0xNzksNyArMTc5LDcgQEAKICAgICAgIHRvcDogLTUwcHg7CiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDOwogICAgIH0KLSAgICAKKwogICAgICNmaXhlZC1ib3ggewogICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgdG9wOiAyMHB4OwpAQCAtMTg4LDcgKzE4OCw3IEBACiAgICAgICBoZWlnaHQ6IDUwcHg7CiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjQUFBOwogICAgIH0KLSAgICAKKwogICAgICNjb2x1bW5zIHsKICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgIC13ZWJraXQtY29sdW1uLWNvdW50OiAzOwpAQCAtMTk3LDcgKzE5Nyw3IEBACiAgICAgICBsZWZ0OiA0NjBweDsKICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIGJsYWNrOwogICAgIH0KLSAgICAKKwogICAgICNpbi1jb2x1bW5zIHsKICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgaGVpZ2h0OiA0MHB4OwpAQCAtMjA2LDcgKzIwNiw3IEBACiAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBncmF5OwogICAgIH0KLSAgICAKKwogICAgICN0cmFuc2Zvcm1lZCB7CiAgICAgICBoZWlnaHQ6IDEyMHB4OwogICAgICAgd2lkdGg6IDIwMHB4OwpAQCAtMjIzLDEzICsyMjMsMTMgQEAKICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIGJsYWNrOwogICAgICAgZGlyZWN0aW9uOiBydGw7CiAgICAgfQotICAgIAorCiAgICAgI292ZXJmbG93LWNvbnRlbnRzIHsKICAgICAgIGhlaWdodDogNTAwcHg7CiAgICAgICB3aWR0aDogMTIwJTsKICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNCQkI7CiAgICAgfQotICAgIAorCiAgICAgI2luc2lkZS1vdmVyZmxvdyB7CiAgICAgICB3aWR0aDogNTAlOwogICAgICAgYmFja2dyb3VuZC1jb2xvcjogZ3JheTsKQEAgLTI0MCw3ICsyNDAsNyBAQAogICAgICAgbGVmdDogMzBweDsKICAgICAgIHRvcDogNzAwcHg7CiAgICAgfQotICAgIAorCiAgICAgI21vdXNlcG9zIHsKICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgIGxlZnQ6IDMwcHg7CkBAIC0yNDgsNyArMjQ4LDcgQEAKICAgICAgIGNvbG9yOiBncmF5OwogICAgICAgZm9udC1zaXplOiBzbWFsbGVyOwogICAgIH0KLSAgICAKKwogICAgIHRyIHsKIC8qICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMTBkZWcpOyovCiAgICAgfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLWFuaW1hdGlvbi1leHBlY3RlZC50eHQgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtYW5pbWF0aW9uLWV4cGVjdGVkLnR4dAppbmRleCBmNDFkYzc4Li5kNmU5MTAwMiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLWFuaW1hdGlvbi1leHBlY3RlZC50eHQKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLWFuaW1hdGlvbi1leHBlY3RlZC50eHQKQEAgLTEsMTAgKzEsMTAgQEAKIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGUgaGl0IHRlc3QgcmVnaW9ucyBhcmUgdXBkYXRlZCBjb3JyZWN0bHkgd2hlbiBjb21wb3NpdGVkIGxheWVyIGFyZSBjcmVhdGVkIGFuZCBkZXN0cm95ZWQgd2l0aG91dCB0cmlnZ2VyaW5nIGxheW91dCB1cGRhdGUgZHVyaW5nIGZhc3QgcGF0aCBhbmltYXRpb24uCiAKLVtvYmplY3QgSFRNTERpdkVsZW1lbnRdOiBsYXllcigwLDAgODAweDYwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDIwMCwyMDAgNTB4NTApCitbb2JqZWN0IEhUTUxEaXZFbGVtZW50XTogbGF5ZXIoODAweDYwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDIwMCwyMDAgNTB4NTApCiAKLVtvYmplY3QgSFRNTERpdkVsZW1lbnRdOiBsYXllcigyMDAsMjAwIDUweDUwKSBoYXMgaGl0IHRlc3QgcmVjdCAoMCwwIDUweDUwKQorW29iamVjdCBIVE1MRGl2RWxlbWVudF06IGxheWVyKDUweDUwKSBoYXMgaGl0IHRlc3QgcmVjdCAoMCwwIDUweDUwKQogCi1bb2JqZWN0IEhUTUxEaXZFbGVtZW50XTogbGF5ZXIoMCwwIDgwMHg2MDApIGhhcyBoaXQgdGVzdCByZWN0ICgxNzUsMTc1IDEwMHgxMDApCitbb2JqZWN0IEhUTUxEaXZFbGVtZW50XTogbGF5ZXIoODAweDYwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDE3NSwxNzUgMTAweDEwMCkKIAogCiBQQVNTIHN1Y2Nlc3NmdWxseVBhcnNlZCBpcyB0cnVlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtZ2xvYmFsLWV4cGVjdGVkLnR4dCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1nbG9iYWwtZXhwZWN0ZWQudHh0CmluZGV4IDdkYTVmZjMuLmQ2MDAzMmYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1nbG9iYWwtZXhwZWN0ZWQudHh0CisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1nbG9iYWwtZXhwZWN0ZWQudHh0CkBAIC0xLDExICsxLDExIEBACiBUaGlzIHRlc3RzIHZlcmlmaWVzIHRoZSBoaXQgdGVzdCByZWdpb25zIGdpdmVuIHRvIHRoZSBjb21wb3NpdG9yIGluIHRoZSBzaW1wbGUgY2FzZSB3aGVyZSB0b3VjaCBoYW5kbGVzIGNvdmVyIChvciBuZWFybHkgY292ZXIpIHRoZSBlbnRpcmUgZG9jdW1lbnQuIEl0IGNhbiBvbmx5IGJlIHJ1biBpbiBEdW1wUmVuZGVyVHJlZS4KIAotZG9jdW1lbnQ6IGxheWVyKDAsMCA4MDB4NjAwKSBoYXMgaGl0IHRlc3QgcmVjdCAoMCwwIDc4NXg2MDApCi1kb2N1bWVudDogbGF5ZXIoMCwwIDc4NXgyMDAwKSBoYXMgaGl0IHRlc3QgcmVjdCAoMCwwIDc4NXgyMDAwKQorZG9jdW1lbnQ6IGxheWVyKDgwMHg2MDApIGhhcyBoaXQgdGVzdCByZWN0ICgwLDAgNzg1eDYwMCkKK2RvY3VtZW50OiBsYXllcig3ODV4MjAwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDAsMCA3ODV4MjAwMCkKIAotaHRtbDogbGF5ZXIoMCwwIDc4NXgyMDAwKSBoYXMgaGl0IHRlc3QgcmVjdCAoMCwwIDc4NXgyMDAwKQoraHRtbDogbGF5ZXIoNzg1eDIwMDApIGhhcyBoaXQgdGVzdCByZWN0ICgwLDAgNzg1eDIwMDApCiAKLWJvZHk6IGxheWVyKDAsMCA3ODV4MjAwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDUsMTYgNzc1eDE5NjgpCitib2R5OiBsYXllcig3ODV4MjAwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDUsMTYgNzc1eDE5NjgpCiAKIHdlYlBhZ2VPdmVybGF5OiBubyByZWN0cwogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtaW1nLWVsZW1lbnQtZXhwZWN0ZWQudHh0IGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLWltZy1lbGVtZW50LWV4cGVjdGVkLnR4dAppbmRleCAzZGU3NDdlLi42OGIxYzU1OCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLWltZy1lbGVtZW50LWV4cGVjdGVkLnR4dAorKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtaW1nLWVsZW1lbnQtZXhwZWN0ZWQudHh0CkBAIC0xLDMgKzEsMyBAQAotOiBsYXllcigwLDAgODAweDYwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDgsOCAxM3gxMykKKzogbGF5ZXIoODAweDYwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDgsOCAxM3gxMykKIAogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtbGlzdC1uby10cmFuc2xhdGUtZXhwZWN0ZWQudHh0IGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLWxpc3Qtbm8tdHJhbnNsYXRlLWV4cGVjdGVkLnR4dAppbmRleCA2NGZiM2Q4Li43ZDRjZWUwMiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLWxpc3Qtbm8tdHJhbnNsYXRlLWV4cGVjdGVkLnR4dAorKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtbGlzdC1uby10cmFuc2xhdGUtZXhwZWN0ZWQudHh0CkBAIC0xLDMgKzEsMyBAQAotbGlzdDogbGF5ZXIoMCwwIDgwMHg2MDApIGhhcyBoaXQgdGVzdCByZWN0ICgxMywxMCAyOTB4MTQpCitsaXN0OiBsYXllcig4MDB4NjAwKSBoYXMgaGl0IHRlc3QgcmVjdCAoMTMsMTAgMjkweDE0KQogCiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1tYW55LWV4cGVjdGVkLnR4dCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1tYW55LWV4cGVjdGVkLnR4dAppbmRleCA0M2RhMTBhYy4uNmY2ZDZlNiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLW1hbnktZXhwZWN0ZWQudHh0CisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1tYW55LWV4cGVjdGVkLnR4dApAQCAtNSwxMDcgKzUsMTA3IEBACiBGQUlMIC0gZ290IDEwMSByZWN0cywgZXhwZWN0ZWQgMS4KIFRlc3Qgbm9kZSBoYXMgMTAxIGNoaWxkcmVuIHdpdGggMTAyIHJlY3RzCiBGQUlMIC0gZ290IDEwMiByZWN0cywgZXhwZWN0ZWQgMS4KLW1hbnljaGlsZHJlbjogbGF5ZXIoMTMsODAgMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgwLDAgMjkweDEyKQotbWFueWNoaWxkcmVuOiBsYXllcigxMyw4MCAzMDh4MTIyOCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDMwMSwyMSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDMzIDd4NykKLW1hbnljaGlsZHJlbjogbGF5ZXIoMTMsODAgMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsNDUgN3g3KQotbWFueWNoaWxkcmVuOiBsYXllcigxMyw4MCAzMDh4MTIyOCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDMwMSw1NyA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDY5IDd4NykKLW1hbnljaGlsZHJlbjogbGF5ZXIoMTMsODAgMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsODEgN3g3KQotbWFueWNoaWxkcmVuOiBsYXllcigxMyw4MCAzMDh4MTIyOCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDMwMSw5MyA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDEwNSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDExNyA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDEyOSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDE0MSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDE1MyA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDE2NSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDE3NyA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDE4OSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDIwMSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDIxMyA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDIyNSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDIzNyA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDI0OSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDI2MSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDI3MyA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDI4NSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDI5NyA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDMwOSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDMyMSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDMzMyA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDM0NSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDM1NyA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDM2OSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDM4MSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDM5MyA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDQwNSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDQxNyA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDQyOSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDQ0MSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDQ1MyA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDQ2NSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDQ3NyA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDQ4OSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDUwMSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDUxMyA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDUyNSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDUzNyA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDU0OSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDU2MSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDU3MyA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDU4NSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDU5NyA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDYwOSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDYyMSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDYzMyA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDY0NSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDY1NyA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDY2OSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDY4MSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDY5MyA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDcwNSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDcxNyA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDcyOSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDc0MSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDc1MyA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDc2NSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDc3NyA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDc4OSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDgwMSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDgxMyA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDgyNSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDgzNyA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDg0OSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDg2MSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDg3MyA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDg4NSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDg5NyA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDkwOSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDkyMSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDkzMyA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDk0NSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDk1NyA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDk2OSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDk4MSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDk5MyA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDEwMDUgN3g3KQotbWFueWNoaWxkcmVuOiBsYXllcigxMyw4MCAzMDh4MTIyOCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDMwMSwxMDE3IDd4NykKLW1hbnljaGlsZHJlbjogbGF5ZXIoMTMsODAgMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMTAyOSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDEwNDEgN3g3KQotbWFueWNoaWxkcmVuOiBsYXllcigxMyw4MCAzMDh4MTIyOCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDMwMSwxMDUzIDd4NykKLW1hbnljaGlsZHJlbjogbGF5ZXIoMTMsODAgMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMTA2NSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDEwNzcgN3g3KQotbWFueWNoaWxkcmVuOiBsYXllcigxMyw4MCAzMDh4MTIyOCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDMwMSwxMDg5IDd4NykKLW1hbnljaGlsZHJlbjogbGF5ZXIoMTMsODAgMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMTEwMSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDExMTMgN3g3KQotbWFueWNoaWxkcmVuOiBsYXllcigxMyw4MCAzMDh4MTIyOCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDMwMSwxMTI1IDd4NykKLW1hbnljaGlsZHJlbjogbGF5ZXIoMTMsODAgMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMTEzNyA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDExNDkgN3g3KQotbWFueWNoaWxkcmVuOiBsYXllcigxMyw4MCAzMDh4MTIyOCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDMwMSwxMTYxIDd4NykKLW1hbnljaGlsZHJlbjogbGF5ZXIoMTMsODAgMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMTE3MyA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDExODUgN3g3KQotbWFueWNoaWxkcmVuOiBsYXllcigxMyw4MCAzMDh4MTIyOCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDMwMSwxMTk3IDd4NykKLW1hbnljaGlsZHJlbjogbGF5ZXIoMTMsODAgMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMTIwOSA3eDcpCi1tYW55Y2hpbGRyZW46IGxheWVyKDEzLDgwIDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDEyMjEgN3g3KQorbWFueWNoaWxkcmVuOiBsYXllcigzMDh4MTIyOCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDAsMCAyOTB4MTIpCittYW55Y2hpbGRyZW46IGxheWVyKDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDIxIDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMzMgN3g3KQorbWFueWNoaWxkcmVuOiBsYXllcigzMDh4MTIyOCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDMwMSw0NSA3eDcpCittYW55Y2hpbGRyZW46IGxheWVyKDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDU3IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsNjkgN3g3KQorbWFueWNoaWxkcmVuOiBsYXllcigzMDh4MTIyOCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDMwMSw4MSA3eDcpCittYW55Y2hpbGRyZW46IGxheWVyKDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDkzIDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMTA1IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMTE3IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMTI5IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMTQxIDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMTUzIDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMTY1IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMTc3IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMTg5IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMjAxIDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMjEzIDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMjI1IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMjM3IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMjQ5IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMjYxIDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMjczIDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMjg1IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMjk3IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMzA5IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMzIxIDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMzMzIDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMzQ1IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMzU3IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMzY5IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMzgxIDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMzkzIDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsNDA1IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsNDE3IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsNDI5IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsNDQxIDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsNDUzIDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsNDY1IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsNDc3IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsNDg5IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsNTAxIDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsNTEzIDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsNTI1IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsNTM3IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsNTQ5IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsNTYxIDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsNTczIDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsNTg1IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsNTk3IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsNjA5IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsNjIxIDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsNjMzIDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsNjQ1IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsNjU3IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsNjY5IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsNjgxIDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsNjkzIDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsNzA1IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsNzE3IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsNzI5IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsNzQxIDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsNzUzIDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsNzY1IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsNzc3IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsNzg5IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsODAxIDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsODEzIDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsODI1IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsODM3IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsODQ5IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsODYxIDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsODczIDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsODg1IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsODk3IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsOTA5IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsOTIxIDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsOTMzIDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsOTQ1IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsOTU3IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsOTY5IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsOTgxIDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsOTkzIDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMTAwNSA3eDcpCittYW55Y2hpbGRyZW46IGxheWVyKDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDEwMTcgN3g3KQorbWFueWNoaWxkcmVuOiBsYXllcigzMDh4MTIyOCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDMwMSwxMDI5IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMTA0MSA3eDcpCittYW55Y2hpbGRyZW46IGxheWVyKDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDEwNTMgN3g3KQorbWFueWNoaWxkcmVuOiBsYXllcigzMDh4MTIyOCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDMwMSwxMDY1IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMTA3NyA3eDcpCittYW55Y2hpbGRyZW46IGxheWVyKDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDEwODkgN3g3KQorbWFueWNoaWxkcmVuOiBsYXllcigzMDh4MTIyOCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDMwMSwxMTAxIDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMTExMyA3eDcpCittYW55Y2hpbGRyZW46IGxheWVyKDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDExMjUgN3g3KQorbWFueWNoaWxkcmVuOiBsYXllcigzMDh4MTIyOCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDMwMSwxMTM3IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMTE0OSA3eDcpCittYW55Y2hpbGRyZW46IGxheWVyKDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDExNjEgN3g3KQorbWFueWNoaWxkcmVuOiBsYXllcigzMDh4MTIyOCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDMwMSwxMTczIDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMTE4NSA3eDcpCittYW55Y2hpbGRyZW46IGxheWVyKDMwOHgxMjI4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzAxLDExOTcgN3g3KQorbWFueWNoaWxkcmVuOiBsYXllcigzMDh4MTIyOCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDMwMSwxMjA5IDd4NykKK21hbnljaGlsZHJlbjogbGF5ZXIoMzA4eDEyMjgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMDEsMTIyMSA3eDcpCiAKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLW5vbi1jb21wb3NpdGVkLXNjcm9sbC1leHBlY3RlZC50eHQgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtbm9uLWNvbXBvc2l0ZWQtc2Nyb2xsLWV4cGVjdGVkLnR4dAppbmRleCBjZTQ5YWY2NC4uZDE4ZmIxZiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLW5vbi1jb21wb3NpdGVkLXNjcm9sbC1leHBlY3RlZC50eHQKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLW5vbi1jb21wb3NpdGVkLXNjcm9sbC1leHBlY3RlZC50eHQKQEAgLTEsMjAgKzEsMjAgQEAKIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGUgaGl0IHRlc3QgcmVnaW9ucyBnaXZlbiB0byB0aGUgY29tcG9zaXRvciBzcGVjaWZpY2FsbHkgYXJvdW5kIG5vbi1jb21wb3NpdGVkIG92ZXJmbG93IHNjcm9sbCBlbGVtZW50cy4KIAotc2Nyb2xsQ29udGVudDogbGF5ZXIoMCwwIDgwMHg2MDApIGhhcyBoaXQgdGVzdCByZWN0ICgxNCw2MyAyNzN4MTIpCitzY3JvbGxDb250ZW50OiBsYXllcig4MDB4NjAwKSBoYXMgaGl0IHRlc3QgcmVjdCAoMTQsNjMgMjczeDEyKQogCi1zY3JvbGxDb250YWluZXJXaXRoSGFuZGxlcjogbGF5ZXIoMCwwIDgwMHg2MDApIGhhcyBoaXQgdGVzdCByZWN0ICgxMyw4OSAyOTB4MzIpCitzY3JvbGxDb250YWluZXJXaXRoSGFuZGxlcjogbGF5ZXIoODAweDYwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDEzLDg5IDI5MHgzMikKIAotbmVzdGVkQ29udGVudDogbGF5ZXIoMCwwIDgwMHg2MDApIGhhcyBoaXQgdGVzdCByZWN0ICgxNSwxNDggMjU2eDkpCituZXN0ZWRDb250ZW50OiBsYXllcig4MDB4NjAwKSBoYXMgaGl0IHRlc3QgcmVjdCAoMTUsMTQ4IDI1Nng5KQogCi1maXhlZFBvc2l0aW9uQ29udGVudENvbnRhaW5lcjogbGF5ZXIoMCwwIDgwMHg2MDApIGhhcyBoaXQgdGVzdCByZWN0ICgxNCwxNzkgMjczeDEyKQotZml4ZWRQb3NpdGlvbkNvbnRlbnRDb250YWluZXI6IGxheWVyKDAsMCA4MDB4NjAwKSBoYXMgaGl0IHRlc3QgcmVjdCAoMzEwLDE5MCAxMzJ4MTIpCitmaXhlZFBvc2l0aW9uQ29udGVudENvbnRhaW5lcjogbGF5ZXIoODAweDYwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDE0LDE3OSAyNzN4MTIpCitmaXhlZFBvc2l0aW9uQ29udGVudENvbnRhaW5lcjogbGF5ZXIoODAweDYwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDMxMCwxOTAgMTMyeDEyKQogCi1vdmVyZmxvd3dpdGhoYW5kbGVyOiBsYXllcigwLDAgNzg1eDYyMykgaGFzIGhpdCB0ZXN0IHJlY3QgKDE0LDIyMSAyNzN4MjApCitvdmVyZmxvd3dpdGhoYW5kbGVyOiBsYXllcig3ODV4NjIzKSBoYXMgaGl0IHRlc3QgcmVjdCAoMTQsMjIxIDI3M3gyMCkKIAotZGl2SW5zaWRlTm9uU2Nyb2xsYWJsZUxheWVyOiBsYXllcigwLDAgNzg1eDY3MSkgaGFzIGhpdCB0ZXN0IHJlY3QgKDE0LDI3MyAyNzN4MTApCitkaXZJbnNpZGVOb25TY3JvbGxhYmxlTGF5ZXI6IGxheWVyKDc4NXg2NzEpIGhhcyBoaXQgdGVzdCByZWN0ICgxNCwyNzMgMjczeDEwKQogCi1kaXZJbnNpZGVDb21wb3NpdGVkTGF5ZXI6IGxheWVyKDE0LDMwNSAyNzN4MjIpIGhhcyBoaXQgdGVzdCByZWN0ICgwLDEwIDI3M3gxMikKK2Rpdkluc2lkZUNvbXBvc2l0ZWRMYXllcjogbGF5ZXIoMjczeDIyKSBoYXMgaGl0IHRlc3QgcmVjdCAoMCwxMCAyNzN4MTIpCiAKLW92ZXJmbG93d2l0aGJvcmRlcjogbGF5ZXIoMCwwIDc4NXg3NjcpIGhhcyBoaXQgdGVzdCByZWN0ICgxMywzMzYgMjkweDUwKQorb3ZlcmZsb3d3aXRoYm9yZGVyOiBsYXllcig3ODV4NzY3KSBoYXMgaGl0IHRlc3QgcmVjdCAoMTMsMzM2IDI5MHg1MCkKIAogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtbm9uLWNvbXBvc2l0ZWQtc2Nyb2xsLW92ZXJmbG93LXdpdGgtaGFuZGxlci1leHBlY3RlZC50eHQgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtbm9uLWNvbXBvc2l0ZWQtc2Nyb2xsLW92ZXJmbG93LXdpdGgtaGFuZGxlci1leHBlY3RlZC50eHQKaW5kZXggMTJiYzE4NC4uMWU0MGY0MiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLW5vbi1jb21wb3NpdGVkLXNjcm9sbC1vdmVyZmxvdy13aXRoLWhhbmRsZXItZXhwZWN0ZWQudHh0CisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1ub24tY29tcG9zaXRlZC1zY3JvbGwtb3ZlcmZsb3ctd2l0aC1oYW5kbGVyLWV4cGVjdGVkLnR4dApAQCAtMSw0ICsxLDQgQEAKLW5vdGNsaXBwZWQ6IGxheWVyKDAsMCA4MDB4NjAwKSBoYXMgaGl0IHRlc3QgcmVjdCAoMSw1MSAyMDB4MjUpCitub3RjbGlwcGVkOiBsYXllcig4MDB4NjAwKSBoYXMgaGl0IHRlc3QgcmVjdCAoMSw1MSAyMDB4MjUpCiAKIGNsaXBwZWQ6IG5vIHJlY3RzCiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1zY3JvbGwtZXhwZWN0ZWQudHh0IGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLXNjcm9sbC1leHBlY3RlZC50eHQKaW5kZXggZmJhNGIxMC4uNDdkMzVjM2EgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1zY3JvbGwtZXhwZWN0ZWQudHh0CisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1zY3JvbGwtZXhwZWN0ZWQudHh0CkBAIC0xLDIwICsxLDIwIEBACiBUaGlzIHRlc3QgdmVyaWZpZXMgdGhlIGhpdCB0ZXN0IHJlZ2lvbnMgZ2l2ZW4gdG8gdGhlIGNvbXBvc2l0b3Igc3BlY2lmaWNhbGx5IGFyb3VuZCBjb21wb3NpdGVkIG92ZXJmbG93IHNjcm9sbCBlbGVtZW50cy4KIAotc2Nyb2xsQ29udGVudDogbGF5ZXIoMCwwIDI3M3g3NSkgaGFzIGhpdCB0ZXN0IHJlY3QgKDAsMTMgMjczeDEyKQorc2Nyb2xsQ29udGVudDogbGF5ZXIoMjczeDc1KSBoYXMgaGl0IHRlc3QgcmVjdCAoMCwxMyAyNzN4MTIpCiAKLXNjcm9sbENvbnRlbnQ1OiBsYXllcigwLDAgMjczeDg1KSBoYXMgaGl0IHRlc3QgcmVjdCAoMCwxMyAyNzN4MTIpCitzY3JvbGxDb250ZW50NTogbGF5ZXIoMjczeDg1KSBoYXMgaGl0IHRlc3QgcmVjdCAoMCwxMyAyNzN4MTIpCiAKLXNjcm9sbENvbnRlbnQ2OiBsYXllcigxNCwyMDMgMjczeDEyKSBoYXMgaGl0IHRlc3QgcmVjdCAoMCwwIDI3M3gxMikKK3Njcm9sbENvbnRlbnQ2OiBsYXllcigyNzN4MTIpIGhhcyBoaXQgdGVzdCByZWN0ICgwLDAgMjczeDEyKQogCi1uZXN0ZWRDb250ZW50OiBsYXllcigwLDAgMjU2eDcyKSBoYXMgaGl0IHRlc3QgcmVjdCAoMCwzMCAyNTZ4MTIpCituZXN0ZWRDb250ZW50OiBsYXllcigyNTZ4NzIpIGhhcyBoaXQgdGVzdCByZWN0ICgwLDMwIDI1NngxMikKIAotb3ZlcmZsb3d3aXRoaGFuZGxlcjogbGF5ZXIoMCwwIDI1NngxMTYpIGhhcyBoaXQgdGVzdCByZWN0ICgwLDAgMjU2eDExNikKLW92ZXJmbG93d2l0aGhhbmRsZXI6IGxheWVyKDAsMTAgMjczeDUyKSBoYXMgaGl0IHRlc3QgcmVjdCAoMCwwIDI3M3g1MikKK292ZXJmbG93d2l0aGhhbmRsZXI6IGxheWVyKDI1NngxMTYpIGhhcyBoaXQgdGVzdCByZWN0ICgwLDAgMjU2eDExNikKK292ZXJmbG93d2l0aGhhbmRsZXI6IGxheWVyKDI3M3g1MikgaGFzIGhpdCB0ZXN0IHJlY3QgKDAsMCAyNzN4NTIpCiAKLW92ZXJmbG93d2l0aGJvcmRlcjogbGF5ZXIoMTMsMzY1IDI5MHg3MCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDAsMCAyOTB4NzApCi1vdmVyZmxvd3dpdGhib3JkZXI6IGxheWVyKDAsMCAyNjN4MTI0KSBoYXMgaGl0IHRlc3QgcmVjdCAoNCw0IDI1NXgxMTYpCitvdmVyZmxvd3dpdGhib3JkZXI6IGxheWVyKDI5MHg3MCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDAsMCAyOTB4NzApCitvdmVyZmxvd3dpdGhib3JkZXI6IGxheWVyKDI2M3gxMjQpIGhhcyBoaXQgdGVzdCByZWN0ICg0LDQgMjU1eDExNikKIAotd2l0aFRyYW5zZm9ybTogbGF5ZXIoMTUsNDM1IDI3MXgxMikgaGFzIGhpdCB0ZXN0IHJlY3QgKDAsMCAyNzF4MTIpCi13aXRoVHJhbnNmb3JtOiBsYXllcigwLDAgMjgyeDc3KSBoYXMgaGl0IHRlc3QgcmVjdCAoMCwxMyAyNzN4MTQpCit3aXRoVHJhbnNmb3JtOiBsYXllcigyNzF4MTIpIGhhcyBoaXQgdGVzdCByZWN0ICgwLDAgMjcxeDEyKQord2l0aFRyYW5zZm9ybTogbGF5ZXIoMjgyeDc3KSBoYXMgaGl0IHRlc3QgcmVjdCAoMCwxMyAyNzN4MTQpCiAKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLXNxdWFzaGluZy1leHBlY3RlZC50eHQgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtc3F1YXNoaW5nLWV4cGVjdGVkLnR4dAppbmRleCBiY2E1ZTlkLi5hYzEyMzliIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtc3F1YXNoaW5nLWV4cGVjdGVkLnR4dAorKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtc3F1YXNoaW5nLWV4cGVjdGVkLnR4dApAQCAtMSw5ICsxLDkgQEAKIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGUgaGl0IHRlc3QgcmVnaW9ucyBnaXZlbiB0byB0aGUgY29tcG9zaXRvciBmb3IgY29tcG9zaXRlZCBsYXllciBzcXVhc2hpbmcuCiAKLWJlaGluZDogbGF5ZXIoNjUsOTUgNTJ4NTIpIGhhcyBoaXQgdGVzdCByZWN0ICgwLDAgNTJ4NTIpCitiZWhpbmQ6IGxheWVyKDUyeDUyKSBoYXMgaGl0IHRlc3QgcmVjdCAoMCwwIDUyeDUyKQogCi1taWRkbGU6IGxheWVyKDI1LDU1IDEzMngxMzIpIGhhcyBoaXQgdGVzdCByZWN0ICgwLDAgNTJ4NTIpCittaWRkbGU6IGxheWVyKDEzMngxMzIpIGhhcyBoaXQgdGVzdCByZWN0ICgwLDAgNTJ4NTIpCiAKLXRvcDogbGF5ZXIoMjUsNTUgMTMyeDEzMikgaGFzIGhpdCB0ZXN0IHJlY3QgKDgwLDgwIDUyeDUyKQordG9wOiBsYXllcigxMzJ4MTMyKSBoYXMgaGl0IHRlc3QgcmVjdCAoODAsODAgNTJ4NTIpCiAKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLXN2Zy1jb250YWluZXItZXhwZWN0ZWQudHh0IGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLXN2Zy1jb250YWluZXItZXhwZWN0ZWQudHh0CmluZGV4IGE1NTRmNmYyLi4xMjVlYmVlIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtc3ZnLWNvbnRhaW5lci1leHBlY3RlZC50eHQKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLXN2Zy1jb250YWluZXItZXhwZWN0ZWQudHh0CkBAIC0xLDMgKzEsMyBAQAotOiBsYXllcigwLDAgODAweDYwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDgsMTQgNTR4MTgpCis6IGxheWVyKDgwMHg2MDApIGhhcyBoaXQgdGVzdCByZWN0ICg4LDE0IDU0eDE4KQogCiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1zdmctZXhwZWN0ZWQudHh0IGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLXN2Zy1leHBlY3RlZC50eHQKaW5kZXggMmZlNGU5OC4uZDIxMDQ1NiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLXN2Zy1leHBlY3RlZC50eHQKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLXN2Zy1leHBlY3RlZC50eHQKQEAgLTEsNSArMSw1IEBACiBUaGlzIHRlc3RzIHZlcmlmaWVzIHRoZSBoaXQgdGVzdCByZWdpb25zIGdpdmVuIHRvIHRoZSBjb21wb3NpdG9yIGZvciBzdmcgZWxlbWVudHMuIEl0IGNhbiBvbmx5IGJlIHJ1biBpbiBEdW1wUmVuZGVyVHJlZS4KIAotc3ZnbGluZTogbGF5ZXIoMCwwIDgwMHg2MDApIGhhcyBoaXQgdGVzdCByZWN0ICgxMyw4NCAyMngzKQorc3ZnbGluZTogbGF5ZXIoODAweDYwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDEzLDg0IDIyeDMpCiAKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLXN2Zy1mb3JlaWduLW9iamVjdC1leHBlY3RlZC50eHQgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtc3ZnLWZvcmVpZ24tb2JqZWN0LWV4cGVjdGVkLnR4dAppbmRleCA1Y2RjOWM3Li5hMzExYzI2YiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLXN2Zy1mb3JlaWduLW9iamVjdC1leHBlY3RlZC50eHQKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLXN2Zy1mb3JlaWduLW9iamVjdC1leHBlY3RlZC50eHQKQEAgLTEsMyArMSwzIEBACi06IGxheWVyKDAsMCA4MDB4NjAwKSBoYXMgaGl0IHRlc3QgcmVjdCAoOCw4IDUxeDMxKQorOiBsYXllcig4MDB4NjAwKSBoYXMgaGl0IHRlc3QgcmVjdCAoOCw4IDUxeDMxKQogCiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1zdmctaW1hZ2UtZXhwZWN0ZWQudHh0IGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLXN2Zy1pbWFnZS1leHBlY3RlZC50eHQKaW5kZXggYmFiNzY0OS4uNDJhZWMwMTMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1zdmctaW1hZ2UtZXhwZWN0ZWQudHh0CisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1zdmctaW1hZ2UtZXhwZWN0ZWQudHh0CkBAIC0xLDMgKzEsMyBAQAotOiBsYXllcigwLDAgODAweDYwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDgsOCAyMHgyMCkKKzogbGF5ZXIoODAweDYwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDgsOCAyMHgyMCkKIAogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtc3ZnLXJvb3QtZXhwZWN0ZWQudHh0IGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLXN2Zy1yb290LWV4cGVjdGVkLnR4dAppbmRleCAwNTBjMTBjLi5hODcwZTA4IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtc3ZnLXJvb3QtZXhwZWN0ZWQudHh0CisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1zdmctcm9vdC1leHBlY3RlZC50eHQKQEAgLTEsMyArMSwzIEBACi06IGxheWVyKDAsMCA4MDB4NjAwKSBoYXMgaGl0IHRlc3QgcmVjdCAoOCw4IDUzeDU0KQorOiBsYXllcig4MDB4NjAwKSBoYXMgaGl0IHRlc3QgcmVjdCAoOCw4IDUzeDU0KQogCiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1zdmctdGV4dC1leHBlY3RlZC50eHQgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtc3ZnLXRleHQtZXhwZWN0ZWQudHh0CmluZGV4IGE1NTRmNmYyLi4xMjVlYmVlIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtc3ZnLXRleHQtZXhwZWN0ZWQudHh0CisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1zdmctdGV4dC1leHBlY3RlZC50eHQKQEAgLTEsMyArMSwzIEBACi06IGxheWVyKDAsMCA4MDB4NjAwKSBoYXMgaGl0IHRlc3QgcmVjdCAoOCwxNCA1NHgxOCkKKzogbGF5ZXIoODAweDYwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDgsMTQgNTR4MTgpCiAKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLXRhYmxlLWV4cGVjdGVkLnR4dCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy10YWJsZS1leHBlY3RlZC50eHQKaW5kZXggNzkyMjAwMy4uNDUwNTBkNCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLXRhYmxlLWV4cGVjdGVkLnR4dAorKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtdGFibGUtZXhwZWN0ZWQudHh0CkBAIC0xLDcgKzEsNyBAQAotOiBsYXllcigwLDAgODAweDYwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDgsOCAxMTZ4MjApCis6IGxheWVyKDgwMHg2MDApIGhhcyBoaXQgdGVzdCByZWN0ICg4LDggMTE2eDIwKQogCi06IGxheWVyKDAsMCA4MDB4NjAwKSBoYXMgaGl0IHRlc3QgcmVjdCAoOCwzMCAxMTR4MTQpCis6IGxheWVyKDgwMHg2MDApIGhhcyBoaXQgdGVzdCByZWN0ICg4LDMwIDExNHgxNCkKIAotOiBsYXllcigwLDAgODAweDYwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDEwLDQ4IDU0eDE0KQorOiBsYXllcig4MDB4NjAwKSBoYXMgaGl0IHRlc3QgcmVjdCAoMTAsNDggNTR4MTQpCiAKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLXRyYW5zZm9ybS1jaGFuZ2VkLW5vbGF5b3V0LWV4cGVjdGVkLnR4dCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy10cmFuc2Zvcm0tY2hhbmdlZC1ub2xheW91dC1leHBlY3RlZC50eHQKaW5kZXggNThmYWEzOC4uOTIxYWM3MyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLXRyYW5zZm9ybS1jaGFuZ2VkLW5vbGF5b3V0LWV4cGVjdGVkLnR4dAorKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtdHJhbnNmb3JtLWNoYW5nZWQtbm9sYXlvdXQtZXhwZWN0ZWQudHh0CkBAIC0xLDcgKzEsNyBAQAogVGhpcyB0ZXN0IHZlcmlmaWVzIHRoZSB0b3VjaCBldmVudCB0YXJnZXQgcmVjdHMgYXJlIHVwZGF0ZWQgY29ycmVjdGx5IHdoZW4gYW4gZWxlbWVudCB0cmFuc2Zyb21zIHdpdGhvdXQgY2F1c2luZyBsYXlvdXQuCiAKLVtvYmplY3QgSFRNTERpdkVsZW1lbnRdOiBsYXllcigwLDAgODAweDYwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDEwMCwxMDAgNTB4NTApCitbb2JqZWN0IEhUTUxEaXZFbGVtZW50XTogbGF5ZXIoODAweDYwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDEwMCwxMDAgNTB4NTApCiAKLVtvYmplY3QgSFRNTERpdkVsZW1lbnRdOiBsYXllcigwLDAgODAweDYwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDE1MCwxMDAgNTB4NTApCitbb2JqZWN0IEhUTUxEaXZFbGVtZW50XTogbGF5ZXIoODAweDYwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDE1MCwxMDAgNTB4NTApCiAKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLXZpc2liaWxpdHktaGlkZGVuLWV4cGVjdGVkLnR4dCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy12aXNpYmlsaXR5LWhpZGRlbi1leHBlY3RlZC50eHQKaW5kZXggMDhmZjFkZS4uNDg5MmQ2YSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLXZpc2liaWxpdHktaGlkZGVuLWV4cGVjdGVkLnR4dAorKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtdmlzaWJpbGl0eS1oaWRkZW4tZXhwZWN0ZWQudHh0CkBAIC0yLDI0ICsyLDI0IEBACiAKIDogbm8gcmVjdHMKIAotOiBsYXllcigwLDAgNzg1eDExMTgpIGhhcyBoaXQgdGVzdCByZWN0ICgxMywyMjAgNDJ4NDIpCis6IGxheWVyKDc4NXgxMTE4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMTMsMjIwIDQyeDQyKQogCi06IGxheWVyKDAsMCA3ODV4MTE2NikgaGFzIGhpdCB0ZXN0IHJlY3QgKDEzLDMyNSAxMDJ4MTAyKQorOiBsYXllcig3ODV4MTE2NikgaGFzIGhpdCB0ZXN0IHJlY3QgKDEzLDMyNSAxMDJ4MTAyKQogCiA6IG5vIHJlY3RzCiAKLTogbGF5ZXIoMCwwIDc4NXgxMjQ2KSBoYXMgaGl0IHRlc3QgcmVjdCAoOCw1MzIgMTAweDEwMCkKKzogbGF5ZXIoNzg1eDEyNDYpIGhhcyBoaXQgdGVzdCByZWN0ICg4LDUzMiAxMDB4MTAwKQogCiA6IG5vIHJlY3RzCiAKLTogbGF5ZXIoMCwwIDc4NXgxMzI2KSBoYXMgaGl0IHRlc3QgcmVjdCAoOCw3MzggMTAweDEwMCkKKzogbGF5ZXIoNzg1eDEzMjYpIGhhcyBoaXQgdGVzdCByZWN0ICg4LDczOCAxMDB4MTAwKQogCiA6IG5vIHJlY3RzCiAKLTogbGF5ZXIoMCwwIDc4NXgxNDA2KSBoYXMgaGl0IHRlc3QgcmVjdCAoMTIwLDg0MCAxMDJ4MTAyKQorOiBsYXllcig3ODV4MTQwNikgaGFzIGhpdCB0ZXN0IHJlY3QgKDEyMCw4NDAgMTAyeDEwMikKIAogOiBubyByZWN0cwogCi06IGxheWVyKDAsMCA3ODV4MTQ4NikgaGFzIGhpdCB0ZXN0IHJlY3QgKDExOCw5NDQgMTAweDEwMCkKKzogbGF5ZXIoNzg1eDE0ODYpIGhhcyBoaXQgdGVzdCByZWN0ICgxMTgsOTQ0IDEwMHgxMDApCiAKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLXdpdGgtbmVnYXRpdmUtY2hpbGQtZXhwZWN0ZWQudHh0IGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLXdpdGgtbmVnYXRpdmUtY2hpbGQtZXhwZWN0ZWQudHh0CmluZGV4IGQzYzFmYmUuLjdjYjEyMmIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy13aXRoLW5lZ2F0aXZlLWNoaWxkLWV4cGVjdGVkLnR4dAorKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtd2l0aC1uZWdhdGl2ZS1jaGlsZC1leHBlY3RlZC50eHQKQEAgLTEsNSArMSw1IEBACiBUaGlzIHRlc3RzIHZlcmlmaWVzIHRoZSBoaXQgdGVzdCByZWdpb25zIGdpdmVuIHRvIHRoZSBjb21wb3NpdG9yIGZvciBhbiBlbGVtZW50IHdpdGggY2hpbGQgYXQgbmVnYXRpdmUgb2Zmc2V0LiBJdCBjYW4gb25seSBiZSBydW4gaW4gRHVtcFJlbmRlclRyZWUuCiAKLW5lZ2F0aXZlT2Zmc2V0Q2hpbGQ6IGxheWVyKC05Niw5NiAyMTF4MTMpIGhhcyBoaXQgdGVzdCByZWN0ICgwLDEgMTAyeDEyKQorbmVnYXRpdmVPZmZzZXRDaGlsZDogbGF5ZXIoMjExeDEzKSBoYXMgaGl0IHRlc3QgcmVjdCAoMCwxIDEwMngxMikKIAogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9ldmVudHMvdG91Y2gvcmVzb3VyY2VzL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLmpzIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL3RvdWNoL3Jlc291cmNlcy9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy5qcwppbmRleCA2Zjg2Y2JiLi4zODExMGUzZiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3QvZXZlbnRzL3RvdWNoL3Jlc291cmNlcy9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy5qcworKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9ldmVudHMvdG91Y2gvcmVzb3VyY2VzL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLmpzCkBAIC02MSw3ICs2MSw4IEBACiAgICAgc29ydGVkUmVjdHMuc29ydChzb3J0UmVjdHMpOwogICAgIGZvciAoIHZhciBpID0gMDsgaSA8IHNvcnRlZFJlY3RzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgIHZhciByZWN0ID0gc29ydGVkUmVjdHNbaV0ubGF5ZXJSZWN0OwotICAgICAgICB2YXIgcmVjdF9zdHJpbmcgPSBgJHtyZWN0Lnh9LCR7cmVjdC55fSAke3JlY3Qud2lkdGh9eCR7cmVjdC5oZWlnaHR9YDsKKyAgICAgICAgLy8gTG9nZ2luZyB3aWR0aC9oZWlnaHQgZm9yIGxheWVyIGlkZW50aWZpY2F0aW9uIGFzc2lzdGFuY2UuCisgICAgICAgIHZhciByZWN0X3N0cmluZyA9IGAke3JlY3Qud2lkdGh9eCR7cmVjdC5oZWlnaHR9YDsKICAgICAgICAgdmFyIGhpdCA9IHNvcnRlZFJlY3RzW2ldLmhpdFRlc3RSZWN0OwogICAgICAgICB2YXIgaGl0X3N0cmluZyA9IGAke2hpdC54fSwke2hpdC55fSAke2hpdC53aWR0aH14JHtoaXQuaGVpZ2h0fWA7CiAgICAgICAgIGxvZyhgJHt0ZXN0TmFtZX06IGxheWVyKCR7cmVjdF9zdHJpbmd9KSBoYXMgaGl0IHRlc3QgcmVjdCAoJHtoaXRfc3RyaW5nfSlgKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L2Zvcm1zL3RleHRhcmVhL3RleHRhcmVhLXNlbGVjdGlvbi1zZWxlY3RBbGwuaHRtbCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L2Zvcm1zL3RleHRhcmVhL3RleHRhcmVhLXNlbGVjdGlvbi1zZWxlY3RBbGwuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDc4YjVkZQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L2Zvcm1zL3RleHRhcmVhL3RleHRhcmVhLXNlbGVjdGlvbi1zZWxlY3RBbGwuaHRtbApAQCAtMCwwICsxLDE5IEBACis8IWRvY3R5cGUgaHRtbD4KKzxtZXRhIGNoYXJzZXQ9dXRmLTg+Cis8dGl0bGU+VGhpcyB0ZXN0IHNlbGVjdEFsbCBpbiB0ZXh0YXJlYS48L3RpdGxlPgorPGxpbmsgcmVsPSJhdXRob3IiIHRpdGxlPSJ5dS5oYW4iIGhyZWY9Im1haWx0bzp5dXpoZWhhbkBjaHJvbWl1bS5vcmciPgorPGxpbmsgcmVsPSJoZWxwIiBocmVmPSJodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS8jZG9tLXRleHRhcmVhL2lucHV0LXNldHNlbGVjdGlvbnJhbmdlIj4KKzxzY3JpcHQgc3JjPS4uLy4uLy4uL3Jlc291cmNlcy90ZXN0aGFybmVzcy5qcz48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPS4uLy4uLy4uL3Jlc291cmNlcy90ZXN0aGFybmVzc3JlcG9ydC5qcz48L3NjcmlwdD4KKzxkaXYgaWQ9bG9nPjwvZGl2PgorPGZvcm0gaWQ9ImZvcm0iPjx0ZXh0YXJlYSBpZD0iZm9ybS10ZXh0YXJlYSI+PC90ZXh0YXJlYT48L2Zvcm0+Cis8c2NyaXB0PgordGVzdChmdW5jdGlvbigpIHsKKyAgICB2YXIgdGV4dGFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9ybS10ZXh0YXJlYScpOworICAgIHRleHRhcmVhLnZhbHVlID0gJ2Fcbic7CisgICAgdGV4dGFyZWEuZm9jdXMoKTsKKyAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnc2VsZWN0QWxsJyk7CisgICAgYXNzZXJ0X2VxdWFscyh0ZXh0YXJlYS5zZWxlY3Rpb25TdGFydCwgMCwgJ3RleHRhcmVhLnNlbGVjdGlvblN0YXJ0Jyk7CisgICAgYXNzZXJ0X2VxdWFscyh0ZXh0YXJlYS5zZWxlY3Rpb25FbmQsIDIsICd0ZXh0YXJlYS5zZWxlY3Rpb25FbmQnKTsKK30sICd0ZXh0YXJlYSBzZWxlY3Rpb24gaW5kZXggaXMgY29ycmVjdCB3aGVuIHRleHQgZW5kcyBpbiBuZXdsaW5lJyk7Cis8L3NjcmlwdD4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L292ZXJmbG93L292ZXJmbG93LXJ0bC12ZXJ0aWNhbC1vcmlnaW4uaHRtbCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L292ZXJmbG93L292ZXJmbG93LXJ0bC12ZXJ0aWNhbC1vcmlnaW4uaHRtbAppbmRleCBmOWQyYjc5Li45NjNkMTI1IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9vdmVyZmxvdy9vdmVyZmxvdy1ydGwtdmVydGljYWwtb3JpZ2luLmh0bWwKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3Qvb3ZlcmZsb3cvb3ZlcmZsb3ctcnRsLXZlcnRpY2FsLW9yaWdpbi5odG1sCkBAIC00LDcgKzQsNyBAQAogICAgICAgICA8ZGl2IHN0eWxlPSJoZWlnaHQ6IDMwMHB4OyB3aWR0aDogMTAwcHg7Ij48L2Rpdj4KICAgICA8L2Rpdj4KICAgICA8cHJlIGlkPSJjb25zb2xlIj48L3ByZT4KLSAgICAKKwogICAgIDxzY3JpcHQ+CiAgICAgICAgIGZ1bmN0aW9uIGxvZyhtc2cpCiAgICAgICAgIHsKQEAgLTE2LDEyICsxNiwxMiBAQAogCiAgICAgICAgIHZhciB0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRlc3QiKTsKICAgICAgICAgdmFyIGluaXRpYWxUb3AgPSB0LnNjcm9sbFRvcDsKLSAgICAgICAgCi0gICAgICAgIC8vIFNjcm9sbCBhcyBmYXIgYXMgeW91IGNhbi4KLSAgICAgICAgdC5zY3JvbGxUb3AgPSAxMDAwOwotICAgICAgICAKKworICAgICAgICAvLyBTY3JvbGwgdG8gdGhlIHRvcCBlZGdlLgorICAgICAgICB0LnNjcm9sbFRvcCA9IDA7CisKICAgICAgICAgdmFyIG5ld1RvcCA9IHQuc2Nyb2xsVG9wCi0gICAgICAgIAorCiAgICAgICAgIGlmIChpbml0aWFsVG9wID09IG5ld1RvcCkKICAgICAgICAgICAgIGxvZygiUEFTUzogdGVzdC5zY3JvbGxUb3AgaXMgY29ycmVjdC4iKQogICAgICAgICBlbHNlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9vdmVyZmxvdy9ydGwtc2Nyb2xsYmFyLWRyYWctb3JpZ2luLWV4cGVjdGVkLnR4dCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L292ZXJmbG93L3J0bC1zY3JvbGxiYXItZHJhZy1vcmlnaW4tZXhwZWN0ZWQudHh0CmluZGV4IGZhYjIzMmEuLjdjYWM0ZGEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L292ZXJmbG93L3J0bC1zY3JvbGxiYXItZHJhZy1vcmlnaW4tZXhwZWN0ZWQudHh0CisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L292ZXJmbG93L3J0bC1zY3JvbGxiYXItZHJhZy1vcmlnaW4tZXhwZWN0ZWQudHh0CkBAIC0xLDUgKzEsNSBAQAotUEFTUyBjb250YWluZXIuc2Nyb2xsTGVmdCBpcyAwCi1QQVNTIGNvbnRhaW5lci5zY3JvbGxMZWZ0IGlzIDM1MAorUEFTUyBjb250YWluZXIuc2Nyb2xsTGVmdCBpcyAtNzE1CitQQVNTIGNvbnRhaW5lci5zY3JvbGxMZWZ0IGlzIC0zNjUKIFBBU1Mgc3VjY2Vzc2Z1bGx5UGFyc2VkIGlzIHRydWUKIAogVEVTVCBDT01QTEVURQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3Qvb3ZlcmZsb3cvcnRsLXNjcm9sbGJhci1kcmFnLW9yaWdpbi5odG1sIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3Qvb3ZlcmZsb3cvcnRsLXNjcm9sbGJhci1kcmFnLW9yaWdpbi5odG1sCmluZGV4IGM2NjRlYjUuLmM4MDg3YTcgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L292ZXJmbG93L3J0bC1zY3JvbGxiYXItZHJhZy1vcmlnaW4uaHRtbAorKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9vdmVyZmxvdy9ydGwtc2Nyb2xsYmFyLWRyYWctb3JpZ2luLmh0bWwKQEAgLTI1LDcgKzI1LDcgQEAKIDxzY3JpcHQ+CiAgICAgd2luZG93LmpzVGVzdElzQXN5bmMgPSB0cnVlOwogICAgIHZhciBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29udGFpbmVyIik7Ci0gICAgY29udGFpbmVyLnNjcm9sbExlZnQgPSAzNTA7CisgICAgY29udGFpbmVyLnNjcm9sbExlZnQgPSAtMzY1OwogCiAgICAgaWYgKHdpbmRvdy5ldmVudFNlbmRlcikgewogICAgICAgICBldmVudFNlbmRlci5kcmFnTW9kZSA9IGZhbHNlOwpAQCAtMzQsMTAgKzM0LDEwIEBACiAKICAgICAgICAgZXZlbnRTZW5kZXIubW91c2VNb3ZlVG8oMTAwLCAxOTUpOwogICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICBzaG91bGRCZSgiY29udGFpbmVyLnNjcm9sbExlZnQiICwgIjAiKTsKKyAgICAgICAgICAgIHNob3VsZEJlKCJjb250YWluZXIuc2Nyb2xsTGVmdCIgLCAiLTcxNSIpOwogICAgICAgICAgICAgZXZlbnRTZW5kZXIubW91c2VNb3ZlVG8oMTAwLCA3MDApOwogICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgICBzaG91bGRCZSgiY29udGFpbmVyLnNjcm9sbExlZnQiICwgIjM1MCIpOworICAgICAgICAgICAgICBzaG91bGRCZSgiY29udGFpbmVyLnNjcm9sbExlZnQiICwgIi0zNjUiKTsKICAgICAgICAgICAgICAgZmluaXNoSlNUZXN0KCk7CiAgICAgICAgICAgICB9KTsKICAgICAgICAgfSk7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9vdmVyZmxvdy9zY3JvbGwtZGl2LWhpZGUtc2hvdy1leHBlY3RlZC50eHQgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9vdmVyZmxvdy9zY3JvbGwtZGl2LWhpZGUtc2hvdy1leHBlY3RlZC50eHQKaW5kZXggNTRiYmRiZC4uNjU5ZDVhYTkgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L292ZXJmbG93L3Njcm9sbC1kaXYtaGlkZS1zaG93LWV4cGVjdGVkLnR4dAorKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9vdmVyZmxvdy9zY3JvbGwtZGl2LWhpZGUtc2hvdy1leHBlY3RlZC50eHQKQEAgLTU2LDEzICs1NiwxMyBAQAogCiAKIFRlc3RpbmcgdGhhdCBzY3JvbGwgcG9zaXRpb24gaXMgcmVzdG9yZWQgZm9yIFJUTCB0ZXh0cwotU2Nyb2xsaW5nIHRvIDUwLCAxNTAKK1Njcm9sbGluZyB0byAtNTAsIDE1MAogRGl2J3MgZGlzcGxheSBpcyBub25lIG5vdwogUEFTUyBlLnNjcm9sbFRvcCBpcyAwCiBQQVNTIGUuc2Nyb2xsTGVmdCBpcyAwCiBEaXYncyBkaXNwbGF5IGlzIGJsb2NrIGFnYWluCiBQQVNTIGUuc2Nyb2xsVG9wIGlzIDE1MAotUEFTUyBlLnNjcm9sbExlZnQgaXMgNTAKK1BBU1MgZS5zY3JvbGxMZWZ0IGlzIC01MAogCiAKIFRlc3QgaWZyYW1lIHNjcm9sbGluZwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3Qvb3ZlcmZsb3cvc2Nyb2xsLWRpdi1oaWRlLXNob3cuaHRtbCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L292ZXJmbG93L3Njcm9sbC1kaXYtaGlkZS1zaG93Lmh0bWwKaW5kZXggMTk4YmYxNTUuLmRmYjQ0NDkgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L292ZXJmbG93L3Njcm9sbC1kaXYtaGlkZS1zaG93Lmh0bWwKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3Qvb3ZlcmZsb3cvc2Nyb2xsLWRpdi1oaWRlLXNob3cuaHRtbApAQCAtMTM4LDkgKzEzOCw5IEBACiAKIGUuZGlyPSJydGwiOwogCi1kZWJ1ZygiU2Nyb2xsaW5nIHRvIDUwLCAxNTAiKTsKK2RlYnVnKCJTY3JvbGxpbmcgdG8gLTUwLCAxNTAiKTsKIGUuc2Nyb2xsVG9wID0gMTUwOwotZS5zY3JvbGxMZWZ0ID0gNTA7CitlLnNjcm9sbExlZnQgPSAtNTA7CiBkZWJ1ZygiRGl2J3MgZGlzcGxheSBpcyBub25lIG5vdyIpOwogZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogc2hvdWxkQmUoJ2Uuc2Nyb2xsVG9wJywgJzAnKTsKQEAgLTE0OCw3ICsxNDgsNyBAQAogZGVidWcoIkRpdidzIGRpc3BsYXkgaXMgYmxvY2sgYWdhaW4iKTsKIGUuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiBzaG91bGRCZSgnZS5zY3JvbGxUb3AnLCAnMTUwJyk7Ci1zaG91bGRCZSgnZS5zY3JvbGxMZWZ0JywgJzUwJyk7CitzaG91bGRCZSgnZS5zY3JvbGxMZWZ0JywgJy01MCcpOwogCiBkZWJ1ZygiIik7CiBkZWJ1ZygiVGVzdCBpZnJhbWUgc2Nyb2xsaW5nIik7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9zY3JvbGwtc25hcC9zbmFwcy1hZnRlci1rZXlib2FyZC1zY3JvbGxpbmctcnRsLmh0bWwgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9zY3JvbGwtc25hcC9zbmFwcy1hZnRlci1rZXlib2FyZC1zY3JvbGxpbmctcnRsLmh0bWwKaW5kZXggZDMwMTU3My4uYjJlMGEzYyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3Qvc2Nyb2xsLXNuYXAvc25hcHMtYWZ0ZXIta2V5Ym9hcmQtc2Nyb2xsaW5nLXJ0bC5odG1sCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L3Njcm9sbC1zbmFwL3NuYXBzLWFmdGVyLWtleWJvYXJkLXNjcm9sbGluZy1ydGwuaHRtbApAQCAtNjUsMjMgKzY1LDIzIEBACiAKIHByb21pc2VfdGVzdCAoYXN5bmMgKCkgPT4gewogICBhd2FpdCBtb3VzZUNsaWNrT24oNTEwLCAxMCk7Ci0gIHNjcm9sbGVyLnNjcm9sbFRvKDAsIDApOworICBzY3JvbGxlci5zY3JvbGxUbygtNjE1LCAwKTsKICAgYXdhaXQga2V5UHJlc3MoIkFycm93UmlnaHQiKTsKICAgYXdhaXQgd2FpdEZvckFuaW1hdGlvbkVuZChzY3JvbGxMZWZ0LCA1MDAsIDE1KTsKLSAgLy8gVGhlIGxlZnQgYm9yZGVyIG9mICNyaWdodCBpcyBhdCAxMDAwIC0gd2lkdGguCi0gIC8vIFRoZSByaWdodCBib3JkZXIgb2YgI3JpZ2h0IGlzIHRodXMgMTIwMCAtIHdpZHRoLgotICAvLyBXaGVuIHJpZ2h0LWFsaWduZWQsIHRoZSBzY3JvbGwgcG9zaXRpb24gc2hvdWxkIGJlIDEyMDAgLSAyICogd2lkdGguCi0gIGFzc2VydF9lcXVhbHMoc2Nyb2xsZXIuc2Nyb2xsTGVmdCwgMTIwMCAtIDIgKiB3aWR0aCk7CisgIC8vIFRoZSBsZWZ0IGJvcmRlciBvZiAjcmlnaHQgaXMgYXQgLXdpZHRoLgorICAvLyBUaGUgcmlnaHQgYm9yZGVyIG9mICNyaWdodCBpcyB0aHVzIDIwMCAtIHdpZHRoLgorICAvLyBXaGVuIHJpZ2h0LWFsaWduZWQsIHRoZSBzY3JvbGwgcG9zaXRpb24gc2hvdWxkIGJlIDIwMCAtIHdpZHRoLgorICBhc3NlcnRfZXF1YWxzKHNjcm9sbGVyLnNjcm9sbExlZnQsIDIwMCAtIHdpZHRoKTsKIH0sICJTbmFwcyB0byAjcmlnaHQgYWZ0ZXIgcHJlc3NpbmcgQXJyb3dSaWdodCIpOwogCiBwcm9taXNlX3Rlc3QgKGFzeW5jICgpID0+IHsKICAgYXdhaXQgbW91c2VDbGlja09uKDUxMCwgMTApOwotICBzY3JvbGxlci5zY3JvbGxUbyg0MDAsIDApOworICBzY3JvbGxlci5zY3JvbGxUbygtMjE1LCAwKTsKICAgYXdhaXQga2V5UHJlc3MoIkFycm93TGVmdCIpOwogICBhd2FpdCB3YWl0Rm9yQW5pbWF0aW9uRW5kKHNjcm9sbExlZnQsIDUwMCwgMTUpOwotICAvLyBUaGUgbGVmdCBib3JkZXIgb2YgI2xlZnQgaXMgYXQgNjAwIC0gd2lkdGguCi0gIC8vIFRoZSByaWdodCBib3JkZXIgb2YgI2xlZnQgaXMgdGh1cyA4MDAgLSB3aWR0aC4KLSAgLy8gV2hlbiByaWdodC1hbGlnbmVkLCB0aGUgc2Nyb2xsIHBvc2l0aW9uIHNob3VsZCBiZSA4MDAgLSAyICogd2lkdGguCi0gIGFzc2VydF9lcXVhbHMoc2Nyb2xsZXIuc2Nyb2xsTGVmdCwgODAwIC0gMiAqIHdpZHRoKTsKKyAgLy8gVGhlIGxlZnQgYm9yZGVyIG9mICNsZWZ0IGlzIGF0IC0oNDAwICsgd2lkdGgpLgorICAvLyBUaGUgcmlnaHQgYm9yZGVyIG9mICNsZWZ0IGlzIHRodXMgLSgyMDAgKyB3aWR0aCkuCisgIC8vIFdoZW4gcmlnaHQtYWxpZ25lZCwgdGhlIHNjcm9sbCBwb3NpdGlvbiBzaG91bGQgYmUgLSgyMDAgKyB3aWR0aCkuCisgIGFzc2VydF9lcXVhbHMoc2Nyb2xsZXIuc2Nyb2xsTGVmdCwgLSgyMDAgKyB3aWR0aCkpOwogfSwgIlNuYXBzIHRvICNsZWZ0IGFmdGVyIHByZXNzaW5nIEFycm93TGVmdCIpOwogPC9zY3JpcHQ+CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9zY3JvbGxpbmcvanF1ZXJ5LXJ0bC1zY3JvbGwtdHlwZS5odG1sIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3Qvc2Nyb2xsaW5nL2pxdWVyeS1ydGwtc2Nyb2xsLXR5cGUuaHRtbAppbmRleCBiMjMwZWJhLi41ODdkNjRhIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9zY3JvbGxpbmcvanF1ZXJ5LXJ0bC1zY3JvbGwtdHlwZS5odG1sCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L3Njcm9sbGluZy9qcXVlcnktcnRsLXNjcm9sbC10eXBlLmh0bWwKQEAgLTUsMzAgKzUsMzAgQEAKICAgICAgdG8gdGhlIHJpZ2h0KSwgc29tZSBlbmdpbmVzIHNldHMgc2Nyb2xsTGVmdCB0byAwIGFuZCBkZWNyZW1lbnQgdG8gbmVnYXRpdmUKICAgICAgdmFsdWVzIHdoZW4gc2Nyb2xsaW5nIGxlZnR3YXJkcyAoR2Vja28pLiBPdGhlcnMgc2V0IGl0IHRvIDAgYW5kIGluY3JlbWVudAogICAgICB0aGUgdmFsdWUgd2hlbiBzY3JvbGxpbmcgbGVmdHdhcmRzIChJRSAvIEVkZ2UpLiBPdGhlcnMgYWdhaW4gc2V0IGl0IHRvIHRoZQotICAgICB3aWR0aCBvZiB0aGUgc2Nyb2xsYWJsZSBhcmVhIGFuZCBkZWNyZW1lbnQgaXQgd2hlbiBzY3JvbGxpbmcgbGVmdHdhcmRzCi0gICAgIChCbGluayAvIFdlYktpdCkuIFRoZXJlIGFyZSBmdXJ0aGVyIGNvbXBsaWNhdGlvbnMgaW4gdGhlIGxhdHRlciBlbmdpbmUgaWYKKyAgICAgd2lkdGggb2YgdGhlIHNjcm9sbGFibGUgYXJlYSBhbmQgZGVjcmVtZW50IGl0IHdoZW4gc2Nyb2xsaW5nIGxlZnR3YXJkcy4KKyAgICAgV2ViS2l0IC8gQmxpbmsgdXNlZCB0byBiZSB0aGUgdGhpcmQgY2FzZSwgbm93IHRoZXkgYXJlIGNvbnNpc3RlbnQgd2l0aCBHZWNrby4KKyAgICAgVGhlcmUgYXJlIGZ1cnRoZXIgY29tcGxpY2F0aW9ucyBpbiB0aGUgbGF0dGVyIGVuZ2luZSBpZgogICAgICB0aGVyZSdzIGEgdmVydGljYWwgc2Nyb2xsYmFyIFsxXSwgYW5kIGl0J3Mgd2lkZXIgdGhhbiB0aGUgYm9yZGVyIGJveC4gQWxsCiAgICAgIHdlIG5lZWQgdG8gd29ycnkgYWJvdXQgaGVyZSB0aG91Z2gsIGlzIHRoYXQgdGhlIHNjcmlwdCBpcyBhYmxlIHRvIGRldGVjdAotICAgICB0aGF0IHdlIGFyZSAiZGVmYXVsdCIuCisgICAgIHRoYXQgd2UgYXJlICJuZWdhdGl2ZSIuCiAKICAgICAgWzFdIGNyYnVnLmNvbS83MjQyNTUgLS0+CiA8ZGl2IGlkPSJkZWZpbmVyIiBkaXI9InJ0bCIgc3R5bGU9ImZvbnQtc2l6ZTogMTRweDsgd2lkdGg6IDFweDsgaGVpZ2h0OiAxcHg7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAtMTAwMHB4OyBvdmVyZmxvdzogc2Nyb2xsIj5BPC9kaXY+CiA8c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3VyY2VzL3Rlc3RoYXJuZXNzLmpzIj48L3NjcmlwdD4KIDxzY3JpcHQgc3JjPSIuLi8uLi9yZXNvdXJjZXMvdGVzdGhhcm5lc3NyZXBvcnQuanMiPjwvc2NyaXB0PgogPHNjcmlwdD4KLSAgICAvLyBUaGlzIHRlc3QgaXMgb25seSBleHBlY3RlZCB0byBwYXNzIGluIEJsaW5rIC8gV2ViS2l0LgogICAgIHRlc3QoZnVuY3Rpb24oKSB7CiAgICAgICAgIHZhciBkZWZpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlZmluZXInKTsKICAgICAgICAgdmFyIHR5cGUgPSAncmV2ZXJzZSc7Ci0JaWYgKGRlZmluZXIuc2Nyb2xsTGVmdCA+IDApIHsKLQkgICAgdHlwZSA9ICdkZWZhdWx0JzsKLQl9Ci0JZWxzZSB7Ci0JICAgIGRlZmluZXIuc2Nyb2xsTGVmdCA9IDE7Ci0JICAgIGlmIChkZWZpbmVyLnNjcm9sbExlZnQgPT09IDApIHsKLQkJdHlwZSA9ICduZWdhdGl2ZSc7Ci0JICAgIH0KLQl9Ci0JYXNzZXJ0X2VxdWFscyh0eXBlLCAnZGVmYXVsdCcpOwotICAgIH0sICJCbGluayBzaG91bGQgaGF2ZSAnZGVmYXVsdCcgUlRMIHNjcm9sbCBiZWhhdmlvciIpOworICAgICAgICBpZiAoZGVmaW5lci5zY3JvbGxMZWZ0ID4gMCkgeworICAgICAgICAgICAgdHlwZSA9ICdkZWZhdWx0JzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGRlZmluZXIuc2Nyb2xsTGVmdCA9IDE7CisgICAgICAgICAgICBpZiAoZGVmaW5lci5zY3JvbGxMZWZ0ID09PSAwKSB7CisgICAgICAgICAgICAgICAgdHlwZSA9ICduZWdhdGl2ZSc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0X2VxdWFscyh0eXBlLCAnbmVnYXRpdmUnKTsKKyAgICB9LCAiQmxpbmsgc2hvdWxkIGhhdmUgJ25lZ2F0aXZlJyBSVEwgc2Nyb2xsIGJlaGF2aW9yIik7CiA8L3NjcmlwdD4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L3Njcm9sbGluZy9vdmVyZmxvdy1hdXRvLWx0ci5odG1sIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3Qvc2Nyb2xsaW5nL292ZXJmbG93LWF1dG8tbHRyLmh0bWwKaW5kZXggNWEwMDA4ZDkuLjI1MTkwMzYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L3Njcm9sbGluZy9vdmVyZmxvdy1hdXRvLWx0ci5odG1sCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L3Njcm9sbGluZy9vdmVyZmxvdy1hdXRvLWx0ci5odG1sCkBAIC0yMiw4ICsyMiw4IEBACiAgIGRlc2NyaXB0aW9uKCJDaGVjayB0aGF0IHRoZSBzY3JvbGwgb2Zmc2V0IGluIGFuIExUUiBibG9jayBpcyBjb3JyZWN0bHkgcHJlc2VydmVkIHdoZW4gdGhlIGV4aXN0ZW5jZSBvZiBpdHMgdmVydGljYWwgc2Nyb2xsYmFyIGNoYW5nZXMuIik7CiAKICAgdmFyIHNjcm9sbExlZnREaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2Nyb2xsTGVmdFJ0bCIpOwotICB2YXIgaW5pdGlhbE9mZnNldCA9IHNjcm9sbExlZnREaXYuc2Nyb2xsV2lkdGggLSBzY3JvbGxMZWZ0RGl2LmNsaWVudFdpZHRoIC0gc2Nyb2xsTGVmdERpdi5zY3JvbGxMZWZ0OworICB2YXIgaW5pdGlhbE9mZnNldCA9IHNjcm9sbExlZnREaXYuc2Nyb2xsTGVmdDsKICAgc2Nyb2xsTGVmdERpdi5zdHlsZS5vdmVyZmxvdyA9ICJhdXRvIjsKLSAgdmFyIGZpbmFsT2Zmc2V0ID0gc2Nyb2xsTGVmdERpdi5zY3JvbGxXaWR0aCAtIHNjcm9sbExlZnREaXYuY2xpZW50V2lkdGggLSBzY3JvbGxMZWZ0RGl2LnNjcm9sbExlZnQ7CisgIHZhciBmaW5hbE9mZnNldCA9IHNjcm9sbExlZnREaXYuc2Nyb2xsTGVmdDsKICAgc2hvdWxkQmUoImZpbmFsT2Zmc2V0IiwgImluaXRpYWxPZmZzZXQiKTsKIDwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3Qvc2Nyb2xsaW5nL3Njcm9sbGJhcnMvbW91c2Utc2Nyb2xsaW5nLW9uLWRpdi1zY3JvbGxiYXIuaHRtbCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L3Njcm9sbGluZy9zY3JvbGxiYXJzL21vdXNlLXNjcm9sbGluZy1vbi1kaXYtc2Nyb2xsYmFyLmh0bWwKaW5kZXggMTk1NDUzZS4uMGYwYzJlZCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3Qvc2Nyb2xsaW5nL3Njcm9sbGJhcnMvbW91c2Utc2Nyb2xsaW5nLW9uLWRpdi1zY3JvbGxiYXIuaHRtbAorKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9zY3JvbGxpbmcvc2Nyb2xsYmFycy9tb3VzZS1zY3JvbGxpbmctb24tZGl2LXNjcm9sbGJhci5odG1sCkBAIC0yMTQsNiArMjE0LDY0IEBACiAKICAgcHJvbWlzZV90ZXN0IChhc3luYyAoKSA9PiB7CiAgICAgYXdhaXQgd2FpdEZvckNvbXBvc2l0b3JDb21taXQoKTsKKyAgICByZXNldFNjcm9sbE9mZnNldChzdGFuZGFyZERpdkZhc3QpOworCisgICAgLy8gVGVzdGluZyB0aGUgdmVydGljYWwgc2Nyb2xsYmFyIHRodW1iLgorICAgIGxldCB4ID0gc3RhbmRhcmRSZWN0RmFzdC5yaWdodCAtIFRSQUNLX1dJRFRIIC8gMjsKKyAgICBsZXQgeSA9IHN0YW5kYXJkUmVjdEZhc3QudG9wICsgQlVUVE9OX1dJRFRIICsgNTsKKyAgICBsZXQgYXNjX2luY3JlbWVudHMgPSBbMTUsIDEwLCA3LCA2LCAyXTsKKyAgICBsZXQgYXNjX29mZnNldHMgPSBbMzQzLCA1NzEsIDczMiwgODY5LCA5MTVdOworICAgIGxldCBkZXNjX2luY3JlbWVudHMgPSBbMywgMiwgNSwgOSwgMjFdOworICAgIGxldCBkZXNjX29mZnNldHMgPSBbODQ2LCA4MDAsIDY4NiwgNDgwLCAwXTsKKworICAgIGF3YWl0IG1vdXNlTW92ZVRvKHgsIHkpOworICAgIGF3YWl0IG1vdXNlRG93bkF0KHgsIHkpOworCisgICAgLy8gU2Nyb2xsIGRvd24KKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IDU7IGkrKyl7CisgICAgICB5ICs9IGFzY19pbmNyZW1lbnRzW2ldOworICAgICAgYXdhaXQgbW91c2VNb3ZlVG8oeCwgeSk7CisgICAgICBhc3NlcnRfZXF1YWxzKHN0YW5kYXJkRGl2RmFzdC5zY3JvbGxUb3AsIGFzY19vZmZzZXRzW2ldLCAiVmVydGljYWwgdGh1bWIgZHJhZyBkb3dud2FyZHMgZGlkIG5vdCBzY3JvbGwgYXMgZXhwZWN0ZWQgYXQgIithc2NfaW5jcmVtZW50c1tpXSsiIC0gIik7CisgICAgfTsKKworICAgIC8vIFNjcm9sbCB1cAorICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNTsgaSsrKXsKKyAgICAgIHkgLT0gZGVzY19pbmNyZW1lbnRzW2ldOworICAgICAgYXdhaXQgbW91c2VNb3ZlVG8oeCwgeSk7CisgICAgICBhc3NlcnRfZXF1YWxzKHN0YW5kYXJkRGl2RmFzdC5zY3JvbGxUb3AsIGRlc2Nfb2Zmc2V0c1tpXSwgIlZlcnRpY2FsIHRodW1iIGRyYWcgdXB3YXJkcyBkaWQgbm90IHNjcm9sbCBhcyBleHBlY3RlZCBhdCAiK2Rlc2NfaW5jcmVtZW50c1tpXSsiIC0gIik7CisgICAgfTsKKworICAgIGF3YWl0IG1vdXNlVXBBdCh4LCB5KTsKKyAgICBhc3NlcnRfZXF1YWxzKHN0YW5kYXJkRGl2RmFzdC5zY3JvbGxUb3AsIDAsICJNb3VzZXVwIG9uIHZlcnRpY2FsIHNjcm9sbGJhciB0aHVtYiBpcyBub3QgZXhwZWN0ZWQgdG8gc2Nyb2xsLiIpOworCisgICAgLy8gVGVzdGluZyB0aGUgaG9yaXpvbnRhbCBzY3JvbGxiYXIgdGh1bWIuCisgICAgcmVzZXRTY3JvbGxPZmZzZXQoc3RhbmRhcmREaXZGYXN0KTsKKyAgICB4ID0gc3RhbmRhcmRSZWN0RmFzdC5sZWZ0ICsgQlVUVE9OX1dJRFRIICsgNTsKKyAgICB5ID0gc3RhbmRhcmRSZWN0RmFzdC5ib3R0b20gLSBUUkFDS19XSURUSCAvIDI7CisgICAgYXdhaXQgbW91c2VNb3ZlVG8oeCwgeSk7CisgICAgYXdhaXQgbW91c2VEb3duQXQoeCwgeSk7CisKKyAgICAvLyBTY3JvbGwgcmlnaHQKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IDU7IGkrKyl7CisgICAgICB4ICs9IGFzY19pbmNyZW1lbnRzW2ldOworICAgICAgYXdhaXQgbW91c2VNb3ZlVG8oeCwgeSk7CisgICAgICBhc3NlcnRfZXF1YWxzKHN0YW5kYXJkRGl2RmFzdC5zY3JvbGxMZWZ0LCBhc2Nfb2Zmc2V0c1tpXSwgIkhvcml6b250YWwgdGh1bWIgZHJhZyB0byB0aGUgcmlnaHQgZGlkIG5vdCBzY3JvbGwgYXMgZXhwZWN0ZWQgYXQgIithc2NfaW5jcmVtZW50c1tpXSsiIC0gIik7CisgICAgfTsKKworICAgIC8vIFNjcm9sbCBsZWZ0CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA1OyBpKyspeworICAgICAgeCAtPSBkZXNjX2luY3JlbWVudHNbaV07CisgICAgICBhd2FpdCBtb3VzZU1vdmVUbyh4LCB5KTsKKyAgICAgIGFzc2VydF9lcXVhbHMoc3RhbmRhcmREaXZGYXN0LnNjcm9sbExlZnQsIGRlc2Nfb2Zmc2V0c1tpXSwgIkhvcml6b250YWwgdGh1bWIgZHJhZyB0byB0aGUgbGVmdCBkaWQgbm90IHNjcm9sbCBhcyBleHBlY3RlZCBhdCAiK2Rlc2NfaW5jcmVtZW50c1tpXSsiIC0gIik7CisgICAgfTsKKworICAgIGF3YWl0IG1vdXNlVXBBdCh4LCB5KTsKKyAgICBhc3NlcnRfZXF1YWxzKHN0YW5kYXJkRGl2RmFzdC5zY3JvbGxMZWZ0LCAwLCAgIk1vdXNldXAgb24gaG9yaXpvbnRhbCBzY3JvbGxiYXIgdGh1bWIgaXMgbm90IGV4cGVjdGVkIHRvIHNjcm9sbC4iKTsKKworICB9LCAiVGVzdCBtb3VzZSBkcmFncyBpbiBpbnRlcnZhbHMgb24gbm9uLWN1c3RvbSBjb21wb3NpdGVkIGRpdiBzY3JvbGxiYXIgdGh1bWIuIik7CisKKyAgcHJvbWlzZV90ZXN0IChhc3luYyAoKSA9PiB7CisgICAgYXdhaXQgd2FpdEZvckNvbXBvc2l0b3JDb21taXQoKTsKICAgICBjb25zdCBjdXN0b21EaXZGYXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImN1c3RvbSIpOwogICAgIGNvbnN0IGN1c3RvbVJlY3RGYXN0ID0gY3VzdG9tRGl2RmFzdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3Qvc2Nyb2xsaW5nL3Njcm9sbGJhcnMvbW91c2Utc2Nyb2xsaW5nLW9uLXJvb3Qtc2Nyb2xsYmFyLmh0bWwgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9zY3JvbGxpbmcvc2Nyb2xsYmFycy9tb3VzZS1zY3JvbGxpbmctb24tcm9vdC1zY3JvbGxiYXIuaHRtbAppbmRleCBlYTRiNzU5Li4zMGNkMDFjIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9zY3JvbGxpbmcvc2Nyb2xsYmFycy9tb3VzZS1zY3JvbGxpbmctb24tcm9vdC1zY3JvbGxiYXIuaHRtbAorKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9zY3JvbGxpbmcvc2Nyb2xsYmFycy9tb3VzZS1zY3JvbGxpbmctb24tcm9vdC1zY3JvbGxiYXIuaHRtbApAQCAtMTI3LDYgKzEyNyw2OSBAQAogICAgIGF3YWl0IG1vdXNlVXBBdCh4LCB5KTsKICAgICBhc3NlcnRfZXF1YWxzKHdpbmRvdy5zY3JvbGxYLCAwLCAiTW91c2V1cCBvbiBob3Jpem9udGFsIHNjcm9sbGJhciB0aHVtYiBpcyBub3QgZXhwZWN0ZWQgdG8gc2Nyb2xsLiIpOwogICB9LCAiVGVzdCBtb3VzZSBkcmFncyBvbiBub24tY3VzdG9tIGNvbXBvc2l0ZWQgcm9vdCBzY3JvbGxiYXIgdGh1bWIuIik7CisKKyAgcHJvbWlzZV90ZXN0IChhc3luYyAoKSA9PiB7CisgICAgYXdhaXQgd2FpdEZvckNvbXBvc2l0b3JDb21taXQoKTsKKyAgICByZXNldFNjcm9sbE9mZnNldChkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50KTsKKworICAgIC8vIFRlc3RpbmcgdGhlIHZlcnRpY2FsIHNjcm9sbGJhciB0aHVtYi4KKyAgICBsZXQgeCA9IHdpbmRvdy5pbm5lcldpZHRoIC0gVFJBQ0tfV0lEVEggLyAyOworICAgIGxldCB5ID0gQlVUVE9OX1dJRFRIICsgMTA7CisgICAgbGV0IGFzY19pbmNyZW1lbnRzID0gWzI1LCAxMCwgMzUsIDcsIDIzXTsKKyAgICBsZXQgYXNjX29mZnNldHMgPSBbNDUsIDY0LCAxMjgsIDE0MSwgMTgzXTsKKyAgICBsZXQgZGVzY19pbmNyZW1lbnRzID0gWzMzLCAxMSwgMjEsIDUsIDMwXTsKKyAgICBsZXQgZGVzY19vZmZzZXRzID0gWzEyMiwgMTAyLCA2NCwgNTUsIDBdOworCisgICAgYXdhaXQgbW91c2VNb3ZlVG8oeCwgeSk7CisgICAgYXdhaXQgbW91c2VEb3duQXQoeCwgeSk7CisKKyAgICAgLy8gU2Nyb2xsIGRvd24KKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IDU7IGkrKyl7CisgICAgICB5ICs9IGFzY19pbmNyZW1lbnRzW2ldOworICAgICAgYXdhaXQgbW91c2VNb3ZlVG8oeCwgeSk7CisgICAgICBhc3NlcnRfZXF1YWxzKHdpbmRvdy5zY3JvbGxZLCBhc2Nfb2Zmc2V0c1tpXSwgIlZlcnRpY2FsIHRodW1iIGRyYWcgZG93bndhcmRzIGRpZCBub3Qgc2Nyb2xsIGFzIGV4cGVjdGVkIGF0ICIrYXNjX2luY3JlbWVudHNbaV0rIiAtICIpOworICAgIH07CisKKyAgICAvLyBTY3JvbGwgdXAKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IDU7IGkrKyl7CisgICAgICB5IC09IGRlc2NfaW5jcmVtZW50c1tpXTsKKyAgICAgIGF3YWl0IG1vdXNlTW92ZVRvKHgsIHkpOworICAgICAgYXNzZXJ0X2VxdWFscyh3aW5kb3cuc2Nyb2xsWSwgZGVzY19vZmZzZXRzW2ldLCAiVmVydGljYWwgdGh1bWIgZHJhZyB1cHdhcmRzIGRpZCBub3Qgc2Nyb2xsIGFzIGV4cGVjdGVkIGF0ICIrZGVzY19pbmNyZW1lbnRzW2ldKyIgLSAiKTsKKyAgICB9OworCisgICAgYXdhaXQgbW91c2VVcEF0KHgsIHkpOworICAgIGFzc2VydF9lcXVhbHMod2luZG93LnNjcm9sbFksIDAsICJNb3VzZXVwIG9uIHZlcnRpY2FsIHNjcm9sbGJhciB0aHVtYiBpcyBub3QgZXhwZWN0ZWQgdG8gc2Nyb2xsLiIpOworCisgICAgLy8gVGVzdGluZyB0aGUgaG9yaXpvbnRhbCBzY3JvbGxiYXIgdGh1bWIuCisgICAgLy8gVE9ETyhzYWhpci52ZWxsYW5pKSB0ZXN0IGZhaWxzIG9ubHkgb24gbGludXggd2l0aG91dCByZXNldFNjcm9sbE9mZnNldCwKKyAgICAvLyBwcm9iYWJseSBkdWUgdG8gY3JidWcuY29tLzk3OTQwOC4KKyAgICByZXNldFNjcm9sbE9mZnNldChkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50KTsKKyAgICB4ID0gQlVUVE9OX1dJRFRIICsgMTA7CisgICAgeSA9IHdpbmRvdy5pbm5lckhlaWdodCAtIFRSQUNLX1dJRFRIIC8gMjsKKyAgICBhc2Nfb2Zmc2V0cyA9IFszMywgNDYsIDkzLCAxMDIsIDEzM107CisgICAgZGVzY19vZmZzZXRzID0gWzg5LCA3NCwgNDYsIDQwLCAwXTsKKworICAgIGF3YWl0IG1vdXNlTW92ZVRvKHgsIHkpOworICAgIGF3YWl0IG1vdXNlRG93bkF0KHgsIHkpOworICAgIGFzc2VydF9lcXVhbHMod2luZG93LnNjcm9sbFgsIDAsICJNb3VzZWRvd24gb24gaG9yaXpvbnRhbCBzY3JvbGxiYXIgdGh1bWIgaXMgbm90IGV4cGVjdGVkIHRvIHNjcm9sbC4iKTsKKworICAgIC8vIFNjcm9sbCByaWdodAorICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNTsgaSsrKXsKKyAgICAgIHggKz0gYXNjX2luY3JlbWVudHNbaV07CisgICAgICBhd2FpdCBtb3VzZU1vdmVUbyh4LCB5KTsKKyAgICAgIGFzc2VydF9lcXVhbHMod2luZG93LnNjcm9sbFgsIGFzY19vZmZzZXRzW2ldLCAiSG9yaXpvbnRhbCB0aHVtYiBkcmFnIHRvIHRoZSByaWdodCBkaWQgbm90IHNjcm9sbCBhcyBleHBlY3RlZCBhdCAiK2FzY19pbmNyZW1lbnRzW2ldKyIgLSAiKTsKKyAgICB9OworCisgICAgLy8gU2Nyb2xsIGxlZnQKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IDU7IGkrKyl7CisgICAgICB4IC09IGRlc2NfaW5jcmVtZW50c1tpXTsKKyAgICAgIGF3YWl0IG1vdXNlTW92ZVRvKHgsIHkpOworICAgICAgYXNzZXJ0X2VxdWFscyh3aW5kb3cuc2Nyb2xsWCwgZGVzY19vZmZzZXRzW2ldLCAiSG9yaXpvbnRhbCB0aHVtYiBkcmFnIHRvIHRoZSBsZWZ0IGRpZCBub3Qgc2Nyb2xsIGFzIGV4cGVjdGVkIGF0ICIrZGVzY19pbmNyZW1lbnRzW2ldKyIgLSAiKTsKKyAgICB9OworCisgICAgYXdhaXQgbW91c2VVcEF0KHgsIHkpOworICAgIGFzc2VydF9lcXVhbHMod2luZG93LnNjcm9sbFgsIDAsICJNb3VzZXVwIG9uIGhvcml6b250YWwgc2Nyb2xsYmFyIHRodW1iIGlzIG5vdCBleHBlY3RlZCB0byBzY3JvbGwuIik7CisgIH0sICJUZXN0IG1vdXNlIGRyYWdzIGluIGluY3JlbWVudHMgb24gbm9uLWN1c3RvbSBjb21wb3NpdGVkIHJvb3Qgc2Nyb2xsYmFyIHRodW1iLiIpOwogfQogPC9zY3JpcHQ+CiA8L2JvZHk+CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9zY3JvbGxpbmcvc2Nyb2xsYmFycy9zY3JvbGxiYXItdGh1bWItc25hcHBpbmcuaHRtbCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L3Njcm9sbGluZy9zY3JvbGxiYXJzL3Njcm9sbGJhci10aHVtYi1zbmFwcGluZy5odG1sCmluZGV4IGVkZDk4YTEuLjQ2MThhNDBhIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9zY3JvbGxpbmcvc2Nyb2xsYmFycy9zY3JvbGxiYXItdGh1bWItc25hcHBpbmcuaHRtbAorKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC9zY3JvbGxpbmcvc2Nyb2xsYmFycy9zY3JvbGxiYXItdGh1bWItc25hcHBpbmcuaHRtbApAQCAtNTEsOSArNTEsNyBAQAogCiAgICAgLy8gVmVyaWZ5IHRoYXQgc2Nyb2xsaW5nIG9jY3VyZWQuCiAgICAgc3RhbmRhcmREaXZGYXN0LmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsIGZ1bmN0aW9uKCkgewotICAgICAgLy8gVE9ETyhhcmFrZXJpKTogVGhlcmUncyBhIH4yNXB4IGRpZmZlcmVuY2UgYmV0d2VlbiBtYWluIHRocmVhZCBhbmQgY2MgdGh1bWIgZHJhZ3MKLSAgICAgIC8vIGR1ZSB0byBjcmJ1Zy5jb20vMTAwOTg5Mi4gVGhpcyBuZWVkcyB0byBiZSBjaGFuZ2VkIHRvIDQ4MCBvbmNlIHRoZSBjcmJ1ZyBpcyBmaXhlZC4KLSAgICAgIGlmKHN0YW5kYXJkRGl2RmFzdC5zY3JvbGxUb3AgPj0gNDUwICYmIHN0YW5kYXJkRGl2RmFzdC5zY3JvbGxUb3AgPD0gNDgwKQorICAgICAgaWYoc3RhbmRhcmREaXZGYXN0LnNjcm9sbFRvcCA9PSA0ODApCiAgICAgICAgIHNjcm9sbF90aHJlc2hvbGRfY3Jvc3NlZCA9IHRydWU7CiAgICAgfSk7CiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L3dyaXRpbmctbW9kZS9mbGlwcGVkLWJsb2NrLXdpdGgtbG9jYWwtYmFja2dyb3VuZC5odG1sIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3Qvd3JpdGluZy1tb2RlL2ZsaXBwZWQtYmxvY2std2l0aC1sb2NhbC1iYWNrZ3JvdW5kLmh0bWwKaW5kZXggNzlkNDFlZi4uYjQwOWEzNGQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L3dyaXRpbmctbW9kZS9mbGlwcGVkLWJsb2NrLXdpdGgtbG9jYWwtYmFja2dyb3VuZC5odG1sCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L3dyaXRpbmctbW9kZS9mbGlwcGVkLWJsb2NrLXdpdGgtbG9jYWwtYmFja2dyb3VuZC5odG1sCkBAIC0xOCw1ICsxOCw1IEBACiAgIDxkaXYgc3R5bGU9IndpZHRoOjIwMHB4Ij48L2Rpdj4KIDwvZGl2PgogPHNjcmlwdD4KLSAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Nyb2xsZXInKS5zY3JvbGxMZWZ0ID0gMDsKKyAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Nyb2xsZXInKS5zY3JvbGxMZWZ0ID0gLTEwMDsKIDwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3Qvd3JpdGluZy1tb2RlL2ZsaXBwZWQtYmxvY2tzLWhpdC10ZXN0LW92ZXJmbG93LXNjcm9sbC5odG1sIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Zhc3Qvd3JpdGluZy1tb2RlL2ZsaXBwZWQtYmxvY2tzLWhpdC10ZXN0LW92ZXJmbG93LXNjcm9sbC5odG1sCmluZGV4IDVhNjMyNmYuLjI2OTI1NGQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mYXN0L3dyaXRpbmctbW9kZS9mbGlwcGVkLWJsb2Nrcy1oaXQtdGVzdC1vdmVyZmxvdy1zY3JvbGwuaHRtbAorKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmFzdC93cml0aW5nLW1vZGUvZmxpcHBlZC1ibG9ja3MtaGl0LXRlc3Qtb3ZlcmZsb3ctc2Nyb2xsLmh0bWwKQEAgLTEzLDcgKzEzLDcgQEAKICAgICAgICAgdGVzdFJ1bm5lci5kdW1wQXNUZXh0KCk7CiAKICAgICB2YXIgc2Nyb2xsYWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzY3JvbGxhYmxlIik7Ci0gICAgc2Nyb2xsYWJsZS5zY3JvbGxMZWZ0ID0gNDA7CisgICAgc2Nyb2xsYWJsZS5zY3JvbGxMZWZ0ID0gLTYwOwogICAgIHZhciB0YXJnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGFyZ2V0Iik7CiAgICAgdmFyIGhpdENvbnRhaW5lciA9IGRvY3VtZW50LmNhcmV0UmFuZ2VGcm9tUG9pbnQoNTgsIDEwMCkuc3RhcnRDb250YWluZXI7CiAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlc3VsdCIpLmlubmVyVGV4dCA9IGhpdENvbnRhaW5lciA9PT0gdGFyZ2V0ID8gIlBBU1MiIDogIkZBSUwiOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2ZsYWctc3BlY2lmaWMvZGlzYWJsZS1ibGluay1mZWF0dXJlcz1MYXlvdXRORy92aXJ0dWFsL3Njcm9sbF9jdXN0b21pemF0aW9uL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLWNvbnRpbnVhdGlvbi1leHBlY3RlZC50eHQgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmxhZy1zcGVjaWZpYy9kaXNhYmxlLWJsaW5rLWZlYXR1cmVzPUxheW91dE5HL3ZpcnR1YWwvc2Nyb2xsX2N1c3RvbWl6YXRpb24vZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtY29udGludWF0aW9uLWV4cGVjdGVkLnR4dAppbmRleCA1YjQ1ZDQzOS4uMDcxZmE0NSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2ZsYWctc3BlY2lmaWMvZGlzYWJsZS1ibGluay1mZWF0dXJlcz1MYXlvdXRORy92aXJ0dWFsL3Njcm9sbF9jdXN0b21pemF0aW9uL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLWNvbnRpbnVhdGlvbi1leHBlY3RlZC50eHQKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2ZsYWctc3BlY2lmaWMvZGlzYWJsZS1ibGluay1mZWF0dXJlcz1MYXlvdXRORy92aXJ0dWFsL3Njcm9sbF9jdXN0b21pemF0aW9uL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLWNvbnRpbnVhdGlvbi1leHBlY3RlZC50eHQKQEAgLTEsNyArMSw3IEBACiBUaGlzIHRlc3RzIHZlcmlmaWVzIHRoZSBoaXQgdGVzdCByZWdpb25zIGdpdmVuIHRvIHRoZSBjb21wb3NpdG9yIHNwZWNpZmljYWxseSBmb3IgY29udGludWF0aW9uIGNhc2UuIEl0IGNhbiBvbmx5IGJlIHJ1biBpbiBEdW1wUmVuZGVyVHJlZS4KIAotY29udGludWF0aW9uOiBsYXllcigwLDAgODAweDYwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDEzLDc5IDEwMXgxMSkKLWNvbnRpbnVhdGlvbjogbGF5ZXIoMCwwIDgwMHg2MDApIGhhcyBoaXQgdGVzdCByZWN0ICgxMyw5MCAyOTB4MTIpCi1jb250aW51YXRpb246IGxheWVyKDAsMCA4MDB4NjAwKSBoYXMgaGl0IHRlc3QgcmVjdCAoMTMsMTAyIDEyMXgxMSkKK2NvbnRpbnVhdGlvbjogbGF5ZXIoODAweDYwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDEzLDc5IDEwMXgxMSkKK2NvbnRpbnVhdGlvbjogbGF5ZXIoODAweDYwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDEzLDkwIDI5MHgxMikKK2NvbnRpbnVhdGlvbjogbGF5ZXIoODAweDYwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDEzLDEwMiAxMjF4MTEpCiAKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2ZsYWctc3BlY2lmaWMvZGlzYWJsZS1ibGluay1mZWF0dXJlcz1MYXlvdXRORy92aXJ0dWFsL3Njcm9sbF9jdXN0b21pemF0aW9uL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLWV4cGVjdGVkLnR4dCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mbGFnLXNwZWNpZmljL2Rpc2FibGUtYmxpbmstZmVhdHVyZXM9TGF5b3V0TkcvdmlydHVhbC9zY3JvbGxfY3VzdG9taXphdGlvbi9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1leHBlY3RlZC50eHQKaW5kZXggMWVlYTJlNC4uYzQwYTQ0MyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2ZsYWctc3BlY2lmaWMvZGlzYWJsZS1ibGluay1mZWF0dXJlcz1MYXlvdXRORy92aXJ0dWFsL3Njcm9sbF9jdXN0b21pemF0aW9uL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLWV4cGVjdGVkLnR4dAorKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmxhZy1zcGVjaWZpYy9kaXNhYmxlLWJsaW5rLWZlYXR1cmVzPUxheW91dE5HL3ZpcnR1YWwvc2Nyb2xsX2N1c3RvbWl6YXRpb24vZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtZXhwZWN0ZWQudHh0CkBAIC0xLDQ5ICsxLDQ5IEBACiBUaGlzIHRlc3RzIHZlcmlmaWVzIHRoZSBoaXQgdGVzdCByZWdpb25zIGdpdmVuIHRvIHRoZSBjb21wb3NpdG9yLiBJdCBjYW4gb25seSBiZSBydW4gaW4gRHVtcFJlbmRlclRyZWUuIFRoZSBvdXRwdXR0ZWQgcmVjdHMgc2hvdWxkIGNvdmVyIHRoZSBoaXQgdGVzdCByZWdpb25zIG9mIGFsbCB0aGUgbGlzdGVkIGVsZW1lbnRzLiBFbmFibGUgdmlzdWFsaXplIG1vZGUgdG8gcXVpY2tseSB2YWxpZGF0ZSBncmFwaGljYWxseS4KIAotbm9ybWFsRmxvdzogbGF5ZXIoMCwwIDc4NXgxNTMwKSBoYXMgaGl0IHRlc3QgcmVjdCAoMTMsMTI4IDI5MHgxMikKK25vcm1hbEZsb3c6IGxheWVyKDc4NXgxNTMwKSBoYXMgaGl0IHRlc3QgcmVjdCAoMTMsMTI4IDI5MHgxMikKIAotaW5saW5lT3ZlcmZsb3c6IGxheWVyKDAsMCA3ODV4MTU3OCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDEzLDE0NSAxNTJ4MTIpCi1pbmxpbmVPdmVyZmxvdzogbGF5ZXIoMCwwIDc4NXgxNTc4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMTMsMTU3IDQyeDEwKQoraW5saW5lT3ZlcmZsb3c6IGxheWVyKDc4NXgxNTc4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMTMsMTQ1IDE1MngxMikKK2lubGluZU92ZXJmbG93OiBsYXllcig3ODV4MTU3OCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDEzLDE1NyA0MngxMCkKIAotYWJzb2x1dGVDaGlsZENvbnRhaW5lcjogbGF5ZXIoMCwwIDc4NXgxNjU4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMTMsMTcyIDI5MHgxMikKLWFic29sdXRlQ2hpbGRDb250YWluZXI6IGxheWVyKDAsMCA3ODV4MTY1OCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDMyMCwxNzMgMTQyeDEyKQorYWJzb2x1dGVDaGlsZENvbnRhaW5lcjogbGF5ZXIoNzg1eDE2NTgpIGhhcyBoaXQgdGVzdCByZWN0ICgxMywxNzIgMjkweDEyKQorYWJzb2x1dGVDaGlsZENvbnRhaW5lcjogbGF5ZXIoNzg1eDE2NTgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMjAsMTczIDE0MngxMikKIAotcmVsYXRpdmVDaGlsZENvbnRhaW5lcjogbGF5ZXIoMCwwIDc4NXgxNzM4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMTMsMTg5IDI5MHgyMikKLXJlbGF0aXZlQ2hpbGRDb250YWluZXI6IGxheWVyKDAsMCA3ODV4MTczOCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDMxNCwxOTkgMTQyeDEyKQorcmVsYXRpdmVDaGlsZENvbnRhaW5lcjogbGF5ZXIoNzg1eDE3MzgpIGhhcyBoaXQgdGVzdCByZWN0ICgxMywxODkgMjkweDIyKQorcmVsYXRpdmVDaGlsZENvbnRhaW5lcjogbGF5ZXIoNzg1eDE3MzgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMTQsMTk5IDE0MngxMikKIAotZml4ZWQ6IGxheWVyKDQwNSw5OCA1MngxMikgaGFzIGhpdCB0ZXN0IHJlY3QgKDAsMCA1MngxMikKK2ZpeGVkOiBsYXllcig1MngxMikgaGFzIGhpdCB0ZXN0IHJlY3QgKDAsMCA1MngxMikKIAotdHJhbnNsYXRlOiBsYXllcigwLDAgNzg1eDE4NjYpIGhhcyBoaXQgdGVzdCByZWN0ICgxMywyMTYgMjkweDE0KQotdHJhbnNsYXRlOiBsYXllcigwLDAgNzg1eDE4NjYpIGhhcyBoaXQgdGVzdCByZWN0ICgzMTQsMjE5IDI4OHgxMikKK3RyYW5zbGF0ZTogbGF5ZXIoNzg1eDE4NjYpIGhhcyBoaXQgdGVzdCByZWN0ICgxMywyMTYgMjkweDE0KQordHJhbnNsYXRlOiBsYXllcig3ODV4MTg2NikgaGFzIGhpdCB0ZXN0IHJlY3QgKDMxNCwyMTkgMjg4eDEyKQogCi10cmFuc2Zvcm0yZDogbGF5ZXIoMCwwIDc4NXgxOTQ2KSBoYXMgaGl0IHRlc3QgcmVjdCAoMTYsMjM2IDI4NHgyMCkKK3RyYW5zZm9ybTJkOiBsYXllcig3ODV4MTk0NikgaGFzIGhpdCB0ZXN0IHJlY3QgKDE2LDIzNiAyODR4MjApCiAKLW92ZXJoYW5naW5nQ29udGFpbmVyOiBsYXllcigwLDAgNzg1eDE5OTQpIGhhcyBoaXQgdGVzdCByZWN0ICgxMywyNjIgMjkweDEyKQotb3ZlcmhhbmdpbmdDb250YWluZXI6IGxheWVyKDAsMCA3ODV4MTk5NCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDE0LDI3NCAxMDJ4MTApCi1vdmVyaGFuZ2luZ0NvbnRhaW5lcjogbGF5ZXIoMCwwIDc4NXgxOTk0KSBoYXMgaGl0IHRlc3QgcmVjdCAoMTQsMjg0IDExMXgxMCkKLW92ZXJoYW5naW5nQ29udGFpbmVyOiBsYXllcigwLDAgNzg1eDE5OTQpIGhhcyBoaXQgdGVzdCByZWN0ICgxNCwyOTQgMTAyeDExKQorb3ZlcmhhbmdpbmdDb250YWluZXI6IGxheWVyKDc4NXgxOTk0KSBoYXMgaGl0IHRlc3QgcmVjdCAoMTMsMjYyIDI5MHgxMikKK292ZXJoYW5naW5nQ29udGFpbmVyOiBsYXllcig3ODV4MTk5NCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDE0LDI3NCAxMDJ4MTApCitvdmVyaGFuZ2luZ0NvbnRhaW5lcjogbGF5ZXIoNzg1eDE5OTQpIGhhcyBoaXQgdGVzdCByZWN0ICgxNCwyODQgMTExeDEwKQorb3ZlcmhhbmdpbmdDb250YWluZXI6IGxheWVyKDc4NXgxOTk0KSBoYXMgaGl0IHRlc3QgcmVjdCAoMTQsMjk0IDEwMngxMSkKIAotdHJhbnNmb3JtM2Q6IGxheWVyKDE0LDMxNiAyODh4MTIpIGhhcyBoaXQgdGVzdCByZWN0ICgwLDAgMjg4eDEyKQotdHJhbnNmb3JtM2Q6IGxheWVyKDAsMCA3ODV4MjEzOCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDEzLDMxNSAyOTB4MTQpCit0cmFuc2Zvcm0zZDogbGF5ZXIoMjg4eDEyKSBoYXMgaGl0IHRlc3QgcmVjdCAoMCwwIDI4OHgxMikKK3RyYW5zZm9ybTNkOiBsYXllcig3ODV4MjEzOCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDEzLDMxNSAyOTB4MTQpCiAKLW5lZ2F0aXZlT2Zmc2V0Q2hpbGQ6IGxheWVyKC05NiwzMzkgMjExeDEzKSBoYXMgaGl0IHRlc3QgcmVjdCAoMCwxIDEwMngxMikKK25lZ2F0aXZlT2Zmc2V0Q2hpbGQ6IGxheWVyKDIxMXgxMykgaGFzIGhpdCB0ZXN0IHJlY3QgKDAsMSAxMDJ4MTIpCiAKLWNvbnRpbnVhdGlvbjogbGF5ZXIoMCwwIDc4NXgyMjY2KSBoYXMgaGl0IHRlc3QgcmVjdCAoMTMsMzU1IDEwMXgxMSkKLWNvbnRpbnVhdGlvbjogbGF5ZXIoMCwwIDc4NXgyMjY2KSBoYXMgaGl0IHRlc3QgcmVjdCAoMTMsMzY2IDI5MHgxMikKLWNvbnRpbnVhdGlvbjogbGF5ZXIoMCwwIDc4NXgyMjY2KSBoYXMgaGl0IHRlc3QgcmVjdCAoMTMsMzc4IDEyMXgxMSkKK2NvbnRpbnVhdGlvbjogbGF5ZXIoNzg1eDIyNjYpIGhhcyBoaXQgdGVzdCByZWN0ICgxMywzNTUgMTAxeDExKQorY29udGludWF0aW9uOiBsYXllcig3ODV4MjI2NikgaGFzIGhpdCB0ZXN0IHJlY3QgKDEzLDM2NiAyOTB4MTIpCitjb250aW51YXRpb246IGxheWVyKDc4NXgyMjY2KSBoYXMgaGl0IHRlc3QgcmVjdCAoMTMsMzc4IDEyMXgxMSkKIAotaW5saW5lQWJzb2x1dGVDaGlsZENvbnRhaW5lcjogbGF5ZXIoMCwwIDc4NXgyMzc4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMTMsMzkyIDI2MngxMikKLWlubGluZUFic29sdXRlQ2hpbGRDb250YWluZXI6IGxheWVyKDAsMCA3ODV4MjM3OCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDMyMCwzOTMgMjUyeDEyKQoraW5saW5lQWJzb2x1dGVDaGlsZENvbnRhaW5lcjogbGF5ZXIoNzg1eDIzNzgpIGhhcyBoaXQgdGVzdCByZWN0ICgxMywzOTIgMjYyeDEyKQoraW5saW5lQWJzb2x1dGVDaGlsZENvbnRhaW5lcjogbGF5ZXIoNzg1eDIzNzgpIGhhcyBoaXQgdGVzdCByZWN0ICgzMjAsMzkzIDI1MngxMikKIAotbGlzdDogbGF5ZXIoMCwwIDc4NXgyNDU4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMTMsNDEzIDI5MHgxNCkKLWxpc3Q6IGxheWVyKDAsMCA3ODV4MjQ1OCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDM1NCw0MTQgMjQ4eDEyKQorbGlzdDogbGF5ZXIoNzg1eDI0NTgpIGhhcyBoaXQgdGVzdCByZWN0ICgxMyw0MTMgMjkweDE0KQorbGlzdDogbGF5ZXIoNzg1eDI0NTgpIGhhcyBoaXQgdGVzdCByZWN0ICgzNTQsNDE0IDI0OHgxMikKIAotc3R5bGVNb2RpZmllZDogbGF5ZXIoMCwwIDc4NXgyNTQ4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMTMsNDM3IDI5MHgyMikKK3N0eWxlTW9kaWZpZWQ6IGxheWVyKDc4NXgyNTQ4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMTMsNDM3IDI5MHgyMikKIAotY29udGFpbnNTdmc6IGxheWVyKDAsMCA3ODV4MjU5NikgaGFzIGhpdCB0ZXN0IHJlY3QgKDEzLDQ2NCAyOTB4MTYpCitjb250YWluc1N2ZzogbGF5ZXIoNzg1eDI1OTYpIGhhcyBoaXQgdGVzdCByZWN0ICgxMyw0NjQgMjkweDE2KQogCi1zdmdsaW5lOiBsYXllcigwLDAgNzg1eDI2NDQpIGhhcyBoaXQgdGVzdCByZWN0ICgxMyw0ODkgMjJ4MykKK3N2Z2xpbmU6IGxheWVyKDc4NXgyNjQ0KSBoYXMgaGl0IHRlc3QgcmVjdCAoMTMsNDg5IDIyeDMpCiAKLXRhYmxlY2VsbDogbGF5ZXIoMCwwIDc4NXgyNjkyKSBoYXMgaGl0IHRlc3QgcmVjdCAoNDUsNTE4IDMyeDExKQordGFibGVjZWxsOiBsYXllcig3ODV4MjY5MikgaGFzIGhpdCB0ZXN0IHJlY3QgKDQ1LDUxOCAzMngxMSkKIAogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmxhZy1zcGVjaWZpYy9kaXNhYmxlLWJsaW5rLWZlYXR1cmVzPUxheW91dE5HL3ZpcnR1YWwvc2Nyb2xsX2N1c3RvbWl6YXRpb24vZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtbGlzdC10cmFuc2xhdGUtZXhwZWN0ZWQudHh0IGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2ZsYWctc3BlY2lmaWMvZGlzYWJsZS1ibGluay1mZWF0dXJlcz1MYXlvdXRORy92aXJ0dWFsL3Njcm9sbF9jdXN0b21pemF0aW9uL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLWxpc3QtdHJhbnNsYXRlLWV4cGVjdGVkLnR4dAppbmRleCBlMGM1OTM0Li45YjJiYjhhIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmxhZy1zcGVjaWZpYy9kaXNhYmxlLWJsaW5rLWZlYXR1cmVzPUxheW91dE5HL3ZpcnR1YWwvc2Nyb2xsX2N1c3RvbWl6YXRpb24vZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtbGlzdC10cmFuc2xhdGUtZXhwZWN0ZWQudHh0CisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mbGFnLXNwZWNpZmljL2Rpc2FibGUtYmxpbmstZmVhdHVyZXM9TGF5b3V0TkcvdmlydHVhbC9zY3JvbGxfY3VzdG9taXphdGlvbi9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1saXN0LXRyYW5zbGF0ZS1leHBlY3RlZC50eHQKQEAgLTEsNCArMSw0IEBACi1saXN0OiBsYXllcigwLDAgODAweDYwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDEzLDEwIDI5MHgxNCkKLWxpc3Q6IGxheWVyKDAsMCA4MDB4NjAwKSBoYXMgaGl0IHRlc3QgcmVjdCAoMzU0LDExIDI0OHgxMikKK2xpc3Q6IGxheWVyKDgwMHg2MDApIGhhcyBoaXQgdGVzdCByZWN0ICgxMywxMCAyOTB4MTQpCitsaXN0OiBsYXllcig4MDB4NjAwKSBoYXMgaGl0IHRlc3QgcmVjdCAoMzU0LDExIDI0OHgxMikKIAogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmxhZy1zcGVjaWZpYy9lbmFibGUtYmxpbmstZmVhdHVyZXM9Q29tcG9zaXRlQWZ0ZXJQYWludC9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1hbmltYXRpb24tZXhwZWN0ZWQudHh0IGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2ZsYWctc3BlY2lmaWMvZW5hYmxlLWJsaW5rLWZlYXR1cmVzPUNvbXBvc2l0ZUFmdGVyUGFpbnQvZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtYW5pbWF0aW9uLWV4cGVjdGVkLnR4dAppbmRleCBmYjIxMGM1Li5kNmU5MTAwMiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2ZsYWctc3BlY2lmaWMvZW5hYmxlLWJsaW5rLWZlYXR1cmVzPUNvbXBvc2l0ZUFmdGVyUGFpbnQvZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtYW5pbWF0aW9uLWV4cGVjdGVkLnR4dAorKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmxhZy1zcGVjaWZpYy9lbmFibGUtYmxpbmstZmVhdHVyZXM9Q29tcG9zaXRlQWZ0ZXJQYWludC9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1hbmltYXRpb24tZXhwZWN0ZWQudHh0CkBAIC0xLDEwICsxLDEwIEBACiBUaGlzIHRlc3QgdmVyaWZpZXMgdGhlIGhpdCB0ZXN0IHJlZ2lvbnMgYXJlIHVwZGF0ZWQgY29ycmVjdGx5IHdoZW4gY29tcG9zaXRlZCBsYXllciBhcmUgY3JlYXRlZCBhbmQgZGVzdHJveWVkIHdpdGhvdXQgdHJpZ2dlcmluZyBsYXlvdXQgdXBkYXRlIGR1cmluZyBmYXN0IHBhdGggYW5pbWF0aW9uLgogCi1bb2JqZWN0IEhUTUxEaXZFbGVtZW50XTogbGF5ZXIoMCwwIDgwMHg2MDApIGhhcyBoaXQgdGVzdCByZWN0ICgyMDAsMjAwIDUweDUwKQorW29iamVjdCBIVE1MRGl2RWxlbWVudF06IGxheWVyKDgwMHg2MDApIGhhcyBoaXQgdGVzdCByZWN0ICgyMDAsMjAwIDUweDUwKQogCi1bb2JqZWN0IEhUTUxEaXZFbGVtZW50XTogbGF5ZXIoMCwwIDUweDUwKSBoYXMgaGl0IHRlc3QgcmVjdCAoMCwwIDUweDUwKQorW29iamVjdCBIVE1MRGl2RWxlbWVudF06IGxheWVyKDUweDUwKSBoYXMgaGl0IHRlc3QgcmVjdCAoMCwwIDUweDUwKQogCi1bb2JqZWN0IEhUTUxEaXZFbGVtZW50XTogbGF5ZXIoMCwwIDgwMHg2MDApIGhhcyBoaXQgdGVzdCByZWN0ICgxNzUsMTc1IDEwMHgxMDApCitbb2JqZWN0IEhUTUxEaXZFbGVtZW50XTogbGF5ZXIoODAweDYwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDE3NSwxNzUgMTAweDEwMCkKIAogCiBQQVNTIHN1Y2Nlc3NmdWxseVBhcnNlZCBpcyB0cnVlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmxhZy1zcGVjaWZpYy9lbmFibGUtYmxpbmstZmVhdHVyZXM9Q29tcG9zaXRlQWZ0ZXJQYWludC9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1ub24tY29tcG9zaXRlZC1zY3JvbGwtb3ZlcmZsb3ctd2l0aC1oYW5kbGVyLWV4cGVjdGVkLnR4dCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mbGFnLXNwZWNpZmljL2VuYWJsZS1ibGluay1mZWF0dXJlcz1Db21wb3NpdGVBZnRlclBhaW50L2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLW5vbi1jb21wb3NpdGVkLXNjcm9sbC1vdmVyZmxvdy13aXRoLWhhbmRsZXItZXhwZWN0ZWQudHh0CmluZGV4IDU1OGY4YmRjZC4uODYyYzAzN2YgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mbGFnLXNwZWNpZmljL2VuYWJsZS1ibGluay1mZWF0dXJlcz1Db21wb3NpdGVBZnRlclBhaW50L2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLW5vbi1jb21wb3NpdGVkLXNjcm9sbC1vdmVyZmxvdy13aXRoLWhhbmRsZXItZXhwZWN0ZWQudHh0CisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mbGFnLXNwZWNpZmljL2VuYWJsZS1ibGluay1mZWF0dXJlcz1Db21wb3NpdGVBZnRlclBhaW50L2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLW5vbi1jb21wb3NpdGVkLXNjcm9sbC1vdmVyZmxvdy13aXRoLWhhbmRsZXItZXhwZWN0ZWQudHh0CkBAIC0xLDQgKzEsNCBAQAotbm90Y2xpcHBlZDogbGF5ZXIoMSwxIDMwMHgxMDApIGhhcyBoaXQgdGVzdCByZWN0ICgwLDUwIDIwMHgyNSkKK25vdGNsaXBwZWQ6IGxheWVyKDMwMHgxMDApIGhhcyBoaXQgdGVzdCByZWN0ICgwLDUwIDIwMHgyNSkKIAogY2xpcHBlZDogbm8gcmVjdHMKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2ZsYWctc3BlY2lmaWMvZW5hYmxlLWJsaW5rLWZlYXR1cmVzPUNvbXBvc2l0ZUFmdGVyUGFpbnQvZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtc2Nyb2xsLWV4cGVjdGVkLnR4dCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mbGFnLXNwZWNpZmljL2VuYWJsZS1ibGluay1mZWF0dXJlcz1Db21wb3NpdGVBZnRlclBhaW50L2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLXNjcm9sbC1leHBlY3RlZC50eHQKaW5kZXggZjdiZTk3Mi4uMTE3MzQ5OTYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mbGFnLXNwZWNpZmljL2VuYWJsZS1ibGluay1mZWF0dXJlcz1Db21wb3NpdGVBZnRlclBhaW50L2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLXNjcm9sbC1leHBlY3RlZC50eHQKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2ZsYWctc3BlY2lmaWMvZW5hYmxlLWJsaW5rLWZlYXR1cmVzPUNvbXBvc2l0ZUFmdGVyUGFpbnQvZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtc2Nyb2xsLWV4cGVjdGVkLnR4dApAQCAtMSwyMCArMSwyMCBAQAogVGhpcyB0ZXN0IHZlcmlmaWVzIHRoZSBoaXQgdGVzdCByZWdpb25zIGdpdmVuIHRvIHRoZSBjb21wb3NpdG9yIHNwZWNpZmljYWxseSBhcm91bmQgY29tcG9zaXRlZCBvdmVyZmxvdyBzY3JvbGwgZWxlbWVudHMuCiAKLXNjcm9sbENvbnRlbnQ6IGxheWVyKDEsMSAyODh4NTApIGhhcyBoaXQgdGVzdCByZWN0ICgwLDAgMjczeDEwKQorc2Nyb2xsQ29udGVudDogbGF5ZXIoMjg4eDUwKSBoYXMgaGl0IHRlc3QgcmVjdCAoMCwwIDI3M3gxMCkKIAotc2Nyb2xsQ29udGVudDU6IGxheWVyKDEsMSAyODh4NTApIGhhcyBoaXQgdGVzdCByZWN0ICgwLDggMjczeDEyKQorc2Nyb2xsQ29udGVudDU6IGxheWVyKDI4OHg1MCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDAsOCAyNzN4MTIpCiAKLXNjcm9sbENvbnRlbnQ2OiBsYXllcigwLDAgNzg1eDYwMSkgaGFzIGhpdCB0ZXN0IHJlY3QgKDE0LDIwMyAyNzN4MTIpCitzY3JvbGxDb250ZW50NjogbGF5ZXIoNzg1eDYwMSkgaGFzIGhpdCB0ZXN0IHJlY3QgKDE0LDIwMyAyNzN4MTIpCiAKLW5lc3RlZENvbnRlbnQ6IGxheWVyKDEsMSAyNzF4NTApIGhhcyBoaXQgdGVzdCByZWN0ICgwLDEyIDI1NngxMikKK25lc3RlZENvbnRlbnQ6IGxheWVyKDI3MXg1MCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDAsMTIgMjU2eDEyKQogCi1vdmVyZmxvd3dpdGhoYW5kbGVyOiBsYXllcigxLDEgMjcxeDUwKSBoYXMgaGl0IHRlc3QgcmVjdCAoMCwwIDI1Nng1MCkKLW92ZXJmbG93d2l0aGhhbmRsZXI6IGxheWVyKDEsMSAyODh4NTApIGhhcyBoaXQgdGVzdCByZWN0ICgwLDEwIDI3M3g0MCkKK292ZXJmbG93d2l0aGhhbmRsZXI6IGxheWVyKDI3MXg1MCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDAsMCAyNTZ4NTApCitvdmVyZmxvd3dpdGhoYW5kbGVyOiBsYXllcigyODh4NTApIGhhcyBoaXQgdGVzdCByZWN0ICgwLDEwIDI3M3g0MCkKIAotb3ZlcmZsb3d3aXRoYm9yZGVyOiBsYXllcigxMCw2IDI3NHg1OCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDAsMCAyNTV4NTgpCi1vdmVyZmxvd3dpdGhib3JkZXI6IGxheWVyKDAsMCA3ODV4Nzc3KSBoYXMgaGl0IHRlc3QgcmVjdCAoMTMsMzY1IDI5MHg3MCkKK292ZXJmbG93d2l0aGJvcmRlcjogbGF5ZXIoMjc0eDU4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMCwwIDI1NXg1OCkKK292ZXJmbG93d2l0aGJvcmRlcjogbGF5ZXIoNzg1eDc3NykgaGFzIGhpdCB0ZXN0IHJlY3QgKDEzLDM2NSAyOTB4NzApCiAKLXdpdGhUcmFuc2Zvcm06IGxheWVyKDEyLDI1IDI3MXgxMikgaGFzIGhpdCB0ZXN0IHJlY3QgKDAsMCAyNzF4MTIpCi13aXRoVHJhbnNmb3JtOiBsYXllcigxLDEgMjg4eDUwKSBoYXMgaGl0IHRlc3QgcmVjdCAoMCwwIDI3M3g3KQord2l0aFRyYW5zZm9ybTogbGF5ZXIoMjcxeDEyKSBoYXMgaGl0IHRlc3QgcmVjdCAoMCwwIDI3MXgxMikKK3dpdGhUcmFuc2Zvcm06IGxheWVyKDI4OHg1MCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDAsMCAyNzN4NykKIAogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZmxhZy1zcGVjaWZpYy9lbmFibGUtYmxpbmstZmVhdHVyZXM9Q29tcG9zaXRlQWZ0ZXJQYWludC9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy13aXRoLW5lZ2F0aXZlLWNoaWxkLWV4cGVjdGVkLnR4dCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mbGFnLXNwZWNpZmljL2VuYWJsZS1ibGluay1mZWF0dXJlcz1Db21wb3NpdGVBZnRlclBhaW50L2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLXdpdGgtbmVnYXRpdmUtY2hpbGQtZXhwZWN0ZWQudHh0CmluZGV4IDg0YWNkNjguLmYzYzU0MjIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mbGFnLXNwZWNpZmljL2VuYWJsZS1ibGluay1mZWF0dXJlcz1Db21wb3NpdGVBZnRlclBhaW50L2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLXdpdGgtbmVnYXRpdmUtY2hpbGQtZXhwZWN0ZWQudHh0CisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mbGFnLXNwZWNpZmljL2VuYWJsZS1ibGluay1mZWF0dXJlcz1Db21wb3NpdGVBZnRlclBhaW50L2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLXdpdGgtbmVnYXRpdmUtY2hpbGQtZXhwZWN0ZWQudHh0CkBAIC0xLDUgKzEsNSBAQAogVGhpcyB0ZXN0cyB2ZXJpZmllcyB0aGUgaGl0IHRlc3QgcmVnaW9ucyBnaXZlbiB0byB0aGUgY29tcG9zaXRvciBmb3IgYW4gZWxlbWVudCB3aXRoIGNoaWxkIGF0IG5lZ2F0aXZlIG9mZnNldC4gSXQgY2FuIG9ubHkgYmUgcnVuIGluIER1bXBSZW5kZXJUcmVlLgogCi1uZWdhdGl2ZU9mZnNldENoaWxkOiBsYXllcigyNiw5NiAyMTJ4MTMpIGhhcyBoaXQgdGVzdCByZWN0ICgwLDEgMTAzeDEyKQorbmVnYXRpdmVPZmZzZXRDaGlsZDogbGF5ZXIoMjEyeDEzKSBoYXMgaGl0IHRlc3QgcmVjdCAoMCwxIDEwM3gxMikKIAogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvZnVsbHNjcmVlbi9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1mdWxsc2NyZWVuLXZpZGVvLWNvbnRyb2xzLWV4cGVjdGVkLnR4dCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9mdWxsc2NyZWVuL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLWZ1bGxzY3JlZW4tdmlkZW8tY29udHJvbHMtZXhwZWN0ZWQudHh0CmluZGV4IGZiNzYzMWUyOS4uY2UxN2NjYiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Z1bGxzY3JlZW4vY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtZnVsbHNjcmVlbi12aWRlby1jb250cm9scy1leHBlY3RlZC50eHQKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2Z1bGxzY3JlZW4vY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtZnVsbHNjcmVlbi12aWRlby1jb250cm9scy1leHBlY3RlZC50eHQKQEAgLTEsMTQgKzEsMTQgQEAKIFRoaXMgdGVzdCBtYWtlcyBzdXJlIHRoYXQgdG91Y2ggaGl0IHJlY3RzIGFyZSByZXBvcnRlZCBmb3IgZnVsbHNjcmVlbiBIVE1MNSB2aWRlbyBjb250cm9sIGVsZW1lbnRzIGV2ZW4gd2hlbiB0aGVyZSBpcyBhIGRvY3VtZW50IGhhbmRsZXIuCiAKIFNob3VsZCBoYXZlIHNpbmdsZSByZWN0IG9uIGRvY3VtZW50IGJlZm9yZSBmdWxsc2NyZWVuCi1oYW5kbGVyOiBsYXllcigwLDAgODAweDYwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDAsMCA4MDB4NjAwKQoraGFuZGxlcjogbGF5ZXIoODAweDYwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDAsMCA4MDB4NjAwKQogCiBFVkVOVCh3ZWJraXRmdWxsc2NyZWVuY2hhbmdlKQogU2hvdWxkIGtlZXAgcmVjdCBvbiBkb2N1bWVudAotaGFuZGxlcjogbGF5ZXIoMCwwIDgwMHg2MDApIGhhcyBoaXQgdGVzdCByZWN0ICgwLDAgODAweDYwMCkKLWhhbmRsZXI6IGxheWVyKDAsMCA4MDB4NjAwKSBoYXMgaGl0IHRlc3QgcmVjdCAoMCwwIDgwMHg2MDApCi1oYW5kbGVyOiBsYXllcigwLDAgODAweDYwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDAsMCA4MDB4NjAwKQotaGFuZGxlcjogbGF5ZXIoMCwwIDgwMHg2MDApIGhhcyBoaXQgdGVzdCByZWN0ICgwLDAgODAweDYwMCkKK2hhbmRsZXI6IGxheWVyKDgwMHg2MDApIGhhcyBoaXQgdGVzdCByZWN0ICgwLDAgODAweDYwMCkKK2hhbmRsZXI6IGxheWVyKDgwMHg2MDApIGhhcyBoaXQgdGVzdCByZWN0ICgwLDAgODAweDYwMCkKK2hhbmRsZXI6IGxheWVyKDgwMHg2MDApIGhhcyBoaXQgdGVzdCByZWN0ICgwLDAgODAweDYwMCkKK2hhbmRsZXI6IGxheWVyKDgwMHg2MDApIGhhcyBoaXQgdGVzdCByZWN0ICgwLDAgODAweDYwMCkKIAogRU5EIE9GIFRFU1QKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2h0dHAvdGVzdHMvZGV2dG9vbHMvYTExeS1heGUtY29yZS9zb3VyY2VzL2NhbGwtc3RhY2stYTExeS10ZXN0LWV4cGVjdGVkLnR4dCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9odHRwL3Rlc3RzL2RldnRvb2xzL2ExMXktYXhlLWNvcmUvc291cmNlcy9jYWxsLXN0YWNrLWExMXktdGVzdC1leHBlY3RlZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNlNjgxNAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9odHRwL3Rlc3RzL2RldnRvb2xzL2ExMXktYXhlLWNvcmUvc291cmNlcy9jYWxsLXN0YWNrLWExMXktdGVzdC1leHBlY3RlZC50eHQKQEAgLTAsMCArMSw3IEBACitUZXN0aW5nIGFjY2Vzc2liaWxpdHkgaW4gdGhlIGNhbGwgc3RhY2sgc2lkZWJhciBwYW5lLgorU2V0IHRpbWVyIGZvciB0ZXN0IGZ1bmN0aW9uLgorQ2FsbCBzdGFjayBwYW5lIGNvbnRlbnQ6IFNob3cgYmxhY2tib3hlZCBmcmFtZXNOb3QgcGF1c2VkKGFub255bW91cyl0ZXN0LmpzOjIwY2FsbFdpdGhBc3luY1N0YWNrdGVzdC5qczoxM2NhbGwxd3JhcHBlci5qczoxUHJvbWlzZS50aGVuIChhc3luYyljYWxsV2l0aEFzeW5jU3RhY2t0ZXN0LmpzOjE3Y2FsbDJWTSB3cmFwcGVyLmpzOjFQcm9taXNlLnRoZW4gKGFzeW5jKWNhbGxXaXRoQXN5bmNTdGFja3Rlc3QuanM6MTdjYWxsM1ZNIHdyYXBwZXIuanM6MVByb21pc2UudGhlbiAoYXN5bmMpY2FsbFdpdGhBc3luY1N0YWNrdGVzdC5qczoxN2NhbGw0Vk0gd3JhcHBlci5qczoxUHJvbWlzZS50aGVuIChhc3luYyljYWxsV2l0aEFzeW5jU3RhY2t0ZXN0LmpzOjE3Y2FsbDVWTSB3cmFwcGVyLmpzOjFQcm9taXNlLnRoZW4gKGFzeW5jKWNhbGxXaXRoQXN5bmNTdGFja3Rlc3QuanM6MTd0ZXN0RnVuY3Rpb250ZXN0LmpzOjIwc2V0VGltZW91dCAoYXN5bmMpc2NoZWR1bGVUZXN0RnVuY3Rpb25WTTozKGFub255bW91cylWTToxU2hvdyBtb3JlCitSdW5uaW5nIHRoZSBheGUtY29yZSBsaW50ZXIgb24gdGhlIGNhbGwgc3RhY2sgc2lkZWJhciBwYW5lLgorYVhlIHZpb2xhdGlvbnM6IFtdCisKKwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2h0dHAvdGVzdHMvZGV2dG9vbHMvYTExeS1heGUtY29yZS9zb3VyY2VzL2NhbGwtc3RhY2stYTExeS10ZXN0LmpzIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2h0dHAvdGVzdHMvZGV2dG9vbHMvYTExeS1heGUtY29yZS9zb3VyY2VzL2NhbGwtc3RhY2stYTExeS10ZXN0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmOWE4NmIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvaHR0cC90ZXN0cy9kZXZ0b29scy9hMTF5LWF4ZS1jb3JlL3NvdXJjZXMvY2FsbC1zdGFjay1hMTF5LXRlc3QuanMKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IDIwMTkgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyhhc3luYyBmdW5jdGlvbigpIHsKKyAgYXdhaXQgVGVzdFJ1bm5lci5sb2FkTW9kdWxlKCdheGVfY29yZV90ZXN0X3J1bm5lcicpOworICBhd2FpdCBUZXN0UnVubmVyLmxvYWRNb2R1bGUoJ3NvdXJjZXNfdGVzdF9ydW5uZXInKTsKKyAgYXdhaXQgVGVzdFJ1bm5lci5zaG93UGFuZWwoJ3NvdXJjZXMnKTsKKworICBUZXN0UnVubmVyLmFkZFJlc3VsdCgnVGVzdGluZyBhY2Nlc3NpYmlsaXR5IGluIHRoZSBjYWxsIHN0YWNrIHNpZGViYXIgcGFuZS4nKTsKKyAgYXdhaXQgVGVzdFJ1bm5lci5ldmFsdWF0ZUluUGFnZVByb21pc2UoYAorICAgICAgZnVuY3Rpb24gY2FsbFdpdGhBc3luY1N0YWNrKGYsIGRlcHRoKSB7CisgICAgICAgIGlmIChkZXB0aCA9PT0gMCkgeworICAgICAgICAgIGYoKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgd3JhcHBlciA9IGV2YWwoJyhmdW5jdGlvbiBjYWxsJyArIGRlcHRoICsgJygpIHsgY2FsbFdpdGhBc3luY1N0YWNrKGYsIGRlcHRoIC0gMSkgfSkgLy8jIHNvdXJjZVVSTD13cmFwcGVyLmpzJyk7CisgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4od3JhcHBlcik7CisgICAgICB9CisgICAgICBmdW5jdGlvbiB0ZXN0RnVuY3Rpb24oKSB7CisgICAgICAgIGNhbGxXaXRoQXN5bmNTdGFjaygoKSA9PiB7ZGVidWdnZXJ9LCA1KTsKKyAgICAgIH0KKyAgICAgIC8vIyBzb3VyY2VVUkw9dGVzdC5qcworICAgIGApOworCisgIGF3YWl0IFNvdXJjZXNUZXN0UnVubmVyLnN0YXJ0RGVidWdnZXJUZXN0UHJvbWlzZSgvKiBxdWlldCAqLyB0cnVlKTsKKyAgYXdhaXQgU291cmNlc1Rlc3RSdW5uZXIucnVuVGVzdEZ1bmN0aW9uQW5kV2FpdFVudGlsUGF1c2VkUHJvbWlzZSgpOworICBhd2FpdCBUZXN0UnVubmVyLmFkZFNuaWZmZXJQcm9taXNlKAorICAgICAgU291cmNlcy5DYWxsU3RhY2tTaWRlYmFyUGFuZS5wcm90b3R5cGUsICdfdXBkYXRlZEZvclRlc3QnKTsKKworICBjb25zdCBjYWxsU3RhY2tQYW5lID0gcnVudGltZS5zaGFyZWRJbnN0YW5jZShTb3VyY2VzLkNhbGxTdGFja1NpZGViYXJQYW5lKTsKKyAgY29uc3QgY2FsbFN0YWNrRWxlbWVudCA9IGNhbGxTdGFja1BhbmUuY29udGVudEVsZW1lbnQ7CisgIFRlc3RSdW5uZXIuYWRkUmVzdWx0KGBDYWxsIHN0YWNrIHBhbmUgY29udGVudDogJHtUZXN0UnVubmVyLmNsZWFyU3BlY2lmaWNJbmZvRnJvbVN0YWNrRnJhbWVzKGNhbGxTdGFja0VsZW1lbnQuZGVlcFRleHRDb250ZW50KCkpfWApOworICBUZXN0UnVubmVyLmFkZFJlc3VsdCgnUnVubmluZyB0aGUgYXhlLWNvcmUgbGludGVyIG9uIHRoZSBjYWxsIHN0YWNrIHNpZGViYXIgcGFuZS4nKTsKKyAgYXdhaXQgQXhlQ29yZVRlc3RSdW5uZXIucnVuVmFsaWRhdGlvbihjYWxsU3RhY2tFbGVtZW50KTsKKworICBUZXN0UnVubmVyLmNvbXBsZXRlVGVzdCgpOworfSkoKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9odHRwL3Rlc3RzL2RldnRvb2xzL3dlYmF1ZGlvL2F1ZGlvLWNvbnRleHQtc2VsZWN0b3ItdGVzdC1leHBlY3RlZC50eHQgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvaHR0cC90ZXN0cy9kZXZ0b29scy93ZWJhdWRpby9hdWRpby1jb250ZXh0LXNlbGVjdG9yLXRlc3QtZXhwZWN0ZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NDRmNGUxCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2h0dHAvdGVzdHMvZGV2dG9vbHMvd2ViYXVkaW8vYXVkaW8tY29udGV4dC1zZWxlY3Rvci10ZXN0LWV4cGVjdGVkLnR4dApAQCAtMCwwICsxLDc0IEBACitUZXN0cyB0aGUgQXVkaW9Db250ZXh0U2VsZWN0b3IuCisKK1J1bm5pbmc6IHRlc3RTdGFydHNFbXB0eQorCitOdW1iZXIgb2YgY29udGV4dHMgKGl0ZW1zKTogMAorU2VsZWN0ZWQgQ29udGV4dDogbnVsbAorCisKK1J1bm5pbmc6IHRlc3RTZWxlY3RzQ3JlYXRlZENvbnRleHQKKworTnVtYmVyIG9mIGNvbnRleHRzIChpdGVtcyk6IDEKK1NlbGVjdGVkIENvbnRleHQ6IHsKKyAgICJjb250ZXh0SWQiOiAiOTI0YzRlZTQtNGNhZS00ZTYyLWI0YzYtNzE2MDNlZGMzOWZkIiwKKyAgICJjb250ZXh0VHlwZSI6ICJyZWFsdGltZSIKK30KKworCitSdW5uaW5nOiB0ZXN0UmVzZXRDbGVhcnNMaXN0CisKK051bWJlciBvZiBjb250ZXh0cyAoaXRlbXMpOiAwCitTZWxlY3RlZCBDb250ZXh0OiB7CisgICAiY29udGV4dElkIjogIjkyNGM0ZWU0LTRjYWUtNGU2Mi1iNGM2LTcxNjAzZWRjMzlmZCIsCisgICAiY29udGV4dFR5cGUiOiAicmVhbHRpbWUiCit9CisKKworUnVubmluZzogdGVzdFJlU2VsZWN0c0NyZWF0ZWRDb250ZXh0QWZ0ZXJDaGFuZ2UKKworTnVtYmVyIG9mIGNvbnRleHRzIChpdGVtcyk6IDEKK1NlbGVjdGVkIENvbnRleHQ6IHsKKyAgICJjb250ZXh0SWQiOiAiOTI0YzRlZTQtNGNhZS00ZTYyLWI0YzYtNzE2MDNlZGMzOWZkIiwKKyAgICJjb250ZXh0VHlwZSI6ICJyZWFsdGltZSIKK30KKworCitSdW5uaW5nOiB0ZXN0Rmlyc3RDcmVhdGVkQ29udGV4dFN0YXlzU2VsZWN0ZWQKKworTnVtYmVyIG9mIGNvbnRleHRzIChpdGVtcyk6IDIKK1NlbGVjdGVkIENvbnRleHQ6IHsKKyAgICJjb250ZXh0SWQiOiAiOTI0YzRlZTQtNGNhZS00ZTYyLWI0YzYtNzE2MDNlZGMzOWZkIiwKKyAgICJjb250ZXh0VHlwZSI6ICJyZWFsdGltZSIKK30KKworCitSdW5uaW5nOiB0ZXN0Q2hhbmdpbmdDb250ZXh0RG9lc05vdENoYW5nZVNlbGVjdGlvbgorCitOdW1iZXIgb2YgY29udGV4dHMgKGl0ZW1zKTogMgorU2VsZWN0ZWQgQ29udGV4dDogeworICAgImNvbnRleHRJZCI6ICI5MjRjNGVlNC00Y2FlLTRlNjItYjRjNi03MTYwM2VkYzM5ZmQiLAorICAgImNvbnRleHRUeXBlIjogInJlYWx0aW1lIgorfQorCisKK1J1bm5pbmc6IHRlc3RTZWxlY3RlZENvbnRleHRCZWNvbWVzU2VsZWN0ZWQKKworTnVtYmVyIG9mIGNvbnRleHRzIChpdGVtcyk6IDIKK1NlbGVjdGVkIENvbnRleHQ6IHsKKyAgICJjb250ZXh0SWQiOiAiNzhhM2U5NGUtNDk2OC00YmY2LTg5MDUtMzI1MTA5Njk1YzllIiwKKyAgICJjb250ZXh0VHlwZSI6ICJyZWFsdGltZSIKK30KKworCitSdW5uaW5nOiB0ZXN0T25MaXN0SXRlbVJlcGxhY2VkQ2FsbGVkCitfb25MaXN0SXRlbVJlcGxhY2VkIGNhbGxlZCB3aXRoIGNvbnRleHRzIChpdGVtcykgY291bnQ6IDEKK19vbkxpc3RJdGVtUmVwbGFjZWQgY2FsbGVkIHdpdGggY29udGV4dHMgKGl0ZW1zKSBjb3VudDogMAorX29uTGlzdEl0ZW1SZXBsYWNlZCBjYWxsZWQgd2l0aCBjb250ZXh0cyAoaXRlbXMpIGNvdW50OiAxCisKK051bWJlciBvZiBjb250ZXh0cyAoaXRlbXMpOiAxCitTZWxlY3RlZCBDb250ZXh0OiB7CisgICAiY29udGV4dElkIjogIjkyNGM0ZWU0LTRjYWUtNGU2Mi1iNGM2LTcxNjAzZWRjMzlmZCIsCisgICAiY29udGV4dFR5cGUiOiAicmVhbHRpbWUiCit9CisKKwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2h0dHAvdGVzdHMvZGV2dG9vbHMvd2ViYXVkaW8vYXVkaW8tY29udGV4dC1zZWxlY3Rvci10ZXN0LmpzIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL2h0dHAvdGVzdHMvZGV2dG9vbHMvd2ViYXVkaW8vYXVkaW8tY29udGV4dC1zZWxlY3Rvci10ZXN0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZThhMTYKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvaHR0cC90ZXN0cy9kZXZ0b29scy93ZWJhdWRpby9hdWRpby1jb250ZXh0LXNlbGVjdG9yLXRlc3QuanMKQEAgLTAsMCArMSwxMDggQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworKGFzeW5jIGZ1bmN0aW9uKCkgeworICBUZXN0UnVubmVyLmFkZFJlc3VsdChgVGVzdHMgdGhlIEF1ZGlvQ29udGV4dFNlbGVjdG9yLmApOworICBhd2FpdCBUZXN0UnVubmVyLmxvYWRNb2R1bGUoJ3dlYl9hdWRpbycpOworCisgIC8qKiBAdHlwZSB7IVByb3RvY29sLldlYkF1ZGlvLkJhc2VBdWRpb0NvbnRleHR9ICovCisgIGNvbnN0IGNvbnRleHQxID0geworICAgIGNvbnRleHRJZDogJzkyNGM0ZWU0LTRjYWUtNGU2Mi1iNGM2LTcxNjAzZWRjMzlmZCcsCisgICAgY29udGV4dFR5cGU6ICdyZWFsdGltZScKKyAgfTsKKyAgLyoqIEB0eXBlIHshUHJvdG9jb2wuV2ViQXVkaW8uQmFzZUF1ZGlvQ29udGV4dH0gKi8KKyAgY29uc3QgY29udGV4dDIgPSB7CisgICAgY29udGV4dElkOiAnNzhhM2U5NGUtNDk2OC00YmY2LTg5MDUtMzI1MTA5Njk1YzllJywKKyAgICBjb250ZXh0VHlwZTogJ3JlYWx0aW1lJworICB9OworCisgIGZ1bmN0aW9uIGR1bXBTZWxlY3RvclN0YXRlKAorICAgICAgLyoqIEB0eXBlIHshV2ViQXVkaW8uQXVkaW9Db250ZXh0U2VsZWN0b3J9ICovIHNlbGVjdG9yKSB7CisgICAgVGVzdFJ1bm5lci5hZGRSZXN1bHQoYAorTnVtYmVyIG9mIGNvbnRleHRzIChpdGVtcyk6ICR7c2VsZWN0b3IuX2l0ZW1zLmxlbmd0aH0KK1NlbGVjdGVkIENvbnRleHQ6ICR7SlNPTi5zdHJpbmdpZnkoc2VsZWN0b3Iuc2VsZWN0ZWRDb250ZXh0KCksIG51bGwsIDMpfQorYCk7CisgIH0KKworICBUZXN0UnVubmVyLnJ1bkFzeW5jVGVzdFN1aXRlKFsKKyAgICBhc3luYyBmdW5jdGlvbiB0ZXN0U3RhcnRzRW1wdHkoKSB7CisgICAgICBjb25zdCBzZWxlY3RvciA9IG5ldyBXZWJBdWRpby5BdWRpb0NvbnRleHRTZWxlY3RvcigpOworCisgICAgICBkdW1wU2VsZWN0b3JTdGF0ZShzZWxlY3Rvcik7CisgICAgfSwKKworICAgIGFzeW5jIGZ1bmN0aW9uIHRlc3RTZWxlY3RzQ3JlYXRlZENvbnRleHQoKSB7CisgICAgICBjb25zdCBzZWxlY3RvciA9IG5ldyBXZWJBdWRpby5BdWRpb0NvbnRleHRTZWxlY3RvcigpOworCisgICAgICBzZWxlY3Rvci5jb250ZXh0Q3JlYXRlZCh7ZGF0YTogY29udGV4dDF9KTsKKworICAgICAgZHVtcFNlbGVjdG9yU3RhdGUoc2VsZWN0b3IpOworICAgIH0sCisKKyAgICBhc3luYyBmdW5jdGlvbiB0ZXN0UmVzZXRDbGVhcnNMaXN0KCkgeworICAgICAgY29uc3Qgc2VsZWN0b3IgPSBuZXcgV2ViQXVkaW8uQXVkaW9Db250ZXh0U2VsZWN0b3IoKTsKKworICAgICAgc2VsZWN0b3IuY29udGV4dENyZWF0ZWQoe2RhdGE6IGNvbnRleHQxfSk7CisgICAgICBzZWxlY3Rvci5yZXNldCgpOworCisgICAgICBkdW1wU2VsZWN0b3JTdGF0ZShzZWxlY3Rvcik7CisgICAgfSwKKworICAgIGFzeW5jIGZ1bmN0aW9uIHRlc3RSZVNlbGVjdHNDcmVhdGVkQ29udGV4dEFmdGVyQ2hhbmdlKCkgeworICAgICAgY29uc3Qgc2VsZWN0b3IgPSBuZXcgV2ViQXVkaW8uQXVkaW9Db250ZXh0U2VsZWN0b3IoKTsKKworICAgICAgc2VsZWN0b3IuY29udGV4dENyZWF0ZWQoe2RhdGE6IGNvbnRleHQxfSk7CisgICAgICBzZWxlY3Rvci5jb250ZXh0Q2hhbmdlZCh7ZGF0YTogY29udGV4dDF9KTsKKworICAgICAgZHVtcFNlbGVjdG9yU3RhdGUoc2VsZWN0b3IpOworICAgIH0sCisKKyAgICBhc3luYyBmdW5jdGlvbiB0ZXN0Rmlyc3RDcmVhdGVkQ29udGV4dFN0YXlzU2VsZWN0ZWQoKSB7CisgICAgICBjb25zdCBzZWxlY3RvciA9IG5ldyBXZWJBdWRpby5BdWRpb0NvbnRleHRTZWxlY3RvcigpOworCisgICAgICBzZWxlY3Rvci5jb250ZXh0Q3JlYXRlZCh7ZGF0YTogY29udGV4dDF9KTsKKyAgICAgIHNlbGVjdG9yLmNvbnRleHRDcmVhdGVkKHtkYXRhOiBjb250ZXh0Mn0pOworCisgICAgICBkdW1wU2VsZWN0b3JTdGF0ZShzZWxlY3Rvcik7CisgICAgfSwKKworICAgIGFzeW5jIGZ1bmN0aW9uIHRlc3RDaGFuZ2luZ0NvbnRleHREb2VzTm90Q2hhbmdlU2VsZWN0aW9uKCkgeworICAgICAgY29uc3Qgc2VsZWN0b3IgPSBuZXcgV2ViQXVkaW8uQXVkaW9Db250ZXh0U2VsZWN0b3IoKTsKKworICAgICAgc2VsZWN0b3IuY29udGV4dENyZWF0ZWQoe2RhdGE6IGNvbnRleHQxfSk7CisgICAgICBzZWxlY3Rvci5jb250ZXh0Q3JlYXRlZCh7ZGF0YTogY29udGV4dDJ9KTsKKyAgICAgIHNlbGVjdG9yLmNvbnRleHRDaGFuZ2VkKHtkYXRhOiBjb250ZXh0Mn0pOworCisgICAgICBkdW1wU2VsZWN0b3JTdGF0ZShzZWxlY3Rvcik7CisgICAgfSwKKworICAgIGFzeW5jIGZ1bmN0aW9uIHRlc3RTZWxlY3RlZENvbnRleHRCZWNvbWVzU2VsZWN0ZWQoKSB7CisgICAgICBjb25zdCBzZWxlY3RvciA9IG5ldyBXZWJBdWRpby5BdWRpb0NvbnRleHRTZWxlY3RvcigpOworCisgICAgICBzZWxlY3Rvci5jb250ZXh0Q3JlYXRlZCh7ZGF0YTogY29udGV4dDF9KTsKKyAgICAgIHNlbGVjdG9yLmNvbnRleHRDcmVhdGVkKHtkYXRhOiBjb250ZXh0Mn0pOworICAgICAgc2VsZWN0b3IuaXRlbVNlbGVjdGVkKGNvbnRleHQyKTsKKworICAgICAgZHVtcFNlbGVjdG9yU3RhdGUoc2VsZWN0b3IpOworICAgIH0sCisKKyAgICBhc3luYyBmdW5jdGlvbiB0ZXN0T25MaXN0SXRlbVJlcGxhY2VkQ2FsbGVkKCkgeworICAgICAgZnVuY3Rpb24gZHVtcEl0ZW1Db3VudCgpIHsKKyAgICAgICAgVGVzdFJ1bm5lci5hZGRSZXN1bHQoCisgICAgICAgICAgICBgX29uTGlzdEl0ZW1SZXBsYWNlZCBjYWxsZWQgd2l0aCBjb250ZXh0cyAoaXRlbXMpIGNvdW50OiAkeworICAgICAgICAgICAgICAgIHRoaXMuX2l0ZW1zLmxlbmd0aH1gKTsKKyAgICAgIH0KKworICAgICAgVGVzdFJ1bm5lci5hZGRTbmlmZmVyKAorICAgICAgICAgIFdlYkF1ZGlvLkF1ZGlvQ29udGV4dFNlbGVjdG9yLnByb3RvdHlwZSwgJ19vbkxpc3RJdGVtUmVwbGFjZWQnLAorICAgICAgICAgIGR1bXBJdGVtQ291bnQpOworCisgICAgICBjb25zdCBzZWxlY3RvciA9IG5ldyBXZWJBdWRpby5BdWRpb0NvbnRleHRTZWxlY3RvcigpOworICAgICAgc2VsZWN0b3IuY29udGV4dENyZWF0ZWQoe2RhdGE6IGNvbnRleHQxfSk7CisgICAgICBzZWxlY3Rvci5jb250ZXh0Q2hhbmdlZCh7ZGF0YTogY29udGV4dDF9KTsKKworICAgICAgZHVtcFNlbGVjdG9yU3RhdGUoc2VsZWN0b3IpOworICAgIH0sCisgIF0pOworfSkoKTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvcGFpbnQvaW52YWxpZGF0aW9uL292ZXJmbG93L3ZlcnRpY2FsLW92ZXJmbG93LXBhcmVudC5odG1sIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3BhaW50L2ludmFsaWRhdGlvbi9vdmVyZmxvdy92ZXJ0aWNhbC1vdmVyZmxvdy1wYXJlbnQuaHRtbAppbmRleCAyYzNjZjc3Li5jODc4N2M5MyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3BhaW50L2ludmFsaWRhdGlvbi9vdmVyZmxvdy92ZXJ0aWNhbC1vdmVyZmxvdy1wYXJlbnQuaHRtbAorKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvcGFpbnQvaW52YWxpZGF0aW9uL292ZXJmbG93L3ZlcnRpY2FsLW92ZXJmbG93LXBhcmVudC5odG1sCkBAIC00MCw3ICs0MCw3IEBACiAgICAgICAgIH07CiAgICAgICAgIHZhciBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJjb250YWluZXIiKVswXTsKICAgICAgICAgcnVuQWZ0ZXJMYXlvdXRBbmRQYWludChmdW5jdGlvbigpIHsKLSAgICAgICAgICAgIGNvbnRhaW5lci5zY3JvbGxMZWZ0ID0gMDsKKyAgICAgICAgICAgIGNvbnRhaW5lci5zY3JvbGxMZWZ0ID0gLTE4MTU7CiAgICAgICAgICAgICBydW5SZXBhaW50QW5kUGl4ZWxUZXN0KCk7CiAgICAgICAgIH0pOwogICAgIDwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3BhaW50L2ludmFsaWRhdGlvbi9vdmVyZmxvdy92ZXJ0aWNhbC1vdmVyZmxvdy1zYW1lLmh0bWwgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvcGFpbnQvaW52YWxpZGF0aW9uL292ZXJmbG93L3ZlcnRpY2FsLW92ZXJmbG93LXNhbWUuaHRtbAppbmRleCBkOWQwM2U4MS4uY2JjOTQwNjcgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9wYWludC9pbnZhbGlkYXRpb24vb3ZlcmZsb3cvdmVydGljYWwtb3ZlcmZsb3ctc2FtZS5odG1sCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9wYWludC9pbnZhbGlkYXRpb24vb3ZlcmZsb3cvdmVydGljYWwtb3ZlcmZsb3ctc2FtZS5odG1sCkBAIC0zOSw3ICszOSw3IEBACiAgICAgICAgIH07CiAgICAgICAgIHZhciBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJjb250YWluZXIiKVswXTsKICAgICAgICAgcnVuQWZ0ZXJMYXlvdXRBbmRQYWludChmdW5jdGlvbigpIHsKLSAgICAgICAgICAgIGNvbnRhaW5lci5zY3JvbGxMZWZ0ID0gMDsKKyAgICAgICAgICAgIGNvbnRhaW5lci5zY3JvbGxMZWZ0ID0gLTE4MTU7CiAgICAgICAgICAgICBydW5SZXBhaW50QW5kUGl4ZWxUZXN0KCk7CiAgICAgICAgIH0pOwogICAgIDwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3BhaW50L2ludmFsaWRhdGlvbi9zY3JvbGwvZmxpcHBlZC1ibG9ja3Mtd3JpdGluZy1tb2RlLXNjcm9sbC5odG1sIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3BhaW50L2ludmFsaWRhdGlvbi9zY3JvbGwvZmxpcHBlZC1ibG9ja3Mtd3JpdGluZy1tb2RlLXNjcm9sbC5odG1sCmluZGV4IDc2MjQxMmZkLi4xYzY0YzNiIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvcGFpbnQvaW52YWxpZGF0aW9uL3Njcm9sbC9mbGlwcGVkLWJsb2Nrcy13cml0aW5nLW1vZGUtc2Nyb2xsLmh0bWwKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3BhaW50L2ludmFsaWRhdGlvbi9zY3JvbGwvZmxpcHBlZC1ibG9ja3Mtd3JpdGluZy1tb2RlLXNjcm9sbC5odG1sCkBAIC05LDYgKzksNiBAQAogb25sb2FkID0gcnVuUmVwYWludEFuZFBpeGVsVGVzdDsKIGZ1bmN0aW9uIHJlcGFpbnRUZXN0KCkgewogICB0YXJnZXQuc3R5bGUuYmFja2dyb3VuZCA9ICJncmVlbiI7Ci0gIHNjcm9sbGVyLnNjcm9sbExlZnQgPSAwOworICBzY3JvbGxlci5zY3JvbGxMZWZ0ID0gLTk2MDA7CiB9CiA8L3NjcmlwdD4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9wbGF0Zm9ybS9saW51eC9leHRlcm5hbC93cHQvY3NzL2Nzcy1zaGFwZXMvc2hhcGUtb3V0c2lkZS92YWx1ZXMvc2hhcGUtb3V0c2lkZS1jb21wdXRlZC1zaGFwZS0wMDAtZXhwZWN0ZWQudHh0IGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3BsYXRmb3JtL2xpbnV4L2V4dGVybmFsL3dwdC9jc3MvY3NzLXNoYXBlcy9zaGFwZS1vdXRzaWRlL3ZhbHVlcy9zaGFwZS1vdXRzaWRlLWNvbXB1dGVkLXNoYXBlLTAwMC1leHBlY3RlZC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NGQ1NTQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3BsYXRmb3JtL2xpbnV4L2V4dGVybmFsL3dwdC9jc3MvY3NzLXNoYXBlcy9zaGFwZS1vdXRzaWRlL3ZhbHVlcy9zaGFwZS1vdXRzaWRlLWNvbXB1dGVkLXNoYXBlLTAwMC1leHBlY3RlZC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVRoaXMgaXMgYSB0ZXN0aGFybmVzcy5qcy1iYXNlZCB0ZXN0LgotUEFTUyBlbSB1bml0cwotUEFTUyBleCB1bml0cwotUEFTUyBjaCB1bml0cwotUEFTUyByZW0gdW5pdHMKLUhhcm5lc3M6IHRoZSB0ZXN0IHJhbiB0byBjb21wbGV0aW9uLgotCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvcGxhdGZvcm0vbGludXgvZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtc3ZnLWNvbnRhaW5lci1leHBlY3RlZC50eHQgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvcGxhdGZvcm0vbGludXgvZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtc3ZnLWNvbnRhaW5lci1leHBlY3RlZC50eHQKaW5kZXggODRhZGFmNjQuLmExNzc4MTEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9wbGF0Zm9ybS9saW51eC9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1zdmctY29udGFpbmVyLWV4cGVjdGVkLnR4dAorKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvcGxhdGZvcm0vbGludXgvZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtc3ZnLWNvbnRhaW5lci1leHBlY3RlZC50eHQKQEAgLTEsMyArMSwzIEBACi06IGxheWVyKDAsMCA4MDB4NjAwKSBoYXMgaGl0IHRlc3QgcmVjdCAoOCwxMyA1NHgxOSkKKzogbGF5ZXIoODAweDYwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDgsMTMgNTR4MTkpCiAKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3BsYXRmb3JtL2xpbnV4L2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLXN2Zy10ZXh0LWV4cGVjdGVkLnR4dCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9wbGF0Zm9ybS9saW51eC9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1zdmctdGV4dC1leHBlY3RlZC50eHQKaW5kZXggODRhZGFmNjQuLmExNzc4MTEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9wbGF0Zm9ybS9saW51eC9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1zdmctdGV4dC1leHBlY3RlZC50eHQKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3BsYXRmb3JtL2xpbnV4L2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLXN2Zy10ZXh0LWV4cGVjdGVkLnR4dApAQCAtMSwzICsxLDMgQEAKLTogbGF5ZXIoMCwwIDgwMHg2MDApIGhhcyBoaXQgdGVzdCByZWN0ICg4LDEzIDU0eDE5KQorOiBsYXllcig4MDB4NjAwKSBoYXMgaGl0IHRlc3QgcmVjdCAoOCwxMyA1NHgxOSkKIAogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvcGxhdGZvcm0vbGludXgvZmFzdC9vdmVyZmxvdy9ydGwtc2Nyb2xsYmFyLWRyYWctb3JpZ2luLWV4cGVjdGVkLnR4dCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9wbGF0Zm9ybS9saW51eC9mYXN0L292ZXJmbG93L3J0bC1zY3JvbGxiYXItZHJhZy1vcmlnaW4tZXhwZWN0ZWQudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGQ2ZDY0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9wbGF0Zm9ybS9saW51eC9mYXN0L292ZXJmbG93L3J0bC1zY3JvbGxiYXItZHJhZy1vcmlnaW4tZXhwZWN0ZWQudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1QQVNTIGNvbnRhaW5lci5zY3JvbGxMZWZ0IGlzIDAKLUZBSUwgY29udGFpbmVyLnNjcm9sbExlZnQgc2hvdWxkIGJlIDM1MC4gV2FzIDAuCi1QQVNTIHN1Y2Nlc3NmdWxseVBhcnNlZCBpcyB0cnVlCi0KLVRFU1QgQ09NUExFVEUKLQotVGhpcyB0ZXN0IHZlcmlmaWVzIHNjcm9sbCBwb3NpdGlvbiByZXN0b3JlcyBjb3JyZWN0bHkgd2hlbiBhIHRodW1iIGRyYWcgaGFzIGJlZW4gY2FuY2VsbGVkIGluIFJUTCBtb2RlLgotVGhpcyB0ZXN0IGlzIGV4cGVjdGVkIHRvIGZhaWwgb24gTWFjIGFuZCBMaW51eCBiZWNhdXNlIHRob3NlIHBsYXRmb3JtcyBkb24ndCBjYW5jZWwgc2Nyb2xsaW5nIHdoZW4gbW91c2UgY3Vyc29yIGlzIG91dCBvZiBhIGNlcnRhaW4gcmFuZ2UuIEl0IGlzIFdpbmRvd3Mtc3BlY2lmaWMgYmVoYXZpb3IuCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvcGxhdGZvcm0vbGludXgvdmlydHVhbC9jb250cm9scy1yZWZyZXNoLWhpZ2gtY29udHJhc3QvZmFzdC9mb3Jtcy9jb250cm9scy1uZXctdWktaGlnaC1jb250cmFzdC9jb2xvci1waWNrZXItZXhwZWN0ZWQucG5nIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3BsYXRmb3JtL2xpbnV4L3ZpcnR1YWwvY29udHJvbHMtcmVmcmVzaC1oaWdoLWNvbnRyYXN0L2Zhc3QvZm9ybXMvY29udHJvbHMtbmV3LXVpLWhpZ2gtY29udHJhc3QvY29sb3ItcGlja2VyLWV4cGVjdGVkLnBuZwppbmRleCA1M2UzMzI1Li5iY2VkODJhIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvcGxhdGZvcm0vbGludXgvdmlydHVhbC9jb250cm9scy1yZWZyZXNoLWhpZ2gtY29udHJhc3QvZmFzdC9mb3Jtcy9jb250cm9scy1uZXctdWktaGlnaC1jb250cmFzdC9jb2xvci1waWNrZXItZXhwZWN0ZWQucG5nCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9wbGF0Zm9ybS9saW51eC92aXJ0dWFsL2NvbnRyb2xzLXJlZnJlc2gtaGlnaC1jb250cmFzdC9mYXN0L2Zvcm1zL2NvbnRyb2xzLW5ldy11aS1oaWdoLWNvbnRyYXN0L2NvbG9yLXBpY2tlci1leHBlY3RlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3BsYXRmb3JtL2xpbnV4L3ZpcnR1YWwvbW91c2VldmVudF9mcmFjdGlvbmFsL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLXN2Zy1jb250YWluZXItZXhwZWN0ZWQudHh0IGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3BsYXRmb3JtL2xpbnV4L3ZpcnR1YWwvbW91c2VldmVudF9mcmFjdGlvbmFsL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLXN2Zy1jb250YWluZXItZXhwZWN0ZWQudHh0CmluZGV4IDg0YWRhZjY0Li5hMTc3ODExIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvcGxhdGZvcm0vbGludXgvdmlydHVhbC9tb3VzZWV2ZW50X2ZyYWN0aW9uYWwvZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtc3ZnLWNvbnRhaW5lci1leHBlY3RlZC50eHQKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3BsYXRmb3JtL2xpbnV4L3ZpcnR1YWwvbW91c2VldmVudF9mcmFjdGlvbmFsL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLXN2Zy1jb250YWluZXItZXhwZWN0ZWQudHh0CkBAIC0xLDMgKzEsMyBAQAotOiBsYXllcigwLDAgODAweDYwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDgsMTMgNTR4MTkpCis6IGxheWVyKDgwMHg2MDApIGhhcyBoaXQgdGVzdCByZWN0ICg4LDEzIDU0eDE5KQogCiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9wbGF0Zm9ybS9saW51eC92aXJ0dWFsL21vdXNlZXZlbnRfZnJhY3Rpb25hbC9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1zdmctdGV4dC1leHBlY3RlZC50eHQgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvcGxhdGZvcm0vbGludXgvdmlydHVhbC9tb3VzZWV2ZW50X2ZyYWN0aW9uYWwvZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtc3ZnLXRleHQtZXhwZWN0ZWQudHh0CmluZGV4IDg0YWRhZjY0Li5hMTc3ODExIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvcGxhdGZvcm0vbGludXgvdmlydHVhbC9tb3VzZWV2ZW50X2ZyYWN0aW9uYWwvZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtc3ZnLXRleHQtZXhwZWN0ZWQudHh0CisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9wbGF0Zm9ybS9saW51eC92aXJ0dWFsL21vdXNlZXZlbnRfZnJhY3Rpb25hbC9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1zdmctdGV4dC1leHBlY3RlZC50eHQKQEAgLTEsMyArMSwzIEBACi06IGxheWVyKDAsMCA4MDB4NjAwKSBoYXMgaGl0IHRlc3QgcmVjdCAoOCwxMyA1NHgxOSkKKzogbGF5ZXIoODAweDYwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDgsMTMgNTR4MTkpCiAKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3BsYXRmb3JtL2xpbnV4L3ZpcnR1YWwvc2Nyb2xsX2N1c3RvbWl6YXRpb24vZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtc3ZnLWNvbnRhaW5lci1leHBlY3RlZC50eHQgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvcGxhdGZvcm0vbGludXgvdmlydHVhbC9zY3JvbGxfY3VzdG9taXphdGlvbi9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1zdmctY29udGFpbmVyLWV4cGVjdGVkLnR4dAppbmRleCA4NGFkYWY2NC4uYTE3NzgxMSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3BsYXRmb3JtL2xpbnV4L3ZpcnR1YWwvc2Nyb2xsX2N1c3RvbWl6YXRpb24vZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtc3ZnLWNvbnRhaW5lci1leHBlY3RlZC50eHQKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3BsYXRmb3JtL2xpbnV4L3ZpcnR1YWwvc2Nyb2xsX2N1c3RvbWl6YXRpb24vZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtc3ZnLWNvbnRhaW5lci1leHBlY3RlZC50eHQKQEAgLTEsMyArMSwzIEBACi06IGxheWVyKDAsMCA4MDB4NjAwKSBoYXMgaGl0IHRlc3QgcmVjdCAoOCwxMyA1NHgxOSkKKzogbGF5ZXIoODAweDYwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDgsMTMgNTR4MTkpCiAKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3BsYXRmb3JtL2xpbnV4L3ZpcnR1YWwvc2Nyb2xsX2N1c3RvbWl6YXRpb24vZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtc3ZnLXRleHQtZXhwZWN0ZWQudHh0IGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3BsYXRmb3JtL2xpbnV4L3ZpcnR1YWwvc2Nyb2xsX2N1c3RvbWl6YXRpb24vZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtc3ZnLXRleHQtZXhwZWN0ZWQudHh0CmluZGV4IDg0YWRhZjY0Li5hMTc3ODExIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvcGxhdGZvcm0vbGludXgvdmlydHVhbC9zY3JvbGxfY3VzdG9taXphdGlvbi9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1zdmctdGV4dC1leHBlY3RlZC50eHQKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3BsYXRmb3JtL2xpbnV4L3ZpcnR1YWwvc2Nyb2xsX2N1c3RvbWl6YXRpb24vZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtc3ZnLXRleHQtZXhwZWN0ZWQudHh0CkBAIC0xLDMgKzEsMyBAQAotOiBsYXllcigwLDAgODAweDYwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDgsMTMgNTR4MTkpCis6IGxheWVyKDgwMHg2MDApIGhhcyBoaXQgdGVzdCByZWN0ICg4LDEzIDU0eDE5KQogCiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9wbGF0Zm9ybS9tYWMtbWFjMTAuMTAvdmlydHVhbC9jb250cm9scy1yZWZyZXNoLWhpZ2gtY29udHJhc3QvZmFzdC9mb3Jtcy9jb250cm9scy1uZXctdWktaGlnaC1jb250cmFzdC9jb2xvci1waWNrZXItZXhwZWN0ZWQucG5nIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3BsYXRmb3JtL21hYy1tYWMxMC4xMC92aXJ0dWFsL2NvbnRyb2xzLXJlZnJlc2gtaGlnaC1jb250cmFzdC9mYXN0L2Zvcm1zL2NvbnRyb2xzLW5ldy11aS1oaWdoLWNvbnRyYXN0L2NvbG9yLXBpY2tlci1leHBlY3RlZC5wbmcKaW5kZXggMjNmMTVlZS4uNmFmZjZiZCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3BsYXRmb3JtL21hYy1tYWMxMC4xMC92aXJ0dWFsL2NvbnRyb2xzLXJlZnJlc2gtaGlnaC1jb250cmFzdC9mYXN0L2Zvcm1zL2NvbnRyb2xzLW5ldy11aS1oaWdoLWNvbnRyYXN0L2NvbG9yLXBpY2tlci1leHBlY3RlZC5wbmcKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3BsYXRmb3JtL21hYy1tYWMxMC4xMC92aXJ0dWFsL2NvbnRyb2xzLXJlZnJlc2gtaGlnaC1jb250cmFzdC9mYXN0L2Zvcm1zL2NvbnRyb2xzLW5ldy11aS1oaWdoLWNvbnRyYXN0L2NvbG9yLXBpY2tlci1leHBlY3RlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3BsYXRmb3JtL21hYy1tYWMxMC4xMS92aXJ0dWFsL2NvbnRyb2xzLXJlZnJlc2gtaGlnaC1jb250cmFzdC9mYXN0L2Zvcm1zL2NvbnRyb2xzLW5ldy11aS1oaWdoLWNvbnRyYXN0L2NvbG9yLXBpY2tlci1leHBlY3RlZC5wbmcgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvcGxhdGZvcm0vbWFjLW1hYzEwLjExL3ZpcnR1YWwvY29udHJvbHMtcmVmcmVzaC1oaWdoLWNvbnRyYXN0L2Zhc3QvZm9ybXMvY29udHJvbHMtbmV3LXVpLWhpZ2gtY29udHJhc3QvY29sb3ItcGlja2VyLWV4cGVjdGVkLnBuZwppbmRleCAyM2YxNWVlLi42YWZmNmJkIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvcGxhdGZvcm0vbWFjLW1hYzEwLjExL3ZpcnR1YWwvY29udHJvbHMtcmVmcmVzaC1oaWdoLWNvbnRyYXN0L2Zhc3QvZm9ybXMvY29udHJvbHMtbmV3LXVpLWhpZ2gtY29udHJhc3QvY29sb3ItcGlja2VyLWV4cGVjdGVkLnBuZworKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvcGxhdGZvcm0vbWFjLW1hYzEwLjExL3ZpcnR1YWwvY29udHJvbHMtcmVmcmVzaC1oaWdoLWNvbnRyYXN0L2Zhc3QvZm9ybXMvY29udHJvbHMtbmV3LXVpLWhpZ2gtY29udHJhc3QvY29sb3ItcGlja2VyLWV4cGVjdGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvcGxhdGZvcm0vbWFjLW1hYzEwLjEyL3ZpcnR1YWwvY29udHJvbHMtcmVmcmVzaC1oaWdoLWNvbnRyYXN0L2Zhc3QvZm9ybXMvY29udHJvbHMtbmV3LXVpLWhpZ2gtY29udHJhc3QvY29sb3ItcGlja2VyLWV4cGVjdGVkLnBuZyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9wbGF0Zm9ybS9tYWMtbWFjMTAuMTIvdmlydHVhbC9jb250cm9scy1yZWZyZXNoLWhpZ2gtY29udHJhc3QvZmFzdC9mb3Jtcy9jb250cm9scy1uZXctdWktaGlnaC1jb250cmFzdC9jb2xvci1waWNrZXItZXhwZWN0ZWQucG5nCmluZGV4IDIzZjE1ZWUuLjZhZmY2YmQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9wbGF0Zm9ybS9tYWMtbWFjMTAuMTIvdmlydHVhbC9jb250cm9scy1yZWZyZXNoLWhpZ2gtY29udHJhc3QvZmFzdC9mb3Jtcy9jb250cm9scy1uZXctdWktaGlnaC1jb250cmFzdC9jb2xvci1waWNrZXItZXhwZWN0ZWQucG5nCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9wbGF0Zm9ybS9tYWMtbWFjMTAuMTIvdmlydHVhbC9jb250cm9scy1yZWZyZXNoLWhpZ2gtY29udHJhc3QvZmFzdC9mb3Jtcy9jb250cm9scy1uZXctdWktaGlnaC1jb250cmFzdC9jb2xvci1waWNrZXItZXhwZWN0ZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9wbGF0Zm9ybS9tYWMtbWFjMTAuMTIvdmlydHVhbC9zY3JvbGxfY3VzdG9taXphdGlvbi9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1jb250aW51YXRpb24tZXhwZWN0ZWQudHh0IGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3BsYXRmb3JtL21hYy1tYWMxMC4xMi92aXJ0dWFsL3Njcm9sbF9jdXN0b21pemF0aW9uL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLWNvbnRpbnVhdGlvbi1leHBlY3RlZC50eHQKaW5kZXggYmQ4ZGIxOC4uYjFkZTRlNDcgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9wbGF0Zm9ybS9tYWMtbWFjMTAuMTIvdmlydHVhbC9zY3JvbGxfY3VzdG9taXphdGlvbi9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1jb250aW51YXRpb24tZXhwZWN0ZWQudHh0CisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9wbGF0Zm9ybS9tYWMtbWFjMTAuMTIvdmlydHVhbC9zY3JvbGxfY3VzdG9taXphdGlvbi9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1jb250aW51YXRpb24tZXhwZWN0ZWQudHh0CkBAIC0xLDUgKzEsNSBAQAogVGhpcyB0ZXN0cyB2ZXJpZmllcyB0aGUgaGl0IHRlc3QgcmVnaW9ucyBnaXZlbiB0byB0aGUgY29tcG9zaXRvciBzcGVjaWZpY2FsbHkgZm9yIGNvbnRpbnVhdGlvbiBjYXNlLiBJdCBjYW4gb25seSBiZSBydW4gaW4gRHVtcFJlbmRlclRyZWUuCiAKLWNvbnRpbnVhdGlvbjogbGF5ZXIoMCwwIDgwMHg2MDApIGhhcyBoaXQgdGVzdCByZWN0ICgxMyw5MCAyOTB4MTIpCitjb250aW51YXRpb246IGxheWVyKDgwMHg2MDApIGhhcyBoaXQgdGVzdCByZWN0ICgxMyw5MCAyOTB4MTIpCiAKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3BsYXRmb3JtL21hYy1yZXRpbmEvdmlydHVhbC9jb250cm9scy1yZWZyZXNoLWhpZ2gtY29udHJhc3QvZmFzdC9mb3Jtcy9jb250cm9scy1uZXctdWktaGlnaC1jb250cmFzdC9jb2xvci1waWNrZXItZXhwZWN0ZWQucG5nIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3BsYXRmb3JtL21hYy1yZXRpbmEvdmlydHVhbC9jb250cm9scy1yZWZyZXNoLWhpZ2gtY29udHJhc3QvZmFzdC9mb3Jtcy9jb250cm9scy1uZXctdWktaGlnaC1jb250cmFzdC9jb2xvci1waWNrZXItZXhwZWN0ZWQucG5nCmluZGV4IGFlZDAwNTQuLmZlNDhhYWUwIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvcGxhdGZvcm0vbWFjLXJldGluYS92aXJ0dWFsL2NvbnRyb2xzLXJlZnJlc2gtaGlnaC1jb250cmFzdC9mYXN0L2Zvcm1zL2NvbnRyb2xzLW5ldy11aS1oaWdoLWNvbnRyYXN0L2NvbG9yLXBpY2tlci1leHBlY3RlZC5wbmcKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3BsYXRmb3JtL21hYy1yZXRpbmEvdmlydHVhbC9jb250cm9scy1yZWZyZXNoLWhpZ2gtY29udHJhc3QvZmFzdC9mb3Jtcy9jb250cm9scy1uZXctdWktaGlnaC1jb250cmFzdC9jb2xvci1waWNrZXItZXhwZWN0ZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9wbGF0Zm9ybS9tYWMtcmV0aW5hL3ZpcnR1YWwvc2Nyb2xsX2N1c3RvbWl6YXRpb24vZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtY29udGludWF0aW9uLWV4cGVjdGVkLnR4dCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9wbGF0Zm9ybS9tYWMtcmV0aW5hL3ZpcnR1YWwvc2Nyb2xsX2N1c3RvbWl6YXRpb24vZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtY29udGludWF0aW9uLWV4cGVjdGVkLnR4dAppbmRleCBiZDhkYjE4Li5iMWRlNGU0NyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3BsYXRmb3JtL21hYy1yZXRpbmEvdmlydHVhbC9zY3JvbGxfY3VzdG9taXphdGlvbi9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1jb250aW51YXRpb24tZXhwZWN0ZWQudHh0CisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9wbGF0Zm9ybS9tYWMtcmV0aW5hL3ZpcnR1YWwvc2Nyb2xsX2N1c3RvbWl6YXRpb24vZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtY29udGludWF0aW9uLWV4cGVjdGVkLnR4dApAQCAtMSw1ICsxLDUgQEAKIFRoaXMgdGVzdHMgdmVyaWZpZXMgdGhlIGhpdCB0ZXN0IHJlZ2lvbnMgZ2l2ZW4gdG8gdGhlIGNvbXBvc2l0b3Igc3BlY2lmaWNhbGx5IGZvciBjb250aW51YXRpb24gY2FzZS4gSXQgY2FuIG9ubHkgYmUgcnVuIGluIER1bXBSZW5kZXJUcmVlLgogCi1jb250aW51YXRpb246IGxheWVyKDAsMCA4MDB4NjAwKSBoYXMgaGl0IHRlc3QgcmVjdCAoMTMsOTAgMjkweDEyKQorY29udGludWF0aW9uOiBsYXllcig4MDB4NjAwKSBoYXMgaGl0IHRlc3QgcmVjdCAoMTMsOTAgMjkweDEyKQogCiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9wbGF0Zm9ybS9tYWMvZmFzdC9vdmVyZmxvdy9ydGwtc2Nyb2xsYmFyLWRyYWctb3JpZ2luLWV4cGVjdGVkLnR4dCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9wbGF0Zm9ybS9tYWMvZmFzdC9vdmVyZmxvdy9ydGwtc2Nyb2xsYmFyLWRyYWctb3JpZ2luLWV4cGVjdGVkLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RkNmQ2NC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvcGxhdGZvcm0vbWFjL2Zhc3Qvb3ZlcmZsb3cvcnRsLXNjcm9sbGJhci1kcmFnLW9yaWdpbi1leHBlY3RlZC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVBBU1MgY29udGFpbmVyLnNjcm9sbExlZnQgaXMgMAotRkFJTCBjb250YWluZXIuc2Nyb2xsTGVmdCBzaG91bGQgYmUgMzUwLiBXYXMgMC4KLVBBU1Mgc3VjY2Vzc2Z1bGx5UGFyc2VkIGlzIHRydWUKLQotVEVTVCBDT01QTEVURQotCi1UaGlzIHRlc3QgdmVyaWZpZXMgc2Nyb2xsIHBvc2l0aW9uIHJlc3RvcmVzIGNvcnJlY3RseSB3aGVuIGEgdGh1bWIgZHJhZyBoYXMgYmVlbiBjYW5jZWxsZWQgaW4gUlRMIG1vZGUuCi1UaGlzIHRlc3QgaXMgZXhwZWN0ZWQgdG8gZmFpbCBvbiBNYWMgYW5kIExpbnV4IGJlY2F1c2UgdGhvc2UgcGxhdGZvcm1zIGRvbid0IGNhbmNlbCBzY3JvbGxpbmcgd2hlbiBtb3VzZSBjdXJzb3IgaXMgb3V0IG9mIGEgY2VydGFpbiByYW5nZS4gSXQgaXMgV2luZG93cy1zcGVjaWZpYyBiZWhhdmlvci4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9wbGF0Zm9ybS9tYWMvdmlydHVhbC9jb250cm9scy1yZWZyZXNoLWhpZ2gtY29udHJhc3QvZmFzdC9mb3Jtcy9jb250cm9scy1uZXctdWktaGlnaC1jb250cmFzdC9jb2xvci1waWNrZXItZXhwZWN0ZWQucG5nIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3BsYXRmb3JtL21hYy92aXJ0dWFsL2NvbnRyb2xzLXJlZnJlc2gtaGlnaC1jb250cmFzdC9mYXN0L2Zvcm1zL2NvbnRyb2xzLW5ldy11aS1oaWdoLWNvbnRyYXN0L2NvbG9yLXBpY2tlci1leHBlY3RlZC5wbmcKaW5kZXggYWVkMDA1NC4uZmU0OGFhZTAgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9wbGF0Zm9ybS9tYWMvdmlydHVhbC9jb250cm9scy1yZWZyZXNoLWhpZ2gtY29udHJhc3QvZmFzdC9mb3Jtcy9jb250cm9scy1uZXctdWktaGlnaC1jb250cmFzdC9jb2xvci1waWNrZXItZXhwZWN0ZWQucG5nCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9wbGF0Zm9ybS9tYWMvdmlydHVhbC9jb250cm9scy1yZWZyZXNoLWhpZ2gtY29udHJhc3QvZmFzdC9mb3Jtcy9jb250cm9scy1uZXctdWktaGlnaC1jb250cmFzdC9jb2xvci1waWNrZXItZXhwZWN0ZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9wbGF0Zm9ybS93aW4vZXh0ZXJuYWwvd3B0L2Nzcy9jc3Mtc2hhcGVzL3NoYXBlLW91dHNpZGUvdmFsdWVzL3NoYXBlLW91dHNpZGUtY29tcHV0ZWQtc2hhcGUtMDAwLWV4cGVjdGVkLnR4dCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9wbGF0Zm9ybS93aW4vZXh0ZXJuYWwvd3B0L2Nzcy9jc3Mtc2hhcGVzL3NoYXBlLW91dHNpZGUvdmFsdWVzL3NoYXBlLW91dHNpZGUtY29tcHV0ZWQtc2hhcGUtMDAwLWV4cGVjdGVkLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk0YmU1Ny4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvcGxhdGZvcm0vd2luL2V4dGVybmFsL3dwdC9jc3MvY3NzLXNoYXBlcy9zaGFwZS1vdXRzaWRlL3ZhbHVlcy9zaGFwZS1vdXRzaWRlLWNvbXB1dGVkLXNoYXBlLTAwMC1leHBlY3RlZC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVRoaXMgaXMgYSB0ZXN0aGFybmVzcy5qcy1iYXNlZCB0ZXN0LgotUEFTUyBlbSB1bml0cwotRkFJTCBleCB1bml0cyBhc3NlcnRfZXF1YWxzOiBleHBlY3RlZCAicG9seWdvbigxMzAuMDc4cHggMTMwLjA3OHB4KSIgYnV0IGdvdCAicG9seWdvbigxMzAuMDhweCAxMzAuMDhweCkiCi1QQVNTIGNoIHVuaXRzCi1QQVNTIHJlbSB1bml0cwotSGFybmVzczogdGhlIHRlc3QgcmFuIHRvIGNvbXBsZXRpb24uCi0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9wbGF0Zm9ybS93aW4vdmlydHVhbC9zY3JvbGxfY3VzdG9taXphdGlvbi9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1jb250aW51YXRpb24tZXhwZWN0ZWQudHh0IGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3BsYXRmb3JtL3dpbi92aXJ0dWFsL3Njcm9sbF9jdXN0b21pemF0aW9uL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLWNvbnRpbnVhdGlvbi1leHBlY3RlZC50eHQKaW5kZXggYmQ4ZGIxOC4uYjFkZTRlNDcgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9wbGF0Zm9ybS93aW4vdmlydHVhbC9zY3JvbGxfY3VzdG9taXphdGlvbi9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1jb250aW51YXRpb24tZXhwZWN0ZWQudHh0CisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy9wbGF0Zm9ybS93aW4vdmlydHVhbC9zY3JvbGxfY3VzdG9taXphdGlvbi9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1jb250aW51YXRpb24tZXhwZWN0ZWQudHh0CkBAIC0xLDUgKzEsNSBAQAogVGhpcyB0ZXN0cyB2ZXJpZmllcyB0aGUgaGl0IHRlc3QgcmVnaW9ucyBnaXZlbiB0byB0aGUgY29tcG9zaXRvciBzcGVjaWZpY2FsbHkgZm9yIGNvbnRpbnVhdGlvbiBjYXNlLiBJdCBjYW4gb25seSBiZSBydW4gaW4gRHVtcFJlbmRlclRyZWUuCiAKLWNvbnRpbnVhdGlvbjogbGF5ZXIoMCwwIDgwMHg2MDApIGhhcyBoaXQgdGVzdCByZWN0ICgxMyw5MCAyOTB4MTIpCitjb250aW51YXRpb246IGxheWVyKDgwMHg2MDApIGhhcyBoaXQgdGVzdCByZWN0ICgxMyw5MCAyOTB4MTIpCiAKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3Njcm9sbGJhcnMvcnRsL2Rpdi1ob3Jpem9udGFsLXdpdGgtdmVydGljYWwtc2Nyb2xsYmFyLmh0bWwgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvc2Nyb2xsYmFycy9ydGwvZGl2LWhvcml6b250YWwtd2l0aC12ZXJ0aWNhbC1zY3JvbGxiYXIuaHRtbAppbmRleCAyODc0OGZkLi5mYmY1MmQzMiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3Njcm9sbGJhcnMvcnRsL2Rpdi1ob3Jpem9udGFsLXdpdGgtdmVydGljYWwtc2Nyb2xsYmFyLmh0bWwKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3Njcm9sbGJhcnMvcnRsL2Rpdi1ob3Jpem9udGFsLXdpdGgtdmVydGljYWwtc2Nyb2xsYmFyLmh0bWwKQEAgLTE3LDcgKzE3LDcgQEAKICAgICB2YXIgb3V0ZXJSVEwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib3V0ZXItcnRsIik7CiAgICAgdmFyIGlubmVyUlRMID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImlubmVyLXJ0bCIpOwogICAgIG91dGVyTFRSLnNjcm9sbExlZnQgPSAwOwotICAgIG91dGVyUlRMLnNjcm9sbExlZnQgPSAwOworICAgIG91dGVyUlRMLnNjcm9sbExlZnQgPSAtMTA7CiAKICAgICAvLyBWZXJpZnkgdGhlIHdpZHRocyBvZiB0aGUgb3V0ZXIgUlRMIGVsZW1lbnRzIGFyZSB0aGUgc2FtZSBhcyB0aGUgd2lkdGhzIG9mIHRoZSBvdXRlciBMVFIgZWxlbWVudHMuCiAgICAgYXNzZXJ0X2VxdWFscyhvdXRlckxUUi5vZmZzZXRXaWR0aCwgb3V0ZXJSVEwub2Zmc2V0V2lkdGgpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3Njcm9sbGJhcnMvcnRsL2Rpdi1ob3Jpem9udGFsLmh0bWwgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvc2Nyb2xsYmFycy9ydGwvZGl2LWhvcml6b250YWwuaHRtbAppbmRleCAyODM3ZjdkLi5iNjMxNjVkIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvc2Nyb2xsYmFycy9ydGwvZGl2LWhvcml6b250YWwuaHRtbAorKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvc2Nyb2xsYmFycy9ydGwvZGl2LWhvcml6b250YWwuaHRtbApAQCAtMTYsNyArMTYsNyBAQAogICAgIHZhciBvdXRlclJUTCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdXRlci1ydGwiKTsKICAgICB2YXIgaW5uZXJSVEwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaW5uZXItcnRsIik7CiAgICAgb3V0ZXJMVFIuc2Nyb2xsTGVmdCA9IDA7Ci0gICAgb3V0ZXJSVEwuc2Nyb2xsTGVmdCA9IDA7CisgICAgb3V0ZXJSVEwuc2Nyb2xsTGVmdCA9IC0xMTU7CiAKICAgICAvLyBWZXJpZnkgdGhlIHdpZHRocyBvZiB0aGUgb3V0ZXIgUlRMIGVsZW1lbnRzIGFyZSB0aGUgc2FtZSBhcyB0aGUgd2lkdGhzIG9mIHRoZSBvdXRlciBMVFIgZWxlbWVudHMuCiAgICAgYXNzZXJ0X2VxdWFscyhvdXRlckxUUi5vZmZzZXRXaWR0aCwgb3V0ZXJSVEwub2Zmc2V0V2lkdGgpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3ZpcnR1YWwvY29udHJvbHMtcmVmcmVzaC1oaWdoLWNvbnRyYXN0L2Zhc3QvZm9ybXMvY29udHJvbHMtbmV3LXVpLWhpZ2gtY29udHJhc3QvY29sb3ItcGlja2VyLWV4cGVjdGVkLnBuZyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy92aXJ0dWFsL2NvbnRyb2xzLXJlZnJlc2gtaGlnaC1jb250cmFzdC9mYXN0L2Zvcm1zL2NvbnRyb2xzLW5ldy11aS1oaWdoLWNvbnRyYXN0L2NvbG9yLXBpY2tlci1leHBlY3RlZC5wbmcKaW5kZXggZjhhNzAxMi4uMTIxZjE0YyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3ZpcnR1YWwvY29udHJvbHMtcmVmcmVzaC1oaWdoLWNvbnRyYXN0L2Zhc3QvZm9ybXMvY29udHJvbHMtbmV3LXVpLWhpZ2gtY29udHJhc3QvY29sb3ItcGlja2VyLWV4cGVjdGVkLnBuZworKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvdmlydHVhbC9jb250cm9scy1yZWZyZXNoLWhpZ2gtY29udHJhc3QvZmFzdC9mb3Jtcy9jb250cm9scy1uZXctdWktaGlnaC1jb250cmFzdC9jb2xvci1waWNrZXItZXhwZWN0ZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy92aXJ0dWFsL21vdXNlZXZlbnRfZnJhY3Rpb25hbC9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1zdmctY29udGFpbmVyLWV4cGVjdGVkLnR4dCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy92aXJ0dWFsL21vdXNlZXZlbnRfZnJhY3Rpb25hbC9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1zdmctY29udGFpbmVyLWV4cGVjdGVkLnR4dAppbmRleCBhNTU0ZjZmMi4uMTI1ZWJlZSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3ZpcnR1YWwvbW91c2VldmVudF9mcmFjdGlvbmFsL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLXN2Zy1jb250YWluZXItZXhwZWN0ZWQudHh0CisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy92aXJ0dWFsL21vdXNlZXZlbnRfZnJhY3Rpb25hbC9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1zdmctY29udGFpbmVyLWV4cGVjdGVkLnR4dApAQCAtMSwzICsxLDMgQEAKLTogbGF5ZXIoMCwwIDgwMHg2MDApIGhhcyBoaXQgdGVzdCByZWN0ICg4LDE0IDU0eDE4KQorOiBsYXllcig4MDB4NjAwKSBoYXMgaGl0IHRlc3QgcmVjdCAoOCwxNCA1NHgxOCkKIAogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvdmlydHVhbC9tb3VzZWV2ZW50X2ZyYWN0aW9uYWwvZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtc3ZnLXRleHQtZXhwZWN0ZWQudHh0IGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3ZpcnR1YWwvbW91c2VldmVudF9mcmFjdGlvbmFsL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLXN2Zy10ZXh0LWV4cGVjdGVkLnR4dAppbmRleCBhNTU0ZjZmMi4uMTI1ZWJlZSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3ZpcnR1YWwvbW91c2VldmVudF9mcmFjdGlvbmFsL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLXN2Zy10ZXh0LWV4cGVjdGVkLnR4dAorKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvdmlydHVhbC9tb3VzZWV2ZW50X2ZyYWN0aW9uYWwvZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtc3ZnLXRleHQtZXhwZWN0ZWQudHh0CkBAIC0xLDMgKzEsMyBAQAotOiBsYXllcigwLDAgODAweDYwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDgsMTQgNTR4MTgpCis6IGxheWVyKDgwMHg2MDApIGhhcyBoaXQgdGVzdCByZWN0ICg4LDE0IDU0eDE4KQogCiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy92aXJ0dWFsL3Njcm9sbF9jdXN0b21pemF0aW9uL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLWV4cGVjdGVkLnR4dCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy92aXJ0dWFsL3Njcm9sbF9jdXN0b21pemF0aW9uL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLWV4cGVjdGVkLnR4dAppbmRleCBiZjNjM2U2Li5lNmI2MGU3IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvdmlydHVhbC9zY3JvbGxfY3VzdG9taXphdGlvbi9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1leHBlY3RlZC50eHQKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3ZpcnR1YWwvc2Nyb2xsX2N1c3RvbWl6YXRpb24vZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtZXhwZWN0ZWQudHh0CkBAIC0xLDQ5ICsxLDQ5IEBACiBUaGlzIHRlc3RzIHZlcmlmaWVzIHRoZSBoaXQgdGVzdCByZWdpb25zIGdpdmVuIHRvIHRoZSBjb21wb3NpdG9yLiBJdCBjYW4gb25seSBiZSBydW4gaW4gRHVtcFJlbmRlclRyZWUuIFRoZSBvdXRwdXR0ZWQgcmVjdHMgc2hvdWxkIGNvdmVyIHRoZSBoaXQgdGVzdCByZWdpb25zIG9mIGFsbCB0aGUgbGlzdGVkIGVsZW1lbnRzLiBFbmFibGUgdmlzdWFsaXplIG1vZGUgdG8gcXVpY2tseSB2YWxpZGF0ZSBncmFwaGljYWxseS4KIAotbm9ybWFsRmxvdzogbGF5ZXIoMCwwIDc4NXgxNTMwKSBoYXMgaGl0IHRlc3QgcmVjdCAoMTMsMTI4IDI5MHgxMikKK25vcm1hbEZsb3c6IGxheWVyKDc4NXgxNTMwKSBoYXMgaGl0IHRlc3QgcmVjdCAoMTMsMTI4IDI5MHgxMikKIAotaW5saW5lT3ZlcmZsb3c6IGxheWVyKDAsMCA3ODV4MTU3OCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDEzLDE0NSAxN3gxKQotaW5saW5lT3ZlcmZsb3c6IGxheWVyKDAsMCA3ODV4MTU3OCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDEzLDE0NiAxNTJ4MTApCi1pbmxpbmVPdmVyZmxvdzogbGF5ZXIoMCwwIDc4NXgxNTc4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMTMsMTU2IDQyeDEwKQotaW5saW5lT3ZlcmZsb3c6IGxheWVyKDAsMCA3ODV4MTU3OCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDEzLDE2NiAxN3gxKQoraW5saW5lT3ZlcmZsb3c6IGxheWVyKDc4NXgxNTc4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMTMsMTQ1IDE3eDEpCitpbmxpbmVPdmVyZmxvdzogbGF5ZXIoNzg1eDE1NzgpIGhhcyBoaXQgdGVzdCByZWN0ICgxMywxNDYgMTUyeDEwKQoraW5saW5lT3ZlcmZsb3c6IGxheWVyKDc4NXgxNTc4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMTMsMTU2IDQyeDEwKQoraW5saW5lT3ZlcmZsb3c6IGxheWVyKDc4NXgxNTc4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMTMsMTY2IDE3eDEpCiAKLWFic29sdXRlQ2hpbGRDb250YWluZXI6IGxheWVyKDAsMCA3ODV4MTcyMikgaGFzIGhpdCB0ZXN0IHJlY3QgKDEzLDE3MiAyOTB4MTIpCi1hYnNvbHV0ZUNoaWxkQ29udGFpbmVyOiBsYXllcigwLDAgNzg1eDE3MjIpIGhhcyBoaXQgdGVzdCByZWN0ICgzMjAsMTczIDE0MngxMikKK2Fic29sdXRlQ2hpbGRDb250YWluZXI6IGxheWVyKDc4NXgxNzIyKSBoYXMgaGl0IHRlc3QgcmVjdCAoMTMsMTcyIDI5MHgxMikKK2Fic29sdXRlQ2hpbGRDb250YWluZXI6IGxheWVyKDc4NXgxNzIyKSBoYXMgaGl0IHRlc3QgcmVjdCAoMzIwLDE3MyAxNDJ4MTIpCiAKLXJlbGF0aXZlQ2hpbGRDb250YWluZXI6IGxheWVyKDAsMCA3ODV4MTgwMikgaGFzIGhpdCB0ZXN0IHJlY3QgKDEzLDE4OSAyOTB4MjIpCi1yZWxhdGl2ZUNoaWxkQ29udGFpbmVyOiBsYXllcigwLDAgNzg1eDE4MDIpIGhhcyBoaXQgdGVzdCByZWN0ICgzMTQsMTk5IDE0MngxMikKK3JlbGF0aXZlQ2hpbGRDb250YWluZXI6IGxheWVyKDc4NXgxODAyKSBoYXMgaGl0IHRlc3QgcmVjdCAoMTMsMTg5IDI5MHgyMikKK3JlbGF0aXZlQ2hpbGRDb250YWluZXI6IGxheWVyKDc4NXgxODAyKSBoYXMgaGl0IHRlc3QgcmVjdCAoMzE0LDE5OSAxNDJ4MTIpCiAKLWZpeGVkOiBsYXllcig0MDUsOTggNTJ4MTIpIGhhcyBoaXQgdGVzdCByZWN0ICgwLDAgNTJ4MTIpCitmaXhlZDogbGF5ZXIoNTJ4MTIpIGhhcyBoaXQgdGVzdCByZWN0ICgwLDAgNTJ4MTIpCiAKLXRyYW5zbGF0ZTogbGF5ZXIoMCwwIDc4NXgxOTMwKSBoYXMgaGl0IHRlc3QgcmVjdCAoMTMsMjE2IDI5MHgxNCkKLXRyYW5zbGF0ZTogbGF5ZXIoMCwwIDc4NXgxOTMwKSBoYXMgaGl0IHRlc3QgcmVjdCAoMzE0LDIxOSAyODh4MTIpCit0cmFuc2xhdGU6IGxheWVyKDc4NXgxOTMwKSBoYXMgaGl0IHRlc3QgcmVjdCAoMTMsMjE2IDI5MHgxNCkKK3RyYW5zbGF0ZTogbGF5ZXIoNzg1eDE5MzApIGhhcyBoaXQgdGVzdCByZWN0ICgzMTQsMjE5IDI4OHgxMikKIAotdHJhbnNmb3JtMmQ6IGxheWVyKDAsMCA3ODV4MjAxMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDE2LDIzNiAyODR4MjApCit0cmFuc2Zvcm0yZDogbGF5ZXIoNzg1eDIwMTApIGhhcyBoaXQgdGVzdCByZWN0ICgxNiwyMzYgMjg0eDIwKQogCi1vdmVyaGFuZ2luZ0NvbnRhaW5lcjogbGF5ZXIoMCwwIDc4NXgyMDU4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMTMsMjYyIDI5MHgxMikKLW92ZXJoYW5naW5nQ29udGFpbmVyOiBsYXllcigwLDAgNzg1eDIwNTgpIGhhcyBoaXQgdGVzdCByZWN0ICgxNCwyNzQgMTAyeDEwKQotb3ZlcmhhbmdpbmdDb250YWluZXI6IGxheWVyKDAsMCA3ODV4MjA1OCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDE0LDI4NCAxMTF4MTApCi1vdmVyaGFuZ2luZ0NvbnRhaW5lcjogbGF5ZXIoMCwwIDc4NXgyMDU4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMTQsMjk0IDEwMngxMSkKK292ZXJoYW5naW5nQ29udGFpbmVyOiBsYXllcig3ODV4MjA1OCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDEzLDI2MiAyOTB4MTIpCitvdmVyaGFuZ2luZ0NvbnRhaW5lcjogbGF5ZXIoNzg1eDIwNTgpIGhhcyBoaXQgdGVzdCByZWN0ICgxNCwyNzQgMTAyeDEwKQorb3ZlcmhhbmdpbmdDb250YWluZXI6IGxheWVyKDc4NXgyMDU4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMTQsMjg0IDExMXgxMCkKK292ZXJoYW5naW5nQ29udGFpbmVyOiBsYXllcig3ODV4MjA1OCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDE0LDI5NCAxMDJ4MTEpCiAKLXRyYW5zZm9ybTNkOiBsYXllcigxNCwzMTYgMjg4eDEyKSBoYXMgaGl0IHRlc3QgcmVjdCAoMCwwIDI4OHgxMikKLXRyYW5zZm9ybTNkOiBsYXllcigwLDAgNzg1eDIyMDIpIGhhcyBoaXQgdGVzdCByZWN0ICgxMywzMTUgMjkweDE0KQordHJhbnNmb3JtM2Q6IGxheWVyKDI4OHgxMikgaGFzIGhpdCB0ZXN0IHJlY3QgKDAsMCAyODh4MTIpCit0cmFuc2Zvcm0zZDogbGF5ZXIoNzg1eDIyMDIpIGhhcyBoaXQgdGVzdCByZWN0ICgxMywzMTUgMjkweDE0KQogCi1uZWdhdGl2ZU9mZnNldENoaWxkOiBsYXllcigtOTYsMzM5IDIxMXgxMykgaGFzIGhpdCB0ZXN0IHJlY3QgKDAsMSAxMDJ4MTIpCituZWdhdGl2ZU9mZnNldENoaWxkOiBsYXllcigyMTF4MTMpIGhhcyBoaXQgdGVzdCByZWN0ICgwLDEgMTAyeDEyKQogCi1jb250aW51YXRpb246IGxheWVyKDAsMCA3ODV4MjMzMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDEzLDM2NiAyOTB4MTIpCitjb250aW51YXRpb246IGxheWVyKDc4NXgyMzMwKSBoYXMgaGl0IHRlc3QgcmVjdCAoMTMsMzY2IDI5MHgxMikKIAotaW5saW5lQWJzb2x1dGVDaGlsZENvbnRhaW5lcjogbGF5ZXIoMCwwIDc4NXgyMzc4KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzIwLDM5MyAyNTJ4MTIpCitpbmxpbmVBYnNvbHV0ZUNoaWxkQ29udGFpbmVyOiBsYXllcig3ODV4MjM3OCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDMyMCwzOTMgMjUyeDEyKQogCi1saXN0OiBsYXllcigwLDAgNzg1eDI0MjYpIGhhcyBoaXQgdGVzdCByZWN0ICgxMyw0MTMgMjkweDE0KQotbGlzdDogbGF5ZXIoMCwwIDc4NXgyNDI2KSBoYXMgaGl0IHRlc3QgcmVjdCAoMzU0LDQxNCAyNDh4MTIpCi1saXN0OiBsYXllcigwLDAgNzg1eDI0MjYpIGhhcyBoaXQgdGVzdCByZWN0ICgzNDEsNDE1IDV4MTApCitsaXN0OiBsYXllcig3ODV4MjQyNikgaGFzIGhpdCB0ZXN0IHJlY3QgKDEzLDQxMyAyOTB4MTQpCitsaXN0OiBsYXllcig3ODV4MjQyNikgaGFzIGhpdCB0ZXN0IHJlY3QgKDM1NCw0MTQgMjQ4eDEyKQorbGlzdDogbGF5ZXIoNzg1eDI0MjYpIGhhcyBoaXQgdGVzdCByZWN0ICgzNDEsNDE1IDV4MTApCiAKLXN0eWxlTW9kaWZpZWQ6IGxheWVyKDAsMCA3ODV4MjU0OCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDEzLDQzNyAyOTB4MjIpCitzdHlsZU1vZGlmaWVkOiBsYXllcig3ODV4MjU0OCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDEzLDQzNyAyOTB4MjIpCiAKLWNvbnRhaW5zU3ZnOiBsYXllcigwLDAgNzg1eDI1OTYpIGhhcyBoaXQgdGVzdCByZWN0ICgxMyw0NjQgMjkweDE2KQorY29udGFpbnNTdmc6IGxheWVyKDc4NXgyNTk2KSBoYXMgaGl0IHRlc3QgcmVjdCAoMTMsNDY0IDI5MHgxNikKIAotc3ZnbGluZTogbGF5ZXIoMCwwIDc4NXgyNjQ0KSBoYXMgaGl0IHRlc3QgcmVjdCAoMTMsNDg5IDIyeDMpCitzdmdsaW5lOiBsYXllcig3ODV4MjY0NCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDEzLDQ4OSAyMngzKQogCi10YWJsZWNlbGw6IGxheWVyKDAsMCA3ODV4MjY5MikgaGFzIGhpdCB0ZXN0IHJlY3QgKDQ1LDUxOCAzMngxMSkKK3RhYmxlY2VsbDogbGF5ZXIoNzg1eDI2OTIpIGhhcyBoaXQgdGVzdCByZWN0ICg0NSw1MTggMzJ4MTEpCiAKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3ZpcnR1YWwvc2Nyb2xsX2N1c3RvbWl6YXRpb24vZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtbGlzdC10cmFuc2xhdGUtZXhwZWN0ZWQudHh0IGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3ZpcnR1YWwvc2Nyb2xsX2N1c3RvbWl6YXRpb24vZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtbGlzdC10cmFuc2xhdGUtZXhwZWN0ZWQudHh0CmluZGV4IDkzM2JiMjEuLjA1ODI0NTggMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy92aXJ0dWFsL3Njcm9sbF9jdXN0b21pemF0aW9uL2Zhc3QvZXZlbnRzL3RvdWNoL2NvbXBvc2l0b3ItdG91Y2gtaGl0LXJlY3RzLWxpc3QtdHJhbnNsYXRlLWV4cGVjdGVkLnR4dAorKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvdmlydHVhbC9zY3JvbGxfY3VzdG9taXphdGlvbi9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1saXN0LXRyYW5zbGF0ZS1leHBlY3RlZC50eHQKQEAgLTEsNSArMSw1IEBACi1saXN0OiBsYXllcigwLDAgODAweDYwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDEzLDEwIDI5MHgxNCkKLWxpc3Q6IGxheWVyKDAsMCA4MDB4NjAwKSBoYXMgaGl0IHRlc3QgcmVjdCAoMzU0LDExIDI0OHgxMikKLWxpc3Q6IGxheWVyKDAsMCA4MDB4NjAwKSBoYXMgaGl0IHRlc3QgcmVjdCAoMzQxLDEyIDV4MTApCitsaXN0OiBsYXllcig4MDB4NjAwKSBoYXMgaGl0IHRlc3QgcmVjdCAoMTMsMTAgMjkweDE0KQorbGlzdDogbGF5ZXIoODAweDYwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDM1NCwxMSAyNDh4MTIpCitsaXN0OiBsYXllcig4MDB4NjAwKSBoYXMgaGl0IHRlc3QgcmVjdCAoMzQxLDEyIDV4MTApCiAKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3ZpcnR1YWwvc2Nyb2xsX2N1c3RvbWl6YXRpb24vZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtc3ZnLWNvbnRhaW5lci1leHBlY3RlZC50eHQgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvdmlydHVhbC9zY3JvbGxfY3VzdG9taXphdGlvbi9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1zdmctY29udGFpbmVyLWV4cGVjdGVkLnR4dAppbmRleCBhNTU0ZjZmMi4uMTI1ZWJlZSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3ZpcnR1YWwvc2Nyb2xsX2N1c3RvbWl6YXRpb24vZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtc3ZnLWNvbnRhaW5lci1leHBlY3RlZC50eHQKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3ZpcnR1YWwvc2Nyb2xsX2N1c3RvbWl6YXRpb24vZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtc3ZnLWNvbnRhaW5lci1leHBlY3RlZC50eHQKQEAgLTEsMyArMSwzIEBACi06IGxheWVyKDAsMCA4MDB4NjAwKSBoYXMgaGl0IHRlc3QgcmVjdCAoOCwxNCA1NHgxOCkKKzogbGF5ZXIoODAweDYwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDgsMTQgNTR4MTgpCiAKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3ZpcnR1YWwvc2Nyb2xsX2N1c3RvbWl6YXRpb24vZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtc3ZnLXRleHQtZXhwZWN0ZWQudHh0IGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3ZpcnR1YWwvc2Nyb2xsX2N1c3RvbWl6YXRpb24vZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtc3ZnLXRleHQtZXhwZWN0ZWQudHh0CmluZGV4IGE1NTRmNmYyLi4xMjVlYmVlIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvdmlydHVhbC9zY3JvbGxfY3VzdG9taXphdGlvbi9mYXN0L2V2ZW50cy90b3VjaC9jb21wb3NpdG9yLXRvdWNoLWhpdC1yZWN0cy1zdmctdGV4dC1leHBlY3RlZC50eHQKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3ZpcnR1YWwvc2Nyb2xsX2N1c3RvbWl6YXRpb24vZmFzdC9ldmVudHMvdG91Y2gvY29tcG9zaXRvci10b3VjaC1oaXQtcmVjdHMtc3ZnLXRleHQtZXhwZWN0ZWQudHh0CkBAIC0xLDMgKzEsMyBAQAotOiBsYXllcigwLDAgODAweDYwMCkgaGFzIGhpdCB0ZXN0IHJlY3QgKDgsMTQgNTR4MTgpCis6IGxheWVyKDgwMHg2MDApIGhhcyBoaXQgdGVzdCByZWN0ICg4LDE0IDU0eDE4KQogCiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy93cHRfaW50ZXJuYWwvd2VieHIvcmVzb3VyY2VzL3hyLWludGVybmFsLWRldmljZS1tb2NraW5nLmpzIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3dwdF9pbnRlcm5hbC93ZWJ4ci9yZXNvdXJjZXMveHItaW50ZXJuYWwtZGV2aWNlLW1vY2tpbmcuanMKaW5kZXggNmJlOGJmYS4uMTkxY2I1MiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3dwdF9pbnRlcm5hbC93ZWJ4ci9yZXNvdXJjZXMveHItaW50ZXJuYWwtZGV2aWNlLW1vY2tpbmcuanMKKysrIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3dwdF9pbnRlcm5hbC93ZWJ4ci9yZXNvdXJjZXMveHItaW50ZXJuYWwtZGV2aWNlLW1vY2tpbmcuanMKQEAgLTQxLDMgKzQxLDIxIEBACiAvLyBQYXRjaCBpbiBleHBlcmltZW50YWwgZmVhdHVyZXMuCiBNb2NrUnVudGltZS5mZWF0dXJlVG9Nb2pvTWFwWyJkb20tb3ZlcmxheS1mb3ItaGFuZGhlbGQtYXIiXSA9CiAgICAgZGV2aWNlLm1vam9tLlhSU2Vzc2lvbkZlYXR1cmUuRE9NX09WRVJMQVlfRk9SX0hBTkRIRUxEX0FSOworCitDaHJvbWVYUlRlc3QucHJvdG90eXBlLmdldFNlcnZpY2UgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMubW9ja1ZSU2VydmljZV87Cit9CisKK01vY2tWUlNlcnZpY2UucHJvdG90eXBlLnNldEZyYW1lc1Rocm90dGxlZCA9IGZ1bmN0aW9uKHRocm90dGxlZCkgeworICByZXR1cm4gdGhpcy5mcmFtZXNfdGhyb3R0bGVkXyA9IHRocm90dGxlZDsKK30KKworTW9ja1ZSU2VydmljZS5wcm90b3R5cGUuZ2V0RnJhbWVzVGhyb3R0bGVkID0gZnVuY3Rpb24oKSB7CisgIC8vIEV4cGxpY2l0bHkgY29udmVydGVkIGZhbHNleSBzdGF0ZXMgKGkuZS4gdW5kZWZpbmVkKSB0byBmYWxzZS4KKyAgaWYgKCF0aGlzLmZyYW1lc190aHJvdHRsZWRfKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRoaXMuZnJhbWVzX3Rocm90dGxlZF87Cit9OworCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvd3B0X2ludGVybmFsL3dlYnhyL3hyRGV2aWNlX3N1cHBvcnRzU2Vzc2lvbl9pbW1lcnNpdmUuaHR0cHMuaHRtbCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy93cHRfaW50ZXJuYWwvd2VieHIveHJEZXZpY2Vfc3VwcG9ydHNTZXNzaW9uX2ltbWVyc2l2ZS5odHRwcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNjA4OGQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvd3B0X2ludGVybmFsL3dlYnhyL3hyRGV2aWNlX3N1cHBvcnRzU2Vzc2lvbl9pbW1lcnNpdmUuaHR0cHMuaHRtbApAQCAtMCwwICsxLDE4IEBACis8IURPQ1RZUEUgaHRtbD4KKzxib2R5PgorICA8c2NyaXB0IHNyYz0iL3Jlc291cmNlcy90ZXN0aGFybmVzcy5qcyI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgc3JjPSIvcmVzb3VyY2VzL3Rlc3RoYXJuZXNzcmVwb3J0LmpzIj48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9Ii93ZWJ4ci9yZXNvdXJjZXMvd2VieHJfdXRpbC5qcyI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgc3JjPSIvd2VieHIvcmVzb3VyY2VzL3dlYnhyX3Rlc3RfY29uc3RhbnRzLmpzIj48L3NjcmlwdD4KKyAgPHNjcmlwdD4KKyAgICAvLyBUaGlzIHRlc3QgaXMgY2hyb21pdW0gc3BlY2lmaWMgYXMgdGhvdWdoIHN1cHBvcnRzU2Vzc2lvbiBpcyByZW1vdmVkIGZyb20KKyAgICAvLyB0aGUgc3BlYyBpdCBpcyBzdGlsbCBpbXBsZW1lbnRlZCwgYWxiZWl0IGFzIGEgZGVwcmVjYXRlZCBtZXRob2QsIGluCisgICAgLy8gY2hyb21pdW0uIEtlZXBpbmcgdGhpcyB0ZXN0IHVudGlsIHN1Y2ggdGltZSBhcyBpdCBpcyByZW1vdmVkLgorICAgIHhyX3Byb21pc2VfdGVzdCgKKyAgICAgICJzdXBwb3J0c1Nlc3Npb24gcmVzb2x2ZXMgd2hlbiBpbW1lcnNpdmUgb3B0aW9ucyBzdXBwb3J0ZWQiLAorICAgICAgKCkgPT4geworICAgICAgICByZXR1cm4gbmF2aWdhdG9yLnhyLnRlc3Quc2ltdWxhdGVEZXZpY2VDb25uZWN0aW9uKFRSQUNLRURfSU1NRVJTSVZFX0RFVklDRSkKKyAgICAgICAgICAudGhlbiggKGNvbnRyb2xsZXIpID0+IG5hdmlnYXRvci54ci5zdXBwb3J0c1Nlc3Npb24oJ2ltbWVyc2l2ZS12cicpKTsKKyAgICAgIH0pOworICA8L3NjcmlwdD4KKzwvYm9keT4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy93cHRfaW50ZXJuYWwvd2VieHIveHJEZXZpY2Vfc3VwcG9ydHNTZXNzaW9uX2ltbWVyc2l2ZV91bnN1cHBvcnRlZC5odHRwcy5odG1sIGIvdGhpcmRfcGFydHkvYmxpbmsvd2ViX3Rlc3RzL3dwdF9pbnRlcm5hbC93ZWJ4ci94ckRldmljZV9zdXBwb3J0c1Nlc3Npb25faW1tZXJzaXZlX3Vuc3VwcG9ydGVkLmh0dHBzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FhOWMyMwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy93cHRfaW50ZXJuYWwvd2VieHIveHJEZXZpY2Vfc3VwcG9ydHNTZXNzaW9uX2ltbWVyc2l2ZV91bnN1cHBvcnRlZC5odHRwcy5odG1sCkBAIC0wLDAgKzEsMjQgQEAKKzwhRE9DVFlQRSBodG1sPgorPGJvZHk+CisgIDxzY3JpcHQgc3JjPSIvcmVzb3VyY2VzL3Rlc3RoYXJuZXNzLmpzIj48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9Ii9yZXNvdXJjZXMvdGVzdGhhcm5lc3NyZXBvcnQuanMiPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0iL3dlYnhyL3Jlc291cmNlcy93ZWJ4cl91dGlsLmpzIj48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9Ii93ZWJ4ci9yZXNvdXJjZXMvd2VieHJfdGVzdF9jb25zdGFudHMuanMiPjwvc2NyaXB0PgorICA8c2NyaXB0PgorICAgIC8vIFRoaXMgdGVzdCBpcyBjaHJvbWl1bSBzcGVjaWZpYyBhcyB0aG91Z2ggc3VwcG9ydHNTZXNzaW9uIGlzIHJlbW92ZWQgZnJvbQorICAgIC8vIHRoZSBzcGVjIGl0IGlzIHN0aWxsIGltcGxlbWVudGVkLCBhbGJlaXQgYXMgYSBkZXByZWNhdGVkIG1ldGhvZCwgaW4KKyAgICAvLyBjaHJvbWl1bS4gS2VlcGluZyB0aGlzIHRlc3QgdW50aWwgc3VjaCB0aW1lIGFzIGl0IGlzIHJlbW92ZWQuCisgICAgeHJfcHJvbWlzZV90ZXN0KAorICAgICAgInN1cHBvcnRzU2Vzc2lvbiByZWplY3RzIHdoZW4gb3B0aW9ucyBub3Qgc3VwcG9ydGVkIiwKKyAgICAgICh0KSA9PiB7CisgICAgICByZXR1cm4gbmF2aWdhdG9yLnhyLnRlc3Quc2ltdWxhdGVEZXZpY2VDb25uZWN0aW9uKFZBTElEX05PTl9JTU1FUlNJVkVfREVWSUNFKQorICAgICAgICAudGhlbiggKGNvbnRyb2xsZXIpID0+IHsKKyAgICAgICAgICByZXR1cm4gcHJvbWlzZV9yZWplY3RzKAorICAgICAgICAgICAgdCwKKyAgICAgICAgICAgICJOb3RTdXBwb3J0ZWRFcnJvciIsCisgICAgICAgICAgICBuYXZpZ2F0b3IueHIuc3VwcG9ydHNTZXNzaW9uKCdpbW1lcnNpdmUtdnInKQorICAgICAgICAgICk7CisgICAgICAgIH0pOworICAgIH0pOworICA8L3NjcmlwdD4KKzwvYm9keT4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy93cHRfaW50ZXJuYWwvd2VieHIveHJEZXZpY2Vfc3VwcG9ydHNTZXNzaW9uX25vbl9pbW1lcnNpdmUuaHR0cHMuaHRtbCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy93cHRfaW50ZXJuYWwvd2VieHIveHJEZXZpY2Vfc3VwcG9ydHNTZXNzaW9uX25vbl9pbW1lcnNpdmUuaHR0cHMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDI3NmZlMQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy93cHRfaW50ZXJuYWwvd2VieHIveHJEZXZpY2Vfc3VwcG9ydHNTZXNzaW9uX25vbl9pbW1lcnNpdmUuaHR0cHMuaHRtbApAQCAtMCwwICsxLDIxIEBACis8IURPQ1RZUEUgaHRtbD4KKzxib2R5PgorICA8c2NyaXB0IHNyYz0iL3Jlc291cmNlcy90ZXN0aGFybmVzcy5qcyI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgc3JjPSIvcmVzb3VyY2VzL3Rlc3RoYXJuZXNzcmVwb3J0LmpzIj48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9Ii93ZWJ4ci9yZXNvdXJjZXMvd2VieHJfdXRpbC5qcyI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgc3JjPSIvd2VieHIvcmVzb3VyY2VzL3dlYnhyX3Rlc3RfY29uc3RhbnRzLmpzIj48L3NjcmlwdD4KKyAgPHNjcmlwdD4KKyAgICAvLyBUaGlzIHRlc3QgaXMgY2hyb21pdW0gc3BlY2lmaWMgYXMsIHRob3VnaCBzdXBwb3J0c1Nlc3Npb24gaXMgcmVtb3ZlZCBmcm9tCisgICAgLy8gdGhlIHNwZWMgaXQgaXMgc3RpbGwgaW1wbGVtZW50ZWQsIGFsYmVpdCBhcyBhIGRlcHJlY2F0ZWQgbWV0aG9kLCBpbgorICAgIC8vIGNocm9taXVtLiBLZWVwaW5nIHRoaXMgdGVzdCB1bnRpbCBzdWNoIHRpbWUgYXMgaXQgaXMgcmVtb3ZlZC4KKyAgICB4cl9wcm9taXNlX3Rlc3QoCisgICAgICAic3VwcG9ydHNTZXNzaW9uIHJlc29sdmVzIHdoZW4gaW5saW5lIG9wdGlvbnMgc3VwcG9ydGVkIiwKKyAgICAgICh0KSA9PiB7CisgICAgICByZXR1cm4gbmF2aWdhdG9yLnhyLnRlc3Quc2ltdWxhdGVEZXZpY2VDb25uZWN0aW9uKFRSQUNLRURfSU1NRVJTSVZFX0RFVklDRSkKKyAgICAgICAgLnRoZW4oIChjb250cm9sbGVyKSA9PiB7CisgICAgICAgICAgLy8gSW5saW5lIHNlc3Npb25zIHNob3VsZCBiZSBzdXBwb3J0ZWQuCisgICAgICAgICAgcmV0dXJuIG5hdmlnYXRvci54ci5zdXBwb3J0c1Nlc3Npb24oJ2lubGluZScpOworICAgICAgICB9KTsKKyAgICB9KTsKKyAgPC9zY3JpcHQ+Cis8L2JvZHk+CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvd3B0X2ludGVybmFsL3dlYnhyL3hyU2Vzc2lvbl9mcmFtZXNUaHJvdHRsZWQuaHR0cHMuaHRtbCBiL3RoaXJkX3BhcnR5L2JsaW5rL3dlYl90ZXN0cy93cHRfaW50ZXJuYWwvd2VieHIveHJTZXNzaW9uX2ZyYW1lc1Rocm90dGxlZC5odHRwcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYjgzNzgKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9ibGluay93ZWJfdGVzdHMvd3B0X2ludGVybmFsL3dlYnhyL3hyU2Vzc2lvbl9mcmFtZXNUaHJvdHRsZWQuaHR0cHMuaHRtbApAQCAtMCwwICsxLDY2IEBACis8IURPQ1RZUEUgaHRtbD4KKzxzY3JpcHQgc3JjPSIvcmVzb3VyY2VzL3Rlc3RoYXJuZXNzLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSIvcmVzb3VyY2VzL3Rlc3RoYXJuZXNzcmVwb3J0LmpzIj48L3NjcmlwdD4KKzxzY3JpcHQ+bGV0IGFkZGl0aW9uYWxDaHJvbWl1bVJlc291cmNlcyA9IFsicmVzb3VyY2VzL3hyLWludGVybmFsLWRldmljZS1tb2NraW5nLmpzIl07PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iL3dlYnhyL3Jlc291cmNlcy93ZWJ4cl91dGlsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSIvd2VieHIvcmVzb3VyY2VzL3dlYnhyX3Rlc3RfY29uc3RhbnRzLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSIvd2VieHIvcmVzb3VyY2VzL3dlYnhyX3Rlc3RfYXNzZXJ0cy5qcyI+PC9zY3JpcHQ+Cis8Y2FudmFzIC8+CisKKzxzY3JpcHQ+CisvLyBXaGlsZSB0aGUgbG9naWMgb2Ygbm90IGhhbmRpbmcgb3V0IGFuaW1hdGlvbiBmcmFtZXMgaW4gY2VydGFpbiBzY2VuYXJpb3MgaXMKKy8vIHNwZWNjZWQsIHRoZSBub3Rpb24gb2Ygd2hhdCB0aGUgYnJvd3NlciBkb2VzIGR1cmluZyB0aG9zZSBjYXNlcyBpcyBub3QuCisvLyBUaGlzIHRlc3RzIHRoYXQgYmxpbmsgYXBwcm9wcmlhdGVseSByZXBvcnRzIHRocm90dGxlZCBzdGF0ZSB0byB0aGUgYnJvd3NlcgorLy8gcHJvY2Vzcy4gTm90ZSB0aGF0IHRoZSB0aHJvdHRsZWQgc3RhdGUgaXMgZGVmaW5lZCBhcyBiZWluZyBpbiBhIHN0YXRlIHdoZXJlCisvLyBibGluayBpcyBub3QgaGFuZGluZyBvdXQgcG9zZXMgdG8gdGhlIHBhZ2UsIGJ1dCB0aGUgcGFnZSBpcyBwcm9wZXJseSBzZXQgdXAuCitsZXQgdGVzdE5hbWUgPQorICAiQmxpbmsgYXBwcm9wcmlhdGVseSByZXBvcnRzIHdoZW4gZnJhbWVzIGFyZSB0aHJvdHRsZWQiOworCitsZXQgdGVzdEZ1bmN0aW9uID0gZnVuY3Rpb24oc2Vzc2lvbiwgZmFrZURldmljZUNvbnRyb2xsZXIsIHQpIHsKKworICAvLyBXZSBuZWVkIHRvIHlpZWxkIHNvbWUgcmVhc29uYWJsZSBhbW91bnQgb2YgdGltZSBzbyB0aGF0IG1vam8gbWVzc2FnZXMgY2FuCisgIC8vIHByb3BhZ2F0ZS4gVGhpcyBwcm92aWRlcyBhIGNvbnZpbmllbmNlIG1ldGhvZCB0byBkbyB0aGlzIHZpYSBwcm9taXNlcyBhbmQKKyAgLy8gdGltZW91dHMuCisgIGZ1bmN0aW9uIHJ1bkFmdGVyVGltZW91dChjYWxsYmFjaywgdGltZW91dCA9IDEwMCkgeworICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4geworICAgICAgdC5zdGVwX3RpbWVvdXQoKCkgPT4geworICAgICAgICByZXNvbHZlKGNhbGxiYWNrKCkpOworICAgICAgfSwgdGltZW91dCk7CisgICAgfSk7CisgIH0KKworICBsZXQgc2VydmljZSA9IG5hdmlnYXRvci54ci50ZXN0LmdldFNlcnZpY2UoKTsKKyAgZmFrZURldmljZUNvbnRyb2xsZXIuc2ltdWxhdGVWaXNpYmlsaXR5Q2hhbmdlKCJoaWRkZW4iKTsKKworICBmdW5jdGlvbiBvblhSRnJhbWUoKSB7CisgICAgc2Vzc2lvbi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUob25YUkZyYW1lKTsKKyAgfQorCisgIHJldHVybiBydW5BZnRlclRpbWVvdXQoKCkgPT4geworICAgIGFzc2VydF9mYWxzZShzZXJ2aWNlLmdldEZyYW1lc1Rocm90dGxlZCgpLAorICAgICAgIldpdGhvdXQgYSBmcmFtZSBsb29wLCB0aGUgcGFnZSBzaG91bGRuJ3QgYmUgY29uc2lkZXJlZCB0aHJvdHRsZWQiKTsKKyAgfSkKKyAgLnRoZW4oKCkgPT4geworICAgIC8vIFN0YXJ0IGEgc2ltcGxlIGZyYW1lIGxvb3AuCisgICAgc2Vzc2lvbi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUob25YUkZyYW1lKTsKKworICAgIHJldHVybiBydW5BZnRlclRpbWVvdXQoKCkgPT4geworICAgICAgYXNzZXJ0X3RydWUoc2VydmljZS5nZXRGcmFtZXNUaHJvdHRsZWQoKSwKKyAgICAgICAgIldpdGggYSBwcm9wZXJseSBjb25maWd1cmVkIGZyYW1lIGxvb3AsIGFuZCBhIGhpZGRlbiBkZXZpY2Ugc3RhdGUsICIgKworICAgICAgICAidGhlIHBhZ2Ugc2hvdWxkIGJlIGNvbnNpZGVyZWQgdGhyb3R0bGVkLiIpOworICAgIH0pOworICB9KQorICAudGhlbigoKSA9PiB7CisgICAgZmFrZURldmljZUNvbnRyb2xsZXIuc2ltdWxhdGVWaXNpYmlsaXR5Q2hhbmdlKCJ2aXNpYmxlIik7CisKKyAgICByZXR1cm4gcnVuQWZ0ZXJUaW1lb3V0KCgpID0+IHsKKyAgICAgIGFzc2VydF9mYWxzZShzZXJ2aWNlLmdldEZyYW1lc1Rocm90dGxlZCgpLAorICAgICAgICAiV2hpbGUgcHJvcGVybHkgY29uZmlndXJlZCBhbmQgdmlzaWJsZSwgZnJhbWVzIHNob3VsZCBub3QgYmUgdGhyb3R0bGVkIik7CisgICAgfSk7CisgIH0pOworfTsKKworeHJfc2Vzc2lvbl9wcm9taXNlX3Rlc3QoCisgIHRlc3ROYW1lLCB0ZXN0RnVuY3Rpb24sIFRSQUNLRURfSU1NRVJTSVZFX0RFVklDRSwgJ2ltbWVyc2l2ZS12cicpOworCis8L3NjcmlwdD4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2Nsb3N1cmVfY29tcGlsZXIvZXh0ZXJucy9sb2dpbl9zdGF0ZS5qcyBiL3RoaXJkX3BhcnR5L2Nsb3N1cmVfY29tcGlsZXIvZXh0ZXJucy9sb2dpbl9zdGF0ZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzNlYzVmCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvY2xvc3VyZV9jb21waWxlci9leHRlcm5zL2xvZ2luX3N0YXRlLmpzCkBAIC0wLDAgKzEsNjAgQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnk6CisvLyAgIHRvb2xzL2pzb25fc2NoZW1hX2NvbXBpbGVyL2NvbXBpbGVyLnB5LgorLy8gTk9URTogVGhlIGZvcm1hdCBvZiB0eXBlcyBoYXMgY2hhbmdlZC4gJ0Zvb1R5cGUnIGlzIG5vdworLy8gICAnY2hyb21lLmxvZ2luU3RhdGUuRm9vVHlwZScuCisvLyBQbGVhc2UgcnVuIHRoZSBjbG9zdXJlIGNvbXBpbGVyIGJlZm9yZSBjb21taXR0aW5nIGNoYW5nZXMuCisvLyBTZWUgaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYy8rL21hc3Rlci9kb2NzL2Nsb3N1cmVfY29tcGlsYXRpb24ubWQKKworLyoqIEBmaWxlb3ZlcnZpZXcgRXh0ZXJucyBnZW5lcmF0ZWQgZnJvbSBuYW1lc3BhY2U6IGxvZ2luU3RhdGUgKi8KKworLyoqCisgKiBAY29uc3QKKyAqLworY2hyb21lLmxvZ2luU3RhdGUgPSB7fTsKKworLyoqCisgKiBAZW51bSB7c3RyaW5nfQorICogQHNlZSBodHRwczovL2RldmVsb3Blci5jaHJvbWUuY29tL2V4dGVuc2lvbnMvbG9naW5TdGF0ZSN0eXBlLVByb2ZpbGVUeXBlCisgKi8KK2Nocm9tZS5sb2dpblN0YXRlLlByb2ZpbGVUeXBlID0geworICBTSUdOSU5fUFJPRklMRTogJ1NJR05JTl9QUk9GSUxFJywKKyAgVVNFUl9QUk9GSUxFOiAnVVNFUl9QUk9GSUxFJywKK307CisKKy8qKgorICogQGVudW0ge3N0cmluZ30KKyAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9leHRlbnNpb25zL2xvZ2luU3RhdGUjdHlwZS1TZXNzaW9uU3RhdGUKKyAqLworY2hyb21lLmxvZ2luU3RhdGUuU2Vzc2lvblN0YXRlID0geworICBVTktOT1dOOiAnVU5LTk9XTicsCisgIElOX09PQkVfU0NSRUVOOiAnSU5fT09CRV9TQ1JFRU4nLAorICBJTl9MT0dJTl9TQ1JFRU46ICdJTl9MT0dJTl9TQ1JFRU4nLAorICBJTl9TRVNTSU9OOiAnSU5fU0VTU0lPTicsCisgIElOX0xPQ0tfU0NSRUVOOiAnSU5fTE9DS19TQ1JFRU4nLAorfTsKKworLyoqCisgKiBHZXRzIHRoZSB0eXBlIG9mIHRoZSBwcm9maWxlIHRoZSBleHRlbnNpb24gaXMgaW4uCisgKiBAcGFyYW0ge2Z1bmN0aW9uKCFjaHJvbWUubG9naW5TdGF0ZS5Qcm9maWxlVHlwZSk6dm9pZH0gY2FsbGJhY2sKKyAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9leHRlbnNpb25zL2xvZ2luU3RhdGUjbWV0aG9kLWdldFByb2ZpbGVUeXBlCisgKi8KK2Nocm9tZS5sb2dpblN0YXRlLmdldFByb2ZpbGVUeXBlID0gZnVuY3Rpb24oY2FsbGJhY2spIHt9OworCisvKioKKyAqIEdldHMgdGhlIGN1cnJlbnQgc2Vzc2lvbiBzdGF0ZS4KKyAqIEBwYXJhbSB7ZnVuY3Rpb24oIWNocm9tZS5sb2dpblN0YXRlLlNlc3Npb25TdGF0ZSk6dm9pZH0gY2FsbGJhY2sKKyAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9leHRlbnNpb25zL2xvZ2luU3RhdGUjbWV0aG9kLWdldFNlc3Npb25TdGF0ZQorICovCitjaHJvbWUubG9naW5TdGF0ZS5nZXRTZXNzaW9uU3RhdGUgPSBmdW5jdGlvbihjYWxsYmFjaykge307CisKKy8qKgorICogRGlzcGF0Y2hlZCB3aGVuIHRoZSBzZXNzaW9uIHN0YXRlIGNoYW5nZXMuIDxjb2RlPnNlc3Npb25TdGF0ZTwvY29kZT4gaXMgdGhlCisgKiBuZXcgc2Vzc2lvbiBzdGF0ZS4KKyAqIEB0eXBlIHshQ2hyb21lRXZlbnR9CisgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmNocm9tZS5jb20vZXh0ZW5zaW9ucy9sb2dpblN0YXRlI2V2ZW50LW9uU2Vzc2lvblN0YXRlQ2hhbmdlZAorICovCitjaHJvbWUubG9naW5TdGF0ZS5vblNlc3Npb25TdGF0ZUNoYW5nZWQ7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9jcmFzaHBhZC9SRUFETUUuY2hyb21pdW0gYi90aGlyZF9wYXJ0eS9jcmFzaHBhZC9SRUFETUUuY2hyb21pdW0KaW5kZXggZTFkMmU2MjMuLjkwNzEyN2IgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2NyYXNocGFkL1JFQURNRS5jaHJvbWl1bQorKysgYi90aGlyZF9wYXJ0eS9jcmFzaHBhZC9SRUFETUUuY2hyb21pdW0KQEAgLTIsNyArMiw3IEBACiBTaG9ydCBOYW1lOiBjcmFzaHBhZAogVVJMOiBodHRwczovL2NyYXNocGFkLmNocm9taXVtLm9yZy8KIFZlcnNpb246IHVua25vd24KLVJldmlzaW9uOiBjODc0ODZmNTk1MWYwYjY0NDU3MzBkMDNlMzg4YjFmNmY2OGVmN2I4CitSZXZpc2lvbjogZmU1MmEwMWRmMWU5YzhhNWZlOGI5Mjg3MmQ0YmY4Njg5ZDBjZDNiNAogTGljZW5zZTogQXBhY2hlIDIuMAogTGljZW5zZSBGaWxlOiBjcmFzaHBhZC9MSUNFTlNFCiBTZWN1cml0eSBDcml0aWNhbDogeWVzCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9jcmFzaHBhZC9jcmFzaHBhZC9jbGllbnQvY3Jhc2hwYWRfY2xpZW50X2xpbnV4LmNjIGIvdGhpcmRfcGFydHkvY3Jhc2hwYWQvY3Jhc2hwYWQvY2xpZW50L2NyYXNocGFkX2NsaWVudF9saW51eC5jYwppbmRleCAwMGE4M2ZhMC4uMDE4ODMyNDMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2NyYXNocGFkL2NyYXNocGFkL2NsaWVudC9jcmFzaHBhZF9jbGllbnRfbGludXguY2MKKysrIGIvdGhpcmRfcGFydHkvY3Jhc2hwYWQvY3Jhc2hwYWQvY2xpZW50L2NyYXNocGFkX2NsaWVudF9saW51eC5jYwpAQCAtMTU1LDYgKzE1NSw3IEBACiAgICAgICAgICAgICBjb250ZXh0KTsKICAgICBleGNlcHRpb25faW5mb3JtYXRpb25fLnRocmVhZF9pZCA9IHN5c19nZXR0aWQoKTsKIAorICAgIFNjb3BlZFByU2V0RHVtcGFibGUgc2V0X2R1bXBhYmxlKGZhbHNlKTsKICAgICBIYW5kbGVDcmFzaEltcGwoKTsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KQEAgLTIyOCw3ICsyMjksNiBAQAogCiAgIHZvaWQgSGFuZGxlQ3Jhc2hJbXBsKCkgb3ZlcnJpZGUgewogICAgIFNjb3BlZFByU2V0UHRyYWNlciBzZXRfcHRyYWNlcihzeXNfZ2V0cGlkKCksIC8qIG1heV9sb2c9ICovIGZhbHNlKTsKLSAgICBTY29wZWRQclNldER1bXBhYmxlIHNldF9kdW1wYWJsZSgvKiBtYXlfbG9nPSAqLyBmYWxzZSk7CiAKICAgICBwaWRfdCBwaWQgPSBmb3JrKCk7CiAgICAgaWYgKHBpZCA8IDApIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3NxbGl0ZS9hbWFsZ2FtYXRpb24vc3FsaXRlMy5jIGIvdGhpcmRfcGFydHkvc3FsaXRlL2FtYWxnYW1hdGlvbi9zcWxpdGUzLmMKaW5kZXggNTliZGQ1MC4uMTEwYTFhNyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvc3FsaXRlL2FtYWxnYW1hdGlvbi9zcWxpdGUzLmMKKysrIGIvdGhpcmRfcGFydHkvc3FsaXRlL2FtYWxnYW1hdGlvbi9zcWxpdGUzLmMKQEAgLTE3NDMxNCwxNCArMTc0MzE0LDE0IEBACiAgIHAtPm5Ob2RlID0gbk5vZGU7CiAKICAgLyogRmlndXJlIG91dCBpZiB0aGlzIGlzIGEgbGVhZiBvciBhbiBpbnRlcm5hbCBub2RlLiAqLwotICBpZiggcC0+YU5vZGVbMF0gKXsKKyAgaWYoIGFOb2RlICYmIGFOb2RlWzBdICl7CiAgICAgLyogQW4gaW50ZXJuYWwgbm9kZS4gKi8KICAgICBwLT5pT2ZmID0gMSArIHNxbGl0ZTNGdHMzR2V0VmFyaW50KCZwLT5hTm9kZVsxXSwgJnAtPmlDaGlsZCk7CiAgIH1lbHNlewogICAgIHAtPmlPZmYgPSAxOwogICB9CiAKLSAgcmV0dXJuIG5vZGVSZWFkZXJOZXh0KHApOworICByZXR1cm4gYU5vZGUgPyBub2RlUmVhZGVyTmV4dChwKSA6IFNRTElURV9PSzsKIH0KIAogLyoKQEAgLTE3NDgxMiw4ICsxNzQ4MTIsOCBAQAogICAgICAgICBOb2RlUmVhZGVyIHJlYWRlcjsKICAgICAgICAgcE5vZGUgPSAmcFdyaXRlci0+YU5vZGVXcml0ZXJbaV07CiAKLSAgICAgICAgcmMgPSBub2RlUmVhZGVySW5pdCgmcmVhZGVyLCBwTm9kZS0+YmxvY2suYSwgcE5vZGUtPmJsb2NrLm4pOwotICAgICAgICBpZiggcmVhZGVyLmFOb2RlICl7CisgICAgICAgIGlmICggcE5vZGUtPmJsb2NrLmEpeworICAgICAgICAgIHJjID0gbm9kZVJlYWRlckluaXQoJnJlYWRlciwgcE5vZGUtPmJsb2NrLmEsIHBOb2RlLT5ibG9jay5uKTsKICAgICAgICAgICB3aGlsZSggcmVhZGVyLmFOb2RlICYmIHJjPT1TUUxJVEVfT0sgKSByYyA9IG5vZGVSZWFkZXJOZXh0KCZyZWFkZXIpOwogICAgICAgICAgIGJsb2JHcm93QnVmZmVyKCZwTm9kZS0+a2V5LCByZWFkZXIudGVybS5uLCAmcmMpOwogICAgICAgICAgIGlmKCByYz09U1FMSVRFX09LICl7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zcWxpdGUvcGF0Y2hlZC9leHQvZnRzMy9mdHMzX3dyaXRlLmMgYi90aGlyZF9wYXJ0eS9zcWxpdGUvcGF0Y2hlZC9leHQvZnRzMy9mdHMzX3dyaXRlLmMKaW5kZXggNGJlNjk0MS4uYzIyNzExZCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvc3FsaXRlL3BhdGNoZWQvZXh0L2Z0czMvZnRzM193cml0ZS5jCisrKyBiL3RoaXJkX3BhcnR5L3NxbGl0ZS9wYXRjaGVkL2V4dC9mdHMzL2Z0czNfd3JpdGUuYwpAQCAtMzc5NywxNCArMzc5NywxNCBAQAogICBwLT5uTm9kZSA9IG5Ob2RlOwogCiAgIC8qIEZpZ3VyZSBvdXQgaWYgdGhpcyBpcyBhIGxlYWYgb3IgYW4gaW50ZXJuYWwgbm9kZS4gKi8KLSAgaWYoIHAtPmFOb2RlWzBdICl7CisgIGlmKCBhTm9kZSAmJiBhTm9kZVswXSApewogICAgIC8qIEFuIGludGVybmFsIG5vZGUuICovCiAgICAgcC0+aU9mZiA9IDEgKyBzcWxpdGUzRnRzM0dldFZhcmludCgmcC0+YU5vZGVbMV0sICZwLT5pQ2hpbGQpOwogICB9ZWxzZXsKICAgICBwLT5pT2ZmID0gMTsKICAgfQogCi0gIHJldHVybiBub2RlUmVhZGVyTmV4dChwKTsKKyAgcmV0dXJuIGFOb2RlID8gbm9kZVJlYWRlck5leHQocCkgOiBTUUxJVEVfT0s7CiB9CiAKIC8qCkBAIC00Mjk1LDggKzQyOTUsOCBAQAogICAgICAgICBOb2RlUmVhZGVyIHJlYWRlcjsKICAgICAgICAgcE5vZGUgPSAmcFdyaXRlci0+YU5vZGVXcml0ZXJbaV07CiAKLSAgICAgICAgcmMgPSBub2RlUmVhZGVySW5pdCgmcmVhZGVyLCBwTm9kZS0+YmxvY2suYSwgcE5vZGUtPmJsb2NrLm4pOwotICAgICAgICBpZiggcmVhZGVyLmFOb2RlICl7CisgICAgICAgIGlmICggcE5vZGUtPmJsb2NrLmEpeworICAgICAgICAgIHJjID0gbm9kZVJlYWRlckluaXQoJnJlYWRlciwgcE5vZGUtPmJsb2NrLmEsIHBOb2RlLT5ibG9jay5uKTsKICAgICAgICAgICB3aGlsZSggcmVhZGVyLmFOb2RlICYmIHJjPT1TUUxJVEVfT0sgKSByYyA9IG5vZGVSZWFkZXJOZXh0KCZyZWFkZXIpOwogICAgICAgICAgIGJsb2JHcm93QnVmZmVyKCZwTm9kZS0+a2V5LCByZWFkZXIudGVybS5uLCAmcmMpOwogICAgICAgICAgIGlmKCByYz09U1FMSVRFX09LICl7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zcWxpdGUvcGF0Y2hlZC90ZXN0L2Z0czRtZXJnZTUudGVzdCBiL3RoaXJkX3BhcnR5L3NxbGl0ZS9wYXRjaGVkL3Rlc3QvZnRzNG1lcmdlNS50ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYWQ3NzgKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9zcWxpdGUvcGF0Y2hlZC90ZXN0L2Z0czRtZXJnZTUudGVzdApAQCAtMCwwICsxLDU4IEBACisjIDIwMTkgT2N0b2JlciAwMgorIworIyBUaGUgYXV0aG9yIGRpc2NsYWltcyBjb3B5cmlnaHQgdG8gdGhpcyBzb3VyY2UgY29kZS4gIEluIHBsYWNlIG9mCisjIGEgbGVnYWwgbm90aWNlLCBoZXJlIGlzIGEgYmxlc3Npbmc6CisjCisjICAgIE1heSB5b3UgZG8gZ29vZCBhbmQgbm90IGV2aWwuCisjICAgIE1heSB5b3UgZmluZCBmb3JnaXZlbmVzcyBmb3IgeW91cnNlbGYgYW5kIGZvcmdpdmUgb3RoZXJzLgorIyAgICBNYXkgeW91IHNoYXJlIGZyZWVseSwgbmV2ZXIgdGFraW5nIG1vcmUgdGhhbiB5b3UgZ2l2ZS4KKyMKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHJlZ3Jlc3Npb24gdGVzdHMgZm9yIFNRTGl0ZSBsaWJyYXJ5LiAgVGhlCisjIGZvY3VzIG9mIHRoaXMgc2NyaXB0IGlzIHRlc3RpbmcgdGhlIEZUUzQgbW9kdWxlLgorIworCitzZXQgdGVzdGRpciBbZmlsZSBkaXJuYW1lICRhcmd2MF0KK3NvdXJjZSAkdGVzdGRpci90ZXN0ZXIudGNsCitzZXQgdGVzdHByZWZpeCBmdHM0bWVyZ2U1CisKKyMgSWYgU1FMSVRFX0VOQUJMRV9GVFMzIGlzIGRlZmluZWQsIG9taXQgdGhpcyBmaWxlLgoraWZjYXBhYmxlICFmdHMzIHsKKyAgZmluaXNoX3Rlc3QKKyAgcmV0dXJuCit9CisKK3NvdXJjZSAkdGVzdGRpci9nZW5lc2lzLnRjbAorCitkb19leGVjc3FsX3Rlc3QgMS4xIHsgCisgIENSRUFURSBUQUJMRSB0MShkb2NpZCwgd29yZHMpOworfQorZnRzX2tqdl9nZW5lc2lzCisKK2RvX2V4ZWNzcWxfdGVzdCAxLjIgeworICBDUkVBVEUgVklSVFVBTCBUQUJMRSB4MSBVU0lORyBmdHMzOyAKKyAgSU5TRVJUIElOVE8geDEoeDEpIFZBTFVFUygnbm9kZXNpemU9NjQnKTsKKyAgSU5TRVJUIElOVE8geDEoeDEpIFZBTFVFUygnbWF4cGVuZGluZz02NCcpOworfQorCitkb19leGVjc3FsX3Rlc3QgMS4zIHsKKyAgSU5TRVJUIElOVE8geDEoZG9jaWQsIGNvbnRlbnQpIFNFTEVDVCAqIEZST00gdDE7Cit9CisKK2ZvciB7c2V0IHRuIDF9IHsxfSB7aW5jciB0bn0geworICBzZXQgdGMxIFtkYiB0b3RhbF9jaGFuZ2VzXQorICBkb19leGVjc3FsX3Rlc3QgMS40LiR0bi4xIHsKKyAgICBJTlNFUlQgSU5UTyB4MSh4MSkgVkFMVUVTKCdtZXJnZT0xLDInKTsKKyAgfQorICBzZXQgdGMyIFtkYiB0b3RhbF9jaGFuZ2VzXQorCisgIGlmIHsoJHRjMiAtICR0YzEpPDJ9IGJyZWFrCisKKyAgZG9fZXhlY3NxbF90ZXN0IDEuNC4kdG4uMSB7CisgICAgSU5TRVJUIElOVE8geDEoeDEpIFZBTFVFUygnaW50ZWdyaXR5LWNoZWNrJyk7CisgIH0KK30KKworCisKK2ZpbmlzaF90ZXN0CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zcWxpdGUvcGF0Y2hlZC90ZXN0L3Blcm11dGF0aW9ucy50ZXN0IGIvdGhpcmRfcGFydHkvc3FsaXRlL3BhdGNoZWQvdGVzdC9wZXJtdXRhdGlvbnMudGVzdAppbmRleCBhYzIxMjVjLi43MTc5OThlIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9zcWxpdGUvcGF0Y2hlZC90ZXN0L3Blcm11dGF0aW9ucy50ZXN0CisrKyBiL3RoaXJkX3BhcnR5L3NxbGl0ZS9wYXRjaGVkL3Rlc3QvcGVybXV0YXRpb25zLnRlc3QKQEAgLTEyNiw2ICsxMjYsNyBAQAogICB3YWxjcmFzaDIudGVzdCBlX2ZrZXkudGVzdCBiYWNrdXAudGVzdAogCiAgIGZ0czRtZXJnZS50ZXN0IGZ0czRtZXJnZTIudGVzdCBmdHM0bWVyZ2U0LnRlc3QgZnRzNGNoZWNrLnRlc3QKKyAgZnRzNG1lcmdlNS50ZXN0CiAgIGZ0czNjb3YudGVzdCBmdHMzc25pcHBldC50ZXN0IGZ0czNjb3JydXB0Mi50ZXN0IGZ0czNhbi50ZXN0CiAgIGZ0czNkZWZlci50ZXN0IGZ0czRsYW5naWQudGVzdCBmdHMzc29ydC50ZXN0IGZ0czV1bmljb2RlLnRlc3QKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvc3FsaXRlL3BhdGNoZXMvMDAwMS1DYWxsLWlvY3RsLXdpdGgtdGhlLWNvcnJlY3Qtc2lnbmF0dXJlLW9uLWJvdGgtQW5kcm9pLnBhdGNoIGIvdGhpcmRfcGFydHkvc3FsaXRlL3BhdGNoZXMvMDAwMS1DYWxsLWlvY3RsLXdpdGgtdGhlLWNvcnJlY3Qtc2lnbmF0dXJlLW9uLWJvdGgtQW5kcm9pLnBhdGNoCmluZGV4IDExZjhjNmE5Li4zNmQxODA5IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9zcWxpdGUvcGF0Y2hlcy8wMDAxLUNhbGwtaW9jdGwtd2l0aC10aGUtY29ycmVjdC1zaWduYXR1cmUtb24tYm90aC1BbmRyb2kucGF0Y2gKKysrIGIvdGhpcmRfcGFydHkvc3FsaXRlL3BhdGNoZXMvMDAwMS1DYWxsLWlvY3RsLXdpdGgtdGhlLWNvcnJlY3Qtc2lnbmF0dXJlLW9uLWJvdGgtQW5kcm9pLnBhdGNoCkBAIC0xLDcgKzEsNyBAQAogRnJvbSAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQogRnJvbTogU2FydGhhayBLdWtyZXRpIDxzYXJ0aGFra3VrcmV0aUBjaHJvbWl1bS5vcmc+CiBEYXRlOiBNb24sIDE1IEp1bCAyMDE5IDE3OjIzOjQ1IC0wNzAwCi1TdWJqZWN0OiBbUEFUQ0ggMS82XSBDYWxsIGlvY3RsKCkgd2l0aCB0aGUgY29ycmVjdCBzaWduYXR1cmUgb24gYm90aCBBbmRyb2lkCitTdWJqZWN0OiBbUEFUQ0ggMS84XSBDYWxsIGlvY3RsKCkgd2l0aCB0aGUgY29ycmVjdCBzaWduYXR1cmUgb24gYm90aCBBbmRyb2lkCiAgYW5kIHN0b2NrIExpbnV4LgogCiBUaGlzIGJhY2twb3J0cyBodHRwczovL3NxbGl0ZS5vcmcvc3JjL2luZm8vNjhlMTJlMDYzZmU0MWJjZApAQCAtMzIsNSArMzIsNSBAQAogIH07IC8qIEVuZCBvZiB0aGUgb3ZlcnJpZGVhYmxlIHN5c3RlbSBjYWxscyAqLwogIAogLS0gCi0yLjIzLjAuMzUxLmdjNDMxNzAzMmU2LWdvb2cKKzIuMjAuMSAoQXBwbGUgR2l0LTExNykKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvc3FsaXRlL3BhdGNoZXMvMDAwMi1GaXgtSGVhcC1CdWZmZXItT3ZlcmZsb3cucGF0Y2ggYi90aGlyZF9wYXJ0eS9zcWxpdGUvcGF0Y2hlcy8wMDAyLUZpeC1IZWFwLUJ1ZmZlci1PdmVyZmxvdy5wYXRjaAppbmRleCAzNDJjNjMzLi4wODZlMWFiIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9zcWxpdGUvcGF0Y2hlcy8wMDAyLUZpeC1IZWFwLUJ1ZmZlci1PdmVyZmxvdy5wYXRjaAorKysgYi90aGlyZF9wYXJ0eS9zcWxpdGUvcGF0Y2hlcy8wMDAyLUZpeC1IZWFwLUJ1ZmZlci1PdmVyZmxvdy5wYXRjaApAQCAtMSw3ICsxLDcgQEAKIEZyb20gMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKIEZyb206IERhcndpbiBIdWFuZyA8aHVhbmdkYXJ3aW5AY2hyb21pdW0ub3JnPgogRGF0ZTogV2VkLCAxNyBKdWwgMjAxOSAxNDo1MjozOSAtMDcwMAotU3ViamVjdDogW1BBVENIIDIvNl0gRml4IEhlYXAtQnVmZmVyLU92ZXJmbG93CitTdWJqZWN0OiBbUEFUQ0ggMi84XSBGaXggSGVhcC1CdWZmZXItT3ZlcmZsb3cKIAogICAgIEJhY2twb3J0cyBodHRwczovL3d3dy5zcWxpdGUub3JnL3NyYy9pbmZvL2JkOWE0N2EzYTI5OTdiZmIKIApAQCAtMTMwLDUgKzEzMCw1IEBACiArZmluaXNoX3Rlc3QKICsKIC0tIAotMi4yMy4wLjM1MS5nYzQzMTcwMzJlNi1nb29nCisyLjIwLjEgKEFwcGxlIEdpdC0xMTcpCiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3NxbGl0ZS9wYXRjaGVzLzAwMDMtRml4LUFTU0VSVC1tZW1Jc1ZhbGlkLWhpdC5wYXRjaCBiL3RoaXJkX3BhcnR5L3NxbGl0ZS9wYXRjaGVzLzAwMDMtRml4LUFTU0VSVC1tZW1Jc1ZhbGlkLWhpdC5wYXRjaAppbmRleCBkNmE4MTg0Li42M2U4MWVhIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9zcWxpdGUvcGF0Y2hlcy8wMDAzLUZpeC1BU1NFUlQtbWVtSXNWYWxpZC1oaXQucGF0Y2gKKysrIGIvdGhpcmRfcGFydHkvc3FsaXRlL3BhdGNoZXMvMDAwMy1GaXgtQVNTRVJULW1lbUlzVmFsaWQtaGl0LnBhdGNoCkBAIC0xLDcgKzEsNyBAQAogRnJvbSAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQogRnJvbTogRGFyd2luIEh1YW5nIDxodWFuZ2RhcndpbkBjaHJvbWl1bS5vcmc+CiBEYXRlOiBXZWQsIDE3IEp1bCAyMDE5IDE1OjIyOjQxIC0wNzAwCi1TdWJqZWN0OiBbUEFUQ0ggMy82XSBGaXggQVNTRVJUIG1lbUlzVmFsaWQgaGl0CitTdWJqZWN0OiBbUEFUQ0ggMy84XSBGaXggQVNTRVJUIG1lbUlzVmFsaWQgaGl0CiAKIEJhY2twb3J0cyBodHRwczovL3d3dy5zcWxpdGUub3JnL3NyYy9pbmZvLzdlZjdiMjNjYmIxYjlhY2UKIApAQCAtMjI4LDUgKzIyOCw1IEBACiArZmluaXNoX3Rlc3QKIFwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQogLS0gCi0yLjIzLjAuMzUxLmdjNDMxNzAzMmU2LWdvb2cKKzIuMjAuMSAoQXBwbGUgR2l0LTExNykKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvc3FsaXRlL3BhdGNoZXMvMDAwNC1GaXgtaW5jb3JyZWN0LWFzc2VydC5wYXRjaCBiL3RoaXJkX3BhcnR5L3NxbGl0ZS9wYXRjaGVzLzAwMDQtRml4LWluY29ycmVjdC1hc3NlcnQucGF0Y2gKaW5kZXggZTFiMDU2YmMuLjJhNDJkMWEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L3NxbGl0ZS9wYXRjaGVzLzAwMDQtRml4LWluY29ycmVjdC1hc3NlcnQucGF0Y2gKKysrIGIvdGhpcmRfcGFydHkvc3FsaXRlL3BhdGNoZXMvMDAwNC1GaXgtaW5jb3JyZWN0LWFzc2VydC5wYXRjaApAQCAtMSw3ICsxLDcgQEAKIEZyb20gMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKIEZyb206IERhcndpbiBIdWFuZyA8aHVhbmdkYXJ3aW5AY2hyb21pdW0ub3JnPgogRGF0ZTogV2VkLCAxNyBKdWwgMjAxOSAxNToyNDoyNSAtMDcwMAotU3ViamVjdDogW1BBVENIIDQvNl0gRml4IGluY29ycmVjdCBhc3NlcnQKK1N1YmplY3Q6IFtQQVRDSCA0LzhdIEZpeCBpbmNvcnJlY3QgYXNzZXJ0CiAKIEJhY2twb3J0cyBodHRwczovL3d3dy5zcWxpdGUub3JnL3NyYy9pbmZvLzU5YzllNzNmODZiODllZTEKIApAQCAtMjksNSArMjksNSBAQAogICAgaWYoIHBQYWdlLT5uT3ZlcmZsb3cgfHwgc3orMj5wUGFnZS0+bkZyZWUgKXsKICAgICAgaWYoIHBUZW1wICl7CiAtLSAKLTIuMjMuMC4zNTEuZ2M0MzE3MDMyZTYtZ29vZworMi4yMC4xIChBcHBsZSBHaXQtMTE3KQogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zcWxpdGUvcGF0Y2hlcy8wMDA1LUZpeC1iYWQtY2hyb21lX3NxbGl0ZTNfZnJlZS5wYXRjaCBiL3RoaXJkX3BhcnR5L3NxbGl0ZS9wYXRjaGVzLzAwMDUtRml4LWJhZC1jaHJvbWVfc3FsaXRlM19mcmVlLnBhdGNoCmluZGV4IGE1ZmI2ZjguLjU5YzM5ZGQyIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9zcWxpdGUvcGF0Y2hlcy8wMDA1LUZpeC1iYWQtY2hyb21lX3NxbGl0ZTNfZnJlZS5wYXRjaAorKysgYi90aGlyZF9wYXJ0eS9zcWxpdGUvcGF0Y2hlcy8wMDA1LUZpeC1iYWQtY2hyb21lX3NxbGl0ZTNfZnJlZS5wYXRjaApAQCAtMSw3ICsxLDcgQEAKIEZyb20gMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKIEZyb206IERhcndpbiBIdWFuZyA8aHVhbmdkYXJ3aW5AY2hyb21pdW0ub3JnPgogRGF0ZTogVHVlLCAyMyBKdWwgMjAxOSAxNToxMToxOSAtMDcwMAotU3ViamVjdDogW1BBVENIIDUvNl0gRml4IGJhZCBjaHJvbWVfc3FsaXRlM19mcmVlCitTdWJqZWN0OiBbUEFUQ0ggNS84XSBGaXggYmFkIGNocm9tZV9zcWxpdGUzX2ZyZWUKIAogQmFja3BvcnRzIGh0dHBzOi8vd3d3LnNxbGl0ZS5vcmcvc3JjL2luZm8vZjYwYTgzMDY5MTY4ODk5ZAogCkBAIC0yOSw1ICsyOSw1IEBACiAgICAgICAgcmV0dXJuIFNRTElURV9PSzsKICAgICAgfQogLS0gCi0yLjIzLjAuMzUxLmdjNDMxNzAzMmU2LWdvb2cKKzIuMjAuMSAoQXBwbGUgR2l0LTExNykKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvc3FsaXRlL3BhdGNoZXMvMDAwNi1Bdm9pZC1kYW5nbGluZy1zY2hlbWEtcG9pbnRlci5wYXRjaCBiL3RoaXJkX3BhcnR5L3NxbGl0ZS9wYXRjaGVzLzAwMDYtQXZvaWQtZGFuZ2xpbmctc2NoZW1hLXBvaW50ZXIucGF0Y2gKaW5kZXggNWEwMTU3YTUuLjljN2YzZDMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L3NxbGl0ZS9wYXRjaGVzLzAwMDYtQXZvaWQtZGFuZ2xpbmctc2NoZW1hLXBvaW50ZXIucGF0Y2gKKysrIGIvdGhpcmRfcGFydHkvc3FsaXRlL3BhdGNoZXMvMDAwNi1Bdm9pZC1kYW5nbGluZy1zY2hlbWEtcG9pbnRlci5wYXRjaApAQCAtMSw3ICsxLDcgQEAKIEZyb20gMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKIEZyb206IERhcndpbiBIdWFuZyA8aHVhbmdkYXJ3aW5AY2hyb21pdW0ub3JnPgogRGF0ZTogV2VkLCAyNSBTZXAgMjAxOSAxNDo1ODo1MSAtMDcwMAotU3ViamVjdDogW1BBVENIIDYvNl0gQXZvaWQgZGFuZ2xpbmcgc2NoZW1hIHBvaW50ZXIKK1N1YmplY3Q6IFtQQVRDSCA2LzhdIEF2b2lkIGRhbmdsaW5nIHNjaGVtYSBwb2ludGVyCiAKIEJhY2twb3J0cyBodHRwczovL3d3dy5zcWxpdGUub3JnL3NyYy9pbmZvLzA2OWMyZjRjNjFmMDYyMTEKIApAQCAtMTA3LDUgKzEwNyw1IEBACiArCiAgZmluaXNoX3Rlc3QKIC0tIAotMi4yMy4wLjM1MS5nYzQzMTcwMzJlNi1nb29nCisyLjIwLjEgKEFwcGxlIEdpdC0xMTcpCiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3NxbGl0ZS9wYXRjaGVzLzAwMDctVGhlLW5vZGVSZWFkZXJJbml0LWZ1bmN0aW9uLWluLUZUUzMtbWF5LW5vdC1hc3N1bWUtdC5wYXRjaCBiL3RoaXJkX3BhcnR5L3NxbGl0ZS9wYXRjaGVzLzAwMDctVGhlLW5vZGVSZWFkZXJJbml0LWZ1bmN0aW9uLWluLUZUUzMtbWF5LW5vdC1hc3N1bWUtdC5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2FhZDMwCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc3FsaXRlL3BhdGNoZXMvMDAwNy1UaGUtbm9kZVJlYWRlckluaXQtZnVuY3Rpb24taW4tRlRTMy1tYXktbm90LWFzc3VtZS10LnBhdGNoCkBAIC0wLDAgKzEsNDAgQEAKK0Zyb20gMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IENvbnJhZCBJcndpbiA8Y29ucmFkLmlyd2luQGdtYWlsLmNvbT4KK0RhdGU6IFdlZCwgMiBPY3QgMjAxOSAxMToxNzo0MCAtMDcwMAorU3ViamVjdDogW1BBVENIIDcvOF0gVGhlIG5vZGVSZWFkZXJJbml0KCkgZnVuY3Rpb24gaW4gRlRTMyBtYXkgbm90IGFzc3VtZSB0aGF0CisgdGhlIG5vZGUgaXMgbm9uLWVtcHR5LgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAorCitCYWNrcG9ydHMgaHR0cHM6Ly93d3cuc3FsaXRlLm9yZy9zcmMvaW5mby8zNjFlYjJmNjgyYTMwM2JiCisKK0J1ZzrCoDk5ODQ5NAorLS0tCisgdGhpcmRfcGFydHkvc3FsaXRlL3BhdGNoZWQvZXh0L2Z0czMvZnRzM193cml0ZS5jIHwgNCArKy0tCisgMSBmaWxlIGNoYW5nZWQsIDIgaW5zZXJ0aW9ucygrKSwgMiBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3NxbGl0ZS9wYXRjaGVkL2V4dC9mdHMzL2Z0czNfd3JpdGUuYyBiL3RoaXJkX3BhcnR5L3NxbGl0ZS9wYXRjaGVkL2V4dC9mdHMzL2Z0czNfd3JpdGUuYworaW5kZXggNGJlNjk0MTU3OWM1Li42MTUyYzgyODcxY2YgMTAwNjQ0CistLS0gYS90aGlyZF9wYXJ0eS9zcWxpdGUvcGF0Y2hlZC9leHQvZnRzMy9mdHMzX3dyaXRlLmMKKysrKyBiL3RoaXJkX3BhcnR5L3NxbGl0ZS9wYXRjaGVkL2V4dC9mdHMzL2Z0czNfd3JpdGUuYworQEAgLTM3OTcsMTQgKzM3OTcsMTQgQEAgc3RhdGljIGludCBub2RlUmVhZGVySW5pdChOb2RlUmVhZGVyICpwLCBjb25zdCBjaGFyICphTm9kZSwgaW50IG5Ob2RlKXsKKyAgIHAtPm5Ob2RlID0gbk5vZGU7CisgCisgICAvKiBGaWd1cmUgb3V0IGlmIHRoaXMgaXMgYSBsZWFmIG9yIGFuIGludGVybmFsIG5vZGUuICovCistICBpZiggcC0+YU5vZGVbMF0gKXsKKysgIGlmKCBhTm9kZSAmJiBhTm9kZVswXSApeworICAgICAvKiBBbiBpbnRlcm5hbCBub2RlLiAqLworICAgICBwLT5pT2ZmID0gMSArIHNxbGl0ZTNGdHMzR2V0VmFyaW50KCZwLT5hTm9kZVsxXSwgJnAtPmlDaGlsZCk7CisgICB9ZWxzZXsKKyAgICAgcC0+aU9mZiA9IDE7CisgICB9CisgCistICByZXR1cm4gbm9kZVJlYWRlck5leHQocCk7CisrICByZXR1cm4gYU5vZGUgPyBub2RlUmVhZGVyTmV4dChwKSA6IFNRTElURV9PSzsKKyB9CisgCisgLyoKKy0tIAorMi4yMC4xIChBcHBsZSBHaXQtMTE3KQorCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zcWxpdGUvcGF0Y2hlcy8wMDA4LUZpeC1hLWxvbmctc3RhbmRpbmctcHJvYmxlbS1pbi1mdHM0LWluY3JtZW50YWwtbWVyZ2UucGF0Y2ggYi90aGlyZF9wYXJ0eS9zcWxpdGUvcGF0Y2hlcy8wMDA4LUZpeC1hLWxvbmctc3RhbmRpbmctcHJvYmxlbS1pbi1mdHM0LWluY3JtZW50YWwtbWVyZ2UucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGViYmQ5MgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L3NxbGl0ZS9wYXRjaGVzLzAwMDgtRml4LWEtbG9uZy1zdGFuZGluZy1wcm9ibGVtLWluLWZ0czQtaW5jcm1lbnRhbC1tZXJnZS5wYXRjaApAQCAtMCwwICsxLDExMiBAQAorRnJvbSAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogQ29ucmFkIElyd2luIDxjb25yYWQuaXJ3aW5AZ21haWwuY29tPgorRGF0ZTogRnJpLCA0IE9jdCAyMDE5IDA5OjMwOjQ0IC0wNzAwCitTdWJqZWN0OiBbUEFUQ0ggOC84XSBGaXggYSBsb25nLXN0YW5kaW5nIHByb2JsZW0gaW4gZnRzNCBpbmNybWVudGFsIG1lcmdlLgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAorCitCYWNrcG9ydCBodHRwczovL3NxbGl0ZS5vcmcvc3JjL2luZm8vNjdkYTMxZTI0ZWJiNDljNAorCitCdWc6wqA5OTg0OTQKKy0tLQorIC4uLi9zcWxpdGUvcGF0Y2hlZC9leHQvZnRzMy9mdHMzX3dyaXRlLmMgICAgICB8ICA0ICstCisgLi4uL3NxbGl0ZS9wYXRjaGVkL3Rlc3QvZnRzNG1lcmdlNS50ZXN0ICAgICAgIHwgNTggKysrKysrKysrKysrKysrKysrKworIC4uLi9zcWxpdGUvcGF0Y2hlZC90ZXN0L3Blcm11dGF0aW9ucy50ZXN0ICAgICB8ICAxICsKKyAzIGZpbGVzIGNoYW5nZWQsIDYxIGluc2VydGlvbnMoKyksIDIgZGVsZXRpb25zKC0pCisgY3JlYXRlIG1vZGUgMTAwNjQ0IHRoaXJkX3BhcnR5L3NxbGl0ZS9wYXRjaGVkL3Rlc3QvZnRzNG1lcmdlNS50ZXN0CisKK2RpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zcWxpdGUvcGF0Y2hlZC9leHQvZnRzMy9mdHMzX3dyaXRlLmMgYi90aGlyZF9wYXJ0eS9zcWxpdGUvcGF0Y2hlZC9leHQvZnRzMy9mdHMzX3dyaXRlLmMKK2luZGV4IDYxNTJjODI4NzFjZi4uYzIyNzExZGFkOGM3IDEwMDY0NAorLS0tIGEvdGhpcmRfcGFydHkvc3FsaXRlL3BhdGNoZWQvZXh0L2Z0czMvZnRzM193cml0ZS5jCisrKysgYi90aGlyZF9wYXJ0eS9zcWxpdGUvcGF0Y2hlZC9leHQvZnRzMy9mdHMzX3dyaXRlLmMKK0BAIC00Mjk1LDggKzQyOTUsOCBAQCBzdGF0aWMgaW50IGZ0czNJbmNybWVyZ2VMb2FkKAorICAgICAgICAgTm9kZVJlYWRlciByZWFkZXI7CisgICAgICAgICBwTm9kZSA9ICZwV3JpdGVyLT5hTm9kZVdyaXRlcltpXTsKKyAKKy0gICAgICAgIHJjID0gbm9kZVJlYWRlckluaXQoJnJlYWRlciwgcE5vZGUtPmJsb2NrLmEsIHBOb2RlLT5ibG9jay5uKTsKKy0gICAgICAgIGlmKCByZWFkZXIuYU5vZGUgKXsKKysgICAgICAgIGlmICggcE5vZGUtPmJsb2NrLmEpeworKyAgICAgICAgICByYyA9IG5vZGVSZWFkZXJJbml0KCZyZWFkZXIsIHBOb2RlLT5ibG9jay5hLCBwTm9kZS0+YmxvY2subik7CisgICAgICAgICAgIHdoaWxlKCByZWFkZXIuYU5vZGUgJiYgcmM9PVNRTElURV9PSyApIHJjID0gbm9kZVJlYWRlck5leHQoJnJlYWRlcik7CisgICAgICAgICAgIGJsb2JHcm93QnVmZmVyKCZwTm9kZS0+a2V5LCByZWFkZXIudGVybS5uLCAmcmMpOworICAgICAgICAgICBpZiggcmM9PVNRTElURV9PSyApeworZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3NxbGl0ZS9wYXRjaGVkL3Rlc3QvZnRzNG1lcmdlNS50ZXN0IGIvdGhpcmRfcGFydHkvc3FsaXRlL3BhdGNoZWQvdGVzdC9mdHM0bWVyZ2U1LnRlc3QKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwMDAwMDAuLjFmYWQ3NzhiOTVlNworLS0tIC9kZXYvbnVsbAorKysrIGIvdGhpcmRfcGFydHkvc3FsaXRlL3BhdGNoZWQvdGVzdC9mdHM0bWVyZ2U1LnRlc3QKK0BAIC0wLDAgKzEsNTggQEAKKysjIDIwMTkgT2N0b2JlciAwMgorKyMKKysjIFRoZSBhdXRob3IgZGlzY2xhaW1zIGNvcHlyaWdodCB0byB0aGlzIHNvdXJjZSBjb2RlLiAgSW4gcGxhY2Ugb2YKKysjIGEgbGVnYWwgbm90aWNlLCBoZXJlIGlzIGEgYmxlc3Npbmc6CisrIworKyMgICAgTWF5IHlvdSBkbyBnb29kIGFuZCBub3QgZXZpbC4KKysjICAgIE1heSB5b3UgZmluZCBmb3JnaXZlbmVzcyBmb3IgeW91cnNlbGYgYW5kIGZvcmdpdmUgb3RoZXJzLgorKyMgICAgTWF5IHlvdSBzaGFyZSBmcmVlbHksIG5ldmVyIHRha2luZyBtb3JlIHRoYW4geW91IGdpdmUuCisrIworKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisrIyBUaGlzIGZpbGUgaW1wbGVtZW50cyByZWdyZXNzaW9uIHRlc3RzIGZvciBTUUxpdGUgbGlicmFyeS4gIFRoZQorKyMgZm9jdXMgb2YgdGhpcyBzY3JpcHQgaXMgdGVzdGluZyB0aGUgRlRTNCBtb2R1bGUuCisrIworKworK3NldCB0ZXN0ZGlyIFtmaWxlIGRpcm5hbWUgJGFyZ3YwXQorK3NvdXJjZSAkdGVzdGRpci90ZXN0ZXIudGNsCisrc2V0IHRlc3RwcmVmaXggZnRzNG1lcmdlNQorKworKyMgSWYgU1FMSVRFX0VOQUJMRV9GVFMzIGlzIGRlZmluZWQsIG9taXQgdGhpcyBmaWxlLgorK2lmY2FwYWJsZSAhZnRzMyB7CisrICBmaW5pc2hfdGVzdAorKyAgcmV0dXJuCisrfQorKworK3NvdXJjZSAkdGVzdGRpci9nZW5lc2lzLnRjbAorKworK2RvX2V4ZWNzcWxfdGVzdCAxLjEgeyAKKysgIENSRUFURSBUQUJMRSB0MShkb2NpZCwgd29yZHMpOworK30KKytmdHNfa2p2X2dlbmVzaXMKKysKKytkb19leGVjc3FsX3Rlc3QgMS4yIHsKKysgIENSRUFURSBWSVJUVUFMIFRBQkxFIHgxIFVTSU5HIGZ0czM7IAorKyAgSU5TRVJUIElOVE8geDEoeDEpIFZBTFVFUygnbm9kZXNpemU9NjQnKTsKKysgIElOU0VSVCBJTlRPIHgxKHgxKSBWQUxVRVMoJ21heHBlbmRpbmc9NjQnKTsKKyt9CisrCisrZG9fZXhlY3NxbF90ZXN0IDEuMyB7CisrICBJTlNFUlQgSU5UTyB4MShkb2NpZCwgY29udGVudCkgU0VMRUNUICogRlJPTSB0MTsKKyt9CisrCisrZm9yIHtzZXQgdG4gMX0gezF9IHtpbmNyIHRufSB7CisrICBzZXQgdGMxIFtkYiB0b3RhbF9jaGFuZ2VzXQorKyAgZG9fZXhlY3NxbF90ZXN0IDEuNC4kdG4uMSB7CisrICAgIElOU0VSVCBJTlRPIHgxKHgxKSBWQUxVRVMoJ21lcmdlPTEsMicpOworKyAgfQorKyAgc2V0IHRjMiBbZGIgdG90YWxfY2hhbmdlc10KKysKKysgIGlmIHsoJHRjMiAtICR0YzEpPDJ9IGJyZWFrCisrCisrICBkb19leGVjc3FsX3Rlc3QgMS40LiR0bi4xIHsKKysgICAgSU5TRVJUIElOVE8geDEoeDEpIFZBTFVFUygnaW50ZWdyaXR5LWNoZWNrJyk7CisrICB9CisrfQorKworKworKworK2ZpbmlzaF90ZXN0CitkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvc3FsaXRlL3BhdGNoZWQvdGVzdC9wZXJtdXRhdGlvbnMudGVzdCBiL3RoaXJkX3BhcnR5L3NxbGl0ZS9wYXRjaGVkL3Rlc3QvcGVybXV0YXRpb25zLnRlc3QKK2luZGV4IGFjMjEyNWM3M2IxMi4uNzE3OTk4ZWYzZTVkIDEwMDY0NAorLS0tIGEvdGhpcmRfcGFydHkvc3FsaXRlL3BhdGNoZWQvdGVzdC9wZXJtdXRhdGlvbnMudGVzdAorKysrIGIvdGhpcmRfcGFydHkvc3FsaXRlL3BhdGNoZWQvdGVzdC9wZXJtdXRhdGlvbnMudGVzdAorQEAgLTEyNiw2ICsxMjYsNyBAQCBzZXQgYWxscXVpY2t0ZXN0cyBbdGVzdF9zZXQgJGFsbHRlc3RzIC1leGNsdWRlIHsKKyAgIHdhbGNyYXNoMi50ZXN0IGVfZmtleS50ZXN0IGJhY2t1cC50ZXN0CisgCisgICBmdHM0bWVyZ2UudGVzdCBmdHM0bWVyZ2UyLnRlc3QgZnRzNG1lcmdlNC50ZXN0IGZ0czRjaGVjay50ZXN0CisrICBmdHM0bWVyZ2U1LnRlc3QKKyAgIGZ0czNjb3YudGVzdCBmdHMzc25pcHBldC50ZXN0IGZ0czNjb3JydXB0Mi50ZXN0IGZ0czNhbi50ZXN0CisgICBmdHMzZGVmZXIudGVzdCBmdHM0bGFuZ2lkLnRlc3QgZnRzM3NvcnQudGVzdCBmdHM1dW5pY29kZS50ZXN0CisgCistLSAKKzIuMjAuMSAoQXBwbGUgR2l0LTExNykKKwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd2VieHJfdGVzdF9wYWdlcy93ZWJ4ci1zYW1wbGVzL2pzL3dlYnhyLWJ1dHRvbi5qcyBiL3RoaXJkX3BhcnR5L3dlYnhyX3Rlc3RfcGFnZXMvd2VieHItc2FtcGxlcy9qcy93ZWJ4ci1idXR0b24uanMKaW5kZXggYTNmMzNjZGIuLmMzMTRmNjVjIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS93ZWJ4cl90ZXN0X3BhZ2VzL3dlYnhyLXNhbXBsZXMvanMvd2VieHItYnV0dG9uLmpzCisrKyBiL3RoaXJkX3BhcnR5L3dlYnhyX3Rlc3RfcGFnZXMvd2VieHItc2FtcGxlcy9qcy93ZWJ4ci1idXR0b24uanMKQEAgLTUyMCw5ICs1MjAsMTIgQEAKIAogICAgIGlmIChhdHRlbXB0IDwgdGhpcy5vcHRpb25zLnN1cHBvcnRlZFNlc3Npb25UeXBlcy5sZW5ndGgpIHsKICAgICAgIGxldCBzZXNzaW9uTW9kZSA9IHRoaXMub3B0aW9ucy5zdXBwb3J0ZWRTZXNzaW9uVHlwZXNbYXR0ZW1wdF07Ci0gICAgICBuYXZpZ2F0b3IueHIuc3VwcG9ydHNTZXNzaW9uKHNlc3Npb25Nb2RlKS50aGVuKCgpID0+IHsKLSAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZTsKLSAgICAgIH0sIChlcnIpID0+IHsKKyAgICAgIG5hdmlnYXRvci54ci5pc1Nlc3Npb25TdXBwb3J0ZWQoc2Vzc2lvbk1vZGUpLnRoZW4oKHN1cHBvcnRlZCkgPT4geworICAgICAgICBpZiAoc3VwcG9ydGVkKSB7CisgICAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKwogICAgICAgICBhdHRlbXB0Kys7CiAgICAgICAgIGlmIChhdHRlbXB0IDwgdGhpcy5vcHRpb25zLnN1cHBvcnRlZFNlc3Npb25UeXBlcy5sZW5ndGgpIHsKICAgICAgICAgICB0aGlzLl9fb25EZXZpY2VDaGFuZ2UoYXR0ZW1wdCk7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93ZWJ4cl90ZXN0X3BhZ2VzL3dlYnhyLXNhbXBsZXMveHItYmFyZWJvbmVzLmh0bWwgYi90aGlyZF9wYXJ0eS93ZWJ4cl90ZXN0X3BhZ2VzL3dlYnhyLXNhbXBsZXMveHItYmFyZWJvbmVzLmh0bWwKaW5kZXggZGJjMmUyMTkuLjUwNTE0ODViIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS93ZWJ4cl90ZXN0X3BhZ2VzL3dlYnhyLXNhbXBsZXMveHItYmFyZWJvbmVzLmh0bWwKKysrIGIvdGhpcmRfcGFydHkvd2VieHJfdGVzdF9wYWdlcy93ZWJ4ci1zYW1wbGVzL3hyLWJhcmVib25lcy5odG1sCkBAIC02MywxMyArNjMsMTYgQEAKICAgICAgICAgLy8gYnV0dG9uLiBJZiB0aGUgc3VwcG9ydHNTZXNzaW9uIHJlcXVlc3QgaXMgcmVqZWN0ZWQsIHRoZW4KICAgICAgICAgLy8gZGlzYWJsZSB0aGUgYnV0dG9uIGJlY2F1c2UgaXQgbWVhbnMgdGhhdCB0aGUgZGVzaXJlZCBzZXNzaW9uIG1vZGUgaXMKICAgICAgICAgLy8gbm90IHN1cHBvcnRlZC4KLSAgICAgICAgbmF2aWdhdG9yLnhyLnN1cHBvcnRzU2Vzc2lvbignaW1tZXJzaXZlLXZyJykudGhlbigoKSA9PiB7CisgICAgICAgIG5hdmlnYXRvci54ci5pc1Nlc3Npb25TdXBwb3J0ZWQoJ2ltbWVyc2l2ZS12cicpLnRoZW4oKHN1cHBvcnRlZCkgPT4gewogICAgICAgICAgIC8vIFVwZGF0ZXMgdGhlIGJ1dHRvbiB0byBzdGFydCBhbiBYUiBzZXNzaW9uIHdoZW4gY2xpY2tlZC4KLSAgICAgICAgICB4ckJ1dHRvbi5pbm5lckhUTUwgPSAnRW50ZXIgWFInOwotICAgICAgICAgIHhyQnV0dG9uLmRpc2FibGVkID0gZmFsc2U7Ci0gICAgICAgIH0sICgpID0+IHsKLSAgICAgICAgICB4ckJ1dHRvbi5pbm5lckhUTUwgPSAnWFIgbm90IGZvdW5kJzsKLSAgICAgICAgICB4ckJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7CisKKyAgICAgICAgICBpZiAoc3VwcG9ydGVkKSB7CisgICAgICAgICAgICB4ckJ1dHRvbi5pbm5lckhUTUwgPSAnRW50ZXIgWFInOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB4ckJ1dHRvbi5pbm5lckhUTUwgPSAnWFIgbm90IGZvdW5kJzsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB4ckJ1dHRvbi5kaXNhYmxlZCA9IHN1cHBvcnRlZDsKICAgICAgICAgfSk7CiAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2FuZHJvaWQvY2hlY2tzdHlsZS9jaHJvbWl1bS1zdHlsZS01LjAueG1sIGIvdG9vbHMvYW5kcm9pZC9jaGVja3N0eWxlL2Nocm9taXVtLXN0eWxlLTUuMC54bWwKaW5kZXggNTM0NTM5Yy4uMmYyYTZkMzEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2FuZHJvaWQvY2hlY2tzdHlsZS9jaHJvbWl1bS1zdHlsZS01LjAueG1sCisrKyBiL3Rvb2xzL2FuZHJvaWQvY2hlY2tzdHlsZS9jaHJvbWl1bS1zdHlsZS01LjAueG1sCkBAIC0xMCw3ICsxMCw5IEBACiAgIDxtb2R1bGUgbmFtZT0iU3VwcHJlc3Npb25GaWx0ZXIiPgogICAgIDxwcm9wZXJ0eSBuYW1lPSJmaWxlIiB2YWx1ZT0idG9vbHMvYW5kcm9pZC9jaGVja3N0eWxlL3N1cHByZXNzaW9ucy54bWwiLz4KICAgPC9tb2R1bGU+CisgIDxtb2R1bGUgbmFtZT0iU3VwcHJlc3NXYXJuaW5nc0ZpbHRlciIvPgogICA8bW9kdWxlIG5hbWU9IlRyZWVXYWxrZXIiPgorICAgIDxtb2R1bGUgbmFtZT0iU3VwcHJlc3NXYXJuaW5nc0hvbGRlciIvPgogICAgIDxtb2R1bGUgbmFtZT0iQXZvaWRTdGFySW1wb3J0Ij4KICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzZXZlcml0eSIgdmFsdWU9ImVycm9yIi8+CiAgICAgPC9tb2R1bGU+CkBAIC0xNDIsNSArMTQ0LDEyIEBACiAgICAgICA8cHJvcGVydHkgbmFtZT0iaWdub3JlQ29tbWVudHMiIHZhbHVlPSJ0cnVlIi8+CiAgICAgICA8cHJvcGVydHkgbmFtZT0ibWVzc2FnZSIgdmFsdWU9IlBsZWFzZSBuYW1lIHRoZSBTdHJpY3RNb2RlQ29udGV4dCB2YXJpYWJsZSAmcXVvdDtpZ25vcmVkJnF1b3Q7IChjcmJ1Zy5jb20vNzY3MDU4I2M0KS4iLz4KICAgICA8L21vZHVsZT4KKyAgICA8bW9kdWxlIG5hbWU9IlJlZ2V4cFNpbmdsZWxpbmVKYXZhIj4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZCIgdmFsdWU9IlN5c3RlbUV4aXRDaGVjayIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9InNldmVyaXR5IiB2YWx1ZT0iZXJyb3IiLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSJTeXN0ZW1cLmV4aXRcKFteMF0iLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZ25vcmVDb21tZW50cyIgdmFsdWU9InRydWUiLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtZXNzYWdlIiB2YWx1ZT0iVGhyb3cgYW4gZXhjZXB0aW9uIGluc3RlYWQgb2YgY2FsbGluZyBTeXN0ZW0jZXhpdCB3aXRoIGEgbm9uLXplcm8gZXhpdCBzdGF0dXMgKGNyYnVnLmNvbS8xMDAwNjUxKS4iLz4KKyAgICA8L21vZHVsZT4KICAgPC9tb2R1bGU+CiA8L21vZHVsZT4KZGlmZiAtLWdpdCBhL3Rvb2xzL2FuZHJvaWQvY2hlY2tzdHlsZS9zdXBwcmVzc2lvbnMueG1sIGIvdG9vbHMvYW5kcm9pZC9jaGVja3N0eWxlL3N1cHByZXNzaW9ucy54bWwKaW5kZXggN2EyNjY4Mi4uYjQyOTkzYiAxMDA2NDQKLS0tIGEvdG9vbHMvYW5kcm9pZC9jaGVja3N0eWxlL3N1cHByZXNzaW9ucy54bWwKKysrIGIvdG9vbHMvYW5kcm9pZC9jaGVja3N0eWxlL3N1cHByZXNzaW9ucy54bWwKQEAgLTIsMTMgKzIsMTkgQEAKIDwhRE9DVFlQRSBzdXBwcmVzc2lvbnMgUFVCTElDICItLy9QdXBweSBDcmF3bC8vRFREIFN1cHByZXNzaW9ucyAxLjEvL0VOIiAiaHR0cDovL3d3dy5wdXBweWNyYXdsLmNvbS9kdGRzL3N1cHByZXNzaW9uc18xXzEuZHRkIj4KIAogPHN1cHByZXNzaW9ucz4KKyAgPCEtLSBBbGwgb3RoZXIgdXNhZ2VzIG9mIHRoZSBhcHAgU2hhcmVkUHJlZmVyZW5jZSBzaG91bGQgZ28gdGhyb3VnaAorICAgICAgIENvbnRleHRVdGlscy4gLS0+CiAgIDxzdXBwcmVzcyBpZD0iU2hhcmVkUHJlZmVyZW5jZXNDaGVjayIgZmlsZXM9IkNvbnRleHRVdGlscy5qYXZhIi8+Ci0gIDwhLS0gT25seSBjaHJvbWUvIGFuZCByZW1vdGluZy8gY2FuIGRlcGVuZCBvbiB0aGUgc3VwcG9ydCBsaWJyYXJ5LgotICAgICAgIFJlZjogY3JidWcuY29tLzY0MDI0OCAtLT4KKyAgPCEtLSBPbmx5IGNocm9tZS8gYW5kIHJlbW90aW5nLyBjYW4gZGVwZW5kIG9uIHRoZSBzdXBwb3J0IGxpYnJhcnkuIFJlZjoKKyAgICAgICBjcmJ1Zy5jb20vNjQwMjQ4IC0tPgogICA8c3VwcHJlc3MgaWQ9IkFsZXJ0RGlhbG9nQ2hlY2siCi0gICAgZmlsZXM9InNyYy8oYW5kcm9pZF93ZWJ2aWV3fGJhc2V8YnVpbGR8Y2hyb21lY2FzdHxjb21wb25lbnRzfGNvbnRlbnR8ZGV2aWNlfG1lZGlhfG1vam98bmV0fHByaW50aW5nfHNlcnZpY2VzfHRlc3Rpbmd8dGhpcmRfcGFydHl8dG9vbHN8dWl8dXJsKS8iLz4KKyAgICAgICAgICAgIGZpbGVzPSJzcmMvKGFuZHJvaWRfd2Vidmlld3xiYXNlfGJ1aWxkfGNocm9tZWNhc3R8Y29tcG9uZW50c3xjb250ZW50fGRldmljZXxtZWRpYXxtb2pvfG5ldHxwcmludGluZ3xzZXJ2aWNlc3x0ZXN0aW5nfHRoaXJkX3BhcnR5fHRvb2xzfHVpfHVybCkvIi8+CiAgIDxzdXBwcmVzcyBpZD0iU3RyaW5nQnVmZmVyQ2hlY2siIGZpbGVzPSJzcmMvY2hyb21lL2FuZHJvaWQvd2ViYXBrLyIvPgotICA8IS0tIFJvYm9sZWN0cmljIHNoYWRvd3MgY2FuIG92ZXJ3cml0ZSBjb25zdHJ1Y3RvciBieSBpbXBsZW1lbnRpbmcgX19jb25zdHJ1Y3Rvcl9fKCkgbWV0aG9kLiAtLT4KKyAgPCEtLSBSb2JvbGVjdHJpYyBzaGFkb3dzIGNhbiBvdmVyd3JpdGUgY29uc3RydWN0b3IgYnkgaW1wbGVtZW50aW5nCisgICAgICAgX19jb25zdHJ1Y3Rvcl9fKCkgbWV0aG9kLiAtLT4KICAgPHN1cHByZXNzIGlkPSJNZXRob2ROYW1lQ2hlY2siIGZpbGVzPSJGaXJzdFJ1bkludGVncmF0aW9uVW5pdFRlc3QuamF2YSIvPgogICA8c3VwcHJlc3MgaWQ9Ik1ldGhvZE5hbWVDaGVjayIgZmlsZXM9IlNwbGFzaEFjdGl2aXR5VGVzdC5qYXZhIi8+CisgIDwhLS0gVGhpcmQtcGFydHkgbGlicmFyaWVzLCB0ZXN0IGluZnJhc3RydWN0dXJlLCBidWlsZCwgYW5kIHRvb2xpbmcgY2FuIHVzZQorICAgICAgIFN5c3RlbSNleGl0IGZyZWVseS4gLS0+CisgIDxzdXBwcmVzcyBpZD0iU3lzdGVtRXhpdENoZWNrIiBmaWxlcz0ic3JjLyhidWlsZHx0ZXN0aW5nfHRoaXJkX3BhcnR5fHRvb2xzKS8iLz4KIDwvc3VwcHJlc3Npb25zPgpkaWZmIC0tZ2l0IGEvdG9vbHMvYmluYXJ5X3NpemUvQlVJTEQuZ24gYi90b29scy9iaW5hcnlfc2l6ZS9CVUlMRC5nbgppbmRleCA1MzhmY2Q1Li45ODQ5M2YxMCAxMDA2NDQKLS0tIGEvdG9vbHMvYmluYXJ5X3NpemUvQlVJTEQuZ24KKysrIGIvdG9vbHMvYmluYXJ5X3NpemUvQlVJTEQuZ24KQEAgLTIyLDMgKzIyLDkgQEAKICAgICAiLy90aGlyZF9wYXJ0eS9jYXRhcHVsdC90cmFjaW5nOmNvbnZlcnRfY2hhcnRfanNvbiIsCiAgIF0KIH0KKworZ3JvdXAoImNhc3BpYW4iKSB7CisgIGRlcHMgPSBbCisgICAgIi8vdG9vbHMvYmluYXJ5X3NpemUvbGlic3VwZXJzaXplL2Nhc3BpYW46Y2xpKCRob3N0X3Rvb2xjaGFpbikiLAorICBdCit9CmRpZmYgLS1naXQgYS90b29scy9iaW5hcnlfc2l6ZS9SRUFETUUubWQgYi90b29scy9iaW5hcnlfc2l6ZS9SRUFETUUubWQKaW5kZXggN2FlYTdmNy4uNTk0MDQwZiAxMDA2NDQKLS0tIGEvdG9vbHMvYmluYXJ5X3NpemUvUkVBRE1FLm1kCisrKyBiL3Rvb2xzL2JpbmFyeV9zaXplL1JFQURNRS5tZApAQCAtMzgsOSArMzgsOSBAQAogICogU2hvd3MgeW91IG9ubHkgdGhlIGJpbmFyeSBzaXplIG1ldHJpY3MgeW91ciBwYXRjaHNldCBhZmZlY3RzLgogICogTGlua3MgdG8gU3VwZXJTaXplIGh0bWwgYW5kIHRleHQgb3V0cHV0IGZvciBtb3JlIGRldGFpbHMgb24gd2hpY2ggc3ltYm9scwogICAgd2VyZSBjaGFuZ2VkLgotICogRm9yIHRpcHMgb24gcmVkdWNpbmcgYmluYXJ5IHNpemUsIHNlZSBbRGVidWdnaW5nIEFwayBTaXplIEluY3JlYXNlXVtkZWJ1Z2dpbmctYXBrLXNpemUtaW5jcmVhc2VdLgorICogRm9yIHRpcHMgb24gcmVkdWNpbmcgYmluYXJ5IHNpemUsIHNlZSBbT3B0aW1pemF0aW9uIEFkdmljZV1bb3B0aW1pemF0aW9uX2FkdmljZV0uCiAKLVtkZWJ1Z2dpbmctYXBrLXNpemUtaW5jcmVhc2VdOiBodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjLysvSEVBRC9kb2NzL3NwZWVkL2Fwa19zaXplX3JlZ3Jlc3Npb25zLm1kI2RlYnVnZ2luZy1hcGstc2l6ZS1pbmNyZWFzZQorW29wdGltaXphdGlvbl9hZHZpY2VdOiAvL2RvY3Mvc3BlZWQvYmluYXJ5X3NpemUvb3B0aW1pemF0aW9uX2FkdmljZS5tZAogCiAjIyByZXNvdXJjZV9zaXplcy5weQogCkBAIC01MCw3ICs1MCw3IEBACiAgICBbY2hyb21lcGVyZl0oaHR0cHM6Ly9jaHJvbWVwZXJmLmFwcHNwb3QuY29tL3JlcG9ydCkgdW5kZXIKICAgIGBUZXN0IHN1aXRlPSJyZXNvdXJjZV9zaXplcyAoJEFQSykiYC4KICAqIE1ldHJpY3MgcmVwb3J0ZWQgYnkgdGhpcyB0b29sIGFyZSBkZXNjcmliZWQgaW4KLSAgIFsvL2RvY3Mvc3BlZWQvYmluYXJ5X3NpemUvbWV0cmljcy5tZF0oLi4vLi4vZG9jcy9zcGVlZC9iaW5hcnlfc2l6ZS9tZXRyaWNzLm1kKS4KKyAgIFsvL2RvY3Mvc3BlZWQvYmluYXJ5X3NpemUvbWV0cmljcy5tZF0oLy9kb2NzL3NwZWVkL2JpbmFyeV9zaXplL21ldHJpY3MubWQpLgogCiAjIyBTdXBlclNpemUKIApkaWZmIC0tZ2l0IGEvdG9vbHMvYmluYXJ5X3NpemUvbGlic3VwZXJzaXplL2Nhc3BpYW4vQlVJTEQuZ24gYi90b29scy9iaW5hcnlfc2l6ZS9saWJzdXBlcnNpemUvY2FzcGlhbi9CVUlMRC5nbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmIzZjFjNQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2JpbmFyeV9zaXplL2xpYnN1cGVyc2l6ZS9jYXNwaWFuL0JVSUxELmduCkBAIC0wLDAgKzEsMjggQEAKKyMgQ29weXJpZ2h0IDIwMTkgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKyMgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworc291cmNlX3NldCgiY2FzcGlhbi1saWIiKSB7CisgIHNvdXJjZXMgPSBbCisgICAgImZpbGVfZm9ybWF0LmNjIiwKKyAgICAiZmlsZV9mb3JtYXQuaCIsCisgICAgIm1vZGVsLmNjIiwKKyAgICAibW9kZWwuaCIsCisgIF0KKyAgZGVwcyA9IFsKKyAgICAiLy90aGlyZF9wYXJ0eS96bGliOnpsaWIiLAorICAgICIvL3RoaXJkX3BhcnR5L3psaWIvZ29vZ2xlOmNvbXByZXNzaW9uX3V0aWxzX3BvcnRhYmxlIiwKKyAgXQorICBwdWJsaWNfZGVwcyA9IFsKKyAgICAiLy90aGlyZF9wYXJ0eS9qc29uY3BwOmpzb25jcHAiLAorICBdCit9CisKK2V4ZWN1dGFibGUoImNsaSIpIHsKKyAgc291cmNlcyA9IFsKKyAgICAiY2xpLmNjIiwKKyAgXQorICBkZXBzID0gWworICAgICI6Y2FzcGlhbi1saWIiLAorICBdCit9CmRpZmYgLS1naXQgYS90b29scy9iaW5hcnlfc2l6ZS9saWJzdXBlcnNpemUvY2FzcGlhbi9ERVBTIGIvdG9vbHMvYmluYXJ5X3NpemUvbGlic3VwZXJzaXplL2Nhc3BpYW4vREVQUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDAzNGE1YQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2JpbmFyeV9zaXplL2xpYnN1cGVyc2l6ZS9jYXNwaWFuL0RFUFMKQEAgLTAsMCArMSw0IEBACitpbmNsdWRlX3J1bGVzID0gWworICAiK3RoaXJkX3BhcnR5L3psaWIiLAorICAiK3RoaXJkX3BhcnR5L2pzb25jcHAiLAorXQpkaWZmIC0tZ2l0IGEvdG9vbHMvYmluYXJ5X3NpemUvbGlic3VwZXJzaXplL2Nhc3BpYW4vY2xpLmNjIGIvdG9vbHMvYmluYXJ5X3NpemUvbGlic3VwZXJzaXplL2Nhc3BpYW4vY2xpLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwN2Y5Y2QKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9iaW5hcnlfc2l6ZS9saWJzdXBlcnNpemUvY2FzcGlhbi9jbGkuY2MKQEAgLTAsMCArMSw0OCBAQAorLy8gQ29weXJpZ2h0IDIwMTkgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBDb21tYW5kLWxpbmUgaW50ZXJmYWNlIGZvciBjaGVja2luZyB0aGUgaW50ZWdyaXR5IG9mIC5zaXplIGZpbGVzLgorLy8gVXNhZ2U6IGNsaSAocGF0aCB0byAuc2l6ZSBmaWxlKQorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgInRvb2xzL2JpbmFyeV9zaXplL2xpYnN1cGVyc2l6ZS9jYXNwaWFuL2ZpbGVfZm9ybWF0LmgiCisjaW5jbHVkZSAidG9vbHMvYmluYXJ5X3NpemUvbGlic3VwZXJzaXplL2Nhc3BpYW4vbW9kZWwuaCIKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICBpZiAoYXJnYyA8IDIpIHsKKyAgICBzdGQ6OmNlcnIgPDwgIlVzYWdlOiBjbGkgKHBhdGggdG8gLnNpemUgZmlsZSkiIDw8IHN0ZDo6ZW5kbDsKKyAgICBleGl0KDEpOworICB9CisgIHN0ZDo6aWZzdHJlYW0gaWZzKGFyZ3ZbMV0sIHN0ZDo6aWZzdHJlYW06OmluKTsKKyAgaWYgKCFpZnMuZ29vZCgpKSB7CisgICAgc3RkOjpjZXJyIDw8ICJVbmFibGUgdG8gb3BlbiBmaWxlOiAiIDw8IGFyZ3ZbMV0gPDwgc3RkOjplbmRsOworICAgIGV4aXQoMSk7CisgIH0KKyAgc3RkOjpzdHJpbmcgY29tcHJlc3NlZCgoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KGlmcykpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPigpKTsKKyAgY2FzcGlhbjo6U2l6ZUluZm8gaW5mbzsKKyAgY2FzcGlhbjo6UGFyc2VTaXplSW5mbyhjb21wcmVzc2VkLmRhdGEoKSwgY29tcHJlc3NlZC5zaXplKCksICZpbmZvKTsKKworICBzaXplX3QgbWF4X2FsaWFzZXMgPSAwOworICBmb3IgKGF1dG8mIHMgOiBpbmZvLnJhd19zeW1ib2xzKSB7CisgICAgaWYgKHMuYWxpYXNlcykgeworICAgICAgbWF4X2FsaWFzZXMgPSBzdGQ6Om1heChtYXhfYWxpYXNlcywgcy5hbGlhc2VzLT5zaXplKCkpOworICAgICAgLy8gV2hhdCBhIHdvbmRlcmZ1bCBPKG5eMikgbG9vcAorICAgICAgZm9yIChhdXRvKiBzcyA6ICpzLmFsaWFzZXMpIHsKKyAgICAgICAgaWYgKHNzLT5hbGlhc2VzICE9IHMuYWxpYXNlcykgeworICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiTm90IGFsbCBzeW1ib2xzIGluIGFsaWFzIGdyb3VwIGhhZCBzYW1lIGFsaWFzIGNvdW50IgorICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBzdGQ6OmNvdXQgPDwgIkxhcmdlc3QgbnVtYmVyIG9mIGFsaWFzZXM6ICIgPDwgbWF4X2FsaWFzZXMgPDwgc3RkOjplbmRsOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2JpbmFyeV9zaXplL2xpYnN1cGVyc2l6ZS9jYXNwaWFuL2ZpbGVfZm9ybWF0LmNjIGIvdG9vbHMvYmluYXJ5X3NpemUvbGlic3VwZXJzaXplL2Nhc3BpYW4vZmlsZV9mb3JtYXQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVlMDRlOAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2JpbmFyeV9zaXplL2xpYnN1cGVyc2l6ZS9jYXNwaWFuL2ZpbGVfZm9ybWF0LmNjCkBAIC0wLDAgKzEsMjgwIEBACisvLyBDb3B5cmlnaHQgMjAxOSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8qIEMrKyBpbXBsZW1lbnRhdGlvbiBvZiBhIC5zaXplIGZpbGUgcGFyc2VyLgorICogVGhlIC5zaXplIGZpbGUgc3BlYyBpcyBmb3VuZCBpbiBsaWJzdXBlcnNpemUvZmlsZV9mb3JtYXQucHkKKyAqLworCisjaW5jbHVkZSAidG9vbHMvYmluYXJ5X3NpemUvbGlic3VwZXJzaXplL2Nhc3BpYW4vZmlsZV9mb3JtYXQuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxudW1lcmljPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2pzb25jcHAvc291cmNlL2luY2x1ZGUvanNvbi9qc29uLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvemxpYi9nb29nbGUvY29tcHJlc3Npb25fdXRpbHNfcG9ydGFibGUuaCIKKworI2luY2x1ZGUgInRvb2xzL2JpbmFyeV9zaXplL2xpYnN1cGVyc2l6ZS9jYXNwaWFuL21vZGVsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IHN0ZDo6c3RyaW5nIFNFUklBTElaQVRJT05fVkVSU0lPTiA9ICJTaXplIEZpbGUgRm9ybWF0IHYxIjsKKworaW50IFJlYWRMb25lSW50KHN0ZDo6c3RyaW5nc3RyZWFtKiBzdHJlYW0pIHsKKyAgaW50IHZhbDsKKyAgKnN0cmVhbSA+PiB2YWw7CisgIHN0cmVhbS0+aWdub3JlKCk7ICAvLyBEcm9wIG5ld2xpbmUuCisgIHJldHVybiB2YWw7Cit9CisKK3N0ZDo6c3RyaW5nc3RyZWFtIERlY29tcHJlc3MoY29uc3QgY2hhciogZ3ppcHBlZCwgdW5zaWduZWQgbG9uZyBsZW4pIHsKKyAgdWludDMyX3QgdW5jb21wcmVzc2VkX3NpemU7CisgIG1lbWNweSgmdW5jb21wcmVzc2VkX3NpemUsICZnemlwcGVkW2xlbiAtIHNpemVvZih1bmNvbXByZXNzZWRfc2l6ZSldLAorICAgICAgICAgc2l6ZW9mKHVuY29tcHJlc3NlZF9zaXplKSk7CisgIHVuc2lnbmVkIGxvbmcgbG9uZ191bmNvbXByZXNzZWRfc2l6ZSh1bmNvbXByZXNzZWRfc2l6ZSk7CisKKyAgc3RkOjpzdHJpbmcgdW5jb21wcmVzc2VkOworICB1bmNvbXByZXNzZWQucmVzaXplKHVuY29tcHJlc3NlZF9zaXplKTsKKworICBhdXRvIHJldCA9IHpsaWJfaW50ZXJuYWw6Okd6aXBVbmNvbXByZXNzSGVscGVyKAorICAgICAgcmVpbnRlcnByZXRfY2FzdDxCeXRlZio+KCZ1bmNvbXByZXNzZWRbMF0pLCAmbG9uZ191bmNvbXByZXNzZWRfc2l6ZSwKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQnl0ZWYqPihnemlwcGVkKSwgbGVuKTsKKyAgaWYgKFpfT0sgPT0gcmV0KSB7CisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nc3RyZWFtKHVuY29tcHJlc3NlZCk7CisgIH0KKyAgc3RkOjpjZXJyIDw8ICJGYWlsZWQgdG8gZGVjb21wcmVzcy4gWmxpYiBjb2RlOiAiIDw8IHJldCA8PCBzdGQ6OmVuZGw7CisgIGV4aXQoMSk7Cit9CisKK3N0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBSZWFkVmFsdWVzRnJvbUxpbmUoc3RkOjppc3RyZWFtKiBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRlbGltaXRlcikgeworICBzdGQ6OnN0cmluZyBsaW5lOworICBzdGQ6OmdldGxpbmUoKnN0cmVhbSwgbGluZSk7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiByZXQ7CisgIGNoYXIqIGNzdHIgPSBzdGQ6OnN0cnRvaygmbGluZVswXSwgZGVsaW1pdGVyKTsKKyAgd2hpbGUgKGNzdHIgIT0gbnVsbHB0cikgeworICAgIHJldC5wdXNoX2JhY2soc3RkOjpzdHJpbmcoY3N0cikpOworICAgIGNzdHIgPSBzdGQ6OnN0cnRvayhudWxscHRyLCBkZWxpbWl0ZXIpOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RkOjp2ZWN0b3I8VD4gUmVhZEludExpc3Qoc3RkOjppc3RyZWFtKiBzdHJlYW0sIGludCBuLCBib29sIHN0b3JlZF9hc19kZWx0YSkgeworICBzdGQ6OnZlY3RvcjxUPiByZXN1bHQ7CisgIHJlc3VsdC5yZXNpemUobik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICpzdHJlYW0gPj4gcmVzdWx0W2ldOworICBpZiAoc3RvcmVkX2FzX2RlbHRhKQorICAgIHN0ZDo6cGFydGlhbF9zdW0ocmVzdWx0LmJlZ2luKCksIHJlc3VsdC5lbmQoKSwgcmVzdWx0LmJlZ2luKCkpOworICByZXR1cm4gcmVzdWx0OworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPFQ+PiBSZWFkSW50TGlzdEZvckVhY2hTZWN0aW9uKAorICAgIHN0ZDo6aXN0cmVhbSogc3RyZWFtLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIHNlY3Rpb25fY291bnRzLAorICAgIGJvb2wgc3RvcmVkX2FzX2RlbHRhKSB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPFQ+PiByZXQ7CisgIHJldC5yZXNlcnZlKHNlY3Rpb25fY291bnRzLnNpemUoKSk7CisgIGZvciAoaW50IG5zeW1ib2xzIDogc2VjdGlvbl9jb3VudHMpIHsKKyAgICByZXQuZW1wbGFjZV9iYWNrKFJlYWRJbnRMaXN0PFQ+KHN0cmVhbSwgbnN5bWJvbHMsIHN0b3JlZF9hc19kZWx0YSkpOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY2FzcGlhbiB7CisKK3ZvaWQgUGFyc2VTaXplSW5mbyhjb25zdCBjaGFyKiBnemlwcGVkLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbGVuLAorICAgICAgICAgICAgICAgICAgIDo6Y2FzcGlhbjo6U2l6ZUluZm8qIGluZm8pIHsKKyAgc3RkOjpzdHJpbmdzdHJlYW0gc3MgPSBEZWNvbXByZXNzKGd6aXBwZWQsIGxlbik7CisKKyAgLy8gSWdub3JlIGdlbmVyYXRlZCBoZWFkZXIKKyAgc3RkOjpzdHJpbmcgbGluZTsKKyAgc3RkOjpnZXRsaW5lKHNzLCBsaW5lKTsKKworICAvLyBTZXJpYWxpemF0aW9uIHZlcnNpb24KKyAgc3RkOjpnZXRsaW5lKHNzLCBsaW5lKTsKKyAgaWYgKGxpbmUgIT0gU0VSSUFMSVpBVElPTl9WRVJTSU9OKSB7CisgICAgc3RkOjpjZXJyIDw8ICJTZXJpYWxpemF0aW9uIHZlcnNpb246ICciIDw8IGxpbmUgPDwgIicgbm90IHJlY29nbml6ZWQuIgorICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisgICAgZXhpdCgxKTsKKyAgfQorCisgIC8vIE1ldGFkYXRhCisgIGludCBtZXRhZGF0YV9sZW4gPSBSZWFkTG9uZUludCgmc3MpICsgMTsKKyAgaWYgKG1ldGFkYXRhX2xlbiA8IDApIHsKKyAgICBzdGQ6OmNlcnIgPDwgIlVuZXhwZWN0ZWQgbmVnYXRpdmUgbWV0YWRhdGEgbGVuZ3RoOiAiIDw8IG1ldGFkYXRhX2xlbgorICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisgICAgZXhpdCgxKTsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPGNoYXI+IG1ldGFkYXRhX3N0cjsKKyAgbWV0YWRhdGFfc3RyLnJlc2l6ZShtZXRhZGF0YV9sZW4pOworICBzcy5nZXQobWV0YWRhdGFfc3RyLmRhdGEoKSwgbWV0YWRhdGFfbGVuLCBFT0YpOworICBKc29uOjpWYWx1ZSByb290OworICBzdGQ6OnN0cmluZ3N0cmVhbShtZXRhZGF0YV9zdHIuZGF0YSgpKSA+PiByb290OworCisgIGlmICghcm9vdCkgeworICAgIHN0ZDo6Y2VyciA8PCAiRmFpbGVkIHRvIHBhcnNlIEpTT04gbWV0YWRhdGE6IiA8PCBtZXRhZGF0YV9zdHIuZGF0YSgpCisgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICBleGl0KDEpOworICB9CisgIHN0ZDo6c3dhcChpbmZvLT5tZXRhZGF0YSwgcm9vdCk7CisgIGNvbnN0IGJvb2wgaGFzX2NvbXBvbmVudHMgPSBpbmZvLT5tZXRhZGF0YVsiaGFzX2NvbXBvbmVudHMiXS5hc0Jvb2woKTsKKworICAvLyBMaXN0IG9mIHBhdGhzOiAob2JqZWN0X3BhdGgsIFtzb3VyY2VfcGF0aF0pCisgIGludCBuX3BhdGhzID0gUmVhZExvbmVJbnQoJnNzKTsKKyAgaWYgKG5fcGF0aHMgPCAwKSB7CisgICAgc3RkOjpjZXJyIDw8ICJVbmV4cGVjdGVkIG5lZ2F0aXZlIHBhdGggbGlzdCBsZW5ndGg6ICIgPDwgbl9wYXRocworICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisgICAgZXhpdCgxKTsKKyAgfQorCisgIGluZm8tPm9iamVjdF9wYXRocy5yZXNlcnZlKG5fcGF0aHMpOworICBpbmZvLT5zb3VyY2VfcGF0aHMucmVzZXJ2ZShuX3BhdGhzKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuX3BhdGhzOyBpKyspIHsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGF0aHMgPSBSZWFkVmFsdWVzRnJvbUxpbmUoJnNzLCAiXHQiKTsKKyAgICBpZiAocGF0aHMuc2l6ZSgpID09IDIpIHsKKyAgICAgIGluZm8tPm9iamVjdF9wYXRocy5wdXNoX2JhY2socGF0aHNbMF0pOworICAgICAgaW5mby0+c291cmNlX3BhdGhzLnB1c2hfYmFjayhwYXRoc1sxXSk7CisgICAgfSBlbHNlIGlmIChwYXRocy5zaXplKCkgPT0gMSkgeworICAgICAgaW5mby0+b2JqZWN0X3BhdGhzLnB1c2hfYmFjayhwYXRoc1swXSk7CisgICAgICBpbmZvLT5zb3VyY2VfcGF0aHMucHVzaF9iYWNrKCIiKTsKKyAgICB9IGVsc2UgaWYgKHBhdGhzLmVtcHR5KCkpIHsKKyAgICAgIGluZm8tPm9iamVjdF9wYXRocy5wdXNoX2JhY2soIiIpOworICAgICAgaW5mby0+c291cmNlX3BhdGhzLnB1c2hfYmFjaygiIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiVG9vIG1hbnkgdG9rZW5zIG9uIHBhdGggcm93OiAiIDw8IGkgPDwgc3RkOjplbmRsOworICAgICAgZXhpdCgxKTsKKyAgICB9CisgIH0KKworICAvLyBMaXN0IG9mIGNvbXBvbmVudCBuYW1lcworICBpbnQgbl9jb21wb25lbnRzID0gUmVhZExvbmVJbnQoJnNzKTsKKyAgaWYgKG5fY29tcG9uZW50cyA8IDApIHsKKyAgICBzdGQ6OmNlcnIgPDwgIlVuZXhwZWN0ZWQgbmVnYXRpdmUgY29tcG9uZW50cyBsaXN0IGxlbmd0aDogIiA8PCBuX2NvbXBvbmVudHMKKyAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworICAgIGV4aXQoMSk7CisgIH0KKyAgc3RkOjpjb3V0IDw8ICJSZWFkaW5nICIgPDwgbl9jb21wb25lbnRzIDw8ICIgY29tcG9uZW50cyIgPDwgc3RkOjplbmRsOworCisgIGluZm8tPmNvbXBvbmVudHMucmVzZXJ2ZShuX2NvbXBvbmVudHMpOworICBmb3IgKGludCBpID0gMDsgaSA8IG5fY29tcG9uZW50czsgaSsrKSB7CisgICAgc3RkOjpnZXRsaW5lKHNzLCBsaW5lKTsKKyAgICBpbmZvLT5jb21wb25lbnRzLnB1c2hfYmFjayhsaW5lKTsKKyAgfQorCisgIC8vIFNlY3Rpb24gbmFtZXMKKyAgaW5mby0+c2VjdGlvbl9uYW1lcyA9IFJlYWRWYWx1ZXNGcm9tTGluZSgmc3MsICJcdCIpOworICBpbnQgbl9zZWN0aW9ucyA9IGluZm8tPnNlY3Rpb25fbmFtZXMuc2l6ZSgpOworCisgIC8vIFN5bWJvbCBjb3VudHMgZm9yIGVhY2ggc2VjdGlvbgorICBzdGQ6OnZlY3RvcjxpbnQ+IHNlY3Rpb25fY291bnRzID0gUmVhZEludExpc3Q8aW50Pigmc3MsIG5fc2VjdGlvbnMsIGZhbHNlKTsKKyAgc3RkOjpjb3V0IDw8ICJTZWN0aW9uIGNvdW50czoiIDw8IHN0ZDo6ZW5kbDsKKyAgaW50IHRvdGFsX3N5bWJvbHMgPQorICAgICAgc3RkOjphY2N1bXVsYXRlKHNlY3Rpb25fY291bnRzLmJlZ2luKCksIHNlY3Rpb25fY291bnRzLmVuZCgpLCAwKTsKKworICBmb3IgKGludCBzZWN0aW9uX2lkeCA9IDA7IHNlY3Rpb25faWR4IDwgbl9zZWN0aW9uczsgc2VjdGlvbl9pZHgrKykgeworICAgIHN0ZDo6Y291dCA8PCAiICAiIDw8IGluZm8tPnNlY3Rpb25fbmFtZXNbc2VjdGlvbl9pZHhdIDw8ICdcdCcKKyAgICAgICAgICAgICAgPDwgc2VjdGlvbl9jb3VudHNbc2VjdGlvbl9pZHhdIDw8IHN0ZDo6ZW5kbDsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGludDY0X3Q+PiBhZGRyZXNzZXMgPQorICAgICAgUmVhZEludExpc3RGb3JFYWNoU2VjdGlvbjxpbnQ2NF90Pigmc3MsIHNlY3Rpb25fY291bnRzLCB0cnVlKTsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8aW50Pj4gc2l6ZXMgPQorICAgICAgUmVhZEludExpc3RGb3JFYWNoU2VjdGlvbjxpbnQ+KCZzcywgc2VjdGlvbl9jb3VudHMsIGZhbHNlKTsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8aW50Pj4gcGF0aF9pbmRpY2VzID0KKyAgICAgIFJlYWRJbnRMaXN0Rm9yRWFjaFNlY3Rpb248aW50Pigmc3MsIHNlY3Rpb25fY291bnRzLCB0cnVlKTsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8aW50Pj4gY29tcG9uZW50X2luZGljZXM7CisgIGlmIChoYXNfY29tcG9uZW50cykgeworICAgIGNvbXBvbmVudF9pbmRpY2VzID0KKyAgICAgICAgUmVhZEludExpc3RGb3JFYWNoU2VjdGlvbjxpbnQ+KCZzcywgc2VjdGlvbl9jb3VudHMsIHRydWUpOworICB9IGVsc2UgeworICAgIGNvbXBvbmVudF9pbmRpY2VzLnJlc2l6ZShhZGRyZXNzZXMuc2l6ZSgpKTsKKyAgfQorCisgIHNzLmlnbm9yZSgpOworICBpbmZvLT5yYXdfc3ltYm9scy5yZXNlcnZlKHRvdGFsX3N5bWJvbHMpOworICAvLyBDb25zdHJ1Y3QgcmF3IHN5bWJvbHMKKyAgZm9yIChpbnQgc2VjdGlvbl9pZHggPSAwOyBzZWN0aW9uX2lkeCA8IG5fc2VjdGlvbnM7IHNlY3Rpb25faWR4KyspIHsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyogY3VyX3NlY3Rpb25fbmFtZSA9ICZpbmZvLT5zZWN0aW9uX25hbWVzW3NlY3Rpb25faWR4XTsKKyAgICBjb25zdCBpbnQgY3VyX3NlY3Rpb25fY291bnQgPSBzZWN0aW9uX2NvdW50c1tzZWN0aW9uX2lkeF07CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4mIGN1cl9hZGRyZXNzZXMgPSBhZGRyZXNzZXNbc2VjdGlvbl9pZHhdOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIGN1cl9zaXplcyA9IHNpemVzW3NlY3Rpb25faWR4XTsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBjdXJfcGF0aF9pbmRpY2VzID0gcGF0aF9pbmRpY2VzW3NlY3Rpb25faWR4XTsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBjdXJfY29tcG9uZW50X2luZGljZXMgPQorICAgICAgICBjb21wb25lbnRfaW5kaWNlc1tzZWN0aW9uX2lkeF07CisgICAgaW50MzJfdCBhbGlhc19jb3VudGVyID0gMDsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY3VyX3NlY3Rpb25fY291bnQ7IGkrKykgeworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBhcnRzID0gUmVhZFZhbHVlc0Zyb21MaW5lKCZzcywgIlx0Iik7CisgICAgICBpZiAocGFydHMuZW1wdHkoKSkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlJvdyAiIDw8IGkgPDwgIiBvZiBzeW1ib2xzIGlzIGJsYW5rIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgdWludDMyX3QgbnVtX2FsaWFzZXMgPSAwOworICAgICAgaWYgKHBhcnRzLnNpemUoKSA9PSAzKSB7CisgICAgICAgIG51bV9hbGlhc2VzID0gc3RkOjpzdHJ0b2wocGFydHNbMV0uY19zdHIoKSwgbnVsbHB0ciwgMTYpOworICAgICAgICBmbGFncyA9IHN0ZDo6c3RydG9sKHBhcnRzWzFdLmNfc3RyKCksIG51bGxwdHIsIDE2KTsKKyAgICAgIH0gZWxzZSBpZiAocGFydHMuc2l6ZSgpID09IDIpIHsKKyAgICAgICAgaWYgKHBhcnRzWzFdWzBdID09ICcwJykgeworICAgICAgICAgIC8vIGZ1bGxfbmFtZSAgYWxpYXNlc19wYXJ0CisgICAgICAgICAgbnVtX2FsaWFzZXMgPSBzdGQ6OnN0cnRvbChwYXJ0c1sxXS5jX3N0cigpLCBudWxscHRyLCAxNik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gZnVsbF9uYW1lICBmbGFnc19wYXJ0CisgICAgICAgICAgZmxhZ3MgPSBzdGQ6OnN0cnRvbChwYXJ0c1sxXS5jX3N0cigpLCBudWxscHRyLCAxNik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaW5mby0+cmF3X3N5bWJvbHMuZW1wbGFjZV9iYWNrKCk7CisgICAgICBjYXNwaWFuOjpTeW1ib2wmIG5ld19zeW0gPSBpbmZvLT5yYXdfc3ltYm9scy5iYWNrKCk7CisgICAgICBuZXdfc3ltLnNlY3Rpb25fbmFtZSA9IGN1cl9zZWN0aW9uX25hbWU7CisgICAgICBuZXdfc3ltLmZ1bGxfbmFtZSA9IHBhcnRzWzBdOworICAgICAgbmV3X3N5bS5hZGRyZXNzID0gY3VyX2FkZHJlc3Nlc1tpXTsKKyAgICAgIG5ld19zeW0uc2l6ZSA9IGN1cl9zaXplc1tpXTsKKyAgICAgIG5ld19zeW0ub2JqZWN0X3BhdGggPSAmaW5mby0+b2JqZWN0X3BhdGhzW2N1cl9wYXRoX2luZGljZXNbaV1dOworICAgICAgbmV3X3N5bS5zb3VyY2VfcGF0aCA9ICZpbmZvLT5zb3VyY2VfcGF0aHNbY3VyX3BhdGhfaW5kaWNlc1tpXV07CisgICAgICBpZiAoaGFzX2NvbXBvbmVudHMpIHsKKyAgICAgICAgbmV3X3N5bS5jb21wb25lbnQgPSAmaW5mby0+Y29tcG9uZW50c1tjdXJfY29tcG9uZW50X2luZGljZXNbaV1dOworICAgICAgfQorICAgICAgbmV3X3N5bS5mbGFncyA9IGZsYWdzOworCisgICAgICAvLyBXaGVuIHdlIGVuY291bnRlciBhIHN5bWJvbCB3aXRoIGFuIGFsaWFzIGNvdW50LCB0aGUgbmV4dCBOIHN5bWJvbHMgd2UKKyAgICAgIC8vIGVuY291bnRlciBzaG91bGQgYmUgcGxhY2VkIGluIHRoZSBzYW1lIHN5bWJvbCBncm91cC4KKyAgICAgIGlmIChudW1fYWxpYXNlcykgeworICAgICAgICBhc3NlcnQoYWxpYXNfY291bnRlciA9PSAwKTsKKyAgICAgICAgaW5mby0+YWxpYXNfZ3JvdXBzLmVtcGxhY2VfYmFjaygpOworICAgICAgICBhbGlhc19jb3VudGVyID0gbnVtX2FsaWFzZXM7CisgICAgICB9CisgICAgICBpZiAoYWxpYXNfY291bnRlciA+IDApIHsKKyAgICAgICAgbmV3X3N5bS5hbGlhc2VzID0gJmluZm8tPmFsaWFzX2dyb3Vwcy5iYWNrKCk7CisgICAgICAgIG5ld19zeW0uYWxpYXNlcy0+cHVzaF9iYWNrKCZuZXdfc3ltKTsKKyAgICAgICAgYWxpYXNfY291bnRlci0tOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChzdGQ6OmdldGxpbmUoc3MsIGxpbmUpKSB7CisgICAgaW50IGxpbmVzX3JlbWFpbmluZyA9IDUwOworICAgIGRvIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiVW5wYXJzZWQgbGluZTogIiA8PCBsaW5lIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGxpbmVzX3JlbWFpbmluZysrOworICAgIH0gd2hpbGUgKGxpbmVzX3JlbWFpbmluZyA+IDAgJiYgc3RkOjpnZXRsaW5lKHNzLCBsaW5lKSk7CisgICAgZXhpdCgxKTsKKyAgfQorCisgIHN0ZDo6Y291dCA8PCAiUGFyc2VkICIgPDwgaW5mby0+cmF3X3N5bWJvbHMuc2l6ZSgpIDw8ICIgc3ltYm9scyIgPDwgc3RkOjplbmRsOworfQorCit9ICAvLyBuYW1lc3BhY2UgY2FzcGlhbgpkaWZmIC0tZ2l0IGEvdG9vbHMvYmluYXJ5X3NpemUvbGlic3VwZXJzaXplL2Nhc3BpYW4vZmlsZV9mb3JtYXQuaCBiL3Rvb2xzL2JpbmFyeV9zaXplL2xpYnN1cGVyc2l6ZS9jYXNwaWFuL2ZpbGVfZm9ybWF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYzNzZhYmUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9iaW5hcnlfc2l6ZS9saWJzdXBlcnNpemUvY2FzcGlhbi9maWxlX2Zvcm1hdC5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2lmbmRlZiBUT09MU19CSU5BUllfU0laRV9MSUJTVVBFUlNJWkVfQ0FTUElBTl9GSUxFX0ZPUk1BVF9IXworI2RlZmluZSBUT09MU19CSU5BUllfU0laRV9MSUJTVVBFUlNJWkVfQ0FTUElBTl9GSUxFX0ZPUk1BVF9IXworCituYW1lc3BhY2UgY2FzcGlhbiB7CisKK3N0cnVjdCBTaXplSW5mbzsKKwordm9pZCBQYXJzZVNpemVJbmZvKGNvbnN0IGNoYXIqIGd6aXBwZWQsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsZW4sCisgICAgICAgICAgICAgICAgICAgY2FzcGlhbjo6U2l6ZUluZm8qIGluZm8pOworCit9ICAvLyBuYW1lc3BhY2UgY2FzcGlhbgorCisjZW5kaWYgIC8vIFRPT0xTX0JJTkFSWV9TSVpFX0xJQlNVUEVSU0laRV9DQVNQSUFOX0ZJTEVfRk9STUFUX0hfCmRpZmYgLS1naXQgYS90b29scy9iaW5hcnlfc2l6ZS9saWJzdXBlcnNpemUvY2FzcGlhbi9tb2RlbC5jYyBiL3Rvb2xzL2JpbmFyeV9zaXplL2xpYnN1cGVyc2l6ZS9jYXNwaWFuL21vZGVsLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYWVmYWUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9iaW5hcnlfc2l6ZS9saWJzdXBlcnNpemUvY2FzcGlhbi9tb2RlbC5jYwpAQCAtMCwwICsxLDEzIEBACisvLyBDb3B5cmlnaHQgMjAxOSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJ0b29scy9iaW5hcnlfc2l6ZS9saWJzdXBlcnNpemUvY2FzcGlhbi9tb2RlbC5oIgorCisjaW5jbHVkZSAidG9vbHMvYmluYXJ5X3NpemUvbGlic3VwZXJzaXplL2Nhc3BpYW4vZmlsZV9mb3JtYXQuaCIKKworY2FzcGlhbjo6U3ltYm9sOjpTeW1ib2woKSA9IGRlZmF1bHQ7CitjYXNwaWFuOjpTeW1ib2w6OlN5bWJvbChjb25zdCBTeW1ib2wmIG90aGVyKSA9IGRlZmF1bHQ7CisKK2Nhc3BpYW46OlNpemVJbmZvOjpTaXplSW5mbygpID0gZGVmYXVsdDsKK2Nhc3BpYW46OlNpemVJbmZvOjp+U2l6ZUluZm8oKSA9IGRlZmF1bHQ7CmRpZmYgLS1naXQgYS90b29scy9iaW5hcnlfc2l6ZS9saWJzdXBlcnNpemUvY2FzcGlhbi9tb2RlbC5oIGIvdG9vbHMvYmluYXJ5X3NpemUvbGlic3VwZXJzaXplL2Nhc3BpYW4vbW9kZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTU3ZDY0OQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2JpbmFyeV9zaXplL2xpYnN1cGVyc2l6ZS9jYXNwaWFuL21vZGVsLmgKQEAgLTAsMCArMSw1OSBAQAorLy8gQ29weXJpZ2h0IDIwMTkgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaWZuZGVmIFRPT0xTX0JJTkFSWV9TSVpFX0xJQlNVUEVSU0laRV9DQVNQSUFOX01PREVMX0hfCisjZGVmaW5lIFRPT0xTX0JJTkFSWV9TSVpFX0xJQlNVUEVSU0laRV9DQVNQSUFOX01PREVMX0hfCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9qc29uY3BwL3NvdXJjZS9pbmNsdWRlL2pzb24vanNvbi5oIgorCisvLyBDb3BpZWQgZnJvbSByZXByZXNlbnRhdGlvbiBpbiB0b29scy9iaW5hcnlfc2l6ZS9saWJzdXBlcnNpemUvbW9kZWxzLnB5CisKK25hbWVzcGFjZSBjYXNwaWFuIHsKKworc3RydWN0IFN5bWJvbCB7CisgIFN5bWJvbCgpOworICBTeW1ib2woY29uc3QgU3ltYm9sJiBvdGhlcik7CisKKyAgaW50MzJfdCBhZGRyZXNzID0gMDsKKyAgaW50MzJfdCBzaXplID0gMDsKKyAgaW50MzJfdCBmbGFncyA9IDA7CisgIGludDMyX3QgcGFkZGluZyA9IDA7CisgIHN0ZDo6c3RyaW5nIGZ1bGxfbmFtZTsKKyAgc3RkOjpzdHJpbmcgdGVtcGxhdGVfbmFtZTsKKyAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcqIG9iamVjdF9wYXRoID0gbnVsbHB0cjsKKyAgY29uc3Qgc3RkOjpzdHJpbmcqIHNlY3Rpb25fbmFtZSA9IG51bGxwdHI7CisgIGNvbnN0IHN0ZDo6c3RyaW5nKiBzb3VyY2VfcGF0aCA9IG51bGxwdHI7CisgIGNvbnN0IHN0ZDo6c3RyaW5nKiBjb21wb25lbnQgPSBudWxscHRyOworICBzdGQ6OnZlY3RvcjxTeW1ib2wqPiogYWxpYXNlcyA9IG51bGxwdHI7Cit9OworCitzdHJ1Y3QgU2l6ZUluZm8geworICBTaXplSW5mbygpOworICB+U2l6ZUluZm8oKTsKKyAgU2l6ZUluZm8oY29uc3QgU2l6ZUluZm8mIG90aGVyKSA9IGRlbGV0ZTsKKyAgU2l6ZUluZm8mIG9wZXJhdG9yPShjb25zdCBTaXplSW5mbyYgb3RoZXIpID0gZGVsZXRlOworCisgIHN0ZDo6dmVjdG9yPGNhc3BpYW46OlN5bWJvbD4gcmF3X3N5bWJvbHM7CisgIEpzb246OlZhbHVlIG1ldGFkYXRhOworCisgIC8vIEVudHJpZXMgaW4gfHJhd19zeW1ib2xzfCBob2xkIHBvaW50ZXJzIHRvIHRoaXMgZGF0YS4KKyAgLy8gQXBwZW5kaW5nIHRvIG9uZSB3aWxsIGNoYW5nZSB0aGVpciBjYXBhY2l0eSBhbmQgaW52YWxpZGF0ZSBwb2ludGVycy4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG9iamVjdF9wYXRoczsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHNvdXJjZV9wYXRoczsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbXBvbmVudHM7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzZWN0aW9uX25hbWVzOworCisgIC8vIEEgY29udGFpbmVyIGZvciBlYWNoIHN5bWJvbCBncm91cC4KKyAgc3RkOjpkZXF1ZTxzdGQ6OnZlY3RvcjxTeW1ib2wqPj4gYWxpYXNfZ3JvdXBzOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNhc3BpYW4KKyNlbmRpZiAgLy8gVE9PTFNfQklOQVJZX1NJWkVfTElCU1VQRVJTSVpFX0NBU1BJQU5fTU9ERUxfSF8KZGlmZiAtLWdpdCBhL3Rvb2xzL2JpbmFyeV9zaXplL3RyeWJvdF9jb21taXRfc2l6ZV9jaGVja2VyLnB5IGIvdG9vbHMvYmluYXJ5X3NpemUvdHJ5Ym90X2NvbW1pdF9zaXplX2NoZWNrZXIucHkKaW5kZXggYTM5Zjk1MTMzLi41MTVjOWM5IDEwMDc1NQotLS0gYS90b29scy9iaW5hcnlfc2l6ZS90cnlib3RfY29tbWl0X3NpemVfY2hlY2tlci5weQorKysgYi90b29scy9iaW5hcnlfc2l6ZS90cnlib3RfY29tbWl0X3NpemVfY2hlY2tlci5weQpAQCAtMzQsNyArMzQsNyBAQAogCiBUaGVyZSBpcyBndWlkYW5jZSBhdDoKIAotaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYy8rL21hc3Rlci9kb2NzL3NwZWVkL2Fwa19zaXplX3JlZ3Jlc3Npb25zLm1kI0RlYnVnZ2luZy1BcGstU2l6ZS1JbmNyZWFzZQoraHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYy8rL21hc3Rlci9kb2NzL3NwZWVkL2Fwa19zaXplX3JlZ3Jlc3Npb25zLm1kCiAKIElmIHRoZSBncm93dGggaXMgZXhwZWN0ZWQgLyBqdXN0aWZpZWQsIHRoZW4geW91IGNhbiBieXBhc3MgdGhpcyBib3QgZmFpbHVyZSBieQogYWRkaW5nICJCaW5hcnktU2l6ZTogJEpVU1RJRklDQVRJT04iIGZvb3RlciB0byB5b3VyIGNvbW1pdCBtZXNzYWdlIChtdXN0IGdvIGF0CmRpZmYgLS1naXQgYS90b29scy9jb2RlX2NvdmVyYWdlL3Rlc3Rfc3VpdGUudHh0IGIvdG9vbHMvY29kZV9jb3ZlcmFnZS90ZXN0X3N1aXRlLnR4dAppbmRleCAzOWFkZDM5Li5iYzgxMjMxIDEwMDY0NAotLS0gYS90b29scy9jb2RlX2NvdmVyYWdlL3Rlc3Rfc3VpdGUudHh0CisrKyBiL3Rvb2xzL2NvZGVfY292ZXJhZ2UvdGVzdF9zdWl0ZS50eHQKQEAgLTQ3LDcgKzQ3LDYgQEAKIGlwY190ZXN0cwogamluZ2xlX3VuaXR0ZXN0cwogbGF0ZW5jeV91bml0dGVzdHMKLWxldmVsZGJfc2VydmljZV91bml0dGVzdHMKIGxpYmppbmdsZV94bXBwX3VuaXR0ZXN0cwogbWVkaWFfYmxpbmtfdW5pdHRlc3RzCiBtZWRpYV9tb2pvX3VuaXR0ZXN0cwpkaWZmIC0tZ2l0IGEvdG9vbHMvZ3JpdHNldHRpbmdzL09XTkVSUyBiL3Rvb2xzL2dyaXRzZXR0aW5ncy9PV05FUlMKaW5kZXggM2Y0OTE4Ni4uNmE0MWRkMyAxMDA2NDQKLS0tIGEvdG9vbHMvZ3JpdHNldHRpbmdzL09XTkVSUworKysgYi90b29scy9ncml0c2V0dGluZ3MvT1dORVJTCkBAIC0xICsxLDMgQEAKIGZpbGU6Ly90b29scy9ncml0L09XTkVSUworCitodWFuZ3NAY2hyb21pdW0ub3JnCmRpZmYgLS1naXQgYS90b29scy9tZXRyaWNzL2hpc3RvZ3JhbXMvZW51bXMueG1sIGIvdG9vbHMvbWV0cmljcy9oaXN0b2dyYW1zL2VudW1zLnhtbAppbmRleCA1MGUwMTUzLi4zODg1NGRjIDEwMDY0NAotLS0gYS90b29scy9tZXRyaWNzL2hpc3RvZ3JhbXMvZW51bXMueG1sCisrKyBiL3Rvb2xzL21ldHJpY3MvaGlzdG9ncmFtcy9lbnVtcy54bWwKQEAgLTE4OTMsNyArMTg5Myw5IEBACiAgIDxpbnQgdmFsdWU9IjQzIiBsYWJlbD0iVXNlciBjbGlja2VkIG9uIHRoZSBiYW5uZXIiLz4KICAgPGludCB2YWx1ZT0iNDQiIGxhYmVsPSIoT2Jzb2xldGUpIFVzZXIgc3dpcGVkIHRoZSBiYW5uZXIgYXdheSIvPgogICA8aW50IHZhbHVlPSI0NSIgbGFiZWw9IlVzZXIgaGl0IHRoZSBYIGJ1dHRvbiIvPgotICA8aW50IHZhbHVlPSI0NiIgbGFiZWw9IlVzZXIgYmVnYW4gYXBwIGluc3RhbGwsIGJ1dCBpdCBkaWRuJ3QgZmluaXNoIGluIHRpbWUiLz4KKyAgPGludCB2YWx1ZT0iNDYiCisgICAgICBsYWJlbD0iVXNlciBiZWdhbiBhcHAgaW5zdGFsbCwgYnV0IGl0IGRpZG4ndCBmaW5pc2ggaW4gdGltZQorICAgICAgICAgICAgIChkZXByZWNhdGVkKSIvPgogICA8aW50IHZhbHVlPSI0NyIgbGFiZWw9IkJhbm5lciB3YXMgZGlzbWlzc2VkIGZvciBhbnkgcmVhc29uIi8+CiAgIDxpbnQgdmFsdWU9IjQ4IiBsYWJlbD0iQW1iaWVudCBiYWRnZSBpbmZvYmFyIHdhcyBkaXNtaXNzZWQiLz4KIDwvZW51bT4KQEAgLTE5NTYsOSArMTk1OCwxMSBAQAogCiA8ZW51bSBuYW1lPSJBcHBCYW5uZXJzSW5zdGFsbEV2ZW50Ij4KICAgPGludCB2YWx1ZT0iMjEiIGxhYmVsPSIoTmF0aXZlIGFwcCkgVXNlciB0cmlnZ2VyZWQgdGhlIGFwcCBpbnN0YWxsIGRpYWxvZyIvPgotICA8aW50IHZhbHVlPSIyMiIgbGFiZWw9IihOYXRpdmUgYXBwKSBVc2VyIGJlZ2FuIGluc3RhbGxpbmcgdGhlIGFwcCIvPgorICA8aW50IHZhbHVlPSIyMiIKKyAgICAgIGxhYmVsPSIoTmF0aXZlIGFwcCkgVXNlciBiZWdhbiBpbnN0YWxsaW5nIHRoZSBhcHAgKGRlcHJlY2F0ZWQpIi8+CiAgIDxpbnQgdmFsdWU9IjIzIgotICAgICAgbGFiZWw9IihOYXRpdmUgYXBwKSBVc2VyIHdhaXRlZCBmb3IgdGhlIGFwcCB0byBmaW5pc2ggaW5zdGFsbGluZyIvPgorICAgICAgbGFiZWw9IihOYXRpdmUgYXBwKSBVc2VyIHdhaXRlZCBmb3IgdGhlIGFwcCB0byBmaW5pc2ggaW5zdGFsbGluZworICAgICAgICAgICAgIChkZXByZWNhdGVkKSIvPgogICA8aW50IHZhbHVlPSIyNCIgbGFiZWw9IihXZWIgYXBwKSBVc2VyIGluc3RhbGxlZCBhIHdlYiBhcHAiLz4KIDwvZW51bT4KIApAQCAtMTgyMjQsNiArMTgyMjgsNyBAQAogICA8aW50IHZhbHVlPSI2MjMiIGxhYmVsPSJMZWdhY3lTYW1lU2l0ZUNvb2tpZUJlaGF2aW9yRW5hYmxlZCIvPgogICA8aW50IHZhbHVlPSI2MjQiIGxhYmVsPSJMZWdhY3lTYW1lU2l0ZUNvb2tpZUJlaGF2aW9yRW5hYmxlZEZvckRvbWFpbkxpc3QiLz4KICAgPGludCB2YWx1ZT0iNjI1IiBsYWJlbD0iUHJpbnRKb2JIaXN0b3J5RXhwaXJhdGlvblBlcmlvZCIvPgorICA8aW50IHZhbHVlPSI2MjYiIGxhYmVsPSJUTFMxM0hhcmRlbmluZ0ZvckxvY2FsQW5jaG9yc0VuYWJsZWQiLz4KIDwvZW51bT4KIAogPGVudW0gbmFtZT0iRW50ZXJwcmlzZVBvbGljeUludmFsaWRhdGlvbnMiPgpAQCAtMjQ4ODIsNiArMjQ4ODcsOSBAQAogICA8aW50IHZhbHVlPSIzMDUwIiBsYWJlbD0iQVJJQUFubm90YXRpb25Sb2xlcyIvPgogICA8aW50IHZhbHVlPSIzMDUxIiBsYWJlbD0iSW50ZXJzZWN0aW9uT2JzZXJ2ZXJWMiIvPgogICA8aW50IHZhbHVlPSIzMDUyIiBsYWJlbD0iSGVhdnlBZEludGVydmVudGlvbiIvPgorICA8aW50IHZhbHVlPSIzMDUzIiBsYWJlbD0iVXNlclRpbWluZ0wzIi8+CisgIDxpbnQgdmFsdWU9IjMwNTQiIGxhYmVsPSJHZXRHYW1lcGFkc0Zyb21Dcm9zc09yaWdpblN1YmZyYW1lIi8+CisgIDxpbnQgdmFsdWU9IjMwNTUiIGxhYmVsPSJHZXRHYW1lcGFkc0Zyb21JbnNlY3VyZUNvbnRleHQiLz4KIDwvZW51bT4KIAogPGVudW0gbmFtZT0iRmVhdHVyZVBvbGljeUFsbG93bGlzdFR5cGUiPgpAQCAtMjQ4OTMsNyArMjQ5MDEsNiBAQAogICA8aW50IHZhbHVlPSI1IiBsYWJlbD0iT3JpZ2lucyIvPgogICA8aW50IHZhbHVlPSI2IiBsYWJlbD0iS2V5d29yZHNPbmx5Ii8+CiAgIDxpbnQgdmFsdWU9IjciIGxhYmVsPSJNaXhlZCIvPgotICAmZ3Q7Jmd0OyZndDsmZ3Q7Jmd0OyZndDsmZ3Q7IDlmMTcyZTQ4NmU4Y2NmZWUxZGMwYTE1YjA5MDg0NWFiYzIxZThjMjYKIDwvZW51bT4KIAogPGVudW0gbmFtZT0iRmVhdHVyZVBvbGljeUZlYXR1cmUiPgpAQCAtMzUxMTcsNiArMzUxMjQsNyBAQAogICA8aW50IHZhbHVlPSItMTg5NDY5OTA0OSIgbGFiZWw9IkF1ZGlvRm9jdXNFbmZvcmNlbWVudDpkaXNhYmxlZCIvPgogICA8aW50IHZhbHVlPSItMTg5MzY2ODQyMCIKICAgICAgIGxhYmVsPSJBdXRvZmlsbFNhdmVDcmVkaXRDYXJkVXNlc1N0cmlrZVN5c3RlbTplbmFibGVkIi8+CisgIDxpbnQgdmFsdWU9Ii0xODkzMDE5MDcxIiBsYWJlbD0iQ1NTT01WaWV3U2Nyb2xsQ29vcmRpbmF0ZXM6ZGlzYWJsZWQiLz4KICAgPGludCB2YWx1ZT0iLTE4OTI1NTUwODYiIGxhYmVsPSJkaXNhYmxlLWNvbXBvc2l0b3ItYW5pbWF0aW9uLXRpbWVsaW5lcyIvPgogICA8aW50IHZhbHVlPSItMTg5MjAwMDM3NCIgbGFiZWw9IlNlY2NvbXBTYW5kYm94QW5kcm9pZDplbmFibGVkIi8+CiAgIDxpbnQgdmFsdWU9Ii0xODkwMzc0NTY0IiBsYWJlbD0iT29iZVJlY29tbWVuZEFwcHNTY3JlZW46ZGlzYWJsZWQiLz4KQEAgLTM1ODY3LDYgKzM1ODc1LDcgQEAKICAgPGludCB2YWx1ZT0iLTk2NjI5MDQ1NiIgbGFiZWw9IldlYkF1dGhlbnRpY2F0aW9uQ3RhcDI6ZW5hYmxlZCIvPgogICA8aW50IHZhbHVlPSItOTY1ODQyMjE4IiBsYWJlbD0iTXVsdGlEZXZpY2VBcGk6ZGlzYWJsZWQiLz4KICAgPGludCB2YWx1ZT0iLTk2NDY3Njc2NSIgbGFiZWw9ImVuYWJsZS1hY2NlbGVyYXRlZC1tanBlZy1kZWNvZGUiLz4KKyAgPGludCB2YWx1ZT0iLTk2NDYyMDM3NyIgbGFiZWw9IkNTU09NVmlld1Njcm9sbENvb3JkaW5hdGVzOmVuYWJsZWQiLz4KICAgPGludCB2YWx1ZT0iLTk2MjAzMDUzNiIgbGFiZWw9IkNocm9tZUR1ZXRMYWJlbGVkOmVuYWJsZWQiLz4KICAgPGludCB2YWx1ZT0iLTk2MDA3Nzk2MyIgbGFiZWw9IkVuYWJsZUF1cmFUb29sdGlwc09uV2luZG93czplbmFibGVkIi8+CiAgIDxpbnQgdmFsdWU9Ii05NTg5NTAyMTQiIGxhYmVsPSJBbGxvd0Rpc2FibGVNb3VzZUFjY2VsZXJhdGlvbjpkaXNhYmxlZCIvPgpAQCAtMzY0ODQsNiArMzY0OTMsNyBAQAogICA8aW50IHZhbHVlPSItMTIwNTIxNDgyIiBsYWJlbD0iRGlyZWN0TWFuaXB1bGF0aW9uU3R5bHVzOmVuYWJsZWQiLz4KICAgPGludCB2YWx1ZT0iLTEyMDA5MTI4OSIgbGFiZWw9IkNyb3N0aW5pQXBwU2VhcmNoOmVuYWJsZWQiLz4KICAgPGludCB2YWx1ZT0iLTExOTA1NTY0NCIgbGFiZWw9IkdlbmVyaWNTZW5zb3I6ZW5hYmxlZCIvPgorICA8aW50IHZhbHVlPSItMTE4OTkzNDE3IiBsYWJlbD0iVExTMTNIYXJkZW5pbmdGb3JMb2NhbEFuY2hvcnM6ZGlzYWJsZWQiLz4KICAgPGludCB2YWx1ZT0iLTExNjY5Mjc5NyIgbGFiZWw9IkhUVFBBdXRoQ29tbWl0dGVkSW50ZXJzdGl0aWFsczplbmFibGVkIi8+CiAgIDxpbnQgdmFsdWU9Ii0xMTU4MzQzNzciIGxhYmVsPSJFbmFibGVVbmlmaWVkTXVsdGlEZXZpY2VTZXR1cDpkaXNhYmxlZCIvPgogICA8aW50IHZhbHVlPSItMTE0ODA3NjA4IiBsYWJlbD0iVGVybWluYWxTeXN0ZW1BcHA6ZGlzYWJsZWQiLz4KQEAgLTM3MDgzLDYgKzM3MDkzLDcgQEAKICAgICAgIGxhYmVsPSJlbmFibGUtZnVsbHNjcmVlbi1oYW5kd3JpdGluZy12aXJ0dWFsLWtleWJvYXJkOmRpc2FibGVkIi8+CiAgIDxpbnQgdmFsdWU9IjY4MTYyMjg4NSIgbGFiZWw9IkZ1bGxzY3JlZW5FeGl0VUk6ZW5hYmxlZCIvPgogICA8aW50IHZhbHVlPSI2ODI1NDkyMTIiIGxhYmVsPSJhc2gtZW5hYmxlLWN1cnNvci1tb3Rpb24tYmx1ciIvPgorICA8aW50IHZhbHVlPSI2ODMwMTMyMTciIGxhYmVsPSJBbGxvd1BvcHVwc0R1cmluZ1BhZ2VVbmxvYWQ6ZGlzYWJsZWQiLz4KICAgPGludCB2YWx1ZT0iNjg0ODA2NjI4IiBsYWJlbD0iVHJhbnNsYXRlTGFuZ3VhZ2VCeVVMUDpkaXNhYmxlZCIvPgogICA8aW50IHZhbHVlPSI2ODU5MTYyODMiIGxhYmVsPSJlbmFibGUtemlwLWFyY2hpdmVyLW9uLWZpbGUtbWFuYWdlciIvPgogICA8aW50IHZhbHVlPSI2ODc4MzgxMzUiIGxhYmVsPSJUaGlyZFBhcnR5RG9vZGxlczpkaXNhYmxlZCIvPgpAQCAtMzczMTcsNiArMzczMjgsNyBAQAogICA8aW50IHZhbHVlPSIxMDIyNDI0MzA4IiBsYWJlbD0iU2lnbmVkRXhjaGFuZ2VTdWJyZXNvdXJjZVByZWZldGNoOmVuYWJsZWQiLz4KICAgPGludCB2YWx1ZT0iMTAyMjk5MjcwMSIgbGFiZWw9ImVuYWJsZS1vcmlnaW4tY2hpcC1hbHdheXMiLz4KICAgPGludCB2YWx1ZT0iMTAyNDU2MDU2MyIgbGFiZWw9IkVuYWJsZUZ1enp5QXBwU2VhcmNoOmVuYWJsZWQiLz4KKyAgPGludCB2YWx1ZT0iMTAyNjk4MTU3OSIgbGFiZWw9IlRMUzEzSGFyZGVuaW5nRm9yTG9jYWxBbmNob3JzOmVuYWJsZWQiLz4KICAgPGludCB2YWx1ZT0iMTAyNzI1MjkyNiIgbGFiZWw9IlN5bmNTdXBwb3J0U2Vjb25kYXJ5QWNjb3VudDplbmFibGVkIi8+CiAgIDxpbnQgdmFsdWU9IjEwMzMxNDgyODciIGxhYmVsPSJOVFBTaG9ydGN1dHM6ZGlzYWJsZWQiLz4KICAgPGludCB2YWx1ZT0iMTAzMzQxMjE2MyIgbGFiZWw9Ik9tbmlib3hEaXNwbGF5VGl0bGVGb3JDdXJyZW50VXJsOmVuYWJsZWQiLz4KQEAgLTM4MTA1LDYgKzM4MTE3LDcgQEAKICAgPGludCB2YWx1ZT0iMjA0NzY5NTY1MiIgbGFiZWw9IkRlbGVnYXRlT3ZlcnNjcm9sbFN3aXBlczplbmFibGVkIi8+CiAgIDxpbnQgdmFsdWU9IjIwNDc5ODE3MDMiIGxhYmVsPSJJbnRlbnRQaWNrZXI6ZW5hYmxlZCIvPgogICA8aW50IHZhbHVlPSIyMDQ5NDMyNzQ1IiBsYWJlbD0iVmFhcGlXZWJQSW1hZ2VEZWNvZGVBY2NlbGVyYXRpb246ZW5hYmxlZCIvPgorICA8aW50IHZhbHVlPSIyMDUwOTg1ODA3IiBsYWJlbD0iQWxsb3dQb3B1cHNEdXJpbmdQYWdlVW5sb2FkOmVuYWJsZWQiLz4KICAgPGludCB2YWx1ZT0iMjA1MTQwMzI5NyIgbGFiZWw9IlNob3dCbHVldG9vdGhEZXZpY2VCYXR0ZXJ5OmRpc2FibGVkIi8+CiAgIDxpbnQgdmFsdWU9IjIwNTMyNzMyNTYiIGxhYmVsPSJCdW5kbGVkSFRUUEV4Y2hhbmdlczpkaXNhYmxlZCIvPgogICA8aW50IHZhbHVlPSIyMDU2NTcyMDIwIiBsYWJlbD0iRW5hYmxlVXNlcm5hbWVDb3JyZWN0aW9uOmRpc2FibGVkIi8+CkBAIC0zODg4MSw2ICszODg5NCwxMSBAQAogICA8L2ludD4KIDwvZW51bT4KIAorPGVudW0gbmFtZT0iTWFuYWdlZFVzZXJVUkxSZXF1ZXN0UGVybWlzc2lvblNvdXJjZSI+CisgIDxpbnQgdmFsdWU9IjAiIGxhYmVsPSJNQUlOX0ZSQU1FIj5SZXF1ZXN0IHdhcyBtYWRlIGZyb20gbWFpbiBmcmFtZTwvaW50PgorICA8aW50IHZhbHVlPSIxIiBsYWJlbD0iU1VCX0ZSQU1FIj5SZXF1ZXN0IHdhcyBtYWRlIGZyb20gc3ViZnJhbWU8L2ludD4KKzwvZW51bT4KKwogPGVudW0gbmFtZT0iTWFuYWdlUGFzc3dvcmRzUmVmZXJyZXIiPgogICA8aW50IHZhbHVlPSIwIiBsYWJlbD0iQ2hyb21lIFNldHRpbmdzIi8+CiAgIDxpbnQgdmFsdWU9IjEiIGxhYmVsPSJNYW5hZ2UgUGFzc3dvcmRzIEJ1YmJsZSIvPgpkaWZmIC0tZ2l0IGEvdG9vbHMvbWV0cmljcy9oaXN0b2dyYW1zL2hpc3RvZ3JhbXMueG1sIGIvdG9vbHMvbWV0cmljcy9oaXN0b2dyYW1zL2hpc3RvZ3JhbXMueG1sCmluZGV4IGU4NGI1OTcuLmRmYzY2YWVhIDEwMDY0NAotLS0gYS90b29scy9tZXRyaWNzL2hpc3RvZ3JhbXMvaGlzdG9ncmFtcy54bWwKKysrIGIvdG9vbHMvbWV0cmljcy9oaXN0b2dyYW1zL2hpc3RvZ3JhbXMueG1sCkBAIC02Njc0LDYgKzY2NzQsMTYgQEAKICAgPC9zdW1tYXJ5PgogPC9oaXN0b2dyYW0+CiAKKzxoaXN0b2dyYW0gbmFtZT0iQXJjLlBsYXlTdG9yZUxhdW5jaC5UaW1lRGVsdGEiIHVuaXRzPSJtcyIKKyAgICBleHBpcmVzX2FmdGVyPSIyMDIxLTExLTAxIj4KKyAgPG93bmVyPmtobWVsQGdvb2dsZS5jb208L293bmVyPgorICA8b3duZXI+eXVzdWtlc0Bnb29nbGUuY29tPC9vd25lcj4KKyAgPHN1bW1hcnk+CisgICAgRWxhcHNlZCB0aW1lIGZyb20gdGhlIHdoZW4gdGhlIHVzZXIgbGF1bmNoZXMgdGhlIFBsYXkgU3RvcmUgYXBwIGFuZCB0byB3aGVuCisgICAgdGhlIFBsYXkgU3RvcmUgd2luZG93IGlzIHNob3duIHRvIHRoZSB1c2VyLgorICA8L3N1bW1hcnk+Cis8L2hpc3RvZ3JhbT4KKwogPGhpc3RvZ3JhbSBuYW1lPSJBcmMuUGxheVN0b3JlU2VhcmNoLlF1ZXJ5VGltZSIgdW5pdHM9Im1zIgogICAgIGV4cGlyZXNfYWZ0ZXI9IjIwMjAtMDMtMjIiPgogICA8b3duZXI+aGVqcUBjaHJvbWl1bS5vcmc8L293bmVyPgpAQCAtNjcwNyw3ICs2NzE3LDcgQEAKICAgPC9zdW1tYXJ5PgogPC9oaXN0b2dyYW0+CiAKLTxoaXN0b2dyYW0gbmFtZT0iQXJjLlBsYXlTdG9yZVNob3duLlRpbWVEZWx0YSIgdW5pdHM9Im1zIiBleHBpcmVzX2FmdGVyPSJNODEiPgorPGhpc3RvZ3JhbSBuYW1lPSJBcmMuUGxheVN0b3JlU2hvd24uVGltZURlbHRhIiB1bml0cz0ibXMiIGV4cGlyZXNfYWZ0ZXI9Ik04MiI+CiA8IS0tIE5hbWUgY29tcGxldGVkIGJ5IGhpc3RvZ3JhbV9zdWZmaXhlcyBuYW1lPSJBcmNVc2VyVHlwZXMiIC0tPgogCiAgIDxvd25lcj55dXN1a2VzQGdvb2dsZS5jb208L293bmVyPgpAQCAtNjg5OCw2ICs2OTA4LDQyIEBACiAgIDxzdW1tYXJ5PkFjdGlvbiBvZiBBUkMrKyBHcmFwaGljcyBUcmFjaW5nIHRvb2wuPC9zdW1tYXJ5PgogPC9oaXN0b2dyYW0+CiAKKzxoaXN0b2dyYW0gbmFtZT0iQXJjLlVpQXZhaWxhYmxlLkFscmVhZHlQcm92aXNpb25lZC5UaW1lRGVsdGEiIHVuaXRzPSJtcyIKKyAgICBleHBpcmVzX2FmdGVyPSIyMDIxLTExLTAxIj4KKzwhLS0gTmFtZSBjb21wbGV0ZWQgYnkgaGlzdG9ncmFtX3N1ZmZpeGVzIG5hbWU9IkFyY1VzZXJUeXBlcyIgLS0+CisKKyAgPG93bmVyPmtobWVsQGdvb2dsZS5jb208L293bmVyPgorICA8b3duZXI+eXVzdWtlc0Bnb29nbGUuY29tPC9vd25lcj4KKyAgPHN1bW1hcnk+CisgICAgRWxhcHNlZCB0aW1lIGZyb20gdGhlIHdoZW4gQVJDKysgaXMgc3RhcnRlZCBpbiBhbHJlYWR5IHByb3Zpc2lvbmVkIHN0YXRlIHRvCisgICAgd2hlbiB0aGUgQVJDIGlzIGF2YWlsYWJsZSBmb3IgdGhlIHVzZXIuCisgIDwvc3VtbWFyeT4KKzwvaGlzdG9ncmFtPgorCis8aGlzdG9ncmFtIG5hbWU9IkFyYy5VaUF2YWlsYWJsZS5JblNlc3Npb25Qcm92aXNpb25pbmcuVGltZURlbHRhIiB1bml0cz0ibXMiCisgICAgZXhwaXJlc19hZnRlcj0iMjAyMS0xMS0wMSI+Cis8IS0tIE5hbWUgY29tcGxldGVkIGJ5IGhpc3RvZ3JhbV9zdWZmaXhlcyBuYW1lPSJBcmNVc2VyVHlwZXMiIC0tPgorCisgIDxvd25lcj5raG1lbEBnb29nbGUuY29tPC9vd25lcj4KKyAgPG93bmVyPnl1c3VrZXNAZ29vZ2xlLmNvbTwvb3duZXI+CisgIDxzdW1tYXJ5PgorICAgIEVsYXBzZWQgdGltZSBmcm9tIHRoZSB3aGVuIEFSQysrIGlzIG9wdGVkIGluIGZyb20gdGhlIHVzZXIncyBzZXNzaW9uIHRvIHdoZW4KKyAgICB0aGUgQVJDIGlzIGF2YWlsYWJsZSBmb3IgdGhlIHVzZXIuCisgIDwvc3VtbWFyeT4KKzwvaGlzdG9ncmFtPgorCis8aGlzdG9ncmFtIG5hbWU9IkFyYy5VaUF2YWlsYWJsZS5Pb2JlUHJvdmlzaW9uaW5nLlRpbWVEZWx0YSIgdW5pdHM9Im1zIgorICAgIGV4cGlyZXNfYWZ0ZXI9IjIwMjEtMTEtMDEiPgorPCEtLSBOYW1lIGNvbXBsZXRlZCBieSBoaXN0b2dyYW1fc3VmZml4ZXMgbmFtZT0iQXJjVXNlclR5cGVzIiAtLT4KKworICA8b3duZXI+a2htZWxAZ29vZ2xlLmNvbTwvb3duZXI+CisgIDxvd25lcj55dXN1a2VzQGdvb2dsZS5jb208L293bmVyPgorICA8c3VtbWFyeT4KKyAgICBFbGFwc2VkIHRpbWUgZnJvbSB0aGUgd2hlbiBBUkMrKyBpcyBvcHRlZCBpbiBmcm9tIE9PQkUgdG8gd2hlbiB0aGUgQVJDIGlzCisgICAgYXZhaWxhYmxlIGZvciB0aGUgdXNlci4KKyAgPC9zdW1tYXJ5PgorPC9oaXN0b2dyYW0+CisKIDxoaXN0b2dyYW0gbmFtZT0iQXJjLlVzZXJJbnRlcmFjdGlvbiIgZW51bT0iQXJjVXNlckludGVyYWN0aW9uIgogICAgIGV4cGlyZXNfYWZ0ZXI9IjIwMjAtMDMtMjkiPgogICA8b3duZXI+amhvcndpY2hAY2hyb21pdW0ub3JnPC9vd25lcj4KQEAgLTY5MjUsNyArNjk3MSw4IEBACiAgIDwvc3VtbWFyeT4KIDwvaGlzdG9ncmFtPgogCi08aGlzdG9ncmFtIG5hbWU9IkFyY0F1dGguQ2hlY2tpbkF0dGVtcHRzIiB1bml0cz0iYXR0ZW1wdHMiIGV4cGlyZXNfYWZ0ZXI9Ik04MSI+Cis8aGlzdG9ncmFtIG5hbWU9IkFyY0F1dGguQ2hlY2tpbkF0dGVtcHRzIiB1bml0cz0iYXR0ZW1wdHMiCisgICAgZXhwaXJlc19hZnRlcj0iMjAyMS0xMS0wMSI+CiAgIDxvd25lcj5lbGlqYWh0YXlsb3JAY2hyb21pdW0ub3JnPC9vd25lcj4KICAgPHN1bW1hcnk+CiAgICAgTnVtYmVyIG9mIGF0dGVtcHRzIGRvbmUgd2hpbGUgd2FpdGluZyBmb3IgdGhlIGNoZWNrLWluIHRhc2sgdG8gYmUgY29tcGxldGVkLgpAQCAtNjkzNCw3ICs2OTgxLDcgQEAKICAgPC9zdW1tYXJ5PgogPC9oaXN0b2dyYW0+CiAKLTxoaXN0b2dyYW0gbmFtZT0iQXJjQXV0aC5DaGVja2luVGltZSIgdW5pdHM9Im1zIiBleHBpcmVzX2FmdGVyPSIyMDIwLTAzLTA4Ij4KKzxoaXN0b2dyYW0gbmFtZT0iQXJjQXV0aC5DaGVja2luVGltZSIgdW5pdHM9Im1zIiBleHBpcmVzX2FmdGVyPSIyMDIxLTExLTAxIj4KICAgPG93bmVyPmVsaWphaHRheWxvckBjaHJvbWl1bS5vcmc8L293bmVyPgogICA8c3VtbWFyeT4KICAgICBFbGFwc2VkIHRpbWUgd2FpdGluZyBmb3IgdGhlIGNoZWNrLWluIHRhc2sgdG8gYmUgY29tcGxldGVkLiBUaGlzIGlzIHJlY29yZGVkCkBAIC02OTUwLDcgKzY5OTcsNyBAQAogICA8L3N1bW1hcnk+CiA8L2hpc3RvZ3JhbT4KIAotPGhpc3RvZ3JhbSBuYW1lPSJBcmNBdXRoLlNpZ25JblRpbWUiIHVuaXRzPSJtcyIgZXhwaXJlc19hZnRlcj0iTTc3Ij4KKzxoaXN0b2dyYW0gbmFtZT0iQXJjQXV0aC5TaWduSW5UaW1lIiB1bml0cz0ibXMiIGV4cGlyZXNfYWZ0ZXI9IjIwMjEtMTEtMDEiPgogICA8b3duZXI+ZWxpamFodGF5bG9yQGNocm9taXVtLm9yZzwvb3duZXI+CiAgIDxzdW1tYXJ5PkVsYXBzZWQgdGltZSB3YWl0aW5nIGZvciBHTVMgc2lnbi1pbiB0byBjb21wbGV0ZS48L3N1bW1hcnk+CiA8L2hpc3RvZ3JhbT4KQEAgLTg1NzcsNyArODYyNCw3IEBACiA8L2hpc3RvZ3JhbT4KIAogPGhpc3RvZ3JhbSBuYW1lPSJBc3Npc3RhbnQuRXhpdFBvaW50IiBlbnVtPSJBc3Npc3RhbnRFeGl0UG9pbnQiCi0gICAgZXhwaXJlc19hZnRlcj0iMjAxOS0xMS0xOSI+CisgICAgZXhwaXJlc19hZnRlcj0iMjAyMC0xMS0xOSI+CiAgIDxvd25lcj54aWFvaHVpY0BjaHJvbWl1bS5vcmc8L293bmVyPgogICA8b3duZXI+bWVpbGlud0BjaHJvbWl1bS5vcmc8L293bmVyPgogICA8c3VtbWFyeT4KQEAgLTEwNDY3LDYgKzEwNTE0LDIzIEBACiAgIDwvc3VtbWFyeT4KIDwvaGlzdG9ncmFtPgogCis8aGlzdG9ncmFtIG5hbWU9IkF1dG9maWxsLkJldHRlckF1dGguQ2FyZFVubWFza1ByZWZsaWdodENhbGxlZCIKKyAgICBlbnVtPSJCb29sZWFuSGl0IiBleHBpcmVzX2FmdGVyPSIyMDIwLTEyLTE1Ij4KKyAgPG93bmVyPmpzYXVsQGdvb2dsZS5jb208L293bmVyPgorICA8b3duZXI+bWFuYXN2ZXJtYUBnb29nbGUuY29tPC9vd25lcj4KKyAgPG93bmVyPmF1dG9maWxsLWF1dGgtdGVhbUBnb29nbGUuY29tPC9vd25lcj4KKyAgPHN1bW1hcnk+CisgICAgVHJhY2tzIHRoZSBudW1iZXIgb2YgdGltZXMgQ2hyb21lIG1hZGUgYSBHZXREZXRhaWxzRm9yR2V0UmVhbFBhbiBjYWxsLiBBCisgICAgcHJlZmxpZ2h0IGNhbGwgaXMgb25seSBtYWRlIHdoZW4gY2FyZCBzdWdnZXN0aW9ucyBhcmUgc2hvd24sIGFuZCBjYW4gb25seQorICAgIGhhcHBlbiB3aGVuIHRoZSB1c2VyIGhhcyBzZXJ2ZXIgY2FyZHMgYW5kIGlzIGVsaWdpYmxlIGZvciBXZWJBdXRobi4KKworICAgIEFzIGEgcGVyY2VudGFnZSBvZiB0aGUgbnVtYmVyIG9mIHRpbWVzIGNhcmQgc3VnZ2VzdGlvbnMgYXJlIHNob3duLCB3aGljaCBpcworICAgIHRyYWNrZWQgdW5kZXIgQXV0b2ZpbGwuRm9ybUV2ZW50cy5DcmVkaXRDYXJkLCB0aGlzIG1ldHJpYyBwcm92aWRlcyBhbgorICAgIGVzdGltYXRlIGZvciB0aGUgcG90ZW50aWFsIHJlYWNoIGZvciB0aGUgQXV0b2ZpbGwgQmV0dGVyIEF1dGggcHJvamVjdC4KKyAgICBNb3Jlb3ZlciwgdGhpcyBhY3RzIGFzIGEgYmFzZWxpbmUgdmFsdWUgZm9yIG90aGVyIG1ldHJpY3MgaW4gdGhpcyBwcm9qZWN0LgorICA8L3N1bW1hcnk+Cis8L2hpc3RvZ3JhbT4KKwogPGhpc3RvZ3JhbSBuYW1lPSJBdXRvZmlsbC5DYW5Mb2dVS00iIGVudW09IkJvb2xlYW5FbmFibGVkIiBleHBpcmVzX2FmdGVyPSJNNzgiPgogICA8b3duZXI+ZGxrdW1hckBnb29nbGUuY29tPC9vd25lcj4KICAgPG93bmVyPmNocm9tZS1hdXRvZmlsbEBnb29nbGUuY29tPC9vd25lcj4KQEAgLTEzMDEzLDYgKzEzMDc3LDE3IEBACiAgIDwvc3VtbWFyeT4KIDwvaGlzdG9ncmFtPgogCis8aGlzdG9ncmFtIGJhc2U9InRydWUiCisgICAgbmFtZT0iQXZhaWxhYmlsaXR5LlByb2Jlci5EaWRTdWNjZWVkLkFmdGVyUmVwb3J0ZWRGYWlsdXJlIgorICAgIGVudW09IkJvb2xlYW5TdWNjZXNzIiBleHBpcmVzX2FmdGVyPSIyMDIwLTA4LTAxIj4KKyAgPG93bmVyPnJvYmVydG9nZGVuQGNocm9taXVtLm9yZzwvb3duZXI+CisgIDxvd25lcj50YmFuc2FsQGNocm9taXVtLm9yZzwvb3duZXI+CisgIDxzdW1tYXJ5PgorICAgIFJlY29yZHMgdGhlIGNvbXBsZXRpb24gc3RhdHVzIG9mIGEgcHJvYmUgcmV0cnkgYWZ0ZXIgYW4gZXh0ZXJuYWxseSByZXBvcnRlZAorICAgIGZhaWx1cmUuCisgIDwvc3VtbWFyeT4KKzwvaGlzdG9ncmFtPgorCiA8aGlzdG9ncmFtIGJhc2U9InRydWUiIG5hbWU9IkF2YWlsYWJpbGl0eS5Qcm9iZXIuRmluYWxTdGF0ZSIKICAgICBlbnVtPSJCb29sZWFuU3VjY2VzcyIgZXhwaXJlc19hZnRlcj0iMjAyMC0wOC0wMSI+CiAgIDxvd25lcj5yb2JlcnRvZ2RlbkBjaHJvbWl1bS5vcmc8L293bmVyPgpAQCAtMjExODMsNiArMjEyNTgsMTcgQEAKICAgPC9zdW1tYXJ5PgogPC9oaXN0b2dyYW0+CiAKKzxoaXN0b2dyYW0gbmFtZT0iQ2xpcGJvYXJkLlJlZ2lzdGVyQ2xpcGJvYXJkRm9ybWF0RmFpbHVyZSIgdW5pdHM9ImNvdW50IgorICAgIGV4cGlyZXNfYWZ0ZXI9IjIwMjEtMDEtMDEiPgorICA8b3duZXI+aHVhbmdkYXJ3aW5AY2hyb21pdW0ub3JnPC9vd25lcj4KKyAgPG93bmVyPnNyYy91aS9iYXNlL2NsaXBib2FyZC9PV05FUlM8L293bmVyPgorICA8c3VtbWFyeT4KKyAgICBDb3VudHMgaG93IG9mdGVuIHRoZSBXaW5kb3dzIGNsaXBib2FyZCBmYWlscyB0byByZWdpc3RlciBhIGZvcm1hdC4gUmVjb3JkZWQKKyAgICB3aGVuIFJlZ2lzdGVyQ2xpcGJhb3JkRm9ybWF0IGZhaWxzIChyZXR1cm5zIDApLiBGYWlsdXJlIHJhdGVzIHdpbGwgaW5mb3JtCisgICAgd2hldGhlciB3ZSBpbXBsZW1lbnQgZXJyb3IgaGFuZGxpbmcuIGh0dHBzOi8vY3JidWcuY29tLzEwMDA5MTkKKyAgPC9zdW1tYXJ5PgorPC9oaXN0b2dyYW0+CisKIDxoaXN0b2dyYW0gbmFtZT0iQ2xpcGJvYXJkLlgxMVN0b3JlQ29weVBhc3RlRHVyYXRpb24iIHVuaXRzPSJtcyI+CiAgIDxvd25lcj5wa290d2ljekBjaHJvbWl1bS5vcmc8L293bmVyPgogICA8c3VtbWFyeT4KQEAgLTU5MTcwLDYgKzU5MjU2LDI2IEBACiAgIDwvc3VtbWFyeT4KIDwvaGlzdG9ncmFtPgogCis8aGlzdG9ncmFtIG5hbWU9Ik1hbmFnZWRVc2Vycy5CbG9ja2VkRnJhbWVEZXB0aCIgdW5pdHM9ImRlcHRoIgorICAgIGV4cGlyZXNfYWZ0ZXI9Ik04NSI+CisgIDxvd25lcj55aWxrYWxAY2hyb21pdW0ub3JnPC9vd25lcj4KKyAgPG93bmVyPm1pY2hhZWxwZ0BjaHJvbWl1bS5vcmc8L293bmVyPgorICA8c3VtbWFyeT4KKyAgICBUaGUgZGVwdGggb2YgYmxvY2tlZCBmcmFtZSBpbiB0aGUgZnJhbWUgdHJlZS4gVGhlIHZhbHVlIGlzIHJlY29yZGVkIHdoZW4gdGhlCisgICAgcmVuZGVyZXIgZnJhbWUgaG9zdGluZyB0aGUgYmxvY2tpbmcgcGFnZSBmaW5pc2hlcyBsb2FkaW5nLgorICA8L3N1bW1hcnk+Cis8L2hpc3RvZ3JhbT4KKworPGhpc3RvZ3JhbSBuYW1lPSJNYW5hZ2VkVXNlcnMuQmxvY2tlZElmcmFtZUNvdW50IiB1bml0cz0iaWZyYW1lcyIKKyAgICBleHBpcmVzX2FmdGVyPSJNODUiPgorICA8b3duZXI+eWlsa2FsQGNocm9taXVtLm9yZzwvb3duZXI+CisgIDxvd25lcj5taWNoYWVscGdAY2hyb21pdW0ub3JnPC9vd25lcj4KKyAgPHN1bW1hcnk+CisgICAgVGhlIG51bWJlciBvZiBibG9ja2VkIGlmcmFtZXMgcGVyIHVuYmxvY2tlZCBtYWluIGZyYW1lIGxvYWQuIFRoZSB2YWx1ZSBpcworICAgIHJlY29yZGVkIHdoZW4gdGhlIG1haW4gZnJhbWUgZmluaXNoZXMgbG9hZGluZy4KKyAgPC9zdW1tYXJ5PgorPC9oaXN0b2dyYW0+CisKIDxoaXN0b2dyYW0gbmFtZT0iTWFuYWdlZFVzZXJzLkNocm9tZU9TLlBhc3N3b3JkQ2hhbmdlIgogICAgIGVudW09Ik1hbmFnZWRVc2VyUGFzc3dvcmRDaGFuZ2UiIGV4cGlyZXNfYWZ0ZXI9Ik03NyI+CiAgIDxvd25lcj5hY2h1aXRoQGNocm9taXVtLm9yZzwvb3duZXI+CkBAIC01OTIyNyw2ICs1OTMzMywxNSBAQAogICA8L3N1bW1hcnk+CiA8L2hpc3RvZ3JhbT4KIAorPGhpc3RvZ3JhbSBuYW1lPSJNYW5hZ2VkVXNlcnMuUmVxdWVzdFBlcm1pc3Npb25Tb3VyY2UiCisgICAgZW51bT0iTWFuYWdlZFVzZXJVUkxSZXF1ZXN0UGVybWlzc2lvblNvdXJjZSIgZXhwaXJlc19hZnRlcj0iTTg1Ij4KKyAgPG93bmVyPm1pY2hhZWxwZ0BjaHJvbWl1bS5vcmc8L293bmVyPgorICA8b3duZXI+eWlsa2FsQGNocm9taXVtLm9yZzwvb3duZXI+CisgIDxzdW1tYXJ5PgorICAgIFRoZSBjb3VudHMgb2YgcmVxdWVzdCBmb3IgcGVybWlzc2lvbiBzZW50IGZyb20gbWFpbiBmcmFtZSBvciBzdWItZnJhbWUuCisgIDwvc3VtbWFyeT4KKzwvaGlzdG9ncmFtPgorCiA8aGlzdG9ncmFtIG5hbWU9Ik1hbmFnZWRVc2Vycy5TYWZlU2l0ZXNEZWxheSIgdW5pdHM9Im1zIj4KICAgPG93bmVyPnRyZWliQGNocm9taXVtLm9yZzwvb3duZXI+CiAgIDxvd25lcj5lc2NvcmRlaXJvQGNocm9taXVtLm9yZzwvb3duZXI+CkBAIC04MDYwNSw2ICs4MDcyMCw0NiBAQAogICA8L3N1bW1hcnk+CiA8L2hpc3RvZ3JhbT4KIAorPGhpc3RvZ3JhbSBuYW1lPSJOZXQuUXVpY1Nlc3Npb24uUmVjZWl2ZWRTZXR0aW5ncy5CbG9ja2VkU3RyZWFtcyIgdW5pdHM9InVuaXRzIgorICAgIGV4cGlyZXNfYWZ0ZXI9IjIwMjAtMTAtMDkiPgorICA8b3duZXI+Ym5jQGNocm9taXVtLm9yZzwvb3duZXI+CisgIDxvd25lcj5zcmMvbmV0L3F1aWMvT1dORVJTPC9vd25lcj4KKyAgPHN1bW1hcnk+CisgICAgVGhlIHZhbHVlIG9mIHRoZSBTRVRUSU5HU19RUEFDS19CTE9DS0VEX1NUUkVBTVMgcGFyYW1ldGVyIHJlY2VpdmVkIG9uIGFuCisgICAgSFRUUC8zIGNvbm5lY3Rpb24sIGlmIGFueS4KKyAgPC9zdW1tYXJ5PgorPC9oaXN0b2dyYW0+CisKKzxoaXN0b2dyYW0gbmFtZT0iTmV0LlF1aWNTZXNzaW9uLlJlY2VpdmVkU2V0dGluZ3MuQ291bnRQbHVzT25lIiB1bml0cz0idW5pdHMiCisgICAgZXhwaXJlc19hZnRlcj0iMjAyMC0xMC0wOSI+CisgIDxvd25lcj5ibmNAY2hyb21pdW0ub3JnPC9vd25lcj4KKyAgPG93bmVyPnNyYy9uZXQvcXVpYy9PV05FUlM8L293bmVyPgorICA8c3VtbWFyeT4KKyAgICBUaGUgbnVtYmVyIG9mIFNFVFRJTkdTIHBhcmFtZXRlcnMgcmVjZWl2ZWQgb24gYW4gSFRUUC8zIGNvbm5lY3Rpb24sCisgICAgaW5jcmVtZW50ZWQgYnkgb25lICh0aGUgU0VUVElOR1MgZnJhbWUgY2FuIGJlIGVtcHR5KS4KKyAgPC9zdW1tYXJ5PgorPC9oaXN0b2dyYW0+CisKKzxoaXN0b2dyYW0gbmFtZT0iTmV0LlF1aWNTZXNzaW9uLlJlY2VpdmVkU2V0dGluZ3MuTWF4SGVhZGVyTGlzdFNpemUiCisgICAgdW5pdHM9ImJ5dGVzIiBleHBpcmVzX2FmdGVyPSIyMDIwLTEwLTA5Ij4KKyAgPG93bmVyPmJuY0BjaHJvbWl1bS5vcmc8L293bmVyPgorICA8b3duZXI+c3JjL25ldC9xdWljL09XTkVSUzwvb3duZXI+CisgIDxzdW1tYXJ5PgorICAgIFRoZSB2YWx1ZSBvZiB0aGUgU0VUVElOR1NfTUFYX0hFQURFUl9MSVNUX1NJWkUgcGFyYW1ldGVyIHJlY2VpdmVkIG9uIGFuCisgICAgSFRUUC8zIGNvbm5lY3Rpb24sIGlmIGFueS4KKyAgPC9zdW1tYXJ5PgorPC9oaXN0b2dyYW0+CisKKzxoaXN0b2dyYW0gbmFtZT0iTmV0LlF1aWNTZXNzaW9uLlJlY2VpdmVkU2V0dGluZ3MuTWF4VGFibGVDYXBhY2l0eSIKKyAgICB1bml0cz0iYnl0ZXMiIGV4cGlyZXNfYWZ0ZXI9IjIwMjAtMTAtMDkiPgorICA8b3duZXI+Ym5jQGNocm9taXVtLm9yZzwvb3duZXI+CisgIDxvd25lcj5zcmMvbmV0L3F1aWMvT1dORVJTPC9vd25lcj4KKyAgPHN1bW1hcnk+CisgICAgVGhlIHZhbHVlIG9mIHRoZSBTRVRUSU5HU19RUEFDS19NQVhfVEFCTEVfQ0FQQUNJVFkgcGFyYW1ldGVyIHJlY2VpdmVkIG9uIGFuCisgICAgSFRUUC8zIGNvbm5lY3Rpb24sIGlmIGFueS4KKyAgPC9zdW1tYXJ5PgorPC9oaXN0b2dyYW0+CisKIDxoaXN0b2dyYW0gbmFtZT0iTmV0LlF1aWNTZXNzaW9uLlJlamVjdEhhc1Byb29mIiBlbnVtPSJCb29sZWFuIgogICAgIGV4cGlyZXNfYWZ0ZXI9IjIwMTgtMDgtMzAiPgogICA8b3duZXI+cmNoQGNocm9taXVtLm9yZzwvb3duZXI+CkBAIC05NjUzOCwxMCArOTY2OTMsMTEgQEAKICAgPHN1bW1hcnk+CiAgICAgT25seSByZWNvcmRlZCBpZiB0aGUgcGFnZSBoYXMgYXQgbGVhc3Qgb25lIGlkZW50aWZpZWQgYWQgZnJhbWUuIFJlY29yZGVkIGluCiAgICAgUGFnZUxvYWRNZXRyaWNzIHdoZW4gdGhlIHBhZ2UgaXMgZGVzdHJveWVkLiBCeXRlcyBpbmNsdWRlIGFsbCBieXRlcyB1c2VkIGJ5Ci0gICAgdGhlIG5ldHdvcmsgdG8gbG9hZCBhIHJlc291cmNlIGFuZCByZXNwb25zZSBib2R5IGJ5dGVzIGZvciBjYWNoZWQgcmVzb3VyY2VzLgotICAgIEFuIGFkIGZyYW1lIGNvbnNpc3RzIG9mIHRoZSBpZGVudGlmaWVkIGFkIGZyYW1lIGFuZCBhbGwgb2YgaXRzIGNoaWxkcmVuCi0gICAgKHdoaWNoIG1heSBhbHNvIGJlIGFkcywgYnV0IGFyZSBjb3VudGVkIGFzIHBhcnQgb2YgdGhlIGFuY2VzdG9yIGFkIGZyYW1lKS4KLSAgICBJbmNsdWRlcyByZXNvdXJjZXMgdGhhdCBkaWQgbm90IGZpbmlzaCBsb2FkaW5nLgorICAgIHRoZSBuZXR3b3JrIHRvIGxvYWQgYSByZXNvdXJjZSBhbmQgcmVzcG9uc2UgYm9keSBieXRlcyBmb3IgY2FjaGVkIHJlc291cmNlcworICAgIChmcm9tIGJvdGggdGhlIEhUVFAgYW5kIG1lbW9yeSBjYWNoZXMpLiBBbiBhZCBmcmFtZSBjb25zaXN0cyBvZiB0aGUKKyAgICBpZGVudGlmaWVkIGFkIGZyYW1lIGFuZCBhbGwgb2YgaXRzIGNoaWxkcmVuICh3aGljaCBtYXkgYWxzbyBiZSBhZHMsIGJ1dCBhcmUKKyAgICBjb3VudGVkIGFzIHBhcnQgb2YgdGhlIGFuY2VzdG9yIGFkIGZyYW1lKS4gSW5jbHVkZXMgcmVzb3VyY2VzIHRoYXQgZGlkIG5vdAorICAgIGZpbmlzaCBsb2FkaW5nLgogICA8L3N1bW1hcnk+CiA8L2hpc3RvZ3JhbT4KIApAQCAtMTEzNTk2LDYgKzExMzc1MiwxOCBAQAogICA8L3N1bW1hcnk+CiA8L2hpc3RvZ3JhbT4KIAorPGhpc3RvZ3JhbSBuYW1lPSJQcm9maWxlLk1lbnUuT3BlbmVkQWZ0ZXJBdmF0YXJBbmltYXRpb24iIHVuaXRzPSJtcyIKKyAgICBleHBpcmVzX2FmdGVyPSIyMDIwLTAzLTAxIj4KKyAgPG93bmVyPmRyb2dlckBjaHJvbWl1bS5vcmc8L293bmVyPgorICA8b3duZXI+amtyY2FsQGNocm9taXVtLm9yZzwvb3duZXI+CisgIDxzdW1tYXJ5PgorICAgIFdoZW4gdGhlIHByb2ZpbGUgbWVudSBpcyBvcGVuZWQsIGFmdGVyIHRoZSBpZGVudGl0eSBhbmltYXRpb24gd2FzIHNob3duLAorICAgIHRoaXMgcmVjb3JkcyB0aGUgdGltZSBzaW5jZSB0aGUgYW5pbWF0aW9uIHdhcyBzaG93bi4gSW4gdGhlIGNvbnRyb2wgZ3JvdXAKKyAgICBmb3IgdGhlIGlkZW50aXR5IHBpbGwgZXhwZXJpbWVudCwgdGhpcyBpcyBzdGlsbCByZWNvcmRlZCBhcyB0aGUgdGltZSBzaW5jZQorICAgIHRoZSBhbmltYXRpb24gKndvdWxkIGhhdmUgYmVlbiogc2hvd24uCisgIDwvc3VtbWFyeT4KKzwvaGlzdG9ncmFtPgorCiA8aGlzdG9ncmFtIG5hbWU9IlByb2ZpbGUuTmV0VXNlckNvdW50IiBlbnVtPSJQcm9maWxlTmV0VXNlckNvdW50IgogICAgIGV4cGlyZXNfYWZ0ZXI9IjIwMjAtMDItMTYiPgogICA8b3duZXI+cm9nZXJ0YUBjaHJvbWl1bS5vcmc8L293bmVyPgpAQCAtMTYzMzY2LDYgKzE2MzUzNCwxNyBAQAogICA8L3N1bW1hcnk+CiA8L2hpc3RvZ3JhbT4KIAorPGhpc3RvZ3JhbSBuYW1lPSJYMTEuWEludGVybkF0b21GYWlsdXJlIiB1bml0cz0iY291bnQiCisgICAgZXhwaXJlc19hZnRlcj0iMjAyMS0wMS0wMSI+CisgIDxvd25lcj5odWFuZ2RhcndpbkBjaHJvbWl1bS5vcmc8L293bmVyPgorICA8b3duZXI+c3JjL3VpL2Jhc2UvY2xpcGJvYXJkL09XTkVSUzwvb3duZXI+CisgIDxzdW1tYXJ5PgorICAgIENvdW50cyBob3cgb2Z0ZW4gdGhlIFgxMSBzZXJ2ZXIgZmFpbHMgdG8gcmVnaXN0ZXIgYW4gYXRvbS4gUmVjb3JkZWQgd2hlbgorICAgIDo6WEludGVybkF0b20gZmFpbHMgKHJldHVybnMgTm9uZSkuIEZhaWx1cmUgcmF0ZXMgd2lsbCBpbmZvcm0gd2hldGhlciB3ZQorICAgIGltcGxlbWVudCBlcnJvciBoYW5kbGluZy4gaHR0cHM6Ly9jcmJ1Zy5jb20vMTAwMDkxOQorICA8L3N1bW1hcnk+Cis8L2hpc3RvZ3JhbT4KKwogPGhpc3RvZ3JhbSBuYW1lPSJYSFIuQXN5bmMuUGFnZURpc21pc3NhbCIgZW51bT0iWEhSUGFnZURpc21pc3NhbFN0YXRlIgogICAgIGV4cGlyZXNfYWZ0ZXI9Ik04MSI+CiAgIDxvd25lcj5wYW5pY2tlckBjaHJvbWl1bS5vcmc8L293bmVyPgpAQCAtMTYzNzUwLDYgKzE2MzkyOSwxMyBAQAogICAgICAgbGFiZWw9IkluY2x1ZGVzIGFsbCByZXNvdXJjZXMgbG9hZGVkIGJ5IHRoZSBwYWdlLiIvPgogICA8c3VmZml4IG5hbWU9Ik5vbkFkRnJhbWVzLkFnZ3JlZ2F0ZS5Ub3RhbCIKICAgICAgIGxhYmVsPSJUaGUgc2l6ZSAoaW4gS0IpIG9mIGFsbCBvZiB0aGUgcGFnZSdzIHJlc291cmNlcyBleGNlcHQgZm9yIHRob3NlCisgICAgICAgICAgICAgbG9hZGVkIGluIGFkIGZyYW1lcy4iPgorICAgIDxvYnNvbGV0ZT4KKyAgICAgIERlcHJlY2F0ZWQgMDkvMjAxOS4gUmVwbGFjZWQgd2l0aCBOb25BZEZyYW1lcy5BZ2dyZWdhdGUuVG90YWwyLgorICAgIDwvb2Jzb2xldGU+CisgIDwvc3VmZml4PgorICA8c3VmZml4IG5hbWU9Ik5vbkFkRnJhbWVzLkFnZ3JlZ2F0ZS5Ub3RhbDIiCisgICAgICBsYWJlbD0iVGhlIHNpemUgKGluIEtCKSBvZiBhbGwgb2YgdGhlIHBhZ2UncyByZXNvdXJjZXMgZXhjZXB0IGZvciB0aG9zZQogICAgICAgICAgICAgIGxvYWRlZCBpbiBhZCBmcmFtZXMuIi8+CiAgIDxhZmZlY3RlZC1oaXN0b2dyYW0gbmFtZT0iUGFnZUxvYWQuQ2xpZW50cy5BZHMuQnl0ZXMiLz4KICAgPGFmZmVjdGVkLWhpc3RvZ3JhbSBuYW1lPSJQYWdlTG9hZC5DbGllbnRzLkFkcy5Ob25WaXNpYmxlLkJ5dGVzIi8+CkBAIC0xNjM4NjcsNyArMTY0MDUzLDEyIEBACiAgIDxzdWZmaXggbmFtZT0iTmV0d29yayIKICAgICAgIGxhYmVsPSJUaGUgc2l6ZSAoaW4gS0IpIG9mIGFsbCBvZiByZXNvdXJjZXMgdGhhdCBsb2FkZWQgb3ZlciB0aGUKICAgICAgICAgICAgICBuZXR3b3JrLiIvPgotICA8c3VmZml4IG5hbWU9IlRvdGFsIiBsYWJlbD0iVGhlIHNpemUgKGluIEtCKSBvZiB0aGUgcmVzb3VyY2VzIGxvYWRlZC4iLz4KKyAgPHN1ZmZpeCBuYW1lPSJUb3RhbCIgbGFiZWw9IlRoZSBzaXplIChpbiBLQikgb2YgdGhlIHJlc291cmNlcyBsb2FkZWQuIj4KKyAgICA8b2Jzb2xldGU+CisgICAgICBEZXByZWNhdGVkIDA5LzIwMTkuIFJlcGxhY2VkIHdpdGggVG90YWwyLgorICAgIDwvb2Jzb2xldGU+CisgIDwvc3VmZml4PgorICA8c3VmZml4IG5hbWU9IlRvdGFsMiIgbGFiZWw9IlRoZSBzaXplIChpbiBLQikgb2YgdGhlIHJlc291cmNlcyBsb2FkZWQuIi8+CiAgIDxhZmZlY3RlZC1oaXN0b2dyYW0gbmFtZT0iUGFnZUxvYWQuQ2xpZW50cy5BZHMuQnl0ZXMuQWRGcmFtZXMuQWdncmVnYXRlIi8+CiAgIDxhZmZlY3RlZC1oaXN0b2dyYW0gbmFtZT0iUGFnZUxvYWQuQ2xpZW50cy5BZHMuQnl0ZXMuQWRGcmFtZXMuUGVyRnJhbWUiLz4KICAgPGFmZmVjdGVkLWhpc3RvZ3JhbSBuYW1lPSJQYWdlTG9hZC5DbGllbnRzLkFkcy5CeXRlcy5GdWxsUGFnZSIvPgpAQCAtMTYzODg5LDE4ICsxNjQwODAsNDYgQEAKICAgPHN1ZmZpeCBuYW1lPSJQZXJjZW50QWRzIgogICAgICAgbGFiZWw9IlRoZSBwZXJjZW50YWdlIG9mIGJ5dGVzIGxvYWRlZCBmcm9tIHdpdGhpbiBhZCBmcmFtZXMuIi8+CiAgIDxhZmZlY3RlZC1oaXN0b2dyYW0gbmFtZT0iUGFnZUxvYWQuQ2xpZW50cy5BZHMuQnl0ZXMuRnVsbFBhZ2UuTmV0d29yayIvPgotICA8YWZmZWN0ZWQtaGlzdG9ncmFtIG5hbWU9IlBhZ2VMb2FkLkNsaWVudHMuQWRzLkJ5dGVzLkZ1bGxQYWdlLlRvdGFsIi8+CisgIDxhZmZlY3RlZC1oaXN0b2dyYW0gbmFtZT0iUGFnZUxvYWQuQ2xpZW50cy5BZHMuQnl0ZXMuRnVsbFBhZ2UuVG90YWwiPgorICAgIDxvYnNvbGV0ZT4KKyAgICAgIERlcHJlY2F0ZWQgMDkvMjAxOS4gUmVwbGFjZWQgd2l0aCBQZXJjZW50QWRzMiBzdWZmaXguCisgICAgPC9vYnNvbGV0ZT4KKyAgPC9hZmZlY3RlZC1oaXN0b2dyYW0+CiAgIDxhZmZlY3RlZC1oaXN0b2dyYW0KICAgICAgIG5hbWU9IlBhZ2VMb2FkLkNsaWVudHMuQWRzLk5vblZpc2libGUuQnl0ZXMuRnVsbFBhZ2UuTmV0d29yayIvPgogICA8YWZmZWN0ZWQtaGlzdG9ncmFtCi0gICAgICBuYW1lPSJQYWdlTG9hZC5DbGllbnRzLkFkcy5Ob25WaXNpYmxlLkJ5dGVzLkZ1bGxQYWdlLlRvdGFsIi8+CisgICAgICBuYW1lPSJQYWdlTG9hZC5DbGllbnRzLkFkcy5Ob25WaXNpYmxlLkJ5dGVzLkZ1bGxQYWdlLlRvdGFsIj4KKyAgICA8b2Jzb2xldGU+CisgICAgICBEZXByZWNhdGVkIDA5LzIwMTkuIFJlcGxhY2VkIHdpdGggUGVyY2VudEFkczIgc3VmZml4LgorICAgIDwvb2Jzb2xldGU+CisgIDwvYWZmZWN0ZWQtaGlzdG9ncmFtPgogICA8YWZmZWN0ZWQtaGlzdG9ncmFtCiAgICAgICBuYW1lPSJQYWdlTG9hZC5DbGllbnRzLkFkcy5WaXNpYmxlLkJ5dGVzLkZ1bGxQYWdlLk5ldHdvcmsiLz4KLSAgPGFmZmVjdGVkLWhpc3RvZ3JhbSBuYW1lPSJQYWdlTG9hZC5DbGllbnRzLkFkcy5WaXNpYmxlLkJ5dGVzLkZ1bGxQYWdlLlRvdGFsIi8+CisgIDxhZmZlY3RlZC1oaXN0b2dyYW0gbmFtZT0iUGFnZUxvYWQuQ2xpZW50cy5BZHMuVmlzaWJsZS5CeXRlcy5GdWxsUGFnZS5Ub3RhbCI+CisgICAgPG9ic29sZXRlPgorICAgICAgRGVwcmVjYXRlZCAwOS8yMDE5LiBSZXBsYWNlZCB3aXRoIFBlcmNlbnRBZHMyIHN1ZmZpeC4KKyAgICA8L29ic29sZXRlPgorICA8L2FmZmVjdGVkLWhpc3RvZ3JhbT4KKzwvaGlzdG9ncmFtX3N1ZmZpeGVzPgorCis8aGlzdG9ncmFtX3N1ZmZpeGVzIG5hbWU9IkFkc1BhZ2VMb2FkTWV0cmljc1BlcmNlbnRBZHMyIiBzZXBhcmF0b3I9Ii4iPgorICA8c3VmZml4IG5hbWU9IlBlcmNlbnRBZHMyIgorICAgICAgbGFiZWw9IlRoZSBwZXJjZW50YWdlIG9mIGJ5dGVzIGxvYWRlZCBmcm9tIHdpdGhpbiBhZCBmcmFtZXMuIi8+CisgIDxhZmZlY3RlZC1oaXN0b2dyYW0gbmFtZT0iUGFnZUxvYWQuQ2xpZW50cy5BZHMuQnl0ZXMuRnVsbFBhZ2UuVG90YWwyIi8+CisgIDxhZmZlY3RlZC1oaXN0b2dyYW0KKyAgICAgIG5hbWU9IlBhZ2VMb2FkLkNsaWVudHMuQWRzLk5vblZpc2libGUuQnl0ZXMuRnVsbFBhZ2UuVG90YWwyIi8+CisgIDxhZmZlY3RlZC1oaXN0b2dyYW0KKyAgICAgIG5hbWU9IlBhZ2VMb2FkLkNsaWVudHMuQWRzLlZpc2libGUuQnl0ZXMuRnVsbFBhZ2UuVG90YWwyIi8+CiA8L2hpc3RvZ3JhbV9zdWZmaXhlcz4KIAogPGhpc3RvZ3JhbV9zdWZmaXhlcyBuYW1lPSJBZHNQYWdlTG9hZE1ldHJpY3NQZXJjZW50TmV0d29yayIgc2VwYXJhdG9yPSIuIj4KICAgPHN1ZmZpeCBuYW1lPSJQZXJjZW50TmV0d29yayIKKyAgICAgIGxhYmVsPSJUaGUgcGVyY2VudGFnZSBvZiBieXRlcyB0aGF0IHdlcmUgbG9hZGVkIG92ZXIgdGhlIG5ldHdvcmsuIj4KKyAgICA8b2Jzb2xldGU+CisgICAgICBEZXByZWNhdGVkIDA5LzIwMTkuIFJlcGxhY2VkIHdpdGggUGVyY2VudE5ldHdvcmsyLgorICAgIDwvb2Jzb2xldGU+CisgIDwvc3VmZml4PgorICA8c3VmZml4IG5hbWU9IlBlcmNlbnROZXR3b3JrMiIKICAgICAgIGxhYmVsPSJUaGUgcGVyY2VudGFnZSBvZiBieXRlcyB0aGF0IHdlcmUgbG9hZGVkIG92ZXIgdGhlIG5ldHdvcmsuIi8+CiAgIDxhZmZlY3RlZC1oaXN0b2dyYW0gbmFtZT0iUGFnZUxvYWQuQ2xpZW50cy5BZHMuQnl0ZXMuQWRGcmFtZXMuQWdncmVnYXRlIi8+CiAgIDxhZmZlY3RlZC1oaXN0b2dyYW0gbmFtZT0iUGFnZUxvYWQuQ2xpZW50cy5BZHMuQnl0ZXMuQWRGcmFtZXMuUGVyRnJhbWUiLz4KQEAgLTE2MzkxNywxMCArMTY0MTM2LDI1IEBACiA8aGlzdG9ncmFtX3N1ZmZpeGVzIG5hbWU9IkFkc1BhZ2VMb2FkTWV0cmljc1NhbWVPcmlnaW5CeXRlcyIgc2VwYXJhdG9yPSIuIj4KICAgPHN1ZmZpeCBuYW1lPSJQZXJjZW50U2FtZU9yaWdpbiIKICAgICAgIGxhYmVsPSJUaGUgcGVyY2VudGFnZSBvZiBieXRlcyBsb2FkZWQgZnJvbSB0aGUgc2FtZSBvcmlnaW4gYXMgdGhlIHJvb3QKKyAgICAgICAgICAgICBmcmFtZSBvZiB0aGUgcGFnZSBvciBhZC4iPgorICAgIDxvYnNvbGV0ZT4KKyAgICAgIERlcHJlY2F0ZWQgMDkvMjAxOS4gUmVwbGFjZWQgd2l0aCBQZXJjZW50U2FtZU9yaWdpbjIuCisgICAgPC9vYnNvbGV0ZT4KKyAgPC9zdWZmaXg+CisgIDxzdWZmaXggbmFtZT0iUGVyY2VudFNhbWVPcmlnaW4yIgorICAgICAgbGFiZWw9IlRoZSBwZXJjZW50YWdlIG9mIGJ5dGVzIGxvYWRlZCBmcm9tIHRoZSBzYW1lIG9yaWdpbiBhcyB0aGUgcm9vdAogICAgICAgICAgICAgIGZyYW1lIG9mIHRoZSBwYWdlIG9yIGFkLiIvPgogICA8c3VmZml4IG5hbWU9IlNhbWVPcmlnaW4iCi0gICAgICBsYWJlbD0iVGhlIG51bWJlciBvZiBieXRlcyBsb2FkZWQgZnJvbSB0aGUgc2FtZSBvcmlnaW4gYXMgdGhlIHJvb3QKLSAgICAgICAgICAgICBmcmFtZSBvZiB0aGUgcGFnZSBvciBhZC4iLz4KKyAgICAgIGxhYmVsPSJUaGUgbnVtYmVyIG9mIGJ5dGVzIGxvYWRlZCBmcm9tIHRoZSBzYW1lIG9yaWdpbiBhcyB0aGUgcm9vdCBmcmFtZQorICAgICAgICAgICAgIG9mIHRoZSBwYWdlIG9yIGFkLiI+CisgICAgPG9ic29sZXRlPgorICAgICAgRGVwcmVjYXRlZCAwOS8yMDE5LiBSZXBsYWNlZCB3aXRoIFNhbWVPcmlnaW4yLgorICAgIDwvb2Jzb2xldGU+CisgIDwvc3VmZml4PgorICA8c3VmZml4IG5hbWU9IlNhbWVPcmlnaW4yIgorICAgICAgbGFiZWw9IlRoZSBudW1iZXIgb2YgYnl0ZXMgKGluY2x1ZGluZyB0aG9zZSBmcm9tIGJvdGggdGhlIEhUVFAgY2FjaGUKKyAgICAgICAgICAgICBhbmQgbWVtb3J5IGNhY2hlKSBsb2FkZWQgZnJvbSB0aGUgc2FtZSBvcmlnaW4gYXMgdGhlIHJvb3QgZnJhbWUKKyAgICAgICAgICAgICBvZiB0aGUgcGFnZSBvciBhZC4iLz4KICAgPGFmZmVjdGVkLWhpc3RvZ3JhbSBuYW1lPSJQYWdlTG9hZC5DbGllbnRzLkFkcy5CeXRlcy5BZEZyYW1lcy5QZXJGcmFtZSIvPgogICA8YWZmZWN0ZWQtaGlzdG9ncmFtIG5hbWU9IlBhZ2VMb2FkLkNsaWVudHMuQWRzLkJ5dGVzLkZ1bGxQYWdlIi8+CiAgIDxhZmZlY3RlZC1oaXN0b2dyYW0KQEAgLTE2NDMxMiw2ICsxNjQ1NDYsOSBAQAogICA8YWZmZWN0ZWQtaGlzdG9ncmFtIG5hbWU9IkFyYy5Qcm92aXNpb25pbmcuVGltZURlbHRhLlN1Y2Nlc3MiLz4KICAgPGFmZmVjdGVkLWhpc3RvZ3JhbSBuYW1lPSJBcmMuUmVhdXRob3JpemF0aW9uLlJlc3VsdCIvPgogICA8YWZmZWN0ZWQtaGlzdG9ncmFtIG5hbWU9IkFyYy5TdGF0ZUJ5VXNlclR5cGUiLz4KKyAgPGFmZmVjdGVkLWhpc3RvZ3JhbSBuYW1lPSJBcmMuVWlBdmFpbGFibGUuQWxyZWFkeVByb3Zpc2lvbmVkLlRpbWVEZWx0YSIvPgorICA8YWZmZWN0ZWQtaGlzdG9ncmFtIG5hbWU9IkFyYy5VaUF2YWlsYWJsZS5JblNlc3Npb25Qcm92aXNpb25pbmcuVGltZURlbHRhIi8+CisgIDxhZmZlY3RlZC1oaXN0b2dyYW0gbmFtZT0iQXJjLlVpQXZhaWxhYmxlLk9vYmVQcm92aXNpb25pbmcuVGltZURlbHRhIi8+CiA8L2hpc3RvZ3JhbV9zdWZmaXhlcz4KIAogPGhpc3RvZ3JhbV9zdWZmaXhlcyBuYW1lPSJBc3luY0ROU1ByZWYiIHNlcGFyYXRvcj0iXyI+CkBAIC0xNjQ3MzQsNiArMTY0OTcxLDggQEAKICAgICAgIGxhYmVsPSJPcmlnaW4gY2hlY2sgZm9yIExpdGVwYWdlIHByZXZpZXdzIi8+CiAgIDxhZmZlY3RlZC1oaXN0b2dyYW0gbmFtZT0iQXZhaWxhYmlsaXR5LlByb2Jlci5DYWNoZUVudHJ5QWdlIi8+CiAgIDxhZmZlY3RlZC1oaXN0b2dyYW0gbmFtZT0iQXZhaWxhYmlsaXR5LlByb2Jlci5EaWRTdWNjZWVkIi8+CisgIDxhZmZlY3RlZC1oaXN0b2dyYW0KKyAgICAgIG5hbWU9IkF2YWlsYWJpbGl0eS5Qcm9iZXIuRGlkU3VjY2VlZC5BZnRlclJlcG9ydGVkRmFpbHVyZSIvPgogICA8YWZmZWN0ZWQtaGlzdG9ncmFtIG5hbWU9IkF2YWlsYWJpbGl0eS5Qcm9iZXIuRmluYWxTdGF0ZSIvPgogICA8YWZmZWN0ZWQtaGlzdG9ncmFtIG5hbWU9IkF2YWlsYWJpbGl0eS5Qcm9iZXIuTmV0RXJyb3IiLz4KICAgPGFmZmVjdGVkLWhpc3RvZ3JhbSBuYW1lPSJBdmFpbGFiaWxpdHkuUHJvYmVyLk51bUF0dGVtcHRzQmVmb3JlU3VjY2VzcyIvPgpAQCAtMTY1MTc5LDcgKzE2NTQxOCwxMSBAQAogICA8c3VmZml4IG5hbWU9IkFwcCIKICAgICAgIGxhYmVsPSJDb2xsZWN0ZWQgZnJvbSB0aGUgSFRNTDUgQXBwbGljYXRpb24gQ2FjaGUgaW5zdGFuY2UuIi8+CiAgIDxzdWZmaXggbmFtZT0iSHR0cCIgbGFiZWw9IkNvbGxlY3RlZCBmcm9tIHRoZSBIVFRQIENhY2hlIGluc3RhbmNlLiIvPgotICA8c3VmZml4IG5hbWU9Ik1lZGlhIiBsYWJlbD0iQ29sbGVjdGVkIGZyb20gdGhlIE1lZGlhIENhY2hlIGluc3RhbmNlLiIvPgorICA8c3VmZml4IG5hbWU9Ik1lZGlhIiBsYWJlbD0iQ29sbGVjdGVkIGZyb20gdGhlIE1lZGlhIENhY2hlIGluc3RhbmNlLiI+CisgICAgPG9ic29sZXRlPgorICAgICAgTm90aWNlZCB1bnVzZWQgMjAxOS0xMC0wOQorICAgIDwvb2Jzb2xldGU+CisgIDwvc3VmZml4PgogICA8YWZmZWN0ZWQtaGlzdG9ncmFtIG5hbWU9IlNpbXBsZUNhY2hlLkNhY2hlU2l6ZU9uSW5pdCIvPgogICA8YWZmZWN0ZWQtaGlzdG9ncmFtIG5hbWU9IlNpbXBsZUNhY2hlLkNoZWNrQ1JDUmVzdWx0Ii8+CiAgIDxhZmZlY3RlZC1oaXN0b2dyYW0gbmFtZT0iU2ltcGxlQ2FjaGUuQ29uc2lzdGVuY3lSZXN1bHQiLz4KZGlmZiAtLWdpdCBhL3Rvb2xzL21ldHJpY3MvdWttL3VrbS54bWwgYi90b29scy9tZXRyaWNzL3VrbS91a20ueG1sCmluZGV4IGVhNmE2MTMxLi5mMzQ1MTQzIDEwMDY0NAotLS0gYS90b29scy9tZXRyaWNzL3VrbS91a20ueG1sCisrKyBiL3Rvb2xzL21ldHJpY3MvdWttL3VrbS54bWwKQEAgLTExNSwxMiArMTE1LDIzIEBACiAgICAgPC9zdW1tYXJ5PgogICA8L21ldHJpYz4KICAgPG1ldHJpYyBuYW1lPSJMb2FkaW5nLkNhY2hlQnl0ZXMiPgorICAgIDxvYnNvbGV0ZT4KKyAgICAgIERlcHJlY2F0ZWQgMDkvMjAxOS4gUmVwbGFjZWQgd2l0aCBMb2FkaW5nLkNhY2hlQnl0ZXMyLgorICAgIDwvb2Jzb2xldGU+CiAgICAgPHN1bW1hcnk+CiAgICAgICBCeXRlcyBsb2FkZWQgZnJvbSB0aGUgY2FjaGUgZm9yIGFsbCByZXNvdXJjZXMgbG9hZGVkIHdpdGhpbiB0aGUgZnJhbWUuCiAgICAgICBUaGlzIGlzIHJvdW5kZWQgZG93biB0byB0aGUgbmVhcmVzdCBleHBvbmVudGlhbCBidWNrZXQgKHdpdGggYSBidWNrZXQKICAgICAgIHJhdGlvIG9mIDEuMykuCiAgICAgPC9zdW1tYXJ5PgogICA8L21ldHJpYz4KKyAgPG1ldHJpYyBuYW1lPSJMb2FkaW5nLkNhY2hlQnl0ZXMyIj4KKyAgICA8c3VtbWFyeT4KKyAgICAgIEJ5dGVzIGxvYWRlZCBmcm9tIHRoZSBjYWNoZSBmb3IgYWxsIHJlc291cmNlcyBsb2FkZWQgd2l0aGluIHRoZSBmcmFtZS4KKyAgICAgIFRoaXMgaW5jbHVkZXMgYnl0ZXMgbG9hZGVkIGZyb20gYm90aCB0aGUgSFRUUCBjYWNoZSBhbmQgbWVtb3J5IGNhY2hlLiBUaGlzCisgICAgICBpcyByb3VuZGVkIGRvd24gdG8gdGhlIG5lYXJlc3QgZXhwb25lbnRpYWwgYnVja2V0ICh3aXRoIGEgYnVja2V0IHJhdGlvIG9mCisgICAgICAxLjMpLgorICAgIDwvc3VtbWFyeT4KKyAgPC9tZXRyaWM+CiAgIDxtZXRyaWMgbmFtZT0iTG9hZGluZy5JbWFnZUJ5dGVzIj4KICAgICA8c3VtbWFyeT4KICAgICAgIE5ldHdvcmsgYnl0ZXMgbG9hZGVkIGZvciByZXNvdXJjZXMgd2l0aCBhbiBpbWFnZSBtaW1lIHR5cGUgd2l0aGluIHRoZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9wcm9jZXNzX3BlcmZfcmVzdWx0cy5weSBiL3Rvb2xzL3BlcmYvcHJvY2Vzc19wZXJmX3Jlc3VsdHMucHkKaW5kZXggZmJiZTM4NC4uZjc3ZmQxYSAxMDA3NTUKLS0tIGEvdG9vbHMvcGVyZi9wcm9jZXNzX3BlcmZfcmVzdWx0cy5weQorKysgYi90b29scy9wZXJmL3Byb2Nlc3NfcGVyZl9yZXN1bHRzLnB5CkBAIC02NCw2ICs2NCw3IEBACiAgICdtZWRpYV9wZXJmdGVzdHMnLAogICAnbmV0X3BlcmZ0ZXN0cycsCiAgICdwYXNzdGhyb3VnaF9jb21tYW5kX2J1ZmZlcl9wZXJmdGVzdHMnLAorICAnc2VydmljZXNfcGVyZnRlc3RzJywKICAgJ3RyYWNpbmdfcGVyZnRlc3RzJywKICAgJ3ZhbGlkYXRpbmdfY29tbWFuZF9idWZmZXJfcGVyZnRlc3RzJywKICAgJ3ZpZXdzX3BlcmZ0ZXN0cycsCmRpZmYgLS1naXQgYS90b29scy90cmFmZmljX2Fubm90YXRpb24vUkVBRE1FLm1kIGIvdG9vbHMvdHJhZmZpY19hbm5vdGF0aW9uL1JFQURNRS5tZAppbmRleCAxYjJiNDMxYy4uMmI4YzUyMiAxMDA2NDQKLS0tIGEvdG9vbHMvdHJhZmZpY19hbm5vdGF0aW9uL1JFQURNRS5tZAorKysgYi90b29scy90cmFmZmljX2Fubm90YXRpb24vUkVBRE1FLm1kCkBAIC04LDEzICs4LDEzIEBACiAjIFRyYWZmaWMgQW5ub3RhdGlvbiBBdWRpdG9yCiBUaGlzIGlzIHRoZSBtYWluIGV4ZWN1dGFibGUgZm9yIGFsbCB0aGUgdGVzdHMuIEl0IHJ1bnMgVHJhZmZpYyBBbm5vdGF0aW9uCiBFeHRyYWN0b3IgY2xhbmcgdG9vbCB0byBjaGVjayB0aGUgcmVwb3NpdG9yeSwgZXh0cmFjdCBhbm5vdGF0aW9ucywgYW5kIHBlcmZvcm0KLXJlcXVpcmVkIHRlc3RzIGFuZCBtYWludGFuYW5jZS4gU2VlIG1vcmUgZGV0YWlscyBpbgorcmVxdWlyZWQgdGVzdHMgYW5kIG1haW50ZW5hbmNlLiBTZWUgbW9yZSBkZXRhaWxzIGluCiBgdG9vbHMvdHJhZmZpY19hbm5vdGF0aW9uL2F1ZGl0b3IvUkVBRE1FLm1kYC4KIAogIyBUcmFmZmljIEFubm90YXRpb24gRXh0cmFjdG9yCiBUcmFmZmljIEFubm90YXRpb24gQXVkaXRvciB1c2VzIHRoaXMgY2xhbmcgdG9vbCAobG9jYXRlZCBpbgogYHRvb2xzXGNsYW5nXHRyYWZmaWNfYW5ub3RhdGlvbl9leHRyYWN0b3JgKSB0byBwYXJzZSB0aGUgY29kZSBhbmQgZXh0cmFjdAotcmVxdWlyZWQgZGF0YSBmb3IgdGVzdGluZyBhbmQgbWFpbnRhbmFuY2UuCityZXF1aXJlZCBkYXRhIGZvciB0ZXN0aW5nIGFuZCBtYWludGVuYW5jZS4KIAogIyBCdWlsZGluZyB0aGUgQ2hlY2tlcnMKIFdlIGRvIG5vdCB3YW50IGV2ZXJ5IGRldmVsb3BlciB0byBoYXZlIHRvIGJ1aWxkIGNsYW5nIHRvb2wgYW5kIGF1ZGl0b3IsIGFuZCBzbwpAQCAtMjYsNyArMjYsNyBAQAogIyBBdXRvbWF0aWMgQW5ub3RhdGlvbiBUZXN0cwogTmV0d29yayB0cmFmZmljIGFubm90YXRpb25zIGFyZSB0ZXN0ZWQgaW4gY29tbWl0IHF1ZXVlIHVzaW5nCiBgdG9vbHMvdHJhZmZpY19hbm5vdGF0aW9uL3NjcmlwdHMvY2hlY2tfYW5ub3RhdGlvbnMucHlgLiBUaGlzIHRlc3QgaXMgY3VycmVudGx5Ci1ydW4gb24gTGludXggYW5kIFdpbmRvd3MgdHJ5Ym90cywgYnV0IG1heSBleHBhbmQgaW4gZnV0dXJlIHRvIG90aGVyIHBsYXRmcm9tcy4KK3J1biBvbiBMaW51eCBhbmQgV2luZG93cyB0cnlib3RzLCBidXQgbWF5IGV4cGFuZCBpbiBmdXR1cmUgdG8gb3RoZXIgcGxhdGZvcm1zLgogVG8gcGVyZm9ybSB0aGlzIHRlc3QgZmFzdCBlbm91Z2ggZm9yIGEgdHJ5Ym90IGFuZCB0byBhdm9pZCBzcGFtbWluZyB0aGUgY29tbWl0CiBxdWV1ZSBpZiBhbiB1bmV4cGVjdGVkIGdlbmVyYWwgZmFpbHVyZSBoYXBwZW5zIChzZWUgbmV4dCBpdGVtKSwgdHJ5Ym90IHRlc3RzIGFyZQogcnVuIGluIGVycm9yIHJlc2lsaWVudCBtb2RlIGFuZCBvbmx5IG9uIHRoZSBjaGFuZ2VkIGZpbGVzLiBBIG1vcmUgY29tcGxldGUgdGVzdApkaWZmIC0tZ2l0IGEvdG9vbHMvdHJhZmZpY19hbm5vdGF0aW9uL2F1ZGl0b3IvUkVBRE1FLm1kIGIvdG9vbHMvdHJhZmZpY19hbm5vdGF0aW9uL2F1ZGl0b3IvUkVBRE1FLm1kCmluZGV4IDAwMDVlNGYuLjcwMGYwOWYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3RyYWZmaWNfYW5ub3RhdGlvbi9hdWRpdG9yL1JFQURNRS5tZAorKysgYi90b29scy90cmFmZmljX2Fubm90YXRpb24vYXVkaXRvci9SRUFETUUubWQKQEAgLTEsNyArMSw3IEBACiAjIE5ldHdvcmsgVHJhZmZpYyBBbm5vdGF0aW9uIEF1ZGl0b3IKIFRoaXMgYmluYXJ5IHJ1bnMgdGhlIGNsYW5nIHRvb2wgZm9yIGV4dHJhY3Rpb24gb2YgTmV0d29yayBUcmFmZmljIEFubm90YXRpb25zCiBmcm9tIGNocm9taXVtIHNvdXJjZSBjb2RlLCBjb2xsZWN0cyBhbmQgc3VtbWFyaXplcyBpdHMgb3V0cHV0cywgYW5kIHBlcmZvcm1zCi10ZXN0cyBhbmQgbWFpbnRhbmFuY2UuCit0ZXN0cyBhbmQgbWFpbnRlbmFuY2UuCiBQbGVhc2Ugc2VlIGBkb2NzL25ldHdvcmtfdHJhZmZpY19hbm5vdGF0aW9ucy5tZGAgZm9yIGFuIGludHJvZHVjdGlvbiB0byBuZXR3b3JrCiB0cmFmZmljIGFubm90YXRpb25zLgogCkBAIC0zMyw3ICszMyw3IEBACiBVc2UgKiBhcyB3aWxkY2FyZCBmb3IgemVybyBvciBtb3JlIGNoYXJhY3RlcnMgd2hlbiBzcGVjaWZ5aW5nIGZpbGUgcGF0aHMuCiAKIEhlcmUgYXJlIHRoZSBleGNlcHRpb24gdHlwZXM6Ci0qIGBhbGxgOiBGaWxlcyBhbmQgcGF0aHMgaW4gdGhpcyBjYXRlZ29yeSBhcmUgZXhjZW1wdGVkIGZyb20gYWxsIHRlc3RzLgorKiBgYWxsYDogRmlsZXMgYW5kIHBhdGhzIGluIHRoaXMgY2F0ZWdvcnkgYXJlIGV4ZW1wdGVkIGZyb20gYWxsIHRlc3RzLgogKiBgbWlzc2luZ2A6IEZpbGVzIGFuZCBwYXRocyBpbiB0aGlzIGNhdGVnb3J5IGNhbiB1c2UgdGhlCiAgIE1JU1NJTkdfVFJBRkZJQ19BTk5PVEFUSU9OIHRhZy4KICogYG11dGFibGVfdGFnYDogRmlsZXMgYW5kIHBhdGhzIGluIHRoaXMgY2F0ZWdvcnkgY2FuIHVzZSB0aGUKQEAgLTQxLDMgKzQxLDUgQEAKICogYGRpcmVjdF9hc3NpZ25tZW50YDogVGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGNhdGVnb3J5IGNhbiBhc3NpZ24gYSB2YWx1ZQogICBkaXJlY3RseSB0byBhIE11dGFibGVOZXR3b3JrVHJhZmZpY0Fubm90YXRpb25UYWcuIFRoaXMgaXMgY29udHJvbGxlZCB0bwogICBhdm9pZCBhc3NpZ25pbmcgYXJiaXRyYXJ5IHZhbHVlcyB0byBtdXRhYmxlIGFubm90YXRpb25zLgorKiBgdGVzdF9hbm5vdGF0aW9uYDogRmlsZXMgYW5kIHBhdGhzIGluIHRoaXMgY2F0ZWdvcnkgY2FuIHVzZSB0aGUKKyAgVFJBRkZJQ19BTk5PVEFUSU9OX0ZPUl9URVNUUyB0YWcuCmRpZmYgLS1naXQgYS90b29scy90cmFmZmljX2Fubm90YXRpb24vYXVkaXRvci9hdWRpdG9yX3Jlc3VsdC5oIGIvdG9vbHMvdHJhZmZpY19hbm5vdGF0aW9uL2F1ZGl0b3IvYXVkaXRvcl9yZXN1bHQuaAppbmRleCA0YjMzMTg2NGYuLjJmZTNiYzggMTAwNjQ0Ci0tLSBhL3Rvb2xzL3RyYWZmaWNfYW5ub3RhdGlvbi9hdWRpdG9yL2F1ZGl0b3JfcmVzdWx0LmgKKysrIGIvdG9vbHMvdHJhZmZpY19hbm5vdGF0aW9uL2F1ZGl0b3IvYXVkaXRvcl9yZXN1bHQuaApAQCAtMTIsNyArMTIsNyBAQAogIHB1YmxpYzoKICAgZW51bSBjbGFzcyBUeXBlIHsKICAgICBSRVNVTFRfT0ssICAgICAgICAgICAgICAgLy8gTm8gZXJyb3IKLSAgICBSRVNVTFRfSUdOT1JFLCAgICAgICAgICAgLy8gVGhlIGl0ZW0gZG9lcyBub3QgcmVxdWlyZSBmdXJ0aHVyZSBwcm9jZXNzaW5nLgorICAgIFJFU1VMVF9JR05PUkUsICAgICAgICAgICAvLyBUaGUgaXRlbSBkb2VzIG5vdCByZXF1aXJlIGZ1cnRoZXIgcHJvY2Vzc2luZy4KICAgICBFUlJPUl9GQVRBTCwgICAgICAgICAgICAgLy8gQSBmYXRhbCBlcnJvciB0aGF0IHNob3VsZCBzdG9wIHByb2Nlc3MuCiAgICAgRVJST1JfTUlTU0lOR19UQUdfVVNFRCwgIC8vIEEgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTUlTU0lOR19UUkFGRklDX0FOTk9UQVRJT04gdGFnLgpAQCAtNDMsNyArNDMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbm5vdGF0aW9uIGlzIG5vdCBwYWlyZWQgd2l0aCBhbnkgb3RoZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5ub3RhdGlvbiB0byBiZSBjb21wbGV0ZWQuCiAgICAgRVJST1JfRElSRUNUX0FTU0lHTk1FTlQsICAgICAgIC8vIEEgdmFsdWUgaXMgZGlyZWN0bHkgYXNzaWduZWQgdG8gYSBtdXRhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFubm90YXRpb24gb3IgYW5ub3RhdGlvbiBpbnN0aWFsaXplZCB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFubm90YXRpb24gb3IgYW5ub3RhdGlvbiBpbml0aWFsaXplZCB3aXRoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpc3QgZXhwcmVzc3Npb24uCiAgICAgRVJST1JfQU5OT1RBVElPTlNfWE1MX1VQREFURSwgIC8vIEFubm90YXRpb25zIFhNTCByZXF1aXJlcyB1cGRhdGUuCiAgICAgRVJST1JfVEVTVF9BTk5PVEFUSU9OLCAgICAgICAgIC8vIEFubm90YXRpb24gZm9yIHRlc3RzIGlzIHVzZWQuCmRpZmYgLS1naXQgYS90b29scy90cmFmZmljX2Fubm90YXRpb24vYXVkaXRvci9zYWZlX2xpc3QudHh0IGIvdG9vbHMvdHJhZmZpY19hbm5vdGF0aW9uL2F1ZGl0b3Ivc2FmZV9saXN0LnR4dAppbmRleCA4OTJjYzFkLi43MzY3ZGQ1IDEwMDY0NAotLS0gYS90b29scy90cmFmZmljX2Fubm90YXRpb24vYXVkaXRvci9zYWZlX2xpc3QudHh0CisrKyBiL3Rvb2xzL3RyYWZmaWNfYW5ub3RhdGlvbi9hdWRpdG9yL3NhZmVfbGlzdC50eHQKQEAgLTEsNSArMSw1IEBACiAjIFRoaXMgaXMgYSBjb21tYSBzZXBhcmF0ZWQgZmlsZSwgc3BlY2lmeWluZyB0aGUgc2FmZSBsaXN0IGZvciBuZXR3b3JrIHRyYWZmaWMKLSMgYW5udG90YXRpb24gYXVkaXRvci4gUGxlYXNlIHJlZmVyIHRvIFJFQURNRS5tZCBmb3IgbW9yZSBkZXRhaWxzLgorIyBhbm5vdGF0aW9uIGF1ZGl0b3IuIFBsZWFzZSByZWZlciB0byBSRUFETUUubWQgZm9yIG1vcmUgZGV0YWlscy4KIGFsbCx0b29scy8qLCp0ZXN0KiwqZnV6emVyKiwqbW9jayosKmZha2UqCiBtaXNzaW5nLHJlbW90aW5nL2hvc3QvdG9rZW5fdmFsaWRhdG9yX2ZhY3RvcnlfaW1wbC5jYwogbWlzc2luZyxjb21wb25lbnRzL2Nyb25ldC9jcm9uZXRfdXJsX3JlcXVlc3QuY2MKZGlmZiAtLWdpdCBhL3Rvb2xzL3RyYWZmaWNfYW5ub3RhdGlvbi9hdWRpdG9yL3RyYWZmaWNfYW5ub3RhdGlvbl9hdWRpdG9yLmNjIGIvdG9vbHMvdHJhZmZpY19hbm5vdGF0aW9uL2F1ZGl0b3IvdHJhZmZpY19hbm5vdGF0aW9uX2F1ZGl0b3IuY2MKaW5kZXggOTNiNjgyMy4uZTRjNDcwYiAxMDA2NDQKLS0tIGEvdG9vbHMvdHJhZmZpY19hbm5vdGF0aW9uL2F1ZGl0b3IvdHJhZmZpY19hbm5vdGF0aW9uX2F1ZGl0b3IuY2MKKysrIGIvdG9vbHMvdHJhZmZpY19hbm5vdGF0aW9uL2F1ZGl0b3IvdHJhZmZpY19hbm5vdGF0aW9uX2F1ZGl0b3IuY2MKQEAgLTMxMSw3ICszMTEsNyBAQAogICAgIEZJTEUqIG9wdGlvbnNfZmlsZSwKICAgICBib29sIHVzZV9jb21waWxlX2NvbW1hbmRzKSB7CiAgIC8vIEFzIHRoZSBjaGVja2VkIG91dCBjbGFuZyB0b29sIG1heSBiZSBpbiBhIGRpcmVjdG9yeSBkaWZmZXJlbnQgZnJvbSB0aGUKLSAgLy8gZGVmYXVsdCBvbmUgKHRoaXJkX3BhcnR5L2xsdm0tYnVpZC9SZWxlYXNlK0Fzc2VydHMvYmluKSwgaXRzIHBhdGggYW5kCisgIC8vIGRlZmF1bHQgb25lICh0aGlyZF9wYXJ0eS9sbHZtLWJ1aWxkL1JlbGVhc2UrQXNzZXJ0cy9iaW4pLCBpdHMgcGF0aCBhbmQKICAgLy8gY2xhbmcncyBsaWJyYXJ5IGZvbGRlciBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSBydW5fdG9vbC5weSBzY3JpcHQuCiAgIGZwcmludGYoCiAgICAgICBvcHRpb25zX2ZpbGUsCkBAIC02NDMsNyArNjQzLDcgQEAKICAgLy8gVW5pdHRlc3RzIHNob3VsZCBiZSBhbGwgYW5ub3RhdGVkLiBBbHRob3VnaCB0aGlzIGNhbiBiZSBkZXRlY3RlZCB1c2luZyBnbiwKICAgLy8gZG9pbmcgdGhhdCB3b3VsZCBiZSB2ZXJ5IHNsb3cuIFRoZSBhbHRlcm5hdGl2ZSBzb2x1dGlvbiB3b3VsZCBiZSB0byBieXBhc3MKICAgLy8gZXZlcnkgZmlsZSBpbmNsdWRpbmcgdGVzdCBvciB1bml0dGVzdCwgYnV0IGluIHRoaXMgY2FzZSB0aGVyZSBtaWdodCBiZSBzb21lCi0gIC8vIGFtYmlndWV0eSBpbiB3aGF0IHNob3VsZCBiZSBhbm5vdGF0ZWQgYW5kIHdoYXQgbm90LgorICAvLyBhbWJpZ3VpdHkgaW4gd2hhdCBzaG91bGQgYmUgYW5ub3RhdGVkIGFuZCB3aGF0IG5vdC4KICAgaWYgKGNhbGwuZmlsZV9wYXRoLmZpbmQoInVuaXR0ZXN0IikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpCiAgICAgcmV0dXJuIGZhbHNlOwogCmRpZmYgLS1naXQgYS90b29scy90cmFmZmljX2Fubm90YXRpb24vYXVkaXRvci90cmFmZmljX2Fubm90YXRpb25fYXVkaXRvcl91aS5jYyBiL3Rvb2xzL3RyYWZmaWNfYW5ub3RhdGlvbi9hdWRpdG9yL3RyYWZmaWNfYW5ub3RhdGlvbl9hdWRpdG9yX3VpLmNjCmluZGV4IGQxZjhhYzc5Li5mMjQ3MTQ1IDEwMDY0NAotLS0gYS90b29scy90cmFmZmljX2Fubm90YXRpb24vYXVkaXRvci90cmFmZmljX2Fubm90YXRpb25fYXVkaXRvcl91aS5jYworKysgYi90b29scy90cmFmZmljX2Fubm90YXRpb24vYXVkaXRvci90cmFmZmljX2Fubm90YXRpb25fYXVkaXRvcl91aS5jYwpAQCAtMTksNyArMTksNyBAQAogCiBjb25zdCBjaGFyKiBIRUxQX1RFWFQgPSBSIigKIFRyYWZmaWMgQW5ub3RhdGlvbiBBdWRpdG9yCi1FeHRyYWN0cyBuZXR3b3JrIHRyYWZmaWMgYW5ub3RhaW9ucyBmcm9tIHRoZSByZXBvc2l0b3J5LCBhdWRpdHMgdGhlbSBmb3IgZXJyb3JzCitFeHRyYWN0cyBuZXR3b3JrIHRyYWZmaWMgYW5ub3RhdGlvbnMgZnJvbSB0aGUgcmVwb3NpdG9yeSwgYXVkaXRzIHRoZW0gZm9yIGVycm9ycwogYW5kIGNvdmVyYWdlLCBwcm9kdWNlcyByZXBvcnRzLCBhbmQgdXBkYXRlcyByZWxhdGVkIGZpbGVzLgogCiBVc2FnZTogdHJhZmZpY19hbm5vdGF0aW9uX2F1ZGl0b3IgW09QVElPTl0uLi4gW3BhdGhfZmlsdGVyc10KQEAgLTY3LDcgKzY3LDcgQEAKICAgLS1leHRyYWN0b3ItYmFja2VuZD1bY2xhbmdfdG9vbCxweXRob25fc2NyaXB0XQogICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIGZsYWcgc3BlY2lmeWluZyB3aGljaCBiYWNrZW5kIHRvIHVzZSBmb3IKICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0aW5nIGFubm90YXRpb24gZGVmaW5pdGlvbnMgZnJvbSBzb3VyY2UgY29kZSAoQ2xhbmcKLSAgICAgICAgICAgICAgICAgICAgICBUb29sIG9yIGV4dHJhY3Rvci5weSkuIERlZmF1bHRzIHRvICJjbGFuZ190b29sIi4KKyAgICAgICAgICAgICAgICAgICAgICBUb29sIG9yIGV4dHJhY3Rvci5weSkuIERlZmF1bHRzIHRvICJweXRob25fc2NyaXB0Ii4KICAgcGF0aF9maWx0ZXJzICAgICAgICBPcHRpb25hbCBwYXRocyB0byBmaWx0ZXIgd2hpY2ggZmlsZXMgdGhlIHRvb2wgaXMgcnVuIG9uLgogICAgICAgICAgICAgICAgICAgICAgIEl0IGNhbiBhbHNvIGluY2x1ZGUgZGVsZXRlZCBmaWxlcyBuYW1lcyB3aGVuIGF1ZGl0b3IgaXMKICAgICAgICAgICAgICAgICAgICAgICBydW4gb24gYSBwYXJ0aWFsIHJlcG9zaXRvcnkuCmRpZmYgLS1naXQgYS90b29scy90cmFmZmljX2Fubm90YXRpb24vYXVkaXRvci90cmFmZmljX2Fubm90YXRpb25fYXVkaXRvcl91bml0dGVzdC5jYyBiL3Rvb2xzL3RyYWZmaWNfYW5ub3RhdGlvbi9hdWRpdG9yL3RyYWZmaWNfYW5ub3RhdGlvbl9hdWRpdG9yX3VuaXR0ZXN0LmNjCmluZGV4IDRkYmQ2YzIuLjkzNWRmY2MgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3RyYWZmaWNfYW5ub3RhdGlvbi9hdWRpdG9yL3RyYWZmaWNfYW5ub3RhdGlvbl9hdWRpdG9yX3VuaXR0ZXN0LmNjCisrKyBiL3Rvb2xzL3RyYWZmaWNfYW5ub3RhdGlvbi9hdWRpdG9yL3RyYWZmaWNfYW5ub3RhdGlvbl9hdWRpdG9yX3VuaXR0ZXN0LmNjCkBAIC0yODYsNyArMjg2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaXRvckV4Y2VwdGlvbjo6RXhjZXB0aW9uVHlwZTo6VEVTVF9BTk5PVEFUSU9OKSk7CiB9CiAKLS8vIFRlc3RzIGlmIGFubm90YXRpb24gaW5zdGFuY2VzIGFyZSBjb3JycmVjdGx5IGRlc2VyaWFsaXplZC4KKy8vIFRlc3RzIGlmIGFubm90YXRpb24gaW5zdGFuY2VzIGFyZSBjb3JyZWN0bHkgZGVzZXJpYWxpemVkLgogVEVTVF9GKFRyYWZmaWNBbm5vdGF0aW9uQXVkaXRvclRlc3QsIEFubm90YXRpb25EZXNlcmlhbGl6YXRpb24pIHsKICAgc3RydWN0IEFubm90YXRpb25TYW1wbGUgewogICAgIHN0ZDo6c3RyaW5nIGZpbGVfbmFtZTsKQEAgLTM0MCw3ICszNDAsNyBAQAogICB9CiB9CiAKLS8vIFRlc3RzIGlmIGNhbGwgaW5zdGFuY2VzIGFyZSBjb3JycmVjdGx5IGRlc2VyaWFsaXplZC4KKy8vIFRlc3RzIGlmIGNhbGwgaW5zdGFuY2VzIGFyZSBjb3JyZWN0bHkgZGVzZXJpYWxpemVkLgogVEVTVF9GKFRyYWZmaWNBbm5vdGF0aW9uQXVkaXRvclRlc3QsIENhbGxEZXNlcmlhbGl6YXRpb24pIHsKICAgc3RydWN0IENhbGxTYW1wbGUgewogICAgIHN0ZDo6c3RyaW5nIGZpbGVfbmFtZTsKQEAgLTM2OSw3ICszNjksNyBAQAogICB9CiB9CiAKLS8vIFRlc3RzIGlmIGNhbGwgaW5zdGFuY2VzIGFyZSBjb3JycmVjdGx5IGRlc2VyaWFsaXplZC4KKy8vIFRlc3RzIGlmIGNhbGwgaW5zdGFuY2VzIGFyZSBjb3JyZWN0bHkgZGVzZXJpYWxpemVkLgogVEVTVF9GKFRyYWZmaWNBbm5vdGF0aW9uQXVkaXRvclRlc3QsIEFzc2lnbm1lbnREZXNlcmlhbGl6YXRpb24pIHsKICAgc3RydWN0IEFzc2lnbm1lbnRhbXBsZSB7CiAgICAgc3RkOjpzdHJpbmcgZmlsZV9uYW1lOwpkaWZmIC0tZ2l0IGEvdG9vbHMvdHJhZmZpY19hbm5vdGF0aW9uL2Jpbi9saW51eDY0L3RyYWZmaWNfYW5ub3RhdGlvbl9hdWRpdG9yLnNoYTEgYi90b29scy90cmFmZmljX2Fubm90YXRpb24vYmluL2xpbnV4NjQvdHJhZmZpY19hbm5vdGF0aW9uX2F1ZGl0b3Iuc2hhMQppbmRleCA1YWQ0NDk3Li44MzY2NDA1OCAxMDA2NDQKLS0tIGEvdG9vbHMvdHJhZmZpY19hbm5vdGF0aW9uL2Jpbi9saW51eDY0L3RyYWZmaWNfYW5ub3RhdGlvbl9hdWRpdG9yLnNoYTEKKysrIGIvdG9vbHMvdHJhZmZpY19hbm5vdGF0aW9uL2Jpbi9saW51eDY0L3RyYWZmaWNfYW5ub3RhdGlvbl9hdWRpdG9yLnNoYTEKQEAgLTEgKzEgQEAKLWU3YzQ3NTk0ZDRhZWFmZmY3MDlmNTc0MTgzNTg2ZTdlYmM5OTgxN2EKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCiswOTI0MWNjOWRkM2Y3NmU3ZTE2NDc5OWFjNWVjOTA5ZTQ5MGNmMjY3ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvdHJhZmZpY19hbm5vdGF0aW9uL2Jpbi93aW4zMi90cmFmZmljX2Fubm90YXRpb25fYXVkaXRvci5leGUuc2hhMSBiL3Rvb2xzL3RyYWZmaWNfYW5ub3RhdGlvbi9iaW4vd2luMzIvdHJhZmZpY19hbm5vdGF0aW9uX2F1ZGl0b3IuZXhlLnNoYTEKaW5kZXggMjVmNjUyNS4uZTAzOTgzZSAxMDA2NDQKLS0tIGEvdG9vbHMvdHJhZmZpY19hbm5vdGF0aW9uL2Jpbi93aW4zMi90cmFmZmljX2Fubm90YXRpb25fYXVkaXRvci5leGUuc2hhMQorKysgYi90b29scy90cmFmZmljX2Fubm90YXRpb24vYmluL3dpbjMyL3RyYWZmaWNfYW5ub3RhdGlvbl9hdWRpdG9yLmV4ZS5zaGExCkBAIC0xICsxIEBACi0yM2IzMDRhOTc0OGRjMWNmMDIzZTRjMzVlMzRjMmIwYTkwY2M1ZTk1ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZTExMDc3MWEzMDQ4MGU5Njc2YzgwZmM3OTYzYzlmOWY0MDhmOGFmMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3RyYWZmaWNfYW5ub3RhdGlvbi9zYW1wbGVfdHJhZmZpY19hbm5vdGF0aW9uLmNjIGIvdG9vbHMvdHJhZmZpY19hbm5vdGF0aW9uL3NhbXBsZV90cmFmZmljX2Fubm90YXRpb24uY2MKaW5kZXggMjEwMDFmYS4uZDM1OTE1ZjcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3RyYWZmaWNfYW5ub3RhdGlvbi9zYW1wbGVfdHJhZmZpY19hbm5vdGF0aW9uLmNjCisrKyBiL3Rvb2xzL3RyYWZmaWNfYW5ub3RhdGlvbi9zYW1wbGVfdHJhZmZpY19hbm5vdGF0aW9uLmNjCkBAIC03NCw3ICs3NCw3IEBACiAKIC8vIEV4YW1wbGUgZm9yIE54MSBwYXJ0aWFsIGFubm90YXRpb25zIHdoZXJlIHRoZSBwYXJ0aWFsIGFubm90YXRpb25zIGFyZSBkZWZpbmVkCiAvLyBpbiBQcmVmZXRjaEltYWdlMSBhbmQgUHJlZmV0Y2hJbWFnZTIsIGFuZCB0aGUgY29tcGxldGluZyBhbm5vdGF0aW9uIGlzCi0vLyBkZWZpbmVkIGluIEdldEJpdG1hcC4gUGF0aWFsIGFubm90YXRpb25zIGFyZSBtaXNzaW5nIGNvb2tpZXMgZmllbGRzIGFuZCBhcmUKKy8vIGRlZmluZWQgaW4gR2V0Qml0bWFwLiBQYXJ0aWFsIGFubm90YXRpb25zIGFyZSBtaXNzaW5nIGNvb2tpZXMgZmllbGRzIGFuZCBhcmUKIC8vIGNvbXBsZXRlZCBpbiBHZXRCaXRtYXAgZnVuY3Rpb24uCiB2b2lkIFByZWZldGNoSW1hZ2UxKGNvbnN0IEdVUkwmIHVybCkgewogICBuZXQ6OlBhcnRpYWxOZXR3b3JrVHJhZmZpY0Fubm90YXRpb25UYWcgcGFydGlhbF90cmFmZmljX2Fubm90YXRpb24gPQpAQCAtMTE2LDcgKzExNiw3IEBACiAKIHZvaWQgUHJlZmV0Y2hJbWFnZTIoY29uc3QgR1VSTCYgdXJsKSB7CiAgIG5ldDo6UGFydGlhbE5ldHdvcmtUcmFmZmljQW5ub3RhdGlvblRhZyBwYXJ0aWFsX3RyYWZmaWNfYW5ub3RhdGlvbiA9Ci0gICAgICBuZXQ6OkRlZmluZVBhcnRpYWxOZXR3b3JrVHJhZmZpY0Fubm90YXRpb24oImNyZWRlbmVudGlhbF9hdmF0YXIiLAorICAgICAgbmV0OjpEZWZpbmVQYXJ0aWFsTmV0d29ya1RyYWZmaWNBbm5vdGF0aW9uKCJjcmVkZW50aWFsX2F2YXRhciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJpdG1hcF9mZXRjaGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSIigKICAgICAgICAgc2VtYW50aWNzIHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3RyYWZmaWNfYW5ub3RhdGlvbi9zY3JpcHRzL1JFQURNRS5tZCBiL3Rvb2xzL3RyYWZmaWNfYW5ub3RhdGlvbi9zY3JpcHRzL1JFQURNRS5tZAppbmRleCBiN2JkMzQ0YTUuLmFiNTMzMDQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3RyYWZmaWNfYW5ub3RhdGlvbi9zY3JpcHRzL1JFQURNRS5tZAorKysgYi90b29scy90cmFmZmljX2Fubm90YXRpb24vc2NyaXB0cy9SRUFETUUubWQKQEAgLTIxLDQgKzIxLDExIEBACiAKICMgdXBkYXRlX2Fubm90YXRpb25zX3NoZWV0LnB5CiBUaGlzIHNjcmlwdCB1cGRhdGVzIHRoZSBHb29nbGUgc2hlZXQgdGhhdCBwcmVzZW50cyBhbGwgbmV0d29yayB0cmFmZmljCi1hbm5vdGF0aW9ucy4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCithbm5vdGF0aW9ucy4KKworIyBleHRyYWN0b3IucHkKK1NjYW5zIHRocm91Z2ggYSBzZXQgb2Ygc3BlY2lmaWVkIEMrKyBmaWxlcyB0byBkZXRlY3QgZXhpc3RpbmcgdHJhZmZpYworYW5ub3RhdGlvbnMgaW4gY29kZS4gSXQgdXNlcyByZWdleCBleHByZXNzaW9ucyBvbiBzb3VyY2UgZmlsZXMuCisKKyMgZXh0cmFjdG9yX3Rlc3QucHkKK1VuaXQgdGVzdHMgZm9yIGV4dHJhY3Rvci5weS4KZGlmZiAtLWdpdCBhL3Rvb2xzL3RyYWZmaWNfYW5ub3RhdGlvbi9zY3JpcHRzL3VwZGF0ZV9hbm5vdGF0aW9uc19zaGVldC5weSBiL3Rvb2xzL3RyYWZmaWNfYW5ub3RhdGlvbi9zY3JpcHRzL3VwZGF0ZV9hbm5vdGF0aW9uc19zaGVldC5weQppbmRleCA0MDQ1MDgzNi4uMTY4ODBlYjYgMTAwNzU1Ci0tLSBhL3Rvb2xzL3RyYWZmaWNfYW5ub3RhdGlvbi9zY3JpcHRzL3VwZGF0ZV9hbm5vdGF0aW9uc19zaGVldC5weQorKysgYi90b29scy90cmFmZmljX2Fubm90YXRpb24vc2NyaXB0cy91cGRhdGVfYW5ub3RhdGlvbnNfc2hlZXQucHkKQEAgLTU1LDcgKzU1LDcgQEAKICAgICAgIHNpbGVudF9jaGFuZ2VfY29sdW1uczogbGlzdCBvZiBzdHIKICAgICAgICAgICBMaXN0IG9mIHRoZSBjb2x1bW5zIHdob3NlIGNoYW5nZXMgYXJlIG5vdCByZXBvcnRlZCBpbiB0aGUgc3RhdHMuCiAgICAgICBsYXN0X3VwZGF0ZV9jb2x1bW5fbmFtZTogc3RyCi0gICAgICAgICAgSGVhZGVyIG9mIHRoZSBjb2x1bm0gdGhhdCBrZWVwcyB0aGUgbGF0ZXN0IHVwZGF0ZSBkYXRlLgorICAgICAgICAgIEhlYWRlciBvZiB0aGUgY29sdW1uIHRoYXQga2VlcHMgdGhlIGxhdGVzdCB1cGRhdGUgZGF0ZS4KICAgICAgIGNyZWRlbnRpYWxzX2ZpbGVfcGF0aDogc3RyCiAgICAgICAgICAgQWJzb2x1dGUgcGF0aCB0byByZWFkL3NhdmUgdXNlciBjcmVkZW50aWFscy4KICAgICAgIGNsaWVudF9zZWNyZXRfZmlsZV9wYXRoOiBzdHIKQEAgLTM3OCw3ICszNzgsNyBAQAogICAgICAgICAic2lsZW50X2NoYW5nZV9jb2x1bW5zOlxuIgogICAgICAgICAiICBMaXN0IG9mIHRoZSBjb2x1bW5zIHdob3NlIGNoYW5nZXMgYXJlIG5vdCByZXBvcnRlZCBpbiB0aGUgc3RhdHMuXG4iCiAgICAgICAgICJsYXN0X3VwZGF0ZV9jb2x1bW5fbmFtZTpcbiIKLSAgICAgICAgIiAgSGVhZGVyIG9mIHRoZSBjb2x1bm0gdGhhdCBrZWVwcyB0aGUgbGF0ZXN0IHVwZGF0ZSBkYXRlLlxuIgorICAgICAgICAiICBIZWFkZXIgb2YgdGhlIGNvbHVtbiB0aGF0IGtlZXBzIHRoZSBsYXRlc3QgdXBkYXRlIGRhdGUuXG4iCiAgICAgICAgICJjcmVkZW50aWFsc19maWxlX3BhdGg6XG4iCiAgICAgICAgICIgIEFic29sdXRlIHBhdGggb2YgdGhlIGZpbGUgdGhhdCBrZWVwcyB1c2VyIGNyZWRlbnRpYWxzLlxuIgogICAgICAgICAiY2xpZW50X3NlY3JldF9maWxlX3BhdGg6XG4iCkBAIC0zODksNyArMzg5LDcgQEAKIAogZGVmIG1haW4oKToKICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoCi0gICAgICBkZXNjcmlwdGlvbj0iTmV0d29yayBUcmFmZmljIEFubm90YXRpb25zIFNoZWV0IFVwZGF0b3IiKQorICAgICAgZGVzY3JpcHRpb249Ik5ldHdvcmsgVHJhZmZpYyBBbm5vdGF0aW9ucyBTaGVldCBVcGRhdGVyIikKICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKICAgICAgICItLWNvbmZpZy1maWxlIiwKICAgICAgIGhlbHA9IkNvbmZpZ3VyYXRpb25zIGZpbGUuIikKZGlmZiAtLWdpdCBhL3Rvb2xzL3RyYWZmaWNfYW5ub3RhdGlvbi9zdW1tYXJ5L1JFQURNRS5tZCBiL3Rvb2xzL3RyYWZmaWNfYW5ub3RhdGlvbi9zdW1tYXJ5L1JFQURNRS5tZAppbmRleCA4Y2Q0NmU5Li5lY2E3NDgyMCAxMDA2NDQKLS0tIGEvdG9vbHMvdHJhZmZpY19hbm5vdGF0aW9uL3N1bW1hcnkvUkVBRE1FLm1kCisrKyBiL3Rvb2xzL3RyYWZmaWNfYW5ub3RhdGlvbi9zdW1tYXJ5L1JFQURNRS5tZApAQCAtMTcsOCArMTcsOCBAQAogKiBgb3NfbGlzdGA6IExpc3Qgb2YgYWxsIHBsYXRmb3JtcyBvbiB3aGljaCB0aGlzIGFubm90YXRpb24gZXhpc3RzLgogICAgIEN1cnJlbnRseSBvbmx5IGluY2x1ZGluZyBgbGludXhgIGFuZCBgd2luZG93c2AuCiAqIGBmaWxlX3BhdGhgOiBUaGUgZmlsZSBwYXRoIG9mIHRoZSBhbm5vdGF0aW9uLgotKiBgcmVzZXJ2ZWRgOiBSZXNlcnZlcmQgYW5ub3RhdGlvbnMgKGxpa2UgYW5ub3RhdGlvbiBmb3IgdGVzdCBmaWxlcykgaGF2ZSB0aGlzCi0gICAgYXR0cmlidXRlLiBJZiBhbm5vdGF0aW9uIGlzIGEgcmVzZXJ2ZXJkIG9uZSwgaXQgZG9lcyBub3QgaGF2ZQorKiBgcmVzZXJ2ZWRgOiBSZXNlcnZlZCBhbm5vdGF0aW9ucyAobGlrZSBhbm5vdGF0aW9uIGZvciB0ZXN0IGZpbGVzKSBoYXZlIHRoaXMKKyAgICBhdHRyaWJ1dGUuIElmIGFubm90YXRpb24gaXMgYSByZXNlcnZlZCBvbmUsIGl0IGRvZXMgbm90IGhhdmUKICAgYGNvbnRlbnRfaGFzaF9jb2RlYCBhbmQgYGZpbGVfcGF0aGAgYXR0cmlidXRlcy4KICogYGRlcHJlY2F0ZWRgOiBPbmNlIGFuIGFubm90YXRpb24gaXMgcmVtb3ZlZCBmcm9tIHRoZSByZXBvc2l0b3J5LCB0aGlzCiAgICAgYXR0cmlidXRlIGlzIGFkZGVkIHRvIGl0cyBpdGVtIHdpdGggdmFsdWUgZXF1YWwgdG8gdGhlIGRlcHJlY2F0aW9uIGRhdGUsIGFuZApkaWZmIC0tZ2l0IGEvdWkvYWNjZXNzaWJpbGl0eS9heF90YWJsZV9pbmZvLmNjIGIvdWkvYWNjZXNzaWJpbGl0eS9heF90YWJsZV9pbmZvLmNjCmluZGV4IDllNWJkMWMuLjA1YTEzMjUgMTAwNjQ0Ci0tLSBhL3VpL2FjY2Vzc2liaWxpdHkvYXhfdGFibGVfaW5mby5jYworKysgYi91aS9hY2Nlc3NpYmlsaXR5L2F4X3RhYmxlX2luZm8uY2MKQEAgLTUzLDcgKzUzLDcgQEAKICAgICAgICAgY2hpbGQtPmRhdGEoKS5yb2xlID09IGF4Ojptb2pvbTo6Um9sZTo6a0dyb3VwKSB7CiAgICAgICBGaW5kUm93c0FuZFRoZW5DZWxscyhjaGlsZCwgcm93X25vZGVzLCBjZWxsX25vZGVzX3Blcl9yb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXB0aW9uX25vZGVfaWQpOwotICAgIH0gZWxzZSBpZiAoY2hpbGQtPmRhdGEoKS5yb2xlID09IGF4Ojptb2pvbTo6Um9sZTo6a1JvdykgeworICAgIH0gZWxzZSBpZiAoSXNUYWJsZVJvdyhjaGlsZC0+ZGF0YSgpLnJvbGUpKSB7CiAgICAgICByb3dfbm9kZXMtPnB1c2hfYmFjayhjaGlsZCk7CiAgICAgICBjZWxsX25vZGVzX3Blcl9yb3ctPnB1c2hfYmFjayhzdGQ6OnZlY3RvcjxBWE5vZGUqPigpKTsKICAgICAgIEZpbmRDZWxsc0luUm93KGNoaWxkLCAmY2VsbF9ub2Rlc19wZXJfcm93LT5iYWNrKCkpOwpkaWZmIC0tZ2l0IGEvdWkvYXVyYS93aW5kb3cuY2MgYi91aS9hdXJhL3dpbmRvdy5jYwppbmRleCA4ODI3MmU0Li40M2M5ZWU3IDEwMDY0NAotLS0gYS91aS9hdXJhL3dpbmRvdy5jYworKysgYi91aS9hdXJhL3dpbmRvdy5jYwpAQCAtMTIyLDcgKzEyMiw2IEBACiAKICAgaWYgKGxheWVyKCktPm93bmVyKCkgPT0gdGhpcykKICAgICBsYXllcigpLT5Db21wbGV0ZUFsbEFuaW1hdGlvbnMoKTsKLSAgbGF5ZXIoKS0+U3VwcHJlc3NQYWludCgpOwogCiAgIC8vIExldCB0aGUgZGVsZWdhdGUga25vdyB3ZSdyZSBpbiB0aGUgcHJvY2Vzc2luZyBvZiBkZXN0cm95aW5nLgogICBpZiAoZGVsZWdhdGVfKQpAQCAtNzQ1LDEwICs3NDQsNiBAQAogICByZXR1cm4gaG9zdC0+Q2FwdHVyZVN5c3RlbUtleUV2ZW50cyhzdGQ6Om1vdmUoZG9tX2NvZGVzKSk7CiB9CiAKLXZvaWQgV2luZG93OjpTdXBwcmVzc1BhaW50KCkgewotICBsYXllcigpLT5TdXBwcmVzc1BhaW50KCk7Ci19Ci0KIC8vIHtTZXQsR2V0LENsZWFyfVByb3BlcnR5IGFyZSBpbXBsZW1lbnRlZCBpbiBjbGFzc19wcm9wZXJ0eS5oLgogCiB2b2lkIFdpbmRvdzo6U2V0TmF0aXZlV2luZG93UHJvcGVydHkoY29uc3QgY2hhcioga2V5LCB2b2lkKiB2YWx1ZSkgewpkaWZmIC0tZ2l0IGEvdWkvYXVyYS93aW5kb3cuaCBiL3VpL2F1cmEvd2luZG93LmgKaW5kZXggODU1OGE1Yy4uNjc0NmYzYyAxMDA2NDQKLS0tIGEvdWkvYXVyYS93aW5kb3cuaAorKysgYi91aS9hdXJhL3dpbmRvdy5oCkBAIC0zODIsMTEgKzM4Miw2IEBACiAgIHN0ZDo6dW5pcXVlX3B0cjxTY29wZWRLZXlib2FyZEhvb2s+IENhcHR1cmVTeXN0ZW1LZXlFdmVudHMoCiAgICAgICBiYXNlOjpPcHRpb25hbDxiYXNlOjpmbGF0X3NldDx1aTo6RG9tQ29kZT4+IGNvZGVzKTsKIAotICAvLyBTdXBwcmVzc2VzIHBhaW50aW5nIHdpbmRvdyBjb250ZW50IGJ5IGRpc2dhcmRpbmcgZGFtYWdlZCByZWN0IGFuZCBpZ25vcmluZwotICAvLyBuZXcgcGFpbnQgcmVxdWVzdHMuIFRoaXMgaXMgYSBvbmUgd2F5IG9wZXJhdGlvbiBhbmQgdGhlcmUgaXMgbm8gd2F5IHRvCi0gIC8vIHJlZW5hYmxlIHBhaW50aW5nLgotICB2b2lkIFN1cHByZXNzUGFpbnQoKTsKLQogICAvLyBOYXRpdmVXaWRnZXQ6OltHU11ldE5hdGl2ZVdpbmRvd1Byb3BlcnR5IHVzZSBzdHJpbmdzIGFzIGtleXMsIGFuZCB0aGlzIGlzCiAgIC8vIGRpZmZpY3VsdCB0byBjaGFuZ2Ugd2hpbGUgcmV0YWluaW5nIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBwbGF0Zm9ybXMuCiAgIC8vIFRPRE8oYmVucmcpOiBGaW5kIGEgYmV0dGVyIHNvbHV0aW9uLgpkaWZmIC0tZ2l0IGEvdWkvYXVyYS93aW5kb3dfdW5pdHRlc3QuY2MgYi91aS9hdXJhL3dpbmRvd191bml0dGVzdC5jYwppbmRleCA5NDFlMjQ2My4uYWQ4NjVmMCAxMDA2NDQKLS0tIGEvdWkvYXVyYS93aW5kb3dfdW5pdHRlc3QuY2MKKysrIGIvdWkvYXVyYS93aW5kb3dfdW5pdHRlc3QuY2MKQEAgLTI5MTAsOSArMjkxMCw5IEBACiAKICAgZGVsZWdhdGUuY2xlYXJfYm91bmRzX2NoYW5nZWQoKTsKIAotICAvLyBTdXBwcmVzcyBwYWludCBvbiB0aGUgd2luZG93IHNpbmNlIGl0IGlzIGhpZGRlbiAoc2hvdWxkIHJlc2V0IHRoZSBsYXllcidzCisgIC8vIFN1cHByZXNzIHBhaW50IG9uIHRoZSBsYXllciBzaW5jZSBpdCBpcyBoaWRkZW4gKHNob3VsZCByZXNldCB0aGUgbGF5ZXIncwogICAvLyBkZWxlZ2F0ZSB0byBOVUxMKQotICB3aW5kb3ctPlN1cHByZXNzUGFpbnQoKTsKKyAgd2luZG93LT5sYXllcigpLT5TdXBwcmVzc1BhaW50KCk7CiAgIEVYUEVDVF9FUShOVUxMLCB3aW5kb3ctPmxheWVyKCktPmRlbGVnYXRlKCkpOwogCiAgIC8vIEFuaW1hdGUgdG8gYSBkaWZmZXJlbnQgcG9zaXRpb24uCmRpZmYgLS1naXQgYS91aS9iYXNlL2NsaXBib2FyZC9jbGlwYm9hcmRfZm9ybWF0X3R5cGUuaCBiL3VpL2Jhc2UvY2xpcGJvYXJkL2NsaXBib2FyZF9mb3JtYXRfdHlwZS5oCmluZGV4IDk4YzA2ZGUuLmY2OWI0NmQgMTAwNjQ0Ci0tLSBhL3VpL2Jhc2UvY2xpcGJvYXJkL2NsaXBib2FyZF9mb3JtYXRfdHlwZS5oCisrKyBiL3VpL2Jhc2UvY2xpcGJvYXJkL2NsaXBib2FyZF9mb3JtYXRfdHlwZS5oCkBAIC0zNyw3ICszNywxMCBAQAogCiAgIC8vIEdldHMgdGhlIENsaXBib2FyZEZvcm1hdFR5cGUgY29ycmVzcG9uZGluZyB0byBhbiBhcmJpdHJhcnkgZm9ybWF0IHN0cmluZywKICAgLy8gcmVnaXN0ZXJpbmcgaXQgd2l0aCB0aGUgc3lzdGVtIGlmIG5lZWRlZC4gRHVlIHRvIFdpbmRvd3MvTGludXgKLSAgLy8gbGltaXRhdGlvbnMsIHxmb3JtYXRfc3RyaW5nfCBtdXN0IG5ldmVyIGJlIGNvbnRyb2xsZWQgYnkgdGhlIHVzZXIuCisgIC8vIGxpbWl0YXRpb25zLCBwbGVhc2UgcGxhY2UgbGltaXRzIG9uIHRoZSBhbW91bnQgb2YgR2V0VHlwZSBjYWxscyB3aXRoIHVuaXF1ZQorICAvLyB8Zm9ybWF0X3N0cmluZ3wgYXJndW1lbnRzLCB3aGVuIGluZ2VzdGluZyB8Zm9ybWF0X3N0cmluZ3wgZnJvbQorICAvLyB1bnRydXN0ZWQgc291cmNlcywgc3VjaCBhcyByZW5kZXJlciBwcm9jZXNzZXMuIEluIFdpbmRvd3MsIGEgZmFpbHVyZSB3aWxsCisgIC8vIHJldHVybiBhbiBpbnZhbGlkIGZvcm1hdCB3aXRoIERlc2VyaWFsaXplKCknZWQgdmFsdWUgb2YgIjAiLgogICBzdGF0aWMgQ2xpcGJvYXJkRm9ybWF0VHlwZSBHZXRUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmb3JtYXRfc3RyaW5nKTsKIAogICAvLyBHZXQgZm9ybWF0IGlkZW50aWZpZXJzIGZvciB2YXJpb3VzIHR5cGVzLgpkaWZmIC0tZ2l0IGEvdWkvYmFzZS9jbGlwYm9hcmQvY2xpcGJvYXJkX2Zvcm1hdF90eXBlX2F1cmEuY2MgYi91aS9iYXNlL2NsaXBib2FyZC9jbGlwYm9hcmRfZm9ybWF0X3R5cGVfYXVyYS5jYwppbmRleCA4NDhmYWZkLi5kNjcxNjNiIDEwMDY0NAotLS0gYS91aS9iYXNlL2NsaXBib2FyZC9jbGlwYm9hcmRfZm9ybWF0X3R5cGVfYXVyYS5jYworKysgYi91aS9iYXNlL2NsaXBib2FyZC9jbGlwYm9hcmRfZm9ybWF0X3R5cGVfYXVyYS5jYwpAQCAtMTIsMTAgKzEyLDEwIEBACiBjb25zdGV4cHIgY2hhciBrTWltZVR5cGVGaWxlbmFtZVtdID0gImNocm9taXVtL2ZpbGVuYW1lIjsKIH0KIAotLy8gVE9ETyhodWFuZ2Rhcndpbik6IEludmVzdGlnYXRlIENsaXBib2FyZEZvcm1hdFR5cGUgYmVjb21pbmcgYSB3cmFwcGVyCi0vLyBhcm91bmQgYW4gWDExIDo6QXRvbS4gVGhpcyB3YXNuJ3QgcG9zc2libGUgaW4gdGhlIHBhc3QsIGJlY2F1c2UgdW5pdCB0ZXN0cwotLy8gc3Bhd25lZCBhIG5ldyBYMTEgc2VydmVyIGZvciBlYWNoIHRlc3QsIG1lYW5pbmcgQXRvbSBudW1lcmljIHZhbHVlcyBkaWRuJ3QKLS8vIHBlcnNpc3QgYWNyb3NzIHRlc3RzLgorLy8gVE9ETyhodWFuZ2Rhcndpbik6IEludmVzdGlnYXRlIGNyZWF0aW5nIGEgbmV3IGNsaXBib2FyZF9mb3JtYXRfdHlwZV94MTEgYXMgYQorLy8gd3JhcHBlciBhcm91bmQgYW4gWDExIDo6QXRvbS4gVGhpcyB3YXNuJ3QgcG9zc2libGUgaW4gdGhlIHBhc3QsIGJlY2F1c2UgdW5pdAorLy8gdGVzdHMgc3Bhd25lZCBhIG5ldyBYMTEgc2VydmVyIGZvciBlYWNoIHRlc3QsIG1lYW5pbmcgQXRvbSBudW1lcmljIHZhbHVlcworLy8gZGlkbid0IHBlcnNpc3QgYWNyb3NzIHRlc3RzLgogQ2xpcGJvYXJkRm9ybWF0VHlwZTo6Q2xpcGJvYXJkRm9ybWF0VHlwZSgpID0gZGVmYXVsdDsKIAogQ2xpcGJvYXJkRm9ybWF0VHlwZTo6fkNsaXBib2FyZEZvcm1hdFR5cGUoKSA9IGRlZmF1bHQ7CmRpZmYgLS1naXQgYS91aS9iYXNlL2NsaXBib2FyZC9jbGlwYm9hcmRfZm9ybWF0X3R5cGVfd2luLmNjIGIvdWkvYmFzZS9jbGlwYm9hcmQvY2xpcGJvYXJkX2Zvcm1hdF90eXBlX3dpbi5jYwppbmRleCAzNTM4ZWVmYy4uODQ0MDRkMSAxMDA2NDQKLS0tIGEvdWkvYmFzZS9jbGlwYm9hcmQvY2xpcGJvYXJkX2Zvcm1hdF90eXBlX3dpbi5jYworKysgYi91aS9iYXNlL2NsaXBib2FyZC9jbGlwYm9hcmRfZm9ybWF0X3R5cGVfd2luLmNjCkBAIC04LDYgKzgsNyBAQAogCiAjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCiAjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcHRyX3V0aWwuaCIKKyNpbmNsdWRlICJiYXNlL21ldHJpY3MvaGlzdG9ncmFtX2Z1bmN0aW9ucy5oIgogI2luY2x1ZGUgImJhc2Uvbm9fZGVzdHJ1Y3Rvci5oIgogI2luY2x1ZGUgImJhc2Uvc3RyaW5ncy9zdHJpbmdfbnVtYmVyX2NvbnZlcnNpb25zLmgiCiAjaW5jbHVkZSAiYmFzZS9zdHJpbmdzL3V0Zl9zdHJpbmdfY29udmVyc2lvbnMuaCIKQEAgLTI5LDcgKzMwLDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIHR5bWVkKQogICAgIDogZGF0YV97LyogLmNmRm9ybWF0ICovIHN0YXRpY19jYXN0PENMSVBGT1JNQVQ+KG5hdGl2ZV9mb3JtYXQpLAogICAgICAgICAgICAgLyogLnB0ZCAqLyBudWxscHRyLCAvKiAuZHdBc3BlY3QgKi8gRFZBU1BFQ1RfQ09OVEVOVCwKLSAgICAgICAgICAgIC8qIC5saW5kZXggKi8gaW5kZXgsIC8qIC50eW1lZCovIHR5bWVkfSB7fQorICAgICAgICAgICAgLyogLmxpbmRleCAqLyBpbmRleCwgLyogLnR5bWVkKi8gdHltZWR9IHsKKyAgLy8gTG9nIHRoZSBmcmVxdWVuY3kgb2YgaW52YWxpZCBmb3JtYXRzIGJlaW5nIGlucHV0IGludG8gdGhlIGNvbnN0cnVjdG9yLgorICBpZiAoIW5hdGl2ZV9mb3JtYXQpIHsKKyAgICBzdGF0aWMgaW50IGVycm9yX2NvdW50ID0gMDsKKyAgICArK2Vycm9yX2NvdW50OworICAgIC8vIFRPRE8oaHR0cHM6Ly9jcmJ1Zy5jb20vMTAwMDkxOSk6IEV2YWx1YXRlIGFuZCByZW1vdmUgVU1BIG1ldHJpY3MgYWZ0ZXIKKyAgICAvLyBlbm91Z2ggZGF0YSBpcyBnYXRoZXJlZC4KKyAgICBiYXNlOjpVbWFIaXN0b2dyYW1Db3VudHMxMDAoIkNsaXBib2FyZC5SZWdpc3RlckNsaXBib2FyZEZvcm1hdEZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9jb3VudCk7CisgIH0KK30KIAogQ2xpcGJvYXJkRm9ybWF0VHlwZTo6fkNsaXBib2FyZEZvcm1hdFR5cGUoKSA9IGRlZmF1bHQ7CiAKZGlmZiAtLWdpdCBhL3VpL2Jhc2UvY2xpcGJvYXJkL2NsaXBib2FyZF94MTEuY2MgYi91aS9iYXNlL2NsaXBib2FyZC9jbGlwYm9hcmRfeDExLmNjCmluZGV4IGIzMTg2MTdkNy4uNjg3MDg3M2EgMTAwNjQ0Ci0tLSBhL3VpL2Jhc2UvY2xpcGJvYXJkL2NsaXBib2FyZF94MTEuY2MKKysrIGIvdWkvYmFzZS9jbGlwYm9hcmQvY2xpcGJvYXJkX3gxMS5jYwpAQCAtNzc2LDExICs3NzYsNiBAQAogdm9pZCBDbGlwYm9hcmRYMTE6OldyaXRlRGF0YShjb25zdCBDbGlwYm9hcmRGb3JtYXRUeXBlJiBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRhdGFfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRhdGFfbGVuKSB7Ci0gIC8vIFdlIGFzc3VtZSB0aGF0IGNlcnRhaW4gbWFwcGluZyB0eXBlcyBhcmUgb25seSB3cml0dGVuIGJ5IHRydXN0ZWQgY29kZS4KLSAgLy8gVGhlcmVmb3JlIHdlIG11c3QgdXBrZWVwIHRoZWlyIGludGVncml0eS4KLSAgaWYgKGZvcm1hdC5FcXVhbHMoQ2xpcGJvYXJkRm9ybWF0VHlwZTo6R2V0Qml0bWFwVHlwZSgpKSkKLSAgICByZXR1cm47Ci0KICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4gYnl0ZXMoZGF0YV9kYXRhLCBkYXRhX2RhdGEgKyBkYXRhX2xlbik7CiAgIHNjb3BlZF9yZWZwdHI8YmFzZTo6UmVmQ291bnRlZE1lbW9yeT4gbWVtKAogICAgICAgYmFzZTo6UmVmQ291bnRlZEJ5dGVzOjpUYWtlVmVjdG9yKCZieXRlcykpOwpkaWZmIC0tZ2l0IGEvdWkvYmFzZS9nbGliL2dsaWJfaW50ZWdlcnMuaCBiL3VpL2Jhc2UvZ2xpYi9nbGliX2ludGVnZXJzLmgKaW5kZXggYTg3NWZmZS4uMjNjZWQwZSAxMDA2NDQKLS0tIGEvdWkvYmFzZS9nbGliL2dsaWJfaW50ZWdlcnMuaAorKysgYi91aS9iYXNlL2dsaWIvZ2xpYl9pbnRlZ2Vycy5oCkBAIC01LDYgKzUsOCBAQAogI2lmbmRlZiBVSV9CQVNFX0dMSUJfR0xJQl9JTlRFR0VSU19IXwogI2RlZmluZSBVSV9CQVNFX0dMSUJfR0xJQl9JTlRFR0VSU19IXwogCisjaW5jbHVkZSA8Y3N0ZGludD4KKwogLy8gR0xpYi9HT2JqZWN0L0d0ayBhbGwgdXNlIHRoZWlyIG93biBpbnRlZ2VyIHR5cGVkZWZzLiBUaGV5IGFyZSBjb3BpZWQgaGVyZQogLy8gZm9yIGZvcndhcmQgZGVjbGFyYXRpb24gcmVhc29ucyBzbyB3ZSBkb24ndCBwdWxsIGluIGFsbCBvZiBnbGliL2d0eXBlcy5oCiAvLyB3aGVuIHdlIGp1c3QgbmVlZCBhIGdwb2ludGVyLgpAQCAtMTcsOSArMTksOSBAQAogdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBndXNob3J0OwogdHlwZWRlZiB1bnNpZ25lZCBsb25nIGd1bG9uZzsKIHR5cGVkZWYgdW5zaWduZWQgaW50IGd1aW50OwordHlwZWRlZiBkb3VibGUgZ2RvdWJsZTsKIAotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBndWludDE2OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgZ3VpbnQzMjsKK3R5cGVkZWYgaW50NjRfdCBnaW50NjQ7CiAKIHR5cGVkZWYgdm9pZCogZ3BvaW50ZXI7CiB0eXBlZGVmIGNvbnN0IHZvaWQgKmdjb25zdHBvaW50ZXI7CmRpZmYgLS1naXQgYS91aS9iYXNlL2ltZS9jaHJvbWVvcy9pbnB1dF9tZXRob2RfdXRpbF91bml0dGVzdC5jYyBiL3VpL2Jhc2UvaW1lL2Nocm9tZW9zL2lucHV0X21ldGhvZF91dGlsX3VuaXR0ZXN0LmNjCmluZGV4IDQ0ZmU1NmEuLjJlMjExNTk3IDEwMDY0NAotLS0gYS91aS9iYXNlL2ltZS9jaHJvbWVvcy9pbnB1dF9tZXRob2RfdXRpbF91bml0dGVzdC5jYworKysgYi91aS9iYXNlL2ltZS9jaHJvbWVvcy9pbnB1dF9tZXRob2RfdXRpbF91bml0dGVzdC5jYwpAQCAtMTU3LDggKzE1Nyw4IEBACiAgIH0KICAgewogICAgIElucHV0TWV0aG9kRGVzY3JpcHRvciBkZXNjID0KLSAgICAgICAgR2V0RGVzYygieGtiOmVzOmNhdDpjYXQiLCAiZXMoY2F0KSIsICJjYSIsICJDQVMiKTsKLSAgICBFWFBFQ1RfRVEoQVNDSUlUb1VURjE2KCJDQVMiKSwgdXRpbF8uR2V0SW5wdXRNZXRob2RTaG9ydE5hbWUoZGVzYykpOworICAgICAgICBHZXREZXNjKCJ4a2I6ZXM6Y2F0OmNhdCIsICJlcyhjYXQpIiwgImNhIiwgIkNBVCIpOworICAgIEVYUEVDVF9FUShBU0NJSVRvVVRGMTYoIkNBVCIpLCB1dGlsXy5HZXRJbnB1dE1ldGhvZFNob3J0TmFtZShkZXNjKSk7CiAgIH0KICAgewogICAgIElucHV0TWV0aG9kRGVzY3JpcHRvciBkZXNjID0KZGlmZiAtLWdpdCBhL3VpL2Rpc3BsYXkvbWFuYWdlci9kaXNwbGF5X2NoYW5nZV9vYnNlcnZlci5jYyBiL3VpL2Rpc3BsYXkvbWFuYWdlci9kaXNwbGF5X2NoYW5nZV9vYnNlcnZlci5jYwppbmRleCA5ODJkZDlmLi43YmViMmNhIDEwMDY0NAotLS0gYS91aS9kaXNwbGF5L21hbmFnZXIvZGlzcGxheV9jaGFuZ2Vfb2JzZXJ2ZXIuY2MKKysrIGIvdWkvZGlzcGxheS9tYW5hZ2VyL2Rpc3BsYXlfY2hhbmdlX29ic2VydmVyLmNjCkBAIC00NSw3ICs0NSw3IEBACiAvLyBVcGRhdGUgdGhlIGxpc3Qgb2Ygem9vbSBsZXZlbHMgd2hlbmV2ZXIgYSBuZXcgZGV2aWNlIHNjYWxlIGZhY3RvciBpcyBhZGRlZAogLy8gaGVyZS4gU2VlIHpvb20gbGV2ZWwgbGlzdCBpbiAvdWkvZGlzcGxheS9tYW5hZ2VyL2Rpc3BsYXlfdXRpbC5jYwogY29uc3QgRGV2aWNlU2NhbGVGYWN0b3JEUElUaHJlc2hvbGQga1RocmVzaG9sZFRhYmxlRm9ySW50ZXJuYWxbXSA9IHsKLSAgICB7MzIwLmYsIDIuNjY2NjZmfSwgezI3MC4wZiwgMi4yNWZ9LCB7MjMwLjBmLCAyLjBmfSwgezIyMC4wZiwgMS43Nzc3N2Z9LAorICAgIHszMDAuZiwgMi42NjY2NmZ9LCB7MjcwLjBmLCAyLjI1Zn0sIHsyMzAuMGYsIDIuMGZ9LCB7MjIwLjBmLCAxLjc3Nzc3Zn0sCiAgICAgezE4MC4wZiwgMS42Zn0sICAgIHsxNTAuMGYsIDEuMjVmfSwgezAuMGYsIDEuMGZ9LAogfTsKIApAQCAtMzA2LDE2ICszMDYsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgPyAwCiAgICAgICAgICAgICAgICAgICAgICAgICA6IGtJbmNoSW5NbSAqIG1vZGVfaW5mby0+c2l6ZSgpLndpZHRoKCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hcHNob3QtPnBoeXNpY2FsX3NpemUoKS53aWR0aCgpOwotICBjb25zdGV4cHIgZ2Z4OjpTaXplIGsyMjVEaXNwbGF5U2l6ZUhhY2soMzAwMCwgMjAwMCk7Ci0KICAgaWYgKHNuYXBzaG90LT50eXBlKCkgPT0gRElTUExBWV9DT05ORUNUSU9OX1RZUEVfSU5URVJOQUwpIHsKICAgICBuZXdfaW5mby5zZXRfbmF0aXZlKHRydWUpOwotICAgIC8vIFRPRE8ob3NoaW1hKTogVGhpcyBpcyBhIHN0b3BnYXAgaGFjayB0byBkZWFsIHdpdGggYi83NDg0NTEwNi4KLSAgICAvLyBSZW1vdmUgdGhpcyBoYWNrIHdoZW4gaXQncyByZXNvbHZlZC4KLSAgICBpZiAobW9kZV9pbmZvLT5zaXplKCkgPT0gazIyNURpc3BsYXlTaXplSGFjaykKLSAgICAgIGRldmljZV9zY2FsZV9mYWN0b3IgPSAyLjI1ZjsKLSAgICBlbHNlIGlmIChkcGkpCi0gICAgICBkZXZpY2Vfc2NhbGVfZmFjdG9yID0gRmluZERldmljZVNjYWxlRmFjdG9yKGRwaSk7CisgICAgZGV2aWNlX3NjYWxlX2ZhY3RvciA9IEZpbmREZXZpY2VTY2FsZUZhY3RvcihkcGkpOwogICB9IGVsc2UgewogICAgIE1hbmFnZWREaXNwbGF5TW9kZSBtb2RlOwogICAgIGlmIChkaXNwbGF5X21hbmFnZXJfLT5HZXRTZWxlY3RlZE1vZGVGb3JEaXNwbGF5SWQoc25hcHNob3QtPmRpc3BsYXlfaWQoKSwKZGlmZiAtLWdpdCBhL3VpL2ZpbGVfbWFuYWdlci9maWxlX21hbmFnZXIvZm9yZWdyb3VuZC9qcy91aS9CVUlMRC5nbiBiL3VpL2ZpbGVfbWFuYWdlci9maWxlX21hbmFnZXIvZm9yZWdyb3VuZC9qcy91aS9CVUlMRC5nbgppbmRleCA5ZjU4MjY4Li41YjEyZTk0IDEwMDY0NAotLS0gYS91aS9maWxlX21hbmFnZXIvZmlsZV9tYW5hZ2VyL2ZvcmVncm91bmQvanMvdWkvQlVJTEQuZ24KKysrIGIvdWkvZmlsZV9tYW5hZ2VyL2ZpbGVfbWFuYWdlci9mb3JlZ3JvdW5kL2pzL3VpL0JVSUxELmduCkBAIC0yMzMsNiArMjMzLDE1IEBACiAgICAgIi8vdWkvd2VidWkvcmVzb3VyY2VzL2pzL2NyOnVpIiwKICAgICAiLy91aS93ZWJ1aS9yZXNvdXJjZXMvanMvY3IvdWk6ZGlhbG9ncyIsCiAgIF0KKyAgZXh0ZXJuc19saXN0ID0gWyAiJGV4dGVybnNfcGF0aC9jaHJvbWVfZXh0ZW5zaW9ucy5qcyIgXQorfQorCitqc191bml0dGVzdCgiZmlsZV9tYW5hZ2VyX2RpYWxvZ19iYXNlX3VuaXR0ZXN0IikgeworICBkZXBzID0gWworICAgICI6ZmlsZV9tYW5hZ2VyX2RpYWxvZ19iYXNlIiwKKyAgICAiLy91aS9maWxlX21hbmFnZXIvYmFzZS9qczp0ZXN0X2Vycm9yX3JlcG9ydGluZyIsCisgICAgIi8vdWkvd2VidWkvcmVzb3VyY2VzL2pzOndlYnVpX3Jlc291cmNlX3Rlc3QiLAorICBdCiB9CiAKIGpzX2xpYnJhcnkoImZpbGVfbWFuYWdlcl91aSIpIHsKQEAgLTQ5Miw2ICs1MDEsNyBAQAogICAgICI6YWN0aW9uc19zdWJtZW51X3VuaXR0ZXN0IiwKICAgICAiOmRpcmVjdG9yeV90cmVlX3VuaXR0ZXN0IiwKICAgICAiOmZpbGVfbGlzdF9zZWxlY3Rpb25fbW9kZWxfdW5pdHRlc3QiLAorICAgICI6ZmlsZV9tYW5hZ2VyX2RpYWxvZ19iYXNlX3VuaXR0ZXN0IiwKICAgICAiOmZpbGVfdGFibGVfbGlzdF91bml0dGVzdCIsCiAgICAgIjpmaWxlX3RhYmxlX3VuaXR0ZXN0IiwKICAgICAiOmZpbGVfdGFwX2hhbmRsZXJfdW5pdHRlc3QiLApkaWZmIC0tZ2l0IGEvdWkvZmlsZV9tYW5hZ2VyL2ZpbGVfbWFuYWdlci9mb3JlZ3JvdW5kL2pzL3VpL2ZpbGVfbWFuYWdlcl9kaWFsb2dfYmFzZS5qcyBiL3VpL2ZpbGVfbWFuYWdlci9maWxlX21hbmFnZXIvZm9yZWdyb3VuZC9qcy91aS9maWxlX21hbmFnZXJfZGlhbG9nX2Jhc2UuanMKaW5kZXggYjM5NTNmZC4uYzk0Y2FhYWEgMTAwNjQ0Ci0tLSBhL3VpL2ZpbGVfbWFuYWdlci9maWxlX21hbmFnZXIvZm9yZWdyb3VuZC9qcy91aS9maWxlX21hbmFnZXJfZGlhbG9nX2Jhc2UuanMKKysrIGIvdWkvZmlsZV9tYW5hZ2VyL2ZpbGVfbWFuYWdlci9mb3JlZ3JvdW5kL2pzL3VpL2ZpbGVfbWFuYWdlcl9kaWFsb2dfYmFzZS5qcwpAQCAtODQsMTEgKzg0LDExIEBACiAgICAqIEBwYXJhbSB7RnVuY3Rpb249fSBvcHRfb25IaWRlIENhbGxlZCB3aGVuIHRoZSBkaWFsb2cgaXMgaGlkZGVuLgogICAgKi8KICAgaGlkZShvcHRfb25IaWRlKSB7CisgICAgRmlsZU1hbmFnZXJEaWFsb2dCYXNlLnNob3duID0gZmFsc2U7CiAgICAgc3VwZXIuaGlkZSgoKSA9PiB7CiAgICAgICBpZiAob3B0X29uSGlkZSkgewogICAgICAgICBvcHRfb25IaWRlKCk7CiAgICAgICB9Ci0gICAgICBGaWxlTWFuYWdlckRpYWxvZ0Jhc2Uuc2hvd24gPSBmYWxzZTsKICAgICB9KTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvdWkvZmlsZV9tYW5hZ2VyL2ZpbGVfbWFuYWdlci9mb3JlZ3JvdW5kL2pzL3VpL2ZpbGVfbWFuYWdlcl9kaWFsb2dfYmFzZV91bml0dGVzdC5qcyBiL3VpL2ZpbGVfbWFuYWdlci9maWxlX21hbmFnZXIvZm9yZWdyb3VuZC9qcy91aS9maWxlX21hbmFnZXJfZGlhbG9nX2Jhc2VfdW5pdHRlc3QuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFlOGNiZgotLS0gL2Rldi9udWxsCisrKyBiL3VpL2ZpbGVfbWFuYWdlci9maWxlX21hbmFnZXIvZm9yZWdyb3VuZC9qcy91aS9maWxlX21hbmFnZXJfZGlhbG9nX2Jhc2VfdW5pdHRlc3QuanMKQEAgLTAsMCArMSwzMyBAQAorLy8gQ29weXJpZ2h0IDIwMTkgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCithc3luYyBmdW5jdGlvbiB0ZXN0U2hvd0RpYWxvZ0FmdGVySGlkZShkb25lKSB7CisgIC8vIFBvbHlmaWxsIGNocm9tZS5hcHAud2luZG93LmN1cnJlbnQoKS4KKyAgLyoqIEBzdXBwcmVzcyB7ZHVwbGljYXRlfGNoZWNrVHlwZXN9ICovCisgIGNocm9tZS5hcHAgPSB7d2luZG93OiB7Y3VycmVudDogKCkgPT4gbnVsbH19OworCisgIGNvbnN0IGNvbnRhaW5lciA9CisgICAgICBhc3NlcnRJbnN0YW5jZW9mKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLCBIVE1MRWxlbWVudCk7CisKKyAgZnVuY3Rpb24gaXNTaG93bigpIHsKKyAgICByZXR1cm4gISFjb250YWluZXIucXVlcnlTZWxlY3RvcignLmNyLWRpYWxvZy1jb250YWluZXIuc2hvd24nKTsKKyAgfQorCisgIGNvbnN0IGRpYWxvZyA9IG5ldyBGaWxlTWFuYWdlckRpYWxvZ0Jhc2UoY29udGFpbmVyKTsKKyAgLy8gU2hvdyB0aGUgZGlhbG9nIGFuZCB3YWl0IHVudGlsIC5zaG93biBpcyBzZXQgb24gLmNyLWRpYWxvZy1jb250YWluZXIuCisgIC8vIFRoaXMgaGFwcGVucyBhc3luYy4KKyAgZGlhbG9nLnNob3dCbGFua0RpYWxvZygpOworICBhd2FpdCB3YWl0VW50aWwoaXNTaG93bik7CisKKyAgLy8gQ2FsbCBoaWRlLCBhbmQgdmFsaWRhdGUgLnNob3duIGlzIHJlbW92ZWQgKHN5bmMpLgorICBkaWFsb2cuaGlkZSgpOworICBhc3NlcnRGYWxzZShpc1Nob3duKCkpOworCisgIC8vIFNob3cgdGhlIGRpYWxvZyBhZ2FpbiBhbmQgZW5zdXJlIHRoYXQgaXQgZ2V0cyBkaXNwbGF5ZWQuCisgIC8vIFByZXZpb3VzbHkgc29tZSBhc3luYyBwcm9jZXNzaW5nIGZyb20gaGlkZSgpIHdvdWxkIHN0b3AKKyAgLy8gdGhlIGRpYWxvZyBzaG93aW5nIGFnYWluIGF0IGFsbCBpZiBpdCB3YXMgY2FsbGVkIHRvbyBzb29uLgorICBkaWFsb2cuc2hvd0JsYW5rRGlhbG9nKCk7CisgIGF3YWl0IHdhaXRVbnRpbChpc1Nob3duKTsKKyAgZG9uZSgpOworfQpkaWZmIC0tZ2l0IGEvdWkvZ2Z4L3gveDExX2F0b21fY2FjaGUuY2MgYi91aS9nZngveC94MTFfYXRvbV9jYWNoZS5jYwppbmRleCA3YmE0MjY4Li44YzZlM2ExIDEwMDY0NAotLS0gYS91aS9nZngveC94MTFfYXRvbV9jYWNoZS5jYworKysgYi91aS9nZngveC94MTFfYXRvbV9jYWNoZS5jYwpAQCAtMTIsNiArMTIsNyBAQAogCiAjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCiAjaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2luZ2xldG9uLmgiCisjaW5jbHVkZSAiYmFzZS9tZXRyaWNzL2hpc3RvZ3JhbV9mdW5jdGlvbnMuaCIKICNpbmNsdWRlICJiYXNlL3N0bF91dGlsLmgiCiAKIG5hbWVzcGFjZSB7CkBAIC0yNzAsNyArMjcxLDE2IEBACiAgIGlmIChpdCAhPSBjYWNoZWRfYXRvbXNfLmVuZCgpKQogICAgIHJldHVybiBpdC0+c2Vjb25kOwogCisgIC8vIFhJbnRlcm5BdG9tIHJldHVybnMgTm9uZSBvbiBmYWlsdXJlLiBTb3VyY2U6CisgIC8vIGh0dHBzOi8vd3d3Lngub3JnL3JlbGVhc2VzL1gxMVI3LjUvZG9jL21hbi9tYW4zL1hJbnRlcm5BdG9tLjMuaHRtbAogICBYQXRvbSBhdG9tID0gWEludGVybkF0b20oeGRpc3BsYXlfLCBuYW1lLCBGYWxzZSk7CisgIGlmIChhdG9tID09IE5vbmUpIHsKKyAgICBzdGF0aWMgaW50IGVycm9yX2NvdW50ID0gMDsKKyAgICArK2Vycm9yX2NvdW50OworICAgIC8vIFRPRE8oaHR0cHM6Ly9jcmJ1Zy5jb20vMTAwMDkxOSk6IEV2YWx1YXRlIGFuZCByZW1vdmUgVU1BIG1ldHJpY3MgYWZ0ZXIKKyAgICAvLyBlbm91Z2ggZGF0YSBpcyBnYXRoZXJlZC4KKyAgICBiYXNlOjpVbWFIaXN0b2dyYW1Db3VudHMxMDAoIlgxMS5YSW50ZXJuQXRvbUZhaWx1cmUiLCBlcnJvcl9jb3VudCk7CisgIH0KICAgY2FjaGVkX2F0b21zXy5lbXBsYWNlKG5hbWUsIGF0b20pOwogICByZXR1cm4gYXRvbTsKIH0KZGlmZiAtLWdpdCBhL3VpL2dmeC94L3gxMV9hdG9tX2NhY2hlLmggYi91aS9nZngveC94MTFfYXRvbV9jYWNoZS5oCmluZGV4IGNjOTdiNWEuLjlkMmJjMDcgMTAwNjQ0Ci0tLSBhL3VpL2dmeC94L3gxMV9hdG9tX2NhY2hlLmgKKysrIGIvdWkvZ2Z4L3gveDExX2F0b21fY2FjaGUuaApAQCAtNSw5ICs1LDkgQEAKICNpZm5kZWYgVUlfR0ZYX1hfWDExX0FUT01fQ0FDSEVfSF8KICNkZWZpbmUgVUlfR0ZYX1hfWDExX0FUT01fQ0FDSEVfSF8KIAorI2luY2x1ZGUgPG1hcD4KICNpbmNsdWRlIDxzdHJpbmc+CiAKLSNpbmNsdWRlICJiYXNlL2NvbnRhaW5lcnMvZmxhdF9tYXAuaCIKICNpbmNsdWRlICJiYXNlL21hY3Jvcy5oIgogI2luY2x1ZGUgInVpL2dmeC9nZnhfZXhwb3J0LmgiCiAjaW5jbHVkZSAidWkvZ2Z4L3gveDExX3R5cGVzLmgiCkBAIC0zOCwxMSArMzgsMTMgQEAKICAgflgxMUF0b21DYWNoZSgpOwogCiAgIC8vIFJldHVybnMgdGhlIHByZS1pbnRlcm5lZCBBdG9tIHdpdGhvdXQgaGF2aW5nIHRvIGdvIHRvIHRoZSB4IHNlcnZlci4KKyAgLy8gT24gZmFpbHVyZSwgeDExOjpOb25lIGlzIHJldHVybmVkLgogICBYQXRvbSBHZXRBdG9tKGNvbnN0IGNoYXIqKSBjb25zdDsKIAogICBYRGlzcGxheSogeGRpc3BsYXlfOwogCi0gIG11dGFibGUgYmFzZTo6ZmxhdF9tYXA8c3RkOjpzdHJpbmcsIFhBdG9tPiBjYWNoZWRfYXRvbXNfOworICAvLyBVc2luZyBzdGQ6Om1hcCwgYXMgaXQgaXMgcG9zc2libGUgZm9yIHRob3VzYW5kcyBvZiBhdG9tcyB0byBiZSByZWdpc3RlcmVkLgorICBtdXRhYmxlIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBYQXRvbT4gY2FjaGVkX2F0b21zXzsKIAogICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oWDExQXRvbUNhY2hlKTsKIH07CmRpZmYgLS1naXQgYS91aS92aWV3cy9hY2Nlc3NpYmlsaXR5L3ZpZXdfYXhfcGxhdGZvcm1fbm9kZV9kZWxlZ2F0ZV9tYWMubW0gYi91aS92aWV3cy9hY2Nlc3NpYmlsaXR5L3ZpZXdfYXhfcGxhdGZvcm1fbm9kZV9kZWxlZ2F0ZV9tYWMubW0KaW5kZXggNWExZDFmMi4uNzVlMDA5MSAxMDA2NDQKLS0tIGEvdWkvdmlld3MvYWNjZXNzaWJpbGl0eS92aWV3X2F4X3BsYXRmb3JtX25vZGVfZGVsZWdhdGVfbWFjLm1tCisrKyBiL3VpL3ZpZXdzL2FjY2Vzc2liaWxpdHkvdmlld19heF9wbGF0Zm9ybV9ub2RlX2RlbGVnYXRlX21hYy5tbQpAQCAtMjcsMTIgKzI3LDggQEAKICAgaWYgKCF3aWRnZXQpCiAgICAgcmV0dXJuIG5pbDsKIAotICBhdXRvKiB0b3BfbGV2ZWxfd2lkZ2V0ID0gd2lkZ2V0LT5HZXRUb3BMZXZlbFdpZGdldCgpOwotICBpZiAoIXRvcF9sZXZlbF93aWRnZXQpCi0gICAgcmV0dXJuIG5pbDsKLQogICBhdXRvKiB3aW5kb3dfaG9zdCA9IE5hdGl2ZVdpZGdldE1hY05TV2luZG93SG9zdDo6R2V0RnJvbU5hdGl2ZVdpbmRvdygKLSAgICAgIHRvcF9sZXZlbF93aWRnZXQtPkdldE5hdGl2ZVdpbmRvdygpKTsKKyAgICAgIHdpZGdldC0+R2V0TmF0aXZlV2luZG93KCkpOwogICBpZiAoIXdpbmRvd19ob3N0KQogICAgIHJldHVybiBuaWw7CiAKZGlmZiAtLWdpdCBhL3VpL3ZpZXdzL2FuaW1hdGlvbi9zcXVhcmVfaW5rX2Ryb3BfcmlwcGxlLmNjIGIvdWkvdmlld3MvYW5pbWF0aW9uL3NxdWFyZV9pbmtfZHJvcF9yaXBwbGUuY2MKaW5kZXggMWUxNTdiMzUuLmFjNWM5OWMgMTAwNjQ0Ci0tLSBhL3VpL3ZpZXdzL2FuaW1hdGlvbi9zcXVhcmVfaW5rX2Ryb3BfcmlwcGxlLmNjCisrKyBiL3VpL3ZpZXdzL2FuaW1hdGlvbi9zcXVhcmVfaW5rX2Ryb3BfcmlwcGxlLmNjCkBAIC0xNDYsNyArMTQ2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2Z4OjpQb2ludCYgY2VudGVyX3BvaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa0NvbG9yIGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2aXNpYmxlX29wYWNpdHkpCi0gICAgOiBhY3RpdmF0ZWRfc2hhcGVfKFJPVU5ERURfUkVDVCksCisgICAgOiBhY3RpdmF0ZWRfc2hhcGVfKEFjdGl2YXRlZFNoYXBlOjprUm91bmRlZFJlY3QpLAogICAgICAgdmlzaWJsZV9vcGFjaXR5Xyh2aXNpYmxlX29wYWNpdHkpLAogICAgICAgbGFyZ2Vfc2l6ZV8obGFyZ2Vfc2l6ZSksCiAgICAgICBsYXJnZV9jb3JuZXJfcmFkaXVzXyhsYXJnZV9jb3JuZXJfcmFkaXVzKSwKQEAgLTU0MiwxMCArNTQyLDEwIEBACiB2b2lkIFNxdWFyZUlua0Ryb3BSaXBwbGU6OkdldEFjdGl2YXRlZFRhcmdldFRyYW5zZm9ybXMoCiAgICAgSW5rRHJvcFRyYW5zZm9ybXMqIHRyYW5zZm9ybXNfb3V0KSBjb25zdCB7CiAgIHN3aXRjaCAoYWN0aXZhdGVkX3NoYXBlXykgewotICAgIGNhc2UgQ0lSQ0xFOgorICAgIGNhc2UgQWN0aXZhdGVkU2hhcGU6OmtDaXJjbGU6CiAgICAgICBDYWxjdWxhdGVDaXJjbGVUcmFuc2Zvcm1zKHNtYWxsX3NpemVfLCB0cmFuc2Zvcm1zX291dCk7CiAgICAgICBicmVhazsKLSAgICBjYXNlIFJPVU5ERURfUkVDVDoKKyAgICBjYXNlIEFjdGl2YXRlZFNoYXBlOjprUm91bmRlZFJlY3Q6CiAgICAgICBDYWxjdWxhdGVSZWN0VHJhbnNmb3JtcyhzbWFsbF9zaXplXywgc21hbGxfY29ybmVyX3JhZGl1c18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1zX291dCk7CiAgICAgICBicmVhazsKQEAgLTU1NSwxMCArNTU1LDEwIEBACiB2b2lkIFNxdWFyZUlua0Ryb3BSaXBwbGU6OkdldERlYWN0aXZhdGVkVGFyZ2V0VHJhbnNmb3JtcygKICAgICBJbmtEcm9wVHJhbnNmb3JtcyogdHJhbnNmb3Jtc19vdXQpIGNvbnN0IHsKICAgc3dpdGNoIChhY3RpdmF0ZWRfc2hhcGVfKSB7Ci0gICAgY2FzZSBDSVJDTEU6CisgICAgY2FzZSBBY3RpdmF0ZWRTaGFwZTo6a0NpcmNsZToKICAgICAgIENhbGN1bGF0ZUNpcmNsZVRyYW5zZm9ybXMobGFyZ2Vfc2l6ZV8sIHRyYW5zZm9ybXNfb3V0KTsKICAgICAgIGJyZWFrOwotICAgIGNhc2UgUk9VTkRFRF9SRUNUOgorICAgIGNhc2UgQWN0aXZhdGVkU2hhcGU6OmtSb3VuZGVkUmVjdDoKICAgICAgIENhbGN1bGF0ZVJlY3RUcmFuc2Zvcm1zKGxhcmdlX3NpemVfLCBzbWFsbF9jb3JuZXJfcmFkaXVzXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybXNfb3V0KTsKICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvdWkvdmlld3MvYW5pbWF0aW9uL3NxdWFyZV9pbmtfZHJvcF9yaXBwbGUuaCBiL3VpL3ZpZXdzL2FuaW1hdGlvbi9zcXVhcmVfaW5rX2Ryb3BfcmlwcGxlLmgKaW5kZXggOGIzNGRmOC4uYWY3YTFiMCAxMDA2NDQKLS0tIGEvdWkvdmlld3MvYW5pbWF0aW9uL3NxdWFyZV9pbmtfZHJvcF9yaXBwbGUuaAorKysgYi91aS92aWV3cy9hbmltYXRpb24vc3F1YXJlX2lua19kcm9wX3JpcHBsZS5oCkBAIC01MSw3ICs1MSw3IEBACiBjbGFzcyBWSUVXU19FWFBPUlQgU3F1YXJlSW5rRHJvcFJpcHBsZSA6IHB1YmxpYyBJbmtEcm9wUmlwcGxlIHsKICBwdWJsaWM6CiAgIC8vIFRoZSBzaGFwZSB0byB1c2UgZm9yIHRoZSBBQ1RJVkFURUQvREVBQ1RJVkFURUQgc3RhdGVzLgotICBlbnVtIEFjdGl2YXRlZFNoYXBlIHsgQ0lSQ0xFLCBST1VOREVEX1JFQ1QgfTsKKyAgZW51bSBjbGFzcyBBY3RpdmF0ZWRTaGFwZSB7IGtDaXJjbGUsIGtSb3VuZGVkUmVjdCB9OwogCiAgIFNxdWFyZUlua0Ryb3BSaXBwbGUoY29uc3QgZ2Z4OjpTaXplJiBsYXJnZV9zaXplLAogICAgICAgICAgICAgICAgICAgICAgIGludCBsYXJnZV9jb3JuZXJfcmFkaXVzLApkaWZmIC0tZ2l0IGEvdWkvdmlld3MvY29udHJvbHMvYnV0dG9uL2xhYmVsX2J1dHRvbi5jYyBiL3VpL3ZpZXdzL2NvbnRyb2xzL2J1dHRvbi9sYWJlbF9idXR0b24uY2MKaW5kZXggZGQwNTk3Ni4uYjhhNmZiNSAxMDA2NDQKLS0tIGEvdWkvdmlld3MvY29udHJvbHMvYnV0dG9uL2xhYmVsX2J1dHRvbi5jYworKysgYi91aS92aWV3cy9jb250cm9scy9idXR0b24vbGFiZWxfYnV0dG9uLmNjCkBAIC02Niw3ICs2Niw3IEBACiAgIFVwZGF0ZUltYWdlKCk7CiB9CiAKLWJhc2U6OnN0cmluZzE2IExhYmVsQnV0dG9uOjpHZXRUZXh0KCkgY29uc3QgeworY29uc3QgYmFzZTo6c3RyaW5nMTYmIExhYmVsQnV0dG9uOjpHZXRUZXh0KCkgY29uc3QgewogICByZXR1cm4gbGFiZWxfLT5HZXRUZXh0KCk7CiB9CiAKZGlmZiAtLWdpdCBhL3VpL3ZpZXdzL2NvbnRyb2xzL2J1dHRvbi9sYWJlbF9idXR0b24uaCBiL3VpL3ZpZXdzL2NvbnRyb2xzL2J1dHRvbi9sYWJlbF9idXR0b24uaAppbmRleCBjYWM2YjU3Li4xMzU4ZTA1IDEwMDY0NAotLS0gYS91aS92aWV3cy9jb250cm9scy9idXR0b24vbGFiZWxfYnV0dG9uLmgKKysrIGIvdWkvdmlld3MvY29udHJvbHMvYnV0dG9uL2xhYmVsX2J1dHRvbi5oCkBAIC00NSw3ICs0NSw3IEBACiAgIHZvaWQgU2V0SW1hZ2UoQnV0dG9uU3RhdGUgZm9yX3N0YXRlLCBjb25zdCBnZng6OkltYWdlU2tpYSYgaW1hZ2UpOwogCiAgIC8vIEdldHMgb3Igc2V0cyB0aGUgdGV4dCBzaG93biBvbiB0aGUgYnV0dG9uLgotICBiYXNlOjpzdHJpbmcxNiBHZXRUZXh0KCkgY29uc3Q7CisgIGNvbnN0IGJhc2U6OnN0cmluZzE2JiBHZXRUZXh0KCkgY29uc3Q7CiAgIHZpcnR1YWwgdm9pZCBTZXRUZXh0KGNvbnN0IGJhc2U6OnN0cmluZzE2JiB0ZXh0KTsKIAogICAvLyBNYWtlcyB0aGUgYnV0dG9uIHJlcG9ydCBpdHMgcHJlZmVycmVkIHNpemUgd2l0aG91dCB0aGUgbGFiZWwuIFRoaXMgbGV0cwpkaWZmIC0tZ2l0IGEvdWkvdmlld3MvY29udHJvbHMvbWVudS9tZW51X2NvbnRyb2xsZXIuY2MgYi91aS92aWV3cy9jb250cm9scy9tZW51L21lbnVfY29udHJvbGxlci5jYwppbmRleCAzZWY2MmJiZS4uMjc2ZGIxZmIyIDEwMDY0NAotLS0gYS91aS92aWV3cy9jb250cm9scy9tZW51L21lbnVfY29udHJvbGxlci5jYworKysgYi91aS92aWV3cy9jb250cm9scy9tZW51L21lbnVfY29udHJvbGxlci5jYwpAQCAtMjQwNyw0NCArMjQwNyw2MSBAQAogICAgICAgICB5ID0gYW5jaG9yX2JvdW5kcy5ib3R0b20oKSAtIGJvcmRlcl9hbmRfc2hhZG93X2luc2V0cy50b3AoKSArCiAgICAgICAgICAgICBtZW51X2NvbmZpZy50b3VjaGFibGVfYW5jaG9yX29mZnNldDsKICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHN0YXRlXy5hbmNob3IgPT0gTWVudUFuY2hvclBvc2l0aW9uOjprQnViYmxlTGVmdCkgewotICAgICAgLy8gQWxpZ24gdGhlIHJpZ2h0IG9mIHRoZSBtZW51IHdpdGggdGhlIGxlZnQgb2YgdGhlIGFuY2hvciwgYW5kIHRoZSB0b3Agb2YKLSAgICAgIC8vIHRoZSBtZW51IHdpdGggdGhlIHRvcCBvZiB0aGUgYW5jaG9yLgotICAgICAgeCA9IGFuY2hvcl9ib3VuZHMueCgpIC0gbWVudV9zaXplLndpZHRoKCkgKwotICAgICAgICAgIGJvcmRlcl9hbmRfc2hhZG93X2luc2V0cy5yaWdodCgpIC0KLSAgICAgICAgICBtZW51X2NvbmZpZy50b3VjaGFibGVfYW5jaG9yX29mZnNldDsKLSAgICAgIHkgPSBhbmNob3JfYm91bmRzLnkoKSAtIGJvcmRlcl9hbmRfc2hhZG93X2luc2V0cy50b3AoKTsKLSAgICAgIC8vIEFsaWduIHRoZSBsZWZ0IG9mIHRoZSBtZW51IHdpdGggdGhlIHJpZ2h0IG9mIHRoZSBhbmNob3IuCi0gICAgICBpZiAoeCA8IG1vbml0b3JfYm91bmRzLngoKSkgewotICAgICAgICB4ID0gYW5jaG9yX2JvdW5kcy5yaWdodCgpIC0gYm9yZGVyX2FuZF9zaGFkb3dfaW5zZXRzLmxlZnQoKSArCi0gICAgICAgICAgICBtZW51X2NvbmZpZy50b3VjaGFibGVfYW5jaG9yX29mZnNldDsKLSAgICAgIH0KLSAgICAgIC8vIFByZWZlciBhbGlnbmluZyB0aGUgYm90dG9tIG9mIHRoZSBtZW51IHRvIHRoZSBib3R0b20gb2YgdGhlIGFuY2hvci4KLSAgICAgIGlmICh5ICsgbWVudV9zaXplLmhlaWdodCgpID4gbW9uaXRvcl9ib3VuZHMuYm90dG9tKCkpIHsKLSAgICAgICAgeSA9IGFuY2hvcl9ib3VuZHMuYm90dG9tKCkgLSBtZW51X3NpemUuaGVpZ2h0KCkgKwotICAgICAgICAgICAgYm9yZGVyX2FuZF9zaGFkb3dfaW5zZXRzLmJvdHRvbSgpOwotICAgICAgICAvLyBGb3Igc29tZSB2ZXJ5IHRhbGwgbWVudXMsIHRoaXMgbWF5IHN0aWxsIGJlIG9mZiBzY3JlZW4uCi0gICAgICAgIGlmICh5IDwgbW9uaXRvcl9ib3VuZHMueSgpKQotICAgICAgICAgIHkgPSBtb25pdG9yX2JvdW5kcy55KCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChzdGF0ZV8uYW5jaG9yID09IE1lbnVBbmNob3JQb3NpdGlvbjo6a0J1YmJsZVJpZ2h0KSB7Ci0gICAgICAvLyBBbGlnbiB0aGUgbGVmdCBvZiB0aGUgbWVudSB3aXRoIHRoZSByaWdodCBvZiB0aGUgYW5jaG9yLCBhbmQgdGhlIHRvcCBvZgotICAgICAgLy8gdGhlIG1lbnUgd2l0aCB0aGUgdG9wIG9mIHRoZSBhbmNob3IuCi0gICAgICB4ID0gYW5jaG9yX2JvdW5kcy5yaWdodCgpIC0gYm9yZGVyX2FuZF9zaGFkb3dfaW5zZXRzLmxlZnQoKSArCi0gICAgICAgICAgbWVudV9jb25maWcudG91Y2hhYmxlX2FuY2hvcl9vZmZzZXQ7Ci0gICAgICB5ID0gYW5jaG9yX2JvdW5kcy55KCkgLSBib3JkZXJfYW5kX3NoYWRvd19pbnNldHMudG9wKCk7Ci0gICAgICBpZiAoeCArIG1lbnVfc2l6ZS53aWR0aCgpID4gbW9uaXRvcl9ib3VuZHMucmlnaHQoKSkgewotICAgICAgICAvLyBBbGlnbiB0aGUgcmlnaHQgb2YgdGhlIG1lbnUgd2l0aCB0aGUgbGVmdCBvZiB0aGUgYW5jaG9yLgorICAgIH0gZWxzZSBpZiAoc3RhdGVfLmFuY2hvciA9PSBNZW51QW5jaG9yUG9zaXRpb246OmtCdWJibGVMZWZ0IHx8CisgICAgICAgICAgICAgICBzdGF0ZV8uYW5jaG9yID09IE1lbnVBbmNob3JQb3NpdGlvbjo6a0J1YmJsZVJpZ2h0KSB7CisgICAgICBpZiAoc3RhdGVfLmFuY2hvciA9PSBNZW51QW5jaG9yUG9zaXRpb246OmtCdWJibGVMZWZ0KSB7CisgICAgICAgIC8vIEFsaWduIHRoZSByaWdodCBvZiB0aGUgbWVudSB3aXRoIHRoZSBsZWZ0IG9mIHRoZSBhbmNob3IsIGFuZCB0aGUgdG9wCisgICAgICAgIC8vIG9mIHRoZSBtZW51IHdpdGggdGhlIHRvcCBvZiB0aGUgYW5jaG9yLgogICAgICAgICB4ID0gYW5jaG9yX2JvdW5kcy54KCkgLSBtZW51X3NpemUud2lkdGgoKSArCiAgICAgICAgICAgICBib3JkZXJfYW5kX3NoYWRvd19pbnNldHMucmlnaHQoKSAtCiAgICAgICAgICAgICBtZW51X2NvbmZpZy50b3VjaGFibGVfYW5jaG9yX29mZnNldDsKKyAgICAgICAgLy8gQWxpZ24gdGhlIGxlZnQgb2YgdGhlIG1lbnUgd2l0aCB0aGUgcmlnaHQgb2YgdGhlIGFuY2hvci4KKyAgICAgICAgaWYgKHggPCBtb25pdG9yX2JvdW5kcy54KCkpIHsKKyAgICAgICAgICB4ID0gYW5jaG9yX2JvdW5kcy5yaWdodCgpIC0gYm9yZGVyX2FuZF9zaGFkb3dfaW5zZXRzLmxlZnQoKSArCisgICAgICAgICAgICAgIG1lbnVfY29uZmlnLnRvdWNoYWJsZV9hbmNob3Jfb2Zmc2V0OworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBBbGlnbiB0aGUgbGVmdCBvZiB0aGUgbWVudSB3aXRoIHRoZSByaWdodCBvZiB0aGUgYW5jaG9yLCBhbmQgdGhlIHRvcAorICAgICAgICAvLyBvZiB0aGUgbWVudSB3aXRoIHRoZSB0b3Agb2YgdGhlIGFuY2hvci4KKyAgICAgICAgeCA9IGFuY2hvcl9ib3VuZHMucmlnaHQoKSAtIGJvcmRlcl9hbmRfc2hhZG93X2luc2V0cy5sZWZ0KCkgKworICAgICAgICAgICAgbWVudV9jb25maWcudG91Y2hhYmxlX2FuY2hvcl9vZmZzZXQ7CisgICAgICAgIGlmICh4ICsgbWVudV9zaXplLndpZHRoKCkgPiBtb25pdG9yX2JvdW5kcy5yaWdodCgpKSB7CisgICAgICAgICAgLy8gQWxpZ24gdGhlIHJpZ2h0IG9mIHRoZSBtZW51IHdpdGggdGhlIGxlZnQgb2YgdGhlIGFuY2hvci4KKyAgICAgICAgICB4ID0gYW5jaG9yX2JvdW5kcy54KCkgLSBtZW51X3NpemUud2lkdGgoKSArCisgICAgICAgICAgICAgIGJvcmRlcl9hbmRfc2hhZG93X2luc2V0cy5yaWdodCgpIC0KKyAgICAgICAgICAgICAgbWVudV9jb25maWcudG91Y2hhYmxlX2FuY2hvcl9vZmZzZXQ7CisgICAgICAgIH0KICAgICAgIH0KLSAgICAgIGlmICh5ICsgbWVudV9zaXplLmhlaWdodCgpID4gbW9uaXRvcl9ib3VuZHMuYm90dG9tKCkpIHsKLSAgICAgICAgLy8gQWxpZ24gdGhlIGJvdHRvbSBvZiB0aGUgbWVudSB3aXRoIHRoZSBib3R0b20gb2YgdGhlIGFuY2hvci4KLSAgICAgICAgeSA9IGFuY2hvcl9ib3VuZHMuYm90dG9tKCkgLSBtZW51X3NpemUuaGVpZ2h0KCkgKwotICAgICAgICAgICAgYm9yZGVyX2FuZF9zaGFkb3dfaW5zZXRzLmJvdHRvbSgpOworCisgICAgICBjb25zdCBpbnQgeV9iZWxvdyA9IGFuY2hvcl9ib3VuZHMueSgpIC0gYm9yZGVyX2FuZF9zaGFkb3dfaW5zZXRzLnRvcCgpOworICAgICAgY29uc3QgaW50IHlfYWJvdmUgPSBhbmNob3JfYm91bmRzLmJvdHRvbSgpIC0gbWVudV9zaXplLmhlaWdodCgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyX2FuZF9zaGFkb3dfaW5zZXRzLmJvdHRvbSgpOworICAgICAgaWYgKHlfYmVsb3cgKyBtZW51X3NpemUuaGVpZ2h0KCkgPD0gbW9uaXRvcl9ib3VuZHMuYm90dG9tKCkpIHsKKyAgICAgICAgLy8gU2hvdyBiZWxvdyB0aGUgYW5jaG9yLiBBbGlnbiB0aGUgdG9wIG9mIHRoZSBtZW51IHdpdGggdGhlIHRvcCBvZiB0aGUKKyAgICAgICAgLy8gYW5jaG9yLgorICAgICAgICB5ID0geV9iZWxvdzsKKyAgICAgIH0gZWxzZSBpZiAoeV9hYm92ZSA+PSBtb25pdG9yX2JvdW5kcy55KCkpIHsKKyAgICAgICAgLy8gTm8gcm9vbSBiZWxvdywgYnV0IHRoZXJlIGlzIHJvb20gYWJvdmUuIFNob3cgYWJvdmUgdGhlIGFuY2hvci4gQWxpZ24KKyAgICAgICAgLy8gdGhlIGJvdHRvbSBvZiB0aGUgbWVudSB3aXRoIHRoZSBib3R0b20gb2YgdGhlIGFuY2hvci4KKyAgICAgICAgeSA9IHlfYWJvdmU7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBObyByb29tIGFib3ZlIG9yIGJlbG93LiBTaG93IGFzIGxvdyBhcyBwb3NzaWJsZS4gQWxpZ24gdGhlIGJvdHRvbSBvZgorICAgICAgICAvLyB0aGUgbWVudSB3aXRoIHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbi4KKyAgICAgICAgeSA9IG1vbml0b3JfYm91bmRzLmJvdHRvbSgpIC0gbWVudV9zaXplLmhlaWdodCgpOwogICAgICAgfQogICAgIH0KKyAgICAvLyBUaGUgYWJvdmUgYWRqdXN0bWVudHMgbWF5IGhhdmUgc2hpZnRlZCBhIGxhcmdlIG1lbnUgb2ZmIHRoZSBzY3JlZW4uCisgICAgLy8gQ2xhbXAgdGhlIG1lbnUgb3JpZ2luIHRvIHRoZSB2YWxpZCByYW5nZS4KKyAgICBjb25zdCBpbnQgeF9taW4gPSBtb25pdG9yX2JvdW5kcy54KCkgLSBib3JkZXJfYW5kX3NoYWRvd19pbnNldHMubGVmdCgpOworICAgIGNvbnN0IGludCB4X21heCA9IG1vbml0b3JfYm91bmRzLnJpZ2h0KCkgLSBtZW51X3NpemUud2lkdGgoKSArCisgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyX2FuZF9zaGFkb3dfaW5zZXRzLnJpZ2h0KCk7CisgICAgY29uc3QgaW50IHlfbWluID0gbW9uaXRvcl9ib3VuZHMueSgpIC0gYm9yZGVyX2FuZF9zaGFkb3dfaW5zZXRzLnRvcCgpOworICAgIGNvbnN0IGludCB5X21heCA9IG1vbml0b3JfYm91bmRzLmJvdHRvbSgpIC0gbWVudV9zaXplLmhlaWdodCgpICsKKyAgICAgICAgICAgICAgICAgICAgICBib3JkZXJfYW5kX3NoYWRvd19pbnNldHMuYm90dG9tKCk7CisgICAgRENIRUNLX0xFKHhfbWluLCB4X21heCk7CisgICAgRENIRUNLX0xFKHlfbWluLCB5X21heCk7CisgICAgeCA9IGJhc2U6OkNsYW1wVG9SYW5nZSh4LCB4X21pbiwgeF9tYXgpOworICAgIHkgPSBiYXNlOjpDbGFtcFRvUmFuZ2UoeSwgeV9taW4sIHlfbWF4KTsKICAgfSBlbHNlIHsKICAgICBpZiAoIXVzZV90b3VjaGFibGVfbGF5b3V0XykgewogICAgICAgTk9USU1QTEVNRU5URUQoKQpkaWZmIC0tZ2l0IGEvdWkvdmlld3MvY29udHJvbHMvbWVudS9tZW51X2NvbnRyb2xsZXJfdW5pdHRlc3QuY2MgYi91aS92aWV3cy9jb250cm9scy9tZW51L21lbnVfY29udHJvbGxlcl91bml0dGVzdC5jYwppbmRleCA5MzZhNWQyLi5kM2QwODU1IDEwMDY0NAotLS0gYS91aS92aWV3cy9jb250cm9scy9tZW51L21lbnVfY29udHJvbGxlcl91bml0dGVzdC5jYworKysgYi91aS92aWV3cy9jb250cm9scy9tZW51L21lbnVfY29udHJvbGxlcl91bml0dGVzdC5jYwpAQCAtNTYwLDYgKzU2MCw2MiBAQAogICAgIEVYUEVDVF9UUlVFKG9wdGlvbnMubW9uaXRvcl9ib3VuZHMuQ29udGFpbnMoZmluYWxfYm91bmRzKSk7CiAgIH0KIAorICB2b2lkIFRlc3RNZW51Rml0c09uU21hbGxTY3JlZW4oTWVudUFuY2hvclBvc2l0aW9uIG1lbnVfYW5jaG9yX3Bvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2Z4OjpSZWN0JiBtb25pdG9yX2JvdW5kcykgeworICAgIFNDT1BFRF9UUkFDRShiYXNlOjpTdHJpbmdQcmludGYoCisgICAgICAgICJNZW51QW5jaG9yUG9zaXRpb246ICVkLCBtb25pdG9yX2JvdW5kczogQCVzXG4iLCBtZW51X2FuY2hvcl9wb3NpdGlvbiwKKyAgICAgICAgbW9uaXRvcl9ib3VuZHMuVG9TdHJpbmcoKS5jX3N0cigpKSk7CisgICAgTWVudUJvdW5kc09wdGlvbnMgb3B0aW9uczsKKyAgICBvcHRpb25zLm1lbnVfYW5jaG9yID0gbWVudV9hbmNob3JfcG9zaXRpb247CisgICAgb3B0aW9ucy5tb25pdG9yX2JvdW5kcyA9IG1vbml0b3JfYm91bmRzOworICAgIG9wdGlvbnMubWVudV9zaXplID0gbW9uaXRvcl9ib3VuZHMuc2l6ZSgpOworICAgIG9wdGlvbnMubWVudV9zaXplLkVubGFyZ2UoMTAwLCAxMDApOworICAgIGNvbnN0IGdmeDo6U2l6ZSBhbmNob3Jfc2l6ZSgwLCAwKTsKKworICAgIC8vIEFkanVzdCB0aGUgZmluYWwgYm91bmRzIHRvIG5vdCBpbmNsdWRlIHRoZSBzaGFkb3cgYW5kIGJvcmRlci4KKyAgICBjb25zdCBnZng6Okluc2V0cyBib3JkZXJfYW5kX3NoYWRvd19pbnNldHMgPQorICAgICAgICBCdWJibGVCb3JkZXI6OkdldEJvcmRlckFuZFNoYWRvd0luc2V0cygKKyAgICAgICAgICAgIE1lbnVDb25maWc6Omluc3RhbmNlKCkudG91Y2hhYmxlX21lbnVfc2hhZG93X2VsZXZhdGlvbik7CisKKyAgICBvcHRpb25zLmFuY2hvcl9ib3VuZHMgPSBnZng6OlJlY3QobW9uaXRvcl9ib3VuZHMub3JpZ2luKCksIGFuY2hvcl9zaXplKTsKKyAgICBnZng6OlJlY3QgZmluYWxfYm91bmRzID0gQ2FsY3VsYXRlQnViYmxlTWVudUJvdW5kcyhvcHRpb25zKTsKKyAgICBmaW5hbF9ib3VuZHMuSW5zZXQoYm9yZGVyX2FuZF9zaGFkb3dfaW5zZXRzKTsKKyAgICBFWFBFQ1RfVFJVRShvcHRpb25zLm1vbml0b3JfYm91bmRzLkNvbnRhaW5zKGZpbmFsX2JvdW5kcykpCisgICAgICAgIDw8IG9wdGlvbnMubW9uaXRvcl9ib3VuZHMuVG9TdHJpbmcoKSA8PCAiIGRvZXMgbm90IGNvbnRhaW4gIgorICAgICAgICA8PCBmaW5hbF9ib3VuZHMuVG9TdHJpbmcoKTsKKworICAgIG9wdGlvbnMuYW5jaG9yX2JvdW5kcyA9CisgICAgICAgIGdmeDo6UmVjdChtb25pdG9yX2JvdW5kcy5ib3R0b21fbGVmdCgpLCBhbmNob3Jfc2l6ZSk7CisgICAgZmluYWxfYm91bmRzID0gQ2FsY3VsYXRlQnViYmxlTWVudUJvdW5kcyhvcHRpb25zKTsKKyAgICBmaW5hbF9ib3VuZHMuSW5zZXQoYm9yZGVyX2FuZF9zaGFkb3dfaW5zZXRzKTsKKyAgICBFWFBFQ1RfVFJVRShvcHRpb25zLm1vbml0b3JfYm91bmRzLkNvbnRhaW5zKGZpbmFsX2JvdW5kcykpCisgICAgICAgIDw8IG9wdGlvbnMubW9uaXRvcl9ib3VuZHMuVG9TdHJpbmcoKSA8PCAiIGRvZXMgbm90IGNvbnRhaW4gIgorICAgICAgICA8PCBmaW5hbF9ib3VuZHMuVG9TdHJpbmcoKTsKKworICAgIG9wdGlvbnMuYW5jaG9yX2JvdW5kcyA9CisgICAgICAgIGdmeDo6UmVjdChtb25pdG9yX2JvdW5kcy5ib3R0b21fcmlnaHQoKSwgYW5jaG9yX3NpemUpOworICAgIGZpbmFsX2JvdW5kcyA9IENhbGN1bGF0ZUJ1YmJsZU1lbnVCb3VuZHMob3B0aW9ucyk7CisgICAgZmluYWxfYm91bmRzLkluc2V0KGJvcmRlcl9hbmRfc2hhZG93X2luc2V0cyk7CisgICAgRVhQRUNUX1RSVUUob3B0aW9ucy5tb25pdG9yX2JvdW5kcy5Db250YWlucyhmaW5hbF9ib3VuZHMpKQorICAgICAgICA8PCBvcHRpb25zLm1vbml0b3JfYm91bmRzLlRvU3RyaW5nKCkgPDwgIiBkb2VzIG5vdCBjb250YWluICIKKyAgICAgICAgPDwgZmluYWxfYm91bmRzLlRvU3RyaW5nKCk7CisKKyAgICBvcHRpb25zLmFuY2hvcl9ib3VuZHMgPSBnZng6OlJlY3QobW9uaXRvcl9ib3VuZHMudG9wX3JpZ2h0KCksIGFuY2hvcl9zaXplKTsKKyAgICBmaW5hbF9ib3VuZHMgPSBDYWxjdWxhdGVCdWJibGVNZW51Qm91bmRzKG9wdGlvbnMpOworICAgIGZpbmFsX2JvdW5kcy5JbnNldChib3JkZXJfYW5kX3NoYWRvd19pbnNldHMpOworICAgIEVYUEVDVF9UUlVFKG9wdGlvbnMubW9uaXRvcl9ib3VuZHMuQ29udGFpbnMoZmluYWxfYm91bmRzKSkKKyAgICAgICAgPDwgb3B0aW9ucy5tb25pdG9yX2JvdW5kcy5Ub1N0cmluZygpIDw8ICIgZG9lcyBub3QgY29udGFpbiAiCisgICAgICAgIDw8IGZpbmFsX2JvdW5kcy5Ub1N0cmluZygpOworCisgICAgb3B0aW9ucy5hbmNob3JfYm91bmRzID0KKyAgICAgICAgZ2Z4OjpSZWN0KG1vbml0b3JfYm91bmRzLkNlbnRlclBvaW50KCksIGFuY2hvcl9zaXplKTsKKyAgICBmaW5hbF9ib3VuZHMgPSBDYWxjdWxhdGVCdWJibGVNZW51Qm91bmRzKG9wdGlvbnMpOworICAgIGZpbmFsX2JvdW5kcy5JbnNldChib3JkZXJfYW5kX3NoYWRvd19pbnNldHMpOworICAgIEVYUEVDVF9UUlVFKG9wdGlvbnMubW9uaXRvcl9ib3VuZHMuQ29udGFpbnMoZmluYWxfYm91bmRzKSkKKyAgICAgICAgPDwgb3B0aW9ucy5tb25pdG9yX2JvdW5kcy5Ub1N0cmluZygpIDw8ICIgZG9lcyBub3QgY29udGFpbiAiCisgICAgICAgIDw8IGZpbmFsX2JvdW5kcy5Ub1N0cmluZygpOworICB9CisKICAgdm9pZCBUZXN0U3VibWVudUZpdHNPblNjcmVlbihNZW51SXRlbVZpZXcqIGl0ZW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2Z4OjpSZWN0JiBtb25pdG9yX2JvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnZng6OlJlY3QmIHBhcmVudF9ib3VuZHMpIHsKQEAgLTE4NTUsNiArMTkxMSwyNCBAQAogICAgIH0KIH0KIAorLy8gVGVzdCB0aGF0IG1lbnVzIGZpdCBhIHNtYWxsIHNjcmVlbi4KK1RFU1RfUChNZW51Q29udHJvbGxlclRlc3QsIFRlc3RNZW51Rml0c09uU21hbGxTY3JlZW4pIHsKKyAgY29uc3QgaW50IGRpc3BsYXlfc2l6ZSA9IDUwMDsKKworICAvLyBTaW11bGF0ZSBtdWx0aXBsZSBkaXNwbGF5IGxheW91dHMuCisgIGZvciAoaW50IHggPSAtMTsgeCA8PSAxOyB4KyspCisgICAgZm9yIChpbnQgeSA9IC0xOyB5IDw9IDE7IHkrKykgeworICAgICAgY29uc3QgZ2Z4OjpSZWN0IG1vbml0b3JfYm91bmRzKHggKiBkaXNwbGF5X3NpemUsIHkgKiBkaXNwbGF5X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9zaXplLCBkaXNwbGF5X3NpemUpOworICAgICAgVGVzdE1lbnVGaXRzT25TbWFsbFNjcmVlbihNZW51QW5jaG9yUG9zaXRpb246OmtCdWJibGVBYm92ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9uaXRvcl9ib3VuZHMpOworICAgICAgVGVzdE1lbnVGaXRzT25TbWFsbFNjcmVlbihNZW51QW5jaG9yUG9zaXRpb246OmtCdWJibGVMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yX2JvdW5kcyk7CisgICAgICBUZXN0TWVudUZpdHNPblNtYWxsU2NyZWVuKE1lbnVBbmNob3JQb3NpdGlvbjo6a0J1YmJsZVJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yX2JvdW5kcyk7CisgICAgfQorfQorCiAvLyBUZXN0IHRoYXQgc3VibWVudXMgYXJlIGRpc3BsYXllZCB3aXRoaW4gdGhlIHNjcmVlbiBib3VuZHMgb24gc21hbGxlciBzY3JlZW5zLgogVEVTVF9QKE1lbnVDb250cm9sbGVyVGVzdCwgVGVzdFN1Ym1lbnVGaXRzT25TY3JlZW4pIHsKICAgbWVudV9jb250cm9sbGVyKCktPnNldF91c2VfdG91Y2hhYmxlX2xheW91dCh0cnVlKTsKZGlmZiAtLWdpdCBhL3VpL3ZpZXdzL2xpbnV4X3VpL2xpbnV4X3VpLmggYi91aS92aWV3cy9saW51eF91aS9saW51eF91aS5oCmluZGV4IDlmODllYjIuLjBlN2I3ZWEgMTAwNjQ0Ci0tLSBhL3VpL3ZpZXdzL2xpbnV4X3VpL2xpbnV4X3VpLmgKKysrIGIvdWkvdmlld3MvbGludXhfdWkvbGludXhfdWkuaApAQCAtMTE5LDExICsxMTksNiBAQAogICAvLyBvYmplY3QgYnkgZGVmYXVsdC4KICAgdmlydHVhbCBib29sIEdldERlZmF1bHRVc2VzU3lzdGVtVGhlbWUoKSBjb25zdCA9IDA7CiAKLSAgLy8gU2V0cyB2aXN1YWwgcHJvcGVydGllcyBpbiB0aGUgZGVza3RvcCBlbnZpcm9ubWVudCByZWxhdGVkIHRvIGRvd25sb2FkCi0gIC8vIHByb2dyZXNzLCBpZiBhdmFpbGFibGUuCi0gIHZpcnR1YWwgdm9pZCBTZXREb3dubG9hZENvdW50KGludCBjb3VudCkgY29uc3QgPSAwOwotICB2aXJ0dWFsIHZvaWQgU2V0UHJvZ3Jlc3NGcmFjdGlvbihmbG9hdCBwZXJjZW50YWdlKSBjb25zdCA9IDA7Ci0KICAgLy8gUmV0dXJucyB0aGUgaWNvbiBmb3IgYSBnaXZlbiBjb250ZW50IHR5cGUgZnJvbSB0aGUgaWNvbiB0aGVtZS4KICAgLy8gVE9ETyhkYXZpZGJlbik6IEFkZCBhbiBvYnNlcnZlciBmb3IgdGhlIHRoZW1lIGNoYW5naW5nLCBzbyB3ZSBjYW4gZHJvcCB0aGUKICAgLy8gY2FjaGVzLgpkaWZmIC0tZ2l0IGEvdWkvdmlld3Mvd2lkZ2V0L2Rlc2t0b3BfYXVyYS9kZXNrdG9wX25hdGl2ZV93aWRnZXRfYXVyYS5jYyBiL3VpL3ZpZXdzL3dpZGdldC9kZXNrdG9wX2F1cmEvZGVza3RvcF9uYXRpdmVfd2lkZ2V0X2F1cmEuY2MKaW5kZXggZWZkZjBkODEuLjhmYzFiMjkgMTAwNjQ0Ci0tLSBhL3VpL3ZpZXdzL3dpZGdldC9kZXNrdG9wX2F1cmEvZGVza3RvcF9uYXRpdmVfd2lkZ2V0X2F1cmEuY2MKKysrIGIvdWkvdmlld3Mvd2lkZ2V0L2Rlc2t0b3BfYXVyYS9kZXNrdG9wX25hdGl2ZV93aWRnZXRfYXVyYS5jYwpAQCAtNzgxLDEyICs3ODEsOCBAQAogfQogCiB2b2lkIERlc2t0b3BOYXRpdmVXaWRnZXRBdXJhOjpDbG9zZSgpIHsKLSAgaWYgKCFjb250ZW50X3dpbmRvd18pCi0gICAgcmV0dXJuOwotCi0gIGNvbnRlbnRfd2luZG93Xy0+U3VwcHJlc3NQYWludCgpOwotCi0gIGRlc2t0b3Bfd2luZG93X3RyZWVfaG9zdF8tPkNsb3NlKCk7CisgIGlmIChjb250ZW50X3dpbmRvd18pCisgICAgZGVza3RvcF93aW5kb3dfdHJlZV9ob3N0Xy0+Q2xvc2UoKTsKIH0KIAogdm9pZCBEZXNrdG9wTmF0aXZlV2lkZ2V0QXVyYTo6Q2xvc2VOb3coKSB7CmRpZmYgLS1naXQgYS91aS92aWV3cy93aWRnZXQvbmF0aXZlX3dpZGdldF9hdXJhLmNjIGIvdWkvdmlld3Mvd2lkZ2V0L25hdGl2ZV93aWRnZXRfYXVyYS5jYwppbmRleCBlMWMyYzE3Li44OTRiODBhIDEwMDY0NAotLS0gYS91aS92aWV3cy93aWRnZXQvbmF0aXZlX3dpZGdldF9hdXJhLmNjCisrKyBiL3VpL3ZpZXdzL3dpZGdldC9uYXRpdmVfd2lkZ2V0X2F1cmEuY2MKQEAgLTUzNiw3ICs1MzYsNiBAQAogICBEQ0hFQ0sod2luZG93XyB8fAogICAgICAgICAgb3duZXJzaGlwXyA9PSBXaWRnZXQ6OkluaXRQYXJhbXM6OldJREdFVF9PV05TX05BVElWRV9XSURHRVQpOwogICBpZiAod2luZG93XykgewotICAgIHdpbmRvd18tPlN1cHByZXNzUGFpbnQoKTsKICAgICBIaWRlKCk7CiAgICAgd2luZG93Xy0+U2V0UHJvcGVydHkoYXVyYTo6Y2xpZW50OjprTW9kYWxLZXksIHVpOjpNT0RBTF9UWVBFX05PTkUpOwogICB9CmRpZmYgLS1naXQgYS91aS93ZWJ1aS9yZXNvdXJjZXMvY3JfZWxlbWVudHMvY3Jfc2VhcmNoYWJsZV9kcm9wX2Rvd24vY3Jfc2VhcmNoYWJsZV9kcm9wX2Rvd24uaHRtbCBiL3VpL3dlYnVpL3Jlc291cmNlcy9jcl9lbGVtZW50cy9jcl9zZWFyY2hhYmxlX2Ryb3BfZG93bi9jcl9zZWFyY2hhYmxlX2Ryb3BfZG93bi5odG1sCmluZGV4IGVkZjIyOTYuLjQwZmVmMTcgMTAwNjQ0Ci0tLSBhL3VpL3dlYnVpL3Jlc291cmNlcy9jcl9lbGVtZW50cy9jcl9zZWFyY2hhYmxlX2Ryb3BfZG93bi9jcl9zZWFyY2hhYmxlX2Ryb3BfZG93bi5odG1sCisrKyBiL3VpL3dlYnVpL3Jlc291cmNlcy9jcl9lbGVtZW50cy9jcl9zZWFyY2hhYmxlX2Ryb3BfZG93bi9jcl9zZWFyY2hhYmxlX2Ryb3BfZG93bi5odG1sCkBAIC0xNiw2ICsxNiwxMCBAQAogICAgICAgICAtLWNyLWlucHV0LWVycm9yLWRpc3BsYXk6IG5vbmU7CiAgICAgICB9CiAKKyAgICAgIDpob3N0KFtvcGVuZWRfXSkgY3ItaW5wdXQgeworICAgICAgICAtLWNyLWlucHV0LWJvcmRlci1yYWRpdXM6IDRweCA0cHggMCAwOworICAgICAgfQorCiAgICAgICBpcm9uLWRyb3Bkb3duLAogICAgICAgY3ItaW5wdXQgewogICAgICAgICAvKiA0NzJweCBpcyB0aGUgbWF4IHdpZHRoIG9mIHRoZSBpbnB1dCBmaWVsZCBmb3IgYSBkaWFsb2cuICovCkBAIC0zMiw2ICszNiw3IEBACiAKICAgICAgIGlyb24tZHJvcGRvd24gW3Nsb3Q9J2Ryb3Bkb3duLWNvbnRlbnQnXSB7CiAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOworICAgICAgICBib3JkZXItcmFkaXVzOiAwIDAgNHB4IDRweDsKICAgICAgICAgYm94LXNoYWRvdzogMCAycHggNnB4IHZhcigtLXBhcGVyLWdyZXktNTAwKTsKICAgICAgICAgbWluLXdpZHRoOiAxMjhweDsKICAgICAgICAgcGFkZGluZzogOHB4IDA7CkBAIC0xNDEsNyArMTQ2LDcgQEAKICAgICAgICAgPC9kaXY+CiAgICAgICAgIDxkaXYgaWQ9ImRyb3Bkb3duLWJveCI+CiAgICAgICAgICAgPGlyb24tZHJvcGRvd24gaG9yaXpvbnRhbC1hbGlnbj0ibGVmdCIgdmVydGljYWwtYWxpZ249InRvcCIKLSAgICAgICAgICAgICAgdmVydGljYWwtb2Zmc2V0PSI0IiBuby1jYW5jZWwtb24tb3V0c2lkZS1jbGljaworICAgICAgICAgICAgICB2ZXJ0aWNhbC1vZmZzZXQ9IjAiIG5vLWNhbmNlbC1vbi1vdXRzaWRlLWNsaWNrCiAgICAgICAgICAgICAgIG5vLWNhbmNlbC1vbi1lc2Mta2V5PgogICAgICAgICAgICAgPGRpdiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgICAgPGRpdiBpZD0ibG9hZGluZy1ib3giIGhpZGRlbj0iW1shc2hvd0xvYWRpbmddXSI+CmRpZmYgLS1naXQgYS91aS93ZWJ1aS9yZXNvdXJjZXMvY3JfZWxlbWVudHMvY3Jfc2VhcmNoYWJsZV9kcm9wX2Rvd24vY3Jfc2VhcmNoYWJsZV9kcm9wX2Rvd24uanMgYi91aS93ZWJ1aS9yZXNvdXJjZXMvY3JfZWxlbWVudHMvY3Jfc2VhcmNoYWJsZV9kcm9wX2Rvd24vY3Jfc2VhcmNoYWJsZV9kcm9wX2Rvd24uanMKaW5kZXggY2UxMGNhNi4uNGZkYWYwMSAxMDA2NDQKLS0tIGEvdWkvd2VidWkvcmVzb3VyY2VzL2NyX2VsZW1lbnRzL2NyX3NlYXJjaGFibGVfZHJvcF9kb3duL2NyX3NlYXJjaGFibGVfZHJvcF9kb3duLmpzCisrKyBiL3VpL3dlYnVpL3Jlc291cmNlcy9jcl9lbGVtZW50cy9jcl9zZWFyY2hhYmxlX2Ryb3BfZG93bi9jcl9zZWFyY2hhYmxlX2Ryb3BfZG93bi5qcwpAQCAtODAsNiArODAsMTcgQEAKIAogICAgIC8qKiBAcHJpdmF0ZSB7Ym9vbGVhbn0gKi8KICAgICBkcm9wZG93blJlZml0UGVuZGluZ186IEJvb2xlYW4sCisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoZSBkcm9wZG93biBpcyBjdXJyZW50bHkgb3Blbi4gU2hvdWxkIG9ubHkgYmUgdXNlZCBieSBDU1MKKyAgICAgKiBwcml2YXRlbHkuCisgICAgICogQHByaXZhdGUge2Jvb2xlYW59CisgICAgICovCisgICAgb3BlbmVkXzogeworICAgICAgdHlwZTogQm9vbGVhbiwKKyAgICAgIHZhbHVlOiBmYWxzZSwKKyAgICAgIHJlZmxlY3RUb0F0dHJpYnV0ZTogdHJ1ZSwKKyAgICB9LAogICB9LAogCiAgIGxpc3RlbmVyczogewpAQCAtMTEyLDYgKzEyMywxOCBAQAogICAgIH0KICAgfSwKIAorICAvKiogQHByaXZhdGUgKi8KKyAgb3BlbkRyb3Bkb3duXzogZnVuY3Rpb24oKSB7CisgICAgdGhpcy4kJCgnaXJvbi1kcm9wZG93bicpLm9wZW4oKTsKKyAgICB0aGlzLm9wZW5lZF8gPSB0cnVlOworICB9LAorCisgIC8qKiBAcHJpdmF0ZSAqLworICBjbG9zZURyb3Bkb3duXzogZnVuY3Rpb24oKSB7CisgICAgdGhpcy4kJCgnaXJvbi1kcm9wZG93bicpLmNsb3NlKCk7CisgICAgdGhpcy5vcGVuZWRfID0gZmFsc2U7CisgIH0sCisKICAgLyoqCiAgICAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IG9sZFZhbHVlCiAgICAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IG5ld1ZhbHVlCkBAIC0xMjksNyArMTUyLDcgQEAKICAgICBpZiAodGhpcy5yZWFkb25seSkgewogICAgICAgcmV0dXJuOwogICAgIH0KLSAgICB0aGlzLiQkKCdpcm9uLWRyb3Bkb3duJykub3BlbigpOworICAgIHRoaXMub3BlbkRyb3Bkb3duXygpOwogICB9LAogCiAgIC8qKgpAQCAtMTc3LDExICsyMDAsMTEgQEAKICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgfSBlbHNlIGlmIChwYXRocy5pbmNsdWRlcyhzZWFyY2hJbnB1dCkpIHsKICAgICAgIC8vIEEgY2xpY2sgb24gdGhlIHNlYXJjaCBpbnB1dCBzaG91bGQgb3BlbiB0aGUgZHJvcGRvd24uCi0gICAgICBkcm9wZG93bi5vcGVuKCk7CisgICAgICB0aGlzLm9wZW5Ecm9wZG93bl8oKTsKICAgICB9IGVsc2UgewogICAgICAgLy8gQSBjbGljayBvdXRzaWRlIGVpdGhlciB0aGUgc2VhcmNoIGlucHV0IG9yIGRyb3Bkb3duIHNob3VsZCBjbG9zZSB0aGUKICAgICAgIC8vIGRyb3Bkb3duLiBJbXBsaWNpdGx5LCB0aGUgc2VhcmNoIGlucHV0IGhhcyBsb3N0IGZvY3VzIGF0IHRoaXMgcG9pbnQuCi0gICAgICBkcm9wZG93bi5jbG9zZSgpOworICAgICAgdGhpcy5jbG9zZURyb3Bkb3duXygpOwogICAgIH0KICAgfSwKIApAQCAtMjAyLDcgKzIyNSw3IEBACiAgICAgICBjYXNlICdUYWInOgogICAgICAgICAvLyBQcmVzc2luZyB0YWIgd2lsbCBjYXVzZSB0aGUgaW5wdXQgZmllbGQgdG8gbG9zZSBmb2N1cy4gU2luY2UgdGhlCiAgICAgICAgIC8vIGRyb3Bkb3duIHZpc2liaWxpdHkgaXMgdGllZCB0byBmb2N1cywgY2xvc2UgdGhlIGRyb3Bkb3duLgotICAgICAgICB0aGlzLiQkKCdpcm9uLWRyb3Bkb3duJykuY2xvc2UoKTsKKyAgICAgICAgdGhpcy5jbG9zZURyb3Bkb3duXygpOwogICAgICAgICBicmVhazsKICAgICAgIGNhc2UgJ0Fycm93VXAnOgogICAgICAgY2FzZSAnQXJyb3dEb3duJzogewpAQCAtMjIzLDcgKzI0Niw3IEBACiAgICAgICAgIHRoaXMudmFsdWUgPQogICAgICAgICAgICAgZHJvcGRvd24ucXVlcnlTZWxlY3RvcignZG9tLXJlcGVhdCcpLm1vZGVsRm9yRWxlbWVudChzZWxlY3RlZCkuaXRlbTsKICAgICAgICAgdGhpcy5zZWFyY2hUZXJtXyA9ICcnOwotICAgICAgICBkcm9wZG93bi5jbG9zZSgpOworICAgICAgICB0aGlzLmNsb3NlRHJvcGRvd25fKCk7CiAgICAgICAgIC8vIFN0b3AgdGhlIGRlZmF1bHQgc3VibWl0IGFjdGlvbi4KICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgYnJlYWs7CkBAIC0yOTAsNyArMzEzLDcgQEAKICAgICAvLyBjbG9zZWQgd2hlbiB0aGUgdXNlciBtYWtlcyBhIHNlbGVjdGlvbiB1c2luZyB0aGUgbW91c2Ugb3Iga2V5Ym9hcmQuCiAgICAgLy8gSG93ZXZlciwgZm9jdXMgcmVtYWlucyBvbiB0aGUgaW5wdXQgZmllbGQuIElmIHRoZSB1c2VyIG1ha2VzIGEgZnVydGhlcgogICAgIC8vIGNoYW5nZSwgdGhlbiB0aGUgZHJvcGRvd24gc2hvdWxkIGJlIHNob3duLgotICAgIHRoaXMuJCQoJ2lyb24tZHJvcGRvd24nKS5vcGVuKCk7CisgICAgdGhpcy5vcGVuRHJvcGRvd25fKCk7CiAKICAgICAvLyBpcm9uLWRyb3Bkb3duIHNldHMgaXRzIG1heC1oZWlnaHQgd2hlbiBpdCBpcyBvcGVuZWQuIElmIHRoZSBjdXJyZW50IHZhbHVlCiAgICAgLy8gcmVzdWx0cyBpbiBubyBmaWx0ZXJlZCBpdGVtcyBpbiB0aGUgZHJvcCBkb3duIGxpc3QsIHRoZSBpcm9uLWRyb3Bkb3duCkBAIC0zMDcsNyArMzMwLDcgQEAKICAgICogQHByaXZhdGUKICAgICovCiAgIG9uU2VsZWN0XzogZnVuY3Rpb24oZXZlbnQpIHsKLSAgICB0aGlzLiQkKCdpcm9uLWRyb3Bkb3duJykuY2xvc2UoKTsKKyAgICB0aGlzLmNsb3NlRHJvcGRvd25fKCk7CiAKICAgICB0aGlzLnZhbHVlID0gZXZlbnQubW9kZWwuaXRlbTsKICAgICB0aGlzLnNlYXJjaFRlcm1fID0gJyc7CmRpZmYgLS1naXQgYS93ZWJsYXllci9icm93c2VyL2NvbnRlbnRfdmlld19yZW5kZXJfdmlldy5jYyBiL3dlYmxheWVyL2Jyb3dzZXIvY29udGVudF92aWV3X3JlbmRlcl92aWV3LmNjCmluZGV4IDJhNThhYjcuLmIzZWUwZjBjIDEwMDY0NAotLS0gYS93ZWJsYXllci9icm93c2VyL2NvbnRlbnRfdmlld19yZW5kZXJfdmlldy5jYworKysgYi93ZWJsYXllci9icm93c2VyL2NvbnRlbnRfdmlld19yZW5kZXJfdmlldy5jYwpAQCAtODcsOCArODcsNyBAQAogCiB2b2lkIENvbnRlbnRWaWV3UmVuZGVyVmlldzo6U3VyZmFjZURlc3Ryb3llZChKTklFbnYqIGVudiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpib29sZWFuIGNhY2hlX2JhY2tfYnVmZmVyKSB7Ci0gIGV2aWN0X2JhY2tfYnVmZmVyX29uX25leHRfc3dhcF8gPSBjYWNoZV9iYWNrX2J1ZmZlcjsKLSAgaWYgKGV2aWN0X2JhY2tfYnVmZmVyX29uX25leHRfc3dhcF8pCisgIGlmIChjYWNoZV9iYWNrX2J1ZmZlcikKICAgICBjb21wb3NpdG9yXy0+Q2FjaGVCYWNrQnVmZmVyRm9yQ3VycmVudFN1cmZhY2UoKTsKICAgY29tcG9zaXRvcl8tPlNldFN1cmZhY2UobnVsbHB0ciwgZmFsc2UpOwogfQpAQCAtMTE2LDEzICsxMTUsMTUgQEAKIAogdm9pZCBDb250ZW50Vmlld1JlbmRlclZpZXc6OkRpZFN3YXBGcmFtZShpbnQgcGVuZGluZ19mcmFtZXMpIHsKICAgSk5JRW52KiBlbnYgPSBiYXNlOjphbmRyb2lkOjpBdHRhY2hDdXJyZW50VGhyZWFkKCk7Ci0gIEphdmFfQ29udGVudFZpZXdSZW5kZXJWaWV3X2RpZFN3YXBGcmFtZShlbnYsIGphdmFfb2JqXyk7Ci0gIGlmIChldmljdF9iYWNrX2J1ZmZlcl9vbl9uZXh0X3N3YXBfKSB7Ci0gICAgY29tcG9zaXRvcl8tPkV2aWN0Q2FjaGVkQmFja0J1ZmZlcigpOwotICAgIGV2aWN0X2JhY2tfYnVmZmVyX29uX25leHRfc3dhcF8gPSBmYWxzZTsKKyAgaWYgKEphdmFfQ29udGVudFZpZXdSZW5kZXJWaWV3X2RpZFN3YXBGcmFtZShlbnYsIGphdmFfb2JqXykpIHsKKyAgICBjb21wb3NpdG9yXy0+U2V0TmVlZHNSZWRyYXcoKTsKICAgfQogfQogCit2b2lkIENvbnRlbnRWaWV3UmVuZGVyVmlldzo6RXZpY3RDYWNoZWRTdXJmYWNlKEpOSUVudiogZW52KSB7CisgIGNvbXBvc2l0b3JfLT5FdmljdENhY2hlZEJhY2tCdWZmZXIoKTsKK30KKwogdm9pZCBDb250ZW50Vmlld1JlbmRlclZpZXc6OkluaXRDb21wb3NpdG9yKCkgewogICBpZiAoY29tcG9zaXRvcl8pCiAgICAgcmV0dXJuOwpkaWZmIC0tZ2l0IGEvd2VibGF5ZXIvYnJvd3Nlci9jb250ZW50X3ZpZXdfcmVuZGVyX3ZpZXcuaCBiL3dlYmxheWVyL2Jyb3dzZXIvY29udGVudF92aWV3X3JlbmRlcl92aWV3LmgKaW5kZXggMmIxYzczZS4uMGMyZmI4MiAxMDA2NDQKLS0tIGEvd2VibGF5ZXIvYnJvd3Nlci9jb250ZW50X3ZpZXdfcmVuZGVyX3ZpZXcuaAorKysgYi93ZWJsYXllci9icm93c2VyL2NvbnRlbnRfdmlld19yZW5kZXJfdmlldy5oCkBAIC01Myw2ICs1Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgamludCB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICBqaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjphbmRyb2lkOjpKYXZhUGFyYW1SZWY8am9iamVjdD4mIHN1cmZhY2UpOworICB2b2lkIEV2aWN0Q2FjaGVkU3VyZmFjZShKTklFbnYqIGVudik7CiAgIGJhc2U6OmFuZHJvaWQ6OlNjb3BlZEphdmFMb2NhbFJlZjxqb2JqZWN0PiBHZXRSZXNvdXJjZU1hbmFnZXIoSk5JRW52KiBlbnYpOwogCiAgIC8vIENvbXBvc2l0b3JDbGllbnQgaW1wbGVtZW50YXRpb24KQEAgLTc0LDggKzc1LDYgQEAKICAgc2NvcGVkX3JlZnB0cjxjYzo6TGF5ZXI+IHJvb3RfY29udGFpbmVyX2xheWVyXzsKICAgc2NvcGVkX3JlZnB0cjxjYzo6TGF5ZXI+IHdlYl9jb250ZW50c19sYXllcl87CiAKLSAgYm9vbCBldmljdF9iYWNrX2J1ZmZlcl9vbl9uZXh0X3N3YXBfID0gZmFsc2U7Ci0KICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKENvbnRlbnRWaWV3UmVuZGVyVmlldyk7CiB9OwogCmRpZmYgLS1naXQgYS93ZWJsYXllci9icm93c2VyL2phdmEvb3JnL2Nocm9taXVtL3dlYmxheWVyX3ByaXZhdGUvQ29udGVudFZpZXdSZW5kZXJWaWV3LmphdmEgYi93ZWJsYXllci9icm93c2VyL2phdmEvb3JnL2Nocm9taXVtL3dlYmxheWVyX3ByaXZhdGUvQ29udGVudFZpZXdSZW5kZXJWaWV3LmphdmEKaW5kZXggMGYyODlkYy4uMjQ3NTYxYiAxMDA2NDQKLS0tIGEvd2VibGF5ZXIvYnJvd3Nlci9qYXZhL29yZy9jaHJvbWl1bS93ZWJsYXllcl9wcml2YXRlL0NvbnRlbnRWaWV3UmVuZGVyVmlldy5qYXZhCisrKyBiL3dlYmxheWVyL2Jyb3dzZXIvamF2YS9vcmcvY2hyb21pdW0vd2VibGF5ZXJfcHJpdmF0ZS9Db250ZW50Vmlld1JlbmRlclZpZXcuamF2YQpAQCAtMTIsNiArMTIsNyBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVGV4dHVyZVZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLndlYmtpdC5WYWx1ZUNhbGxiYWNrOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OwogCkBAIC0zNSwxOSArMzYsNyBAQAogICogdGhlIGNocm9taXVtIGNvbXBvc2l0b3IuIE5vdGUgaXQgY2FuIGJlIHVzZWQgdG8gZGlzcGxheSBvbmx5IG9uZSBXZWJDb250ZW50cy4KICAqIFRoaXMgYWxsb3dzIHN3aXRjaGluZyBiZXR3ZWVuIFN1cmZhY2VWaWV3IGFuZCBUZXh0dXJlVmlldyBhcyB0aGUgc291cmNlIG9mCiAgKiB0aGUgU3VyZmFjZSB1c2VkIGJ5IGNocm9taXVtIGNvbXBvc2l0b3IsIGFuZCBhdHRlbXB0cyB0byBtYWtlIHRoZSBzd2l0Y2gKLSAqIHZpc3VhbGx5IHNlYW1sZXNzLiBUaGUgcm91Z2ggc3RlcHMgZm9yIGEgc3dpdGNoIGFyZToKLSAqIDEpIEFsbG9jYXRlIG5ldyB2aWV3LCBhbmQgaW5zZXJ0IGl0IGludG8gdmlldyBoaWVyYXJjaHkgYmVsb3cgdGhlIGV4aXN0aW5nCi0gKiAgICB2aWV3LCBzbyBpdCBpcyBub3QgeWV0IHNob3dpbmcuCi0gKiAyKSBXaGVuIFN1cmZhY2UgaXMgYWxsb2NhdGVkIGJ5IG5ldyBWaWV3LCBzd2FwIGNocm9taXVtIGNvbXBvc2l0b3IgdG8gdGhlCi0gKiAgICBuZXcgU3VyZmFjZS4gTm90ZSBhdCB0aGlzIHBvaW50IHRoZSBleGlzdGluZyB2aWV3IHNob3VsZCBpcyBzdGlsbCB2aXNpYmxlLgotICogMykgQWZ0ZXIgY2hyb21pdW0gY29tcG9zaXRvciBzd2FwcyBhIGZyYW1lIGluIHRoZSBuZXcgc3VyZmFjZSwgZGV0YWNoIHRoZQotICogICAgZXhpc3Rpbmcgdmlldy4KLSAqIEhlcmUgYXJlIHNvbWUgbW9yZSBkZXRhaWxzLgotICogKiBOZXcgdmlldyBpcyBhZGRlZCBhdCBpbmRleCAwLCBpZSBiZWxvdyBhbGwgb3RoZXIgY2hpbGRyZW4uCi0gKiAqIFN1cmZhY2VWaWV3IHRoYXQgdXNlcyBTdXJmYWNlQ29udHJvbCB3aWxsIG5lZWQgdG8gcmV0YWluIHRoZSB1bmRlcmx5aW5nCi0gKiAgIEVHTFN1cmZhY2UgdG8gYXZvaWQgZGVzb3RyeWluZyB0aGUgU3VyZmFjZS4KLSAqICogVXNlIHBvc3RPbkFuaW1hdGlvbiB0byBtYW5pcHVsYXRlIHZpZXcgdHJlZSBhcyBpdCBpcyBub3Qgc2FmZSB0byBtb2RpZnkKLSAqICAgdGhlIHZpZXcgdHJlZSBpbnNpZGUgbGF5b3V0IG9yIGRyYXcuCisgKiB2aXN1YWxseSBzZWFtbGVzcy4KICAqLwogQEpOSU5hbWVzcGFjZSgid2VibGF5ZXIiKQogcHVibGljIGNsYXNzIENvbnRlbnRWaWV3UmVuZGVyVmlldyBleHRlbmRzIEZyYW1lTGF5b3V0IHsKQEAgLTYyLDcgKzUxLDYgQEAKICAgICAvLyBUaGlzIGlzIHRoZSBtb2RlIHRoYXQgbGFzdCBzdXBwbGllZCB0aGUgU3VyZmFjZSB0byB0aGUgY29tcG9zaXRvci4KICAgICAvLyBUaGlzIHNob3VsZCBnZW5lcmFsbHkgYmUgZXF1YWwgdG8gfG1SZXF1ZXN0ZWR8IGV4Y2VwdCBkdXJpbmcgdHJhbnNpdGlvbnMuCiAgICAgcHJpdmF0ZSBTdXJmYWNlRGF0YSBtQ3VycmVudDsKLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxTdXJmYWNlRGF0YT4gbU1hcmtlZEZvckRlc3Ryb3lTdXJmYWNlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCiAgICAgLy8gVGhlIG5hdGl2ZSBzaWRlIG9mIHRoaXMgb2JqZWN0LgogICAgIHByaXZhdGUgbG9uZyBtTmF0aXZlQ29udGVudFZpZXdSZW5kZXJWaWV3OwpAQCAtMTAwLDggKzg4LDggQEAKICAgICAgICAgICAgICAgICAgICAgfHwgbVN1cmZhY2VEYXRhID09IENvbnRlbnRWaWV3UmVuZGVyVmlldy50aGlzLm1DdXJyZW50OwogICAgICAgICAgICAgaWYgKENvbnRlbnRWaWV3UmVuZGVyVmlldy50aGlzLm1DdXJyZW50ICE9IG51bGwKICAgICAgICAgICAgICAgICAgICAgJiYgQ29udGVudFZpZXdSZW5kZXJWaWV3LnRoaXMubUN1cnJlbnQgIT0gbVN1cmZhY2VEYXRhKSB7Ci0gICAgICAgICAgICAgICAgQ29udGVudFZpZXdSZW5kZXJWaWV3LnRoaXMubUN1cnJlbnQubWFya0ZvckRlc3Ryb3koCi0gICAgICAgICAgICAgICAgICAgICAgICBtTWFya2VkRm9yRGVzdHJveVN1cmZhY2VzLCB0cnVlIC8qIGhhc05leHRTdXJmYWNlICovKTsKKyAgICAgICAgICAgICAgICBDb250ZW50Vmlld1JlbmRlclZpZXcudGhpcy5tQ3VycmVudC5tYXJrRm9yRGVzdHJveSh0cnVlIC8qIGhhc05leHRTdXJmYWNlICovKTsKKyAgICAgICAgICAgICAgICBtU3VyZmFjZURhdGEuc2V0U3VyZmFjZURhdGFOZWVkc0Rlc3Ryb3koQ29udGVudFZpZXdSZW5kZXJWaWV3LnRoaXMubUN1cnJlbnQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQ29udGVudFZpZXdSZW5kZXJWaWV3LnRoaXMubUN1cnJlbnQgPSBtU3VyZmFjZURhdGE7CiAgICAgICAgICAgICBDb250ZW50Vmlld1JlbmRlclZpZXdKbmkuZ2V0KCkuc3VyZmFjZUNyZWF0ZWQobU5hdGl2ZUNvbnRlbnRWaWV3UmVuZGVyVmlldyk7CkBAIC0xMzIsMTggKzEyMCw1NiBAQAogICAgIC8vIEFic3RyYWN0IGRpZmZlcmVuY2VzIGJldHdlZW4gU3VyZmFjZVZpZXcgYW5kIFRleHR1cmVWaWV3IGJlaGluZCB0aGlzIGNsYXNzLgogICAgIC8vIEFsc28gcmVzcG9uc2libGUgZm9yIGhvbGRpbmcgYW5kIGNhbGxpbmcgY2FsbGJhY2tzLgogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN1cmZhY2VEYXRhIGltcGxlbWVudHMgU3VyZmFjZUV2ZW50TGlzdGVuZXIgeworICAgICAgICBwcml2YXRlIGNsYXNzIFRleHR1cmVWaWV3V2l0aEludmFsaWRhdGUgZXh0ZW5kcyBUZXh0dXJlVmlldyB7CisgICAgICAgICAgICBwdWJsaWMgVGV4dHVyZVZpZXdXaXRoSW52YWxpZGF0ZShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlKCkgeworICAgICAgICAgICAgICAgIC8vIFRleHR1cmVWaWV3IGlzIGludmFsaWRhdGVkIHdoZW4gaXQgcmVjZWl2ZXMgYSBuZXcgZnJhbWUgZnJvbSBpdHMgU3VyZmFjZVRleHR1cmUuCisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHNhZmUgcGxhY2UgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIFRleHR1cmVWaWV3IG5vdyBoYXMgY29udGVudCBhbmQgaXMKKyAgICAgICAgICAgICAgICAvLyByZWFkeSB0byBiZSBzaG93bi4KKyAgICAgICAgICAgICAgICBzdXBlci5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgZGVzdHJveVByZXZpb3VzRGF0YSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgQE1vZGUKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU1vZGU7CiAgICAgICAgIHByaXZhdGUgZmluYWwgU3VyZmFjZUV2ZW50TGlzdGVuZXIgbUxpc3RlbmVyOwogICAgICAgICBwcml2YXRlIGZpbmFsIEZyYW1lTGF5b3V0IG1QYXJlbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgUnVubmFibGUgbUV2aWN0OwogCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQ3JlYXRlZDsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1SYW5DYWxsYmFja3M7CiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtTWFya2VkRm9yRGVzdHJveTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1DYWNoZWRTdXJmYWNlTmVlZHNFdmljdGlvbjsKIAogICAgICAgICBwcml2YXRlIGJvb2xlYW4gbU5lZWRzT25TdXJmYWNlRGVzdHJveWVkOwogCisgICAgICAgIC8vIER1cmluZyB0cmFuc2l0aW9uaW5nIGJldHdlZW4gdHdvIFN1cmZhY2VEYXRhLCB0aGVyZSBpcyBhIGNvbXBsaWNhdGVkIHNlcmllcyBvZiBjYWxscyB0bworICAgICAgICAvLyBhdm9pZCB2aXN1YWwgYXJ0aWZhY3RzLgorICAgICAgICAvLyAxKSBBbGxvY2F0ZSBuZXcgU3VyZmFjZURhdGEsIGFuZCBpbnNlcnQgaXQgaW50byB2aWV3IGhpZXJhcmNoeSBiZWxvdyB0aGUgZXhpc3RpbmcKKyAgICAgICAgLy8gICAgU3VyZmFjZURhdGEsIHNvIGl0IGlzIG5vdCB5ZXQgc2hvd2luZy4KKyAgICAgICAgLy8gMikgV2hlbiBTdXJmYWNlIGlzIGFsbG9jYXRlZCBieSBuZXcgVmlldywgc3dhcCBjaHJvbWl1bSBjb21wb3NpdG9yIHRvIHRoZQorICAgICAgICAvLyAgICBuZXcgU3VyZmFjZS4gfG1hcmtGb3JEZXN0cm95fCBpcyBjYWxsZWQgb24gdGhlIHByZXZpb3VzIFN1cmZhY2VEYXRhLCBhbmQgdGhlIHR3bworICAgICAgICAvLyAgICBTdXJmYWNlRGF0YXMgYXJlIGxpbmtlZCB0aHJvdWdoIHRoZXNlIHR3byB2YXJpYWJsZXMuCisgICAgICAgIC8vICAgIE5vdGUgYXQgdGhpcyBwb2ludCB0aGUgZXhpc3RpbmcgdmlldyBpcyBzdGlsbCB2aXNpYmxlLgorICAgICAgICAvLyAzKSBXYWl0IHVudGlsIG5ldyBTdXJmYWNlRGF0YSBkZWNpZGVzIHRoYXQgaXQgaGFzIGNvbnRlbnQgYW5kIGlzIHJlYWR5IHRvIGJlIHNob3duCisgICAgICAgIC8vICAgICogRm9yIFRleHR1cmVWaWV3LCB3YWl0IHVudGlsIFRleHR1cmVWaWV3LmludmFsaWRhdGUgaXMgY2FsbGVkCisgICAgICAgIC8vICAgICogRm9yIFN1cmZhY2VWaWV3LCB3YWl0IGZvciB0d28gc3dhcHMgZnJvbSB0aGUgY2hyb21pdW0gY29tcG9zaXRvcgorICAgICAgICAvLyA0KSBOZXcgU3VyZmFjZURhdGEgY2FsbHMgfGRlc3Ryb3l8IG9uIHByZXZpb3VzIFN1cmZhY2VEYXRhLgorICAgICAgICAvLyAgICAqIEZvciBUZXh0dXJlVmlldywgaXQgaXMgc2ltcGx5IGRldGFjaGVkIGltbWVkaWF0ZWx5IGZyb20gdGhlIHZpZXcgdHJlZQorICAgICAgICAvLyAgICAqIEZvciBTdXJmYWNlVmlldywgdG8gYXZvaWQgZmxpY2tlciwgbW92ZSBpdCB0byB0aGUgYmFjayBmaXJzdCBiZWZvcmUgYW5kIHdhaXQKKyAgICAgICAgLy8gICAgICB0d28gZnJhbWVzIGJlZm9yZSBkZXRhY2hpbmcuCisgICAgICAgIC8vIDUpIFByZXZpb3VzIFN1cmZhY2VEYXRhIHJ1bnMgY2FsbGJhY2tzIG9uIHRoZSBuZXcgU3VyZmFjZURhdGEgdG8gc2lnbmFsIHRoZSBjb21wbGV0aW9uCisgICAgICAgIC8vICAgIG9mIHRoZSB0cmFuc2l0aW9uLgorICAgICAgICBwcml2YXRlIFN1cmZhY2VEYXRhIG1QcmV2U3VyZmFjZURhdGFOZWVkc0Rlc3Ryb3k7CisgICAgICAgIHByaXZhdGUgU3VyZmFjZURhdGEgbU5leHRTdXJmYWNlRGF0YU5lZWRzUnVuQ2FsbGJhY2s7CisKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdXJmYWNlSG9sZGVyQ2FsbGJhY2sgbVN1cmZhY2VDYWxsYmFjazsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdXJmYWNlVmlldyBtU3VyZmFjZVZpZXc7CisgICAgICAgIHByaXZhdGUgaW50IG1OdW1TdXJmYWNlVmlld1N3YXBzVW50aWxWaXNpYmxlOwogCiAgICAgICAgIHByaXZhdGUgZmluYWwgVGV4dHVyZVZpZXcgbVRleHR1cmVWaWV3OwogICAgICAgICBwcml2YXRlIGZpbmFsIFRleHR1cmVWaWV3U3VyZmFjZVRleHR1cmVMaXN0ZW5lciBtU3VyZmFjZVRleHR1cmVMaXN0ZW5lcjsKQEAgLTE1MSwxMCArMTc3LDExIEBACiAgICAgICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFZhbHVlQ2FsbGJhY2s8Qm9vbGVhbj4+IG1Nb2RlQ2FsbGJhY2tzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKICAgICAgICAgcHVibGljIFN1cmZhY2VEYXRhKEBNb2RlIGludCBtb2RlLCBGcmFtZUxheW91dCBwYXJlbnQsIFN1cmZhY2VFdmVudExpc3RlbmVyIGxpc3RlbmVyLAotICAgICAgICAgICAgICAgIGludCBiYWNrZ3JvdW5kQ29sb3IpIHsKKyAgICAgICAgICAgICAgICBpbnQgYmFja2dyb3VuZENvbG9yLCBSdW5uYWJsZSBldmljdCkgewogICAgICAgICAgICAgbU1vZGUgPSBtb2RlOwogICAgICAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CiAgICAgICAgICAgICBtUGFyZW50ID0gcGFyZW50OworICAgICAgICAgICAgbUV2aWN0ID0gZXZpY3Q7CiAgICAgICAgICAgICBpZiAobW9kZSA9PSBNT0RFX1NVUkZBQ0VfVklFVykgewogICAgICAgICAgICAgICAgIG1TdXJmYWNlVmlldyA9IG5ldyBTdXJmYWNlVmlldyhwYXJlbnQuZ2V0Q29udGV4dCgpKTsKICAgICAgICAgICAgICAgICBtU3VyZmFjZVZpZXcuc2V0Wk9yZGVyTWVkaWFPdmVybGF5KHRydWUpOwpAQCAtMTY3LDcgKzE5NCw3IEBACiAgICAgICAgICAgICAgICAgbVRleHR1cmVWaWV3ID0gbnVsbDsKICAgICAgICAgICAgICAgICBtU3VyZmFjZVRleHR1cmVMaXN0ZW5lciA9IG51bGw7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gTU9ERV9URVhUVVJFX1ZJRVcpIHsKLSAgICAgICAgICAgICAgICBtVGV4dHVyZVZpZXcgPSBuZXcgVGV4dHVyZVZpZXcocGFyZW50LmdldENvbnRleHQoKSk7CisgICAgICAgICAgICAgICAgbVRleHR1cmVWaWV3ID0gbmV3IFRleHR1cmVWaWV3V2l0aEludmFsaWRhdGUocGFyZW50LmdldENvbnRleHQoKSk7CiAgICAgICAgICAgICAgICAgbVN1cmZhY2VUZXh0dXJlTGlzdGVuZXIgPSBuZXcgVGV4dHVyZVZpZXdTdXJmYWNlVGV4dHVyZUxpc3RlbmVyKHRoaXMpOwogICAgICAgICAgICAgICAgIG1UZXh0dXJlVmlldy5zZXRTdXJmYWNlVGV4dHVyZUxpc3RlbmVyKG1TdXJmYWNlVGV4dHVyZUxpc3RlbmVyKTsKICAgICAgICAgICAgICAgICBtVGV4dHVyZVZpZXcuc2V0VmlzaWJpbGl0eShWSVNJQkxFKTsKQEAgLTE3OCw2ICsyMDUsNyBAQAogICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbGxlZ2FsIG1vZGU6ICIgKyBtb2RlKTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgLy8gVGhpcyBwb3N0T25BbmltYXRpb24gaXMgdG8gYXZvaWQgbWFuaXB1bGF0aW5nIHRoZSB2aWV3IHRyZWUgaW5zaWRlIGxheW91dCBvciBkcmF3LgogICAgICAgICAgICAgcGFyZW50LnBvc3RPbkFuaW1hdGlvbigoKSAtPiB7CiAgICAgICAgICAgICAgICAgaWYgKG1NYXJrZWRGb3JEZXN0cm95KSByZXR1cm47CiAgICAgICAgICAgICAgICAgVmlldyB2aWV3ID0gKG1Nb2RlID09IE1PREVfU1VSRkFDRV9WSUVXKSA/IG1TdXJmYWNlVmlldyA6IG1UZXh0dXJlVmlldzsKQEAgLTE5MSw2ICsyMTksMTMgQEAKICAgICAgICAgICAgIH0pOwogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIHZvaWQgc2V0U3VyZmFjZURhdGFOZWVkc0Rlc3Ryb3koU3VyZmFjZURhdGEgc3VyZmFjZURhdGEpIHsKKyAgICAgICAgICAgIGFzc2VydCAhbU1hcmtlZEZvckRlc3Ryb3k7CisgICAgICAgICAgICBhc3NlcnQgbVByZXZTdXJmYWNlRGF0YU5lZWRzRGVzdHJveSA9PSBudWxsOworICAgICAgICAgICAgbVByZXZTdXJmYWNlRGF0YU5lZWRzRGVzdHJveSA9IHN1cmZhY2VEYXRhOworICAgICAgICAgICAgbVByZXZTdXJmYWNlRGF0YU5lZWRzRGVzdHJveS5tTmV4dFN1cmZhY2VEYXRhTmVlZHNSdW5DYWxsYmFjayA9IHRoaXM7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgQE1vZGUgaW50IGdldE1vZGUoKSB7CiAgICAgICAgICAgICByZXR1cm4gbU1vZGU7CiAgICAgICAgIH0KQEAgLTE5OCwxNyArMjMzLDIxIEBACiAgICAgICAgIHB1YmxpYyB2b2lkIGFkZENhbGxiYWNrKFZhbHVlQ2FsbGJhY2s8Qm9vbGVhbj4gY2FsbGJhY2spIHsKICAgICAgICAgICAgIGFzc2VydCAhbU1hcmtlZEZvckRlc3Ryb3k7CiAgICAgICAgICAgICBtTW9kZUNhbGxiYWNrcy5hZGQoY2FsbGJhY2spOwotICAgICAgICAgICAgaWYgKG1DcmVhdGVkKSBydW5DYWxsYmFja3MoKTsKKyAgICAgICAgICAgIGlmIChtUmFuQ2FsbGJhY2tzKSBydW5DYWxsYmFja3MoKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIFRlYXJpbmcgZG93biBpcyBzZXBhcmF0ZWQgaW50byBtYXJrRm9yRGVzdHJveSBhbmQgZGVzdHJveS4gQWZ0ZXIgbWFya0ZvckRlc3Ryb3kKICAgICAgICAgLy8gdGhpcyBjbGFzcyB3aWxsIGlzIGd1YXJhbnRlZWQgdG8gbm90IGlzc3VlIGFueSBjYWxscyB0byBpdHMgU3VyZmFjZUV2ZW50TGlzdGVuZXIuCi0gICAgICAgIHB1YmxpYyB2b2lkIG1hcmtGb3JEZXN0cm95KEFycmF5TGlzdDxTdXJmYWNlRGF0YT4gcGVuZGluZ0Rlc3Ryb3ksIGJvb2xlYW4gaGFzTmV4dFN1cmZhY2UpIHsKKyAgICAgICAgcHVibGljIHZvaWQgbWFya0ZvckRlc3Ryb3koYm9vbGVhbiBoYXNOZXh0U3VyZmFjZSkgewogICAgICAgICAgICAgaWYgKG1NYXJrZWRGb3JEZXN0cm95KSByZXR1cm47CiAgICAgICAgICAgICBtTWFya2VkRm9yRGVzdHJveSA9IHRydWU7CiAKICAgICAgICAgICAgIGlmIChtTmVlZHNPblN1cmZhY2VEZXN0cm95ZWQpIHsKLSAgICAgICAgICAgICAgICBtTGlzdGVuZXIuc3VyZmFjZURlc3Ryb3llZChoYXNOZXh0U3VyZmFjZSAmJiBtTW9kZSA9PSBNT0RFX1NVUkZBQ0VfVklFVyk7CisgICAgICAgICAgICAgICAgLy8gU3VyZmFjZVZpZXcgYmVpbmcgdXNlZCB3aXRoIFN1cmZhY2VDb250cm9sIG5lZWQgdG8gY2FjaGUgdGhlIGJhY2sgYnVmZmVyCisgICAgICAgICAgICAgICAgLy8gKEVHTFN1cmZhY2UpLiBPdGhlcndpc2UgdGhlIHN1cmZhY2UgaXMgZGVzdHJveWVkIGltbWVkaWF0ZSBiZWZvcmUgdGhlCisgICAgICAgICAgICAgICAgLy8gU3VyZmFjZVZpZXcgaXMgZGV0YWNoZWQuCisgICAgICAgICAgICAgICAgbUNhY2hlZFN1cmZhY2VOZWVkc0V2aWN0aW9uID0gaGFzTmV4dFN1cmZhY2UgJiYgbU1vZGUgPT0gTU9ERV9TVVJGQUNFX1ZJRVc7CisgICAgICAgICAgICAgICAgbUxpc3RlbmVyLnN1cmZhY2VEZXN0cm95ZWQobUNhY2hlZFN1cmZhY2VOZWVkc0V2aWN0aW9uKTsKICAgICAgICAgICAgICAgICBtTmVlZHNPblN1cmZhY2VEZXN0cm95ZWQgPSBmYWxzZTsKICAgICAgICAgICAgIH0KIApAQCAtMjE5LDI1ICsyNTgsNTQgQEAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwZW5kaW5nRGVzdHJveS5hZGQodGhpcyk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBSZW1vdmUgdmlldyBmcm9tIHBhcmVudCBoaWVyYXJjaHkuCiAgICAgICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CiAgICAgICAgICAgICBhc3NlcnQgbU1hcmtlZEZvckRlc3Ryb3k7CisgICAgICAgICAgICBydW5DYWxsYmFja3MoKTsKKyAgICAgICAgICAgIC8vIFRoaXMgcG9zdE9uQW5pbWF0aW9uIGlzIHRvIGF2b2lkIG1hbmlwdWxhdGluZyB0aGUgdmlldyB0cmVlIGluc2lkZSBsYXlvdXQgb3IgZHJhdy4KICAgICAgICAgICAgIG1QYXJlbnQucG9zdE9uQW5pbWF0aW9uKCgpIC0+IHsKICAgICAgICAgICAgICAgICBpZiAobU1vZGUgPT0gTU9ERV9TVVJGQUNFX1ZJRVcpIHsKLSAgICAgICAgICAgICAgICAgICAgbVBhcmVudC5yZW1vdmVWaWV3KG1TdXJmYWNlVmlldyk7CisgICAgICAgICAgICAgICAgICAgIC8vIERldGFjaGluZyBhIFN1cmZhY2VWaWV3IGNhdXNlcyBhIGZsaWNrZXIgYmVjYXVzZSB0aGUgU3VyZmFjZVZpZXcgdGVhcnMgZG93bgorICAgICAgICAgICAgICAgICAgICAvLyB0aGUgU3VyZmFjZSBpbiBTdXJmYWNlRmxpbmdlciBiZWZvcmUgcmVtb3ZpbmcgaXRzIGhvbGUgaW4gdGhlIHZpZXcgdHJlZS4KKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGNvbXBsaWNhdGVkIGhldXJpc3RpY3MgdG8gYXZvaWQgdGhpcy4gSXQgZmlyc3QgbW92ZXMgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIFN1cmZhY2VWaWV3IGJlaGluZCB0aGUgbmV3IFZpZXcuIFRoZW4gd2FpdCB0d28gZnJhbWVzIGJlZm9yZSBkZXRhY2hpbmcKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIFN1cmZhY2VWaWV3LiBXYWl0aW5nIGZvciBhIHNpbmdsZSBmcmFtZSBzdGlsbCBjYXVzZXMgZmxpY2tlcnMgb24KKyAgICAgICAgICAgICAgICAgICAgLy8gaGlnaCBlbmQgZGV2aWNlcyBsaWtlIFBpeGVsIDMuCisgICAgICAgICAgICAgICAgICAgIG1vdmVDaGlsZFRvQmFja1dpdGhvdXREZXRhY2gobVBhcmVudCwgbVN1cmZhY2VWaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgbVBhcmVudC5wb3N0T25BbmltYXRpb24oKCkgLT4gbVBhcmVudC5wb3N0T25BbmltYXRpb24oKCkgLT4geworICAgICAgICAgICAgICAgICAgICAgICAgbVBhcmVudC5yZW1vdmVWaWV3KG1TdXJmYWNlVmlldyk7CisgICAgICAgICAgICAgICAgICAgICAgICBtUGFyZW50LmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ2FjaGVkU3VyZmFjZU5lZWRzRXZpY3Rpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRXZpY3QucnVuKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhY2hlZFN1cmZhY2VOZWVkc0V2aWN0aW9uID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBydW5DYWxsYmFja09uTmV4dFN1cmZhY2VEYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1Nb2RlID09IE1PREVfVEVYVFVSRV9WSUVXKSB7CiAgICAgICAgICAgICAgICAgICAgIG1QYXJlbnQucmVtb3ZlVmlldyhtVGV4dHVyZVZpZXcpOworICAgICAgICAgICAgICAgICAgICBydW5DYWxsYmFja09uTmV4dFN1cmZhY2VEYXRhKCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBydW5DYWxsYmFja3MoKTsKICAgICAgICAgICAgIH0pOwogICAgICAgICB9CiAKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBtb3ZlQ2hpbGRUb0JhY2tXaXRob3V0RGV0YWNoKFZpZXdHcm91cCBwYXJlbnQsIFZpZXcgY2hpbGQpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBudW1iZXJPZkNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkQ291bnQoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBjaGlsZEluZGV4ID0gcGFyZW50LmluZGV4T2ZDaGlsZChjaGlsZCk7CisgICAgICAgICAgICBpZiAoY2hpbGRJbmRleCA8PSAwKSByZXR1cm47CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkSW5kZXg7ICsraSkgeworICAgICAgICAgICAgICAgIHBhcmVudC5icmluZ0NoaWxkVG9Gcm9udChwYXJlbnQuZ2V0Q2hpbGRBdCgwKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnQgcGFyZW50LmluZGV4T2ZDaGlsZChjaGlsZCkgPT0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZDaGlsZHJlbiAtIGNoaWxkSW5kZXggLSAxOyArK2kpIHsKKyAgICAgICAgICAgICAgICBwYXJlbnQuYnJpbmdDaGlsZFRvRnJvbnQocGFyZW50LmdldENoaWxkQXQoMSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFyZW50LmludmFsaWRhdGUoKTsKKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldEJhY2tncm91bmRDb2xvcihpbnQgY29sb3IpIHsKICAgICAgICAgICAgIGFzc2VydCAhbU1hcmtlZEZvckRlc3Ryb3k7CiAgICAgICAgICAgICBpZiAobU1vZGUgPT0gTU9ERV9TVVJGQUNFX1ZJRVcpIHsKQEAgLTI0NSw3ICszMTMsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgZGlkU3dhcEZyYW1lKCkgeworICAgICAgICAvKiogQHJldHVybiB0cnVlIGlmIHNob3VsZCBrZWVwIHN3YXBwaW5nIGZyYW1lcyAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBkaWRTd2FwRnJhbWUoKSB7CiAgICAgICAgICAgICBpZiAobVN1cmZhY2VWaWV3ICE9IG51bGwgJiYgbVN1cmZhY2VWaWV3LmdldEJhY2tncm91bmQoKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbVN1cmZhY2VWaWV3LnBvc3QobmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKQEAgLTI1NCwxNyArMzIzLDMyIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtTW9kZSA9PSBNT0RFX1NVUkZBQ0VfVklFVykgeworICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgbm8gcmVsaWFibGUgc2lnbmFsIGZvciB3aGVuIHRvIHNob3cgYSBTdXJmYWNlVmlldy4gVGhpcyBpcyBhIGhldXJpc3RpYworICAgICAgICAgICAgICAgIC8vICh1c2VkIGJ5IGNocm9tZSBhcyB3ZWxsKSBpcyB0byB3YWl0IGZvciAyIHN3YXBzIGZyb20gdGhlIGNocm9taXVtIGNvbW9wc2l0b3IKKyAgICAgICAgICAgICAgICAvLyBhcyBhIHNpZ25hbCB0aGF0IHRoZSBTdXJmYWNlVmlldyBoYXMgY29udGVudCBhbmQgaXMgcmVhZHkgdG8gYmUgZGlzcGxheWVkLgorICAgICAgICAgICAgICAgIGlmIChtTnVtU3VyZmFjZVZpZXdTd2Fwc1VudGlsVmlzaWJsZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbU51bVN1cmZhY2VWaWV3U3dhcHNVbnRpbFZpc2libGUtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1OdW1TdXJmYWNlVmlld1N3YXBzVW50aWxWaXNpYmxlID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZGVzdHJveVByZXZpb3VzRGF0YSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbU51bVN1cmZhY2VWaWV3U3dhcHNVbnRpbFZpc2libGUgPiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGRlc3Ryb3lQcmV2aW91c0RhdGEoKSB7CisgICAgICAgICAgICBpZiAobVByZXZTdXJmYWNlRGF0YU5lZWRzRGVzdHJveSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVByZXZTdXJmYWNlRGF0YU5lZWRzRGVzdHJveS5kZXN0cm95KCk7CisgICAgICAgICAgICAgICAgbVByZXZTdXJmYWNlRGF0YU5lZWRzRGVzdHJveSA9IG51bGw7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgc3VyZmFjZUNyZWF0ZWQoKSB7CiAgICAgICAgICAgICBpZiAobU1hcmtlZEZvckRlc3Ryb3kpIHJldHVybjsKIAotICAgICAgICAgICAgaWYgKCFtQ3JlYXRlZCkgewotICAgICAgICAgICAgICAgIG1DcmVhdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBydW5DYWxsYmFja3MoKTsKLSAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgLy8gT24gcHJlLU0gQW5kcm9pZCwgbGF5ZXJzIHN0YXJ0IGluIHRoZSBoaWRkZW4gc3RhdGUgdW50aWwgYSByZWxheW91dCBoYXBwZW5zLgogICAgICAgICAgICAgLy8gVGhlcmUgaXMgYSBidWcgdGhhdCBtYW5pZmVzdHMgaXRzZWxmIHdoZW4gZW50ZXJpbmcgb3ZlcmxheSBtb2RlIG9uIHByZS1NIGRldmljZXMsCiAgICAgICAgICAgICAvLyB3aGVyZSBhIHJlbGF5b3V0IG5ldmVyIGhhcHBlbnMuIFRoaXMgYnVnIGlzIG91dCBvZiBDaHJvbWl1bSdzIGNvbnRyb2wsIGJ1dCBjYW4gYmUKQEAgLTI3NCw2ICszNTgsMTEgQEAKICAgICAgICAgICAgICAgICBtU3VyZmFjZVZpZXcuc2V0VmlzaWJpbGl0eShtU3VyZmFjZVZpZXcuZ2V0VmlzaWJpbGl0eSgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1MaXN0ZW5lci5zdXJmYWNlQ3JlYXRlZCgpOworCisgICAgICAgICAgICBpZiAoIW1SYW5DYWxsYmFja3MgJiYgbVByZXZTdXJmYWNlRGF0YU5lZWRzRGVzdHJveSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcnVuQ2FsbGJhY2tzKCk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIG1OZWVkc09uU3VyZmFjZURlc3Ryb3llZCA9IHRydWU7CiAgICAgICAgIH0KIApAQCAtMjgyLDYgKzM3MSw3IEBACiAgICAgICAgICAgICAgICAgU3VyZmFjZSBzdXJmYWNlLCBib29sZWFuIGNhbkJlVXNlZFdpdGhTdXJmYWNlQ29udHJvbCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CiAgICAgICAgICAgICBpZiAobU1hcmtlZEZvckRlc3Ryb3kpIHJldHVybjsKICAgICAgICAgICAgIG1MaXN0ZW5lci5zdXJmYWNlQ2hhbmdlZChzdXJmYWNlLCBjYW5CZVVzZWRXaXRoU3VyZmFjZUNvbnRyb2wsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgbU51bVN1cmZhY2VWaWV3U3dhcHNVbnRpbFZpc2libGUgPSAyOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCkBAIC0yOTMsNyArMzgzLDggQEAKICAgICAgICAgfQogCiAgICAgICAgIHByaXZhdGUgdm9pZCBydW5DYWxsYmFja3MoKSB7Ci0gICAgICAgICAgICBhc3NlcnQgbUNyZWF0ZWQgfHwgbU1hcmtlZEZvckRlc3Ryb3k7CisgICAgICAgICAgICBtUmFuQ2FsbGJhY2tzID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChtTW9kZUNhbGxiYWNrcy5pc0VtcHR5KCkpIHJldHVybjsKICAgICAgICAgICAgIC8vIFBvc3RUYXNrIHRvIGF2b2lkIHBvc3NpYmxlIHJlZW50cmFuY3kgcHJvYmxlbXMgd2l0aCBlbWJlZGRlciBjb2RlLgogICAgICAgICAgICAgUG9zdFRhc2sucG9zdFRhc2soVWlUaHJlYWRUYXNrVHJhaXRzLkRFRkFVTFQsICgpIC0+IHsKICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8VmFsdWVDYWxsYmFjazxCb29sZWFuPj4gY2xvbmUgPQpAQCAtMzA0LDYgKzM5NSwxMyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0pOwogICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHJ1bkNhbGxiYWNrT25OZXh0U3VyZmFjZURhdGEoKSB7CisgICAgICAgICAgICBpZiAobU5leHRTdXJmYWNlRGF0YU5lZWRzUnVuQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1OZXh0U3VyZmFjZURhdGFOZWVkc1J1bkNhbGxiYWNrLnJ1bkNhbGxiYWNrcygpOworICAgICAgICAgICAgICAgIG1OZXh0U3VyZmFjZURhdGFOZWVkc1J1bkNhbGxiYWNrID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIC8vIEFkYXB0ZXIgZm9yIFN1cmZhY2VIb29sZGVyLkNhbGxiYWNrLgpAQCAtNDAwLDcgKzQ5OCw3IEBACiAgICAgICAgIGFzc2VydCBjYWxsYmFjayAhPSBudWxsOwogICAgICAgICBpZiAobVJlcXVlc3RlZCAhPSBudWxsICYmIG1SZXF1ZXN0ZWQuZ2V0TW9kZSgpICE9IG1vZGUpIHsKICAgICAgICAgICAgIGlmIChtUmVxdWVzdGVkICE9IG1DdXJyZW50KSB7Ci0gICAgICAgICAgICAgICAgbVJlcXVlc3RlZC5tYXJrRm9yRGVzdHJveShtTWFya2VkRm9yRGVzdHJveVN1cmZhY2VzLCBmYWxzZSAvKiBoYXNOZXh0U3VyZmFjZSAqLyk7CisgICAgICAgICAgICAgICAgbVJlcXVlc3RlZC5tYXJrRm9yRGVzdHJveShmYWxzZSAvKiBoYXNOZXh0U3VyZmFjZSAqLyk7CiAgICAgICAgICAgICAgICAgbVJlcXVlc3RlZC5kZXN0cm95KCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtUmVxdWVzdGVkID0gbnVsbDsKQEAgLTQwOCw3ICs1MDYsOCBAQAogCiAgICAgICAgIGlmIChtUmVxdWVzdGVkID09IG51bGwpIHsKICAgICAgICAgICAgIFN1cmZhY2VFdmVudExpc3RlbmVySW1wbCBsaXN0ZW5lciA9IG5ldyBTdXJmYWNlRXZlbnRMaXN0ZW5lckltcGwoKTsKLSAgICAgICAgICAgIG1SZXF1ZXN0ZWQgPSBuZXcgU3VyZmFjZURhdGEobW9kZSwgdGhpcywgbGlzdGVuZXIsIG1CYWNrZ3JvdW5kQ29sb3IpOworICAgICAgICAgICAgbVJlcXVlc3RlZCA9IG5ldyBTdXJmYWNlRGF0YSgKKyAgICAgICAgICAgICAgICAgICAgbW9kZSwgdGhpcywgbGlzdGVuZXIsIG1CYWNrZ3JvdW5kQ29sb3IsIHRoaXM6OmV2aWN0Q2FjaGVkU3VyZmFjZSk7CiAgICAgICAgICAgICBsaXN0ZW5lci5zZXRSZXF1ZXN0RGF0YShtUmVxdWVzdGVkKTsKICAgICAgICAgfQogICAgICAgICBhc3NlcnQgbVJlcXVlc3RlZC5nZXRNb2RlKCkgPT0gbW9kZTsKQEAgLTQ2MiwxNCArNTYxLDE1IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKICAgICAgICAgaWYgKG1SZXF1ZXN0ZWQgIT0gbnVsbCkgewotICAgICAgICAgICAgbVJlcXVlc3RlZC5tYXJrRm9yRGVzdHJveShtTWFya2VkRm9yRGVzdHJveVN1cmZhY2VzLCBmYWxzZSAvKiBoYXNOZXh0U3VyZmFjZSAqLyk7CisgICAgICAgICAgICBtUmVxdWVzdGVkLm1hcmtGb3JEZXN0cm95KGZhbHNlIC8qIGhhc05leHRTdXJmYWNlICovKTsKKyAgICAgICAgICAgIG1SZXF1ZXN0ZWQuZGVzdHJveSgpOwogICAgICAgICAgICAgaWYgKG1DdXJyZW50ICE9IG51bGwgJiYgbUN1cnJlbnQgIT0gbVJlcXVlc3RlZCkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50Lm1hcmtGb3JEZXN0cm95KG1NYXJrZWRGb3JEZXN0cm95U3VyZmFjZXMsIGZhbHNlIC8qIGhhc05leHRTdXJmYWNlICovKTsKKyAgICAgICAgICAgICAgICBtQ3VycmVudC5tYXJrRm9yRGVzdHJveShmYWxzZSAvKiBoYXNOZXh0U3VyZmFjZSAqLyk7CisgICAgICAgICAgICAgICAgbUN1cnJlbnQuZGVzdHJveSgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIG1SZXF1ZXN0ZWQgPSBudWxsOwogICAgICAgICBtQ3VycmVudCA9IG51bGw7Ci0gICAgICAgIHJ1blBlbmRpbmdTdXJmYWNlRGVzdHJveSgpOwogCiAgICAgICAgIG1XaW5kb3dBbmRyb2lkID0gbnVsbDsKICAgICAgICAgQ29udGVudFZpZXdSZW5kZXJWaWV3Sm5pLmdldCgpLmRlc3Ryb3kobU5hdGl2ZUNvbnRlbnRWaWV3UmVuZGVyVmlldyk7CkBAIC00OTQsMTcgKzU5NCwxNCBAQAogICAgIH0KIAogICAgIEBDYWxsZWRCeU5hdGl2ZQotICAgIHByaXZhdGUgdm9pZCBkaWRTd2FwRnJhbWUoKSB7CisgICAgcHJpdmF0ZSBib29sZWFuIGRpZFN3YXBGcmFtZSgpIHsKICAgICAgICAgYXNzZXJ0IG1DdXJyZW50ICE9IG51bGw7Ci0gICAgICAgIG1DdXJyZW50LmRpZFN3YXBGcmFtZSgpOwotICAgICAgICBydW5QZW5kaW5nU3VyZmFjZURlc3Ryb3koKTsKKyAgICAgICAgcmV0dXJuIG1DdXJyZW50LmRpZFN3YXBGcmFtZSgpOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBydW5QZW5kaW5nU3VyZmFjZURlc3Ryb3koKSB7Ci0gICAgICAgIGZvciAoU3VyZmFjZURhdGEgc3VyZmFjZSA6IG1NYXJrZWRGb3JEZXN0cm95U3VyZmFjZXMpIHsKLSAgICAgICAgICAgIHN1cmZhY2UuZGVzdHJveSgpOwotICAgICAgICB9Ci0gICAgICAgIG1NYXJrZWRGb3JEZXN0cm95U3VyZmFjZXMuY2xlYXIoKTsKKyAgICBwcml2YXRlIHZvaWQgZXZpY3RDYWNoZWRTdXJmYWNlKCkgeworICAgICAgICBpZiAobU5hdGl2ZUNvbnRlbnRWaWV3UmVuZGVyVmlldyA9PSAwKSByZXR1cm47CisgICAgICAgIENvbnRlbnRWaWV3UmVuZGVyVmlld0puaS5nZXQoKS5ldmljdENhY2hlZFN1cmZhY2UobU5hdGl2ZUNvbnRlbnRWaWV3UmVuZGVyVmlldyk7CiAgICAgfQogCiAgICAgcHVibGljIGxvbmcgZ2V0TmF0aXZlSGFuZGxlKCkgewpAQCAtNTIyLDYgKzYxOSw3IEBACiAgICAgICAgIHZvaWQgc3VyZmFjZURlc3Ryb3llZChsb25nIG5hdGl2ZUNvbnRlbnRWaWV3UmVuZGVyVmlldywgYm9vbGVhbiBjYWNoZUJhY2tCdWZmZXIpOwogICAgICAgICB2b2lkIHN1cmZhY2VDaGFuZ2VkKGxvbmcgbmF0aXZlQ29udGVudFZpZXdSZW5kZXJWaWV3LCBib29sZWFuIGNhbkJlVXNlZFdpdGhTdXJmYWNlQ29udHJvbCwKICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIFN1cmZhY2Ugc3VyZmFjZSk7CisgICAgICAgIHZvaWQgZXZpY3RDYWNoZWRTdXJmYWNlKGxvbmcgbmF0aXZlQ29udGVudFZpZXdSZW5kZXJWaWV3KTsKICAgICAgICAgUmVzb3VyY2VNYW5hZ2VyIGdldFJlc291cmNlTWFuYWdlcihsb25nIG5hdGl2ZUNvbnRlbnRWaWV3UmVuZGVyVmlldyk7CiAgICAgfQogfQo=